Dax Raad 7 mesi fa
parent
commit
38e8c42cf0
68 ha cambiato i file con 965 aggiunte e 1062 eliminazioni
  1. 1 1
      .github/workflows/notify-discord.yml
  2. 1 1
      .github/workflows/opencode.yml
  3. 8 8
      cloud/app/src/app.tsx
  4. 45 13
      cloud/app/src/component/icon.tsx
  5. 2 2
      cloud/app/src/entry-client.tsx
  6. 25 23
      cloud/app/src/entry-server.tsx
  7. 3 4
      cloud/app/src/routes/index.tsx
  8. 11 1
      cloud/app/src/routes/workspace.tsx
  9. 44 45
      cloud/app/src/routes/workspace/[id].tsx
  10. 2 1
      cloud/app/src/style/token/font.css
  11. 1 1
      cloud/app/sst-env.d.ts
  12. 2 6
      cloud/app/tsconfig.json
  13. 11 37
      cloud/core/migrations/meta/0000_snapshot.json
  14. 11 37
      cloud/core/migrations/meta/0001_snapshot.json
  15. 1 1
      cloud/core/migrations/meta/_journal.json
  16. 1 4
      cloud/core/src/util/fn.ts
  17. 1 1
      cloud/core/sst-env.d.ts
  18. 75 75
      cloud/function/sst-env.d.ts
  19. 75 75
      cloud/resource/sst-env.d.ts
  20. 1 4
      cloud/resource/tsconfig.json
  21. 1 1
      cloud/scripts/sst-env.d.ts
  22. 1 1
      github/sst-env.d.ts
  23. 1 0
      package.json
  24. 75 75
      packages/function/sst-env.d.ts
  25. 15 21
      packages/opencode/src/file/fzf.ts
  26. 9 11
      packages/opencode/src/file/time.ts
  27. 9 6
      packages/opencode/src/plugin/index.ts
  28. 3 1
      packages/opencode/src/tool/edit.ts
  29. 1 3
      packages/opencode/src/tool/registry.ts
  30. 6 8
      packages/opencode/src/tool/todo.ts
  31. 1 1
      packages/opencode/sst-env.d.ts
  32. 7 7
      packages/opencode/test/bun.test.ts
  33. 2 8
      packages/opencode/tsconfig.json
  34. 2 5
      packages/plugin/src/index.ts
  35. 1 1
      packages/plugin/sst-env.d.ts
  36. 3 11
      packages/plugin/tsconfig.json
  37. 7 7
      packages/sdk/go/.github/workflows/ci.yml
  38. 1 1
      packages/sdk/go/.release-please-manifest.json
  39. 57 59
      packages/sdk/go/CHANGELOG.md
  40. 2 5
      packages/sdk/go/release-please-config.json
  41. 1 1
      packages/sdk/js/script/generate.ts
  42. 1 1
      packages/sdk/js/src/server.ts
  43. 1 1
      packages/sdk/js/sst-env.d.ts
  44. 3 11
      packages/sdk/js/tsconfig.json
  45. 215 216
      packages/tui/internal/theme/themes/vesper.json
  46. 2 6
      packages/web/config.mjs
  47. 8 7
      packages/web/src/components/Share.tsx
  48. 0 1
      packages/web/src/components/share/content-diff.module.css
  49. 0 1
      packages/web/src/components/share/content-error.module.css
  50. 2 9
      packages/web/src/components/share/content-error.tsx
  51. 3 11
      packages/web/src/components/share/copy-button.tsx
  52. 22 30
      packages/web/src/components/share/part.tsx
  53. 0 2
      packages/web/src/content/docs/cli.mdx
  54. 1 1
      packages/web/src/content/docs/commands.mdx
  55. 4 4
      packages/web/src/content/docs/config.mdx
  56. 14 14
      packages/web/src/content/docs/formatters.mdx
  57. 5 5
      packages/web/src/content/docs/gitlab.mdx
  58. 4 20
      packages/web/src/content/docs/index.mdx
  59. 7 7
      packages/web/src/content/docs/server.mdx
  60. 3 0
      packages/web/src/content/docs/tui.mdx
  61. 6 6
      packages/web/src/content/docs/zen.mdx
  62. 1 1
      packages/web/sst-env.d.ts
  63. 3 3
      sdks/vscode/.vscode-test.mjs
  64. 43 45
      sdks/vscode/esbuild.js
  65. 23 17
      sdks/vscode/eslint.config.mjs
  66. 1 1
      sdks/vscode/sst-env.d.ts
  67. 66 66
      sst-env.d.ts
  68. 1 3
      tsconfig.json

+ 1 - 1
.github/workflows/notify-discord.yml

@@ -2,7 +2,7 @@ name: discord
 
 
 on:
 on:
   release:
   release:
-    types: [published]   # fires only when a release is published
+    types: [published] # fires only when a release is published
 
 
 jobs:
 jobs:
   notify:
   notify:

+ 1 - 1
.github/workflows/opencode.yml

@@ -24,4 +24,4 @@ jobs:
         env:
         env:
           OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
           OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
         with:
         with:
-          model: opencode/sonic
+          model: opencode/sonic

+ 8 - 8
cloud/app/src/app.tsx

@@ -1,15 +1,15 @@
-import { MetaProvider, Title, Meta } from "@solidjs/meta";
-import { Router } from "@solidjs/router";
-import { FileRoutes } from "@solidjs/start/router";
-import { ErrorBoundary, Suspense } from "solid-js";
-import "@ibm/plex/css/ibm-plex.css";
-import "./app.css";
+import { MetaProvider, Title, Meta } from "@solidjs/meta"
+import { Router } from "@solidjs/router"
+import { FileRoutes } from "@solidjs/start/router"
+import { ErrorBoundary, Suspense } from "solid-js"
+import "@ibm/plex/css/ibm-plex.css"
+import "./app.css"
 
 
 export default function App() {
 export default function App() {
   return (
   return (
     <Router
     <Router
       explicitLinks={true}
       explicitLinks={true}
-      root={props => (
+      root={(props) => (
         <MetaProvider>
         <MetaProvider>
           <Title>opencode</Title>
           <Title>opencode</Title>
           <Meta name="description" content="opencode - The AI coding agent built for the terminal." />
           <Meta name="description" content="opencode - The AI coding agent built for the terminal." />
@@ -19,5 +19,5 @@ export default function App() {
     >
     >
       <FileRoutes />
       <FileRoutes />
     </Router>
     </Router>
-  );
+  )
 }
 }

+ 45 - 13
cloud/app/src/component/icon.tsx

@@ -6,34 +6,66 @@ export function IconLogo(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
       <path d="M264.5 0H288.5V8.5H272.5V16.5H288.5V25H272.5V33H288.5V41.5H264.5V0Z" fill="currentColor" />
       <path d="M264.5 0H288.5V8.5H272.5V16.5H288.5V25H272.5V33H288.5V41.5H264.5V0Z" fill="currentColor" />
       <path d="M248.5 0H224.5V41.5H248.5V33H232.5V8.5H248.5V0Z" fill="currentColor" />
       <path d="M248.5 0H224.5V41.5H248.5V33H232.5V8.5H248.5V0Z" fill="currentColor" />
       <path d="M256.5 8.5H248.5V33H256.5V8.5Z" fill="currentColor" />
       <path d="M256.5 8.5H248.5V33H256.5V8.5Z" fill="currentColor" />
-      <path fill-rule="evenodd" clip-rule="evenodd" d="M184.5 0H216.5V41.5H184.5V0ZM208.5 8.5H192.5V33H208.5V8.5Z" fill="currentColor" />
+      <path
+        fill-rule="evenodd"
+        clip-rule="evenodd"
+        d="M184.5 0H216.5V41.5H184.5V0ZM208.5 8.5H192.5V33H208.5V8.5Z"
+        fill="currentColor"
+      />
       <path d="M144.5 8.5H136.5V41.5H144.5V8.5Z" fill="currentColor" />
       <path d="M144.5 8.5H136.5V41.5H144.5V8.5Z" fill="currentColor" />
       <path d="M136.5 0H112.5V41.5H120.5V8.5H136.5V0Z" fill="currentColor" />
       <path d="M136.5 0H112.5V41.5H120.5V8.5H136.5V0Z" fill="currentColor" />
       <path d="M80.5 0H104.5V8.5H88.5V16.5H104.5V25H88.5V33H104.5V41.5H80.5V0Z" fill="currentColor" />
       <path d="M80.5 0H104.5V8.5H88.5V16.5H104.5V25H88.5V33H104.5V41.5H80.5V0Z" fill="currentColor" />
-      <path fill-rule="evenodd" clip-rule="evenodd" d="M40.5 0H72.5V41.5H48.5V49.5H40.5V0ZM64.5 8.5H48.5V33H64.5V8.5Z" fill="currentColor" />
-      <path fill-rule="evenodd" clip-rule="evenodd" d="M0.5 0H32.5V41.5955H0.5V0ZM24.5 8.5H8.5V33H24.5V8.5Z" fill="currentColor" />
+      <path
+        fill-rule="evenodd"
+        clip-rule="evenodd"
+        d="M40.5 0H72.5V41.5H48.5V49.5H40.5V0ZM64.5 8.5H48.5V33H64.5V8.5Z"
+        fill="currentColor"
+      />
+      <path
+        fill-rule="evenodd"
+        clip-rule="evenodd"
+        d="M0.5 0H32.5V41.5955H0.5V0ZM24.5 8.5H8.5V33H24.5V8.5Z"
+        fill="currentColor"
+      />
       <path d="M152.5 0H176.5V8.5H160.5V33H176.5V41.5H152.5V0Z" fill="currentColor" />
       <path d="M152.5 0H176.5V8.5H160.5V33H176.5V41.5H152.5V0Z" fill="currentColor" />
     </svg>
     </svg>
-  );
+  )
 }
 }
 
 
 export function IconCopy(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
 export function IconCopy(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
   return (
   return (
-    <svg
-      {...props}
-      viewBox="0 0 512 512" >
-      <rect width="336" height="336" x="128" y="128" fill="none" stroke="currentColor" stroke-linejoin="round" stroke-width="32" rx="57" ry="57"></rect>
-      <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="32" d="m383.5 128l.5-24a56.16 56.16 0 0 0-56-56H112a64.19 64.19 0 0 0-64 64v216a56.16 56.16 0 0 0 56 56h24"></path>
+    <svg {...props} viewBox="0 0 512 512">
+      <rect
+        width="336"
+        height="336"
+        x="128"
+        y="128"
+        fill="none"
+        stroke="currentColor"
+        stroke-linejoin="round"
+        stroke-width="32"
+        rx="57"
+        ry="57"
+      ></rect>
+      <path
+        fill="none"
+        stroke="currentColor"
+        stroke-linecap="round"
+        stroke-linejoin="round"
+        stroke-width="32"
+        d="m383.5 128l.5-24a56.16 56.16 0 0 0-56-56H112a64.19 64.19 0 0 0-64 64v216a56.16 56.16 0 0 0 56 56h24"
+      ></path>
     </svg>
     </svg>
   )
   )
 }
 }
 
 
 export function IconCheck(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
 export function IconCheck(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
   return (
   return (
-    <svg
-      {...props}
-      viewBox="0 0 24 24" >
-      <path fill="currentColor" d="M9 16.17L5.53 12.7a.996.996 0 1 0-1.41 1.41l4.18 4.18c.39.39 1.02.39 1.41 0L20.29 7.71a.996.996 0 1 0-1.41-1.41z"></path>
+    <svg {...props} viewBox="0 0 24 24">
+      <path
+        fill="currentColor"
+        d="M9 16.17L5.53 12.7a.996.996 0 1 0-1.41 1.41l4.18 4.18c.39.39 1.02.39 1.41 0L20.29 7.71a.996.996 0 1 0-1.41-1.41z"
+      ></path>
     </svg>
     </svg>
   )
   )
 }
 }

+ 2 - 2
cloud/app/src/entry-client.tsx

@@ -1,4 +1,4 @@
 // @refresh reload
 // @refresh reload
-import { mount, StartClient } from "@solidjs/start/client";
+import { mount, StartClient } from "@solidjs/start/client"
 
 
-mount(() => <StartClient />, document.getElementById("app")!);
+mount(() => <StartClient />, document.getElementById("app")!)

+ 25 - 23
cloud/app/src/entry-server.tsx

@@ -1,26 +1,28 @@
 // @refresh reload
 // @refresh reload
 import { createHandler, StartServer } from "@solidjs/start/server"
 import { createHandler, StartServer } from "@solidjs/start/server"
 
 
-
-export default createHandler(() => (
-  <StartServer
-    document={({ assets, children, scripts }) => (
-      <html lang="en">
-        <head>
-          <meta charset="utf-8" />
-          <meta name="viewport" content="width=device-width, initial-scale=1" />
-          <link rel="icon" href="/favicon.svg" />
-          <meta property="og:image" content="/social-share.png" />
-          <meta property="twitter:image" content="/social-share.png" />
-          {assets}
-        </head>
-        <body>
-          <div id="app">{children}</div>
-          {scripts}
-        </body>
-      </html>
-    )}
-  />
-), {
-  mode: "async",
-})
+export default createHandler(
+  () => (
+    <StartServer
+      document={({ assets, children, scripts }) => (
+        <html lang="en">
+          <head>
+            <meta charset="utf-8" />
+            <meta name="viewport" content="width=device-width, initial-scale=1" />
+            <link rel="icon" href="/favicon.svg" />
+            <meta property="og:image" content="/social-share.png" />
+            <meta property="twitter:image" content="/social-share.png" />
+            {assets}
+          </head>
+          <body>
+            <div id="app">{children}</div>
+            {scripts}
+          </body>
+        </html>
+      )}
+    />
+  ),
+  {
+    mode: "async",
+  },
+)

+ 3 - 4
cloud/app/src/routes/index.tsx

@@ -64,9 +64,7 @@ export default function Home() {
 
 
         <section data-component="cta">
         <section data-component="cta">
           <div data-slot="left">
           <div data-slot="left">
-            <a href="/docs">
-              Get Started
-            </a>
+            <a href="/docs">Get Started</a>
           </div>
           </div>
           <div data-slot="right">
           <div data-slot="right">
             <button data-copy data-slot="command">
             <button data-copy data-slot="command">
@@ -90,7 +88,8 @@ export default function Home() {
               <strong>LSP enabled</strong> Automatically loads the right LSPs for the LLM
               <strong>LSP enabled</strong> Automatically loads the right LSPs for the LLM
             </li>
             </li>
             <li>
             <li>
-              <strong>opencode zen</strong> A <a href="/docs/zen">curated list of models</a> provided by opencode <label>New</label>
+              <strong>opencode zen</strong> A <a href="/docs/zen">curated list of models</a> provided by opencode{" "}
+              <label>New</label>
             </li>
             </li>
             <li>
             <li>
               <strong>Multi-session</strong> Start multiple agents in parallel on the same project
               <strong>Multi-session</strong> Start multiple agents in parallel on the same project

+ 11 - 1
cloud/app/src/routes/workspace.tsx

@@ -2,7 +2,17 @@ import "./workspace.css"
 import { useAuthSession } from "~/context/auth.session"
 import { useAuthSession } from "~/context/auth.session"
 import { IconLogo } from "../component/icon"
 import { IconLogo } from "../component/icon"
 import { withActor } from "~/context/auth.withActor"
 import { withActor } from "~/context/auth.withActor"
-import { query, action, redirect, createAsync, RouteSectionProps, Navigate, useNavigate, useParams, A } from "@solidjs/router"
+import {
+  query,
+  action,
+  redirect,
+  createAsync,
+  RouteSectionProps,
+  Navigate,
+  useNavigate,
+  useParams,
+  A,
+} from "@solidjs/router"
 import { User } from "@opencode/cloud-core/user.js"
 import { User } from "@opencode/cloud-core/user.js"
 import { Actor } from "@opencode/cloud-core/actor.js"
 import { Actor } from "@opencode/cloud-core/actor.js"
 import { getRequestEvent } from "solid-js/web"
 import { getRequestEvent } from "solid-js/web"

+ 44 - 45
cloud/app/src/routes/workspace/[id].tsx

@@ -1,15 +1,7 @@
 import "./[id].css"
 import "./[id].css"
 import { Billing } from "@opencode/cloud-core/billing.js"
 import { Billing } from "@opencode/cloud-core/billing.js"
 import { Key } from "@opencode/cloud-core/key.js"
 import { Key } from "@opencode/cloud-core/key.js"
-import {
-  json,
-  query,
-  action,
-  useParams,
-  useAction,
-  createAsync,
-  useSubmission,
-} from "@solidjs/router"
+import { json, query, action, useParams, useAction, createAsync, useSubmission } from "@solidjs/router"
 import { createMemo, createSignal, For, Show } from "solid-js"
 import { createMemo, createSignal, For, Show } from "solid-js"
 import { withActor } from "~/context/auth.withActor"
 import { withActor } from "~/context/auth.withActor"
 import { IconCopy, IconCheck } from "~/component/icon"
 import { IconCopy, IconCheck } from "~/component/icon"
@@ -432,50 +424,57 @@ function PaymentsSection() {
   const payments = createAsync(() => getPaymentsInfo(params.id))
   const payments = createAsync(() => getPaymentsInfo(params.id))
   // const payments = () => dummyPayments
   // const payments = () => dummyPayments
 
 
-  return payments() && payments()!.length > 0 && (
-    <section data-component="payments-section">
-      <div data-slot="section-title">
-        <h2>Payments History</h2>
-        <p>Recent payment transactions.</p>
-      </div>
-      <div data-slot="payments-table">
-        <table data-slot="payments-table-element">
-          <thead>
-            <tr>
-              <th>Date</th>
-              <th>Payment ID</th>
-              <th>Amount</th>
-            </tr>
-          </thead>
-          <tbody>
-            <For each={payments()!}>
-              {(payment) => {
-                const date = new Date(payment.timeCreated)
-                return (
-                  <tr>
-                    <td data-slot="payment-date" title={formatDateUTC(date)}>
-                      {formatDateForTable(date)}
-                    </td>
-                    <td data-slot="payment-id">{payment.id}</td>
-                    <td data-slot="payment-amount">${((payment.amount ?? 0) / 100000000).toFixed(2)}</td>
-                  </tr>
-                )
-              }}
-            </For>
-          </tbody>
-        </table>
-      </div>
-    </section>
+  return (
+    payments() &&
+    payments()!.length > 0 && (
+      <section data-component="payments-section">
+        <div data-slot="section-title">
+          <h2>Payments History</h2>
+          <p>Recent payment transactions.</p>
+        </div>
+        <div data-slot="payments-table">
+          <table data-slot="payments-table-element">
+            <thead>
+              <tr>
+                <th>Date</th>
+                <th>Payment ID</th>
+                <th>Amount</th>
+              </tr>
+            </thead>
+            <tbody>
+              <For each={payments()!}>
+                {(payment) => {
+                  const date = new Date(payment.timeCreated)
+                  return (
+                    <tr>
+                      <td data-slot="payment-date" title={formatDateUTC(date)}>
+                        {formatDateForTable(date)}
+                      </td>
+                      <td data-slot="payment-id">{payment.id}</td>
+                      <td data-slot="payment-amount">${((payment.amount ?? 0) / 100000000).toFixed(2)}</td>
+                    </tr>
+                  )
+                }}
+              </For>
+            </tbody>
+          </table>
+        </div>
+      </section>
+    )
   )
   )
 }
 }
 
 
-export default function() {
+export default function () {
   return (
   return (
     <div data-page="workspace-[id]">
     <div data-page="workspace-[id]">
       <section data-component="title-section">
       <section data-component="title-section">
         <h1>Zen</h1>
         <h1>Zen</h1>
         <p>
         <p>
-          Curated list of models provided by opencode. <a target="_blank" href="/docs/zen">Learn more</a>.
+          Curated list of models provided by opencode.{" "}
+          <a target="_blank" href="/docs/zen">
+            Learn more
+          </a>
+          .
         </p>
         </p>
       </section>
       </section>
 
 

+ 2 - 1
cloud/app/src/style/token/font.css

@@ -14,6 +14,7 @@ body {
   --font-size-8xl: 6rem;
   --font-size-8xl: 6rem;
   --font-size-9xl: 8rem;
   --font-size-9xl: 8rem;
 
 
-  --font-mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+  --font-mono:
+    "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
   --font-sans: var(--font-mono);
   --font-sans: var(--font-mono);
 }
 }

+ 1 - 1
cloud/app/sst-env.d.ts

@@ -6,4 +6,4 @@
 /// <reference path="../../sst-env.d.ts" />
 /// <reference path="../../sst-env.d.ts" />
 
 
 import "sst"
 import "sst"
-export {}
+export {}

+ 2 - 6
cloud/app/tsconfig.json

@@ -12,14 +12,10 @@
     "allowJs": true,
     "allowJs": true,
     "strict": true,
     "strict": true,
     "noEmit": true,
     "noEmit": true,
-    "types": [
-      "vinxi/types/client"
-    ],
+    "types": ["vinxi/types/client"],
     "isolatedModules": true,
     "isolatedModules": true,
     "paths": {
     "paths": {
-      "~/*": [
-        "./src/*"
-      ]
+      "~/*": ["./src/*"]
     }
     }
   }
   }
 }
 }

+ 11 - 37
cloud/core/migrations/meta/0000_snapshot.json

@@ -48,9 +48,7 @@
       "indexes": {
       "indexes": {
         "email": {
         "email": {
           "name": "email",
           "name": "email",
-          "columns": [
-            "email"
-          ],
+          "columns": ["email"],
           "isUnique": true
           "isUnique": true
         }
         }
       },
       },
@@ -140,10 +138,7 @@
       "compositePrimaryKeys": {
       "compositePrimaryKeys": {
         "billing_workspace_id_id_pk": {
         "billing_workspace_id_id_pk": {
           "name": "billing_workspace_id_id_pk",
           "name": "billing_workspace_id_id_pk",
-          "columns": [
-            "workspace_id",
-            "id"
-          ]
+          "columns": ["workspace_id", "id"]
         }
         }
       },
       },
       "uniqueConstraints": {},
       "uniqueConstraints": {},
@@ -216,10 +211,7 @@
       "compositePrimaryKeys": {
       "compositePrimaryKeys": {
         "payment_workspace_id_id_pk": {
         "payment_workspace_id_id_pk": {
           "name": "payment_workspace_id_id_pk",
           "name": "payment_workspace_id_id_pk",
-          "columns": [
-            "workspace_id",
-            "id"
-          ]
+          "columns": ["workspace_id", "id"]
         }
         }
       },
       },
       "uniqueConstraints": {},
       "uniqueConstraints": {},
@@ -320,10 +312,7 @@
       "compositePrimaryKeys": {
       "compositePrimaryKeys": {
         "usage_workspace_id_id_pk": {
         "usage_workspace_id_id_pk": {
           "name": "usage_workspace_id_id_pk",
           "name": "usage_workspace_id_id_pk",
-          "columns": [
-            "workspace_id",
-            "id"
-          ]
+          "columns": ["workspace_id", "id"]
         }
         }
       },
       },
       "uniqueConstraints": {},
       "uniqueConstraints": {},
@@ -401,9 +390,7 @@
       "indexes": {
       "indexes": {
         "global_key": {
         "global_key": {
           "name": "global_key",
           "name": "global_key",
-          "columns": [
-            "key"
-          ],
+          "columns": ["key"],
           "isUnique": true
           "isUnique": true
         }
         }
       },
       },
@@ -411,10 +398,7 @@
       "compositePrimaryKeys": {
       "compositePrimaryKeys": {
         "key_workspace_id_id_pk": {
         "key_workspace_id_id_pk": {
           "name": "key_workspace_id_id_pk",
           "name": "key_workspace_id_id_pk",
-          "columns": [
-            "workspace_id",
-            "id"
-          ]
+          "columns": ["workspace_id", "id"]
         }
         }
       },
       },
       "uniqueConstraints": {},
       "uniqueConstraints": {},
@@ -492,10 +476,7 @@
       "indexes": {
       "indexes": {
         "user_email": {
         "user_email": {
           "name": "user_email",
           "name": "user_email",
-          "columns": [
-            "workspace_id",
-            "email"
-          ],
+          "columns": ["workspace_id", "email"],
           "isUnique": true
           "isUnique": true
         }
         }
       },
       },
@@ -503,10 +484,7 @@
       "compositePrimaryKeys": {
       "compositePrimaryKeys": {
         "user_workspace_id_id_pk": {
         "user_workspace_id_id_pk": {
           "name": "user_workspace_id_id_pk",
           "name": "user_workspace_id_id_pk",
-          "columns": [
-            "workspace_id",
-            "id"
-          ]
+          "columns": ["workspace_id", "id"]
         }
         }
       },
       },
       "uniqueConstraints": {},
       "uniqueConstraints": {},
@@ -563,9 +541,7 @@
       "indexes": {
       "indexes": {
         "slug": {
         "slug": {
           "name": "slug",
           "name": "slug",
-          "columns": [
-            "slug"
-          ],
+          "columns": ["slug"],
           "isUnique": true
           "isUnique": true
         }
         }
       },
       },
@@ -573,9 +549,7 @@
       "compositePrimaryKeys": {
       "compositePrimaryKeys": {
         "workspace_id": {
         "workspace_id": {
           "name": "workspace_id",
           "name": "workspace_id",
-          "columns": [
-            "id"
-          ]
+          "columns": ["id"]
         }
         }
       },
       },
       "uniqueConstraints": {},
       "uniqueConstraints": {},
@@ -592,4 +566,4 @@
     "tables": {},
     "tables": {},
     "indexes": {}
     "indexes": {}
   }
   }
-}
+}

+ 11 - 37
cloud/core/migrations/meta/0001_snapshot.json

@@ -48,9 +48,7 @@
       "indexes": {
       "indexes": {
         "email": {
         "email": {
           "name": "email",
           "name": "email",
-          "columns": [
-            "email"
-          ],
+          "columns": ["email"],
           "isUnique": true
           "isUnique": true
         }
         }
       },
       },
@@ -140,10 +138,7 @@
       "compositePrimaryKeys": {
       "compositePrimaryKeys": {
         "billing_workspace_id_id_pk": {
         "billing_workspace_id_id_pk": {
           "name": "billing_workspace_id_id_pk",
           "name": "billing_workspace_id_id_pk",
-          "columns": [
-            "workspace_id",
-            "id"
-          ]
+          "columns": ["workspace_id", "id"]
         }
         }
       },
       },
       "uniqueConstraints": {},
       "uniqueConstraints": {},
@@ -216,10 +211,7 @@
       "compositePrimaryKeys": {
       "compositePrimaryKeys": {
         "payment_workspace_id_id_pk": {
         "payment_workspace_id_id_pk": {
           "name": "payment_workspace_id_id_pk",
           "name": "payment_workspace_id_id_pk",
-          "columns": [
-            "workspace_id",
-            "id"
-          ]
+          "columns": ["workspace_id", "id"]
         }
         }
       },
       },
       "uniqueConstraints": {},
       "uniqueConstraints": {},
@@ -320,10 +312,7 @@
       "compositePrimaryKeys": {
       "compositePrimaryKeys": {
         "usage_workspace_id_id_pk": {
         "usage_workspace_id_id_pk": {
           "name": "usage_workspace_id_id_pk",
           "name": "usage_workspace_id_id_pk",
-          "columns": [
-            "workspace_id",
-            "id"
-          ]
+          "columns": ["workspace_id", "id"]
         }
         }
       },
       },
       "uniqueConstraints": {},
       "uniqueConstraints": {},
@@ -401,9 +390,7 @@
       "indexes": {
       "indexes": {
         "global_key": {
         "global_key": {
           "name": "global_key",
           "name": "global_key",
-          "columns": [
-            "key"
-          ],
+          "columns": ["key"],
           "isUnique": true
           "isUnique": true
         }
         }
       },
       },
@@ -411,10 +398,7 @@
       "compositePrimaryKeys": {
       "compositePrimaryKeys": {
         "key_workspace_id_id_pk": {
         "key_workspace_id_id_pk": {
           "name": "key_workspace_id_id_pk",
           "name": "key_workspace_id_id_pk",
-          "columns": [
-            "workspace_id",
-            "id"
-          ]
+          "columns": ["workspace_id", "id"]
         }
         }
       },
       },
       "uniqueConstraints": {},
       "uniqueConstraints": {},
@@ -492,10 +476,7 @@
       "indexes": {
       "indexes": {
         "user_email": {
         "user_email": {
           "name": "user_email",
           "name": "user_email",
-          "columns": [
-            "workspace_id",
-            "email"
-          ],
+          "columns": ["workspace_id", "email"],
           "isUnique": true
           "isUnique": true
         }
         }
       },
       },
@@ -503,10 +484,7 @@
       "compositePrimaryKeys": {
       "compositePrimaryKeys": {
         "user_workspace_id_id_pk": {
         "user_workspace_id_id_pk": {
           "name": "user_workspace_id_id_pk",
           "name": "user_workspace_id_id_pk",
-          "columns": [
-            "workspace_id",
-            "id"
-          ]
+          "columns": ["workspace_id", "id"]
         }
         }
       },
       },
       "uniqueConstraints": {},
       "uniqueConstraints": {},
@@ -563,9 +541,7 @@
       "indexes": {
       "indexes": {
         "slug": {
         "slug": {
           "name": "slug",
           "name": "slug",
-          "columns": [
-            "slug"
-          ],
+          "columns": ["slug"],
           "isUnique": true
           "isUnique": true
         }
         }
       },
       },
@@ -573,9 +549,7 @@
       "compositePrimaryKeys": {
       "compositePrimaryKeys": {
         "workspace_id": {
         "workspace_id": {
           "name": "workspace_id",
           "name": "workspace_id",
-          "columns": [
-            "id"
-          ]
+          "columns": ["id"]
         }
         }
       },
       },
       "uniqueConstraints": {},
       "uniqueConstraints": {},
@@ -592,4 +566,4 @@
     "tables": {},
     "tables": {},
     "indexes": {}
     "indexes": {}
   }
   }
-}
+}

+ 1 - 1
cloud/core/migrations/meta/_journal.json

@@ -17,4 +17,4 @@
       "breakpoints": true
       "breakpoints": true
     }
     }
   ]
   ]
-}
+}

+ 1 - 4
cloud/core/src/util/fn.ts

@@ -1,9 +1,6 @@
 import { z } from "zod"
 import { z } from "zod"
 
 
-export function fn<T extends z.ZodType, Result>(
-  schema: T,
-  cb: (input: z.output<T>) => Result,
-) {
+export function fn<T extends z.ZodType, Result>(schema: T, cb: (input: z.output<T>) => Result) {
   const result = (input: z.input<T>) => {
   const result = (input: z.input<T>) => {
     const parsed = schema.parse(input)
     const parsed = schema.parse(input)
     return cb(parsed)
     return cb(parsed)

+ 1 - 1
cloud/core/sst-env.d.ts

@@ -6,4 +6,4 @@
 /// <reference path="../../sst-env.d.ts" />
 /// <reference path="../../sst-env.d.ts" />
 
 
 import "sst"
 import "sst"
-export {}
+export {}

+ 75 - 75
cloud/function/sst-env.d.ts

@@ -6,87 +6,87 @@
 import "sst"
 import "sst"
 declare module "sst" {
 declare module "sst" {
   export interface Resource {
   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
-    }
-    "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
+    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
+    }
+    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";
+// cloudflare
+import * as cloudflare from "@cloudflare/workers-types"
 declare module "sst" {
 declare module "sst" {
   export interface Resource {
   export interface Resource {
-    "Api": cloudflare.Service
-    "AuthApi": cloudflare.Service
-    "AuthStorage": cloudflare.KVNamespace
-    "Bucket": cloudflare.R2Bucket
-    "LogProcessor": cloudflare.Service
+    Api: cloudflare.Service
+    AuthApi: cloudflare.Service
+    AuthStorage: cloudflare.KVNamespace
+    Bucket: cloudflare.R2Bucket
+    LogProcessor: cloudflare.Service
   }
   }
 }
 }
 
 
 import "sst"
 import "sst"
-export {}
+export {}

+ 75 - 75
cloud/resource/sst-env.d.ts

@@ -6,87 +6,87 @@
 import "sst"
 import "sst"
 declare module "sst" {
 declare module "sst" {
   export interface Resource {
   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
-    }
-    "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
+    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
+    }
+    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";
+// cloudflare
+import * as cloudflare from "@cloudflare/workers-types"
 declare module "sst" {
 declare module "sst" {
   export interface Resource {
   export interface Resource {
-    "Api": cloudflare.Service
-    "AuthApi": cloudflare.Service
-    "AuthStorage": cloudflare.KVNamespace
-    "Bucket": cloudflare.R2Bucket
-    "LogProcessor": cloudflare.Service
+    Api: cloudflare.Service
+    AuthApi: cloudflare.Service
+    AuthStorage: cloudflare.KVNamespace
+    Bucket: cloudflare.R2Bucket
+    LogProcessor: cloudflare.Service
   }
   }
 }
 }
 
 
 import "sst"
 import "sst"
-export {}
+export {}

+ 1 - 4
cloud/resource/tsconfig.json

@@ -4,9 +4,6 @@
   "compilerOptions": {
   "compilerOptions": {
     "module": "ESNext",
     "module": "ESNext",
     "moduleResolution": "bundler",
     "moduleResolution": "bundler",
-    "types": [
-      "@cloudflare/workers-types",
-      "node"
-    ]
+    "types": ["@cloudflare/workers-types", "node"]
   }
   }
 }
 }

+ 1 - 1
cloud/scripts/sst-env.d.ts

@@ -6,4 +6,4 @@
 /// <reference path="../../sst-env.d.ts" />
 /// <reference path="../../sst-env.d.ts" />
 
 
 import "sst"
 import "sst"
-export {}
+export {}

+ 1 - 1
github/sst-env.d.ts

@@ -6,4 +6,4 @@
 /// <reference path="../sst-env.d.ts" />
 /// <reference path="../sst-env.d.ts" />
 
 
 import "sst"
 import "sst"
-export {}
+export {}

+ 1 - 0
package.json

@@ -6,6 +6,7 @@
   "packageManager": "[email protected]",
   "packageManager": "[email protected]",
   "scripts": {
   "scripts": {
     "dev": "bun run --conditions=development packages/opencode/src/index.ts",
     "dev": "bun run --conditions=development packages/opencode/src/index.ts",
+    "format": "bun run prettier --ignore-unknown --write $(git ls-files)",
     "typecheck": "bun run --filter='*' typecheck",
     "typecheck": "bun run --filter='*' typecheck",
     "generate": "(cd packages/sdk && ./js/script/generate.ts) && (cd packages/sdk/stainless && ./generate.ts)",
     "generate": "(cd packages/sdk && ./js/script/generate.ts) && (cd packages/sdk/stainless && ./generate.ts)",
     "postinstall": "./script/hooks"
     "postinstall": "./script/hooks"

+ 75 - 75
packages/function/sst-env.d.ts

@@ -6,87 +6,87 @@
 import "sst"
 import "sst"
 declare module "sst" {
 declare module "sst" {
   export interface Resource {
   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
-    }
-    "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
+    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
+    }
+    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";
+// cloudflare
+import * as cloudflare from "@cloudflare/workers-types"
 declare module "sst" {
 declare module "sst" {
   export interface Resource {
   export interface Resource {
-    "Api": cloudflare.Service
-    "AuthApi": cloudflare.Service
-    "AuthStorage": cloudflare.KVNamespace
-    "Bucket": cloudflare.R2Bucket
-    "LogProcessor": cloudflare.Service
+    Api: cloudflare.Service
+    AuthApi: cloudflare.Service
+    AuthStorage: cloudflare.KVNamespace
+    Bucket: cloudflare.R2Bucket
+    LogProcessor: cloudflare.Service
   }
   }
 }
 }
 
 
 import "sst"
 import "sst"
-export {}
+export {}

+ 15 - 21
packages/opencode/src/file/fzf.ts

@@ -46,10 +46,7 @@ export namespace Fzf {
       log.info("found", { filepath })
       log.info("found", { filepath })
       return { filepath }
       return { filepath }
     }
     }
-    filepath = path.join(
-      Global.Path.bin,
-      "fzf" + (process.platform === "win32" ? ".exe" : ""),
-    )
+    filepath = path.join(Global.Path.bin, "fzf" + (process.platform === "win32" ? ".exe" : ""))
 
 
     const file = Bun.file(filepath)
     const file = Bun.file(filepath)
     if (!(await file.exists())) {
     if (!(await file.exists())) {
@@ -57,18 +54,15 @@ export namespace Fzf {
       const arch = archMap[process.arch as keyof typeof archMap] ?? "amd64"
       const arch = archMap[process.arch as keyof typeof archMap] ?? "amd64"
 
 
       const config = PLATFORM[process.platform as keyof typeof PLATFORM]
       const config = PLATFORM[process.platform as keyof typeof PLATFORM]
-      if (!config)
-        throw new UnsupportedPlatformError({ platform: process.platform })
+      if (!config) throw new UnsupportedPlatformError({ platform: process.platform })
 
 
       const version = VERSION
       const version = VERSION
-      const platformName =
-        process.platform === "win32" ? "windows" : process.platform
+      const platformName = process.platform === "win32" ? "windows" : process.platform
       const filename = `fzf-${version}-${platformName}_${arch}.${config.extension}`
       const filename = `fzf-${version}-${platformName}_${arch}.${config.extension}`
       const url = `https://github.com/junegunn/fzf/releases/download/v${version}/${filename}`
       const url = `https://github.com/junegunn/fzf/releases/download/v${version}/${filename}`
 
 
       const response = await fetch(url)
       const response = await fetch(url)
-      if (!response.ok)
-        throw new DownloadFailedError({ url, status: response.status })
+      if (!response.ok) throw new DownloadFailedError({ url, status: response.status })
 
 
       const buffer = await response.arrayBuffer()
       const buffer = await response.arrayBuffer()
       const archivePath = path.join(Global.Path.bin, filename)
       const archivePath = path.join(Global.Path.bin, filename)
@@ -87,13 +81,13 @@ export namespace Fzf {
           })
           })
       }
       }
       if (config.extension === "zip") {
       if (config.extension === "zip") {
-        const zipFileReader = new ZipReader(new BlobReader(new Blob([await Bun.file(archivePath).arrayBuffer()])));
-        const entries = await zipFileReader.getEntries();
-        let fzfEntry: any;
+        const zipFileReader = new ZipReader(new BlobReader(new Blob([await Bun.file(archivePath).arrayBuffer()])))
+        const entries = await zipFileReader.getEntries()
+        let fzfEntry: any
         for (const entry of entries) {
         for (const entry of entries) {
           if (entry.filename === "fzf.exe") {
           if (entry.filename === "fzf.exe") {
-            fzfEntry = entry;
-            break;
+            fzfEntry = entry
+            break
           }
           }
         }
         }
 
 
@@ -101,18 +95,18 @@ export namespace Fzf {
           throw new ExtractionFailedError({
           throw new ExtractionFailedError({
             filepath: archivePath,
             filepath: archivePath,
             stderr: "fzf.exe not found in zip archive",
             stderr: "fzf.exe not found in zip archive",
-          });
+          })
         }
         }
 
 
-        const fzfBlob = await fzfEntry.getData(new BlobWriter());
+        const fzfBlob = await fzfEntry.getData(new BlobWriter())
         if (!fzfBlob) {
         if (!fzfBlob) {
           throw new ExtractionFailedError({
           throw new ExtractionFailedError({
             filepath: archivePath,
             filepath: archivePath,
             stderr: "Failed to extract fzf.exe from zip archive",
             stderr: "Failed to extract fzf.exe from zip archive",
-          });
+          })
         }
         }
-        await Bun.write(filepath, await fzfBlob.arrayBuffer());
-        await zipFileReader.close();
+        await Bun.write(filepath, await fzfBlob.arrayBuffer())
+        await zipFileReader.close()
       }
       }
       await fs.unlink(archivePath)
       await fs.unlink(archivePath)
       if (process.platform !== "win32") await fs.chmod(filepath, 0o755)
       if (process.platform !== "win32") await fs.chmod(filepath, 0o755)
@@ -127,4 +121,4 @@ export namespace Fzf {
     const { filepath } = await state()
     const { filepath } = await state()
     return filepath
     return filepath
   }
   }
-}
+}

+ 9 - 11
packages/opencode/src/file/time.ts

@@ -3,18 +3,16 @@ import { Log } from "../util/log"
 
 
 export namespace FileTime {
 export namespace FileTime {
   const log = Log.create({ service: "file.time" })
   const log = Log.create({ service: "file.time" })
-  export const state = Instance.state(
-    () => {
-      const read: {
-        [sessionID: string]: {
-          [path: string]: Date | undefined
-        }
-      } = {}
-      return {
-        read,
+  export const state = Instance.state(() => {
+    const read: {
+      [sessionID: string]: {
+        [path: string]: Date | undefined
       }
       }
-    },
-  )
+    } = {}
+    return {
+      read,
+    }
+  })
 
 
   export function read(sessionID: string, file: string) {
   export function read(sessionID: string, file: string) {
     log.info("read", { sessionID, file })
     log.info("read", { sessionID, file })

+ 9 - 6
packages/opencode/src/plugin/index.ts

@@ -25,8 +25,8 @@ export namespace Plugin {
       worktree: Instance.worktree,
       worktree: Instance.worktree,
       directory: Instance.directory,
       directory: Instance.directory,
       $: Bun.$,
       $: Bun.$,
-      Tool: await import("../tool/tool").then(m => m.Tool),
-      z: await import("zod").then(m => m.z),
+      Tool: await import("../tool/tool").then((m) => m.Tool),
+      z: await import("zod").then((m) => m.z),
     }
     }
     const plugins = [...(config.plugin ?? [])]
     const plugins = [...(config.plugin ?? [])]
     if (!Flag.OPENCODE_DISABLE_DEFAULT_PLUGINS) {
     if (!Flag.OPENCODE_DISABLE_DEFAULT_PLUGINS) {
@@ -79,10 +79,13 @@ export namespace Plugin {
     for (const hook of hooks) {
     for (const hook of hooks) {
       await hook.config?.(config)
       await hook.config?.(config)
       // Let plugins register tools at startup
       // Let plugins register tools at startup
-      await hook["tool.register"]?.({}, { 
-        registerHTTP: ToolRegistry.registerHTTP,
-        register: ToolRegistry.register 
-      })
+      await hook["tool.register"]?.(
+        {},
+        {
+          registerHTTP: ToolRegistry.registerHTTP,
+          register: ToolRegistry.register,
+        },
+      )
     }
     }
     Bus.subscribeAll(async (input) => {
     Bus.subscribeAll(async (input) => {
       const hooks = await state().then((x) => x.hooks)
       const hooks = await state().then((x) => x.hooks)

+ 3 - 1
packages/opencode/src/tool/edit.ts

@@ -623,5 +623,7 @@ export function replace(content: string, oldString: string, newString: string, r
   if (notFound) {
   if (notFound) {
     throw new Error("oldString not found in content")
     throw new Error("oldString not found in content")
   }
   }
-  throw new Error("oldString found multiple times and requires more code context to uniquely identify the intended match")
+  throw new Error(
+    "oldString found multiple times and requires more code context to uniquely identify the intended match",
+  )
 }
 }

+ 1 - 3
packages/opencode/src/tool/registry.ts

@@ -71,9 +71,7 @@ export namespace ToolRegistry {
           break
           break
         case "array":
         case "array":
           if (!val.items) throw new Error(`array spec for ${key} requires 'items'`)
           if (!val.items) throw new Error(`array spec for ${key} requires 'items'`)
-          base = z.array(
-            val.items === "string" ? z.string() : val.items === "number" ? z.number() : z.boolean(),
-          )
+          base = z.array(val.items === "string" ? z.string() : val.items === "number" ? z.number() : z.boolean())
           break
           break
         default:
         default:
           base = z.any()
           base = z.any()

+ 6 - 8
packages/opencode/src/tool/todo.ts

@@ -11,14 +11,12 @@ const TodoInfo = z.object({
 })
 })
 type TodoInfo = z.infer<typeof TodoInfo>
 type TodoInfo = z.infer<typeof TodoInfo>
 
 
-const state = Instance.state(
-  () => {
-    const todos: {
-      [sessionId: string]: TodoInfo[]
-    } = {}
-    return todos
-  },
-)
+const state = Instance.state(() => {
+  const todos: {
+    [sessionId: string]: TodoInfo[]
+  } = {}
+  return todos
+})
 
 
 export const TodoWriteTool = Tool.define("todowrite", {
 export const TodoWriteTool = Tool.define("todowrite", {
   description: DESCRIPTION_WRITE,
   description: DESCRIPTION_WRITE,

+ 1 - 1
packages/opencode/sst-env.d.ts

@@ -6,4 +6,4 @@
 /// <reference path="../../sst-env.d.ts" />
 /// <reference path="../../sst-env.d.ts" />
 
 
 import "sst"
 import "sst"
-export {}
+export {}

+ 7 - 7
packages/opencode/test/bun.test.ts

@@ -7,7 +7,7 @@ describe("BunProc registry configuration", () => {
     // Read the bun/index.ts file
     // Read the bun/index.ts file
     const bunIndexPath = path.join(__dirname, "../src/bun/index.ts")
     const bunIndexPath = path.join(__dirname, "../src/bun/index.ts")
     const content = await fs.readFile(bunIndexPath, "utf-8")
     const content = await fs.readFile(bunIndexPath, "utf-8")
-    
+
     // Verify that no hardcoded registry is present
     // Verify that no hardcoded registry is present
     expect(content).not.toContain("--registry=")
     expect(content).not.toContain("--registry=")
     expect(content).not.toContain("hasNpmRcConfig")
     expect(content).not.toContain("hasNpmRcConfig")
@@ -18,7 +18,7 @@ describe("BunProc registry configuration", () => {
     // Read the bun/index.ts file
     // Read the bun/index.ts file
     const bunIndexPath = path.join(__dirname, "../src/bun/index.ts")
     const bunIndexPath = path.join(__dirname, "../src/bun/index.ts")
     const content = await fs.readFile(bunIndexPath, "utf-8")
     const content = await fs.readFile(bunIndexPath, "utf-8")
-    
+
     // Verify that it uses Bun's default resolution
     // Verify that it uses Bun's default resolution
     expect(content).toContain("Bun's default registry resolution")
     expect(content).toContain("Bun's default registry resolution")
     expect(content).toContain("Bun will use them automatically")
     expect(content).toContain("Bun will use them automatically")
@@ -29,22 +29,22 @@ describe("BunProc registry configuration", () => {
     // Read the bun/index.ts file
     // Read the bun/index.ts file
     const bunIndexPath = path.join(__dirname, "../src/bun/index.ts")
     const bunIndexPath = path.join(__dirname, "../src/bun/index.ts")
     const content = await fs.readFile(bunIndexPath, "utf-8")
     const content = await fs.readFile(bunIndexPath, "utf-8")
-    
+
     // Extract the install function
     // Extract the install function
     const installFunctionMatch = content.match(/export async function install[\s\S]*?^  }/m)
     const installFunctionMatch = content.match(/export async function install[\s\S]*?^  }/m)
     expect(installFunctionMatch).toBeTruthy()
     expect(installFunctionMatch).toBeTruthy()
-    
+
     if (installFunctionMatch) {
     if (installFunctionMatch) {
       const installFunction = installFunctionMatch[0]
       const installFunction = installFunctionMatch[0]
-      
+
       // Verify expected arguments are present
       // Verify expected arguments are present
       expect(installFunction).toContain('"add"')
       expect(installFunction).toContain('"add"')
       expect(installFunction).toContain('"--force"')
       expect(installFunction).toContain('"--force"')
       expect(installFunction).toContain('"--exact"')
       expect(installFunction).toContain('"--exact"')
       expect(installFunction).toContain('"--cwd"')
       expect(installFunction).toContain('"--cwd"')
-      expect(installFunction).toContain('Global.Path.cache')
+      expect(installFunction).toContain("Global.Path.cache")
       expect(installFunction).toContain('pkg + "@" + version')
       expect(installFunction).toContain('pkg + "@" + version')
-      
+
       // Verify no registry argument is added
       // Verify no registry argument is added
       expect(installFunction).not.toContain('"--registry"')
       expect(installFunction).not.toContain('"--registry"')
       expect(installFunction).not.toContain('args.push("--registry')
       expect(installFunction).not.toContain('args.push("--registry')

+ 2 - 8
packages/opencode/tsconfig.json

@@ -2,13 +2,7 @@
   "$schema": "https://json.schemastore.org/tsconfig",
   "$schema": "https://json.schemastore.org/tsconfig",
   "extends": "@tsconfig/bun/tsconfig.json",
   "extends": "@tsconfig/bun/tsconfig.json",
   "compilerOptions": {
   "compilerOptions": {
-    "lib": [
-      "ESNext",
-      "DOM",
-      "DOM.Iterable"
-    ],
-    "customConditions": [
-      "development"
-    ]
+    "lib": ["ESNext", "DOM", "DOM.Iterable"],
+    "customConditions": ["development"]
   }
   }
 }
 }

+ 2 - 5
packages/plugin/src/index.ts

@@ -19,10 +19,7 @@ export type PluginInput = {
   worktree: string
   worktree: string
   $: BunShell
   $: BunShell
   Tool: {
   Tool: {
-    define(
-      id: string,
-      init: any | (() => Promise<any>)
-    ): any
+    define(id: string, init: any | (() => Promise<any>)): any
   }
   }
   z: any // Zod instance for creating schemas
   z: any // Zod instance for creating schemas
 }
 }
@@ -133,7 +130,7 @@ export interface Hooks {
     input: {},
     input: {},
     output: {
     output: {
       registerHTTP: (tool: HttpToolRegistration) => void | Promise<void>
       registerHTTP: (tool: HttpToolRegistration) => void | Promise<void>
-      register: (tool: any) => void | Promise<void>  // Tool.Info type from opencode
+      register: (tool: any) => void | Promise<void> // Tool.Info type from opencode
     },
     },
   ) => Promise<void>
   ) => Promise<void>
 }
 }

+ 1 - 1
packages/plugin/sst-env.d.ts

@@ -6,4 +6,4 @@
 /// <reference path="../../sst-env.d.ts" />
 /// <reference path="../../sst-env.d.ts" />
 
 
 import "sst"
 import "sst"
-export {}
+export {}

+ 3 - 11
packages/plugin/tsconfig.json

@@ -6,16 +6,8 @@
     "module": "preserve",
     "module": "preserve",
     "declaration": true,
     "declaration": true,
     "moduleResolution": "bundler",
     "moduleResolution": "bundler",
-    "lib": [
-      "es2022",
-      "dom",
-      "dom.iterable"
-    ],
-    "customConditions": [
-      "development"
-    ]
+    "lib": ["es2022", "dom", "dom.iterable"],
+    "customConditions": ["development"]
   },
   },
-  "include": [
-    "src"
-  ]
+  "include": ["src"]
 }
 }

+ 7 - 7
packages/sdk/go/.github/workflows/ci.yml

@@ -2,15 +2,15 @@ name: CI
 on:
 on:
   push:
   push:
     branches-ignore:
     branches-ignore:
-      - 'generated'
-      - 'codegen/**'
-      - 'integrated/**'
-      - 'stl-preview-head/**'
-      - 'stl-preview-base/**'
+      - "generated"
+      - "codegen/**"
+      - "integrated/**"
+      - "stl-preview-head/**"
+      - "stl-preview-base/**"
   pull_request:
   pull_request:
     branches-ignore:
     branches-ignore:
-      - 'stl-preview-head/**'
-      - 'stl-preview-base/**'
+      - "stl-preview-head/**"
+      - "stl-preview-base/**"
 
 
 jobs:
 jobs:
   lint:
   lint:

+ 1 - 1
packages/sdk/go/.release-please-manifest.json

@@ -1,3 +1,3 @@
 {
 {
   ".": "0.8.0"
   ".": "0.8.0"
-}
+}

+ 57 - 59
packages/sdk/go/CHANGELOG.md

@@ -6,7 +6,7 @@ Full Changelog: [v0.7.0...v0.8.0](https://github.com/sst/opencode-sdk-go/compare
 
 
 ### Features
 ### Features
 
 
-* **api:** api update ([ae87a71](https://github.com/sst/opencode-sdk-go/commit/ae87a71949994590ace8285a39f0991ef34b664d))
+- **api:** api update ([ae87a71](https://github.com/sst/opencode-sdk-go/commit/ae87a71949994590ace8285a39f0991ef34b664d))
 
 
 ## 0.7.0 (2025-09-01)
 ## 0.7.0 (2025-09-01)
 
 
@@ -14,7 +14,7 @@ Full Changelog: [v0.6.0...v0.7.0](https://github.com/sst/opencode-sdk-go/compare
 
 
 ### Features
 ### Features
 
 
-* **api:** api update ([64bb1b1](https://github.com/sst/opencode-sdk-go/commit/64bb1b1ee0cbe153abc6fb7bd9703b47911724d4))
+- **api:** api update ([64bb1b1](https://github.com/sst/opencode-sdk-go/commit/64bb1b1ee0cbe153abc6fb7bd9703b47911724d4))
 
 
 ## 0.6.0 (2025-09-01)
 ## 0.6.0 (2025-09-01)
 
 
@@ -22,7 +22,7 @@ Full Changelog: [v0.5.0...v0.6.0](https://github.com/sst/opencode-sdk-go/compare
 
 
 ### Features
 ### Features
 
 
-* **api:** api update ([928e384](https://github.com/sst/opencode-sdk-go/commit/928e3843355f96899f046f002b84372281dad0c8))
+- **api:** api update ([928e384](https://github.com/sst/opencode-sdk-go/commit/928e3843355f96899f046f002b84372281dad0c8))
 
 
 ## 0.5.0 (2025-08-31)
 ## 0.5.0 (2025-08-31)
 
 
@@ -30,7 +30,7 @@ Full Changelog: [v0.4.0...v0.5.0](https://github.com/sst/opencode-sdk-go/compare
 
 
 ### Features
 ### Features
 
 
-* **api:** api update ([44b281d](https://github.com/sst/opencode-sdk-go/commit/44b281d0bb39c5022a984ac9d0fca1529ccc0604))
+- **api:** api update ([44b281d](https://github.com/sst/opencode-sdk-go/commit/44b281d0bb39c5022a984ac9d0fca1529ccc0604))
 
 
 ## 0.4.0 (2025-08-31)
 ## 0.4.0 (2025-08-31)
 
 
@@ -38,7 +38,7 @@ Full Changelog: [v0.3.0...v0.4.0](https://github.com/sst/opencode-sdk-go/compare
 
 
 ### Features
 ### Features
 
 
-* **api:** api update ([fa9d6ec](https://github.com/sst/opencode-sdk-go/commit/fa9d6ec6472e62f4f6605d0a71a7aa8bf8a24559))
+- **api:** api update ([fa9d6ec](https://github.com/sst/opencode-sdk-go/commit/fa9d6ec6472e62f4f6605d0a71a7aa8bf8a24559))
 
 
 ## 0.3.0 (2025-08-31)
 ## 0.3.0 (2025-08-31)
 
 
@@ -46,7 +46,7 @@ Full Changelog: [v0.2.0...v0.3.0](https://github.com/sst/opencode-sdk-go/compare
 
 
 ### Features
 ### Features
 
 
-* **api:** api update ([aae1c06](https://github.com/sst/opencode-sdk-go/commit/aae1c06bb5a93a1cd9c589846a84b3f16246f5da))
+- **api:** api update ([aae1c06](https://github.com/sst/opencode-sdk-go/commit/aae1c06bb5a93a1cd9c589846a84b3f16246f5da))
 
 
 ## 0.2.0 (2025-08-31)
 ## 0.2.0 (2025-08-31)
 
 
@@ -54,7 +54,7 @@ Full Changelog: [v0.1.0...v0.2.0](https://github.com/sst/opencode-sdk-go/compare
 
 
 ### Features
 ### Features
 
 
-* **api:** api update ([1472790](https://github.com/sst/opencode-sdk-go/commit/1472790542515f47bd46e2a9e28d8afea024cf9c))
+- **api:** api update ([1472790](https://github.com/sst/opencode-sdk-go/commit/1472790542515f47bd46e2a9e28d8afea024cf9c))
 
 
 ## 0.1.0 (2025-08-31)
 ## 0.1.0 (2025-08-31)
 
 
@@ -62,61 +62,59 @@ Full Changelog: [v0.0.1...v0.1.0](https://github.com/sst/opencode-sdk-go/compare
 
 
 ### Features
 ### Features
 
 
-* **api:** api update ([3f03ddd](https://github.com/sst/opencode-sdk-go/commit/3f03dddd5ec0de98f99ce48679077dcae9ceffd6))
-* **api:** api update ([e9f79c4](https://github.com/sst/opencode-sdk-go/commit/e9f79c4792b21ef64ab0431ffd76f5a71e04d182))
-* **api:** api update ([139a686](https://github.com/sst/opencode-sdk-go/commit/139a6862d2f0ab0c8ea791663d736868be3e96e6))
-* **api:** api update ([2ed0800](https://github.com/sst/opencode-sdk-go/commit/2ed0800b2c5b99877e9f7fde669a6c005fad6b77))
-* **api:** api update ([88a87a4](https://github.com/sst/opencode-sdk-go/commit/88a87a458f56ce0c18b502c73da933f614f56e8b))
-* **api:** api update ([0e5d65b](https://github.com/sst/opencode-sdk-go/commit/0e5d65b571e7b30dc6347e6730098878ebba3a42))
-* **api:** api update ([ba381f1](https://github.com/sst/opencode-sdk-go/commit/ba381f1e07aad24e9824df7d53befae2a644f69f))
-* **api:** api update ([3f429f5](https://github.com/sst/opencode-sdk-go/commit/3f429f5b4be5607433ef5fdc0d5bf67fe590d039))
-* **api:** api update ([9f34787](https://github.com/sst/opencode-sdk-go/commit/9f347876b35b7f898060c1a5f71c322e95978e3e))
-* **api:** api update ([379c8e0](https://github.com/sst/opencode-sdk-go/commit/379c8e00197e13aebaf2f2d61277b125f1f90011))
-* **api:** api update ([550511c](https://github.com/sst/opencode-sdk-go/commit/550511c4c5b5055ac8ff22b7b11731331bd9d088))
-* **api:** api update ([547f0c2](https://github.com/sst/opencode-sdk-go/commit/547f0c262f2df1ce83eaa7267d68be64bb29b841))
-* **api:** api update ([b7b0720](https://github.com/sst/opencode-sdk-go/commit/b7b07204bff314da24b1819c128835a43ef64065))
-* **api:** api update ([7250ffc](https://github.com/sst/opencode-sdk-go/commit/7250ffcba262b916c958ddecc2a42927982db39f))
-* **api:** api update ([17fbab7](https://github.com/sst/opencode-sdk-go/commit/17fbab73111a3eae488737c69b12370bc69c65f7))
-* **api:** api update ([1270b5c](https://github.com/sst/opencode-sdk-go/commit/1270b5cd81e6ac769dcd92ade6d877891bf51bd5))
-* **api:** api update ([a238d4a](https://github.com/sst/opencode-sdk-go/commit/a238d4abd6ed7d15f3547d27a4b6ecf4aec8431e))
-* **api:** api update ([7475655](https://github.com/sst/opencode-sdk-go/commit/7475655aca577fe4f807c2f02f92171f6a358e9c))
-* **api:** api update ([429d258](https://github.com/sst/opencode-sdk-go/commit/429d258bb56e9cdeb1528be3944bf5537ac26a96))
-* **api:** api update ([f250915](https://github.com/sst/opencode-sdk-go/commit/f2509157eaf1b453e741ee9482127cad2e3ace25))
-* **api:** api update ([5efc987](https://github.com/sst/opencode-sdk-go/commit/5efc987353801d1e772c20edf162b1c75da32743))
-* **api:** api update ([98a8350](https://github.com/sst/opencode-sdk-go/commit/98a83504f7cfc361e83314c3e79a4e9ff53f0560))
-* **api:** api update ([6da8bf8](https://github.com/sst/opencode-sdk-go/commit/6da8bf8bfe91d45991fb580753d77c5534fc0b1b))
-* **api:** api update ([f8c7148](https://github.com/sst/opencode-sdk-go/commit/f8c7148ae56143823186e2675a78e82676154956))
-* **api:** manual updates ([7cf038f](https://github.com/sst/opencode-sdk-go/commit/7cf038ffae5da1b77e1cef11b5fa166a53b467f2))
-* **api:** update via SDK Studio ([068a0eb](https://github.com/sst/opencode-sdk-go/commit/068a0eb025010da0c8d86fa1bb496a39dbedcef9))
-* **api:** update via SDK Studio ([ca651ed](https://github.com/sst/opencode-sdk-go/commit/ca651edaf71d1f3678f929287474f5bc4f1aad10))
-* **api:** update via SDK Studio ([13550a5](https://github.com/sst/opencode-sdk-go/commit/13550a5c65d77325e945ed99fe0799cd1107b775))
-* **api:** update via SDK Studio ([7b73730](https://github.com/sst/opencode-sdk-go/commit/7b73730c7fa62ba966dda3541c3e97b49be8d2bf))
-* **api:** update via SDK Studio ([9e39a59](https://github.com/sst/opencode-sdk-go/commit/9e39a59b3d5d1bd5e64633732521fb28362cc70e))
-* **api:** update via SDK Studio ([9609d1b](https://github.com/sst/opencode-sdk-go/commit/9609d1b1db7806d00cb846c9914cb4935cdedf52))
-* **api:** update via SDK Studio ([51315fa](https://github.com/sst/opencode-sdk-go/commit/51315fa2eae424743ea79701e67d44447c44144d))
-* **api:** update via SDK Studio ([af07955](https://github.com/sst/opencode-sdk-go/commit/af0795543240aefaf04fc7663a348825541c79ed))
-* **api:** update via SDK Studio ([5e3468a](https://github.com/sst/opencode-sdk-go/commit/5e3468a0aaa5ed3b13e019c3a24e0ba9147d1675))
-* **api:** update via SDK Studio ([0a73e04](https://github.com/sst/opencode-sdk-go/commit/0a73e04c23c90b2061611edaa8fd6282dc0ce397))
-* **api:** update via SDK Studio ([9b7883a](https://github.com/sst/opencode-sdk-go/commit/9b7883a144eeac526d9d04538e0876a9d18bb844))
-* **client:** expand max streaming buffer size ([76303e5](https://github.com/sst/opencode-sdk-go/commit/76303e51067e78e732af26ced9d83b8bad7655c3))
-* **client:** support optional json html escaping ([449748f](https://github.com/sst/opencode-sdk-go/commit/449748f35a1d8cb6f91dc36d25bf9489f4f371bd))
-
+- **api:** api update ([3f03ddd](https://github.com/sst/opencode-sdk-go/commit/3f03dddd5ec0de98f99ce48679077dcae9ceffd6))
+- **api:** api update ([e9f79c4](https://github.com/sst/opencode-sdk-go/commit/e9f79c4792b21ef64ab0431ffd76f5a71e04d182))
+- **api:** api update ([139a686](https://github.com/sst/opencode-sdk-go/commit/139a6862d2f0ab0c8ea791663d736868be3e96e6))
+- **api:** api update ([2ed0800](https://github.com/sst/opencode-sdk-go/commit/2ed0800b2c5b99877e9f7fde669a6c005fad6b77))
+- **api:** api update ([88a87a4](https://github.com/sst/opencode-sdk-go/commit/88a87a458f56ce0c18b502c73da933f614f56e8b))
+- **api:** api update ([0e5d65b](https://github.com/sst/opencode-sdk-go/commit/0e5d65b571e7b30dc6347e6730098878ebba3a42))
+- **api:** api update ([ba381f1](https://github.com/sst/opencode-sdk-go/commit/ba381f1e07aad24e9824df7d53befae2a644f69f))
+- **api:** api update ([3f429f5](https://github.com/sst/opencode-sdk-go/commit/3f429f5b4be5607433ef5fdc0d5bf67fe590d039))
+- **api:** api update ([9f34787](https://github.com/sst/opencode-sdk-go/commit/9f347876b35b7f898060c1a5f71c322e95978e3e))
+- **api:** api update ([379c8e0](https://github.com/sst/opencode-sdk-go/commit/379c8e00197e13aebaf2f2d61277b125f1f90011))
+- **api:** api update ([550511c](https://github.com/sst/opencode-sdk-go/commit/550511c4c5b5055ac8ff22b7b11731331bd9d088))
+- **api:** api update ([547f0c2](https://github.com/sst/opencode-sdk-go/commit/547f0c262f2df1ce83eaa7267d68be64bb29b841))
+- **api:** api update ([b7b0720](https://github.com/sst/opencode-sdk-go/commit/b7b07204bff314da24b1819c128835a43ef64065))
+- **api:** api update ([7250ffc](https://github.com/sst/opencode-sdk-go/commit/7250ffcba262b916c958ddecc2a42927982db39f))
+- **api:** api update ([17fbab7](https://github.com/sst/opencode-sdk-go/commit/17fbab73111a3eae488737c69b12370bc69c65f7))
+- **api:** api update ([1270b5c](https://github.com/sst/opencode-sdk-go/commit/1270b5cd81e6ac769dcd92ade6d877891bf51bd5))
+- **api:** api update ([a238d4a](https://github.com/sst/opencode-sdk-go/commit/a238d4abd6ed7d15f3547d27a4b6ecf4aec8431e))
+- **api:** api update ([7475655](https://github.com/sst/opencode-sdk-go/commit/7475655aca577fe4f807c2f02f92171f6a358e9c))
+- **api:** api update ([429d258](https://github.com/sst/opencode-sdk-go/commit/429d258bb56e9cdeb1528be3944bf5537ac26a96))
+- **api:** api update ([f250915](https://github.com/sst/opencode-sdk-go/commit/f2509157eaf1b453e741ee9482127cad2e3ace25))
+- **api:** api update ([5efc987](https://github.com/sst/opencode-sdk-go/commit/5efc987353801d1e772c20edf162b1c75da32743))
+- **api:** api update ([98a8350](https://github.com/sst/opencode-sdk-go/commit/98a83504f7cfc361e83314c3e79a4e9ff53f0560))
+- **api:** api update ([6da8bf8](https://github.com/sst/opencode-sdk-go/commit/6da8bf8bfe91d45991fb580753d77c5534fc0b1b))
+- **api:** api update ([f8c7148](https://github.com/sst/opencode-sdk-go/commit/f8c7148ae56143823186e2675a78e82676154956))
+- **api:** manual updates ([7cf038f](https://github.com/sst/opencode-sdk-go/commit/7cf038ffae5da1b77e1cef11b5fa166a53b467f2))
+- **api:** update via SDK Studio ([068a0eb](https://github.com/sst/opencode-sdk-go/commit/068a0eb025010da0c8d86fa1bb496a39dbedcef9))
+- **api:** update via SDK Studio ([ca651ed](https://github.com/sst/opencode-sdk-go/commit/ca651edaf71d1f3678f929287474f5bc4f1aad10))
+- **api:** update via SDK Studio ([13550a5](https://github.com/sst/opencode-sdk-go/commit/13550a5c65d77325e945ed99fe0799cd1107b775))
+- **api:** update via SDK Studio ([7b73730](https://github.com/sst/opencode-sdk-go/commit/7b73730c7fa62ba966dda3541c3e97b49be8d2bf))
+- **api:** update via SDK Studio ([9e39a59](https://github.com/sst/opencode-sdk-go/commit/9e39a59b3d5d1bd5e64633732521fb28362cc70e))
+- **api:** update via SDK Studio ([9609d1b](https://github.com/sst/opencode-sdk-go/commit/9609d1b1db7806d00cb846c9914cb4935cdedf52))
+- **api:** update via SDK Studio ([51315fa](https://github.com/sst/opencode-sdk-go/commit/51315fa2eae424743ea79701e67d44447c44144d))
+- **api:** update via SDK Studio ([af07955](https://github.com/sst/opencode-sdk-go/commit/af0795543240aefaf04fc7663a348825541c79ed))
+- **api:** update via SDK Studio ([5e3468a](https://github.com/sst/opencode-sdk-go/commit/5e3468a0aaa5ed3b13e019c3a24e0ba9147d1675))
+- **api:** update via SDK Studio ([0a73e04](https://github.com/sst/opencode-sdk-go/commit/0a73e04c23c90b2061611edaa8fd6282dc0ce397))
+- **api:** update via SDK Studio ([9b7883a](https://github.com/sst/opencode-sdk-go/commit/9b7883a144eeac526d9d04538e0876a9d18bb844))
+- **client:** expand max streaming buffer size ([76303e5](https://github.com/sst/opencode-sdk-go/commit/76303e51067e78e732af26ced9d83b8bad7655c3))
+- **client:** support optional json html escaping ([449748f](https://github.com/sst/opencode-sdk-go/commit/449748f35a1d8cb6f91dc36d25bf9489f4f371bd))
 
 
 ### Bug Fixes
 ### Bug Fixes
 
 
-* **client:** process custom base url ahead of time ([9b360d6](https://github.com/sst/opencode-sdk-go/commit/9b360d642cf6f302104308af5622e17099899e5f))
-* **client:** resolve lint errors in streaming tests ([4d36cb0](https://github.com/sst/opencode-sdk-go/commit/4d36cb09fc9d436734d5dab1c499acaa88568ff7))
-* close body before retrying ([4da3f7f](https://github.com/sst/opencode-sdk-go/commit/4da3f7f372bad222a189ba3eabcfde3373166ae5))
-* don't try to deserialize as json when ResponseBodyInto is []byte ([595291f](https://github.com/sst/opencode-sdk-go/commit/595291f6dba6af472f160b9f8e3d145002f43a4a))
-
+- **client:** process custom base url ahead of time ([9b360d6](https://github.com/sst/opencode-sdk-go/commit/9b360d642cf6f302104308af5622e17099899e5f))
+- **client:** resolve lint errors in streaming tests ([4d36cb0](https://github.com/sst/opencode-sdk-go/commit/4d36cb09fc9d436734d5dab1c499acaa88568ff7))
+- close body before retrying ([4da3f7f](https://github.com/sst/opencode-sdk-go/commit/4da3f7f372bad222a189ba3eabcfde3373166ae5))
+- don't try to deserialize as json when ResponseBodyInto is []byte ([595291f](https://github.com/sst/opencode-sdk-go/commit/595291f6dba6af472f160b9f8e3d145002f43a4a))
 
 
 ### Chores
 ### Chores
 
 
-* **ci:** only run for pushes and fork pull requests ([bea59b8](https://github.com/sst/opencode-sdk-go/commit/bea59b886800ef555f89c47a9256d6392ed2e53d))
-* **internal:** codegen related update ([6a22ce6](https://github.com/sst/opencode-sdk-go/commit/6a22ce6df155f5003e80b8a75686a9e513a5568a))
-* **internal:** fix lint script for tests ([391c482](https://github.com/sst/opencode-sdk-go/commit/391c482148ed0a77c4ad52807abeb2d540b56797))
-* **internal:** update comment in script ([b7f1c3e](https://github.com/sst/opencode-sdk-go/commit/b7f1c3e16935c71e243004b8f321d661cd8e9474))
-* lint tests ([616796b](https://github.com/sst/opencode-sdk-go/commit/616796b761704bde6be5c6c2428f28c79c7f05ff))
-* lint tests in subpackages ([50c82ff](https://github.com/sst/opencode-sdk-go/commit/50c82ff0757c973834b68adc22566b70f767b611))
-* sync repo ([2f34d5d](https://github.com/sst/opencode-sdk-go/commit/2f34d5d53e56e9cdc3df99be7ee7efc83dd977a3))
-* update @stainless-api/prism-cli to v5.15.0 ([2f24852](https://github.com/sst/opencode-sdk-go/commit/2f2485216d4f4891d1fbfbc23ff8410c2f35152a))
+- **ci:** only run for pushes and fork pull requests ([bea59b8](https://github.com/sst/opencode-sdk-go/commit/bea59b886800ef555f89c47a9256d6392ed2e53d))
+- **internal:** codegen related update ([6a22ce6](https://github.com/sst/opencode-sdk-go/commit/6a22ce6df155f5003e80b8a75686a9e513a5568a))
+- **internal:** fix lint script for tests ([391c482](https://github.com/sst/opencode-sdk-go/commit/391c482148ed0a77c4ad52807abeb2d540b56797))
+- **internal:** update comment in script ([b7f1c3e](https://github.com/sst/opencode-sdk-go/commit/b7f1c3e16935c71e243004b8f321d661cd8e9474))
+- lint tests ([616796b](https://github.com/sst/opencode-sdk-go/commit/616796b761704bde6be5c6c2428f28c79c7f05ff))
+- lint tests in subpackages ([50c82ff](https://github.com/sst/opencode-sdk-go/commit/50c82ff0757c973834b68adc22566b70f767b611))
+- sync repo ([2f34d5d](https://github.com/sst/opencode-sdk-go/commit/2f34d5d53e56e9cdc3df99be7ee7efc83dd977a3))
+- update @stainless-api/prism-cli to v5.15.0 ([2f24852](https://github.com/sst/opencode-sdk-go/commit/2f2485216d4f4891d1fbfbc23ff8410c2f35152a))

+ 2 - 5
packages/sdk/go/release-please-config.json

@@ -60,8 +60,5 @@
     }
     }
   ],
   ],
   "release-type": "go",
   "release-type": "go",
-  "extra-files": [
-    "internal/version.go",
-    "README.md"
-  ]
-}
+  "extra-files": ["internal/version.go", "README.md"]
+}

+ 1 - 1
packages/sdk/js/script/generate.ts

@@ -14,7 +14,7 @@ await createClient({
   input: "./openapi.json",
   input: "./openapi.json",
   output: {
   output: {
     path: "./src/gen",
     path: "./src/gen",
-    tsConfigPath: path.join(dir, 'tsconfig.json')
+    tsConfigPath: path.join(dir, "tsconfig.json"),
   },
   },
   plugins: [
   plugins: [
     {
     {

+ 1 - 1
packages/sdk/js/src/server.ts

@@ -105,7 +105,7 @@ export function createOpencodeTui(options?: TuiOptions) {
 
 
   const proc = spawn(`opencode`, args, {
   const proc = spawn(`opencode`, args, {
     signal: options?.signal,
     signal: options?.signal,
-    stdio: 'inherit',
+    stdio: "inherit",
     env: {
     env: {
       ...process.env,
       ...process.env,
       OPENCODE_CONFIG_CONTENT: JSON.stringify(options?.config ?? {}),
       OPENCODE_CONFIG_CONTENT: JSON.stringify(options?.config ?? {}),

+ 1 - 1
packages/sdk/js/sst-env.d.ts

@@ -6,4 +6,4 @@
 /// <reference path="../../../sst-env.d.ts" />
 /// <reference path="../../../sst-env.d.ts" />
 
 
 import "sst"
 import "sst"
-export {}
+export {}

+ 3 - 11
packages/sdk/js/tsconfig.json

@@ -6,16 +6,8 @@
     "module": "nodenext",
     "module": "nodenext",
     "declaration": true,
     "declaration": true,
     "moduleResolution": "nodenext",
     "moduleResolution": "nodenext",
-    "lib": [
-      "es2022",
-      "dom",
-      "dom.iterable"
-    ],
-    "customConditions": [
-      "development"
-    ]
+    "lib": ["es2022", "dom", "dom.iterable"],
+    "customConditions": ["development"]
   },
   },
-  "include": [
-    "src"
-  ]
+  "include": ["src"]
 }
 }

+ 215 - 216
packages/tui/internal/theme/themes/vesper.json

@@ -1,219 +1,218 @@
 {
 {
-    "$schema": "https://opencode.ai/theme.json",
-    "defs": {
-      "vesperBg": "#101010",
-      "vesperFg": "#FFF",
-      "vesperComment": "#8b8b8b94",
-      "vesperKeyword": "#A0A0A0",
-      "vesperFunction": "#FFC799",
-      "vesperString": "#99FFE4",
-      "vesperNumber": "#FFC799",
-      "vesperError": "#FF8080",
-      "vesperWarning": "#FFC799",
-      "vesperSuccess": "#99FFE4",
-      "vesperMuted": "#A0A0A0"
-    },
-    "theme": {
-      "primary": {
-        "dark": "#FFC799",
-        "light": "#FFC799"
-      },
-      "secondary": {
-        "dark": "#99FFE4",
-        "light": "#99FFE4"
-      },
-      "accent": {
-        "dark": "#FFC799",
-        "light": "#FFC799"
-      },
-      "error": {
-        "dark": "vesperError",
-        "light": "vesperError"
-      },
-      "warning": {
-        "dark": "vesperWarning",
-        "light": "vesperWarning"
-      },
-      "success": {
-        "dark": "vesperSuccess",
-        "light": "vesperSuccess"
-      },
-      "info": {
-        "dark": "#FFC799",
-        "light": "#FFC799"
-      },
-      "text": {
-        "dark": "vesperFg",
-        "light": "vesperBg"
-      },
-      "textMuted": {
-        "dark": "vesperMuted",
-        "light": "vesperMuted"
-      },
-      "background": {
-        "dark": "vesperBg",
-        "light": "#FFF"
-      },
-      "backgroundPanel": {
-        "dark": "vesperBg",
-        "light": "#F0F0F0"
-      },
-      "backgroundElement": {
-        "dark": "vesperBg",
-        "light": "#E0E0E0"
-      },
-      "border": {
-        "dark": "#282828",
-        "light": "#D0D0D0"
-      },
-      "borderActive": {
-        "dark": "#FFC799",
-        "light": "#FFC799"
-      },
-      "borderSubtle": {
-        "dark": "#1C1C1C",
-        "light": "#E8E8E8"
-      },
-      "diffAdded": {
-        "dark": "vesperSuccess",
-        "light": "vesperSuccess"
-      },
-      "diffRemoved": {
-        "dark": "vesperError",
-        "light": "vesperError"
-      },
-      "diffContext": {
-        "dark": "vesperMuted",
-        "light": "vesperMuted"
-      },
-      "diffHunkHeader": {
-        "dark": "vesperMuted",
-        "light": "vesperMuted"
-      },
-      "diffHighlightAdded": {
-        "dark": "vesperSuccess",
-        "light": "vesperSuccess"
-      },
-      "diffHighlightRemoved": {
-        "dark": "vesperError",
-        "light": "vesperError"
-      },
-      "diffAddedBg": {
-        "dark": "#0d2818",
-        "light": "#e8f5e8"
-      },
-      "diffRemovedBg": {
-        "dark": "#281a1a",
-        "light": "#f5e8e8"
-      },
-      "diffContextBg": {
-        "dark": "vesperBg",
-        "light": "#F8F8F8"
-      },
-      "diffLineNumber": {
-        "dark": "#505050",
-        "light": "#808080"
-      },
-      "diffAddedLineNumberBg": {
-        "dark": "#0d2818",
-        "light": "#e8f5e8"
-      },
-      "diffRemovedLineNumberBg": {
-        "dark": "#281a1a",
-        "light": "#f5e8e8"
-      },
-      "markdownText": {
-        "dark": "vesperFg",
-        "light": "vesperBg"
-      },
-      "markdownHeading": {
-        "dark": "#FFC799",
-        "light": "#FFC799"
-      },
-      "markdownLink": {
-        "dark": "#FFC799",
-        "light": "#FFC799"
-      },
-      "markdownLinkText": {
-        "dark": "vesperMuted",
-        "light": "vesperMuted"
-      },
-      "markdownCode": {
-        "dark": "vesperMuted",
-        "light": "vesperMuted"
-      },
-      "markdownBlockQuote": {
-        "dark": "vesperFg",
-        "light": "vesperBg"
-      },
-      "markdownEmph": {
-        "dark": "vesperFg",
-        "light": "vesperBg"
-      },
-      "markdownStrong": {
-        "dark": "vesperFg",
-        "light": "vesperBg"
-      },
-      "markdownHorizontalRule": {
-        "dark": "#65737E",
-        "light": "#65737E"
-      },
-      "markdownListItem": {
-        "dark": "vesperFg",
-        "light": "vesperBg"
-      },
-      "markdownListEnumeration": {
-        "dark": "vesperFg",
-        "light": "vesperBg"
-      },
-      "markdownImage": {
-        "dark": "#FFC799",
-        "light": "#FFC799"
-      },
-      "markdownImageText": {
-        "dark": "vesperMuted",
-        "light": "vesperMuted"
-      },
-      "markdownCodeBlock": {
-        "dark": "vesperFg",
-        "light": "vesperBg"
-      },
-      "syntaxComment": {
-        "dark": "vesperComment",
-        "light": "vesperComment"
-      },
-      "syntaxKeyword": {
-        "dark": "vesperKeyword",
-        "light": "vesperKeyword"
-      },
-      "syntaxFunction": {
-        "dark": "vesperFunction",
-        "light": "vesperFunction"
-      },
-      "syntaxVariable": {
-        "dark": "vesperFg",
-        "light": "vesperBg"
-      },
-      "syntaxString": {
-        "dark": "vesperString",
-        "light": "vesperString"
-      },
-      "syntaxNumber": {
-        "dark": "vesperNumber",
-        "light": "vesperNumber"
-      },
-      "syntaxType": {
-        "dark": "vesperFunction",
-        "light": "vesperFunction"
-      },
-      "syntaxOperator": {
-        "dark": "vesperKeyword",
-        "light": "vesperKeyword"
-      },
-      "syntaxPunctuation": {
-        "dark": "vesperFg",
-        "light": "vesperBg"
-      }
+  "$schema": "https://opencode.ai/theme.json",
+  "defs": {
+    "vesperBg": "#101010",
+    "vesperFg": "#FFF",
+    "vesperComment": "#8b8b8b94",
+    "vesperKeyword": "#A0A0A0",
+    "vesperFunction": "#FFC799",
+    "vesperString": "#99FFE4",
+    "vesperNumber": "#FFC799",
+    "vesperError": "#FF8080",
+    "vesperWarning": "#FFC799",
+    "vesperSuccess": "#99FFE4",
+    "vesperMuted": "#A0A0A0"
+  },
+  "theme": {
+    "primary": {
+      "dark": "#FFC799",
+      "light": "#FFC799"
+    },
+    "secondary": {
+      "dark": "#99FFE4",
+      "light": "#99FFE4"
+    },
+    "accent": {
+      "dark": "#FFC799",
+      "light": "#FFC799"
+    },
+    "error": {
+      "dark": "vesperError",
+      "light": "vesperError"
+    },
+    "warning": {
+      "dark": "vesperWarning",
+      "light": "vesperWarning"
+    },
+    "success": {
+      "dark": "vesperSuccess",
+      "light": "vesperSuccess"
+    },
+    "info": {
+      "dark": "#FFC799",
+      "light": "#FFC799"
+    },
+    "text": {
+      "dark": "vesperFg",
+      "light": "vesperBg"
+    },
+    "textMuted": {
+      "dark": "vesperMuted",
+      "light": "vesperMuted"
+    },
+    "background": {
+      "dark": "vesperBg",
+      "light": "#FFF"
+    },
+    "backgroundPanel": {
+      "dark": "vesperBg",
+      "light": "#F0F0F0"
+    },
+    "backgroundElement": {
+      "dark": "vesperBg",
+      "light": "#E0E0E0"
+    },
+    "border": {
+      "dark": "#282828",
+      "light": "#D0D0D0"
+    },
+    "borderActive": {
+      "dark": "#FFC799",
+      "light": "#FFC799"
+    },
+    "borderSubtle": {
+      "dark": "#1C1C1C",
+      "light": "#E8E8E8"
+    },
+    "diffAdded": {
+      "dark": "vesperSuccess",
+      "light": "vesperSuccess"
+    },
+    "diffRemoved": {
+      "dark": "vesperError",
+      "light": "vesperError"
+    },
+    "diffContext": {
+      "dark": "vesperMuted",
+      "light": "vesperMuted"
+    },
+    "diffHunkHeader": {
+      "dark": "vesperMuted",
+      "light": "vesperMuted"
+    },
+    "diffHighlightAdded": {
+      "dark": "vesperSuccess",
+      "light": "vesperSuccess"
+    },
+    "diffHighlightRemoved": {
+      "dark": "vesperError",
+      "light": "vesperError"
+    },
+    "diffAddedBg": {
+      "dark": "#0d2818",
+      "light": "#e8f5e8"
+    },
+    "diffRemovedBg": {
+      "dark": "#281a1a",
+      "light": "#f5e8e8"
+    },
+    "diffContextBg": {
+      "dark": "vesperBg",
+      "light": "#F8F8F8"
+    },
+    "diffLineNumber": {
+      "dark": "#505050",
+      "light": "#808080"
+    },
+    "diffAddedLineNumberBg": {
+      "dark": "#0d2818",
+      "light": "#e8f5e8"
+    },
+    "diffRemovedLineNumberBg": {
+      "dark": "#281a1a",
+      "light": "#f5e8e8"
+    },
+    "markdownText": {
+      "dark": "vesperFg",
+      "light": "vesperBg"
+    },
+    "markdownHeading": {
+      "dark": "#FFC799",
+      "light": "#FFC799"
+    },
+    "markdownLink": {
+      "dark": "#FFC799",
+      "light": "#FFC799"
+    },
+    "markdownLinkText": {
+      "dark": "vesperMuted",
+      "light": "vesperMuted"
+    },
+    "markdownCode": {
+      "dark": "vesperMuted",
+      "light": "vesperMuted"
+    },
+    "markdownBlockQuote": {
+      "dark": "vesperFg",
+      "light": "vesperBg"
+    },
+    "markdownEmph": {
+      "dark": "vesperFg",
+      "light": "vesperBg"
+    },
+    "markdownStrong": {
+      "dark": "vesperFg",
+      "light": "vesperBg"
+    },
+    "markdownHorizontalRule": {
+      "dark": "#65737E",
+      "light": "#65737E"
+    },
+    "markdownListItem": {
+      "dark": "vesperFg",
+      "light": "vesperBg"
+    },
+    "markdownListEnumeration": {
+      "dark": "vesperFg",
+      "light": "vesperBg"
+    },
+    "markdownImage": {
+      "dark": "#FFC799",
+      "light": "#FFC799"
+    },
+    "markdownImageText": {
+      "dark": "vesperMuted",
+      "light": "vesperMuted"
+    },
+    "markdownCodeBlock": {
+      "dark": "vesperFg",
+      "light": "vesperBg"
+    },
+    "syntaxComment": {
+      "dark": "vesperComment",
+      "light": "vesperComment"
+    },
+    "syntaxKeyword": {
+      "dark": "vesperKeyword",
+      "light": "vesperKeyword"
+    },
+    "syntaxFunction": {
+      "dark": "vesperFunction",
+      "light": "vesperFunction"
+    },
+    "syntaxVariable": {
+      "dark": "vesperFg",
+      "light": "vesperBg"
+    },
+    "syntaxString": {
+      "dark": "vesperString",
+      "light": "vesperString"
+    },
+    "syntaxNumber": {
+      "dark": "vesperNumber",
+      "light": "vesperNumber"
+    },
+    "syntaxType": {
+      "dark": "vesperFunction",
+      "light": "vesperFunction"
+    },
+    "syntaxOperator": {
+      "dark": "vesperKeyword",
+      "light": "vesperKeyword"
+    },
+    "syntaxPunctuation": {
+      "dark": "vesperFg",
+      "light": "vesperBg"
     }
     }
   }
   }
-  
+}

+ 2 - 6
packages/web/config.mjs

@@ -1,12 +1,8 @@
 const stage = process.env.SST_STAGE || "dev"
 const stage = process.env.SST_STAGE || "dev"
 
 
 export default {
 export default {
-  url: stage === "production"
-    ? "https://opencode.ai"
-    : `https://${stage}.opencode.ai`,
-  console: stage === "production"
-    ? "https://opencode.ai/auth"
-    : `https://${stage}.opencode.ai/auth`,
+  url: stage === "production" ? "https://opencode.ai" : `https://${stage}.opencode.ai`,
+  console: stage === "production" ? "https://opencode.ai/auth" : `https://${stage}.opencode.ai/auth`,
   email: "[email protected]",
   email: "[email protected]",
   socialCard: "https://social-cards.sst.dev",
   socialCard: "https://social-cards.sst.dev",
   github: "https://github.com/sst/opencode",
   github: "https://github.com/sst/opencode",

+ 8 - 7
packages/web/src/components/Share.tsx

@@ -37,11 +37,7 @@ function getStatusText(status: [Status, string?]): string {
   }
   }
 }
 }
 
 
-export default function Share(props: {
-  id: string
-  api: string
-  info: Session.Info
-}) {
+export default function Share(props: { id: string; api: string; info: Session.Info }) {
   let lastScrollY = 0
   let lastScrollY = 0
   let hasScrolledToAnchor = false
   let hasScrolledToAnchor = false
   let scrollTimeout: number | undefined
   let scrollTimeout: number | undefined
@@ -67,7 +63,8 @@ export default function Share(props: {
         created: props.info.time.created,
         created: props.info.time.created,
         updated: props.info.time.updated,
         updated: props.info.time.updated,
       },
       },
-    }, messages: {}
+    },
+    messages: {},
   })
   })
   const messages = createMemo(() => Object.values(store.messages).toSorted((a, b) => a.id?.localeCompare(b.id)))
   const messages = createMemo(() => Object.values(store.messages).toSorted((a, b) => a.id?.localeCompare(b.id)))
   const [connectionStatus, setConnectionStatus] = createSignal<[Status, string?]>(["disconnected", "Disconnected"])
   const [connectionStatus, setConnectionStatus] = createSignal<[Status, string?]>(["disconnected", "Disconnected"])
@@ -413,7 +410,11 @@ export default function Share(props: {
                     </li>
                     </li>
                     <li>
                     <li>
                       <span data-element-label>Output Tokens</span>
                       <span data-element-label>Output Tokens</span>
-                      {data().tokens.output ? <span>{data().tokens.output}</span> : <span data-placeholder>&mdash;</span>}
+                      {data().tokens.output ? (
+                        <span>{data().tokens.output}</span>
+                      ) : (
+                        <span data-placeholder>&mdash;</span>
+                      )}
                     </li>
                     </li>
                     <li>
                     <li>
                       <span data-element-label>Reasoning Tokens</span>
                       <span data-element-label>Reasoning Tokens</span>

+ 0 - 1
packages/web/src/components/share/content-diff.module.css

@@ -90,7 +90,6 @@
   }
   }
 
 
   [data-component="mobile"] {
   [data-component="mobile"] {
-
     & > [data-component="diff-block"]:first-child > div {
     & > [data-component="diff-block"]:first-child > div {
       padding-top: 0.25rem;
       padding-top: 0.25rem;
     }
     }

+ 0 - 1
packages/web/src/components/share/content-error.module.css

@@ -61,5 +61,4 @@
     padding: 2px 0;
     padding: 2px 0;
     font-size: 0.75rem;
     font-size: 0.75rem;
   }
   }
-
 }
 }

+ 2 - 9
packages/web/src/components/share/content-error.tsx

@@ -10,19 +10,12 @@ export function ContentError(props: Props) {
   const overflow = createOverflow()
   const overflow = createOverflow()
 
 
   return (
   return (
-    <div
-      class={style.root}
-      data-expanded={expanded() || props.expand === true ? true : undefined}
-    >
+    <div class={style.root} data-expanded={expanded() || props.expand === true ? true : undefined}>
       <div data-section="content" ref={overflow.ref}>
       <div data-section="content" ref={overflow.ref}>
         {props.children}
         {props.children}
       </div>
       </div>
       {((!props.expand && overflow.status) || expanded()) && (
       {((!props.expand && overflow.status) || expanded()) && (
-        <button
-          type="button"
-          data-element-button-text
-          onClick={() => setExpanded((e) => !e)}
-        >
+        <button type="button" data-element-button-text onClick={() => setExpanded((e) => !e)}>
           {expanded() ? "Show less" : "Show more"}
           {expanded() ? "Show less" : "Show more"}
         </button>
         </button>
       )}
       )}

+ 3 - 11
packages/web/src/components/share/copy-button.tsx

@@ -11,8 +11,7 @@ export function CopyButton(props: CopyButtonProps) {
 
 
   function handleCopyClick() {
   function handleCopyClick() {
     if (props.text) {
     if (props.text) {
-      navigator.clipboard.writeText(props.text)
-        .catch((err) => console.error("Copy failed", err))
+      navigator.clipboard.writeText(props.text).catch((err) => console.error("Copy failed", err))
 
 
       setCopied(true)
       setCopied(true)
       setTimeout(() => setCopied(false), 2000)
       setTimeout(() => setCopied(false), 2000)
@@ -21,15 +20,8 @@ export function CopyButton(props: CopyButtonProps) {
 
 
   return (
   return (
     <div data-component="copy-button" class={styles.root}>
     <div data-component="copy-button" class={styles.root}>
-      <button
-        type="button"
-        onClick={handleCopyClick}
-        data-copied={copied() ? true : undefined}
-      >
-        {copied()
-          ? <IconCheckCircle width={16} height={16} />
-          : <IconClipboard width={16} height={16} />
-        }
+      <button type="button" onClick={handleCopyClick} data-copied={copied() ? true : undefined}>
+        {copied() ? <IconCheckCircle width={16} height={16} /> : <IconClipboard width={16} height={16} />}
       </button>
       </button>
     </div>
     </div>
   )
   )

+ 22 - 30
packages/web/src/components/share/part.tsx

@@ -168,32 +168,25 @@ export function Part(props: PartProps) {
             </Show>
             </Show>
           </div>
           </div>
         )}
         )}
-        {
-          props.message.role === "user" && props.part.type === "file" && (
-            <div data-component="attachment">
-              <div data-slot="copy">Attachment</div>
-              <div data-slot="filename">{props.part.filename}</div>
-            </div>
-          )
-        }
-        {
-          props.part.type === "step-start" && props.message.role === "assistant" && (
-            <div data-component="step-start">
-              <div data-slot="provider">{props.message.providerID}</div>
-              <div data-slot="model">{props.message.modelID}</div>
-            </div>
-          )
-        }
-        {
-          props.part.type === "tool" && props.part.state.status === "error" && (
-            <div data-component="tool" data-tool="error">
-              <ContentError>{formatErrorString(props.part.state.error)}</ContentError>
-              <Spacer />
-            </div>
-          )
-        }
-        {
-          props.part.type === "tool" &&
+        {props.message.role === "user" && props.part.type === "file" && (
+          <div data-component="attachment">
+            <div data-slot="copy">Attachment</div>
+            <div data-slot="filename">{props.part.filename}</div>
+          </div>
+        )}
+        {props.part.type === "step-start" && props.message.role === "assistant" && (
+          <div data-component="step-start">
+            <div data-slot="provider">{props.message.providerID}</div>
+            <div data-slot="model">{props.message.modelID}</div>
+          </div>
+        )}
+        {props.part.type === "tool" && props.part.state.status === "error" && (
+          <div data-component="tool" data-tool="error">
+            <ContentError>{formatErrorString(props.part.state.error)}</ContentError>
+            <Spacer />
+          </div>
+        )}
+        {props.part.type === "tool" &&
           props.part.state.status === "completed" &&
           props.part.state.status === "completed" &&
           props.message.role === "assistant" && (
           props.message.role === "assistant" && (
             <>
             <>
@@ -295,10 +288,9 @@ export function Part(props: PartProps) {
                   .toMillis()}
                   .toMillis()}
               />
               />
             </>
             </>
-          )
-        }
-      </div >
-    </div >
+          )}
+      </div>
+    </div>
   )
   )
 }
 }
 
 

+ 0 - 2
packages/web/src/content/docs/cli.mdx

@@ -17,8 +17,6 @@ But it also accepts commands as documented on this page. This allows you to inte
 opencode run "Explain how closures work in JavaScript"
 opencode run "Explain how closures work in JavaScript"
 ```
 ```
 
 
-
-
 ---
 ---
 
 
 ## Commands
 ## Commands

+ 1 - 1
packages/web/src/content/docs/commands.mdx

@@ -62,7 +62,7 @@ Use the `command` option in your opencode [config](/docs/config):
       "description": "Run tests with coverage",
       "description": "Run tests with coverage",
       "agent": "build",
       "agent": "build",
       "model": "anthropic/claude-3-5-sonnet-20241022"
       "model": "anthropic/claude-3-5-sonnet-20241022"
-    },
+    }
   }
   }
 }
 }
 ```
 ```

+ 4 - 4
packages/web/src/content/docs/config.mdx

@@ -164,13 +164,13 @@ You can configure custom commands for repetitive tasks through the `command` opt
       "template": "Run the full test suite with coverage report and show any failures.\nFocus on the failing tests and suggest fixes.",
       "template": "Run the full test suite with coverage report and show any failures.\nFocus on the failing tests and suggest fixes.",
       "description": "Run tests with coverage",
       "description": "Run tests with coverage",
       "agent": "build",
       "agent": "build",
-      "model": "anthropic/claude-3-5-sonnet-20241022"
+      "model": "anthropic/claude-3-5-sonnet-20241022",
     },
     },
     "component": {
     "component": {
       "template": "Create a new React component named $ARGUMENTS with TypeScript support.\nInclude proper typing and basic structure.",
       "template": "Create a new React component named $ARGUMENTS with TypeScript support.\nInclude proper typing and basic structure.",
-      "description": "Create a new component"
-    }
-  }
+      "description": "Create a new component",
+    },
+  },
 }
 }
 ```
 ```
 
 

+ 14 - 14
packages/web/src/content/docs/formatters.mdx

@@ -11,19 +11,19 @@ opencode automatically formats files after they are written or edited using lang
 
 
 opencode comes with several built-in formatters for popular languages and frameworks. Below is a list of the formatters, supported file extensions, and commands or config options it needs.
 opencode comes with several built-in formatters for popular languages and frameworks. Below is a list of the formatters, supported file extensions, and commands or config options it needs.
 
 
-| Formatter      | Extensions                                                                                     | Requirements                          |
-| -------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------------- |
-| gofmt          | .go                                                                                                      | `gofmt` command available             |
-| mix            | .ex, .exs, .eex, .heex, .leex, .neex, .sface                                                             | `mix` command available               |
+| Formatter      | Extensions                                                                                               | Requirements                            |
+| -------------- | -------------------------------------------------------------------------------------------------------- | --------------------------------------- |
+| gofmt          | .go                                                                                                      | `gofmt` command available               |
+| mix            | .ex, .exs, .eex, .heex, .leex, .neex, .sface                                                             | `mix` command available                 |
 | prettier       | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml, and [more](https://prettier.io/docs/en/index.html) | `prettier` dependency in `package.json` |
 | prettier       | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml, and [more](https://prettier.io/docs/en/index.html) | `prettier` dependency in `package.json` |
-| biome          | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml, and [more](https://biomejs.dev/)                   | `biome.json(c)` config file           |
-| zig            | .zig, .zon                                                                                               | `zig` command available               |
-| clang-format   | .c, .cpp, .h, .hpp, .ino, and [more](https://clang.llvm.org/docs/ClangFormat.html)                       | `.clang-format` config file           |
-| ktlint         | .kt, .kts                                                                                                | `ktlint` command available            |
-| ruff           | .py, .pyi                                                                                                | `ruff` command available with config  |
-| rubocop        | .rb, .rake, .gemspec, .ru                                                                                | `rubocop` command available           |
-| standardrb     | .rb, .rake, .gemspec, .ru                                                                                | `standardrb` command available        |
-| htmlbeautifier | .erb, .html.erb                                                                                          | `htmlbeautifier` command available    |
+| biome          | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml, and [more](https://biomejs.dev/)                   | `biome.json(c)` config file             |
+| zig            | .zig, .zon                                                                                               | `zig` command available                 |
+| clang-format   | .c, .cpp, .h, .hpp, .ino, and [more](https://clang.llvm.org/docs/ClangFormat.html)                       | `.clang-format` config file             |
+| ktlint         | .kt, .kts                                                                                                | `ktlint` command available              |
+| ruff           | .py, .pyi                                                                                                | `ruff` command available with config    |
+| rubocop        | .rb, .rake, .gemspec, .ru                                                                                | `rubocop` command available             |
+| standardrb     | .rb, .rake, .gemspec, .ru                                                                                | `standardrb` command available          |
+| htmlbeautifier | .erb, .html.erb                                                                                          | `htmlbeautifier` command available      |
 
 
 So if your project has `prettier` in your `package.json`, opencode will automatically use it.
 So if your project has `prettier` in your `package.json`, opencode will automatically use it.
 
 
@@ -48,7 +48,7 @@ You can customize formatters through the `formatter` section in your opencode co
 ```json title="opencode.json"
 ```json title="opencode.json"
 {
 {
   "$schema": "https://opencode.ai/config.json",
   "$schema": "https://opencode.ai/config.json",
-  "formatter": { }
+  "formatter": {}
 }
 }
 ```
 ```
 
 
@@ -56,7 +56,7 @@ Each formatter configuration supports the following:
 
 
 | Property      | Type     | Description                                             |
 | Property      | Type     | Description                                             |
 | ------------- | -------- | ------------------------------------------------------- |
 | ------------- | -------- | ------------------------------------------------------- |
-| `disabled`    | boolean  | Set this to `true` to disable the formatter                  |
+| `disabled`    | boolean  | Set this to `true` to disable the formatter             |
 | `command`     | string[] | The command to run for formatting                       |
 | `command`     | string[] | The command to run for formatting                       |
 | `environment` | object   | Environment variables to set when running the formatter |
 | `environment` | object   | Environment variables to set when running the formatter |
 | `extensions`  | string[] | File extensions this formatter should handle            |
 | `extensions`  | string[] | File extensions this formatter should handle            |

+ 5 - 5
packages/web/src/content/docs/gitlab.mdx

@@ -33,7 +33,7 @@ Check out the [**GitLab docs**](https://docs.gitlab.com/user/duo_agent_platform/
 6. Create a flow config file, here's an example:
 6. Create a flow config file, here's an example:
 
 
    <details>
    <details>
-     <summary>Flow configuration</summary>
+  <summary>Flow configuration</summary>
 
 
    ```yaml
    ```yaml
    image: node:22-slim
    image: node:22-slim
@@ -67,17 +67,17 @@ Check out the [**GitLab docs**](https://docs.gitlab.com/user/duo_agent_platform/
      - |
      - |
        opencode run "
        opencode run "
        You are an AI assistant helping with GitLab operations.
        You are an AI assistant helping with GitLab operations.
-   
+
        Context: $AI_FLOW_CONTEXT
        Context: $AI_FLOW_CONTEXT
        Task: $AI_FLOW_INPUT
        Task: $AI_FLOW_INPUT
        Event: $AI_FLOW_EVENT
        Event: $AI_FLOW_EVENT
-   
+
        Please execute the requested task using the available GitLab tools.
        Please execute the requested task using the available GitLab tools.
        Be thorough in your analysis and provide clear explanations.
        Be thorough in your analysis and provide clear explanations.
-   
+
        <important>
        <important>
        Please use the glab CLI to access data from GitLab. The glab CLI has already been authenticated. You can run the corresponding commands.
        Please use the glab CLI to access data from GitLab. The glab CLI has already been authenticated. You can run the corresponding commands.
-   
+
        If you are asked to summarise an MR or issue or asked to provide more information then please post back a note to the MR/Issue so that the user can see it.
        If you are asked to summarise an MR or issue or asked to provide more information then please post back a note to the MR/Issue so that the user can see it.
        You don't need to commit or push up changes, those will be done automatically based on the file changes you make.
        You don't need to commit or push up changes, those will be done automatically based on the file changes you make.
        </important>
        </important>

+ 4 - 20
packages/web/src/content/docs/index.mdx

@@ -41,26 +41,10 @@ You can also install it with the following:
 - **Using Node.js**
 - **Using Node.js**
 
 
   <Tabs>
   <Tabs>
-    <TabItem label="npm">
-    ```bash
-    npm install -g opencode-ai
-    ```
-    </TabItem>
-    <TabItem label="Bun">
-    ```bash
-    bun install -g opencode-ai
-    ```
-    </TabItem>
-    <TabItem label="pnpm">
-    ```bash
-    pnpm install -g opencode-ai
-    ```
-    </TabItem>
-    <TabItem label="Yarn">
-    ```bash 
-    yarn global add opencode-ai
-    ```
-    </TabItem>
+    <TabItem label="npm">```bash npm install -g opencode-ai ```</TabItem>
+    <TabItem label="Bun">```bash bun install -g opencode-ai ```</TabItem>
+    <TabItem label="pnpm">```bash pnpm install -g opencode-ai ```</TabItem>
+    <TabItem label="Yarn">```bash yarn global add opencode-ai ```</TabItem>
   </Tabs>
   </Tabs>
 
 
 - **Using Homebrew on macOS and Linux**
 - **Using Homebrew on macOS and Linux**

+ 7 - 7
packages/web/src/content/docs/server.mdx

@@ -79,9 +79,9 @@ The opencode server exposes the following APIs.
 
 
 ### Config
 ### Config
 
 
-| Method | Path                | Description                       | Response                                                                                              |
-| ------ | ------------------- | --------------------------------- | ----------------------------------------------------------------------------------------------------- |
-| `GET`  | `/config`           | Get config info                   | <a href={typesUrl}><code>Config</code></a>                                                            |
+| Method | Path                | Description                       | Response                                                                                 |
+| ------ | ------------------- | --------------------------------- | ---------------------------------------------------------------------------------------- |
+| `GET`  | `/config`           | Get config info                   | <a href={typesUrl}><code>Config</code></a>                                               |
 | `GET`  | `/config/providers` | List providers and default models | `{ providers: `<a href={typesUrl}>Provider[]</a>`, default: { [key: string]: string } }` |
 | `GET`  | `/config/providers` | List providers and default models | `{ providers: `<a href={typesUrl}>Provider[]</a>`, default: { [key: string]: string } }` |
 
 
 ---
 ---
@@ -101,8 +101,8 @@ The opencode server exposes the following APIs.
 | `POST`   | `/session/:id/share`                     | Share session                      | Returns <a href={typesUrl}><code>Session</code></a>                                                                                                                        |
 | `POST`   | `/session/:id/share`                     | Share session                      | Returns <a href={typesUrl}><code>Session</code></a>                                                                                                                        |
 | `DELETE` | `/session/:id/share`                     | Unshare session                    | Returns <a href={typesUrl}><code>Session</code></a>                                                                                                                        |
 | `DELETE` | `/session/:id/share`                     | Unshare session                    | Returns <a href={typesUrl}><code>Session</code></a>                                                                                                                        |
 | `POST`   | `/session/:id/summarize`                 | Summarize session                  |                                                                                                                                                                            |
 | `POST`   | `/session/:id/summarize`                 | Summarize session                  |                                                                                                                                                                            |
-| `GET`    | `/session/:id/message`                   | List messages in a session         | Returns `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}[]`                                                    |
-| `GET`    | `/session/:id/message/:messageID`        | Get message details                | Returns `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}`                                                      |
+| `GET`    | `/session/:id/message`                   | List messages in a session         | Returns `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}[]`                                                                              |
+| `GET`    | `/session/:id/message/:messageID`        | Get message details                | Returns `{ info: `<a href={typesUrl}>Message</a>`, parts: `<a href={typesUrl}>Part[]</a>`}`                                                                                |
 | `POST`   | `/session/:id/message`                   | Send chat message                  | body matches [`ChatInput`](https://github.com/sst/opencode/blob/main/packages/opencode/src/session/index.ts#L358), returns <a href={typesUrl}><code>Message</code></a>     |
 | `POST`   | `/session/:id/message`                   | Send chat message                  | body matches [`ChatInput`](https://github.com/sst/opencode/blob/main/packages/opencode/src/session/index.ts#L358), returns <a href={typesUrl}><code>Message</code></a>     |
 | `POST`   | `/session/:id/shell`                     | Run a shell command                | body matches [`CommandInput`](https://github.com/sst/opencode/blob/main/packages/opencode/src/session/index.ts#L1007), returns <a href={typesUrl}><code>Message</code></a> |
 | `POST`   | `/session/:id/shell`                     | Run a shell command                | body matches [`CommandInput`](https://github.com/sst/opencode/blob/main/packages/opencode/src/session/index.ts#L1007), returns <a href={typesUrl}><code>Message</code></a> |
 | `POST`   | `/session/:id/revert`                    | Revert a message                   | body: `{ messageID }`                                                                                                                                                      |
 | `POST`   | `/session/:id/revert`                    | Revert a message                   | body: `{ messageID }`                                                                                                                                                      |
@@ -175,6 +175,6 @@ The opencode server exposes the following APIs.
 
 
 ### Docs
 ### Docs
 
 
-| Method | Path   | Description                            | Response                                   |
-| ------ | ------ | -------------------------------------- | ------------------------------------------ |
+| Method | Path   | Description               | Response                    |
+| ------ | ------ | ------------------------- | --------------------------- |
 | `GET`  | `/doc` | OpenAPI 3.1 specification | HTML page with OpenAPI spec |
 | `GET`  | `/doc` | OpenAPI 3.1 specification | HTML page with OpenAPI spec |

+ 3 - 0
packages/web/src/content/docs/tui.mdx

@@ -272,6 +272,7 @@ Both the `/editor` and `/export` commands use the editor specified in your `EDIT
 
 
     To make it permanent, add this to your shell profile;
     To make it permanent, add this to your shell profile;
     `~/.bashrc`, `~/.zshrc`, etc.
     `~/.bashrc`, `~/.zshrc`, etc.
+
   </TabItem>
   </TabItem>
 
 
   <TabItem label="Windows (CMD)">
   <TabItem label="Windows (CMD)">
@@ -284,6 +285,7 @@ Both the `/editor` and `/export` commands use the editor specified in your `EDIT
 
 
     To make it permanent, use **System Properties** > **Environment
     To make it permanent, use **System Properties** > **Environment
     Variables**.
     Variables**.
+
   </TabItem>
   </TabItem>
 
 
   <TabItem label="Windows (PowerShell)">
   <TabItem label="Windows (PowerShell)">
@@ -295,6 +297,7 @@ Both the `/editor` and `/export` commands use the editor specified in your `EDIT
     ```
     ```
 
 
     To make it permanent, add this to your PowerShell profile.
     To make it permanent, add this to your PowerShell profile.
+
   </TabItem>
   </TabItem>
 </Tabs>
 </Tabs>
 
 

+ 6 - 6
packages/web/src/content/docs/zen.mdx

@@ -73,11 +73,11 @@ We created opencode zen to:
 Below are the models that we currently support and their prices **per 1M
 Below are the models that we currently support and their prices **per 1M
 tokens**.
 tokens**.
 
 
-| Model | Input | Output |
-| ----- | ----- | ------ |
-| Qwen3 Coder 480B | $0.38 | $0.50 |
-| Grok Code Fast 1 | Free | Free |
-| Sonnet 4 | Soon | Soon |
+| Model            | Input | Output |
+| ---------------- | ----- | ------ |
+| Qwen3 Coder 480B | $0.38 | $0.50  |
+| Grok Code Fast 1 | Free  | Free   |
+| Sonnet 4         | Soon  | Soon   |
 
 
 :::note
 :::note
 We add a small markup to cover our costs.
 We add a small markup to cover our costs.
@@ -86,7 +86,7 @@ We add a small markup to cover our costs.
 A couple of notes:
 A couple of notes:
 
 
 - These are the raw prices based on the provider we are using internally. We
 - These are the raw prices based on the provider we are using internally. We
-charge a small markup on top of this to cover our processing fees.
+  charge a small markup on top of this to cover our processing fees.
 - Grok Code Fast 1 is currently free on opencode till Sep 10th. The xAI team is
 - Grok Code Fast 1 is currently free on opencode till Sep 10th. The xAI team is
   using this time to collect feedback and improve Grok Code.
   using this time to collect feedback and improve Grok Code.
 
 

+ 1 - 1
packages/web/sst-env.d.ts

@@ -6,4 +6,4 @@
 /// <reference path="../../sst-env.d.ts" />
 /// <reference path="../../sst-env.d.ts" />
 
 
 import "sst"
 import "sst"
-export {}
+export {}

+ 3 - 3
sdks/vscode/.vscode-test.mjs

@@ -1,5 +1,5 @@
-import { defineConfig } from '@vscode/test-cli';
+import { defineConfig } from "@vscode/test-cli"
 
 
 export default defineConfig({
 export default defineConfig({
-	files: 'out/test/**/*.test.js',
-});
+  files: "out/test/**/*.test.js",
+})

+ 43 - 45
sdks/vscode/esbuild.js

@@ -1,56 +1,54 @@
-const esbuild = require("esbuild");
+const esbuild = require("esbuild")
 
 
-const production = process.argv.includes('--production');
-const watch = process.argv.includes('--watch');
+const production = process.argv.includes("--production")
+const watch = process.argv.includes("--watch")
 
 
 /**
 /**
  * @type {import('esbuild').Plugin}
  * @type {import('esbuild').Plugin}
  */
  */
 const esbuildProblemMatcherPlugin = {
 const esbuildProblemMatcherPlugin = {
-	name: 'esbuild-problem-matcher',
+  name: "esbuild-problem-matcher",
 
 
-	setup(build) {
-		build.onStart(() => {
-			console.log('[watch] build started');
-		});
-		build.onEnd((result) => {
-			result.errors.forEach(({ text, location }) => {
-				console.error(`✘ [ERROR] ${text}`);
-				console.error(`    ${location.file}:${location.line}:${location.column}:`);
-			});
-			console.log('[watch] build finished');
-		});
-	},
-};
+  setup(build) {
+    build.onStart(() => {
+      console.log("[watch] build started")
+    })
+    build.onEnd((result) => {
+      result.errors.forEach(({ text, location }) => {
+        console.error(`✘ [ERROR] ${text}`)
+        console.error(`    ${location.file}:${location.line}:${location.column}:`)
+      })
+      console.log("[watch] build finished")
+    })
+  },
+}
 
 
 async function main() {
 async function main() {
-	const ctx = await esbuild.context({
-		entryPoints: [
-			'src/extension.ts'
-		],
-		bundle: true,
-		format: 'cjs',
-		minify: production,
-		sourcemap: !production,
-		sourcesContent: false,
-		platform: 'node',
-		outfile: 'dist/extension.js',
-		external: ['vscode'],
-		logLevel: 'silent',
-		plugins: [
-			/* add to the end of plugins array */
-			esbuildProblemMatcherPlugin,
-		],
-	});
-	if (watch) {
-		await ctx.watch();
-	} else {
-		await ctx.rebuild();
-		await ctx.dispose();
-	}
+  const ctx = await esbuild.context({
+    entryPoints: ["src/extension.ts"],
+    bundle: true,
+    format: "cjs",
+    minify: production,
+    sourcemap: !production,
+    sourcesContent: false,
+    platform: "node",
+    outfile: "dist/extension.js",
+    external: ["vscode"],
+    logLevel: "silent",
+    plugins: [
+      /* add to the end of plugins array */
+      esbuildProblemMatcherPlugin,
+    ],
+  })
+  if (watch) {
+    await ctx.watch()
+  } else {
+    await ctx.rebuild()
+    await ctx.dispose()
+  }
 }
 }
 
 
-main().catch(e => {
-	console.error(e);
-	process.exit(1);
-});
+main().catch((e) => {
+  console.error(e)
+  process.exit(1)
+})

+ 23 - 17
sdks/vscode/eslint.config.mjs

@@ -1,28 +1,34 @@
-import typescriptEslint from "@typescript-eslint/eslint-plugin";
-import tsParser from "@typescript-eslint/parser";
+import typescriptEslint from "@typescript-eslint/eslint-plugin"
+import tsParser from "@typescript-eslint/parser"
 
 
-export default [{
+export default [
+  {
     files: ["**/*.ts"],
     files: ["**/*.ts"],
-}, {
+  },
+  {
     plugins: {
     plugins: {
-        "@typescript-eslint": typescriptEslint,
+      "@typescript-eslint": typescriptEslint,
     },
     },
 
 
     languageOptions: {
     languageOptions: {
-        parser: tsParser,
-        ecmaVersion: 2022,
-        sourceType: "module",
+      parser: tsParser,
+      ecmaVersion: 2022,
+      sourceType: "module",
     },
     },
 
 
     rules: {
     rules: {
-        "@typescript-eslint/naming-convention": ["warn", {
-            selector: "import",
-            format: ["camelCase", "PascalCase"],
-        }],
+      "@typescript-eslint/naming-convention": [
+        "warn",
+        {
+          selector: "import",
+          format: ["camelCase", "PascalCase"],
+        },
+      ],
 
 
-        curly: "warn",
-        eqeqeq: "warn",
-        "no-throw-literal": "warn",
-        semi: "warn",
+      curly: "warn",
+      eqeqeq: "warn",
+      "no-throw-literal": "warn",
+      semi: "warn",
     },
     },
-}];
+  },
+]

+ 1 - 1
sdks/vscode/sst-env.d.ts

@@ -6,4 +6,4 @@
 /// <reference path="../../sst-env.d.ts" />
 /// <reference path="../../sst-env.d.ts" />
 
 
 import "sst"
 import "sst"
-export {}
+export {}

+ 66 - 66
sst-env.d.ts

@@ -5,95 +5,95 @@
 
 
 declare module "sst" {
 declare module "sst" {
   export interface Resource {
   export interface Resource {
-    "ANTHROPIC_API_KEY": {
-      "type": "sst.sst.Secret"
-      "value": string
+    ANTHROPIC_API_KEY: {
+      type: "sst.sst.Secret"
+      value: string
     }
     }
-    "AUTH_API_URL": {
-      "type": "sst.sst.Linkable"
-      "value": string
+    AUTH_API_URL: {
+      type: "sst.sst.Linkable"
+      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": {
-      "type": "sst.cloudflare.Kv"
+    AuthStorage: {
+      type: "sst.cloudflare.Kv"
     }
     }
-    "BASETEN_API_KEY": {
-      "type": "sst.sst.Secret"
-      "value": string
+    BASETEN_API_KEY: {
+      type: "sst.sst.Secret"
+      value: string
     }
     }
-    "Bucket": {
-      "name": string
-      "type": "sst.cloudflare.Bucket"
+    Bucket: {
+      name: string
+      type: "sst.cloudflare.Bucket"
     }
     }
-    "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
     }
     }
-    "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
     }
     }
-    "LogProcessor": {
-      "type": "sst.cloudflare.Worker"
+    LogProcessor: {
+      type: "sst.cloudflare.Worker"
     }
     }
-    "OPENAI_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_SECRET_KEY: {
+      type: "sst.sst.Secret"
+      value: string
     }
     }
-    "STRIPE_WEBHOOK_SECRET": {
-      "type": "sst.sst.Linkable"
-      "value": string
+    STRIPE_WEBHOOK_SECRET: {
+      type: "sst.sst.Linkable"
+      value: string
     }
     }
-    "Web": {
-      "type": "sst.cloudflare.Astro"
-      "url": string
+    Web: {
+      type: "sst.cloudflare.Astro"
+      url: string
     }
     }
-    "XAI_API_KEY": {
-      "type": "sst.sst.Secret"
-      "value": string
+    XAI_API_KEY: {
+      type: "sst.sst.Secret"
+      value: string
     }
     }
   }
   }
 }
 }
 /// <reference path="sst-env.d.ts" />
 /// <reference path="sst-env.d.ts" />
 
 
 import "sst"
 import "sst"
-export {}
+export {}

+ 1 - 3
tsconfig.json

@@ -2,8 +2,6 @@
   "$schema": "https://json.schemastore.org/tsconfig",
   "$schema": "https://json.schemastore.org/tsconfig",
   "extends": "@tsconfig/bun/tsconfig.json",
   "extends": "@tsconfig/bun/tsconfig.json",
   "compilerOptions": {
   "compilerOptions": {
-    "customConditions": [
-      "development"
-    ],
+    "customConditions": ["development"]
   }
   }
 }
 }