Frank 5 месяцев назад
Родитель
Сommit
05232ead93

+ 11 - 3
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,

+ 4 - 4
packages/console/app/src/routes/zen/util/handler.ts

@@ -239,10 +239,10 @@ export async function handler(
       .filter((provider) => !provider.disabled)
       .flatMap((provider) => Array<typeof provider>(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`)

+ 11 - 5
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}`

+ 14 - 8
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)}`

+ 4 - 2
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))),
     )
   })
 

+ 96 - 1
packages/console/core/sst-env.d.ts

@@ -3,7 +3,102 @@
 /* eslint-disable */
 /* deno-fmt-ignore-file */
 
-/// <reference path="../../../sst-env.d.ts" />
+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 {}

+ 9 - 1
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
     }

+ 9 - 1
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
     }

+ 9 - 1
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
     }

+ 9 - 0
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 */
+
+/// <reference path="../../sst-env.d.ts" />
+
+import "sst"
+export {}

+ 83 - 0
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
+

+ 8 - 2
packages/slack/sst-env.d.ts

@@ -1,3 +1,9 @@
-/// <reference types="../../../sst-env.d.ts" />
+/* This file is auto-generated by SST. Do not edit. */
+/* tslint:disable */
+/* eslint-disable */
+/* deno-fmt-ignore-file */
 
-export {}
+/// <reference path="../../sst-env.d.ts" />
+
+import "sst"
+export {}

+ 9 - 0
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 */
+
+/// <reference path="../../sst-env.d.ts" />
+
+import "sst"
+export {}

+ 9 - 1
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
     }