diff --git a/infra/console.ts b/infra/console.ts index 281bafad..7fbf92bf 100644 --- a/infra/console.ts +++ b/infra/console.ts @@ -61,7 +61,13 @@ export const auth = new sst.cloudflare.Worker("AuthApi", { domain: `auth.${domain}`, handler: "packages/console/function/src/auth.ts", url: true, - link: [database, authStorage, GITHUB_CLIENT_ID_CONSOLE, GITHUB_CLIENT_SECRET_CONSOLE, GOOGLE_CLIENT_ID], + link: [ + database, + authStorage, + GITHUB_CLIENT_ID_CONSOLE, + GITHUB_CLIENT_SECRET_CONSOLE, + GOOGLE_CLIENT_ID, + ], }) //////////////// @@ -97,7 +103,8 @@ export const stripeWebhook = new stripe.WebhookEndpoint("StripeWebhookEndpoint", ], }) -const ZEN_MODELS = new sst.Secret("ZEN_MODELS") +const ZEN_MODELS1 = new sst.Secret("ZEN_MODELS1") +const ZEN_MODELS2 = new sst.Secret("ZEN_MODELS2") const STRIPE_SECRET_KEY = new sst.Secret("STRIPE_SECRET_KEY") const AUTH_API_URL = new sst.Linkable("AUTH_API_URL", { properties: { value: auth.url.apply((url) => url!) }, @@ -130,7 +137,8 @@ new sst.cloudflare.x.SolidStart("Console", { AUTH_API_URL, STRIPE_WEBHOOK_SECRET, STRIPE_SECRET_KEY, - ZEN_MODELS, + ZEN_MODELS1, + ZEN_MODELS2, EMAILOCTOPUS_API_KEY, AWS_SES_ACCESS_KEY_ID, AWS_SES_SECRET_ACCESS_KEY, diff --git a/packages/console/app/src/routes/zen/util/handler.ts b/packages/console/app/src/routes/zen/util/handler.ts index 3163de34..ebf42f4b 100644 --- a/packages/console/app/src/routes/zen/util/handler.ts +++ b/packages/console/app/src/routes/zen/util/handler.ts @@ -239,10 +239,10 @@ export async function handler( .filter((provider) => !provider.disabled) .flatMap((provider) => Array(provider.weight ?? 1).fill(provider)) - // Use last character of IP address to select a provider - const lastChar = ip.charCodeAt(ip.length - 1) || 0 - const index = lastChar % providers.length - const provider = providers[index] + // Use the last 2 characters of IP address to select a provider + const lastChars = ip.slice(-2) + const index = parseInt(lastChars, 16) % providers.length + const provider = providers[index || 0] if (!(provider.id in zenData.providers)) { throw new ModelError(`Provider ${provider.id} not supported`) diff --git a/packages/console/core/script/promote-models.ts b/packages/console/core/script/promote-models.ts index 67c2b6f3..717813e4 100755 --- a/packages/console/core/script/promote-models.ts +++ b/packages/console/core/script/promote-models.ts @@ -11,14 +11,20 @@ const root = path.resolve(process.cwd(), "..", "..", "..") // read the secret const ret = await $`bun sst secret list`.cwd(root).text() -const value = ret +const value1 = ret .split("\n") - .find((line) => line.startsWith("ZEN_MODELS")) + .find((line) => line.startsWith("ZEN_MODELS1")) ?.split("=")[1] -if (!value) throw new Error("ZEN_MODELS not found") +const value2 = ret + .split("\n") + .find((line) => line.startsWith("ZEN_MODELS2")) + ?.split("=")[1] +if (!value1) throw new Error("ZEN_MODELS1 not found") +if (!value2) throw new Error("ZEN_MODELS2 not found") // validate value -ZenData.validate(JSON.parse(value)) +ZenData.validate(JSON.parse(value1 + value2)) // update the secret -await $`bun sst secret set ZEN_MODELS ${value} --stage ${stage}` +await $`bun sst secret set ZEN_MODELS1 ${value1} --stage ${stage}` +await $`bun sst secret set ZEN_MODELS2 ${value2} --stage ${stage}` diff --git a/packages/console/core/script/update-models.ts b/packages/console/core/script/update-models.ts index 939af616..e7a24551 100755 --- a/packages/console/core/script/update-models.ts +++ b/packages/console/core/script/update-models.ts @@ -10,23 +10,29 @@ const models = await $`bun sst secret list`.cwd(root).text() console.log("models", models) // read the line starting with "ZEN_MODELS" -const oldValue = models +const oldValue1 = models .split("\n") - .find((line) => line.startsWith("ZEN_MODELS")) + .find((line) => line.startsWith("ZEN_MODELS1")) ?.split("=")[1] -if (!oldValue) throw new Error("ZEN_MODELS not found") -console.log("oldValue", oldValue) +const oldValue2 = models + .split("\n") + .find((line) => line.startsWith("ZEN_MODELS2")) + ?.split("=")[1] +if (!oldValue1) throw new Error("ZEN_MODELS1 not found") +if (!oldValue2) throw new Error("ZEN_MODELS2 not found") // store the prettified json to a temp file const filename = `models-${Date.now()}.json` const tempFile = Bun.file(path.join(os.tmpdir(), filename)) -await tempFile.write(JSON.stringify(JSON.parse(oldValue), null, 2)) +await tempFile.write(JSON.stringify(JSON.parse(oldValue1 + oldValue2), null, 2)) console.log("tempFile", tempFile.name) // open temp file in vim and read the file on close await $`vim ${tempFile.name}` -const newValue = JSON.parse(await tempFile.text()) -ZenData.validate(newValue) +const newValue = JSON.stringify(JSON.parse(await tempFile.text())) +ZenData.validate(JSON.parse(newValue)) // update the secret -await $`bun sst secret set ZEN_MODELS ${JSON.stringify(newValue)}` +const mid = Math.floor(newValue.length / 2) +await $`bun sst secret set ZEN_MODELS1 ${newValue.slice(0, mid)}` +await $`bun sst secret set ZEN_MODELS2 ${newValue.slice(mid)}` diff --git a/packages/console/core/src/model.ts b/packages/console/core/src/model.ts index 300f92ed..118f7401 100644 --- a/packages/console/core/src/model.ts +++ b/packages/console/core/src/model.ts @@ -47,7 +47,7 @@ export namespace ZenData { }) export const list = fn(z.void(), () => { - const json = JSON.parse(Resource.ZEN_MODELS.value) + const json = JSON.parse(Resource.ZEN_MODELS1.value + Resource.ZEN_MODELS2.value) return ModelsSchema.parse(json) }) } @@ -56,7 +56,9 @@ export namespace Model { export const enable = fn(z.object({ model: z.string() }), ({ model }) => { Actor.assertAdmin() return Database.use((db) => - db.delete(ModelTable).where(and(eq(ModelTable.workspaceID, Actor.workspace()), eq(ModelTable.model, model))), + db + .delete(ModelTable) + .where(and(eq(ModelTable.workspaceID, Actor.workspace()), eq(ModelTable.model, model))), ) }) diff --git a/packages/console/core/sst-env.d.ts b/packages/console/core/sst-env.d.ts index 9b9de732..01407434 100644 --- a/packages/console/core/sst-env.d.ts +++ b/packages/console/core/sst-env.d.ts @@ -3,7 +3,102 @@ /* eslint-disable */ /* deno-fmt-ignore-file */ -/// +import "sst" +declare module "sst" { + export interface Resource { + "ADMIN_SECRET": { + "type": "sst.sst.Secret" + "value": string + } + "AUTH_API_URL": { + "type": "sst.sst.Linkable" + "value": string + } + "AWS_SES_ACCESS_KEY_ID": { + "type": "sst.sst.Secret" + "value": string + } + "AWS_SES_SECRET_ACCESS_KEY": { + "type": "sst.sst.Secret" + "value": string + } + "Console": { + "type": "sst.cloudflare.SolidStart" + "url": string + } + "Database": { + "database": string + "host": string + "password": string + "port": number + "type": "sst.sst.Linkable" + "username": string + } + "Desktop": { + "type": "sst.cloudflare.StaticSite" + "url": string + } + "EMAILOCTOPUS_API_KEY": { + "type": "sst.sst.Secret" + "value": string + } + "GITHUB_APP_ID": { + "type": "sst.sst.Secret" + "value": string + } + "GITHUB_APP_PRIVATE_KEY": { + "type": "sst.sst.Secret" + "value": string + } + "GITHUB_CLIENT_ID_CONSOLE": { + "type": "sst.sst.Secret" + "value": string + } + "GITHUB_CLIENT_SECRET_CONSOLE": { + "type": "sst.sst.Secret" + "value": string + } + "GOOGLE_CLIENT_ID": { + "type": "sst.sst.Secret" + "value": string + } + "HONEYCOMB_API_KEY": { + "type": "sst.sst.Secret" + "value": string + } + "STRIPE_SECRET_KEY": { + "type": "sst.sst.Secret" + "value": string + } + "STRIPE_WEBHOOK_SECRET": { + "type": "sst.sst.Linkable" + "value": string + } + "Web": { + "type": "sst.cloudflare.Astro" + "url": string + } + "ZEN_MODELS1": { + "type": "sst.sst.Secret" + "value": string + } + "ZEN_MODELS2": { + "type": "sst.sst.Secret" + "value": string + } + } +} +// cloudflare +import * as cloudflare from "@cloudflare/workers-types"; +declare module "sst" { + export interface Resource { + "Api": cloudflare.Service + "AuthApi": cloudflare.Service + "AuthStorage": cloudflare.KVNamespace + "Bucket": cloudflare.R2Bucket + "LogProcessor": cloudflare.Service + } +} import "sst" export {} \ No newline at end of file diff --git a/packages/console/function/sst-env.d.ts b/packages/console/function/sst-env.d.ts index 6a5d2bbf..01407434 100644 --- a/packages/console/function/sst-env.d.ts +++ b/packages/console/function/sst-env.d.ts @@ -6,6 +6,10 @@ import "sst" declare module "sst" { export interface Resource { + "ADMIN_SECRET": { + "type": "sst.sst.Secret" + "value": string + } "AUTH_API_URL": { "type": "sst.sst.Linkable" "value": string @@ -74,7 +78,11 @@ declare module "sst" { "type": "sst.cloudflare.Astro" "url": string } - "ZEN_MODELS": { + "ZEN_MODELS1": { + "type": "sst.sst.Secret" + "value": string + } + "ZEN_MODELS2": { "type": "sst.sst.Secret" "value": string } diff --git a/packages/console/resource/sst-env.d.ts b/packages/console/resource/sst-env.d.ts index 6a5d2bbf..01407434 100644 --- a/packages/console/resource/sst-env.d.ts +++ b/packages/console/resource/sst-env.d.ts @@ -6,6 +6,10 @@ import "sst" declare module "sst" { export interface Resource { + "ADMIN_SECRET": { + "type": "sst.sst.Secret" + "value": string + } "AUTH_API_URL": { "type": "sst.sst.Linkable" "value": string @@ -74,7 +78,11 @@ declare module "sst" { "type": "sst.cloudflare.Astro" "url": string } - "ZEN_MODELS": { + "ZEN_MODELS1": { + "type": "sst.sst.Secret" + "value": string + } + "ZEN_MODELS2": { "type": "sst.sst.Secret" "value": string } diff --git a/packages/function/sst-env.d.ts b/packages/function/sst-env.d.ts index 6a5d2bbf..01407434 100644 --- a/packages/function/sst-env.d.ts +++ b/packages/function/sst-env.d.ts @@ -6,6 +6,10 @@ import "sst" declare module "sst" { export interface Resource { + "ADMIN_SECRET": { + "type": "sst.sst.Secret" + "value": string + } "AUTH_API_URL": { "type": "sst.sst.Linkable" "value": string @@ -74,7 +78,11 @@ declare module "sst" { "type": "sst.cloudflare.Astro" "url": string } - "ZEN_MODELS": { + "ZEN_MODELS1": { + "type": "sst.sst.Secret" + "value": string + } + "ZEN_MODELS2": { "type": "sst.sst.Secret" "value": string } diff --git a/packages/script/sst-env.d.ts b/packages/script/sst-env.d.ts new file mode 100644 index 00000000..b6a7e906 --- /dev/null +++ b/packages/script/sst-env.d.ts @@ -0,0 +1,9 @@ +/* This file is auto-generated by SST. Do not edit. */ +/* tslint:disable */ +/* eslint-disable */ +/* deno-fmt-ignore-file */ + +/// + +import "sst" +export {} \ No newline at end of file diff --git a/packages/sdk/python/sst.pyi b/packages/sdk/python/sst.pyi new file mode 100644 index 00000000..c64110c5 --- /dev/null +++ b/packages/sdk/python/sst.pyi @@ -0,0 +1,83 @@ +# Automatically generated by SST +# pylint: disable=all +from typing import Any + +class Resource: + class ADMIN_SECRET: + type: str + value: str + class AUTH_API_URL: + type: str + value: str + class AWS_SES_ACCESS_KEY_ID: + type: str + value: str + class AWS_SES_SECRET_ACCESS_KEY: + type: str + value: str + class Api: + type: str + url: str + class App: + name: str + stage: str + class AuthApi: + type: str + url: str + class AuthStorage: + type: str + class Bucket: + name: str + type: str + class Console: + type: str + url: str + class Database: + database: str + host: str + password: str + port: float + type: str + username: str + class Desktop: + type: str + url: str + class EMAILOCTOPUS_API_KEY: + type: str + value: str + class GITHUB_APP_ID: + type: str + value: str + class GITHUB_APP_PRIVATE_KEY: + type: str + value: str + class GITHUB_CLIENT_ID_CONSOLE: + type: str + value: str + class GITHUB_CLIENT_SECRET_CONSOLE: + type: str + value: str + class GOOGLE_CLIENT_ID: + type: str + value: str + class HONEYCOMB_API_KEY: + type: str + value: str + class LogProcessor: + type: str + class STRIPE_SECRET_KEY: + type: str + value: str + class STRIPE_WEBHOOK_SECRET: + type: str + value: str + class Web: + type: str + url: str + class ZEN_MODELS1: + type: str + value: str + class ZEN_MODELS2: + type: str + value: str + diff --git a/packages/slack/sst-env.d.ts b/packages/slack/sst-env.d.ts index cde5429a..b6a7e906 100644 --- a/packages/slack/sst-env.d.ts +++ b/packages/slack/sst-env.d.ts @@ -1,3 +1,9 @@ -/// +/* This file is auto-generated by SST. Do not edit. */ +/* tslint:disable */ +/* eslint-disable */ +/* deno-fmt-ignore-file */ -export {} +/// + +import "sst" +export {} \ No newline at end of file diff --git a/packages/ui/sst-env.d.ts b/packages/ui/sst-env.d.ts new file mode 100644 index 00000000..b6a7e906 --- /dev/null +++ b/packages/ui/sst-env.d.ts @@ -0,0 +1,9 @@ +/* This file is auto-generated by SST. Do not edit. */ +/* tslint:disable */ +/* eslint-disable */ +/* deno-fmt-ignore-file */ + +/// + +import "sst" +export {} \ No newline at end of file diff --git a/sst-env.d.ts b/sst-env.d.ts index a34d687d..14e3a2a5 100644 --- a/sst-env.d.ts +++ b/sst-env.d.ts @@ -5,6 +5,10 @@ declare module "sst" { export interface Resource { + "ADMIN_SECRET": { + "type": "sst.sst.Secret" + "value": string + } "AUTH_API_URL": { "type": "sst.sst.Linkable" "value": string @@ -91,7 +95,11 @@ declare module "sst" { "type": "sst.cloudflare.Astro" "url": string } - "ZEN_MODELS": { + "ZEN_MODELS1": { + "type": "sst.sst.Secret" + "value": string + } + "ZEN_MODELS2": { "type": "sst.sst.Secret" "value": string }