diff options
| author | Frank <[email protected]> | 2025-09-18 10:59:01 -0400 |
|---|---|---|
| committer | Frank <[email protected]> | 2025-09-18 10:59:01 -0400 |
| commit | 4ceabdffa07b1af8d99eb73622a4d549d99ec6d2 (patch) | |
| tree | 72e2ae62084a9e24cc76caffbd1f30dafc69ea56 /packages/cloud/function | |
| parent | c87480cf931a6f8f8b55552558ef521f1918b578 (diff) | |
| download | opencode-4ceabdffa07b1af8d99eb73622a4d549d99ec6d2.tar.gz opencode-4ceabdffa07b1af8d99eb73622a4d549d99ec6d2.zip | |
wip: zen
Diffstat (limited to 'packages/cloud/function')
| -rw-r--r-- | packages/cloud/function/package.json | 26 | ||||
| -rw-r--r-- | packages/cloud/function/src/auth.ts | 140 | ||||
| -rw-r--r-- | packages/cloud/function/src/log-processor.ts | 49 | ||||
| -rw-r--r-- | packages/cloud/function/sst-env.d.ts | 96 | ||||
| -rw-r--r-- | packages/cloud/function/tsconfig.json | 9 |
5 files changed, 0 insertions, 320 deletions
diff --git a/packages/cloud/function/package.json b/packages/cloud/function/package.json deleted file mode 100644 index 856db3696..000000000 --- a/packages/cloud/function/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "@opencode/cloud-function", - "version": "0.9.11", - "$schema": "https://json.schemastore.org/package.json", - "private": true, - "type": "module", - "scripts": { - "typecheck": "tsc --noEmit" - }, - "devDependencies": { - "@cloudflare/workers-types": "4.20250522.0", - "@types/node": "catalog:", - "openai": "5.11.0", - "typescript": "catalog:" - }, - "dependencies": { - "@ai-sdk/anthropic": "2.0.0", - "@ai-sdk/openai": "2.0.2", - "@ai-sdk/openai-compatible": "1.0.1", - "@hono/zod-validator": "catalog:", - "@openauthjs/openauth": "0.0.0-20250322224806", - "ai": "catalog:", - "hono": "catalog:", - "zod": "catalog:" - } -} diff --git a/packages/cloud/function/src/auth.ts b/packages/cloud/function/src/auth.ts deleted file mode 100644 index 776855e46..000000000 --- a/packages/cloud/function/src/auth.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { z } from "zod" -import { issuer } from "@openauthjs/openauth" -import type { Theme } from "@openauthjs/openauth/ui/theme" -import { createSubjects } from "@openauthjs/openauth/subject" -import { THEME_OPENAUTH } from "@openauthjs/openauth/ui/theme" -import { GithubProvider } from "@openauthjs/openauth/provider/github" -import { GoogleOidcProvider } from "@openauthjs/openauth/provider/google" -import { CloudflareStorage } from "@openauthjs/openauth/storage/cloudflare" -import { Account } from "@opencode/cloud-core/account.js" -import { Workspace } from "@opencode/cloud-core/workspace.js" -import { Actor } from "@opencode/cloud-core/actor.js" -import { Resource } from "@opencode/cloud-resource" -import { Database } from "@opencode/cloud-core/drizzle/index.js" - -type Env = { - AuthStorage: KVNamespace -} - -export const subjects = createSubjects({ - account: z.object({ - accountID: z.string(), - email: z.string(), - }), - user: z.object({ - userID: z.string(), - workspaceID: z.string(), - }), -}) - -const MY_THEME: Theme = { - ...THEME_OPENAUTH, - logo: "https://opencode.ai/favicon.svg", -} - -export default { - async fetch(request: Request, env: Env, ctx: ExecutionContext) { - const result = await issuer({ - theme: MY_THEME, - providers: { - github: GithubProvider({ - clientID: Resource.GITHUB_CLIENT_ID_CONSOLE.value, - clientSecret: Resource.GITHUB_CLIENT_SECRET_CONSOLE.value, - scopes: ["read:user", "user:email"], - }), - google: GoogleOidcProvider({ - clientID: Resource.GOOGLE_CLIENT_ID.value, - scopes: ["openid", "email"], - }), - // email: CodeProvider({ - // async request(req, state, form, error) { - // console.log(state) - // const params = new URLSearchParams() - // if (error) { - // params.set("error", error.type) - // } - // if (state.type === "start") { - // return Response.redirect(process.env.AUTH_FRONTEND_URL + "/auth/email?" + params.toString(), 302) - // } - // - // if (state.type === "code") { - // return Response.redirect(process.env.AUTH_FRONTEND_URL + "/auth/code?" + params.toString(), 302) - // } - // - // return new Response("ok") - // }, - // async sendCode(claims, code) { - // const email = z.string().email().parse(claims.email) - // const cmd = new SendEmailCommand({ - // Destination: { - // ToAddresses: [email], - // }, - // FromEmailAddress: `SST <auth@${Resource.Email.sender}>`, - // Content: { - // Simple: { - // Body: { - // Html: { - // Data: `Your pin code is <strong>${code}</strong>`, - // }, - // Text: { - // Data: `Your pin code is ${code}`, - // }, - // }, - // Subject: { - // Data: "SST Console Pin Code: " + code, - // }, - // }, - // }, - // }) - // await ses.send(cmd) - // }, - // }), - }, - storage: CloudflareStorage({ - namespace: env.AuthStorage, - }), - subjects, - async success(ctx, response) { - console.log(response) - - let email: string | undefined - - if (response.provider === "github") { - const emails = (await fetch("https://api.github.com/user/emails", { - headers: { - Authorization: `Bearer ${response.tokenset.access}`, - "User-Agent": "opencode", - Accept: "application/vnd.github+json", - }, - }).then((x) => x.json())) as any - email = emails.find((x: any) => x.primary && x.verified)?.email - } else if (response.provider === "google") { - if (!response.id.email_verified) throw new Error("Google email not verified") - email = response.id.email as string - } - //if (response.provider === "email") { - // email = response.claims.email - //} - else throw new Error("Unsupported provider") - - if (!email) throw new Error("No email found") - - let accountID = await Account.fromEmail(email).then((x) => x?.id) - if (!accountID) { - console.log("creating account for", email) - accountID = await Account.create({ - email: email!, - }) - } - await Actor.provide("account", { accountID, email }, async () => { - const workspaces = await Account.workspaces() - if (workspaces.length === 0) { - await Workspace.create() - } - }) - return ctx.subject("account", accountID, { accountID, email }) - }, - }).fetch(request, env, ctx) - return result - }, -} diff --git a/packages/cloud/function/src/log-processor.ts b/packages/cloud/function/src/log-processor.ts deleted file mode 100644 index 70fcf5a44..000000000 --- a/packages/cloud/function/src/log-processor.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Resource } from "@opencode/cloud-resource" -import type { TraceItem } from "@cloudflare/workers-types" - -export default { - async tail(events: TraceItem[]) { - for (const event of events) { - if (!event.event) continue - if (!("request" in event.event)) continue - if (event.event.request.method !== "POST") continue - - const url = new URL(event.event.request.url) - if (url.pathname !== "/zen/v1/chat/completions") return - - let metrics = { - event_type: "completions", - "cf.continent": event.event.request.cf?.continent, - "cf.country": event.event.request.cf?.country, - "cf.city": event.event.request.cf?.city, - "cf.region": event.event.request.cf?.region, - "cf.latitude": event.event.request.cf?.latitude, - "cf.longitude": event.event.request.cf?.longitude, - "cf.timezone": event.event.request.cf?.timezone, - duration: event.wallTime, - request_length: parseInt(event.event.request.headers["content-length"] ?? "0"), - status: event.event.response?.status ?? 0, - ip: event.event.request.headers["x-real-ip"], - } - for (const log of event.logs) { - for (const message of log.message) { - if (!message.startsWith("_metric:")) continue - metrics = { ...metrics, ...JSON.parse(message.slice(8)) } - } - } - console.log(JSON.stringify(metrics, null, 2)) - - const ret = await fetch("https://api.honeycomb.io/1/events/zen", { - method: "POST", - headers: { - "Content-Type": "application/json", - "X-Honeycomb-Event-Time": (event.eventTimestamp ?? Date.now()).toString(), - "X-Honeycomb-Team": Resource.HONEYCOMB_API_KEY.value, - }, - body: JSON.stringify(metrics), - }) - console.log(ret.status) - console.log(await ret.text()) - } - }, -} diff --git a/packages/cloud/function/sst-env.d.ts b/packages/cloud/function/sst-env.d.ts deleted file mode 100644 index afa8c6fe7..000000000 --- a/packages/cloud/function/sst-env.d.ts +++ /dev/null @@ -1,96 +0,0 @@ -/* 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 { - ANTHROPIC_API_KEY: { - type: "sst.sst.Secret" - value: string - } - AUTH_API_URL: { - type: "sst.sst.Linkable" - value: string - } - BASETEN_API_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 - } - FIREWORKS_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 - } - OPENAI_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 - } - XAI_API_KEY: { - 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 {} diff --git a/packages/cloud/function/tsconfig.json b/packages/cloud/function/tsconfig.json deleted file mode 100644 index 0faf16aab..000000000 --- a/packages/cloud/function/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "extends": "@tsconfig/node22/tsconfig.json", - "compilerOptions": { - "module": "ESNext", - "moduleResolution": "bundler", - "types": ["@cloudflare/workers-types", "node"] - } -} |
