History

Update tool explorer components and dependencies

- Added `json-schema-traverse` dependency to enhance schema handling. - Removed unused `infra` workspace from `package.json` and related scripts. - Refactored tool explorer components to improve structure and usability, including the addition of `NavGroupNode` and `ToolListItem` for better tool organization. - Updated `ToolExplorer` to streamline source management and selection. - Enhanced `TypeSignature` component for improved type display and copying functionality. - Cleaned up CSS styles for better layout and responsiveness in tool components.

Rhys Sullivan committed 8 months ago

Commit b89a9b81 parent c9631fc27 files · +2289 −2067Browse files

Unified · Split

27 files
  1. bun.lock +21 −544
  2. executor/apps/web/package.json +1 −0
  3. executor/apps/web/src/app/globals.css +2 −0
  4. executor/apps/web/src/components/tools/add/source/dialog-sections.tsx +2 −2
  5. executor/apps/web/src/components/tools/explorer-groups.tsx +215 −2
  6. executor/apps/web/src/components/tools/explorer-rows.tsx +159 −0
  7. executor/apps/web/src/components/tools/explorer-toolbar.tsx +49 −164
  8. executor/apps/web/src/components/tools/explorer.tsx +325 −340
  9. executor/apps/web/src/components/tools/explorer/source-form-panel.tsx +507 −0
  10. executor/apps/web/src/components/tools/explorer/tool-detail.tsx +344 −171
  11. executor/apps/web/src/components/tools/explorer/type-signature.tsx +43 −11
  12. executor/apps/web/src/components/tools/view.tsx +2 −19
  13. executor/apps/web/src/lib/tool/schema-traverse.ts +385 −0
  14. executor/infra/.gitignore +0 −2
  15. executor/infra/README.md +0 −122
  16. executor/infra/package.json +0 −26
  17. executor/infra/sst.config.ts +0 −572
  18. executor/infra/tsconfig.json +0 −12
  19. executor/package.json +0 −4
  20. executor/packages/core/src/mcp/server-approval.ts +48 −42
  21. executor/packages/core/src/tool-source-loaders/graphql-loader.ts +1 −7
  22. executor/packages/database/convex/_generated/api.d.ts +6 −0
  23. executor/packages/database/convex/http/mcp_service.ts +38 −5
  24. executor/packages/database/convex/runtimeCallbacks.ts +13 −0
  25. executor/packages/database/src/runtime-callbacks/handlers.ts +36 −0
  26. executor/packages/database/src/runtime-node/runtime-dispatch.ts +90 −19
  27. package.json +2 −3
bun.lock+21−544
@@ -99,6 +99,7 @@ · 98 unmodified lines
99 "clsx": "^2.1.1",99 "clsx": "^2.1.1",
100 "cmdk": "^1",100 "cmdk": "^1",
101 "convex": "^1.31.7",101 "convex": "^1.31.7",
102 "json-schema-traverse": "^1.0.0",
102 "lucide-react": "^0.563.0",103 "lucide-react": "^0.563.0",
103 "monaco-editor": "^0.55.1",104 "monaco-editor": "^0.55.1",
104 "next": "16.1.6",105 "next": "16.1.6",
@@ -130,20 +131,6 @@ · 25 unmodified lines
130 "typescript": "^5",131 "typescript": "^5",
131 },132 },
132 },133 },
133 "executor/infra": {
134 "name": "executor-infra",
135 "dependencies": {
136 "@pulumi/command": "^1.1.3",
137 "@pulumi/pulumi": "^3.220.0",
138 "@pulumiverse/vercel": "^4.5.0",
139 "pulumi-stripe": "^0.0.26",
140 "sst": "^3.17.38",
141 },
142 "devDependencies": {
143 "@types/node": "^24.6.2",
144 "typescript": "^5.9.3",
145 },
146 },
147 "executor/packages/core": {134 "executor/packages/core": {
148 "name": "@executor/core",135 "name": "@executor/core",
149 "version": "0.1.0",136 "version": "0.1.0",
@@ -509,10 +496,6 @@ · 359 unmodified lines
509 496
510 "@google/genai": ["@google/genai@1.40.0", "", { "dependencies": { "google-auth-library": "^10.3.0", "protobufjs": "^7.5.4", "ws": "^8.18.0" }, "peerDependencies": { "@modelcontextprotocol/sdk": "^1.25.2" }, "optionalPeers": ["@modelcontextprotocol/sdk"] }, "sha512-fhIww8smT0QYRX78qWOiz/nIQhHMF5wXOrlXvj33HBrz3vKDBb+wibLcEmTA+L9dmPD4KmfNr7UF3LDQVTXNjA=="],497 "@google/genai": ["@google/genai@1.40.0", "", { "dependencies": { "google-auth-library": "^10.3.0", "protobufjs": "^7.5.4", "ws": "^8.18.0" }, "peerDependencies": { "@modelcontextprotocol/sdk": "^1.25.2" }, "optionalPeers": ["@modelcontextprotocol/sdk"] }, "sha512-fhIww8smT0QYRX78qWOiz/nIQhHMF5wXOrlXvj33HBrz3vKDBb+wibLcEmTA+L9dmPD4KmfNr7UF3LDQVTXNjA=="],
511 498
512 "@grpc/grpc-js": ["@grpc/grpc-js@1.14.3", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA=="],
513
514 "@grpc/proto-loader": ["@grpc/proto-loader@0.8.0", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ=="],
515
516 "@hono/node-server": ["@hono/node-server@1.19.9", "", { "peerDependencies": { "hono": "^4" } }, "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw=="],499 "@hono/node-server": ["@hono/node-server@1.19.9", "", { "peerDependencies": { "hono": "^4" } }, "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw=="],
517 500
518 "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],501 "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
@@ -589,10 +572,6 @@ · 70 unmodified lines
589 572
590 "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],573 "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
591 574
592 "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="],
593
594 "@isaacs/string-locale-compare": ["@isaacs/string-locale-compare@1.1.0", "", {}, "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ=="],
595
596 "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],575 "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
597 576
598 "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],577 "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
@@ -603,10 +582,6 @@ · 4 unmodified lines
603 582
604 "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="],583 "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="],
605 584
606 "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="],
607
608 "@logdna/tail-file": ["@logdna/tail-file@2.2.0", "", {}, "sha512-XGSsWDweP80Fks16lwkAUIr54ICyBs6PsI4mpfTLQaWgEJRtY9xEV+PeyDpJ+sJEGZxqINlpmAwe/6tS1pP8Ng=="],
609
610 "@mariozechner/pi-ai": ["@mariozechner/pi-ai@0.52.8", "", { "dependencies": { "@anthropic-ai/sdk": "^0.73.0", "@aws-sdk/client-bedrock-runtime": "^3.983.0", "@google/genai": "^1.40.0", "@mistralai/mistralai": "1.10.0", "@sinclair/typebox": "^0.34.41", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "chalk": "^5.6.2", "openai": "6.10.0", "partial-json": "^0.1.7", "proxy-agent": "^6.5.0", "undici": "^7.19.1", "zod-to-json-schema": "^3.24.6" }, "bin": { "pi-ai": "dist/cli.js" } }, "sha512-+aFCUbKJcskDJhr9wPcMBTy0x/xWio5v1dkxRYXUBPWp+Zt9DSdT5Kmd/IIQ+a0TOZDF4ajt4GY/oAw37X7XTw=="],585 "@mariozechner/pi-ai": ["@mariozechner/pi-ai@0.52.8", "", { "dependencies": { "@anthropic-ai/sdk": "^0.73.0", "@aws-sdk/client-bedrock-runtime": "^3.983.0", "@google/genai": "^1.40.0", "@mistralai/mistralai": "1.10.0", "@sinclair/typebox": "^0.34.41", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "chalk": "^5.6.2", "openai": "6.10.0", "partial-json": "^0.1.7", "proxy-agent": "^6.5.0", "undici": "^7.19.1", "zod-to-json-schema": "^3.24.6" }, "bin": { "pi-ai": "dist/cli.js" } }, "sha512-+aFCUbKJcskDJhr9wPcMBTy0x/xWio5v1dkxRYXUBPWp+Zt9DSdT5Kmd/IIQ+a0TOZDF4ajt4GY/oAw37X7XTw=="],
611 586
612 "@mistralai/mistralai": ["@mistralai/mistralai@1.10.0", "", { "dependencies": { "zod": "^3.20.0", "zod-to-json-schema": "^3.24.1" } }, "sha512-tdIgWs4Le8vpvPiUEWne6tK0qbVc+jMenujnvTqOjogrJUsCSQhus0tHTU1avDDh5//Rq2dFgP9mWRAdIEoBqg=="],587 "@mistralai/mistralai": ["@mistralai/mistralai@1.10.0", "", { "dependencies": { "zod": "^3.20.0", "zod-to-json-schema": "^3.24.1" } }, "sha512-tdIgWs4Le8vpvPiUEWne6tK0qbVc+jMenujnvTqOjogrJUsCSQhus0tHTU1avDDh5//Rq2dFgP9mWRAdIEoBqg=="],
@@ -667,34 +642,6 @@ · 54 unmodified lines
667 642
668 "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="],643 "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="],
669 644
670 "@npmcli/agent": ["@npmcli/agent@4.0.0", "", { "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^11.2.1", "socks-proxy-agent": "^8.0.3" } }, "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA=="],
671
672 "@npmcli/arborist": ["@npmcli/arborist@9.3.0", "", { "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^5.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/map-workspaces": "^5.0.0", "@npmcli/metavuln-calculator": "^9.0.2", "@npmcli/name-from-folder": "^4.0.0", "@npmcli/node-gyp": "^5.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/query": "^5.0.0", "@npmcli/redact": "^4.0.0", "@npmcli/run-script": "^10.0.0", "bin-links": "^6.0.0", "cacache": "^20.0.1", "common-ancestor-path": "^2.0.0", "hosted-git-info": "^9.0.0", "json-stringify-nice": "^1.1.4", "lru-cache": "^11.2.1", "minimatch": "^10.0.3", "nopt": "^9.0.0", "npm-install-checks": "^8.0.0", "npm-package-arg": "^13.0.0", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "pacote": "^21.0.2", "parse-conflict-json": "^5.0.1", "proc-log": "^6.0.0", "proggy": "^4.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", "semver": "^7.3.7", "ssri": "^13.0.0", "treeverse": "^3.0.0", "walk-up-path": "^4.0.0" }, "bin": { "arborist": "bin/index.js" } }, "sha512-+iH0S4YZBsSgItmFWJsxbxtuFmaldGG8h9hQfCHeYHQxFZuIKD8NZB960c22OeFtQnI0FcuGLRA+sWQ3/4EEHQ=="],
673
674 "@npmcli/fs": ["@npmcli/fs@5.0.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og=="],
675
676 "@npmcli/git": ["@npmcli/git@7.0.1", "", { "dependencies": { "@npmcli/promise-spawn": "^9.0.0", "ini": "^6.0.0", "lru-cache": "^11.2.1", "npm-pick-manifest": "^11.0.1", "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^6.0.0" } }, "sha512-+XTFxK2jJF/EJJ5SoAzXk3qwIDfvFc5/g+bD274LZ7uY7LE8sTfG6Z8rOanPl2ZEvZWqNvmEdtXC25cE54VcoA=="],
677
678 "@npmcli/installed-package-contents": ["@npmcli/installed-package-contents@4.0.0", "", { "dependencies": { "npm-bundled": "^5.0.0", "npm-normalize-package-bin": "^5.0.0" }, "bin": { "installed-package-contents": "bin/index.js" } }, "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA=="],
679
680 "@npmcli/map-workspaces": ["@npmcli/map-workspaces@5.0.3", "", { "dependencies": { "@npmcli/name-from-folder": "^4.0.0", "@npmcli/package-json": "^7.0.0", "glob": "^13.0.0", "minimatch": "^10.0.3" } }, "sha512-o2grssXo1e774E5OtEwwrgoszYRh0lqkJH+Pb9r78UcqdGJRDRfhpM8DvZPjzNLLNYeD/rNbjOKM3Ss5UABROw=="],
681
682 "@npmcli/metavuln-calculator": ["@npmcli/metavuln-calculator@9.0.3", "", { "dependencies": { "cacache": "^20.0.0", "json-parse-even-better-errors": "^5.0.0", "pacote": "^21.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5" } }, "sha512-94GLSYhLXF2t2LAC7pDwLaM4uCARzxShyAQKsirmlNcpidH89VA4/+K1LbJmRMgz5gy65E/QBBWQdUvGLe2Frg=="],
683
684 "@npmcli/name-from-folder": ["@npmcli/name-from-folder@4.0.0", "", {}, "sha512-qfrhVlOSqmKM8i6rkNdZzABj8MKEITGFAY+4teqBziksCQAOLutiAxM1wY2BKEd8KjUSpWmWCYxvXr0y4VTlPg=="],
685
686 "@npmcli/node-gyp": ["@npmcli/node-gyp@5.0.0", "", {}, "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ=="],
687
688 "@npmcli/package-json": ["@npmcli/package-json@7.0.4", "", { "dependencies": { "@npmcli/git": "^7.0.0", "glob": "^13.0.0", "hosted-git-info": "^9.0.0", "json-parse-even-better-errors": "^5.0.0", "proc-log": "^6.0.0", "semver": "^7.5.3", "validate-npm-package-license": "^3.0.4" } }, "sha512-0wInJG3j/K40OJt/33ax47WfWMzZTm6OQxB9cDhTt5huCP2a9g2GnlsxmfN+PulItNPIpPrZ+kfwwUil7eHcZQ=="],
689
690 "@npmcli/promise-spawn": ["@npmcli/promise-spawn@9.0.1", "", { "dependencies": { "which": "^6.0.0" } }, "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q=="],
691
692 "@npmcli/query": ["@npmcli/query@5.0.0", "", { "dependencies": { "postcss-selector-parser": "^7.0.0" } }, "sha512-8TZWfTQOsODpLqo9SVhVjHovmKXNpevHU0gO9e+y4V4fRIOneiXy0u0sMP9LmS71XivrEWfZWg50ReH4WRT4aQ=="],
693
694 "@npmcli/redact": ["@npmcli/redact@4.0.0", "", {}, "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q=="],
695
696 "@npmcli/run-script": ["@npmcli/run-script@10.0.3", "", { "dependencies": { "@npmcli/node-gyp": "^5.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "node-gyp": "^12.1.0", "proc-log": "^6.0.0", "which": "^6.0.0" } }, "sha512-ER2N6itRkzWbbtVmZ9WKaWxVlKlOeBFF1/7xx+KA5J1xKa4JjUwBdb6tDpk0v1qA+d+VDwHI9qmLcXSWcmi+Rw=="],
697
698 "@open-draft/deferred-promise": ["@open-draft/deferred-promise@2.2.0", "", {}, "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA=="],645 "@open-draft/deferred-promise": ["@open-draft/deferred-promise@2.2.0", "", {}, "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA=="],
699 646
700 "@open-draft/logger": ["@open-draft/logger@0.3.0", "", { "dependencies": { "is-node-process": "^1.2.0", "outvariant": "^1.4.0" } }, "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ=="],647 "@open-draft/logger": ["@open-draft/logger@0.3.0", "", { "dependencies": { "is-node-process": "^1.2.0", "outvariant": "^1.4.0" } }, "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ=="],
@@ -705,30 +652,6 @@ · 4 unmodified lines
705 652
706 "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="],653 "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="],
707 654
708 "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.55.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg=="],
709
710 "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@1.30.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA=="],
711
712 "@opentelemetry/core": ["@opentelemetry/core@1.30.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ=="],
713
714 "@opentelemetry/exporter-zipkin": ["@opentelemetry/exporter-zipkin@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-6S2QIMJahIquvFaaxmcwpvQQRD/YFaMTNoIxrfPIPOeITN+a8lfEcPDxNxn8JDAaxkg+4EnXhz8upVDYenoQjA=="],
715
716 "@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.55.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.55.0", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ=="],
717
718 "@opentelemetry/instrumentation-grpc": ["@opentelemetry/instrumentation-grpc@0.55.0", "", { "dependencies": { "@opentelemetry/instrumentation": "0.55.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-n2ZH4pRwOy0Vhag/3eKqiyDBwcpUnGgJI9iiIRX7vivE0FMncaLazWphNFezRRaM/LuKwq1TD8pVUvieP68mow=="],
719
720 "@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ=="],
721
722 "@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-Pj/BfnYEKIOImirH76M4hDaBSx6HyZ2CXUqk+Kj02m6BB80c/yo4BdWkn/1gDFfU+YPY+bPR2U0DKBfdxCKwmg=="],
723
724 "@opentelemetry/resources": ["@opentelemetry/resources@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA=="],
725
726 "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg=="],
727
728 "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@1.30.1", "", { "dependencies": { "@opentelemetry/context-async-hooks": "1.30.1", "@opentelemetry/core": "1.30.1", "@opentelemetry/propagator-b3": "1.30.1", "@opentelemetry/propagator-jaeger": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1", "semver": "^7.5.2" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ=="],
729
730 "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="],
731
732 "@oxc-project/types": ["@oxc-project/types@0.112.0", "", {}, "sha512-m6RebKHIRsax2iCwVpYW2ErQwa4ywHJrE4sCK3/8JK8ZZAWOKXaRJFl/uP51gaVyyXlaS4+chU1nSCdzYf6QqQ=="],655 "@oxc-project/types": ["@oxc-project/types@0.112.0", "", {}, "sha512-m6RebKHIRsax2iCwVpYW2ErQwa4ywHJrE4sCK3/8JK8ZZAWOKXaRJFl/uP51gaVyyXlaS4+chU1nSCdzYf6QqQ=="],
733 656
734 "@peculiar/asn1-schema": ["@peculiar/asn1-schema@2.6.0", "", { "dependencies": { "asn1js": "^3.0.6", "pvtsutils": "^1.3.6", "tslib": "^2.8.1" } }, "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg=="],657 "@peculiar/asn1-schema": ["@peculiar/asn1-schema@2.6.0", "", { "dependencies": { "asn1js": "^3.0.6", "pvtsutils": "^1.3.6", "tslib": "^2.8.1" } }, "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg=="],
@@ -767,12 +690,6 @@ · 32 unmodified lines
767 690
768 "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="],691 "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="],
769 692
770 "@pulumi/command": ["@pulumi/command@1.1.3", "", { "dependencies": { "@pulumi/pulumi": "^3.142.0" } }, "sha512-eBzGE/BQlxMNcxrrA62N4cLaHdL0xDSRACXxB0Hjc4rJG60vhpDVO130xxb4x3cZ7HT1kvjS4KuuoH8R5JRbIQ=="],
771
772 "@pulumi/pulumi": ["@pulumi/pulumi@3.220.0", "", { "dependencies": { "@grpc/grpc-js": "^1.10.1", "@logdna/tail-file": "^2.0.6", "@npmcli/arborist": "^9.0.0", "@opentelemetry/api": "^1.9", "@opentelemetry/exporter-zipkin": "^1.28", "@opentelemetry/instrumentation": "^0.55", "@opentelemetry/instrumentation-grpc": "^0.55", "@opentelemetry/resources": "^1.28", "@opentelemetry/sdk-trace-base": "^1.28", "@opentelemetry/sdk-trace-node": "^1.28", "@types/google-protobuf": "^3.15.5", "@types/semver": "^7.5.6", "@types/tmp": "^0.2.6", "execa": "^5.1.0", "fdir": "^6.5.0", "google-protobuf": "^3.21.4", "got": "^11.8.6", "ini": "^2.0.0", "js-yaml": "^3.14.2", "minimist": "^1.2.6", "normalize-package-data": "^6.0.0", "package-directory": "^8.1.0", "picomatch": "^3.0.1", "require-from-string": "^2.0.1", "semver": "^7.5.2", "source-map-support": "^0.5.6", "tmp": "^0.2.4", "upath": "^1.1.0" }, "peerDependencies": { "ts-node": ">= 7.0.1 < 12", "typescript": ">= 3.8.3 < 6" }, "optionalPeers": ["ts-node", "typescript"] }, "sha512-WfFu4Qv5r/9uv4bh6jxZPKLc945RtdjIq29mDa6c9sIXzQtRtv/Voo58E6u6lhA1RKaK+ocymqgykZ6QV7OnGQ=="],
773
774 "@pulumiverse/vercel": ["@pulumiverse/vercel@4.5.0", "", { "dependencies": { "@pulumi/pulumi": "^3.142.0" } }, "sha512-WA4MN+II6ie2s2dMcve6AT+XzI16ZbthVXhT5+GK2WqamMHIg9ARexHD68kNQKHQ1Yz9jN1xnzLhggkUC2Uo0A=="],
775
776 "@quansync/fs": ["@quansync/fs@1.0.0", "", { "dependencies": { "quansync": "^1.0.0" } }, "sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ=="],693 "@quansync/fs": ["@quansync/fs@1.0.0", "", { "dependencies": { "quansync": "^1.0.0" } }, "sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ=="],
777 694
778 "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="],695 "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="],
@@ -1003,21 +920,9 @@ · 224 unmodified lines
1003 920
1004 "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],921 "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
1005 922
1006 "@sigstore/bundle": ["@sigstore/bundle@4.0.0", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.5.0" } }, "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A=="],
1007
1008 "@sigstore/core": ["@sigstore/core@3.1.0", "", {}, "sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A=="],
1009
1010 "@sigstore/protobuf-specs": ["@sigstore/protobuf-specs@0.5.0", "", {}, "sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA=="],
1011
1012 "@sigstore/sign": ["@sigstore/sign@4.1.0", "", { "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0", "make-fetch-happen": "^15.0.3", "proc-log": "^6.1.0", "promise-retry": "^2.0.1" } }, "sha512-Vx1RmLxLGnSUqx/o5/VsCjkuN5L7y+vxEEwawvc7u+6WtX2W4GNa7b9HEjmcRWohw/d6BpATXmvOwc78m+Swdg=="],
1013
1014 "@sigstore/tuf": ["@sigstore/tuf@4.0.1", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.5.0", "tuf-js": "^4.1.0" } }, "sha512-OPZBg8y5Vc9yZjmWCHrlWPMBqW5yd8+wFNl+thMdtcWz3vjVSoJQutF8YkrzI0SLGnkuFof4HSsWUhXrf219Lw=="],
1015
1016 "@sigstore/verify": ["@sigstore/verify@3.1.0", "", { "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0" } }, "sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag=="],
1017
1018 "@sinclair/typebox": ["@sinclair/typebox@0.34.48", "", {}, "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA=="],923 "@sinclair/typebox": ["@sinclair/typebox@0.34.48", "", {}, "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA=="],
1019 924
1020 "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="],925 "@sindresorhus/is": ["@sindresorhus/is@7.2.0", "", {}, "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw=="],
1021 926
1022 "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="],927 "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="],
1023 928
@@ -1119,8 +1024,6 @@ · 95 unmodified lines
1119 1024
1120 "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="],1025 "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="],
1121 1026
1122 "@szmarczak/http-timer": ["@szmarczak/http-timer@4.0.6", "", { "dependencies": { "defer-to-connect": "^2.0.0" } }, "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="],
1123
1124 "@tailwindcss/node": ["@tailwindcss/node@4.1.18", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.6.1", "lightningcss": "1.30.2", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.1.18" } }, "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ=="],1027 "@tailwindcss/node": ["@tailwindcss/node@4.1.18", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.6.1", "lightningcss": "1.30.2", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.1.18" } }, "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ=="],
1125 1028
1126 "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.18", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.18", "@tailwindcss/oxide-darwin-arm64": "4.1.18", "@tailwindcss/oxide-darwin-x64": "4.1.18", "@tailwindcss/oxide-freebsd-x64": "4.1.18", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", "@tailwindcss/oxide-linux-x64-musl": "4.1.18", "@tailwindcss/oxide-wasm32-wasi": "4.1.18", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" } }, "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A=="],1029 "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.18", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.18", "@tailwindcss/oxide-darwin-arm64": "4.1.18", "@tailwindcss/oxide-darwin-x64": "4.1.18", "@tailwindcss/oxide-freebsd-x64": "4.1.18", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", "@tailwindcss/oxide-linux-x64-musl": "4.1.18", "@tailwindcss/oxide-wasm32-wasi": "4.1.18", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" } }, "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A=="],
@@ -1167,12 +1070,6 @@ · 40 unmodified lines
1167 1070
1168 "@ts-morph/common": ["@ts-morph/common@0.27.0", "", { "dependencies": { "fast-glob": "^3.3.3", "minimatch": "^10.0.1", "path-browserify": "^1.0.1" } }, "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ=="],1071 "@ts-morph/common": ["@ts-morph/common@0.27.0", "", { "dependencies": { "fast-glob": "^3.3.3", "minimatch": "^10.0.1", "path-browserify": "^1.0.1" } }, "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ=="],
1169 1072
1170 "@tsconfig/bun": ["@tsconfig/bun@1.0.7", "", {}, "sha512-udGrGJBNQdXGVulehc1aWT73wkR9wdaGBtB6yL70RJsqwW/yJhIg6ZbRlPOfIUiFNrnBuYLBi9CSmMKfDC7dvA=="],
1171
1172 "@tufjs/canonical-json": ["@tufjs/canonical-json@2.0.0", "", {}, "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA=="],
1173
1174 "@tufjs/models": ["@tufjs/models@4.1.0", "", { "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^10.1.1" } }, "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww=="],
1175
1176 "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],1073 "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
1177 1074
1178 "@types/accepts": ["@types/accepts@1.3.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ=="],1075 "@types/accepts": ["@types/accepts@1.3.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ=="],
@@ -1181,8 +1078,6 @@ · 2 unmodified lines
1181 1078
1182 "@types/bun": ["@types/bun@1.3.8", "", { "dependencies": { "bun-types": "1.3.8" } }, "sha512-3LvWJ2q5GerAXYxO2mffLTqOzEu5qnhEAlh48Vnu8WQfnmSwbgagjGZV6BoHKJztENYEDn6QmVd949W4uESRJA=="],1079 "@types/bun": ["@types/bun@1.3.8", "", { "dependencies": { "bun-types": "1.3.8" } }, "sha512-3LvWJ2q5GerAXYxO2mffLTqOzEu5qnhEAlh48Vnu8WQfnmSwbgagjGZV6BoHKJztENYEDn6QmVd949W4uESRJA=="],
1183 1080
1184 "@types/cacheable-request": ["@types/cacheable-request@6.0.3", "", { "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw=="],
1185
1186 "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="],1081 "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="],
1187 1082
1188 "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="],1083 "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="],
@@ -1205,14 +1100,10 @@ · 16 unmodified lines
1205 1100
1206 "@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.8", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA=="],1101 "@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.8", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA=="],
1207 1102
1208 "@types/google-protobuf": ["@types/google-protobuf@3.15.12", "", {}, "sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ=="],
1209
1210 "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],1103 "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
1211 1104
1212 "@types/http-assert": ["@types/http-assert@1.5.6", "", {}, "sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw=="],1105 "@types/http-assert": ["@types/http-assert@1.5.6", "", {}, "sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw=="],
1213 1106
1214 "@types/http-cache-semantics": ["@types/http-cache-semantics@4.2.0", "", {}, "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q=="],
1215
1216 "@types/http-errors": ["@types/http-errors@2.0.5", "", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="],1107 "@types/http-errors": ["@types/http-errors@2.0.5", "", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="],
1217 1108
1218 "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],1109 "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
@@ -1221,8 +1112,6 @@ · 2 unmodified lines
1221 1112
1222 "@types/keygrip": ["@types/keygrip@1.0.6", "", {}, "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ=="],1113 "@types/keygrip": ["@types/keygrip@1.0.6", "", {}, "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ=="],
1223 1114
1224 "@types/keyv": ["@types/keyv@3.1.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg=="],
1225
1226 "@types/koa": ["@types/koa@2.15.0", "", { "dependencies": { "@types/accepts": "*", "@types/content-disposition": "*", "@types/cookies": "*", "@types/http-assert": "*", "@types/http-errors": "*", "@types/keygrip": "*", "@types/koa-compose": "*", "@types/node": "*" } }, "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g=="],1115 "@types/koa": ["@types/koa@2.15.0", "", { "dependencies": { "@types/accepts": "*", "@types/content-disposition": "*", "@types/cookies": "*", "@types/http-assert": "*", "@types/http-errors": "*", "@types/keygrip": "*", "@types/koa-compose": "*", "@types/node": "*" } }, "sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g=="],
1227 1116
1228 "@types/koa-compose": ["@types/koa-compose@3.2.9", "", { "dependencies": { "@types/koa": "*" } }, "sha512-BroAZ9FTvPiCy0Pi8tjD1OfJ7bgU1gQf0eR6e1Vm+JJATy9eKOG3hQMFtMciMawiSOVnLMdmUOC46s7HBhSTsA=="],1117 "@types/koa-compose": ["@types/koa-compose@3.2.9", "", { "dependencies": { "@types/koa": "*" } }, "sha512-BroAZ9FTvPiCy0Pi8tjD1OfJ7bgU1gQf0eR6e1Vm+JJATy9eKOG3hQMFtMciMawiSOVnLMdmUOC46s7HBhSTsA=="],
@@ -1245,20 +1134,12 @@ · 16 unmodified lines
1245 1134
1246 "@types/react-reconciler": ["@types/react-reconciler@0.31.0", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-wa1KtV3SHKnWeLHfZFg/7nrPSe/Ejdn+qbanNX4V6i9I7C3ECKPfBnC1KM3ef58KFWEohLmTvoTH5XuEIKGX2g=="],1135 "@types/react-reconciler": ["@types/react-reconciler@0.31.0", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-wa1KtV3SHKnWeLHfZFg/7nrPSe/Ejdn+qbanNX4V6i9I7C3ECKPfBnC1KM3ef58KFWEohLmTvoTH5XuEIKGX2g=="],
1247 1136
1248 "@types/responselike": ["@types/responselike@1.0.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw=="],
1249
1250 "@types/semver": ["@types/semver@7.7.1", "", {}, "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA=="],
1251
1252 "@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="],1137 "@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="],
1253 1138
1254 "@types/serve-static": ["@types/serve-static@1.15.10", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "<1" } }, "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw=="],1139 "@types/serve-static": ["@types/serve-static@1.15.10", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "<1" } }, "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw=="],
1255 1140
1256 "@types/shimmer": ["@types/shimmer@1.2.0", "", {}, "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg=="],
1257
1258 "@types/statuses": ["@types/statuses@2.0.6", "", {}, "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA=="],1141 "@types/statuses": ["@types/statuses@2.0.6", "", {}, "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA=="],
1259 1142
1260 "@types/tmp": ["@types/tmp@0.2.6", "", {}, "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA=="],
1261
1262 "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],1143 "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],
1263 1144
1264 "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],1145 "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
@@ -1367,14 +1248,10 @@ · 102 unmodified lines
1367 1248
1368 "@workos-inc/node": ["@workos-inc/node@8.2.0", "", { "dependencies": { "iron-webcrypto": "^2.0.0", "jose": "~6.1.0" } }, "sha512-aAY2k7X09lQ4TaVe7Kjm3gjb+EsGRoncbwJCOou9mCmunQoEYO1lsNrJTRIMM+jKCPBQDcmMF1O3Bv8IQwQKtg=="],1249 "@workos-inc/node": ["@workos-inc/node@8.2.0", "", { "dependencies": { "iron-webcrypto": "^2.0.0", "jose": "~6.1.0" } }, "sha512-aAY2k7X09lQ4TaVe7Kjm3gjb+EsGRoncbwJCOou9mCmunQoEYO1lsNrJTRIMM+jKCPBQDcmMF1O3Bv8IQwQKtg=="],
1369 1250
1370 "abbrev": ["abbrev@4.0.0", "", {}, "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA=="],
1371
1372 "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="],1251 "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="],
1373 1252
1374 "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],1253 "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
1375 1254
1376 "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="],
1377
1378 "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],1255 "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
1379 1256
1380 "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],1257 "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
@@ -1393,7 +1270,7 @@ · 12 unmodified lines
1393 1270
1394 "ansis": ["ansis@4.2.0", "", {}, "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig=="],1271 "ansis": ["ansis@4.2.0", "", {}, "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig=="],
1395 1272
1396 "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],1273 "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
1397 1274
1398 "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="],1275 "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="],
1399 1276
@@ -1431,10 +1308,6 @@ · 31 unmodified lines
1431 1308
1432 "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],1309 "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],
1433 1310
1434 "aws-sdk": ["aws-sdk@2.1692.0", "", { "dependencies": { "buffer": "4.9.2", "events": "1.1.1", "ieee754": "1.1.13", "jmespath": "0.16.0", "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", "util": "^0.12.4", "uuid": "8.0.0", "xml2js": "0.6.2" } }, "sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw=="],
1435
1436 "aws4fetch": ["aws4fetch@1.0.18", "", {}, "sha512-3Cf+YaUl07p24MoQ46rFwulAmiyCwH2+1zw1ZyPAX5OtJ34Hh185DwB8y/qRLb6cYYYtSFJ9pthyLc0MD4e8sQ=="],
1437
1438 "axe-core": ["axe-core@4.11.1", "", {}, "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A=="],1311 "axe-core": ["axe-core@4.11.1", "", {}, "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A=="],
1439 1312
1440 "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],1313 "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
@@ -1453,8 +1326,6 @@ · 12 unmodified lines
1453 1326
1454 "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="],1327 "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="],
1455 1328
1456 "bin-links": ["bin-links@6.0.0", "", { "dependencies": { "cmd-shim": "^8.0.0", "npm-normalize-package-bin": "^5.0.0", "proc-log": "^6.0.0", "read-cmd-shim": "^6.0.0", "write-file-atomic": "^7.0.0" } }, "sha512-X4CiKlcV2GjnCMwnKAfbVWpHa++65th9TuzAEYtZoATiOE2DQKhSp4CJlyLoTqdhBKlXjpXjCTYPNNFS33Fi6w=="],
1457
1458 "birpc": ["birpc@2.9.0", "", {}, "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw=="],1329 "birpc": ["birpc@2.9.0", "", {}, "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw=="],
1459 1330
1460 "blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="],1331 "blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="],
@@ -1469,12 +1340,10 @@ · 8 unmodified lines
1469 1340
1470 "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="],1341 "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="],
1471 1342
1472 "buffer": ["buffer@4.9.2", "", { "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" } }, "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg=="],1343 "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
1473 1344
1474 "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="],1345 "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="],
1475 1346
1476 "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
1477
1478 "bun-types": ["bun-types@1.3.8", "", { "dependencies": { "@types/node": "*" } }, "sha512-fL99nxdOWvV4LqjmC+8Q9kW3M4QTtTR1eePs94v5ctGqU8OeceWrSUaRw3JYb7tU3FkMIAjkueehrHPPPGKi5Q=="],1347 "bun-types": ["bun-types@1.3.8", "", { "dependencies": { "@types/node": "*" } }, "sha512-fL99nxdOWvV4LqjmC+8Q9kW3M4QTtTR1eePs94v5ctGqU8OeceWrSUaRw3JYb7tU3FkMIAjkueehrHPPPGKi5Q=="],
1479 1348
1480 "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="],1349 "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="],
@@ -1483,12 +1352,6 @@ · 2 unmodified lines
1483 1352
1484 "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],1353 "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],
1485 1354
1486 "cacache": ["cacache@20.0.3", "", { "dependencies": { "@npmcli/fs": "^5.0.0", "fs-minipass": "^3.0.0", "glob": "^13.0.0", "lru-cache": "^11.1.0", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^7.0.2", "ssri": "^13.0.0", "unique-filename": "^5.0.0" } }, "sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw=="],
1487
1488 "cacheable-lookup": ["cacheable-lookup@5.0.4", "", {}, "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="],
1489
1490 "cacheable-request": ["cacheable-request@7.0.4", "", { "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^6.0.1", "responselike": "^2.0.0" } }, "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg=="],
1491
1492 "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="],1355 "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="],
1493 1356
1494 "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],1357 "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
@@ -1521,10 +1384,6 @@ · 26 unmodified lines
1521 1384
1522 "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],1385 "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
1523 1386
1524 "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="],
1525
1526 "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="],
1527
1528 "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="],1387 "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="],
1529 1388
1530 "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="],1389 "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="],
@@ -1537,12 +1396,8 @@ · 6 unmodified lines
1537 1396
1538 "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],1397 "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
1539 1398
1540 "clone-response": ["clone-response@1.0.3", "", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA=="],
1541
1542 "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],1399 "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
1543 1400
1544 "cmd-shim": ["cmd-shim@8.0.0", "", {}, "sha512-Jk/BK6NCapZ58BKUxlSI+ouKRbjH1NLZCgJkYoab+vEHUY3f6OzpNBN9u7HFSv9J6TRDGs4PLOHezoKGaFRSCA=="],
1545
1546 "cmdk": ["cmdk@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "^1.1.1", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-id": "^1.1.0", "@radix-ui/react-primitive": "^2.0.2" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg=="],1401 "cmdk": ["cmdk@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "^1.1.1", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-id": "^1.1.0", "@radix-ui/react-primitive": "^2.0.2" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg=="],
1547 1402
1548 "code-block-writer": ["code-block-writer@13.0.3", "", {}, "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg=="],1403 "code-block-writer": ["code-block-writer@13.0.3", "", {}, "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg=="],
@@ -1557,8 +1412,6 @@ · 8 unmodified lines
1557 1412
1558 "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],1413 "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
1559 1414
1560 "common-ancestor-path": ["common-ancestor-path@2.0.0", "", {}, "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng=="],
1561
1562 "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],1415 "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
1563 1416
1564 "content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="],1417 "content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="],
@@ -1601,8 +1454,6 @@ · 36 unmodified lines
1601 1454
1602 "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="],1455 "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="],
1603 1456
1604 "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="],
1605
1606 "dedent": ["dedent@1.7.1", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg=="],1457 "dedent": ["dedent@1.7.1", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg=="],
1607 1458
1608 "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="],1459 "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="],
@@ -1615,8 +1466,6 @@ · 6 unmodified lines
1615 1466
1616 "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="],1467 "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="],
1617 1468
1618 "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="],
1619
1620 "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="],1469 "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="],
1621 1470
1622 "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="],1471 "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="],
@@ -1673,18 +1522,12 @@ · 50 unmodified lines
1673 1522
1674 "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],1523 "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
1675 1524
1676 "encoding": ["encoding@0.1.13", "", { "dependencies": { "iconv-lite": "^0.6.2" } }, "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="],
1677
1678 "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="],
1679
1680 "enhanced-resolve": ["enhanced-resolve@5.19.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg=="],1525 "enhanced-resolve": ["enhanced-resolve@5.19.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg=="],
1681 1526
1682 "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],1527 "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
1683 1528
1684 "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="],1529 "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="],
1685 1530
1686 "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="],
1687
1688 "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="],1531 "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="],
1689 1532
1690 "error-stack-parser-es": ["error-stack-parser-es@1.0.5", "", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="],1533 "error-stack-parser-es": ["error-stack-parser-es@1.0.5", "", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="],
@@ -1757,8 +1600,6 @@ · 66 unmodified lines
1757 1600
1758 "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],1601 "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
1759 1602
1760 "events": ["events@1.1.1", "", {}, "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw=="],
1761
1762 "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="],1603 "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="],
1763 1604
1764 "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="],1605 "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="],
@@ -1767,12 +1608,8 @@ · 2 unmodified lines
1767 1608
1768 "execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="],1609 "execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="],
1769 1610
1770 "executor-infra": ["executor-infra@workspace:executor/infra"],
1771
1772 "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="],1611 "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="],
1773 1612
1774 "exponential-backoff": ["exponential-backoff@3.1.3", "", {}, "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA=="],
1775
1776 "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="],1613 "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="],
1777 1614
1778 "express-rate-limit": ["express-rate-limit@8.2.1", "", { "dependencies": { "ip-address": "10.0.1" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g=="],1615 "express-rate-limit": ["express-rate-limit@8.2.1", "", { "dependencies": { "ip-address": "10.0.1" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g=="],
@@ -1815,8 +1652,6 @@ · 36 unmodified lines
1815 1652
1816 "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],1653 "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
1817 1654
1818 "find-up-simple": ["find-up-simple@1.0.1", "", {}, "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ=="],
1819
1820 "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],1655 "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
1821 1656
1822 "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="],1657 "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="],
@@ -1833,8 +1668,6 @@ · 10 unmodified lines
1833 1668
1834 "fs-extra": ["fs-extra@11.3.3", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg=="],1669 "fs-extra": ["fs-extra@11.3.3", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg=="],
1835 1670
1836 "fs-minipass": ["fs-minipass@3.0.3", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw=="],
1837
1838 "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],1671 "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
1839 1672
1840 "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],1673 "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
@@ -1875,7 +1708,7 @@ · 34 unmodified lines
1875 1708
1876 "get-uri": ["get-uri@6.0.5", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="],1709 "get-uri": ["get-uri@6.0.5", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="],
1877 1710
1878 "glob": ["glob@13.0.2", "", { "dependencies": { "minimatch": "^10.1.2", "minipass": "^7.1.2", "path-scurry": "^2.0.0" } }, "sha512-035InabNu/c1lW0tzPhAgapKctblppqsKKG9ZaNzbr+gXwWMjXoiyGSyB9sArzrjG7jY+zntRq5ZSUYemrnWVQ=="],1711 "glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="],
1879 1712
1880 "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],1713 "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
1881 1714
@@ -1887,12 +1720,8 @@ · 5 unmodified lines
1887 1720
1888 "google-logging-utils": ["google-logging-utils@1.1.3", "", {}, "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA=="],1721 "google-logging-utils": ["google-logging-utils@1.1.3", "", {}, "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA=="],
1889 1722
1890 "google-protobuf": ["google-protobuf@3.21.4", "", {}, "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ=="],
1891
1892 "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],1723 "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
1893 1724
1894 "got": ["got@11.8.6", "", { "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", "p-cancelable": "^2.0.0", "responselike": "^2.0.0" } }, "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g=="],
1895
1896 "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],1725 "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
1897 1726
1898 "graphql": ["graphql@16.12.0", "", {}, "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ=="],1727 "graphql": ["graphql@16.12.0", "", {}, "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ=="],
@@ -1941,44 +1770,32 @@ · 42 unmodified lines
1941 1770
1942 "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="],1771 "hookable": ["hookable@5.5.3", "", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="],
1943 1772
1944 "hosted-git-info": ["hosted-git-info@9.0.2", "", { "dependencies": { "lru-cache": "^11.1.0" } }, "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg=="],
1945
1946 "html-url-attributes": ["html-url-attributes@3.0.1", "", {}, "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ=="],1773 "html-url-attributes": ["html-url-attributes@3.0.1", "", {}, "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ=="],
1947 1774
1948 "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="],1775 "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="],
1949 1776
1950 "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="],
1951
1952 "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="],1777 "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="],
1953 1778
1954 "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="],1779 "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="],
1955 1780
1956 "http2-wrapper": ["http2-wrapper@1.0.3", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" } }, "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg=="],
1957
1958 "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],1781 "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
1959 1782
1960 "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="],1783 "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="],
1961 1784
1962 "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],1785 "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
1963 1786
1964 "ieee754": ["ieee754@1.1.13", "", {}, "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="],1787 "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
1965 1788
1966 "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],1789 "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
1967 1790
1968 "ignore-walk": ["ignore-walk@8.0.0", "", { "dependencies": { "minimatch": "^10.0.3" } }, "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A=="],
1969
1970 "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],1791 "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
1971 1792
1972 "import-in-the-middle": ["import-in-the-middle@1.15.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" } }, "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA=="],
1973
1974 "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],1793 "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
1975 1794
1976 "index-to-position": ["index-to-position@1.2.0", "", {}, "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw=="],1795 "index-to-position": ["index-to-position@1.2.0", "", {}, "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw=="],
1977 1796
1978 "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],1797 "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
1979 1798
1980 "ini": ["ini@2.0.0", "", {}, "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="],
1981
1982 "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="],1799 "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="],
1983 1800
1984 "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="],1801 "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="],
@@ -1995,8 +1812,6 @@ · 10 unmodified lines
1995 1812
1996 "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="],1813 "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="],
1997 1814
1998 "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="],
1999
2000 "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="],1815 "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="],
2001 1816
2002 "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],1817 "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
@@ -2081,7 +1896,7 @@ · 78 unmodified lines
2081 1896
2082 "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="],1897 "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="],
2083 1898
2084 "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="],1899 "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="],
2085 1900
2086 "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],1901 "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
2087 1902
@@ -2091,15 +1906,13 @@ · 3 unmodified lines
2091 1906
2092 "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],1907 "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
2093 1908
2094 "jmespath": ["jmespath@0.16.0", "", {}, "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw=="],
2095
2096 "jose": ["jose@6.1.3", "", {}, "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ=="],1909 "jose": ["jose@6.1.3", "", {}, "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ=="],
2097 1910
2098 "js-levenshtein": ["js-levenshtein@1.1.6", "", {}, "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g=="],1911 "js-levenshtein": ["js-levenshtein@1.1.6", "", {}, "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g=="],
2099 1912
2100 "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],1913 "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
2101 1914
2102 "js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],1915 "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
2103 1916
2104 "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],1917 "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
2105 1918
@@ -2117,20 +1930,12 @@ · 11 unmodified lines
2117 1930
2118 "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],1931 "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
2119 1932
2120 "json-stringify-nice": ["json-stringify-nice@1.1.4", "", {}, "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw=="],
2121
2122 "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],1933 "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
2123 1934
2124 "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],1935 "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
2125 1936
2126 "jsonparse": ["jsonparse@1.3.1", "", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="],
2127
2128 "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="],1937 "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="],
2129 1938
2130 "just-diff": ["just-diff@6.0.2", "", {}, "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA=="],
2131
2132 "just-diff-apply": ["just-diff-apply@5.5.0", "", {}, "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw=="],
2133
2134 "jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="],1939 "jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="],
2135 1940
2136 "jws": ["jws@4.0.1", "", { "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="],1941 "jws": ["jws@4.0.1", "", { "dependencies": { "jwa": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="],
@@ -2177,8 +1982,6 @@ · 40 unmodified lines
2177 1982
2178 "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="],1983 "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="],
2179 1984
2180 "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="],
2181
2182 "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],1985 "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
2183 1986
2184 "lodash.snakecase": ["lodash.snakecase@4.1.1", "", {}, "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw=="],1987 "lodash.snakecase": ["lodash.snakecase@4.1.1", "", {}, "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw=="],
@@ -2193,8 +1996,6 @@ · 8 unmodified lines
2193 1996
2194 "loupe": ["loupe@3.2.1", "", {}, "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ=="],1997 "loupe": ["loupe@3.2.1", "", {}, "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ=="],
2195 1998
2196 "lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="],
2197
2198 "lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="],1999 "lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="],
2199 2000
2200 "lucide-react": ["lucide-react@0.563.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA=="],2001 "lucide-react": ["lucide-react@0.563.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA=="],
@@ -2203,8 +2004,6 @@ · 2 unmodified lines
2203 2004
2204 "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],2005 "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
2205 2006
2206 "make-fetch-happen": ["make-fetch-happen@15.0.3", "", { "dependencies": { "@npmcli/agent": "^4.0.0", "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "ssri": "^13.0.0" } }, "sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw=="],
2207
2208 "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],2007 "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
2209 2008
2210 "marked": ["marked@14.0.0", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ=="],2009 "marked": ["marked@14.0.0", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ=="],
@@ -2317,8 +2116,6 @@ · 106 unmodified lines
2317 2116
2318 "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],2117 "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],
2319 2118
2320 "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="],
2321
2322 "miniflare": ["miniflare@4.20260210.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "^0.34.5", "undici": "7.18.2", "workerd": "1.20260210.0", "ws": "8.18.0", "youch": "4.1.0-beta.10" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-HXR6m53IOqEzq52DuGF1x7I1K6lSIqzhbCbQXv/cTmPnPJmNkr7EBtLDm4nfSkOvlDtnwDCLUjWII5fyGJI5Tw=="],2119 "miniflare": ["miniflare@4.20260210.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "^0.34.5", "undici": "7.18.2", "workerd": "1.20260210.0", "ws": "8.18.0", "youch": "4.1.0-beta.10" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-HXR6m53IOqEzq52DuGF1x7I1K6lSIqzhbCbQXv/cTmPnPJmNkr7EBtLDm4nfSkOvlDtnwDCLUjWII5fyGJI5Tw=="],
2323 2120
2324 "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],2121 "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
@@ -2327,20 +2124,6 @@ · 2 unmodified lines
2327 2124
2328 "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],2125 "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
2329 2126
2330 "minipass-collect": ["minipass-collect@2.0.1", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw=="],
2331
2332 "minipass-fetch": ["minipass-fetch@5.0.1", "", { "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^2.0.0", "minizlib": "^3.0.1" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "sha512-yHK8pb0iCGat0lDrs/D6RZmCdaBT64tULXjdxjSMAqoDi18Q3qKEUTHypHQZQd9+FYpIS+lkvpq6C/R6SbUeRw=="],
2333
2334 "minipass-flush": ["minipass-flush@1.0.5", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw=="],
2335
2336 "minipass-pipeline": ["minipass-pipeline@1.2.4", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A=="],
2337
2338 "minipass-sized": ["minipass-sized@2.0.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA=="],
2339
2340 "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="],
2341
2342 "module-details-from-path": ["module-details-from-path@1.0.4", "", {}, "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w=="],
2343
2344 "monaco-editor": ["monaco-editor@0.55.1", "", { "dependencies": { "dompurify": "3.2.7", "marked": "14.0.0" } }, "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A=="],2127 "monaco-editor": ["monaco-editor@0.55.1", "", { "dependencies": { "dompurify": "3.2.7", "marked": "14.0.0" } }, "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A=="],
2345 2128
2346 "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],2129 "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
@@ -2373,38 +2156,14 @@ · 26 unmodified lines
2373 2156
2374 "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="],2157 "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="],
2375 2158
2376 "node-gyp": ["node-gyp@12.2.0", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "graceful-fs": "^4.2.6", "make-fetch-happen": "^15.0.0", "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "tar": "^7.5.4", "tinyglobby": "^0.2.12", "which": "^6.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ=="],
2377
2378 "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="],2159 "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="],
2379 2160
2380 "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="],2161 "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="],
2381 2162
2382 "nopt": ["nopt@9.0.0", "", { "dependencies": { "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw=="],
2383
2384 "normalize-package-data": ["normalize-package-data@6.0.2", "", { "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g=="],
2385
2386 "normalize-url": ["normalize-url@6.1.0", "", {}, "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="],
2387
2388 "npm-bundled": ["npm-bundled@5.0.0", "", { "dependencies": { "npm-normalize-package-bin": "^5.0.0" } }, "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw=="],
2389
2390 "npm-install-checks": ["npm-install-checks@8.0.0", "", { "dependencies": { "semver": "^7.1.1" } }, "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA=="],
2391
2392 "npm-normalize-package-bin": ["npm-normalize-package-bin@5.0.0", "", {}, "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag=="],
2393
2394 "npm-package-arg": ["npm-package-arg@13.0.2", "", { "dependencies": { "hosted-git-info": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^7.0.0" } }, "sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA=="],
2395
2396 "npm-packlist": ["npm-packlist@10.0.3", "", { "dependencies": { "ignore-walk": "^8.0.0", "proc-log": "^6.0.0" } }, "sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg=="],
2397
2398 "npm-pick-manifest": ["npm-pick-manifest@11.0.3", "", { "dependencies": { "npm-install-checks": "^8.0.0", "npm-normalize-package-bin": "^5.0.0", "npm-package-arg": "^13.0.0", "semver": "^7.3.5" } }, "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ=="],
2399
2400 "npm-registry-fetch": ["npm-registry-fetch@19.1.1", "", { "dependencies": { "@npmcli/redact": "^4.0.0", "jsonparse": "^1.3.1", "make-fetch-happen": "^15.0.0", "minipass": "^7.0.2", "minipass-fetch": "^5.0.0", "minizlib": "^3.0.1", "npm-package-arg": "^13.0.0", "proc-log": "^6.0.0" } }, "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw=="],
2401
2402 "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="],2163 "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="],
2403 2164
2404 "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],2165 "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
2405 2166
2406 "object-hash": ["object-hash@2.2.0", "", {}, "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw=="],
2407
2408 "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],2167 "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
2409 2168
2410 "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="],2169 "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="],
@@ -2421,8 +2180,6 @@ · 10 unmodified lines
2421 2180
2422 "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="],2181 "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="],
2423 2182
2424 "oidc-token-hash": ["oidc-token-hash@5.2.0", "", {}, "sha512-6gj2m8cJZ+iSW8bm0FXdGF0YhIQbKrfP4yWTNzxc31U6MOjfEmB1rHvlYvxI1B7t7BCi1F2vYTT6YhtQRG4hxw=="],
2425
2426 "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],2183 "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
2427 2184
2428 "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],2185 "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
@@ -2441,10 +2198,6 @@ · 12 unmodified lines
2441 2198
2442 "openapi-typescript": ["openapi-typescript@7.12.0", "", { "dependencies": { "@redocly/openapi-core": "^1.34.6", "ansi-colors": "^4.1.3", "change-case": "^5.4.4", "parse-json": "^8.3.0", "supports-color": "^10.2.2", "yargs-parser": "^21.1.1" }, "peerDependencies": { "typescript": "^5.x" }, "bin": { "openapi-typescript": "bin/cli.js" } }, "sha512-dtk3h5rbILWfDEUCNgMeBHSpvVsslM0ik1psDxxlrIAJk34SDqZIbhF+qKZy6MytW7Fp+wxynq9y5S3wgJcn0g=="],2199 "openapi-typescript": ["openapi-typescript@7.12.0", "", { "dependencies": { "@redocly/openapi-core": "^1.34.6", "ansi-colors": "^4.1.3", "change-case": "^5.4.4", "parse-json": "^8.3.0", "supports-color": "^10.2.2", "yargs-parser": "^21.1.1" }, "peerDependencies": { "typescript": "^5.x" }, "bin": { "openapi-typescript": "bin/cli.js" } }, "sha512-dtk3h5rbILWfDEUCNgMeBHSpvVsslM0ik1psDxxlrIAJk34SDqZIbhF+qKZy6MytW7Fp+wxynq9y5S3wgJcn0g=="],
2443 2200
2444 "opencontrol": ["opencontrol@0.0.6", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.6.1", "@tsconfig/bun": "1.0.7", "hono": "4.7.4", "zod": "3.24.2", "zod-to-json-schema": "3.24.3" }, "bin": { "opencontrol": "bin/index.mjs" } }, "sha512-QeCrpOK5D15QV8kjnGVeD/BHFLwcVr+sn4T6KKmP0WAMs2pww56e4h+eOGHb5iPOufUQXbdbBKi6WV2kk7tefQ=="],
2445
2446 "openid-client": ["openid-client@5.6.4", "", { "dependencies": { "jose": "^4.15.4", "lru-cache": "^6.0.0", "object-hash": "^2.2.0", "oidc-token-hash": "^5.0.3" } }, "sha512-T1h3B10BRPKfcObdBklX639tVz+xh34O7GjofqrqiAQdm7eHsQ00ih18x6wuJ/E6FxdtS2u3FmUGPDeEcMwzNA=="],
2447
2448 "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],2201 "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
2449 2202
2450 "ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="],2203 "ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="],
@@ -2453,30 +2206,20 @@ · 2 unmodified lines
2453 2206
2454 "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="],2207 "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="],
2455 2208
2456 "p-cancelable": ["p-cancelable@2.1.1", "", {}, "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="],
2457
2458 "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],2209 "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
2459 2210
2460 "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],2211 "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
2461 2212
2462 "p-map": ["p-map@7.0.4", "", {}, "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ=="],
2463
2464 "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="],2213 "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="],
2465 2214
2466 "pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="],2215 "pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="],
2467 2216
2468 "package-directory": ["package-directory@8.2.0", "", { "dependencies": { "find-up-simple": "^1.0.0" } }, "sha512-qJSu5Mo6tHmRxCy2KCYYKYgcfBdUpy9dwReaZD/xwf608AUk/MoRtIOWzgDtUeGeC7n/55yC3MI1Q+MbSoektw=="],
2469
2470 "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],2217 "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
2471 2218
2472 "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],2219 "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
2473 2220
2474 "pacote": ["pacote@21.3.1", "", { "dependencies": { "@npmcli/git": "^7.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "@npmcli/run-script": "^10.0.0", "cacache": "^20.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^13.0.0", "npm-packlist": "^10.0.1", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "proc-log": "^6.0.0", "promise-retry": "^2.0.1", "sigstore": "^4.0.0", "ssri": "^13.0.0", "tar": "^7.4.3" }, "bin": { "pacote": "bin/index.js" } }, "sha512-O0EDXi85LF4AzdjG74GUwEArhdvawi/YOHcsW6IijKNj7wm8IvEWNF5GnfuxNpQ/ZpO3L37+v8hqdVh8GgWYhg=="],
2475
2476 "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],2221 "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
2477 2222
2478 "parse-conflict-json": ["parse-conflict-json@5.0.1", "", { "dependencies": { "json-parse-even-better-errors": "^5.0.0", "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" } }, "sha512-ZHEmNKMq1wyJXNwLxyHnluPfRAFSIliBvbK/UiOceROt4Xh9Pz0fq49NytIaeaCUf5VR86hwQ/34FCcNU5/LKQ=="],
2479
2480 "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="],2223 "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="],
2481 2224
2482 "parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="],2225 "parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="],
@@ -2497,7 +2240,7 @@ · 14 unmodified lines
2497 2240
2498 "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],2241 "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
2499 2242
2500 "path-scurry": ["path-scurry@2.0.1", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA=="],2243 "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="],
2501 2244
2502 "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="],2245 "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="],
2503 2246
@@ -2507,7 +2250,7 @@ · 3 unmodified lines
2507 2250
2508 "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],2251 "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
2509 2252
2510 "picomatch": ["picomatch@3.0.1", "", {}, "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag=="],2253 "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
2511 2254
2512 "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="],2255 "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="],
2513 2256
@@ -2527,16 +2270,6 @@ · 13 unmodified lines
2527 2270
2528 "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="],2271 "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="],
2529 2272
2530 "proc-log": ["proc-log@6.1.0", "", {}, "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ=="],
2531
2532 "proggy": ["proggy@4.0.0", "", {}, "sha512-MbA4R+WQT76ZBm/5JUpV9yqcJt92175+Y0Bodg3HgiXzrmKu7Ggq+bpn6y6wHH+gN9NcyKn3yg1+d47VaKwNAQ=="],
2533
2534 "promise-all-reject-late": ["promise-all-reject-late@1.0.1", "", {}, "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw=="],
2535
2536 "promise-call-limit": ["promise-call-limit@3.0.2", "", {}, "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw=="],
2537
2538 "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="],
2539
2540 "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],2273 "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
2541 2274
2542 "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="],2275 "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="],
@@ -2551,10 +2284,6 @@ · 8 unmodified lines
2551 2284
2552 "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],2285 "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
2553 2286
2554 "pulumi-stripe": ["pulumi-stripe@0.0.26", "", { "dependencies": { "@pulumi/pulumi": "^3.0.0" } }, "sha512-6kwXa6Sn+JaEtv/b6Gji3tOmjxGyYG6LwavC3udJSt+HP6GwcqirF5NJKyCqpjNdm7wbwIBnz8hI3Xri9hkPqA=="],
2555
2556 "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="],
2557
2558 "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],2287 "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
2559 2288
2560 "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="],2289 "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="],
@@ -2567,12 +2296,8 @@ · 6 unmodified lines
2567 2296
2568 "quansync": ["quansync@1.0.0", "", {}, "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA=="],2297 "quansync": ["quansync@1.0.0", "", {}, "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA=="],
2569 2298
2570 "querystring": ["querystring@0.2.0", "", {}, "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g=="],
2571
2572 "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],2299 "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
2573 2300
2574 "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="],
2575
2576 "radix-ui": ["radix-ui@1.4.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-accessible-icon": "1.1.7", "@radix-ui/react-accordion": "1.2.12", "@radix-ui/react-alert-dialog": "1.1.15", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-aspect-ratio": "1.1.7", "@radix-ui/react-avatar": "1.1.10", "@radix-ui/react-checkbox": "1.3.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-context-menu": "2.2.16", "@radix-ui/react-dialog": "1.1.15", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-dropdown-menu": "2.1.16", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-form": "0.1.8", "@radix-ui/react-hover-card": "1.1.15", "@radix-ui/react-label": "2.1.7", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-menubar": "1.1.16", "@radix-ui/react-navigation-menu": "1.2.14", "@radix-ui/react-one-time-password-field": "0.1.8", "@radix-ui/react-password-toggle-field": "0.1.3", "@radix-ui/react-popover": "1.1.15", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-progress": "1.1.7", "@radix-ui/react-radio-group": "1.3.8", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-scroll-area": "1.2.10", "@radix-ui/react-select": "2.2.6", "@radix-ui/react-separator": "1.1.7", "@radix-ui/react-slider": "1.3.6", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-switch": "1.2.6", "@radix-ui/react-tabs": "1.1.13", "@radix-ui/react-toast": "1.2.15", "@radix-ui/react-toggle": "1.1.10", "@radix-ui/react-toggle-group": "1.1.11", "@radix-ui/react-toolbar": "1.1.11", "@radix-ui/react-tooltip": "1.2.8", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-escape-keydown": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA=="],2301 "radix-ui": ["radix-ui@1.4.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-accessible-icon": "1.1.7", "@radix-ui/react-accordion": "1.2.12", "@radix-ui/react-alert-dialog": "1.1.15", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-aspect-ratio": "1.1.7", "@radix-ui/react-avatar": "1.1.10", "@radix-ui/react-checkbox": "1.3.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-context-menu": "2.2.16", "@radix-ui/react-dialog": "1.1.15", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-dropdown-menu": "2.1.16", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-form": "0.1.8", "@radix-ui/react-hover-card": "1.1.15", "@radix-ui/react-label": "2.1.7", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-menubar": "1.1.16", "@radix-ui/react-navigation-menu": "1.2.14", "@radix-ui/react-one-time-password-field": "0.1.8", "@radix-ui/react-password-toggle-field": "0.1.3", "@radix-ui/react-popover": "1.1.15", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-progress": "1.1.7", "@radix-ui/react-radio-group": "1.3.8", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-scroll-area": "1.2.10", "@radix-ui/react-select": "2.2.6", "@radix-ui/react-separator": "1.1.7", "@radix-ui/react-slider": "1.3.6", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-switch": "1.2.6", "@radix-ui/react-tabs": "1.1.13", "@radix-ui/react-toast": "1.2.15", "@radix-ui/react-toggle": "1.1.10", "@radix-ui/react-toggle-group": "1.1.11", "@radix-ui/react-toolbar": "1.1.11", "@radix-ui/react-tooltip": "1.2.8", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-escape-keydown": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA=="],
2577 2302
2578 "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],2303 "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],
@@ -2599,8 +2324,6 @@ · 20 unmodified lines
2599 2324
2600 "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="],2325 "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="],
2601 2326
2602 "read-cmd-shim": ["read-cmd-shim@6.0.0", "", {}, "sha512-1zM5HuOfagXCBWMN83fuFI/x+T/UhZ7k+KIzhrHXcQoeX5+7gmaDYjELQHmmzIodumBHeByBJT4QYS7ufAgs7A=="],
2603
2604 "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],2327 "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
2605 2328
2606 "recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="],2329 "recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="],
@@ -2635,22 +2358,14 @@ · 28 unmodified lines
2635 2358
2636 "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],2359 "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
2637 2360
2638 "require-in-the-middle": ["require-in-the-middle@7.5.2", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3", "resolve": "^1.22.8" } }, "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ=="],
2639
2640 "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="],2361 "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="],
2641 2362
2642 "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="],
2643
2644 "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],2363 "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
2645 2364
2646 "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],2365 "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
2647 2366
2648 "responselike": ["responselike@2.0.1", "", { "dependencies": { "lowercase-keys": "^2.0.0" } }, "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw=="],
2649
2650 "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],2367 "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
2651 2368
2652 "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="],
2653
2654 "rettime": ["rettime@0.10.1", "", {}, "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw=="],2369 "rettime": ["rettime@0.10.1", "", {}, "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw=="],
2655 2370
2656 "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],2371 "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
@@ -2679,11 +2394,9 @@ · 22 unmodified lines
2679 2394
2680 "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],2395 "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
2681 2396
2682 "sax": ["sax@1.2.1", "", {}, "sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA=="],
2683
2684 "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],2397 "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
2685 2398
2686 "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],2399 "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
2687 2400
2688 "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="],2401 "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="],
2689 2402
@@ -2709,8 +2422,6 @@ · 19 unmodified lines
2709 2422
2710 "shiki": ["shiki@3.22.0", "", { "dependencies": { "@shikijs/core": "3.22.0", "@shikijs/engine-javascript": "3.22.0", "@shikijs/engine-oniguruma": "3.22.0", "@shikijs/langs": "3.22.0", "@shikijs/themes": "3.22.0", "@shikijs/types": "3.22.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g=="],2423 "shiki": ["shiki@3.22.0", "", { "dependencies": { "@shikijs/core": "3.22.0", "@shikijs/engine-javascript": "3.22.0", "@shikijs/engine-oniguruma": "3.22.0", "@shikijs/langs": "3.22.0", "@shikijs/themes": "3.22.0", "@shikijs/types": "3.22.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g=="],
2711 2424
2712 "shimmer": ["shimmer@1.2.1", "", {}, "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="],
2713
2714 "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],2425 "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],
2715 2426
2716 "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="],2427 "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="],
@@ -2723,8 +2434,6 @@ · 6 unmodified lines
2723 2434
2724 "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],2435 "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
2725 2436
2726 "sigstore": ["sigstore@4.1.0", "", { "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0", "@sigstore/sign": "^4.1.0", "@sigstore/tuf": "^4.0.1", "@sigstore/verify": "^3.1.0" } }, "sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA=="],
2727
2728 "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],2437 "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
2729 2438
2730 "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="],2439 "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="],
@@ -2739,40 +2448,8 @@ · 8 unmodified lines
2739 2448
2740 "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],2449 "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
2741 2450
2742 "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="],
2743
2744 "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],2451 "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
2745 2452
2746 "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="],
2747
2748 "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="],
2749
2750 "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="],
2751
2752 "spdx-license-ids": ["spdx-license-ids@3.0.22", "", {}, "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ=="],
2753
2754 "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="],
2755
2756 "ssri": ["ssri@13.0.1", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ=="],
2757
2758 "sst": ["sst@3.17.38", "", { "dependencies": { "aws-sdk": "2.1692.0", "aws4fetch": "1.0.18", "jose": "5.2.3", "opencontrol": "0.0.6", "openid-client": "5.6.4" }, "optionalDependencies": { "sst-darwin-arm64": "3.17.38", "sst-darwin-x64": "3.17.38", "sst-linux-arm64": "3.17.38", "sst-linux-x64": "3.17.38", "sst-linux-x86": "3.17.38", "sst-win32-arm64": "3.17.38", "sst-win32-x64": "3.17.38", "sst-win32-x86": "3.17.38" }, "bin": { "sst": "bin/sst.mjs" } }, "sha512-AshCCzogYVVTgLV7SBQ2hkmctAI0QV4pJmHwsyrX1ruSCvH18ccGgX/kux6/AFfaKrT7GmuVuQ2Zsz25GPXEiA=="],
2759
2760 "sst-darwin-arm64": ["sst-darwin-arm64@3.17.38", "", { "os": "darwin", "cpu": "arm64" }, "sha512-2qEu/jRRBGQbMzkJKy4cypX+LdjInKtn1VrPHeggHD0/DsXLUBVdj/WyYb9ZxbsZEUcA9xZDR2+FBZ7lQzaDcw=="],
2761
2762 "sst-darwin-x64": ["sst-darwin-x64@3.17.38", "", { "os": "darwin", "cpu": "x64" }, "sha512-um13cWbRK5rfsYuLxS97gaSkFVd6jCzI+k6wlpJaOcJ5IZiH5UdFIz+ZE/7iCfNTEiwDT+RMw2nGL9a+07Vtww=="],
2763
2764 "sst-linux-arm64": ["sst-linux-arm64@3.17.38", "", { "os": "linux", "cpu": "arm64" }, "sha512-gMxYJmpytntqZOf9SZfMnj+v6E0vZ8dAT5XnaKQhETSwuN6WH/OWHgx4bnp7bMQfdvm1uYNB+p7GRopIRRPePQ=="],
2765
2766 "sst-linux-x64": ["sst-linux-x64@3.17.38", "", { "os": "linux", "cpu": "x64" }, "sha512-vwzfHhCugRTWevoA2qcl339yQhc8+vVdAqA11Qcats7LvaM6KxN9SqY00SfHPZxmm2odnefDg8z4b3Qvdo2NAw=="],
2767
2768 "sst-linux-x86": ["sst-linux-x86@3.17.38", "", { "os": "linux", "cpu": "none" }, "sha512-rxG2YsN2XnykCvJ1ZquZIXbEOWIdLdcJ1ir9hcqb31cLrH0z2EN5F/IsioH9mLRVJnbmY3JewNk+C9mMB2a8zA=="],
2769
2770 "sst-win32-arm64": ["sst-win32-arm64@3.17.38", "", { "os": "win32", "cpu": "arm64" }, "sha512-aPTaLqJ4bEEfQwaxnteFXHAePw4Po1Be0tsdTuNUPDhhyv1CV5xSl4nppb4q/Qn1dGxaU6L4zCzZkshWskGIOg=="],
2771
2772 "sst-win32-x64": ["sst-win32-x64@3.17.38", "", { "os": "win32", "cpu": "x64" }, "sha512-X2kx6MOK1tZ0JhMqDisB60fJCOSxot5q7NPFMna5hj7cgJaQfj0NAgQqGJkLEB8iVWyxi6e5o1oJLg+vH452HQ=="],
2773
2774 "sst-win32-x86": ["sst-win32-x86@3.17.38", "", { "os": "win32", "cpu": "none" }, "sha512-W5PxA4uhpXMzWNT0/sMrmU27fn1DCaReGwVwJGEZapu9GKTix41uaP+pyd9fwjiAHVILIdxqe7+BkZfH+mvzbg=="],
2775
2776 "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="],2453 "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="],
2777 2454
2778 "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="],2455 "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="],
@@ -2847,8 +2524,6 @@ · 68 unmodified lines
2847 2524
2848 "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="],2525 "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="],
2849 2526
2850 "tar": ["tar@7.5.7", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ=="],
2851
2852 "throttle-debounce": ["throttle-debounce@2.3.0", "", {}, "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ=="],2527 "throttle-debounce": ["throttle-debounce@2.3.0", "", {}, "sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ=="],
2853 2528
2854 "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="],2529 "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="],
@@ -2869,8 +2544,6 @@ · 14 unmodified lines
2869 2544
2870 "tldts-core": ["tldts-core@7.0.22", "", {}, "sha512-KgbTDC5wzlL6j/x6np6wCnDSMUq4kucHNm00KXPbfNzmllCmtmvtykJHfmgdHntwIeupW04y8s1N/43S1PkQDw=="],2545 "tldts-core": ["tldts-core@7.0.22", "", {}, "sha512-KgbTDC5wzlL6j/x6np6wCnDSMUq4kucHNm00KXPbfNzmllCmtmvtykJHfmgdHntwIeupW04y8s1N/43S1PkQDw=="],
2871 2546
2872 "tmp": ["tmp@0.2.5", "", {}, "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow=="],
2873
2874 "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],2547 "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
2875 2548
2876 "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],2549 "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
@@ -2879,8 +2552,6 @@ · 2 unmodified lines
2879 2552
2880 "tough-cookie": ["tough-cookie@6.0.0", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w=="],2553 "tough-cookie": ["tough-cookie@6.0.0", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w=="],
2881 2554
2882 "treeverse": ["treeverse@3.0.0", "", {}, "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ=="],
2883
2884 "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],2555 "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
2885 2556
2886 "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],2557 "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],
@@ -2899,8 +2570,6 @@ · 12 unmodified lines
2899 2570
2900 "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],2571 "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
2901 2572
2902 "tuf-js": ["tuf-js@4.1.0", "", { "dependencies": { "@tufjs/models": "4.1.0", "debug": "^4.4.3", "make-fetch-happen": "^15.0.1" } }, "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ=="],
2903
2904 "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="],2573 "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="],
2905 2574
2906 "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],2575 "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
@@ -2941,10 +2610,6 @@ · 34 unmodified lines
2941 2610
2942 "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="],2611 "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="],
2943 2612
2944 "unique-filename": ["unique-filename@5.0.0", "", { "dependencies": { "unique-slug": "^6.0.0" } }, "sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg=="],
2945
2946 "unique-slug": ["unique-slug@6.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw=="],
2947
2948 "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="],2613 "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="],
2949 2614
2950 "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="],2615 "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="],
@@ -2963,28 +2628,20 @@ · 12 unmodified lines
2963 2628
2964 "until-async": ["until-async@3.0.2", "", {}, "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw=="],2629 "until-async": ["until-async@3.0.2", "", {}, "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw=="],
2965 2630
2966 "upath": ["upath@1.2.0", "", {}, "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="],
2967
2968 "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="],2631 "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="],
2969 2632
2970 "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],2633 "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
2971 2634
2972 "url": ["url@0.10.3", "", { "dependencies": { "punycode": "1.3.2", "querystring": "0.2.0" } }, "sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ=="],
2973
2974 "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="],2635 "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="],
2975 2636
2976 "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="],2637 "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="],
2977 2638
2978 "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="],2639 "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="],
2979 2640
2980 "util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="],
2981
2982 "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],2641 "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
2983 2642
2984 "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="],2643 "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="],
2985 2644
2986 "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="],
2987
2988 "validate-npm-package-name": ["validate-npm-package-name@7.0.2", "", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="],2645 "validate-npm-package-name": ["validate-npm-package-name@7.0.2", "", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="],
2989 2646
2990 "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],2647 "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],
@@ -3001,8 +2658,6 @@ · 10 unmodified lines
3001 2658
3002 "vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="],2659 "vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="],
3003 2660
3004 "walk-up-path": ["walk-up-path@4.0.0", "", {}, "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A=="],
3005
3006 "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],2661 "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
3007 2662
3008 "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],2663 "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
@@ -3033,19 +2688,13 @@ · 24 unmodified lines
3033 2688
3034 "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],2689 "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
3035 2690
3036 "write-file-atomic": ["write-file-atomic@7.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } }, "sha512-YnlPC6JqnZl6aO4uRc+dx5PHguiR9S6WeoLtpxNT9wIG+BDya7ZNE1q7KOjVgaA73hKhKLpVPgJ5QA9THQ5BRg=="],
3037
3038 "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="],2691 "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="],
3039 2692
3040 "wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="],2693 "wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="],
3041 2694
3042 "xml2js": ["xml2js@0.6.2", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA=="],
3043
3044 "xmlbuilder": ["xmlbuilder@11.0.1", "", {}, "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="],
3045
3046 "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],2695 "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
3047 2696
3048 "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],2697 "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
3049 2698
3050 "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="],2699 "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="],
3051 2700
@@ -3073,8 +2722,6 @@ · 21 unmodified lines
3073 2722
3074 "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],2723 "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
3075 2724
3076 "@apidevtools/json-schema-ref-parser/js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
3077
3078 "@assistant/bot/@types/bun": ["@types/bun@1.3.9", "", { "dependencies": { "bun-types": "1.3.9" } }, "sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw=="],2725 "@assistant/bot/@types/bun": ["@types/bun@1.3.9", "", { "dependencies": { "bun-types": "1.3.9" } }, "sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw=="],
3079 2726
3080 "@assistant/server/@types/bun": ["@types/bun@1.3.9", "", { "dependencies": { "bun-types": "1.3.9" } }, "sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw=="],2727 "@assistant/server/@types/bun": ["@types/bun@1.3.9", "", { "dependencies": { "bun-types": "1.3.9" } }, "sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw=="],
@@ -3083,16 +2730,10 @@ · 2 unmodified lines
3083 2730
3084 "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="],2731 "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="],
3085 2732
3086 "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
3087
3088 "@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],2733 "@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
3089 2734
3090 "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],2735 "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
3091 2736
3092 "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
3093
3094 "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
3095
3096 "@convex-dev/workos/@workos-inc/authkit-react": ["@workos-inc/authkit-react@0.11.0", "", { "dependencies": { "@workos-inc/authkit-js": "0.13.0" }, "peerDependencies": { "react": ">=17" } }, "sha512-67HFSxP4wXC8ECGyvc1yGMwuD5NGkwT2OPt8DavHoKAlO+hRaAlu9wwzqUx1EJrHht0Dcx+l20Byq8Ab0bEhlg=="],2737 "@convex-dev/workos/@workos-inc/authkit-react": ["@workos-inc/authkit-react@0.11.0", "", { "dependencies": { "@workos-inc/authkit-js": "0.13.0" }, "peerDependencies": { "react": ">=17" } }, "sha512-67HFSxP4wXC8ECGyvc1yGMwuD5NGkwT2OPt8DavHoKAlO+hRaAlu9wwzqUx1EJrHht0Dcx+l20Byq8Ab0bEhlg=="],
3097 2738
3098 "@convex-dev/workos-authkit/@workos-inc/node": ["@workos-inc/node@7.82.0", "", { "dependencies": { "iron-session": "~6.3.1", "jose": "~5.6.3", "leb": "^1.0.0", "qs": "6.14.1" } }, "sha512-8h6XjIJf8nqNGYQMkWsjZ72WXMtzqrb4Azz39schXWoSRmwoK6tK+GpeAviJ9slddiJdOcp0Ht9/r+L6pGQMCg=="],2739 "@convex-dev/workos-authkit/@workos-inc/node": ["@workos-inc/node@7.82.0", "", { "dependencies": { "iron-session": "~6.3.1", "jose": "~5.6.3", "leb": "^1.0.0", "qs": "6.14.1" } }, "sha512-8h6XjIJf8nqNGYQMkWsjZ72WXMtzqrb4Azz39schXWoSRmwoK6tK+GpeAviJ9slddiJdOcp0Ht9/r+L6pGQMCg=="],
@@ -3105,8 +2746,6 @@ · 6 unmodified lines
3105 2746
3106 "@dotenvx/dotenvx/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="],2747 "@dotenvx/dotenvx/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="],
3107 2748
3108 "@dotenvx/dotenvx/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
3109
3110 "@dotenvx/dotenvx/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="],2749 "@dotenvx/dotenvx/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="],
3111 2750
3112 "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],2751 "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
@@ -3115,8 +2754,6 @@ · 2 unmodified lines
3115 2754
3116 "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],2755 "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
3117 2756
3118 "@eslint/eslintrc/js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
3119
3120 "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],2757 "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
3121 2758
3122 "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],2759 "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
@@ -3131,40 +2768,10 @@ · 8 unmodified lines
3131 2768
3132 "@next/eslint-plugin-next/fast-glob": ["fast-glob@3.3.1", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="],2769 "@next/eslint-plugin-next/fast-glob": ["fast-glob@3.3.1", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="],
3133 2770
3134 "@npmcli/agent/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="],
3135
3136 "@npmcli/arborist/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="],
3137
3138 "@npmcli/arborist/minimatch": ["minimatch@10.1.2", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.1" } }, "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw=="],
3139
3140 "@npmcli/git/ini": ["ini@6.0.0", "", {}, "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ=="],
3141
3142 "@npmcli/git/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="],
3143
3144 "@npmcli/git/which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="],
3145
3146 "@npmcli/map-workspaces/minimatch": ["minimatch@10.1.2", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.1" } }, "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw=="],
3147
3148 "@npmcli/metavuln-calculator/json-parse-even-better-errors": ["json-parse-even-better-errors@5.0.0", "", {}, "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ=="],
3149
3150 "@npmcli/package-json/json-parse-even-better-errors": ["json-parse-even-better-errors@5.0.0", "", {}, "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ=="],
3151
3152 "@npmcli/promise-spawn/which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="],
3153
3154 "@npmcli/run-script/which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="],
3155
3156 "@openassistant/reacord/react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="],2771 "@openassistant/reacord/react": ["react@19.2.4", "", {}, "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ=="],
3157 2772
3158 "@opentelemetry/instrumentation-grpc/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.27.0", "", {}, "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg=="],
3159
3160 "@poppinss/dumper/@sindresorhus/is": ["@sindresorhus/is@7.2.0", "", {}, "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw=="],
3161
3162 "@proto/sources/@types/bun": ["@types/bun@1.3.9", "", { "dependencies": { "bun-types": "1.3.9" } }, "sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw=="],2773 "@proto/sources/@types/bun": ["@types/bun@1.3.9", "", { "dependencies": { "bun-types": "1.3.9" } }, "sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw=="],
3163 2774
3164 "@pulumi/pulumi/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="],
3165
3166 "@redocly/openapi-core/js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
3167
3168 "@redocly/openapi-core/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="],2775 "@redocly/openapi-core/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="],
3169 2776
3170 "@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="],2777 "@rolldown/binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="],
@@ -3183,46 +2790,26 @@ · 12 unmodified lines
3183 2790
3184 "@ts-morph/common/minimatch": ["minimatch@10.1.2", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.1" } }, "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw=="],2791 "@ts-morph/common/minimatch": ["minimatch@10.1.2", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.1" } }, "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw=="],
3185 2792
3186 "@tufjs/models/minimatch": ["minimatch@10.1.2", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.1" } }, "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw=="],
3187
3188 "@types/cacheable-request/@types/node": ["@types/node@24.10.13", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg=="],
3189
3190 "@types/keyv/@types/node": ["@types/node@24.10.13", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg=="],
3191
3192 "@types/responselike/@types/node": ["@types/node@24.10.13", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg=="],
3193
3194 "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],2793 "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
3195 2794
3196 "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],2795 "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
3197 2796
2797 "@typescript-eslint/typescript-estree/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
2798
3198 "@workos-inc/authkit-nextjs/@workos-inc/node": ["@workos-inc/node@7.82.0", "", { "dependencies": { "iron-session": "~6.3.1", "jose": "~5.6.3", "leb": "^1.0.0", "qs": "6.14.1" } }, "sha512-8h6XjIJf8nqNGYQMkWsjZ72WXMtzqrb4Azz39schXWoSRmwoK6tK+GpeAviJ9slddiJdOcp0Ht9/r+L6pGQMCg=="],2799 "@workos-inc/authkit-nextjs/@workos-inc/node": ["@workos-inc/node@7.82.0", "", { "dependencies": { "iron-session": "~6.3.1", "jose": "~5.6.3", "leb": "^1.0.0", "qs": "6.14.1" } }, "sha512-8h6XjIJf8nqNGYQMkWsjZ72WXMtzqrb4Azz39schXWoSRmwoK6tK+GpeAviJ9slddiJdOcp0Ht9/r+L6pGQMCg=="],
3199 2800
3200 "@workos-inc/authkit-nextjs/jose": ["jose@5.10.0", "", {}, "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg=="],2801 "@workos-inc/authkit-nextjs/jose": ["jose@5.10.0", "", {}, "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg=="],
3201 2802
3202 "aws-sdk/uuid": ["uuid@8.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw=="],
3203
3204 "buffer/ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
3205
3206 "cacache/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="],
3207
3208 "cacheable-request/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="],
3209
3210 "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],2803 "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
3211 2804
3212 "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],2805 "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
3213 2806
3214 "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],2807 "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
3215 2808
3216 "clone-response/mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="],
3217
3218 "cosmiconfig/js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
3219
3220 "cosmiconfig/parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="],2809 "cosmiconfig/parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="],
3221 2810
3222 "degenerator/ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="],2811 "degenerator/ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="],
3223 2812
3224 "encoding/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
3225
3226 "eslint/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],2813 "eslint/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
3227 2814
3228 "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],2815 "eslint/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
@@ -3233,32 +2820,24 @@ · 4 unmodified lines
3233 2820
3234 "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],2821 "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
3235 2822
3236 "eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
3237
3238 "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="],2823 "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="],
3239 2824
3240 "eslint-plugin-react/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="],2825 "eslint-plugin-react/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="],
3241 2826
3242 "eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
3243
3244 "executor-infra/@types/node": ["@types/node@24.10.13", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg=="],
3245
3246 "express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="],2827 "express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="],
3247 2828
3248 "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],2829 "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
3249 2830
3250 "get-uri/data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="],2831 "get-uri/data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="],
3251 2832
3252 "glob/minimatch": ["minimatch@10.1.2", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.1" } }, "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw=="],2833 "glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
3253
3254 "hosted-git-info/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="],
3255
3256 "ignore-walk/minimatch": ["minimatch@10.1.2", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.1" } }, "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw=="],
3257 2834
3258 "iron-session/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="],2835 "iron-session/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="],
3259 2836
3260 "iron-session/iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="],2837 "iron-session/iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="],
3261 2838
2839 "is-bun-module/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
2840
3262 "log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="],2841 "log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="],
3263 2842
3264 "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],2843 "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
@@ -3269,37 +2848,15 @@ · 4 unmodified lines
3269 2848
3270 "miniflare/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="],2849 "miniflare/ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="],
3271 2850
3272 "minipass-flush/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
3273
3274 "minipass-pipeline/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="],
3275
3276 "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="],2851 "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="],
3277 2852
3278 "node-gyp/which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="],
3279
3280 "normalize-package-data/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="],
3281
3282 "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],2853 "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
3283 2854
3284 "opencontrol/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-oxzMzYCkZHMntzuyerehK3fV6A2Kwh5BD6CGEJSVDU2QNEhfLOptf2X7esQgaHZXHZY0oHmMsOtIDLP71UJXgA=="],
3285
3286 "opencontrol/hono": ["hono@4.7.4", "", {}, "sha512-Pst8FuGqz3L7tFF+u9Pu70eI0xa5S3LPUmrNd5Jm8nTHze9FxLTK9Kaj5g/k4UcwuJSXTP65SyHOPLrffpcAJg=="],
3287
3288 "opencontrol/zod": ["zod@3.24.2", "", {}, "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ=="],
3289
3290 "opencontrol/zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A=="],
3291
3292 "openid-client/jose": ["jose@4.15.9", "", {}, "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA=="],
3293
3294 "openid-client/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="],
3295
3296 "parse-conflict-json/json-parse-even-better-errors": ["json-parse-even-better-errors@5.0.0", "", {}, "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ=="],
3297
3298 "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],2855 "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
3299 2856
3300 "parse-json/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],2857 "parse-json/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
3301 2858
3302 "path-scurry/lru-cache": ["lru-cache@11.2.6", "", {}, "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ=="],2859 "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
3303 2860
3304 "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],2861 "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
3305 2862
@@ -3307,17 +2864,11 @@ · 1 unmodified line
3307 2864
3308 "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],2865 "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
3309 2866
3310 "rimraf/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="],
3311
3312 "router/path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="],2867 "router/path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="],
3313 2868
3314 "safe-array-concat/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="],
3315
3316 "safe-push-apply/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="],
3317
3318 "shadcn/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],2869 "shadcn/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
3319 2870
3320 "sst/jose": ["jose@5.2.3", "", {}, "sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA=="],2871 "sharp/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
3321 2872
3322 "streamdown/marked": ["marked@17.0.1", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg=="],2873 "streamdown/marked": ["marked@17.0.1", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg=="],
3323 2874
@@ -3331,22 +2882,10 @@ · 7 unmodified lines
3331 2882
3332 "strip-literal/js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="],2883 "strip-literal/js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="],
3333 2884
3334 "tar/yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="],2885 "tsdown/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
3335
3336 "tinyglobby/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
3337
3338 "token-types/ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
3339
3340 "url/punycode": ["punycode@1.3.2", "", {}, "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw=="],
3341
3342 "vite/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
3343
3344 "vitest/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
3345 2886
3346 "vitest/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],2887 "vitest/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
3347 2888
3348 "which-builtin-type/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="],
3349
3350 "wrangler/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="],2889 "wrangler/esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="],
3351 2890
3352 "wrap-ansi/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],2891 "wrap-ansi/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
@@ -3359,8 +2898,6 @@ · 6 unmodified lines
3359 2898
3360 "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],2899 "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
3361 2900
3362 "@apidevtools/json-schema-ref-parser/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
3363
3364 "@assistant/bot/@types/bun/bun-types": ["bun-types@1.3.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg=="],2901 "@assistant/bot/@types/bun/bun-types": ["bun-types@1.3.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg=="],
3365 2902
3366 "@assistant/server/@types/bun/bun-types": ["bun-types@1.3.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg=="],2903 "@assistant/server/@types/bun/bun-types": ["bun-types@1.3.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg=="],
@@ -3369,8 +2906,6 @@ · 2 unmodified lines
3369 2906
3370 "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="],2907 "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="],
3371 2908
3372 "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
3373
3374 "@convex-dev/workos-authkit/@workos-inc/node/iron-session": ["iron-session@6.3.1", "", { "dependencies": { "@peculiar/webcrypto": "^1.4.0", "@types/cookie": "^0.5.1", "@types/express": "^4.17.13", "@types/koa": "^2.13.5", "@types/node": "^17.0.41", "cookie": "^0.5.0", "iron-webcrypto": "^0.2.5" }, "peerDependencies": { "express": ">=4", "koa": ">=2", "next": ">=10" }, "optionalPeers": ["express", "koa", "next"] }, "sha512-3UJ7y2vk/WomAtEySmPgM6qtYF1cZ3tXuWX5GsVX4PJXAcs5y/sV9HuSfpjKS6HkTL/OhZcTDWJNLZ7w+Erx3A=="],2909 "@convex-dev/workos-authkit/@workos-inc/node/iron-session": ["iron-session@6.3.1", "", { "dependencies": { "@peculiar/webcrypto": "^1.4.0", "@types/cookie": "^0.5.1", "@types/express": "^4.17.13", "@types/koa": "^2.13.5", "@types/node": "^17.0.41", "cookie": "^0.5.0", "iron-webcrypto": "^0.2.5" }, "peerDependencies": { "express": ">=4", "koa": ">=2", "next": ">=10" }, "optionalPeers": ["express", "koa", "next"] }, "sha512-3UJ7y2vk/WomAtEySmPgM6qtYF1cZ3tXuWX5GsVX4PJXAcs5y/sV9HuSfpjKS6HkTL/OhZcTDWJNLZ7w+Erx3A=="],
3375 2910
3376 "@convex-dev/workos-authkit/@workos-inc/node/jose": ["jose@5.6.3", "", {}, "sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g=="],2911 "@convex-dev/workos-authkit/@workos-inc/node/jose": ["jose@5.6.3", "", {}, "sha512-1Jh//hEEwMhNYPDDLwXHa2ePWgWiFNNUadVmguAAw2IJ6sj9mNxV5tGXJNqlMkJAybF6Lgw1mISDxTePP/187g=="],
@@ -3393,42 +2928,14 @@ · 16 unmodified lines
3393 2928
3394 "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],2929 "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
3395 2930
3396 "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
3397
3398 "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],2931 "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
3399 2932
3400 "@next/eslint-plugin-next/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],2933 "@next/eslint-plugin-next/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
3401 2934
3402 "@npmcli/git/which/isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="],
3403
3404 "@npmcli/promise-spawn/which/isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="],
3405
3406 "@npmcli/run-script/which/isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="],
3407
3408 "@proto/sources/@types/bun/bun-types": ["bun-types@1.3.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg=="],2935 "@proto/sources/@types/bun/bun-types": ["bun-types@1.3.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg=="],
3409 2936
3410 "@pulumi/pulumi/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
3411
3412 "@pulumi/pulumi/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="],
3413
3414 "@pulumi/pulumi/execa/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
3415
3416 "@pulumi/pulumi/execa/npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="],
3417
3418 "@pulumi/pulumi/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
3419
3420 "@pulumi/pulumi/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="],
3421
3422 "@redocly/openapi-core/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
3423
3424 "@redocly/openapi-core/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],2937 "@redocly/openapi-core/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
3425 2938
3426 "@types/cacheable-request/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
3427
3428 "@types/keyv/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
3429
3430 "@types/responselike/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
3431
3432 "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],2939 "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
3433 2940
3434 "@workos-inc/authkit-nextjs/@workos-inc/node/iron-session": ["iron-session@6.3.1", "", { "dependencies": { "@peculiar/webcrypto": "^1.4.0", "@types/cookie": "^0.5.1", "@types/express": "^4.17.13", "@types/koa": "^2.13.5", "@types/node": "^17.0.41", "cookie": "^0.5.0", "iron-webcrypto": "^0.2.5" }, "peerDependencies": { "express": ">=4", "koa": ">=2", "next": ">=10" }, "optionalPeers": ["express", "koa", "next"] }, "sha512-3UJ7y2vk/WomAtEySmPgM6qtYF1cZ3tXuWX5GsVX4PJXAcs5y/sV9HuSfpjKS6HkTL/OhZcTDWJNLZ7w+Erx3A=="],2941 "@workos-inc/authkit-nextjs/@workos-inc/node/iron-session": ["iron-session@6.3.1", "", { "dependencies": { "@peculiar/webcrypto": "^1.4.0", "@types/cookie": "^0.5.1", "@types/express": "^4.17.13", "@types/koa": "^2.13.5", "@types/node": "^17.0.41", "cookie": "^0.5.0", "iron-webcrypto": "^0.2.5" }, "peerDependencies": { "express": ">=4", "koa": ">=2", "next": ">=10" }, "optionalPeers": ["express", "koa", "next"] }, "sha512-3UJ7y2vk/WomAtEySmPgM6qtYF1cZ3tXuWX5GsVX4PJXAcs5y/sV9HuSfpjKS6HkTL/OhZcTDWJNLZ7w+Erx3A=="],
@@ -3439,31 +2946,13 @@ · 4 unmodified lines
3439 2946
3440 "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],2947 "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
3441 2948
3442 "cosmiconfig/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
3443
3444 "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="],2949 "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="],
3445 2950
3446 "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],2951 "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
3447 2952
3448 "eslint/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],2953 "eslint/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
3449 2954
3450 "executor-infra/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],2955 "glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
3451
3452 "node-gyp/which/isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="],
3453
3454 "normalize-package-data/hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
3455
3456 "opencontrol/@modelcontextprotocol/sdk/express-rate-limit": ["express-rate-limit@7.5.1", "", { "peerDependencies": { "express": ">= 4.11" } }, "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw=="],
3457
3458 "opencontrol/@modelcontextprotocol/sdk/pkce-challenge": ["pkce-challenge@4.1.0", "", {}, "sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ=="],
3459
3460 "opencontrol/@modelcontextprotocol/sdk/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
3461
3462 "opencontrol/@modelcontextprotocol/sdk/zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="],
3463
3464 "rimraf/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
3465
3466 "rimraf/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="],
3467 2956
3468 "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],2957 "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
3469 2958
@@ -3547,18 +3036,6 @@ · 77 unmodified lines
3547 3036
3548 "@workos-inc/authkit-nextjs/@workos-inc/node/iron-session/iron-webcrypto": ["iron-webcrypto@0.2.8", "", { "dependencies": { "buffer": "^6" } }, "sha512-YPdCvjFMOBjXaYuDj5tiHst5CEk6Xw84Jo8Y2+jzhMceclAnb3+vNPP/CTtb5fO2ZEuXEaO4N+w62Vfko757KA=="],3037 "@workos-inc/authkit-nextjs/@workos-inc/node/iron-session/iron-webcrypto": ["iron-webcrypto@0.2.8", "", { "dependencies": { "buffer": "^6" } }, "sha512-YPdCvjFMOBjXaYuDj5tiHst5CEk6Xw84Jo8Y2+jzhMceclAnb3+vNPP/CTtb5fO2ZEuXEaO4N+w62Vfko757KA=="],
3549 3038
3550 "rimraf/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
3551
3552 "rimraf/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
3553
3554 "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],3039 "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
3555
3556 "@convex-dev/workos-authkit/@workos-inc/node/iron-session/iron-webcrypto/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
3557
3558 "@workos-inc/authkit-nextjs/@workos-inc/node/iron-session/iron-webcrypto/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
3559
3560 "@convex-dev/workos-authkit/@workos-inc/node/iron-session/iron-webcrypto/buffer/ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
3561
3562 "@workos-inc/authkit-nextjs/@workos-inc/node/iron-session/iron-webcrypto/buffer/ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
3563 }3040 }
3564}3041}
executor/apps/web/package.json+1−0
@@ -25,6 +25,7 @@ · 24 unmodified lines
25 "clsx": "^2.1.1",25 "clsx": "^2.1.1",
26 "cmdk": "^1",26 "cmdk": "^1",
27 "convex": "^1.31.7",27 "convex": "^1.31.7",
28 "json-schema-traverse": "^1.0.0",
28 "lucide-react": "^0.563.0",29 "lucide-react": "^0.563.0",
29 "monaco-editor": "^0.55.1",30 "monaco-editor": "^0.55.1",
30 "next": "16.1.6",31 "next": "16.1.6",
executor/apps/web/src/app/globals.css+2−0
@@ -391,3 +391,5 @@ · 390 unmodified lines
391 max-width: 100%;391 max-width: 100%;
392 border-radius: 0.25rem;392 border-radius: 0.25rem;
393}393}
394
395
executor/apps/web/src/components/tools/add/source/dialog-sections.tsx+2−2
@@ -63,7 +63,7 @@ export function CatalogViewSection({ · 62 unmodified lines
63 63
64 <Separator />64 <Separator />
65 65
66 <div className="max-h-80 overflow-y-auto overflow-x-hidden space-y-1 pr-1">66 <div className="flex-1 min-h-0 overflow-y-auto overflow-x-hidden space-y-1 pr-1">
67 <button67 <button
68 type="button"68 type="button"
69 onClick={onSwitchToCustom}69 onClick={onSwitchToCustom}
@@ -278,7 +278,7 @@ export function CustomViewSection({ · 208 unmodified lines
278 278
279 {/* Detecting type skeleton for remaining fields */}279 {/* Detecting type skeleton for remaining fields */}
280 {detectingType && !typeResolved ? (280 {detectingType && !typeResolved ? (
281 <div className="space-y-3">281 <div className="flex flex-col gap-3 min-h-0 flex-1">
282 <div className="space-y-1.5">282 <div className="space-y-1.5">
283 <Skeleton className="h-3 w-12 rounded" />283 <Skeleton className="h-3 w-12 rounded" />
284 <Skeleton className="h-8 w-full rounded-md" />284 <Skeleton className="h-8 w-full rounded-md" />
executor/apps/web/src/components/tools/explorer-groups.tsx+215−2
@@ -26,8 +26,9 @@ import { · 25 unmodified lines
26 toolDisplaySegment,26 toolDisplaySegment,
27 type ToolGroup,27 type ToolGroup,
28} from "@/lib/tool/explorer-grouping";28} from "@/lib/tool/explorer-grouping";
29import type { SourceAuthProfile, ToolDescriptor, ToolSourceRecord } from "@/lib/types";29import type { ToolDescriptor, ToolSourceRecord } from "@/lib/types";
30import { SelectableToolRow, ToolLoadingRows } from "./explorer-rows";30import type { SourceAuthProfile } from "@/lib/types";
31import { SelectableToolRow, ToolListItem, ToolLoadingRows } from "./explorer-rows";
31import { DefaultSourceIcon, SourceFavicon } from "./source-favicon";32import { DefaultSourceIcon, SourceFavicon } from "./source-favicon";
32 33
33export function GroupNode({34export function GroupNode({
@@ -214,6 +215,218 @@ export function GroupNode({ · 180 unmodified lines
214 );215 );
215}216}
216 217
218// ── Navigation tree node (click-to-focus, no inline detail) ─────────────────
219
220export function NavGroupNode({
221 group,
222 depth,
223 expandedKeys,
224 onToggle,
225 focusedPath,
226 focusedSource,
227 selectedKeys,
228 onFocusTool,
229 onSelectTool,
230 onSourceClick,
231 source,
232}: {
233 group: ToolGroup;
234 depth: number;
235 expandedKeys: Set<string>;
236 onToggle: (key: string) => void;
237 focusedPath: string | null;
238 focusedSource?: string | null;
239 selectedKeys: Set<string>;
240 onFocusTool: (tool: ToolDescriptor) => void;
241 onSelectTool?: (path: string, e: React.MouseEvent) => void;
242 onSourceClick?: (sourceName: string) => void;
243 source?: ToolSourceRecord;
244}) {
245 const isExpanded = expandedKeys.has(group.key);
246 const isSource = group.type === "source";
247 const isSourceFocused = isSource && focusedSource === group.label;
248 const isLoading =
249 group.type === "source" &&
250 typeof group.loadingPlaceholderCount === "number" &&
251 group.loadingPlaceholderCount > 0;
252 const sourceTypeFallback: ToolSourceRecord["type"] | "local" | "system" = source
253 ? source.type
254 : group.label === "system"
255 ? "system"
256 : (group.sourceType as ToolSourceRecord["type"] | "local") ?? "openapi";
257
258 const hasNestedGroups = group.children.some((child): child is ToolGroup => "key" in child);
259 const displayLabel = toolDisplaySegment(group.label);
260
261 const handleSourceHeaderClick = () => {
262 // Always expand when clicking a source
263 if (!isExpanded) {
264 onToggle(group.key);
265 }
266 // Show source details in the main panel
267 if (isSource && onSourceClick) {
268 onSourceClick(group.label);
269 }
270 };
271
272 return (
273 <Collapsible open={isExpanded} onOpenChange={() => onToggle(group.key)}>
274 {isSource ? (
275 // Source headers: click shows details in main panel + expands
276 <div
277 onClick={handleSourceHeaderClick}
278 className={cn(
279 "flex items-center gap-1.5 px-2 py-1 transition-colors cursor-pointer group/source",
280 "sticky bg-background/95 backdrop-blur-sm",
281 isExpanded && "border-b border-border/20",
282 isSourceFocused
283 ? "bg-accent/40 border-l-2 border-l-primary"
284 : "hover:bg-accent/20 border-l-2 border-l-transparent",
285 )}
286 style={{
287 paddingLeft: `${depth * 14 + 6}px`,
288 top: `${depth * 28}px`,
289 zIndex: 20 - depth,
290 }}
291 >
292 <CollapsibleTrigger asChild>
293 <button
294 className="h-3.5 w-3.5 flex items-center justify-center shrink-0"
295 onClick={(e) => e.stopPropagation()}
296 >
297 {isExpanded ? (
298 <ChevronDown className="h-2.5 w-2.5 text-muted-foreground/60" />
299 ) : (
300 <ChevronRight className="h-2.5 w-2.5 text-muted-foreground/40" />
301 )}
302 </button>
303 </CollapsibleTrigger>
304
305 <div className="h-4 w-4 rounded bg-muted/50 flex items-center justify-center shrink-0">
306 {source ? (
307 <SourceFavicon
308 source={source}
309 iconClassName="h-2.5 w-2.5 text-muted-foreground"
310 imageClassName="w-full h-full"
311 />
312 ) : (
313 <DefaultSourceIcon type={sourceTypeFallback} className="h-2.5 w-2.5 text-muted-foreground" />
314 )}
315 </div>
316
317 <span className="font-mono text-[11px] font-semibold text-foreground/90 truncate">
318 {displayLabel}
319 </span>
320
321 <span className="text-[9px] font-mono text-muted-foreground/50 ml-auto flex items-center gap-1 shrink-0">
322 {isLoading ? (
323 <Loader2 className="h-2.5 w-2.5 animate-spin" />
324 ) : (
325 <>
326 {group.approvalCount > 0 && (
327 <span className="inline-flex items-center gap-0.5 text-terminal-amber">
328 <ShieldCheck className="h-2 w-2" />
329 {group.approvalCount}
330 </span>
331 )}
332 <span className="tabular-nums">{group.childCount}</span>
333 </>
334 )}
335 </span>
336 </div>
337 ) : (
338 // Namespace headers: plain collapsible toggle
339 <CollapsibleTrigger asChild>
340 <div
341 className={cn(
342 "flex items-center gap-1.5 px-2 py-1 transition-colors cursor-pointer",
343 "sticky bg-background/95 backdrop-blur-sm",
344 isExpanded && "border-b border-border/20",
345 "hover:bg-accent/20",
346 )}
347 style={{
348 paddingLeft: `${depth * 14 + 6}px`,
349 top: `${depth * 28}px`,
350 zIndex: 20 - depth,
351 }}
352 >
353 <div className="h-3.5 w-3.5 flex items-center justify-center shrink-0">
354 {isExpanded ? (
355 <ChevronDown className="h-2.5 w-2.5 text-muted-foreground/60" />
356 ) : (
357 <ChevronRight className="h-2.5 w-2.5 text-muted-foreground/40" />
358 )}
359 </div>
360
361 <span className="font-mono text-[11px] font-medium text-foreground/80 truncate">
362 {displayLabel}
363 </span>
364
365 <span className="text-[9px] font-mono text-muted-foreground/50 ml-auto flex items-center gap-1 shrink-0">
366 {group.approvalCount > 0 && (
367 <span className="inline-flex items-center gap-0.5 text-terminal-amber">
368 <ShieldCheck className="h-2 w-2" />
369 {group.approvalCount}
370 </span>
371 )}
372 <span className="tabular-nums">{group.childCount}</span>
373 </span>
374 </div>
375 </CollapsibleTrigger>
376 )}
377
378 <CollapsibleContent>
379 {hasNestedGroups || group.children.some((child) => !("key" in child))
380 ? group.children.map((child) => {
381 if ("key" in child) {
382 return (
383 <NavGroupNode
384 key={child.key}
385 group={child}
386 depth={depth + 1}
387 expandedKeys={expandedKeys}
388 onToggle={onToggle}
389 focusedPath={focusedPath}
390 focusedSource={focusedSource}
391 selectedKeys={selectedKeys}
392 onFocusTool={onFocusTool}
393 onSelectTool={onSelectTool}
394 onSourceClick={onSourceClick}
395 />
396 );
397 }
398
399 return (
400 <ToolListItem
401 key={child.path}
402 tool={child}
403 label={toolDisplayOperation(child.path)}
404 focused={child.path === focusedPath}
405 selected={selectedKeys.has(child.path)}
406 onFocus={onFocusTool}
407 onSelect={
408 onSelectTool
409 ? (e) => onSelectTool(child.path, e)
410 : undefined
411 }
412 depth={depth + 1}
413 />
414 );
415 })
416 : null}
417
418 {isLoading ? (
419 <ToolLoadingRows
420 source={displayLabel}
421 count={group.loadingPlaceholderCount ?? 3}
422 depth={depth + 1}
423 />
424 ) : null}
425 </CollapsibleContent>
426 </Collapsible>
427 );
428}
429
217export function SourceSidebar({430export function SourceSidebar({
218 sources,431 sources,
219 sourceCounts,432 sourceCounts,
executor/apps/web/src/components/tools/explorer-rows.tsx+159−0
@@ -19,6 +19,85 @@ import type { ToolDescriptor } from "@/lib/types"; · 18 unmodified lines
19import { CopyButton } from "./explorer/copy-button";19import { CopyButton } from "./explorer/copy-button";
20import { ToolDetail } from "./explorer/tool-detail";20import { ToolDetail } from "./explorer/tool-detail";
21 21
22// ── Compact sidebar tool item (click-to-focus, no collapsible) ──────────────
23
24export const ToolListItem = memo(function ToolListItem({
25 tool,
26 label,
27 focused,
28 selected,
29 onFocus,
30 onSelect,
31 depth = 0,
32}: {
33 tool: ToolDescriptor;
34 label: string;
35 focused: boolean;
36 selected: boolean;
37 onFocus: (tool: ToolDescriptor) => void;
38 onSelect?: (e: React.MouseEvent) => void;
39 depth?: number;
40}) {
41 const handleClick = useCallback(() => {
42 onFocus(tool);
43 }, [onFocus, tool]);
44
45 return (
46 <div
47 onClick={handleClick}
48 className={cn(
49 "flex items-center gap-1.5 px-2 py-1 cursor-pointer transition-colors group/item",
50 focused
51 ? "bg-accent/50 border-l-2 border-l-primary"
52 : "hover:bg-accent/20 border-l-2 border-l-transparent",
53 selected && !focused && "bg-primary/5",
54 )}
55 style={{ paddingLeft: `${depth * 14 + 8}px` }}
56 >
57 {onSelect ? (
58 <button
59 onClick={(e) => {
60 e.stopPropagation();
61 onSelect(e);
62 }}
63 className={cn(
64 "h-3.5 w-3.5 rounded border flex items-center justify-center shrink-0 transition-colors",
65 selected
66 ? "bg-primary border-primary text-primary-foreground"
67 : "border-border/60 opacity-0 group-hover/item:opacity-100",
68 )}
69 >
70 {selected && <Check className="h-2 w-2" />}
71 </button>
72 ) : null}
73
74 <Zap className="h-2.5 w-2.5 text-primary/50 shrink-0" />
75
76 <span
77 className={cn(
78 "text-[12px] font-mono truncate",
79 focused ? "text-foreground font-medium" : "text-foreground/75",
80 )}
81 >
82 {label}
83 </span>
84
85 {tool.approval === "required" ? (
86 <ShieldCheck className="h-2.5 w-2.5 text-terminal-amber/70 shrink-0 ml-auto" />
87 ) : null}
88 </div>
89 );
90},
91(prev, next) =>
92 prev.tool === next.tool &&
93 prev.label === next.label &&
94 prev.focused === next.focused &&
95 prev.selected === next.selected &&
96 prev.depth === next.depth,
97);
98
99// ── Original collapsible tool row (used in tree/flat views) ─────────────────
100
22const ToolRow = memo(function ToolRow({101const ToolRow = memo(function ToolRow({
23 tool,102 tool,
24 label,103 label,
@@ -151,6 +230,86 @@ export const SelectableToolRow = memo(function SelectableToolRow({ · 126 unmodified lines
151 prev.selectedKeys.has(prev.tool.path) === next.selectedKeys.has(next.tool.path),230 prev.selectedKeys.has(prev.tool.path) === next.selectedKeys.has(next.tool.path),
152);231);
153 232
233// ── Tool list for sidebar layout ────────────────────────────────────────────
234
235export function ToolListSidebar({
236 tools,
237 focusedPath,
238 selectedKeys,
239 onFocusTool,
240 onSelectTool,
241 loadingRows,
242 hasMoreTools = false,
243 loadingMoreTools = false,
244 onLoadMoreTools,
245 scrollContainerId,
246 scrollContainerRef,
247}: {
248 tools: ToolDescriptor[];
249 focusedPath: string | null;
250 selectedKeys: Set<string>;
251 onFocusTool: (tool: ToolDescriptor) => void;
252 onSelectTool?: (path: string, e: React.MouseEvent) => void;
253 loadingRows?: { source: string; count: number }[];
254 hasMoreTools?: boolean;
255 loadingMoreTools?: boolean;
256 onLoadMoreTools?: () => Promise<void>;
257 scrollContainerId: string;
258 scrollContainerRef: React.RefObject<HTMLDivElement | null>;
259}) {
260 return (
261 <div
262 ref={scrollContainerRef}
263 id={scrollContainerId}
264 className="h-full overflow-y-auto"
265 >
266 <InfiniteScroll
267 dataLength={tools.length}
268 next={() => {
269 void onLoadMoreTools?.();
270 }}
271 hasMore={hasMoreTools}
272 scrollableTarget={scrollContainerId}
273 style={{ overflow: "visible" }}
274 loader={
275 <div className="px-2 py-2 text-[10px] text-muted-foreground/60">
276 {loadingMoreTools ? "Loading..." : ""}
277 </div>
278 }
279 >
280 <div className="py-0.5">
281 {tools.map((tool) => (
282 <ToolListItem
283 key={tool.path}
284 tool={tool}
285 label={toolDisplayPath(tool.path)}
286 focused={tool.path === focusedPath}
287 selected={selectedKeys.has(tool.path)}
288 onFocus={onFocusTool}
289 onSelect={
290 onSelectTool
291 ? (e) => onSelectTool(tool.path, e)
292 : undefined
293 }
294 />
295 ))}
296
297 {loadingRows?.map((loadingRow) => (
298 <ToolLoadingRows
299 key={loadingRow.source}
300 source={loadingRow.source}
301 count={loadingRow.count}
302 depth={0}
303 />
304 ))}
305 </div>
306 </InfiniteScroll>
307 </div>
308 );
309}
310
311// ── Flat list (original, used in flat view mode) ────────────────────────────
312
154export function VirtualFlatList({313export function VirtualFlatList({
155 tools,314 tools,
156 selectedKeys,315 selectedKeys,
executor/apps/web/src/components/tools/explorer-toolbar.tsx+49−164
@@ -1,13 +1,10 @@
1import {1import {
2 Search,2 Search,
3 ShieldCheck,3 ShieldCheck,
4 Server,
5 Filter,4 Filter,
5 Plus,
6 X,6 X,
7 FolderTree,
8 List,
9} from "lucide-react";7} from "lucide-react";
10import type { ReactNode } from "react";
11import { Input } from "@/components/ui/input";8import { Input } from "@/components/ui/input";
12import { Button } from "@/components/ui/button";9import { Button } from "@/components/ui/button";
13import {10import {
@@ -30,160 +27,74 @@ interface ToolExplorerToolbarProps { · 16 unmodified lines
30 hasSearch: boolean;27 hasSearch: boolean;
31 resultCount: number;28 resultCount: number;
32 loadingInventory?: boolean;29 loadingInventory?: boolean;
33 viewMode: ViewMode;
34 groupBy: GroupBy;
35 filterApproval: FilterApproval;30 filterApproval: FilterApproval;
36 showSourceSidebar: boolean;
37 activeSource: string | null;31 activeSource: string | null;
38 sourceOptions: string[];
39 selectedToolCount: number;32 selectedToolCount: number;
40 onSearchChange: (value: string) => void;33 onSearchChange: (value: string) => void;
41 onClearSearch: () => void;34 onClearSearch: () => void;
42 onViewModeChange: (mode: ViewMode) => void;
43 onGroupByChange: (mode: GroupBy) => void;
44 onFilterApprovalChange: (filter: FilterApproval) => void;35 onFilterApprovalChange: (filter: FilterApproval) => void;
45 onSourceSelect: (source: string | null) => void;36 onAddSource?: () => void;
46 addSourceAction?: ReactNode;
47 onSelectAll: () => void;37 onSelectAll: () => void;
48 onClearSelection: () => void;38 onClearSelection: () => void;
49 onExpandAll: () => void;
50 onCollapseAll: () => void;
51}39}
52 40
53export function ToolExplorerToolbar({41export function ToolExplorerToolbar({
54 search,42 search,
55 filteredToolCount,43 filteredToolCount,
56 loadingInventory = false,44 loadingInventory = false,
57 viewMode,
58 groupBy,
59 filterApproval,45 filterApproval,
60 showSourceSidebar,
61 activeSource,
62 sourceOptions,
63 selectedToolCount,46 selectedToolCount,
64 onSearchChange,47 onSearchChange,
65 onClearSearch,48 onClearSearch,
66 onViewModeChange,
67 onGroupByChange,
68 onFilterApprovalChange,49 onFilterApprovalChange,
69 onSourceSelect,50 onAddSource,
70 addSourceAction,
71 onSelectAll,51 onSelectAll,
72 onClearSelection,52 onClearSelection,
73}: ToolExplorerToolbarProps) {53}: ToolExplorerToolbarProps) {
74 const hasSelection = selectedToolCount > 0;54 const hasSelection = selectedToolCount > 0;
75 55
76 return (56 return (
77 <div className="shrink-0 relative">57 <div className="shrink-0 relative space-y-1.5">
78 <div className="flex items-center gap-2 pb-3 flex-wrap">58 {/* Search — own row */}
79 <div className="relative flex-1 min-w-[200px]">59 <div className="relative">
80 <Search className="absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground/50" />60 <Search className="absolute left-2 top-1/2 -translate-y-1/2 h-3 w-3 text-muted-foreground/50" />
81 <Input61 <Input
82 value={search}62 value={search}
83 onChange={(e) => onSearchChange(e.target.value)}63 onChange={(e) => onSearchChange(e.target.value)}
84 placeholder={loadingInventory ? "Loading tools..." : `Search ${filteredToolCount} tools...`}64 placeholder={loadingInventory ? "Loading..." : `Search ${filteredToolCount} tools...`}
85 className="h-8 text-xs pl-8 bg-background/50 border-border/50 focus:border-primary/30"65 className="h-7 text-[11px] pl-7 bg-background/50 border-border/50 focus:border-primary/30"
86 />66 />
87 {search && (67 {search && (
88 <button
89 onClick={onClearSearch}
90 className="absolute right-2 top-1/2 -translate-y-1/2 h-4 w-4 rounded flex items-center justify-center text-muted-foreground hover:text-foreground"
91 >
92 <X className="h-3 w-3" />
93 </button>
94 )}
95 </div>
96
97 <div className="flex h-8 rounded-md border border-border/50 overflow-hidden">
98 <button68 <button
99 onClick={() => onViewModeChange("tree")}69 onClick={onClearSearch}
100 className={cn(70 className="absolute right-2 top-1/2 -translate-y-1/2 h-3.5 w-3.5 rounded flex items-center justify-center text-muted-foreground hover:text-foreground"
101 "px-2 flex items-center gap-1 text-[11px] transition-colors",
102 viewMode === "tree"
103 ? "bg-accent/40 text-foreground"
104 : "text-muted-foreground hover:text-foreground hover:bg-accent/20",
105 )}
106 >71 >
107 <FolderTree className="h-3 w-3" />72 <X className="h-2.5 w-2.5" />
108 <span className="hidden sm:inline">Tree</span>
109 </button>73 </button>
110 <button
111 onClick={() => onViewModeChange("flat")}
112 className={cn(
113 "px-2 flex items-center gap-1 text-[11px] transition-colors border-l border-border/50",
114 viewMode === "flat"
115 ? "bg-accent/40 text-foreground"
116 : "text-muted-foreground hover:text-foreground hover:bg-accent/20",
117 )}
118 >
119 <List className="h-3 w-3" />
120 <span className="hidden sm:inline">Flat</span>
121 </button>
122 </div>
123
124 {viewMode === "tree" && (
125 <DropdownMenu>
126 <DropdownMenuTrigger asChild>
127 <Button
128 variant="outline"
129 size="sm"
130 className="h-8 text-[11px] border-border/50"
131 >
132 <FolderTree className="h-3 w-3 mr-1" />
133 {groupBy === "source"
134 ? "By source"
135 : groupBy === "namespace"
136 ? "By namespace"
137 : "By approval"}
138 </Button>
139 </DropdownMenuTrigger>
140 <DropdownMenuContent align="end">
141 <DropdownMenuLabel className="text-[11px]">Group by</DropdownMenuLabel>
142 <DropdownMenuSeparator />
143 <DropdownMenuCheckboxItem
144 checked={groupBy === "source"}
145 onCheckedChange={() => onGroupByChange("source")}
146 className="text-xs"
147 >
148 Source → Namespace
149 </DropdownMenuCheckboxItem>
150 <DropdownMenuCheckboxItem
151 checked={groupBy === "namespace"}
152 onCheckedChange={() => onGroupByChange("namespace")}
153 className="text-xs"
154 >
155 Namespace
156 </DropdownMenuCheckboxItem>
157 <DropdownMenuCheckboxItem
158 checked={groupBy === "approval"}
159 onCheckedChange={() => onGroupByChange("approval")}
160 className="text-xs"
161 >
162 Approval mode
163 </DropdownMenuCheckboxItem>
164 </DropdownMenuContent>
165 </DropdownMenu>
166 )}74 )}
75 </div>
167 76
77 {/* Filter + actions row */}
78 <div className="flex items-center gap-1.5">
168 <DropdownMenu>79 <DropdownMenu>
169 <DropdownMenuTrigger asChild>80 <DropdownMenuTrigger asChild>
170 <Button81 <Button
171 variant="outline"82 variant="outline"
172 size="sm"83 size="sm"
173 className={cn(84 className={cn(
174 "h-8 text-[11px] border-border/50",85 "h-6 text-[10px] border-border/50 px-2",
175 filterApproval !== "all" && "border-primary/30 text-primary",86 filterApproval !== "all" && "border-primary/30 text-primary",
176 )}87 )}
177 >88 >
178 <Filter className="h-3 w-3 mr-1" />89 <Filter className="h-2.5 w-2.5 mr-1" />
179 {filterApproval === "all"90 {filterApproval === "all"
180 ? "Filter"91 ? "All"
181 : filterApproval === "required"92 : filterApproval === "required"
182 ? "Gated only"93 ? "Gated"
183 : "Auto only"}94 : "Auto"}
184 </Button>95 </Button>
185 </DropdownMenuTrigger>96 </DropdownMenuTrigger>
186 <DropdownMenuContent align="end">97 <DropdownMenuContent align="start">
187 <DropdownMenuLabel className="text-[11px]">Approval filter</DropdownMenuLabel>98 <DropdownMenuLabel className="text-[11px]">Approval filter</DropdownMenuLabel>
188 <DropdownMenuSeparator />99 <DropdownMenuSeparator />
189 <DropdownMenuCheckboxItem100 <DropdownMenuCheckboxItem
@@ -210,83 +121,57 @@ export function ToolExplorerToolbar({ · 20 unmodified lines
210 </DropdownMenuContent>121 </DropdownMenuContent>
211 </DropdownMenu>122 </DropdownMenu>
212 123
213 <DropdownMenu>124 <div className="flex-1" />
214 <DropdownMenuTrigger asChild>
215 <Button
216 variant="outline"
217 size="sm"
218 className={cn(
219 "h-8 text-[11px] border-border/50",
220 showSourceSidebar && "lg:hidden",
221 activeSource && "border-primary/30 text-primary",
222 )}
223 >
224 <Server className="h-3 w-3 mr-1" />
225 {activeSource ?? "All"}
226 </Button>
227 </DropdownMenuTrigger>
228 <DropdownMenuContent align="end">
229 <DropdownMenuLabel className="text-[11px]">Source</DropdownMenuLabel>
230 <DropdownMenuSeparator />
231 <DropdownMenuCheckboxItem
232 checked={activeSource === null}
233 onCheckedChange={() => onSourceSelect(null)}
234 className="text-xs"
235 >
236 All sources
237 </DropdownMenuCheckboxItem>
238 {sourceOptions.map((src) => (
239 <DropdownMenuCheckboxItem
240 key={src}
241 checked={activeSource === src}
242 onCheckedChange={() => onSourceSelect(activeSource === src ? null : src)}
243 className="text-xs font-mono"
244 >
245 {src}
246 </DropdownMenuCheckboxItem>
247 ))}
248 </DropdownMenuContent>
249 </DropdownMenu>
250 125
251 {addSourceAction ? <div className="ml-auto">{addSourceAction}</div> : null}126 {onAddSource ? (
127 <Button
128 variant="default"
129 size="sm"
130 className="h-6 text-[10px] px-2"
131 onClick={onAddSource}
132 >
133 <Plus className="h-2.5 w-2.5 mr-1" />
134 Add Source
135 </Button>
136 ) : null}
252 </div>137 </div>
253 138
254 <div139 <div
255 className={cn(140 className={cn(
256 "absolute inset-x-0 top-full mt-2 transition-opacity duration-150 pointer-events-none",141 "absolute inset-x-0 top-full mt-1 z-30 transition-opacity duration-150 pointer-events-none",
257 hasSelection ? "opacity-100 pointer-events-auto" : "opacity-0",142 hasSelection ? "opacity-100 pointer-events-auto" : "opacity-0",
258 )}143 )}
259 aria-hidden={!hasSelection}144 aria-hidden={!hasSelection}
260 >145 >
261 <div className="flex items-center gap-2 px-3 py-2 rounded-md bg-primary/5 border border-primary/10">146 <div className="flex items-center gap-2 px-2.5 py-1.5 rounded-md bg-primary/5 border border-primary/10">
262 <span className="text-[12px] font-mono text-primary">147 <span className="text-[11px] font-mono text-primary">
263 {selectedToolCount} tool{selectedToolCount !== 1 ? "s" : ""} selected148 {selectedToolCount} selected
264 </span>149 </span>
265 <div className="flex-1" />150 <div className="flex-1" />
266 <Button151 <Button
267 variant="ghost"152 variant="ghost"
268 size="sm"153 size="sm"
269 className="h-6 text-[11px] text-muted-foreground"154 className="h-5 text-[10px] text-muted-foreground px-1.5"
270 onClick={onSelectAll}155 onClick={onSelectAll}
271 >156 >
272 Select all ({filteredToolCount})157 All ({filteredToolCount})
273 </Button>158 </Button>
274 <Button159 <Button
275 variant="ghost"160 variant="ghost"
276 size="sm"161 size="sm"
277 className="h-6 text-[11px] text-muted-foreground"162 className="h-5 text-[10px] text-muted-foreground px-1.5"
278 onClick={onClearSelection}163 onClick={onClearSelection}
279 >164 >
280 Clear165 Clear
281 </Button>166 </Button>
282 <div className="h-4 w-px bg-border/50" />167 <div className="h-3 w-px bg-border/50" />
283 <Button168 <Button
284 variant="outline"169 variant="outline"
285 size="sm"170 size="sm"
286 className="h-6 text-[11px] border-terminal-amber/30 text-terminal-amber hover:bg-terminal-amber/10"171 className="h-5 text-[10px] border-terminal-amber/30 text-terminal-amber hover:bg-terminal-amber/10 px-1.5"
287 >172 >
288 <ShieldCheck className="h-3 w-3 mr-1" />173 <ShieldCheck className="h-2.5 w-2.5 mr-0.5" />
289 Set approval174 Approval
290 </Button>175 </Button>
291 </div>176 </div>
292 </div>177 </div>
executor/apps/web/src/components/tools/explorer.tsx+325−340
@@ -1,36 +1,36 @@
1"use client";1"use client";
2 2
3import { type ReactNode, useState, useMemo, useCallback, useRef, useDeferredValue } from "react";3import { useState, useMemo, useCallback, useRef, useDeferredValue, useEffect } from "react";
4import {
5 AlertTriangle,
6 Loader2,
7 RefreshCcw,
8} from "lucide-react";
4import InfiniteScroll from "react-infinite-scroll-component";9import InfiniteScroll from "react-infinite-scroll-component";
5import { cn } from "@/lib/utils";10import { cn } from "@/lib/utils";
6import {11import type { ToolDescriptor, ToolSourceRecord } from "@/lib/types";
7 collectGroupKeys,12import type { SourceAuthProfile } from "@/lib/types";
8} from "@/lib/tool/explorer-grouping";
9import type { SourceAuthProfile, ToolDescriptor, ToolSourceRecord } from "@/lib/types";
10import { findToolsInGroupByKey } from "./explorer-helpers";
11import {13import {
12 autoExpandedKeysForSearch,14 autoExpandedKeysForSearch,
13 countSelectedTools,15 countSelectedTools,
14 expandedKeysForSource,
15 filterToolsBySearch,16 filterToolsBySearch,
16 filterToolsBySourceAndApproval,17 filterToolsBySourceAndApproval,
17 flatToolsForView,
18 sourceOptionsFromTools,
19 treeGroupsForView,18 treeGroupsForView,
20 type FilterApproval,19 type FilterApproval,
21} from "./explorer-derived";20} from "./explorer-derived";
21import { collectGroupKeys } from "@/lib/tool/explorer-grouping";
22import { sourceLabel } from "@/lib/tool/source-utils";22import { sourceLabel } from "@/lib/tool/source-utils";
23import {23import {
24 EmptyState,24 EmptyState,
25 LoadingState,25 LoadingState,
26 VirtualFlatList,26 ToolLoadingRows,
27} from "./explorer-rows";27} from "./explorer-rows";
28import { GroupNode, SourceSidebar } from "./explorer-groups";28import { NavGroupNode } from "./explorer-groups";
29import {29import {
30 ToolExplorerToolbar,30 ToolExplorerToolbar,
31 type GroupBy,
32 type ViewMode,
33} from "./explorer-toolbar";31} from "./explorer-toolbar";
32import { ToolDetailPanel, ToolDetailEmpty } from "./explorer/tool-detail";
33import { SourceFormPanel } from "./explorer/source-form-panel";
34import type { SourceDialogMeta } from "./add/source-dialog";34import type { SourceDialogMeta } from "./add/source-dialog";
35import { warningsBySourceName } from "@/lib/tools/source-helpers";35import { warningsBySourceName } from "@/lib/tools/source-helpers";
36 36
@@ -54,8 +54,9 @@ interface ToolExplorerProps { · 17 unmodified lines
54 initialSource?: string | null;54 initialSource?: string | null;
55 activeSource?: string | null;55 activeSource?: string | null;
56 onActiveSourceChange?: (source: string | null) => void;56 onActiveSourceChange?: (source: string | null) => void;
57 /** @deprecated No longer used — source sidebar is merged into the tool list panel. */
57 showSourceSidebar?: boolean;58 showSourceSidebar?: boolean;
58 addSourceAction?: ReactNode;59 onSourceAdded?: (source: ToolSourceRecord) => void;
59 sourceDialogMeta?: Record<string, SourceDialogMeta>;60 sourceDialogMeta?: Record<string, SourceDialogMeta>;
60 sourceAuthProfiles?: Record<string, SourceAuthProfile>;61 sourceAuthProfiles?: Record<string, SourceAuthProfile>;
61 existingSourceNames?: Set<string>;62 existingSourceNames?: Set<string>;
@@ -70,13 +71,10 @@ export function ToolExplorer({ · 8 unmodified lines
70 tools,71 tools,
71 sources,72 sources,
72 sourceCountsOverride,73 sourceCountsOverride,
73 totalTools,
74 hasMoreTools = false,74 hasMoreTools = false,
75 loadingMoreTools = false,75 loadingMoreTools = false,
76 onLoadMoreTools,76 onLoadMoreTools,
77 sourceHasMoreTools,
78 sourceLoadingMoreTools,77 sourceLoadingMoreTools,
79 onLoadMoreToolsForSource,
80 loading = false,78 loading = false,
81 loadingSources = [],79 loadingSources = [],
82 onLoadToolDetails,80 onLoadToolDetails,
@@ -84,8 +82,7 @@ export function ToolExplorer({ · 1 unmodified line
84 initialSource = null,82 initialSource = null,
85 activeSource,83 activeSource,
86 onActiveSourceChange,84 onActiveSourceChange,
87 showSourceSidebar = true,85 onSourceAdded,
88 addSourceAction,
89 sourceDialogMeta,86 sourceDialogMeta,
90 sourceAuthProfiles,87 sourceAuthProfiles,
91 existingSourceNames,88 existingSourceNames,
@@ -111,32 +108,20 @@ export function ToolExplorer({ · 19 unmodified lines
111 108
112 const [searchInput, setSearchInput] = useState("");109 const [searchInput, setSearchInput] = useState("");
113 const search = useDeferredValue(searchInput);110 const search = useDeferredValue(searchInput);
114 const [viewMode, setViewMode] = useState<ViewMode>("tree");111 const [internalActiveSource] = useState<string | null>(initialSource);
115 const [groupBy, setGroupBy] = useState<GroupBy>("source");
116 const [internalActiveSource, setInternalActiveSource] = useState<string | null>(initialSource);
117 const [expandedKeys, setExpandedKeys] = useState<Set<string>>(
118 () => expandedKeysForSource(initialSource),
119 );
120 const [selectedKeys, setSelectedKeys] = useState<Set<string>>(new Set());112 const [selectedKeys, setSelectedKeys] = useState<Set<string>>(new Set());
121 const [filterApproval, setFilterApproval] = useState<FilterApproval>("all");113 const [filterApproval, setFilterApproval] = useState<FilterApproval>("all");
122 const [toolDetailsByPath, setToolDetailsByPath] = useState<Record<string, Pick<ToolDescriptor, "path" | "description" | "display" | "typing">>>({});114 const [toolDetailsByPath, setToolDetailsByPath] = useState<Record<string, Pick<ToolDescriptor, "path" | "description" | "display" | "typing">>>({});
123 const [loadingDetailPaths, setLoadingDetailPaths] = useState<Set<string>>(new Set());115 const [loadingDetailPaths, setLoadingDetailPaths] = useState<Set<string>>(new Set());
124 const treeListRef = useRef<HTMLDivElement>(null);116 const [focusedToolPath, setFocusedToolPath] = useState<string | null>(null);
125 const flatListRef = useRef<HTMLDivElement>(null);117 const [focusedSourceName, setFocusedSourceName] = useState<string | null>(null);
126 const flatScrollContainerId = "tool-explorer-flat-scroll";118 // "new" = add source form, ToolSourceRecord = edit/view existing source, null = no source panel
127 const treeScrollContainerId = "tool-explorer-tree-scroll";119 const [formSource, setFormSource] = useState<"new" | ToolSourceRecord | null>(null);
120 const toolListRef = useRef<HTMLDivElement>(null);
121 const toolListScrollContainerId = "tool-explorer-toollist-scroll";
128 const resolvedActiveSource =122 const resolvedActiveSource =
129 activeSource === undefined ? internalActiveSource : activeSource;123 activeSource === undefined ? internalActiveSource : activeSource;
130 124
131 const handleSourceSelect = useCallback((source: string | null) => {
132 if (activeSource === undefined) {
133 setInternalActiveSource(source);
134 }
135
136 onActiveSourceChange?.(source);
137 setExpandedKeys(expandedKeysForSource(source));
138 }, [activeSource, onActiveSourceChange]);
139
140 const hydratedTools = useMemo(() => {125 const hydratedTools = useMemo(() => {
141 if (Object.keys(toolDetailsByPath).length === 0) {126 if (Object.keys(toolDetailsByPath).length === 0) {
142 return tools;127 return tools;
@@ -179,20 +164,6 @@ export function ToolExplorer({ · 36 unmodified lines
179 return set;164 return set;
180 }, [filteredTools.length, loading, loadingSources, resolvedActiveSource, searchInput.length, sourceLoadingMoreTools, sources]);165 }, [filteredTools.length, loading, loadingSources, resolvedActiveSource, searchInput.length, sourceLoadingMoreTools, sources]);
181 166
182 const visibleLoadingSources = useMemo(() => {
183 if (loadingSourceSet.size === 0) {
184 return [] as string[];
185 }
186
187 if (resolvedActiveSource) {
188 return loadingSourceSet.has(resolvedActiveSource)
189 ? [resolvedActiveSource]
190 : [];
191 }
192
193 return Array.from(loadingSourceSet);
194 }, [loadingSourceSet, resolvedActiveSource]);
195
196 const sourceCounts = useMemo(() => {167 const sourceCounts = useMemo(() => {
197 if (sourceCountsOverride) {168 if (sourceCountsOverride) {
198 return sourceCountsOverride;169 return sourceCountsOverride;
@@ -223,25 +194,15 @@ export function ToolExplorer({ · 24 unmodified lines
223 return filterToolsBySearch(filteredTools, search);194 return filterToolsBySearch(filteredTools, search);
224 }, [filteredTools, search]);195 }, [filteredTools, search]);
225 196
226 const warningsBySource = useMemo(() => warningsBySourceName(warnings), [warnings]);197 const selectedToolCount = useMemo(() => {
198 return countSelectedTools(selectedKeys, filteredTools);
199 }, [selectedKeys, filteredTools]);
227 200
228 const sidebarExistingSourceNames = useMemo(() => {201 const sidebarExistingSourceNames = useMemo(() => {
229 return existingSourceNames ?? new Set(visibleSources.map((source) => source.name));202 return existingSourceNames ?? new Set(visibleSources.map((source) => source.name));
230 }, [existingSourceNames, visibleSources]);203 }, [existingSourceNames, visibleSources]);
231 204
232 const treeGroups = useMemo(() => {205 const warningsBySrc = useMemo(() => warningsBySourceName(warnings), [warnings]);
233 const showAllSources = search.length === 0;
234 return treeGroupsForView(searchedTools, viewMode, groupBy, {
235 loadingSources: visibleLoadingSources,
236 sourceRecords: showAllSources ? visibleSources : [],
237 sourceCounts: showAllSources ? sourceCounts : {},
238 activeSource: resolvedActiveSource,
239 });
240 }, [searchedTools, viewMode, groupBy, visibleLoadingSources, visibleSources, sourceCounts, resolvedActiveSource, search]);
241
242 const flatTools = useMemo(() => {
243 return flatToolsForView(searchedTools, viewMode);
244 }, [searchedTools, viewMode]);
245 206
246 const sourceByName = useMemo(() => {207 const sourceByName = useMemo(() => {
247 const map = new Map<string, ToolSourceRecord>();208 const map = new Map<string, ToolSourceRecord>();
@@ -251,75 +212,6 @@ export function ToolExplorer({ · 3 unmodified lines
251 return map;212 return map;
252 }, [visibleSources]);213 }, [visibleSources]);
253 214
254 const autoExpandedKeys = useMemo(() => {
255 return autoExpandedKeysForSearch(search, filteredTools, viewMode);
256 }, [search, filteredTools, viewMode]);
257
258 const visibleExpandedKeys = autoExpandedKeys ?? expandedKeys;
259
260 const loadedCountsBySource = useMemo(() => {
261 const counts: Record<string, number> = {};
262 for (const tool of hydratedTools) {
263 const name = sourceLabel(tool.source);
264 counts[name] = (counts[name] ?? 0) + 1;
265 }
266 return counts;
267 }, [hydratedTools]);
268
269 const expandedSourceNames = useMemo(() => {
270 return Array.from(visibleExpandedKeys)
271 .map((key) => /^source:([^:]+)$/.exec(key)?.[1] ?? null)
272 .filter((name): name is string => Boolean(name));
273 }, [visibleExpandedKeys]);
274
275 const sourceHasMoreByCount = useCallback((sourceName: string) => {
276 const total = sourceCounts[sourceName] ?? 0;
277 const loaded = loadedCountsBySource[sourceName] ?? 0;
278 return loaded < total;
279 }, [loadedCountsBySource, sourceCounts]);
280
281 const nextExpandedSourceToLoad = useMemo(() => {
282 for (const sourceName of expandedSourceNames) {
283 const explicitHasMore = sourceHasMoreTools?.[sourceName];
284 const hasMore = explicitHasMore ?? sourceHasMoreByCount(sourceName);
285 if (hasMore) {
286 return sourceName;
287 }
288 }
289 return null;
290 }, [expandedSourceNames, sourceHasMoreByCount, sourceHasMoreTools]);
291
292 const toggleExpand = useCallback((key: string) => {
293 const sourceGroupMatch = /^source:([^:]+)$/.exec(key);
294 const isSourceGroup = Boolean(sourceGroupMatch);
295 const sourceName = sourceGroupMatch?.[1] ?? null;
296 const willExpand = !expandedKeys.has(key);
297
298 if (isSourceGroup && sourceName && willExpand && onLoadMoreToolsForSource) {
299 const sourceRecord = sourceByName.get(sourceName);
300 if (sourceRecord) {
301 const explicitHasMore = sourceHasMoreTools?.[sourceName];
302 const hasMore = explicitHasMore ?? sourceHasMoreByCount(sourceName);
303 if (hasMore) {
304 void onLoadMoreToolsForSource({
305 source: `${sourceRecord.type}:${sourceRecord.name}`,
306 sourceName: sourceRecord.name,
307 });
308 }
309 }
310 }
311
312 setExpandedKeys((prev) => {
313 const next = new Set(prev);
314 if (next.has(key)) {
315 next.delete(key);
316 } else {
317 next.add(key);
318 }
319 return next;
320 });
321 }, [expandedKeys, onLoadMoreToolsForSource, sourceByName, sourceHasMoreByCount, sourceHasMoreTools]);
322
323 const toggleSelectTool = useCallback(215 const toggleSelectTool = useCallback(
324 (path: string, e: React.MouseEvent) => {216 (path: string, e: React.MouseEvent) => {
325 e.stopPropagation();217 e.stopPropagation();
@@ -337,30 +229,6 @@ export function ToolExplorer({ · 11 unmodified lines
337 [],229 [],
338 );230 );
339 231
340 const toggleSelectGroup = useCallback(
341 (key: string, e: React.MouseEvent) => {
342 e.stopPropagation();
343 e.preventDefault();
344 setSelectedKeys((prev) => {
345 const next = new Set(prev);
346 const childTools = findToolsInGroupByKey(treeGroups, key);
347 const allSelected =
348 childTools.length > 0 &&
349 childTools.every((t) => prev.has(t.path));
350
351 if (allSelected) {
352 for (const t of childTools) next.delete(t.path);
353 next.delete(key);
354 } else {
355 for (const t of childTools) next.add(t.path);
356 next.add(key);
357 }
358 return next;
359 });
360 },
361 [treeGroups],
362 );
363
364 const clearSelection = useCallback(() => {232 const clearSelection = useCallback(() => {
365 setSelectedKeys(new Set());233 setSelectedKeys(new Set());
366 }, []);234 }, []);
@@ -369,21 +237,6 @@ export function ToolExplorer({ · 2 unmodified lines
369 setSelectedKeys(new Set(filteredTools.map((t) => t.path)));237 setSelectedKeys(new Set(filteredTools.map((t) => t.path)));
370 }, [filteredTools]);238 }, [filteredTools]);
371 239
372 const selectedToolCount = useMemo(() => {
373 return countSelectedTools(selectedKeys, filteredTools);
374 }, [selectedKeys, filteredTools]);
375
376 const sourceOptions = useMemo(
377 () => {
378 const optionSet = new Set(sourceOptionsFromTools(hydratedTools, loadingSources));
379 for (const source of visibleSources) {
380 optionSet.add(source.name);
381 }
382 return Array.from(optionSet).sort((a, b) => a.localeCompare(b));
383 },
384 [hydratedTools, loadingSources, visibleSources],
385 );
386
387 const maybeLoadToolDetails = useCallback(async (tool: ToolDescriptor, expanded: boolean) => {240 const maybeLoadToolDetails = useCallback(async (tool: ToolDescriptor, expanded: boolean) => {
388 if (!expanded || !onLoadToolDetails) {241 if (!expanded || !onLoadToolDetails) {
389 return;242 return;
@@ -420,117 +273,261 @@ export function ToolExplorer({ · 30 unmodified lines
420 }273 }
421 }, [hasRenderableToolDetails, loadingDetailPaths, onLoadToolDetails, toolDetailsByPath]);274 }, [hasRenderableToolDetails, loadingDetailPaths, onLoadToolDetails, toolDetailsByPath]);
422 275
423 const flatLoadingRows = useMemo(() => {276 // ── Focus tool handler ──────────────────────────────────────────────────
424 if (search.length > 0 || viewMode !== "flat") {277
425 return [];278 const handleFocusTool = useCallback((tool: ToolDescriptor) => {
279 setFocusedToolPath(tool.path);
280 setFocusedSourceName(null);
281 setFormSource(null);
282 void maybeLoadToolDetails(tool, true);
283 }, [maybeLoadToolDetails]);
284
285 const handleSourceClick = useCallback((sourceName: string) => {
286 const source = sourceByName.get(sourceName);
287 setFocusedSourceName(sourceName);
288 setFocusedToolPath(null);
289 // Open the source form panel directly — no separate "view" mode
290 setFormSource(source ?? null);
291 // Ensure the source group is expanded
292 setExpandedKeys((prev) => {
293 const key = `source:${sourceName}`;
294 if (prev.has(key)) return prev;
295 const next = new Set(prev);
296 next.add(key);
297 return next;
298 });
299 }, [sourceByName]);
300
301 const handleAddSource = useCallback(() => {
302 setFormSource("new");
303 setFocusedToolPath(null);
304 setFocusedSourceName(null);
305 }, []);
306
307 const handleSourceFormClose = useCallback(() => {
308 setFormSource(null);
309 }, []);
310
311 const handleSourceFormAdded = useCallback((source: ToolSourceRecord) => {
312 onSourceAdded?.(source);
313 // After adding, show the new source in the form
314 setFormSource(null);
315 setFocusedSourceName(source.name);
316 setFocusedToolPath(null);
317 }, [onSourceAdded]);
318
319 const focusedTool = useMemo(() => {
320 if (!focusedToolPath) return null;
321 return hydratedTools.find((t) => t.path === focusedToolPath) ?? null;
322 }, [focusedToolPath, hydratedTools]);
323
324 const focusedSource = useMemo(() => {
325 if (!focusedSourceName) return null;
326 return sourceByName.get(focusedSourceName) ?? null;
327 }, [focusedSourceName, sourceByName]);
328
329 // Auto-focus first tool when tools arrive
330 useEffect(() => {
331 if (!focusedToolPath && searchedTools.length > 0) {
332 const first = searchedTools[0];
333 setFocusedToolPath(first.path);
334 void maybeLoadToolDetails(first, true);
426 }335 }
336 // eslint-disable-next-line react-hooks/exhaustive-deps
337 }, [searchedTools.length > 0]);
427 338
428 return visibleLoadingSources.map((source) => ({339 const loadingRows = useMemo(() => {
429 source,340 if (search.length > 0) return [];
430 count: 3,341 const visibleLoadingSources = loadingSourceSet.size === 0
431 }));342 ? []
432 }, [search, viewMode, visibleLoadingSources]);343 : resolvedActiveSource
433 344 ? loadingSourceSet.has(resolvedActiveSource) ? [resolvedActiveSource] : []
434 const hasFlatRows = flatTools.length > 0 || flatLoadingRows.length > 0;345 : Array.from(loadingSourceSet);
435 const canInfiniteLoad = searchInput.length === 0346
436 && (viewMode === "tree" && groupBy === "source"347 return visibleLoadingSources.map((source) => ({ source, count: 3 }));
437 ? nextExpandedSourceToLoad !== null348 }, [search.length, loadingSourceSet, resolvedActiveSource]);
438 : hasMoreTools);349
439 const activeSourceLoadingMore = nextExpandedSourceToLoad350 const canInfiniteLoad = searchInput.length === 0 && hasMoreTools;
440 ? (sourceLoadingMoreTools?.[nextExpandedSourceToLoad] ?? false)
441 : false;
442 const awaitingInitialInventory =351 const awaitingInitialInventory =
443 searchInput.length === 0352 searchInput.length === 0
444 && filteredTools.length === 0353 && filteredTools.length === 0
445 && (loading || loadingSources.length > 0);354 && (loading || loadingSources.length > 0);
446 355
447 const handleExpandAll = useCallback(() => {356 // ── Tree view data ──────────────────────────────────────────────────────
448 setExpandedKeys(collectGroupKeys(treeGroups));357
358 const treeGroups = useMemo(() => {
359 return treeGroupsForView(searchedTools, "tree", "source", {
360 loadingSources,
361 sourceRecords: visibleSources,
362 sourceCounts,
363 activeSource: resolvedActiveSource,
364 });
365 }, [searchedTools, loadingSources, visibleSources, sourceCounts, resolvedActiveSource]);
366
367 const [expandedKeys, setExpandedKeys] = useState<Set<string>>(() => {
368 // Start with all source-level groups expanded
369 const keys = new Set<string>();
370 for (const group of treeGroups) {
371 keys.add(group.key);
372 }
373 return keys;
374 });
375
376 // Auto-expand all groups when search is active
377 const searchAutoExpanded = useMemo(
378 () => autoExpandedKeysForSearch(search, searchedTools, "tree"),
379 [search, searchedTools],
380 );
381
382 const effectiveExpandedKeys = searchAutoExpanded ?? expandedKeys;
383
384 // When new source groups appear, auto-expand them
385 useEffect(() => {
386 const allKeys = collectGroupKeys(treeGroups);
387 setExpandedKeys((prev) => {
388 const next = new Set(prev);
389 let changed = false;
390 for (const key of allKeys) {
391 if (key.startsWith("source:") && !key.includes(":ns:") && !next.has(key)) {
392 next.add(key);
393 changed = true;
394 }
395 }
396 return changed ? next : prev;
397 });
449 }, [treeGroups]);398 }, [treeGroups]);
450 399
451 const handleCollapseAll = useCallback(() => {400 const toggleExpand = useCallback((key: string) => {
452 setExpandedKeys(new Set());401 setExpandedKeys((prev) => {
402 const next = new Set(prev);
403 if (next.has(key)) {
404 next.delete(key);
405 } else {
406 next.add(key);
407 }
408 return next;
409 });
453 }, []);410 }, []);
454 411
455 const handleExplorerWheel = useCallback(412 const inventoryStatus = useMemo(() => {
456 (e: React.WheelEvent<HTMLDivElement>) => {413 const loadingSourceCount = loadingSourceSet.size;
457 const listEl = viewMode === "flat" ? flatListRef.current : treeListRef.current;
458 if (!listEl) return;
459 414
460 const target = e.target as HTMLElement | null;415 if (!inventoryState) {
461 if (target && listEl.contains(target)) return;416 return { label: "Checking...", tone: "muted" as const };
462 417 }
463 const atTop = listEl.scrollTop <= 0;418 if (inventoryState === "initializing") {
464 const atBottom =419 const w = loadingSourceCount === 1 ? "source" : "sources";
465 listEl.scrollTop + listEl.clientHeight >= listEl.scrollHeight - 1;420 return {
421 label: loadingSourceCount > 0 ? `Building (${loadingSourceCount} ${w})` : "Building...",
422 tone: "loading" as const,
423 };
424 }
425 if (inventoryState === "rebuilding") {
426 const w = loadingSourceCount === 1 ? "source" : "sources";
427 return {
428 label: loadingSourceCount > 0 ? `Refreshing (${loadingSourceCount} ${w})` : "Refreshing...",
429 tone: "loading" as const,
430 };
431 }
432 if (inventoryState === "stale") {
433 return { label: "Out of date", tone: "muted" as const };
434 }
435 if (inventoryState === "failed") {
436 return {
437 label: inventoryError ? `Failed: ${inventoryError}` : "Failed",
438 tone: "error" as const,
439 };
440 }
441 return { label: "Up to date", tone: "muted" as const };
442 }, [inventoryError, inventoryState, loadingSourceSet.size]);
466 443
467 if ((e.deltaY < 0 && atTop) || (e.deltaY > 0 && atBottom)) return;444 const regenerationInProgress = isRebuilding;
445 const inventoryStale = inventoryState === "stale";
468 446
469 listEl.scrollTop += e.deltaY;447 // ── Render ──────────────────────────────────────────────────────────────
470 e.preventDefault();
471 },
472 [viewMode],
473 );
474 448
475 return (449 return (
476 <div className="flex" onWheelCapture={handleExplorerWheel}>450 <div className="flex h-[calc(100vh-220px)]">
477 {showSourceSidebar ? (451 {/* ── Left panel: search + tree ────────────────────────────────────── */}
478 <SourceSidebar452 <div className="flex flex-col w-72 lg:w-80 xl:w-[22rem] shrink-0 border-r border-border/40">
479 sources={visibleSources}453 {/* Header: inventory status + regenerate */}
480 sourceCounts={sourceCounts}454 <div className="shrink-0 px-3 pt-2 pb-1.5 border-b border-border/30">
481 loadingSources={loadingSourceSet}455 <div className="flex items-center justify-between">
482 warningsBySource={warningsBySource}456 <div className="flex items-center gap-1.5">
483 activeSource={resolvedActiveSource}457 <p className="text-[10px] font-mono uppercase tracking-widest text-muted-foreground/50">
484 onSelectSource={handleSourceSelect}458 Tools
485 sourceDialogMeta={sourceDialogMeta}459 </p>
486 sourceAuthProfiles={sourceAuthProfiles}460 <span
487 existingSourceNames={sidebarExistingSourceNames}461 className={cn(
488 onSourceDeleted={onSourceDeleted}462 "text-[9px] font-mono flex items-center gap-0.5",
489 onRegenerate={onRegenerate}463 inventoryStatus.tone === "loading"
490 isRebuilding={isRebuilding}464 ? "text-terminal-amber/80"
491 inventoryState={inventoryState}465 : inventoryStatus.tone === "error"
492 inventoryError={inventoryError}466 ? "text-terminal-red/80"
493 />467 : "text-muted-foreground/40",
494 ) : null}468 )}
495 469 title={inventoryStatus.label}
496 <div470 >
497 className={cn(471 {inventoryStatus.tone === "loading" ? (
498 "flex-1 min-w-0 flex flex-col",472 <Loader2 className="h-2.5 w-2.5 animate-spin" />
499 showSourceSidebar ? "pl-2 lg:pl-3" : "pl-0",473 ) : inventoryStatus.tone === "error" ? (
500 )}474 <AlertTriangle className="h-2.5 w-2.5" />
501 >475 ) : null}
502 <ToolExplorerToolbar476 {inventoryStatus.label}
503 search={searchInput}477 </span>
504 filteredToolCount={filteredTools.length}478 </div>
505 hasSearch={searchInput.length > 0}479 <div className="flex items-center gap-0.5">
506 resultCount={searchedTools.length}480 {onRegenerate ? (
507 loadingInventory={awaitingInitialInventory}481 <button
508 viewMode={viewMode}482 onClick={onRegenerate}
509 groupBy={groupBy}483 disabled={regenerationInProgress}
510 filterApproval={filterApproval}484 title={
511 showSourceSidebar={showSourceSidebar}485 regenerationInProgress
512 activeSource={resolvedActiveSource}486 ? "Rebuilding..."
513 sourceOptions={sourceOptions}487 : inventoryStale
514 addSourceAction={addSourceAction}488 ? "Out of date — click to refresh"
515 selectedToolCount={selectedToolCount}489 : "Regenerate inventory"
516 onSearchChange={setSearchInput}490 }
517 onClearSearch={() => setSearchInput("")}491 className={cn(
518 onViewModeChange={setViewMode}492 "p-0.5 rounded transition-colors",
519 onGroupByChange={setGroupBy}493 regenerationInProgress
520 onFilterApprovalChange={setFilterApproval}494 ? "text-terminal-amber cursor-not-allowed"
521 onSourceSelect={handleSourceSelect}495 : inventoryStale
522 onSelectAll={selectAll}496 ? "text-muted-foreground/70 hover:text-muted-foreground"
523 onClearSelection={clearSelection}497 : "text-muted-foreground/30 hover:text-muted-foreground/60",
524 onExpandAll={handleExpandAll}498 )}
525 onCollapseAll={handleCollapseAll}499 >
526 />500 <RefreshCcw className={cn("h-3 w-3", regenerationInProgress && "animate-spin")} />
527 501 </button>
528 {viewMode === "flat" ? (502 ) : null}
529 !hasFlatRows ? (503 </div>
530 <div504 </div>
531 ref={flatListRef}505 </div>
532 className="max-h-[calc(100vh-320px)] overflow-y-auto rounded-md border border-border/30 bg-background/30"506
533 >507 {/* Search toolbar (own row) */}
508 <div className="shrink-0 px-2 py-2 border-b border-border/20">
509 <ToolExplorerToolbar
510 search={searchInput}
511 filteredToolCount={filteredTools.length}
512 hasSearch={searchInput.length > 0}
513 resultCount={searchedTools.length}
514 loadingInventory={awaitingInitialInventory}
515 filterApproval={filterApproval}
516 activeSource={resolvedActiveSource}
517 selectedToolCount={selectedToolCount}
518 onSearchChange={setSearchInput}
519 onClearSearch={() => setSearchInput("")}
520 onFilterApprovalChange={setFilterApproval}
521 onAddSource={handleAddSource}
522 onSelectAll={selectAll}
523 onClearSelection={clearSelection}
524 />
525 </div>
526
527 {/* Source-grouped tree */}
528 <div className="flex-1 min-h-0">
529 {searchedTools.length === 0 && loadingRows.length === 0 ? (
530 <div className="h-full overflow-y-auto">
534 {awaitingInitialInventory ? (531 {awaitingInitialInventory ? (
535 <LoadingState />532 <LoadingState />
536 ) : (533 ) : (
@@ -538,89 +535,77 @@ export function ToolExplorer({ · 1 unmodified line
538 )}535 )}
539 </div>536 </div>
540 ) : (537 ) : (
541 <VirtualFlatList538 <div
542 tools={flatTools}539 ref={toolListRef}
543 selectedKeys={selectedKeys}540 id={toolListScrollContainerId}
544 onSelectTool={toggleSelectTool}541 className="h-full overflow-y-auto"
545 onExpandedChange={maybeLoadToolDetails}542 >
546 detailLoadingPaths={loadingDetailPaths}543 <InfiniteScroll
547 scrollContainerRef={flatListRef}544 dataLength={searchedTools.length}
548 scrollContainerId={flatScrollContainerId}545 next={() => {
549 loadingRows={flatLoadingRows}546 void onLoadMoreTools?.();
550 hasMoreTools={canInfiniteLoad}547 }}
551 loadingMoreTools={loadingMoreTools}548 hasMore={canInfiniteLoad}
552 onLoadMoreTools={onLoadMoreTools}549 scrollableTarget={toolListScrollContainerId}
553 />550 style={{ overflow: "visible" }}
554 )551 loader={
555 ) : (552 <div className="px-2 py-2 text-[10px] text-muted-foreground/60">
556 <div553 {loadingMoreTools ? "Loading..." : ""}
557 ref={treeListRef}554 </div>
558 id={treeScrollContainerId}555 }
559 className="max-h-[calc(100vh-320px)] overflow-y-auto rounded-md border border-border/30 bg-background/30"
560 >
561 {treeGroups.length === 0 ? (
562 awaitingInitialInventory ? (
563 <LoadingState />
564 ) : (
565 <EmptyState hasSearch={!!search} onClearSearch={() => setSearchInput("")} />
566 )
567 ) : (
568 <InfiniteScroll
569 dataLength={tools.length}
570 next={() => {
571 if (
572 searchInput.length === 0
573 && viewMode === "tree"
574 && groupBy === "source"
575 && onLoadMoreToolsForSource
576 ) {
577 if (!nextExpandedSourceToLoad) {
578 return;
579 }
580 const sourceRecord = sourceByName.get(nextExpandedSourceToLoad);
581 if (sourceRecord) {
582 void onLoadMoreToolsForSource({
583 source: `${sourceRecord.type}:${sourceRecord.name}`,
584 sourceName: sourceRecord.name,
585 });
586 return;
587 }
588 }
589
590 void onLoadMoreTools?.();
591 }}
592 hasMore={canInfiniteLoad}
593 scrollableTarget={treeScrollContainerId}
594 style={{ overflow: "visible" }}
595 loader={
596 <div className="px-2 py-2 text-[11px] text-muted-foreground">
597 {(loadingMoreTools || activeSourceLoadingMore)
598 ? `Loading more tools${totalTools ? ` (${tools.length} / ${totalTools})` : ""}...`
599 : ""}
600 </div>
601 }
602 >556 >
603 <div className="p-1">557 <div className="py-0.5">
604 {treeGroups.map((group) => (558 {treeGroups.map((group) => (
605 <GroupNode559 <NavGroupNode
606 key={group.key}560 key={group.key}
607 group={group}561 group={group}
608 depth={0}562 depth={0}
609 expandedKeys={visibleExpandedKeys}563 expandedKeys={effectiveExpandedKeys}
610 onToggle={toggleExpand}564 onToggle={toggleExpand}
565 focusedPath={focusedToolPath}
566 focusedSource={focusedSourceName}
611 selectedKeys={selectedKeys}567 selectedKeys={selectedKeys}
612 onSelectGroup={toggleSelectGroup}568 onFocusTool={handleFocusTool}
613 onSelectTool={toggleSelectTool}569 onSelectTool={toggleSelectTool}
614 onExpandedChange={maybeLoadToolDetails}570 onSourceClick={handleSourceClick}
615 detailLoadingPaths={loadingDetailPaths}571 source={sourceByName.get(group.label) ?? undefined}
616 source={group.type === "source" ? sourceByName.get(group.label) : undefined}572 />
617 search={search}573 ))}
574
575 {loadingRows.map((loadingRow) => (
576 <ToolLoadingRows
577 key={loadingRow.source}
578 source={loadingRow.source}
579 count={loadingRow.count}
580 depth={0}
618 />581 />
619 ))}582 ))}
620 </div>583 </div>
621 </InfiniteScroll>584 </InfiniteScroll>
622 )}585 </div>
623 </div>586 )}
587 </div>
588 </div>
589
590 {/* ── Detail panel (right, main content) ─────────────────────────────── */}
591 <div className="flex-1 min-w-0 bg-background/50">
592 {formSource !== null ? (
593 <SourceFormPanel
594 existingSourceNames={sidebarExistingSourceNames}
595 sourceToEdit={formSource === "new" ? undefined : formSource}
596 sourceDialogMeta={formSource !== "new" ? sourceDialogMeta?.[formSource.name] : undefined}
597 sourceAuthProfiles={sourceAuthProfiles}
598 onSourceAdded={handleSourceFormAdded}
599 onSourceDeleted={onSourceDeleted}
600 onClose={handleSourceFormClose}
601 />
602 ) : focusedTool ? (
603 <ToolDetailPanel
604 tool={focusedTool}
605 loading={loadingDetailPaths.has(focusedTool.path)}
606 />
607 ) : (
608 <ToolDetailEmpty />
624 )}609 )}
625 </div>610 </div>
626 </div>611 </div>
executor/apps/web/src/components/tools/explorer/source-form-panel.tsx+507−0
@@ -0,0 +1,507 @@
1"use client";
2
3import { useState } from "react";
4import { useAction, useMutation, useQuery } from "convex/react";
5import { Result } from "better-result";
6import { toast } from "sonner";
7import {
8 AlertTriangle,
9 ArrowLeft,
10 Loader2,
11 Trash2,
12} from "lucide-react";
13import { Badge } from "@/components/ui/badge";
14import { Button } from "@/components/ui/button";
15import type {
16 CredentialRecord,
17 SourceAuthProfile,
18 ToolSourceRecord,
19} from "@/lib/types";
20import type { SourceDialogMeta } from "../add/source-dialog";
21import { SourceFavicon } from "../source-favicon";
22import { displaySourceName } from "@/lib/tool/source-utils";
23import {
24 compactEndpointLabel,
25 formatSourceAuthBadge,
26 sourceAuthProfileForSource,
27} from "@/lib/tools/source-helpers";
28import { SourceQualitySummary } from "../source/quality-details";
29import { useSession } from "@/lib/session-context";
30import { convexApi } from "@/lib/convex-api";
31import { normalizeSourceEndpoint } from "@/lib/tools/source-url";
32import { createCustomSourceConfig } from "../add/source/dialog-helpers";
33import {
34 CatalogViewSection,
35 CustomViewSection,
36} from "../add/source/dialog-sections";
37import { SourceAuthPanel } from "../add/source/auth-panel";
38import { saveSourceWithCredentials } from "../add/source-submit";
39import {
40 useAddSourceFormState,
41} from "../use/add/source/form-state";
42import { startMcpOAuthPopup } from "@/lib/mcp/oauth-popup";
43import { workspaceQueryArgs } from "@/lib/workspace/query-args";
44
45// ── Helpers ─────────────────────────────────────────────────────────────────
46
47function resultErrorMessage(error: unknown, fallback: string): string {
48 const cause = typeof error === "object" && error && "cause" in error
49 ? (error as { cause?: unknown }).cause
50 : error;
51 if (cause instanceof Error && cause.message.trim()) {
52 return cause.message;
53 }
54 if (typeof cause === "string" && cause.trim()) {
55 return cause;
56 }
57 return fallback;
58}
59
60function ownerScopeBadge(scopeType: ToolSourceRecord["scopeType"] | undefined): string {
61 return scopeType === "organization" ? "org shared" : "workspace only";
62}
63
64// ── Main Panel ──────────────────────────────────────────────────────────────
65
66export function SourceFormPanel({
67 existingSourceNames,
68 sourceToEdit,
69 sourceDialogMeta,
70 sourceAuthProfiles,
71 onSourceAdded,
72 onSourceDeleted,
73 onClose,
74}: {
75 existingSourceNames: Set<string>;
76 sourceToEdit?: ToolSourceRecord;
77 sourceDialogMeta?: SourceDialogMeta;
78 sourceAuthProfiles?: Record<string, SourceAuthProfile>;
79 onSourceAdded?: (source: ToolSourceRecord, options?: { connected?: boolean }) => void;
80 onSourceDeleted?: (sourceName: string) => void;
81 onClose: () => void;
82}) {
83 const { context } = useSession();
84 const upsertToolSource = useMutation(convexApi.workspace.upsertToolSource);
85 const deleteToolSource = useMutation(convexApi.workspace.deleteToolSource);
86 const upsertCredential = useAction(convexApi.credentialsNode.upsertCredential);
87 const previewOpenApiSourceUpgrade = useAction(convexApi.executorNode.previewOpenApiSourceUpgrade);
88 const credentials = useQuery(
89 convexApi.workspace.listCredentials,
90 workspaceQueryArgs(context),
91 );
92 const credentialItems = (credentials ?? []) as CredentialRecord[];
93 const credentialsLoading = Boolean(context) && credentials === undefined;
94 const [submitting, setSubmitting] = useState(false);
95 const [mcpOAuthBusy, setMcpOAuthBusy] = useState(false);
96 const [deleting, setDeleting] = useState(false);
97
98 const editing = Boolean(sourceToEdit);
99
100 // Edit-mode metadata
101 const editSourceMeta = sourceToEdit ? sourceDialogMeta : undefined;
102 const editSourceWarnings = editSourceMeta?.warnings ?? [];
103 const editSourceQuality = editSourceMeta?.quality;
104 const editSourceQualityLoading = Boolean(editSourceMeta?.qualityLoading);
105 const editAuthProfile = sourceToEdit && sourceAuthProfiles
106 ? sourceAuthProfileForSource(sourceToEdit, sourceAuthProfiles)
107 : undefined;
108 const editAuthBadge = sourceToEdit ? formatSourceAuthBadge(sourceToEdit, editAuthProfile) : null;
109
110 // Form state — `open` is always true for the inline panel
111 const form = useAddSourceFormState({
112 open: true,
113 sourceToEdit,
114 existingSourceNames,
115 credentialItems,
116 accountId: context?.accountId,
117 });
118
119 const handleCatalogAdd = (item: { specUrl: string } & Parameters<typeof form.handleCatalogAdd>[0]) => {
120 if (!item.specUrl.trim()) {
121 toast.error("Missing endpoint URL for this source");
122 return;
123 }
124 form.handleCatalogAdd(item);
125 };
126
127 const handleCustomSubmit = async () => {
128 if (!context || !form.name.trim() || !form.endpoint.trim()) {
129 return;
130 }
131
132 if (sourceToEdit?.type === "openapi" && form.type === "openapi") {
133 const previewConfig = createCustomSourceConfig({
134 type: form.type,
135 endpoint: form.endpoint.trim(),
136 baseUrl: form.baseUrl,
137 auth: form.buildAuthConfig(),
138 mcpTransport: form.mcpTransport,
139 accountId: context.accountId,
140 });
141
142 const previewResult = await Result.tryPromise(() =>
143 previewOpenApiSourceUpgrade({
144 workspaceId: context.workspaceId,
145 sessionId: context.sessionId,
146 sourceId: sourceToEdit.id,
147 name: form.name.trim(),
148 config: previewConfig,
149 }),
150 );
151
152 if (!previewResult.isOk()) {
153 toast.error(resultErrorMessage(previewResult.error, "Failed to preview OpenAPI changes"));
154 return;
155 }
156
157 const preview = previewResult.value;
158 if (preview.hasChanges) {
159 const sample = (items: string[]) => items.slice(0, 8).join("\n- ");
160 const added = sample(preview.addedPaths);
161 const removed = sample(preview.removedPaths);
162 const changed = sample(preview.changedPaths);
163
164 const message = [
165 `OpenAPI upgrade for \"${preview.currentSourceName}\"`,
166 "",
167 `Added: ${preview.addedCount}`,
168 `Removed: ${preview.removedCount}`,
169 `Changed: ${preview.changedCount}`,
170 "",
171 added ? `Added sample:\n- ${added}` : "",
172 removed ? `Removed sample:\n- ${removed}` : "",
173 changed ? `Changed sample:\n- ${changed}` : "",
174 preview.truncated ? "\n(Preview truncated)" : "",
175 "",
176 "Apply this upgrade now?",
177 ]
178 .filter((line) => line.length > 0)
179 .join("\n");
180
181 const approved = window.confirm(message);
182 if (!approved) {
183 toast.message("Upgrade cancelled");
184 return;
185 }
186 }
187 }
188
189 if (form.isNameTaken(form.name)) {
190 toast.error(`Source name "${form.name.trim()}" already exists`);
191 return;
192 }
193
194 if (form.type === "openapi" && form.specStatus !== "ready") {
195 if (form.specStatus === "detecting") {
196 toast.error("Spec fetch is still in progress");
197 return;
198 }
199 toast.error(form.specError || "OpenAPI spec is invalid or could not be fetched");
200 return;
201 }
202
203 setSubmitting(true);
204 const saveResult = await Result.tryPromise(() =>
205 saveSourceWithCredentials({
206 context,
207 sourceToEdit,
208 credentialsLoading,
209 upsertToolSource,
210 upsertCredential,
211 form: {
212 name: form.name,
213 endpoint: form.endpoint,
214 type: form.type,
215 scopeType: form.scopeType,
216 baseUrl: form.baseUrl,
217 mcpTransport: form.mcpTransport,
218 authType: form.authType,
219 authScope: form.authScope,
220 apiKeyHeader: form.apiKeyHeader,
221 existingScopedCredential: form.existingScopedCredential,
222 buildAuthConfig: form.buildAuthConfig,
223 hasCredentialInput: form.hasCredentialInput,
224 buildSecretJson: form.buildSecretJson,
225 },
226 }),
227 );
228 setSubmitting(false);
229
230 if (!saveResult.isOk()) {
231 toast.error(resultErrorMessage(
232 saveResult.error,
233 sourceToEdit ? "Failed to update source" : "Failed to add source",
234 ));
235 return;
236 }
237
238 const result = saveResult.value;
239 const needsCredentials = form.authType !== "none" && !result.connected;
240 onSourceAdded?.(result.source, { connected: result.connected });
241 if (needsCredentials) {
242 toast.warning(
243 sourceToEdit
244 ? `Source "${form.name.trim()}" updated — credentials still needed`
245 : `Source "${form.name.trim()}" added without credentials — edit to add them`,
246 );
247 } else {
248 toast.success(
249 sourceToEdit
250 ? result.connected
251 ? `Source "${form.name.trim()}" updated with credentials`
252 : `Source "${form.name.trim()}" updated`
253 : result.connected
254 ? `Source "${form.name.trim()}" added with credentials — loading tools…`
255 : `Source "${form.name.trim()}" added — loading tools…`,
256 );
257 }
258 if (!sourceToEdit) {
259 form.reserveSourceName(form.name.trim());
260 }
261 onClose();
262 };
263
264 const handleMcpOAuthConnect = async () => {
265 if (form.type !== "mcp") return;
266 const endpoint = form.endpoint.trim();
267 if (!endpoint) {
268 toast.error("Enter an MCP endpoint URL first");
269 return;
270 }
271 const initiatedEndpoint = normalizeSourceEndpoint(endpoint);
272
273 setMcpOAuthBusy(true);
274 const oauthResult = await Result.tryPromise(() => startMcpOAuthPopup(endpoint));
275 setMcpOAuthBusy(false);
276
277 if (!oauthResult.isOk()) {
278 toast.error(resultErrorMessage(oauthResult.error, "Failed to connect OAuth"));
279 return;
280 }
281
282 const returnedEndpoint = normalizeSourceEndpoint(oauthResult.value.sourceUrl);
283 if (returnedEndpoint && initiatedEndpoint && returnedEndpoint !== initiatedEndpoint) {
284 toast.error("OAuth finished for a different endpoint. Try again.");
285 return;
286 }
287
288 const currentEndpoint = normalizeSourceEndpoint(form.endpoint);
289 if (currentEndpoint !== initiatedEndpoint) {
290 toast.error("Endpoint changed while OAuth was running. Please reconnect OAuth.");
291 return;
292 }
293
294 if (form.authType !== "bearer") {
295 form.handleAuthTypeChange("bearer");
296 }
297 form.handleAuthFieldChange("tokenValue", oauthResult.value.accessToken);
298 form.markMcpOAuthLinked(initiatedEndpoint);
299 toast.success("OAuth linked successfully.");
300 };
301
302 const handleDeleteSource = async () => {
303 if (!sourceToEdit || !context) return;
304 const scopeLabel = sourceToEdit.scopeType === "organization"
305 ? "your organization"
306 : "this workspace";
307 const confirmed = window.confirm(
308 `Remove source "${sourceToEdit.name}" and all related tools from ${scopeLabel}?`,
309 );
310 if (!confirmed) return;
311
312 setDeleting(true);
313 try {
314 await deleteToolSource({
315 workspaceId: context.workspaceId,
316 sessionId: context.sessionId,
317 sourceId: sourceToEdit.id,
318 });
319 toast.success(`Removed "${sourceToEdit.name}"`);
320 onSourceDeleted?.(sourceToEdit.name);
321 onClose();
322 } catch (err) {
323 toast.error(err instanceof Error ? err.message : "Failed to remove source");
324 } finally {
325 setDeleting(false);
326 }
327 };
328
329 const submitLabel = editing ? "Save Source" : "Add Source";
330 const sourceInfoLoading =
331 (form.type === "openapi" && form.specStatus === "detecting")
332 || (form.type === "mcp" && form.mcpOAuthStatus === "checking");
333
334 // ── Render ──────────────────────────────────────────────────────────────
335
336 return (
337 <div className="h-full flex flex-col">
338 {/* ── Sticky header ────────────────────────────────────────────── */}
339 <div className="sticky top-0 z-10 bg-background/95 backdrop-blur-sm border-b border-border/40 px-5 py-3">
340 <div className="flex items-center gap-3 min-w-0">
341 <button
342 onClick={onClose}
343 className="h-7 w-7 rounded-md flex items-center justify-center text-muted-foreground hover:text-foreground hover:bg-accent/40 transition-colors shrink-0"
344 >
345 <ArrowLeft className="h-3.5 w-3.5" />
346 </button>
347 <div className="min-w-0 flex-1">
348 <h2 className="text-[14px] font-mono font-semibold text-foreground">
349 {editing ? "Edit source" : "Add source"}
350 </h2>
351 <p className="text-[10px] text-muted-foreground/60 mt-0.5">
352 {editing
353 ? "Update endpoint, auth, and credentials."
354 : "Connect a source and configure credentials."}
355 </p>
356 </div>
357 </div>
358 </div>
359
360 {/* ── Scrollable body ──────────────────────────────────────────── */}
361 <div className="flex-1 min-h-0 overflow-y-auto flex flex-col">
362 <div className="px-5 py-5 flex flex-col gap-5 flex-1 min-h-0">
363
364 {/* Edit mode: source summary card */}
365 {sourceToEdit ? (
366 <div className="rounded-lg border border-border/60 bg-muted/10 p-4 space-y-3">
367 <div className="flex items-start gap-3">
368 <SourceFavicon
369 source={sourceToEdit}
370 iconClassName="h-5 w-5 text-muted-foreground"
371 imageClassName="w-7 h-7"
372 />
373 <div className="min-w-0 flex-1">
374 <p className="text-[13px] font-medium truncate">
375 {displaySourceName(sourceToEdit.name)}
376 </p>
377 <p className="text-[10px] text-muted-foreground truncate mt-0.5">
378 {compactEndpointLabel(sourceToEdit)}
379 </p>
380 <div className="mt-2 flex items-center gap-1.5 flex-wrap">
381 <Badge variant="outline" className="h-5 px-2 text-[9px] uppercase tracking-wide">
382 {sourceToEdit.type}
383 </Badge>
384 <Badge variant="outline" className="h-5 px-2 text-[9px] uppercase tracking-wide">
385 {ownerScopeBadge(sourceToEdit.scopeType)}
386 </Badge>
387 {editAuthBadge ? (
388 <Badge
389 variant="outline"
390 className="h-5 px-2 text-[9px] uppercase tracking-wide text-primary border-primary/30"
391 >
392 {editAuthBadge}
393 </Badge>
394 ) : null}
395 {sourceToEdit.type === "openapi" && editSourceQuality ? (
396 <SourceQualitySummary quality={editSourceQuality} qualityLoading={editSourceQualityLoading} />
397 ) : null}
398 </div>
399 </div>
400 </div>
401
402 {editSourceWarnings.length > 0 ? (
403 <div className="rounded-md border border-terminal-amber/20 bg-terminal-amber/5 px-3 py-2 space-y-0.5">
404 {editSourceWarnings.map((warning, i) => (
405 <p key={i} className="text-[10px] text-terminal-amber/90 flex items-start gap-1.5">
406 <AlertTriangle className="h-2.5 w-2.5 mt-0.5 shrink-0" />
407 {warning}
408 </p>
409 ))}
410 </div>
411 ) : null}
412 </div>
413 ) : null}
414
415 {/* Form content — catalog or custom */}
416 {form.view === "catalog" && !sourceToEdit ? (
417 <CatalogViewSection
418 catalogQuery={form.catalogQuery}
419 onCatalogQueryChange={form.setCatalogQuery}
420 catalogSort={form.catalogSort}
421 onCatalogSortChange={form.setCatalogSort}
422 visibleCatalogItems={form.visibleCatalogItems}
423 onSwitchToCustom={() => form.setView("custom")}
424 onAddCatalog={handleCatalogAdd}
425 />
426 ) : (
427 <CustomViewSection
428 type={form.type}
429 onTypeChange={form.handleTypeChange}
430 typeDisabled={form.editing}
431 typeDetectionStatus={form.typeDetectionStatus}
432 typeExplicitlySet={form.typeExplicitlySet}
433 endpoint={form.endpoint}
434 onEndpointChange={form.handleEndpointChange}
435 name={form.name}
436 onNameChange={form.handleNameChange}
437 baseUrl={form.baseUrl}
438 baseUrlOptions={form.openApiBaseUrlOptions}
439 onBaseUrlChange={form.setBaseUrl}
440 mcpTransport={form.mcpTransport}
441 onMcpTransportChange={form.setMcpTransport}
442 submitting={submitting}
443 submittingLabel={editing ? "Saving..." : "Adding..."}
444 submitDisabled={
445 submitting
446 || !form.name.trim()
447 || !form.endpoint.trim()
448 || (form.type === "openapi" && form.specStatus !== "ready")
449 }
450 submitLabel={submitLabel}
451 showBackToCatalog={!form.editing}
452 onBackToCatalog={!form.editing ? () => form.setView("catalog") : undefined}
453 onSubmit={handleCustomSubmit}
454 sourceInfoLoading={sourceInfoLoading}
455 >
456 <SourceAuthPanel
457 model={{
458 sourceType: form.type,
459 specStatus: form.specStatus,
460 inferredSpecAuth: form.inferredSpecAuth,
461 specError: form.specError,
462 mcpOAuthStatus: form.mcpOAuthStatus,
463 mcpOAuthDetail: form.mcpOAuthDetail,
464 mcpOAuthAuthorizationServers: form.mcpOAuthAuthorizationServers,
465 mcpOAuthConnected: form.mcpOAuthConnected,
466 authType: form.authType,
467 scopeType: form.scopeType,
468 authScope: form.authScope,
469 apiKeyHeader: form.apiKeyHeader,
470 tokenValue: form.tokenValue,
471 apiKeyValue: form.apiKeyValue,
472 basicUsername: form.basicUsername,
473 basicPassword: form.basicPassword,
474 hasExistingCredential: Boolean(form.existingScopedCredential),
475 }}
476 onAuthTypeChange={form.handleAuthTypeChange}
477 onScopeChange={form.handleScopePresetChange}
478 onFieldChange={form.handleAuthFieldChange}
479 onMcpOAuthConnect={form.type === "mcp" ? handleMcpOAuthConnect : undefined}
480 onOpenApiSpecRetry={form.type === "openapi" ? form.retryOpenApiSpec : undefined}
481 openApiSpecRetrying={form.type === "openapi" && form.specStatus === "detecting"}
482 mcpOAuthBusy={mcpOAuthBusy}
483 sourceInfoLoading={sourceInfoLoading}
484 />
485 </CustomViewSection>
486 )}
487
488 {/* Delete action for edit mode */}
489 {sourceToEdit ? (
490 <div className="pt-3 border-t border-border/30">
491 <Button
492 variant="outline"
493 size="sm"
494 className="h-8 text-[11px] border-terminal-red/30 text-terminal-red hover:bg-terminal-red/10 gap-1.5"
495 onClick={handleDeleteSource}
496 disabled={deleting}
497 >
498 <Trash2 className="h-3 w-3" />
499 {deleting ? "Removing..." : "Remove source"}
500 </Button>
501 </div>
502 ) : null}
503 </div>
504 </div>
505 </div>
506 );
507}
executor/apps/web/src/components/tools/explorer/tool-detail.tsx+344−171
@@ -3,22 +3,19 @@ · 2 unmodified lines
3import { useMemo } from "react";3import { useMemo } from "react";
4import { Streamdown } from "streamdown";4import { Streamdown } from "streamdown";
5import { createCodePlugin } from "@streamdown/code";5import { createCodePlugin } from "@streamdown/code";
6import { ShieldCheck, Zap } from "lucide-react";
6import type { ToolDescriptor } from "@/lib/types";7import type { ToolDescriptor } from "@/lib/types";
7import { Skeleton } from "@/components/ui/skeleton";8import { Skeleton } from "@/components/ui/skeleton";
9import { cn } from "@/lib/utils";
10import { traverseSchema, type SchemaFieldEntry } from "@/lib/tool/schema-traverse";
8import { TypeSignature } from "./type-signature";11import { TypeSignature } from "./type-signature";
12import { CopyButton } from "./copy-button";
9 13
10const codePlugin = createCodePlugin({14const codePlugin = createCodePlugin({
11 themes: ["github-light", "github-dark"],15 themes: ["github-light", "github-dark"],
12});16});
13 17
14type FieldDocEntry = {18// ── Helpers ──────────────────────────────────────────────────────────────────
15 path: string;
16 required?: boolean;
17 description?: string;
18 example?: string;
19 defaultValue?: string;
20 deprecated?: boolean;
21};
22 19
23function asRecord(value: unknown): Record<string, unknown> {20function asRecord(value: unknown): Record<string, unknown> {
24 return value && typeof value === "object" && !Array.isArray(value)21 return value && typeof value === "object" && !Array.isArray(value)
@@ -26,22 +23,6 @@ function asRecord(value: unknown): Record<string, unknown> { · 1 unmodified line
26 : {};23 : {};
27}24}
28 25
29function toPreviewValue(value: unknown): string | undefined {
30 if (value === undefined) return undefined;
31 if (typeof value === "string") {
32 const trimmed = value.trim();
33 if (!trimmed) return undefined;
34 return trimmed.length > 96 ? `${trimmed.slice(0, 96)}...` : trimmed;
35 }
36 try {
37 const serialized = JSON.stringify(value);
38 if (!serialized) return undefined;
39 return serialized.length > 96 ? `${serialized.slice(0, 96)}...` : serialized;
40 } catch {
41 return undefined;
42 }
43}
44
45function parseSchemaJson(value: string): Record<string, unknown> {26function parseSchemaJson(value: string): Record<string, unknown> {
46 if (!value) return {};27 if (!value) return {};
47 try {28 try {
@@ -52,111 +33,248 @@ function parseSchemaJson(value: string): Record<string, unknown> { · 4 unmodified lines
52 }33 }
53}34}
54 35
55function collectSchemaFieldDocs(schema: Record<string, unknown>, options: { maxEntries?: number; maxDepth?: number } = {}): {36// ── Type color mapping ──────────────────────────────────────────────────────
56 entries: FieldDocEntry[];37
57 truncated: boolean;38function typeColorClasses(type: string): string {
58} {39 switch (type) {
59 const maxEntries = options.maxEntries ?? 28;40 case "string":
60 const maxDepth = options.maxDepth ?? 4;41 return "text-[oklch(0.45_0.14_155)] bg-[oklch(0.45_0.14_155_/_0.07)] border-[oklch(0.45_0.14_155_/_0.15)] dark:text-[oklch(0.75_0.14_155)] dark:bg-[oklch(0.75_0.14_155_/_0.1)] dark:border-[oklch(0.75_0.14_155_/_0.2)]";
61 const entries: FieldDocEntry[] = [];42 case "number":
62 let truncated = false;43 case "integer":
63 44 return "text-[oklch(0.50_0.16_260)] bg-[oklch(0.50_0.16_260_/_0.07)] border-[oklch(0.50_0.16_260_/_0.15)] dark:text-[oklch(0.75_0.14_260)] dark:bg-[oklch(0.75_0.14_260_/_0.1)] dark:border-[oklch(0.75_0.14_260_/_0.2)]";
64 const pushEntry = (entry: FieldDocEntry) => {45 case "boolean":
65 if (entries.length >= maxEntries) {46 return "text-[oklch(0.55_0.18_300)] bg-[oklch(0.55_0.18_300_/_0.07)] border-[oklch(0.55_0.18_300_/_0.15)] dark:text-[oklch(0.78_0.14_300)] dark:bg-[oklch(0.78_0.14_300_/_0.1)] dark:border-[oklch(0.78_0.14_300_/_0.2)]";
66 truncated = true;47 case "array":
67 return;48 return "text-[oklch(0.50_0.14_200)] bg-[oklch(0.50_0.14_200_/_0.07)] border-[oklch(0.50_0.14_200_/_0.15)] dark:text-[oklch(0.75_0.12_200)] dark:bg-[oklch(0.75_0.12_200_/_0.1)] dark:border-[oklch(0.75_0.12_200_/_0.2)]";
68 }49 case "object":
69 entries.push(entry);50 return "text-[oklch(0.55_0.12_75)] bg-[oklch(0.55_0.12_75_/_0.07)] border-[oklch(0.55_0.12_75_/_0.15)] dark:text-[oklch(0.78_0.1_75)] dark:bg-[oklch(0.78_0.1_75_/_0.1)] dark:border-[oklch(0.78_0.1_75_/_0.2)]";
70 };51 case "enum":
71 52 case "union":
72 const walk = (node: unknown, prefix: string, depth: number) => {53 return "text-[oklch(0.50_0.16_30)] bg-[oklch(0.50_0.16_30_/_0.07)] border-[oklch(0.50_0.16_30_/_0.15)] dark:text-[oklch(0.75_0.14_30)] dark:bg-[oklch(0.75_0.14_30_/_0.1)] dark:border-[oklch(0.75_0.14_30_/_0.2)]";
73 if (depth > maxDepth || truncated) return;54 case "null":
74 const shape = asRecord(node);55 return "text-muted-foreground/70";
75 const required = new Set(56 default:
76 Array.isArray(shape.required)57 return "text-muted-foreground/50";
77 ? shape.required.filter((value): value is string => typeof value === "string")58 }
78 : [],59}
79 );60
80 61// ── Constraint badges ───────────────────────────────────────────────────────
81 const properties = asRecord(shape.properties);62
82 for (const [rawKey, child] of Object.entries(properties)) {63function ConstraintBadges({ entry }: { entry: SchemaFieldEntry }) {
83 if (truncated) break;64 const parts: string[] = [];
84 const key = rawKey.trim();65
85 if (!key) continue;66 if (entry.constraints) {
86 const childShape = asRecord(child);67 const c = entry.constraints;
87 const path = prefix ? `${prefix}.${key}` : key;68 if (c.minimum !== undefined) parts.push(`>= ${c.minimum}`);
88 const description = typeof childShape.description === "string"69 if (c.maximum !== undefined) parts.push(`<= ${c.maximum}`);
89 ? childShape.description.trim()70 if (c.exclusiveMinimum !== undefined) parts.push(`> ${c.exclusiveMinimum}`);
90 : "";71 if (c.exclusiveMaximum !== undefined) parts.push(`< ${c.exclusiveMaximum}`);
91 const example = toPreviewValue(childShape.example);72 if (c.minLength !== undefined) parts.push(`minLen: ${c.minLength}`);
92 const defaultValue = toPreviewValue(childShape.default);73 if (c.maxLength !== undefined) parts.push(`maxLen: ${c.maxLength}`);
93 const deprecated = childShape.deprecated === true;74 if (c.pattern) parts.push(`/${c.pattern}/`);
94 const isRequired = required.has(key);75 if (c.minItems !== undefined) parts.push(`minItems: ${c.minItems}`);
95 76 if (c.maxItems !== undefined) parts.push(`maxItems: ${c.maxItems}`);
96 if (description || example || defaultValue || deprecated || isRequired) {77 if (c.uniqueItems) parts.push("unique");
97 pushEntry({78 }
98 path,79
99 ...(isRequired ? { required: true } : {}),80 if (entry.format && !entry.typeLabel.includes(entry.format)) {
100 ...(description ? { description } : {}),81 parts.push(entry.format);
101 ...(example ? { example } : {}),82 }
102 ...(defaultValue ? { defaultValue } : {}),83
103 ...(deprecated ? { deprecated: true } : {}),84 if (parts.length === 0) return null;
104 });85
105 }86 return (
87 <span className="inline-flex items-center gap-1 ml-0.5">
88 {parts.map((p, i) => (
89 <span key={i} className="font-mono text-[9px] text-muted-foreground/65 bg-muted rounded-sm px-1 leading-[1.4]">
90 {p}
91 </span>
92 ))}
93 </span>
94 );
95}
96
97// ── Field row ───────────────────────────────────────────────────────────────
98
99function FieldRow({ entry }: { entry: SchemaFieldEntry }) {
100 return (
101 <div
102 className="flex flex-col gap-1 py-2.5 pr-3.5 border-b border-border/50 last:border-b-0"
103 style={{ paddingLeft: `${entry.depth * 16 + 14}px` }}
104 >
105 {/* Name + type line */}
106 <div className="flex items-center gap-1.5 flex-wrap">
107 <span className="font-mono text-[11px] font-semibold text-foreground leading-tight">
108 {entry.path.split(".").pop()}
109 </span>
110
111 {entry.required ? (
112 <span
113 className="w-1 h-1 rounded-full bg-[oklch(0.65_0.22_25)] dark:bg-[oklch(0.72_0.2_25)] shrink-0"
114 title="required"
115 />
116 ) : null}
117
118 <span
119 className={cn(
120 "font-mono text-[10px] leading-none px-1.5 py-0.5 rounded-[3px] border font-medium",
121 typeColorClasses(entry.type),
122 )}
123 >
124 {entry.typeLabel}
125 </span>
106 126
107 walk(childShape, path, depth + 1);127 {entry.deprecated ? (
128 <span className="font-mono text-[9px] font-medium uppercase tracking-wide text-[oklch(0.6_0.16_75)] dark:text-[oklch(0.78_0.14_75)] bg-[oklch(0.6_0.16_75_/_0.08)] dark:bg-[oklch(0.78_0.14_75_/_0.1)] border border-[oklch(0.6_0.16_75_/_0.18)] dark:border-[oklch(0.78_0.14_75_/_0.2)] rounded-[3px] px-1.5 py-px leading-none">
129 deprecated
130 </span>
131 ) : null}
132
133 <ConstraintBadges entry={entry} />
134 </div>
135
136 {/* Description */}
137 {entry.description ? (
138 <div className="text-[11px] leading-relaxed text-muted-foreground [&_p]:m-0 [&_p+p]:mt-0.5 [&_code]:font-mono [&_code]:text-[10px] [&_code]:bg-muted [&_code]:border [&_code]:border-border/70 [&_code]:rounded-sm [&_code]:px-1 [&_code]:py-px [&_code]:text-terminal-cyan [&_a]:text-primary [&_a]:underline [&_a]:underline-offset-2 [&_a]:decoration-primary/25 hover:[&_a]:decoration-primary/70">
139 <Streamdown plugins={{ code: codePlugin }} controls={false}>{entry.description}</Streamdown>
140 </div>
141 ) : null}
142
143 {/* Enum values */}
144 {entry.enumValues && entry.enumValues.length > 0 && entry.enumValues.length <= 12 ? (
145 <div className="flex flex-wrap gap-1 mt-0.5">
146 {entry.enumValues.map((v, i) => (
147 <code key={i} className="font-mono text-[10px] bg-muted border border-border/60 rounded-[3px] px-1.5 py-px text-foreground/80">
148 {v}
149 </code>
150 ))}
151 </div>
152 ) : null}
153
154 {/* Example / Default */}
155 {(entry.example || entry.defaultValue) ? (
156 <div className="flex flex-wrap gap-2 mt-0.5">
157 {entry.example ? (
158 <span className="inline-flex items-center gap-1">
159 <span className="font-mono text-[9px] uppercase tracking-wider text-muted-foreground/50">example</span>
160 <code className="font-mono text-[10px] text-muted-foreground/85">{entry.example}</code>
161 </span>
162 ) : null}
163 {entry.defaultValue ? (
164 <span className="inline-flex items-center gap-1">
165 <span className="font-mono text-[9px] uppercase tracking-wider text-muted-foreground/50">default</span>
166 <code className="font-mono text-[10px] text-muted-foreground/85">{entry.defaultValue}</code>
167 </span>
168 ) : null}
169 </div>
170 ) : null}
171 </div>
172 );
173}
174
175// ── Schema fields section ───────────────────────────────────────────────────
176
177/** Detect schemas that describe an empty / void result (no useful fields). */
178function isEmptySchema(schemaJson: string | undefined): boolean {
179 if (!schemaJson) return false;
180 try {
181 const parsed = JSON.parse(schemaJson) as Record<string, unknown>;
182 if (parsed.type === "object") {
183 const props = parsed.properties;
184 if (!props || (typeof props === "object" && Object.keys(props as object).length === 0)) {
185 return true;
186 }
108 }187 }
109 };188 return false;
110 189 } catch {
111 walk(schema, "", 0);190 return false;
112 const ordered = [...entries].sort((a, b) => {191 }
113 const requiredOrder = Number(Boolean(b.required)) - Number(Boolean(a.required));
114 if (requiredOrder !== 0) return requiredOrder;
115 return a.path.localeCompare(b.path);
116 });
117 return { entries: ordered, truncated };
118}192}
119 193
120function FieldDocsSection({194function SchemaFieldsSection({
121 label,195 label,
122 entries,196 entries,
123 truncated,197 truncated,
198 schemaJson,
124}: {199}: {
125 label: string;200 label: string;
126 entries: FieldDocEntry[];201 entries: SchemaFieldEntry[];
127 truncated: boolean;202 truncated: boolean;
203 schemaJson?: string;
128}) {204}) {
129 if (entries.length === 0) return null;205 if (entries.length === 0 && !schemaJson) return null;
130 206
131 const collapsedByDefault = entries.length > 8 || truncated;207 const hasEntries = entries.length > 0;
208 const empty = !hasEntries && isEmptySchema(schemaJson);
209 const collapsedByDefault = entries.length > 10 || truncated;
132 210
133 return (211 return (
134 <details className="group" open={!collapsedByDefault}>212 <div className="flex flex-col gap-2">
135 <summary className="mb-1 cursor-pointer select-none text-[10px] font-mono text-muted-foreground/70 group-open:mb-1">213 {/* Section header */}
136 <span className="mr-2 text-[9px] uppercase tracking-wider text-muted-foreground/50">{label}</span>214 <div className="flex items-baseline gap-2">
137 <span>{collapsedByDefault ? `show documented fields (${entries.length})` : `documented fields (${entries.length})`}</span>215 <span className="font-mono text-[9px] font-medium tracking-wider uppercase text-muted-foreground/60">
138 </summary>216 {label}
139 <div className="rounded-md border border-border/50 bg-muted/30 px-2.5 py-2 space-y-1.5">217 </span>
140 {entries.map((entry) => (218 {hasEntries ? (
141 <div key={entry.path} className="text-[11px] leading-relaxed">219 <span className="font-mono text-[10px] text-muted-foreground/50">
142 <div className="font-mono text-foreground/85">220 {entries.length} field{entries.length !== 1 ? "s" : ""}
143 {entry.path}221 {truncated ? "+" : ""}
144 {entry.required ? <span className="ml-1 text-[10px] text-emerald-600 dark:text-emerald-400">required</span> : null}222 </span>
145 </div>
146 {entry.description ? <div className="text-muted-foreground">{entry.description}</div> : null}
147 {entry.example ? <div className="font-mono text-muted-foreground/80">example: {entry.example}</div> : null}
148 {entry.defaultValue ? <div className="font-mono text-muted-foreground/80">default: {entry.defaultValue}</div> : null}
149 {entry.deprecated ? <div className="font-mono text-amber-600 dark:text-amber-400">deprecated</div> : null}
150 </div>
151 ))}
152 {truncated ? (
153 <div className="text-[10px] font-mono text-muted-foreground/70">Showing first {entries.length} documented fields...</div>
154 ) : null}223 ) : null}
155 </div>224 </div>
156 </details>225
226 {/* Field list */}
227 {hasEntries ? (
228 <div className="border border-border rounded-md bg-muted/30 overflow-hidden">
229 {collapsedByDefault ? (
230 <details open={false}>
231 <summary className="cursor-pointer select-none font-mono text-[10px] text-muted-foreground/60 px-3.5 py-2 block transition-opacity hover:opacity-100">
232 Show all fields ({entries.length}{truncated ? "+" : ""})
233 </summary>
234 <div className="flex flex-col">
235 {entries.map((entry, i) => (
236 <FieldRow key={`${entry.path}-${i}`} entry={entry} />
237 ))}
238 {truncated ? (
239 <p className="font-mono text-[10px] text-muted-foreground/50 px-3.5 py-2">
240 Showing first {entries.length} fields...
241 </p>
242 ) : null}
243 </div>
244 </details>
245 ) : (
246 <div className="flex flex-col">
247 {entries.map((entry, i) => (
248 <FieldRow key={`${entry.path}-${i}`} entry={entry} />
249 ))}
250 </div>
251 )}
252 </div>
253 ) : empty ? (
254 <p className="text-[11px] font-mono text-muted-foreground/50 italic pl-0.5">
255 Empty object
256 </p>
257 ) : schemaJson ? (
258 <TypeSignature raw={schemaJson} label="" lang="json" />
259 ) : null}
260
261 {/* Raw schema toggle */}
262 {hasEntries && schemaJson ? (
263 <details className="mt-1">
264 <summary className="cursor-pointer select-none font-mono text-[9px] uppercase tracking-wider text-muted-foreground/50 transition-opacity hover:opacity-80">
265 Raw schema
266 </summary>
267 <div className="mt-1.5">
268 <TypeSignature raw={schemaJson} label="" lang="json" />
269 </div>
270 </details>
271 ) : null}
272 </div>
157 );273 );
158}274}
159 275
276// ── Inline detail (used inside collapsible rows in tree/flat view) ───────────
277
160export function ToolDetail({278export function ToolDetail({
161 tool,279 tool,
162 depth,280 depth,
@@ -167,6 +285,83 @@ export function ToolDetail({ · 4 unmodified lines
167 loading?: boolean;285 loading?: boolean;
168}) {286}) {
169 const insetLeft = depth * 20 + 8 + 16 + 8;287 const insetLeft = depth * 20 + 8 + 16 + 8;
288
289 return (
290 <div style={{ paddingLeft: insetLeft }}>
291 <ToolDetailContent tool={tool} loading={loading} />
292 </div>
293 );
294}
295
296// ── Standalone detail panel (main content area in sidebar layout) ────────────
297
298export function ToolDetailPanel({
299 tool,
300 loading,
301}: {
302 tool: ToolDescriptor;
303 loading?: boolean;
304}) {
305 return (
306 <div className="h-full overflow-y-auto">
307 {/* Header */}
308 <div className="sticky top-0 z-10 bg-background/95 backdrop-blur-sm border-b border-border/40 px-5 py-3">
309 <div className="flex items-center gap-2.5 min-w-0">
310 <Zap className="h-3.5 w-3.5 text-primary/70 shrink-0" />
311 <h2 className="text-[14px] font-mono font-semibold text-foreground truncate">
312 {tool.path}
313 </h2>
314 {tool.approval === "required" ? (
315 <span className="inline-flex items-center gap-0.5 text-[9px] font-mono uppercase tracking-wider text-terminal-amber bg-terminal-amber/8 px-1.5 py-0.5 rounded border border-terminal-amber/15 shrink-0">
316 <ShieldCheck className="h-2.5 w-2.5" />
317 gated
318 </span>
319 ) : null}
320 <div className="ml-auto shrink-0">
321 <CopyButton text={tool.path} />
322 </div>
323 </div>
324 {tool.source ? (
325 <p className="mt-0.5 text-[10px] font-mono text-muted-foreground/50 pl-6">
326 {tool.source}
327 </p>
328 ) : null}
329 </div>
330
331 {/* Body */}
332 <div className="px-5 py-4">
333 <ToolDetailContent tool={tool} loading={loading} />
334 </div>
335 </div>
336 );
337}
338
339// ── Empty state for detail panel ────────────────────────────────────────────
340
341export function ToolDetailEmpty() {
342 return (
343 <div className="h-full flex items-center justify-center">
344 <div className="text-center space-y-2">
345 <div className="h-10 w-10 rounded-full bg-muted/40 flex items-center justify-center mx-auto">
346 <Zap className="h-5 w-5 text-muted-foreground/20" />
347 </div>
348 <p className="text-[13px] text-muted-foreground/50">
349 Select a tool to view its schema
350 </p>
351 </div>
352 </div>
353 );
354}
355
356// ── Shared detail content (used by both inline and panel modes) ─────────────
357
358function ToolDetailContent({
359 tool,
360 loading,
361}: {
362 tool: ToolDescriptor;
363 loading?: boolean;
364}) {
170 const description = tool.description?.trim() ?? "";365 const description = tool.description?.trim() ?? "";
171 const inputHint = tool.display?.input?.trim() ?? "";366 const inputHint = tool.display?.input?.trim() ?? "";
172 const outputHint = tool.display?.output?.trim() ?? "";367 const outputHint = tool.display?.output?.trim() ?? "";
@@ -178,97 +373,75 @@ export function ToolDetail({ · 5 unmodified lines
178 const hasOutputSchema = outputSchemaJson.length > 0 && outputSchemaJson !== "{}";373 const hasOutputSchema = outputSchemaJson.length > 0 && outputSchemaJson !== "{}";
179 const showInputHint = hasInputHint && !hasInputSchema;374 const showInputHint = hasInputHint && !hasInputSchema;
180 const showOutputHint = hasOutputHint && !hasOutputSchema;375 const showOutputHint = hasOutputHint && !hasOutputSchema;
181 const inputFieldDocs = useMemo(376
182 () => collectSchemaFieldDocs(parseSchemaJson(inputSchemaJson), { maxEntries: 24, maxDepth: 4 }),377 const inputFields = useMemo(
378 () => traverseSchema(parseSchemaJson(inputSchemaJson), { maxEntries: 30, maxDepth: 5 }),
183 [inputSchemaJson],379 [inputSchemaJson],
184 );380 );
185 const outputFieldDocs = useMemo(381 const outputFields = useMemo(
186 () => collectSchemaFieldDocs(parseSchemaJson(outputSchemaJson), { maxEntries: 24, maxDepth: 4 }),382 () => traverseSchema(parseSchemaJson(outputSchemaJson), { maxEntries: 30, maxDepth: 5 }),
187 [outputSchemaJson],383 [outputSchemaJson],
188 );384 );
189 const hasInputFieldDocs = inputFieldDocs.entries.length > 0;385
190 const hasOutputFieldDocs = outputFieldDocs.entries.length > 0;
191 const showInputRawSchema = hasInputSchema && !hasInputFieldDocs;
192 const showOutputRawSchema = hasOutputSchema && !hasOutputFieldDocs;
193 const hasDetails = description.length > 0386 const hasDetails = description.length > 0
194 || showInputHint387 || showInputHint
195 || showOutputHint388 || showOutputHint
196 || hasInputSchema389 || hasInputSchema
197 || hasOutputSchema390 || hasOutputSchema;
198 || inputFieldDocs.entries.length > 0
199 || outputFieldDocs.entries.length > 0;
200 const showLoading = Boolean(loading);391 const showLoading = Boolean(loading);
201 392
202 return (393 return (
203 <div className="space-y-2.5 pb-3 pt-1 pr-2" style={{ paddingLeft: insetLeft }}>394 <div className="pt-2 pb-4 flex flex-col gap-4">
395 {/* Loading state */}
204 {showLoading ? (396 {showLoading ? (
205 <div className="space-y-2.5">397 <div className="space-y-3">
206 <Skeleton className="h-3.5 w-64" />398 <Skeleton className="h-3.5 w-72" />
207
208 <div>399 <div>
209 <p className="mb-1 text-[9px] font-mono uppercase tracking-wider text-muted-foreground/50">400 <p className="font-mono text-[9px] font-medium tracking-wider uppercase text-muted-foreground/60">Arguments</p>
210 Arguments401 <Skeleton className="h-20 w-full rounded-md mt-1" />
211 </p>
212 <Skeleton className="h-16 w-full rounded-md" />
213 </div>402 </div>
214
215 <div>403 <div>
216 <p className="mb-1 text-[9px] font-mono uppercase tracking-wider text-muted-foreground/50">404 <p className="font-mono text-[9px] font-medium tracking-wider uppercase text-muted-foreground/60">Returns</p>
217 Returns405 <Skeleton className="h-14 w-full rounded-md mt-1" />
218 </p>
219 <Skeleton className="h-12 w-full rounded-md" />
220 </div>406 </div>
221 </div>407 </div>
222 ) : null}408 ) : null}
223 409
224 {description && (410 {/* Description */}
225 <div className="tool-description text-[12px] leading-relaxed text-muted-foreground">411 {description ? (
226 <Streamdown plugins={{ code: codePlugin }}>{description}</Streamdown>412 <div className="text-[12px] leading-relaxed text-muted-foreground">
413 <Streamdown plugins={{ code: codePlugin }} controls={{ code: true }}>{description}</Streamdown>
227 </div>414 </div>
228 )}415 ) : null}
229 416
230 {showInputHint && <TypeSignature raw={inputHint} label="Arguments" />}417 {/* Type hint fallbacks (when no full schema is available) */}
231 {showOutputHint && <TypeSignature raw={outputHint} label="Returns" />}418 {showInputHint ? <TypeSignature raw={inputHint} label="Arguments" /> : null}
419 {showOutputHint ? <TypeSignature raw={outputHint} label="Returns" /> : null}
232 420
233 {showInputRawSchema ? <TypeSignature raw={inputSchemaJson} label="Input Schema" /> : null}421 {/* Structured schema rendering */}
234 {showOutputRawSchema ? <TypeSignature raw={outputSchemaJson} label="Output Schema" /> : null}
235 {hasInputSchema ? (422 {hasInputSchema ? (
236 <FieldDocsSection423 <SchemaFieldsSection
237 label="Input Field Docs"424 label="Arguments"
238 entries={inputFieldDocs.entries}425 entries={inputFields.entries}
239 truncated={inputFieldDocs.truncated}426 truncated={inputFields.truncated}
427 schemaJson={inputSchemaJson}
240 />428 />
241 ) : null}429 ) : null}
430
242 {hasOutputSchema ? (431 {hasOutputSchema ? (
243 <FieldDocsSection432 <SchemaFieldsSection
244 label="Output Field Docs"433 label="Returns"
245 entries={outputFieldDocs.entries}434 entries={outputFields.entries}
246 truncated={outputFieldDocs.truncated}435 truncated={outputFields.truncated}
436 schemaJson={outputSchemaJson}
247 />437 />
248 ) : null}438 ) : null}
249 {hasInputSchema && hasInputFieldDocs ? (
250 <details>
251 <summary className="cursor-pointer select-none text-[10px] font-mono uppercase tracking-wider text-muted-foreground/60">
252 Show Raw Input Schema
253 </summary>
254 <div className="mt-1">
255 <TypeSignature raw={inputSchemaJson} label="Input Schema" />
256 </div>
257 </details>
258 ) : null}
259 {hasOutputSchema && hasOutputFieldDocs ? (
260 <details>
261 <summary className="cursor-pointer select-none text-[10px] font-mono uppercase tracking-wider text-muted-foreground/60">
262 Show Raw Output Schema
263 </summary>
264 <div className="mt-1">
265 <TypeSignature raw={outputSchemaJson} label="Output Schema" />
266 </div>
267 </details>
268 ) : null}
269 439
440 {/* Empty state */}
270 {!showLoading && !hasDetails ? (441 {!showLoading && !hasDetails ? (
271 <p className="text-[11px] text-muted-foreground/60">No description or type signatures available yet.</p>442 <p className="text-[11px] text-muted-foreground/50 italic">
443 No description or schema available.
444 </p>
272 ) : null}445 ) : null}
273 </div>446 </div>
274 );447 );
executor/apps/web/src/components/tools/explorer/type-signature.tsx+43−11
@@ -2,9 +2,23 @@ · 1 unmodified line
2 2
3import { useMemo } from "react";3import { useMemo } from "react";
4import { useQuery as useTanstackQuery } from "@tanstack/react-query";4import { useQuery as useTanstackQuery } from "@tanstack/react-query";
5import { cn } from "@/lib/utils";
6import { CopyButton } from "./copy-button";
5 7
6function prettyType(raw: string): string {8function prettyJson(raw: string): string {
7 const trimmed = raw.trim();9 const trimmed = raw.trim();
10
11 // If it looks like JSON, try to parse + re-format
12 if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
13 try {
14 const parsed = JSON.parse(trimmed);
15 return JSON.stringify(parsed, null, 2);
16 } catch {
17 // fall through
18 }
19 }
20
21 // Otherwise use the simple TS-like formatter
8 if (trimmed.includes("\n") || trimmed.length < 50) {22 if (trimmed.includes("\n") || trimmed.length < 50) {
9 return trimmed;23 return trimmed;
10 }24 }
@@ -47,15 +61,17 @@ function prettyType(raw: string): string { · 36 unmodified lines
47 return output;61 return output;
48}62}
49 63
50export function TypeSignature({ raw, label }: { raw: string; label: string }) {64export function TypeSignature({ raw, label, lang }: { raw: string; label: string; lang?: string }) {
51 const formatted = useMemo(() => prettyType(raw), [raw]);65 const isJson = raw.trim().startsWith("{") || raw.trim().startsWith("[");
66 const effectiveLang = lang ?? (isJson ? "json" : "typescript");
67 const formatted = useMemo(() => prettyJson(raw), [raw]);
52 68
53 const { data: highlightedHtml } = useTanstackQuery<string>({69 const { data: highlightedHtml } = useTanstackQuery<string>({
54 queryKey: ["type-signature", formatted],70 queryKey: ["type-signature", formatted, effectiveLang],
55 queryFn: async () => {71 queryFn: async () => {
56 const { codeToHtml } = await import("shiki");72 const { codeToHtml } = await import("shiki");
57 return codeToHtml(formatted, {73 return codeToHtml(formatted, {
58 lang: "typescript",74 lang: effectiveLang,
59 themes: { light: "github-light", dark: "github-dark" },75 themes: { light: "github-light", dark: "github-dark" },
60 });76 });
61 },77 },
@@ -63,17 +79,33 @@ export function TypeSignature({ raw, label }: { raw: string; label: string }) { · 1 unmodified line
63 });79 });
64 80
65 return (81 return (
66 <div>82 <div className="relative group/schema">
67 <p className="mb-1 text-[9px] font-mono uppercase tracking-wider text-muted-foreground/50">83 {label ? (
68 {label}84 <div className="flex items-center justify-between mb-1">
69 </p>85 <p className="font-mono text-[9px] font-medium tracking-wider uppercase text-muted-foreground/60">
86 {label}
87 </p>
88 <CopyButton
89 text={formatted}
90 className="opacity-0 group-hover/schema:opacity-100 transition-opacity"
91 />
92 </div>
93 ) : (
94 <CopyButton
95 text={formatted}
96 className="absolute right-2 top-2 opacity-0 group-hover/schema:opacity-100 transition-opacity z-10"
97 />
98 )}
70 {highlightedHtml ? (99 {highlightedHtml ? (
71 <div100 <div
72 className="type-signature text-[11px] leading-relaxed bg-muted/40 border border-border/40 rounded-md px-2.5 py-2 overflow-x-auto [&_pre]:!bg-transparent [&_pre]:!m-0 [&_pre]:!p-0 [&_code]:!text-[11px] [&_code]:!leading-relaxed"101 className={cn(
102 "text-[10.5px] leading-[1.65] bg-muted/40 border border-border/40 rounded-md px-3.5 py-2.5 overflow-x-auto",
103 "[&_pre]:!bg-transparent [&_pre]:!m-0 [&_pre]:!p-0 [&_code]:!text-[10.5px] [&_code]:!leading-[1.65]",
104 )}
73 dangerouslySetInnerHTML={{ __html: highlightedHtml }}105 dangerouslySetInnerHTML={{ __html: highlightedHtml }}
74 />106 />
75 ) : (107 ) : (
76 <pre className="text-[11px] font-mono leading-relaxed text-foreground/80 bg-muted/40 border border-border/40 rounded-md px-2.5 py-2 overflow-x-auto whitespace-pre">108 <pre className="font-mono text-[10.5px] leading-[1.65] bg-muted/40 border border-border/40 rounded-md px-3.5 py-2.5 overflow-x-auto text-foreground/80 whitespace-pre m-0">
77 {formatted}109 {formatted}
78 </pre>110 </pre>
79 )}111 )}
executor/apps/web/src/components/tools/view.tsx+2−19
@@ -1,15 +1,13 @@
1"use client";1"use client";
2 2
3import { useCallback, useMemo, useRef, useState } from "react";3import { useCallback, useMemo, useRef, useState } from "react";
4import { Plus } from "lucide-react";
5import { Card, CardContent } from "@/components/ui/card";4import { Card, CardContent } from "@/components/ui/card";
6import { Button } from "@/components/ui/button";
7import { Skeleton } from "@/components/ui/skeleton";5import { Skeleton } from "@/components/ui/skeleton";
8import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";6import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
9import { PageHeader } from "@/components/page-header";7import { PageHeader } from "@/components/page-header";
10import { ToolExplorer } from "@/components/tools/explorer";8import { ToolExplorer } from "@/components/tools/explorer";
11import { TaskComposer } from "@/components/tasks/task-composer";9import { TaskComposer } from "@/components/tasks/task-composer";
12import { AddSourceDialog } from "@/components/tools/add/source-dialog";10
13import { CredentialsPanel } from "@/components/tools/credentials";11import { CredentialsPanel } from "@/components/tools/credentials";
14import { ConnectionFormDialog } from "@/components/tools/connection/form-dialog";12import { ConnectionFormDialog } from "@/components/tools/connection/form-dialog";
15import { PoliciesPanel } from "@/components/tools/policies";13import { PoliciesPanel } from "@/components/tools/policies";
@@ -498,22 +496,7 @@ export function ToolsView({ · 482 unmodified lines
498 || inventoryStatus?.state === "rebuilding"496 || inventoryStatus?.state === "rebuilding"
499 || inventoryStatus?.state === "initializing"497 || inventoryStatus?.state === "initializing"
500 }498 }
501 addSourceAction={499 onSourceAdded={handleSourceAdded}
502 <AddSourceDialog
503 existingSourceNames={existingSourceNames}
504 onSourceAdded={handleSourceAdded}
505 trigger={
506 <Button
507 variant="default"
508 size="sm"
509 className="h-8 text-[11px]"
510 >
511 <Plus className="h-3.5 w-3.5 mr-1.5" />
512 Add Source
513 </Button>
514 }
515 />
516 }
517 />500 />
518 </div>501 </div>
519 </CardContent>502 </CardContent>
executor/apps/web/src/lib/tool/schema-traverse.ts+385−0
@@ -0,0 +1,385 @@
1/**
2 * schema-traverse.ts
3 *
4 * Structured JSON Schema walker using json-schema-traverse.
5 * Produces a flat list of documented field entries for rendering,
6 * handling properties, items, oneOf/anyOf/allOf, enums, and nested objects.
7 */
8
9import traverse from "json-schema-traverse";
10
11// ── Types ────────────────────────────────────────────────────────────────────
12
13export type SchemaFieldType =
14 | "string"
15 | "number"
16 | "integer"
17 | "boolean"
18 | "array"
19 | "object"
20 | "null"
21 | "enum"
22 | "union"
23 | "unknown";
24
25export interface SchemaFieldEntry {
26 /** Dot-delimited path, e.g. "config.retries" */
27 path: string;
28 /** Resolved JSON Schema type */
29 type: SchemaFieldType;
30 /** Human-readable type label (e.g. "string[]", "string | number") */
31 typeLabel: string;
32 /** Whether this field is required by its parent */
33 required: boolean;
34 /** Description from the schema */
35 description?: string;
36 /** Example value (serialized) */
37 example?: string;
38 /** Default value (serialized) */
39 defaultValue?: string;
40 /** Whether the field is marked deprecated */
41 deprecated: boolean;
42 /** Enum values if present */
43 enumValues?: string[];
44 /** Format hint (e.g. "uri", "date-time", "email") */
45 format?: string;
46 /** Nesting depth (0 = top-level) */
47 depth: number;
48 /** If array, the item type label */
49 itemType?: string;
50 /** Constraints: minimum, maximum, minLength, maxLength, pattern */
51 constraints?: SchemaConstraints;
52}
53
54export interface SchemaConstraints {
55 minimum?: number;
56 maximum?: number;
57 exclusiveMinimum?: number;
58 exclusiveMaximum?: number;
59 minLength?: number;
60 maxLength?: number;
61 pattern?: string;
62 minItems?: number;
63 maxItems?: number;
64 uniqueItems?: boolean;
65}
66
67export interface TraverseOptions {
68 maxDepth?: number;
69 maxEntries?: number;
70}
71
72// ── Helpers ──────────────────────────────────────────────────────────────────
73
74function asRecord(v: unknown): Record<string, unknown> {
75 return v && typeof v === "object" && !Array.isArray(v)
76 ? (v as Record<string, unknown>)
77 : {};
78}
79
80function toPreview(v: unknown): string | undefined {
81 if (v === undefined) return undefined;
82 if (typeof v === "string") {
83 const t = v.trim();
84 return t ? (t.length > 120 ? `${t.slice(0, 120)}...` : t) : undefined;
85 }
86 try {
87 const s = JSON.stringify(v);
88 return s && s.length > 0
89 ? s.length > 120
90 ? `${s.slice(0, 120)}...`
91 : s
92 : undefined;
93 } catch {
94 return undefined;
95 }
96}
97
98function resolveTypeLabel(schema: Record<string, unknown>): {
99 type: SchemaFieldType;
100 label: string;
101 itemType?: string;
102} {
103 // Enum
104 if (Array.isArray(schema.enum) && schema.enum.length > 0) {
105 return { type: "enum", label: schema.enum.map((v) => JSON.stringify(v)).join(" | ") };
106 }
107
108 // Const
109 if (schema.const !== undefined) {
110 return { type: "enum", label: JSON.stringify(schema.const) };
111 }
112
113 // oneOf / anyOf union
114 const union = (schema.oneOf ?? schema.anyOf) as unknown[] | undefined;
115 if (Array.isArray(union) && union.length > 0) {
116 const parts = union.map((s) => {
117 const sub = asRecord(s);
118 return resolveTypeLabel(sub).label;
119 });
120 return { type: "union", label: parts.join(" | ") };
121 }
122
123 // allOf intersection
124 const allOf = schema.allOf as unknown[] | undefined;
125 if (Array.isArray(allOf) && allOf.length > 0) {
126 const parts = allOf.map((s) => {
127 const sub = asRecord(s);
128 return resolveTypeLabel(sub).label;
129 });
130 return { type: "object", label: parts.join(" & ") };
131 }
132
133 // Type array (e.g. ["string", "null"])
134 if (Array.isArray(schema.type)) {
135 const types = schema.type as string[];
136 if (types.length === 2 && types.includes("null")) {
137 const nonNull = types.find((t) => t !== "null") ?? "unknown";
138 return { type: nonNull as SchemaFieldType, label: `${nonNull} | null` };
139 }
140 return { type: "union", label: types.join(" | ") };
141 }
142
143 const rawType = typeof schema.type === "string" ? schema.type : undefined;
144
145 // Array with items
146 if (rawType === "array") {
147 const items = asRecord(schema.items);
148 if (Object.keys(items).length > 0) {
149 const inner = resolveTypeLabel(items);
150 return { type: "array", label: `${inner.label}[]`, itemType: inner.label };
151 }
152 return { type: "array", label: "array", itemType: undefined };
153 }
154
155 // Object
156 if (rawType === "object") {
157 return { type: "object", label: "object" };
158 }
159
160 // String with format
161 if (rawType === "string" && typeof schema.format === "string") {
162 return { type: "string", label: `string<${schema.format}>` };
163 }
164
165 // Simple type
166 if (rawType) {
167 return { type: rawType as SchemaFieldType, label: rawType };
168 }
169
170 return { type: "unknown", label: "unknown" };
171}
172
173function extractConstraints(schema: Record<string, unknown>): SchemaConstraints | undefined {
174 const c: SchemaConstraints = {};
175 let hasAny = false;
176
177 for (const [key, field] of [
178 ["minimum", "minimum"],
179 ["maximum", "maximum"],
180 ["exclusiveMinimum", "exclusiveMinimum"],
181 ["exclusiveMaximum", "exclusiveMaximum"],
182 ["minLength", "minLength"],
183 ["maxLength", "maxLength"],
184 ["minItems", "minItems"],
185 ["maxItems", "maxItems"],
186 ] as const) {
187 if (typeof schema[field] === "number") {
188 (c as Record<string, unknown>)[key] = schema[field];
189 hasAny = true;
190 }
191 }
192
193 if (typeof schema.pattern === "string") {
194 c.pattern = schema.pattern;
195 hasAny = true;
196 }
197 if (schema.uniqueItems === true) {
198 c.uniqueItems = true;
199 hasAny = true;
200 }
201
202 return hasAny ? c : undefined;
203}
204
205// ── Main traversal ──────────────────────────────────────────────────────────
206
207export function traverseSchema(
208 schema: Record<string, unknown>,
209 options: TraverseOptions = {},
210): { entries: SchemaFieldEntry[]; truncated: boolean } {
211 const maxDepth = options.maxDepth ?? 5;
212 const maxEntries = options.maxEntries ?? 40;
213 const entries: SchemaFieldEntry[] = [];
214 let truncated = false;
215
216 // Use json-schema-traverse to walk all sub-schemas
217 // We track the JSON pointer path to compute our dot-notation path
218 const requiredSets = new Map<string, Set<string>>();
219
220 // Pre-compute required sets for all object nodes
221 traverse(schema, {
222 cb: (subSchema, _jsonPtr, _rootSchema, _parentJsonPtr, _parentKeyword, _parentSchema, _keyIndex) => {
223 const node = asRecord(subSchema);
224 if (Array.isArray(node.required)) {
225 const ptr = _jsonPtr || "";
226 requiredSets.set(
227 ptr,
228 new Set(
229 (node.required as unknown[]).filter((v): v is string => typeof v === "string"),
230 ),
231 );
232 }
233 },
234 });
235
236 // Now do a targeted walk ourselves for rendering, using json-schema-traverse
237 // for validation but our own recursive walk for the rendering entries.
238 // This gives us more control over depth, path naming, and entry construction.
239
240 const walk = (
241 node: unknown,
242 prefix: string,
243 depth: number,
244 parentRequiredKeys: Set<string>,
245 ) => {
246 if (depth > maxDepth || truncated) return;
247 const shape = asRecord(node);
248
249 // Collect required set for this node
250 const requiredKeys = new Set(
251 Array.isArray(shape.required)
252 ? (shape.required as unknown[]).filter((v): v is string => typeof v === "string")
253 : [],
254 );
255
256 // Walk properties
257 const properties = asRecord(shape.properties);
258 for (const [rawKey, child] of Object.entries(properties)) {
259 if (truncated) break;
260 const key = rawKey.trim();
261 if (!key) continue;
262
263 const childShape = asRecord(child);
264 const path = prefix ? `${prefix}.${key}` : key;
265 const { type, label, itemType } = resolveTypeLabel(childShape);
266 const description =
267 typeof childShape.description === "string"
268 ? childShape.description.trim() || undefined
269 : undefined;
270 const example = toPreview(childShape.example);
271 const defaultValue = toPreview(childShape.default);
272 const deprecated = childShape.deprecated === true;
273 const isRequired = parentRequiredKeys.has(key) || requiredKeys.has(key);
274 const format =
275 typeof childShape.format === "string" ? childShape.format : undefined;
276 const enumValues = Array.isArray(childShape.enum)
277 ? (childShape.enum as unknown[]).map((v) => JSON.stringify(v))
278 : undefined;
279 const constraints = extractConstraints(childShape);
280
281 if (entries.length >= maxEntries) {
282 truncated = true;
283 break;
284 }
285
286 entries.push({
287 path,
288 type,
289 typeLabel: label,
290 required: isRequired,
291 description,
292 example,
293 defaultValue,
294 deprecated,
295 enumValues,
296 format,
297 depth,
298 itemType,
299 constraints,
300 });
301
302 // Recurse into nested objects
303 if (type === "object" || asRecord(childShape.properties) && Object.keys(asRecord(childShape.properties)).length > 0) {
304 walk(childShape, path, depth + 1, requiredKeys);
305 }
306
307 // Recurse into array items if they have properties
308 if (type === "array" && childShape.items) {
309 const itemShape = asRecord(childShape.items);
310 if (Object.keys(asRecord(itemShape.properties)).length > 0) {
311 walk(itemShape, `${path}[]`, depth + 1, new Set<string>());
312 }
313 }
314
315 // Recurse into oneOf/anyOf variants that have properties
316 const variants = (childShape.oneOf ?? childShape.anyOf) as unknown[] | undefined;
317 if (Array.isArray(variants)) {
318 for (const variant of variants) {
319 const variantShape = asRecord(variant);
320 if (Object.keys(asRecord(variantShape.properties)).length > 0) {
321 walk(variantShape, path, depth + 1, new Set<string>());
322 }
323 }
324 }
325 }
326
327 // Handle top-level oneOf/anyOf/allOf at any node if there are no direct properties
328 if (Object.keys(properties).length === 0) {
329 const composites = [
330 ...(Array.isArray(shape.oneOf) ? (shape.oneOf as unknown[]) : []),
331 ...(Array.isArray(shape.anyOf) ? (shape.anyOf as unknown[]) : []),
332 ...(Array.isArray(shape.allOf) ? (shape.allOf as unknown[]) : []),
333 ];
334 for (const comp of composites) {
335 walk(comp, prefix, depth, parentRequiredKeys);
336 }
337 }
338 };
339
340 walk(schema, "", 0, new Set<string>());
341
342 // Preserve schema traversal order so parent/child fields stay grouped.
343 return { entries, truncated };
344}
345
346/**
347 * Summarize a JSON Schema into a brief one-line type signature.
348 * e.g. "{ name: string, age?: number, tags: string[] }"
349 */
350export function schemaToTypeHint(schema: Record<string, unknown>, maxLength = 120): string {
351 const properties = asRecord(schema.properties);
352 const requiredKeys = new Set(
353 Array.isArray(schema.required)
354 ? (schema.required as unknown[]).filter((v): v is string => typeof v === "string")
355 : [],
356 );
357
358 const keys = Object.keys(properties);
359 if (keys.length === 0) {
360 const { label } = resolveTypeLabel(schema);
361 return label;
362 }
363
364 const parts: string[] = [];
365 for (const key of keys) {
366 const childShape = asRecord(properties[key]);
367 const { label } = resolveTypeLabel(childShape);
368 const optional = requiredKeys.has(key) ? "" : "?";
369 parts.push(`${key}${optional}: ${label}`);
370 }
371
372 const joined = `{ ${parts.join(", ")} }`;
373 if (joined.length <= maxLength) return joined;
374
375 // Truncate to fit
376 let result = "{ ";
377 for (let i = 0; i < parts.length; i++) {
378 const next = result + parts[i] + (i < parts.length - 1 ? ", " : " }");
379 if (next.length > maxLength - 6) {
380 return `${result}... }`;
381 }
382 result = i < parts.length - 1 ? result + parts[i] + ", " : next;
383 }
384 return result;
385}
executor/infra/.gitignore+0−2
@@ -1,2 +0,0 @@
1.sst
2.pulumi
executor/infra/README.md+0−122
@@ -1,122 +0,0 @@
1# Executor IaC (SST)
2
3This directory contains the production Infrastructure as Code setup for `executor/`.
4
5It uses SST (v3) as the deployment framework and Pulumi providers/resources under the hood.
6
7## What this manages
8
9- Cloudflare runtime wiring for sandbox execution (via `setup:prod:cloudflare` command resource)
10- Convex production env synchronization (via `setup:prod:env` command resource)
11- Convex production deploy (optional command resource)
12- Production doctor verification (`doctor:prod`) after apply
13- Stripe catalog resources (optional): product, recurring price, webhook endpoint
14- Vercel project + environment variables (optional)
15
16WorkOS and Convex are managed as code through scripted command resources because they do not have first-class native Pulumi resource coverage in this repo workflow.
17
18## Prerequisites
19
20- SST CLI login/config ready for your chosen stage
21- Cloudflare credentials configured for SST/Pulumi deployment backend
22- Local tools available:
23 - `bun`
24 - `bunx convex`
25 - `bunx wrangler`
26
27## Install
28
29From `executor/infra`:
30
31```bash
32bun install
33```
34
35## Configure
36
37This stack resolves values in this order:
38
391. SST/Pulumi stage config
402. Shell env (`process.env`)
413. Existing Convex production env (`bunx convex env list --prod`) when `IAC_USE_CONVEX_ENV_DISCOVERY` is not `0`
42
43So if your Convex production env is already populated, you only need minimal bootstrap values.
44
45Minimal bootstrap env for baseline deploy:
46
47```bash
48# Convex API URL (if not already present in Convex prod env)
49export CONVEX_URL=https://<deployment>.convex.cloud
50```
51
52If Convex prod env is empty/new, also provide WorkOS + Stripe + runtime vars (or set them via SST secrets/config before deploy).
53
54Cloudflare auth is handled by `wrangler` when the Cloudflare setup command runs, so make sure `wrangler whoami` works in your shell.
55
56Optional toggles (defaults shown):
57
58```bash
59export IAC_MANAGE_CLOUDFLARE_RUNTIME=true # default true
60export IAC_MANAGE_CONVEX_ENV=true # default true
61export IAC_DEPLOY_CONVEX_FUNCTIONS=true # default true
62export IAC_MANAGE_VERCEL_PROJECT=false # default false
63export IAC_MANAGE_STRIPE_CATALOG=false # default false
64```
65
66If `IAC_MANAGE_STRIPE_CATALOG=true`, also set:
67
68```bash
69export IAC_STRIPE_UNIT_AMOUNT=2000
70export IAC_STRIPE_INTERVAL=month
71export IAC_STRIPE_CURRENCY=usd
72```
73
74If `IAC_MANAGE_VERCEL_PROJECT=true`, also set:
75
76```bash
77export VERCEL_API_TOKEN=<value>
78export VERCEL_TEAM=<team-id-or-slug> # optional
79export VERCEL_PROJECT_NAME=executor-web # optional
80export VERCEL_GIT_REPO=owner/repo # optional
81```
82
83## Deploy
84
85```bash
86sst install
87bun run deploy
88```
89
90From `executor/`, prefer the guided deploy runner:
91
92```bash
93# Plan only (no changes)
94bun run deploy:prod
95
96# Apply all steps
97bun run deploy:prod --apply
98
99# Apply selected steps
100bun run deploy:prod --apply --only cloudflare,doctor
101```
102
103For first-time initialization of a fresh production deployment from `executor/`:
104
105```bash
106bun run setup:prod:cloudflare --deploy
107bun run setup:prod:env --from-env --strict
108```
109
110## Helpful outputs
111
112The stack returns outputs including:
113
114- `doctorCommand`
115- `stripePriceId`
116- `vercelProjectId`
117
118## Notes
119
120- `doctor:prod` remains the final correctness gate.
121- Optional billing URLs can be set as config and will be propagated to Convex env.
122- If you disable a managed area (`manageVercelProject`, `manageStripeCatalog`, etc), ensure required values are supplied by config/secrets instead.
executor/infra/package.json+0−26
@@ -1,26 +0,0 @@
1{
2 "name": "executor-infra",
3 "private": true,
4 "type": "module",
5 "scripts": {
6 "dev": "sst dev",
7 "deploy": "sst deploy",
8 "remove": "sst remove",
9 "diff": "sst diff",
10 "refresh": "sst refresh",
11 "typecheck": "bunx --package @typescript/native-preview tsgo --noEmit -p tsconfig.json",
12 "typecheck:slow": "bunx tsc --noEmit -p tsconfig.json",
13 "clean": "rm -rf node_modules .turbo"
14 },
15 "dependencies": {
16 "@pulumi/command": "^1.1.3",
17 "@pulumi/pulumi": "^3.220.0",
18 "@pulumiverse/vercel": "^4.5.0",
19 "pulumi-stripe": "^0.0.26",
20 "sst": "^3.17.38"
21 },
22 "devDependencies": {
23 "@types/node": "^24.6.2",
24 "typescript": "^5.9.3"
25 }
26}
executor/infra/sst.config.ts+0−572
@@ -1,572 +0,0 @@
1/// <reference path="./.sst/platform/config.d.ts" />
2
3function toSiteUrl(convexUrl: string): string {
4 if (convexUrl.includes(".convex.cloud")) {
5 return convexUrl.replace(".convex.cloud", ".convex.site");
6 }
7 return convexUrl;
8}
9
10function compact<T>(values: Array<T | null | undefined>): T[] {
11 return values.filter((value): value is T => value !== null && value !== undefined);
12}
13
14function parseConvexEnvList(raw: string): Map<string, string> {
15 const env = new Map<string, string>();
16 for (const line of raw.split("\n")) {
17 const trimmed = line.trim();
18 if (!trimmed || trimmed.startsWith("#")) {
19 continue;
20 }
21
22 const eqIndex = trimmed.indexOf("=");
23 if (eqIndex <= 0) {
24 continue;
25 }
26
27 const key = trimmed.slice(0, eqIndex).trim();
28 const value = trimmed.slice(eqIndex + 1);
29 if (key.length > 0) {
30 env.set(key, value);
31 }
32 }
33 return env;
34}
35
36function loadConvexEnv(executorRoot: string, spawnSync: any): Map<string, string> {
37 if (process.env.IAC_USE_CONVEX_ENV_DISCOVERY === "0") {
38 return new Map<string, string>();
39 }
40
41 const listed = spawnSync("bunx", ["convex", "env", "list", "--prod"], {
42 cwd: executorRoot,
43 env: process.env,
44 encoding: "utf8",
45 });
46
47 if (listed.status !== 0) {
48 return new Map<string, string>();
49 }
50
51 return parseConvexEnvList(listed.stdout ?? "");
52}
53
54function createResolver(config: any, pulumi: any, convexEnv: Map<string, string>) {
55 const readText = (configKey: string, envKey: string): string | undefined => {
56 const cfg = config.get(configKey);
57 if (cfg && cfg.trim().length > 0) {
58 return cfg.trim();
59 }
60
61 const env = process.env[envKey];
62 if (env && env.trim().length > 0) {
63 return env.trim();
64 }
65
66 const discovered = convexEnv.get(envKey);
67 if (discovered && discovered.trim().length > 0) {
68 return discovered.trim();
69 }
70
71 return undefined;
72 };
73
74 const readSecret = (configKey: string, envKey: string): any => {
75 const cfg = config.getSecret(configKey);
76 if (cfg) {
77 return cfg;
78 }
79
80 const text = readText(configKey, envKey);
81 return text ? pulumi.secret(text) : undefined;
82 };
83
84 const requireText = (configKey: string, envKey: string): string => {
85 const value = readText(configKey, envKey);
86 if (!value) {
87 throw new Error(`Missing required value '${configKey}' (or env '${envKey}')`);
88 }
89 return value;
90 };
91
92 const requireSecret = (configKey: string, envKey: string): any => {
93 const value = readSecret(configKey, envKey);
94 if (!value) {
95 throw new Error(`Missing required secret '${configKey}' (or env '${envKey}')`);
96 }
97 return value;
98 };
99
100 const readBool = (configKey: string, envKey: string, fallback: boolean): boolean => {
101 const cfg = config.getBoolean(configKey);
102 if (cfg !== undefined) {
103 return cfg;
104 }
105
106 const env = process.env[envKey]?.trim().toLowerCase();
107 if (!env) {
108 return fallback;
109 }
110
111 if (["1", "true", "yes", "on"].includes(env)) {
112 return true;
113 }
114 if (["0", "false", "no", "off"].includes(env)) {
115 return false;
116 }
117 return fallback;
118 };
119
120 return {
121 readText,
122 readSecret,
123 requireText,
124 requireSecret,
125 readBool,
126 };
127}
128
129function setupStripe(args: {
130 manageStripeCatalog: boolean;
131 resolver: ReturnType<typeof createResolver>;
132 stripe: any;
133 config: any;
134 stage: string;
135 convexSiteUrl: string;
136}) {
137 const { manageStripeCatalog, resolver, stripe, config, stage, convexSiteUrl } = args;
138
139 let stripePriceId: any = resolver.readText("stripePriceId", "STRIPE_PRICE_ID");
140 let stripeWebhookSecret: any = resolver.readSecret("stripeWebhookSecret", "STRIPE_WEBHOOK_SECRET");
141 const stripeSecretKey = resolver.readSecret("stripeSecretKey", "STRIPE_SECRET_KEY");
142
143 let stripeProductResource: any;
144 if (manageStripeCatalog) {
145 const stripeProvider = new stripe.Provider("stripe-provider", {
146 apiKey: resolver.requireSecret("stripeSecretKey", "STRIPE_SECRET_KEY"),
147 });
148
149 const unitAmountRaw = resolver.requireText("stripeUnitAmount", "IAC_STRIPE_UNIT_AMOUNT");
150 const unitAmount = Number.parseInt(unitAmountRaw, 10);
151 if (!Number.isFinite(unitAmount) || unitAmount <= 0) {
152 throw new Error(`Invalid stripeUnitAmount '${unitAmountRaw}'`);
153 }
154
155 const currency = resolver.readText("stripeCurrency", "IAC_STRIPE_CURRENCY") ?? "usd";
156 const interval = resolver.readText("stripeInterval", "IAC_STRIPE_INTERVAL") ?? "month";
157 const lookupKey = resolver.readText("stripeLookupKey", "IAC_STRIPE_LOOKUP_KEY") ?? "executor_team_seat_monthly";
158 const productName = resolver.readText("stripeProductName", "IAC_STRIPE_PRODUCT_NAME") ?? "Executor Team Seat";
159 const productDescription =
160 resolver.readText("stripeProductDescription", "IAC_STRIPE_PRODUCT_DESCRIPTION")
161 ?? "Per-seat subscription for Executor organizations.";
162
163 stripeProductResource = new stripe.Product(
164 "executor-seat-product",
165 {
166 name: productName,
167 description: productDescription,
168 active: true,
169 metadata: { managedBy: "sst", stage },
170 },
171 { provider: stripeProvider },
172 );
173
174 const stripePrice = new stripe.Price(
175 "executor-seat-price",
176 {
177 product: stripeProductResource.id,
178 currency,
179 unitAmount,
180 lookupKey,
181 recurring: { interval },
182 metadata: { managedBy: "sst", stage },
183 },
184 { provider: stripeProvider },
185 );
186 stripePriceId = stripePrice.id;
187
188 const webhookUrl = resolver.readText("stripeWebhookUrl", "IAC_STRIPE_WEBHOOK_URL") ?? `${convexSiteUrl}/stripe/webhook`;
189 const webhookEvents =
190 (config.getObject("stripeWebhookEvents") as string[] | undefined)
191 ?? [
192 "checkout.session.completed",
193 "customer.subscription.created",
194 "customer.subscription.updated",
195 "customer.subscription.deleted",
196 "invoice.paid",
197 "invoice.payment_failed",
198 ];
199
200 const webhook = new stripe.WebhookEndpoint(
201 "executor-billing-webhook",
202 {
203 url: webhookUrl,
204 enabledEvents: webhookEvents,
205 description: `Executor billing webhook (${stage})`,
206 },
207 { provider: stripeProvider },
208 );
209
210 stripeWebhookSecret = webhook.secret;
211 }
212
213 return {
214 stripePriceId,
215 stripeWebhookSecret,
216 stripeSecretKey,
217 stripeProductResource,
218 };
219}
220
221function setupCloudflareRuntime(args: {
222 enabled: boolean;
223 resolver: ReturnType<typeof createResolver>;
224 pulumi: any;
225 command: any;
226 convexUrl: string;
227 executorRoot: string;
228}) {
229 const { enabled, resolver, pulumi, command, convexUrl, executorRoot } = args;
230 if (!enabled) {
231 return undefined;
232 }
233
234 const runUrl = resolver.readText("cloudflareSandboxRunUrl", "CLOUDFLARE_SANDBOX_RUN_URL");
235 const authToken = resolver.readSecret("cloudflareSandboxAuthToken", "CLOUDFLARE_SANDBOX_AUTH_TOKEN");
236 const internalToken = resolver.readSecret("executorInternalToken", "EXECUTOR_INTERNAL_TOKEN");
237
238 const runUrlArg = runUrl ? pulumi.interpolate` --run-url ${runUrl}` : "";
239 const authArg = authToken ? pulumi.interpolate` --auth-token ${authToken}` : "";
240 const internalArg = internalToken ? pulumi.interpolate` --internal-token ${internalToken}` : "";
241
242 const setupCmd = pulumi.interpolate`bun run setup:prod:cloudflare --deploy --no-doctor --convex-url ${convexUrl}${runUrlArg}${authArg}${internalArg}`;
243
244 return new command.local.Command("executor-cloudflare-runtime", {
245 create: setupCmd,
246 update: setupCmd,
247 dir: executorRoot,
248 triggers: [runUrl ?? "", convexUrl, authToken ?? "", internalToken ?? ""],
249 });
250}
251
252function setupConvexEnvSync(args: {
253 enabled: boolean;
254 resolver: ReturnType<typeof createResolver>;
255 command: any;
256 executorRoot: string;
257 cloudflareSetup: any;
258 stripeSecretKey: any;
259 stripeWebhookSecret: any;
260 stripePriceId: any;
261}) {
262 const {
263 enabled,
264 resolver,
265 command,
266 executorRoot,
267 cloudflareSetup,
268 stripeSecretKey,
269 stripeWebhookSecret,
270 stripePriceId,
271 } = args;
272 if (!enabled) {
273 return undefined;
274 }
275
276 const workosClientId = resolver.requireText("workosClientId", "WORKOS_CLIENT_ID");
277 const workosApiKey = resolver.requireSecret("workosApiKey", "WORKOS_API_KEY");
278 const workosWebhookSecret = resolver.requireSecret("workosWebhookSecret", "WORKOS_WEBHOOK_SECRET");
279 const workosCookiePassword = resolver.requireSecret("workosCookiePassword", "WORKOS_COOKIE_PASSWORD");
280 const mcpAuthorizationServer =
281 resolver.readText("mcpAuthorizationServer", "MCP_AUTHORIZATION_SERVER")
282 ?? resolver.readText("mcpAuthorizationServer", "MCP_AUTHORIZATION_SERVER_URL");
283 if (!mcpAuthorizationServer) {
284 throw new Error("Missing MCP authorization server (MCP_AUTHORIZATION_SERVER or MCP_AUTHORIZATION_SERVER_URL)");
285 }
286
287 if (!stripeSecretKey) {
288 throw new Error("Missing stripeSecretKey (or STRIPE_SECRET_KEY)");
289 }
290 if (!stripePriceId) {
291 throw new Error("Missing stripePriceId (or STRIPE_PRICE_ID)");
292 }
293 if (!stripeWebhookSecret) {
294 throw new Error("Missing stripeWebhookSecret (or STRIPE_WEBHOOK_SECRET)");
295 }
296
297 const billingSuccessUrl = resolver.readText("billingSuccessUrl", "BILLING_SUCCESS_URL");
298 const billingCancelUrl = resolver.readText("billingCancelUrl", "BILLING_CANCEL_URL");
299 const billingReturnUrl = resolver.readText("billingReturnUrl", "BILLING_RETURN_URL");
300
301 const envVars: Record<string, any> = {
302 WORKOS_CLIENT_ID: workosClientId,
303 WORKOS_API_KEY: workosApiKey,
304 WORKOS_WEBHOOK_SECRET: workosWebhookSecret,
305 WORKOS_COOKIE_PASSWORD: workosCookiePassword,
306 MCP_AUTHORIZATION_SERVER: mcpAuthorizationServer,
307 STRIPE_SECRET_KEY: stripeSecretKey,
308 STRIPE_WEBHOOK_SECRET: stripeWebhookSecret,
309 STRIPE_PRICE_ID: stripePriceId,
310 };
311
312 if (billingSuccessUrl) envVars.BILLING_SUCCESS_URL = billingSuccessUrl;
313 if (billingCancelUrl) envVars.BILLING_CANCEL_URL = billingCancelUrl;
314 if (billingReturnUrl) envVars.BILLING_RETURN_URL = billingReturnUrl;
315
316 return new command.local.Command(
317 "executor-convex-env",
318 {
319 create: "bun run setup:prod:env --from-env --strict",
320 update: "bun run setup:prod:env --from-env --strict",
321 dir: executorRoot,
322 environment: envVars,
323 triggers: [
324 workosClientId,
325 workosApiKey,
326 workosWebhookSecret,
327 workosCookiePassword,
328 mcpAuthorizationServer,
329 stripeSecretKey,
330 stripeWebhookSecret,
331 stripePriceId,
332 billingSuccessUrl ?? "",
333 billingCancelUrl ?? "",
334 billingReturnUrl ?? "",
335 ],
336 },
337 {
338 dependsOn: compact([cloudflareSetup]),
339 },
340 );
341}
342
343function setupConvexDeploy(args: {
344 enabled: boolean;
345 command: any;
346 executorRoot: string;
347 stage: string;
348 convexEnvSync: any;
349 cloudflareSetup: any;
350}) {
351 const { enabled, command, executorRoot, stage, convexEnvSync, cloudflareSetup } = args;
352 if (!enabled) {
353 return undefined;
354 }
355
356 return new command.local.Command(
357 "executor-convex-deploy",
358 {
359 create: "bunx convex deploy --prod",
360 update: "bunx convex deploy --prod",
361 dir: executorRoot,
362 triggers: [stage],
363 },
364 {
365 dependsOn: compact([convexEnvSync, cloudflareSetup]),
366 },
367 );
368}
369
370function setupDoctor(args: {
371 command: any;
372 executorRoot: string;
373 stage: string;
374 convexDeploy: any;
375 convexEnvSync: any;
376 cloudflareSetup: any;
377}) {
378 const { command, executorRoot, stage, convexDeploy, convexEnvSync, cloudflareSetup } = args;
379 return new command.local.Command(
380 "executor-doctor-prod",
381 {
382 create: "bun run doctor:prod",
383 update: "bun run doctor:prod",
384 dir: executorRoot,
385 triggers: [stage],
386 },
387 {
388 dependsOn: compact([convexDeploy, convexEnvSync, cloudflareSetup]),
389 },
390 );
391}
392
393function setupVercel(args: {
394 enabled: boolean;
395 resolver: ReturnType<typeof createResolver>;
396 vercel: any;
397 convexUrl: string;
398 convexSiteUrl: string;
399 stripePriceId: any;
400}) {
401 const { enabled, resolver, vercel, convexUrl, convexSiteUrl, stripePriceId } = args;
402 if (!enabled) {
403 return undefined;
404 }
405
406 const vercelApiToken = resolver.requireSecret("vercelApiToken", "VERCEL_API_TOKEN");
407 const vercelTeam = resolver.readText("vercelTeam", "VERCEL_TEAM");
408 const vercelProjectName = resolver.readText("vercelProjectName", "VERCEL_PROJECT_NAME") ?? "executor-web";
409 const vercelGitRepo = resolver.readText("vercelGitRepo", "VERCEL_GIT_REPO");
410
411 const provider = new vercel.Provider("vercel-provider", {
412 apiToken: vercelApiToken,
413 team: vercelTeam,
414 });
415
416 const project = new vercel.Project(
417 "executor-web-project",
418 {
419 name: vercelProjectName,
420 framework: "nextjs",
421 rootDirectory: "executor/apps/web",
422 gitRepository: vercelGitRepo
423 ? {
424 type: "github",
425 repo: vercelGitRepo,
426 }
427 : undefined,
428 },
429 { provider },
430 );
431
432 const workosClientId = resolver.readText("workosClientId", "WORKOS_CLIENT_ID") ?? "";
433 const workosApiKey = resolver.readSecret("workosApiKey", "WORKOS_API_KEY") ?? "";
434 const workosCookiePassword = resolver.readSecret("workosCookiePassword", "WORKOS_COOKIE_PASSWORD") ?? "";
435
436 const vercelVars: Array<{ key: string; value: any; sensitive: boolean }> = [
437 { key: "CONVEX_URL", value: convexUrl, sensitive: false },
438 { key: "CONVEX_SITE_URL", value: convexSiteUrl, sensitive: false },
439 { key: "WORKOS_CLIENT_ID", value: workosClientId, sensitive: false },
440 { key: "WORKOS_API_KEY", value: workosApiKey, sensitive: true },
441 { key: "WORKOS_COOKIE_PASSWORD", value: workosCookiePassword, sensitive: true },
442 { key: "STRIPE_PRICE_ID", value: stripePriceId ?? "", sensitive: false },
443 ];
444
445 for (const item of vercelVars) {
446 if (!item.value) {
447 continue;
448 }
449
450 new vercel.ProjectEnvironmentVariable(
451 `vercel-env-${item.key.toLowerCase().replace(/[^a-z0-9]+/g, "-")}`,
452 {
453 projectId: project.id,
454 key: item.key,
455 value: item.value,
456 targets: ["production", "preview", "development"],
457 sensitive: item.sensitive,
458 },
459 { provider },
460 );
461 }
462
463 return project;
464}
465
466export default $config({
467 app(input: any) {
468 return {
469 name: "executor-infra",
470 home: "local",
471 removal: input?.stage === "production" ? "retain" : "remove",
472 };
473 },
474 async run() {
475 const path = await import("node:path");
476 const { fileURLToPath } = await import("node:url");
477 const { spawnSync } = await import("node:child_process");
478 const pulumi = await import("@pulumi/pulumi");
479 const command = await import("@pulumi/command");
480 const stripe = await import("pulumi-stripe");
481 const vercel = await import("@pulumiverse/vercel");
482
483 const stage = $app.stage;
484 const executorRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
485 const config = new pulumi.Config();
486 const convexEnv = loadConvexEnv(executorRoot, spawnSync);
487 const resolver = createResolver(config, pulumi, convexEnv);
488
489 const flags = {
490 manageCloudflareRuntime: resolver.readBool("manageCloudflareRuntime", "IAC_MANAGE_CLOUDFLARE_RUNTIME", true),
491 manageConvexEnv: resolver.readBool("manageConvexEnv", "IAC_MANAGE_CONVEX_ENV", true),
492 deployConvexFunctions: resolver.readBool("deployConvexFunctions", "IAC_DEPLOY_CONVEX_FUNCTIONS", true),
493 manageStripeCatalog: resolver.readBool("manageStripeCatalog", "IAC_MANAGE_STRIPE_CATALOG", false),
494 manageVercelProject: resolver.readBool("manageVercelProject", "IAC_MANAGE_VERCEL_PROJECT", false),
495 };
496
497 const convexUrl = resolver.requireText("convexUrl", "CONVEX_URL");
498 const convexSiteUrl = resolver.readText("convexSiteUrl", "CONVEX_SITE_URL") ?? toSiteUrl(convexUrl);
499
500 const stripeState = setupStripe({
501 manageStripeCatalog: flags.manageStripeCatalog,
502 resolver,
503 stripe,
504 config,
505 stage,
506 convexSiteUrl,
507 });
508
509 const cloudflareSetup = setupCloudflareRuntime({
510 enabled: flags.manageCloudflareRuntime,
511 resolver,
512 pulumi,
513 command,
514 convexUrl,
515 executorRoot,
516 });
517
518 const convexEnvSync = setupConvexEnvSync({
519 enabled: flags.manageConvexEnv,
520 resolver,
521 command,
522 executorRoot,
523 cloudflareSetup,
524 stripeSecretKey: stripeState.stripeSecretKey,
525 stripeWebhookSecret: stripeState.stripeWebhookSecret,
526 stripePriceId: stripeState.stripePriceId,
527 });
528
529 const convexDeploy = setupConvexDeploy({
530 enabled: flags.deployConvexFunctions,
531 command,
532 executorRoot,
533 stage,
534 convexEnvSync,
535 cloudflareSetup,
536 });
537
538 const doctor = setupDoctor({
539 command,
540 executorRoot,
541 stage,
542 convexDeploy,
543 convexEnvSync,
544 cloudflareSetup,
545 });
546
547 const vercelProject = setupVercel({
548 enabled: flags.manageVercelProject,
549 resolver,
550 vercel,
551 convexUrl,
552 convexSiteUrl,
553 stripePriceId: stripeState.stripePriceId,
554 });
555
556 return {
557 stage,
558 convexUrl,
559 convexSiteUrl,
560 cloudflareRuntimeManaged: flags.manageCloudflareRuntime,
561 convexEnvManaged: flags.manageConvexEnv,
562 convexDeployManaged: flags.deployConvexFunctions,
563 stripeManaged: flags.manageStripeCatalog,
564 vercelManaged: flags.manageVercelProject,
565 doctorCommand: "bun run --cwd executor doctor:prod",
566 doctorResourceId: doctor.id,
567 stripeProductId: stripeState.stripeProductResource?.id,
568 stripePriceId: stripeState.stripePriceId,
569 vercelProjectId: vercelProject?.id,
570 };
571 },
572});
executor/infra/tsconfig.json+0−12
@@ -1,12 +0,0 @@
1{
2 "compilerOptions": {
3 "target": "ES2022",
4 "module": "ESNext",
5 "moduleResolution": "Bundler",
6 "strict": true,
7 "esModuleInterop": true,
8 "skipLibCheck": true,
9 "types": ["node"]
10 },
11 "include": ["./sst.config.ts"]
12}
executor/package.json+0−4
@@ -14,10 +14,6 @@ · 13 unmodified lines
14 "setup:prod:env": "bun run scripts/prod/setup/prod-env.ts --from-env",14 "setup:prod:env": "bun run scripts/prod/setup/prod-env.ts --from-env",
15 "setup:prod:cloudflare": "bun run scripts/prod/setup/prod-cloudflare.ts",15 "setup:prod:cloudflare": "bun run scripts/prod/setup/prod-cloudflare.ts",
16 "setup:prod:all": "bun run setup:prod:cloudflare --deploy && bun run setup:prod:env && bun run doctor:prod",16 "setup:prod:all": "bun run setup:prod:cloudflare --deploy && bun run setup:prod:env && bun run doctor:prod",
17 "iac:install": "bun install --cwd infra",
18 "iac:deploy": "bun run --cwd infra deploy",
19 "iac:diff": "bun run --cwd infra diff",
20 "iac:remove": "bun run --cwd infra remove",
21 "up": "bun run executor.ts up",17 "up": "bun run executor.ts up",
22 "upgrade": "bun run executor.ts upgrade",18 "upgrade": "bun run executor.ts upgrade",
23 "down": "bun run executor.ts down",19 "down": "bun run executor.ts down",
executor/packages/core/src/mcp/server-approval.ts+48−42
@@ -160,7 +160,7 @@ export function waitForTerminalTask( · 159 unmodified lines
160 let loggedElicitationFallback = false;160 let loggedElicitationFallback = false;
161 const seenApprovalIds = new Set<string>();161 const seenApprovalIds = new Set<string>();
162 let unsubscribe: (() => void) | undefined;162 let unsubscribe: (() => void) | undefined;
163 let interval: ReturnType<typeof setInterval> | undefined;163 let handlingApprovals = false;
164 164
165 const logElicitationFallback = (reason: string) => {165 const logElicitationFallback = (reason: string) => {
166 if (loggedElicitationFallback) return;166 if (loggedElicitationFallback) return;
@@ -172,38 +172,21 @@ export function waitForTerminalTask( · 5 unmodified lines
172 if (settled) return;172 if (settled) return;
173 settled = true;173 settled = true;
174 clearTimeout(timeout);174 clearTimeout(timeout);
175 if (interval) {
176 clearInterval(interval);
177 }
178 unsubscribe?.();175 unsubscribe?.();
179 resolve(await service.getTask(taskId, workspaceId));176 resolve(await service.getTask(taskId, workspaceId));
180 };177 };
181 178
182 const timeout = setTimeout(done, waitTimeoutMs);179 const timeout = setTimeout(done, waitTimeoutMs);
183 180
184 // Convex HTTP actions don't provide a real push subscription. To avoid hanging
185 // forever, we poll task state and pending approvals on an interval.
186 let polling = false;
187 const poll = async () => {
188 if (settled || polling) return;
189 polling = true;
190 try {
191 await maybeHandleApprovals();
192 const task = await service.getTask(taskId, workspaceId);
193 if (task && getTaskTerminalState(task.status)) {
194 await done();
195 }
196 } finally {
197 polling = false;
198 }
199 };
200
201 interval = setInterval(() => {
202 void poll().catch(() => {});
203 }, 750);
204
205 const maybeHandleApprovals = async () => {181 const maybeHandleApprovals = async () => {
206 if (!elicitationEnabled || !service.listPendingApprovals || !service.resolveApproval || !onApprovalPrompt || !approvalContext) {182 if (
183 settled
184 || !elicitationEnabled
185 || !service.listPendingApprovals
186 || !service.resolveApproval
187 || !onApprovalPrompt
188 || !approvalContext
189 ) {
207 return;190 return;
208 }191 }
209 192
@@ -239,24 +222,34 @@ export function waitForTerminalTask( · 29 unmodified lines
239 }222 }
240 };223 };
241 224
225 const maybeHandleApprovalsSafely = async () => {
226 if (handlingApprovals || settled) {
227 return;
228 }
229 handlingApprovals = true;
230 try {
231 await maybeHandleApprovals();
232 } finally {
233 handlingApprovals = false;
234 }
235 };
236
242 unsubscribe = service.subscribe(taskId, workspaceId, (event) => {237 unsubscribe = service.subscribe(taskId, workspaceId, (event) => {
243 const parsedPayload = subscriptionEventPayloadSchema.safeParse(event.payload);238 const parsedPayload = subscriptionEventPayloadSchema.safeParse(event.payload);
244 const type = parsedPayload.success ? parsedPayload.data.status : undefined;239 const type = parsedPayload.success ? parsedPayload.data.status : undefined;
245 const pendingApprovalCount = parsedPayload.success240 const pendingApprovalCount = parsedPayload.success ? parsedPayload.data.pendingApprovalCount : undefined;
246 ? (parsedPayload.data.pendingApprovalCount ?? 0)
247 : 0;
248 241
249 if (type && getTaskTerminalState(type)) {242 if (type && getTaskTerminalState(type)) {
250 void done();243 void done();
251 return;244 return;
252 }245 }
253 246
254 if (pendingApprovalCount > 0) {247 if ((pendingApprovalCount ?? 1) > 0) {
255 void maybeHandleApprovals().catch(() => {});248 void maybeHandleApprovalsSafely().catch(() => {});
256 }249 }
257 });250 });
258 251
259 void poll().catch(() => {});252 void maybeHandleApprovalsSafely().catch(() => {});
260 253
261 void service.getTask(taskId, workspaceId).then((task) => {254 void service.getTask(taskId, workspaceId).then((task) => {
262 if (task && getTaskTerminalState(task.status)) {255 if (task && getTaskTerminalState(task.status)) {
@@ -289,6 +282,8 @@ export async function runTaskNowWithApprovalElicitation( · 26 unmodified lines
289 let settled = false;282 let settled = false;
290 let elicitationEnabled = true;283 let elicitationEnabled = true;
291 let loggedElicitationFallback = false;284 let loggedElicitationFallback = false;
285 let handlingApprovals = false;
286 let unsubscribe: (() => void) | undefined;
292 const seenApprovalIds = new Set<string>();287 const seenApprovalIds = new Set<string>();
293 288
294 const logElicitationFallback = (reason: string) => {289 const logElicitationFallback = (reason: string) => {
@@ -298,7 +293,7 @@ export async function runTaskNowWithApprovalElicitation( · 3 unmodified lines
298 };293 };
299 294
300 const maybeHandleApprovals = async () => {295 const maybeHandleApprovals = async () => {
301 if (!elicitationEnabled) {296 if (settled || !elicitationEnabled) {
302 return;297 return;
303 }298 }
304 299
@@ -335,21 +330,32 @@ export async function runTaskNowWithApprovalElicitation( · 30 unmodified lines
335 }330 }
336 };331 };
337 332
338 const pollApprovals = async () => {333 const maybeHandleApprovalsSafely = async () => {
339 while (!settled) {334 if (handlingApprovals || settled) {
340 await maybeHandleApprovals().catch(() => {});335 return;
341 if (settled) {336 }
342 break;337 handlingApprovals = true;
343 }338 try {
344 await new Promise((resolve) => setTimeout(resolve, 750));339 await maybeHandleApprovals();
340 } finally {
341 handlingApprovals = false;
345 }342 }
346 };343 };
347 344
348 const approvalPoller = pollApprovals();345 unsubscribe = service.subscribe(taskId, approvalContext.workspaceId, (event) => {
346 const parsedPayload = subscriptionEventPayloadSchema.safeParse(event.payload);
347 const pendingApprovalCount = parsedPayload.success ? parsedPayload.data.pendingApprovalCount : undefined;
348 if ((pendingApprovalCount ?? 1) > 0) {
349 void maybeHandleApprovalsSafely().catch(() => {});
350 }
351 });
352
353 void maybeHandleApprovalsSafely().catch(() => {});
354
349 try {355 try {
350 return await runTaskNow();356 return await runTaskNow();
351 } finally {357 } finally {
352 settled = true;358 settled = true;
353 void approvalPoller;359 unsubscribe?.();
354 }360 }
355}361}
executor/packages/core/src/tool-source-loaders/graphql-loader.ts+1−7
@@ -535,18 +535,12 @@ export async function loadGraphqlTools(config: GraphqlToolSourceConfig): Promise · 534 unmodified lines
535 const inputHint = gqlFieldArgsTypeHint(field.args, typeMap);535 const inputHint = gqlFieldArgsTypeHint(field.args, typeMap);
536 const outputHint = `{ data: ${gqlTypeToHint(field.type, typeMap)}; errors: unknown[] }`;536 const outputHint = `{ data: ${gqlTypeToHint(field.type, typeMap)}; errors: unknown[] }`;
537 537
538 // Build the example query for the description
539 const exampleQuery = buildFieldQuery(operationType, field.name, field.args, field.type, typeMap);538 const exampleQuery = buildFieldQuery(operationType, field.name, field.args, field.type, typeMap);
540 const directCallExample = field.args.length === 0
541 ? `tools.${fieldPath}({})`
542 : `tools.${fieldPath}({ ${field.args.map((arg) => `${arg.name}: ...`).join(", ")} })`;
543 539
544 const fieldTool: ToolDefinition & { _pseudoTool: boolean } = {540 const fieldTool: ToolDefinition & { _pseudoTool: boolean } = {
545 path: fieldPath,541 path: fieldPath,
546 source: sourceKey,542 source: sourceKey,
547 description: field.description543 description: field.description || `GraphQL ${operationType}: ${field.name}`,
548 ? `${field.description}\n\nPreferred: ${directCallExample}\nReturns: { data, errors }\nRaw GraphQL: ${sourceName}.graphql({ query: \`${exampleQuery}\`, variables: {...} })`
549 : `GraphQL ${operationType}: ${field.name}\n\nPreferred: ${directCallExample}\nReturns: { data, errors }\nRaw GraphQL: ${sourceName}.graphql({ query: \`${exampleQuery}\`, variables: {...} })`,
550 approval,544 approval,
551 credential: credentialSpec,545 credential: credentialSpec,
552 typing: {546 typing: {
executor/packages/database/convex/_generated/api.d.ts+6−0
@@ -284,6 +284,12 @@ export declare const api: { · 283 unmodified lines
284 { approvalId: string; internalSecret: string; runId: string },284 { approvalId: string; internalSecret: string; runId: string },
285 any285 any
286 >;286 >;
287 getTaskWatchStatus: FunctionReference<
288 "query",
289 "public",
290 { internalSecret: string; runId: string; workspaceId: Id<"workspaces"> },
291 any
292 >;
287 handleToolCall: FunctionReference<293 handleToolCall: FunctionReference<
288 "action",294 "action",
289 "public",295 "public",
executor/packages/database/convex/http/mcp_service.ts+38−5
@@ -1,6 +1,5 @@
1import type { ActionCtx } from "../_generated/server";1import { ConvexClient } from "convex/browser";
2import { internal } from "../_generated/api";2import type { LiveTaskEvent } from "../../../core/src/events";
3import type { Id } from "../_generated/dataModel.d.ts";
4import type {3import type {
5 AnonymousContext,4 AnonymousContext,
6 PendingApprovalRecord,5 PendingApprovalRecord,
@@ -8,6 +7,9 @@ import type { · 1 unmodified line
8 TaskRecord,7 TaskRecord,
9 ToolDescriptor,8 ToolDescriptor,
10} from "../../../core/src/types";9} from "../../../core/src/types";
10import { api, internal } from "../_generated/api";
11import type { Id } from "../_generated/dataModel.d.ts";
12import type { ActionCtx } from "../_generated/server";
11 13
12export function createMcpExecutorService(ctx: ActionCtx) {14export function createMcpExecutorService(ctx: ActionCtx) {
13 return {15 return {
@@ -41,8 +43,39 @@ export function createMcpExecutorService(ctx: ActionCtx) { · 27 unmodified lines
41 }43 }
42 return null;44 return null;
43 },45 },
44 subscribe: () => {46 subscribe: (taskId: string, workspaceId: Id<"workspaces">, listener: (event: LiveTaskEvent) => void) => {
45 return () => {};47 const callbackConvexUrl = process.env.CONVEX_URL ?? process.env.CONVEX_SITE_URL;
48 const callbackInternalSecret = process.env.EXECUTOR_INTERNAL_TOKEN;
49 if (!callbackConvexUrl || !callbackInternalSecret) {
50 return () => {};
51 }
52
53 const client = new ConvexClient(callbackConvexUrl, {
54 skipConvexDeploymentUrlCheck: true,
55 });
56 let sequence = 0;
57 const unsubscribe = client.onUpdate(
58 api.runtimeCallbacks.getTaskWatchStatus,
59 {
60 internalSecret: callbackInternalSecret,
61 runId: taskId,
62 workspaceId,
63 },
64 (payload: unknown) => {
65 sequence += 1;
66 listener({
67 id: sequence,
68 eventName: "task",
69 payload,
70 createdAt: Date.now(),
71 });
72 },
73 );
74
75 return () => {
76 unsubscribe();
77 client.close();
78 };
46 },79 },
47 bootstrapAnonymousContext: async (sessionId?: string): Promise<AnonymousContext> => {80 bootstrapAnonymousContext: async (sessionId?: string): Promise<AnonymousContext> => {
48 return await ctx.runMutation(internal.database.bootstrapAnonymousSession, { sessionId });81 return await ctx.runMutation(internal.database.bootstrapAnonymousSession, { sessionId });
executor/packages/database/convex/runtimeCallbacks.ts+13−0
@@ -4,6 +4,7 @@ import { customAction, customMutation, customQuery } from "../../core/src/functi · 3 unmodified lines
4import {4import {
5 completeRunHandler,5 completeRunHandler,
6 getApprovalStatusHandler,6 getApprovalStatusHandler,
7 getTaskWatchStatusHandler,
7 handleToolCallHandler,8 handleToolCallHandler,
8} from "../src/runtime-callbacks/handlers";9} from "../src/runtime-callbacks/handlers";
9import { jsonObjectValidator } from "../src/database/validators";10import { jsonObjectValidator } from "../src/database/validators";
@@ -48,3 +49,15 @@ export const getApprovalStatus = customQuery({ · 38 unmodified lines
48 return await getApprovalStatusHandler(ctx, internal, args);49 return await getApprovalStatusHandler(ctx, internal, args);
49 },50 },
50});51});
52
53export const getTaskWatchStatus = customQuery({
54 method: "GET",
55 args: {
56 internalSecret: v.string(),
57 runId: v.string(),
58 workspaceId: v.id("workspaces"),
59 },
60 handler: async (ctx, args) => {
61 return await getTaskWatchStatusHandler(ctx, internal, args);
62 },
63});
executor/packages/database/src/runtime-callbacks/handlers.ts+36−0
@@ -1,4 +1,6 @@
1import type { ActionCtx, MutationCtx, QueryCtx } from "../../convex/_generated/server";1import type { ActionCtx, MutationCtx, QueryCtx } from "../../convex/_generated/server";
2import type { Id } from "../../convex/_generated/dataModel.d.ts";
3import type { PendingApprovalRecord } from "../../../core/src/types";
2 4
3type InternalApi = typeof import("../../convex/_generated/api").internal;5type InternalApi = typeof import("../../convex/_generated/api").internal;
4 6
@@ -76,3 +78,37 @@ export async function getApprovalStatusHandler( · 71 unmodified lines
76 78
77 return { status: approval.status };79 return { status: approval.status };
78}80}
81
82export async function getTaskWatchStatusHandler(
83 ctx: Pick<QueryCtx, "runQuery">,
84 internalApi: InternalApi,
85 args: {
86 internalSecret: string;
87 runId: string;
88 workspaceId: Id<"workspaces">;
89 },
90) {
91 requireInternalSecret(args.internalSecret);
92
93 const task = await ctx.runQuery(internalApi.database.getTaskInWorkspace, {
94 taskId: args.runId,
95 workspaceId: args.workspaceId,
96 });
97
98 if (!task) {
99 return {
100 pendingApprovalCount: 0,
101 };
102 }
103
104 const pendingApprovals = await ctx.runQuery(internalApi.database.listPendingApprovals, {
105 workspaceId: args.workspaceId,
106 });
107
108 const pendingApprovalCount = pendingApprovals.filter((approval: PendingApprovalRecord) => approval.taskId === args.runId).length;
109
110 return {
111 status: task.status,
112 pendingApprovalCount,
113 };
114}
executor/packages/database/src/runtime-node/runtime-dispatch.ts+90−19
@@ -1,4 +1,5 @@
1import { ConvexHttpClient } from "convex/browser";1import { ConvexClient, ConvexHttpClient } from "convex/browser";
2import { Result } from "better-result";
2import { z } from "zod";3import { z } from "zod";
3import { api } from "../../convex/_generated/api";4import { api } from "../../convex/_generated/api";
4import { dispatchCodeWithCloudflareWorkerLoader } from "../../../core/src/runtimes/cloudflare/worker/loader-runtime";5import { dispatchCodeWithCloudflareWorkerLoader } from "../../../core/src/runtimes/cloudflare/worker/loader-runtime";
@@ -14,6 +15,7 @@ import type { · 9 unmodified lines
14import { describeError } from "../../../core/src/utils";15import { describeError } from "../../../core/src/utils";
15 16
16const recordSchema = z.record(z.unknown());17const recordSchema = z.record(z.unknown());
18const APPROVAL_SUBSCRIPTION_TIMEOUT_MS = 10 * 60 * 1000;
17 19
18function toRecord(value: unknown): Record<string, unknown> {20function toRecord(value: unknown): Record<string, unknown> {
19 const parsed = recordSchema.safeParse(value);21 const parsed = recordSchema.safeParse(value);
@@ -49,28 +51,97 @@ class CallbackExecutionAdapter implements ExecutionAdapter { · 29 unmodified lines
49 });51 });
50 }52 }
51 53
54 private createRealtimeClient(): ConvexClient {
55 return new ConvexClient(this.callbackConfig.callbackConvexUrl, {
56 skipConvexDeploymentUrlCheck: true,
57 });
58 }
59
60 private async waitForApprovalUpdate(runId: string, approvalId: string): Promise<void> {
61 const client = this.createRealtimeClient();
62
63 await new Promise<void>((resolve, reject) => {
64 let settled = false;
65
66 const timer = setTimeout(() => {
67 if (settled) return;
68 settled = true;
69 unsubscribe();
70 client.close();
71 reject(new Error(`Timed out waiting for approval update: ${approvalId}`));
72 }, APPROVAL_SUBSCRIPTION_TIMEOUT_MS);
73
74 const unsubscribe = client.onUpdate(
75 api.runtimeCallbacks.getApprovalStatus,
76 {
77 internalSecret: this.callbackConfig.callbackInternalSecret,
78 runId,
79 approvalId,
80 },
81 (value: { status?: "pending" | "approved" | "denied" | "missing" } | null | undefined) => {
82 const status = value?.status;
83 if (!status || status === "pending") {
84 return;
85 }
86
87 if (status === "missing") {
88 if (settled) return;
89 settled = true;
90 clearTimeout(timer);
91 unsubscribe();
92 client.close();
93 reject(new Error(`Approval not found: ${approvalId}`));
94 return;
95 }
96
97 if (settled) return;
98 settled = true;
99 clearTimeout(timer);
100 unsubscribe();
101 client.close();
102 resolve();
103 },
104 );
105 });
106 }
107
52 async invokeTool(call: ToolCallRequest): Promise<ToolCallResult> {108 async invokeTool(call: ToolCallRequest): Promise<ToolCallResult> {
53 const response = await this.client.action(api.runtimeCallbacks.handleToolCall, {109 while (true) {
54 internalSecret: this.callbackConfig.callbackInternalSecret,110 const response = await this.client.action(api.runtimeCallbacks.handleToolCall, {
55 runId: call.runId,111 internalSecret: this.callbackConfig.callbackInternalSecret,
56 callId: call.callId,112 runId: call.runId,
57 toolPath: call.toolPath,113 callId: call.callId,
58 input: toRecord(call.input),114 toolPath: call.toolPath,
59 }).catch((error: unknown) => ({115 input: toRecord(call.input),
60 ok: false,116 }).catch((error: unknown) => ({
61 kind: "failed",
62 error: `Node runtime callback failed: ${describeError(error)}`,
63 } as const));
64
65 const parsed = decodeToolCallResultFromTransport(response);
66 if (!parsed) {
67 return {
68 ok: false,117 ok: false,
69 kind: "failed",118 kind: "failed",
70 error: "Node runtime callback returned invalid payload",119 error: `Node runtime callback failed: ${describeError(error)}`,
71 };120 } as const));
121
122 const parsed = decodeToolCallResultFromTransport(response);
123 if (!parsed) {
124 return {
125 ok: false,
126 kind: "failed",
127 error: "Node runtime callback returned invalid payload",
128 };
129 }
130
131 if (!parsed.ok && parsed.kind === "pending") {
132 const waitResult = await Result.tryPromise(() => this.waitForApprovalUpdate(call.runId, parsed.approvalId));
133 if (waitResult.isErr()) {
134 return {
135 ok: false,
136 kind: "failed",
137 error: `Node runtime approval subscription failed: ${describeError(waitResult.error.cause)}`,
138 };
139 }
140 continue;
141 }
142
143 return parsed;
72 }144 }
73 return parsed;
74 }145 }
75}146}
76 147
package.json+2−3
@@ -5,7 +5,6 @@ · 4 unmodified lines
5 "workspaces": [5 "workspaces": [
6 "executor/apps/*",6 "executor/apps/*",
7 "executor/packages/*",7 "executor/packages/*",
8 "executor/infra",
9 "sources",8 "sources",
10 "assistant",9 "assistant",
11 "assistant/packages/*"10 "assistant/packages/*"
@@ -30,8 +29,8 @@ · 18 unmodified lines
30 "test:assistant": "bun run --cwd assistant test",29 "test:assistant": "bun run --cwd assistant test",
31 "typecheck": "bun run typecheck:workspaces",30 "typecheck": "bun run typecheck:workspaces",
32 "typecheck:slow": "bun run typecheck:workspaces:slow",31 "typecheck:slow": "bun run typecheck:workspaces:slow",
33 "typecheck:workspaces": "bun run --filter \"@executor/*\" --filter \"executor-infra\" --filter \"@proto/sources\" --filter \"@assistant/*\" --filter \"@openassistant/reacord\" --if-present typecheck",32 "typecheck:workspaces": "bun run --filter \"@executor/*\" --filter \"@proto/sources\" --filter \"@assistant/*\" --filter \"@openassistant/reacord\" --if-present typecheck",
34 "typecheck:workspaces:slow": "bun run --filter \"@executor/*\" --filter \"executor-infra\" --filter \"@proto/sources\" --filter \"@assistant/*\" --filter \"@openassistant/reacord\" --if-present typecheck:slow",33 "typecheck:workspaces:slow": "bun run --filter \"@executor/*\" --filter \"@proto/sources\" --filter \"@assistant/*\" --filter \"@openassistant/reacord\" --if-present typecheck:slow",
35 "typecheck:executor": "bunx --package @typescript/native-preview tsgo --noEmit -p executor/tsconfig.json",34 "typecheck:executor": "bunx --package @typescript/native-preview tsgo --noEmit -p executor/tsconfig.json",
36 "typecheck:executor:slow": "bunx tsc --noEmit -p executor/tsconfig.json",35 "typecheck:executor:slow": "bunx tsc --noEmit -p executor/tsconfig.json",
37 "typecheck:assistant": "bunx --package @typescript/native-preview tsgo --noEmit -p assistant/packages/server/tsconfig.json && bunx --package @typescript/native-preview tsgo --noEmit -p assistant/packages/bot/tsconfig.json",36 "typecheck:assistant": "bunx --package @typescript/native-preview tsgo --noEmit -p assistant/packages/server/tsconfig.json && bunx --package @typescript/native-preview tsgo --noEmit -p assistant/packages/bot/tsconfig.json",