History

Add global OpenAPI transform caching and increase task timeout defaults

Rhys Sullivan committed 9 months ago

Commit adc1e961 parent 1e93e7b10 files · +230 −156Browse files

Unified · Split

10 files
  1. bun.lock +5 −100
  2. executor/apps/web/src/components/tasks-view.tsx +3 −2
  3. executor/convex/_generated/api.d.ts +42 −0
  4. executor/convex/convex.config.ts +2 −0
  5. executor/convex/database.ts +1 −1
  6. executor/convex/executor.ts +1 −1
  7. executor/convex/executorNode.ts +121 −35
  8. executor/convex/lib/runtimes/runtime_core.ts +6 −3
  9. executor/convex/lib/tool_sources.ts +48 −14
  10. executor/package.json +1 −0
bun.lock+5−100
@@ -69,6 +69,7 @@ · 68 unmodified lines
6969 "executor": {
7070 "name": "executor-monorepo",
7171 "dependencies": {
72+ "@convex-dev/action-cache": "^0.3.0",
7273 "@convex-dev/stripe": "^0.1.3",
7374 "@convex-dev/workos-authkit": "^0.1.6",
7475 "@workos-inc/node": "^8.2.0",
@@ -82,24 +83,6 @@ · 7 unmodified lines
8283 "typescript": "latest",
8384 },
8485 },
85− "executor/apps/server": {
86− "name": "@executor/server",
87− "dependencies": {
88− "@apidevtools/swagger-parser": "^12.1.0",
89− "@executor/contracts": "workspace:*",
90− "@modelcontextprotocol/sdk": "^1.26.0",
91− "@vercel/sandbox": "latest",
92− "convex": "^1.31.7",
93− "elysia": "^1.4.22",
94− "openapi-typescript": "^7.10.1",
95− "zod": "^4.3.6",
96− },
97− "devDependencies": {
98− "@elysiajs/eden": "^1.4.6",
99− "@types/bun": "latest",
100− "typescript": "^5.9.3",
101− },
102− },
10386 "executor/apps/web": {
10487 "name": "@executor/web",
10588 "version": "0.1.0",
@@ -153,14 +136,6 @@ · 47 unmodified lines
153136
154137 "@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.73.0", "", { "dependencies": { "json-schema-to-ts": "^3.1.1" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-URURVzhxXGJDGUGFunIOtBlSl7KWvZiAAKY/ttTkZAkXT9bTPqdk2eK0b8qqSxXpikh3QKPnPYpiyX98zf5ebw=="],
155138
156− "@apidevtools/json-schema-ref-parser": ["@apidevtools/json-schema-ref-parser@14.0.1", "", { "dependencies": { "@types/json-schema": "^7.0.15", "js-yaml": "^4.1.0" } }, "sha512-Oc96zvmxx1fqoSEdUmfmvvb59/KDOnUoJ7s2t7bISyAn0XEz57LCCw8k2Y4Pf3mwKaZLMciESALORLgfe2frCw=="],
157−
158− "@apidevtools/openapi-schemas": ["@apidevtools/openapi-schemas@2.1.0", "", {}, "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ=="],
159−
160− "@apidevtools/swagger-methods": ["@apidevtools/swagger-methods@3.0.2", "", {}, "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg=="],
161−
162− "@apidevtools/swagger-parser": ["@apidevtools/swagger-parser@12.1.0", "", { "dependencies": { "@apidevtools/json-schema-ref-parser": "14.0.1", "@apidevtools/openapi-schemas": "^2.1.0", "@apidevtools/swagger-methods": "^3.0.2", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "call-me-maybe": "^1.0.2" }, "peerDependencies": { "openapi-types": ">=7" } }, "sha512-e5mJoswsnAX0jG+J09xHFYQXb/bUc5S3pLpMxUuRUA2H8T2kni3yEoyz2R3Dltw5f4A6j6rPNMpWTK+iVDFlng=="],
163−
164139 "@assistant/bot": ["@assistant/bot@workspace:assistant/packages/bot"],
165140
166141 "@assistant/core": ["@assistant/core@workspace:assistant/packages/core"],
@@ -295,6 +270,8 @@ · 128 unmodified lines
295270
296271 "@borewit/text-codec": ["@borewit/text-codec@0.2.1", "", {}, "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw=="],
297272
273+ "@convex-dev/action-cache": ["@convex-dev/action-cache@0.3.0", "", { "peerDependencies": { "convex": "^1.24.8" } }, "sha512-B3GsOgwPv81whdu1mHaMKBwbIYHhNXsv3Fr5oMjynIOrRy1laGLUo9zRWDKWJgtKXfVnn8X/uxYD9RyWmPIbPQ=="],
274+
298275 "@convex-dev/stripe": ["@convex-dev/stripe@0.1.3", "", { "dependencies": { "stripe": "^20.0.0" }, "peerDependencies": { "convex": "^1.29.3", "react": "^18.3.1 || ^19.0.0" } }, "sha512-yL0ygrWrjto9f7rprCb4KYp+p3Oka7KG5e3HBoJ9qSzbncpavZI+JTkGZnLCYZjPOo2ByCrBJvtGAxfP169Nzw=="],
299276
300277 "@convex-dev/workos": ["@convex-dev/workos@0.0.1", "", { "dependencies": { "@workos-inc/authkit-react": "^0.11.0", "tsdown": "^0.12.7", "vitest": "^3.1.4" }, "peerDependencies": { "convex": "^1.25.4", "react": "^18.0.0 || ^19.0.0-0 || ^19.0.0" } }, "sha512-8gZOgmcTitcKXwagdU69XC4Va6wMPFIhSqSOEaXmFXMEPtkMgxPW1dhJzrmm9UQ4iRgZsckjd2O5aQjUH7kHGQ=="],
@@ -409,8 +386,6 @@ · 108 unmodified lines
409386
410387 "@executor/contracts": ["@executor/contracts@workspace:executor/packages/contracts"],
411388
412− "@executor/server": ["@executor/server@workspace:executor/apps/server"],
413−
414389 "@executor/web": ["@executor/web@workspace:executor/apps/web"],
415390
416391 "@floating-ui/core": ["@floating-ui/core@1.7.4", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg=="],
@@ -729,12 +704,6 @@ · 312 unmodified lines
729704
730705 "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="],
731706
732− "@redocly/ajv": ["@redocly/ajv@8.17.3", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-NQsbJbB/GV7JVO88ebFkMndrnuGp/dTm5/2NISeg+JGcLzTfGBJZ01+V5zD8nKBOpi/dLLNFT+Ql6IcUk8ehng=="],
733−
734− "@redocly/config": ["@redocly/config@0.22.2", "", {}, "sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ=="],
735−
736− "@redocly/openapi-core": ["@redocly/openapi-core@1.34.6", "", { "dependencies": { "@redocly/ajv": "^8.11.2", "@redocly/config": "^0.22.0", "colorette": "^1.2.0", "https-proxy-agent": "^7.0.5", "js-levenshtein": "^1.1.6", "js-yaml": "^4.1.0", "minimatch": "^5.0.1", "pluralize": "^8.0.0", "yaml-ast-parser": "0.0.43" } }, "sha512-2+O+riuIUgVSuLl3Lyh5AplWZyVMNuG2F98/o6NrutKJfW4/GTZdPpZlIphS0HGgcOHgmWcCSHj+dWFlZaGSHw=="],
737−
738707 "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.0.0-rc.3", "", { "os": "android", "cpu": "arm64" }, "sha512-0T1k9FinuBZ/t7rZ8jN6OpUKPnUjNdYHoj/cESWrQ3ZraAJ4OMm6z7QjSfCxqj8mOp9kTKc1zHK3kGz5vMu+nQ=="],
739708
740709 "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.0.0-rc.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-JWWLzvcmc/3pe7qdJqPpuPk91SoE/N+f3PcWx/6ZwuyDVyungAEJPvKm/eEldiDdwTmaEzWfIR+HORxYWrCi1A=="],
@@ -1087,10 +1056,6 @@ · 346 unmodified lines
10871056
10881057 "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.11.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g=="],
10891058
1090− "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="],
1091−
1092− "@vercel/sandbox": ["@vercel/sandbox@1.4.1", "", { "dependencies": { "@vercel/oidc": "^3.1.0", "async-retry": "1.3.3", "jsonlines": "0.1.1", "ms": "2.1.3", "picocolors": "^1.1.1", "tar-stream": "3.1.7", "undici": "^7.16.0", "xdg-app-paths": "5.1.0", "zod": "3.24.4" } }, "sha512-5jaNLv6QJ0112ZFhCv9hQDCV3IYogpbEn5LzMcY5E8TZsf5tF0avat2tBe7McOJvgVs0SDkuzjvGjUMKtTkjrA=="],
1093−
10941059 "@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="],
10951060
10961061 "@vitest/mocker": ["@vitest/mocker@3.2.4", "", { "dependencies": { "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ=="],
@@ -1125,12 +1090,8 @@ · 28 unmodified lines
11251090
11261091 "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
11271092
1128− "ajv-draft-04": ["ajv-draft-04@1.0.0", "", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="],
1129−
11301093 "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="],
11311094
1132− "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="],
1133−
11341095 "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
11351096
11361097 "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
@@ -1173,20 +1134,14 @@ · 36 unmodified lines
11731134
11741135 "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="],
11751136
1176− "async-retry": ["async-retry@1.3.3", "", { "dependencies": { "retry": "0.13.1" } }, "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw=="],
1177−
11781137 "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],
11791138
11801139 "axe-core": ["axe-core@4.11.1", "", {}, "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A=="],
11811140
11821141 "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
11831142
1184− "b4a": ["b4a@1.7.3", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q=="],
1185−
11861143 "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
11871144
1188− "bare-events": ["bare-events@2.8.2", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ=="],
1189−
11901145 "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
11911146
11921147 "baseline-browser-mapping": ["baseline-browser-mapping@2.9.19", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg=="],
@@ -1225,8 +1180,6 @@ · 32 unmodified lines
12251180
12261181 "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
12271182
1228− "call-me-maybe": ["call-me-maybe@1.0.2", "", {}, "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ=="],
1229−
12301183 "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
12311184
12321185 "caniuse-lite": ["caniuse-lite@1.0.30001769", "", {}, "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg=="],
@@ -1235,8 +1188,6 @@ · 2 unmodified lines
12351188
12361189 "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
12371190
1238− "change-case": ["change-case@5.4.4", "", {}, "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="],
1239−
12401191 "check-error": ["check-error@2.1.3", "", {}, "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA=="],
12411192
12421193 "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
@@ -1261,8 +1212,6 @@ · 18 unmodified lines
12611212
12621213 "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
12631214
1264− "colorette": ["colorette@1.4.0", "", {}, "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g=="],
1265−
12661215 "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
12671216
12681217 "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
@@ -1441,8 +1390,6 @@ · 172 unmodified lines
14411390
14421391 "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
14431392
1444− "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="],
1445−
14461393 "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="],
14471394
14481395 "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="],
@@ -1467,8 +1414,6 @@ · 18 unmodified lines
14671414
14681415 "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
14691416
1470− "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="],
1471−
14721417 "fast-glob": ["fast-glob@3.3.3", "", { "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.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
14731418
14741419 "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
@@ -1617,8 +1562,6 @@ · 142 unmodified lines
16171562
16181563 "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
16191564
1620− "index-to-position": ["index-to-position@1.2.0", "", {}, "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw=="],
1621−
16221565 "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
16231566
16241567 "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=="],
@@ -1723,8 +1666,6 @@ · 98 unmodified lines
17231666
17241667 "jose": ["jose@6.1.3", "", {}, "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ=="],
17251668
1726− "js-levenshtein": ["js-levenshtein@1.1.6", "", {}, "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g=="],
1727−
17281669 "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
17291670
17301671 "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
@@ -1749,8 +1690,6 @@ · 18 unmodified lines
17491690
17501691 "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
17511692
1752− "jsonlines": ["jsonlines@0.1.1", "", {}, "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA=="],
1753−
17541693 "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=="],
17551694
17561695 "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=="],
@@ -1917,14 +1856,10 @@ · 160 unmodified lines
19171856
19181857 "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="],
19191858
1920− "openapi-typescript": ["openapi-typescript@7.10.1", "", { "dependencies": { "@redocly/openapi-core": "^1.34.5", "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-rBcU8bjKGGZQT4K2ekSTY2Q5veOQbVG/lTKZ49DeCyT9z62hM2Vj/LLHjDHC9W7LJG8YMHcdXpRZDqC1ojB/lw=="],
1921−
19221859 "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=="],
19231860
19241861 "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=="],
19251862
1926− "os-paths": ["os-paths@4.4.0", "", {}, "sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg=="],
1927−
19281863 "outvariant": ["outvariant@1.4.3", "", {}, "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA=="],
19291864
19301865 "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=="],
@@ -1943,7 +1878,7 @@ · 12 unmodified lines
19431878
19441879 "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
19451880
1946− "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=="],
1881+ "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=="],
19471882
19481883 "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="],
19491884
@@ -1973,8 +1908,6 @@ · 23 unmodified lines
19731908
19741909 "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="],
19751910
1976− "pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="],
1977−
19781911 "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="],
19791912
19801913 "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
@@ -2055,8 +1988,6 @@ · 74 unmodified lines
20551988
20561989 "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
20571990
2058− "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="],
2059−
20601991 "rettime": ["rettime@0.10.1", "", {}, "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw=="],
20611992
20621993 "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
@@ -2149,8 +2080,6 @@ · 86 unmodified lines
21492080
21502081 "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="],
21512082
2152− "streamx": ["streamx@2.23.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg=="],
2153−
21542083 "strict-event-emitter": ["strict-event-emitter@0.5.1", "", {}, "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ=="],
21552084
21562085 "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
@@ -2191,7 +2120,7 @@ · 34 unmodified lines
21912120
21922121 "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="],
21932122
2194− "supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="],
2123+ "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
21952124
21962125 "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
21972126
@@ -2203,10 +2132,6 @@ · 5 unmodified lines
22032132
22042133 "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="],
22052134
2206− "tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="],
2207−
2208− "text-decoder": ["text-decoder@1.2.3", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="],
2209−
22102135 "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="],
22112136
22122137 "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="],
@@ -2343,16 +2268,10 @@ · 130 unmodified lines
23432268
23442269 "wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="],
23452270
2346− "xdg-app-paths": ["xdg-app-paths@5.1.0", "", { "dependencies": { "xdg-portable": "^7.0.0" } }, "sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA=="],
2347−
2348− "xdg-portable": ["xdg-portable@7.3.0", "", { "dependencies": { "os-paths": "^4.0.1" } }, "sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw=="],
2349−
23502271 "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
23512272
23522273 "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
23532274
2354− "yaml-ast-parser": ["yaml-ast-parser@0.0.43", "", {}, "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A=="],
2355−
23562275 "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
23572276
23582277 "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
@@ -2407,8 +2326,6 @@ · 48 unmodified lines
24072326
24082327 "@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=="],
24092328
2410− "@redocly/openapi-core/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="],
2411−
24122329 "@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=="],
24132330
24142331 "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="],
@@ -2431,10 +2348,6 @@ · 16 unmodified lines
24312348
24322349 "@typescript-eslint/typescript-estree/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
24332350
2434− "@vercel/sandbox/undici": ["undici@7.21.0", "", {}, "sha512-Hn2tCQpoDt1wv23a68Ctc8Cr/BHpUSfaPYrkajTXOS9IKpxVRx/X5m1K2YkbK2ipgZgxXSgsUinl3x+2YdSSfg=="],
2435−
2436− "@vercel/sandbox/zod": ["zod@3.24.4", "", {}, "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg=="],
2437−
24382351 "@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=="],
24392352
24402353 "@workos-inc/authkit-nextjs/jose": ["jose@5.10.0", "", {}, "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg=="],
@@ -2445,8 +2358,6 @@ · 4 unmodified lines
24452358
24462359 "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=="],
24472360
2448− "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=="],
2449−
24502361 "degenerator/ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="],
24512362
24522363 "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=="],
@@ -2485,8 +2396,6 @@ · 32 unmodified lines
24852396
24862397 "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
24872398
2488− "parse-json/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
2489−
24902399 "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
24912400
24922401 "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
@@ -2555,8 +2464,6 @@ · 62 unmodified lines
25552464
25562465 "@next/eslint-plugin-next/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
25572466
2558− "@redocly/openapi-core/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
2559−
25602467 "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
25612468
25622469 "@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=="],
@@ -2571,8 +2478,6 @@ · 8 unmodified lines
25712478
25722479 "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
25732480
2574− "eslint/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
2575−
25762481 "glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
25772482
25782483 "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
executor/apps/web/src/components/tasks-view.tsx+3−2
@@ -47,6 +47,7 @@ await tools.admin.send_announcement({ · 46 unmodified lines
4747 channel: "general",
4848 message: "Hello from executor!"
4949 });`;
50+const DEFAULT_TIMEOUT_MS = 300_000;
5051
5152 function formatDate(ts: number) {
5253 return new Date(ts).toLocaleDateString([], {
@@ -63,7 +64,7 @@ function TaskComposer() { · 10 unmodified lines
6364 const { context } = useSession();
6465 const [code, setCode] = useState(DEFAULT_CODE);
6566 const [runtimeId, setRuntimeId] = useState("local-bun");
66− const [timeoutMs, setTimeoutMs] = useState("15000");
67+ const [timeoutMs, setTimeoutMs] = useState(String(DEFAULT_TIMEOUT_MS));
6768 const [submitting, setSubmitting] = useState(false);
6869
6970 const runtimes = useQuery(convexApi.database.listRuntimeTargets, {});
@@ -77,7 +78,7 @@ function TaskComposer() { · 7 unmodified lines
7778 const data = await createTask({
7879 code,
7980 runtimeId,
80− timeoutMs: parseInt(timeoutMs) || 15000,
81+ timeoutMs: Number.parseInt(timeoutMs, 10) || DEFAULT_TIMEOUT_MS,
8182 workspaceId: context.workspaceId,
8283 actorId: context.actorId,
8384 clientId: context.clientId,
executor/convex/_generated/api.d.ts+42−0
@@ -487,4 +487,46 @@ export declare const components: { · 486 unmodified lines
487487 >;
488488 };
489489 };
490+ actionCache: {
491+ crons: {
492+ purge: FunctionReference<
493+ "mutation",
494+ "internal",
495+ { expiresAt?: number },
496+ null
497+ >;
498+ };
499+ lib: {
500+ get: FunctionReference<
501+ "query",
502+ "internal",
503+ { args: any; name: string; ttl: number | null },
504+ { kind: "hit"; value: any } | { expiredEntry?: string; kind: "miss" }
505+ >;
506+ put: FunctionReference<
507+ "mutation",
508+ "internal",
509+ {
510+ args: any;
511+ expiredEntry?: string;
512+ name: string;
513+ ttl: number | null;
514+ value: any;
515+ },
516+ { cacheHit: boolean; deletedExpiredEntry: boolean }
517+ >;
518+ remove: FunctionReference<
519+ "mutation",
520+ "internal",
521+ { args: any; name: string },
522+ null
523+ >;
524+ removeAll: FunctionReference<
525+ "mutation",
526+ "internal",
527+ { batchSize?: number; before?: number; name?: string },
528+ null
529+ >;
530+ };
531+ };
490532 };
executor/convex/convex.config.ts+2−0
@@ -1,3 +1,4 @@
1+import actionCache from "@convex-dev/action-cache/convex.config.js";
12 import stripe from "@convex-dev/stripe/convex.config.js";
23 import workOSAuthKit from "@convex-dev/workos-authkit/convex.config";
34 import { defineApp } from "convex/server";
@@ -6,5 +7,6 @@ const app = defineApp(); · 2 unmodified lines
67
78 app.use(workOSAuthKit);
89 app.use(stripe);
10+app.use(actionCache);
911
1012 export default app;
executor/convex/database.ts+1−1
@@ -4,7 +4,7 @@ import type { MutationCtx, QueryCtx } from "./_generated/server"; · 3 unmodified lines
44 import { mutation, query } from "./_generated/server";
55 import { ensureUniqueSlug } from "./lib/slug";
66
7−const DEFAULT_TIMEOUT_MS = 15_000;
7+const DEFAULT_TIMEOUT_MS = 300_000;
88 type OrganizationRole = "owner" | "admin" | "member" | "billing_admin";
99 type OrganizationMemberStatus = "active" | "pending" | "removed";
1010
executor/convex/executor.ts+1−1
@@ -4,7 +4,7 @@ import type { MutationCtx } from "./_generated/server"; · 3 unmodified lines
44 import { internalMutation, mutation } from "./_generated/server";
55 import type { ApprovalRecord, TaskRecord } from "./lib/types";
66
7−const DEFAULT_TIMEOUT_MS = 15_000;
7+const DEFAULT_TIMEOUT_MS = 300_000;
88
99 async function publishTaskEvent(
1010 ctx: MutationCtx,
executor/convex/executorNode.ts+121−35
@@ -1,15 +1,19 @@
11 "use node";
22
33 import { v } from "convex/values";
4−import { api, internal } from "./_generated/api";
4+import { ActionCache } from "@convex-dev/action-cache";
5+import { api, components, internal } from "./_generated/api";
56 import { action, internalAction } from "./_generated/server";
67 import { InProcessExecutionAdapter } from "./lib/adapters/in_process_execution_adapter";
78 import { APPROVAL_DENIED_PREFIX } from "./lib/execution_constants";
89 import { runCodeWithAdapter } from "./lib/runtimes/runtime_core";
910 import { createDiscoverTool } from "./lib/tool_discovery";
1011 import {
12+ buildOpenApiToolsFromPrepared,
1113 loadExternalTools,
1214 parseGraphqlOperationPaths,
15+ prepareOpenApiSpec,
16+ type PreparedOpenApiSpec,
1317 type ExternalToolSourceConfig,
1418 } from "./lib/tool_sources";
1519 import { DEFAULT_TOOLS } from "./lib/tools";
@@ -119,9 +123,28 @@ const workspaceToolCache = new Map< · 103 unmodified lines
119123 string,
120124 { signature: string; loadedAt: number; tools: Map<string, ToolDefinition>; warnings: string[] }
121125 >();
126+const workspaceToolLoadsInFlight = new Map<
127+ string,
128+ {
129+ signature: string;
130+ promise: Promise<{ tools: Map<string, ToolDefinition>; warnings: string[] }>;
131+ }
132+>();
133+const OPENAPI_SPEC_CACHE_TTL_MS = 5 * 60 * 60_000;
122134 const WORKSPACE_TOOL_CACHE_TTL_MS = 5 * 60 * 60_000;
123135 const WORKSPACE_TOOL_CACHE_RETRY_TTL_MS = 5 * 60 * 60_000;
124136
137+const actionCacheComponent = components as unknown as { actionCache: unknown };
138+const openApiSpecCache = new ActionCache(actionCacheComponent.actionCache as never, {
139+ action: internal.executorNode.prepareOpenApiSpecForCache,
140+ name: "openapi-spec-transform-v1",
141+ ttl: OPENAPI_SPEC_CACHE_TTL_MS,
142+});
143+
144+interface PreparedOpenApiSpecCacheValue {
145+ preparedJson: string;
146+}
147+
125148 function isWorkspaceToolCacheFresh(
126149 cached: { signature: string; loadedAt: number; warnings: string[] },
127150 signature: string,
@@ -169,6 +192,42 @@ async function waitForApproval(ctx: any, approvalId: string): Promise<"approved" · 41 unmodified lines
169192 }
170193 }
171194
195+export const prepareOpenApiSpecForCache = internalAction({
196+ args: {
197+ specUrl: v.string(),
198+ },
199+ handler: async (_ctx, args): Promise<PreparedOpenApiSpecCacheValue> => {
200+ const prepared = await prepareOpenApiSpec(args.specUrl, args.specUrl);
201+ // Action cache values must be valid Convex values. Raw OpenAPI objects can
202+ // contain keys like "$ref", which Convex object fields disallow, so we
203+ // store the prepared payload as a JSON string.
204+ return { preparedJson: JSON.stringify(prepared) };
205+ },
206+});
207+
208+async function loadSourceTools(
209+ ctx: any,
210+ source: ExternalToolSourceConfig,
211+): Promise<{ tools: ToolDefinition[]; warnings: string[] }> {
212+ if (source.type === "openapi" && typeof source.spec === "string") {
213+ try {
214+ const cached = await openApiSpecCache.fetch(ctx, { specUrl: source.spec }) as PreparedOpenApiSpecCacheValue;
215+ const prepared = JSON.parse(cached.preparedJson) as PreparedOpenApiSpec;
216+ const tools = buildOpenApiToolsFromPrepared(source, prepared);
217+ const warnings = (prepared.warnings ?? []).map((warning) => `Source '${source.name}': ${warning}`);
218+ return { tools, warnings };
219+ } catch (error) {
220+ const message = error instanceof Error ? error.message : String(error);
221+ return {
222+ tools: [],
223+ warnings: [`Failed to load openapi source '${source.name}': ${message}`],
224+ };
225+ }
226+ }
227+
228+ return await loadExternalTools([source]);
229+}
230+
172231 async function getWorkspaceTools(ctx: any, workspaceId: string): Promise<Map<string, ToolDefinition>> {
173232 const sources = (await ctx.runQuery(api.database.listToolSources, { workspaceId }))
174233 .filter((source: { enabled: boolean }) => source.enabled);
@@ -179,40 +238,61 @@ async function getWorkspaceTools(ctx: any, workspaceId: string): Promise<Map<str · 4 unmodified lines
179238 return cached.tools;
180239 }
181240
182− const configs: ExternalToolSourceConfig[] = [];
183− const warnings: string[] = [];
184− for (const source of sources) {
185− try {
186− configs.push(normalizeExternalToolSource(source));
187− } catch (error) {
188− const message = error instanceof Error ? error.message : String(error);
189− warnings.push(`Source '${source.name}': ${message}`);
190− }
241+ const inFlight = workspaceToolLoadsInFlight.get(workspaceId);
242+ if (inFlight && inFlight.signature === signature) {
243+ const loaded = await inFlight.promise;
244+ return loaded.tools;
191245 }
192246
193− const { tools: externalTools, warnings: loadWarnings } = await loadExternalTools(configs);
194− warnings.push(...loadWarnings);
247+ const loadPromise = (async () => {
248+ const configs: ExternalToolSourceConfig[] = [];
249+ const warnings: string[] = [];
250+ for (const source of sources) {
251+ try {
252+ configs.push(normalizeExternalToolSource(source));
253+ } catch (error) {
254+ const message = error instanceof Error ? error.message : String(error);
255+ warnings.push(`Source '${source.name}': ${message}`);
256+ }
257+ }
195258
196− const merged = new Map<string, ToolDefinition>();
197− for (const tool of baseTools.values()) {
198− if (tool.path === "discover") continue;
199− merged.set(tool.path, tool);
200− }
201− for (const tool of externalTools) {
202− merged.set(tool.path, tool);
203− }
259+ const loadedSources = await Promise.all(configs.map((config) => loadSourceTools(ctx, config)));
260+ const externalTools = loadedSources.flatMap((loaded) => loaded.tools);
261+ warnings.push(...loadedSources.flatMap((loaded) => loaded.warnings));
204262
205− const discover = createDiscoverTool([...merged.values()]);
206− merged.set(discover.path, discover);
263+ const merged = new Map<string, ToolDefinition>();
264+ for (const tool of baseTools.values()) {
265+ if (tool.path === "discover") continue;
266+ merged.set(tool.path, tool);
267+ }
268+ for (const tool of externalTools) {
269+ merged.set(tool.path, tool);
270+ }
207271
208− workspaceToolCache.set(workspaceId, {
209− signature,
210− loadedAt: now,
211− tools: merged,
212− warnings,
213− });
272+ const discover = createDiscoverTool([...merged.values()]);
273+ merged.set(discover.path, discover);
214274
215− return merged;
275+ workspaceToolCache.set(workspaceId, {
276+ signature,
277+ loadedAt: Date.now(),
278+ tools: merged,
279+ warnings,
280+ });
281+
282+ return { tools: merged, warnings };
283+ })();
284+
285+ workspaceToolLoadsInFlight.set(workspaceId, { signature, promise: loadPromise });
286+
287+ try {
288+ const loaded = await loadPromise;
289+ return loaded.tools;
290+ } finally {
291+ const current = workspaceToolLoadsInFlight.get(workspaceId);
292+ if (current?.promise === loadPromise) {
293+ workspaceToolLoadsInFlight.delete(workspaceId);
294+ }
295+ }
216296 }
217297
218298 function getDecisionForContext(
@@ -392,13 +472,16 @@ function getGraphqlDecision( · 173 unmodified lines
392472
393473 async function invokeTool(ctx: any, task: TaskRecord, call: ToolCallRequest): Promise<unknown> {
394474 const { toolPath, input, callId } = call;
395− const [workspaceTools, policies] = await Promise.all([
396− getWorkspaceTools(ctx, task.workspaceId),
397− ctx.runQuery(api.database.listAccessPolicies, { workspaceId: task.workspaceId }),
398− ]);
475+ const policies = await ctx.runQuery(api.database.listAccessPolicies, { workspaceId: task.workspaceId });
399476 const typedPolicies = policies as AccessPolicyRecord[];
400477
401− const tool = workspaceTools.get(toolPath);
478+ let workspaceTools: Map<string, ToolDefinition> | undefined;
479+ let tool = baseTools.get(toolPath);
480+ if (!tool) {
481+ workspaceTools = await getWorkspaceTools(ctx, task.workspaceId);
482+ tool = workspaceTools.get(toolPath);
483+ }
484+
402485 if (!tool) {
403486 throw new Error(`Unknown tool: ${toolPath}`);
404487 }
@@ -406,6 +489,9 @@ async function invokeTool(ctx: any, task: TaskRecord, call: ToolCallRequest): Pr · 1 unmodified line
406489 let decision: PolicyDecision;
407490 let effectiveToolPath = toolPath;
408491 if (tool._graphqlSource) {
492+ if (!workspaceTools) {
493+ workspaceTools = await getWorkspaceTools(ctx, task.workspaceId);
494+ }
409495 const result = getGraphqlDecision(task, tool, input, workspaceTools, typedPolicies);
410496 decision = result.decision;
411497 if (result.effectivePaths.length > 0) {
@@ -478,7 +564,7 @@ async function invokeTool(ctx: any, task: TaskRecord, call: ToolCallRequest): Pr · 66 unmodified lines
478564 actorId: task.actorId,
479565 clientId: task.clientId,
480566 credential,
481− isToolAllowed: (path) => isToolAllowedForTask(task, path, workspaceTools, typedPolicies),
567+ isToolAllowed: (path) => isToolAllowedForTask(task, path, workspaceTools ?? baseTools, typedPolicies),
482568 };
483569 const value = await tool.run(input, context);
484570 await publish(ctx, task.id, "task", "tool.call.completed", {
executor/convex/lib/runtimes/runtime_core.ts+6−3
@@ -15,15 +15,18 @@ import type { · 14 unmodified lines
1515 async function transpileForRuntime(code: string): Promise<string> {
1616 let ts: typeof import("typescript");
1717 try {
18− ts = await import("typescript");
18+ ts = require("typescript");
1919 } catch {
2020 return code;
2121 }
2222
23+ const target = ts.ScriptTarget?.ES2022 ?? ts.ScriptTarget?.ESNext;
24+ const moduleKind = ts.ModuleKind?.ESNext;
25+
2326 const result = ts.transpileModule(code, {
2427 compilerOptions: {
25− target: ts.ScriptTarget.ES2022,
26− module: ts.ModuleKind.ESNext,
28+ ...(target !== undefined ? { target } : {}),
29+ ...(moduleKind !== undefined ? { module: moduleKind } : {}),
2730 },
2831 reportDiagnostics: true,
2932 });
executor/convex/lib/tool_sources.ts+48−14
@@ -667,39 +667,68 @@ function buildOpenApiUrl( · 666 unmodified lines
667667 };
668668 }
669669
670−async function loadOpenApiTools(config: OpenApiToolSourceConfig): Promise<ToolDefinition[]> {
670+export interface PreparedOpenApiSpec {
671+ servers: string[];
672+ paths: Record<string, unknown>;
673+ operationTypes?: Record<string, { argsType: string; returnsType: string }>;
674+ schemaTypes?: Record<string, string>;
675+ warnings: string[];
676+}
677+
678+export async function prepareOpenApiSpec(
679+ spec: string | Record<string, unknown>,
680+ sourceName = "openapi",
681+): Promise<PreparedOpenApiSpec> {
671682 // Run type generation in parallel with spec loading.
672683 // We prefer `bundle` so external refs are resolved, but some real-world specs
673684 // contain broken internal refs. In that case, fall back to `parse` so we can
674685 // still load operation paths and expose usable tools.
675− const typeMapPromise = generateOpenApiTypes(config.spec);
686+ const typeMapPromise = generateOpenApiTypes(spec);
676687 const parser = SwaggerParser as unknown as {
677688 bundle(spec: unknown): Promise<unknown>;
678689 parse(spec: unknown): Promise<unknown>;
679690 };
680691
692+ const warnings: string[] = [];
681693 let bundled: Record<string, unknown>;
682694 try {
683− bundled = await parser.bundle(config.spec).then((api) => api as Record<string, unknown>);
695+ bundled = await parser.bundle(spec).then((api) => api as Record<string, unknown>);
684696 } catch (bundleError) {
685697 const bundleMessage = bundleError instanceof Error ? bundleError.message : String(bundleError);
686− console.warn(
687− `[executor] OpenAPI bundle failed for '${config.name}', falling back to parse-only mode: ${bundleMessage}`,
688− );
698+ warnings.push(`OpenAPI bundle failed for '${sourceName}', using parse-only mode: ${bundleMessage}`);
689699 try {
690− bundled = await parser.parse(config.spec).then((api) => api as Record<string, unknown>);
700+ bundled = await parser.parse(spec).then((api) => api as Record<string, unknown>);
691701 } catch (parseError) {
692702 const parseMessage = parseError instanceof Error ? parseError.message : String(parseError);
693703 throw new Error(
694− `Failed to load OpenAPI source '${config.name}': bundle error (${bundleMessage}); parse error (${parseMessage})`,
704+ `Failed to load OpenAPI source '${sourceName}': bundle error (${bundleMessage}); parse error (${parseMessage})`,
695705 );
696706 }
697707 }
698708
699709 const typeMap = await typeMapPromise;
700−
701710 const servers = Array.isArray(bundled.servers) ? (bundled.servers as Array<{ url?: unknown }>) : [];
702− const baseUrl = config.baseUrl ?? String(servers[0]?.url ?? "");
711+
712+ return {
713+ servers: servers
714+ .map((server) => (typeof server.url === "string" ? server.url : ""))
715+ .filter((url) => url.length > 0),
716+ paths: asRecord(bundled.paths),
717+ ...(typeMap
718+ ? {
719+ operationTypes: Object.fromEntries(typeMap.operations),
720+ ...(typeMap.schemas.size > 0 ? { schemaTypes: Object.fromEntries(typeMap.schemas) } : {}),
721+ }
722+ : {}),
723+ warnings,
724+ };
725+}
726+
727+export function buildOpenApiToolsFromPrepared(
728+ config: OpenApiToolSourceConfig,
729+ prepared: PreparedOpenApiSpec,
730+): ToolDefinition[] {
731+ const baseUrl = config.baseUrl ?? prepared.servers[0] ?? "";
703732 if (!baseUrl) {
704733 throw new Error(`OpenAPI source ${config.name} has no base URL (set baseUrl)`);
705734 }
@@ -707,13 +736,13 @@ async function loadOpenApiTools(config: OpenApiToolSourceConfig): Promise<ToolDe · 1 unmodified line
707736 const authHeaders = buildStaticAuthHeaders(config.auth);
708737 const sourceKey = `openapi:${config.name}`;
709738 const credentialSpec = buildCredentialSpec(sourceKey, config.auth);
710− const paths = asRecord(bundled.paths);
739+ const paths = asRecord(prepared.paths);
711740 const tools: ToolDefinition[] = [];
712741
713742 // Schema type aliases referenced by operations — stored on the first tool only
714743 // to avoid duplicating hundreds of KB across every tool from this source.
715− const schemaTypes = typeMap?.schemas.size
716− ? Object.fromEntries(typeMap.schemas)
744+ const schemaTypes = prepared.schemaTypes && Object.keys(prepared.schemaTypes).length > 0
745+ ? prepared.schemaTypes
717746 : undefined;
718747 let schemaTypesEmitted = false;
719748
@@ -747,7 +776,7 @@ async function loadOpenApiTools(config: OpenApiToolSourceConfig): Promise<ToolDe · 27 unmodified lines
747776 }));
748777
749778 // Use openapiTS-generated types if available, otherwise fall back to schema hints
750− const generatedTypes = typeMap?.operations.get(operationIdRaw);
779+ const generatedTypes = prepared.operationTypes?.[operationIdRaw];
751780 let argsType: string;
752781 let returnsType: string;
753782
@@ -842,6 +871,11 @@ async function loadOpenApiTools(config: OpenApiToolSourceConfig): Promise<ToolDe · 88 unmodified lines
842871 return tools;
843872 }
844873
874+async function loadOpenApiTools(config: OpenApiToolSourceConfig): Promise<ToolDefinition[]> {
875+ const prepared = await prepareOpenApiSpec(config.spec, config.name);
876+ return buildOpenApiToolsFromPrepared(config, prepared);
877+}
878+
845879 // ── GraphQL introspection ──
846880
847881 const INTROSPECTION_QUERY = `
executor/package.json+1−0
@@ -18,6 +18,7 @@ · 17 unmodified lines
1818 "typecheck": "bunx tsc --noEmit -p tsconfig.json"
1919 },
2020 "dependencies": {
21+ "@convex-dev/action-cache": "^0.3.0",
2122 "@convex-dev/stripe": "^0.1.3",
2223 "@convex-dev/workos-authkit": "^0.1.6",
2324 "@workos-inc/node": "^8.2.0",