2
0
Dax Raad 7 сар өмнө
parent
commit
38e8c42cf0
68 өөрчлөгдсөн 965 нэмэгдсэн , 1062 устгасан
  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:
   release:
-    types: [published]   # fires only when a release is published
+    types: [published] # fires only when a release is published
 
 jobs:
   notify:

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

@@ -24,4 +24,4 @@ jobs:
         env:
           OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }}
         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() {
   return (
     <Router
       explicitLinks={true}
-      root={props => (
+      root={(props) => (
         <MetaProvider>
           <Title>opencode</Title>
           <Meta name="description" content="opencode - The AI coding agent built for the terminal." />
@@ -19,5 +19,5 @@ export default function App() {
     >
       <FileRoutes />
     </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="M248.5 0H224.5V41.5H248.5V33H232.5V8.5H248.5V0Z" 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="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 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" />
     </svg>
-  );
+  )
 }
 
 export function IconCopy(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
   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>
   )
 }
 
 export function IconCheck(props: JSX.SvgSVGAttributes<SVGSVGElement>) {
   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>
   )
 }

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

@@ -1,4 +1,4 @@
 // @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
 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">
           <div data-slot="left">
-            <a href="/docs">
-              Get Started
-            </a>
+            <a href="/docs">Get Started</a>
           </div>
           <div data-slot="right">
             <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
             </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>
               <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 { IconLogo } from "../component/icon"
 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 { Actor } from "@opencode/cloud-core/actor.js"
 import { getRequestEvent } from "solid-js/web"

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

@@ -1,15 +1,7 @@
 import "./[id].css"
 import { Billing } from "@opencode/cloud-core/billing.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 { withActor } from "~/context/auth.withActor"
 import { IconCopy, IconCheck } from "~/component/icon"
@@ -432,50 +424,57 @@ function PaymentsSection() {
   const payments = createAsync(() => getPaymentsInfo(params.id))
   // 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 (
     <div data-page="workspace-[id]">
       <section data-component="title-section">
         <h1>Zen</h1>
         <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>
       </section>
 

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

@@ -14,6 +14,7 @@ body {
   --font-size-8xl: 6rem;
   --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);
 }

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

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

+ 2 - 6
cloud/app/tsconfig.json

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

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

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

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

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

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

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

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

@@ -1,9 +1,6 @@
 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 parsed = schema.parse(input)
     return cb(parsed)

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

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

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

@@ -6,87 +6,87 @@
 import "sst"
 declare module "sst" {
   export interface Resource {
-    "ANTHROPIC_API_KEY": {
-      "type": "sst.sst.Secret"
-      "value": string
-    }
-    "AUTH_API_URL": {
-      "type": "sst.sst.Linkable"
-      "value": string
-    }
-    "BASETEN_API_KEY": {
-      "type": "sst.sst.Secret"
-      "value": string
-    }
-    "Console": {
-      "type": "sst.cloudflare.SolidStart"
-      "url": string
-    }
-    "Database": {
-      "database": string
-      "host": string
-      "password": string
-      "port": number
-      "type": "sst.sst.Linkable"
-      "username": string
-    }
-    "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" {
   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"
-export {}
+export {}

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

@@ -6,87 +6,87 @@
 import "sst"
 declare module "sst" {
   export interface Resource {
-    "ANTHROPIC_API_KEY": {
-      "type": "sst.sst.Secret"
-      "value": string
-    }
-    "AUTH_API_URL": {
-      "type": "sst.sst.Linkable"
-      "value": string
-    }
-    "BASETEN_API_KEY": {
-      "type": "sst.sst.Secret"
-      "value": string
-    }
-    "Console": {
-      "type": "sst.cloudflare.SolidStart"
-      "url": string
-    }
-    "Database": {
-      "database": string
-      "host": string
-      "password": string
-      "port": number
-      "type": "sst.sst.Linkable"
-      "username": string
-    }
-    "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" {
   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"
-export {}
+export {}

+ 1 - 4
cloud/resource/tsconfig.json

@@ -4,9 +4,6 @@
   "compilerOptions": {
     "module": "ESNext",
     "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" />
 
 import "sst"
-export {}
+export {}

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

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

+ 1 - 0
package.json

@@ -6,6 +6,7 @@
   "packageManager": "[email protected]",
   "scripts": {
     "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",
     "generate": "(cd packages/sdk && ./js/script/generate.ts) && (cd packages/sdk/stainless && ./generate.ts)",
     "postinstall": "./script/hooks"

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

@@ -6,87 +6,87 @@
 import "sst"
 declare module "sst" {
   export interface Resource {
-    "ANTHROPIC_API_KEY": {
-      "type": "sst.sst.Secret"
-      "value": string
-    }
-    "AUTH_API_URL": {
-      "type": "sst.sst.Linkable"
-      "value": string
-    }
-    "BASETEN_API_KEY": {
-      "type": "sst.sst.Secret"
-      "value": string
-    }
-    "Console": {
-      "type": "sst.cloudflare.SolidStart"
-      "url": string
-    }
-    "Database": {
-      "database": string
-      "host": string
-      "password": string
-      "port": number
-      "type": "sst.sst.Linkable"
-      "username": string
-    }
-    "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" {
   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"
-export {}
+export {}

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

@@ -46,10 +46,7 @@ export namespace Fzf {
       log.info("found", { 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)
     if (!(await file.exists())) {
@@ -57,18 +54,15 @@ export namespace Fzf {
       const arch = archMap[process.arch as keyof typeof archMap] ?? "amd64"
 
       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 platformName =
-        process.platform === "win32" ? "windows" : process.platform
+      const platformName = process.platform === "win32" ? "windows" : process.platform
       const filename = `fzf-${version}-${platformName}_${arch}.${config.extension}`
       const url = `https://github.com/junegunn/fzf/releases/download/v${version}/${filename}`
 
       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 archivePath = path.join(Global.Path.bin, filename)
@@ -87,13 +81,13 @@ export namespace Fzf {
           })
       }
       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) {
           if (entry.filename === "fzf.exe") {
-            fzfEntry = entry;
-            break;
+            fzfEntry = entry
+            break
           }
         }
 
@@ -101,18 +95,18 @@ export namespace Fzf {
           throw new ExtractionFailedError({
             filepath: archivePath,
             stderr: "fzf.exe not found in zip archive",
-          });
+          })
         }
 
-        const fzfBlob = await fzfEntry.getData(new BlobWriter());
+        const fzfBlob = await fzfEntry.getData(new BlobWriter())
         if (!fzfBlob) {
           throw new ExtractionFailedError({
             filepath: archivePath,
             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)
       if (process.platform !== "win32") await fs.chmod(filepath, 0o755)
@@ -127,4 +121,4 @@ export namespace Fzf {
     const { filepath } = await state()
     return filepath
   }
-}
+}

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

@@ -3,18 +3,16 @@ import { Log } from "../util/log"
 
 export namespace FileTime {
   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) {
     log.info("read", { sessionID, file })

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

@@ -25,8 +25,8 @@ export namespace Plugin {
       worktree: Instance.worktree,
       directory: Instance.directory,
       $: 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 ?? [])]
     if (!Flag.OPENCODE_DISABLE_DEFAULT_PLUGINS) {
@@ -79,10 +79,13 @@ export namespace Plugin {
     for (const hook of hooks) {
       await hook.config?.(config)
       // 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) => {
       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) {
     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
         case "array":
           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
         default:
           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>
 
-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", {
   description: DESCRIPTION_WRITE,

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

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

+ 2 - 8
packages/opencode/tsconfig.json

@@ -2,13 +2,7 @@
   "$schema": "https://json.schemastore.org/tsconfig",
   "extends": "@tsconfig/bun/tsconfig.json",
   "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
   $: BunShell
   Tool: {
-    define(
-      id: string,
-      init: any | (() => Promise<any>)
-    ): any
+    define(id: string, init: any | (() => Promise<any>)): any
   }
   z: any // Zod instance for creating schemas
 }
@@ -133,7 +130,7 @@ export interface Hooks {
     input: {},
     output: {
       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>
 }

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

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

+ 3 - 11
packages/plugin/tsconfig.json

@@ -6,16 +6,8 @@
     "module": "preserve",
     "declaration": true,
     "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:
   push:
     branches-ignore:
-      - 'generated'
-      - 'codegen/**'
-      - 'integrated/**'
-      - 'stl-preview-head/**'
-      - 'stl-preview-base/**'
+      - "generated"
+      - "codegen/**"
+      - "integrated/**"
+      - "stl-preview-head/**"
+      - "stl-preview-base/**"
   pull_request:
     branches-ignore:
-      - 'stl-preview-head/**'
-      - 'stl-preview-base/**'
+      - "stl-preview-head/**"
+      - "stl-preview-base/**"
 
 jobs:
   lint:

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

@@ -1,3 +1,3 @@
 {
   ".": "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
 
-* **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)
 
@@ -14,7 +14,7 @@ Full Changelog: [v0.6.0...v0.7.0](https://github.com/sst/opencode-sdk-go/compare
 
 ### 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)
 
@@ -22,7 +22,7 @@ Full Changelog: [v0.5.0...v0.6.0](https://github.com/sst/opencode-sdk-go/compare
 
 ### 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)
 
@@ -30,7 +30,7 @@ Full Changelog: [v0.4.0...v0.5.0](https://github.com/sst/opencode-sdk-go/compare
 
 ### 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)
 
@@ -38,7 +38,7 @@ Full Changelog: [v0.3.0...v0.4.0](https://github.com/sst/opencode-sdk-go/compare
 
 ### 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)
 
@@ -46,7 +46,7 @@ Full Changelog: [v0.2.0...v0.3.0](https://github.com/sst/opencode-sdk-go/compare
 
 ### 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)
 
@@ -54,7 +54,7 @@ Full Changelog: [v0.1.0...v0.2.0](https://github.com/sst/opencode-sdk-go/compare
 
 ### 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)
 
@@ -62,61 +62,59 @@ Full Changelog: [v0.0.1...v0.1.0](https://github.com/sst/opencode-sdk-go/compare
 
 ### 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
 
-* **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
 
-* **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",
-  "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",
   output: {
     path: "./src/gen",
-    tsConfigPath: path.join(dir, 'tsconfig.json')
+    tsConfigPath: path.join(dir, "tsconfig.json"),
   },
   plugins: [
     {

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

@@ -105,7 +105,7 @@ export function createOpencodeTui(options?: TuiOptions) {
 
   const proc = spawn(`opencode`, args, {
     signal: options?.signal,
-    stdio: 'inherit',
+    stdio: "inherit",
     env: {
       ...process.env,
       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" />
 
 import "sst"
-export {}
+export {}

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

@@ -6,16 +6,8 @@
     "module": "nodenext",
     "declaration": true,
     "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"
 
 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]",
   socialCard: "https://social-cards.sst.dev",
   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 hasScrolledToAnchor = false
   let scrollTimeout: number | undefined
@@ -67,7 +63,8 @@ export default function Share(props: {
         created: props.info.time.created,
         updated: props.info.time.updated,
       },
-    }, messages: {}
+    },
+    messages: {},
   })
   const messages = createMemo(() => Object.values(store.messages).toSorted((a, b) => a.id?.localeCompare(b.id)))
   const [connectionStatus, setConnectionStatus] = createSignal<[Status, string?]>(["disconnected", "Disconnected"])
@@ -413,7 +410,11 @@ export default function Share(props: {
                     </li>
                     <li>
                       <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>
                       <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="diff-block"]:first-child > div {
       padding-top: 0.25rem;
     }

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

@@ -61,5 +61,4 @@
     padding: 2px 0;
     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()
 
   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}>
         {props.children}
       </div>
       {((!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"}
         </button>
       )}

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

@@ -11,8 +11,7 @@ export function CopyButton(props: CopyButtonProps) {
 
   function handleCopyClick() {
     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)
       setTimeout(() => setCopied(false), 2000)
@@ -21,15 +20,8 @@ export function CopyButton(props: CopyButtonProps) {
 
   return (
     <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>
     </div>
   )

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

@@ -168,32 +168,25 @@ export function Part(props: PartProps) {
             </Show>
           </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.message.role === "assistant" && (
             <>
@@ -295,10 +288,9 @@ export function Part(props: PartProps) {
                   .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"
 ```
 
-
-
 ---
 
 ## 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",
       "agent": "build",
       "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.",
       "description": "Run tests with coverage",
       "agent": "build",
-      "model": "anthropic/claude-3-5-sonnet-20241022"
+      "model": "anthropic/claude-3-5-sonnet-20241022",
     },
     "component": {
       "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.
 
-| 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` |
-| 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.
 
@@ -48,7 +48,7 @@ You can customize formatters through the `formatter` section in your opencode co
 ```json title="opencode.json"
 {
   "$schema": "https://opencode.ai/config.json",
-  "formatter": { }
+  "formatter": {}
 }
 ```
 
@@ -56,7 +56,7 @@ Each formatter configuration supports the following:
 
 | 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                       |
 | `environment` | object   | Environment variables to set when running the formatter |
 | `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:
 
    <details>
-     <summary>Flow configuration</summary>
+  <summary>Flow configuration</summary>
 
    ```yaml
    image: node:22-slim
@@ -67,17 +67,17 @@ Check out the [**GitLab docs**](https://docs.gitlab.com/user/duo_agent_platform/
      - |
        opencode run "
        You are an AI assistant helping with GitLab operations.
-   
+
        Context: $AI_FLOW_CONTEXT
        Task: $AI_FLOW_INPUT
        Event: $AI_FLOW_EVENT
-   
+
        Please execute the requested task using the available GitLab tools.
        Be thorough in your analysis and provide clear explanations.
-   
+
        <important>
        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.
        You don't need to commit or push up changes, those will be done automatically based on the file changes you make.
        </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**
 
   <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>
 
 - **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
 
-| 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 } }` |
 
 ---
@@ -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>                                                                                                                        |
 | `DELETE` | `/session/:id/share`                     | Unshare session                    | Returns <a href={typesUrl}><code>Session</code></a>                                                                                                                        |
 | `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/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 }`                                                                                                                                                      |
@@ -175,6 +175,6 @@ The opencode server exposes the following APIs.
 
 ### Docs
 
-| Method | Path   | Description                            | Response                                   |
-| ------ | ------ | -------------------------------------- | ------------------------------------------ |
+| Method | Path   | Description               | Response                    |
+| ------ | ------ | ------------------------- | --------------------------- |
 | `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;
     `~/.bashrc`, `~/.zshrc`, etc.
+
   </TabItem>
 
   <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
     Variables**.
+
   </TabItem>
 
   <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.
+
   </TabItem>
 </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
 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
 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:
 
 - 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
   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" />
 
 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({
-	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}
  */
 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() {
-	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"],
-}, {
+  },
+  {
     plugins: {
-        "@typescript-eslint": typescriptEslint,
+      "@typescript-eslint": typescriptEslint,
     },
 
     languageOptions: {
-        parser: tsParser,
-        ecmaVersion: 2022,
-        sourceType: "module",
+      parser: tsParser,
+      ecmaVersion: 2022,
+      sourceType: "module",
     },
 
     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" />
 
 import "sst"
-export {}
+export {}

+ 66 - 66
sst-env.d.ts

@@ -5,95 +5,95 @@
 
 declare module "sst" {
   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" />
 
 import "sst"
-export {}
+export {}

+ 1 - 3
tsconfig.json

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