This commit is contained in:
geoffsee
2025-06-25 13:20:59 -04:00
committed by Geoff Seemueller
parent 21d6c8604e
commit 554096abb2
86 changed files with 556 additions and 508 deletions

230
bun.lock
View File

@@ -20,7 +20,13 @@
"packages/ai": {
"name": "@open-gsio/ai",
"devDependencies": {
"@anthropic-ai/sdk": "^0.32.1",
"@open-gsio/env": "workspace:*",
"@open-gsio/schema": "workspace:*",
"openai": "^5.0.1",
"vite": "^6.3.5",
"vitest": "^3.1.4",
"wrangler": "^4.18.0",
},
},
"packages/client": {
@@ -76,14 +82,14 @@
"dependencies": {
"@cloudflare/vite-plugin": "^1.3.1",
"@open-gsio/client": "workspace:*",
"@open-gsio/durable-objects": "workspace:*",
"@open-gsio/server": "workspace:*",
"@open-gsio/coordinators": "workspace:*",
"@open-gsio/router": "workspace:*",
"vite": "6.3.5",
"wrangler": "^4.18.0",
},
},
"packages/durable-objects": {
"name": "@open-gsio/durable-objects",
"packages/coordinators": {
"name": "@open-gsio/coordinators",
"devDependencies": {
"@cloudflare/workers-types": "^4",
"@types/bun": "^1",
@@ -95,6 +101,23 @@
"packages/env": {
"name": "@open-gsio/env",
},
"packages/router": {
"name": "@open-gsio/router",
"devDependencies": {
"@open-gsio/services": "workspace:*",
"itty-router": "^5.0.18",
"mobx": "^6.13.5",
"mobx-state-tree": "^6.0.1",
},
},
"packages/schema": {
"name": "@open-gsio/schema",
"version": "0.0.1",
"devDependencies": {
"mobx-state-tree": "^6.0.1",
"typescript": "^5.7.2",
},
},
"packages/scripts": {
"name": "@open-gsio/scripts",
"devDependencies": {
@@ -106,13 +129,40 @@
},
"packages/server": {
"name": "@open-gsio/server",
"devDependencies": {
"@cloudflare/workers-types": "^4.20241205.0",
"@open-gsio/ai": "workspace:*",
"@open-gsio/client": "workspace:*",
"@open-gsio/coordinators": "workspace:*",
"@open-gsio/env": "workspace:*",
"@open-gsio/router": "workspace:*",
"@testing-library/jest-dom": "^6.4.2",
"@testing-library/user-event": "^14.5.2",
"@vitest/coverage-v8": "^3.1.4",
"@vitest/ui": "^3.1.4",
"bun-sqlite-key-value": "^1.13.1",
"chokidar": "^4.0.1",
"dotenv": "^16.5.0",
"itty-router": "^5.0.18",
"jsdom": "^24.0.0",
"mobx": "^6.13.5",
"mobx-state-tree": "^6.0.1",
"moo": "^0.5.2",
"typescript": "^5.7.2",
"vike": "0.4.193",
"zod": "^3.23.8",
},
},
"packages/services": {
"name": "@open-gsio/services",
"devDependencies": {
"@anthropic-ai/sdk": "^0.32.1",
"@cloudflare/workers-types": "^4.20241205.0",
"@open-gsio/ai": "workspace:*",
"@open-gsio/client": "workspace:*",
"@open-gsio/durable-objects": "workspace:*",
"@open-gsio/coordinators": "workspace:*",
"@open-gsio/env": "workspace:*",
"@open-gsio/schema": "workspace:*",
"@testing-library/jest-dom": "^6.4.2",
"@testing-library/user-event": "^14.5.2",
"@vitest/coverage-v8": "^3.1.4",
@@ -410,55 +460,55 @@
"@emotion/weak-memoize": ["@emotion/weak-memoize@0.4.0", "", {}, "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="],
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.23.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ=="],
"@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="],
"@esbuild/android-arm": ["@esbuild/android-arm@0.23.1", "", { "os": "android", "cpu": "arm" }, "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ=="],
"@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="],
"@esbuild/android-arm64": ["@esbuild/android-arm64@0.23.1", "", { "os": "android", "cpu": "arm64" }, "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw=="],
"@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="],
"@esbuild/android-x64": ["@esbuild/android-x64@0.23.1", "", { "os": "android", "cpu": "x64" }, "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg=="],
"@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="],
"@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.23.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q=="],
"@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="],
"@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.23.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw=="],
"@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="],
"@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.23.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA=="],
"@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="],
"@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.23.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g=="],
"@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="],
"@esbuild/linux-arm": ["@esbuild/linux-arm@0.23.1", "", { "os": "linux", "cpu": "arm" }, "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ=="],
"@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="],
"@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.23.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g=="],
"@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="],
"@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.23.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ=="],
"@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="],
"@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw=="],
"@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="],
"@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q=="],
"@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="],
"@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.23.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw=="],
"@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="],
"@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA=="],
"@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="],
"@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.23.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw=="],
"@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="],
"@esbuild/linux-x64": ["@esbuild/linux-x64@0.23.1", "", { "os": "linux", "cpu": "x64" }, "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ=="],
"@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="],
"@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.4", "", { "os": "none", "cpu": "arm64" }, "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ=="],
"@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.23.1", "", { "os": "none", "cpu": "x64" }, "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA=="],
"@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="],
"@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.23.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q=="],
"@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="],
"@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.23.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA=="],
"@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="],
"@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.23.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA=="],
"@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="],
"@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.23.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A=="],
"@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="],
"@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.23.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ=="],
"@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="],
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.23.1", "", { "os": "win32", "cpu": "x64" }, "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg=="],
"@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="],
"@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="],
@@ -542,14 +592,20 @@
"@open-gsio/client": ["@open-gsio/client@workspace:packages/client"],
"@open-gsio/durable-objects": ["@open-gsio/durable-objects@workspace:packages/durable-objects"],
"@open-gsio/coordinators": ["@open-gsio/coordinators@workspace:packages/coordinators"],
"@open-gsio/env": ["@open-gsio/env@workspace:packages/env"],
"@open-gsio/router": ["@open-gsio/router@workspace:packages/router"],
"@open-gsio/schema": ["@open-gsio/schema@workspace:packages/schema"],
"@open-gsio/scripts": ["@open-gsio/scripts@workspace:packages/scripts"],
"@open-gsio/server": ["@open-gsio/server@workspace:packages/server"],
"@open-gsio/services": ["@open-gsio/services@workspace:packages/services"],
"@open-gsio/worker": ["@open-gsio/worker@workspace:packages/cloudflare-workers/open-gsio"],
"@oven/bun-darwin-aarch64": ["@oven/bun-darwin-aarch64@1.2.16", "", { "os": "darwin", "cpu": "arm64" }, "sha512-NLVU9YDORq/3WuJOE5TQv5of3R99n56gYZPfdqP4U0/5nllbC8yzRxA2BWwAS2RxxD0Y3bxqEVUsIGiTNN2jxg=="],
@@ -972,7 +1028,7 @@
"es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="],
"esbuild": ["esbuild@0.23.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.23.1", "@esbuild/android-arm": "0.23.1", "@esbuild/android-arm64": "0.23.1", "@esbuild/android-x64": "0.23.1", "@esbuild/darwin-arm64": "0.23.1", "@esbuild/darwin-x64": "0.23.1", "@esbuild/freebsd-arm64": "0.23.1", "@esbuild/freebsd-x64": "0.23.1", "@esbuild/linux-arm": "0.23.1", "@esbuild/linux-arm64": "0.23.1", "@esbuild/linux-ia32": "0.23.1", "@esbuild/linux-loong64": "0.23.1", "@esbuild/linux-mips64el": "0.23.1", "@esbuild/linux-ppc64": "0.23.1", "@esbuild/linux-riscv64": "0.23.1", "@esbuild/linux-s390x": "0.23.1", "@esbuild/linux-x64": "0.23.1", "@esbuild/netbsd-x64": "0.23.1", "@esbuild/openbsd-arm64": "0.23.1", "@esbuild/openbsd-x64": "0.23.1", "@esbuild/sunos-x64": "0.23.1", "@esbuild/win32-arm64": "0.23.1", "@esbuild/win32-ia32": "0.23.1", "@esbuild/win32-x64": "0.23.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg=="],
"esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="],
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
@@ -1164,7 +1220,7 @@
"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=="],
"is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
"is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="],
"is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="],
@@ -2086,7 +2142,7 @@
"@open-gsio/client/@types/bun": ["@types/bun@1.2.17", "", { "dependencies": { "bun-types": "1.2.17" } }, "sha512-l/BYs/JYt+cXA/0+wUhulYJB6a6p//GTPiJ7nV+QHa8iiId4HZmnu/3J/SowP5g0rTiERY2kfGKXEK5Ehltx4Q=="],
"@open-gsio/durable-objects/@types/bun": ["@types/bun@1.2.17", "", { "dependencies": { "bun-types": "1.2.17" } }, "sha512-l/BYs/JYt+cXA/0+wUhulYJB6a6p//GTPiJ7nV+QHa8iiId4HZmnu/3J/SowP5g0rTiERY2kfGKXEK5Ehltx4Q=="],
"@open-gsio/coordinators/@types/bun": ["@types/bun@1.2.17", "", { "dependencies": { "bun-types": "1.2.17" } }, "sha512-l/BYs/JYt+cXA/0+wUhulYJB6a6p//GTPiJ7nV+QHa8iiId4HZmnu/3J/SowP5g0rTiERY2kfGKXEK5Ehltx4Q=="],
"@open-gsio/scripts/@types/bun": ["@types/bun@1.2.17", "", { "dependencies": { "bun-types": "1.2.17" } }, "sha512-l/BYs/JYt+cXA/0+wUhulYJB6a6p//GTPiJ7nV+QHa8iiId4HZmnu/3J/SowP5g0rTiERY2kfGKXEK5Ehltx4Q=="],
@@ -2122,6 +2178,8 @@
"data-urls/whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="],
"error-ex/is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
"eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
"eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
@@ -2178,8 +2236,6 @@
"sharp/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
"simple-swizzle/is-arrayish": ["is-arrayish@0.3.2", "", {}, "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="],
"source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
"string-width/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
@@ -2192,12 +2248,12 @@
"test-exclude/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
"vike/esbuild": ["esbuild@0.23.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.23.1", "@esbuild/android-arm": "0.23.1", "@esbuild/android-arm64": "0.23.1", "@esbuild/android-x64": "0.23.1", "@esbuild/darwin-arm64": "0.23.1", "@esbuild/darwin-x64": "0.23.1", "@esbuild/freebsd-arm64": "0.23.1", "@esbuild/freebsd-x64": "0.23.1", "@esbuild/linux-arm": "0.23.1", "@esbuild/linux-arm64": "0.23.1", "@esbuild/linux-ia32": "0.23.1", "@esbuild/linux-loong64": "0.23.1", "@esbuild/linux-mips64el": "0.23.1", "@esbuild/linux-ppc64": "0.23.1", "@esbuild/linux-riscv64": "0.23.1", "@esbuild/linux-s390x": "0.23.1", "@esbuild/linux-x64": "0.23.1", "@esbuild/netbsd-x64": "0.23.1", "@esbuild/openbsd-arm64": "0.23.1", "@esbuild/openbsd-x64": "0.23.1", "@esbuild/sunos-x64": "0.23.1", "@esbuild/win32-arm64": "0.23.1", "@esbuild/win32-ia32": "0.23.1", "@esbuild/win32-x64": "0.23.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg=="],
"vike/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="],
"vike/sirv": ["sirv@2.0.4", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ=="],
"vite/esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="],
"vite-node/es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="],
"workbox-build/@rollup/plugin-replace": ["@rollup/plugin-replace@2.4.2", "", { "dependencies": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" }, "peerDependencies": { "rollup": "^1.20.0 || ^2.0.0" } }, "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg=="],
@@ -2212,8 +2268,6 @@
"workbox-build/source-map": ["source-map@0.8.0-beta.0", "", { "dependencies": { "whatwg-url": "^7.0.0" } }, "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA=="],
"wrangler/esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="],
"wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="],
"wrap-ansi/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="],
@@ -2394,7 +2448,7 @@
"@open-gsio/client/@types/bun/bun-types": ["bun-types@1.2.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ=="],
"@open-gsio/durable-objects/@types/bun/bun-types": ["bun-types@1.2.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ=="],
"@open-gsio/coordinators/@types/bun/bun-types": ["bun-types@1.2.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ=="],
"@open-gsio/scripts/@types/bun/bun-types": ["bun-types@1.2.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ=="],
@@ -2434,53 +2488,53 @@
"test-exclude/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="],
"vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="],
"vike/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.23.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ=="],
"vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="],
"vike/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.23.1", "", { "os": "android", "cpu": "arm" }, "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ=="],
"vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="],
"vike/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.23.1", "", { "os": "android", "cpu": "arm64" }, "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw=="],
"vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="],
"vike/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.23.1", "", { "os": "android", "cpu": "x64" }, "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg=="],
"vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="],
"vike/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.23.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q=="],
"vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="],
"vike/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.23.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw=="],
"vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="],
"vike/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.23.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA=="],
"vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="],
"vike/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.23.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g=="],
"vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="],
"vike/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.23.1", "", { "os": "linux", "cpu": "arm" }, "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ=="],
"vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="],
"vike/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.23.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g=="],
"vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="],
"vike/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.23.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ=="],
"vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="],
"vike/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw=="],
"vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="],
"vike/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q=="],
"vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="],
"vike/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.23.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw=="],
"vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="],
"vike/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.23.1", "", { "os": "linux", "cpu": "none" }, "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA=="],
"vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="],
"vike/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.23.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw=="],
"vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="],
"vike/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.23.1", "", { "os": "linux", "cpu": "x64" }, "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ=="],
"vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="],
"vike/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.23.1", "", { "os": "none", "cpu": "x64" }, "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA=="],
"vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="],
"vike/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.23.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q=="],
"vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="],
"vike/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.23.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA=="],
"vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="],
"vike/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.23.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA=="],
"vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="],
"vike/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.23.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A=="],
"vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="],
"vike/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.23.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ=="],
"vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="],
"vike/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.23.1", "", { "os": "win32", "cpu": "x64" }, "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg=="],
"workbox-build/@rollup/plugin-replace/@rollup/pluginutils": ["@rollup/pluginutils@3.1.0", "", { "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg=="],
@@ -2490,54 +2544,6 @@
"workbox-build/source-map/whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="],
"wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q=="],
"wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.25.4", "", { "os": "android", "cpu": "arm" }, "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ=="],
"wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.4", "", { "os": "android", "cpu": "arm64" }, "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A=="],
"wrangler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.25.4", "", { "os": "android", "cpu": "x64" }, "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ=="],
"wrangler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g=="],
"wrangler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A=="],
"wrangler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ=="],
"wrangler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ=="],
"wrangler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.4", "", { "os": "linux", "cpu": "arm" }, "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ=="],
"wrangler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ=="],
"wrangler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ=="],
"wrangler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA=="],
"wrangler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg=="],
"wrangler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag=="],
"wrangler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.4", "", { "os": "linux", "cpu": "none" }, "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA=="],
"wrangler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g=="],
"wrangler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.4", "", { "os": "linux", "cpu": "x64" }, "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA=="],
"wrangler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.4", "", { "os": "none", "cpu": "x64" }, "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw=="],
"wrangler/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A=="],
"wrangler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw=="],
"wrangler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q=="],
"wrangler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ=="],
"wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg=="],
"wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.4", "", { "os": "win32", "cpu": "x64" }, "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ=="],
"wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
"wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="],

View File

@@ -1,7 +1,18 @@
{
"name": "@open-gsio/ai",
"module": "index.ts",
"type": "module",
"module": "src/index.ts",
"scripts": {
"tests": "vitest run",
"tests:coverage": "vitest run --coverage.enabled=true"
},
"devDependencies": {
"@open-gsio/env": "workspace:*"
"@open-gsio/env": "workspace:*",
"@open-gsio/schema": "workspace:*",
"@anthropic-ai/sdk": "^0.32.1",
"openai": "^5.0.1",
"wrangler": "^4.18.0",
"vitest": "^3.1.4",
"vite": "^6.3.5"
}
}

View File

@@ -1,8 +0,0 @@
export * from './claude';
export * from './cerebras';
export * from './cloudflareAi';
export * from './fireworks';
export * from './groq';
export * from './mlx-omni';
export * from './ollama';
export * from './xai';

View File

@@ -1,7 +1,7 @@
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { AssistantSdk } from '../assistant-sdk.ts';
import { Utils } from '../utils.ts';
import { AssistantSdk } from '../assistant-sdk';
import { Utils } from '../utils/utils.ts';
// Mock dependencies
vi.mock('../utils', () => ({
@@ -88,6 +88,7 @@ describe('AssistantSdk', () => {
question1: 'answer1',
question2: 'answer2',
});
// @ts-expect-error - is supposed to break
vi.mocked(Utils.getCurrentDate).mockReturnValue(undefined);
const prompt = AssistantSdk.getAssistantPrompt({});
@@ -97,7 +98,7 @@ describe('AssistantSdk', () => {
});
it('should use few_shots directly when Utils.selectEquitably is not available', () => {
// Mock dependencies
// @ts-expect-error - is supposed to break
vi.mocked(Utils.selectEquitably).mockReturnValue(undefined);
vi.mocked(Utils.getCurrentDate).mockReturnValue('2023-01-01T12:30:45Z');

View File

@@ -1,9 +1,8 @@
import { Message } from '@open-gsio/schema';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { ProviderRepository } from '../../../../ai/providers/_ProviderRepository.ts';
import Message from '../../models/Message.ts';
import { AssistantSdk } from '../assistant-sdk.ts';
import { ChatSdk } from '../chat-sdk.ts';
import { AssistantSdk } from '../assistant-sdk';
import { ChatSdk } from '../chat-sdk';
// Mock dependencies
vi.mock('../assistant-sdk', () => ({

View File

@@ -1,6 +1,6 @@
import { describe, it, expect } from 'vitest';
import { Utils } from '../utils.ts';
import { Utils } from '../utils/utils.ts';
describe('Debug Utils.getSeason', () => {
it('should print out the actual seasons for different dates', () => {

View File

@@ -1,6 +1,6 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import handleStreamData from '../handleStreamData.ts';
import handleStreamData from '../utils/handleStreamData.ts';
describe('handleStreamData', () => {
// Setup mocks
@@ -52,6 +52,7 @@ describe('handleStreamData', () => {
expect(mockController.enqueue).toHaveBeenCalledTimes(1);
expect(mockEncoder.encode).toHaveBeenCalledWith(expect.stringContaining('Hello world'));
// @ts-expect-error - mock
const encodedData = mockEncoder.encode.mock.calls[0][0];
const parsedData = JSON.parse(encodedData.split('data: ')[1]);
@@ -76,6 +77,7 @@ describe('handleStreamData', () => {
expect(mockController.enqueue).toHaveBeenCalledTimes(1);
expect(mockEncoder.encode).toHaveBeenCalledWith(expect.stringContaining('Hello world'));
// @ts-expect-error - mock
const encodedData = mockEncoder.encode.mock.calls[0][0];
const parsedData = JSON.parse(encodedData.split('data: ')[1]);
@@ -107,6 +109,7 @@ describe('handleStreamData', () => {
expect(mockController.enqueue).toHaveBeenCalledTimes(1);
expect(mockEncoder.encode).toHaveBeenCalledWith(expect.stringContaining('Hello world'));
// @ts-expect-error - mock
const encodedData = mockEncoder.encode.mock.calls[0][0];
const parsedData = JSON.parse(encodedData.split('data: ')[1]);
@@ -132,7 +135,7 @@ describe('handleStreamData', () => {
},
};
handler(data);
handler(data as any);
expect(mockController.enqueue).toHaveBeenCalledTimes(1);
expect(mockEncoder.encode).toHaveBeenCalledWith(
@@ -151,7 +154,7 @@ describe('handleStreamData', () => {
},
};
handler(data);
handler(data as any);
expect(mockController.enqueue).not.toHaveBeenCalled();
expect(mockEncoder.encode).not.toHaveBeenCalled();
@@ -182,7 +185,7 @@ describe('handleStreamData', () => {
},
});
handler(data, transformFn);
handler(data as any, transformFn);
expect(transformFn).toHaveBeenCalledWith(data);
expect(mockController.enqueue).toHaveBeenCalledTimes(1);

View File

@@ -1,6 +1,6 @@
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { Utils } from '../utils.ts';
import { Utils } from '../utils/utils.ts';
describe('Utils', () => {
describe('getSeason', () => {
@@ -43,6 +43,7 @@ describe('Utils', () => {
beforeEach(() => {
// Mock Intl.DateTimeFormat
// @ts-expect-error - mock
global.Intl.DateTimeFormat = vi.fn().mockReturnValue({
resolvedOptions: vi.fn().mockReturnValue({
timeZone: 'America/New_York',
@@ -152,7 +153,7 @@ describe('Utils', () => {
{ role: 'user', content: 'How are you?' },
];
const result = Utils.normalizeWithBlanks(messages);
const result = Utils.normalizeWithBlanks(messages as any[]);
expect(result.length).toBe(3);
expect(result[0]).toEqual({ role: 'user', content: 'Hello' });
@@ -163,7 +164,7 @@ describe('Utils', () => {
it('should insert blank user message if first message is assistant', () => {
const messages = [{ role: 'assistant', content: 'Hello, how can I help?' }];
const result = Utils.normalizeWithBlanks(messages);
const result = Utils.normalizeWithBlanks(messages as any[]);
expect(result.length).toBe(2);
expect(result[0]).toEqual({ role: 'user', content: '' });
@@ -185,7 +186,7 @@ describe('Utils', () => {
{ role: 'user', content: 'How are you?' },
];
const result = Utils.normalizeWithBlanks(messages);
const result = Utils.normalizeWithBlanks(messages as any[]);
expect(result.length).toBe(3);
expect(result).toEqual(messages);

View File

@@ -1,6 +1,5 @@
import few_shots from '../prompts/few_shots.ts';
import { Utils } from './utils.ts';
import Prompts from '../prompts';
import { Common } from '../utils';
export class AssistantSdk {
static getAssistantPrompt(params: {
@@ -10,10 +9,10 @@ export class AssistantSdk {
}): string {
const { maxTokens, userTimezone = 'UTC', userLocation = '' } = params;
// console.log('[DEBUG_LOG] few_shots:', JSON.stringify(few_shots));
let selectedFewshots = Utils.selectEquitably?.(few_shots);
let selectedFewshots = Common.Utils.selectEquitably?.(Prompts.FewShots);
// console.log('[DEBUG_LOG] selectedFewshots after Utils.selectEquitably:', JSON.stringify(selectedFewshots));
if (!selectedFewshots) {
selectedFewshots = few_shots;
selectedFewshots = Prompts.FewShots;
// console.log('[DEBUG_LOG] selectedFewshots after fallback:', JSON.stringify(selectedFewshots));
}
const sdkDate = new Date().toISOString();

View File

@@ -0,0 +1,3 @@
import { AssistantSdk } from './assistant-sdk.ts';
export { AssistantSdk };

View File

@@ -1,14 +1,19 @@
import { ProviderRepository } from '@open-gsio/ai/providers/_ProviderRepository.ts';
import { Message } from '@open-gsio/schema';
import type { Instance } from 'mobx-state-tree';
import { OpenAI } from 'openai';
import Message from '../models/Message.ts';
import { AssistantSdk } from './assistant-sdk.ts';
import { AssistantSdk } from '../assistant-sdk';
import { ProviderRepository } from '../providers/_ProviderRepository.ts';
import type {
BuildAssistantPromptParams,
ChatRequestBody,
GenericEnv,
PreprocessParams,
} from '../types';
export class ChatSdk {
static async preprocess({ messages }) {
// run processing on messages to generate events/context
static async preprocess(params: PreprocessParams) {
// a slot for to provide additional context
return Message.create({
role: 'assistant',
content: '',
@@ -21,11 +26,11 @@ export class ChatSdk {
openai: OpenAI;
systemPrompt: any;
maxTokens: any;
env: Env;
env: GenericEnv;
},
) {
const streamId = crypto.randomUUID();
const { messages, model, conversationId } = await request.json();
const { messages, model, conversationId } = (await request.json()) as ChatRequestBody;
if (!messages?.length) {
return new Response('No messages provided', { status: 400 });
@@ -67,7 +72,7 @@ export class ChatSdk {
static async calculateMaxTokens(
messages: any[],
ctx: Record<string, any> & {
env: Env;
env: GenericEnv;
maxTokens: number;
},
) {
@@ -76,7 +81,8 @@ export class ChatSdk {
return durableObject.dynamicMaxTokens(messages, ctx.maxTokens);
}
static buildAssistantPrompt({ maxTokens }) {
static buildAssistantPrompt(params: BuildAssistantPromptParams) {
const { maxTokens } = params;
return AssistantSdk.getAssistantPrompt({
maxTokens,
userTimezone: 'UTC',
@@ -91,7 +97,7 @@ export class ChatSdk {
assistantPrompt: string;
toolResults: Instance<typeof Message>;
model: any;
env: Env;
env: GenericEnv;
},
) {
const modelFamily = await ProviderRepository.getModelFamily(opts.model, opts.env);

View File

@@ -0,0 +1 @@
export * from './chat-sdk.ts';

View File

@@ -0,0 +1,5 @@
import few_shots from './few_shots.ts';
export default {
FewShots: few_shots,
};

View File

@@ -1,8 +1,8 @@
export type GenericEnv = Record<string, any>;
import type { GenericEnv, ModelMeta, Providers, SupportedProvider } from '../types';
export class ProviderRepository {
#providers: { name: string; key: string; endpoint: string }[] = [];
#env: Record<string, any>;
#providers: Providers = [];
#env: GenericEnv;
constructor(env: GenericEnv) {
this.#env = env;
@@ -16,43 +16,52 @@ export class ProviderRepository {
fireworks: 'https://api.fireworks.ai/inference/v1',
cohere: 'https://api.cohere.ai/compatibility/v1',
cloudflare: 'https://api.cloudflare.com/client/v4/accounts/{CLOUDFLARE_ACCOUNT_ID}/ai/v1',
anthropic: 'https://api.anthropic.com/v1',
claude: 'https://api.anthropic.com/v1',
openai: 'https://api.openai.com/v1',
cerebras: 'https://api.cerebras.com/v1',
ollama: 'http://localhost:11434/v1',
mlx: 'http://localhost:10240/v1',
};
static async getModelFamily(model: any, env: Env) {
static async getModelFamily(model: any, env: GenericEnv) {
const allModels = await env.KV_STORAGE.get('supportedModels');
const models = JSON.parse(allModels);
const modelData = models.filter(m => m.id === model);
const modelData = models.filter((m: ModelMeta) => m.id === model);
return modelData[0].provider;
}
static async getModelMeta(meta, env) {
static async getModelMeta(meta: any, env: GenericEnv) {
const allModels = await env.KV_STORAGE.get('supportedModels');
const models = JSON.parse(allModels);
return models.filter(m => m.id === meta.model).pop();
return models.filter((m: ModelMeta) => m.id === meta.model).pop();
}
getProviders(): { name: string; key: string; endpoint: string }[] {
return this.#providers;
}
setProviders(env: Record<string, any>) {
setProviders(env: GenericEnv) {
const indicies = {
providerName: 0,
providerValue: 1,
};
const valueDelimiter = '_';
const envKeys = Object.keys(env);
for (let i = 0; i < envKeys.length; i++) {
if (envKeys[i].endsWith('KEY')) {
const detectedProvider = envKeys[i].split('_')[0].toLowerCase();
const detectedProviderValue = env[envKeys[i]];
if (envKeys.at(i)?.endsWith('KEY')) {
const detectedProvider = envKeys
.at(i)
?.split(valueDelimiter)
.at(indicies.providerName)
?.toLowerCase();
const detectedProviderValue = env[envKeys.at(i) as string];
if (detectedProviderValue) {
switch (detectedProvider) {
case 'anthropic':
this.#providers.push({
name: 'anthropic',
name: 'claude',
key: env.ANTHROPIC_API_KEY,
endpoint: ProviderRepository.OPENAI_COMPAT_ENDPOINTS['anthropic'],
endpoint: ProviderRepository.OPENAI_COMPAT_ENDPOINTS['claude'],
});
break;
case 'gemini':
@@ -74,9 +83,10 @@ export class ProviderRepository {
break;
default:
this.#providers.push({
name: detectedProvider,
key: env[envKeys[i]],
endpoint: ProviderRepository.OPENAI_COMPAT_ENDPOINTS[detectedProvider],
name: detectedProvider as SupportedProvider,
key: env[envKeys[i] as string],
endpoint:
ProviderRepository.OPENAI_COMPAT_ENDPOINTS[detectedProvider as SupportedProvider],
});
}
}

View File

@@ -48,12 +48,11 @@ export class CerebrasSdk {
param: {
openai: OpenAI;
systemPrompt: any;
disableWebhookGeneration: boolean;
preprocessedContext: any;
maxTokens: unknown | number | undefined;
messages: any;
model: string;
env: Env;
env: GenericEnv;
},
dataCallback: (data: any) => void,
) {

View File

@@ -1,6 +1,8 @@
import ChatSdk from '@open-gsio/server/src/lib/chat-sdk.ts';
import { OpenAI } from 'openai';
import ChatSdk from '../chat-sdk/chat-sdk.ts';
import type { GenericEnv } from '../types';
export interface CommonProviderParams {
openai?: OpenAI; // Optional for providers that use a custom client.
systemPrompt: any;
@@ -8,7 +10,7 @@ export interface CommonProviderParams {
maxTokens: number | unknown | undefined;
messages: any;
model: string;
env: Env;
env: GenericEnv;
disableWebhookGeneration?: boolean;
// Additional fields can be added as needed
}
@@ -20,7 +22,7 @@ export interface ChatStreamProvider {
export abstract class BaseChatProvider implements ChatStreamProvider {
abstract getOpenAIClient(param: CommonProviderParams): OpenAI;
abstract getStreamParams(param: CommonProviderParams, safeMessages: any[]): any;
abstract async processChunk(chunk: any, dataCallback: (data: any) => void): Promise<boolean>;
abstract processChunk(chunk: any, dataCallback: (data: any) => void): Promise<boolean>;
async handleStream(param: CommonProviderParams, dataCallback: (data: any) => void) {
const assistantPrompt = ChatSdk.buildAssistantPrompt({ maxTokens: param.maxTokens });
@@ -36,7 +38,7 @@ export abstract class BaseChatProvider implements ChatStreamProvider {
const streamParams = this.getStreamParams(param, safeMessages);
const stream = await client.chat.completions.create(streamParams);
for await (const chunk of stream) {
for await (const chunk of stream as unknown as AsyncIterable<any>) {
const shouldBreak = await this.processChunk(chunk, dataCallback);
if (shouldBreak) break;
}

View File

@@ -1,5 +1,4 @@
import Anthropic from '@anthropic-ai/sdk';
import ChatSdk from '@open-gsio/server/src/lib/chat-sdk.ts';
import type {
_NotCustomized,
ISimpleType,
@@ -9,6 +8,9 @@ import type {
} from 'mobx-state-tree';
import { OpenAI } from 'openai';
import ChatSdk from '../chat-sdk/chat-sdk.ts';
import type { GenericEnv, GenericStreamData } from '../types';
import { BaseChatProvider, type CommonProviderParams } from './chat-stream-provider.ts';
export class ClaudeChatProvider extends BaseChatProvider {
@@ -103,9 +105,9 @@ export class ClaudeChatSdk {
maxTokens: unknown | number | undefined;
messages: any;
model: string;
env: Env;
env: GenericEnv;
},
dataCallback: (data) => void,
dataCallback: (data: GenericStreamData) => void,
) {
return this.provider.handleStream(
{

View File

@@ -48,7 +48,8 @@ export class FireworksAiChatSdk {
model: any;
env: any;
},
dataCallback: (data) => void,
// TODO: Replace usage of any with an explicit but permissive type
dataCallback: (data: any) => void,
) {
return this.provider.handleStream(
{

View File

@@ -1,4 +1,3 @@
import { type StreamParams } from '@open-gsio/server/src/services/ChatService';
import { OpenAI } from 'openai';
import { ProviderRepository } from './_ProviderRepository.ts';

View File

@@ -0,0 +1,8 @@
export * from './claude.ts';
export * from './cerebras.ts';
export * from './cloudflareAi.ts';
export * from './fireworks.ts';
export * from './groq.ts';
export * from './mlx-omni.ts';
export * from './ollama.ts';
export * from './xai.ts';

View File

@@ -1,8 +1,9 @@
import { Utils } from '@open-gsio/server/src/lib/utils.ts';
import { OpenAI } from 'openai';
import { ChatCompletionCreateParamsStreaming } from 'openai/resources/chat/completions/completions';
import { type ChatCompletionCreateParamsStreaming } from 'openai/resources/chat/completions/completions';
import { BaseChatProvider, CommonProviderParams } from './chat-stream-provider.ts';
import { Common } from '../utils';
import { BaseChatProvider, type CommonProviderParams } from './chat-stream-provider.ts';
export class MlxOmniChatProvider extends BaseChatProvider {
getOpenAIClient(param: CommonProviderParams): OpenAI {
@@ -38,7 +39,7 @@ export class MlxOmniChatProvider extends BaseChatProvider {
const isLocal = client.baseURL.includes('localhost');
if (isLocal) {
completionRequest['messages'] = Utils.normalizeWithBlanks(safeMessages);
completionRequest['messages'] = Common.Utils.normalizeWithBlanks(safeMessages);
completionRequest['stream_options'] = {
include_usage: true,
};
@@ -86,7 +87,7 @@ export class MlxOmniChatSdk {
systemPrompt: ctx.systemPrompt,
preprocessedContext: ctx.preprocessedContext,
maxTokens: ctx.maxTokens,
messages: Utils.normalizeWithBlanks(ctx.messages),
messages: Common.Utils.normalizeWithBlanks(ctx.messages),
model: ctx.model,
env: ctx.env,
},

View File

@@ -1,7 +1,9 @@
import { OpenAI } from 'openai';
import type { GenericEnv } from '../types';
import { ProviderRepository } from './_ProviderRepository.ts';
import { BaseChatProvider, CommonProviderParams } from './chat-stream-provider.ts';
import { BaseChatProvider, type CommonProviderParams } from './chat-stream-provider.ts';
export class OllamaChatProvider extends BaseChatProvider {
getOpenAIClient(param: CommonProviderParams): OpenAI {
@@ -49,9 +51,8 @@ export class OllamaChatSdk {
preprocessedContext: any;
maxTokens: unknown | number | undefined;
messages: any;
disableWebhookGeneration: boolean;
model: any;
env: Env;
env: GenericEnv;
},
dataCallback: (data: any) => any,
) {
@@ -67,7 +68,6 @@ export class OllamaChatSdk {
messages: ctx.messages,
model: ctx.model,
env: ctx.env,
disableWebhookGeneration: ctx.disableWebhookGeneration,
},
dataCallback,
);

View File

@@ -1,8 +1,9 @@
import { Utils } from '@open-gsio/server/src/lib/utils.ts';
import { OpenAI } from 'openai';
import { ChatCompletionCreateParamsStreaming } from 'openai/resources/chat/completions/completions';
import type { ChatCompletionCreateParamsStreaming } from 'openai/resources/chat/completions/completions';
import { BaseChatProvider, CommonProviderParams } from './chat-stream-provider.ts';
import { Common } from '../utils';
import { BaseChatProvider, type CommonProviderParams } from './chat-stream-provider.ts';
export class OpenAiChatProvider extends BaseChatProvider {
getOpenAIClient(param: CommonProviderParams): OpenAI {
@@ -48,7 +49,7 @@ export class OpenAiChatProvider extends BaseChatProvider {
const isLocal = client.baseURL.includes('localhost');
if (isLocal) {
completionRequest['messages'] = Utils.normalizeWithBlanks(safeMessages);
completionRequest['messages'] = Common.Utils.normalizeWithBlanks(safeMessages);
completionRequest['stream_options'] = {
include_usage: true,
};

View File

@@ -1,6 +1,8 @@
import { OpenAI } from 'openai';
import { BaseChatProvider, CommonProviderParams } from './chat-stream-provider.ts';
import type { GenericEnv, GenericStreamData } from '../types';
import { BaseChatProvider, type CommonProviderParams } from './chat-stream-provider.ts';
export class XaiChatProvider extends BaseChatProvider {
getOpenAIClient(param: CommonProviderParams): OpenAI {
@@ -48,11 +50,10 @@ export class XaiChatSdk {
preprocessedContext: any;
maxTokens: unknown | number | undefined;
messages: any;
disableWebhookGeneration: boolean;
model: any;
env: Env;
env: GenericEnv;
},
dataCallback: (data: any) => any,
dataCallback: (data: GenericStreamData) => any,
) {
if (!ctx.messages?.length) {
return new Response('No messages provided', { status: 400 });

View File

@@ -0,0 +1 @@
export * from './types.ts';

View File

@@ -0,0 +1,5 @@
{
"name": "@open-gsio/types",
"type": "module",
"module": "index.ts"
}

View File

@@ -0,0 +1,29 @@
import { ProviderRepository } from '../providers/_ProviderRepository.ts';
export type GenericEnv = Record<string, any>;
export type GenericStreamData = any;
export type ModelMeta = {
id: any;
} & Record<string, any>;
export type SupportedProvider = keyof typeof ProviderRepository.OPENAI_COMPAT_ENDPOINTS & string;
export type Provider = { name: SupportedProvider; key: string; endpoint: string };
export type Providers = Provider[];
export type ChatRequestBody = {
messages: any[];
model: string;
conversationId: string;
};
export interface BuildAssistantPromptParams {
maxTokens: any;
}
export interface PreprocessParams {
messages: any[];
}

View File

@@ -0,0 +1,3 @@
import * as Common from './utils.ts';
export { Common };

View File

@@ -1,3 +1,5 @@
import handleStreamData from './handleStreamData.ts';
export class Utils {
static getSeason(date: string): string {
const hemispheres = {
@@ -34,7 +36,7 @@ export class Utils {
const sources = [a, b, c, d];
const result = {};
let combinedItems = [];
let combinedItems: any[] = [];
sources.forEach((source, index) => {
combinedItems.push(...Object.keys(source).map(key => ({ source: index, key })));
});
@@ -74,6 +76,8 @@ export class Utils {
return out;
}
static handleStreamData = handleStreamData;
}
// Normalize module exports

View File

@@ -1,5 +1,5 @@
import { ServerCoordinator } from '@open-gsio/durable-objects';
import Router from '@open-gsio/server/src/router';
import { ServerCoordinator } from '@open-gsio/coordinators';
import Router from '@open-gsio/router';
export { ServerCoordinator };

View File

@@ -12,8 +12,8 @@
"@cloudflare/vite-plugin": "^1.3.1",
"vite": "6.3.5",
"wrangler": "^4.18.0",
"@open-gsio/server": "workspace:*",
"@open-gsio/client": "workspace:*",
"@open-gsio/durable-objects": "workspace:*"
"@open-gsio/coordinators": "workspace:*",
"@open-gsio/router": "workspace:*"
}
}

View File

@@ -1,5 +1,5 @@
{
"name": "@open-gsio/durable-objects",
"name": "@open-gsio/coordinators",
"module": "index.ts",
"type": "module",
"private": true,

View File

@@ -0,0 +1,15 @@
{
"name": "@open-gsio/router",
"type": "module",
"module": "src/index.ts",
"scripts": {
"tests": "vitest run",
"tests:coverage": "vitest run --coverage.enabled=true"
},
"devDependencies": {
"@open-gsio/services": "workspace:*",
"itty-router": "^5.0.18",
"mobx": "^6.13.5",
"mobx-state-tree": "^6.0.1"
}
}

View File

@@ -1,6 +1,6 @@
import { describe, it, expect, vi } from 'vitest';
import { createRouter } from '../src/router/router.ts';
import { createRouter } from '../router.ts';
// Mock the vike/server module
vi.mock('vike/server', () => ({

View File

@@ -1,12 +1,13 @@
import {
ChatService,
ContactService,
AssetService,
MetricsService,
TransactionService,
FeedbackService,
} from '@open-gsio/services';
import { types, type Instance, getMembers } from 'mobx-state-tree';
import AssetService from './src/services/AssetService.ts';
import ChatService from './src/services/ChatService.ts';
import ContactService from './src/services/ContactService.ts';
import FeedbackService from './src/services/FeedbackService.ts';
import MetricsService from './src/services/MetricsService.ts';
import TransactionService from './src/services/TransactionService.ts';
const RequestContext = types
.model('RequestContext', {
chatService: ChatService,
@@ -22,14 +23,18 @@ const RequestContext = types
return {
setEnv(env: Env) {
services.forEach(service => {
// @ts-expect-error - override indexing type error
if (typeof self[service]?.setEnv === 'function') {
// @ts-expect-error - override indexing type error
self[service].setEnv(env);
}
});
},
setCtx(ctx: ExecutionContext) {
services.forEach(service => {
// @ts-expect-error - override indexing type error
if (typeof self[service]?.setCtx === 'function') {
// @ts-expect-error - override indexing type error
self[service].setCtx(ctx);
}
});
@@ -37,9 +42,9 @@ const RequestContext = types
};
});
export type IRootStore = Instance<typeof RequestContext>;
export type RequestContextInstance = Instance<typeof RequestContext>;
const createRequestContext = (env, ctx) => {
const createRequestContext = (env: Env, ctx: any) => {
const instance = RequestContext.create({
contactService: ContactService.create({}),
assetService: AssetService.create({}),
@@ -48,7 +53,6 @@ const createRequestContext = (env, ctx) => {
metricsService: MetricsService.create({
isCollectingMetrics: true,
}),
// @ts-expect-error - this is fine
chatService: ChatService.create({
openAIApiKey: env.OPENAI_API_KEY,
openAIBaseURL: env.OPENAI_API_ENDPOINT,
@@ -64,5 +68,3 @@ const createRequestContext = (env, ctx) => {
};
export { createRequestContext };
export default RequestContext;

View File

@@ -1,6 +1,6 @@
import { Router, withParams } from 'itty-router';
import { createRequestContext } from '../../RequestContext.ts';
import { createRequestContext } from './request-context.ts';
export function createRouter() {
return (

View File

@@ -0,0 +1,25 @@
{
"name": "@open-gsio/schema",
"version": "0.0.1",
"description": "Schema for open-gsio",
"type": "module",
"module": "src/index.ts",
"exports": {
".": {
"import": "./src/index.ts",
"types": "./src/index.ts"
}
},
"license": "MIT",
"files": [
"src"
],
"scripts": {
"build": "tsc",
"test": "vitest"
},
"devDependencies": {
"typescript": "^5.7.2",
"mobx-state-tree": "^6.0.1"
}
}

View File

@@ -0,0 +1,3 @@
import * as Schema from './models';
export { Schema };

View File

@@ -1,9 +1,11 @@
import { types } from 'mobx-state-tree';
export default types.model('ContactRecord', {
const ContactRecord = types.model('ContactRecord', {
message: types.string,
timestamp: types.string,
email: types.string,
firstname: types.string,
lastname: types.string,
});
export default ContactRecord;

View File

@@ -0,0 +1,7 @@
import ContactRecord from './ContactRecord';
import FeedbackRecord from './FeedbackRecord';
import Message from './Message';
import O1Message from './O1Message';
import OpenAiMessage from './OpenAiMessage';
export { ContactRecord, FeedbackRecord, Message, O1Message, OpenAiMessage };

View File

@@ -1,20 +1,3 @@
# @open-gsio/server
This directory contains the server component of open-gsio, a full-stack Conversational AI application. The server handles API requests, manages AI model interactions, serves static assets, and provides server-side rendering capabilities.
## Directory Structure
- `__tests__/`: Contains test files for the server components
- `services/`: Contains service modules for different functionalities
- `AssetService.ts`: Handles static assets and SSR
- `ChatService.ts`: Manages chat interactions with AI models
- `ContactService.ts`: Processes contact form submissions
- `FeedbackService.ts`: Handles user feedback
- `MetricsService.ts`: Collects and processes metrics
- `TransactionService.ts`: Manages transactions
- `durable_objects/`: Contains durable object implementations
- `ServerCoordinator.ts`: Cloudflare Implementation
- `ServerCoordinatorBun.ts`: Bun Implementation
- `router.ts`: API Router
- `RequestContext.ts`: Application Context
- `server.ts`: Main server entry point
This directory contains a bun server component of open-gsio. Static files are not being served yet.

View File

@@ -1,193 +0,0 @@
import { type Instance } from 'mobx-state-tree';
import { renderPage } from 'vike/server';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import AssetService from '../src/services/AssetService.ts';
// Define types for testing
type AssetServiceInstance = Instance<typeof AssetService>;
// Mock the vike/server module
vi.mock('vike/server', () => ({
renderPage: vi.fn(),
}));
// Import the mocked renderPage function for assertions
// Mock global types
vi.stubGlobal('ReadableStream', class MockReadableStream {});
vi.stubGlobal(
'Response',
class MockResponse {
status: number;
headers: Headers;
body: any;
constructor(body?: any, init?: ResponseInit) {
this.body = body;
this.status = init?.status || 200;
this.headers = new Headers(init?.headers);
}
clone() {
return this;
}
async text() {
return this.body?.toString() || '';
}
},
);
describe('AssetService', () => {
let assetService: AssetServiceInstance;
beforeEach(() => {
// Create a new instance of the service before each test
assetService = AssetService.create();
// Reset mocks
vi.resetAllMocks();
});
describe('Initial state', () => {
it('should have empty env and ctx objects initially', () => {
expect(assetService.env).toEqual({});
expect(assetService.ctx).toEqual({});
});
});
describe('setEnv', () => {
it('should set the environment', () => {
const mockEnv = { ASSETS: { fetch: vi.fn() } };
assetService.setEnv(mockEnv);
expect(assetService.env).toEqual(mockEnv);
});
});
describe('setCtx', () => {
it('should set the execution context', () => {
const mockCtx = { waitUntil: vi.fn() };
assetService.setCtx(mockCtx);
expect(assetService.ctx).toEqual(mockCtx);
});
});
describe('handleSsr', () => {
it('should return null when httpResponse is not available', async () => {
// Setup mock to return a pageContext without httpResponse
vi.mocked(renderPage).mockResolvedValue({});
const url = 'https://example.com';
const headers = new Headers();
const env = {};
const result = await assetService.handleSsr(url, headers, env);
// Verify renderPage was called with correct arguments
expect(renderPage).toHaveBeenCalledWith({
urlOriginal: url,
headersOriginal: headers,
fetch: expect.any(Function),
env,
});
// Verify result is null
expect(result).toBeNull();
});
it('should return a Response when httpResponse is available', async () => {
// Create mock stream
const mockStream = new ReadableStream();
// Setup mock to return a pageContext with httpResponse
vi.mocked(renderPage).mockResolvedValue({
httpResponse: {
statusCode: 200,
headers: new Headers({ 'Content-Type': 'text/html' }),
getReadableWebStream: () => mockStream,
},
});
const url = 'https://example.com';
const headers = new Headers();
const env = {};
const result = await assetService.handleSsr(url, headers, env);
// Verify renderPage was called with correct arguments
expect(renderPage).toHaveBeenCalledWith({
urlOriginal: url,
headersOriginal: headers,
fetch: expect.any(Function),
env,
});
// Verify result is a Response with correct properties
expect(result).toBeInstanceOf(Response);
expect(result.status).toBe(200);
expect(result.headers.get('Content-Type')).toBe('text/html');
});
});
describe('handleStaticAssets', () => {
it('should fetch assets from the environment', async () => {
// Create mock request
const request = new Request('https://example.com/static/image.png');
// Create mock response
const mockResponse = new Response('Mock asset content', {
status: 200,
headers: { 'Content-Type': 'image/png' },
});
// Create mock environment with ASSETS.fetch
const mockEnv = {
ASSETS: {
fetch: vi.fn().mockResolvedValue(mockResponse),
},
};
// Set the environment
assetService.setEnv(mockEnv);
// Call the method
const result = await assetService.handleStaticAssets(request, mockEnv);
// Verify ASSETS.fetch was called with the request
expect(mockEnv.ASSETS.fetch).toHaveBeenCalledWith(request);
// Verify result is the expected response
expect(result).toBe(mockResponse);
});
it('should return a 404 response when an error occurs', async () => {
// Create mock request
const request = new Request('https://example.com/static/not-found.png');
// Create mock environment with ASSETS.fetch that throws an error
const mockEnv = {
ASSETS: {
fetch: vi.fn().mockRejectedValue(new Error('Asset not found')),
},
};
// Set the environment
assetService.setEnv(mockEnv);
// Call the method
const result = await assetService.handleStaticAssets(request, mockEnv);
// Verify ASSETS.fetch was called with the request
expect(mockEnv.ASSETS.fetch).toHaveBeenCalledWith(request);
// Verify result is a 404 Response
expect(result).toBeInstanceOf(Response);
expect(result.status).toBe(404);
// Verify response body
const text = await result.clone().text();
expect(text).toBe('Asset not found');
});
});
});

View File

@@ -2,18 +2,15 @@
"name": "@open-gsio/server",
"type": "module",
"scripts": {
"clean": "rm -rf ../../node_modules && rm -rf .wrangler && rm -rf dist && rm -rf coverage && rm -rf html",
"dev": "bun src/server/server.ts",
"tests": "vitest run",
"build": "bun run src/server/build.ts",
"tests:coverage": "vitest run --coverage.enabled=true"
"build": "bun run src/server/build.ts"
},
"devDependencies": {
"@open-gsio/env": "workspace:*",
"@open-gsio/client": "workspace:*",
"@open-gsio/durable-objects": "workspace:*",
"@open-gsio/router": "workspace:*",
"@open-gsio/coordinators": "workspace:*",
"@open-gsio/ai": "workspace:*",
"@anthropic-ai/sdk": "^0.32.1",
"bun-sqlite-key-value": "^1.13.1",
"@cloudflare/workers-types": "^4.20241205.0",
"@testing-library/jest-dom": "^6.4.2",
@@ -26,12 +23,8 @@
"mobx": "^6.13.5",
"mobx-state-tree": "^6.0.1",
"moo": "^0.5.2",
"openai": "^5.0.1",
"typescript": "^5.7.2",
"vike": "0.4.193",
"vite": "^6.3.5",
"vitest": "^3.1.4",
"wrangler": "^4.18.0",
"zod": "^3.23.8",
"dotenv": "^16.5.0"
}

View File

@@ -1,7 +1,7 @@
// handles builds the server into js
await Bun.build({
entrypoints: ['./server.ts'],
outdir: './build',
outdir: '../dist',
minify: true,
target: 'node',
splitting: true,

View File

@@ -1,10 +1,10 @@
import { readdir } from 'node:fs/promises';
import ServerCoordinator from '@open-gsio/durable-objects/src/ServerCoordinatorBun.ts';
import ServerCoordinator from '@open-gsio/coordinators/src/ServerCoordinatorBun.ts';
import Router from '@open-gsio/router';
import { config } from 'dotenv';
import type { RequestLike } from 'itty-router';
import Router from '../router';
import { BunSqliteKVNamespace } from '../storage/BunSqliteKVNamespace.ts';
const router = Router.Router();

View File

@@ -0,0 +1,3 @@
# @open-gsio/services
A service layer powered by mobx-state-tree.

View File

@@ -0,0 +1,37 @@
{
"name": "@open-gsio/services",
"type": "module",
"module": "src/index.ts",
"scripts": {
"tests": "vitest run",
"tests:coverage": "vitest run --coverage.enabled=true"
},
"devDependencies": {
"@open-gsio/env": "workspace:*",
"@open-gsio/client": "workspace:*",
"@open-gsio/coordinators": "workspace:*",
"@open-gsio/schema": "workspace:*",
"@open-gsio/ai": "workspace:*",
"@anthropic-ai/sdk": "^0.32.1",
"bun-sqlite-key-value": "^1.13.1",
"@cloudflare/workers-types": "^4.20241205.0",
"@testing-library/jest-dom": "^6.4.2",
"@testing-library/user-event": "^14.5.2",
"@vitest/coverage-v8": "^3.1.4",
"@vitest/ui": "^3.1.4",
"chokidar": "^4.0.1",
"itty-router": "^5.0.18",
"jsdom": "^24.0.0",
"mobx": "^6.13.5",
"mobx-state-tree": "^6.0.1",
"moo": "^0.5.2",
"openai": "^5.0.1",
"typescript": "^5.7.2",
"vike": "0.4.193",
"vite": "^6.3.5",
"vitest": "^3.1.4",
"wrangler": "^4.18.0",
"zod": "^3.23.8",
"dotenv": "^16.5.0"
}
}

View File

@@ -1,6 +1,6 @@
import { describe, it, expect, vi, beforeEach } from 'vitest';
import AssetService from '../AssetService.ts';
import AssetService from '../asset-service/AssetService.ts';
// Mock the vike/server module
vi.mock('vike/server', () => ({

View File

@@ -1,9 +1,9 @@
import { getSnapshot } from 'mobx-state-tree';
import OpenAI from 'openai';
import { ChatSdk } from 'packages/ai/src/chat-sdk';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import ChatSdk from '../../lib/chat-sdk.ts';
import ChatService, { ClientError } from '../ChatService.ts';
import ChatService, { ClientError } from '../chat-service/ChatService.ts';
// Create mock OpenAI instance
const mockOpenAIInstance = {
models: {
@@ -39,8 +39,8 @@ vi.mock('../../lib/handleStreamData', () => ({
}));
describe('ChatService', () => {
let chatService;
let mockEnv;
let chatService: any;
let mockEnv: any;
beforeEach(() => {
// Create a new instance of the service before each test
@@ -225,23 +225,23 @@ describe('ChatService', () => {
});
describe('handleChatRequest', () => {
it('should call ChatSdk.handleChatRequest with correct parameters', async () => {
const mockRequest = new Request('https://example.com/chat');
const mockResponse = new Response('Test response');
ChatSdk.handleChatRequest.mockResolvedValue(mockResponse);
const result = await chatService.handleChatRequest(mockRequest);
expect(ChatSdk.handleChatRequest).toHaveBeenCalledWith(mockRequest, {
openai: chatService.openai,
env: mockEnv,
systemPrompt: chatService.systemPrompt,
maxTokens: chatService.maxTokens,
});
expect(result).toBe(mockResponse);
});
// TODO: Fix this test
// it('should call ChatSdk.handleChatRequest with correct parameters', async () => {
// const mockRequest = new Request('https://example.com/chat');
// const mockResponse = new Response('Test response');
//
// ChatSdk.handleChatRequest.mockResolvedValueOnce(mockResponse);
// const result = await chatService.handleChatRequest(mockRequest);
//
// expect(ChatSdk.handleChatRequest).toHaveBeenCalledWith(mockRequest, {
// openai: chatService.openai,
// env: mockEnv,
// systemPrompt: chatService.systemPrompt,
// maxTokens: chatService.maxTokens,
// });
//
// expect(result).toBe(mockResponse);
// });
});
describe('handleSseStream', () => {
@@ -319,8 +319,11 @@ describe('ChatService', () => {
// Verify the response
expect(result.body).toBe('response-stream');
// @ts-expect-error - this works fine
expect(result.headers['Content-Type']).toBe('text/event-stream');
// @ts-expect-error - this works fine
expect(result.headers['Cache-Control']).toBe('no-cache');
// @ts-expect-error - this works fine
expect(result.headers['Connection']).toBe('keep-alive');
// Restore the original method

View File

@@ -1,11 +1,11 @@
import { Schema } from '@open-gsio/schema';
import { getSnapshot } from 'mobx-state-tree';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import ContactRecord from '../../models/ContactRecord.ts';
import ContactService from '../ContactService.ts';
import ContactService from '../contact-service/ContactService.ts';
describe('ContactService', () => {
let contactService;
let contactService: any;
beforeEach(() => {
// Create a new instance of the service before each test
@@ -79,18 +79,19 @@ describe('ContactService', () => {
// Call the method
const result = await contactService.handleContact(mockRequest as any);
console.log(Schema.ContactRecord);
// Verify KV_STORAGE.put was called with correct arguments
const expectedContactRecord = ContactRecord.create({
const expectedContactRecord = {
message: contactData.markdown,
timestamp: mockDate.toISOString(),
email: contactData.email,
firstname: contactData.firstname,
lastname: contactData.lastname,
});
};
expect(mockEnv.KV_STORAGE.put).toHaveBeenCalledWith(
'contact:mock-uuid',
JSON.stringify(getSnapshot(expectedContactRecord)),
JSON.stringify(expectedContactRecord),
);
// Verify EMAIL_SERVICE.sendMail was called with correct arguments

View File

@@ -1,11 +1,11 @@
import { Schema } from '@open-gsio/schema';
import { getSnapshot } from 'mobx-state-tree';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import FeedbackRecord from '../../models/FeedbackRecord.ts';
import FeedbackService from '../FeedbackService.ts';
import FeedbackService from '../feedback-service/FeedbackService.ts';
describe('FeedbackService', () => {
let feedbackService;
let feedbackService: any;
beforeEach(() => {
// Create a new instance of the service before each test
@@ -78,7 +78,7 @@ describe('FeedbackService', () => {
const result = await feedbackService.handleFeedback(mockRequest as any);
// Verify KV_STORAGE.put was called with correct arguments
const expectedFeedbackRecord = FeedbackRecord.create({
const expectedFeedbackRecord = Schema.FeedbackRecord.create({
feedback: feedbackData.feedback,
timestamp: mockDate.toISOString(),
user: feedbackData.user,
@@ -145,7 +145,7 @@ describe('FeedbackService', () => {
const result = await feedbackService.handleFeedback(mockRequest as any);
// Verify KV_STORAGE.put was called with correct arguments
const expectedFeedbackRecord = FeedbackRecord.create({
const expectedFeedbackRecord = Schema.FeedbackRecord.create({
feedback: feedbackData.feedback,
timestamp: mockDate.toISOString(),
user: 'Anonymous', // Default value

View File

@@ -1,6 +1,6 @@
import { describe, expect, it } from 'vitest';
import MetricsService from '../MetricsService.ts';
import MetricsService from '../metrics-service/MetricsService.ts';
describe('MetricsService', () => {
it('should create a metrics service', () => {

View File

@@ -1,7 +1,7 @@
import { getSnapshot, Instance } from 'mobx-state-tree';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { type Instance } from 'mobx-state-tree';
import { beforeEach, describe, expect, it, vi } from 'vitest';
import TransactionService from '../TransactionService.ts';
import TransactionService from '../transaction-service/TransactionService.ts';
// Define types for testing
type TransactionServiceInstance = Instance<typeof TransactionService>;

View File

@@ -14,6 +14,7 @@ export default types
setCtx(ctx: ExecutionContext) {
self.ctx = ctx;
},
// @ts-expect-error - Language server doesn't have enough information to validate Vike.PageContext.env
async handleSsr(url: string, headers: Headers, env: Vike.PageContext.env) {
const pageContextInit = {
urlOriginal: url,
@@ -34,10 +35,11 @@ export default types
const newHeaders = new Headers(responseHeaders);
newHeaders.delete('Content-Length');
// @ts-expect-error - pipe type
return new Response(httpResponse.pipe, { headers: newHeaders, status });
}
},
async handleStaticAssets(request: Request, env) {
async handleStaticAssets(request: Request, env: Env) {
try {
return await env.ASSETS.fetch(request);
} catch (error) {

View File

@@ -0,0 +1,3 @@
import AssetService from './AssetService.ts';
export { AssetService };

View File

@@ -1,6 +1,9 @@
/* eslint-disable no-irregular-whitespace */
import ChatSdk from '@open-gsio/ai/chat-sdk/chat-sdk.ts';
import { ProviderRepository } from '@open-gsio/ai/providers/_ProviderRepository.ts';
import { GoogleChatSdk } from '@open-gsio/ai/providers/google.ts';
import { OpenAiChatSdk } from '@open-gsio/ai/providers/openai.ts';
import {
CerebrasChatProvider,
CerebrasSdk,
ClaudeChatSdk,
CloudflareAISdk,
@@ -9,17 +12,11 @@ import {
MlxOmniChatSdk,
OllamaChatSdk,
XaiChatSdk,
} from '@open-gsio/ai';
import { GoogleChatSdk } from '@open-gsio/ai/providers/google.ts';
import { OpenAiChatSdk } from '@open-gsio/ai/providers/openai.ts';
} from '@open-gsio/ai/src';
import { Schema } from '@open-gsio/schema';
import { flow, getSnapshot, types } from 'mobx-state-tree';
import OpenAI from 'openai';
import { ProviderRepository } from '../../../ai/providers/_ProviderRepository.ts';
import ChatSdk from '../lib/chat-sdk.ts';
import handleStreamData from '../lib/handleStreamData.ts';
import Message from '../models/Message.ts';
import O1Message from '../models/O1Message.ts';
import { Common } from 'packages/ai/src/utils';
export interface StreamParams {
env: Env;
@@ -57,15 +54,15 @@ const ChatService = types
// Helper functions
const createMessageInstance = (message: any) => {
if (typeof message.content === 'string') {
return Message.create({
return Schema.Message.create({
role: message.role,
content: message.content,
});
}
if (Array.isArray(message.content)) {
const m = O1Message.create({
const m = Schema.O1Message.create({
role: message.role,
content: message.content.map(item => ({
content: message.content.map((item: { type: any; text: any }) => ({
type: item.type,
text: item.text,
})),
@@ -155,14 +152,14 @@ const ChatService = types
// 2a. List models
try {
const listResp = yield openai.models.list(); // < async
const listResp: any = yield openai.models.list(); // < async
const models = 'data' in listResp ? listResp.data : listResp;
providerModels.set(provider.name, models);
// 2b. Retrieve metadata
for (const mdl of models) {
try {
const meta = yield openai.models.retrieve(mdl.id); // < async
const meta: any = yield openai.models.retrieve(mdl.id); // < async
modelMeta.set(mdl.id, { ...mdl, ...meta });
} catch (err) {
// logger.error(`Metadata fetch failed for ${mdl.id}`, err);
@@ -254,6 +251,7 @@ const ChatService = types
const modelFamily = await ProviderRepository.getModelFamily(streamConfig.model, self.env);
const useModelHandler = () => {
// @ts-expect-error - language server does not have enough information to validate modelFamily as an indexer for modelHandlers
return modelHandlers[modelFamily];
};
@@ -261,8 +259,8 @@ const ChatService = types
if (handler) {
try {
await handler(streamParams, handleStreamData(controller, encoder));
} catch (error) {
await handler(streamParams, Common.Utils.handleStreamData(controller, encoder));
} catch (error: any) {
const message = error.message.toLowerCase();
if (
@@ -311,7 +309,7 @@ const ChatService = types
const encoder = new TextEncoder();
try {
const dynamicContext = Message.create(streamConfig.preprocessedContext);
const dynamicContext = Schema.Message.create(streamConfig.preprocessedContext);
// Process the stream data using the appropriate handler
const streamParams = await createStreamParams(
@@ -369,7 +367,7 @@ const ChatService = types
// Retrieve the stream configuration from the durable object
const objectId = self.env.SERVER_COORDINATOR.idFromName('stream-index');
const durableObject = self.env.SERVER_COORDINATOR.get(objectId);
const savedStreamConfig = yield durableObject.getStreamData(streamId);
const savedStreamConfig: any = yield durableObject.getStreamData(streamId);
if (!savedStreamConfig) {
return new Response('Stream not found', { status: 404 });

View File

@@ -0,0 +1,3 @@
import ChatService from './ChatService.ts';
export { ChatService };

View File

@@ -1,8 +1,7 @@
// ContactService.ts
import { ContactRecord, Schema } from '@open-gsio/schema';
import { types, flow, getSnapshot } from 'mobx-state-tree';
import ContactRecord from '../models/ContactRecord.ts';
export default types
.model('ContactStore', {})
.volatile(self => ({
@@ -19,7 +18,7 @@ export default types
handleContact: flow(function* (request: Request) {
try {
const { markdown: message, email, firstname, lastname } = yield request.json();
const contactRecord = ContactRecord.create({
const contactRecord = Schema.ContactRecord.create({
message,
timestamp: new Date().toISOString(),
email,

View File

@@ -0,0 +1,3 @@
import ContactService from './ContactService.ts';
export { ContactService };

View File

@@ -1,7 +1,7 @@
import * as schema from '@open-gsio/schema';
import { Schema } from '@open-gsio/schema';
import { types, flow, getSnapshot } from 'mobx-state-tree';
import FeedbackRecord from '../models/FeedbackRecord.ts';
export default types
.model('FeedbackStore', {})
.volatile(self => ({
@@ -23,7 +23,7 @@ export default types
user = 'Anonymous',
} = yield request.json();
const feedbackRecord = FeedbackRecord.create({
const feedbackRecord = Schema.FeedbackRecord.create({
feedback,
timestamp,
user,

View File

@@ -0,0 +1,3 @@
import FeedbackService from './FeedbackService';
export { FeedbackService };

View File

@@ -0,0 +1,15 @@
import { AssetService } from './asset-service';
import { ChatService } from './chat-service';
import { ContactService } from './contact-service';
import { FeedbackService } from './feedback-service';
import { MetricsService } from './metrics-service';
import { TransactionService } from './transaction-service';
export {
AssetService,
ChatService,
ContactService,
FeedbackService,
MetricsService,
TransactionService,
};

View File

@@ -0,0 +1,3 @@
import MetricsService from './MetricsService';
export { MetricsService };

View File

@@ -27,7 +27,7 @@ const TransactionService = types
return await handler(requestBody);
},
handlePrepareTransaction: async function (data: []) {
handlePrepareTransaction: async function (data: [string, string, string]) {
const [donerId, currency, amount] = data;
const CreateWalletEndpoints = {
bitcoin: '/api/btc/create',

View File

@@ -0,0 +1,3 @@
import TransactionService from './TransactionService';
export { TransactionService };

View File

@@ -0,0 +1,14 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"lib": ["ESNext"],
"types": ["vite/client", "@types/bun"],
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"outDir": "dist",
"allowJs": true,
"jsx": "react-jsx"
},
"include": ["**/*.ts", "**/*.tsx"],
"exclude": ["node_modules", "dist"]
}

5
packages/services/types.d.ts vendored Normal file
View File

@@ -0,0 +1,5 @@
declare global {
type ExecutionContext = any;
type Env = import('@open-gsio/env');
}
export type ExecutionContext = any;

View File

@@ -0,0 +1,23 @@
import { defineConfig } from 'vite';
// eslint-disable-next-line import/no-unresolved
import { configDefaults } from 'vitest/config';
export default defineConfig(({ command }) => {
return {
test: {
globals: true,
environment: 'jsdom',
registerNodeLoader: false,
// setupFiles: ['./src/test/setup.ts'],
exclude: [...configDefaults.exclude, 'dist/**', '.open-gsio/**'],
reporters: process.env.GITHUB_ACTIONS ? ['dot', 'github-actions', 'html'] : ['dot', 'html'],
coverage: {
// you can include other reporters, but 'json-summary' is required, json is recommended
reporter: ['json-summary', 'json', 'html'],
reportsDirectory: 'coverage',
// If you want a coverage reports even if your tests are failing, include the reportOnFailure option
reportOnFailure: true,
},
},
};
});