diff --git a/bun.lock b/bun.lock index 6b97124aa..8ed9e69bc 100644 --- a/bun.lock +++ b/bun.lock @@ -14,7 +14,7 @@ }, "packages/app": { "name": "@opencode/app", - "version": "0.10.3", + "version": "0.10.4", "dependencies": { "@kobalte/core": "0.13.11", "@opencode-ai/sdk": "workspace:*", @@ -61,7 +61,7 @@ }, "packages/console/core": { "name": "@opencode/console-core", - "version": "0.10.3", + "version": "0.10.4", "dependencies": { "@aws-sdk/client-sts": "3.782.0", "@opencode/console-resource": "workspace:*", @@ -78,7 +78,7 @@ }, "packages/console/function": { "name": "@opencode/console-function", - "version": "0.10.3", + "version": "0.10.4", "dependencies": { "@ai-sdk/anthropic": "2.0.0", "@ai-sdk/openai": "2.0.2", @@ -104,7 +104,7 @@ }, "packages/console/scripts": { "name": "@opencode/console-scripts", - "version": "0.10.3", + "version": "0.10.4", "dependencies": { "@opencode/console-core": "workspace:*", "tsx": "4.20.5", @@ -116,7 +116,7 @@ }, "packages/function": { "name": "@opencode/function", - "version": "0.10.3", + "version": "0.10.4", "dependencies": { "@octokit/auth-app": "8.0.1", "@octokit/rest": "22.0.0", @@ -131,7 +131,7 @@ }, "packages/opencode": { "name": "opencode", - "version": "0.10.3", + "version": "0.10.4", "bin": { "opencode": "./bin/opencode", }, @@ -189,7 +189,7 @@ }, "packages/plugin": { "name": "@opencode-ai/plugin", - "version": "0.10.3", + "version": "0.10.4", "dependencies": { "@opencode-ai/sdk": "workspace:*", "zod": "catalog:", @@ -201,7 +201,7 @@ }, "packages/sdk/js": { "name": "@opencode-ai/sdk", - "version": "0.10.3", + "version": "0.10.4", "dependencies": { "@hey-api/openapi-ts": "0.82.5", }, @@ -212,7 +212,7 @@ }, "packages/web": { "name": "@opencode/web", - "version": "0.10.3", + "version": "0.10.4", "dependencies": { "@astrojs/cloudflare": "12.6.3", "@astrojs/markdown-remark": "6.3.1", diff --git a/packages/app/package.json b/packages/app/package.json index e4f95559f..cb8102cc9 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { "name": "@opencode/app", - "version": "0.10.3", + "version": "0.10.4", "description": "", "type": "module", "scripts": { diff --git a/packages/console/app/package.json b/packages/console/app/package.json index df7b30720..5371a58c1 100644 --- a/packages/console/app/package.json +++ b/packages/console/app/package.json @@ -7,7 +7,7 @@ "dev:remote": "VITE_AUTH_URL=https://auth.dev.opencode.ai bun sst shell --stage=dev bun dev", "build": "vinxi build && ../../opencode/script/schema.ts ./.output/public/config.json", "start": "vinxi start", - "version": "0.10.3" + "version": "0.10.4" }, "dependencies": { "@ibm/plex": "6.4.1", diff --git a/packages/console/app/src/component/workspace/privacy-section.module.css b/packages/console/app/src/component/workspace/privacy-section.module.css deleted file mode 100644 index 0bb5709cb..000000000 --- a/packages/console/app/src/component/workspace/privacy-section.module.css +++ /dev/null @@ -1,114 +0,0 @@ -.root { - [data-slot="section-content"] { - display: flex; - flex-direction: column; - gap: var(--space-3); - } - - [data-slot="reload-error"] { - display: flex; - align-items: center; - justify-content: space-between; - gap: var(--space-4); - padding: var(--space-4); - border: 1px solid var(--color-border); - border-radius: var(--border-radius-sm); - - p { - color: var(--color-danger); - font-size: var(--font-size-sm); - line-height: 1.4; - margin: 0; - flex: 1; - } - - [data-slot="create-form"] { - display: flex; - gap: var(--space-2); - margin: 0; - flex-shrink: 0; - } - } - [data-slot="payment"] { - display: flex; - flex-direction: column; - gap: var(--space-3); - padding: var(--space-4); - border: 1px solid var(--color-border); - border-radius: var(--border-radius-sm); - min-width: 14.5rem; - width: fit-content; - - @media (max-width: 30rem) { - width: 100%; - } - - [data-slot="credit-card"] { - padding: var(--space-3-5) var(--space-4); - background-color: var(--color-bg-surface); - border-radius: var(--border-radius-sm); - display: flex; - align-items: center; - justify-content: space-between; - - [data-slot="card-icon"] { - display: flex; - align-items: center; - color: var(--color-text-muted); - } - - [data-slot="card-details"] { - display: flex; - align-items: baseline; - gap: var(--space-1); - - [data-slot="secret"] { - position: relative; - bottom: 2px; - font-size: var(--font-size-lg); - color: var(--color-text-muted); - font-weight: 400; - } - - [data-slot="number"] { - font-size: var(--font-size-3xl); - font-weight: 500; - color: var(--color-text); - } - } - } - - [data-slot="button-row"] { - display: flex; - gap: var(--space-2); - align-items: center; - - @media (max-width: 30rem) { - flex-direction: column; - - > button { - width: 100%; - } - } - - [data-slot="create-form"] { - margin: 0; - } - - /* Make Enable Billing button full width when it's the only button */ - > button { - flex: 1; - } - } - } - [data-slot="usage"] { - p { - font-size: var(--font-size-sm); - line-height: 1.5; - color: var(--color-text-secondary); - b { - font-weight: 600; - } - } - } -} diff --git a/packages/console/app/src/component/workspace/privacy-section.tsx b/packages/console/app/src/component/workspace/privacy-section.tsx deleted file mode 100644 index 12dd3b203..000000000 --- a/packages/console/app/src/component/workspace/privacy-section.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import { json, query, action, useParams, createAsync, useSubmission } from "@solidjs/router" -import { withActor } from "~/context/auth.withActor" -import styles from "./billing-section.module.css" -import { Database, eq } from "@opencode/console-core/drizzle/index.js" -import { WorkspaceTable } from "@opencode/console-core/schema/workspace.sql.js" -import { Show } from "solid-js" - -const updateShare = action(async (form: FormData) => { - "use server" - const workspaceID = form.get("workspaceID")?.toString() - if (!workspaceID) return { error: "Workspace ID is required" } - const dataShare = form.get("dataShare")?.toString() === "true" ? true : null - return json( - await withActor(() => { - return Database.use((tx) => - tx - .update(WorkspaceTable) - .set({ - dataShare, - }) - .where(eq(WorkspaceTable.id, workspaceID)), - ) - }, workspaceID), - { revalidate: getWorkspaceInfo.key }, - ) -}, "workspace.disableShare") - -const getWorkspaceInfo = query(async (workspaceID: string) => { - "use server" - return withActor(() => { - return Database.use((tx) => - tx - .select({ - dataShare: WorkspaceTable.dataShare, - }) - .from(WorkspaceTable) - .where(eq(WorkspaceTable.id, workspaceID)) - .then((r) => r[0]), - ) - }, workspaceID) -}, "workspace.get") - -export function PrivacySection() { - const params = useParams() - const workspaceInfo = createAsync(() => getWorkspaceInfo(params.id)) - const updateShareSubmission = useSubmission(updateShare) - - return ( -
-
-

Privacy controls

-

- Some providers offer data-sharing programs. If you opt in, you voluntarily share your usage data with - them, which they may use to improve their services, including model training. -

-
-

- By opting in, you gain access to discounted pricing from the provider. You can opt in or out at any - time. -

-
-

- - Learn more - -

-
- -
-
-
- You are currently opted in to the data-sharing program. -
-
-
-
-
-
-
-
- - - -
-
-
-
-
- ) -} diff --git a/packages/console/app/src/routes/workspace/[id].tsx b/packages/console/app/src/routes/workspace/[id].tsx index dc8e28cdb..af8a0dd63 100644 --- a/packages/console/app/src/routes/workspace/[id].tsx +++ b/packages/console/app/src/routes/workspace/[id].tsx @@ -2,15 +2,11 @@ import "./[id].css" import { MonthlyLimitSection } from "~/component/workspace/monthly-limit-section" import { NewUserSection } from "~/component/workspace/new-user-section" import { BillingSection } from "~/component/workspace/billing-section" -import { PrivacySection } from "~/component/workspace/privacy-section" import { PaymentSection } from "~/component/workspace/payment-section" import { UsageSection } from "~/component/workspace/usage-section" import { KeySection } from "~/component/workspace/key-section" -import { Show } from "solid-js" -import { useParams } from "@solidjs/router" export default function () { - const params = useParams() return (
@@ -29,9 +25,6 @@ export default function () { - - -
diff --git a/packages/console/app/src/routes/zen/handler.ts b/packages/console/app/src/routes/zen/handler.ts index 09b5ca06a..2ff3ca073 100644 --- a/packages/console/app/src/routes/zen/handler.ts +++ b/packages/console/app/src/routes/zen/handler.ts @@ -45,6 +45,7 @@ export async function handler( const ModelSchema = z.object({ cost: ModelCostSchema, cost200K: ModelCostSchema.optional(), + allowAnonymous: z.boolean().optional(), providers: z.array( z.object({ id: z.string(), @@ -52,7 +53,6 @@ export async function handler( apiKey: z.string(), model: z.string(), weight: z.number().optional(), - allowAnonymous: z.boolean().optional(), headerMappings: z.record(z.string(), z.string()).optional(), disabled: z.boolean().optional(), }), @@ -85,10 +85,10 @@ export async function handler( session: input.request.headers.get("x-opencode-session"), request: input.request.headers.get("x-opencode-request"), }) - const authInfo = await authenticate() - const modelInfo = validateModel(body.model, authInfo) - const providerInfo = selectProvider(modelInfo, authInfo) - if (authInfo && !providerInfo.allowAnonymous) validateBilling(authInfo) + const modelInfo = validateModel(body.model) + const providerInfo = selectProvider(modelInfo) + const authInfo = await authenticate(modelInfo) + validateBilling(modelInfo, authInfo) logger.metric({ provider: providerInfo.id }) // Request to model provider @@ -221,16 +221,41 @@ export async function handler( ) } - async function authenticate() { + function validateModel(reqModel: string) { + const json = JSON.parse(Resource.ZEN_MODELS.value) + + const allModels = z.record(z.string(), ModelSchema).parse(json) + + if (!(reqModel in allModels)) { + throw new ModelError(`Model ${reqModel} not supported`) + } + const modelId = reqModel as keyof typeof allModels + const modelData = allModels[modelId] + + logger.metric({ model: modelId }) + + return { id: modelId, ...modelData } + } + + function selectProvider(model: Model) { + const providers = model.providers + .filter((provider) => !provider.disabled) + .flatMap((provider) => Array(provider.weight ?? 1).fill(provider)) + return providers[Math.floor(Math.random() * providers.length)] + } + + async function authenticate(model: Model) { const apiKey = opts.parseApiKey(input.request.headers) - if (!apiKey) return + if (!apiKey) { + if (model.allowAnonymous) return + throw new AuthError("Missing API key.") + } const data = await Database.use((tx) => tx .select({ apiKey: KeyTable.id, workspaceID: KeyTable.workspaceID, - dataShare: WorkspaceTable.dataShare, balance: BillingTable.balance, paymentMethodID: BillingTable.paymentMethodID, monthlyLimit: BillingTable.monthlyLimit, @@ -255,7 +280,6 @@ export async function handler( return { apiKeyId: data.apiKey, workspaceID: data.workspaceID, - dataShare: data.dataShare, billing: { paymentMethodID: data.paymentMethodID, balance: data.balance, @@ -267,8 +291,10 @@ export async function handler( } } - function validateBilling(authInfo: Awaited>) { + function validateBilling(model: Model, authInfo: Awaited>) { if (!authInfo || authInfo.isFree) return + if (model.allowAnonymous) return + const billing = authInfo.billing if (!billing.paymentMethodID) throw new CreditsError("No payment method") if (billing.balance <= 0) throw new CreditsError("Insufficient balance") @@ -288,42 +314,6 @@ export async function handler( } } - function validateModel(reqModel: string, authInfo: Awaited>) { - const json = JSON.parse(Resource.ZEN_MODELS.value) - - const allModels = z - .record( - z.string(), - z.object({ - standard: ModelSchema, - dataShare: ModelSchema.optional(), - }), - ) - .parse(json) - - if (!(reqModel in allModels)) { - throw new ModelError(`Model ${reqModel} not supported`) - } - const modelId = reqModel as keyof typeof allModels - const modelData = authInfo?.dataShare - ? (allModels[modelId].dataShare ?? allModels[modelId].standard) - : allModels[modelId].standard - logger.metric({ model: modelId }) - return { id: modelId, ...modelData } - } - - function selectProvider(model: Model, authInfo: Awaited>) { - let providers = model.providers.filter((provider) => !provider.disabled) - - if (!authInfo) { - providers = providers.filter((provider) => provider.allowAnonymous) - if (providers.length === 0) throw new AuthError("Missing API key.") - } - - const picks = providers.flatMap((provider) => Array(provider.weight ?? 1).fill(provider)) - return picks[Math.floor(Math.random() * picks.length)] - } - async function trackUsage( authInfo: Awaited>, modelInfo: ReturnType, diff --git a/packages/console/core/migrations/0015_cloudy_revanche.sql b/packages/console/core/migrations/0015_cloudy_revanche.sql new file mode 100644 index 000000000..4a61a108d --- /dev/null +++ b/packages/console/core/migrations/0015_cloudy_revanche.sql @@ -0,0 +1 @@ +ALTER TABLE `workspace` DROP COLUMN `data_share`; \ No newline at end of file diff --git a/packages/console/core/migrations/meta/0015_snapshot.json b/packages/console/core/migrations/meta/0015_snapshot.json new file mode 100644 index 000000000..57d893cd8 --- /dev/null +++ b/packages/console/core/migrations/meta/0015_snapshot.json @@ -0,0 +1,643 @@ +{ + "version": "5", + "dialect": "mysql", + "id": "7f3989cb-3e8b-430e-a0f5-f87051d1d824", + "prevId": "12189a4e-5083-4b17-b8e3-8279c9a3e61a", + "tables": { + "account": { + "name": "account", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "email": { + "name": "email", + "columns": ["email"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "billing": { + "name": "billing", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "customer_id": { + "name": "customer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_method_id": { + "name": "payment_method_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_method_last4": { + "name": "payment_method_last4", + "type": "varchar(4)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "balance": { + "name": "balance", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "monthly_limit": { + "name": "monthly_limit", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "monthly_usage": { + "name": "monthly_usage", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_monthly_usage_updated": { + "name": "time_monthly_usage_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload": { + "name": "reload", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "reload_error": { + "name": "reload_error", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_reload_error": { + "name": "time_reload_error", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_reload_locked_till": { + "name": "time_reload_locked_till", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "global_customer_id": { + "name": "global_customer_id", + "columns": ["customer_id"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "billing_workspace_id_id_pk": { + "name": "billing_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "payment": { + "name": "payment", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "customer_id": { + "name": "customer_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "payment_id": { + "name": "payment_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "amount": { + "name": "amount", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "payment_workspace_id_id_pk": { + "name": "payment_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "usage": { + "name": "usage", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "model": { + "name": "model", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "provider": { + "name": "provider", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "input_tokens": { + "name": "input_tokens", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "output_tokens": { + "name": "output_tokens", + "type": "int", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "reasoning_tokens": { + "name": "reasoning_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cache_read_tokens": { + "name": "cache_read_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cache_write_5m_tokens": { + "name": "cache_write_5m_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cache_write_1h_tokens": { + "name": "cache_write_1h_tokens", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "cost": { + "name": "cost", + "type": "bigint", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": { + "usage_workspace_id_id_pk": { + "name": "usage_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "key": { + "name": "key", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "actor": { + "name": "actor", + "type": "json", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "old_name": { + "name": "old_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "key": { + "name": "key", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_used": { + "name": "time_used", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "global_key": { + "name": "global_key", + "columns": ["key"], + "isUnique": true + }, + "name": { + "name": "name", + "columns": ["workspace_id", "name"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "key_workspace_id_id_pk": { + "name": "key_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "user": { + "name": "user", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "workspace_id": { + "name": "workspace_id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "time_seen": { + "name": "time_seen", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "color": { + "name": "color", + "type": "int", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "user_email": { + "name": "user_email", + "columns": ["workspace_id", "email"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "user_workspace_id_id_pk": { + "name": "user_workspace_id_id_pk", + "columns": ["workspace_id", "id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + }, + "workspace": { + "name": "workspace", + "columns": { + "id": { + "name": "id", + "type": "varchar(30)", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "time_created": { + "name": "time_created", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "(now())" + }, + "time_updated": { + "name": "time_updated", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3)" + }, + "time_deleted": { + "name": "time_deleted", + "type": "timestamp(3)", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "slug": { + "name": "slug", + "columns": ["slug"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": { + "workspace_id": { + "name": "workspace_id", + "columns": ["id"] + } + }, + "uniqueConstraints": {}, + "checkConstraint": {} + } + }, + "views": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "tables": {}, + "indexes": {} + } +} diff --git a/packages/console/core/migrations/meta/_journal.json b/packages/console/core/migrations/meta/_journal.json index 347100373..659d3c7fc 100644 --- a/packages/console/core/migrations/meta/_journal.json +++ b/packages/console/core/migrations/meta/_journal.json @@ -106,6 +106,13 @@ "when": 1758289919722, "tag": "0014_demonic_princess_powerful", "breakpoints": true + }, + { + "idx": 15, + "version": "5", + "when": 1758428484500, + "tag": "0015_cloudy_revanche", + "breakpoints": true } ] } diff --git a/packages/console/core/package.json b/packages/console/core/package.json index 9c7a3adf8..1cd0b6046 100644 --- a/packages/console/core/package.json +++ b/packages/console/core/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode/console-core", - "version": "0.10.3", + "version": "0.10.4", "private": true, "type": "module", "dependencies": { diff --git a/packages/console/core/src/schema/workspace.sql.ts b/packages/console/core/src/schema/workspace.sql.ts index 67fddb08c..3b02d346d 100644 --- a/packages/console/core/src/schema/workspace.sql.ts +++ b/packages/console/core/src/schema/workspace.sql.ts @@ -7,7 +7,6 @@ export const WorkspaceTable = mysqlTable( id: ulid("id").notNull().primaryKey(), slug: varchar("slug", { length: 255 }), name: varchar("name", { length: 255 }), - dataShare: boolean("data_share"), ...timestamps, }, (table) => [uniqueIndex("slug").on(table.slug)], diff --git a/packages/console/function/package.json b/packages/console/function/package.json index 6bcb3267d..cc3a55d15 100644 --- a/packages/console/function/package.json +++ b/packages/console/function/package.json @@ -1,6 +1,6 @@ { "name": "@opencode/console-function", - "version": "0.10.3", + "version": "0.10.4", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/console/scripts/package.json b/packages/console/scripts/package.json index 02efee6a1..6bad9b77d 100644 --- a/packages/console/scripts/package.json +++ b/packages/console/scripts/package.json @@ -1,6 +1,6 @@ { "name": "@opencode/console-scripts", - "version": "0.10.3", + "version": "0.10.4", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/function/package.json b/packages/function/package.json index cbc233ad4..cf95f41c7 100644 --- a/packages/function/package.json +++ b/packages/function/package.json @@ -1,6 +1,6 @@ { "name": "@opencode/function", - "version": "0.10.3", + "version": "0.10.4", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/opencode/package.json b/packages/opencode/package.json index 4537bb956..85d442e69 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "0.10.3", + "version": "0.10.4", "name": "opencode", "type": "module", "private": true, diff --git a/packages/opencode/src/lsp/index.ts b/packages/opencode/src/lsp/index.ts index 02456d33e..6b5c91c4d 100644 --- a/packages/opencode/src/lsp/index.ts +++ b/packages/opencode/src/lsp/index.ts @@ -126,6 +126,7 @@ export namespace LSP { result.push(match) continue } + log.info("spawning lsp server", { serverID: server.id }) const handle = await server.spawn(root).catch((err) => { s.broken.add(root + server.id) log.error(`Failed to spawn LSP server ${server.id}`, { error: err }) diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 6d124b1e2..d9ad0d645 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/plugin", - "version": "0.10.3", + "version": "0.10.4", "type": "module", "scripts": { "typecheck": "tsc --noEmit", diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index 8814a3c60..3df391297 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", "name": "@opencode-ai/sdk", - "version": "0.10.3", + "version": "0.10.4", "type": "module", "scripts": { "typecheck": "tsc --noEmit", diff --git a/packages/web/package.json b/packages/web/package.json index ae60792bf..1ff9f36c6 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,7 +1,7 @@ { "name": "@opencode/web", "type": "module", - "version": "0.10.3", + "version": "0.10.4", "scripts": { "dev": "astro dev", "dev:remote": "VITE_API_URL=https://api.opencode.ai astro dev", diff --git a/sdks/vscode/package.json b/sdks/vscode/package.json index f063af26a..04857b5c4 100644 --- a/sdks/vscode/package.json +++ b/sdks/vscode/package.json @@ -2,7 +2,7 @@ "name": "opencode", "displayName": "opencode", "description": "opencode for VS Code", - "version": "0.10.3", + "version": "0.10.4", "publisher": "sst-dev", "repository": { "type": "git",