This commit is contained in:
Frank
2025-11-03 15:43:52 -05:00
parent 7652a96064
commit 05232ead93
14 changed files with 285 additions and 29 deletions

View File

@@ -61,7 +61,13 @@ export const auth = new sst.cloudflare.Worker("AuthApi", {
domain: `auth.${domain}`, domain: `auth.${domain}`,
handler: "packages/console/function/src/auth.ts", handler: "packages/console/function/src/auth.ts",
url: true, 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 STRIPE_SECRET_KEY = new sst.Secret("STRIPE_SECRET_KEY")
const AUTH_API_URL = new sst.Linkable("AUTH_API_URL", { const AUTH_API_URL = new sst.Linkable("AUTH_API_URL", {
properties: { value: auth.url.apply((url) => url!) }, properties: { value: auth.url.apply((url) => url!) },
@@ -130,7 +137,8 @@ new sst.cloudflare.x.SolidStart("Console", {
AUTH_API_URL, AUTH_API_URL,
STRIPE_WEBHOOK_SECRET, STRIPE_WEBHOOK_SECRET,
STRIPE_SECRET_KEY, STRIPE_SECRET_KEY,
ZEN_MODELS, ZEN_MODELS1,
ZEN_MODELS2,
EMAILOCTOPUS_API_KEY, EMAILOCTOPUS_API_KEY,
AWS_SES_ACCESS_KEY_ID, AWS_SES_ACCESS_KEY_ID,
AWS_SES_SECRET_ACCESS_KEY, AWS_SES_SECRET_ACCESS_KEY,

View File

@@ -239,10 +239,10 @@ export async function handler(
.filter((provider) => !provider.disabled) .filter((provider) => !provider.disabled)
.flatMap((provider) => Array<typeof provider>(provider.weight ?? 1).fill(provider)) .flatMap((provider) => Array<typeof provider>(provider.weight ?? 1).fill(provider))
// Use last character of IP address to select a provider // Use the last 2 characters of IP address to select a provider
const lastChar = ip.charCodeAt(ip.length - 1) || 0 const lastChars = ip.slice(-2)
const index = lastChar % providers.length const index = parseInt(lastChars, 16) % providers.length
const provider = providers[index] const provider = providers[index || 0]
if (!(provider.id in zenData.providers)) { if (!(provider.id in zenData.providers)) {
throw new ModelError(`Provider ${provider.id} not supported`) throw new ModelError(`Provider ${provider.id} not supported`)

View File

@@ -11,14 +11,20 @@ const root = path.resolve(process.cwd(), "..", "..", "..")
// read the secret // read the secret
const ret = await $`bun sst secret list`.cwd(root).text() const ret = await $`bun sst secret list`.cwd(root).text()
const value = ret const value1 = ret
.split("\n") .split("\n")
.find((line) => line.startsWith("ZEN_MODELS")) .find((line) => line.startsWith("ZEN_MODELS1"))
?.split("=")[1] ?.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 // validate value
ZenData.validate(JSON.parse(value)) ZenData.validate(JSON.parse(value1 + value2))
// update the secret // 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}`

View File

@@ -10,23 +10,29 @@ const models = await $`bun sst secret list`.cwd(root).text()
console.log("models", models) console.log("models", models)
// read the line starting with "ZEN_MODELS" // read the line starting with "ZEN_MODELS"
const oldValue = models const oldValue1 = models
.split("\n") .split("\n")
.find((line) => line.startsWith("ZEN_MODELS")) .find((line) => line.startsWith("ZEN_MODELS1"))
?.split("=")[1] ?.split("=")[1]
if (!oldValue) throw new Error("ZEN_MODELS not found") const oldValue2 = models
console.log("oldValue", oldValue) .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 // store the prettified json to a temp file
const filename = `models-${Date.now()}.json` const filename = `models-${Date.now()}.json`
const tempFile = Bun.file(path.join(os.tmpdir(), filename)) 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) console.log("tempFile", tempFile.name)
// open temp file in vim and read the file on close // open temp file in vim and read the file on close
await $`vim ${tempFile.name}` await $`vim ${tempFile.name}`
const newValue = JSON.parse(await tempFile.text()) const newValue = JSON.stringify(JSON.parse(await tempFile.text()))
ZenData.validate(newValue) ZenData.validate(JSON.parse(newValue))
// update the secret // 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)}`

View File

@@ -47,7 +47,7 @@ export namespace ZenData {
}) })
export const list = fn(z.void(), () => { 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) return ModelsSchema.parse(json)
}) })
} }
@@ -56,7 +56,9 @@ export namespace Model {
export const enable = fn(z.object({ model: z.string() }), ({ model }) => { export const enable = fn(z.object({ model: z.string() }), ({ model }) => {
Actor.assertAdmin() Actor.assertAdmin()
return Database.use((db) => 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))),
) )
}) })

View File

@@ -3,7 +3,102 @@
/* eslint-disable */ /* eslint-disable */
/* deno-fmt-ignore-file */ /* 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" import "sst"
export {} export {}

View File

@@ -6,6 +6,10 @@
import "sst" import "sst"
declare module "sst" { declare module "sst" {
export interface Resource { export interface Resource {
"ADMIN_SECRET": {
"type": "sst.sst.Secret"
"value": string
}
"AUTH_API_URL": { "AUTH_API_URL": {
"type": "sst.sst.Linkable" "type": "sst.sst.Linkable"
"value": string "value": string
@@ -74,7 +78,11 @@ declare module "sst" {
"type": "sst.cloudflare.Astro" "type": "sst.cloudflare.Astro"
"url": string "url": string
} }
"ZEN_MODELS": { "ZEN_MODELS1": {
"type": "sst.sst.Secret"
"value": string
}
"ZEN_MODELS2": {
"type": "sst.sst.Secret" "type": "sst.sst.Secret"
"value": string "value": string
} }

View File

@@ -6,6 +6,10 @@
import "sst" import "sst"
declare module "sst" { declare module "sst" {
export interface Resource { export interface Resource {
"ADMIN_SECRET": {
"type": "sst.sst.Secret"
"value": string
}
"AUTH_API_URL": { "AUTH_API_URL": {
"type": "sst.sst.Linkable" "type": "sst.sst.Linkable"
"value": string "value": string
@@ -74,7 +78,11 @@ declare module "sst" {
"type": "sst.cloudflare.Astro" "type": "sst.cloudflare.Astro"
"url": string "url": string
} }
"ZEN_MODELS": { "ZEN_MODELS1": {
"type": "sst.sst.Secret"
"value": string
}
"ZEN_MODELS2": {
"type": "sst.sst.Secret" "type": "sst.sst.Secret"
"value": string "value": string
} }

View File

@@ -6,6 +6,10 @@
import "sst" import "sst"
declare module "sst" { declare module "sst" {
export interface Resource { export interface Resource {
"ADMIN_SECRET": {
"type": "sst.sst.Secret"
"value": string
}
"AUTH_API_URL": { "AUTH_API_URL": {
"type": "sst.sst.Linkable" "type": "sst.sst.Linkable"
"value": string "value": string
@@ -74,7 +78,11 @@ declare module "sst" {
"type": "sst.cloudflare.Astro" "type": "sst.cloudflare.Astro"
"url": string "url": string
} }
"ZEN_MODELS": { "ZEN_MODELS1": {
"type": "sst.sst.Secret"
"value": string
}
"ZEN_MODELS2": {
"type": "sst.sst.Secret" "type": "sst.sst.Secret"
"value": string "value": string
} }

9
packages/script/sst-env.d.ts vendored Normal file
View File

@@ -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 {}

View File

@@ -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

View File

@@ -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
packages/ui/sst-env.d.ts vendored Normal file
View File

@@ -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 {}

10
sst-env.d.ts vendored
View File

@@ -5,6 +5,10 @@
declare module "sst" { declare module "sst" {
export interface Resource { export interface Resource {
"ADMIN_SECRET": {
"type": "sst.sst.Secret"
"value": string
}
"AUTH_API_URL": { "AUTH_API_URL": {
"type": "sst.sst.Linkable" "type": "sst.sst.Linkable"
"value": string "value": string
@@ -91,7 +95,11 @@ declare module "sst" {
"type": "sst.cloudflare.Astro" "type": "sst.cloudflare.Astro"
"url": string "url": string
} }
"ZEN_MODELS": { "ZEN_MODELS1": {
"type": "sst.sst.Secret"
"value": string
}
"ZEN_MODELS2": {
"type": "sst.sst.Secret" "type": "sst.sst.Secret"
"value": string "value": string
} }