From bbc9142fc54fef532039f2a91c63ac2f2873af41 Mon Sep 17 00:00:00 2001 From: Frank Date: Sun, 23 Nov 2025 15:21:47 -0500 Subject: [PATCH] wip: zen --- github/sst-env.d.ts | 2 +- infra/console.ts | 3 + .../app/src/routes/zen/util/dataDumper.ts | 26 +++ .../app/src/routes/zen/util/handler.ts | 22 +- packages/console/app/sst-env.d.ts | 2 +- packages/console/core/src/model.ts | 1 + packages/console/core/sst-env.d.ts | 174 +++++++-------- packages/console/function/sst-env.d.ts | 174 +++++++-------- packages/console/mail/sst-env.d.ts | 2 +- .../console/resource/resource.cloudflare.ts | 1 + packages/console/resource/resource.node.ts | 92 ++++---- packages/console/resource/sst-env.d.ts | 174 +++++++-------- packages/desktop/src/sst-env.d.ts | 6 +- packages/desktop/sst-env.d.ts | 2 +- packages/enterprise/sst-env.d.ts | 131 ++++++++++++ packages/function/sst-env.d.ts | 174 +++++++-------- packages/opencode/src/provider/provider.ts | 2 +- packages/opencode/src/session/prompt.ts | 2 +- packages/opencode/sst-env.d.ts | 2 +- packages/plugin/sst-env.d.ts | 2 +- packages/script/sst-env.d.ts | 2 +- packages/sdk/js/sst-env.d.ts | 2 +- packages/sdk/python/sst.pyi | 12 ++ packages/slack/sst-env.d.ts | 2 +- packages/tauri/sst-env.d.ts | 9 + packages/ui/sst-env.d.ts | 2 +- packages/util/sst-env.d.ts | 2 +- packages/web/sst-env.d.ts | 2 +- sdks/vscode/sst-env.d.ts | 2 +- sst-env.d.ts | 198 ++++++++++-------- 30 files changed, 746 insertions(+), 481 deletions(-) create mode 100644 packages/console/app/src/routes/zen/util/dataDumper.ts create mode 100644 packages/enterprise/sst-env.d.ts create mode 100644 packages/tauri/sst-env.d.ts diff --git a/github/sst-env.d.ts b/github/sst-env.d.ts index 6b69016e71..f742a12004 100644 --- a/github/sst-env.d.ts +++ b/github/sst-env.d.ts @@ -6,4 +6,4 @@ /// import "sst" -export {} +export {} \ No newline at end of file diff --git a/infra/console.ts b/infra/console.ts index b614da4118..eddc97d2f1 100644 --- a/infra/console.ts +++ b/infra/console.ts @@ -116,6 +116,8 @@ const gatewayKv = new sst.cloudflare.Kv("GatewayKv") // CONSOLE //////////////// +const bucket = new sst.cloudflare.Bucket("ConsoleData") + const AWS_SES_ACCESS_KEY_ID = new sst.Secret("AWS_SES_ACCESS_KEY_ID") const AWS_SES_SECRET_ACCESS_KEY = new sst.Secret("AWS_SES_SECRET_ACCESS_KEY") @@ -132,6 +134,7 @@ new sst.cloudflare.x.SolidStart("Console", { domain, path: "packages/console/app", link: [ + bucket, database, AUTH_API_URL, STRIPE_WEBHOOK_SECRET, diff --git a/packages/console/app/src/routes/zen/util/dataDumper.ts b/packages/console/app/src/routes/zen/util/dataDumper.ts new file mode 100644 index 0000000000..6a064138a7 --- /dev/null +++ b/packages/console/app/src/routes/zen/util/dataDumper.ts @@ -0,0 +1,26 @@ +import { Resource, waitUntil } from "@opencode-ai/console-resource" + +export function createDataDumper(sessionId: string, requestId: string) { + if (Resource.App.stage !== "production") return + + let data: Record = {} + let modelName: string | undefined + + return { + provideModel: (model?: string) => (modelName = model), + provideRequest: (request: string) => (data.request = request), + provideResponse: (response: string) => (data.response = response), + provideStream: (chunk: string) => (data.response = (data.response ?? "") + chunk), + flush: () => { + if (!modelName) return + + const str = new Date().toISOString().replace(/[^0-9]/g, "") + const yyyymmdd = str.substring(0, 8) + const hh = str.substring(8, 10) + + waitUntil( + Resource.ConsoleData.put(`${yyyymmdd}/${hh}/${modelName}/${sessionId}/${requestId}.json`, JSON.stringify(data)), + ) + }, + } +} diff --git a/packages/console/app/src/routes/zen/util/handler.ts b/packages/console/app/src/routes/zen/util/handler.ts index 3453a6d381..c40db6e1d4 100644 --- a/packages/console/app/src/routes/zen/util/handler.ts +++ b/packages/console/app/src/routes/zen/util/handler.ts @@ -19,6 +19,7 @@ import { googleHelper } from "./provider/google" import { openaiHelper } from "./provider/openai" import { oaCompatHelper } from "./provider/openai-compatible" import { createRateLimiter } from "./rateLimiter" +import { createDataDumper } from "./dataDumper" type ZenData = Awaited> type RetryOptions = { @@ -48,16 +49,19 @@ export async function handler( try { const url = input.request.url const body = await input.request.json() - const ip = input.request.headers.get("x-real-ip") ?? "" const model = opts.parseModel(url, body) const isStream = opts.parseIsStream(url, body) + const ip = input.request.headers.get("x-real-ip") ?? "" + const sessionId = input.request.headers.get("x-opencode-session") + const requestId = input.request.headers.get("x-opencode-request") logger.metric({ is_tream: isStream, - session: input.request.headers.get("x-opencode-session"), - request: input.request.headers.get("x-opencode-request"), + session: sessionId, + request: requestId, }) const zenData = ZenData.list() const modelInfo = validateModel(zenData, model) + const dataDumper = createDataDumper(sessionId, requestId) const rateLimiter = createRateLimiter(modelInfo.id, modelInfo.rateLimit, ip) await rateLimiter?.check() @@ -104,10 +108,14 @@ export async function handler( }) } - return { providerInfo, authInfo, res, startTimestamp } + return { providerInfo, authInfo, reqBody, res, startTimestamp } } - const { providerInfo, authInfo, res, startTimestamp } = await retriableRequest() + const { providerInfo, authInfo, reqBody, res, startTimestamp } = await retriableRequest() + + // Store model request + dataDumper?.provideModel(providerInfo.storeModel) + dataDumper?.provideRequest(reqBody) // Scrub response headers const resHeaders = new Headers() @@ -126,6 +134,8 @@ export async function handler( const body = JSON.stringify(responseConverter(json)) logger.metric({ response_length: body.length }) logger.debug("RESPONSE: " + body) + dataDumper?.provideResponse(body) + dataDumper?.flush() await rateLimiter?.track() await trackUsage(authInfo, modelInfo, providerInfo, json.usage) await reload(authInfo) @@ -155,6 +165,7 @@ export async function handler( response_length: responseLength, "timestamp.last_byte": Date.now(), }) + dataDumper?.flush() await rateLimiter?.track() const usage = usageParser.retrieve() if (usage) { @@ -174,6 +185,7 @@ export async function handler( } responseLength += value.length buffer += decoder.decode(value, { stream: true }) + dataDumper?.provideStream(buffer) const parts = buffer.split(providerInfo.streamSeparator) buffer = parts.pop() ?? "" diff --git a/packages/console/app/sst-env.d.ts b/packages/console/app/sst-env.d.ts index bd55882173..9b9de73273 100644 --- a/packages/console/app/sst-env.d.ts +++ b/packages/console/app/sst-env.d.ts @@ -6,4 +6,4 @@ /// import "sst" -export {} +export {} \ No newline at end of file diff --git a/packages/console/core/src/model.ts b/packages/console/core/src/model.ts index ed7911ab99..fd6cd095e9 100644 --- a/packages/console/core/src/model.ts +++ b/packages/console/core/src/model.ts @@ -32,6 +32,7 @@ export namespace ZenData { model: z.string(), weight: z.number().optional(), disabled: z.boolean().optional(), + storeModel: z.string().optional(), }), ), }) diff --git a/packages/console/core/sst-env.d.ts b/packages/console/core/sst-env.d.ts index 0862ae4e37..8e38d38251 100644 --- a/packages/console/core/sst-env.d.ts +++ b/packages/console/core/sst-env.d.ts @@ -6,116 +6,126 @@ import "sst" declare module "sst" { export interface Resource { - ADMIN_SECRET: { - type: "sst.sst.Secret" - value: string + "ADMIN_SECRET": { + "type": "sst.sst.Secret" + "value": string } - AUTH_API_URL: { - type: "sst.sst.Linkable" - value: string + "AUTH_API_URL": { + "type": "sst.sst.Linkable" + "value": string } - AWS_SES_ACCESS_KEY_ID: { - type: "sst.sst.Secret" - value: string + "AWS_SES_ACCESS_KEY_ID": { + "type": "sst.sst.Secret" + "value": string } - AWS_SES_SECRET_ACCESS_KEY: { - type: "sst.sst.Secret" - value: string + "AWS_SES_SECRET_ACCESS_KEY": { + "type": "sst.sst.Secret" + "value": string } - CLOUDFLARE_API_TOKEN: { - type: "sst.sst.Secret" - value: string + "CLOUDFLARE_API_TOKEN": { + "type": "sst.sst.Secret" + "value": string } - CLOUDFLARE_DEFAULT_ACCOUNT_ID: { - type: "sst.sst.Secret" - value: string + "CLOUDFLARE_DEFAULT_ACCOUNT_ID": { + "type": "sst.sst.Secret" + "value": string } - Console: { - type: "sst.cloudflare.SolidStart" - url: string + "Console": { + "type": "sst.cloudflare.SolidStart" + "url": string } - Database: { - database: string - host: string - password: string - port: number - type: "sst.sst.Linkable" - username: string + "Database": { + "database": string + "host": string + "password": string + "port": number + "type": "sst.sst.Linkable" + "username": string } - Desktop: { - type: "sst.cloudflare.StaticSite" - url: string + "Desktop": { + "type": "sst.cloudflare.StaticSite" + "url": string } - EMAILOCTOPUS_API_KEY: { - type: "sst.sst.Secret" - value: string + "EMAILOCTOPUS_API_KEY": { + "type": "sst.sst.Secret" + "value": string } - GITHUB_APP_ID: { - 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_APP_PRIVATE_KEY": { + "type": "sst.sst.Secret" + "value": string } - GITHUB_CLIENT_ID_CONSOLE: { - 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 + "GITHUB_CLIENT_SECRET_CONSOLE": { + "type": "sst.sst.Secret" + "value": string } - GOOGLE_CLIENT_ID: { - type: "sst.sst.Secret" - value: string + "GOOGLE_CLIENT_ID": { + "type": "sst.sst.Secret" + "value": string } - HONEYCOMB_API_KEY: { - type: "sst.sst.Secret" - value: string + "HONEYCOMB_API_KEY": { + "type": "sst.sst.Secret" + "value": string } - STRIPE_SECRET_KEY: { - type: "sst.sst.Secret" - value: string + "R2AccessKey": { + "type": "sst.sst.Secret" + "value": string } - STRIPE_WEBHOOK_SECRET: { - type: "sst.sst.Linkable" - value: string + "R2SecretKey": { + "type": "sst.sst.Secret" + "value": string } - Web: { - type: "sst.cloudflare.Astro" - url: string + "STRIPE_SECRET_KEY": { + "type": "sst.sst.Secret" + "value": string } - ZEN_MODELS1: { - type: "sst.sst.Secret" - value: string + "STRIPE_WEBHOOK_SECRET": { + "type": "sst.sst.Linkable" + "value": string } - ZEN_MODELS2: { - type: "sst.sst.Secret" - value: string + "Web": { + "type": "sst.cloudflare.Astro" + "url": string } - ZEN_MODELS3: { - type: "sst.sst.Secret" - value: string + "ZEN_MODELS1": { + "type": "sst.sst.Secret" + "value": string } - ZEN_MODELS4: { - type: "sst.sst.Secret" - value: string + "ZEN_MODELS2": { + "type": "sst.sst.Secret" + "value": string + } + "ZEN_MODELS3": { + "type": "sst.sst.Secret" + "value": string + } + "ZEN_MODELS4": { + "type": "sst.sst.Secret" + "value": string } } } -// cloudflare -import * as cloudflare from "@cloudflare/workers-types" +// 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 - GatewayKv: cloudflare.KVNamespace - LogProcessor: cloudflare.Service + "Api": cloudflare.Service + "AuthApi": cloudflare.Service + "AuthStorage": cloudflare.KVNamespace + "Bucket": cloudflare.R2Bucket + "ConsoleData": cloudflare.R2Bucket + "EnterpriseStorage": cloudflare.R2Bucket + "GatewayKv": cloudflare.KVNamespace + "LogProcessor": cloudflare.Service } } import "sst" -export {} +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 0862ae4e37..8e38d38251 100644 --- a/packages/console/function/sst-env.d.ts +++ b/packages/console/function/sst-env.d.ts @@ -6,116 +6,126 @@ import "sst" declare module "sst" { export interface Resource { - ADMIN_SECRET: { - type: "sst.sst.Secret" - value: string + "ADMIN_SECRET": { + "type": "sst.sst.Secret" + "value": string } - AUTH_API_URL: { - type: "sst.sst.Linkable" - value: string + "AUTH_API_URL": { + "type": "sst.sst.Linkable" + "value": string } - AWS_SES_ACCESS_KEY_ID: { - type: "sst.sst.Secret" - value: string + "AWS_SES_ACCESS_KEY_ID": { + "type": "sst.sst.Secret" + "value": string } - AWS_SES_SECRET_ACCESS_KEY: { - type: "sst.sst.Secret" - value: string + "AWS_SES_SECRET_ACCESS_KEY": { + "type": "sst.sst.Secret" + "value": string } - CLOUDFLARE_API_TOKEN: { - type: "sst.sst.Secret" - value: string + "CLOUDFLARE_API_TOKEN": { + "type": "sst.sst.Secret" + "value": string } - CLOUDFLARE_DEFAULT_ACCOUNT_ID: { - type: "sst.sst.Secret" - value: string + "CLOUDFLARE_DEFAULT_ACCOUNT_ID": { + "type": "sst.sst.Secret" + "value": string } - Console: { - type: "sst.cloudflare.SolidStart" - url: string + "Console": { + "type": "sst.cloudflare.SolidStart" + "url": string } - Database: { - database: string - host: string - password: string - port: number - type: "sst.sst.Linkable" - username: string + "Database": { + "database": string + "host": string + "password": string + "port": number + "type": "sst.sst.Linkable" + "username": string } - Desktop: { - type: "sst.cloudflare.StaticSite" - url: string + "Desktop": { + "type": "sst.cloudflare.StaticSite" + "url": string } - EMAILOCTOPUS_API_KEY: { - type: "sst.sst.Secret" - value: string + "EMAILOCTOPUS_API_KEY": { + "type": "sst.sst.Secret" + "value": string } - GITHUB_APP_ID: { - 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_APP_PRIVATE_KEY": { + "type": "sst.sst.Secret" + "value": string } - GITHUB_CLIENT_ID_CONSOLE: { - 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 + "GITHUB_CLIENT_SECRET_CONSOLE": { + "type": "sst.sst.Secret" + "value": string } - GOOGLE_CLIENT_ID: { - type: "sst.sst.Secret" - value: string + "GOOGLE_CLIENT_ID": { + "type": "sst.sst.Secret" + "value": string } - HONEYCOMB_API_KEY: { - type: "sst.sst.Secret" - value: string + "HONEYCOMB_API_KEY": { + "type": "sst.sst.Secret" + "value": string } - STRIPE_SECRET_KEY: { - type: "sst.sst.Secret" - value: string + "R2AccessKey": { + "type": "sst.sst.Secret" + "value": string } - STRIPE_WEBHOOK_SECRET: { - type: "sst.sst.Linkable" - value: string + "R2SecretKey": { + "type": "sst.sst.Secret" + "value": string } - Web: { - type: "sst.cloudflare.Astro" - url: string + "STRIPE_SECRET_KEY": { + "type": "sst.sst.Secret" + "value": string } - ZEN_MODELS1: { - type: "sst.sst.Secret" - value: string + "STRIPE_WEBHOOK_SECRET": { + "type": "sst.sst.Linkable" + "value": string } - ZEN_MODELS2: { - type: "sst.sst.Secret" - value: string + "Web": { + "type": "sst.cloudflare.Astro" + "url": string } - ZEN_MODELS3: { - type: "sst.sst.Secret" - value: string + "ZEN_MODELS1": { + "type": "sst.sst.Secret" + "value": string } - ZEN_MODELS4: { - type: "sst.sst.Secret" - value: string + "ZEN_MODELS2": { + "type": "sst.sst.Secret" + "value": string + } + "ZEN_MODELS3": { + "type": "sst.sst.Secret" + "value": string + } + "ZEN_MODELS4": { + "type": "sst.sst.Secret" + "value": string } } } -// cloudflare -import * as cloudflare from "@cloudflare/workers-types" +// 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 - GatewayKv: cloudflare.KVNamespace - LogProcessor: cloudflare.Service + "Api": cloudflare.Service + "AuthApi": cloudflare.Service + "AuthStorage": cloudflare.KVNamespace + "Bucket": cloudflare.R2Bucket + "ConsoleData": cloudflare.R2Bucket + "EnterpriseStorage": cloudflare.R2Bucket + "GatewayKv": cloudflare.KVNamespace + "LogProcessor": cloudflare.Service } } import "sst" -export {} +export {} \ No newline at end of file diff --git a/packages/console/mail/sst-env.d.ts b/packages/console/mail/sst-env.d.ts index bd55882173..9b9de73273 100644 --- a/packages/console/mail/sst-env.d.ts +++ b/packages/console/mail/sst-env.d.ts @@ -6,4 +6,4 @@ /// import "sst" -export {} +export {} \ No newline at end of file diff --git a/packages/console/resource/resource.cloudflare.ts b/packages/console/resource/resource.cloudflare.ts index a56b1e4174..745212ca9c 100644 --- a/packages/console/resource/resource.cloudflare.ts +++ b/packages/console/resource/resource.cloudflare.ts @@ -1,4 +1,5 @@ import { env } from "cloudflare:workers" +export { waitUntil } from "cloudflare:workers" export const Resource = new Proxy( {}, diff --git a/packages/console/resource/resource.node.ts b/packages/console/resource/resource.node.ts index f63d7bada9..46b9629ed2 100644 --- a/packages/console/resource/resource.node.ts +++ b/packages/console/resource/resource.node.ts @@ -2,54 +2,66 @@ import type { KVNamespaceListOptions, KVNamespaceListResult, KVNamespacePutOptio import { Resource as ResourceBase } from "sst" import Cloudflare from "cloudflare" +export const waitUntil = async (fn: () => Promise) => { + await fn() +} + export const Resource = new Proxy( {}, { get(_target, prop: keyof typeof ResourceBase) { const value = ResourceBase[prop] - // @ts-ignore - if ("type" in value && value.type === "sst.cloudflare.Kv") { - const client = new Cloudflare({ - apiToken: ResourceBase.CLOUDFLARE_API_TOKEN.value, - }) + if ("type" in value) { // @ts-ignore - const namespaceId = value.namespaceId - const accountId = ResourceBase.CLOUDFLARE_DEFAULT_ACCOUNT_ID.value - return { - get: (k: string | string[]) => { - const isMulti = Array.isArray(k) - return client.kv.namespaces - .bulkGet(namespaceId, { - keys: Array.isArray(k) ? k : [k], + if (value.type === "sst.cloudflare.Bucket") { + return { + put: async () => {}, + } + } + // @ts-ignore + if (value.type === "sst.cloudflare.Kv") { + const client = new Cloudflare({ + apiToken: ResourceBase.CLOUDFLARE_API_TOKEN.value, + }) + // @ts-ignore + const namespaceId = value.namespaceId + const accountId = ResourceBase.CLOUDFLARE_DEFAULT_ACCOUNT_ID.value + return { + get: (k: string | string[]) => { + const isMulti = Array.isArray(k) + return client.kv.namespaces + .bulkGet(namespaceId, { + keys: Array.isArray(k) ? k : [k], + account_id: accountId, + }) + .then((result) => (isMulti ? new Map(Object.entries(result?.values ?? {})) : result?.values?.[k])) + }, + put: (k: string, v: string, opts?: KVNamespacePutOptions) => + client.kv.namespaces.values.update(namespaceId, k, { account_id: accountId, - }) - .then((result) => (isMulti ? new Map(Object.entries(result?.values ?? {})) : result?.values?.[k])) - }, - put: (k: string, v: string, opts?: KVNamespacePutOptions) => - client.kv.namespaces.values.update(namespaceId, k, { - account_id: accountId, - value: v, - expiration: opts?.expiration, - expiration_ttl: opts?.expirationTtl, - metadata: opts?.metadata, - }), - delete: (k: string) => - client.kv.namespaces.values.delete(namespaceId, k, { - account_id: accountId, - }), - list: (opts?: KVNamespaceListOptions): Promise> => - client.kv.namespaces.keys - .list(namespaceId, { - account_id: accountId, - prefix: opts?.prefix ?? undefined, - }) - .then((result) => { - return { - keys: result.result, - list_complete: true, - cacheStatus: null, - } + value: v, + expiration: opts?.expiration, + expiration_ttl: opts?.expirationTtl, + metadata: opts?.metadata, }), + delete: (k: string) => + client.kv.namespaces.values.delete(namespaceId, k, { + account_id: accountId, + }), + list: (opts?: KVNamespaceListOptions): Promise> => + client.kv.namespaces.keys + .list(namespaceId, { + account_id: accountId, + prefix: opts?.prefix ?? undefined, + }) + .then((result) => { + return { + keys: result.result, + list_complete: true, + cacheStatus: null, + } + }), + } } } return value diff --git a/packages/console/resource/sst-env.d.ts b/packages/console/resource/sst-env.d.ts index 0862ae4e37..8e38d38251 100644 --- a/packages/console/resource/sst-env.d.ts +++ b/packages/console/resource/sst-env.d.ts @@ -6,116 +6,126 @@ import "sst" declare module "sst" { export interface Resource { - ADMIN_SECRET: { - type: "sst.sst.Secret" - value: string + "ADMIN_SECRET": { + "type": "sst.sst.Secret" + "value": string } - AUTH_API_URL: { - type: "sst.sst.Linkable" - value: string + "AUTH_API_URL": { + "type": "sst.sst.Linkable" + "value": string } - AWS_SES_ACCESS_KEY_ID: { - type: "sst.sst.Secret" - value: string + "AWS_SES_ACCESS_KEY_ID": { + "type": "sst.sst.Secret" + "value": string } - AWS_SES_SECRET_ACCESS_KEY: { - type: "sst.sst.Secret" - value: string + "AWS_SES_SECRET_ACCESS_KEY": { + "type": "sst.sst.Secret" + "value": string } - CLOUDFLARE_API_TOKEN: { - type: "sst.sst.Secret" - value: string + "CLOUDFLARE_API_TOKEN": { + "type": "sst.sst.Secret" + "value": string } - CLOUDFLARE_DEFAULT_ACCOUNT_ID: { - type: "sst.sst.Secret" - value: string + "CLOUDFLARE_DEFAULT_ACCOUNT_ID": { + "type": "sst.sst.Secret" + "value": string } - Console: { - type: "sst.cloudflare.SolidStart" - url: string + "Console": { + "type": "sst.cloudflare.SolidStart" + "url": string } - Database: { - database: string - host: string - password: string - port: number - type: "sst.sst.Linkable" - username: string + "Database": { + "database": string + "host": string + "password": string + "port": number + "type": "sst.sst.Linkable" + "username": string } - Desktop: { - type: "sst.cloudflare.StaticSite" - url: string + "Desktop": { + "type": "sst.cloudflare.StaticSite" + "url": string } - EMAILOCTOPUS_API_KEY: { - type: "sst.sst.Secret" - value: string + "EMAILOCTOPUS_API_KEY": { + "type": "sst.sst.Secret" + "value": string } - GITHUB_APP_ID: { - 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_APP_PRIVATE_KEY": { + "type": "sst.sst.Secret" + "value": string } - GITHUB_CLIENT_ID_CONSOLE: { - 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 + "GITHUB_CLIENT_SECRET_CONSOLE": { + "type": "sst.sst.Secret" + "value": string } - GOOGLE_CLIENT_ID: { - type: "sst.sst.Secret" - value: string + "GOOGLE_CLIENT_ID": { + "type": "sst.sst.Secret" + "value": string } - HONEYCOMB_API_KEY: { - type: "sst.sst.Secret" - value: string + "HONEYCOMB_API_KEY": { + "type": "sst.sst.Secret" + "value": string } - STRIPE_SECRET_KEY: { - type: "sst.sst.Secret" - value: string + "R2AccessKey": { + "type": "sst.sst.Secret" + "value": string } - STRIPE_WEBHOOK_SECRET: { - type: "sst.sst.Linkable" - value: string + "R2SecretKey": { + "type": "sst.sst.Secret" + "value": string } - Web: { - type: "sst.cloudflare.Astro" - url: string + "STRIPE_SECRET_KEY": { + "type": "sst.sst.Secret" + "value": string } - ZEN_MODELS1: { - type: "sst.sst.Secret" - value: string + "STRIPE_WEBHOOK_SECRET": { + "type": "sst.sst.Linkable" + "value": string } - ZEN_MODELS2: { - type: "sst.sst.Secret" - value: string + "Web": { + "type": "sst.cloudflare.Astro" + "url": string } - ZEN_MODELS3: { - type: "sst.sst.Secret" - value: string + "ZEN_MODELS1": { + "type": "sst.sst.Secret" + "value": string } - ZEN_MODELS4: { - type: "sst.sst.Secret" - value: string + "ZEN_MODELS2": { + "type": "sst.sst.Secret" + "value": string + } + "ZEN_MODELS3": { + "type": "sst.sst.Secret" + "value": string + } + "ZEN_MODELS4": { + "type": "sst.sst.Secret" + "value": string } } } -// cloudflare -import * as cloudflare from "@cloudflare/workers-types" +// 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 - GatewayKv: cloudflare.KVNamespace - LogProcessor: cloudflare.Service + "Api": cloudflare.Service + "AuthApi": cloudflare.Service + "AuthStorage": cloudflare.KVNamespace + "Bucket": cloudflare.R2Bucket + "ConsoleData": cloudflare.R2Bucket + "EnterpriseStorage": cloudflare.R2Bucket + "GatewayKv": cloudflare.KVNamespace + "LogProcessor": cloudflare.Service } } import "sst" -export {} +export {} \ No newline at end of file diff --git a/packages/desktop/src/sst-env.d.ts b/packages/desktop/src/sst-env.d.ts index 1b1683a1e7..47a8fbec7b 100644 --- a/packages/desktop/src/sst-env.d.ts +++ b/packages/desktop/src/sst-env.d.ts @@ -2,7 +2,9 @@ /* tslint:disable */ /* eslint-disable */ /// -interface ImportMetaEnv {} +interface ImportMetaEnv { + +} interface ImportMeta { readonly env: ImportMetaEnv -} +} \ No newline at end of file diff --git a/packages/desktop/sst-env.d.ts b/packages/desktop/sst-env.d.ts index 0397645b50..b6a7e9066e 100644 --- a/packages/desktop/sst-env.d.ts +++ b/packages/desktop/sst-env.d.ts @@ -6,4 +6,4 @@ /// import "sst" -export {} +export {} \ No newline at end of file diff --git a/packages/enterprise/sst-env.d.ts b/packages/enterprise/sst-env.d.ts new file mode 100644 index 0000000000..8e38d38251 --- /dev/null +++ b/packages/enterprise/sst-env.d.ts @@ -0,0 +1,131 @@ +/* This file is auto-generated by SST. Do not edit. */ +/* tslint:disable */ +/* 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 + } + "CLOUDFLARE_API_TOKEN": { + "type": "sst.sst.Secret" + "value": string + } + "CLOUDFLARE_DEFAULT_ACCOUNT_ID": { + "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 + } + "R2AccessKey": { + "type": "sst.sst.Secret" + "value": string + } + "R2SecretKey": { + "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 + } + "ZEN_MODELS3": { + "type": "sst.sst.Secret" + "value": string + } + "ZEN_MODELS4": { + "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 + "ConsoleData": cloudflare.R2Bucket + "EnterpriseStorage": cloudflare.R2Bucket + "GatewayKv": cloudflare.KVNamespace + "LogProcessor": cloudflare.Service + } +} + +import "sst" +export {} \ No newline at end of file diff --git a/packages/function/sst-env.d.ts b/packages/function/sst-env.d.ts index 0862ae4e37..8e38d38251 100644 --- a/packages/function/sst-env.d.ts +++ b/packages/function/sst-env.d.ts @@ -6,116 +6,126 @@ import "sst" declare module "sst" { export interface Resource { - ADMIN_SECRET: { - type: "sst.sst.Secret" - value: string + "ADMIN_SECRET": { + "type": "sst.sst.Secret" + "value": string } - AUTH_API_URL: { - type: "sst.sst.Linkable" - value: string + "AUTH_API_URL": { + "type": "sst.sst.Linkable" + "value": string } - AWS_SES_ACCESS_KEY_ID: { - type: "sst.sst.Secret" - value: string + "AWS_SES_ACCESS_KEY_ID": { + "type": "sst.sst.Secret" + "value": string } - AWS_SES_SECRET_ACCESS_KEY: { - type: "sst.sst.Secret" - value: string + "AWS_SES_SECRET_ACCESS_KEY": { + "type": "sst.sst.Secret" + "value": string } - CLOUDFLARE_API_TOKEN: { - type: "sst.sst.Secret" - value: string + "CLOUDFLARE_API_TOKEN": { + "type": "sst.sst.Secret" + "value": string } - CLOUDFLARE_DEFAULT_ACCOUNT_ID: { - type: "sst.sst.Secret" - value: string + "CLOUDFLARE_DEFAULT_ACCOUNT_ID": { + "type": "sst.sst.Secret" + "value": string } - Console: { - type: "sst.cloudflare.SolidStart" - url: string + "Console": { + "type": "sst.cloudflare.SolidStart" + "url": string } - Database: { - database: string - host: string - password: string - port: number - type: "sst.sst.Linkable" - username: string + "Database": { + "database": string + "host": string + "password": string + "port": number + "type": "sst.sst.Linkable" + "username": string } - Desktop: { - type: "sst.cloudflare.StaticSite" - url: string + "Desktop": { + "type": "sst.cloudflare.StaticSite" + "url": string } - EMAILOCTOPUS_API_KEY: { - type: "sst.sst.Secret" - value: string + "EMAILOCTOPUS_API_KEY": { + "type": "sst.sst.Secret" + "value": string } - GITHUB_APP_ID: { - 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_APP_PRIVATE_KEY": { + "type": "sst.sst.Secret" + "value": string } - GITHUB_CLIENT_ID_CONSOLE: { - 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 + "GITHUB_CLIENT_SECRET_CONSOLE": { + "type": "sst.sst.Secret" + "value": string } - GOOGLE_CLIENT_ID: { - type: "sst.sst.Secret" - value: string + "GOOGLE_CLIENT_ID": { + "type": "sst.sst.Secret" + "value": string } - HONEYCOMB_API_KEY: { - type: "sst.sst.Secret" - value: string + "HONEYCOMB_API_KEY": { + "type": "sst.sst.Secret" + "value": string } - STRIPE_SECRET_KEY: { - type: "sst.sst.Secret" - value: string + "R2AccessKey": { + "type": "sst.sst.Secret" + "value": string } - STRIPE_WEBHOOK_SECRET: { - type: "sst.sst.Linkable" - value: string + "R2SecretKey": { + "type": "sst.sst.Secret" + "value": string } - Web: { - type: "sst.cloudflare.Astro" - url: string + "STRIPE_SECRET_KEY": { + "type": "sst.sst.Secret" + "value": string } - ZEN_MODELS1: { - type: "sst.sst.Secret" - value: string + "STRIPE_WEBHOOK_SECRET": { + "type": "sst.sst.Linkable" + "value": string } - ZEN_MODELS2: { - type: "sst.sst.Secret" - value: string + "Web": { + "type": "sst.cloudflare.Astro" + "url": string } - ZEN_MODELS3: { - type: "sst.sst.Secret" - value: string + "ZEN_MODELS1": { + "type": "sst.sst.Secret" + "value": string } - ZEN_MODELS4: { - type: "sst.sst.Secret" - value: string + "ZEN_MODELS2": { + "type": "sst.sst.Secret" + "value": string + } + "ZEN_MODELS3": { + "type": "sst.sst.Secret" + "value": string + } + "ZEN_MODELS4": { + "type": "sst.sst.Secret" + "value": string } } } -// cloudflare -import * as cloudflare from "@cloudflare/workers-types" +// 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 - GatewayKv: cloudflare.KVNamespace - LogProcessor: cloudflare.Service + "Api": cloudflare.Service + "AuthApi": cloudflare.Service + "AuthStorage": cloudflare.KVNamespace + "Bucket": cloudflare.R2Bucket + "ConsoleData": cloudflare.R2Bucket + "EnterpriseStorage": cloudflare.R2Bucket + "GatewayKv": cloudflare.KVNamespace + "LogProcessor": cloudflare.Service } } import "sst" -export {} +export {} \ No newline at end of file diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index bc212629d3..d632085cfc 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -676,7 +676,7 @@ export namespace Provider { if (providerID === "github-copilot") { priority = priority.filter((m) => m !== "claude-haiku-4.5") } - if (providerID === "opencode" || providerID === "local") { + if (providerID.startsWith("opencode")) { priority = ["gpt-5-nano"] } for (const item of priority) { diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index 6b255981b7..f550005b34 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -534,7 +534,7 @@ export namespace SessionPrompt { } }, headers: { - ...(model.providerID === "opencode" + ...(model.providerID.startsWith("opencode") ? { "x-opencode-session": sessionID, "x-opencode-request": lastUser.id, diff --git a/packages/opencode/sst-env.d.ts b/packages/opencode/sst-env.d.ts index 0397645b50..b6a7e9066e 100644 --- a/packages/opencode/sst-env.d.ts +++ b/packages/opencode/sst-env.d.ts @@ -6,4 +6,4 @@ /// import "sst" -export {} +export {} \ No newline at end of file diff --git a/packages/plugin/sst-env.d.ts b/packages/plugin/sst-env.d.ts index 0397645b50..b6a7e9066e 100644 --- a/packages/plugin/sst-env.d.ts +++ b/packages/plugin/sst-env.d.ts @@ -6,4 +6,4 @@ /// import "sst" -export {} +export {} \ No newline at end of file diff --git a/packages/script/sst-env.d.ts b/packages/script/sst-env.d.ts index 0397645b50..b6a7e9066e 100644 --- a/packages/script/sst-env.d.ts +++ b/packages/script/sst-env.d.ts @@ -6,4 +6,4 @@ /// import "sst" -export {} +export {} \ No newline at end of file diff --git a/packages/sdk/js/sst-env.d.ts b/packages/sdk/js/sst-env.d.ts index bd55882173..9b9de73273 100644 --- a/packages/sdk/js/sst-env.d.ts +++ b/packages/sdk/js/sst-env.d.ts @@ -6,4 +6,4 @@ /// import "sst" -export {} +export {} \ No newline at end of file diff --git a/packages/sdk/python/sst.pyi b/packages/sdk/python/sst.pyi index 0598229ca3..1c423e9ac5 100644 --- a/packages/sdk/python/sst.pyi +++ b/packages/sdk/python/sst.pyi @@ -39,6 +39,9 @@ class Resource: class Console: type: str url: str + class ConsoleData: + name: str + type: str class Database: database: str host: str @@ -52,6 +55,9 @@ class Resource: class EMAILOCTOPUS_API_KEY: type: str value: str + class EnterpriseStorage: + name: str + type: str class GITHUB_APP_ID: type: str value: str @@ -75,6 +81,12 @@ class Resource: value: str class LogProcessor: type: str + class R2AccessKey: + type: str + value: str + class R2SecretKey: + type: str + value: str class STRIPE_SECRET_KEY: type: str value: str diff --git a/packages/slack/sst-env.d.ts b/packages/slack/sst-env.d.ts index 0397645b50..b6a7e9066e 100644 --- a/packages/slack/sst-env.d.ts +++ b/packages/slack/sst-env.d.ts @@ -6,4 +6,4 @@ /// import "sst" -export {} +export {} \ No newline at end of file diff --git a/packages/tauri/sst-env.d.ts b/packages/tauri/sst-env.d.ts new file mode 100644 index 0000000000..b6a7e9066e --- /dev/null +++ b/packages/tauri/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/ui/sst-env.d.ts b/packages/ui/sst-env.d.ts index 0397645b50..b6a7e9066e 100644 --- a/packages/ui/sst-env.d.ts +++ b/packages/ui/sst-env.d.ts @@ -6,4 +6,4 @@ /// import "sst" -export {} +export {} \ No newline at end of file diff --git a/packages/util/sst-env.d.ts b/packages/util/sst-env.d.ts index 0397645b50..b6a7e9066e 100644 --- a/packages/util/sst-env.d.ts +++ b/packages/util/sst-env.d.ts @@ -6,4 +6,4 @@ /// import "sst" -export {} +export {} \ No newline at end of file diff --git a/packages/web/sst-env.d.ts b/packages/web/sst-env.d.ts index 0397645b50..b6a7e9066e 100644 --- a/packages/web/sst-env.d.ts +++ b/packages/web/sst-env.d.ts @@ -6,4 +6,4 @@ /// import "sst" -export {} +export {} \ No newline at end of file diff --git a/sdks/vscode/sst-env.d.ts b/sdks/vscode/sst-env.d.ts index 0397645b50..b6a7e9066e 100644 --- a/sdks/vscode/sst-env.d.ts +++ b/sdks/vscode/sst-env.d.ts @@ -6,4 +6,4 @@ /// import "sst" -export {} +export {} \ No newline at end of file diff --git a/sst-env.d.ts b/sst-env.d.ts index 171ff4a071..361c2fdfa8 100644 --- a/sst-env.d.ts +++ b/sst-env.d.ts @@ -5,128 +5,144 @@ declare module "sst" { export interface Resource { - ADMIN_SECRET: { - type: "sst.sst.Secret" - value: string + "ADMIN_SECRET": { + "type": "sst.sst.Secret" + "value": string } - AUTH_API_URL: { - type: "sst.sst.Linkable" - value: string + "AUTH_API_URL": { + "type": "sst.sst.Linkable" + "value": string } - AWS_SES_ACCESS_KEY_ID: { - type: "sst.sst.Secret" - value: string + "AWS_SES_ACCESS_KEY_ID": { + "type": "sst.sst.Secret" + "value": string } - AWS_SES_SECRET_ACCESS_KEY: { - type: "sst.sst.Secret" - value: string + "AWS_SES_SECRET_ACCESS_KEY": { + "type": "sst.sst.Secret" + "value": string } - Api: { - type: "sst.cloudflare.Worker" - url: string + "Api": { + "type": "sst.cloudflare.Worker" + "url": string } - AuthApi: { - type: "sst.cloudflare.Worker" - url: string + "AuthApi": { + "type": "sst.cloudflare.Worker" + "url": string } - AuthStorage: { - namespaceId: string - type: "sst.cloudflare.Kv" + "AuthStorage": { + "namespaceId": string + "type": "sst.cloudflare.Kv" } - Bucket: { - name: string - type: "sst.cloudflare.Bucket" + "Bucket": { + "name": string + "type": "sst.cloudflare.Bucket" } - CLOUDFLARE_API_TOKEN: { - type: "sst.sst.Secret" - value: string + "CLOUDFLARE_API_TOKEN": { + "type": "sst.sst.Secret" + "value": string } - CLOUDFLARE_DEFAULT_ACCOUNT_ID: { - type: "sst.sst.Secret" - value: string + "CLOUDFLARE_DEFAULT_ACCOUNT_ID": { + "type": "sst.sst.Secret" + "value": string } - Console: { - type: "sst.cloudflare.SolidStart" - url: string + "Console": { + "type": "sst.cloudflare.SolidStart" + "url": string } - Database: { - database: string - host: string - password: string - port: number - type: "sst.sst.Linkable" - username: string + "ConsoleData": { + "name": string + "type": "sst.cloudflare.Bucket" } - Desktop: { - type: "sst.cloudflare.StaticSite" - url: string + "Database": { + "database": string + "host": string + "password": string + "port": number + "type": "sst.sst.Linkable" + "username": string } - EMAILOCTOPUS_API_KEY: { - type: "sst.sst.Secret" - value: string + "Desktop": { + "type": "sst.cloudflare.StaticSite" + "url": string } - GITHUB_APP_ID: { - type: "sst.sst.Secret" - value: string + "EMAILOCTOPUS_API_KEY": { + "type": "sst.sst.Secret" + "value": string } - GITHUB_APP_PRIVATE_KEY: { - type: "sst.sst.Secret" - value: string + "EnterpriseStorage": { + "name": string + "type": "sst.cloudflare.Bucket" } - GITHUB_CLIENT_ID_CONSOLE: { - type: "sst.sst.Secret" - value: string + "GITHUB_APP_ID": { + "type": "sst.sst.Secret" + "value": string } - GITHUB_CLIENT_SECRET_CONSOLE: { - type: "sst.sst.Secret" - value: string + "GITHUB_APP_PRIVATE_KEY": { + "type": "sst.sst.Secret" + "value": string } - GOOGLE_CLIENT_ID: { - type: "sst.sst.Secret" - value: string + "GITHUB_CLIENT_ID_CONSOLE": { + "type": "sst.sst.Secret" + "value": string } - GatewayKv: { - namespaceId: string - type: "sst.cloudflare.Kv" + "GITHUB_CLIENT_SECRET_CONSOLE": { + "type": "sst.sst.Secret" + "value": string } - HONEYCOMB_API_KEY: { - type: "sst.sst.Secret" - value: string + "GOOGLE_CLIENT_ID": { + "type": "sst.sst.Secret" + "value": string } - LogProcessor: { - type: "sst.cloudflare.Worker" + "GatewayKv": { + "namespaceId": string + "type": "sst.cloudflare.Kv" } - STRIPE_SECRET_KEY: { - type: "sst.sst.Secret" - value: string + "HONEYCOMB_API_KEY": { + "type": "sst.sst.Secret" + "value": string } - STRIPE_WEBHOOK_SECRET: { - type: "sst.sst.Linkable" - value: string + "LogProcessor": { + "type": "sst.cloudflare.Worker" } - Web: { - type: "sst.cloudflare.Astro" - url: string + "R2AccessKey": { + "type": "sst.sst.Secret" + "value": string } - ZEN_MODELS1: { - type: "sst.sst.Secret" - value: string + "R2SecretKey": { + "type": "sst.sst.Secret" + "value": string } - ZEN_MODELS2: { - type: "sst.sst.Secret" - value: string + "STRIPE_SECRET_KEY": { + "type": "sst.sst.Secret" + "value": string } - ZEN_MODELS3: { - type: "sst.sst.Secret" - value: string + "STRIPE_WEBHOOK_SECRET": { + "type": "sst.sst.Linkable" + "value": string } - ZEN_MODELS4: { - type: "sst.sst.Secret" - 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 + } + "ZEN_MODELS3": { + "type": "sst.sst.Secret" + "value": string + } + "ZEN_MODELS4": { + "type": "sst.sst.Secret" + "value": string } } } /// import "sst" -export {} +export {} \ No newline at end of file