| {key.email} |
-
+ |
{key.timeUsed ? formatDateForTable(key.timeUsed) : "-"}
|
diff --git a/packages/console/app/src/routes/workspace/[id]/members/member-section.tsx b/packages/console/app/src/routes/workspace/[id]/members/member-section.tsx
index 5aa1b969..4b2a12fd 100644
--- a/packages/console/app/src/routes/workspace/[id]/members/member-section.tsx
+++ b/packages/console/app/src/routes/workspace/[id]/members/member-section.tsx
@@ -85,7 +85,12 @@ const updateMember = action(async (form: FormData) => {
)
}, "member.update")
-function MemberRow(props: { member: any; workspaceID: string; actorID: string; actorRole: string }) {
+function MemberRow(props: {
+ member: any
+ workspaceID: string
+ actorID: string
+ actorRole: string
+}) {
const submission = useSubmission(updateMember)
const isCurrentUser = () => props.actorID === props.member.id
const isAdmin = () => props.actorRole === "admin"
diff --git a/packages/console/app/src/routes/workspace/[id]/members/role-dropdown.css b/packages/console/app/src/routes/workspace/[id]/members/role-dropdown.css
index 29f55a97..7a64fd9c 100644
--- a/packages/console/app/src/routes/workspace/[id]/members/role-dropdown.css
+++ b/packages/console/app/src/routes/workspace/[id]/members/role-dropdown.css
@@ -69,4 +69,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/new-user-section.module.css b/packages/console/app/src/routes/workspace/[id]/new-user-section.module.css
index aaad823a..bb58df79 100644
--- a/packages/console/app/src/routes/workspace/[id]/new-user-section.module.css
+++ b/packages/console/app/src/routes/workspace/[id]/new-user-section.module.css
@@ -140,4 +140,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/new-user-section.tsx b/packages/console/app/src/routes/workspace/[id]/new-user-section.tsx
index 65edc684..7b949c66 100644
--- a/packages/console/app/src/routes/workspace/[id]/new-user-section.tsx
+++ b/packages/console/app/src/routes/workspace/[id]/new-user-section.tsx
@@ -43,15 +43,24 @@ export function NewUserSection() {
Tested & Verified Models
- We've benchmarked and tested models specifically for coding agents to ensure the best performance.
+
+ We've benchmarked and tested models specifically for coding agents to ensure the best
+ performance.
+
Highest Quality
- Access models configured for optimal performance - no downgrades or routing to cheaper providers.
+
+ Access models configured for optimal performance - no downgrades or routing to cheaper
+ providers.
+
No Lock-in
- Use Zen with any coding agent, and continue using other providers with opencode whenever you want.
+
+ Use Zen with any coding agent, and continue using other providers with opencode
+ whenever you want.
+
diff --git a/packages/console/app/src/routes/workspace/[id]/provider-section.module.css b/packages/console/app/src/routes/workspace/[id]/provider-section.module.css
index 1a450d3d..1dc7085b 100644
--- a/packages/console/app/src/routes/workspace/[id]/provider-section.module.css
+++ b/packages/console/app/src/routes/workspace/[id]/provider-section.module.css
@@ -128,7 +128,6 @@
}
@media (max-width: 40rem) {
-
th,
td {
padding: var(--space-2) var(--space-3);
@@ -136,4 +135,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/packages/console/app/src/routes/workspace/[id]/provider-section.tsx b/packages/console/app/src/routes/workspace/[id]/provider-section.tsx
index 6ec8477b..67314fbd 100644
--- a/packages/console/app/src/routes/workspace/[id]/provider-section.tsx
+++ b/packages/console/app/src/routes/workspace/[id]/provider-section.tsx
@@ -22,7 +22,9 @@ const removeProvider = action(async (form: FormData) => {
if (!provider) return { error: "Provider is required" }
const workspaceID = form.get("workspaceID")?.toString()
if (!workspaceID) return { error: "Workspace ID is required" }
- return json(await withActor(() => Provider.remove({ provider }), workspaceID), { revalidate: listProviders.key })
+ return json(await withActor(() => Provider.remove({ provider }), workspaceID), {
+ revalidate: listProviders.key,
+ })
}, "provider.remove")
const saveProvider = action(async (form: FormData) => {
@@ -53,7 +55,10 @@ const listProviders = query(async (workspaceID: string) => {
function ProviderRow(props: { provider: Provider }) {
const params = useParams()
const providers = createAsync(() => listProviders(params.id))
- const saveSubmission = useSubmission(saveProvider, ([fd]) => fd.get("provider")?.toString() === props.provider.key)
+ const saveSubmission = useSubmission(
+ saveProvider,
+ ([fd]) => fd.get("provider")?.toString() === props.provider.key,
+ )
const removeSubmission = useSubmission(
removeProvider,
([fd]) => fd.get("provider")?.toString() === props.provider.key,
@@ -89,9 +94,16 @@ function ProviderRow(props: { provider: Provider }) {
|
{providerData() ? maskCredentials(providerData()!.credentials) : "-"}}
+ fallback={
+ {providerData() ? maskCredentials(providerData()!.credentials) : "-"}
+ }
>
-
- {local.description}
+
+ {local.description}
+
diff --git a/packages/ui/src/components/dialog.tsx b/packages/ui/src/components/dialog.tsx
index ce7a4b3a..fdbb9022 100644
--- a/packages/ui/src/components/dialog.tsx
+++ b/packages/ui/src/components/dialog.tsx
@@ -38,7 +38,11 @@ export function DialogRoot(props: DialogProps) {
return (
-
+
{props.trigger}
diff --git a/packages/ui/src/styles/base.css b/packages/ui/src/styles/base.css
index b80398e1..02b47323 100644
--- a/packages/ui/src/styles/base.css
+++ b/packages/ui/src/styles/base.css
@@ -269,8 +269,8 @@ textarea,
crash when using `color-mix(…)` with `currentcolor`. (https://github.com/tailwindlabs/tailwindcss/issues/17194)
*/
-@supports (not (-webkit-appearance: -apple-pay-button)) /* Not Safari */ or (contain-intrinsic-size: 1px)
- /* Safari 17+ */ {
+@supports (not (-webkit-appearance: -apple-pay-button)) /* Not Safari */ or
+ (contain-intrinsic-size: 1px) /* Safari 17+ */ {
::placeholder {
color: color-mix(in oklab, currentcolor 50%, transparent);
}
diff --git a/packages/ui/src/styles/tailwind/colors.css b/packages/ui/src/styles/tailwind/colors.css
index 527c4310..a5f982d6 100644
--- a/packages/ui/src/styles/tailwind/colors.css
+++ b/packages/ui/src/styles/tailwind/colors.css
@@ -232,4 +232,4 @@
--color-border-weaker-focus: var(--border-weaker-focus);
--color-button-ghost-hover: var(--button-ghost-hover);
--color-button-ghost-hover2: var(--button-ghost-hover2);
-}
\ No newline at end of file
+}
diff --git a/packages/ui/src/styles/theme.css b/packages/ui/src/styles/theme.css
index 20c43b10..6187eef9 100644
--- a/packages/ui/src/styles/theme.css
+++ b/packages/ui/src/styles/theme.css
@@ -56,23 +56,18 @@
0 6px 8px -4px rgba(19, 16, 16, 0.12), 0 4px 3px -2px rgba(19, 16, 16, 0.12),
0 1px 2px -1px rgba(19, 16, 16, 0.12);
--shadow-xs-border:
- 0 0 0 1px var(--border-base, rgba(11, 6, 0, 0.20)),
- 0 1px 2px -1px rgba(19, 16, 16, 0.04),
- 0 1px 2px 0 rgba(19, 16, 16, 0.06),
- 0 1px 3px 0 rgba(19, 16, 16, 0.08);
+ 0 0 0 1px var(--border-base, rgba(11, 6, 0, 0.2)), 0 1px 2px -1px rgba(19, 16, 16, 0.04),
+ 0 1px 2px 0 rgba(19, 16, 16, 0.06), 0 1px 3px 0 rgba(19, 16, 16, 0.08);
--shadow-xs-border-select:
0 0 0 3px var(--border-weak-selected, rgba(1, 103, 255, 0.29)),
0 0 0 1px var(--border-selected, rgba(0, 74, 255, 0.99)), 0 1px 2px -1px rgba(19, 16, 16, 0.25),
0 1px 2px 0 rgba(19, 16, 16, 0.08), 0 1px 3px 0 rgba(19, 16, 16, 0.12);
--shadow-xs-border-focus:
- 0 0 0 1px var(--border-base, rgba(11, 6, 0, 0.20)),
- 0 1px 2px -1px rgba(19, 16, 16, 0.25),
- 0 1px 2px 0 rgba(19, 16, 16, 0.08),
- 0 1px 3px 0 rgba(19, 16, 16, 0.12),
- 0 0 0 2px var(--background-weak, #F1F0F0),
+ 0 0 0 1px var(--border-base, rgba(11, 6, 0, 0.2)), 0 1px 2px -1px rgba(19, 16, 16, 0.25),
+ 0 1px 2px 0 rgba(19, 16, 16, 0.08), 0 1px 3px 0 rgba(19, 16, 16, 0.12),
+ 0 0 0 2px var(--background-weak, #f1f0f0),
0 0 0 3px var(--border-selected, rgba(0, 74, 255, 0.99));
-
--text-mix-blend-mode: multiply;
}
@@ -413,7 +408,7 @@
--text-on-brand-weaker: var(--smoke-dark-alpha-8);
--text-on-brand-strong: var(--smoke-dark-alpha-12);
--button-secondary-base: var(--smoke-dark-4);
- --button-secondary-hover: #2A2727;
+ --button-secondary-hover: #2a2727;
--border-base: var(--smoke-dark-alpha-7);
--border-hover: var(--smoke-dark-alpha-8);
--border-active: var(--smoke-dark-alpha-9);
diff --git a/packages/ui/sst-env.d.ts b/packages/ui/sst-env.d.ts
index b6a7e906..0397645b 100644
--- a/packages/ui/sst-env.d.ts
+++ b/packages/ui/sst-env.d.ts
@@ -6,4 +6,4 @@
///
import "sst"
-export {}
\ No newline at end of file
+export {}
diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json
index 440aa8f9..c3531440 100644
--- a/packages/ui/tsconfig.json
+++ b/packages/ui/tsconfig.json
@@ -13,16 +13,9 @@
"module": "ESNext",
"moduleResolution": "bundler",
"noEmit": true,
- "lib": [
- "es2022",
- "dom",
- "dom.iterable"
- ],
+ "lib": ["es2022", "dom", "dom.iterable"],
// Type Checking & Safety
"strict": true,
- "types": [
- "vite/client",
- "bun"
- ]
+ "types": ["vite/client", "bun"]
}
}
diff --git a/packages/web/config.mjs b/packages/web/config.mjs
index 5e2c8d3e..7adb147c 100644
--- a/packages/web/config.mjs
+++ b/packages/web/config.mjs
@@ -2,7 +2,8 @@ const stage = process.env.SST_STAGE || "dev"
export default {
url: stage === "production" ? "https://opencode.ai" : `https://${stage}.opencode.ai`,
- console: stage === "production" ? "https://opencode.ai/auth" : `https://${stage}.opencode.ai/auth`,
+ console:
+ stage === "production" ? "https://opencode.ai/auth" : `https://${stage}.opencode.ai/auth`,
email: "contact@anoma.ly",
socialCard: "https://social-cards.sst.dev",
github: "https://github.com/sst/opencode",
diff --git a/packages/web/src/components/Share.tsx b/packages/web/src/components/Share.tsx
index 06244971..486b6e44 100644
--- a/packages/web/src/components/Share.tsx
+++ b/packages/web/src/components/Share.tsx
@@ -1,4 +1,14 @@
-import { For, Show, onMount, Suspense, onCleanup, createMemo, createSignal, SuspenseList, createEffect } from "solid-js"
+import {
+ For,
+ Show,
+ onMount,
+ Suspense,
+ onCleanup,
+ createMemo,
+ createSignal,
+ SuspenseList,
+ createEffect,
+} from "solid-js"
import { DateTime } from "luxon"
import { createStore, reconcile, unwrap } from "solid-js/store"
import { IconArrowDown } from "./icons"
@@ -66,8 +76,13 @@ export default function Share(props: { id: string; api: string; info: Session.In
},
messages: {},
})
- const messages = createMemo(() => Object.values(store.messages).toSorted((a, b) => a.id?.localeCompare(b.id)))
- const [connectionStatus, setConnectionStatus] = createSignal<[Status, string?]>(["disconnected", "Disconnected"])
+ const messages = createMemo(() =>
+ Object.values(store.messages).toSorted((a, b) => a.id?.localeCompare(b.id)),
+ )
+ const [connectionStatus, setConnectionStatus] = createSignal<[Status, string?]>([
+ "disconnected",
+ "Disconnected",
+ ])
createEffect(() => {
console.log(unwrap(store))
})
@@ -330,7 +345,9 @@ export default function Share(props: { id: string; api: string; info: Session.In
{DateTime.fromMillis(data().created || 0).toLocaleString(DateTime.DATETIME_MED)}
@@ -352,7 +369,10 @@ export default function Share(props: { id: string; api: string; info: Session.In
if (x.type === "text" && x.synthetic === true) return false
if (x.type === "tool" && x.tool === "todoread") return false
if (x.type === "text" && !x.text) return false
- if (x.type === "tool" && (x.state.status === "pending" || x.state.status === "running"))
+ if (
+ x.type === "tool" &&
+ (x.state.status === "pending" || x.state.status === "running")
+ )
return false
return true
}),
@@ -364,7 +384,8 @@ export default function Share(props: { id: string; api: string; info: Session.In
{(part, partIndex) => {
const last = createMemo(
() =>
- data().messages.length === msgIndex() + 1 && filteredParts().length === partIndex() + 1,
+ data().messages.length === msgIndex() + 1 &&
+ filteredParts().length === partIndex() + 1,
)
onMount(() => {
@@ -381,7 +402,9 @@ export default function Share(props: { id: string; api: string; info: Session.In
}
})
- return
+ return (
+
+ )
}}
@@ -406,7 +429,11 @@ export default function Share(props: { id: string; api: string; info: Session.In
Input Tokens
- {data().tokens.input ? {data().tokens.input} : —}
+ {data().tokens.input ? (
+ {data().tokens.input}
+ ) : (
+ —
+ )}
Output Tokens
@@ -560,7 +587,8 @@ export function fromV1(v1: Message.Info): MessageWithParts {
}
}
- const { title, time, ...metadata } = v1.metadata.tool[part.toolInvocation.toolCallId]
+ const { title, time, ...metadata } =
+ v1.metadata.tool[part.toolInvocation.toolCallId]
if (part.toolInvocation.state === "call") {
return {
status: "running",
diff --git a/packages/web/src/components/icons/index.tsx b/packages/web/src/components/icons/index.tsx
index 62445611..9aef7a92 100644
--- a/packages/web/src/components/icons/index.tsx
+++ b/packages/web/src/components/icons/index.tsx
@@ -4418,7 +4418,14 @@ export function IconMultiSelect(props: JSX.SvgSVGAttributes) {
}
export function IconSettings(props: JSX.SvgSVGAttributes) {
return (
- |