diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index a1b492258b73..5a602767aa7c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -33,7 +33,7 @@ permissions: jobs: version: runs-on: blacksmith-4vcpu-ubuntu-2404 - if: github.repository == 'anomalyco/opencode' + if: always() && github.repository == 'AryaLabsHQ/opencoder' && (github.event_name != 'workflow_dispatch' || needs.test.result == 'success') steps: - uses: actions/checkout@v3 with: @@ -43,16 +43,39 @@ jobs: - name: Install OpenCode if: inputs.bump || inputs.version - run: bun i -g opencode-ai + run: bun i -g opencoder-ai@1.0.169 - - id: version + # Docker not needed for fork + # - name: Login to GitHub Container Registry + # uses: docker/login-action@v3 + # with: + # registry: ghcr.io + # username: ${{ github.repository_owner }} + # password: ${{ secrets.GITHUB_TOKEN }} + + # - name: Set up QEMU + # uses: docker/setup-qemu-action@v3 + + # - name: Set up Docker Buildx + # uses: docker/setup-buildx-action@v3 + + - uses: actions/setup-node@v4 + with: + node-version: "24" + registry-url: "https://registry.npmjs.org" + + - name: Setup Git Identity + id: version run: | ./script/version.ts env: GH_TOKEN: ${{ github.token }} OPENCODE_BUMP: ${{ inputs.bump }} OPENCODE_VERSION: ${{ inputs.version }} - OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }} + # OPENCODE_API_KEY: ${{ secrets.OPENCODE_API_KEY }} + # AUR_KEY: ${{ secrets.AUR_KEY }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_CONFIG_PROVENANCE: false outputs: version: ${{ steps.version.outputs.version }} release: ${{ steps.version.outputs.release }} @@ -61,7 +84,7 @@ jobs: build-cli: needs: version runs-on: blacksmith-4vcpu-ubuntu-2404 - if: github.repository == 'anomalyco/opencode' + if: github.repository == 'AryaLabsHQ/opencoder' steps: - uses: actions/checkout@v3 with: diff --git a/.opencode/tool/github-pr-search.ts b/.opencode/tool/github-pr-search.ts index 587fdfaaf28c..040369aa0cd4 100644 --- a/.opencode/tool/github-pr-search.ts +++ b/.opencode/tool/github-pr-search.ts @@ -1,5 +1,5 @@ /// -import { tool } from "@opencode-ai/plugin" +import { tool } from "@opencoder-ai/plugin" import DESCRIPTION from "./github-pr-search.txt" async function githubFetch(endpoint: string, options: RequestInit = {}) { diff --git a/.opencode/tool/github-triage.ts b/.opencode/tool/github-triage.ts index 1e216f1c8daa..d89d983bc6d8 100644 --- a/.opencode/tool/github-triage.ts +++ b/.opencode/tool/github-triage.ts @@ -1,6 +1,6 @@ /// // import { Octokit } from "@octokit/rest" -import { tool } from "@opencode-ai/plugin" +import { tool } from "@opencoder-ai/plugin" import DESCRIPTION from "./github-triage.txt" function getIssueNumber(): number { diff --git a/AGENTS.md b/AGENTS.md index d51134c0e296..6e76d9e34b37 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,10 +1,14 @@ +# AGENTS + - To regenerate the JavaScript SDK, run `./packages/sdk/js/script/build.ts`. - ALWAYS USE PARALLEL TOOLS WHEN APPLICABLE. - The default branch in this repo is `dev`. - Local `main` ref may not exist; use `dev` or `origin/dev` for diffs. - Prefer automation: execute requested actions without confirmation unless blocked by missing info or safety/irreversibility. -## Style Guide +**Generated:** 2026-01-29 +**Branch:** dev +**Type:** Bun + Turborepo monorepo ### General Principles diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4bec009ef467..b311ab902a5b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -69,7 +69,7 @@ Replace `` with your platform (e.g., `darwin-arm64`, `linux-x64`). - `packages/opencode/src/cli/cmd/tui/`: The TUI code, written in SolidJS with [opentui](https://github.com/sst/opentui) - `packages/app`: The shared web UI components, written in SolidJS - `packages/desktop`: The native desktop app, built with Tauri (wraps `packages/app`) - - `packages/plugin`: Source for `@opencode-ai/plugin` + - `packages/plugin`: Source for `@opencoder-ai/plugin` ### Understanding bun dev vs opencode diff --git a/bun.lock b/bun.lock index 4a054c648301..64ae71957d38 100644 --- a/bun.lock +++ b/bun.lock @@ -3,12 +3,13 @@ "configVersion": 1, "workspaces": { "": { - "name": "opencode", + "name": "opencoder", "dependencies": { "@aws-sdk/client-s3": "3.933.0", - "@opencode-ai/plugin": "workspace:*", - "@opencode-ai/script": "workspace:*", - "@opencode-ai/sdk": "workspace:*", + "@opencoder-ai/plugin": "workspace:*", + "@opencoder-ai/script": "workspace:*", + "@opencoder-ai/sdk": "workspace:*", + "quansync": "catalog:", "typescript": "catalog:", }, "devDependencies": { @@ -22,13 +23,13 @@ }, }, "packages/app": { - "name": "@opencode-ai/app", - "version": "1.1.65", + "name": "@opencoder-ai/app", + "version": "1.1.63", "dependencies": { "@kobalte/core": "catalog:", - "@opencode-ai/sdk": "workspace:*", - "@opencode-ai/ui": "workspace:*", - "@opencode-ai/util": "workspace:*", + "@opencoder-ai/sdk": "workspace:*", + "@opencoder-ai/ui": "workspace:*", + "@opencoder-ai/util": "workspace:*", "@shikijs/transformers": "3.9.2", "@solid-primitives/active-element": "2.1.3", "@solid-primitives/audio": "1.4.2", @@ -72,18 +73,18 @@ }, }, "packages/console/app": { - "name": "@opencode-ai/console-app", - "version": "1.1.65", + "name": "@opencoder-ai/console-app", + "version": "1.1.63", "dependencies": { "@cloudflare/vite-plugin": "1.15.2", "@ibm/plex": "6.4.1", "@jsx-email/render": "1.1.1", "@kobalte/core": "catalog:", "@openauthjs/openauth": "catalog:", - "@opencode-ai/console-core": "workspace:*", - "@opencode-ai/console-mail": "workspace:*", - "@opencode-ai/console-resource": "workspace:*", - "@opencode-ai/ui": "workspace:*", + "@opencoder-ai/console-core": "workspace:*", + "@opencoder-ai/console-mail": "workspace:*", + "@opencoder-ai/console-resource": "workspace:*", + "@opencoder-ai/ui": "workspace:*", "@smithy/eventstream-codec": "4.2.7", "@smithy/util-utf8": "4.2.0", "@solidjs/meta": "catalog:", @@ -106,16 +107,16 @@ }, }, "packages/console/core": { - "name": "@opencode-ai/console-core", - "version": "1.1.65", + "name": "@opencoder-ai/console-core", + "version": "1.1.63", "dependencies": { "@aws-sdk/client-sts": "3.782.0", "@jsx-email/render": "1.1.1", - "@opencode-ai/console-mail": "workspace:*", - "@opencode-ai/console-resource": "workspace:*", + "@opencoder-ai/console-mail": "workspace:*", + "@opencoder-ai/console-resource": "workspace:*", "@planetscale/database": "1.19.0", "aws4fetch": "1.0.20", - "drizzle-orm": "0.41.0", + "drizzle-orm": "0.45.1", "postgres": "3.4.7", "stripe": "18.0.0", "ulid": "catalog:", @@ -127,22 +128,22 @@ "@types/bun": "1.3.0", "@types/node": "catalog:", "@typescript/native-preview": "catalog:", - "drizzle-kit": "0.30.5", + "drizzle-kit": "0.31.8", "mysql2": "3.14.4", "typescript": "catalog:", }, }, "packages/console/function": { - "name": "@opencode-ai/console-function", - "version": "1.1.65", + "name": "@opencoder-ai/console-function", + "version": "1.1.63", "dependencies": { - "@ai-sdk/anthropic": "2.0.0", - "@ai-sdk/openai": "2.0.2", - "@ai-sdk/openai-compatible": "1.0.1", + "@ai-sdk/anthropic": "2.0.57", + "@ai-sdk/openai": "2.0.89", + "@ai-sdk/openai-compatible": "1.0.30", "@hono/zod-validator": "catalog:", "@openauthjs/openauth": "0.0.0-20250322224806", - "@opencode-ai/console-core": "workspace:*", - "@opencode-ai/console-resource": "workspace:*", + "@opencoder-ai/console-core": "workspace:*", + "@opencoder-ai/console-resource": "workspace:*", "ai": "catalog:", "hono": "catalog:", "zod": "catalog:", @@ -157,19 +158,21 @@ }, }, "packages/console/mail": { - "name": "@opencode-ai/console-mail", - "version": "1.1.65", + "name": "@opencoder-ai/console-mail", + "version": "1.1.63", "dependencies": { "@jsx-email/all": "2.2.3", "@jsx-email/cli": "1.4.3", "@tsconfig/bun": "1.0.9", - "@types/react": "18.0.25", "react": "18.2.0", "solid-js": "catalog:", }, + "devDependencies": { + "@types/react": "18.0.25", + }, }, "packages/console/resource": { - "name": "@opencode-ai/console-resource", + "name": "@opencoder-ai/console-resource", "dependencies": { "@cloudflare/workers-types": "catalog:", }, @@ -181,11 +184,11 @@ }, }, "packages/desktop": { - "name": "@opencode-ai/desktop", - "version": "1.1.65", + "name": "@opencoder-ai/desktop", + "version": "1.1.63", "dependencies": { - "@opencode-ai/app": "workspace:*", - "@opencode-ai/ui": "workspace:*", + "@opencoder-ai/app": "workspace:*", + "@opencoder-ai/ui": "workspace:*", "@solid-primitives/i18n": "2.2.1", "@solid-primitives/storage": "catalog:", "@solidjs/meta": "catalog:", @@ -205,7 +208,7 @@ "solid-js": "catalog:", }, "devDependencies": { - "@actions/artifact": "4.0.0", + "@actions/artifact": "5.0.1", "@tauri-apps/cli": "^2", "@types/bun": "catalog:", "@typescript/native-preview": "catalog:", @@ -214,16 +217,16 @@ }, }, "packages/enterprise": { - "name": "@opencode-ai/enterprise", - "version": "1.1.65", + "name": "@opencoder-ai/enterprise", + "version": "1.1.63", "dependencies": { - "@opencode-ai/ui": "workspace:*", - "@opencode-ai/util": "workspace:*", + "@opencoder-ai/ui": "workspace:*", + "@opencoder-ai/util": "workspace:*", "@pierre/diffs": "catalog:", "@solidjs/meta": "catalog:", "@solidjs/router": "catalog:", "@solidjs/start": "catalog:", - "aws4fetch": "^1.0.20", + "aws4fetch": "1.0.20", "hono": "catalog:", "hono-openapi": "catalog:", "js-base64": "3.7.7", @@ -243,8 +246,8 @@ }, }, "packages/function": { - "name": "@opencode-ai/function", - "version": "1.1.65", + "name": "@opencoder-ai/function", + "version": "1.1.63", "dependencies": { "@octokit/auth-app": "8.0.1", "@octokit/rest": "catalog:", @@ -259,8 +262,8 @@ }, }, "packages/opencode": { - "name": "opencode", - "version": "1.1.65", + "name": "opencoder", + "version": "1.1.63", "bin": { "opencode": "./bin/opencode", }, @@ -268,12 +271,13 @@ "@actions/core": "1.11.1", "@actions/github": "6.0.1", "@agentclientprotocol/sdk": "0.14.1", - "@ai-sdk/amazon-bedrock": "3.0.79", - "@ai-sdk/anthropic": "2.0.62", + "@agni/agent-sdk": "link:@agni/agent-sdk", + "@ai-sdk/amazon-bedrock": "3.0.74", + "@ai-sdk/anthropic": "2.0.58", "@ai-sdk/azure": "2.0.91", "@ai-sdk/cerebras": "1.0.36", "@ai-sdk/cohere": "2.0.22", - "@ai-sdk/deepinfra": "1.0.36", + "@ai-sdk/deepinfra": "1.0.33", "@ai-sdk/gateway": "2.0.30", "@ai-sdk/google": "2.0.52", "@ai-sdk/google-vertex": "3.0.98", @@ -296,10 +300,10 @@ "@octokit/graphql": "9.0.2", "@octokit/rest": "catalog:", "@openauthjs/openauth": "catalog:", - "@opencode-ai/plugin": "workspace:*", - "@opencode-ai/script": "workspace:*", - "@opencode-ai/sdk": "workspace:*", - "@opencode-ai/util": "workspace:*", + "@opencoder-ai/plugin": "workspace:*", + "@opencoder-ai/script": "workspace:*", + "@opencoder-ai/sdk": "workspace:*", + "@opencoder-ai/util": "workspace:*", "@openrouter/ai-sdk-provider": "1.5.4", "@opentui/core": "0.1.79", "@opentui/solid": "0.1.79", @@ -342,8 +346,9 @@ }, "devDependencies": { "@babel/core": "7.28.4", + "@cloudflare/workers-types": "catalog:", "@octokit/webhooks-types": "7.6.1", - "@opencode-ai/script": "workspace:*", + "@opencoder-ai/script": "workspace:*", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", @@ -355,6 +360,7 @@ "@tsconfig/bun": "catalog:", "@types/babel__core": "7.20.5", "@types/bun": "catalog:", + "@types/pg": "8.16.0", "@types/turndown": "5.0.5", "@types/yargs": "17.0.33", "@typescript/native-preview": "catalog:", @@ -365,10 +371,10 @@ }, }, "packages/plugin": { - "name": "@opencode-ai/plugin", - "version": "1.1.65", + "name": "@opencoder-ai/plugin", + "version": "1.1.63", "dependencies": { - "@opencode-ai/sdk": "workspace:*", + "@opencoder-ai/sdk": "workspace:*", "zod": "catalog:", }, "devDependencies": { @@ -379,14 +385,14 @@ }, }, "packages/script": { - "name": "@opencode-ai/script", + "name": "@opencoder-ai/script", "devDependencies": { "@types/bun": "catalog:", }, }, "packages/sdk/js": { - "name": "@opencode-ai/sdk", - "version": "1.1.65", + "name": "@opencoder-ai/sdk", + "version": "1.1.63", "devDependencies": { "@hey-api/openapi-ts": "0.90.10", "@tsconfig/node22": "catalog:", @@ -396,10 +402,10 @@ }, }, "packages/slack": { - "name": "@opencode-ai/slack", - "version": "1.1.65", + "name": "@opencoder-ai/slack", + "version": "1.1.63", "dependencies": { - "@opencode-ai/sdk": "workspace:*", + "@opencoder-ai/sdk": "workspace:*", "@slack/bolt": "^3.17.1", }, "devDependencies": { @@ -409,12 +415,12 @@ }, }, "packages/ui": { - "name": "@opencode-ai/ui", - "version": "1.1.65", + "name": "@opencoder-ai/ui", + "version": "1.1.63", "dependencies": { "@kobalte/core": "catalog:", - "@opencode-ai/sdk": "workspace:*", - "@opencode-ai/util": "workspace:*", + "@opencoder-ai/sdk": "workspace:*", + "@opencoder-ai/util": "workspace:*", "@pierre/diffs": "catalog:", "@shikijs/transformers": "3.9.2", "@solid-primitives/bounds": "0.1.3", @@ -422,7 +428,7 @@ "@solid-primitives/resize-observer": "2.1.3", "@solidjs/meta": "catalog:", "@typescript/native-preview": "catalog:", - "dompurify": "3.3.1", + "dompurify": "catalog:", "fuzzysort": "catalog:", "katex": "0.16.27", "luxon": "catalog:", @@ -451,8 +457,8 @@ }, }, "packages/util": { - "name": "@opencode-ai/util", - "version": "1.1.65", + "name": "@opencoder-ai/util", + "version": "1.1.63", "dependencies": { "zod": "catalog:", }, @@ -462,15 +468,15 @@ }, }, "packages/web": { - "name": "@opencode-ai/web", - "version": "1.1.65", + "name": "@opencoder-ai/web", + "version": "1.1.63", "dependencies": { "@astrojs/cloudflare": "12.6.3", "@astrojs/markdown-remark": "6.3.1", "@astrojs/solid-js": "5.1.0", "@astrojs/starlight": "0.34.3", "@fontsource/ibm-plex-mono": "5.2.5", - "@shikijs/transformers": "3.20.0", + "@shikijs/transformers": "3.9.2", "@types/luxon": "catalog:", "ai": "catalog:", "astro": "5.7.13", @@ -490,7 +496,7 @@ "devDependencies": { "@astrojs/check": "0.9.6", "@types/node": "catalog:", - "opencode": "workspace:*", + "opencoder": "workspace:*", "typescript": "catalog:", }, }, @@ -522,7 +528,7 @@ "@tailwindcss/vite": "4.1.11", "@tsconfig/bun": "1.0.9", "@tsconfig/node22": "22.0.2", - "@types/bun": "1.3.9", + "@types/bun": "1.3.5", "@types/luxon": "3.7.1", "@types/node": "22.13.9", "@types/semver": "7.7.1", @@ -536,6 +542,7 @@ "luxon": "3.6.1", "marked": "17.0.1", "marked-shiki": "1.2.1", + "quansync": "0.2.11", "remeda": "2.26.0", "shiki": "3.20.0", "solid-js": "1.9.10", @@ -546,7 +553,7 @@ "virtua": "0.42.3", "vite": "7.1.4", "vite-plugin-solid": "2.11.10", - "zod": "4.1.8", + "zod": "4.3.6", }, "packages": { "@actions/artifact": ["@actions/artifact@5.0.1", "", { "dependencies": { "@actions/core": "^2.0.0", "@actions/github": "^6.0.1", "@actions/http-client": "^3.0.0", "@azure/storage-blob": "^12.29.1", "@octokit/core": "^5.2.1", "@octokit/plugin-request-log": "^1.0.4", "@octokit/plugin-retry": "^3.0.9", "@octokit/request": "^8.4.1", "@octokit/request-error": "^5.1.1", "@protobuf-ts/plugin": "^2.2.3-alpha.1", "archiver": "^7.0.1", "jwt-decode": "^3.1.2", "unzip-stream": "^0.3.1" } }, "sha512-dHJ5rHduhCKUikKTT9eXeWoUvfKia3IjR1sO/VTAV3DVAL4yMTRnl2iO5mcfiBjySHLwPNezwENAVskKYU5ymw=="], @@ -565,9 +572,11 @@ "@agentclientprotocol/sdk": ["@agentclientprotocol/sdk@0.14.1", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-b6r3PS3Nly+Wyw9U+0nOr47bV8tfS476EgyEMhoKvJCZLbgqoDFN7DJwkxL88RR0aiOqOYV1ZnESHqb+RmdH8w=="], - "@ai-sdk/amazon-bedrock": ["@ai-sdk/amazon-bedrock@3.0.79", "", { "dependencies": { "@ai-sdk/anthropic": "2.0.62", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.21", "@smithy/eventstream-codec": "^4.0.1", "@smithy/util-utf8": "^4.0.0", "aws4fetch": "^1.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-GfAQUb1GEmdTjLu5Ud1d5sieNHDpwoQdb4S14KmJlA5RsGREUZ1tfSKngFaiClxFtL0xPSZjePhTMV6Z65A7/g=="], + "@agni/agent-sdk": ["@agni/agent-sdk@link:@agni/agent-sdk", {}], + + "@ai-sdk/amazon-bedrock": ["@ai-sdk/amazon-bedrock@3.0.74", "", { "dependencies": { "@ai-sdk/anthropic": "2.0.58", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20", "@smithy/eventstream-codec": "^4.0.1", "@smithy/util-utf8": "^4.0.0", "aws4fetch": "^1.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-q83HE3FBb/HPIvjXsehrHOgCuGHPorSMFt6BYnzIYZy8gNnSqV1OWX4oXVsCAuYPPMtYW/KMK35hmoIFV8QKoQ=="], - "@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.0", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4" } }, "sha512-uyyaO4KhxoIKZztREqLPh+6/K3ZJx/rp72JKoUEL9/kC+vfQTThUfPnY/bUryUpcnawx8IY/tSoYNOi/8PCv7w=="], + "@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.57", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-DREpYqW2pylgaj69gZ+K8u92bo9DaMgFdictYnY+IwYeY3bawQ4zI7l/o1VkDsBDljAx8iYz5lPURwVZNu+Xpg=="], "@ai-sdk/azure": ["@ai-sdk/azure@2.0.91", "", { "dependencies": { "@ai-sdk/openai": "2.0.89", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-9tznVSs6LGQNKKxb8pKd7CkBV9yk+a/ENpFicHCj2CmBUKefxzwJ9JbUqrlK3VF6dGZw3LXq0dWxt7/Yekaj1w=="], @@ -577,7 +586,7 @@ "@ai-sdk/deepgram": ["@ai-sdk/deepgram@1.0.22", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-lqmINr+1Jy2yGXxnQB6IrC2xMtUY5uK96pyKfqTj1kLlXGatKnJfXF7WTkOGgQrFqIYqpjDz+sPVR3n0KUEUtA=="], - "@ai-sdk/deepinfra": ["@ai-sdk/deepinfra@1.0.36", "", { "dependencies": { "@ai-sdk/openai-compatible": "1.0.33", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-LndvRktEgY2IFu4peDJMEXcjhHEEFtM0upLx/J64kCpFHCifalXpK4PPSX3PVndnn0bJzvamO5+fc0z2ooqBZw=="], + "@ai-sdk/deepinfra": ["@ai-sdk/deepinfra@1.0.33", "", { "dependencies": { "@ai-sdk/openai-compatible": "1.0.32", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-hn2y8Q+2iZgGNVJyzPsH8EECECryFMVmxBJrBvBWoi8xcJPRyt0fZP5dOSLyGg3q0oxmPS9M0Eq0NNlKot/bYQ=="], "@ai-sdk/deepseek": ["@ai-sdk/deepseek@1.0.33", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-NiKjvqXI/96e/7SjZGgQH141PBqggsF7fNbjGTv4RgVWayMXp9mj0Ou2NjAUGwwxJwj/qseY0gXiDCYaHWFBkw=="], @@ -595,9 +604,9 @@ "@ai-sdk/mistral": ["@ai-sdk/mistral@2.0.27", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-gaptHgaXjMw3+eA0Q4FABcsj5nQNP6EpFaGUR+Pj5WJy7Kn6mApl975/x57224MfeJIShNpt8wFKK3tvh5ewKg=="], - "@ai-sdk/openai": ["@ai-sdk/openai@2.0.2", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4" } }, "sha512-D4zYz2uR90aooKQvX1XnS00Z7PkbrcY+snUvPfm5bCabTG7bzLrVtD56nJ5bSaZG8lmuOMfXpyiEEArYLyWPpw=="], + "@ai-sdk/openai": ["@ai-sdk/openai@2.0.89", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-4+qWkBCbL9HPKbgrUO/F2uXZ8GqrYxHa8SWEYIzxEJ9zvWw3ISr3t1/27O1i8MGSym+PzEyHBT48EV4LAwWaEw=="], - "@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.1", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4" } }, "sha512-luHVcU+yKzwv3ekKgbP3v+elUVxb2Rt+8c6w9qi7g2NYG2/pEL21oIrnaEnc6UtTZLLZX9EFBcpq2N1FQKDIMw=="], + "@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.30", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-thubwhRtv9uicAxSWwNpinM7hiL/0CkhL/ymPaHuKvI494J7HIzn8KQZQ2ymRz284WTIZnI7VMyyejxW4RMM6w=="], "@ai-sdk/perplexity": ["@ai-sdk/perplexity@2.0.23", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-aiaRvnc6mhQZKhTTSXPCjPH8Iqr5D/PfCN1hgVP/3RGTBbJtsd9HemIBSABeSdAKbsMH/PwJxgnqH75HEamcBA=="], @@ -733,8 +742,6 @@ "@azure/core-client": ["@azure/core-client@1.10.1", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-auth": "^1.10.0", "@azure/core-rest-pipeline": "^1.22.0", "@azure/core-tracing": "^1.3.0", "@azure/core-util": "^1.13.0", "@azure/logger": "^1.3.0", "tslib": "^2.6.2" } }, "sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w=="], - "@azure/core-http": ["@azure/core-http@3.0.5", "", { "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.3.0", "@azure/core-tracing": "1.0.0-preview.13", "@azure/core-util": "^1.1.1", "@azure/logger": "^1.0.0", "@types/node-fetch": "^2.5.0", "@types/tunnel": "^0.0.3", "form-data": "^4.0.0", "node-fetch": "^2.6.7", "process": "^0.11.10", "tslib": "^2.2.0", "tunnel": "^0.0.6", "uuid": "^8.3.0", "xml2js": "^0.5.0" } }, "sha512-T8r2q/c3DxNu6mEJfPuJtptUVqwchxzjj32gKcnMi06rdiVONS9rar7kT9T2Am+XvER7uOzpsP79WsqNbdgdWg=="], - "@azure/core-http-compat": ["@azure/core-http-compat@2.3.1", "", { "dependencies": { "@azure/abort-controller": "^2.1.2", "@azure/core-client": "^1.10.0", "@azure/core-rest-pipeline": "^1.22.0" } }, "sha512-az9BkXND3/d5VgdRRQVkiJb2gOmDU8Qcq4GvjtBmDICNiQ9udFmDk4ZpSB5Qq1OmtDJGlQAfBaS4palFsazQ5g=="], "@azure/core-lro": ["@azure/core-lro@2.7.2", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.2.0", "@azure/logger": "^1.0.0", "tslib": "^2.6.2" } }, "sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw=="], @@ -975,7 +982,7 @@ "@gitlab/gitlab-ai-provider": ["@gitlab/gitlab-ai-provider@3.5.0", "", { "dependencies": { "@anthropic-ai/sdk": "^0.71.0", "@anycable/core": "^0.9.2", "graphql-request": "^6.1.0", "isomorphic-ws": "^5.0.0", "openai": "^6.16.0", "socket.io-client": "^4.8.1", "vscode-jsonrpc": "^8.2.1", "zod": "^3.25.76" }, "peerDependencies": { "@ai-sdk/provider": ">=2.0.0", "@ai-sdk/provider-utils": ">=3.0.0" } }, "sha512-OoAwCz4fOci3h/2l+PRHMclclh3IaFq8w1es2wvBJ8ca7vtglKsBYT7dvmYpsXlu7pg9mopbjcexvmVCQEUTAQ=="], - "@gitlab/opencode-gitlab-auth": ["@gitlab/opencode-gitlab-auth@1.3.2", "", { "dependencies": { "@fastify/rate-limit": "^10.2.0", "@opencode-ai/plugin": "*", "fastify": "^5.2.0", "open": "^10.0.0" } }, "sha512-pvGrC+aDVLY8bRCC/fZaG/Qihvt2r4by5xbTo5JTSz9O7yIcR6xG2d9Wkuu4bcXFz674z2C+i5bUk+J/RSdBpg=="], + "@gitlab/opencode-gitlab-auth": ["@gitlab/opencode-gitlab-auth@1.3.2", "", { "dependencies": { "@fastify/rate-limit": "^10.2.0", "@opencoder-ai/plugin": "*", "fastify": "^5.2.0", "open": "^10.0.0" } }, "sha512-pvGrC+aDVLY8bRCC/fZaG/Qihvt2r4by5xbTo5JTSz9O7yIcR6xG2d9Wkuu4bcXFz674z2C+i5bUk+J/RSdBpg=="], "@graphql-typed-document-node/core": ["@graphql-typed-document-node/core@3.2.0", "", { "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="], @@ -1241,37 +1248,37 @@ "@openauthjs/openauth": ["@openauthjs/openauth@0.0.0-20250322224806", "", { "dependencies": { "@standard-schema/spec": "1.0.0-beta.3", "aws4fetch": "1.0.20", "jose": "5.9.6" }, "peerDependencies": { "arctic": "^2.2.2", "hono": "^4.0.0" } }, "sha512-p5IWSRXvABcwocH2dNI0w8c1QJelIOFulwhKk+aLLFfUbs8u1pr7kQbYe8yCSM2+bcLHiwbogpUQc2ovrGwCuw=="], - "@opencode-ai/app": ["@opencode-ai/app@workspace:packages/app"], + "@opencoder-ai/app": ["@opencoder-ai/app@workspace:packages/app"], - "@opencode-ai/console-app": ["@opencode-ai/console-app@workspace:packages/console/app"], + "@opencoder-ai/console-app": ["@opencoder-ai/console-app@workspace:packages/console/app"], - "@opencode-ai/console-core": ["@opencode-ai/console-core@workspace:packages/console/core"], + "@opencoder-ai/console-core": ["@opencoder-ai/console-core@workspace:packages/console/core"], - "@opencode-ai/console-function": ["@opencode-ai/console-function@workspace:packages/console/function"], + "@opencoder-ai/console-function": ["@opencoder-ai/console-function@workspace:packages/console/function"], - "@opencode-ai/console-mail": ["@opencode-ai/console-mail@workspace:packages/console/mail"], + "@opencoder-ai/console-mail": ["@opencoder-ai/console-mail@workspace:packages/console/mail"], - "@opencode-ai/console-resource": ["@opencode-ai/console-resource@workspace:packages/console/resource"], + "@opencoder-ai/console-resource": ["@opencoder-ai/console-resource@workspace:packages/console/resource"], - "@opencode-ai/desktop": ["@opencode-ai/desktop@workspace:packages/desktop"], + "@opencoder-ai/desktop": ["@opencoder-ai/desktop@workspace:packages/desktop"], - "@opencode-ai/enterprise": ["@opencode-ai/enterprise@workspace:packages/enterprise"], + "@opencoder-ai/enterprise": ["@opencoder-ai/enterprise@workspace:packages/enterprise"], - "@opencode-ai/function": ["@opencode-ai/function@workspace:packages/function"], + "@opencoder-ai/function": ["@opencoder-ai/function@workspace:packages/function"], - "@opencode-ai/plugin": ["@opencode-ai/plugin@workspace:packages/plugin"], + "@opencoder-ai/plugin": ["@opencoder-ai/plugin@workspace:packages/plugin"], - "@opencode-ai/script": ["@opencode-ai/script@workspace:packages/script"], + "@opencoder-ai/script": ["@opencoder-ai/script@workspace:packages/script"], - "@opencode-ai/sdk": ["@opencode-ai/sdk@workspace:packages/sdk/js"], + "@opencoder-ai/sdk": ["@opencoder-ai/sdk@workspace:packages/sdk/js"], - "@opencode-ai/slack": ["@opencode-ai/slack@workspace:packages/slack"], + "@opencoder-ai/slack": ["@opencoder-ai/slack@workspace:packages/slack"], - "@opencode-ai/ui": ["@opencode-ai/ui@workspace:packages/ui"], + "@opencoder-ai/ui": ["@opencoder-ai/ui@workspace:packages/ui"], - "@opencode-ai/util": ["@opencode-ai/util@workspace:packages/util"], + "@opencoder-ai/util": ["@opencoder-ai/util@workspace:packages/util"], - "@opencode-ai/web": ["@opencode-ai/web@workspace:packages/web"], + "@opencoder-ai/web": ["@opencoder-ai/web@workspace:packages/web"], "@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@1.5.4", "", { "dependencies": { "@openrouter/sdk": "^0.1.27" }, "peerDependencies": { "ai": "^5.0.0", "zod": "^3.24.1 || ^v4" } }, "sha512-xrSQPUIH8n9zuyYZR0XK7Ba0h2KsjJcMkxnwaYfmv13pKs3sDkjPzVPPhlhzqBGddHb5cFEwJ9VFuFeDcxCDSw=="], @@ -1407,8 +1414,6 @@ "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.1", "", { "os": "win32", "cpu": "x64" }, "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA=="], - "@petamoriken/float16": ["@petamoriken/float16@3.9.3", "", {}, "sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g=="], - "@pierre/diffs": ["@pierre/diffs@1.1.0-beta.13", "", { "dependencies": { "@shikijs/transformers": "^3.0.0", "diff": "8.0.3", "hast-util-to-html": "9.0.5", "lru_map": "0.4.1", "shiki": "^3.0.0" }, "peerDependencies": { "react": "^18.3.1 || ^19.0.0", "react-dom": "^18.3.1 || ^19.0.0" } }, "sha512-D35rxDu5V7XHX5aVGU6PF12GhscL+I+9QYgxK/i3h0d2XSirAxDdVNm49aYwlOhgmdvL0NbS1IHxPswVB5yJvw=="], "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], @@ -1853,7 +1858,7 @@ "@types/braces": ["@types/braces@3.0.5", "", {}, "sha512-SQFof9H+LXeWNz8wDe7oN5zu7ket0qwMu5vZubW4GCJ8Kkeh6nBWUz87+KTz/G3Kqsrp0j/W253XJb3KMEeg3w=="], - "@types/bun": ["@types/bun@1.3.9", "", { "dependencies": { "bun-types": "1.3.9" } }, "sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw=="], + "@types/bun": ["@types/bun@1.3.5", "", { "dependencies": { "bun-types": "1.3.5" } }, "sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w=="], "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="], @@ -1905,6 +1910,8 @@ "@types/node-fetch": ["@types/node-fetch@2.6.13", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.4" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="], + "@types/pg": ["@types/pg@8.16.0", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ=="], + "@types/promise.allsettled": ["@types/promise.allsettled@1.0.6", "", {}, "sha512-wA0UT0HeT2fGHzIFV9kWpYz5mdoyLxKrTgMdZQM++5h6pYAFH73HXcQhefg24nD1yivUFEn5KU+EF4b+CXJ4Wg=="], "@types/prop-types": ["@types/prop-types@15.7.15", "", {}, "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw=="], @@ -1929,8 +1936,6 @@ "@types/tsscmp": ["@types/tsscmp@1.0.2", "", {}, "sha512-cy7BRSU8GYYgxjcx0Py+8lo5MthuDhlyu076KUcYzVNXL23luYgRHkMG2fIFEc6neckeh/ntP82mw+U4QjZq+g=="], - "@types/tunnel": ["@types/tunnel@0.0.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA=="], - "@types/turndown": ["@types/turndown@5.0.5", "", {}, "sha512-TL2IgGgc7B5j78rIccBtlYAnkuv8nUQqhQc+DSYV5j9Be9XOcm/SKOVRuA47xAVI3680Tk9B1d8flK2GWT2+4w=="], "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], @@ -2181,7 +2186,7 @@ "bun-pty": ["bun-pty@0.4.8", "", {}, "sha512-rO70Mrbr13+jxHHHu2YBkk2pNqrJE5cJn29WE++PUr+GFA0hq/VgtQPZANJ8dJo6d7XImvBk37Innt8GM7O28w=="], - "bun-types": ["bun-types@1.3.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-+UBWWOakIP4Tswh0Bt0QD0alpTY8cb5hvgiYeWCMet9YukHbzuruIEeXC2D7nMJPB12kbh8C7XJykSexEqGKJg=="], + "bun-types": ["bun-types@1.3.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw=="], "bun-webgpu": ["bun-webgpu@0.1.4", "", { "dependencies": { "@webgpu/types": "^0.1.60" }, "optionalDependencies": { "bun-webgpu-darwin-arm64": "^0.1.4", "bun-webgpu-darwin-x64": "^0.1.4", "bun-webgpu-linux-x64": "^0.1.4", "bun-webgpu-win32-x64": "^0.1.4" } }, "sha512-Kw+HoXl1PMWJTh9wvh63SSRofTA8vYBFCw0XEP1V1fFdQEDhI8Sgf73sdndE/oDpN/7CMx0Yv/q8FCvO39ROMQ=="], @@ -2413,9 +2418,9 @@ "dotenv": ["dotenv@17.2.3", "", {}, "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w=="], - "drizzle-kit": ["drizzle-kit@0.30.5", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.19.7", "esbuild-register": "^3.5.0", "gel": "^2.0.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-l6dMSE100u7sDaTbLczibrQZjA35jLsHNqIV+jmhNVO3O8jzM6kywMOmV9uOz9ZVSCMPQhAZEFjL/qDPVrqpUA=="], + "drizzle-kit": ["drizzle-kit@0.31.8", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.4", "esbuild-register": "^3.5.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-O9EC/miwdnRDY10qRxM8P3Pg8hXe3LyU4ZipReKOgTwn4OqANmftj8XJz1UPUAS6NMHf0E2htjsbQujUTkncCg=="], - "drizzle-orm": ["drizzle-orm@0.41.0", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-7A4ZxhHk9gdlXmTdPj/lREtP+3u8KvZ4yEN6MYVxBzZGex5Wtdc+CWSbu7btgF6TB0N+MNPrvW7RKBbxJchs/Q=="], + "drizzle-orm": ["drizzle-orm@0.45.1", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA=="], "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="], @@ -2447,8 +2452,6 @@ "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], - "env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="], - "error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="], "error-stack-parser-es": ["error-stack-parser-es@1.0.5", "", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="], @@ -2625,8 +2628,6 @@ "gcp-metadata": ["gcp-metadata@8.1.2", "", { "dependencies": { "gaxios": "^7.0.0", "google-logging-utils": "^1.0.0", "json-bigint": "^1.0.0" } }, "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg=="], - "gel": ["gel@2.2.0", "", { "dependencies": { "@petamoriken/float16": "^3.8.7", "debug": "^4.3.4", "env-paths": "^3.0.0", "semver": "^7.6.2", "shell-quote": "^1.8.1", "which": "^4.0.0" }, "bin": { "gel": "dist/cli.mjs" } }, "sha512-q0ma7z2swmoamHQusey8ayo8+ilVdzDt4WTxSPzq/yRqvucWRfymRVMvNgmSC0XK7eNjjEZEcplxpgaNojKdmQ=="], - "generate-function": ["generate-function@2.3.1", "", { "dependencies": { "is-property": "^1.0.2" } }, "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ=="], "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="], @@ -2905,7 +2906,7 @@ "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], - "isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "isomorphic-ws": ["isomorphic-ws@5.0.0", "", { "peerDependencies": { "ws": "*" } }, "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw=="], @@ -3303,7 +3304,7 @@ "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], - "opencode": ["opencode@workspace:packages/opencode"], + "opencoder": ["opencoder@workspace:packages/opencode"], "opencontrol": ["opencontrol@0.0.6", "", { "dependencies": { "@modelcontextprotocol/sdk": "1.6.1", "@tsconfig/bun": "1.0.7", "hono": "4.7.4", "zod": "3.24.2", "zod-to-json-schema": "3.24.3" }, "bin": { "opencontrol": "bin/index.mjs" } }, "sha512-QeCrpOK5D15QV8kjnGVeD/BHFLwcVr+sn4T6KKmP0WAMs2pww56e4h+eOGHb5iPOufUQXbdbBKi6WV2kk7tefQ=="], @@ -3387,6 +3388,12 @@ "perfect-debounce": ["perfect-debounce@2.1.0", "", {}, "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g=="], + "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], + + "pg-protocol": ["pg-protocol@1.11.0", "", {}, "sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g=="], + + "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], + "piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="], "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], @@ -3441,6 +3448,14 @@ "postgres": ["postgres@3.4.7", "", {}, "sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw=="], + "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], + + "postgres-bytea": ["postgres-bytea@1.0.1", "", {}, "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ=="], + + "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], + + "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], + "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="], "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], @@ -3667,8 +3682,6 @@ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], - "shiki": ["shiki@3.20.0", "", { "dependencies": { "@shikijs/core": "3.20.0", "@shikijs/engine-javascript": "3.20.0", "@shikijs/engine-oniguruma": "3.20.0", "@shikijs/langs": "3.20.0", "@shikijs/themes": "3.20.0", "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg=="], "shikiji": ["shikiji@0.6.13", "", { "dependencies": { "hast-util-to-html": "^9.0.0" } }, "sha512-4T7X39csvhT0p7GDnq9vysWddf2b6BeioiN3Ymhnt3xcy9tXmDcnsEFVxX18Z4YcQgEE/w48dLJ4pPPUcG9KkA=="], @@ -4061,7 +4074,7 @@ "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], - "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], @@ -4101,6 +4114,8 @@ "xmlhttprequest-ssl": ["xmlhttprequest-ssl@2.1.2", "", {}, "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ=="], + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="], "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], @@ -4129,7 +4144,7 @@ "zip-stream": ["zip-stream@6.0.1", "", { "dependencies": { "archiver-utils": "^5.0.0", "compress-commons": "^6.0.2", "readable-stream": "^4.0.0" } }, "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA=="], - "zod": ["zod@4.1.8", "", {}, "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ=="], + "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], "zod-to-json-schema": ["zod-to-json-schema@3.24.5", "", { "peerDependencies": { "zod": "^3.24.1" } }, "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g=="], @@ -4151,42 +4166,22 @@ "@actions/http-client/undici": ["undici@6.23.0", "", {}, "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g=="], - "@ai-sdk/amazon-bedrock/@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.62", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-I3RhaOEMnWlWnrvjNBOYvUb19Dwf2nw01IruZrVJRDi688886e11wnd5DxrBZLd2V29Gizo3vpOPnnExsA+wTA=="], - - "@ai-sdk/amazon-bedrock/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.21", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-veuMwTLxsgh31Jjn0SnBABnM1f7ebHhRWcV2ZuY3hP3iJDCZ8VXBaYqcHXoOQDqUXTCas08sKQcHyWK+zl882Q=="], + "@ai-sdk/amazon-bedrock/@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.58", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-CkNW5L1Arv8gPtPlEmKd+yf/SG9ucJf0XQdpMG8OiYEtEMc2smuCA+tyCp8zI7IBVg/FE7nUfFHntQFaOjRwJQ=="], "@ai-sdk/amazon-bedrock/@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.8", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.12.0", "@smithy/util-hex-encoding": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw=="], - "@ai-sdk/anthropic/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], - - "@ai-sdk/anthropic/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.0", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.3", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.25.76 || ^4" } }, "sha512-BoQZtGcBxkeSH1zK+SRYNDtJPIPpacTeiMZqnG4Rv6xXjEwM0FH4MGs9c+PlhyEWmQCzjRM2HAotEydFhD4dYw=="], - - "@ai-sdk/azure/@ai-sdk/openai": ["@ai-sdk/openai@2.0.89", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-4+qWkBCbL9HPKbgrUO/F2uXZ8GqrYxHa8SWEYIzxEJ9zvWw3ISr3t1/27O1i8MGSym+PzEyHBT48EV4LAwWaEw=="], - "@ai-sdk/cerebras/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.32", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YspqqyJPzHjqWrjt4y/Wgc2aJgCcQj5uIJgZpq2Ar/lH30cEVhgE+keePDbjKpetD9UwNggCj7u6kO3unS23OQ=="], - "@ai-sdk/deepinfra/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.33", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-2KMcR2xAul3u5dGZD7gONgbIki3Hg7Ey+sFu7gsiJ4U2iRU0GDV3ccNq79dTuAEXPDFcOWCUpW8A8jXc0kxJxQ=="], - - "@ai-sdk/deepinfra/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.21", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-veuMwTLxsgh31Jjn0SnBABnM1f7ebHhRWcV2ZuY3hP3iJDCZ8VXBaYqcHXoOQDqUXTCas08sKQcHyWK+zl882Q=="], + "@ai-sdk/deepinfra/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.32", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YspqqyJPzHjqWrjt4y/Wgc2aJgCcQj5uIJgZpq2Ar/lH30cEVhgE+keePDbjKpetD9UwNggCj7u6kO3unS23OQ=="], "@ai-sdk/fireworks/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.32", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YspqqyJPzHjqWrjt4y/Wgc2aJgCcQj5uIJgZpq2Ar/lH30cEVhgE+keePDbjKpetD9UwNggCj7u6kO3unS23OQ=="], "@ai-sdk/google-vertex/@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.58", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-CkNW5L1Arv8gPtPlEmKd+yf/SG9ucJf0XQdpMG8OiYEtEMc2smuCA+tyCp8zI7IBVg/FE7nUfFHntQFaOjRwJQ=="], - "@ai-sdk/openai/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], - - "@ai-sdk/openai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.0", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.3", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.25.76 || ^4" } }, "sha512-BoQZtGcBxkeSH1zK+SRYNDtJPIPpacTeiMZqnG4Rv6xXjEwM0FH4MGs9c+PlhyEWmQCzjRM2HAotEydFhD4dYw=="], - - "@ai-sdk/openai-compatible/@ai-sdk/provider": ["@ai-sdk/provider@2.0.0", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA=="], - - "@ai-sdk/openai-compatible/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.0", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.3", "zod-to-json-schema": "^3.24.1" }, "peerDependencies": { "zod": "^3.25.76 || ^4" } }, "sha512-BoQZtGcBxkeSH1zK+SRYNDtJPIPpacTeiMZqnG4Rv6xXjEwM0FH4MGs9c+PlhyEWmQCzjRM2HAotEydFhD4dYw=="], - "@ai-sdk/togetherai/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.32", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YspqqyJPzHjqWrjt4y/Wgc2aJgCcQj5uIJgZpq2Ar/lH30cEVhgE+keePDbjKpetD9UwNggCj7u6kO3unS23OQ=="], "@ai-sdk/vercel/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.32", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YspqqyJPzHjqWrjt4y/Wgc2aJgCcQj5uIJgZpq2Ar/lH30cEVhgE+keePDbjKpetD9UwNggCj7u6kO3unS23OQ=="], - "@ai-sdk/xai/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.30", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-thubwhRtv9uicAxSWwNpinM7hiL/0CkhL/ymPaHuKvI494J7HIzn8KQZQ2ymRz284WTIZnI7VMyyejxW4RMM6w=="], - "@astrojs/check/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], "@astrojs/cloudflare/vite": ["vite@6.4.1", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g=="], @@ -4229,14 +4224,6 @@ "@aws-sdk/xml-builder/fast-xml-parser": ["fast-xml-parser@5.2.5", "", { "dependencies": { "strnum": "^2.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ=="], - "@azure/core-http/@azure/abort-controller": ["@azure/abort-controller@1.1.0", "", { "dependencies": { "tslib": "^2.2.0" } }, "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw=="], - - "@azure/core-http/@azure/core-tracing": ["@azure/core-tracing@1.0.0-preview.13", "", { "dependencies": { "@opentelemetry/api": "^1.0.1", "tslib": "^2.2.0" } }, "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ=="], - - "@azure/core-http/uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], - - "@azure/core-http/xml2js": ["xml2js@0.5.0", "", { "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" } }, "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA=="], - "@azure/core-xml/fast-xml-parser": ["fast-xml-parser@5.3.3", "", { "dependencies": { "strnum": "^2.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-2O3dkPAAC6JavuMm8+4+pgTk+5hoAs+CjZ+sWcQLkX9+/tHRuTkQh/Oaifr8qDmZ8iEHb771Ea6G8CdwkrgvYA=="], "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], @@ -4317,6 +4304,8 @@ "@modelcontextprotocol/sdk/raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], + "@modelcontextprotocol/sdk/zod": ["zod@4.1.8", "", {}, "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ=="], + "@modelcontextprotocol/sdk/zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="], "@octokit/auth-app/@octokit/request": ["@octokit/request@10.0.7", "", { "dependencies": { "@octokit/endpoint": "^11.0.2", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "fast-content-type-parse": "^3.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA=="], @@ -4379,11 +4368,9 @@ "@openauthjs/openauth/jose": ["jose@5.9.6", "", {}, "sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ=="], - "@opencode-ai/desktop/@actions/artifact": ["@actions/artifact@4.0.0", "", { "dependencies": { "@actions/core": "^1.10.0", "@actions/github": "^6.0.1", "@actions/http-client": "^2.1.0", "@azure/core-http": "^3.0.5", "@azure/storage-blob": "^12.15.0", "@octokit/core": "^5.2.1", "@octokit/plugin-request-log": "^1.0.4", "@octokit/plugin-retry": "^3.0.9", "@octokit/request": "^8.4.1", "@octokit/request-error": "^5.1.1", "@protobuf-ts/plugin": "^2.2.3-alpha.1", "archiver": "^7.0.1", "jwt-decode": "^3.1.2", "unzip-stream": "^0.3.1" } }, "sha512-HCc2jMJRAfviGFAh0FsOR/jNfWhirxl7W6z8zDtttt0GltwxBLdEIjLiweOPFl9WbyJRW1VWnPUSAixJqcWUMQ=="], + "@opencoder-ai/desktop/typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="], - "@opencode-ai/desktop/typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="], - - "@opencode-ai/web/@shikijs/transformers": ["@shikijs/transformers@3.20.0", "", { "dependencies": { "@shikijs/core": "3.20.0", "@shikijs/types": "3.20.0" } }, "sha512-PrHHMRr3Q5W1qB/42kJW6laqFyWdhrPF2hNR9qjOm1xcSiAO3hAHo7HaVyHE6pMyevmy3i51O8kuGGXC78uK3g=="], + "@openrouter/sdk/zod": ["zod@4.1.8", "", {}, "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ=="], "@opentui/solid/@babel/core": ["@babel/core@7.28.0", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.6", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.0", "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ=="], @@ -4457,16 +4444,10 @@ "accepts/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - "ai-gateway-provider/@ai-sdk/amazon-bedrock": ["@ai-sdk/amazon-bedrock@3.0.74", "", { "dependencies": { "@ai-sdk/anthropic": "2.0.58", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20", "@smithy/eventstream-codec": "^4.0.1", "@smithy/util-utf8": "^4.0.0", "aws4fetch": "^1.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-q83HE3FBb/HPIvjXsehrHOgCuGHPorSMFt6BYnzIYZy8gNnSqV1OWX4oXVsCAuYPPMtYW/KMK35hmoIFV8QKoQ=="], - "ai-gateway-provider/@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.58", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-CkNW5L1Arv8gPtPlEmKd+yf/SG9ucJf0XQdpMG8OiYEtEMc2smuCA+tyCp8zI7IBVg/FE7nUfFHntQFaOjRwJQ=="], "ai-gateway-provider/@ai-sdk/google-vertex": ["@ai-sdk/google-vertex@3.0.90", "", { "dependencies": { "@ai-sdk/anthropic": "2.0.56", "@ai-sdk/google": "2.0.46", "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.19", "google-auth-library": "^10.5.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-C9MLe1KZGg1ZbupV2osygHtL5qngyCDA6ATatunyfTbIe8TXKG8HGni/3O6ifbnI5qxTidIn150Ox7eIFZVMYg=="], - "ai-gateway-provider/@ai-sdk/openai": ["@ai-sdk/openai@2.0.89", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-4+qWkBCbL9HPKbgrUO/F2uXZ8GqrYxHa8SWEYIzxEJ9zvWw3ISr3t1/27O1i8MGSym+PzEyHBT48EV4LAwWaEw=="], - - "ai-gateway-provider/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.32", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YspqqyJPzHjqWrjt4y/Wgc2aJgCcQj5uIJgZpq2Ar/lH30cEVhgE+keePDbjKpetD9UwNggCj7u6kO3unS23OQ=="], - "ai-gateway-provider/@ai-sdk/xai": ["@ai-sdk/xai@2.0.56", "", { "dependencies": { "@ai-sdk/openai-compatible": "1.0.32", "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-FGlqwWc3tAYqDHE8r8hQGQLcMiPUwgz90oU2QygUH930OWtCLapFkSu114DgVaIN/qoM1DUX+inv0Ee74Fgp5g=="], "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -4507,12 +4488,8 @@ "condense-newlines/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], - "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - "dot-prop/type-fest": ["type-fest@3.13.1", "", {}, "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g=="], - "drizzle-kit/esbuild": ["esbuild@0.19.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.19.12", "@esbuild/android-arm": "0.19.12", "@esbuild/android-arm64": "0.19.12", "@esbuild/android-x64": "0.19.12", "@esbuild/darwin-arm64": "0.19.12", "@esbuild/darwin-x64": "0.19.12", "@esbuild/freebsd-arm64": "0.19.12", "@esbuild/freebsd-x64": "0.19.12", "@esbuild/linux-arm": "0.19.12", "@esbuild/linux-arm64": "0.19.12", "@esbuild/linux-ia32": "0.19.12", "@esbuild/linux-loong64": "0.19.12", "@esbuild/linux-mips64el": "0.19.12", "@esbuild/linux-ppc64": "0.19.12", "@esbuild/linux-riscv64": "0.19.12", "@esbuild/linux-s390x": "0.19.12", "@esbuild/linux-x64": "0.19.12", "@esbuild/netbsd-x64": "0.19.12", "@esbuild/openbsd-x64": "0.19.12", "@esbuild/sunos-x64": "0.19.12", "@esbuild/win32-arm64": "0.19.12", "@esbuild/win32-ia32": "0.19.12", "@esbuild/win32-x64": "0.19.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg=="], - "editorconfig/commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="], "editorconfig/minimatch": ["minimatch@9.0.1", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w=="], @@ -4581,11 +4558,11 @@ "nypm/tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="], - "opencode/@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.62", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.21" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-I3RhaOEMnWlWnrvjNBOYvUb19Dwf2nw01IruZrVJRDi688886e11wnd5DxrBZLd2V29Gizo3vpOPnnExsA+wTA=="], + "openai/zod": ["zod@4.1.8", "", {}, "sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ=="], - "opencode/@ai-sdk/openai": ["@ai-sdk/openai@2.0.89", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-4+qWkBCbL9HPKbgrUO/F2uXZ8GqrYxHa8SWEYIzxEJ9zvWw3ISr3t1/27O1i8MGSym+PzEyHBT48EV4LAwWaEw=="], + "opencoder/@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.58", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-CkNW5L1Arv8gPtPlEmKd+yf/SG9ucJf0XQdpMG8OiYEtEMc2smuCA+tyCp8zI7IBVg/FE7nUfFHntQFaOjRwJQ=="], - "opencode/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.32", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YspqqyJPzHjqWrjt4y/Wgc2aJgCcQj5uIJgZpq2Ar/lH30cEVhgE+keePDbjKpetD9UwNggCj7u6kO3unS23OQ=="], + "opencoder/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.32", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YspqqyJPzHjqWrjt4y/Wgc2aJgCcQj5uIJgZpq2Ar/lH30cEVhgE+keePDbjKpetD9UwNggCj7u6kO3unS23OQ=="], "opencontrol/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-oxzMzYCkZHMntzuyerehK3fV6A2Kwh5BD6CGEJSVDU2QNEhfLOptf2X7esQgaHZXHZY0oHmMsOtIDLP71UJXgA=="], @@ -4715,12 +4692,6 @@ "@actions/github/@octokit/plugin-rest-endpoint-methods/@octokit/types": ["@octokit/types@12.6.0", "", { "dependencies": { "@octokit/openapi-types": "^20.0.0" } }, "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw=="], - "@ai-sdk/anthropic/@ai-sdk/provider-utils/zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="], - - "@ai-sdk/openai-compatible/@ai-sdk/provider-utils/zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="], - - "@ai-sdk/openai/@ai-sdk/provider-utils/zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="], - "@astrojs/check/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], "@astrojs/check/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -4967,12 +4938,6 @@ "@octokit/rest/@octokit/core/before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="], - "@opencode-ai/desktop/@actions/artifact/@actions/http-client": ["@actions/http-client@2.2.3", "", { "dependencies": { "tunnel": "^0.0.6", "undici": "^5.25.4" } }, "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA=="], - - "@opencode-ai/web/@shikijs/transformers/@shikijs/core": ["@shikijs/core@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g=="], - - "@opencode-ai/web/@shikijs/transformers/@shikijs/types": ["@shikijs/types@3.20.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw=="], - "@opentui/solid/@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@pierre/diffs/@shikijs/transformers/@shikijs/core": ["@shikijs/core@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g=="], @@ -5001,8 +4966,6 @@ "accepts/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - "ai-gateway-provider/@ai-sdk/amazon-bedrock/@smithy/eventstream-codec": ["@smithy/eventstream-codec@4.2.8", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@smithy/types": "^4.12.0", "@smithy/util-hex-encoding": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw=="], - "ai-gateway-provider/@ai-sdk/google-vertex/@ai-sdk/anthropic": ["@ai-sdk/anthropic@2.0.56", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.19" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-XHJKu0Yvfu9SPzRfsAFESa+9T7f2YJY6TxykKMfRsAwpeWAiX/Gbx5J5uM15AzYC3Rw8tVP3oH+j7jEivENirQ=="], "ai-gateway-provider/@ai-sdk/google-vertex/@ai-sdk/google": ["@ai-sdk/google@2.0.46", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@ai-sdk/provider-utils": "3.0.19" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-8PK6u4sGE/kXebd7ZkTp+0aya4kNqzoqpS5m7cHY2NfTK6fhPc6GNvE+MZIZIoHQTp5ed86wGBdeBPpFaaUtyg=="], @@ -5011,6 +4974,8 @@ "ai-gateway-provider/@ai-sdk/google-vertex/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.19", "", { "dependencies": { "@ai-sdk/provider": "2.0.0", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-W41Wc9/jbUVXVwCN/7bWa4IKe8MtxO3EyA0Hfhx6grnmiYlCvpI8neSYWFE0zScXJkgA/YK3BRybzgyiXuu6JA=="], + "ai-gateway-provider/@ai-sdk/xai/@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@1.0.32", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@ai-sdk/provider-utils": "3.0.20" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-YspqqyJPzHjqWrjt4y/Wgc2aJgCcQj5uIJgZpq2Ar/lH30cEVhgE+keePDbjKpetD9UwNggCj7u6kO3unS23OQ=="], + "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -5039,54 +5004,6 @@ "c12/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], - "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - - "drizzle-kit/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.19.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA=="], - - "drizzle-kit/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.19.12", "", { "os": "android", "cpu": "arm" }, "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w=="], - - "drizzle-kit/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.19.12", "", { "os": "android", "cpu": "arm64" }, "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA=="], - - "drizzle-kit/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.19.12", "", { "os": "android", "cpu": "x64" }, "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew=="], - - "drizzle-kit/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.19.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g=="], - - "drizzle-kit/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.19.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A=="], - - "drizzle-kit/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.19.12", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA=="], - - "drizzle-kit/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.19.12", "", { "os": "freebsd", "cpu": "x64" }, "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg=="], - - "drizzle-kit/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.19.12", "", { "os": "linux", "cpu": "arm" }, "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w=="], - - "drizzle-kit/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.19.12", "", { "os": "linux", "cpu": "arm64" }, "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA=="], - - "drizzle-kit/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.19.12", "", { "os": "linux", "cpu": "ia32" }, "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA=="], - - "drizzle-kit/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA=="], - - "drizzle-kit/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w=="], - - "drizzle-kit/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.19.12", "", { "os": "linux", "cpu": "ppc64" }, "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg=="], - - "drizzle-kit/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.19.12", "", { "os": "linux", "cpu": "none" }, "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg=="], - - "drizzle-kit/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.19.12", "", { "os": "linux", "cpu": "s390x" }, "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg=="], - - "drizzle-kit/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.19.12", "", { "os": "linux", "cpu": "x64" }, "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg=="], - - "drizzle-kit/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.19.12", "", { "os": "none", "cpu": "x64" }, "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA=="], - - "drizzle-kit/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.19.12", "", { "os": "openbsd", "cpu": "x64" }, "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw=="], - - "drizzle-kit/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.19.12", "", { "os": "sunos", "cpu": "x64" }, "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA=="], - - "drizzle-kit/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.19.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A=="], - - "drizzle-kit/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.19.12", "", { "os": "win32", "cpu": "ia32" }, "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ=="], - - "drizzle-kit/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.19.12", "", { "os": "win32", "cpu": "x64" }, "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA=="], - "esbuild-plugin-copy/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], "express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], @@ -5107,8 +5024,6 @@ "lazystream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], - "opencode/@ai-sdk/anthropic/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@3.0.21", "", { "dependencies": { "@ai-sdk/provider": "2.0.1", "@standard-schema/spec": "^1.0.0", "eventsource-parser": "^3.0.6" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-veuMwTLxsgh31Jjn0SnBABnM1f7ebHhRWcV2ZuY3hP3iJDCZ8VXBaYqcHXoOQDqUXTCas08sKQcHyWK+zl882Q=="], - "opencontrol/@modelcontextprotocol/sdk/express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], "opencontrol/@modelcontextprotocol/sdk/pkce-challenge": ["pkce-challenge@4.1.0", "", {}, "sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ=="], @@ -5297,8 +5212,6 @@ "@octokit/rest/@octokit/core/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="], - "@opencode-ai/desktop/@actions/artifact/@actions/http-client/undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="], - "@slack/web-api/form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], "@solidjs/start/shiki/@shikijs/engine-javascript/oniguruma-to-es": ["oniguruma-to-es@2.3.0", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^5.1.1", "regex-recursion": "^5.1.1" } }, "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g=="], diff --git a/github/bun.lock b/github/bun.lock index 5fb125a7c0c6..7a5955079816 100644 --- a/github/bun.lock +++ b/github/bun.lock @@ -8,7 +8,7 @@ "@actions/github": "6.0.1", "@octokit/graphql": "9.0.1", "@octokit/rest": "22.0.0", - "@opencode-ai/sdk": "0.5.4", + "@opencoder-ai/sdk": "0.5.4", }, "devDependencies": { "@types/bun": "latest", @@ -55,7 +55,7 @@ "@octokit/types": ["@octokit/types@14.1.0", "", { "dependencies": { "@octokit/openapi-types": "^25.1.0" } }, "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g=="], - "@opencode-ai/sdk": ["@opencode-ai/sdk@0.5.4", "", {}, "sha512-bNT9hJgTvmnWGZU4LM90PMy60xOxxCOI5IaGB5voP2EVj+8RdLxmkwuAB4FUHwLo7fNlmxkZp89NVsMYw2Y3Aw=="], + "@opencoder-ai/sdk": ["@opencoder-ai/sdk@0.5.4", "", {}, "sha512-bNT9hJgTvmnWGZU4LM90PMy60xOxxCOI5IaGB5voP2EVj+8RdLxmkwuAB4FUHwLo7fNlmxkZp89NVsMYw2Y3Aw=="], "@types/bun": ["@types/bun@1.2.20", "", { "dependencies": { "bun-types": "1.2.20" } }, "sha512-dX3RGzQ8+KgmMw7CsW4xT5ITBSCrSbfHc36SNT31EOUg/LA9JWq0VDdEXDRSe1InVWpd2yLUM1FUF/kEOyTzYA=="], diff --git a/github/index.ts b/github/index.ts index da310178a7dc..e4604be2d0a6 100644 --- a/github/index.ts +++ b/github/index.ts @@ -6,7 +6,7 @@ import * as core from "@actions/core" import * as github from "@actions/github" import type { Context as GitHubContext } from "@actions/github/lib/context" import type { IssueCommentEvent, PullRequestReviewCommentEvent } from "@octokit/webhooks-types" -import { createOpencodeClient } from "@opencode-ai/sdk" +import { createOpencodeClient } from "@opencoder-ai/sdk" import { spawn } from "node:child_process" type GitHubAuthor = { diff --git a/github/package.json b/github/package.json index e1b913abedcc..74b81a52262e 100644 --- a/github/package.json +++ b/github/package.json @@ -15,6 +15,6 @@ "@actions/github": "6.0.1", "@octokit/graphql": "9.0.1", "@octokit/rest": "catalog:", - "@opencode-ai/sdk": "workspace:*" + "@opencoder-ai/sdk": "workspace:*" } } diff --git a/install b/install index b0716d532082..2304cab77c0a 100755 --- a/install +++ b/install @@ -1,6 +1,6 @@ #!/usr/bin/env bash set -euo pipefail -APP=opencode +APP=opencoder MUTED='\033[0;2m' RED='\033[0;31m' @@ -181,8 +181,8 @@ else fi if [ -z "$requested_version" ]; then - url="https://github.com/anomalyco/opencode/releases/latest/download/$filename" - specific_version=$(curl -s https://api.github.com/repos/anomalyco/opencode/releases/latest | sed -n 's/.*"tag_name": *"v\([^"]*\)".*/\1/p') + url="https://github.com/AryaLabsHQ/opencoder/releases/latest/download/$filename" + specific_version=$(curl -s https://api.github.com/repos/AryaLabsHQ/opencoder/releases/latest | sed -n 's/.*"tag_name": *"v\([^"]*\)".*/\1/p') if [[ $? -ne 0 || -z "$specific_version" ]]; then echo -e "${RED}Failed to fetch version information${NC}" @@ -191,14 +191,14 @@ else else # Strip leading 'v' if present requested_version="${requested_version#v}" - url="https://github.com/anomalyco/opencode/releases/download/v${requested_version}/$filename" + url="https://github.com/AryaLabsHQ/opencoder/releases/download/v${requested_version}/$filename" specific_version=$requested_version # Verify the release exists before downloading - http_status=$(curl -sI -o /dev/null -w "%{http_code}" "https://github.com/anomalyco/opencode/releases/tag/v${requested_version}") + http_status=$(curl -sI -o /dev/null -w "%{http_code}" "https://github.com/AryaLabsHQ/opencoder/releases/tag/v${requested_version}") if [ "$http_status" = "404" ]; then echo -e "${RED}Error: Release v${requested_version} not found${NC}" - echo -e "${MUTED}Available releases: https://github.com/anomalyco/opencode/releases${NC}" + echo -e "${MUTED}Available releases: https://github.com/AryaLabsHQ/opencoder/releases${NC}" exit 1 fi fi diff --git a/package.json b/package.json index c396905d458f..3be93d6b5fb0 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "@octokit/rest": "22.0.0", "@hono/zod-validator": "0.4.2", "ulid": "3.0.1", + "quansync": "0.2.11", "@kobalte/core": "0.13.11", "@types/luxon": "3.7.1", "@types/node": "22.13.9", @@ -50,7 +51,7 @@ "@playwright/test": "1.51.0", "typescript": "5.8.2", "@typescript/native-preview": "7.0.0-dev.20251207.1", - "zod": "4.1.8", + "zod": "4.3.6", "remeda": "2.26.0", "shiki": "3.20.0", "solid-list": "0.3.0", @@ -75,9 +76,10 @@ }, "dependencies": { "@aws-sdk/client-s3": "3.933.0", - "@opencode-ai/plugin": "workspace:*", - "@opencode-ai/script": "workspace:*", - "@opencode-ai/sdk": "workspace:*", + "@opencoder-ai/plugin": "workspace:*", + "@opencoder-ai/script": "workspace:*", + "@opencoder-ai/sdk": "workspace:*", + "quansync": "catalog:", "typescript": "catalog:" }, "repository": { diff --git a/packages/app/AGENTS.md b/packages/app/AGENTS.md index 765e960c8172..76fab2b78e6d 100644 --- a/packages/app/AGENTS.md +++ b/packages/app/AGENTS.md @@ -1,3 +1,39 @@ +# Web App (SolidJS) + +**Package:** `packages/app` +**Type:** Web application + +## Overview + +SolidJS web application with SolidStart. Features include components, hooks, pages, and context management. + +## Structure + +``` +packages/app/src/ +├── addons/ # Additional features +├── components/ # App components +│ └── session/ +├── context/ # React/context providers +├── hooks/ # Custom hooks +├── i18n/ # Internationalization +├── pages/ # Route pages +└── utils/ # Utilities +``` + +## Commands + +```bash +# Dev +bun dev + +# Test +bun test + +# E2E tests +cd packages/app && bun test:e2e +``` + ## Debugging - NEVER try to restart the app, or the server process, EVER. @@ -10,7 +46,7 @@ - App (from `packages/app`): `bun dev -- --port 4444` - Open `http://localhost:4444` to verify UI changes (it targets the backend at `http://localhost:4096`). -## SolidJS +## SolidJS Patterns - Always prefer `createStore` over multiple `createSignal` calls @@ -28,3 +64,13 @@ Core workflow: 2. `agent-browser snapshot -i` - Get interactive elements with refs (@e1, @e2) 3. `agent-browser click @e1` / `fill @e2 "text"` - Interact using refs 4. Re-snapshot after page changes + +## E2E Testing + +Playwright starts the Vite dev server automatically via `webServer`, and UI tests need an opencode backend (defaults to `localhost:4096`). + +```bash +bunx playwright install +bun run test:e2e:local +bun run test:e2e:local -- --grep "settings" +``` diff --git a/packages/app/e2e/files/file-viewer.spec.ts b/packages/app/e2e/files/file-viewer.spec.ts index b968acc130e6..946b515d0829 100644 --- a/packages/app/e2e/files/file-viewer.spec.ts +++ b/packages/app/e2e/files/file-viewer.spec.ts @@ -45,5 +45,5 @@ test("smoke file viewer renders real file content", async ({ page, gotoSession } const code = page.locator('[data-component="code"]').first() await expect(code).toBeVisible() - await expect(code.getByText(/"name"\s*:\s*"@opencode-ai\/app"/)).toBeVisible() + await expect(code.getByText(/"name"\s*:\s*"@opencoder-ai\/app"/)).toBeVisible() }) diff --git a/packages/app/e2e/projects/workspace-new-session.spec.ts b/packages/app/e2e/projects/workspace-new-session.spec.ts index f33972cc3a31..f6ccdd529f9f 100644 --- a/packages/app/e2e/projects/workspace-new-session.spec.ts +++ b/packages/app/e2e/projects/workspace-new-session.spec.ts @@ -1,4 +1,4 @@ -import { base64Decode } from "@opencode-ai/util/encode" +import { base64Decode } from "@opencoder-ai/util/encode" import type { Page } from "@playwright/test" import { test, expect } from "../fixtures" import { cleanupTestProject, openSidebar, sessionIDFromUrl, setWorkspacesEnabled } from "../actions" diff --git a/packages/app/e2e/projects/workspaces.spec.ts b/packages/app/e2e/projects/workspaces.spec.ts index 3867395267b5..83c5d302df38 100644 --- a/packages/app/e2e/projects/workspaces.spec.ts +++ b/packages/app/e2e/projects/workspaces.spec.ts @@ -1,4 +1,4 @@ -import { base64Decode } from "@opencode-ai/util/encode" +import { base64Decode } from "@opencoder-ai/util/encode" import fs from "node:fs/promises" import os from "node:os" import path from "node:path" diff --git a/packages/app/e2e/utils.ts b/packages/app/e2e/utils.ts index ec6cdf830230..e913599ff96f 100644 --- a/packages/app/e2e/utils.ts +++ b/packages/app/e2e/utils.ts @@ -1,5 +1,5 @@ -import { createOpencodeClient } from "@opencode-ai/sdk/v2/client" -import { base64Encode } from "@opencode-ai/util/encode" +import { createOpencodeClient } from "@opencoder-ai/sdk/v2/client" +import { base64Encode } from "@opencoder-ai/util/encode" export const serverHost = process.env.PLAYWRIGHT_SERVER_HOST ?? "localhost" export const serverPort = process.env.PLAYWRIGHT_SERVER_PORT ?? "4096" diff --git a/packages/app/package.json b/packages/app/package.json index 49ce671b60f9..b21682f27679 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,6 +1,6 @@ { - "name": "@opencode-ai/app", - "version": "1.1.65", + "name": "@opencoder-ai/app", + "version": "1.1.63", "description": "", "type": "module", "exports": { @@ -39,9 +39,9 @@ }, "dependencies": { "@kobalte/core": "catalog:", - "@opencode-ai/sdk": "workspace:*", - "@opencode-ai/ui": "workspace:*", - "@opencode-ai/util": "workspace:*", + "@opencoder-ai/sdk": "workspace:*", + "@opencoder-ai/ui": "workspace:*", + "@opencoder-ai/util": "workspace:*", "@shikijs/transformers": "3.9.2", "@solid-primitives/active-element": "2.1.3", "@solid-primitives/audio": "1.4.2", diff --git a/packages/app/src/app.tsx b/packages/app/src/app.tsx index 3032a795f8cd..2b34e6b749f9 100644 --- a/packages/app/src/app.tsx +++ b/packages/app/src/app.tsx @@ -2,14 +2,14 @@ import "@/index.css" import { ErrorBoundary, Suspense, lazy, type JSX, type ParentProps } from "solid-js" import { Router, Route, Navigate } from "@solidjs/router" import { MetaProvider } from "@solidjs/meta" -import { Font } from "@opencode-ai/ui/font" -import { MarkedProvider } from "@opencode-ai/ui/context/marked" -import { DiffComponentProvider } from "@opencode-ai/ui/context/diff" -import { CodeComponentProvider } from "@opencode-ai/ui/context/code" -import { I18nProvider } from "@opencode-ai/ui/context" -import { Diff } from "@opencode-ai/ui/diff" -import { Code } from "@opencode-ai/ui/code" -import { ThemeProvider } from "@opencode-ai/ui/theme" +import { Font } from "@opencoder-ai/ui/font" +import { MarkedProvider } from "@opencoder-ai/ui/context/marked" +import { DiffComponentProvider } from "@opencoder-ai/ui/context/diff" +import { CodeComponentProvider } from "@opencoder-ai/ui/context/code" +import { I18nProvider } from "@opencoder-ai/ui/context" +import { Diff } from "@opencoder-ai/ui/diff" +import { Code } from "@opencoder-ai/ui/code" +import { ThemeProvider } from "@opencoder-ai/ui/theme" import { GlobalSyncProvider } from "@/context/global-sync" import { PermissionProvider } from "@/context/permission" import { LayoutProvider } from "@/context/layout" @@ -22,7 +22,7 @@ import { FileProvider } from "@/context/file" import { CommentsProvider } from "@/context/comments" import { NotificationProvider } from "@/context/notification" import { ModelsProvider } from "@/context/models" -import { DialogProvider } from "@opencode-ai/ui/context/dialog" +import { DialogProvider } from "@opencoder-ai/ui/context/dialog" import { CommandProvider } from "@/context/command" import { LanguageProvider, useLanguage } from "@/context/language" import { usePlatform } from "@/context/platform" diff --git a/packages/app/src/components/dialog-connect-provider.tsx b/packages/app/src/components/dialog-connect-provider.tsx index 90f4f41f7c6f..829f37515546 100644 --- a/packages/app/src/components/dialog-connect-provider.tsx +++ b/packages/app/src/components/dialog-connect-provider.tsx @@ -1,15 +1,15 @@ -import type { ProviderAuthAuthorization } from "@opencode-ai/sdk/v2/client" -import { Button } from "@opencode-ai/ui/button" -import { useDialog } from "@opencode-ai/ui/context/dialog" -import { Dialog } from "@opencode-ai/ui/dialog" -import { Icon } from "@opencode-ai/ui/icon" -import { IconButton } from "@opencode-ai/ui/icon-button" -import type { IconName } from "@opencode-ai/ui/icons/provider" -import { List, type ListRef } from "@opencode-ai/ui/list" -import { ProviderIcon } from "@opencode-ai/ui/provider-icon" -import { Spinner } from "@opencode-ai/ui/spinner" -import { TextField } from "@opencode-ai/ui/text-field" -import { showToast } from "@opencode-ai/ui/toast" +import type { ProviderAuthAuthorization } from "@opencoder-ai/sdk/v2/client" +import { Button } from "@opencoder-ai/ui/button" +import { useDialog } from "@opencoder-ai/ui/context/dialog" +import { Dialog } from "@opencoder-ai/ui/dialog" +import { Icon } from "@opencoder-ai/ui/icon" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import type { IconName } from "@opencoder-ai/ui/icons/provider" +import { List, type ListRef } from "@opencoder-ai/ui/list" +import { ProviderIcon } from "@opencoder-ai/ui/provider-icon" +import { Spinner } from "@opencoder-ai/ui/spinner" +import { TextField } from "@opencoder-ai/ui/text-field" +import { showToast } from "@opencoder-ai/ui/toast" import { createMemo, Match, onCleanup, onMount, Switch } from "solid-js" import { createStore, produce } from "solid-js/store" import { Link } from "@/components/link" diff --git a/packages/app/src/components/dialog-custom-provider.tsx b/packages/app/src/components/dialog-custom-provider.tsx index 017b85a2c997..c0ff92d97288 100644 --- a/packages/app/src/components/dialog-custom-provider.tsx +++ b/packages/app/src/components/dialog-custom-provider.tsx @@ -1,10 +1,10 @@ -import { Button } from "@opencode-ai/ui/button" -import { useDialog } from "@opencode-ai/ui/context/dialog" -import { Dialog } from "@opencode-ai/ui/dialog" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { ProviderIcon } from "@opencode-ai/ui/provider-icon" -import { TextField } from "@opencode-ai/ui/text-field" -import { showToast } from "@opencode-ai/ui/toast" +import { Button } from "@opencoder-ai/ui/button" +import { useDialog } from "@opencoder-ai/ui/context/dialog" +import { Dialog } from "@opencoder-ai/ui/dialog" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { ProviderIcon } from "@opencoder-ai/ui/provider-icon" +import { TextField } from "@opencoder-ai/ui/text-field" +import { showToast } from "@opencoder-ai/ui/toast" import { For } from "solid-js" import { createStore } from "solid-js/store" import { Link } from "@/components/link" diff --git a/packages/app/src/components/dialog-edit-project.tsx b/packages/app/src/components/dialog-edit-project.tsx index ec0793c540ee..037dd76afc81 100644 --- a/packages/app/src/components/dialog-edit-project.tsx +++ b/packages/app/src/components/dialog-edit-project.tsx @@ -1,15 +1,15 @@ -import { Button } from "@opencode-ai/ui/button" -import { useDialog } from "@opencode-ai/ui/context/dialog" -import { Dialog } from "@opencode-ai/ui/dialog" -import { TextField } from "@opencode-ai/ui/text-field" -import { Icon } from "@opencode-ai/ui/icon" +import { Button } from "@opencoder-ai/ui/button" +import { useDialog } from "@opencoder-ai/ui/context/dialog" +import { Dialog } from "@opencoder-ai/ui/dialog" +import { TextField } from "@opencoder-ai/ui/text-field" +import { Icon } from "@opencoder-ai/ui/icon" import { createMemo, For, Show } from "solid-js" import { createStore } from "solid-js/store" import { useGlobalSDK } from "@/context/global-sdk" import { useGlobalSync } from "@/context/global-sync" import { type LocalProject, getAvatarColors } from "@/context/layout" -import { getFilename } from "@opencode-ai/util/path" -import { Avatar } from "@opencode-ai/ui/avatar" +import { getFilename } from "@opencoder-ai/util/path" +import { Avatar } from "@opencoder-ai/ui/avatar" import { useLanguage } from "@/context/language" const AVATAR_COLOR_KEYS = ["pink", "mint", "orange", "purple", "cyan", "lime"] as const diff --git a/packages/app/src/components/dialog-fork.tsx b/packages/app/src/components/dialog-fork.tsx index 8810955cc655..ed3bab026330 100644 --- a/packages/app/src/components/dialog-fork.tsx +++ b/packages/app/src/components/dialog-fork.tsx @@ -3,13 +3,13 @@ import { useNavigate, useParams } from "@solidjs/router" import { useSync } from "@/context/sync" import { useSDK } from "@/context/sdk" import { usePrompt } from "@/context/prompt" -import { useDialog } from "@opencode-ai/ui/context/dialog" -import { Dialog } from "@opencode-ai/ui/dialog" -import { List } from "@opencode-ai/ui/list" -import { showToast } from "@opencode-ai/ui/toast" +import { useDialog } from "@opencoder-ai/ui/context/dialog" +import { Dialog } from "@opencoder-ai/ui/dialog" +import { List } from "@opencoder-ai/ui/list" +import { showToast } from "@opencoder-ai/ui/toast" import { extractPromptFromParts } from "@/utils/prompt" -import type { TextPart as SDKTextPart } from "@opencode-ai/sdk/v2/client" -import { base64Encode } from "@opencode-ai/util/encode" +import type { TextPart as SDKTextPart } from "@opencoder-ai/sdk/v2/client" +import { base64Encode } from "@opencoder-ai/util/encode" import { useLanguage } from "@/context/language" interface ForkableMessage { diff --git a/packages/app/src/components/dialog-manage-models.tsx b/packages/app/src/components/dialog-manage-models.tsx index ace79e38a7c0..5dcf03a51469 100644 --- a/packages/app/src/components/dialog-manage-models.tsx +++ b/packages/app/src/components/dialog-manage-models.tsx @@ -1,13 +1,13 @@ -import { Dialog } from "@opencode-ai/ui/dialog" -import { List } from "@opencode-ai/ui/list" -import { Switch } from "@opencode-ai/ui/switch" -import { Tooltip } from "@opencode-ai/ui/tooltip" -import { Button } from "@opencode-ai/ui/button" +import { Dialog } from "@opencoder-ai/ui/dialog" +import { List } from "@opencoder-ai/ui/list" +import { Switch } from "@opencoder-ai/ui/switch" +import { Tooltip } from "@opencoder-ai/ui/tooltip" +import { Button } from "@opencoder-ai/ui/button" import type { Component } from "solid-js" import { useLocal } from "@/context/local" import { popularProviders } from "@/hooks/use-providers" import { useLanguage } from "@/context/language" -import { useDialog } from "@opencode-ai/ui/context/dialog" +import { useDialog } from "@opencoder-ai/ui/context/dialog" import { DialogSelectProvider } from "./dialog-select-provider" export const DialogManageModels: Component = () => { diff --git a/packages/app/src/components/dialog-release-notes.tsx b/packages/app/src/components/dialog-release-notes.tsx index 2040009a8c3c..b4aab674ad0d 100644 --- a/packages/app/src/components/dialog-release-notes.tsx +++ b/packages/app/src/components/dialog-release-notes.tsx @@ -1,7 +1,7 @@ import { createSignal } from "solid-js" -import { Dialog } from "@opencode-ai/ui/dialog" -import { Button } from "@opencode-ai/ui/button" -import { useDialog } from "@opencode-ai/ui/context/dialog" +import { Dialog } from "@opencoder-ai/ui/dialog" +import { Button } from "@opencoder-ai/ui/button" +import { useDialog } from "@opencoder-ai/ui/context/dialog" import { useSettings } from "@/context/settings" export type Highlight = { diff --git a/packages/app/src/components/dialog-select-directory.tsx b/packages/app/src/components/dialog-select-directory.tsx index 515e640c9fab..4a5ca6fe2299 100644 --- a/packages/app/src/components/dialog-select-directory.tsx +++ b/packages/app/src/components/dialog-select-directory.tsx @@ -1,9 +1,9 @@ -import { useDialog } from "@opencode-ai/ui/context/dialog" -import { Dialog } from "@opencode-ai/ui/dialog" -import { FileIcon } from "@opencode-ai/ui/file-icon" -import { List } from "@opencode-ai/ui/list" -import type { ListRef } from "@opencode-ai/ui/list" -import { getDirectory, getFilename } from "@opencode-ai/util/path" +import { useDialog } from "@opencoder-ai/ui/context/dialog" +import { Dialog } from "@opencoder-ai/ui/dialog" +import { FileIcon } from "@opencoder-ai/ui/file-icon" +import { List } from "@opencoder-ai/ui/list" +import type { ListRef } from "@opencoder-ai/ui/list" +import { getDirectory, getFilename } from "@opencoder-ai/util/path" import fuzzysort from "fuzzysort" import { createMemo, createResource, createSignal } from "solid-js" import { useGlobalSDK } from "@/context/global-sdk" diff --git a/packages/app/src/components/dialog-select-file.tsx b/packages/app/src/components/dialog-select-file.tsx index 29a3666c034b..f56c2cd79624 100644 --- a/packages/app/src/components/dialog-select-file.tsx +++ b/packages/app/src/components/dialog-select-file.tsx @@ -1,11 +1,11 @@ -import { useDialog } from "@opencode-ai/ui/context/dialog" -import { Dialog } from "@opencode-ai/ui/dialog" -import { FileIcon } from "@opencode-ai/ui/file-icon" -import { Icon } from "@opencode-ai/ui/icon" -import { Keybind } from "@opencode-ai/ui/keybind" -import { List } from "@opencode-ai/ui/list" -import { base64Encode } from "@opencode-ai/util/encode" -import { getDirectory, getFilename } from "@opencode-ai/util/path" +import { useDialog } from "@opencoder-ai/ui/context/dialog" +import { Dialog } from "@opencoder-ai/ui/dialog" +import { FileIcon } from "@opencoder-ai/ui/file-icon" +import { Icon } from "@opencoder-ai/ui/icon" +import { Keybind } from "@opencoder-ai/ui/keybind" +import { List } from "@opencoder-ai/ui/list" +import { base64Encode } from "@opencoder-ai/util/encode" +import { getDirectory, getFilename } from "@opencoder-ai/util/path" import { useNavigate, useParams } from "@solidjs/router" import { createMemo, createSignal, Match, onCleanup, Show, Switch } from "solid-js" import { formatKeybind, useCommand, type CommandOption } from "@/context/command" diff --git a/packages/app/src/components/dialog-select-mcp.tsx b/packages/app/src/components/dialog-select-mcp.tsx index f8913eee4fbc..4492fd8c22ac 100644 --- a/packages/app/src/components/dialog-select-mcp.tsx +++ b/packages/app/src/components/dialog-select-mcp.tsx @@ -1,9 +1,9 @@ import { Component, createMemo, createSignal, Show } from "solid-js" import { useSync } from "@/context/sync" import { useSDK } from "@/context/sdk" -import { Dialog } from "@opencode-ai/ui/dialog" -import { List } from "@opencode-ai/ui/list" -import { Switch } from "@opencode-ai/ui/switch" +import { Dialog } from "@opencoder-ai/ui/dialog" +import { List } from "@opencoder-ai/ui/list" +import { Switch } from "@opencoder-ai/ui/switch" import { useLanguage } from "@/context/language" const statusLabels = { diff --git a/packages/app/src/components/dialog-select-model-unpaid.tsx b/packages/app/src/components/dialog-select-model-unpaid.tsx index af788d05b03c..1edcffec02e5 100644 --- a/packages/app/src/components/dialog-select-model-unpaid.tsx +++ b/packages/app/src/components/dialog-select-model-unpaid.tsx @@ -1,11 +1,11 @@ -import { Button } from "@opencode-ai/ui/button" -import { useDialog } from "@opencode-ai/ui/context/dialog" -import { Dialog } from "@opencode-ai/ui/dialog" -import type { IconName } from "@opencode-ai/ui/icons/provider" -import { List, type ListRef } from "@opencode-ai/ui/list" -import { ProviderIcon } from "@opencode-ai/ui/provider-icon" -import { Tag } from "@opencode-ai/ui/tag" -import { Tooltip } from "@opencode-ai/ui/tooltip" +import { Button } from "@opencoder-ai/ui/button" +import { useDialog } from "@opencoder-ai/ui/context/dialog" +import { Dialog } from "@opencoder-ai/ui/dialog" +import type { IconName } from "@opencoder-ai/ui/icons/provider" +import { List, type ListRef } from "@opencoder-ai/ui/list" +import { ProviderIcon } from "@opencoder-ai/ui/provider-icon" +import { Tag } from "@opencoder-ai/ui/tag" +import { Tooltip } from "@opencoder-ai/ui/tooltip" import { type Component, Show } from "solid-js" import { useLocal } from "@/context/local" import { popularProviders, useProviders } from "@/hooks/use-providers" diff --git a/packages/app/src/components/dialog-select-model.tsx b/packages/app/src/components/dialog-select-model.tsx index a196db231a67..de2d04d23bf6 100644 --- a/packages/app/src/components/dialog-select-model.tsx +++ b/packages/app/src/components/dialog-select-model.tsx @@ -2,14 +2,14 @@ import { Popover as Kobalte } from "@kobalte/core/popover" import { Component, ComponentProps, createMemo, JSX, Show, ValidComponent } from "solid-js" import { createStore } from "solid-js/store" import { useLocal } from "@/context/local" -import { useDialog } from "@opencode-ai/ui/context/dialog" +import { useDialog } from "@opencoder-ai/ui/context/dialog" import { popularProviders } from "@/hooks/use-providers" -import { Button } from "@opencode-ai/ui/button" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { Tag } from "@opencode-ai/ui/tag" -import { Dialog } from "@opencode-ai/ui/dialog" -import { List } from "@opencode-ai/ui/list" -import { Tooltip } from "@opencode-ai/ui/tooltip" +import { Button } from "@opencoder-ai/ui/button" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { Tag } from "@opencoder-ai/ui/tag" +import { Dialog } from "@opencoder-ai/ui/dialog" +import { List } from "@opencoder-ai/ui/list" +import { Tooltip } from "@opencoder-ai/ui/tooltip" import { DialogSelectProvider } from "./dialog-select-provider" import { DialogManageModels } from "./dialog-manage-models" import { ModelTooltip } from "./model-tooltip" diff --git a/packages/app/src/components/dialog-select-provider.tsx b/packages/app/src/components/dialog-select-provider.tsx index 8bbd3054b9a2..5dca2a342f92 100644 --- a/packages/app/src/components/dialog-select-provider.tsx +++ b/packages/app/src/components/dialog-select-provider.tsx @@ -1,11 +1,11 @@ import { Component, Show } from "solid-js" -import { useDialog } from "@opencode-ai/ui/context/dialog" +import { useDialog } from "@opencoder-ai/ui/context/dialog" import { popularProviders, useProviders } from "@/hooks/use-providers" -import { Dialog } from "@opencode-ai/ui/dialog" -import { List } from "@opencode-ai/ui/list" -import { Tag } from "@opencode-ai/ui/tag" -import { ProviderIcon } from "@opencode-ai/ui/provider-icon" -import { iconNames, type IconName } from "@opencode-ai/ui/icons/provider" +import { Dialog } from "@opencoder-ai/ui/dialog" +import { List } from "@opencoder-ai/ui/list" +import { Tag } from "@opencoder-ai/ui/tag" +import { ProviderIcon } from "@opencoder-ai/ui/provider-icon" +import { iconNames, type IconName } from "@opencoder-ai/ui/icons/provider" import { DialogConnectProvider } from "./dialog-connect-provider" import { useLanguage } from "@/context/language" import { DialogCustomProvider } from "./dialog-custom-provider" diff --git a/packages/app/src/components/dialog-select-server.tsx b/packages/app/src/components/dialog-select-server.tsx index 4c37806365a2..2a9a2e28ae09 100644 --- a/packages/app/src/components/dialog-select-server.tsx +++ b/packages/app/src/components/dialog-select-server.tsx @@ -1,18 +1,18 @@ import { createResource, createEffect, createMemo, onCleanup, Show } from "solid-js" import { createStore, reconcile } from "solid-js/store" -import { useDialog } from "@opencode-ai/ui/context/dialog" -import { Dialog } from "@opencode-ai/ui/dialog" -import { List } from "@opencode-ai/ui/list" -import { Button } from "@opencode-ai/ui/button" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { TextField } from "@opencode-ai/ui/text-field" +import { useDialog } from "@opencoder-ai/ui/context/dialog" +import { Dialog } from "@opencoder-ai/ui/dialog" +import { List } from "@opencoder-ai/ui/list" +import { Button } from "@opencoder-ai/ui/button" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { TextField } from "@opencoder-ai/ui/text-field" import { normalizeServerUrl, useServer } from "@/context/server" import { usePlatform } from "@/context/platform" import { useNavigate } from "@solidjs/router" import { useLanguage } from "@/context/language" -import { DropdownMenu } from "@opencode-ai/ui/dropdown-menu" +import { DropdownMenu } from "@opencoder-ai/ui/dropdown-menu" import { useGlobalSDK } from "@/context/global-sdk" -import { showToast } from "@opencode-ai/ui/toast" +import { showToast } from "@opencoder-ai/ui/toast" import { ServerRow } from "@/components/server/server-row" import { checkServerHealth, type ServerHealth } from "@/utils/server-health" diff --git a/packages/app/src/components/dialog-settings.tsx b/packages/app/src/components/dialog-settings.tsx index 83cea131f5db..97c80d70da94 100644 --- a/packages/app/src/components/dialog-settings.tsx +++ b/packages/app/src/components/dialog-settings.tsx @@ -1,7 +1,7 @@ import { Component } from "solid-js" -import { Dialog } from "@opencode-ai/ui/dialog" -import { Tabs } from "@opencode-ai/ui/tabs" -import { Icon } from "@opencode-ai/ui/icon" +import { Dialog } from "@opencoder-ai/ui/dialog" +import { Tabs } from "@opencoder-ai/ui/tabs" +import { Icon } from "@opencoder-ai/ui/icon" import { useLanguage } from "@/context/language" import { usePlatform } from "@/context/platform" import { SettingsGeneral } from "./settings-general" diff --git a/packages/app/src/components/file-tree.test.ts b/packages/app/src/components/file-tree.test.ts index 29e20b4807c5..276342350310 100644 --- a/packages/app/src/components/file-tree.test.ts +++ b/packages/app/src/components/file-tree.test.ts @@ -20,15 +20,15 @@ beforeAll(async () => { }, }), })) - mock.module("@opencode-ai/ui/collapsible", () => ({ + mock.module("@opencoder-ai/ui/collapsible", () => ({ Collapsible: { Trigger: (props: { children?: unknown }) => props.children, Content: (props: { children?: unknown }) => props.children, }, })) - mock.module("@opencode-ai/ui/file-icon", () => ({ FileIcon: () => null })) - mock.module("@opencode-ai/ui/icon", () => ({ Icon: () => null })) - mock.module("@opencode-ai/ui/tooltip", () => ({ Tooltip: (props: { children?: unknown }) => props.children })) + mock.module("@opencoder-ai/ui/file-icon", () => ({ FileIcon: () => null })) + mock.module("@opencoder-ai/ui/icon", () => ({ Icon: () => null })) + mock.module("@opencoder-ai/ui/tooltip", () => ({ Tooltip: (props: { children?: unknown }) => props.children })) const mod = await import("./file-tree") shouldListRoot = mod.shouldListRoot shouldListExpanded = mod.shouldListExpanded diff --git a/packages/app/src/components/file-tree.tsx b/packages/app/src/components/file-tree.tsx index 5552cc90b8e4..41e876843e70 100644 --- a/packages/app/src/components/file-tree.tsx +++ b/packages/app/src/components/file-tree.tsx @@ -1,9 +1,9 @@ import { useFile } from "@/context/file" import { encodeFilePath } from "@/context/file/path" -import { Collapsible } from "@opencode-ai/ui/collapsible" -import { FileIcon } from "@opencode-ai/ui/file-icon" -import { Icon } from "@opencode-ai/ui/icon" -import { Tooltip } from "@opencode-ai/ui/tooltip" +import { Collapsible } from "@opencoder-ai/ui/collapsible" +import { FileIcon } from "@opencoder-ai/ui/file-icon" +import { Icon } from "@opencoder-ai/ui/icon" +import { Tooltip } from "@opencoder-ai/ui/tooltip" import { createEffect, createMemo, @@ -19,7 +19,7 @@ import { type ParentProps, } from "solid-js" import { Dynamic } from "solid-js/web" -import type { FileNode } from "@opencode-ai/sdk/v2" +import type { FileNode } from "@opencoder-ai/sdk/v2" function pathToFileUrl(filepath: string): string { return `file://${encodeFilePath(filepath)}` diff --git a/packages/app/src/components/prompt-input.tsx b/packages/app/src/components/prompt-input.tsx index 8e8c3c895b47..4986ea9edeeb 100644 --- a/packages/app/src/components/prompt-input.tsx +++ b/packages/app/src/components/prompt-input.tsx @@ -1,4 +1,4 @@ -import { useFilteredList } from "@opencode-ai/ui/hooks" +import { useFilteredList } from "@opencoder-ai/ui/hooks" import { createEffect, on, Component, Show, For, onCleanup, Switch, Match, createMemo, createSignal } from "solid-js" import { createStore } from "solid-js/store" import { createFocusSignal } from "@solid-primitives/active-element" @@ -19,14 +19,14 @@ import { useSDK } from "@/context/sdk" import { useParams } from "@solidjs/router" import { useSync } from "@/context/sync" import { useComments } from "@/context/comments" -import { Button } from "@opencode-ai/ui/button" -import { Icon } from "@opencode-ai/ui/icon" -import { ProviderIcon } from "@opencode-ai/ui/provider-icon" -import type { IconName } from "@opencode-ai/ui/icons/provider" -import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { Select } from "@opencode-ai/ui/select" -import { useDialog } from "@opencode-ai/ui/context/dialog" +import { Button } from "@opencoder-ai/ui/button" +import { Icon } from "@opencoder-ai/ui/icon" +import { ProviderIcon } from "@opencoder-ai/ui/provider-icon" +import type { IconName } from "@opencoder-ai/ui/icons/provider" +import { Tooltip, TooltipKeybind } from "@opencoder-ai/ui/tooltip" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { Select } from "@opencoder-ai/ui/select" +import { useDialog } from "@opencoder-ai/ui/context/dialog" import { ModelSelectorPopover } from "@/components/dialog-select-model" import { DialogSelectModelUnpaid } from "@/components/dialog-select-model-unpaid" import { useProviders } from "@/hooks/use-providers" @@ -50,7 +50,7 @@ import { PromptContextItems } from "./prompt-input/context-items" import { PromptImageAttachments } from "./prompt-input/image-attachments" import { PromptDragOverlay } from "./prompt-input/drag-overlay" import { promptPlaceholder } from "./prompt-input/placeholder" -import { ImagePreview } from "@opencode-ai/ui/image-preview" +import { ImagePreview } from "@opencoder-ai/ui/image-preview" interface PromptInputProps { class?: string diff --git a/packages/app/src/components/prompt-input/attachments.ts b/packages/app/src/components/prompt-input/attachments.ts index 9ea2e62a65f0..a04735e2439b 100644 --- a/packages/app/src/components/prompt-input/attachments.ts +++ b/packages/app/src/components/prompt-input/attachments.ts @@ -1,5 +1,5 @@ import { onCleanup, onMount } from "solid-js" -import { showToast } from "@opencode-ai/ui/toast" +import { showToast } from "@opencoder-ai/ui/toast" import { usePrompt, type ContentPart, type ImageAttachmentPart } from "@/context/prompt" import { useLanguage } from "@/context/language" import { uuid } from "@/utils/uuid" diff --git a/packages/app/src/components/prompt-input/build-request-parts.ts b/packages/app/src/components/prompt-input/build-request-parts.ts index 0cc54dc2b783..084d2244b533 100644 --- a/packages/app/src/components/prompt-input/build-request-parts.ts +++ b/packages/app/src/components/prompt-input/build-request-parts.ts @@ -1,5 +1,5 @@ -import { getFilename } from "@opencode-ai/util/path" -import { type AgentPartInput, type FilePartInput, type Part, type TextPartInput } from "@opencode-ai/sdk/v2/client" +import { getFilename } from "@opencoder-ai/util/path" +import { type AgentPartInput, type FilePartInput, type Part, type TextPartInput } from "@opencoder-ai/sdk/v2/client" import type { FileSelection } from "@/context/file" import { encodeFilePath } from "@/context/file/path" import type { AgentPart, FileAttachmentPart, ImageAttachmentPart, Prompt } from "@/context/prompt" diff --git a/packages/app/src/components/prompt-input/context-items.tsx b/packages/app/src/components/prompt-input/context-items.tsx index b575c3961110..1f780c83ddb9 100644 --- a/packages/app/src/components/prompt-input/context-items.tsx +++ b/packages/app/src/components/prompt-input/context-items.tsx @@ -1,8 +1,8 @@ import { Component, For, Show } from "solid-js" -import { FileIcon } from "@opencode-ai/ui/file-icon" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { Tooltip } from "@opencode-ai/ui/tooltip" -import { getDirectory, getFilename, getFilenameTruncated } from "@opencode-ai/util/path" +import { FileIcon } from "@opencoder-ai/ui/file-icon" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { Tooltip } from "@opencoder-ai/ui/tooltip" +import { getDirectory, getFilename, getFilenameTruncated } from "@opencoder-ai/util/path" import type { ContextItem } from "@/context/prompt" type PromptContextItem = ContextItem & { key: string } diff --git a/packages/app/src/components/prompt-input/drag-overlay.tsx b/packages/app/src/components/prompt-input/drag-overlay.tsx index 41962ce536e3..3cd2f474576c 100644 --- a/packages/app/src/components/prompt-input/drag-overlay.tsx +++ b/packages/app/src/components/prompt-input/drag-overlay.tsx @@ -1,5 +1,5 @@ import { Component, Show } from "solid-js" -import { Icon } from "@opencode-ai/ui/icon" +import { Icon } from "@opencoder-ai/ui/icon" type PromptDragOverlayProps = { type: "image" | "@mention" | null diff --git a/packages/app/src/components/prompt-input/image-attachments.tsx b/packages/app/src/components/prompt-input/image-attachments.tsx index 835fddc30710..a96ad79a5d72 100644 --- a/packages/app/src/components/prompt-input/image-attachments.tsx +++ b/packages/app/src/components/prompt-input/image-attachments.tsx @@ -1,5 +1,5 @@ import { Component, For, Show } from "solid-js" -import { Icon } from "@opencode-ai/ui/icon" +import { Icon } from "@opencoder-ai/ui/icon" import type { ImageAttachmentPart } from "@/context/prompt" type PromptImageAttachmentsProps = { diff --git a/packages/app/src/components/prompt-input/slash-popover.tsx b/packages/app/src/components/prompt-input/slash-popover.tsx index 259883d61e84..3ec9d95ad5b3 100644 --- a/packages/app/src/components/prompt-input/slash-popover.tsx +++ b/packages/app/src/components/prompt-input/slash-popover.tsx @@ -1,7 +1,7 @@ import { Component, For, Match, Show, Switch } from "solid-js" -import { FileIcon } from "@opencode-ai/ui/file-icon" -import { Icon } from "@opencode-ai/ui/icon" -import { getDirectory, getFilename } from "@opencode-ai/util/path" +import { FileIcon } from "@opencoder-ai/ui/file-icon" +import { Icon } from "@opencoder-ai/ui/icon" +import { getDirectory, getFilename } from "@opencoder-ai/util/path" export type AtOption = | { type: "agent"; name: string; display: string } diff --git a/packages/app/src/components/prompt-input/submit.test.ts b/packages/app/src/components/prompt-input/submit.test.ts index 475a0e20f291..2827cdd9c198 100644 --- a/packages/app/src/components/prompt-input/submit.test.ts +++ b/packages/app/src/components/prompt-input/submit.test.ts @@ -39,18 +39,18 @@ beforeAll(async () => { useParams: () => ({}), })) - mock.module("@opencode-ai/sdk/v2/client", () => ({ + mock.module("@opencoder-ai/sdk/v2/client", () => ({ createOpencodeClient: (input: { directory: string }) => { createdClients.push(input.directory) return clientFor(input.directory) }, })) - mock.module("@opencode-ai/ui/toast", () => ({ + mock.module("@opencoder-ai/ui/toast", () => ({ showToast: () => 0, })) - mock.module("@opencode-ai/util/encode", () => ({ + mock.module("@opencoder-ai/util/encode", () => ({ base64Encode: (value: string) => value, })) diff --git a/packages/app/src/components/prompt-input/submit.ts b/packages/app/src/components/prompt-input/submit.ts index 49d75a95ecc7..2137052330e7 100644 --- a/packages/app/src/components/prompt-input/submit.ts +++ b/packages/app/src/components/prompt-input/submit.ts @@ -1,8 +1,8 @@ import { Accessor } from "solid-js" import { useNavigate, useParams } from "@solidjs/router" -import { createOpencodeClient, type Message } from "@opencode-ai/sdk/v2/client" -import { showToast } from "@opencode-ai/ui/toast" -import { base64Encode } from "@opencode-ai/util/encode" +import { createOpencodeClient, type Message } from "@opencoder-ai/sdk/v2/client" +import { showToast } from "@opencoder-ai/ui/toast" +import { base64Encode } from "@opencoder-ai/util/encode" import { useLocal } from "@/context/local" import { usePrompt, type ImageAttachmentPart, type Prompt } from "@/context/prompt" import { useLayout } from "@/context/layout" diff --git a/packages/app/src/components/question-dock.tsx b/packages/app/src/components/question-dock.tsx index 5054253b87b5..9b5ead49dd81 100644 --- a/packages/app/src/components/question-dock.tsx +++ b/packages/app/src/components/question-dock.tsx @@ -1,9 +1,9 @@ import { For, Show, createMemo, type Component } from "solid-js" import { createStore } from "solid-js/store" -import { Button } from "@opencode-ai/ui/button" -import { Icon } from "@opencode-ai/ui/icon" -import { showToast } from "@opencode-ai/ui/toast" -import type { QuestionAnswer, QuestionRequest } from "@opencode-ai/sdk/v2" +import { Button } from "@opencoder-ai/ui/button" +import { Icon } from "@opencoder-ai/ui/icon" +import { showToast } from "@opencoder-ai/ui/toast" +import type { QuestionAnswer, QuestionRequest } from "@opencoder-ai/sdk/v2" import { useLanguage } from "@/context/language" import { useSDK } from "@/context/sdk" diff --git a/packages/app/src/components/server/server-row.tsx b/packages/app/src/components/server/server-row.tsx index f93bdb33bffb..24a98c93786d 100644 --- a/packages/app/src/components/server/server-row.tsx +++ b/packages/app/src/components/server/server-row.tsx @@ -1,4 +1,4 @@ -import { Tooltip } from "@opencode-ai/ui/tooltip" +import { Tooltip } from "@opencoder-ai/ui/tooltip" import { JSXElement, ParentProps, Show, createEffect, createMemo, createSignal, onCleanup, onMount } from "solid-js" import { serverDisplayName } from "@/context/server" import type { ServerHealth } from "@/utils/server-health" diff --git a/packages/app/src/components/session-context-usage.tsx b/packages/app/src/components/session-context-usage.tsx index c6e60d3edebd..03b4ea6d685b 100644 --- a/packages/app/src/components/session-context-usage.tsx +++ b/packages/app/src/components/session-context-usage.tsx @@ -1,7 +1,7 @@ import { Match, Show, Switch, createMemo } from "solid-js" -import { Tooltip } from "@opencode-ai/ui/tooltip" -import { ProgressCircle } from "@opencode-ai/ui/progress-circle" -import { Button } from "@opencode-ai/ui/button" +import { Tooltip } from "@opencoder-ai/ui/tooltip" +import { ProgressCircle } from "@opencoder-ai/ui/progress-circle" +import { Button } from "@opencoder-ai/ui/button" import { useParams } from "@solidjs/router" import { useLayout } from "@/context/layout" diff --git a/packages/app/src/components/session-lsp-indicator.tsx b/packages/app/src/components/session-lsp-indicator.tsx new file mode 100644 index 000000000000..49ba4a666370 --- /dev/null +++ b/packages/app/src/components/session-lsp-indicator.tsx @@ -0,0 +1,42 @@ +import { createMemo, Show } from "solid-js" +import { useSync } from "@/context/sync" +import { useLanguage } from "@/context/language" +import { Tooltip } from "@opencoder-ai/ui/tooltip" + +export function SessionLspIndicator() { + const sync = useSync() + const language = useLanguage() + + const lspStats = createMemo(() => { + const lsp = sync.data.lsp ?? [] + const connected = lsp.filter((s) => s.status === "connected").length + const hasError = lsp.some((s) => s.status === "error") + const total = lsp.length + return { connected, hasError, total } + }) + + const tooltipContent = createMemo(() => { + const lsp = sync.data.lsp ?? [] + if (lsp.length === 0) return language.t("lsp.tooltip.none") + return lsp.map((s) => s.name).join(", ") + }) + + return ( + 0}> + +
+
0, + }} + /> + + {language.t("lsp.label.connected", { count: lspStats().connected })} + +
+ + + ) +} diff --git a/packages/app/src/components/session-mcp-indicator.tsx b/packages/app/src/components/session-mcp-indicator.tsx new file mode 100644 index 000000000000..4ac0552b8a8b --- /dev/null +++ b/packages/app/src/components/session-mcp-indicator.tsx @@ -0,0 +1,34 @@ +import { createMemo, Show } from "solid-js" +import { Button } from "@opencoder-ai/ui/button" +import { useDialog } from "@opencoder-ai/ui/context/dialog" +import { useSync } from "@/context/sync" +import { DialogSelectMcp } from "@/components/dialog-select-mcp" + +export function SessionMcpIndicator() { + const sync = useSync() + const dialog = useDialog() + + const mcpStats = createMemo(() => { + const mcp = sync.data.mcp ?? {} + const entries = Object.entries(mcp) + const enabled = entries.filter(([, status]) => status.status === "connected").length + const failed = entries.some(([, status]) => status.status === "failed") + const total = entries.length + return { enabled, failed, total } + }) + + return ( + 0}> + + + ) +} diff --git a/packages/app/src/components/session/session-context-breakdown.test.ts b/packages/app/src/components/session/session-context-breakdown.test.ts index f38aecb55da9..f941f577a54a 100644 --- a/packages/app/src/components/session/session-context-breakdown.test.ts +++ b/packages/app/src/components/session/session-context-breakdown.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import type { Message, Part } from "@opencode-ai/sdk/v2/client" +import type { Message, Part } from "@opencoder-ai/sdk/v2/client" import { estimateSessionContextBreakdown } from "./session-context-breakdown" const user = (id: string) => { diff --git a/packages/app/src/components/session/session-context-breakdown.ts b/packages/app/src/components/session/session-context-breakdown.ts index e263b2957b37..afa02c3540e7 100644 --- a/packages/app/src/components/session/session-context-breakdown.ts +++ b/packages/app/src/components/session/session-context-breakdown.ts @@ -1,4 +1,4 @@ -import type { Message, Part } from "@opencode-ai/sdk/v2/client" +import type { Message, Part } from "@opencoder-ai/sdk/v2/client" export type SessionContextBreakdownKey = "system" | "user" | "assistant" | "tool" | "other" diff --git a/packages/app/src/components/session/session-context-metrics.test.ts b/packages/app/src/components/session/session-context-metrics.test.ts index 0e109a71bdac..6cbd7af71cc7 100644 --- a/packages/app/src/components/session/session-context-metrics.test.ts +++ b/packages/app/src/components/session/session-context-metrics.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import type { Message } from "@opencode-ai/sdk/v2/client" +import type { Message } from "@opencoder-ai/sdk/v2/client" import { getSessionContextMetrics } from "./session-context-metrics" const assistant = ( diff --git a/packages/app/src/components/session/session-context-metrics.ts b/packages/app/src/components/session/session-context-metrics.ts index 0789b05f1730..e1507d20c9c3 100644 --- a/packages/app/src/components/session/session-context-metrics.ts +++ b/packages/app/src/components/session/session-context-metrics.ts @@ -1,4 +1,4 @@ -import type { AssistantMessage, Message } from "@opencode-ai/sdk/v2/client" +import type { AssistantMessage, Message } from "@opencoder-ai/sdk/v2/client" type Provider = { id: string diff --git a/packages/app/src/components/session/session-context-tab.tsx b/packages/app/src/components/session/session-context-tab.tsx index 81220b3adb2f..4fc47f60458c 100644 --- a/packages/app/src/components/session/session-context-tab.tsx +++ b/packages/app/src/components/session/session-context-tab.tsx @@ -3,14 +3,14 @@ import type { JSX } from "solid-js" import { useParams } from "@solidjs/router" import { useSync } from "@/context/sync" import { useLayout } from "@/context/layout" -import { checksum } from "@opencode-ai/util/encode" -import { findLast } from "@opencode-ai/util/array" -import { Icon } from "@opencode-ai/ui/icon" -import { Accordion } from "@opencode-ai/ui/accordion" -import { StickyAccordionHeader } from "@opencode-ai/ui/sticky-accordion-header" -import { Code } from "@opencode-ai/ui/code" -import { Markdown } from "@opencode-ai/ui/markdown" -import type { Message, Part, UserMessage } from "@opencode-ai/sdk/v2/client" +import { checksum } from "@opencoder-ai/util/encode" +import { findLast } from "@opencoder-ai/util/array" +import { Icon } from "@opencoder-ai/ui/icon" +import { Accordion } from "@opencoder-ai/ui/accordion" +import { StickyAccordionHeader } from "@opencoder-ai/ui/sticky-accordion-header" +import { Code } from "@opencoder-ai/ui/code" +import { Markdown } from "@opencoder-ai/ui/markdown" +import type { Message, Part, UserMessage } from "@opencoder-ai/sdk/v2/client" import { useLanguage } from "@/context/language" import { getSessionContextMetrics } from "./session-context-metrics" import { estimateSessionContextBreakdown, type SessionContextBreakdownKey } from "./session-context-breakdown" diff --git a/packages/app/src/components/session/session-header.tsx b/packages/app/src/components/session/session-header.tsx index b85b9a536a9d..f695a0533dc4 100644 --- a/packages/app/src/components/session/session-header.tsx +++ b/packages/app/src/components/session/session-header.tsx @@ -9,20 +9,20 @@ import { usePlatform } from "@/context/platform" import { useServer } from "@/context/server" import { useSync } from "@/context/sync" import { useGlobalSDK } from "@/context/global-sdk" -import { getFilename } from "@opencode-ai/util/path" +import { getFilename } from "@opencoder-ai/util/path" import { decode64 } from "@/utils/base64" import { Persist, persisted } from "@/utils/persist" -import { Icon } from "@opencode-ai/ui/icon" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { Button } from "@opencode-ai/ui/button" -import { AppIcon } from "@opencode-ai/ui/app-icon" -import { DropdownMenu } from "@opencode-ai/ui/dropdown-menu" -import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip" -import { Popover } from "@opencode-ai/ui/popover" -import { TextField } from "@opencode-ai/ui/text-field" -import { Keybind } from "@opencode-ai/ui/keybind" -import { showToast } from "@opencode-ai/ui/toast" +import { Icon } from "@opencoder-ai/ui/icon" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { Button } from "@opencoder-ai/ui/button" +import { AppIcon } from "@opencoder-ai/ui/app-icon" +import { DropdownMenu } from "@opencoder-ai/ui/dropdown-menu" +import { Tooltip, TooltipKeybind } from "@opencoder-ai/ui/tooltip" +import { Popover } from "@opencoder-ai/ui/popover" +import { TextField } from "@opencoder-ai/ui/text-field" +import { Keybind } from "@opencoder-ai/ui/keybind" +import { showToast } from "@opencoder-ai/ui/toast" import { StatusPopover } from "../status-popover" const OPEN_APPS = [ diff --git a/packages/app/src/components/session/session-new-view.tsx b/packages/app/src/components/session/session-new-view.tsx index ab96652d4499..a129f73d3539 100644 --- a/packages/app/src/components/session/session-new-view.tsx +++ b/packages/app/src/components/session/session-new-view.tsx @@ -3,8 +3,8 @@ import { DateTime } from "luxon" import { useSync } from "@/context/sync" import { useSDK } from "@/context/sdk" import { useLanguage } from "@/context/language" -import { Icon } from "@opencode-ai/ui/icon" -import { getDirectory, getFilename } from "@opencode-ai/util/path" +import { Icon } from "@opencoder-ai/ui/icon" +import { getDirectory, getFilename } from "@opencoder-ai/util/path" const MAIN_WORKTREE = "main" const CREATE_WORKTREE = "create" diff --git a/packages/app/src/components/session/session-sortable-tab.tsx b/packages/app/src/components/session/session-sortable-tab.tsx index b94e7a8e96cf..d06e33043107 100644 --- a/packages/app/src/components/session/session-sortable-tab.tsx +++ b/packages/app/src/components/session/session-sortable-tab.tsx @@ -1,11 +1,11 @@ import { createMemo, Show } from "solid-js" import type { JSX } from "solid-js" import { createSortable } from "@thisbeyond/solid-dnd" -import { FileIcon } from "@opencode-ai/ui/file-icon" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { TooltipKeybind } from "@opencode-ai/ui/tooltip" -import { Tabs } from "@opencode-ai/ui/tabs" -import { getFilename } from "@opencode-ai/util/path" +import { FileIcon } from "@opencoder-ai/ui/file-icon" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { TooltipKeybind } from "@opencoder-ai/ui/tooltip" +import { Tabs } from "@opencoder-ai/ui/tabs" +import { getFilename } from "@opencoder-ai/util/path" import { useFile } from "@/context/file" import { useLanguage } from "@/context/language" import { useCommand } from "@/context/command" diff --git a/packages/app/src/components/session/session-sortable-terminal-tab.tsx b/packages/app/src/components/session/session-sortable-terminal-tab.tsx index 6fe6186d5102..5604480e1047 100644 --- a/packages/app/src/components/session/session-sortable-terminal-tab.tsx +++ b/packages/app/src/components/session/session-sortable-terminal-tab.tsx @@ -2,10 +2,10 @@ import type { JSX } from "solid-js" import { Show, createEffect, onCleanup } from "solid-js" import { createStore } from "solid-js/store" import { createSortable } from "@thisbeyond/solid-dnd" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { Tabs } from "@opencode-ai/ui/tabs" -import { DropdownMenu } from "@opencode-ai/ui/dropdown-menu" -import { Icon } from "@opencode-ai/ui/icon" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { Tabs } from "@opencoder-ai/ui/tabs" +import { DropdownMenu } from "@opencoder-ai/ui/dropdown-menu" +import { Icon } from "@opencoder-ai/ui/icon" import { useTerminal, type LocalPTY } from "@/context/terminal" import { useLanguage } from "@/context/language" diff --git a/packages/app/src/components/settings-general.tsx b/packages/app/src/components/settings-general.tsx index 439f542bb1cb..42d8c2075a3b 100644 --- a/packages/app/src/components/settings-general.tsx +++ b/packages/app/src/components/settings-general.tsx @@ -1,12 +1,12 @@ import { Component, Show, createMemo, createResource, type JSX } from "solid-js" import { createStore } from "solid-js/store" -import { Button } from "@opencode-ai/ui/button" -import { Icon } from "@opencode-ai/ui/icon" -import { Select } from "@opencode-ai/ui/select" -import { Switch } from "@opencode-ai/ui/switch" -import { Tooltip } from "@opencode-ai/ui/tooltip" -import { useTheme, type ColorScheme } from "@opencode-ai/ui/theme" -import { showToast } from "@opencode-ai/ui/toast" +import { Button } from "@opencoder-ai/ui/button" +import { Icon } from "@opencoder-ai/ui/icon" +import { Select } from "@opencoder-ai/ui/select" +import { Switch } from "@opencoder-ai/ui/switch" +import { Tooltip } from "@opencoder-ai/ui/tooltip" +import { useTheme, type ColorScheme } from "@opencoder-ai/ui/theme" +import { showToast } from "@opencoder-ai/ui/toast" import { useLanguage } from "@/context/language" import { usePlatform } from "@/context/platform" import { useSettings, monoFontFamily } from "@/context/settings" diff --git a/packages/app/src/components/settings-keybinds.tsx b/packages/app/src/components/settings-keybinds.tsx index bcc731af99fb..27f5bfc6400b 100644 --- a/packages/app/src/components/settings-keybinds.tsx +++ b/packages/app/src/components/settings-keybinds.tsx @@ -1,10 +1,10 @@ import { Component, For, Show, createMemo, onCleanup, onMount } from "solid-js" import { createStore } from "solid-js/store" -import { Button } from "@opencode-ai/ui/button" -import { Icon } from "@opencode-ai/ui/icon" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { TextField } from "@opencode-ai/ui/text-field" -import { showToast } from "@opencode-ai/ui/toast" +import { Button } from "@opencoder-ai/ui/button" +import { Icon } from "@opencoder-ai/ui/icon" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { TextField } from "@opencoder-ai/ui/text-field" +import { showToast } from "@opencoder-ai/ui/toast" import fuzzysort from "fuzzysort" import { formatKeybind, parseKeybind, useCommand } from "@/context/command" import { useLanguage } from "@/context/language" diff --git a/packages/app/src/components/settings-models.tsx b/packages/app/src/components/settings-models.tsx index 3a0b7a4fb1b3..fd58a1779607 100644 --- a/packages/app/src/components/settings-models.tsx +++ b/packages/app/src/components/settings-models.tsx @@ -1,10 +1,10 @@ -import { useFilteredList } from "@opencode-ai/ui/hooks" -import { ProviderIcon } from "@opencode-ai/ui/provider-icon" -import { Switch } from "@opencode-ai/ui/switch" -import { Icon } from "@opencode-ai/ui/icon" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { TextField } from "@opencode-ai/ui/text-field" -import type { IconName } from "@opencode-ai/ui/icons/provider" +import { useFilteredList } from "@opencoder-ai/ui/hooks" +import { ProviderIcon } from "@opencoder-ai/ui/provider-icon" +import { Switch } from "@opencoder-ai/ui/switch" +import { Icon } from "@opencoder-ai/ui/icon" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { TextField } from "@opencoder-ai/ui/text-field" +import type { IconName } from "@opencoder-ai/ui/icons/provider" import { type Component, For, Show } from "solid-js" import { useLanguage } from "@/context/language" import { useModels } from "@/context/models" diff --git a/packages/app/src/components/settings-permissions.tsx b/packages/app/src/components/settings-permissions.tsx index 348854491ab2..4121bae07b99 100644 --- a/packages/app/src/components/settings-permissions.tsx +++ b/packages/app/src/components/settings-permissions.tsx @@ -1,5 +1,5 @@ -import { Select } from "@opencode-ai/ui/select" -import { showToast } from "@opencode-ai/ui/toast" +import { Select } from "@opencoder-ai/ui/select" +import { showToast } from "@opencoder-ai/ui/toast" import { Component, For, createMemo, type JSX } from "solid-js" import { useGlobalSync } from "@/context/global-sync" import { useLanguage } from "@/context/language" diff --git a/packages/app/src/components/settings-providers.tsx b/packages/app/src/components/settings-providers.tsx index a3375c9c608b..efe17c91f7ff 100644 --- a/packages/app/src/components/settings-providers.tsx +++ b/packages/app/src/components/settings-providers.tsx @@ -1,9 +1,9 @@ -import { Button } from "@opencode-ai/ui/button" -import { useDialog } from "@opencode-ai/ui/context/dialog" -import { ProviderIcon } from "@opencode-ai/ui/provider-icon" -import { Tag } from "@opencode-ai/ui/tag" -import { showToast } from "@opencode-ai/ui/toast" -import { iconNames, type IconName } from "@opencode-ai/ui/icons/provider" +import { Button } from "@opencoder-ai/ui/button" +import { useDialog } from "@opencoder-ai/ui/context/dialog" +import { ProviderIcon } from "@opencoder-ai/ui/provider-icon" +import { Tag } from "@opencoder-ai/ui/tag" +import { showToast } from "@opencoder-ai/ui/toast" +import { iconNames, type IconName } from "@opencoder-ai/ui/icons/provider" import { popularProviders, useProviders } from "@/hooks/use-providers" import { createMemo, type Component, For, Show } from "solid-js" import { useLanguage } from "@/context/language" diff --git a/packages/app/src/components/status-popover.tsx b/packages/app/src/components/status-popover.tsx index 38152b82314c..de9eb8002a44 100644 --- a/packages/app/src/components/status-popover.tsx +++ b/packages/app/src/components/status-popover.tsx @@ -1,13 +1,13 @@ import { createEffect, createMemo, createSignal, For, onCleanup, Show, type Accessor, type JSXElement } from "solid-js" import { createStore, reconcile } from "solid-js/store" import { useNavigate } from "@solidjs/router" -import { useDialog } from "@opencode-ai/ui/context/dialog" -import { Popover } from "@opencode-ai/ui/popover" -import { Tabs } from "@opencode-ai/ui/tabs" -import { Button } from "@opencode-ai/ui/button" -import { Switch } from "@opencode-ai/ui/switch" -import { Icon } from "@opencode-ai/ui/icon" -import { showToast } from "@opencode-ai/ui/toast" +import { useDialog } from "@opencoder-ai/ui/context/dialog" +import { Popover } from "@opencoder-ai/ui/popover" +import { Tabs } from "@opencoder-ai/ui/tabs" +import { Button } from "@opencoder-ai/ui/button" +import { Switch } from "@opencoder-ai/ui/switch" +import { Icon } from "@opencoder-ai/ui/icon" +import { showToast } from "@opencoder-ai/ui/toast" import { useSync } from "@/context/sync" import { useSDK } from "@/context/sdk" import { normalizeServerUrl, useServer } from "@/context/server" diff --git a/packages/app/src/components/terminal.tsx b/packages/app/src/components/terminal.tsx index ccf7012d20ab..fc9c9fdcee83 100644 --- a/packages/app/src/components/terminal.tsx +++ b/packages/app/src/components/terminal.tsx @@ -6,9 +6,9 @@ import { monoFontFamily, useSettings } from "@/context/settings" import { parseKeybind, matchKeybind } from "@/context/command" import { SerializeAddon } from "@/addons/serialize" import { LocalPTY } from "@/context/terminal" -import { resolveThemeVariant, useTheme, withAlpha, type HexColor } from "@opencode-ai/ui/theme" +import { resolveThemeVariant, useTheme, withAlpha, type HexColor } from "@opencoder-ai/ui/theme" import { useLanguage } from "@/context/language" -import { showToast } from "@opencode-ai/ui/toast" +import { showToast } from "@opencoder-ai/ui/toast" import { disposeIfDisposable, getHoveredLinkText, setOptionIfSupported } from "@/utils/runtime-adapters" import { terminalWriter } from "@/utils/terminal-writer" diff --git a/packages/app/src/components/titlebar.tsx b/packages/app/src/components/titlebar.tsx index 039a25faee80..7c873da0e78d 100644 --- a/packages/app/src/components/titlebar.tsx +++ b/packages/app/src/components/titlebar.tsx @@ -1,11 +1,11 @@ import { createEffect, createMemo, Show, untrack } from "solid-js" import { createStore } from "solid-js/store" import { useLocation, useNavigate } from "@solidjs/router" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { Icon } from "@opencode-ai/ui/icon" -import { Button } from "@opencode-ai/ui/button" -import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip" -import { useTheme } from "@opencode-ai/ui/theme" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { Icon } from "@opencoder-ai/ui/icon" +import { Button } from "@opencoder-ai/ui/button" +import { Tooltip, TooltipKeybind } from "@opencoder-ai/ui/tooltip" +import { useTheme } from "@opencoder-ai/ui/theme" import { useLayout } from "@/context/layout" import { usePlatform } from "@/context/platform" diff --git a/packages/app/src/context/command.tsx b/packages/app/src/context/command.tsx index 237d7188467a..02993d7991ac 100644 --- a/packages/app/src/context/command.tsx +++ b/packages/app/src/context/command.tsx @@ -1,7 +1,7 @@ import { createEffect, createMemo, onCleanup, onMount, type Accessor } from "solid-js" import { createStore } from "solid-js/store" -import { createSimpleContext } from "@opencode-ai/ui/context" -import { useDialog } from "@opencode-ai/ui/context/dialog" +import { createSimpleContext } from "@opencoder-ai/ui/context" +import { useDialog } from "@opencoder-ai/ui/context/dialog" import { useLanguage } from "@/context/language" import { useSettings } from "@/context/settings" import { Persist, persisted } from "@/utils/persist" diff --git a/packages/app/src/context/comments.test.ts b/packages/app/src/context/comments.test.ts index bee5c7871e07..afd9c3ff6464 100644 --- a/packages/app/src/context/comments.test.ts +++ b/packages/app/src/context/comments.test.ts @@ -9,7 +9,7 @@ beforeAll(async () => { useNavigate: () => () => undefined, useParams: () => ({}), })) - mock.module("@opencode-ai/ui/context", () => ({ + mock.module("@opencoder-ai/ui/context", () => ({ createSimpleContext: () => ({ use: () => undefined, provider: () => undefined, diff --git a/packages/app/src/context/comments.tsx b/packages/app/src/context/comments.tsx index ecf63e45b648..c952a993a9a8 100644 --- a/packages/app/src/context/comments.tsx +++ b/packages/app/src/context/comments.tsx @@ -1,6 +1,6 @@ import { batch, createMemo, createRoot, onCleanup } from "solid-js" import { createStore, reconcile, type SetStoreFunction, type Store } from "solid-js/store" -import { createSimpleContext } from "@opencode-ai/ui/context" +import { createSimpleContext } from "@opencoder-ai/ui/context" import { useParams } from "@solidjs/router" import { Persist, persisted } from "@/utils/persist" import { createScopedCache } from "@/utils/scoped-cache" diff --git a/packages/app/src/context/file.tsx b/packages/app/src/context/file.tsx index 99c6d2e4219d..d92803a3f6fe 100644 --- a/packages/app/src/context/file.tsx +++ b/packages/app/src/context/file.tsx @@ -1,9 +1,9 @@ import { batch, createEffect, createMemo, onCleanup } from "solid-js" import { createStore, produce, reconcile } from "solid-js/store" -import { createSimpleContext } from "@opencode-ai/ui/context" -import { showToast } from "@opencode-ai/ui/toast" +import { createSimpleContext } from "@opencoder-ai/ui/context" +import { showToast } from "@opencoder-ai/ui/toast" import { useParams } from "@solidjs/router" -import { getFilename } from "@opencode-ai/util/path" +import { getFilename } from "@opencoder-ai/util/path" import { useSDK } from "./sdk" import { useSync } from "./sync" import { useLanguage } from "@/context/language" diff --git a/packages/app/src/context/file/content-cache.ts b/packages/app/src/context/file/content-cache.ts index 4b724068834b..ca49360feb89 100644 --- a/packages/app/src/context/file/content-cache.ts +++ b/packages/app/src/context/file/content-cache.ts @@ -1,4 +1,4 @@ -import type { FileContent } from "@opencode-ai/sdk/v2" +import type { FileContent } from "@opencoder-ai/sdk/v2" const MAX_FILE_CONTENT_ENTRIES = 40 const MAX_FILE_CONTENT_BYTES = 20 * 1024 * 1024 diff --git a/packages/app/src/context/file/tree-store.ts b/packages/app/src/context/file/tree-store.ts index a86051d286ec..6ae49a11d83e 100644 --- a/packages/app/src/context/file/tree-store.ts +++ b/packages/app/src/context/file/tree-store.ts @@ -1,5 +1,5 @@ import { createStore, produce, reconcile } from "solid-js/store" -import type { FileNode } from "@opencode-ai/sdk/v2" +import type { FileNode } from "@opencoder-ai/sdk/v2" type DirectoryState = { expanded: boolean diff --git a/packages/app/src/context/file/types.ts b/packages/app/src/context/file/types.ts index 7ce8a37c25e6..5fe9cbde9b12 100644 --- a/packages/app/src/context/file/types.ts +++ b/packages/app/src/context/file/types.ts @@ -1,4 +1,4 @@ -import type { FileContent } from "@opencode-ai/sdk/v2" +import type { FileContent } from "@opencoder-ai/sdk/v2" export type FileSelection = { startLine: number diff --git a/packages/app/src/context/file/watcher.ts b/packages/app/src/context/file/watcher.ts index fbf71992791a..6de20720465a 100644 --- a/packages/app/src/context/file/watcher.ts +++ b/packages/app/src/context/file/watcher.ts @@ -1,4 +1,4 @@ -import type { FileNode } from "@opencode-ai/sdk/v2" +import type { FileNode } from "@opencoder-ai/sdk/v2" type WatcherEvent = { type: string diff --git a/packages/app/src/context/global-sdk.tsx b/packages/app/src/context/global-sdk.tsx index 3f93b76a723c..39c5a26ad611 100644 --- a/packages/app/src/context/global-sdk.tsx +++ b/packages/app/src/context/global-sdk.tsx @@ -1,5 +1,5 @@ -import { createOpencodeClient, type Event } from "@opencode-ai/sdk/v2/client" -import { createSimpleContext } from "@opencode-ai/ui/context" +import { createOpencodeClient, type Event } from "@opencoder-ai/sdk/v2/client" +import { createSimpleContext } from "@opencoder-ai/ui/context" import { createGlobalEmitter } from "@solid-primitives/event-bus" import { batch, onCleanup } from "solid-js" import { usePlatform } from "./platform" diff --git a/packages/app/src/context/global-sync.tsx b/packages/app/src/context/global-sync.tsx index 62c7eb66ec9c..d47fd550a3b8 100644 --- a/packages/app/src/context/global-sync.tsx +++ b/packages/app/src/context/global-sync.tsx @@ -5,7 +5,7 @@ import { type ProviderAuthResponse, type ProviderListResponse, createOpencodeClient, -} from "@opencode-ai/sdk/v2/client" +} from "@opencoder-ai/sdk/v2/client" import { createStore, produce, reconcile } from "solid-js/store" import { useGlobalSDK } from "./global-sdk" import type { InitError } from "../pages/error" @@ -21,8 +21,8 @@ import { Switch, Match, } from "solid-js" -import { showToast } from "@opencode-ai/ui/toast" -import { getFilename } from "@opencode-ai/util/path" +import { showToast } from "@opencoder-ai/ui/toast" +import { getFilename } from "@opencoder-ai/util/path" import { usePlatform } from "./platform" import { useLanguage } from "@/context/language" import { Persist, persisted } from "@/utils/persist" diff --git a/packages/app/src/context/global-sync/bootstrap.ts b/packages/app/src/context/global-sync/bootstrap.ts index 2137a19a823e..d585f77e4067 100644 --- a/packages/app/src/context/global-sync/bootstrap.ts +++ b/packages/app/src/context/global-sync/bootstrap.ts @@ -7,12 +7,12 @@ import { type ProviderListResponse, type QuestionRequest, createOpencodeClient, -} from "@opencode-ai/sdk/v2/client" +} from "@opencoder-ai/sdk/v2/client" import { batch } from "solid-js" import { reconcile, type SetStoreFunction, type Store } from "solid-js/store" -import { retry } from "@opencode-ai/util/retry" -import { getFilename } from "@opencode-ai/util/path" -import { showToast } from "@opencode-ai/ui/toast" +import { retry } from "@opencoder-ai/util/retry" +import { getFilename } from "@opencoder-ai/util/path" +import { showToast } from "@opencoder-ai/ui/toast" import { cmp, normalizeProviderList } from "./utils" import type { State, VcsCache } from "./types" diff --git a/packages/app/src/context/global-sync/child-store.ts b/packages/app/src/context/global-sync/child-store.ts index af08c3bd431b..d06b14622df8 100644 --- a/packages/app/src/context/global-sync/child-store.ts +++ b/packages/app/src/context/global-sync/child-store.ts @@ -1,7 +1,7 @@ import { createRoot, createEffect, getOwner, onCleanup, runWithOwner, type Accessor, type Owner } from "solid-js" import { createStore, type SetStoreFunction, type Store } from "solid-js/store" import { Persist, persisted } from "@/utils/persist" -import type { VcsInfo } from "@opencode-ai/sdk/v2/client" +import type { VcsInfo } from "@opencoder-ai/sdk/v2/client" import { DIR_IDLE_TTL_MS, MAX_DIR_STORES, diff --git a/packages/app/src/context/global-sync/event-reducer.test.ts b/packages/app/src/context/global-sync/event-reducer.test.ts index ad63f3c202eb..9ad8c681f56a 100644 --- a/packages/app/src/context/global-sync/event-reducer.test.ts +++ b/packages/app/src/context/global-sync/event-reducer.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import type { Message, Part, PermissionRequest, Project, QuestionRequest, Session } from "@opencode-ai/sdk/v2/client" +import type { Message, Part, PermissionRequest, Project, QuestionRequest, Session } from "@opencoder-ai/sdk/v2/client" import { createStore } from "solid-js/store" import type { State } from "./types" import { applyDirectoryEvent, applyGlobalEvent } from "./event-reducer" diff --git a/packages/app/src/context/global-sync/event-reducer.ts b/packages/app/src/context/global-sync/event-reducer.ts index fa1a43d4793f..8a39ffbde86f 100644 --- a/packages/app/src/context/global-sync/event-reducer.ts +++ b/packages/app/src/context/global-sync/event-reducer.ts @@ -1,4 +1,4 @@ -import { Binary } from "@opencode-ai/util/binary" +import { Binary } from "@opencoder-ai/util/binary" import { produce, reconcile, type SetStoreFunction, type Store } from "solid-js/store" import type { FileDiff, @@ -10,7 +10,7 @@ import type { Session, SessionStatus, Todo, -} from "@opencode-ai/sdk/v2/client" +} from "@opencoder-ai/sdk/v2/client" import type { State, VcsCache } from "./types" import { trimSessions } from "./session-trim" diff --git a/packages/app/src/context/global-sync/session-trim.test.ts b/packages/app/src/context/global-sync/session-trim.test.ts index be12c074b5dc..cd80c6dc52b3 100644 --- a/packages/app/src/context/global-sync/session-trim.test.ts +++ b/packages/app/src/context/global-sync/session-trim.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import type { PermissionRequest, Session } from "@opencode-ai/sdk/v2/client" +import type { PermissionRequest, Session } from "@opencoder-ai/sdk/v2/client" import { trimSessions } from "./session-trim" const session = (input: { id: string; parentID?: string; created: number; updated?: number; archived?: number }) => diff --git a/packages/app/src/context/global-sync/session-trim.ts b/packages/app/src/context/global-sync/session-trim.ts index 800ba74a6849..458b49607a69 100644 --- a/packages/app/src/context/global-sync/session-trim.ts +++ b/packages/app/src/context/global-sync/session-trim.ts @@ -1,4 +1,4 @@ -import type { PermissionRequest, Session } from "@opencode-ai/sdk/v2/client" +import type { PermissionRequest, Session } from "@opencoder-ai/sdk/v2/client" import { cmp } from "./utils" import { SESSION_RECENT_LIMIT, SESSION_RECENT_WINDOW } from "./types" diff --git a/packages/app/src/context/global-sync/types.ts b/packages/app/src/context/global-sync/types.ts index ade0b973a2a5..bfab9d994301 100644 --- a/packages/app/src/context/global-sync/types.ts +++ b/packages/app/src/context/global-sync/types.ts @@ -16,7 +16,7 @@ import type { SessionStatus, Todo, VcsInfo, -} from "@opencode-ai/sdk/v2/client" +} from "@opencoder-ai/sdk/v2/client" import type { Accessor } from "solid-js" import type { SetStoreFunction, Store } from "solid-js/store" diff --git a/packages/app/src/context/global-sync/utils.ts b/packages/app/src/context/global-sync/utils.ts index 6b78134a611b..2f9eab3f2e2c 100644 --- a/packages/app/src/context/global-sync/utils.ts +++ b/packages/app/src/context/global-sync/utils.ts @@ -1,4 +1,4 @@ -import type { Project, ProviderListResponse } from "@opencode-ai/sdk/v2/client" +import type { Project, ProviderListResponse } from "@opencoder-ai/sdk/v2/client" export const cmp = (a: string, b: string) => (a < b ? -1 : a > b ? 1 : 0) diff --git a/packages/app/src/context/highlights.tsx b/packages/app/src/context/highlights.tsx index 476209e41732..c6d9169391b0 100644 --- a/packages/app/src/context/highlights.tsx +++ b/packages/app/src/context/highlights.tsx @@ -1,7 +1,7 @@ import { createEffect, createSignal, onCleanup } from "solid-js" import { createStore } from "solid-js/store" -import { createSimpleContext } from "@opencode-ai/ui/context" -import { useDialog } from "@opencode-ai/ui/context/dialog" +import { createSimpleContext } from "@opencoder-ai/ui/context" +import { useDialog } from "@opencoder-ai/ui/context/dialog" import { usePlatform } from "@/context/platform" import { useSettings } from "@/context/settings" import { persisted } from "@/utils/persist" diff --git a/packages/app/src/context/language.tsx b/packages/app/src/context/language.tsx index a5d894e62eba..b14c486e640d 100644 --- a/packages/app/src/context/language.tsx +++ b/packages/app/src/context/language.tsx @@ -1,7 +1,7 @@ import * as i18n from "@solid-primitives/i18n" import { createEffect, createMemo } from "solid-js" import { createStore } from "solid-js/store" -import { createSimpleContext } from "@opencode-ai/ui/context" +import { createSimpleContext } from "@opencoder-ai/ui/context" import { Persist, persisted } from "@/utils/persist" import { dict as en } from "@/i18n/en" import { dict as zh } from "@/i18n/zh" @@ -19,22 +19,22 @@ import { dict as no } from "@/i18n/no" import { dict as br } from "@/i18n/br" import { dict as th } from "@/i18n/th" import { dict as bs } from "@/i18n/bs" -import { dict as uiEn } from "@opencode-ai/ui/i18n/en" -import { dict as uiZh } from "@opencode-ai/ui/i18n/zh" -import { dict as uiZht } from "@opencode-ai/ui/i18n/zht" -import { dict as uiKo } from "@opencode-ai/ui/i18n/ko" -import { dict as uiDe } from "@opencode-ai/ui/i18n/de" -import { dict as uiEs } from "@opencode-ai/ui/i18n/es" -import { dict as uiFr } from "@opencode-ai/ui/i18n/fr" -import { dict as uiDa } from "@opencode-ai/ui/i18n/da" -import { dict as uiJa } from "@opencode-ai/ui/i18n/ja" -import { dict as uiPl } from "@opencode-ai/ui/i18n/pl" -import { dict as uiRu } from "@opencode-ai/ui/i18n/ru" -import { dict as uiAr } from "@opencode-ai/ui/i18n/ar" -import { dict as uiNo } from "@opencode-ai/ui/i18n/no" -import { dict as uiBr } from "@opencode-ai/ui/i18n/br" -import { dict as uiTh } from "@opencode-ai/ui/i18n/th" -import { dict as uiBs } from "@opencode-ai/ui/i18n/bs" +import { dict as uiEn } from "@opencoder-ai/ui/i18n/en" +import { dict as uiZh } from "@opencoder-ai/ui/i18n/zh" +import { dict as uiZht } from "@opencoder-ai/ui/i18n/zht" +import { dict as uiKo } from "@opencoder-ai/ui/i18n/ko" +import { dict as uiDe } from "@opencoder-ai/ui/i18n/de" +import { dict as uiEs } from "@opencoder-ai/ui/i18n/es" +import { dict as uiFr } from "@opencoder-ai/ui/i18n/fr" +import { dict as uiDa } from "@opencoder-ai/ui/i18n/da" +import { dict as uiJa } from "@opencoder-ai/ui/i18n/ja" +import { dict as uiPl } from "@opencoder-ai/ui/i18n/pl" +import { dict as uiRu } from "@opencoder-ai/ui/i18n/ru" +import { dict as uiAr } from "@opencoder-ai/ui/i18n/ar" +import { dict as uiNo } from "@opencoder-ai/ui/i18n/no" +import { dict as uiBr } from "@opencoder-ai/ui/i18n/br" +import { dict as uiTh } from "@opencoder-ai/ui/i18n/th" +import { dict as uiBs } from "@opencoder-ai/ui/i18n/bs" export type Locale = | "en" diff --git a/packages/app/src/context/layout.tsx b/packages/app/src/context/layout.tsx index 71f0294e7e6c..dff5908378fd 100644 --- a/packages/app/src/context/layout.tsx +++ b/packages/app/src/context/layout.tsx @@ -1,11 +1,11 @@ import { createStore, produce } from "solid-js/store" import { batch, createEffect, createMemo, onCleanup, onMount, type Accessor } from "solid-js" -import { createSimpleContext } from "@opencode-ai/ui/context" +import { createSimpleContext } from "@opencoder-ai/ui/context" import { useGlobalSync } from "./global-sync" import { useGlobalSDK } from "./global-sdk" import { useServer } from "./server" import { usePlatform } from "./platform" -import { Project } from "@opencode-ai/sdk/v2" +import { Project } from "@opencoder-ai/sdk/v2" import { Persist, persisted, removePersisted } from "@/utils/persist" import { same } from "@/utils/same" import { createScrollPersistence, type SessionScroll } from "./layout-scroll" diff --git a/packages/app/src/context/local.tsx b/packages/app/src/context/local.tsx index ac5da60e8629..28606f655e8f 100644 --- a/packages/app/src/context/local.tsx +++ b/packages/app/src/context/local.tsx @@ -1,9 +1,9 @@ import { createStore } from "solid-js/store" import { batch, createMemo } from "solid-js" -import { createSimpleContext } from "@opencode-ai/ui/context" +import { createSimpleContext } from "@opencoder-ai/ui/context" import { useSDK } from "./sdk" import { useSync } from "./sync" -import { base64Encode } from "@opencode-ai/util/encode" +import { base64Encode } from "@opencoder-ai/util/encode" import { useProviders } from "@/hooks/use-providers" import { useModels } from "@/context/models" import { cycleModelVariant, getConfiguredAgentVariant, resolveModelVariant } from "./model-variant" diff --git a/packages/app/src/context/models.tsx b/packages/app/src/context/models.tsx index 12ec8371add1..6843d8d10677 100644 --- a/packages/app/src/context/models.tsx +++ b/packages/app/src/context/models.tsx @@ -2,7 +2,7 @@ import { createMemo } from "solid-js" import { createStore } from "solid-js/store" import { DateTime } from "luxon" import { filter, firstBy, flat, groupBy, mapValues, pipe, uniqueBy, values } from "remeda" -import { createSimpleContext } from "@opencode-ai/ui/context" +import { createSimpleContext } from "@opencoder-ai/ui/context" import { useProviders } from "@/hooks/use-providers" import { Persist, persisted } from "@/utils/persist" diff --git a/packages/app/src/context/notification.tsx b/packages/app/src/context/notification.tsx index 04bc2fdaaaf3..e044fa48ddb1 100644 --- a/packages/app/src/context/notification.tsx +++ b/packages/app/src/context/notification.tsx @@ -1,16 +1,16 @@ import { createStore, reconcile } from "solid-js/store" import { batch, createEffect, createMemo, onCleanup } from "solid-js" import { useParams } from "@solidjs/router" -import { createSimpleContext } from "@opencode-ai/ui/context" +import { createSimpleContext } from "@opencoder-ai/ui/context" import { useGlobalSDK } from "./global-sdk" import { useGlobalSync } from "./global-sync" import { usePlatform } from "@/context/platform" import { useLanguage } from "@/context/language" import { useSettings } from "@/context/settings" -import { Binary } from "@opencode-ai/util/binary" -import { base64Encode } from "@opencode-ai/util/encode" +import { Binary } from "@opencoder-ai/util/binary" +import { base64Encode } from "@opencoder-ai/util/encode" import { decode64 } from "@/utils/base64" -import { EventSessionError } from "@opencode-ai/sdk/v2" +import { EventSessionError } from "@opencoder-ai/sdk/v2" import { Persist, persisted } from "@/utils/persist" import { playSound, soundSrc } from "@/utils/sound" diff --git a/packages/app/src/context/permission.tsx b/packages/app/src/context/permission.tsx index 988723834f95..46e774684c28 100644 --- a/packages/app/src/context/permission.tsx +++ b/packages/app/src/context/permission.tsx @@ -1,12 +1,12 @@ import { createMemo, onCleanup } from "solid-js" import { createStore, produce } from "solid-js/store" -import { createSimpleContext } from "@opencode-ai/ui/context" -import type { PermissionRequest } from "@opencode-ai/sdk/v2/client" +import { createSimpleContext } from "@opencoder-ai/ui/context" +import type { PermissionRequest } from "@opencoder-ai/sdk/v2/client" import { Persist, persisted } from "@/utils/persist" import { useGlobalSDK } from "@/context/global-sdk" import { useGlobalSync } from "./global-sync" import { useParams } from "@solidjs/router" -import { base64Encode } from "@opencode-ai/util/encode" +import { base64Encode } from "@opencoder-ai/util/encode" import { decode64 } from "@/utils/base64" type PermissionRespondFn = (input: { diff --git a/packages/app/src/context/platform.tsx b/packages/app/src/context/platform.tsx index 6d4464258a06..5aa27c10c95e 100644 --- a/packages/app/src/context/platform.tsx +++ b/packages/app/src/context/platform.tsx @@ -1,4 +1,4 @@ -import { createSimpleContext } from "@opencode-ai/ui/context" +import { createSimpleContext } from "@opencoder-ai/ui/context" import { AsyncStorage, SyncStorage } from "@solid-primitives/storage" import type { Accessor } from "solid-js" diff --git a/packages/app/src/context/prompt.tsx b/packages/app/src/context/prompt.tsx index 064892105184..9ca5f1c026ac 100644 --- a/packages/app/src/context/prompt.tsx +++ b/packages/app/src/context/prompt.tsx @@ -1,10 +1,10 @@ import { createStore, type SetStoreFunction } from "solid-js/store" -import { createSimpleContext } from "@opencode-ai/ui/context" +import { createSimpleContext } from "@opencoder-ai/ui/context" import { batch, createMemo, createRoot, onCleanup } from "solid-js" import { useParams } from "@solidjs/router" import type { FileSelection } from "@/context/file" import { Persist, persisted } from "@/utils/persist" -import { checksum } from "@opencode-ai/util/encode" +import { checksum } from "@opencoder-ai/util/encode" interface PartBase { content: string diff --git a/packages/app/src/context/sdk.tsx b/packages/app/src/context/sdk.tsx index 555933619af2..37865d7ad547 100644 --- a/packages/app/src/context/sdk.tsx +++ b/packages/app/src/context/sdk.tsx @@ -1,5 +1,5 @@ -import { createOpencodeClient, type Event } from "@opencode-ai/sdk/v2/client" -import { createSimpleContext } from "@opencode-ai/ui/context" +import { createOpencodeClient, type Event } from "@opencoder-ai/sdk/v2/client" +import { createSimpleContext } from "@opencoder-ai/ui/context" import { createGlobalEmitter } from "@solid-primitives/event-bus" import { createEffect, createMemo, onCleanup, type Accessor } from "solid-js" import { useGlobalSDK } from "./global-sdk" diff --git a/packages/app/src/context/server.tsx b/packages/app/src/context/server.tsx index 5d3d0cf3aa6c..a9088916251a 100644 --- a/packages/app/src/context/server.tsx +++ b/packages/app/src/context/server.tsx @@ -1,4 +1,4 @@ -import { createSimpleContext } from "@opencode-ai/ui/context" +import { createSimpleContext } from "@opencoder-ai/ui/context" import { batch, createEffect, createMemo, onCleanup } from "solid-js" import { createStore } from "solid-js/store" import { usePlatform } from "@/context/platform" diff --git a/packages/app/src/context/settings.tsx b/packages/app/src/context/settings.tsx index d72d4ceb1ec9..2c611a695b0e 100644 --- a/packages/app/src/context/settings.tsx +++ b/packages/app/src/context/settings.tsx @@ -1,6 +1,6 @@ import { createStore, reconcile } from "solid-js/store" import { createEffect, createMemo } from "solid-js" -import { createSimpleContext } from "@opencode-ai/ui/context" +import { createSimpleContext } from "@opencoder-ai/ui/context" import { persisted } from "@/utils/persist" export interface NotificationSettings { diff --git a/packages/app/src/context/sync-optimistic.test.ts b/packages/app/src/context/sync-optimistic.test.ts index 7deeddd6ee61..0c19568128b1 100644 --- a/packages/app/src/context/sync-optimistic.test.ts +++ b/packages/app/src/context/sync-optimistic.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import type { Message, Part } from "@opencode-ai/sdk/v2/client" +import type { Message, Part } from "@opencoder-ai/sdk/v2/client" import { applyOptimisticAdd, applyOptimisticRemove } from "./sync" const userMessage = (id: string, sessionID: string): Message => ({ diff --git a/packages/app/src/context/sync.tsx b/packages/app/src/context/sync.tsx index e5916598b52d..bc9fe3311996 100644 --- a/packages/app/src/context/sync.tsx +++ b/packages/app/src/context/sync.tsx @@ -1,11 +1,11 @@ import { batch, createMemo } from "solid-js" import { createStore, produce, reconcile } from "solid-js/store" -import { Binary } from "@opencode-ai/util/binary" -import { retry } from "@opencode-ai/util/retry" -import { createSimpleContext } from "@opencode-ai/ui/context" +import { Binary } from "@opencoder-ai/util/binary" +import { retry } from "@opencoder-ai/util/retry" +import { createSimpleContext } from "@opencoder-ai/ui/context" import { useGlobalSync } from "./global-sync" import { useSDK } from "./sdk" -import type { Message, Part } from "@opencode-ai/sdk/v2/client" +import type { Message, Part } from "@opencoder-ai/sdk/v2/client" function sortParts(parts: Part[]) { return parts.filter((part) => !!part?.id).sort((a, b) => cmp(a.id, b.id)) @@ -293,7 +293,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ const key = keyFor(directory, sessionID) return runInflight(inflightTodo, key, () => - retry(() => client.session.todo({ sessionID })).then((todo) => { + retry(() => client.session.todo.list({ sessionID })).then((todo) => { setStore("todo", sessionID, reconcile(todo.data ?? [], { key: "id" })) }), ) diff --git a/packages/app/src/context/terminal.test.ts b/packages/app/src/context/terminal.test.ts index a250de57c0de..ace9f6b417e6 100644 --- a/packages/app/src/context/terminal.test.ts +++ b/packages/app/src/context/terminal.test.ts @@ -8,7 +8,7 @@ beforeAll(async () => { useNavigate: () => () => undefined, useParams: () => ({}), })) - mock.module("@opencode-ai/ui/context", () => ({ + mock.module("@opencoder-ai/ui/context", () => ({ createSimpleContext: () => ({ use: () => undefined, provider: () => undefined, diff --git a/packages/app/src/context/terminal.tsx b/packages/app/src/context/terminal.tsx index 64f026219ab9..3724ad136663 100644 --- a/packages/app/src/context/terminal.tsx +++ b/packages/app/src/context/terminal.tsx @@ -1,5 +1,5 @@ import { createStore, produce } from "solid-js/store" -import { createSimpleContext } from "@opencode-ai/ui/context" +import { createSimpleContext } from "@opencoder-ai/ui/context" import { batch, createEffect, createMemo, createRoot, onCleanup } from "solid-js" import { useParams } from "@solidjs/router" import { useSDK } from "./sdk" diff --git a/packages/app/src/i18n/ar.ts b/packages/app/src/i18n/ar.ts index e3792a3c3cc3..5962f82bd3a2 100644 --- a/packages/app/src/i18n/ar.ts +++ b/packages/app/src/i18n/ar.ts @@ -38,6 +38,7 @@ export const dict = { "command.language.set": "استخدام اللغة: {{language}}", "command.session.new": "جلسة جديدة", "command.file.open": "فتح ملف", + "command.file.open.description": "فتح ملف", "command.tab.close": "إغلاق علامة التبويب", "command.context.addSelection": "إضافة التحديد إلى السياق", "command.context.addSelection.description": "إضافة الأسطر المحددة من الملف الحالي", diff --git a/packages/app/src/i18n/br.ts b/packages/app/src/i18n/br.ts index 07d6ce467aeb..8654255fee5c 100644 --- a/packages/app/src/i18n/br.ts +++ b/packages/app/src/i18n/br.ts @@ -38,6 +38,7 @@ export const dict = { "command.language.set": "Usar idioma: {{language}}", "command.session.new": "Nova sessão", "command.file.open": "Abrir arquivo", + "command.file.open.description": "Abrir arquivo", "command.tab.close": "Fechar aba", "command.context.addSelection": "Adicionar seleção ao contexto", "command.context.addSelection.description": "Adicionar as linhas selecionadas do arquivo atual", diff --git a/packages/app/src/i18n/da.ts b/packages/app/src/i18n/da.ts index ac5c4d494b12..b6191c04c011 100644 --- a/packages/app/src/i18n/da.ts +++ b/packages/app/src/i18n/da.ts @@ -44,6 +44,7 @@ export const dict = { "command.session.new": "Ny session", "command.file.open": "Åbn fil", + "command.file.open.description": "Åbn fil", "command.tab.close": "Luk fane", "command.context.addSelection": "Tilføj markering til kontekst", "command.context.addSelection.description": "Tilføj markerede linjer fra den aktuelle fil", diff --git a/packages/app/src/i18n/de.ts b/packages/app/src/i18n/de.ts index 99a950631074..cdfbf4f8f1db 100644 --- a/packages/app/src/i18n/de.ts +++ b/packages/app/src/i18n/de.ts @@ -42,6 +42,7 @@ export const dict = { "command.language.set": "Sprache verwenden: {{language}}", "command.session.new": "Neue Sitzung", "command.file.open": "Datei öffnen", + "command.file.open.description": "Datei öffnen", "command.tab.close": "Tab schließen", "command.context.addSelection": "Auswahl zum Kontext hinzufügen", "command.context.addSelection.description": "Ausgewählte Zeilen aus der aktuellen Datei hinzufügen", diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts index 99513edaa173..38c0f170cdc2 100644 --- a/packages/app/src/i18n/en.ts +++ b/packages/app/src/i18n/en.ts @@ -44,6 +44,7 @@ export const dict = { "command.session.new": "New session", "command.file.open": "Open file", + "command.file.open.description": "Open file", "command.tab.close": "Close tab", "command.context.addSelection": "Add selection to context", "command.context.addSelection.description": "Add selected lines from the current file", diff --git a/packages/app/src/i18n/es.ts b/packages/app/src/i18n/es.ts index 7a6c4974e091..ae149d9dcd78 100644 --- a/packages/app/src/i18n/es.ts +++ b/packages/app/src/i18n/es.ts @@ -44,6 +44,7 @@ export const dict = { "command.session.new": "Nueva sesión", "command.file.open": "Abrir archivo", + "command.file.open.description": "Abrir archivo", "command.tab.close": "Cerrar pestaña", "command.context.addSelection": "Añadir selección al contexto", "command.context.addSelection.description": "Añadir las líneas seleccionadas del archivo actual", diff --git a/packages/app/src/i18n/fr.ts b/packages/app/src/i18n/fr.ts index fc3bf2667943..498159e461ac 100644 --- a/packages/app/src/i18n/fr.ts +++ b/packages/app/src/i18n/fr.ts @@ -38,6 +38,7 @@ export const dict = { "command.language.set": "Utiliser la langue : {{language}}", "command.session.new": "Nouvelle session", "command.file.open": "Ouvrir un fichier", + "command.file.open.description": "Ouvrir un fichier", "command.tab.close": "Fermer l'onglet", "command.context.addSelection": "Ajouter la sélection au contexte", "command.context.addSelection.description": "Ajouter les lignes sélectionnées du fichier actuel", diff --git a/packages/app/src/i18n/ja.ts b/packages/app/src/i18n/ja.ts index b597db02a586..148fa70b752f 100644 --- a/packages/app/src/i18n/ja.ts +++ b/packages/app/src/i18n/ja.ts @@ -38,6 +38,7 @@ export const dict = { "command.language.set": "言語を使用: {{language}}", "command.session.new": "新しいセッション", "command.file.open": "ファイルを開く", + "command.file.open.description": "ファイルを開く", "command.tab.close": "タブを閉じる", "command.context.addSelection": "選択範囲をコンテキストに追加", "command.context.addSelection.description": "現在のファイルから選択した行を追加", diff --git a/packages/app/src/i18n/ko.ts b/packages/app/src/i18n/ko.ts index 525bd035651f..fb4a3a912df5 100644 --- a/packages/app/src/i18n/ko.ts +++ b/packages/app/src/i18n/ko.ts @@ -42,6 +42,7 @@ export const dict = { "command.language.set": "언어 사용: {{language}}", "command.session.new": "새 세션", "command.file.open": "파일 열기", + "command.file.open.description": "파일 열기", "command.tab.close": "탭 닫기", "command.context.addSelection": "선택 영역을 컨텍스트에 추가", "command.context.addSelection.description": "현재 파일에서 선택한 줄을 추가", diff --git a/packages/app/src/i18n/no.ts b/packages/app/src/i18n/no.ts index 98e79e1896af..f9e70c31bba3 100644 --- a/packages/app/src/i18n/no.ts +++ b/packages/app/src/i18n/no.ts @@ -47,6 +47,7 @@ export const dict = { "command.session.new": "Ny sesjon", "command.file.open": "Åpne fil", + "command.file.open.description": "Åpne fil", "command.tab.close": "Lukk fane", "command.context.addSelection": "Legg til markering i kontekst", "command.context.addSelection.description": "Legg til valgte linjer fra gjeldende fil", diff --git a/packages/app/src/i18n/pl.ts b/packages/app/src/i18n/pl.ts index 983c9c14ac1b..e16e1894ef9f 100644 --- a/packages/app/src/i18n/pl.ts +++ b/packages/app/src/i18n/pl.ts @@ -38,6 +38,7 @@ export const dict = { "command.language.set": "Użyj języka: {{language}}", "command.session.new": "Nowa sesja", "command.file.open": "Otwórz plik", + "command.file.open.description": "Otwórz plik", "command.tab.close": "Zamknij kartę", "command.context.addSelection": "Dodaj zaznaczenie do kontekstu", "command.context.addSelection.description": "Dodaj zaznaczone linie z bieżącego pliku", diff --git a/packages/app/src/i18n/ru.ts b/packages/app/src/i18n/ru.ts index f2c87fe0f1ed..82ae7fb75d15 100644 --- a/packages/app/src/i18n/ru.ts +++ b/packages/app/src/i18n/ru.ts @@ -44,6 +44,7 @@ export const dict = { "command.session.new": "Новая сессия", "command.file.open": "Открыть файл", + "command.file.open.description": "Открыть файл", "command.tab.close": "Закрыть вкладку", "command.context.addSelection": "Добавить выделение в контекст", "command.context.addSelection.description": "Добавить выбранные строки из текущего файла", diff --git a/packages/app/src/i18n/th.ts b/packages/app/src/i18n/th.ts index 689e82118968..8a3a022e9f17 100644 --- a/packages/app/src/i18n/th.ts +++ b/packages/app/src/i18n/th.ts @@ -44,6 +44,7 @@ export const dict = { "command.session.new": "เซสชันใหม่", "command.file.open": "เปิดไฟล์", + "command.file.open.description": "เปิดไฟล์", "command.tab.close": "ปิดแท็บ", "command.context.addSelection": "เพิ่มส่วนที่เลือกไปยังบริบท", "command.context.addSelection.description": "เพิ่มบรรทัดที่เลือกจากไฟล์ปัจจุบัน", diff --git a/packages/app/src/i18n/zh.ts b/packages/app/src/i18n/zh.ts index 1b40013b60de..9e8e00b68955 100644 --- a/packages/app/src/i18n/zh.ts +++ b/packages/app/src/i18n/zh.ts @@ -54,7 +54,7 @@ export const dict = { "command.session.new": "新建会话", "command.file.open": "打开文件", - + "command.file.open.description": "打开文件", "command.tab.close": "关闭标签页", "command.context.addSelection": "将所选内容添加到上下文", diff --git a/packages/app/src/i18n/zht.ts b/packages/app/src/i18n/zht.ts index 34aec01b9cb1..899bf80d652d 100644 --- a/packages/app/src/i18n/zht.ts +++ b/packages/app/src/i18n/zht.ts @@ -48,6 +48,7 @@ export const dict = { "command.session.new": "新增工作階段", "command.file.open": "開啟檔案", + "command.file.open.description": "開啟檔案", "command.tab.close": "關閉分頁", "command.context.addSelection": "將選取內容加入上下文", "command.context.addSelection.description": "加入目前檔案中選取的行", diff --git a/packages/app/src/index.css b/packages/app/src/index.css index 4af87bca632a..6f75ae260c0c 100644 --- a/packages/app/src/index.css +++ b/packages/app/src/index.css @@ -1 +1,57 @@ -@import "@opencode-ai/ui/styles/tailwind"; +@import "@opencoder-ai/ui/styles/tailwind"; + +:root { + a { + cursor: default; + } +} + +[data-component="markdown"] ul { + list-style: disc outside; + padding-left: 1.5rem; +} + +[data-component="markdown"] ol { + list-style: decimal outside; + padding-left: 1.5rem; +} + +[data-component="markdown"] li > p:first-child { + display: inline; + margin: 0; +} + +[data-component="markdown"] li > p + p { + display: block; + margin-top: 0.5rem; +} + +*[data-tauri-drag-region] { + app-region: drag; +} + +.session-scroller::-webkit-scrollbar { + width: 10px !important; + height: 10px !important; +} + +.session-scroller::-webkit-scrollbar-track { + background: transparent !important; + border-radius: 5px !important; +} + +.session-scroller::-webkit-scrollbar-thumb { + background: var(--border-weak-base) !important; + border-radius: 5px !important; + border: 3px solid transparent !important; + background-clip: padding-box !important; +} + +.session-scroller::-webkit-scrollbar-thumb:hover { + background: var(--border-weak-base) !important; +} + +.session-scroller { + scrollbar-width: thin !important; + scrollbar-color: var(--border-weak-base) transparent !important; +} diff --git a/packages/app/src/pages/directory-layout.tsx b/packages/app/src/pages/directory-layout.tsx index 2dee09dfb06c..c6891f18c7d7 100644 --- a/packages/app/src/pages/directory-layout.tsx +++ b/packages/app/src/pages/directory-layout.tsx @@ -5,10 +5,10 @@ import { SDKProvider, useSDK } from "@/context/sdk" import { SyncProvider, useSync } from "@/context/sync" import { LocalProvider } from "@/context/local" -import { DataProvider } from "@opencode-ai/ui/context" -import type { QuestionAnswer } from "@opencode-ai/sdk/v2" +import { DataProvider } from "@opencoder-ai/ui/context" +import type { QuestionAnswer } from "@opencoder-ai/sdk/v2" import { decode64 } from "@/utils/base64" -import { showToast } from "@opencode-ai/ui/toast" +import { showToast } from "@opencoder-ai/ui/toast" import { useLanguage } from "@/context/language" function DirectoryDataProvider(props: ParentProps<{ directory: string }>) { diff --git a/packages/app/src/pages/error.tsx b/packages/app/src/pages/error.tsx index a30d86d18093..75b08ae7a496 100644 --- a/packages/app/src/pages/error.tsx +++ b/packages/app/src/pages/error.tsx @@ -1,11 +1,11 @@ -import { TextField } from "@opencode-ai/ui/text-field" -import { Logo } from "@opencode-ai/ui/logo" -import { Button } from "@opencode-ai/ui/button" +import { TextField } from "@opencoder-ai/ui/text-field" +import { Logo } from "@opencoder-ai/ui/logo" +import { Button } from "@opencoder-ai/ui/button" import { Component, Show } from "solid-js" import { createStore } from "solid-js/store" import { usePlatform } from "@/context/platform" import { useLanguage } from "@/context/language" -import { Icon } from "@opencode-ai/ui/icon" +import { Icon } from "@opencoder-ai/ui/icon" export type InitError = { name: string diff --git a/packages/app/src/pages/home.tsx b/packages/app/src/pages/home.tsx index ba3a2b942708..c3467eb6757a 100644 --- a/packages/app/src/pages/home.tsx +++ b/packages/app/src/pages/home.tsx @@ -1,13 +1,13 @@ import { createMemo, For, Match, Switch } from "solid-js" -import { Button } from "@opencode-ai/ui/button" -import { Logo } from "@opencode-ai/ui/logo" +import { Button } from "@opencoder-ai/ui/button" +import { Logo } from "@opencoder-ai/ui/logo" import { useLayout } from "@/context/layout" import { useNavigate } from "@solidjs/router" -import { base64Encode } from "@opencode-ai/util/encode" -import { Icon } from "@opencode-ai/ui/icon" +import { base64Encode } from "@opencoder-ai/util/encode" +import { Icon } from "@opencoder-ai/ui/icon" import { usePlatform } from "@/context/platform" import { DateTime } from "luxon" -import { useDialog } from "@opencode-ai/ui/context/dialog" +import { useDialog } from "@opencoder-ai/ui/context/dialog" import { DialogSelectDirectory } from "@/components/dialog-select-directory" import { DialogSelectServer } from "@/components/dialog-select-server" import { useServer } from "@/context/server" diff --git a/packages/app/src/pages/layout.tsx b/packages/app/src/pages/layout.tsx index 7eb064f425d9..49aae68c6821 100644 --- a/packages/app/src/pages/layout.tsx +++ b/packages/app/src/pages/layout.tsx @@ -16,36 +16,36 @@ import { A, useNavigate, useParams } from "@solidjs/router" import { useLayout, LocalProject } from "@/context/layout" import { useGlobalSync } from "@/context/global-sync" import { Persist, persisted } from "@/utils/persist" -import { base64Encode } from "@opencode-ai/util/encode" +import { base64Encode } from "@opencoder-ai/util/encode" import { decode64 } from "@/utils/base64" -import { ResizeHandle } from "@opencode-ai/ui/resize-handle" -import { Button } from "@opencode-ai/ui/button" -import { Icon } from "@opencode-ai/ui/icon" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip" -import { DropdownMenu } from "@opencode-ai/ui/dropdown-menu" -import { Dialog } from "@opencode-ai/ui/dialog" -import { getFilename } from "@opencode-ai/util/path" -import { Session, type Message } from "@opencode-ai/sdk/v2/client" +import { ResizeHandle } from "@opencoder-ai/ui/resize-handle" +import { Button } from "@opencoder-ai/ui/button" +import { Icon } from "@opencoder-ai/ui/icon" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { Tooltip, TooltipKeybind } from "@opencoder-ai/ui/tooltip" +import { DropdownMenu } from "@opencoder-ai/ui/dropdown-menu" +import { Dialog } from "@opencoder-ai/ui/dialog" +import { getFilename } from "@opencoder-ai/util/path" +import { Session, type Message } from "@opencoder-ai/sdk/v2/client" import { usePlatform } from "@/context/platform" import { useSettings } from "@/context/settings" import { createStore, produce, reconcile } from "solid-js/store" import { DragDropProvider, DragDropSensors, DragOverlay, SortableProvider, closestCenter } from "@thisbeyond/solid-dnd" import type { DragEvent } from "@thisbeyond/solid-dnd" import { useProviders } from "@/hooks/use-providers" -import { showToast, Toast, toaster } from "@opencode-ai/ui/toast" +import { showToast, Toast, toaster } from "@opencoder-ai/ui/toast" import { useGlobalSDK } from "@/context/global-sdk" import { clearWorkspaceTerminals } from "@/context/terminal" import { useNotification } from "@/context/notification" import { usePermission } from "@/context/permission" -import { Binary } from "@opencode-ai/util/binary" -import { retry } from "@opencode-ai/util/retry" +import { Binary } from "@opencoder-ai/util/binary" +import { retry } from "@opencoder-ai/util/retry" import { playSound, soundSrc } from "@/utils/sound" import { createAim } from "@/utils/aim" import { Worktree as WorktreeState } from "@/utils/worktree" -import { useDialog } from "@opencode-ai/ui/context/dialog" -import { useTheme, type ColorScheme } from "@opencode-ai/ui/theme" +import { useDialog } from "@opencoder-ai/ui/context/dialog" +import { useTheme, type ColorScheme } from "@opencoder-ai/ui/theme" import { DialogSelectProvider } from "@/components/dialog-select-provider" import { DialogSelectServer } from "@/components/dialog-select-server" import { DialogSettings } from "@/components/dialog-settings" diff --git a/packages/app/src/pages/layout/helpers.ts b/packages/app/src/pages/layout/helpers.ts index 6a1e7c0123d8..0aa971298b1d 100644 --- a/packages/app/src/pages/layout/helpers.ts +++ b/packages/app/src/pages/layout/helpers.ts @@ -1,5 +1,5 @@ -import { getFilename } from "@opencode-ai/util/path" -import { type Session } from "@opencode-ai/sdk/v2/client" +import { getFilename } from "@opencoder-ai/util/path" +import { type Session } from "@opencoder-ai/sdk/v2/client" export const workspaceKey = (directory: string) => { const drive = directory.match(/^([A-Za-z]:)[\\/]+$/) diff --git a/packages/app/src/pages/layout/inline-editor.tsx b/packages/app/src/pages/layout/inline-editor.tsx index 4189e4a72a08..85d1622b2e28 100644 --- a/packages/app/src/pages/layout/inline-editor.tsx +++ b/packages/app/src/pages/layout/inline-editor.tsx @@ -1,6 +1,6 @@ import { createStore } from "solid-js/store" import { onCleanup, Show, type Accessor } from "solid-js" -import { InlineInput } from "@opencode-ai/ui/inline-input" +import { InlineInput } from "@opencoder-ai/ui/inline-input" export function createInlineEditorController() { // This controller intentionally supports one active inline editor at a time. diff --git a/packages/app/src/pages/layout/sidebar-items.tsx b/packages/app/src/pages/layout/sidebar-items.tsx index d55090370750..6fc90a22261f 100644 --- a/packages/app/src/pages/layout/sidebar-items.tsx +++ b/packages/app/src/pages/layout/sidebar-items.tsx @@ -3,17 +3,17 @@ import { useGlobalSync } from "@/context/global-sync" import { useLanguage } from "@/context/language" import { useLayout, type LocalProject, getAvatarColors } from "@/context/layout" import { useNotification } from "@/context/notification" -import { base64Encode } from "@opencode-ai/util/encode" -import { Avatar } from "@opencode-ai/ui/avatar" -import { DiffChanges } from "@opencode-ai/ui/diff-changes" -import { HoverCard } from "@opencode-ai/ui/hover-card" -import { Icon } from "@opencode-ai/ui/icon" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { MessageNav } from "@opencode-ai/ui/message-nav" -import { Spinner } from "@opencode-ai/ui/spinner" -import { Tooltip } from "@opencode-ai/ui/tooltip" -import { getFilename } from "@opencode-ai/util/path" -import { type Message, type Session, type TextPart, type UserMessage } from "@opencode-ai/sdk/v2/client" +import { base64Encode } from "@opencoder-ai/util/encode" +import { Avatar } from "@opencoder-ai/ui/avatar" +import { DiffChanges } from "@opencoder-ai/ui/diff-changes" +import { HoverCard } from "@opencoder-ai/ui/hover-card" +import { Icon } from "@opencoder-ai/ui/icon" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { MessageNav } from "@opencoder-ai/ui/message-nav" +import { Spinner } from "@opencoder-ai/ui/spinner" +import { Tooltip } from "@opencoder-ai/ui/tooltip" +import { getFilename } from "@opencoder-ai/util/path" +import { type Message, type Session, type TextPart, type UserMessage } from "@opencoder-ai/sdk/v2/client" import { For, Match, Show, Switch, createMemo, onCleanup, type Accessor, type JSX } from "solid-js" import { agentColor } from "@/utils/agent" diff --git a/packages/app/src/pages/layout/sidebar-project.tsx b/packages/app/src/pages/layout/sidebar-project.tsx index 28b129bf7561..d7c26aba836b 100644 --- a/packages/app/src/pages/layout/sidebar-project.tsx +++ b/packages/app/src/pages/layout/sidebar-project.tsx @@ -1,11 +1,11 @@ import { createEffect, createMemo, createSignal, For, Show, type Accessor, type JSX } from "solid-js" -import { base64Encode } from "@opencode-ai/util/encode" -import { Button } from "@opencode-ai/ui/button" -import { ContextMenu } from "@opencode-ai/ui/context-menu" -import { HoverCard } from "@opencode-ai/ui/hover-card" -import { Icon } from "@opencode-ai/ui/icon" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { Tooltip } from "@opencode-ai/ui/tooltip" +import { base64Encode } from "@opencoder-ai/util/encode" +import { Button } from "@opencoder-ai/ui/button" +import { ContextMenu } from "@opencoder-ai/ui/context-menu" +import { HoverCard } from "@opencoder-ai/ui/hover-card" +import { Icon } from "@opencoder-ai/ui/icon" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { Tooltip } from "@opencoder-ai/ui/tooltip" import { createSortable } from "@thisbeyond/solid-dnd" import { type LocalProject } from "@/context/layout" import { useGlobalSync } from "@/context/global-sync" diff --git a/packages/app/src/pages/layout/sidebar-shell.tsx b/packages/app/src/pages/layout/sidebar-shell.tsx index 23abdf157b4a..095970c3d216 100644 --- a/packages/app/src/pages/layout/sidebar-shell.tsx +++ b/packages/app/src/pages/layout/sidebar-shell.tsx @@ -8,8 +8,8 @@ import { type DragEvent, } from "@thisbeyond/solid-dnd" import { ConstrainDragXAxis } from "@/utils/solid-dnd" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { Tooltip, TooltipKeybind } from "@opencoder-ai/ui/tooltip" import { type LocalProject } from "@/context/layout" import { sidebarExpanded } from "./sidebar-shell-helpers" diff --git a/packages/app/src/pages/layout/sidebar-workspace.tsx b/packages/app/src/pages/layout/sidebar-workspace.tsx index 43d99cf8954e..3323df1fcf94 100644 --- a/packages/app/src/pages/layout/sidebar-workspace.tsx +++ b/packages/app/src/pages/layout/sidebar-workspace.tsx @@ -3,16 +3,16 @@ import { createEffect, createMemo, For, Show, type Accessor, type JSX } from "so import { createStore } from "solid-js/store" import { createSortable } from "@thisbeyond/solid-dnd" import { createMediaQuery } from "@solid-primitives/media" -import { base64Encode } from "@opencode-ai/util/encode" -import { getFilename } from "@opencode-ai/util/path" -import { Button } from "@opencode-ai/ui/button" -import { Collapsible } from "@opencode-ai/ui/collapsible" -import { DropdownMenu } from "@opencode-ai/ui/dropdown-menu" -import { Icon } from "@opencode-ai/ui/icon" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { Spinner } from "@opencode-ai/ui/spinner" -import { Tooltip } from "@opencode-ai/ui/tooltip" -import { type Session } from "@opencode-ai/sdk/v2/client" +import { base64Encode } from "@opencoder-ai/util/encode" +import { getFilename } from "@opencoder-ai/util/path" +import { Button } from "@opencoder-ai/ui/button" +import { Collapsible } from "@opencoder-ai/ui/collapsible" +import { DropdownMenu } from "@opencoder-ai/ui/dropdown-menu" +import { Icon } from "@opencoder-ai/ui/icon" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { Spinner } from "@opencoder-ai/ui/spinner" +import { Tooltip } from "@opencoder-ai/ui/tooltip" +import { type Session } from "@opencoder-ai/sdk/v2/client" import { type LocalProject } from "@/context/layout" import { useGlobalSync } from "@/context/global-sync" import { useLanguage } from "@/context/language" diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 101f3312c3f6..1220aaf1446d 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -6,37 +6,37 @@ import { useLocal } from "@/context/local" import { selectionFromLines, useFile, type FileSelection, type SelectedLineRange } from "@/context/file" import { createStore, produce } from "solid-js/store" import { SessionContextUsage } from "@/components/session-context-usage" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { Button } from "@opencode-ai/ui/button" -import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip" -import { Dialog } from "@opencode-ai/ui/dialog" -import { ResizeHandle } from "@opencode-ai/ui/resize-handle" -import { Tabs } from "@opencode-ai/ui/tabs" -import { Select } from "@opencode-ai/ui/select" -import { useCodeComponent } from "@opencode-ai/ui/context/code" -import { createAutoScroll } from "@opencode-ai/ui/hooks" -import { Mark } from "@opencode-ai/ui/logo" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { Button } from "@opencoder-ai/ui/button" +import { Tooltip, TooltipKeybind } from "@opencoder-ai/ui/tooltip" +import { Dialog } from "@opencoder-ai/ui/dialog" +import { ResizeHandle } from "@opencoder-ai/ui/resize-handle" +import { Tabs } from "@opencoder-ai/ui/tabs" +import { Select } from "@opencoder-ai/ui/select" +import { useCodeComponent } from "@opencoder-ai/ui/context/code" +import { createAutoScroll } from "@opencoder-ai/ui/hooks" +import { Mark } from "@opencoder-ai/ui/logo" import { DragDropProvider, DragDropSensors, DragOverlay, SortableProvider, closestCenter } from "@thisbeyond/solid-dnd" import type { DragEvent } from "@thisbeyond/solid-dnd" import { useSync } from "@/context/sync" import { useTerminal, type LocalPTY } from "@/context/terminal" import { useLayout } from "@/context/layout" -import { checksum, base64Encode } from "@opencode-ai/util/encode" -import { findLast } from "@opencode-ai/util/array" -import { useDialog } from "@opencode-ai/ui/context/dialog" +import { checksum, base64Encode } from "@opencoder-ai/util/encode" +import { findLast } from "@opencoder-ai/util/array" +import { useDialog } from "@opencoder-ai/ui/context/dialog" import { DialogSelectFile } from "@/components/dialog-select-file" import FileTree from "@/components/file-tree" import { useCommand } from "@/context/command" import { useLanguage } from "@/context/language" import { useNavigate, useParams } from "@solidjs/router" -import { UserMessage } from "@opencode-ai/sdk/v2" +import { UserMessage } from "@opencoder-ai/sdk/v2" import { useSDK } from "@/context/sdk" import { usePrompt } from "@/context/prompt" import { useComments } from "@/context/comments" import { ConstrainDragYAxis, getDraggableId } from "@/utils/solid-dnd" import { usePermission } from "@/context/permission" -import { showToast } from "@opencode-ai/ui/toast" +import { showToast } from "@opencoder-ai/ui/toast" import { SessionHeader, SessionContextTab, SortableTab, FileVisual, NewSessionView } from "@/components/session" import { navMark, navParams } from "@/utils/perf" import { same } from "@/utils/same" diff --git a/packages/app/src/pages/session/file-tabs.tsx b/packages/app/src/pages/session/file-tabs.tsx index 5b3f57dbed98..5bbf3faa87ab 100644 --- a/packages/app/src/pages/session/file-tabs.tsx +++ b/packages/app/src/pages/session/file-tabs.tsx @@ -1,12 +1,12 @@ import { type ValidComponent, createEffect, createMemo, For, Match, on, onCleanup, Show, Switch } from "solid-js" import { createStore, produce } from "solid-js/store" import { Dynamic } from "solid-js/web" -import { checksum } from "@opencode-ai/util/encode" +import { checksum } from "@opencoder-ai/util/encode" import { decode64 } from "@/utils/base64" -import { showToast } from "@opencode-ai/ui/toast" -import { LineComment as LineCommentView, LineCommentEditor } from "@opencode-ai/ui/line-comment" -import { Mark } from "@opencode-ai/ui/logo" -import { Tabs } from "@opencode-ai/ui/tabs" +import { showToast } from "@opencoder-ai/ui/toast" +import { LineComment as LineCommentView, LineCommentEditor } from "@opencoder-ai/ui/line-comment" +import { Mark } from "@opencoder-ai/ui/logo" +import { Tabs } from "@opencoder-ai/ui/tabs" import { useLayout } from "@/context/layout" import { useFile, type SelectedLineRange } from "@/context/file" import { useComments } from "@/context/comments" diff --git a/packages/app/src/pages/session/message-timeline.tsx b/packages/app/src/pages/session/message-timeline.tsx index d5f04ccf91c4..be5e8f93af72 100644 --- a/packages/app/src/pages/session/message-timeline.tsx +++ b/packages/app/src/pages/session/message-timeline.tsx @@ -1,12 +1,12 @@ import { For, onCleanup, onMount, Show, type JSX } from "solid-js" -import { Button } from "@opencode-ai/ui/button" -import { Icon } from "@opencode-ai/ui/icon" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { DropdownMenu } from "@opencode-ai/ui/dropdown-menu" -import { InlineInput } from "@opencode-ai/ui/inline-input" -import { Tooltip } from "@opencode-ai/ui/tooltip" -import { SessionTurn } from "@opencode-ai/ui/session-turn" -import type { UserMessage } from "@opencode-ai/sdk/v2" +import { Button } from "@opencoder-ai/ui/button" +import { Icon } from "@opencoder-ai/ui/icon" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { DropdownMenu } from "@opencoder-ai/ui/dropdown-menu" +import { InlineInput } from "@opencoder-ai/ui/inline-input" +import { Tooltip } from "@opencoder-ai/ui/tooltip" +import { SessionTurn } from "@opencoder-ai/ui/session-turn" +import type { UserMessage } from "@opencoder-ai/sdk/v2" import { shouldMarkBoundaryGesture, normalizeWheelDelta } from "@/pages/session/message-gesture" const boundaryTarget = (root: HTMLElement, target: EventTarget | null) => { diff --git a/packages/app/src/pages/session/review-tab.tsx b/packages/app/src/pages/session/review-tab.tsx index 634491c72dcc..a771c0468d12 100644 --- a/packages/app/src/pages/session/review-tab.tsx +++ b/packages/app/src/pages/session/review-tab.tsx @@ -1,7 +1,7 @@ import { createEffect, on, onCleanup, type JSX } from "solid-js" import { createStore } from "solid-js/store" -import type { FileDiff } from "@opencode-ai/sdk/v2" -import { SessionReview } from "@opencode-ai/ui/session-review" +import type { FileDiff } from "@opencoder-ai/sdk/v2" +import { SessionReview } from "@opencoder-ai/ui/session-review" import type { SelectedLineRange } from "@/context/file" import { useSDK } from "@/context/sdk" import { useLayout } from "@/context/layout" diff --git a/packages/app/src/pages/session/session-mobile-tabs.tsx b/packages/app/src/pages/session/session-mobile-tabs.tsx index 73aebc079aae..c823ea792c21 100644 --- a/packages/app/src/pages/session/session-mobile-tabs.tsx +++ b/packages/app/src/pages/session/session-mobile-tabs.tsx @@ -1,5 +1,5 @@ import { Show } from "solid-js" -import { Tabs } from "@opencode-ai/ui/tabs" +import { Tabs } from "@opencoder-ai/ui/tabs" export function SessionMobileTabs(props: { open: boolean diff --git a/packages/app/src/pages/session/session-prompt-dock.tsx b/packages/app/src/pages/session/session-prompt-dock.tsx index 8ec4f3b9f8c5..cc2eb0bbe99b 100644 --- a/packages/app/src/pages/session/session-prompt-dock.tsx +++ b/packages/app/src/pages/session/session-prompt-dock.tsx @@ -1,7 +1,7 @@ import { For, Show } from "solid-js" -import type { QuestionRequest } from "@opencode-ai/sdk/v2" -import { Button } from "@opencode-ai/ui/button" -import { BasicTool } from "@opencode-ai/ui/basic-tool" +import type { QuestionRequest } from "@opencoder-ai/sdk/v2" +import { Button } from "@opencoder-ai/ui/button" +import { BasicTool } from "@opencoder-ai/ui/basic-tool" import { PromptInput } from "@/components/prompt-input" import { QuestionDock } from "@/components/question-dock" import { questionSubtitle } from "@/pages/session/session-prompt-helpers" diff --git a/packages/app/src/pages/session/session-side-panel.tsx b/packages/app/src/pages/session/session-side-panel.tsx index 33954f64a12d..2cd19c5f7c17 100644 --- a/packages/app/src/pages/session/session-side-panel.tsx +++ b/packages/app/src/pages/session/session-side-panel.tsx @@ -1,9 +1,9 @@ import { For, Match, Show, Switch, createMemo, onCleanup, type JSX, type ValidComponent } from "solid-js" -import { Tabs } from "@opencode-ai/ui/tabs" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip" -import { ResizeHandle } from "@opencode-ai/ui/resize-handle" -import { Mark } from "@opencode-ai/ui/logo" +import { Tabs } from "@opencoder-ai/ui/tabs" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { Tooltip, TooltipKeybind } from "@opencoder-ai/ui/tooltip" +import { ResizeHandle } from "@opencoder-ai/ui/resize-handle" +import { Mark } from "@opencoder-ai/ui/logo" import FileTree from "@/components/file-tree" import { SessionContextUsage } from "@/components/session-context-usage" import { SessionContextTab, SortableTab, FileVisual } from "@/components/session" @@ -16,12 +16,12 @@ import { ConstrainDragYAxis } from "@/utils/solid-dnd" import type { DragEvent } from "@thisbeyond/solid-dnd" import { useComments } from "@/context/comments" import { useCommand } from "@/context/command" -import { useDialog } from "@opencode-ai/ui/context/dialog" +import { useDialog } from "@opencoder-ai/ui/context/dialog" import { useFile, type SelectedLineRange } from "@/context/file" import { useLanguage } from "@/context/language" import { useLayout } from "@/context/layout" import { useSync } from "@/context/sync" -import type { Message, UserMessage } from "@opencode-ai/sdk/v2/client" +import type { Message, UserMessage } from "@opencoder-ai/sdk/v2/client" type SessionSidePanelViewModel = { messages: () => Message[] diff --git a/packages/app/src/pages/session/terminal-panel.tsx b/packages/app/src/pages/session/terminal-panel.tsx index 7ec4356b13f7..1dd1404196de 100644 --- a/packages/app/src/pages/session/terminal-panel.tsx +++ b/packages/app/src/pages/session/terminal-panel.tsx @@ -1,14 +1,14 @@ -import { For, Show, createMemo } from "solid-js" -import { Tabs } from "@opencode-ai/ui/tabs" -import { ResizeHandle } from "@opencode-ai/ui/resize-handle" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { TooltipKeybind } from "@opencode-ai/ui/tooltip" +import { For, Show } from "solid-js" +import { Tabs } from "@opencoder-ai/ui/tabs" +import { ResizeHandle } from "@opencoder-ai/ui/resize-handle" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { TooltipKeybind } from "@opencoder-ai/ui/tooltip" import { DragDropProvider, DragDropSensors, DragOverlay, SortableProvider, closestCenter } from "@thisbeyond/solid-dnd" import type { DragEvent } from "@thisbeyond/solid-dnd" import { ConstrainDragYAxis } from "@/utils/solid-dnd" import { SortableTerminalTab } from "@/components/session" import { Terminal } from "@/components/terminal" -import { useTerminal } from "@/context/terminal" +import { useTerminal, type LocalPTY } from "@/context/terminal" import { useLanguage } from "@/context/language" import { useCommand } from "@/context/command" import { terminalTabLabel } from "@/pages/session/terminal-label" @@ -28,10 +28,6 @@ export function TerminalPanel(props: { handleTerminalDragEnd: () => void onCloseTab: () => void }) { - const all = createMemo(() => props.terminal.all()) - const ids = createMemo(() => all().map((pty) => pty.id)) - const byId = createMemo(() => new Map(all().map((pty) => [pty.id, pty]))) - return (
- - + t.id)}> + {(pty) => (
- + {(pty) => (
{(draggedId) => { return ( - + t.id === draggedId())}> {(t) => (
{terminalTabLabel({ diff --git a/packages/app/src/pages/session/use-session-commands.tsx b/packages/app/src/pages/session/use-session-commands.tsx index 81c71133f641..ae5de21c1ddf 100644 --- a/packages/app/src/pages/session/use-session-commands.tsx +++ b/packages/app/src/pages/session/use-session-commands.tsx @@ -1,7 +1,7 @@ import { createMemo } from "solid-js" import { useNavigate, useParams } from "@solidjs/router" import { useCommand, type CommandOption } from "@/context/command" -import { useDialog } from "@opencode-ai/ui/context/dialog" +import { useDialog } from "@opencoder-ai/ui/context/dialog" import { useFile, selectionFromLines, type FileSelection, type SelectedLineRange } from "@/context/file" import { useLanguage } from "@/context/language" import { useLayout } from "@/context/layout" @@ -15,10 +15,10 @@ import { DialogSelectFile } from "@/components/dialog-select-file" import { DialogSelectModel } from "@/components/dialog-select-model" import { DialogSelectMcp } from "@/components/dialog-select-mcp" import { DialogFork } from "@/components/dialog-fork" -import { showToast } from "@opencode-ai/ui/toast" -import { findLast } from "@opencode-ai/util/array" +import { showToast } from "@opencoder-ai/ui/toast" +import { findLast } from "@opencoder-ai/util/array" import { extractPromptFromParts } from "@/utils/prompt" -import { UserMessage } from "@opencode-ai/sdk/v2" +import { UserMessage } from "@opencoder-ai/sdk/v2" import { combineCommandSections } from "@/pages/session/helpers" import { canAddSelectionContext } from "@/pages/session/session-command-helpers" diff --git a/packages/app/src/pages/session/use-session-hash-scroll.ts b/packages/app/src/pages/session/use-session-hash-scroll.ts index 555761ad1ec9..e56b0140d4d4 100644 --- a/packages/app/src/pages/session/use-session-hash-scroll.ts +++ b/packages/app/src/pages/session/use-session-hash-scroll.ts @@ -1,5 +1,5 @@ -import { createEffect, createMemo, on, onCleanup } from "solid-js" -import { UserMessage } from "@opencode-ai/sdk/v2" +import { createEffect, on, onCleanup } from "solid-js" +import { UserMessage } from "@opencoder-ai/sdk/v2" export const messageIdFromHash = (hash: string) => { const value = hash.startsWith("#") ? hash.slice(1) : hash @@ -26,10 +26,6 @@ export const useSessionHashScroll = (input: { scheduleScrollState: (el: HTMLDivElement) => void consumePendingMessage: (key: string) => string | undefined }) => { - const visibleUserMessages = createMemo(() => input.visibleUserMessages()) - const messageById = createMemo(() => new Map(visibleUserMessages().map((m) => [m.id, m]))) - const messageIndex = createMemo(() => new Map(visibleUserMessages().map((m, i) => [m.id, i]))) - const clearMessageHash = () => { if (!window.location.hash) return window.history.replaceState(null, "", window.location.href.replace(/#.*$/, "")) @@ -51,9 +47,10 @@ export const useSessionHashScroll = (input: { } const scrollToMessage = (message: UserMessage, behavior: ScrollBehavior = "smooth") => { - if (input.currentMessageId() !== message.id) input.setActiveMessage(message) + input.setActiveMessage(message) - const index = messageIndex().get(message.id) ?? -1 + const msgs = input.visibleUserMessages() + const index = msgs.findIndex((m) => m.id === message.id) if (index !== -1 && index < input.turnStart()) { input.setTurnStart(index) input.scheduleTurnBackfill() @@ -110,7 +107,7 @@ export const useSessionHashScroll = (input: { const messageId = messageIdFromHash(hash) if (messageId) { input.autoScroll.pause() - const msg = messageById().get(messageId) + const msg = input.visibleUserMessages().find((m) => m.id === messageId) if (msg) { scrollToMessage(msg, behavior) return @@ -147,14 +144,14 @@ export const useSessionHashScroll = (input: { createEffect(() => { if (!input.sessionID() || !input.messagesReady()) return - visibleUserMessages() + input.visibleUserMessages().length input.turnStart() const targetId = input.pendingMessage() ?? messageIdFromHash(window.location.hash) if (!targetId) return if (input.currentMessageId() === targetId) return - const msg = messageById().get(targetId) + const msg = input.visibleUserMessages().find((m) => m.id === targetId) if (!msg) return if (input.pendingMessage() === targetId) input.setPendingMessage(undefined) diff --git a/packages/app/src/utils/base64.ts b/packages/app/src/utils/base64.ts index c1f9d88c6e96..2c52b0abeed3 100644 --- a/packages/app/src/utils/base64.ts +++ b/packages/app/src/utils/base64.ts @@ -1,4 +1,4 @@ -import { base64Decode } from "@opencode-ai/util/encode" +import { base64Decode } from "@opencoder-ai/util/encode" export function decode64(value: string | undefined) { if (value === undefined) return diff --git a/packages/app/src/utils/persist.ts b/packages/app/src/utils/persist.ts index 91c504742a94..a50c120dbc02 100644 --- a/packages/app/src/utils/persist.ts +++ b/packages/app/src/utils/persist.ts @@ -1,6 +1,6 @@ import { Platform, usePlatform } from "@/context/platform" import { makePersisted, type AsyncStorage, type SyncStorage } from "@solid-primitives/storage" -import { checksum } from "@opencode-ai/util/encode" +import { checksum } from "@opencoder-ai/util/encode" import { createResource, type Accessor } from "solid-js" import type { SetStoreFunction, Store } from "solid-js/store" diff --git a/packages/app/src/utils/prompt.ts b/packages/app/src/utils/prompt.ts index 35aec0071aac..e247da864984 100644 --- a/packages/app/src/utils/prompt.ts +++ b/packages/app/src/utils/prompt.ts @@ -1,4 +1,4 @@ -import type { AgentPart as MessageAgentPart, FilePart, Part, TextPart } from "@opencode-ai/sdk/v2" +import type { AgentPart as MessageAgentPart, FilePart, Part, TextPart } from "@opencoder-ai/sdk/v2" import type { AgentPart, FileAttachmentPart, ImageAttachmentPart, Prompt } from "@/context/prompt" type Inline = diff --git a/packages/app/src/utils/server-health.ts b/packages/app/src/utils/server-health.ts index 929826d0dea4..d4c9164ea1f9 100644 --- a/packages/app/src/utils/server-health.ts +++ b/packages/app/src/utils/server-health.ts @@ -1,4 +1,4 @@ -import { createOpencodeClient } from "@opencode-ai/sdk/v2/client" +import { createOpencodeClient } from "@opencoder-ai/sdk/v2/client" export type ServerHealth = { healthy: boolean; version?: string } diff --git a/packages/app/src/utils/sound.ts b/packages/app/src/utils/sound.ts index 6dea812ec81b..fe82bc448c63 100644 --- a/packages/app/src/utils/sound.ts +++ b/packages/app/src/utils/sound.ts @@ -1,48 +1,48 @@ -import alert01 from "@opencode-ai/ui/audio/alert-01.aac" -import alert02 from "@opencode-ai/ui/audio/alert-02.aac" -import alert03 from "@opencode-ai/ui/audio/alert-03.aac" -import alert04 from "@opencode-ai/ui/audio/alert-04.aac" -import alert05 from "@opencode-ai/ui/audio/alert-05.aac" -import alert06 from "@opencode-ai/ui/audio/alert-06.aac" -import alert07 from "@opencode-ai/ui/audio/alert-07.aac" -import alert08 from "@opencode-ai/ui/audio/alert-08.aac" -import alert09 from "@opencode-ai/ui/audio/alert-09.aac" -import alert10 from "@opencode-ai/ui/audio/alert-10.aac" -import bipbop01 from "@opencode-ai/ui/audio/bip-bop-01.aac" -import bipbop02 from "@opencode-ai/ui/audio/bip-bop-02.aac" -import bipbop03 from "@opencode-ai/ui/audio/bip-bop-03.aac" -import bipbop04 from "@opencode-ai/ui/audio/bip-bop-04.aac" -import bipbop05 from "@opencode-ai/ui/audio/bip-bop-05.aac" -import bipbop06 from "@opencode-ai/ui/audio/bip-bop-06.aac" -import bipbop07 from "@opencode-ai/ui/audio/bip-bop-07.aac" -import bipbop08 from "@opencode-ai/ui/audio/bip-bop-08.aac" -import bipbop09 from "@opencode-ai/ui/audio/bip-bop-09.aac" -import bipbop10 from "@opencode-ai/ui/audio/bip-bop-10.aac" -import nope01 from "@opencode-ai/ui/audio/nope-01.aac" -import nope02 from "@opencode-ai/ui/audio/nope-02.aac" -import nope03 from "@opencode-ai/ui/audio/nope-03.aac" -import nope04 from "@opencode-ai/ui/audio/nope-04.aac" -import nope05 from "@opencode-ai/ui/audio/nope-05.aac" -import nope06 from "@opencode-ai/ui/audio/nope-06.aac" -import nope07 from "@opencode-ai/ui/audio/nope-07.aac" -import nope08 from "@opencode-ai/ui/audio/nope-08.aac" -import nope09 from "@opencode-ai/ui/audio/nope-09.aac" -import nope10 from "@opencode-ai/ui/audio/nope-10.aac" -import nope11 from "@opencode-ai/ui/audio/nope-11.aac" -import nope12 from "@opencode-ai/ui/audio/nope-12.aac" -import staplebops01 from "@opencode-ai/ui/audio/staplebops-01.aac" -import staplebops02 from "@opencode-ai/ui/audio/staplebops-02.aac" -import staplebops03 from "@opencode-ai/ui/audio/staplebops-03.aac" -import staplebops04 from "@opencode-ai/ui/audio/staplebops-04.aac" -import staplebops05 from "@opencode-ai/ui/audio/staplebops-05.aac" -import staplebops06 from "@opencode-ai/ui/audio/staplebops-06.aac" -import staplebops07 from "@opencode-ai/ui/audio/staplebops-07.aac" -import yup01 from "@opencode-ai/ui/audio/yup-01.aac" -import yup02 from "@opencode-ai/ui/audio/yup-02.aac" -import yup03 from "@opencode-ai/ui/audio/yup-03.aac" -import yup04 from "@opencode-ai/ui/audio/yup-04.aac" -import yup05 from "@opencode-ai/ui/audio/yup-05.aac" -import yup06 from "@opencode-ai/ui/audio/yup-06.aac" +import alert01 from "@opencoder-ai/ui/audio/alert-01.aac" +import alert02 from "@opencoder-ai/ui/audio/alert-02.aac" +import alert03 from "@opencoder-ai/ui/audio/alert-03.aac" +import alert04 from "@opencoder-ai/ui/audio/alert-04.aac" +import alert05 from "@opencoder-ai/ui/audio/alert-05.aac" +import alert06 from "@opencoder-ai/ui/audio/alert-06.aac" +import alert07 from "@opencoder-ai/ui/audio/alert-07.aac" +import alert08 from "@opencoder-ai/ui/audio/alert-08.aac" +import alert09 from "@opencoder-ai/ui/audio/alert-09.aac" +import alert10 from "@opencoder-ai/ui/audio/alert-10.aac" +import bipbop01 from "@opencoder-ai/ui/audio/bip-bop-01.aac" +import bipbop02 from "@opencoder-ai/ui/audio/bip-bop-02.aac" +import bipbop03 from "@opencoder-ai/ui/audio/bip-bop-03.aac" +import bipbop04 from "@opencoder-ai/ui/audio/bip-bop-04.aac" +import bipbop05 from "@opencoder-ai/ui/audio/bip-bop-05.aac" +import bipbop06 from "@opencoder-ai/ui/audio/bip-bop-06.aac" +import bipbop07 from "@opencoder-ai/ui/audio/bip-bop-07.aac" +import bipbop08 from "@opencoder-ai/ui/audio/bip-bop-08.aac" +import bipbop09 from "@opencoder-ai/ui/audio/bip-bop-09.aac" +import bipbop10 from "@opencoder-ai/ui/audio/bip-bop-10.aac" +import nope01 from "@opencoder-ai/ui/audio/nope-01.aac" +import nope02 from "@opencoder-ai/ui/audio/nope-02.aac" +import nope03 from "@opencoder-ai/ui/audio/nope-03.aac" +import nope04 from "@opencoder-ai/ui/audio/nope-04.aac" +import nope05 from "@opencoder-ai/ui/audio/nope-05.aac" +import nope06 from "@opencoder-ai/ui/audio/nope-06.aac" +import nope07 from "@opencoder-ai/ui/audio/nope-07.aac" +import nope08 from "@opencoder-ai/ui/audio/nope-08.aac" +import nope09 from "@opencoder-ai/ui/audio/nope-09.aac" +import nope10 from "@opencoder-ai/ui/audio/nope-10.aac" +import nope11 from "@opencoder-ai/ui/audio/nope-11.aac" +import nope12 from "@opencoder-ai/ui/audio/nope-12.aac" +import staplebops01 from "@opencoder-ai/ui/audio/staplebops-01.aac" +import staplebops02 from "@opencoder-ai/ui/audio/staplebops-02.aac" +import staplebops03 from "@opencoder-ai/ui/audio/staplebops-03.aac" +import staplebops04 from "@opencoder-ai/ui/audio/staplebops-04.aac" +import staplebops05 from "@opencoder-ai/ui/audio/staplebops-05.aac" +import staplebops06 from "@opencoder-ai/ui/audio/staplebops-06.aac" +import staplebops07 from "@opencoder-ai/ui/audio/staplebops-07.aac" +import yup01 from "@opencoder-ai/ui/audio/yup-01.aac" +import yup02 from "@opencoder-ai/ui/audio/yup-02.aac" +import yup03 from "@opencoder-ai/ui/audio/yup-03.aac" +import yup04 from "@opencoder-ai/ui/audio/yup-04.aac" +import yup05 from "@opencoder-ai/ui/audio/yup-05.aac" +import yup06 from "@opencoder-ai/ui/audio/yup-06.aac" export const SOUND_OPTIONS = [ { id: "alert-01", label: "sound.option.alert01", src: alert01 }, diff --git a/packages/console/AGENTS.md b/packages/console/AGENTS.md new file mode 100644 index 000000000000..5837c8e8b2b0 --- /dev/null +++ b/packages/console/AGENTS.md @@ -0,0 +1,36 @@ +# Console Web Dashboard + +**Package:** `packages/console` +**Type:** Web dashboard (SolidJS + Hono) + +## Overview + +Account and usage management dashboard. Consists of frontend app, backend core, Cloudflare Workers functions, and resource handlers. + +## Structure + +``` +packages/console/ +├── app/ # Frontend (SolidJS) +├── core/ # Backend logic, DB migrations +├── function/ # Cloudflare Workers +├── resource/ # Resource handlers +└── mail/ # Email service +``` + +## Key Patterns + +- Frontend uses SolidJS with `@solidjs/start` +- Backend uses Hono for Edge Functions +- Database migrations in `core/migrations/` +- SST deployment via `sst.config.ts` + +## Commands + +```bash +# Dev +bun dev + +# Build +bun turbo build --filter=console +``` diff --git a/packages/console/app/package.json b/packages/console/app/package.json index 3d7ef578515f..cc4b1a4208c0 100644 --- a/packages/console/app/package.json +++ b/packages/console/app/package.json @@ -1,6 +1,6 @@ { - "name": "@opencode-ai/console-app", - "version": "1.1.65", + "name": "@opencoder-ai/console-app", + "version": "1.1.63", "type": "module", "license": "MIT", "scripts": { @@ -16,10 +16,10 @@ "@jsx-email/render": "1.1.1", "@kobalte/core": "catalog:", "@openauthjs/openauth": "catalog:", - "@opencode-ai/console-core": "workspace:*", - "@opencode-ai/console-mail": "workspace:*", - "@opencode-ai/console-resource": "workspace:*", - "@opencode-ai/ui": "workspace:*", + "@opencoder-ai/console-core": "workspace:*", + "@opencoder-ai/console-mail": "workspace:*", + "@opencoder-ai/console-resource": "workspace:*", + "@opencoder-ai/ui": "workspace:*", "@smithy/eventstream-codec": "4.2.7", "@smithy/util-utf8": "4.2.0", "@solidjs/meta": "catalog:", diff --git a/packages/console/app/src/app.tsx b/packages/console/app/src/app.tsx index 3eb70606a45c..ab46e74c157c 100644 --- a/packages/console/app/src/app.tsx +++ b/packages/console/app/src/app.tsx @@ -2,8 +2,8 @@ import { MetaProvider, Title, Meta } from "@solidjs/meta" import { Router } from "@solidjs/router" import { FileRoutes } from "@solidjs/start/router" import { Suspense } from "solid-js" -import { Favicon } from "@opencode-ai/ui/favicon" -import { Font } from "@opencode-ai/ui/font" +import { Favicon } from "@opencoder-ai/ui/favicon" +import { Font } from "@opencoder-ai/ui/font" import "@ibm/plex/css/ibm-plex.css" import "./app.css" import { LanguageProvider } from "~/context/language" diff --git a/packages/console/app/src/component/email-signup.tsx b/packages/console/app/src/component/email-signup.tsx index bd33e92006ae..607cbb92cc3b 100644 --- a/packages/console/app/src/component/email-signup.tsx +++ b/packages/console/app/src/component/email-signup.tsx @@ -1,6 +1,6 @@ import { action, useSubmission } from "@solidjs/router" import dock from "../asset/lander/dock.png" -import { Resource } from "@opencode-ai/console-resource" +import { Resource } from "@opencoder-ai/console-resource" import { Show } from "solid-js" import { useI18n } from "~/context/i18n" diff --git a/packages/console/app/src/context/auth.ts b/packages/console/app/src/context/auth.ts index aed07a630f8c..170000040a43 100644 --- a/packages/console/app/src/context/auth.ts +++ b/packages/console/app/src/context/auth.ts @@ -1,8 +1,8 @@ import { getRequestEvent } from "solid-js/web" -import { and, Database, eq, inArray, isNull, sql } from "@opencode-ai/console-core/drizzle/index.js" -import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js" +import { and, Database, eq, inArray, isNull, sql } from "@opencoder-ai/console-core/drizzle/index.js" +import { UserTable } from "@opencoder-ai/console-core/schema/user.sql.js" import { redirect } from "@solidjs/router" -import { Actor } from "@opencode-ai/console-core/actor.js" +import { Actor } from "@opencoder-ai/console-core/actor.js" import { createClient } from "@openauthjs/openauth/client" @@ -12,7 +12,7 @@ export const AuthClient = createClient({ }) import { useSession } from "@solidjs/start/http" -import { Resource } from "@opencode-ai/console-resource" +import { Resource } from "@opencoder-ai/console-resource" export interface AuthSession { account?: Record< diff --git a/packages/console/app/src/context/auth.withActor.ts b/packages/console/app/src/context/auth.withActor.ts index ff377cda4602..1853b69901dd 100644 --- a/packages/console/app/src/context/auth.withActor.ts +++ b/packages/console/app/src/context/auth.withActor.ts @@ -1,4 +1,4 @@ -import { Actor } from "@opencode-ai/console-core/actor.js" +import { Actor } from "@opencoder-ai/console-core/actor.js" import { getActor } from "./auth" export async function withActor(fn: () => T, workspace?: string) { diff --git a/packages/console/app/src/context/i18n.tsx b/packages/console/app/src/context/i18n.tsx index 5d178c8b8d97..cd27d35edff7 100644 --- a/packages/console/app/src/context/i18n.tsx +++ b/packages/console/app/src/context/i18n.tsx @@ -1,5 +1,5 @@ import { createMemo } from "solid-js" -import { createSimpleContext } from "@opencode-ai/ui/context" +import { createSimpleContext } from "@opencoder-ai/ui/context" import { i18n, type Key } from "~/i18n" import { useLanguage } from "~/context/language" diff --git a/packages/console/app/src/context/language.tsx b/packages/console/app/src/context/language.tsx index 2999242f0ffe..60cb01a7ede7 100644 --- a/packages/console/app/src/context/language.tsx +++ b/packages/console/app/src/context/language.tsx @@ -1,7 +1,7 @@ import { createEffect } from "solid-js" import { createStore } from "solid-js/store" import { getRequestEvent } from "solid-js/web" -import { createSimpleContext } from "@opencode-ai/ui/context" +import { createSimpleContext } from "@opencoder-ai/ui/context" import { LOCALES, type Locale, diff --git a/packages/console/app/src/routes/api/enterprise.ts b/packages/console/app/src/routes/api/enterprise.ts index 6776a7b3c735..15cc893e0e5e 100644 --- a/packages/console/app/src/routes/api/enterprise.ts +++ b/packages/console/app/src/routes/api/enterprise.ts @@ -1,5 +1,5 @@ import type { APIEvent } from "@solidjs/start/server" -import { AWS } from "@opencode-ai/console-core/aws.js" +import { AWS } from "@opencoder-ai/console-core/aws.js" interface EnterpriseFormData { name: string diff --git a/packages/console/app/src/routes/bench/[id].tsx b/packages/console/app/src/routes/bench/[id].tsx index dd96bcbbcee5..10144a1c4c5c 100644 --- a/packages/console/app/src/routes/bench/[id].tsx +++ b/packages/console/app/src/routes/bench/[id].tsx @@ -1,8 +1,8 @@ import { Title } from "@solidjs/meta" import { createAsync, query, useParams } from "@solidjs/router" import { createSignal, For, Show } from "solid-js" -import { Database, desc, eq } from "@opencode-ai/console-core/drizzle/index.js" -import { BenchmarkTable } from "@opencode-ai/console-core/schema/benchmark.sql.js" +import { Database, desc, eq } from "@opencoder-ai/console-core/drizzle/index.js" +import { BenchmarkTable } from "@opencoder-ai/console-core/schema/benchmark.sql.js" import { useI18n } from "~/context/i18n" interface TaskSource { diff --git a/packages/console/app/src/routes/bench/index.tsx b/packages/console/app/src/routes/bench/index.tsx index 17798eff4e1f..2a7e857a1636 100644 --- a/packages/console/app/src/routes/bench/index.tsx +++ b/packages/console/app/src/routes/bench/index.tsx @@ -1,8 +1,8 @@ import { Title } from "@solidjs/meta" import { A, createAsync, query } from "@solidjs/router" import { createMemo, For, Show } from "solid-js" -import { Database, desc } from "@opencode-ai/console-core/drizzle/index.js" -import { BenchmarkTable } from "@opencode-ai/console-core/schema/benchmark.sql.js" +import { Database, desc } from "@opencoder-ai/console-core/drizzle/index.js" +import { BenchmarkTable } from "@opencoder-ai/console-core/schema/benchmark.sql.js" import { useI18n } from "~/context/i18n" interface BenchmarkResult { diff --git a/packages/console/app/src/routes/bench/submission.ts b/packages/console/app/src/routes/bench/submission.ts index 94639439b114..3dfb6db1021e 100644 --- a/packages/console/app/src/routes/bench/submission.ts +++ b/packages/console/app/src/routes/bench/submission.ts @@ -1,7 +1,7 @@ import type { APIEvent } from "@solidjs/start/server" -import { Database } from "@opencode-ai/console-core/drizzle/index.js" -import { BenchmarkTable } from "@opencode-ai/console-core/schema/benchmark.sql.js" -import { Identifier } from "@opencode-ai/console-core/identifier.js" +import { Database } from "@opencoder-ai/console-core/drizzle/index.js" +import { BenchmarkTable } from "@opencoder-ai/console-core/schema/benchmark.sql.js" +import { Identifier } from "@opencoder-ai/console-core/identifier.js" interface SubmissionBody { model: string diff --git a/packages/console/app/src/routes/black/subscribe/[plan].tsx b/packages/console/app/src/routes/black/subscribe/[plan].tsx index 644d87d9b325..909561e1024f 100644 --- a/packages/console/app/src/routes/black/subscribe/[plan].tsx +++ b/packages/console/app/src/routes/black/subscribe/[plan].tsx @@ -6,14 +6,14 @@ import { Elements, PaymentElement, useStripe, useElements, AddressElement } from import { PlanID, plans } from "../common" import { getActor, useAuthSession } from "~/context/auth" import { withActor } from "~/context/auth.withActor" -import { Actor } from "@opencode-ai/console-core/actor.js" -import { and, Database, eq, isNull } from "@opencode-ai/console-core/drizzle/index.js" -import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js" -import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js" +import { Actor } from "@opencoder-ai/console-core/actor.js" +import { and, Database, eq, isNull } from "@opencoder-ai/console-core/drizzle/index.js" +import { WorkspaceTable } from "@opencoder-ai/console-core/schema/workspace.sql.js" +import { UserTable } from "@opencoder-ai/console-core/schema/user.sql.js" import { createList } from "solid-list" import { Modal } from "~/component/modal" -import { BillingTable } from "@opencode-ai/console-core/schema/billing.sql.js" -import { Billing } from "@opencode-ai/console-core/billing.js" +import { BillingTable } from "@opencoder-ai/console-core/schema/billing.sql.js" +import { Billing } from "@opencoder-ai/console-core/billing.js" import { useI18n } from "~/context/i18n" import { useLanguage } from "~/context/language" import { formError } from "~/lib/form-error" diff --git a/packages/console/app/src/routes/debug/index.ts b/packages/console/app/src/routes/debug/index.ts index 2bdd269e7815..e8229aa303f4 100644 --- a/packages/console/app/src/routes/debug/index.ts +++ b/packages/console/app/src/routes/debug/index.ts @@ -1,7 +1,7 @@ import type { APIEvent } from "@solidjs/start/server" import { json } from "@solidjs/router" -import { Database } from "@opencode-ai/console-core/drizzle/index.js" -import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js" +import { Database } from "@opencoder-ai/console-core/drizzle/index.js" +import { UserTable } from "@opencoder-ai/console-core/schema/user.sql.js" export async function GET(evt: APIEvent) { return json({ diff --git a/packages/console/app/src/routes/docs/[...path].ts b/packages/console/app/src/routes/docs/[...path].ts index bbe07f1f076d..03d500927812 100644 --- a/packages/console/app/src/routes/docs/[...path].ts +++ b/packages/console/app/src/routes/docs/[...path].ts @@ -1,5 +1,5 @@ import type { APIEvent } from "@solidjs/start/server" -import { Resource } from "@opencode-ai/console-resource" +import { Resource } from "@opencoder-ai/console-resource" import { docs, localeFromRequest, tag } from "~/lib/language" async function handler(evt: APIEvent) { diff --git a/packages/console/app/src/routes/docs/index.ts b/packages/console/app/src/routes/docs/index.ts index bbe07f1f076d..03d500927812 100644 --- a/packages/console/app/src/routes/docs/index.ts +++ b/packages/console/app/src/routes/docs/index.ts @@ -1,5 +1,5 @@ import type { APIEvent } from "@solidjs/start/server" -import { Resource } from "@opencode-ai/console-resource" +import { Resource } from "@opencoder-ai/console-resource" import { docs, localeFromRequest, tag } from "~/lib/language" async function handler(evt: APIEvent) { diff --git a/packages/console/app/src/routes/s/[id].ts b/packages/console/app/src/routes/s/[id].ts index 60f8d8ba879d..439209e21c20 100644 --- a/packages/console/app/src/routes/s/[id].ts +++ b/packages/console/app/src/routes/s/[id].ts @@ -1,5 +1,5 @@ import type { APIEvent } from "@solidjs/start/server" -import { Resource } from "@opencode-ai/console-resource" +import { Resource } from "@opencoder-ai/console-resource" import { docs, localeFromRequest, tag } from "~/lib/language" async function handler(evt: APIEvent) { diff --git a/packages/console/app/src/routes/stripe/webhook.ts b/packages/console/app/src/routes/stripe/webhook.ts index 828eb4c711cc..3fb115bfdc0e 100644 --- a/packages/console/app/src/routes/stripe/webhook.ts +++ b/packages/console/app/src/routes/stripe/webhook.ts @@ -1,13 +1,13 @@ -import { Billing } from "@opencode-ai/console-core/billing.js" +import { Billing } from "@opencoder-ai/console-core/billing.js" import type { APIEvent } from "@solidjs/start/server" -import { and, Database, eq, isNull, sql } from "@opencode-ai/console-core/drizzle/index.js" -import { BillingTable, PaymentTable, SubscriptionTable } from "@opencode-ai/console-core/schema/billing.sql.js" -import { Identifier } from "@opencode-ai/console-core/identifier.js" -import { centsToMicroCents } from "@opencode-ai/console-core/util/price.js" -import { Actor } from "@opencode-ai/console-core/actor.js" -import { Resource } from "@opencode-ai/console-resource" -import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js" -import { AuthTable } from "@opencode-ai/console-core/schema/auth.sql.js" +import { and, Database, eq, isNull, sql } from "@opencoder-ai/console-core/drizzle/index.js" +import { BillingTable, PaymentTable, SubscriptionTable } from "@opencoder-ai/console-core/schema/billing.sql.js" +import { Identifier } from "@opencoder-ai/console-core/identifier.js" +import { centsToMicroCents } from "@opencoder-ai/console-core/util/price.js" +import { Actor } from "@opencoder-ai/console-core/actor.js" +import { Resource } from "@opencoder-ai/console-resource" +import { UserTable } from "@opencoder-ai/console-core/schema/user.sql.js" +import { AuthTable } from "@opencoder-ai/console-core/schema/auth.sql.js" export async function POST(input: APIEvent) { const body = await Billing.stripe().webhooks.constructEventAsync( diff --git a/packages/console/app/src/routes/workspace-picker.tsx b/packages/console/app/src/routes/workspace-picker.tsx index ffec2f3beed3..8856665b845b 100644 --- a/packages/console/app/src/routes/workspace-picker.tsx +++ b/packages/console/app/src/routes/workspace-picker.tsx @@ -2,11 +2,11 @@ import { query, useParams, action, createAsync, redirect, useSubmission } from " import { For, Show, createEffect } from "solid-js" import { createStore } from "solid-js/store" import { withActor } from "~/context/auth.withActor" -import { Actor } from "@opencode-ai/console-core/actor.js" -import { and, Database, eq, isNull } from "@opencode-ai/console-core/drizzle/index.js" -import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js" -import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js" -import { Workspace } from "@opencode-ai/console-core/workspace.js" +import { Actor } from "@opencoder-ai/console-core/actor.js" +import { and, Database, eq, isNull } from "@opencoder-ai/console-core/drizzle/index.js" +import { WorkspaceTable } from "@opencoder-ai/console-core/schema/workspace.sql.js" +import { UserTable } from "@opencoder-ai/console-core/schema/user.sql.js" +import { Workspace } from "@opencoder-ai/console-core/workspace.js" import { Dropdown, DropdownItem } from "~/component/dropdown" import { Modal } from "~/component/modal" import { useI18n } from "~/context/i18n" diff --git a/packages/console/app/src/routes/workspace.tsx b/packages/console/app/src/routes/workspace.tsx index 10e503ac526d..fcc92169ed1e 100644 --- a/packages/console/app/src/routes/workspace.tsx +++ b/packages/console/app/src/routes/workspace.tsx @@ -4,8 +4,8 @@ import { IconWorkspaceLogo } from "../component/icon" import { WorkspacePicker } from "./workspace-picker" import { UserMenu } from "./user-menu" import { withActor } from "~/context/auth.withActor" -import { User } from "@opencode-ai/console-core/user.js" -import { Actor } from "@opencode-ai/console-core/actor.js" +import { User } from "@opencoder-ai/console-core/user.js" +import { Actor } from "@opencoder-ai/console-core/actor.js" import { useLanguage } from "~/context/language" const getUserEmail = query(async (workspaceID: string) => { diff --git a/packages/console/app/src/routes/workspace/[id]/billing/billing-section.tsx b/packages/console/app/src/routes/workspace/[id]/billing/billing-section.tsx index db89a1c9edab..dde2e8f5cd5b 100644 --- a/packages/console/app/src/routes/workspace/[id]/billing/billing-section.tsx +++ b/packages/console/app/src/routes/workspace/[id]/billing/billing-section.tsx @@ -1,7 +1,7 @@ import { action, useParams, useAction, createAsync, useSubmission, json } from "@solidjs/router" import { createMemo, Match, Show, Switch, createEffect } from "solid-js" import { createStore } from "solid-js/store" -import { Billing } from "@opencode-ai/console-core/billing.js" +import { Billing } from "@opencoder-ai/console-core/billing.js" import { withActor } from "~/context/auth.withActor" import { IconCreditCard, IconStripe } from "~/component/icon" import styles from "./billing-section.module.css" diff --git a/packages/console/app/src/routes/workspace/[id]/billing/black-section.tsx b/packages/console/app/src/routes/workspace/[id]/billing/black-section.tsx index ce0eb2c6a12b..352ae2db16df 100644 --- a/packages/console/app/src/routes/workspace/[id]/billing/black-section.tsx +++ b/packages/console/app/src/routes/workspace/[id]/billing/black-section.tsx @@ -1,11 +1,11 @@ import { action, useParams, useAction, useSubmission, json, query, createAsync } from "@solidjs/router" import { createStore } from "solid-js/store" import { Show } from "solid-js" -import { Billing } from "@opencode-ai/console-core/billing.js" -import { Database, eq, and, isNull, sql } from "@opencode-ai/console-core/drizzle/index.js" -import { BillingTable, SubscriptionTable } from "@opencode-ai/console-core/schema/billing.sql.js" -import { Actor } from "@opencode-ai/console-core/actor.js" -import { Black } from "@opencode-ai/console-core/black.js" +import { Billing } from "@opencoder-ai/console-core/billing.js" +import { Database, eq, and, isNull, sql } from "@opencoder-ai/console-core/drizzle/index.js" +import { BillingTable, SubscriptionTable } from "@opencoder-ai/console-core/schema/billing.sql.js" +import { Actor } from "@opencoder-ai/console-core/actor.js" +import { Black } from "@opencoder-ai/console-core/black.js" import { withActor } from "~/context/auth.withActor" import { queryBillingInfo } from "../../common" import styles from "./black-section.module.css" diff --git a/packages/console/app/src/routes/workspace/[id]/billing/monthly-limit-section.tsx b/packages/console/app/src/routes/workspace/[id]/billing/monthly-limit-section.tsx index ef54b840998c..16b9c6f40eb6 100644 --- a/packages/console/app/src/routes/workspace/[id]/billing/monthly-limit-section.tsx +++ b/packages/console/app/src/routes/workspace/[id]/billing/monthly-limit-section.tsx @@ -2,7 +2,7 @@ import { json, action, useParams, createAsync, useSubmission } from "@solidjs/ro import { createEffect, Show } from "solid-js" import { createStore } from "solid-js/store" import { withActor } from "~/context/auth.withActor" -import { Billing } from "@opencode-ai/console-core/billing.js" +import { Billing } from "@opencoder-ai/console-core/billing.js" import styles from "./monthly-limit-section.module.css" import { queryBillingInfo } from "../../common" import { useI18n } from "~/context/i18n" diff --git a/packages/console/app/src/routes/workspace/[id]/billing/payment-section.tsx b/packages/console/app/src/routes/workspace/[id]/billing/payment-section.tsx index 2311be321582..232b4c8b30f0 100644 --- a/packages/console/app/src/routes/workspace/[id]/billing/payment-section.tsx +++ b/packages/console/app/src/routes/workspace/[id]/billing/payment-section.tsx @@ -1,4 +1,4 @@ -import { Billing } from "@opencode-ai/console-core/billing.js" +import { Billing } from "@opencoder-ai/console-core/billing.js" import { query, action, useParams, createAsync, useAction } from "@solidjs/router" import { For, Match, Show, Switch } from "solid-js" import { withActor } from "~/context/auth.withActor" diff --git a/packages/console/app/src/routes/workspace/[id]/billing/reload-section.tsx b/packages/console/app/src/routes/workspace/[id]/billing/reload-section.tsx index 7084be133843..634d18d1eb59 100644 --- a/packages/console/app/src/routes/workspace/[id]/billing/reload-section.tsx +++ b/packages/console/app/src/routes/workspace/[id]/billing/reload-section.tsx @@ -2,9 +2,9 @@ import { json, action, useParams, createAsync, useSubmission } from "@solidjs/ro import { createEffect, Show, createMemo } from "solid-js" import { createStore } from "solid-js/store" import { withActor } from "~/context/auth.withActor" -import { Billing } from "@opencode-ai/console-core/billing.js" -import { Database, eq } from "@opencode-ai/console-core/drizzle/index.js" -import { BillingTable } from "@opencode-ai/console-core/schema/billing.sql.js" +import { Billing } from "@opencoder-ai/console-core/billing.js" +import { Database, eq } from "@opencoder-ai/console-core/drizzle/index.js" +import { BillingTable } from "@opencoder-ai/console-core/schema/billing.sql.js" import styles from "./reload-section.module.css" import { queryBillingInfo } from "../../common" import { useI18n } from "~/context/i18n" diff --git a/packages/console/app/src/routes/workspace/[id]/graph-section.tsx b/packages/console/app/src/routes/workspace/[id]/graph-section.tsx index f26c7291d8ab..b3d92cc2143a 100644 --- a/packages/console/app/src/routes/workspace/[id]/graph-section.tsx +++ b/packages/console/app/src/routes/workspace/[id]/graph-section.tsx @@ -1,8 +1,8 @@ -import { and, Database, eq, gte, inArray, isNull, lt, or, sql, sum } from "@opencode-ai/console-core/drizzle/index.js" -import { UsageTable } from "@opencode-ai/console-core/schema/billing.sql.js" -import { KeyTable } from "@opencode-ai/console-core/schema/key.sql.js" -import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js" -import { AuthTable } from "@opencode-ai/console-core/schema/auth.sql.js" +import { and, Database, eq, gte, inArray, isNull, lt, or, sql, sum } from "@opencoder-ai/console-core/drizzle/index.js" +import { UsageTable } from "@opencoder-ai/console-core/schema/billing.sql.js" +import { KeyTable } from "@opencoder-ai/console-core/schema/key.sql.js" +import { UserTable } from "@opencoder-ai/console-core/schema/user.sql.js" +import { AuthTable } from "@opencoder-ai/console-core/schema/auth.sql.js" import { useParams } from "@solidjs/router" import { createEffect, createMemo, onCleanup, Show, For } from "solid-js" import { createStore } from "solid-js/store" diff --git a/packages/console/app/src/routes/workspace/[id]/keys/key-section.tsx b/packages/console/app/src/routes/workspace/[id]/keys/key-section.tsx index 837ab743a5ac..98becedec247 100644 --- a/packages/console/app/src/routes/workspace/[id]/keys/key-section.tsx +++ b/packages/console/app/src/routes/workspace/[id]/keys/key-section.tsx @@ -1,12 +1,12 @@ import { json, query, action, useParams, createAsync, useSubmission } from "@solidjs/router" import { createEffect, createSignal, For, Show } from "solid-js" import { IconCopy, IconCheck } from "~/component/icon" -import { Key } from "@opencode-ai/console-core/key.js" +import { Key } from "@opencoder-ai/console-core/key.js" import { withActor } from "~/context/auth.withActor" import { createStore } from "solid-js/store" import { formatDateUTC, formatDateForTable } from "../../common" import styles from "./key-section.module.css" -import { Actor } from "@opencode-ai/console-core/actor.js" +import { Actor } from "@opencoder-ai/console-core/actor.js" import { useI18n } from "~/context/i18n" import { formError, localizeError } from "~/lib/form-error" diff --git a/packages/console/app/src/routes/workspace/[id]/members/member-section.tsx b/packages/console/app/src/routes/workspace/[id]/members/member-section.tsx index 5a440632f8ad..77be6d5ea4aa 100644 --- a/packages/console/app/src/routes/workspace/[id]/members/member-section.tsx +++ b/packages/console/app/src/routes/workspace/[id]/members/member-section.tsx @@ -3,9 +3,9 @@ import { createEffect, For, Show } from "solid-js" import { withActor } from "~/context/auth.withActor" import { createStore } from "solid-js/store" import styles from "./member-section.module.css" -import { UserRole } from "@opencode-ai/console-core/schema/user.sql.js" -import { Actor } from "@opencode-ai/console-core/actor.js" -import { User } from "@opencode-ai/console-core/user.js" +import { UserRole } from "@opencoder-ai/console-core/schema/user.sql.js" +import { Actor } from "@opencoder-ai/console-core/actor.js" +import { User } from "@opencoder-ai/console-core/user.js" import { RoleDropdown } from "./role-dropdown" import { useI18n } from "~/context/i18n" import { useLanguage } from "~/context/language" diff --git a/packages/console/app/src/routes/workspace/[id]/model-section.tsx b/packages/console/app/src/routes/workspace/[id]/model-section.tsx index 97f95278a160..837b1d6e4276 100644 --- a/packages/console/app/src/routes/workspace/[id]/model-section.tsx +++ b/packages/console/app/src/routes/workspace/[id]/model-section.tsx @@ -1,8 +1,8 @@ -import { Model } from "@opencode-ai/console-core/model.js" +import { Model } from "@opencoder-ai/console-core/model.js" import { query, action, useParams, createAsync, json } from "@solidjs/router" import { createMemo, For, Show } from "solid-js" import { withActor } from "~/context/auth.withActor" -import { ZenData } from "@opencode-ai/console-core/model.js" +import { ZenData } from "@opencoder-ai/console-core/model.js" import styles from "./model-section.module.css" import { querySessionInfo } from "../common" import { diff --git a/packages/console/app/src/routes/workspace/[id]/new-user-section.tsx b/packages/console/app/src/routes/workspace/[id]/new-user-section.tsx index a50efc288d6e..d1eb4d47df50 100644 --- a/packages/console/app/src/routes/workspace/[id]/new-user-section.tsx +++ b/packages/console/app/src/routes/workspace/[id]/new-user-section.tsx @@ -1,8 +1,8 @@ import { query, useParams, createAsync } from "@solidjs/router" import { createMemo, createSignal, Show } from "solid-js" import { IconCopy, IconCheck } from "~/component/icon" -import { Key } from "@opencode-ai/console-core/key.js" -import { Billing } from "@opencode-ai/console-core/billing.js" +import { Key } from "@opencoder-ai/console-core/key.js" +import { Billing } from "@opencoder-ai/console-core/billing.js" import { withActor } from "~/context/auth.withActor" import styles from "./new-user-section.module.css" import { useI18n } from "~/context/i18n" diff --git a/packages/console/app/src/routes/workspace/[id]/provider-section.tsx b/packages/console/app/src/routes/workspace/[id]/provider-section.tsx index fe04bf7c0242..558dafd8382a 100644 --- a/packages/console/app/src/routes/workspace/[id]/provider-section.tsx +++ b/packages/console/app/src/routes/workspace/[id]/provider-section.tsx @@ -1,6 +1,6 @@ import { json, query, action, useParams, createAsync, useSubmission } from "@solidjs/router" import { createEffect, For, Show } from "solid-js" -import { Provider } from "@opencode-ai/console-core/provider.js" +import { Provider } from "@opencoder-ai/console-core/provider.js" import { withActor } from "~/context/auth.withActor" import { createStore } from "solid-js/store" import styles from "./provider-section.module.css" diff --git a/packages/console/app/src/routes/workspace/[id]/settings/settings-section.tsx b/packages/console/app/src/routes/workspace/[id]/settings/settings-section.tsx index 5e8331e2682c..3ec38a411e78 100644 --- a/packages/console/app/src/routes/workspace/[id]/settings/settings-section.tsx +++ b/packages/console/app/src/routes/workspace/[id]/settings/settings-section.tsx @@ -2,10 +2,10 @@ import { json, action, useParams, useSubmission, createAsync, query } from "@sol import { createEffect, Show } from "solid-js" import { createStore } from "solid-js/store" import { withActor } from "~/context/auth.withActor" -import { Workspace } from "@opencode-ai/console-core/workspace.js" +import { Workspace } from "@opencoder-ai/console-core/workspace.js" import styles from "./settings-section.module.css" -import { Database, eq } from "@opencode-ai/console-core/drizzle/index.js" -import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js" +import { Database, eq } from "@opencoder-ai/console-core/drizzle/index.js" +import { WorkspaceTable } from "@opencoder-ai/console-core/schema/workspace.sql.js" import { useI18n } from "~/context/i18n" import { formError, localizeError } from "~/lib/form-error" diff --git a/packages/console/app/src/routes/workspace/[id]/usage-section.tsx b/packages/console/app/src/routes/workspace/[id]/usage-section.tsx index 079a27c3ca79..b30a98256b36 100644 --- a/packages/console/app/src/routes/workspace/[id]/usage-section.tsx +++ b/packages/console/app/src/routes/workspace/[id]/usage-section.tsx @@ -1,4 +1,4 @@ -import { Billing } from "@opencode-ai/console-core/billing.js" +import { Billing } from "@opencoder-ai/console-core/billing.js" import { createAsync, query, useParams } from "@solidjs/router" import { createMemo, For, Show, createEffect, createSignal } from "solid-js" import { formatDateUTC, formatDateForTable } from "../common" diff --git a/packages/console/app/src/routes/workspace/common.tsx b/packages/console/app/src/routes/workspace/common.tsx index 5cbd67183516..8cc8ebcb9f3e 100644 --- a/packages/console/app/src/routes/workspace/common.tsx +++ b/packages/console/app/src/routes/workspace/common.tsx @@ -1,11 +1,11 @@ -import { Resource } from "@opencode-ai/console-resource" -import { Actor } from "@opencode-ai/console-core/actor.js" +import { Resource } from "@opencoder-ai/console-resource" +import { Actor } from "@opencoder-ai/console-core/actor.js" import { action, json, query } from "@solidjs/router" import { withActor } from "~/context/auth.withActor" -import { Billing } from "@opencode-ai/console-core/billing.js" -import { and, Database, desc, eq, isNull } from "@opencode-ai/console-core/drizzle/index.js" -import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js" -import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js" +import { Billing } from "@opencoder-ai/console-core/billing.js" +import { and, Database, desc, eq, isNull } from "@opencoder-ai/console-core/drizzle/index.js" +import { WorkspaceTable } from "@opencoder-ai/console-core/schema/workspace.sql.js" +import { UserTable } from "@opencoder-ai/console-core/schema/user.sql.js" export function formatDateForTable(date: Date) { const options: Intl.DateTimeFormatOptions = { diff --git a/packages/console/app/src/routes/zen/util/dataDumper.ts b/packages/console/app/src/routes/zen/util/dataDumper.ts index b852ca0b5c0c..154391ff4cd2 100644 --- a/packages/console/app/src/routes/zen/util/dataDumper.ts +++ b/packages/console/app/src/routes/zen/util/dataDumper.ts @@ -1,4 +1,4 @@ -import { Resource, waitUntil } from "@opencode-ai/console-resource" +import { Resource, waitUntil } from "@opencoder-ai/console-resource" export function createDataDumper(sessionId: string, requestId: string, projectId: string) { if (Resource.App.stage !== "production") return diff --git a/packages/console/app/src/routes/zen/util/handler.ts b/packages/console/app/src/routes/zen/util/handler.ts index d2bcaa851b2d..5b5a19fc101d 100644 --- a/packages/console/app/src/routes/zen/util/handler.ts +++ b/packages/console/app/src/routes/zen/util/handler.ts @@ -1,18 +1,18 @@ import type { APIEvent } from "@solidjs/start/server" -import { and, Database, eq, isNull, lt, or, sql } from "@opencode-ai/console-core/drizzle/index.js" -import { KeyTable } from "@opencode-ai/console-core/schema/key.sql.js" -import { BillingTable, SubscriptionTable, UsageTable } from "@opencode-ai/console-core/schema/billing.sql.js" -import { centsToMicroCents } from "@opencode-ai/console-core/util/price.js" -import { getWeekBounds } from "@opencode-ai/console-core/util/date.js" -import { Identifier } from "@opencode-ai/console-core/identifier.js" -import { Billing } from "@opencode-ai/console-core/billing.js" -import { Actor } from "@opencode-ai/console-core/actor.js" -import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js" -import { ZenData } from "@opencode-ai/console-core/model.js" -import { Black, BlackData } from "@opencode-ai/console-core/black.js" -import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js" -import { ModelTable } from "@opencode-ai/console-core/schema/model.sql.js" -import { ProviderTable } from "@opencode-ai/console-core/schema/provider.sql.js" +import { and, Database, eq, isNull, lt, or, sql } from "@opencoder-ai/console-core/drizzle/index.js" +import { KeyTable } from "@opencoder-ai/console-core/schema/key.sql.js" +import { BillingTable, SubscriptionTable, UsageTable } from "@opencoder-ai/console-core/schema/billing.sql.js" +import { centsToMicroCents } from "@opencoder-ai/console-core/util/price.js" +import { getWeekBounds } from "@opencoder-ai/console-core/util/date.js" +import { Identifier } from "@opencoder-ai/console-core/identifier.js" +import { Billing } from "@opencoder-ai/console-core/billing.js" +import { Actor } from "@opencoder-ai/console-core/actor.js" +import { WorkspaceTable } from "@opencoder-ai/console-core/schema/workspace.sql.js" +import { ZenData } from "@opencoder-ai/console-core/model.js" +import { Black, BlackData } from "@opencoder-ai/console-core/black.js" +import { UserTable } from "@opencoder-ai/console-core/schema/user.sql.js" +import { ModelTable } from "@opencoder-ai/console-core/schema/model.sql.js" +import { ProviderTable } from "@opencoder-ai/console-core/schema/provider.sql.js" import { logger } from "./logger" import { AuthError, diff --git a/packages/console/app/src/routes/zen/util/logger.ts b/packages/console/app/src/routes/zen/util/logger.ts index aef46ddd0e61..6c9f54f9d822 100644 --- a/packages/console/app/src/routes/zen/util/logger.ts +++ b/packages/console/app/src/routes/zen/util/logger.ts @@ -1,4 +1,4 @@ -import { Resource } from "@opencode-ai/console-resource" +import { Resource } from "@opencoder-ai/console-resource" export const logger = { metric: (values: Record) => { diff --git a/packages/console/app/src/routes/zen/util/provider/provider.ts b/packages/console/app/src/routes/zen/util/provider/provider.ts index 5f8b631cf089..f9df0ddab8ff 100644 --- a/packages/console/app/src/routes/zen/util/provider/provider.ts +++ b/packages/console/app/src/routes/zen/util/provider/provider.ts @@ -1,4 +1,4 @@ -import { ZenData } from "@opencode-ai/console-core/model.js" +import { ZenData } from "@opencoder-ai/console-core/model.js" import { fromAnthropicChunk, fromAnthropicRequest, diff --git a/packages/console/app/src/routes/zen/util/rateLimiter.ts b/packages/console/app/src/routes/zen/util/rateLimiter.ts index 5e4f31e67697..7665145e44ab 100644 --- a/packages/console/app/src/routes/zen/util/rateLimiter.ts +++ b/packages/console/app/src/routes/zen/util/rateLimiter.ts @@ -1,8 +1,8 @@ -import { Database, eq, and, sql, inArray } from "@opencode-ai/console-core/drizzle/index.js" -import { IpRateLimitTable } from "@opencode-ai/console-core/schema/ip.sql.js" +import { Database, eq, and, sql, inArray } from "@opencoder-ai/console-core/drizzle/index.js" +import { IpRateLimitTable } from "@opencoder-ai/console-core/schema/ip.sql.js" import { FreeUsageLimitError } from "./error" import { logger } from "./logger" -import { ZenData } from "@opencode-ai/console-core/model.js" +import { ZenData } from "@opencoder-ai/console-core/model.js" export function createRateLimiter(limit: ZenData.RateLimit | undefined, rawIp: string, headers: Headers) { if (!limit) return diff --git a/packages/console/app/src/routes/zen/util/stickyProviderTracker.ts b/packages/console/app/src/routes/zen/util/stickyProviderTracker.ts index 8029757c5b61..3cd81bf996fb 100644 --- a/packages/console/app/src/routes/zen/util/stickyProviderTracker.ts +++ b/packages/console/app/src/routes/zen/util/stickyProviderTracker.ts @@ -1,4 +1,4 @@ -import { Resource } from "@opencode-ai/console-resource" +import { Resource } from "@opencoder-ai/console-resource" export function createStickyTracker(stickyProvider: "strict" | "prefer" | undefined, session: string) { if (!stickyProvider) return diff --git a/packages/console/app/src/routes/zen/util/trialLimiter.ts b/packages/console/app/src/routes/zen/util/trialLimiter.ts index 531e5cf0c302..60dff9f05695 100644 --- a/packages/console/app/src/routes/zen/util/trialLimiter.ts +++ b/packages/console/app/src/routes/zen/util/trialLimiter.ts @@ -1,7 +1,7 @@ -import { Database, eq, sql } from "@opencode-ai/console-core/drizzle/index.js" -import { IpTable } from "@opencode-ai/console-core/schema/ip.sql.js" +import { Database, eq, sql } from "@opencoder-ai/console-core/drizzle/index.js" +import { IpTable } from "@opencoder-ai/console-core/schema/ip.sql.js" import { UsageInfo } from "./provider/provider" -import { ZenData } from "@opencode-ai/console-core/model.js" +import { ZenData } from "@opencoder-ai/console-core/model.js" export function createTrialLimiter(trial: ZenData.Trial | undefined, ip: string, client: string) { if (!trial) return diff --git a/packages/console/app/src/routes/zen/v1/models.ts b/packages/console/app/src/routes/zen/v1/models.ts index ee2b3ab5416e..59a8d8129577 100644 --- a/packages/console/app/src/routes/zen/v1/models.ts +++ b/packages/console/app/src/routes/zen/v1/models.ts @@ -1,9 +1,9 @@ import type { APIEvent } from "@solidjs/start/server" -import { and, Database, eq, isNull } from "@opencode-ai/console-core/drizzle/index.js" -import { KeyTable } from "@opencode-ai/console-core/schema/key.sql.js" -import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js" -import { ModelTable } from "@opencode-ai/console-core/schema/model.sql.js" -import { ZenData } from "@opencode-ai/console-core/model.js" +import { and, Database, eq, isNull } from "@opencoder-ai/console-core/drizzle/index.js" +import { KeyTable } from "@opencoder-ai/console-core/schema/key.sql.js" +import { WorkspaceTable } from "@opencoder-ai/console-core/schema/workspace.sql.js" +import { ModelTable } from "@opencoder-ai/console-core/schema/model.sql.js" +import { ZenData } from "@opencoder-ai/console-core/model.js" export async function OPTIONS(input: APIEvent) { return new Response(null, { diff --git a/packages/console/core/package.json b/packages/console/core/package.json index 0676595c709a..29d0dd447927 100644 --- a/packages/console/core/package.json +++ b/packages/console/core/package.json @@ -1,18 +1,18 @@ { "$schema": "https://json.schemastore.org/package.json", - "name": "@opencode-ai/console-core", - "version": "1.1.65", + "name": "@opencoder-ai/console-core", + "version": "1.1.63", "private": true, "type": "module", "license": "MIT", "dependencies": { "@aws-sdk/client-sts": "3.782.0", "@jsx-email/render": "1.1.1", - "@opencode-ai/console-mail": "workspace:*", - "@opencode-ai/console-resource": "workspace:*", + "@opencoder-ai/console-mail": "workspace:*", + "@opencoder-ai/console-resource": "workspace:*", "@planetscale/database": "1.19.0", "aws4fetch": "1.0.20", - "drizzle-orm": "0.41.0", + "drizzle-orm": "0.45.1", "postgres": "3.4.7", "stripe": "18.0.0", "ulid": "catalog:", @@ -44,9 +44,9 @@ "@tsconfig/node22": "22.0.2", "@types/bun": "1.3.0", "@types/node": "catalog:", - "drizzle-kit": "0.30.5", + "@typescript/native-preview": "catalog:", + "drizzle-kit": "0.31.8", "mysql2": "3.14.4", - "typescript": "catalog:", - "@typescript/native-preview": "catalog:" + "typescript": "catalog:" } } diff --git a/packages/console/core/script/reset-db.ts b/packages/console/core/script/reset-db.ts index 02d498901763..21ae97ab2cc5 100644 --- a/packages/console/core/script/reset-db.ts +++ b/packages/console/core/script/reset-db.ts @@ -1,4 +1,4 @@ -import { Resource } from "@opencode-ai/console-resource" +import { Resource } from "@opencoder-ai/console-resource" import { Database } from "../src/drizzle/index.js" import { UserTable } from "../src/schema/user.sql.js" import { AccountTable } from "../src/schema/account.sql.js" diff --git a/packages/console/core/src/aws.ts b/packages/console/core/src/aws.ts index a4c1510862c3..138dd3d67a98 100644 --- a/packages/console/core/src/aws.ts +++ b/packages/console/core/src/aws.ts @@ -1,5 +1,5 @@ import { z } from "zod" -import { Resource } from "@opencode-ai/console-resource" +import { Resource } from "@opencoder-ai/console-resource" import { AwsClient } from "aws4fetch" import { fn } from "./util/fn" diff --git a/packages/console/core/src/billing.ts b/packages/console/core/src/billing.ts index 2c1cdb0687bb..d6fdfcd2c613 100644 --- a/packages/console/core/src/billing.ts +++ b/packages/console/core/src/billing.ts @@ -4,7 +4,7 @@ import { BillingTable, PaymentTable, SubscriptionTable, UsageTable } from "./sch import { Actor } from "./actor" import { fn } from "./util/fn" import { z } from "zod" -import { Resource } from "@opencode-ai/console-resource" +import { Resource } from "@opencoder-ai/console-resource" import { Identifier } from "./identifier" import { centsToMicroCents } from "./util/price" import { User } from "./user" diff --git a/packages/console/core/src/black.ts b/packages/console/core/src/black.ts index 5f8db62738db..438ebfd7a351 100644 --- a/packages/console/core/src/black.ts +++ b/packages/console/core/src/black.ts @@ -1,6 +1,6 @@ import { z } from "zod" import { fn } from "./util/fn" -import { Resource } from "@opencode-ai/console-resource" +import { Resource } from "@opencoder-ai/console-resource" import { centsToMicroCents } from "./util/price" import { getWeekBounds } from "./util/date" import { SubscriptionPlan } from "./schema/billing.sql" diff --git a/packages/console/core/src/drizzle/index.ts b/packages/console/core/src/drizzle/index.ts index f0f065de4a53..f7ede1d4f28b 100644 --- a/packages/console/core/src/drizzle/index.ts +++ b/packages/console/core/src/drizzle/index.ts @@ -1,5 +1,5 @@ import { drizzle } from "drizzle-orm/planetscale-serverless" -import { Resource } from "@opencode-ai/console-resource" +import { Resource } from "@opencoder-ai/console-resource" export * from "drizzle-orm" import { Client } from "@planetscale/database" diff --git a/packages/console/core/src/model.ts b/packages/console/core/src/model.ts index 9a2908e32e3a..b7b2ec5fcfcb 100644 --- a/packages/console/core/src/model.ts +++ b/packages/console/core/src/model.ts @@ -5,7 +5,7 @@ import { ModelTable } from "./schema/model.sql" import { Identifier } from "./identifier" import { fn } from "./util/fn" import { Actor } from "./actor" -import { Resource } from "@opencode-ai/console-resource" +import { Resource } from "@opencoder-ai/console-resource" export namespace ZenData { const FormatSchema = z.enum(["anthropic", "google", "openai", "oa-compat"]) diff --git a/packages/console/core/src/user.ts b/packages/console/core/src/user.ts index 8b7a96f443ef..03a073ddef91 100644 --- a/packages/console/core/src/user.ts +++ b/packages/console/core/src/user.ts @@ -138,7 +138,7 @@ export namespace User { .then((rows) => rows[0]), ) - const { InviteEmail } = await import("@opencode-ai/console-mail/InviteEmail.jsx") + const { InviteEmail } = await import("@opencoder-ai/console-mail/InviteEmail.jsx") await AWS.sendEmail({ to: email, subject: `You've been invited to join the ${emailInfo.workspaceName} workspace on OpenCode`, diff --git a/packages/console/function/package.json b/packages/console/function/package.json index 265546fc7f75..1c0a044dbe38 100644 --- a/packages/console/function/package.json +++ b/packages/console/function/package.json @@ -1,6 +1,6 @@ { - "name": "@opencode-ai/console-function", - "version": "1.1.65", + "name": "@opencoder-ai/console-function", + "version": "1.1.63", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", @@ -12,18 +12,18 @@ "@cloudflare/workers-types": "catalog:", "@tsconfig/node22": "22.0.2", "@types/node": "catalog:", + "@typescript/native-preview": "catalog:", "openai": "5.11.0", - "typescript": "catalog:", - "@typescript/native-preview": "catalog:" + "typescript": "catalog:" }, "dependencies": { - "@ai-sdk/anthropic": "2.0.0", - "@ai-sdk/openai": "2.0.2", - "@ai-sdk/openai-compatible": "1.0.1", + "@ai-sdk/anthropic": "2.0.57", + "@ai-sdk/openai": "2.0.89", + "@ai-sdk/openai-compatible": "1.0.30", "@hono/zod-validator": "catalog:", - "@opencode-ai/console-core": "workspace:*", - "@opencode-ai/console-resource": "workspace:*", "@openauthjs/openauth": "0.0.0-20250322224806", + "@opencoder-ai/console-core": "workspace:*", + "@opencoder-ai/console-resource": "workspace:*", "ai": "catalog:", "hono": "catalog:", "zod": "catalog:" diff --git a/packages/console/function/src/auth.ts b/packages/console/function/src/auth.ts index c26ab215b32b..ac960ebfcad3 100644 --- a/packages/console/function/src/auth.ts +++ b/packages/console/function/src/auth.ts @@ -7,16 +7,16 @@ import { THEME_OPENAUTH } from "@openauthjs/openauth/ui/theme" import { GithubProvider } from "@openauthjs/openauth/provider/github" import { GoogleOidcProvider } from "@openauthjs/openauth/provider/google" import { CloudflareStorage } from "@openauthjs/openauth/storage/cloudflare" -import { Account } from "@opencode-ai/console-core/account.js" -import { Workspace } from "@opencode-ai/console-core/workspace.js" -import { Actor } from "@opencode-ai/console-core/actor.js" -import { Resource } from "@opencode-ai/console-resource" -import { User } from "@opencode-ai/console-core/user.js" -import { and, Database, eq, isNull, or } from "@opencode-ai/console-core/drizzle/index.js" -import { WorkspaceTable } from "@opencode-ai/console-core/schema/workspace.sql.js" -import { UserTable } from "@opencode-ai/console-core/schema/user.sql.js" -import { AuthTable } from "@opencode-ai/console-core/schema/auth.sql.js" -import { Identifier } from "@opencode-ai/console-core/identifier.js" +import { Account } from "@opencoder-ai/console-core/account.js" +import { Workspace } from "@opencoder-ai/console-core/workspace.js" +import { Actor } from "@opencoder-ai/console-core/actor.js" +import { Resource } from "@opencoder-ai/console-resource" +import { User } from "@opencoder-ai/console-core/user.js" +import { and, Database, eq, isNull, or } from "@opencoder-ai/console-core/drizzle/index.js" +import { WorkspaceTable } from "@opencoder-ai/console-core/schema/workspace.sql.js" +import { UserTable } from "@opencoder-ai/console-core/schema/user.sql.js" +import { AuthTable } from "@opencoder-ai/console-core/schema/auth.sql.js" +import { Identifier } from "@opencoder-ai/console-core/identifier.js" type Env = { AuthStorage: KVNamespace diff --git a/packages/console/function/src/log-processor.ts b/packages/console/function/src/log-processor.ts index 327fc930b72e..caffcd5f8ffa 100644 --- a/packages/console/function/src/log-processor.ts +++ b/packages/console/function/src/log-processor.ts @@ -1,4 +1,4 @@ -import { Resource } from "@opencode-ai/console-resource" +import { Resource } from "@opencoder-ai/console-resource" import type { TraceItem } from "@cloudflare/workers-types" export default { diff --git a/packages/console/mail/package.json b/packages/console/mail/package.json index 0f4bbb6eca7d..bf6617c29262 100644 --- a/packages/console/mail/package.json +++ b/packages/console/mail/package.json @@ -1,13 +1,12 @@ { - "name": "@opencode-ai/console-mail", - "version": "1.1.65", + "name": "@opencoder-ai/console-mail", + "version": "1.1.63", "dependencies": { "@jsx-email/all": "2.2.3", "@jsx-email/cli": "1.4.3", "@tsconfig/bun": "1.0.9", - "@types/react": "18.0.25", - "react": "18.2.0", - "solid-js": "catalog:" + "solid-js": "catalog:", + "react": "18.2.0" }, "exports": { "./*": "./emails/templates/*" @@ -18,5 +17,8 @@ "dev": "email preview emails/templates" }, "type": "module", - "license": "MIT" + "license": "MIT", + "devDependencies": { + "@types/react": "18.0.25" + } } diff --git a/packages/console/resource/package.json b/packages/console/resource/package.json index 6e874331d248..ba6c014822c8 100644 --- a/packages/console/resource/package.json +++ b/packages/console/resource/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package.json", - "name": "@opencode-ai/console-resource", + "name": "@opencoder-ai/console-resource", "license": "MIT", "dependencies": { "@cloudflare/workers-types": "catalog:" diff --git a/packages/desktop/package.json b/packages/desktop/package.json index 8e4862b30d16..d826d9c02190 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -1,5 +1,5 @@ { - "name": "@opencode-ai/desktop", + "name": "@opencoder-ai/desktop", "private": true, "version": "1.1.65", "type": "module", @@ -13,28 +13,28 @@ "tauri": "tauri" }, "dependencies": { - "@opencode-ai/app": "workspace:*", - "@opencode-ai/ui": "workspace:*", + "@opencoder-ai/app": "workspace:*", + "@opencoder-ai/ui": "workspace:*", "@solid-primitives/i18n": "2.2.1", "@solid-primitives/storage": "catalog:", "@tauri-apps/api": "^2", "@tauri-apps/plugin-clipboard-manager": "~2", "@tauri-apps/plugin-deep-link": "~2", "@tauri-apps/plugin-dialog": "~2", + "@tauri-apps/plugin-http": "~2", + "@tauri-apps/plugin-notification": "~2", "@tauri-apps/plugin-opener": "^2", "@tauri-apps/plugin-os": "~2", - "@tauri-apps/plugin-notification": "~2", "@tauri-apps/plugin-process": "~2", "@tauri-apps/plugin-shell": "~2", "@tauri-apps/plugin-store": "~2", "@tauri-apps/plugin-updater": "~2", - "@tauri-apps/plugin-http": "~2", "@tauri-apps/plugin-window-state": "~2", "solid-js": "catalog:", "@solidjs/meta": "catalog:" }, "devDependencies": { - "@actions/artifact": "4.0.0", + "@actions/artifact": "5.0.1", "@tauri-apps/cli": "^2", "@types/bun": "catalog:", "@typescript/native-preview": "catalog:", diff --git a/packages/desktop/scripts/prepare.ts b/packages/desktop/scripts/prepare.ts index d802f2d89eeb..45a16e17e125 100755 --- a/packages/desktop/scripts/prepare.ts +++ b/packages/desktop/scripts/prepare.ts @@ -1,7 +1,7 @@ #!/usr/bin/env bun import { $ } from "bun" -import { Script } from "@opencode-ai/script" +import { Script } from "@opencoder-ai/script" import { copyBinaryToSidecarFolder, getCurrentSidecar, windowsify } from "./utils" const pkg = await Bun.file("./package.json").json() diff --git a/packages/desktop/src/index.tsx b/packages/desktop/src/index.tsx index ff0a093766ed..e63a8d8f999c 100644 --- a/packages/desktop/src/index.tsx +++ b/packages/desktop/src/index.tsx @@ -6,9 +6,9 @@ import { AppInterface, PlatformProvider, Platform, + DisplayBackend, useCommand, - handleNotificationClick, -} from "@opencode-ai/app" +} from "@opencoder-ai/app" import { open, save } from "@tauri-apps/plugin-dialog" import { getCurrent, onOpenUrl } from "@tauri-apps/plugin-deep-link" import { openPath as openerOpenPath } from "@tauri-apps/plugin-opener" @@ -21,7 +21,7 @@ import { relaunch } from "@tauri-apps/plugin-process" import { AsyncStorage } from "@solid-primitives/storage" import { fetch as tauriFetch } from "@tauri-apps/plugin-http" import { Store } from "@tauri-apps/plugin-store" -import { Splash } from "@opencode-ai/ui/logo" +import { Splash } from "@opencoder-ai/ui/logo" import { createSignal, Show, Accessor, JSX, createResource, onMount, onCleanup } from "solid-js" import { readImage } from "@tauri-apps/plugin-clipboard-manager" @@ -336,7 +336,10 @@ const createPlatform = (password: Accessor): Platform => { void win.show().catch(() => undefined) void win.unminimize().catch(() => undefined) void win.setFocus().catch(() => undefined) - handleNotificationClick(href) + if (href) { + window.history.pushState(null, "", href) + window.dispatchEvent(new PopStateEvent("popstate")) + } notification.close() } }) diff --git a/packages/desktop/src/loading.tsx b/packages/desktop/src/loading.tsx index 23a8055c9d6f..3b5ed3174acb 100644 --- a/packages/desktop/src/loading.tsx +++ b/packages/desktop/src/loading.tsx @@ -1,9 +1,9 @@ import { render } from "solid-js/web" import { MetaProvider } from "@solidjs/meta" -import "@opencode-ai/app/index.css" -import { Font } from "@opencode-ai/ui/font" -import { Splash } from "@opencode-ai/ui/logo" -import { Progress } from "@opencode-ai/ui/progress" +import "@opencoder-ai/app/index.css" +import { Font } from "@opencoder-ai/ui/font" +import { Splash } from "@opencoder-ai/ui/logo" +import { Progress } from "@opencoder-ai/ui/progress" import "./styles.css" import { createEffect, createMemo, createSignal, onCleanup, onMount } from "solid-js" import { commands, events, InitStep } from "./bindings" diff --git a/packages/desktop/vite.config.ts b/packages/desktop/vite.config.ts index 62c3a099adeb..eb3a3dae5524 100644 --- a/packages/desktop/vite.config.ts +++ b/packages/desktop/vite.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from "vite" -import appPlugin from "@opencode-ai/app/vite" +import appPlugin from "@opencoder-ai/app/vite" const host = process.env.TAURI_DEV_HOST diff --git a/packages/docs/docs.json b/packages/docs/docs.json index 1bf8b3700b93..2ade74281706 100644 --- a/packages/docs/docs.json +++ b/packages/docs/docs.json @@ -1,7 +1,7 @@ { "$schema": "https://mintlify.com/docs.json", "theme": "mint", - "name": "@opencode-ai/docs", + "name": "@opencoder-ai/docs", "colors": { "primary": "#16A34A", "light": "#07C983", diff --git a/packages/enterprise/AGENTS.md b/packages/enterprise/AGENTS.md new file mode 100644 index 000000000000..03302b0f8a53 --- /dev/null +++ b/packages/enterprise/AGENTS.md @@ -0,0 +1,34 @@ +# Enterprise Features + +**Package:** `packages/enterprise` +**Type:** Enterprise-specific functionality + +## Overview + +Enterprise features including shareable routes, API endpoints, and business logic. + +## Structure + +``` +packages/enterprise/src/ +├── core/ # Core enterprise logic +└── routes/ # API and page routes + ├── api/ # API endpoints + └── share/ # Share functionality +``` + +## Commands + +```bash +# Dev +bun dev + +# Build +bun build +``` + +## Key Patterns + +- Hono for API routes +- SST deployment +- Enterprise-specific business logic diff --git a/packages/enterprise/package.json b/packages/enterprise/package.json index bd2fac19f762..fc8e875bf6be 100644 --- a/packages/enterprise/package.json +++ b/packages/enterprise/package.json @@ -1,6 +1,6 @@ { - "name": "@opencode-ai/enterprise", - "version": "1.1.65", + "name": "@opencoder-ai/enterprise", + "version": "1.1.63", "private": true, "type": "module", "license": "MIT", @@ -13,13 +13,13 @@ "shell-prod": "sst shell --target Teams --stage production" }, "dependencies": { - "@opencode-ai/util": "workspace:*", - "@opencode-ai/ui": "workspace:*", - "aws4fetch": "^1.0.20", + "@opencoder-ai/ui": "workspace:*", + "@opencoder-ai/util": "workspace:*", "@pierre/diffs": "catalog:", + "@solidjs/meta": "catalog:", "@solidjs/router": "catalog:", "@solidjs/start": "catalog:", - "@solidjs/meta": "catalog:", + "aws4fetch": "1.0.20", "hono": "catalog:", "hono-openapi": "catalog:", "js-base64": "3.7.7", @@ -31,8 +31,8 @@ "devDependencies": { "@cloudflare/workers-types": "catalog:", "@tailwindcss/vite": "catalog:", - "@typescript/native-preview": "catalog:", "@types/luxon": "catalog:", + "@typescript/native-preview": "catalog:", "tailwindcss": "catalog:", "typescript": "catalog:", "vite": "catalog:" diff --git a/packages/enterprise/src/app.css b/packages/enterprise/src/app.css index 4af87bca632a..e3d82c978efc 100644 --- a/packages/enterprise/src/app.css +++ b/packages/enterprise/src/app.css @@ -1 +1 @@ -@import "@opencode-ai/ui/styles/tailwind"; +@import "@opencoder-ai/ui/styles/tailwind"; diff --git a/packages/enterprise/src/app.tsx b/packages/enterprise/src/app.tsx index 6f9cdcafb893..ab72ed8c5c5c 100644 --- a/packages/enterprise/src/app.tsx +++ b/packages/enterprise/src/app.tsx @@ -1,16 +1,16 @@ import { Router } from "@solidjs/router" import { FileRoutes } from "@solidjs/start/router" -import { Font } from "@opencode-ai/ui/font" +import { Font } from "@opencoder-ai/ui/font" import { MetaProvider } from "@solidjs/meta" -import { MarkedProvider } from "@opencode-ai/ui/context/marked" -import { DialogProvider } from "@opencode-ai/ui/context/dialog" -import { I18nProvider, type UiI18nParams } from "@opencode-ai/ui/context" -import { dict as uiEn } from "@opencode-ai/ui/i18n/en" -import { dict as uiZh } from "@opencode-ai/ui/i18n/zh" +import { MarkedProvider } from "@opencoder-ai/ui/context/marked" +import { DialogProvider } from "@opencoder-ai/ui/context/dialog" +import { I18nProvider, type UiI18nParams } from "@opencoder-ai/ui/context" +import { dict as uiEn } from "@opencoder-ai/ui/i18n/en" +import { dict as uiZh } from "@opencoder-ai/ui/i18n/zh" import { createEffect, createMemo, Suspense, type ParentProps } from "solid-js" import { getRequestEvent } from "solid-js/web" import "./app.css" -import { Favicon } from "@opencode-ai/ui/favicon" +import { Favicon } from "@opencoder-ai/ui/favicon" function resolveTemplate(text: string, params?: UiI18nParams) { if (!params) return text diff --git a/packages/enterprise/src/core/share.ts b/packages/enterprise/src/core/share.ts index d7f5c8b8d523..dd2f0d78c7ac 100644 --- a/packages/enterprise/src/core/share.ts +++ b/packages/enterprise/src/core/share.ts @@ -1,10 +1,10 @@ -import { FileDiff, Message, Model, Part, Session } from "@opencode-ai/sdk/v2" -import { fn } from "@opencode-ai/util/fn" -import { iife } from "@opencode-ai/util/iife" -import { Identifier } from "@opencode-ai/util/identifier" +import { FileDiff, Message, Model, Part, Session } from "@opencoder-ai/sdk/v2" +import { fn } from "@opencoder-ai/util/fn" +import { iife } from "@opencoder-ai/util/iife" +import { Identifier } from "@opencoder-ai/util/identifier" import z from "zod" import { Storage } from "./storage" -import { Binary } from "@opencode-ai/util/binary" +import { Binary } from "@opencoder-ai/util/binary" export namespace Share { export const Info = z.object({ diff --git a/packages/enterprise/src/core/storage.ts b/packages/enterprise/src/core/storage.ts index b8030b4f901a..2644b1f08e31 100644 --- a/packages/enterprise/src/core/storage.ts +++ b/packages/enterprise/src/core/storage.ts @@ -1,5 +1,5 @@ import { AwsClient } from "aws4fetch" -import { lazy } from "@opencode-ai/util/lazy" +import { lazy } from "@opencoder-ai/util/lazy" export namespace Storage { export interface Adapter { diff --git a/packages/enterprise/src/routes/share/[shareID].tsx b/packages/enterprise/src/routes/share/[shareID].tsx index a2607891c8a7..07085c5ea929 100644 --- a/packages/enterprise/src/routes/share/[shareID].tsx +++ b/packages/enterprise/src/routes/share/[shareID].tsx @@ -1,37 +1,37 @@ -import { FileDiff, Message, Model, Part, Session, SessionStatus, UserMessage } from "@opencode-ai/sdk/v2" -import { SessionTurn } from "@opencode-ai/ui/session-turn" -import { SessionReview } from "@opencode-ai/ui/session-review" -import { DataProvider } from "@opencode-ai/ui/context" -import { DiffComponentProvider } from "@opencode-ai/ui/context/diff" -import { CodeComponentProvider } from "@opencode-ai/ui/context/code" -import { WorkerPoolProvider } from "@opencode-ai/ui/context/worker-pool" +import { FileDiff, Message, Model, Part, Session, SessionStatus, UserMessage } from "@opencoder-ai/sdk/v2" +import { SessionTurn } from "@opencoder-ai/ui/session-turn" +import { SessionReview } from "@opencoder-ai/ui/session-review" +import { DataProvider } from "@opencoder-ai/ui/context" +import { DiffComponentProvider } from "@opencoder-ai/ui/context/diff" +import { CodeComponentProvider } from "@opencoder-ai/ui/context/code" +import { WorkerPoolProvider } from "@opencoder-ai/ui/context/worker-pool" import { createAsync, query, useParams } from "@solidjs/router" import { createEffect, createMemo, ErrorBoundary, For, Match, Show, Switch } from "solid-js" import { Share } from "~/core/share" -import { Logo, Mark } from "@opencode-ai/ui/logo" -import { IconButton } from "@opencode-ai/ui/icon-button" -import { ProviderIcon } from "@opencode-ai/ui/provider-icon" -import { createDefaultOptions } from "@opencode-ai/ui/pierre" -import { iife } from "@opencode-ai/util/iife" -import { Binary } from "@opencode-ai/util/binary" -import { NamedError } from "@opencode-ai/util/error" +import { Logo, Mark } from "@opencoder-ai/ui/logo" +import { IconButton } from "@opencoder-ai/ui/icon-button" +import { ProviderIcon } from "@opencoder-ai/ui/provider-icon" +import { createDefaultOptions } from "@opencoder-ai/ui/pierre" +import { iife } from "@opencoder-ai/util/iife" +import { Binary } from "@opencoder-ai/util/binary" +import { NamedError } from "@opencoder-ai/util/error" import { DateTime } from "luxon" import { createStore } from "solid-js/store" import z from "zod" import NotFound from "../[...404]" -import { Tabs } from "@opencode-ai/ui/tabs" -import { MessageNav } from "@opencode-ai/ui/message-nav" +import { Tabs } from "@opencoder-ai/ui/tabs" +import { MessageNav } from "@opencoder-ai/ui/message-nav" import { preloadMultiFileDiff, PreloadMultiFileDiffResult } from "@pierre/diffs/ssr" -import { Diff as SSRDiff } from "@opencode-ai/ui/diff-ssr" +import { Diff as SSRDiff } from "@opencoder-ai/ui/diff-ssr" import { clientOnly } from "@solidjs/start" -import { type IconName } from "@opencode-ai/ui/icons/provider" +import { type IconName } from "@opencoder-ai/ui/icons/provider" import { Meta, Title } from "@solidjs/meta" import { Base64 } from "js-base64" -const ClientOnlyDiff = clientOnly(() => import("@opencode-ai/ui/diff").then((m) => ({ default: m.Diff }))) -const ClientOnlyCode = clientOnly(() => import("@opencode-ai/ui/code").then((m) => ({ default: m.Code }))) +const ClientOnlyDiff = clientOnly(() => import("@opencoder-ai/ui/diff").then((m) => ({ default: m.Diff }))) +const ClientOnlyCode = clientOnly(() => import("@opencoder-ai/ui/code").then((m) => ({ default: m.Code }))) const ClientOnlyWorkerPoolProvider = clientOnly(() => - import("@opencode-ai/ui/pierre/worker").then((m) => ({ + import("@opencoder-ai/ui/pierre/worker").then((m) => ({ default: (props: { children: any }) => ( {props.children} ), @@ -162,12 +162,13 @@ export default function () { return ( { + fallback={(error: unknown) => { if (SessionDataMissingError.isInstance(error)) { return } console.error(error) - const details = error instanceof Error ? (error.stack ?? error.message) : String(error) + const err = error as Error + const details = err?.stack ?? err?.message ?? String(error) return (

Unable to render this share.

diff --git a/packages/enterprise/test/core/share.test.ts b/packages/enterprise/test/core/share.test.ts index 9e9c06db3841..56c671ded97b 100644 --- a/packages/enterprise/test/core/share.test.ts +++ b/packages/enterprise/test/core/share.test.ts @@ -1,7 +1,7 @@ import { describe, expect, test, afterAll } from "bun:test" import { Share } from "../../src/core/share" import { Storage } from "../../src/core/storage" -import { Identifier } from "@opencode-ai/util/identifier" +import { Identifier } from "@opencoder-ai/util/identifier" describe.concurrent("core.share", () => { test("should create a share", async () => { diff --git a/packages/function/AGENTS.md b/packages/function/AGENTS.md new file mode 100644 index 000000000000..395c101c9e50 --- /dev/null +++ b/packages/function/AGENTS.md @@ -0,0 +1,21 @@ +# Serverless Utilities + +**Package:** `packages/function` +**Type:** Serverless function utilities + +## Overview + +Shared utilities and helpers for serverless function development. + +## Commands + +```bash +# Build +bun build +``` + +## Key Patterns + +- Cloudflare Workers compatible +- Hono-based handlers +- Shared function utilities diff --git a/packages/function/package.json b/packages/function/package.json index 4c10ab05f891..31a48399fecb 100644 --- a/packages/function/package.json +++ b/packages/function/package.json @@ -1,6 +1,6 @@ { - "name": "@opencode-ai/function", - "version": "1.1.65", + "name": "@opencoder-ai/function", + "version": "1.1.63", "$schema": "https://json.schemastore.org/package.json", "private": true, "type": "module", diff --git a/packages/opencode/AGENTS.md b/packages/opencode/AGENTS.md index a68fd7f3e321..5bcab528a6cb 100644 --- a/packages/opencode/AGENTS.md +++ b/packages/opencode/AGENTS.md @@ -1,17 +1,24 @@ -# opencode agent guidelines +# OpenCode CLI - TUI Application + +**Package:** `packages/opencode` +**Type:** Main CLI/TUI application + +## Overview + +The core OpenCode terminal interface. Built with custom TUI, handles agent orchestration, file operations, and interactive sessions. ## Build/Test Commands - **Install**: `bun install` - **Run**: `bun run --conditions=browser ./src/index.ts` -- **Typecheck**: `bun run typecheck` (npm run typecheck) -- **Test**: `bun test` (runs all tests) -- **Single test**: `bun test test/tool/tool.test.ts` (specific test file) +- **Typecheck**: `bun run typecheck` +- **Test**: `bun test` +- **Single test**: `bun test test/tool/tool.test.ts` ## Code Style - **Runtime**: Bun with TypeScript ESM modules -- **Imports**: Use relative imports for local modules, named imports preferred +- **Imports**: Relative imports for local modules, named imports preferred - **Types**: Zod schemas for validation, TypeScript interfaces for structure - **Naming**: camelCase for variables/functions, PascalCase for classes/namespaces - **Error handling**: Use Result patterns, avoid throwing exceptions in tools @@ -24,4 +31,26 @@ - **Validation**: All inputs validated with Zod schemas - **Logging**: Use `Log.create({ service: "name" })` pattern - **Storage**: Use `Storage` namespace for persistence -- **API Client**: The TypeScript TUI (built with SolidJS + OpenTUI) communicates with the OpenCode server using `@opencode-ai/sdk`. When adding/modifying server endpoints in `packages/opencode/src/server/server.ts`, run `./script/generate.ts` to regenerate the SDK and related files. +- **SDK Generation**: When modifying server endpoints in `server.ts`, run `./script/generate.ts` + +## Structure + +``` +packages/opencode/src/ +├── agent/ # Agent definitions and prompts +├── cli/ # CLI commands +├── file/ # File operations (has path security TODOs) +├── permission/ # Permission system (incomplete) +├── provider/ # LLM providers (legacy code marked for removal) +├── server/ # Server (too large - needs refactor) +├── session/ # Session management +├── tool/ # Tool definitions +└── bun/ # Bun runtime utilities +``` + +## Technical Debt (Priority) + +1. **Path security** (`src/file/index.ts`): Symlink escaping, Windows bypass +2. **Legacy provider code** (`src/provider/provider.ts`): Marked for removal +3. **Server refactor** (`src/server/server.ts`): Too large, needs splitting +4. **Permission system** (`src/permission/next.ts`): Incomplete implementation diff --git a/packages/opencode/package.json b/packages/opencode/package.json index 82d562bb093b..34e4afb89fe1 100644 --- a/packages/opencode/package.json +++ b/packages/opencode/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", - "version": "1.1.65", - "name": "opencode", + "version": "1.1.63", + "name": "opencoder", "type": "module", "license": "MIT", "private": true, @@ -26,8 +26,9 @@ }, "devDependencies": { "@babel/core": "7.28.4", + "@cloudflare/workers-types": "catalog:", "@octokit/webhooks-types": "7.6.1", - "@opencode-ai/script": "workspace:*", + "@opencoder-ai/script": "workspace:*", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", @@ -45,18 +46,20 @@ "typescript": "catalog:", "vscode-languageserver-types": "3.17.5", "why-is-node-running": "3.2.2", - "zod-to-json-schema": "3.24.5" + "zod-to-json-schema": "3.24.5", + "@types/pg": "8.16.0" }, "dependencies": { "@actions/core": "1.11.1", "@actions/github": "6.0.1", "@agentclientprotocol/sdk": "0.14.1", - "@ai-sdk/amazon-bedrock": "3.0.79", - "@ai-sdk/anthropic": "2.0.62", + "@agni/agent-sdk": "link:@agni/agent-sdk", + "@ai-sdk/amazon-bedrock": "3.0.74", + "@ai-sdk/anthropic": "2.0.58", "@ai-sdk/azure": "2.0.91", "@ai-sdk/cerebras": "1.0.36", "@ai-sdk/cohere": "2.0.22", - "@ai-sdk/deepinfra": "1.0.36", + "@ai-sdk/deepinfra": "1.0.33", "@ai-sdk/gateway": "2.0.30", "@ai-sdk/google": "2.0.52", "@ai-sdk/google-vertex": "3.0.98", @@ -79,10 +82,10 @@ "@octokit/graphql": "9.0.2", "@octokit/rest": "catalog:", "@openauthjs/openauth": "catalog:", - "@opencode-ai/plugin": "workspace:*", - "@opencode-ai/script": "workspace:*", - "@opencode-ai/sdk": "workspace:*", - "@opencode-ai/util": "workspace:*", + "@opencoder-ai/plugin": "workspace:*", + "@opencoder-ai/script": "workspace:*", + "@opencoder-ai/sdk": "workspace:*", + "@opencoder-ai/util": "workspace:*", "@openrouter/ai-sdk-provider": "1.5.4", "@opentui/core": "0.1.79", "@opentui/solid": "0.1.79", diff --git a/packages/opencode/script/build.ts b/packages/opencode/script/build.ts index f0b3fa828a78..b19cc6325c6f 100755 --- a/packages/opencode/script/build.ts +++ b/packages/opencode/script/build.ts @@ -13,7 +13,7 @@ const dir = path.resolve(__dirname, "..") process.chdir(dir) import pkg from "../package.json" -import { Script } from "@opencode-ai/script" +import { Script } from "@opencoder-ai/script" const modelsUrl = process.env.OPENCODE_MODELS_URL || "https://models.dev" // Fetch and generate models.dev snapshot const modelsData = process.env.MODELS_DEV_API_JSON @@ -113,8 +113,10 @@ await $`rm -rf dist` const binaries: Record = {} if (!skipInstall) { - await $`bun install --os="*" --cpu="*" @opentui/core@${pkg.dependencies["@opentui/core"]}` - await $`bun install --os="*" --cpu="*" @parcel/watcher@${pkg.dependencies["@parcel/watcher"]}` + // These installs are only to ensure platform artifacts are present for multi-target builds. + // Avoid mutating bun.lock during builds (keeps CI and automation worktrees clean). + await $`HUSKY=0 bun install --no-save --os="*" --cpu="*" @opentui/core@${pkg.dependencies["@opentui/core"]}` + await $`HUSKY=0 bun install --no-save --os="*" --cpu="*" @parcel/watcher@${pkg.dependencies["@parcel/watcher"]}` } for (const item of targets) { const name = [ @@ -149,8 +151,8 @@ for (const item of targets) { autoloadTsconfig: true, autoloadPackageJson: true, target: name.replace(pkg.name, "bun") as any, - outfile: `dist/${name}/bin/opencode`, - execArgv: [`--user-agent=opencode/${Script.version}`, "--use-system-ca", "--"], + outfile: `dist/${name}/bin/opencoder`, + execArgv: [`--user-agent=opencoder/${Script.version}`, "--use-system-ca", "--"], windows: {}, }, entrypoints: ["./src/index.ts", parserWorker, workerPath], diff --git a/packages/opencode/script/publish.ts b/packages/opencode/script/publish.ts index fbc1c83ba6dc..ff28facca959 100755 --- a/packages/opencode/script/publish.ts +++ b/packages/opencode/script/publish.ts @@ -1,7 +1,7 @@ #!/usr/bin/env bun import { $ } from "bun" import pkg from "../package.json" -import { Script } from "@opencode-ai/script" +import { Script } from "@opencoder-ai/script" import { fileURLToPath } from "url" const dir = fileURLToPath(new URL("..", import.meta.url)) @@ -25,7 +25,7 @@ await Bun.file(`./dist/${pkg.name}/package.json`).write( { name: pkg.name + "-ai", bin: { - [pkg.name]: `./bin/${pkg.name}`, + opencode: `./bin/opencode`, }, scripts: { postinstall: "bun ./postinstall.mjs || node ./postinstall.mjs", diff --git a/packages/opencode/src/acp/agent.ts b/packages/opencode/src/acp/agent.ts index ae6f6fcc296a..77ede544494f 100644 --- a/packages/opencode/src/acp/agent.ts +++ b/packages/opencode/src/acp/agent.ts @@ -40,7 +40,7 @@ import { Config } from "@/config/config" import { Todo } from "@/session/todo" import { z } from "zod" import { LoadAPIKeyError } from "ai" -import type { AssistantMessage, Event, OpencodeClient, SessionMessageResponse } from "@opencode-ai/sdk/v2" +import type { AssistantMessage, Event, OpencodeClient, SessionMessageResponse } from "@opencoder-ai/sdk/v2" import { applyPatch } from "diff" type ModeOption = { id: string; name: string; description?: string } diff --git a/packages/opencode/src/acp/session.ts b/packages/opencode/src/acp/session.ts index 18aa42313017..0801be8e9909 100644 --- a/packages/opencode/src/acp/session.ts +++ b/packages/opencode/src/acp/session.ts @@ -1,7 +1,7 @@ import { RequestError, type McpServer } from "@agentclientprotocol/sdk" import type { ACPSessionState } from "./types" import { Log } from "@/util/log" -import type { OpencodeClient } from "@opencode-ai/sdk/v2" +import type { OpencodeClient } from "@opencoder-ai/sdk/v2" const log = Log.create({ service: "acp-session-manager" }) diff --git a/packages/opencode/src/acp/types.ts b/packages/opencode/src/acp/types.ts index de8ac5081228..7e951d7a7b36 100644 --- a/packages/opencode/src/acp/types.ts +++ b/packages/opencode/src/acp/types.ts @@ -1,5 +1,5 @@ import type { McpServer } from "@agentclientprotocol/sdk" -import type { OpencodeClient } from "@opencode-ai/sdk/v2" +import type { OpencodeClient } from "@opencoder-ai/sdk/v2" export interface ACPSessionState { id: string diff --git a/packages/opencode/src/bun/index.ts b/packages/opencode/src/bun/index.ts index bdb7cff78e25..4d61f5267639 100644 --- a/packages/opencode/src/bun/index.ts +++ b/packages/opencode/src/bun/index.ts @@ -3,7 +3,7 @@ import { Global } from "../global" import { Log } from "../util/log" import path from "path" import { Filesystem } from "../util/filesystem" -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" import { readableStreamToText } from "bun" import { Lock } from "../util/lock" import { PackageRegistry } from "./registry" diff --git a/packages/opencode/src/cli/cmd/acp.ts b/packages/opencode/src/cli/cmd/acp.ts index 99a9a81ab9cd..b0a3be9d6d99 100644 --- a/packages/opencode/src/cli/cmd/acp.ts +++ b/packages/opencode/src/cli/cmd/acp.ts @@ -4,7 +4,7 @@ import { cmd } from "./cmd" import { AgentSideConnection, ndJsonStream } from "@agentclientprotocol/sdk" import { ACP } from "@/acp/agent" import { Server } from "@/server/server" -import { createOpencodeClient } from "@opencode-ai/sdk/v2" +import { createOpencodeClient } from "@opencoder-ai/sdk/v2" import { withNetworkOptions, resolveNetworkOptions } from "../network" const log = Log.create({ service: "acp-command" }) diff --git a/packages/opencode/src/cli/cmd/auth.ts b/packages/opencode/src/cli/cmd/auth.ts index 34e2269d0c16..d5f8ab3e469a 100644 --- a/packages/opencode/src/cli/cmd/auth.ts +++ b/packages/opencode/src/cli/cmd/auth.ts @@ -10,7 +10,7 @@ import { Config } from "../../config/config" import { Global } from "../../global" import { Plugin } from "../../plugin" import { Instance } from "../../project/instance" -import type { Hooks } from "@opencode-ai/plugin" +import type { Hooks } from "@opencoder-ai/plugin" type PluginAuth = NonNullable diff --git a/packages/opencode/src/cli/cmd/debug/agent.ts b/packages/opencode/src/cli/cmd/debug/agent.ts index fe3003485976..6836ceb2b051 100644 --- a/packages/opencode/src/cli/cmd/debug/agent.ts +++ b/packages/opencode/src/cli/cmd/debug/agent.ts @@ -152,6 +152,7 @@ async function createToolContext(agent: Agent.Info) { messageID, callID: Identifier.ascending("part"), agent: agent.name, + model, abort: new AbortController().signal, messages: [], metadata: () => {}, diff --git a/packages/opencode/src/cli/cmd/generate.ts b/packages/opencode/src/cli/cmd/generate.ts index fad4514c81e5..dbfb6283b529 100644 --- a/packages/opencode/src/cli/cmd/generate.ts +++ b/packages/opencode/src/cli/cmd/generate.ts @@ -14,7 +14,7 @@ export const GenerateCommand = { { lang: "js", source: [ - `import { createOpencodeClient } from "@opencode-ai/sdk`, + `import { createOpencodeClient } from "@opencoder-ai/sdk`, ``, `const client = createOpencodeClient()`, `await client.${operation.operationId}({`, diff --git a/packages/opencode/src/cli/cmd/import.ts b/packages/opencode/src/cli/cmd/import.ts index 37419f4e2350..2be33024674c 100644 --- a/packages/opencode/src/cli/cmd/import.ts +++ b/packages/opencode/src/cli/cmd/import.ts @@ -1,5 +1,5 @@ import type { Argv } from "yargs" -import type { Session as SDKSession, Message, Part } from "@opencode-ai/sdk/v2" +import type { Session as SDKSession, Message, Part } from "@opencoder-ai/sdk/v2" import { Session } from "../../session" import { cmd } from "./cmd" import { bootstrap } from "../bootstrap" diff --git a/packages/opencode/src/cli/cmd/run.ts b/packages/opencode/src/cli/cmd/run.ts index 0febec3a207c..494b08ff1e88 100644 --- a/packages/opencode/src/cli/cmd/run.ts +++ b/packages/opencode/src/cli/cmd/run.ts @@ -6,7 +6,7 @@ import { cmd } from "./cmd" import { Flag } from "../../flag/flag" import { bootstrap } from "../bootstrap" import { EOL } from "os" -import { createOpencodeClient, type Message, type OpencodeClient, type ToolPart } from "@opencode-ai/sdk/v2" +import { createOpencodeClient, type Message, type OpencodeClient, type ToolPart } from "@opencoder-ai/sdk/v2" import { Server } from "../../server/server" import { Provider } from "../../provider/provider" import { Agent } from "../../agent/agent" diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-command.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-command.tsx index 38dc402758b2..86c682f2857c 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-command.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-command.tsx @@ -11,7 +11,7 @@ import { } from "solid-js" import { useKeyboard } from "@opentui/solid" import { useKeybind } from "@tui/context/keybind" -import type { KeybindsConfig } from "@opencode-ai/sdk/v2" +import type { KeybindsConfig } from "@/config/config" type Context = ReturnType const ctx = createContext() diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx index 9682bee4ead2..2698f486124a 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-provider.tsx @@ -8,7 +8,7 @@ import { DialogPrompt } from "../ui/dialog-prompt" import { Link } from "../ui/link" import { useTheme } from "../context/theme" import { TextAttributes } from "@opentui/core" -import type { ProviderAuthAuthorization } from "@opencode-ai/sdk/v2" +import type { ProviderAuthAuthorization } from "@opencoder-ai/sdk/v2" import { DialogModel } from "./dialog-model" import { useKeyboard } from "@opentui/solid" import { Clipboard } from "@tui/util/clipboard" diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/history.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/history.tsx index e90503e9f52e..ef1161901235 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/history.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/history.tsx @@ -5,7 +5,7 @@ import { createStore, produce } from "solid-js/store" import { clone } from "remeda" import { createSimpleContext } from "../../context/helper" import { appendFile, writeFile } from "fs/promises" -import type { AgentPart, FilePart, TextPart } from "@opencode-ai/sdk/v2" +import type { AgentPart, FilePart, TextPart } from "@opencoder-ai/sdk/v2" export type PromptInfo = { input: string diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx index cefef208de4a..972ce8836bb9 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx @@ -19,7 +19,7 @@ import { useRenderer } from "@opentui/solid" import { Editor } from "@tui/util/editor" import { useExit } from "../../context/exit" import { Clipboard } from "../../util/clipboard" -import type { FilePart } from "@opencode-ai/sdk/v2" +import type { FilePart } from "@opencoder-ai/sdk/v2" import { TuiEvent } from "../../event" import { iife } from "@/util/iife" import { Locale } from "@/util/locale" diff --git a/packages/opencode/src/cli/cmd/tui/context/keybind.tsx b/packages/opencode/src/cli/cmd/tui/context/keybind.tsx index 0dbbbc6f9ee1..671f5112becb 100644 --- a/packages/opencode/src/cli/cmd/tui/context/keybind.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/keybind.tsx @@ -1,8 +1,9 @@ import { createMemo } from "solid-js" import { useSync } from "@tui/context/sync" import { Keybind } from "@/util/keybind" +import { Config } from "@/config/config" import { pipe, mapValues } from "remeda" -import type { KeybindsConfig } from "@opencode-ai/sdk/v2" +import type { KeybindsConfig } from "@/config/config" import type { ParsedKey, Renderable } from "@opentui/core" import { createStore } from "solid-js/store" import { useKeyboard, useRenderer } from "@opentui/solid" @@ -13,8 +14,10 @@ export const { use: useKeybind, provider: KeybindProvider } = createSimpleContex init: () => { const sync = useSync() const keybinds = createMemo(() => { + const parsed = Config.Keybinds.safeParse(sync.data.config.keybinds ?? {}) + const values = parsed.success ? parsed.data : Config.Keybinds.parse({}) return pipe( - sync.data.config.keybinds ?? {}, + values, mapValues((value) => Keybind.parse(value)), ) }) diff --git a/packages/opencode/src/cli/cmd/tui/context/sdk.tsx b/packages/opencode/src/cli/cmd/tui/context/sdk.tsx index 7fa7e05c3d25..64cb61ed6a84 100644 --- a/packages/opencode/src/cli/cmd/tui/context/sdk.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/sdk.tsx @@ -1,4 +1,4 @@ -import { createOpencodeClient, type Event } from "@opencode-ai/sdk/v2" +import { createOpencodeClient, type Event } from "@opencoder-ai/sdk/v2" import { createSimpleContext } from "./helper" import { createGlobalEmitter } from "@solid-primitives/event-bus" import { batch, onCleanup, onMount } from "solid-js" diff --git a/packages/opencode/src/cli/cmd/tui/context/sync.tsx b/packages/opencode/src/cli/cmd/tui/context/sync.tsx index eb8ed2d9bbad..babfcce9ac33 100644 --- a/packages/opencode/src/cli/cmd/tui/context/sync.tsx +++ b/packages/opencode/src/cli/cmd/tui/context/sync.tsx @@ -17,17 +17,158 @@ import type { ProviderListResponse, ProviderAuthMethod, VcsInfo, -} from "@opencode-ai/sdk/v2" +} from "@opencoder-ai/sdk/v2" import { createStore, produce, reconcile } from "solid-js/store" import { useSDK } from "@tui/context/sdk" -import { Binary } from "@opencode-ai/util/binary" +import { Binary } from "@opencoder-ai/util/binary" import { createSimpleContext } from "./helper" import type { Snapshot } from "@/snapshot" import { useExit } from "./exit" import { useArgs } from "./args" import { batch, onMount } from "solid-js" import { Log } from "@/util/log" -import type { Path } from "@opencode-ai/sdk" +import type { Path } from "@opencoder-ai/sdk" +import { + createAgentClient, + type GetMailInboxResponse, + type GetMailThreadsByThreadIdMessagesResponse, +} from "@agni/agent-sdk" + +type AgniConfig = { + apiKey: string + organizationId: string + projectId: string + baseUrl?: string +} + +type AgniThread = GetMailInboxResponse[number] +type AgniMessage = GetMailThreadsByThreadIdMessagesResponse[number] + +const resolveAgniConfig = (): AgniConfig | null => { + const apiKey = process.env.AGNI_API_KEY + const organizationId = process.env.AGNI_ORGANIZATION_ID ?? process.env.AGNI_ORG_ID + const projectId = process.env.AGNI_PROJECT_ID + const baseUrl = process.env.AGNI_BASE_URL + if (!apiKey || !organizationId || !projectId) return null + return { + apiKey, + organizationId, + projectId, + baseUrl, + } +} + +const agniConfig = resolveAgniConfig() +const agniClient = agniConfig + ? createAgentClient({ + apiKey: agniConfig.apiKey, + organizationId: agniConfig.organizationId, + baseUrl: agniConfig.baseUrl, + }) + : null + +const agniRunBySession = new Map() + +const resolveAgentHandle = (messages: { info: Message }[], fallback?: string) => { + for (let i = messages.length - 1; i >= 0; i -= 1) { + const message = messages[i]?.info + if (message?.role === "user" && message.agent) { + return message.agent + } + } + return fallback ?? "build" +} + +const ensureAgniRun = async (sessionID: string, agentHandle: string) => { + if (!agniClient || !agniConfig) return null + if (!agentHandle) return null + const cached = agniRunBySession.get(sessionID) + if (cached) return cached + try { + const run = await agniClient.agentRuns.ensure({ + projectId: agniConfig.projectId, + harness: "opencode", + harnessSessionId: sessionID, + agentHandle, + status: "running", + }) + if (!run?.runId) { + Log.Default.warn("invalid agni run response", { + sessionID, + agentHandle, + run, + }) + return null + } + agniRunBySession.set(sessionID, run.runId) + return run.runId + } catch (error) { + Log.Default.warn("failed to ensure agni run", { + error, + sessionID, + agentHandle, + }) + } + return null +} + +const fetchAgniInbox = async (sessionID: string, agentHandle: string) => { + if (!agniClient || !agniConfig) return [] + const runId = await ensureAgniRun(sessionID, agentHandle) + if (!runId) return [] + try { + const threads = + (await agniClient.mail.inbox.list({ + projectId: agniConfig.projectId, + runId, + limit: 20, + })) ?? [] + + if (threads.length === 0) return [] + + const latestMessages = await Promise.all( + threads.map(async (thread) => { + try { + const messages = + (await agniClient.mail.messages.list({ + threadId: thread.id, + limit: 1, + })) ?? [] + return { + thread, + message: messages[0] ?? null, + } + } catch (error) { + Log.Default.warn("failed to load agni thread messages", { + error, + threadId: thread.id, + }) + return { thread, message: null } + } + }), + ) + + return latestMessages.map(({ thread, message }) => { + const createdAt = message?.createdAt ?? thread.updatedAt + const createdAtDate = new Date(createdAt) + const lastReadAt = thread.lastReadAt ? new Date(thread.lastReadAt) : null + const isRead = lastReadAt ? createdAtDate <= lastReadAt : false + return { + id: thread.id, + senderId: message?.senderRun.agent.handle ?? thread.createdByRun.agent.handle ?? "unknown", + subject: message?.subject ?? thread.subject ?? "No subject", + body: message?.body ?? "", + type: "mail", + priority: message?.priority ?? 0, + isRead, + createdAt: createdAtDate, + } + }) + } catch (error) { + Log.Default.warn("failed to load agni inbox", { error }) + return [] + } +} export const { use: useSync, provider: SyncProvider } = createSimpleContext({ name: "Sync", @@ -73,6 +214,18 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ formatter: FormatterStatus[] vcs: VcsInfo | undefined path: Path + inbox: { + [sessionID: string]: Array<{ + id: string + senderId: string + subject: string + body: string + type: string + priority: number + isRead: boolean + createdAt: Date + }> + } }>({ provider_next: { all: [], @@ -100,6 +253,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ formatter: [], vcs: undefined, path: { state: "", config: "", worktree: "", directory: "" }, + inbox: {}, }) const sdk = useSDK() @@ -444,9 +598,11 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ const [session, messages, todo, diff] = await Promise.all([ sdk.client.session.get({ sessionID }, { throwOnError: true }), sdk.client.session.messages({ sessionID, limit: 100 }), - sdk.client.session.todo({ sessionID }), + sdk.client.session.todo.list({ sessionID }), sdk.client.session.diff({ sessionID }), ]) + const agentHandle = resolveAgentHandle(messages.data ?? [], store.config.default_agent) + const inbox = await fetchAgniInbox(sessionID, agentHandle) setStore( produce((draft) => { const match = Binary.search(draft.session, sessionID, (s) => s.id) @@ -458,6 +614,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({ draft.part[message.info.id] = message.parts } draft.session_diff[sessionID] = diff.data ?? [] + draft.inbox[sessionID] = inbox }), ) fullSyncedSessions.add(sessionID) diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx index 62154cce5636..a6b05493ba7d 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx @@ -1,7 +1,7 @@ import { createMemo, onMount } from "solid-js" import { useSync } from "@tui/context/sync" import { DialogSelect, type DialogSelectOption } from "@tui/ui/dialog-select" -import type { TextPart } from "@opencode-ai/sdk/v2" +import type { TextPart } from "@opencoder-ai/sdk/v2" import { Locale } from "@/util/locale" import { useSDK } from "@tui/context/sdk" import { useRoute } from "@tui/context/route" diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-timeline.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-timeline.tsx index 87248a6a8ba6..8920a5066278 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-timeline.tsx @@ -1,7 +1,7 @@ import { createMemo, onMount } from "solid-js" import { useSync } from "@tui/context/sync" import { DialogSelect, type DialogSelectOption } from "@tui/ui/dialog-select" -import type { TextPart } from "@opencode-ai/sdk/v2" +import type { TextPart } from "@opencoder-ai/sdk/v2" import { Locale } from "@/util/locale" import { DialogMessage } from "./dialog-message" import { useDialog } from "../../ui/dialog" diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/header.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/header.tsx index 0c5ea9a85723..725eee9214c5 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/header.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/header.tsx @@ -4,7 +4,7 @@ import { useSync } from "@tui/context/sync" import { pipe, sumBy } from "remeda" import { useTheme } from "@tui/context/theme" import { SplitBorder } from "@tui/component/border" -import type { AssistantMessage, Session } from "@opencode-ai/sdk/v2" +import type { AssistantMessage, Session } from "@opencoder-ai/sdk/v2" import { useCommandDialog } from "@tui/component/dialog-command" import { useKeybind } from "../../context/keybind" import { useTerminalDimensions } from "@opentui/solid" diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index b843bda1c9db..45450e6538e9 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -28,7 +28,7 @@ import { RGBA, } from "@opentui/core" import { Prompt, type PromptRef } from "@tui/component/prompt" -import type { AssistantMessage, Part, ToolPart, UserMessage, TextPart, ReasoningPart } from "@opencode-ai/sdk/v2" +import type { AssistantMessage, Part, ToolPart, UserMessage, TextPart, ReasoningPart } from "@opencoder-ai/sdk/v2" import { useLocal } from "@tui/context/local" import { Locale } from "@/util/locale" import type { Tool } from "@/tool/tool" @@ -529,7 +529,7 @@ export function Session() { { title: conceal() ? "Disable code concealment" : "Enable code concealment", value: "session.toggle.conceal", - keybind: "messages_toggle_conceal" as any, + keybind: "messages_toggle_conceal", category: "Session", onSelect: (dialog) => { setConceal((prev) => !prev) @@ -1846,27 +1846,17 @@ function Task(props: ToolProps) { const keybind = useKeybind() const { navigate } = useRoute() const local = useLocal() - const sync = useSync() - - const tools = createMemo(() => { - const sessionID = props.metadata.sessionId - const msgs = sync.data.message[sessionID ?? ""] ?? [] - return msgs.flatMap((msg) => - (sync.data.part[msg.id] ?? []) - .filter((part): part is ToolPart => part.type === "tool") - .map((part) => ({ tool: part.tool, state: part.state })), - ) - }) - - const current = createMemo(() => tools().findLast((x) => x.state.status !== "pending")) + const agentType = createMemo(() => props.input.subagent_type ?? props.metadata.subagent_type ?? "unknown") + const current = createMemo(() => props.metadata.summary?.findLast((x) => x.state.status !== "pending")) const isRunning = createMemo(() => props.part.state.status === "running") + const color = createMemo(() => local.agent.color(agentType())) return ( navigate({ type: "session", sessionID: props.metadata.sessionId! }) @@ -1877,7 +1867,7 @@ function Task(props: ToolProps) { > - {props.input.description} ({tools().length} toolcalls) + {props.input.description ?? props.metadata.description} ({props.metadata.summary?.length ?? 0} toolcalls) {(item) => { @@ -1899,8 +1889,20 @@ function Task(props: ToolProps) { - - {props.input.subagent_type} Task {props.input.description} + + {Locale.titlecase(agentType())} Task " + {props.input.description ?? props.metadata.description}" @@ -2051,14 +2053,37 @@ function ApplyPatch(props: ToolProps) { } function TodoWrite(props: ToolProps) { + // Try to get todos from metadata, or parse from output if missing + const todos = createMemo(() => { + // Priority 1: Use metadata.todos if available + if (props.metadata.todos && props.metadata.todos.length > 0) { + return props.metadata.todos + } + + // Priority 2: Try to parse todos from output JSON + if (props.output) { + try { + const parsed = JSON.parse(props.output) + if (Array.isArray(parsed) && parsed.length > 0) { + // Validate that it looks like todos (has id, content, status) + if (parsed[0]?.id && parsed[0]?.content && parsed[0]?.status) { + return parsed + } + } + } catch { + // JSON parse failed, continue to fallback + } + } + + return null + }) + return ( - + - - {(todo) => } - + {(todo) => } diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx index 9e79c76bf518..06dac33384bb 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx @@ -4,7 +4,7 @@ import { Portal, useKeyboard, useRenderer, useTerminalDimensions, type JSX } fro import type { TextareaRenderable } from "@opentui/core" import { useKeybind } from "../../context/keybind" import { useTheme, selectedForeground } from "../../context/theme" -import type { PermissionRequest } from "@opencode-ai/sdk/v2" +import type { PermissionRequest } from "@opencoder-ai/sdk/v2" import { useSDK } from "../../context/sdk" import { SplitBorder } from "../../component/border" import { useSync } from "../../context/sync" diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/question.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/question.tsx index 1565a3008185..ab7a6e68c773 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/question.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/question.tsx @@ -4,7 +4,7 @@ import { useKeyboard } from "@opentui/solid" import type { TextareaRenderable } from "@opentui/core" import { useKeybind } from "../../context/keybind" import { selectedForeground, tint, useTheme } from "../../context/theme" -import type { QuestionAnswer, QuestionRequest } from "@opencode-ai/sdk/v2" +import type { QuestionAnswer, QuestionRequest } from "@opencoder-ai/sdk/v2" import { useSDK } from "../../context/sdk" import { SplitBorder } from "../../component/border" import { useTextareaKeybindings } from "../../component/textarea-keybindings" diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx index 4ffe91558ed7..b2d46d9e7497 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx @@ -4,7 +4,7 @@ import { createStore } from "solid-js/store" import { useTheme } from "../../context/theme" import { Locale } from "@/util/locale" import path from "path" -import type { AssistantMessage } from "@opencode-ai/sdk/v2" +import type { AssistantMessage } from "@opencoder-ai/sdk/v2" import { Global } from "@/global" import { Installation } from "@/installation" import { useKeybind } from "../../context/keybind" @@ -25,6 +25,7 @@ export function Sidebar(props: { sessionID: string; overlay?: boolean }) { diff: true, todo: true, lsp: true, + inbox: true, }) // Sort MCP servers alphabetically for consistent display order @@ -221,6 +222,45 @@ export function Sidebar(props: { sessionID: string; overlay?: boolean }) { + 0}> + + + (sync.data.inbox[props.sessionID]?.length ?? 0) > 2 && setExpanded("inbox", !expanded.inbox) + } + > + 2}> + {expanded.inbox ? "▼" : "▶"} + + + Inbox + !m.isRead).length ?? 0) > 0}> + + {" "} + {sync.data.inbox[props.sessionID]?.filter((m) => !m.isRead).length ?? 0} new + + + + + + + {(message) => ( + + + {message.senderId}: {message.subject} + + + {message.body.slice(0, 80)} + {message.body.length > 80 ? "..." : ""} + + + )} + + + + 0}> ({})) json.dependencies = { ...json.dependencies, - "@opencode-ai/plugin": targetVersion, + "@opencoder-ai/plugin": targetVersion, } await Bun.write(pkg, JSON.stringify(json, null, 2)) await new Promise((resolve) => setTimeout(resolve, 3000)) @@ -307,15 +307,15 @@ export namespace Config { const parsed = await pkgFile.json().catch(() => null) const dependencies = parsed?.dependencies ?? {} - const depVersion = dependencies["@opencode-ai/plugin"] + const depVersion = dependencies["@opencoder-ai/plugin"] if (!depVersion) return true const targetVersion = Installation.isLocal() ? "latest" : Installation.VERSION if (targetVersion === "latest") { - const isOutdated = await PackageRegistry.isOutdated("@opencode-ai/plugin", depVersion, dir) + const isOutdated = await PackageRegistry.isOutdated("@opencoder-ai/plugin", depVersion, dir) if (!isOutdated) return false log.info("Cached version is outdated, proceeding with install", { - pkg: "@opencode-ai/plugin", + pkg: "@opencoder-ai/plugin", cachedVersion: depVersion, }) return true @@ -1481,3 +1481,5 @@ export namespace Config { return state().then((x) => x.directories) } } + +export type KeybindsConfig = z.infer diff --git a/packages/opencode/src/config/markdown.ts b/packages/opencode/src/config/markdown.ts index 4cd17746c54c..de553309d57b 100644 --- a/packages/opencode/src/config/markdown.ts +++ b/packages/opencode/src/config/markdown.ts @@ -1,4 +1,4 @@ -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" import matter from "gray-matter" import { z } from "zod" diff --git a/packages/opencode/src/file/ripgrep.ts b/packages/opencode/src/file/ripgrep.ts index 58f9af7cdbab..5d0293aed04a 100644 --- a/packages/opencode/src/file/ripgrep.ts +++ b/packages/opencode/src/file/ripgrep.ts @@ -3,7 +3,7 @@ import path from "path" import { Global } from "../global" import fs from "fs/promises" import z from "zod" -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" import { lazy } from "../util/lazy" import { $ } from "bun" diff --git a/packages/opencode/src/ide/index.ts b/packages/opencode/src/ide/index.ts index 0837b2aa5ff5..bbccb3dc5892 100644 --- a/packages/opencode/src/ide/index.ts +++ b/packages/opencode/src/ide/index.ts @@ -2,7 +2,7 @@ import { BusEvent } from "@/bus/bus-event" import { Bus } from "@/bus" import { spawn } from "bun" import z from "zod" -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" import { Log } from "../util/log" const SUPPORTED_IDES = [ diff --git a/packages/opencode/src/index.ts b/packages/opencode/src/index.ts index 6dc5e99e91ef..b16b954796c1 100644 --- a/packages/opencode/src/index.ts +++ b/packages/opencode/src/index.ts @@ -10,7 +10,7 @@ import { UninstallCommand } from "./cli/cmd/uninstall" import { ModelsCommand } from "./cli/cmd/models" import { UI } from "./cli/ui" import { Installation } from "./installation" -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" import { FormatError } from "./cli/error" import { ServeCommand } from "./cli/cmd/serve" import { DebugCommand } from "./cli/cmd/debug" diff --git a/packages/opencode/src/installation/index.ts b/packages/opencode/src/installation/index.ts index 47278bd5628e..b693f063f6bc 100644 --- a/packages/opencode/src/installation/index.ts +++ b/packages/opencode/src/installation/index.ts @@ -2,7 +2,7 @@ import { BusEvent } from "@/bus/bus-event" import path from "path" import { $ } from "bun" import z from "zod" -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" import { Log } from "../util/log" import { iife } from "@/util/iife" import { Flag } from "../flag/flag" @@ -104,7 +104,7 @@ export namespace Installation { for (const check of checks) { const output = await check.command() const installedName = - check.name === "brew" || check.name === "choco" || check.name === "scoop" ? "opencode" : "opencode-ai" + check.name === "brew" || check.name === "choco" || check.name === "scoop" ? "opencode" : "opencoder-ai" if (output.includes(installedName)) { return check.name } @@ -132,19 +132,19 @@ export namespace Installation { let cmd switch (method) { case "curl": - cmd = $`curl -fsSL https://opencode.ai/install | bash`.env({ + cmd = $`curl -fsSL https://raw.githubusercontent.com/AryaLabsHQ/opencoder/dev/install | bash`.env({ ...process.env, VERSION: target, }) break case "npm": - cmd = $`npm install -g opencode-ai@${target}` + cmd = $`npm install -g opencoder-ai@${target}` break case "pnpm": - cmd = $`pnpm install -g opencode-ai@${target}` + cmd = $`pnpm install -g opencoder-ai@${target}` break case "bun": - cmd = $`bun install -g opencode-ai@${target}` + cmd = $`bun install -g opencoder-ai@${target}` break case "brew": { const formula = await getBrewFormula() @@ -220,7 +220,7 @@ export namespace Installation { return reg.endsWith("/") ? reg.slice(0, -1) : reg }) const channel = CHANNEL - return fetch(`${registry}/opencode-ai/${channel}`) + return fetch(`${registry}/opencoder-ai/${channel}`) .then((res) => { if (!res.ok) throw new Error(res.statusText) return res.json() @@ -251,7 +251,7 @@ export namespace Installation { .then((data: any) => data.version) } - return fetch("https://api.github.com/repos/anomalyco/opencode/releases/latest") + return fetch("https://api.github.com/repos/AryaLabsHQ/opencoder/releases/latest") .then((res) => { if (!res.ok) throw new Error(res.statusText) return res.json() diff --git a/packages/opencode/src/lsp/client.ts b/packages/opencode/src/lsp/client.ts index 8704b65acb5b..622bec84d4de 100644 --- a/packages/opencode/src/lsp/client.ts +++ b/packages/opencode/src/lsp/client.ts @@ -8,7 +8,7 @@ import { Log } from "../util/log" import { LANGUAGE_EXTENSIONS } from "./language" import z from "zod" import type { LSPServer } from "./server" -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" import { withTimeout } from "../util/timeout" import { Instance } from "../project/instance" import { Filesystem } from "../util/filesystem" diff --git a/packages/opencode/src/mcp/index.ts b/packages/opencode/src/mcp/index.ts index 3c29fe03d30a..1e561c4f9fa4 100644 --- a/packages/opencode/src/mcp/index.ts +++ b/packages/opencode/src/mcp/index.ts @@ -11,7 +11,7 @@ import { } from "@modelcontextprotocol/sdk/types.js" import { Config } from "../config/config" import { Log } from "../util/log" -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" import z from "zod/v4" import { Instance } from "../project/instance" import { Installation } from "../installation" diff --git a/packages/opencode/src/plugin/codex.ts b/packages/opencode/src/plugin/codex.ts index 56931b2ed62c..99e8fb328d6c 100644 --- a/packages/opencode/src/plugin/codex.ts +++ b/packages/opencode/src/plugin/codex.ts @@ -1,4 +1,4 @@ -import type { Hooks, PluginInput } from "@opencode-ai/plugin" +import type { Hooks, PluginInput } from "@opencoder-ai/plugin" import { Log } from "../util/log" import { Installation } from "../installation" import { Auth, OAUTH_DUMMY_KEY } from "../auth" @@ -440,8 +440,8 @@ export async function CodexAuthPlugin(input: PluginInput): Promise { const tokens = await refreshAccessToken(currentAuth.refresh) const newAccountId = extractAccountId(tokens) || authWithAccount.accountId await input.client.auth.set({ - path: { id: "openai" }, - body: { + providerID: "openai", + auth: { type: "oauth", refresh: tokens.refresh_token, access: tokens.access_token, @@ -457,7 +457,9 @@ export async function CodexAuthPlugin(input: PluginInput): Promise { const headers = new Headers() if (init?.headers) { if (init.headers instanceof Headers) { - init.headers.forEach((value, key) => headers.set(key, value)) + init.headers.forEach((value, key) => { + headers.set(key, value) + }) } else if (Array.isArray(init.headers)) { for (const [key, value] of init.headers) { if (value !== undefined) headers.set(key, String(value)) diff --git a/packages/opencode/src/plugin/copilot.ts b/packages/opencode/src/plugin/copilot.ts index 39ea0d00d28e..e5214e4c11af 100644 --- a/packages/opencode/src/plugin/copilot.ts +++ b/packages/opencode/src/plugin/copilot.ts @@ -1,4 +1,4 @@ -import type { Hooks, PluginInput } from "@opencode-ai/plugin" +import type { Hooks, PluginInput } from "@opencoder-ai/plugin" import { Installation } from "@/installation" import { iife } from "@/util/iife" @@ -309,15 +309,15 @@ export async function CopilotAuthPlugin(input: PluginInput): Promise { } const session = await sdk.session - .get({ - path: { - id: incoming.sessionID, - }, - query: { + .get( + { + sessionID: incoming.sessionID, directory: input.directory, }, - throwOnError: true, - }) + { + throwOnError: true, + }, + ) .catch(() => undefined) if (!session || !session.data.parentID) return // mark subagent sessions as agent initiated matching standard that other copilot tools have diff --git a/packages/opencode/src/plugin/index.ts b/packages/opencode/src/plugin/index.ts index 24dc695d6350..1c788b5b8fe9 100644 --- a/packages/opencode/src/plugin/index.ts +++ b/packages/opencode/src/plugin/index.ts @@ -1,17 +1,17 @@ -import type { Hooks, PluginInput, Plugin as PluginInstance } from "@opencode-ai/plugin" +import type { PluginInput, Hooks } from "@opencoder-ai/plugin" +import type { Plugin as PluginFn } from "@opencoder-ai/plugin" import { Config } from "../config/config" import { Bus } from "../bus" import { Log } from "../util/log" -import { createOpencodeClient } from "@opencode-ai/sdk" +import { createOpencodeClient } from "@opencoder-ai/sdk/v2" import { Server } from "../server/server" import { BunProc } from "../bun" import { Instance } from "../project/instance" import { Flag } from "../flag/flag" import { CodexAuthPlugin } from "./codex" import { Session } from "../session" -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" import { CopilotAuthPlugin } from "./copilot" -import { gitlabAuthPlugin as GitlabAuthPlugin } from "@gitlab/opencode-gitlab-auth" export namespace Plugin { const log = Log.create({ service: "plugin" }) @@ -19,7 +19,7 @@ export namespace Plugin { const BUILTIN = ["opencode-anthropic-auth@0.0.13"] // Built-in plugins that are directly imported (not installed from npm) - const INTERNAL_PLUGINS: PluginInstance[] = [CodexAuthPlugin, CopilotAuthPlugin, GitlabAuthPlugin] + const INTERNAL_PLUGINS: PluginFn[] = [CodexAuthPlugin, CopilotAuthPlugin] const state = Instance.state(async () => { const client = createOpencodeClient({ @@ -28,8 +28,10 @@ export namespace Plugin { // @ts-ignore - fetch type incompatibility fetch: async (...args) => Server.App().fetch(...args), }) + const config = await Config.get() const hooks: Hooks[] = [] + const input: PluginInput = { client, project: Instance.project, @@ -80,14 +82,17 @@ export namespace Plugin { if (!plugin) continue } const mod = await import(plugin) + // Prevent duplicate initialization when plugins export the same function // as both a named export and default export (e.g., `export const X` and `export default X`). // Object.entries(mod) would return both entries pointing to the same function reference. - const seen = new Set() - for (const [_name, fn] of Object.entries(mod)) { - if (seen.has(fn)) continue - seen.add(fn) - const init = await fn(input) + const seen = new Set() + for (const [_name, fn] of Object.entries(mod)) { + if (typeof fn !== "function") continue + const pluginFn = fn as PluginFn + if (seen.has(pluginFn)) continue + seen.add(pluginFn) + const init = await pluginFn(input) hooks.push(init) } } @@ -123,7 +128,6 @@ export namespace Plugin { const hooks = await state().then((x) => x.hooks) const config = await Config.get() for (const hook of hooks) { - // @ts-expect-error this is because we haven't moved plugin to sdk v2 await hook.config?.(config) } Bus.subscribeAll(async (input) => { diff --git a/packages/opencode/src/project/project.ts b/packages/opencode/src/project/project.ts index c79a62c6c95e..e854b2d083e2 100644 --- a/packages/opencode/src/project/project.ts +++ b/packages/opencode/src/project/project.ts @@ -7,7 +7,7 @@ import { Log } from "../util/log" import { Flag } from "@/flag/flag" import { Session } from "../session" import { work } from "../util/queue" -import { fn } from "@opencode-ai/util/fn" +import { fn } from "@opencoder-ai/util/fn" import { BusEvent } from "@/bus/bus-event" import { iife } from "@/util/iife" import { GlobalBus } from "@/bus/global" diff --git a/packages/opencode/src/provider/auth.ts b/packages/opencode/src/provider/auth.ts index e6681ff08914..45cc383cac6a 100644 --- a/packages/opencode/src/provider/auth.ts +++ b/packages/opencode/src/provider/auth.ts @@ -3,8 +3,8 @@ import { Plugin } from "../plugin" import { map, filter, pipe, fromEntries, mapValues } from "remeda" import z from "zod" import { fn } from "@/util/fn" -import type { AuthOuathResult, Hooks } from "@opencode-ai/plugin" -import { NamedError } from "@opencode-ai/util/error" +import type { AuthOuathResult, Hooks } from "@opencoder-ai/plugin" +import { NamedError } from "@opencoder-ai/util/error" import { Auth } from "@/auth" export namespace ProviderAuth { diff --git a/packages/opencode/src/provider/provider.ts b/packages/opencode/src/provider/provider.ts index 44bcf8adb3de..2a4f2a618801 100644 --- a/packages/opencode/src/provider/provider.ts +++ b/packages/opencode/src/provider/provider.ts @@ -8,7 +8,7 @@ import { Log } from "../util/log" import { BunProc } from "../bun" import { Plugin } from "../plugin" import { ModelsDev } from "./models" -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" import { Auth } from "../auth" import { Env } from "../env" import { Instance } from "../project/instance" diff --git a/packages/opencode/src/pty/index.ts b/packages/opencode/src/pty/index.ts index a9052a79eb8c..352df39b55b2 100644 --- a/packages/opencode/src/pty/index.ts +++ b/packages/opencode/src/pty/index.ts @@ -5,7 +5,7 @@ import z from "zod" import { Identifier } from "../id/id" import { Log } from "../util/log" import { Instance } from "../project/instance" -import { lazy } from "@opencode-ai/util/lazy" +import { lazy } from "@opencoder-ai/util/lazy" import { Shell } from "@/shell/shell" import { Plugin } from "@/plugin" diff --git a/packages/opencode/src/server/routes/session.ts b/packages/opencode/src/server/routes/session.ts index 82e6f3121bf7..4ea546ec63bd 100644 --- a/packages/opencode/src/server/routes/session.ts +++ b/packages/opencode/src/server/routes/session.ts @@ -157,7 +157,7 @@ export const SessionRoutes = lazy(() => describeRoute({ summary: "Get session todos", description: "Retrieve the todo list associated with a specific session, showing tasks and action items.", - operationId: "session.todo", + operationId: "session.todo.list", responses: { 200: { description: "Todo list", @@ -182,6 +182,43 @@ export const SessionRoutes = lazy(() => return c.json(todos) }, ) + .put( + "/:sessionID/todo", + describeRoute({ + summary: "Update session todos", + description: "Replace the todo list associated with a specific session.", + operationId: "session.todo.update", + responses: { + 200: { + description: "Updated todo list", + content: { + "application/json": { + schema: resolver(Todo.Info.array()), + }, + }, + }, + ...errors(400, 404), + }, + }), + validator( + "param", + z.object({ + sessionID: z.string().meta({ description: "Session ID" }), + }), + ), + validator( + "json", + z.object({ + todos: Todo.Info.array(), + }), + ), + async (c) => { + const sessionID = c.req.valid("param").sessionID + const { todos } = c.req.valid("json") + await Todo.update({ sessionID, todos }) + return c.json(todos) + }, + ) .post( "/", describeRoute({ diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts index 9fb5206551b6..be24af2900fb 100644 --- a/packages/opencode/src/server/server.ts +++ b/packages/opencode/src/server/server.ts @@ -9,7 +9,7 @@ import { proxy } from "hono/proxy" import { basicAuth } from "hono/basic-auth" import z from "zod" import { Provider } from "../provider/provider" -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" import { LSP } from "../lsp" import { Format } from "../format" import { TuiRoutes } from "./routes/tui" diff --git a/packages/opencode/src/session/index.ts b/packages/opencode/src/session/index.ts index b0ffaaf70d77..c6c7a44de66b 100644 --- a/packages/opencode/src/session/index.ts +++ b/packages/opencode/src/session/index.ts @@ -1,4 +1,4 @@ -import { Slug } from "@opencode-ai/util/slug" +import { Slug } from "@opencoder-ai/util/slug" import path from "path" import { BusEvent } from "@/bus/bus-event" import { Bus } from "@/bus" @@ -431,6 +431,7 @@ export namespace Session { const part = "delta" in input ? input.part : input const delta = "delta" in input ? input.delta : undefined await Storage.write(["part", part.messageID, part.id], part) + Bus.publish(MessageV2.Event.PartUpdated, { part, delta, diff --git a/packages/opencode/src/session/message-v2.ts b/packages/opencode/src/session/message-v2.ts index 70763548c6a0..9a960ecae581 100644 --- a/packages/opencode/src/session/message-v2.ts +++ b/packages/opencode/src/session/message-v2.ts @@ -1,6 +1,6 @@ import { BusEvent } from "@/bus/bus-event" import z from "zod" -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" import { APICallError, convertToModelMessages, LoadAPIKeyError, type ModelMessage, type UIMessage } from "ai" import { Identifier } from "../id/id" import { LSP } from "../lsp" @@ -751,91 +751,101 @@ export namespace MessageV2 { } export function fromError(e: unknown, ctx: { providerID: string }) { - switch (true) { - case e instanceof DOMException && e.name === "AbortError": - return new MessageV2.AbortedError( - { message: e.message }, - { - cause: e, + if (e instanceof DOMException && e.name === "AbortError") { + return new MessageV2.AbortedError( + { message: e.message }, + { + cause: e, + }, + ).toObject() + } + if (MessageV2.OutputLengthError.isInstance(e)) { + return e + } + if (LoadAPIKeyError.isInstance(e)) { + return new MessageV2.AuthError( + { + providerID: ctx.providerID, + message: e.message, + }, + { cause: e }, + ).toObject() + } + if ((e as SystemError)?.code === "ECONNRESET") { + return new MessageV2.APIError( + { + message: "Connection reset by server", + isRetryable: true, + metadata: { + code: (e as SystemError).code ?? "", + syscall: (e as SystemError).syscall ?? "", + message: (e as SystemError).message ?? "", }, - ).toObject() - case MessageV2.OutputLengthError.isInstance(e): - return e - case LoadAPIKeyError.isInstance(e): - return new MessageV2.AuthError( + }, + { cause: e }, + ).toObject() + } + if (APICallError.isInstance(e)) { + const parsed = ProviderError.parseAPICallError({ + providerID: ctx.providerID, + error: e, + }) + if (parsed.type === "context_overflow") { + return new MessageV2.ContextOverflowError( { - providerID: ctx.providerID, - message: e.message, + message: parsed.message, + responseBody: parsed.responseBody, }, { cause: e }, ).toObject() - case (e as SystemError)?.code === "ECONNRESET": - return new MessageV2.APIError( + } + + return new MessageV2.APIError( + { + message: parsed.message, + statusCode: parsed.statusCode, + isRetryable: parsed.isRetryable, + responseHeaders: parsed.responseHeaders, + responseBody: parsed.responseBody, + metadata: parsed.metadata, + }, + { cause: e }, + ).toObject() + } + if (e instanceof Error) { + return new NamedError.Unknown({ message: e.toString() }, { cause: e }).toObject() + } + + try { + const parsed = ProviderError.parseStreamError(e) + if (parsed?.type === "context_overflow") { + return new MessageV2.ContextOverflowError( { - message: "Connection reset by server", - isRetryable: true, - metadata: { - code: (e as SystemError).code ?? "", - syscall: (e as SystemError).syscall ?? "", - message: (e as SystemError).message ?? "", - }, + message: parsed.message, + responseBody: parsed.responseBody, }, { cause: e }, ).toObject() - case APICallError.isInstance(e): - const parsed = ProviderError.parseAPICallError({ - providerID: ctx.providerID, - error: e, - }) - if (parsed.type === "context_overflow") { - return new MessageV2.ContextOverflowError( - { - message: parsed.message, - responseBody: parsed.responseBody, - }, - { cause: e }, - ).toObject() - } - + } + if (parsed?.type === "api_error") { return new MessageV2.APIError( { message: parsed.message, - statusCode: parsed.statusCode, isRetryable: parsed.isRetryable, - responseHeaders: parsed.responseHeaders, responseBody: parsed.responseBody, - metadata: parsed.metadata, }, { cause: e }, ).toObject() - case e instanceof Error: - return new NamedError.Unknown({ message: e.toString() }, { cause: e }).toObject() - default: - try { - const parsed = ProviderError.parseStreamError(e) - if (parsed) { - if (parsed.type === "context_overflow") { - return new MessageV2.ContextOverflowError( - { - message: parsed.message, - responseBody: parsed.responseBody, - }, - { cause: e }, - ).toObject() - } - return new MessageV2.APIError( - { - message: parsed.message, - isRetryable: parsed.isRetryable, - responseBody: parsed.responseBody, - }, - { - cause: e, - }, - ).toObject() - } - } catch {} - return new NamedError.Unknown({ message: JSON.stringify(e) }, { cause: e }).toObject() - } + } + } catch {} + + const message = (() => { + try { + return JSON.stringify(e) + } catch { + return Bun.inspect(e) + } + })() + return new NamedError.Unknown({ message }, { cause: e }).toObject() } } diff --git a/packages/opencode/src/session/message.ts b/packages/opencode/src/session/message.ts index 5c950d0e4028..e9f51d3ef5bf 100644 --- a/packages/opencode/src/session/message.ts +++ b/packages/opencode/src/session/message.ts @@ -1,5 +1,5 @@ import z from "zod" -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" export namespace Message { export const OutputLengthError = NamedError.create("MessageOutputLengthError", z.object({})) diff --git a/packages/opencode/src/session/prompt.ts b/packages/opencode/src/session/prompt.ts index be813e823fb0..2442d132f3fc 100644 --- a/packages/opencode/src/session/prompt.ts +++ b/packages/opencode/src/session/prompt.ts @@ -17,8 +17,8 @@ import { ProviderTransform } from "../provider/transform" import { SystemPrompt } from "./system" import { InstructionPrompt } from "./instruction" import { Plugin } from "../plugin" -import PROMPT_PLAN from "../session/prompt/plan.txt" import BUILD_SWITCH from "../session/prompt/build-switch.txt" +import PROMPT_PLAN from "../session/prompt/plan.txt" import MAX_STEPS from "../session/prompt/max-steps.txt" import { defer } from "../util/defer" import { clone } from "remeda" @@ -29,12 +29,11 @@ import { ReadTool } from "../tool/read" import { FileTime } from "../file/time" import { Flag } from "../flag/flag" import { ulid } from "ulid" -import { spawn } from "child_process" import { Command } from "../command" import { $, fileURLToPath, pathToFileURL } from "bun" import { ConfigMarkdown } from "../config/markdown" import { SessionSummary } from "./summary" -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" import { fn } from "@/util/fn" import { SessionProcessor } from "./processor" import { TaskTool } from "@/tool/task" @@ -411,6 +410,7 @@ export namespace SessionPrompt { tool: "task", sessionID, callID: part.id, + agent: task.agent, }, { args: taskArgs }, ) @@ -422,6 +422,7 @@ export namespace SessionPrompt { sessionID: sessionID, abort, callID: part.callID, + model: { providerID: taskModel.providerID, modelID: taskModel.id }, extra: { bypassAgentCheck: true }, messages: msgs, async metadata(input) { @@ -454,6 +455,7 @@ export namespace SessionPrompt { sessionID, callID: part.id, args: taskArgs, + agent: task.agent, }, result, ) @@ -746,7 +748,8 @@ export namespace SessionPrompt { abort: options.abortSignal!, messageID: input.processor.message.id, callID: options.toolCallId, - extra: { model: input.model, bypassAgentCheck: input.bypassAgentCheck }, + model: { providerID: input.model.providerID, modelID: input.model.id }, + extra: { bypassAgentCheck: input.bypassAgentCheck }, agent: input.agent.name, messages: input.messages, metadata: async (val: { title?: string; metadata?: any }) => { @@ -793,6 +796,7 @@ export namespace SessionPrompt { tool: item.id, sessionID: ctx.sessionID, callID: ctx.callID, + agent: input.agent.name, }, { args, @@ -806,6 +810,7 @@ export namespace SessionPrompt { sessionID: ctx.sessionID, callID: ctx.callID, args, + agent: input.agent.name, }, result, ) @@ -830,6 +835,7 @@ export namespace SessionPrompt { tool: key, sessionID: ctx.sessionID, callID: opts.toolCallId, + agent: input.agent.name, }, { args, @@ -852,6 +858,7 @@ export namespace SessionPrompt { sessionID: ctx.sessionID, callID: opts.toolCallId, args, + agent: input.agent.name, }, result, ) @@ -1135,13 +1142,14 @@ export namespace SessionPrompt { await ReadTool.init() .then(async (t) => { - const model = await Provider.getModel(info.model.providerID, info.model.modelID) + const model = info.model ?? (await Provider.defaultModel()) const readCtx: Tool.Context = { sessionID: input.sessionID, abort: new AbortController().signal, agent: input.agent!, messageID: info.id, - extra: { bypassCwdCheck: true, model }, + model, + extra: { bypassCwdCheck: true }, messages: [], metadata: async () => {}, ask: async () => {}, @@ -1198,11 +1206,13 @@ export namespace SessionPrompt { if (part.mime === "application/x-directory") { const args = { filePath: filepath } + const model = info.model ?? (await Provider.defaultModel()) const listCtx: Tool.Context = { sessionID: input.sessionID, abort: new AbortController().signal, agent: input.agent!, messageID: info.id, + model, extra: { bypassCwdCheck: true }, messages: [], metadata: async () => {}, @@ -1568,124 +1578,29 @@ NOTE: At any point in time through this workflow you should feel free to ask the }, } await Session.updatePart(part) - const shell = Shell.preferred() - const shellName = ( - process.platform === "win32" ? path.win32.basename(shell, ".exe") : path.basename(shell) - ).toLowerCase() - - const invocations: Record = { - nu: { - args: ["-c", input.command], - }, - fish: { - args: ["-c", input.command], - }, - zsh: { - args: [ - "-c", - "-l", - ` - [[ -f ~/.zshenv ]] && source ~/.zshenv >/dev/null 2>&1 || true - [[ -f "\${ZDOTDIR:-$HOME}/.zshrc" ]] && source "\${ZDOTDIR:-$HOME}/.zshrc" >/dev/null 2>&1 || true - eval ${JSON.stringify(input.command)} - `, - ], - }, - bash: { - args: [ - "-c", - "-l", - ` - shopt -s expand_aliases - [[ -f ~/.bashrc ]] && source ~/.bashrc >/dev/null 2>&1 || true - eval ${JSON.stringify(input.command)} - `, - ], - }, - // Windows cmd - cmd: { - args: ["/c", input.command], - }, - // Windows PowerShell - powershell: { - args: ["-NoProfile", "-Command", input.command], - }, - pwsh: { - args: ["-NoProfile", "-Command", input.command], - }, - // Fallback: any shell that doesn't match those above - // - No -l, for max compatibility - "": { - args: ["-c", `${input.command}`], - }, - } - - const matchingInvocation = invocations[shellName] ?? invocations[""] - const args = matchingInvocation?.args - - const cwd = Instance.directory - const shellEnv = await Plugin.trigger("shell.env", { cwd }, { env: {} }) - const proc = spawn(shell, args, { - cwd, - detached: process.platform !== "win32", - stdio: ["ignore", "pipe", "pipe"], - env: { - ...process.env, - ...shellEnv.env, - TERM: "dumb", - }, - }) - - let output = "" - - proc.stdout?.on("data", (chunk) => { - output += chunk.toString() - if (part.state.status === "running") { - part.state.metadata = { - output: output, - description: "", - } - Session.updatePart(part) - } - }) - proc.stderr?.on("data", (chunk) => { - output += chunk.toString() - if (part.state.status === "running") { - part.state.metadata = { - output: output, - description: "", + let currentOutput = "" + + const result = await Shell.execute({ + command: input.command, + cwd: Instance.directory, + shell: Shell.preferred(), + loadRcFiles: true, + abort, + onOutput: (output) => { + currentOutput = output + if (part.state.status === "running") { + part.state.metadata = { + output, + description: "", + } + Session.updatePart(part) } - Session.updatePart(part) - } - }) - - let aborted = false - let exited = false - - const kill = () => Shell.killTree(proc, { exited: () => exited }) - - if (abort.aborted) { - aborted = true - await kill() - } - - const abortHandler = () => { - aborted = true - void kill() - } - - abort.addEventListener("abort", abortHandler, { once: true }) - - await new Promise((resolve) => { - proc.on("close", () => { - exited = true - abort.removeEventListener("abort", abortHandler) - resolve() - }) + }, }) - if (aborted) { + let output = currentOutput + if (result.aborted) { output += "\n\n" + ["", "User aborted the command", ""].join("\n") } msg.time.completed = Date.now() diff --git a/packages/opencode/src/session/retry.ts b/packages/opencode/src/session/retry.ts index 6d057f539f81..2c2038bb99b7 100644 --- a/packages/opencode/src/session/retry.ts +++ b/packages/opencode/src/session/retry.ts @@ -1,4 +1,4 @@ -import type { NamedError } from "@opencode-ai/util/error" +import type { NamedError } from "@opencoder-ai/util/error" import { MessageV2 } from "./message-v2" import { iife } from "@/util/iife" diff --git a/packages/opencode/src/share/share-next.ts b/packages/opencode/src/share/share-next.ts index a3a229d1a1d5..87fdaf6982ed 100644 --- a/packages/opencode/src/share/share-next.ts +++ b/packages/opencode/src/share/share-next.ts @@ -6,7 +6,7 @@ import { Session } from "@/session" import { MessageV2 } from "@/session/message-v2" import { Storage } from "@/storage/storage" import { Log } from "@/util/log" -import type * as SDK from "@opencode-ai/sdk/v2" +import type * as SDK from "@opencoder-ai/sdk/v2" export namespace ShareNext { const log = Log.create({ service: "share-next" }) diff --git a/packages/opencode/src/shell/shell.ts b/packages/opencode/src/shell/shell.ts index 2e8d48bfd921..c15c1548e03c 100644 --- a/packages/opencode/src/shell/shell.ts +++ b/packages/opencode/src/shell/shell.ts @@ -64,4 +64,132 @@ export namespace Shell { if (s && !BLACKLIST.has(process.platform === "win32" ? path.win32.basename(s) : path.basename(s))) return s return fallback() }) + + function getInvocationArgs(shell: string, command: string): string[] { + const shellName = ( + process.platform === "win32" ? path.win32.basename(shell, ".exe") : path.basename(shell) + ).toLowerCase() + + const invocations: Record = { + nu: ["-c", command], + fish: ["-c", command], + zsh: [ + "-c", + "-l", + `[[ -f ~/.zshenv ]] && source ~/.zshenv >/dev/null 2>&1 || true +[[ -f "\${ZDOTDIR:-$HOME}/.zshrc" ]] && source "\${ZDOTDIR:-$HOME}/.zshrc" >/dev/null 2>&1 || true +eval ${JSON.stringify(command)}`, + ], + bash: [ + "-c", + "-l", + `shopt -s expand_aliases +[[ -f ~/.bashrc ]] && source ~/.bashrc >/dev/null 2>&1 || true +eval ${JSON.stringify(command)}`, + ], + cmd: ["/c", command], + powershell: ["-NoProfile", "-Command", command], + pwsh: ["-NoProfile", "-Command", command], + } + + return invocations[shellName] ?? ["-c", command] + } + + // ============ Unified Execution ============ + + export interface ExecuteOptions { + command: string + cwd: string + shell?: string + loadRcFiles?: boolean + timeout?: number + abort: AbortSignal + env?: Record + onOutput?: (output: string) => void + } + + export interface ExecuteResult { + output: string + exitCode: number | null + timedOut: boolean + aborted: boolean + } + + export async function execute(options: ExecuteOptions): Promise { + const { command, cwd, shell = acceptable(), loadRcFiles = false, timeout, abort, env = {}, onOutput } = options + + const proc = loadRcFiles + ? spawn(shell, getInvocationArgs(shell, command), { + cwd, + env: { ...process.env, TERM: "dumb", ...env }, + stdio: ["ignore", "pipe", "pipe"], + detached: process.platform !== "win32", + }) + : spawn(command, { + shell, + cwd, + env: { ...process.env, TERM: "dumb", ...env }, + stdio: ["ignore", "pipe", "pipe"], + detached: process.platform !== "win32", + }) + + let output = "" + let timedOut = false + let aborted = false + let exited = false + + const append = (chunk: Buffer) => { + output += chunk.toString() + onOutput?.(output) + } + + proc.stdout?.on("data", append) + proc.stderr?.on("data", append) + + const kill = () => killTree(proc, { exited: () => exited }) + + if (abort.aborted) { + aborted = true + await kill() + } + + const abortHandler = () => { + aborted = true + void kill() + } + abort.addEventListener("abort", abortHandler, { once: true }) + + const timeoutTimer = timeout + ? setTimeout(() => { + timedOut = true + void kill() + }, timeout + 100) + : undefined + + await new Promise((resolve, reject) => { + const cleanup = () => { + if (timeoutTimer) clearTimeout(timeoutTimer) + abort.removeEventListener("abort", abortHandler) + } + + proc.once("exit", () => { + exited = true + cleanup() + resolve() + }) + + proc.once("error", (error) => { + exited = true + cleanup() + reject(error) + }) + }) + + return { + output, + exitCode: proc.exitCode, + timedOut, + aborted, + } + } } diff --git a/packages/opencode/src/skill/skill.ts b/packages/opencode/src/skill/skill.ts index 42795b7ebcc3..bc93bceb6ae9 100644 --- a/packages/opencode/src/skill/skill.ts +++ b/packages/opencode/src/skill/skill.ts @@ -3,7 +3,7 @@ import path from "path" import os from "os" import { Config } from "../config/config" import { Instance } from "../project/instance" -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" import { ConfigMarkdown } from "../config/markdown" import { Log } from "../util/log" import { Global } from "@/global" diff --git a/packages/opencode/src/storage/storage.ts b/packages/opencode/src/storage/storage.ts index 18f2d67e7ac0..c5d7edcb17dd 100644 --- a/packages/opencode/src/storage/storage.ts +++ b/packages/opencode/src/storage/storage.ts @@ -6,7 +6,7 @@ import { Filesystem } from "../util/filesystem" import { lazy } from "../util/lazy" import { Lock } from "../util/lock" import { $ } from "bun" -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" import z from "zod" export namespace Storage { diff --git a/packages/opencode/src/tool/bash.ts b/packages/opencode/src/tool/bash.ts index 67559b78c085..c9e8aea8f8f0 100644 --- a/packages/opencode/src/tool/bash.ts +++ b/packages/opencode/src/tool/bash.ts @@ -1,5 +1,4 @@ import z from "zod" -import { spawn } from "child_process" import { Tool } from "./tool" import path from "path" import DESCRIPTION from "./bash.txt" @@ -19,6 +18,7 @@ import { Truncate } from "./truncation" import { Plugin } from "@/plugin" const MAX_METADATA_LENGTH = 30_000 +const MAX_OUTPUT_LENGTH = 30_000 const DEFAULT_TIMEOUT = Flag.OPENCODE_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS || 2 * 60 * 1000 export const log = Log.create({ service: "bash-tool" }) @@ -53,8 +53,7 @@ const parser = lazy(async () => { // TODO: we may wanna rename this tool so it works better on other shells export const BashTool = Tool.define("bash", async () => { - const shell = Shell.acceptable() - log.info("bash tool using shell", { shell }) + log.info("bash tool using shell", { shell: Shell.acceptable() }) return { description: DESCRIPTION.replaceAll("${directory}", Instance.directory) @@ -163,20 +162,6 @@ export const BashTool = Tool.define("bash", async () => { }) } - const shellEnv = await Plugin.trigger("shell.env", { cwd }, { env: {} }) - const proc = spawn(params.command, { - shell, - cwd, - env: { - ...process.env, - ...shellEnv.env, - }, - stdio: ["ignore", "pipe", "pipe"], - detached: process.platform !== "win32", - }) - - let output = "" - // Initialize metadata with empty output ctx.metadata({ metadata: { @@ -185,69 +170,40 @@ export const BashTool = Tool.define("bash", async () => { }, }) - const append = (chunk: Buffer) => { - output += chunk.toString() - ctx.metadata({ - metadata: { - // truncate the metadata to avoid GIANT blobs of data (has nothing to do w/ what agent can access) - output: output.length > MAX_METADATA_LENGTH ? output.slice(0, MAX_METADATA_LENGTH) + "\n\n..." : output, - description: params.description, - }, - }) - } - - proc.stdout?.on("data", append) - proc.stderr?.on("data", append) - - let timedOut = false - let aborted = false - let exited = false - - const kill = () => Shell.killTree(proc, { exited: () => exited }) - - if (ctx.abort.aborted) { - aborted = true - await kill() - } - - const abortHandler = () => { - aborted = true - void kill() - } - - ctx.abort.addEventListener("abort", abortHandler, { once: true }) - - const timeoutTimer = setTimeout(() => { - timedOut = true - void kill() - }, timeout + 100) - - await new Promise((resolve, reject) => { - const cleanup = () => { - clearTimeout(timeoutTimer) - ctx.abort.removeEventListener("abort", abortHandler) - } - - proc.once("exit", () => { - exited = true - cleanup() - resolve() - }) + let currentOutput = "" - proc.once("error", (error) => { - exited = true - cleanup() - reject(error) - }) + const result = await Shell.execute({ + command: params.command, + cwd, + loadRcFiles: true, + timeout, + abort: ctx.abort, + onOutput: (output) => { + currentOutput = output + if (output.length <= MAX_OUTPUT_LENGTH) { + ctx.metadata({ + metadata: { + output, + description: params.description, + }, + }) + } + }, }) + let output = currentOutput const resultMetadata: string[] = [] - if (timedOut) { + if (output.length > MAX_OUTPUT_LENGTH) { + output = output.slice(0, MAX_OUTPUT_LENGTH) + resultMetadata.push(`bash tool truncated output as it exceeded ${MAX_OUTPUT_LENGTH} char limit`) + } + + if (result.timedOut) { resultMetadata.push(`bash tool terminated command after exceeding timeout ${timeout} ms`) } - if (aborted) { + if (result.aborted) { resultMetadata.push("User aborted the command") } @@ -259,7 +215,7 @@ export const BashTool = Tool.define("bash", async () => { title: params.description, metadata: { output: output.length > MAX_METADATA_LENGTH ? output.slice(0, MAX_METADATA_LENGTH) + "\n\n..." : output, - exit: proc.exitCode, + exit: result.exitCode, description: params.description, }, output, diff --git a/packages/opencode/src/tool/registry.ts b/packages/opencode/src/tool/registry.ts index 9a06cb59937b..fd287f018bb6 100644 --- a/packages/opencode/src/tool/registry.ts +++ b/packages/opencode/src/tool/registry.ts @@ -16,7 +16,7 @@ import { Tool } from "./tool" import { Instance } from "../project/instance" import { Config } from "../config/config" import path from "path" -import { type ToolContext as PluginToolContext, type ToolDefinition } from "@opencode-ai/plugin" +import { type ToolContext as PluginToolContext, type ToolDefinition, type ToolResult } from "@opencoder-ai/plugin" import z from "zod" import { Plugin } from "../plugin" import { WebSearchTool } from "./websearch" @@ -68,13 +68,20 @@ export namespace ToolRegistry { ...ctx, directory: Instance.directory, worktree: Instance.worktree, + model: ctx.model, } as unknown as PluginToolContext const result = await def.execute(args as any, pluginCtx) - const out = await Truncate.output(result, {}, initCtx?.agent) + const normalized = typeof result === "string" ? { title: "", metadata: {}, output: result } : result + const out = await Truncate.output(normalized.output, {}, initCtx?.agent) return { - title: "", - output: out.truncated ? out.content : result, - metadata: { truncated: out.truncated, outputPath: out.truncated ? out.outputPath : undefined }, + title: normalized.title, + output: out.truncated ? out.content : normalized.output, + metadata: { + ...normalized.metadata, + truncated: out.truncated, + outputPath: out.truncated ? out.outputPath : undefined, + }, + attachments: normalized.attachments, } }, }), diff --git a/packages/opencode/src/tool/task.ts b/packages/opencode/src/tool/task.ts index 8c8cf827abaf..96b4aedc1b6d 100644 --- a/packages/opencode/src/tool/task.ts +++ b/packages/opencode/src/tool/task.ts @@ -2,6 +2,7 @@ import { Tool } from "./tool" import DESCRIPTION from "./task.txt" import z from "zod" import { Session } from "../session" +import { Bus } from "../bus" import { MessageV2 } from "../session/message-v2" import { Identifier } from "../id/id" import { Agent } from "../agent/agent" @@ -10,6 +11,7 @@ import { iife } from "@/util/iife" import { defer } from "@/util/defer" import { Config } from "../config/config" import { PermissionNext } from "@/permission/next" +import { Provider } from "../provider/provider" const parameters = z.object({ description: z.string().describe("A short (3-5 words) description of the task"), @@ -103,10 +105,18 @@ export const TaskTool = Tool.define("task", async (ctx) => { const msg = await MessageV2.get({ sessionID: ctx.sessionID, messageID: ctx.messageID }) if (msg.info.role !== "assistant") throw new Error("Not an assistant message") - const model = agent.model ?? { + const messageModel = { modelID: msg.info.modelID, providerID: msg.info.providerID, } + const useMessageModel = msg.info.agent === agent.name + const defaultModel = await Provider.defaultModel() + const model = useMessageModel + ? messageModel + : (agent.model ?? { + modelID: defaultModel.modelID, + providerID: defaultModel.providerID, + }) ctx.metadata({ title: params.description, @@ -117,6 +127,31 @@ export const TaskTool = Tool.define("task", async (ctx) => { }) const messageID = Identifier.ascending("message") + const parts: Record = {} + const unsub = Bus.subscribe(MessageV2.Event.PartUpdated, async (evt) => { + if (evt.properties.part.sessionID !== session.id) return + if (evt.properties.part.messageID === messageID) return + if (evt.properties.part.type !== "tool") return + const part = evt.properties.part + parts[part.id] = { + id: part.id, + tool: part.tool, + state: { + status: part.state.status, + title: part.state.status === "completed" ? part.state.title : undefined, + }, + } + ctx.metadata({ + title: params.description, + metadata: { + summary: Object.values(parts).sort((a, b) => a.id.localeCompare(b.id)), + subagent_type: params.subagent_type, + sessionId: session.id, + model, + description: params.description, + }, + }) + }) function cancel() { SessionPrompt.cancel(session.id) @@ -140,8 +175,22 @@ export const TaskTool = Tool.define("task", async (ctx) => { ...Object.fromEntries((config.experimental?.primary_tools ?? []).map((t) => [t, false])), }, parts: promptParts, + }).finally(() => { + unsub() }) + const messages = await Session.messages({ sessionID: session.id }) + const summary = messages + .filter((x) => x.info.role === "assistant") + .flatMap((msg) => msg.parts.filter((x: any) => x.type === "tool") as MessageV2.ToolPart[]) + .map((part) => ({ + id: part.id, + tool: part.tool, + state: { + status: part.state.status, + title: part.state.status === "completed" ? part.state.title : undefined, + }, + })) const text = result.parts.findLast((x) => x.type === "text")?.text ?? "" const output = [ @@ -155,8 +204,11 @@ export const TaskTool = Tool.define("task", async (ctx) => { return { title: params.description, metadata: { + summary, + subagent_type: params.subagent_type, sessionId: session.id, model, + description: params.description, }, output, } diff --git a/packages/opencode/src/tool/tool.ts b/packages/opencode/src/tool/tool.ts index 3d17ea192d32..e21f9947d91d 100644 --- a/packages/opencode/src/tool/tool.ts +++ b/packages/opencode/src/tool/tool.ts @@ -17,6 +17,7 @@ export namespace Tool { sessionID: string messageID: string agent: string + model: { providerID: string; modelID: string } abort: AbortSignal callID?: string extra?: { [key: string]: any } diff --git a/packages/opencode/src/worktree/index.ts b/packages/opencode/src/worktree/index.ts index 85d7f6d0e8a2..3a5fe0ec49f0 100644 --- a/packages/opencode/src/worktree/index.ts +++ b/packages/opencode/src/worktree/index.ts @@ -2,7 +2,7 @@ import { $ } from "bun" import fs from "fs/promises" import path from "path" import z from "zod" -import { NamedError } from "@opencode-ai/util/error" +import { NamedError } from "@opencoder-ai/util/error" import { Global } from "../global" import { Instance } from "../project/instance" import { InstanceBootstrap } from "../project/bootstrap" diff --git a/packages/opencode/test/acp/event-subscription.test.ts b/packages/opencode/test/acp/event-subscription.test.ts index 8e139ff59732..f8feca71e2ba 100644 --- a/packages/opencode/test/acp/event-subscription.test.ts +++ b/packages/opencode/test/acp/event-subscription.test.ts @@ -1,7 +1,7 @@ import { describe, expect, test } from "bun:test" import { ACP } from "../../src/acp/agent" import type { AgentSideConnection } from "@agentclientprotocol/sdk" -import type { Event } from "@opencode-ai/sdk/v2" +import type { Event } from "@opencoder-ai/sdk/v2" import { Instance } from "../../src/project/instance" import { tmpdir } from "../fixture/fixture" diff --git a/packages/opencode/test/cli/tui/transcript.test.ts b/packages/opencode/test/cli/tui/transcript.test.ts index 7a5fa6b8f1cf..4b8eb0c77144 100644 --- a/packages/opencode/test/cli/tui/transcript.test.ts +++ b/packages/opencode/test/cli/tui/transcript.test.ts @@ -5,7 +5,7 @@ import { formatPart, formatTranscript, } from "../../../src/cli/cmd/tui/util/transcript" -import type { AssistantMessage, Part, UserMessage } from "@opencode-ai/sdk/v2" +import type { AssistantMessage, Part, UserMessage } from "@opencoder-ai/sdk/v2" describe("transcript", () => { describe("formatAssistantHeader", () => { diff --git a/packages/opencode/test/memory/abort-leak.test.ts b/packages/opencode/test/memory/abort-leak.test.ts index b202c9127a8a..b9b19a6e0021 100644 --- a/packages/opencode/test/memory/abort-leak.test.ts +++ b/packages/opencode/test/memory/abort-leak.test.ts @@ -2,6 +2,7 @@ import { describe, test, expect } from "bun:test" import path from "path" import { Instance } from "../../src/project/instance" import { WebFetchTool } from "../../src/tool/webfetch" +import { testModel } from "../tool/fixtures/model" const projectRoot = path.join(__dirname, "../..") @@ -14,6 +15,7 @@ const ctx = { messages: [], metadata: () => {}, ask: async () => {}, + model: testModel, } const MB = 1024 * 1024 diff --git a/packages/opencode/test/session/retry.test.ts b/packages/opencode/test/session/retry.test.ts index 6768e72d95a7..8ca9a3be7e00 100644 --- a/packages/opencode/test/session/retry.test.ts +++ b/packages/opencode/test/session/retry.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import type { NamedError } from "@opencode-ai/util/error" +import type { NamedError } from "@opencoder-ai/util/error" import { APICallError } from "ai" import { SessionRetry } from "../../src/session/retry" import { MessageV2 } from "../../src/session/message-v2" diff --git a/packages/opencode/test/tool/apply_patch.test.ts b/packages/opencode/test/tool/apply_patch.test.ts index a08e235885af..42c3cfae8bf2 100644 --- a/packages/opencode/test/tool/apply_patch.test.ts +++ b/packages/opencode/test/tool/apply_patch.test.ts @@ -4,12 +4,14 @@ import * as fs from "fs/promises" import { ApplyPatchTool } from "../../src/tool/apply_patch" import { Instance } from "../../src/project/instance" import { tmpdir } from "../fixture/fixture" +import { testModel } from "./fixtures/model" const baseCtx = { sessionID: "test", messageID: "", callID: "", agent: "build", + model: testModel, abort: AbortSignal.any([]), messages: [], metadata: () => {}, diff --git a/packages/opencode/test/tool/bash.test.ts b/packages/opencode/test/tool/bash.test.ts index fd03b7f9803c..c5e0921860b1 100644 --- a/packages/opencode/test/tool/bash.test.ts +++ b/packages/opencode/test/tool/bash.test.ts @@ -5,12 +5,14 @@ import { Instance } from "../../src/project/instance" import { tmpdir } from "../fixture/fixture" import type { PermissionNext } from "../../src/permission/next" import { Truncate } from "../../src/tool/truncation" +import { testModel } from "./fixtures/model" const ctx = { sessionID: "test", messageID: "", callID: "", agent: "build", + model: testModel, abort: AbortSignal.any([]), messages: [], metadata: () => {}, diff --git a/packages/opencode/test/tool/external-directory.test.ts b/packages/opencode/test/tool/external-directory.test.ts index 33c5e2c7397f..331a65845728 100644 --- a/packages/opencode/test/tool/external-directory.test.ts +++ b/packages/opencode/test/tool/external-directory.test.ts @@ -4,12 +4,14 @@ import type { Tool } from "../../src/tool/tool" import { Instance } from "../../src/project/instance" import { assertExternalDirectory } from "../../src/tool/external-directory" import type { PermissionNext } from "../../src/permission/next" +import { testModel } from "./fixtures/model" const baseCtx: Omit = { sessionID: "test", messageID: "", callID: "", agent: "build", + model: testModel, abort: AbortSignal.any([]), messages: [], metadata: () => {}, diff --git a/packages/opencode/test/tool/fixtures/model.ts b/packages/opencode/test/tool/fixtures/model.ts new file mode 100644 index 000000000000..c74a45c27c62 --- /dev/null +++ b/packages/opencode/test/tool/fixtures/model.ts @@ -0,0 +1,4 @@ +export const testModel = { + providerID: "test-provider", + modelID: "test-model", +} diff --git a/packages/opencode/test/tool/grep.test.ts b/packages/opencode/test/tool/grep.test.ts index e774580df61c..fb8be41d88c9 100644 --- a/packages/opencode/test/tool/grep.test.ts +++ b/packages/opencode/test/tool/grep.test.ts @@ -3,12 +3,14 @@ import path from "path" import { GrepTool } from "../../src/tool/grep" import { Instance } from "../../src/project/instance" import { tmpdir } from "../fixture/fixture" +import { testModel } from "./fixtures/model" const ctx = { sessionID: "test", messageID: "", callID: "", agent: "build", + model: testModel, abort: AbortSignal.any([]), messages: [], metadata: () => {}, diff --git a/packages/opencode/test/tool/question.test.ts b/packages/opencode/test/tool/question.test.ts index 4a436186db61..951877153957 100644 --- a/packages/opencode/test/tool/question.test.ts +++ b/packages/opencode/test/tool/question.test.ts @@ -2,12 +2,14 @@ import { describe, expect, test, spyOn, beforeEach, afterEach } from "bun:test" import { z } from "zod" import { QuestionTool } from "../../src/tool/question" import * as QuestionModule from "../../src/question" +import { testModel } from "./fixtures/model" const ctx = { sessionID: "test-session", messageID: "test-message", callID: "test-call", agent: "test-agent", + model: testModel, abort: AbortSignal.any([]), messages: [], metadata: () => {}, diff --git a/packages/opencode/test/tool/read.test.ts b/packages/opencode/test/tool/read.test.ts index 095c7bce2d25..7e1affa56ea6 100644 --- a/packages/opencode/test/tool/read.test.ts +++ b/packages/opencode/test/tool/read.test.ts @@ -5,6 +5,7 @@ import { Instance } from "../../src/project/instance" import { tmpdir } from "../fixture/fixture" import { PermissionNext } from "../../src/permission/next" import { Agent } from "../../src/agent/agent" +import { testModel } from "./fixtures/model" const FIXTURES_DIR = path.join(import.meta.dir, "fixtures") @@ -13,6 +14,7 @@ const ctx = { messageID: "", callID: "", agent: "build", + model: testModel, abort: AbortSignal.any([]), messages: [], metadata: () => {}, diff --git a/packages/opencode/test/tool/registry.test.ts b/packages/opencode/test/tool/registry.test.ts index 706a9e12caf9..a5eba09c6a42 100644 --- a/packages/opencode/test/tool/registry.test.ts +++ b/packages/opencode/test/tool/registry.test.ts @@ -88,7 +88,7 @@ describe("tool.registry", () => { JSON.stringify({ name: "custom-tools", dependencies: { - "@opencode-ai/plugin": "^0.0.0", + "@opencoder-ai/plugin": "^0.0.0", cowsay: "^1.6.0", }, }), diff --git a/packages/opencode/test/tool/skill.test.ts b/packages/opencode/test/tool/skill.test.ts index d5057ba9e7f4..643d068341ac 100644 --- a/packages/opencode/test/tool/skill.test.ts +++ b/packages/opencode/test/tool/skill.test.ts @@ -5,6 +5,7 @@ import type { PermissionNext } from "../../src/permission/next" import type { Tool } from "../../src/tool/tool" import { Instance } from "../../src/project/instance" import { SkillTool } from "../../src/tool/skill" +import { testModel } from "./fixtures/model" import { tmpdir } from "../fixture/fixture" const baseCtx: Omit = { @@ -15,6 +16,7 @@ const baseCtx: Omit = { abort: AbortSignal.any([]), messages: [], metadata: () => {}, + model: testModel, } describe("tool.skill", () => { diff --git a/packages/opencode/test/tool/webfetch.test.ts b/packages/opencode/test/tool/webfetch.test.ts index 10178af8fab7..6c85ef4e5398 100644 --- a/packages/opencode/test/tool/webfetch.test.ts +++ b/packages/opencode/test/tool/webfetch.test.ts @@ -10,6 +10,7 @@ const ctx = { messageID: "message", callID: "", agent: "build", + model: { providerID: "opencode", modelID: "test" }, abort: AbortSignal.any([]), messages: [], metadata: () => {}, diff --git a/packages/plugin/AGENTS.md b/packages/plugin/AGENTS.md new file mode 100644 index 000000000000..f34bd7f3ca58 --- /dev/null +++ b/packages/plugin/AGENTS.md @@ -0,0 +1,21 @@ +# Plugin System + +**Package:** `packages/plugin` +**Type:** Plugin architecture + +## Overview + +Core plugin system for extending OpenCode functionality. + +## Structure + +``` +packages/plugin/src/ +└── ... # Plugin infrastructure +``` + +## Key Patterns + +- Plugin interface definitions +- Plugin loading and management +- Extension points diff --git a/packages/plugin/package.json b/packages/plugin/package.json index c373083f5873..5f5c4b856b2c 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", - "name": "@opencode-ai/plugin", - "version": "1.1.65", + "name": "@opencoder-ai/plugin", + "version": "1.1.63", "type": "module", "license": "MIT", "scripts": { @@ -16,13 +16,13 @@ "dist" ], "dependencies": { - "@opencode-ai/sdk": "workspace:*", + "@opencoder-ai/sdk": "workspace:*", "zod": "catalog:" }, "devDependencies": { "@tsconfig/node22": "catalog:", "@types/node": "catalog:", - "typescript": "catalog:", - "@typescript/native-preview": "catalog:" + "@typescript/native-preview": "catalog:", + "typescript": "catalog:" } } diff --git a/packages/plugin/script/publish.ts b/packages/plugin/script/publish.ts index 647b56e5e2dd..b0ee7b17dbf9 100755 --- a/packages/plugin/script/publish.ts +++ b/packages/plugin/script/publish.ts @@ -1,5 +1,5 @@ #!/usr/bin/env bun -import { Script } from "@opencode-ai/script" +import { Script } from "@opencoder-ai/script" import { $ } from "bun" const dir = new URL("..", import.meta.url).pathname diff --git a/packages/plugin/src/index.ts b/packages/plugin/src/index.ts index bd4ba530498d..e08a366a954d 100644 --- a/packages/plugin/src/index.ts +++ b/packages/plugin/src/index.ts @@ -1,16 +1,16 @@ import type { Event, - createOpencodeClient, Project, Model, Provider, - Permission, + PermissionRequest, UserMessage, Message, Part, Auth, Config, -} from "@opencode-ai/sdk" + OpencodeClient, +} from "@opencoder-ai/sdk/v2" import type { BunShell } from "./shell" import { type ToolDefinition } from "./tool" @@ -24,7 +24,7 @@ export type ProviderContext = { } export type PluginInput = { - client: ReturnType + client: OpencodeClient project: Project directory: string worktree: string @@ -176,18 +176,21 @@ export interface Hooks { input: { sessionID: string; agent: string; model: Model; provider: ProviderContext; message: UserMessage }, output: { headers: Record }, ) => Promise - "permission.ask"?: (input: Permission, output: { status: "ask" | "deny" | "allow" }) => Promise + "permission.ask"?: ( + input: PermissionRequest, + output: { status: "ask" | "deny" | "allow" | "reject" }, + ) => Promise "command.execute.before"?: ( input: { command: string; sessionID: string; arguments: string }, output: { parts: Part[] }, ) => Promise "tool.execute.before"?: ( - input: { tool: string; sessionID: string; callID: string }, + input: { tool: string; sessionID: string; callID: string; agent?: string }, output: { args: any }, ) => Promise "shell.env"?: (input: { cwd: string }, output: { env: Record }) => Promise "tool.execute.after"?: ( - input: { tool: string; sessionID: string; callID: string; args: any }, + input: { tool: string; sessionID: string; callID: string; args: any; agent?: string }, output: { title: string output: string diff --git a/packages/plugin/src/tool.ts b/packages/plugin/src/tool.ts index 23aa512d9a43..a4b47cc619ca 100644 --- a/packages/plugin/src/tool.ts +++ b/packages/plugin/src/tool.ts @@ -1,9 +1,11 @@ import { z } from "zod" +import type { FilePart } from "@opencoder-ai/sdk" export type ToolContext = { sessionID: string messageID: string agent: string + model?: { providerID: string; modelID: string } /** * Current project directory for this session. * Prefer this over process.cwd() when resolving relative paths. @@ -26,10 +28,27 @@ type AskInput = { metadata: { [key: string]: any } } +/** + * Structured result for plugin tools. + * + * Return this instead of a plain string to provide rich metadata + * that integrates with streaming updates. + */ +export interface ToolResult { + /** Title displayed in the UI */ + title: string + /** Arbitrary metadata passed to tool.execute.after hooks */ + metadata: Record + /** The text output returned to the model */ + output: string + /** Optional file attachments to include with the result */ + attachments?: FilePart[] +} + export function tool(input: { description: string args: Args - execute(args: z.infer>, context: ToolContext): Promise + execute(args: z.infer>, context: ToolContext): Promise }) { return input } diff --git a/packages/script/AGENTS.md b/packages/script/AGENTS.md new file mode 100644 index 000000000000..38964d575ec5 --- /dev/null +++ b/packages/script/AGENTS.md @@ -0,0 +1,14 @@ +# Script Utilities + +**Package:** `packages/script` +**Type:** Build and utility scripts + +## Overview + +Shared build scripts and utilities used across the monorepo. + +## Key Patterns + +- Build script automation +- Code generation utilities +- CI/CD helper scripts diff --git a/packages/script/package.json b/packages/script/package.json index 45de3bcb99fb..f5fa940f73bd 100644 --- a/packages/script/package.json +++ b/packages/script/package.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/package", - "name": "@opencode-ai/script", + "name": "@opencoder-ai/script", "license": "MIT", "devDependencies": { "@types/bun": "catalog:" diff --git a/packages/script/src/index.ts b/packages/script/src/index.ts index a3f5e7a8e2a4..6de095c4139a 100644 --- a/packages/script/src/index.ts +++ b/packages/script/src/index.ts @@ -33,7 +33,7 @@ const IS_PREVIEW = CHANNEL !== "latest" const VERSION = await (async () => { if (env.OPENCODE_VERSION) return env.OPENCODE_VERSION if (IS_PREVIEW) return `0.0.0-${CHANNEL}-${new Date().toISOString().slice(0, 16).replace(/[-:T]/g, "")}` - const version = await fetch("https://registry.npmjs.org/opencode-ai/latest") + const version = await fetch("https://registry.npmjs.org/opencoder-ai/latest") .then((res) => { if (!res.ok) throw new Error(res.statusText) return res.json() diff --git a/packages/sdk/js/AGENTS.md b/packages/sdk/js/AGENTS.md new file mode 100644 index 000000000000..34323735acae --- /dev/null +++ b/packages/sdk/js/AGENTS.md @@ -0,0 +1,38 @@ +# JavaScript SDK + +**Package:** `packages/sdk/js` +**Type:** External SDK for programmatic access + +## Overview + +JavaScript/TypeScript SDK for external programmatic access to OpenCode. Generated from OpenAPI spec. + +## Commands + +```bash +# Regenerate SDK +./packages/sdk/js/script/build.ts + +# Test +cd packages/sdk/js && bun test +``` + +## Structure + +``` +packages/sdk/js/ +├── src/ +│ ├── index.ts # Public exports +│ ├── client.ts # Core client +│ ├── entrypoints/ # Specific entry points +│ └── __tests__/ # Vitest tests +├── script/ +│ └── build.ts # SDK generation +└── vitest.config.ts # Test configuration +``` + +## Testing + +- Framework: Vitest +- Config: `vitest.config.ts` +- Tests in `__tests__/` directory diff --git a/packages/sdk/js/example/example.ts b/packages/sdk/js/example/example.ts index 42838a82a7e6..5cffd53c9f40 100644 --- a/packages/sdk/js/example/example.ts +++ b/packages/sdk/js/example/example.ts @@ -1,4 +1,4 @@ -import { createOpencodeClient, createOpencodeServer } from "@opencode-ai/sdk" +import { createOpencodeClient, createOpencodeServer } from "@opencoder-ai/sdk" import { pathToFileURL } from "bun" const server = await createOpencodeServer() diff --git a/packages/sdk/js/package.json b/packages/sdk/js/package.json index ff8108b7be57..c40edab9eef7 100644 --- a/packages/sdk/js/package.json +++ b/packages/sdk/js/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package.json", - "name": "@opencode-ai/sdk", - "version": "1.1.65", + "name": "@opencoder-ai/sdk", + "version": "1.1.63", "type": "module", "license": "MIT", "scripts": { @@ -9,12 +9,30 @@ "build": "./script/build.ts" }, "exports": { - ".": "./src/index.ts", - "./client": "./src/client.ts", - "./server": "./src/server.ts", - "./v2": "./src/v2/index.ts", - "./v2/client": "./src/v2/client.ts", - "./v2/server": "./src/v2/server.ts" + ".": { + "types": "./dist/index.d.ts", + "default": "./src/index.ts" + }, + "./client": { + "types": "./dist/client.d.ts", + "default": "./src/client.ts" + }, + "./server": { + "types": "./dist/server.d.ts", + "default": "./src/server.ts" + }, + "./v2": { + "types": "./dist/v2/index.d.ts", + "default": "./src/v2/index.ts" + }, + "./v2/client": { + "types": "./dist/v2/client.d.ts", + "default": "./src/v2/client.ts" + }, + "./v2/server": { + "types": "./dist/v2/server.d.ts", + "default": "./src/v2/server.ts" + } }, "files": [ "dist" @@ -23,10 +41,9 @@ "@hey-api/openapi-ts": "0.90.10", "@tsconfig/node22": "catalog:", "@types/node": "catalog:", - "typescript": "catalog:", - "@typescript/native-preview": "catalog:" + "@typescript/native-preview": "catalog:", + "typescript": "catalog:" }, - "dependencies": {}, "publishConfig": { "directory": "dist" } diff --git a/packages/sdk/js/script/publish.ts b/packages/sdk/js/script/publish.ts index 46dd42b700d1..2fd21da9c3fb 100755 --- a/packages/sdk/js/script/publish.ts +++ b/packages/sdk/js/script/publish.ts @@ -1,6 +1,6 @@ #!/usr/bin/env bun -import { Script } from "@opencode-ai/script" +import { Script } from "@opencoder-ai/script" import { $ } from "bun" const dir = new URL("..", import.meta.url).pathname diff --git a/packages/sdk/js/src/v2/gen/sdk.gen.ts b/packages/sdk/js/src/v2/gen/sdk.gen.ts index af79c44a17a7..b745eaa7472d 100644 --- a/packages/sdk/js/src/v2/gen/sdk.gen.ts +++ b/packages/sdk/js/src/v2/gen/sdk.gen.ts @@ -132,8 +132,10 @@ import type { SessionStatusResponses, SessionSummarizeErrors, SessionSummarizeResponses, - SessionTodoErrors, - SessionTodoResponses, + SessionTodoListErrors, + SessionTodoListResponses, + SessionTodoUpdateErrors, + SessionTodoUpdateResponses, SessionUnrevertErrors, SessionUnrevertResponses, SessionUnshareErrors, @@ -142,6 +144,7 @@ import type { SessionUpdateResponses, SubtaskPartInput, TextPartInput, + Todo as Todo2, ToolIdsErrors, ToolIdsResponses, ToolListErrors, @@ -926,6 +929,75 @@ export class Experimental extends HeyApiClient { } } +export class Todo extends HeyApiClient { + /** + * Get session todos + * + * Retrieve the todo list associated with a specific session, showing tasks and action items. + */ + public list( + parameters: { + sessionID: string + directory?: string + }, + options?: Options, + ) { + const params = buildClientParams( + [parameters], + [ + { + args: [ + { in: "path", key: "sessionID" }, + { in: "query", key: "directory" }, + ], + }, + ], + ) + return (options?.client ?? this.client).get({ + url: "/session/{sessionID}/todo", + ...options, + ...params, + }) + } + + /** + * Update session todos + * + * Replace the todo list associated with a specific session. + */ + public update( + parameters: { + sessionID: string + directory?: string + todos?: Array + }, + options?: Options, + ) { + const params = buildClientParams( + [parameters], + [ + { + args: [ + { in: "path", key: "sessionID" }, + { in: "query", key: "directory" }, + { in: "body", key: "todos" }, + ], + }, + ], + ) + return (options?.client ?? this.client).put({ + url: "/session/{sessionID}/todo", + ...options, + ...params, + headers: { + "Content-Type": "application/json", + ...options?.headers, + ...params.headers, + }, + }) + } +} + export class Session extends HeyApiClient { /** * List sessions @@ -1152,36 +1224,6 @@ export class Session extends HeyApiClient { }) } - /** - * Get session todos - * - * Retrieve the todo list associated with a specific session, showing tasks and action items. - */ - public todo( - parameters: { - sessionID: string - directory?: string - }, - options?: Options, - ) { - const params = buildClientParams( - [parameters], - [ - { - args: [ - { in: "path", key: "sessionID" }, - { in: "query", key: "directory" }, - ], - }, - ], - ) - return (options?.client ?? this.client).get({ - url: "/session/{sessionID}/todo", - ...options, - ...params, - }) - } - /** * Initialize session * @@ -1771,6 +1813,11 @@ export class Session extends HeyApiClient { ...params, }) } + + private _todo?: Todo + get todo(): Todo { + return (this._todo ??= new Todo({ client: this.client })) + } } export class Part extends HeyApiClient { diff --git a/packages/sdk/js/src/v2/gen/types.gen.ts b/packages/sdk/js/src/v2/gen/types.gen.ts index b22b7e9af4e1..2a6ed307952e 100644 --- a/packages/sdk/js/src/v2/gen/types.gen.ts +++ b/packages/sdk/js/src/v2/gen/types.gen.ts @@ -3118,7 +3118,7 @@ export type SessionChildrenResponses = { export type SessionChildrenResponse = SessionChildrenResponses[keyof SessionChildrenResponses] -export type SessionTodoData = { +export type SessionTodoListData = { body?: never path: { /** @@ -3132,7 +3132,7 @@ export type SessionTodoData = { url: "/session/{sessionID}/todo" } -export type SessionTodoErrors = { +export type SessionTodoListErrors = { /** * Bad request */ @@ -3143,16 +3143,54 @@ export type SessionTodoErrors = { 404: NotFoundError } -export type SessionTodoError = SessionTodoErrors[keyof SessionTodoErrors] +export type SessionTodoListError = SessionTodoListErrors[keyof SessionTodoListErrors] -export type SessionTodoResponses = { +export type SessionTodoListResponses = { /** * Todo list */ 200: Array } -export type SessionTodoResponse = SessionTodoResponses[keyof SessionTodoResponses] +export type SessionTodoListResponse = SessionTodoListResponses[keyof SessionTodoListResponses] + +export type SessionTodoUpdateData = { + body?: { + todos: Array + } + path: { + /** + * Session ID + */ + sessionID: string + } + query?: { + directory?: string + } + url: "/session/{sessionID}/todo" +} + +export type SessionTodoUpdateErrors = { + /** + * Bad request + */ + 400: BadRequestError + /** + * Not found + */ + 404: NotFoundError +} + +export type SessionTodoUpdateError = SessionTodoUpdateErrors[keyof SessionTodoUpdateErrors] + +export type SessionTodoUpdateResponses = { + /** + * Updated todo list + */ + 200: Array +} + +export type SessionTodoUpdateResponse = SessionTodoUpdateResponses[keyof SessionTodoUpdateResponses] export type SessionInitData = { body?: { diff --git a/packages/sdk/openapi.json b/packages/sdk/openapi.json index 70596431bb62..3e6ef2672f6c 100644 --- a/packages/sdk/openapi.json +++ b/packages/sdk/openapi.json @@ -36,7 +36,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.global.health({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.global.health({\n ...\n})" } ] } @@ -61,7 +61,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.global.event({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.global.event({\n ...\n})" } ] } @@ -86,7 +86,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.global.config.get({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.global.config.get({\n ...\n})" } ] }, @@ -128,7 +128,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.global.config.update({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.global.config.update({\n ...\n})" } ] } @@ -153,7 +153,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.global.dispose({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.global.dispose({\n ...\n})" } ] } @@ -207,7 +207,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.auth.set({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.auth.set({\n ...\n})" } ] }, @@ -250,7 +250,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.auth.remove({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.auth.remove({\n ...\n})" } ] } @@ -287,7 +287,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.project.list({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.project.list({\n ...\n})" } ] } @@ -321,7 +321,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.project.current({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.project.current({\n ...\n})" } ] } @@ -420,7 +420,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.project.update({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.project.update({\n ...\n})" } ] } @@ -457,7 +457,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.pty.list({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.pty.list({\n ...\n})" } ] }, @@ -534,7 +534,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.pty.create({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.pty.create({\n ...\n})" } ] } @@ -586,7 +586,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.pty.get({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.pty.get({\n ...\n})" } ] }, @@ -662,7 +662,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.pty.update({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.pty.update({\n ...\n})" } ] }, @@ -712,7 +712,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.pty.remove({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.pty.remove({\n ...\n})" } ] } @@ -764,7 +764,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.pty.connect({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.pty.connect({\n ...\n})" } ] } @@ -798,7 +798,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.config.get({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.config.get({\n ...\n})" } ] }, @@ -849,7 +849,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.config.update({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.config.update({\n ...\n})" } ] } @@ -901,7 +901,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.config.providers({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.config.providers({\n ...\n})" } ] } @@ -945,7 +945,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tool.ids({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tool.ids({\n ...\n})" } ] } @@ -1005,7 +1005,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tool.list({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tool.list({\n ...\n})" } ] } @@ -1058,7 +1058,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.worktree.create({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.worktree.create({\n ...\n})" } ] }, @@ -1093,7 +1093,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.worktree.list({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.worktree.list({\n ...\n})" } ] }, @@ -1144,7 +1144,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.worktree.remove({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.worktree.remove({\n ...\n})" } ] } @@ -1197,7 +1197,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.worktree.reset({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.worktree.reset({\n ...\n})" } ] } @@ -1237,7 +1237,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.experimental.resource.list({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.experimental.resource.list({\n ...\n})" } ] } @@ -1307,7 +1307,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.list({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.list({\n ...\n})" } ] }, @@ -1370,7 +1370,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.create({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.create({\n ...\n})" } ] } @@ -1420,7 +1420,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.status({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.status({\n ...\n})" } ] } @@ -1484,7 +1484,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.get({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.get({\n ...\n})" } ] }, @@ -1545,7 +1545,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.delete({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.delete({\n ...\n})" } ] }, @@ -1627,7 +1627,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.update({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.update({\n ...\n})" } ] } @@ -1694,14 +1694,14 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.children({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.children({\n ...\n})" } ] } }, "/session/{sessionID}/todo": { "get": { - "operationId": "session.todo", + "operationId": "session.todo.list", "parameters": [ { "in": "query", @@ -1760,7 +1760,89 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.todo({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.todo.list({\n ...\n})" + } + ] + }, + "put": { + "operationId": "session.todo.update", + "parameters": [ + { + "in": "query", + "name": "directory", + "schema": { + "type": "string" + } + }, + { + "in": "path", + "name": "sessionID", + "schema": { + "type": "string" + }, + "required": true, + "description": "Session ID" + } + ], + "summary": "Update session todos", + "description": "Replace the todo list associated with a specific session.", + "responses": { + "200": { + "description": "Updated todo list", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Todo" + } + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BadRequestError" + } + } + } + }, + "404": { + "description": "Not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFoundError" + } + } + } + } + }, + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "todos": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Todo" + } + } + }, + "required": ["todos"] + } + } + } + }, + "x-codeSamples": [ + { + "lang": "js", + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.todo.update({\n ...\n})" } ] } @@ -1845,7 +1927,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.init({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.init({\n ...\n})" } ] } @@ -1903,7 +1985,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.fork({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.fork({\n ...\n})" } ] } @@ -1965,7 +2047,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.abort({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.abort({\n ...\n})" } ] } @@ -2027,7 +2109,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.share({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.share({\n ...\n})" } ] }, @@ -2088,7 +2170,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.unshare({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.unshare({\n ...\n})" } ] } @@ -2142,7 +2224,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.diff({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.diff({\n ...\n})" } ] } @@ -2227,7 +2309,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.summarize({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.summarize({\n ...\n})" } ] } @@ -2312,7 +2394,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.messages({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.messages({\n ...\n})" } ] }, @@ -2432,7 +2514,7 @@ "parts": { "type": "array", "items": { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/TextPartInput" }, @@ -2457,7 +2539,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.prompt({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.prompt({\n ...\n})" } ] } @@ -2541,7 +2623,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.message({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.message({\n ...\n})" } ] } @@ -2621,7 +2703,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.part.delete({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.part.delete({\n ...\n})" } ] }, @@ -2708,7 +2790,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.part.update({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.part.update({\n ...\n})" } ] } @@ -2811,7 +2893,7 @@ "parts": { "type": "array", "items": { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/TextPartInput" }, @@ -2836,7 +2918,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.prompt_async({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.prompt_async({\n ...\n})" } ] } @@ -2936,7 +3018,7 @@ "parts": { "type": "array", "items": { - "anyOf": [ + "oneOf": [ { "type": "object", "properties": { @@ -2974,7 +3056,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.command({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.command({\n ...\n})" } ] } @@ -3067,7 +3149,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.shell({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.shell({\n ...\n})" } ] } @@ -3149,7 +3231,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.revert({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.revert({\n ...\n})" } ] } @@ -3211,7 +3293,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.unrevert({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.session.unrevert({\n ...\n})" } ] } @@ -3298,7 +3380,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.permission.respond({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.permission.respond({\n ...\n})" } ] } @@ -3379,7 +3461,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.permission.reply({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.permission.reply({\n ...\n})" } ] } @@ -3416,7 +3498,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.permission.list({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.permission.list({\n ...\n})" } ] } @@ -3453,7 +3535,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.question.list({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.question.list({\n ...\n})" } ] } @@ -3519,11 +3601,11 @@ "type": "object", "properties": { "answers": { - "description": "User answers in order of questions (each answer is an array of selected labels)", "type": "array", "items": { "$ref": "#/components/schemas/QuestionAnswer" - } + }, + "description": "User answers in order of questions (each answer is an array of selected labels)" } }, "required": ["answers"] @@ -3534,7 +3616,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.question.reply({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.question.reply({\n ...\n})" } ] } @@ -3596,7 +3678,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.question.reject({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.question.reject({\n ...\n})" } ] } @@ -3858,7 +3940,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.provider.list({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.provider.list({\n ...\n})" } ] } @@ -3901,7 +3983,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.provider.auth({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.provider.auth({\n ...\n})" } ] } @@ -3958,8 +4040,8 @@ "type": "object", "properties": { "method": { - "description": "Auth method index", - "type": "number" + "type": "number", + "description": "Auth method index" } }, "required": ["method"] @@ -3970,7 +4052,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.provider.oauth.authorize({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.provider.oauth.authorize({\n ...\n})" } ] } @@ -4027,8 +4109,8 @@ "type": "object", "properties": { "method": { - "description": "Auth method index", - "type": "number" + "type": "number", + "description": "Auth method index" }, "code": { "description": "OAuth authorization code", @@ -4043,7 +4125,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.provider.oauth.callback({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.provider.oauth.callback({\n ...\n})" } ] } @@ -4139,7 +4221,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.find.text({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.find.text({\n ...\n})" } ] } @@ -4209,7 +4291,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.find.files({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.find.files({\n ...\n})" } ] } @@ -4254,7 +4336,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.find.symbols({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.find.symbols({\n ...\n})" } ] } @@ -4299,7 +4381,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.file.list({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.file.list({\n ...\n})" } ] } @@ -4341,7 +4423,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.file.read({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.file.read({\n ...\n})" } ] } @@ -4378,7 +4460,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.file.status({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.file.status({\n ...\n})" } ] } @@ -4418,7 +4500,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.status({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.status({\n ...\n})" } ] }, @@ -4473,7 +4555,7 @@ "type": "string" }, "config": { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/McpLocalConfig" }, @@ -4491,7 +4573,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.add({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.add({\n ...\n})" } ] } @@ -4527,8 +4609,8 @@ "type": "object", "properties": { "authorizationUrl": { - "description": "URL to open in browser for authorization", - "type": "string" + "type": "string", + "description": "URL to open in browser for authorization" } }, "required": ["authorizationUrl"] @@ -4560,7 +4642,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.auth.start({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.auth.start({\n ...\n})" } ] }, @@ -4617,7 +4699,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.auth.remove({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.auth.remove({\n ...\n})" } ] } @@ -4683,8 +4765,8 @@ "type": "object", "properties": { "code": { - "description": "Authorization code from OAuth callback", - "type": "string" + "type": "string", + "description": "Authorization code from OAuth callback" } }, "required": ["code"] @@ -4695,7 +4777,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.auth.callback({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.auth.callback({\n ...\n})" } ] } @@ -4757,7 +4839,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.auth.authenticate({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.auth.authenticate({\n ...\n})" } ] } @@ -4798,7 +4880,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.connect({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.connect({\n ...\n})" } ] } @@ -4839,7 +4921,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.disconnect({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.mcp.disconnect({\n ...\n})" } ] } @@ -4898,7 +4980,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.appendPrompt({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.appendPrompt({\n ...\n})" } ] } @@ -4932,7 +5014,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.openHelp({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.openHelp({\n ...\n})" } ] } @@ -4966,7 +5048,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.openSessions({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.openSessions({\n ...\n})" } ] } @@ -5000,7 +5082,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.openThemes({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.openThemes({\n ...\n})" } ] } @@ -5034,7 +5116,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.openModels({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.openModels({\n ...\n})" } ] } @@ -5068,7 +5150,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.submitPrompt({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.submitPrompt({\n ...\n})" } ] } @@ -5102,7 +5184,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.clearPrompt({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.clearPrompt({\n ...\n})" } ] } @@ -5161,7 +5243,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.executeCommand({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.executeCommand({\n ...\n})" } ] } @@ -5222,7 +5304,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.showToast({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.showToast({\n ...\n})" } ] } @@ -5288,7 +5370,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.publish({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.publish({\n ...\n})" } ] } @@ -5346,9 +5428,9 @@ "type": "object", "properties": { "sessionID": { - "description": "Session ID to navigate to", "type": "string", - "pattern": "^ses" + "pattern": "^ses", + "description": "Session ID to navigate to" } }, "required": ["sessionID"] @@ -5359,7 +5441,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.selectSession({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.selectSession({\n ...\n})" } ] } @@ -5400,7 +5482,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.control.next({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.control.next({\n ...\n})" } ] } @@ -5441,7 +5523,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.control.response({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.tui.control.response({\n ...\n})" } ] } @@ -5475,7 +5557,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.instance.dispose({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.instance.dispose({\n ...\n})" } ] } @@ -5509,7 +5591,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.path.get({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.path.get({\n ...\n})" } ] } @@ -5543,7 +5625,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.vcs.get({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.vcs.get({\n ...\n})" } ] } @@ -5580,7 +5662,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.command.list({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.command.list({\n ...\n})" } ] } @@ -5628,17 +5710,17 @@ "type": "object", "properties": { "service": { - "description": "Service name for the log entry", - "type": "string" + "type": "string", + "description": "Service name for the log entry" }, "level": { - "description": "Log level", "type": "string", - "enum": ["debug", "info", "error", "warn"] + "enum": ["debug", "info", "error", "warn"], + "description": "Log level" }, "message": { - "description": "Log message", - "type": "string" + "type": "string", + "description": "Log message" }, "extra": { "description": "Additional metadata for the log entry", @@ -5657,7 +5739,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.app.log({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.app.log({\n ...\n})" } ] } @@ -5694,7 +5776,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.app.agents({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.app.agents({\n ...\n})" } ] } @@ -5746,7 +5828,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.app.skills({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.app.skills({\n ...\n})" } ] } @@ -5783,7 +5865,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.lsp.status({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.lsp.status({\n ...\n})" } ] } @@ -5820,7 +5902,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.formatter.status({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.formatter.status({\n ...\n})" } ] } @@ -5854,7 +5936,7 @@ "x-codeSamples": [ { "lang": "js", - "source": "import { createOpencodeClient } from \"@opencode-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.event.subscribe({\n ...\n})" + "source": "import { createOpencodeClient } from \"@opencoder-ai/sdk\n\nconst client = createOpencodeClient()\nawait client.event.subscribe({\n ...\n})" } ] } @@ -6415,7 +6497,7 @@ "required": ["created"] }, "error": { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/ProviderAuthError" }, @@ -6526,7 +6608,7 @@ ] }, "Message": { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/UserMessage" }, @@ -6819,7 +6901,7 @@ "required": ["text", "type", "clientName", "uri"] }, "FilePartSource": { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/FileSource" }, @@ -7009,7 +7091,7 @@ "required": ["status", "input", "error", "time"] }, "ToolState": { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/ToolStatePending" }, @@ -7287,7 +7369,7 @@ "required": ["id", "sessionID", "messageID", "type", "auto"] }, "Part": { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/TextPart" }, @@ -7548,12 +7630,12 @@ "type": "object", "properties": { "label": { - "description": "Display text (1-5 words, concise)", - "type": "string" + "type": "string", + "description": "Display text (1-5 words, concise)" }, "description": { - "description": "Explanation of choice", - "type": "string" + "type": "string", + "description": "Explanation of choice" } }, "required": ["label", "description"] @@ -7562,19 +7644,19 @@ "type": "object", "properties": { "question": { - "description": "Complete question", - "type": "string" + "type": "string", + "description": "Complete question" }, "header": { - "description": "Very short label (max 30 chars)", - "type": "string" + "type": "string", + "description": "Very short label (max 30 chars)" }, "options": { - "description": "Available choices", "type": "array", "items": { "$ref": "#/components/schemas/QuestionOption" - } + }, + "description": "Available choices" }, "multiple": { "description": "Allow selecting multiple choices", @@ -7599,11 +7681,11 @@ "pattern": "^ses.*" }, "questions": { - "description": "Questions to ask", "type": "array", "items": { "$ref": "#/components/schemas/QuestionInfo" - } + }, + "description": "Questions to ask" }, "tool": { "type": "object", @@ -7747,20 +7829,20 @@ "type": "object", "properties": { "content": { - "description": "Brief description of the task", - "type": "string" + "type": "string", + "description": "Brief description of the task" }, "status": { - "description": "Current status of the task: pending, in_progress, completed, cancelled", - "type": "string" + "type": "string", + "description": "Current status of the task: pending, in_progress, completed, cancelled" }, "priority": { - "description": "Priority level of the task: high, medium, low", - "type": "string" + "type": "string", + "description": "Priority level of the task: high, medium, low" }, "id": { - "description": "Unique identifier for the todo item", - "type": "string" + "type": "string", + "description": "Unique identifier for the todo item" } }, "required": ["content", "status", "priority", "id"] @@ -7895,9 +7977,9 @@ "type": "object", "properties": { "sessionID": { - "description": "Session ID to navigate to", "type": "string", - "pattern": "^ses" + "pattern": "^ses", + "description": "Session ID to navigate to" } }, "required": ["sessionID"] @@ -8195,7 +8277,7 @@ "type": "string" }, "error": { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/ProviderAuthError" }, @@ -8397,7 +8479,7 @@ "required": ["type", "properties"] }, "Event": { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/Event.installation.updated" }, @@ -8543,473 +8625,473 @@ "type": "object", "properties": { "leader": { - "description": "Leader key for keybind combinations", "default": "ctrl+x", + "description": "Leader key for keybind combinations", "type": "string" }, "app_exit": { - "description": "Exit the application", "default": "ctrl+c,ctrl+d,q", + "description": "Exit the application", "type": "string" }, "editor_open": { - "description": "Open external editor", "default": "e", + "description": "Open external editor", "type": "string" }, "theme_list": { - "description": "List available themes", "default": "t", + "description": "List available themes", "type": "string" }, "sidebar_toggle": { - "description": "Toggle sidebar", "default": "b", + "description": "Toggle sidebar", "type": "string" }, "scrollbar_toggle": { - "description": "Toggle session scrollbar", "default": "none", + "description": "Toggle session scrollbar", "type": "string" }, "username_toggle": { - "description": "Toggle username visibility", "default": "none", + "description": "Toggle username visibility", "type": "string" }, "status_view": { - "description": "View status", "default": "s", + "description": "View status", "type": "string" }, "session_export": { - "description": "Export session to editor", "default": "x", + "description": "Export session to editor", "type": "string" }, "session_new": { - "description": "Create a new session", "default": "n", + "description": "Create a new session", "type": "string" }, "session_list": { - "description": "List all sessions", "default": "l", + "description": "List all sessions", "type": "string" }, "session_timeline": { - "description": "Show session timeline", "default": "g", + "description": "Show session timeline", "type": "string" }, "session_fork": { - "description": "Fork session from message", "default": "none", + "description": "Fork session from message", "type": "string" }, "session_rename": { - "description": "Rename session", "default": "ctrl+r", + "description": "Rename session", "type": "string" }, "session_delete": { - "description": "Delete session", "default": "ctrl+d", + "description": "Delete session", "type": "string" }, "stash_delete": { - "description": "Delete stash entry", "default": "ctrl+d", + "description": "Delete stash entry", "type": "string" }, "model_provider_list": { - "description": "Open provider list from model dialog", "default": "ctrl+a", + "description": "Open provider list from model dialog", "type": "string" }, "model_favorite_toggle": { - "description": "Toggle model favorite status", "default": "ctrl+f", + "description": "Toggle model favorite status", "type": "string" }, "session_share": { - "description": "Share current session", "default": "none", + "description": "Share current session", "type": "string" }, "session_unshare": { - "description": "Unshare current session", "default": "none", + "description": "Unshare current session", "type": "string" }, "session_interrupt": { - "description": "Interrupt current session", "default": "escape", + "description": "Interrupt current session", "type": "string" }, "session_compact": { - "description": "Compact the session", "default": "c", + "description": "Compact the session", "type": "string" }, "messages_page_up": { - "description": "Scroll messages up by one page", "default": "pageup,ctrl+alt+b", + "description": "Scroll messages up by one page", "type": "string" }, "messages_page_down": { - "description": "Scroll messages down by one page", "default": "pagedown,ctrl+alt+f", + "description": "Scroll messages down by one page", "type": "string" }, "messages_line_up": { - "description": "Scroll messages up by one line", "default": "ctrl+alt+y", + "description": "Scroll messages up by one line", "type": "string" }, "messages_line_down": { - "description": "Scroll messages down by one line", "default": "ctrl+alt+e", + "description": "Scroll messages down by one line", "type": "string" }, "messages_half_page_up": { - "description": "Scroll messages up by half page", "default": "ctrl+alt+u", + "description": "Scroll messages up by half page", "type": "string" }, "messages_half_page_down": { - "description": "Scroll messages down by half page", "default": "ctrl+alt+d", + "description": "Scroll messages down by half page", "type": "string" }, "messages_first": { - "description": "Navigate to first message", "default": "ctrl+g,home", + "description": "Navigate to first message", "type": "string" }, "messages_last": { - "description": "Navigate to last message", "default": "ctrl+alt+g,end", + "description": "Navigate to last message", "type": "string" }, "messages_next": { - "description": "Navigate to next message", "default": "none", + "description": "Navigate to next message", "type": "string" }, "messages_previous": { - "description": "Navigate to previous message", "default": "none", + "description": "Navigate to previous message", "type": "string" }, "messages_last_user": { - "description": "Navigate to last user message", "default": "none", + "description": "Navigate to last user message", "type": "string" }, "messages_copy": { - "description": "Copy message", "default": "y", + "description": "Copy message", "type": "string" }, "messages_undo": { - "description": "Undo message", "default": "u", + "description": "Undo message", "type": "string" }, "messages_redo": { - "description": "Redo message", "default": "r", + "description": "Redo message", "type": "string" }, "messages_toggle_conceal": { - "description": "Toggle code block concealment in messages", "default": "h", + "description": "Toggle code block concealment in messages", "type": "string" }, "tool_details": { - "description": "Toggle tool details visibility", "default": "none", + "description": "Toggle tool details visibility", "type": "string" }, "model_list": { - "description": "List available models", "default": "m", + "description": "List available models", "type": "string" }, "model_cycle_recent": { - "description": "Next recently used model", "default": "f2", + "description": "Next recently used model", "type": "string" }, "model_cycle_recent_reverse": { - "description": "Previous recently used model", "default": "shift+f2", + "description": "Previous recently used model", "type": "string" }, "model_cycle_favorite": { - "description": "Next favorite model", "default": "none", + "description": "Next favorite model", "type": "string" }, "model_cycle_favorite_reverse": { - "description": "Previous favorite model", "default": "none", + "description": "Previous favorite model", "type": "string" }, "command_list": { - "description": "List available commands", "default": "ctrl+p", + "description": "List available commands", "type": "string" }, "agent_list": { - "description": "List agents", "default": "a", + "description": "List agents", "type": "string" }, "agent_cycle": { - "description": "Next agent", "default": "tab", + "description": "Next agent", "type": "string" }, "agent_cycle_reverse": { - "description": "Previous agent", "default": "shift+tab", + "description": "Previous agent", "type": "string" }, "variant_cycle": { - "description": "Cycle model variants", "default": "ctrl+t", + "description": "Cycle model variants", "type": "string" }, "input_clear": { - "description": "Clear input field", "default": "ctrl+c", + "description": "Clear input field", "type": "string" }, "input_paste": { - "description": "Paste from clipboard", "default": "ctrl+v", + "description": "Paste from clipboard", "type": "string" }, "input_submit": { - "description": "Submit input", "default": "return", + "description": "Submit input", "type": "string" }, "input_newline": { - "description": "Insert newline in input", "default": "shift+return,ctrl+return,alt+return,ctrl+j", + "description": "Insert newline in input", "type": "string" }, "input_move_left": { - "description": "Move cursor left in input", "default": "left,ctrl+b", + "description": "Move cursor left in input", "type": "string" }, "input_move_right": { - "description": "Move cursor right in input", "default": "right,ctrl+f", + "description": "Move cursor right in input", "type": "string" }, "input_move_up": { - "description": "Move cursor up in input", "default": "up", + "description": "Move cursor up in input", "type": "string" }, "input_move_down": { - "description": "Move cursor down in input", "default": "down", + "description": "Move cursor down in input", "type": "string" }, "input_select_left": { - "description": "Select left in input", "default": "shift+left", + "description": "Select left in input", "type": "string" }, "input_select_right": { - "description": "Select right in input", "default": "shift+right", + "description": "Select right in input", "type": "string" }, "input_select_up": { - "description": "Select up in input", "default": "shift+up", + "description": "Select up in input", "type": "string" }, "input_select_down": { - "description": "Select down in input", "default": "shift+down", + "description": "Select down in input", "type": "string" }, "input_line_home": { - "description": "Move to start of line in input", "default": "ctrl+a", + "description": "Move to start of line in input", "type": "string" }, "input_line_end": { - "description": "Move to end of line in input", "default": "ctrl+e", + "description": "Move to end of line in input", "type": "string" }, "input_select_line_home": { - "description": "Select to start of line in input", "default": "ctrl+shift+a", + "description": "Select to start of line in input", "type": "string" }, "input_select_line_end": { - "description": "Select to end of line in input", "default": "ctrl+shift+e", + "description": "Select to end of line in input", "type": "string" }, "input_visual_line_home": { - "description": "Move to start of visual line in input", "default": "alt+a", + "description": "Move to start of visual line in input", "type": "string" }, "input_visual_line_end": { - "description": "Move to end of visual line in input", "default": "alt+e", + "description": "Move to end of visual line in input", "type": "string" }, "input_select_visual_line_home": { - "description": "Select to start of visual line in input", "default": "alt+shift+a", + "description": "Select to start of visual line in input", "type": "string" }, "input_select_visual_line_end": { - "description": "Select to end of visual line in input", "default": "alt+shift+e", + "description": "Select to end of visual line in input", "type": "string" }, "input_buffer_home": { - "description": "Move to start of buffer in input", "default": "home", + "description": "Move to start of buffer in input", "type": "string" }, "input_buffer_end": { - "description": "Move to end of buffer in input", "default": "end", + "description": "Move to end of buffer in input", "type": "string" }, "input_select_buffer_home": { - "description": "Select to start of buffer in input", "default": "shift+home", + "description": "Select to start of buffer in input", "type": "string" }, "input_select_buffer_end": { - "description": "Select to end of buffer in input", "default": "shift+end", + "description": "Select to end of buffer in input", "type": "string" }, "input_delete_line": { - "description": "Delete line in input", "default": "ctrl+shift+d", + "description": "Delete line in input", "type": "string" }, "input_delete_to_line_end": { - "description": "Delete to end of line in input", "default": "ctrl+k", + "description": "Delete to end of line in input", "type": "string" }, "input_delete_to_line_start": { - "description": "Delete to start of line in input", "default": "ctrl+u", + "description": "Delete to start of line in input", "type": "string" }, "input_backspace": { - "description": "Backspace in input", "default": "backspace,shift+backspace", + "description": "Backspace in input", "type": "string" }, "input_delete": { - "description": "Delete character in input", "default": "ctrl+d,delete,shift+delete", + "description": "Delete character in input", "type": "string" }, "input_undo": { - "description": "Undo in input", "default": "ctrl+-,super+z", + "description": "Undo in input", "type": "string" }, "input_redo": { - "description": "Redo in input", "default": "ctrl+.,super+shift+z", + "description": "Redo in input", "type": "string" }, "input_word_forward": { - "description": "Move word forward in input", "default": "alt+f,alt+right,ctrl+right", + "description": "Move word forward in input", "type": "string" }, "input_word_backward": { - "description": "Move word backward in input", "default": "alt+b,alt+left,ctrl+left", + "description": "Move word backward in input", "type": "string" }, "input_select_word_forward": { - "description": "Select word forward in input", "default": "alt+shift+f,alt+shift+right", + "description": "Select word forward in input", "type": "string" }, "input_select_word_backward": { - "description": "Select word backward in input", "default": "alt+shift+b,alt+shift+left", + "description": "Select word backward in input", "type": "string" }, "input_delete_word_forward": { - "description": "Delete word forward in input", "default": "alt+d,alt+delete,ctrl+delete", + "description": "Delete word forward in input", "type": "string" }, "input_delete_word_backward": { - "description": "Delete word backward in input", "default": "ctrl+w,ctrl+backspace,alt+backspace", + "description": "Delete word backward in input", "type": "string" }, "history_previous": { - "description": "Previous history item", "default": "up", + "description": "Previous history item", "type": "string" }, "history_next": { - "description": "Next history item", "default": "down", + "description": "Next history item", "type": "string" }, "session_child_cycle": { - "description": "Next child session", "default": "right", + "description": "Next child session", "type": "string" }, "session_child_cycle_reverse": { - "description": "Previous child session", "default": "left", + "description": "Previous child session", "type": "string" }, "session_parent": { - "description": "Go to parent session", "default": "up", + "description": "Go to parent session", "type": "string" }, "terminal_suspend": { - "description": "Suspend terminal", "default": "ctrl+z", + "description": "Suspend terminal", "type": "string" }, "terminal_title_toggle": { - "description": "Toggle terminal title", "default": "none", + "description": "Toggle terminal title", "type": "string" }, "tips_toggle": { - "description": "Toggle tips on home screen", "default": "h", + "description": "Toggle tips on home screen", "type": "string" }, "display_thinking": { - "description": "Toggle thinking blocks visibility", "default": "none", + "description": "Toggle thinking blocks visibility", "type": "string" } }, @@ -9225,6 +9307,18 @@ }, "permission": { "$ref": "#/components/schemas/PermissionConfig" + }, + "reminder": { + "description": "Custom reminder text injected into user messages for this agent. Set to false to disable the default reminder.", + "anyOf": [ + { + "type": "string" + }, + { + "type": "boolean", + "const": false + } + ] } }, "additionalProperties": {} @@ -9459,15 +9553,15 @@ "description": "Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout.", "anyOf": [ { - "description": "Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout.", "type": "integer", "exclusiveMinimum": 0, - "maximum": 9007199254740991 + "maximum": 9007199254740991, + "description": "Timeout in milliseconds for requests to this provider. Default is 300000 (5 minutes). Set to false to disable timeout." }, { - "description": "Disable timeout for this provider entirely.", "type": "boolean", - "const": false + "const": false, + "description": "Disable timeout for this provider entirely." } ] } @@ -9481,16 +9575,16 @@ "type": "object", "properties": { "type": { - "description": "Type of MCP server connection", "type": "string", - "const": "local" + "const": "local", + "description": "Type of MCP server connection" }, "command": { - "description": "Command and arguments to run the MCP server", "type": "array", "items": { "type": "string" - } + }, + "description": "Command and arguments to run the MCP server" }, "environment": { "description": "Environment variables to set when running the MCP server", @@ -9538,13 +9632,13 @@ "type": "object", "properties": { "type": { - "description": "Type of MCP server connection", "type": "string", - "const": "remote" + "const": "remote", + "description": "Type of MCP server connection" }, "url": { - "description": "URL of the remote MCP server", - "type": "string" + "type": "string", + "description": "URL of the remote MCP server" }, "enabled": { "description": "Enable or disable the MCP server on startup", @@ -9618,8 +9712,8 @@ "type": "object", "properties": { "enabled": { - "description": "Enable scroll acceleration", - "type": "boolean" + "type": "boolean", + "description": "Enable scroll acceleration" } }, "required": ["enabled"] @@ -9738,12 +9832,12 @@ } }, "model": { - "description": "Model to use in the format of provider/model, eg anthropic/claude-2", - "type": "string" + "type": "string", + "description": "Model to use in the format of provider/model, eg anthropic/claude-2" }, "small_model": { - "description": "Small model to use for tasks like title generation in the format of provider/model", - "type": "string" + "type": "string", + "description": "Small model to use for tasks like title generation in the format of provider/model" }, "default_agent": { "description": "Default agent to use when none is specified. Must be a primary agent. Falls back to 'build' if not set or if the specified agent is invalid.", @@ -9817,7 +9911,7 @@ "additionalProperties": { "anyOf": [ { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/McpLocalConfig" }, @@ -10109,7 +10203,7 @@ "required": ["type", "key", "token"] }, "Auth": { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/OAuth" }, @@ -10873,7 +10967,7 @@ "required": ["status", "error"] }, "MCPStatus": { - "anyOf": [ + "oneOf": [ { "$ref": "#/components/schemas/MCPStatusConnected" }, @@ -11022,6 +11116,17 @@ "type": "integer", "exclusiveMinimum": 0, "maximum": 9007199254740991 + }, + "reminder": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "boolean", + "const": false + } + ] } }, "required": ["name", "mode", "permission", "options"] diff --git a/packages/slack/AGENTS.md b/packages/slack/AGENTS.md new file mode 100644 index 000000000000..77e3c6dc971e --- /dev/null +++ b/packages/slack/AGENTS.md @@ -0,0 +1,21 @@ +# Slack Integration + +**Package:** `packages/slack` +**Type:** Slack integration + +## Overview + +Slack integration for OpenCode, enabling AI-assisted interactions within Slack. + +## Commands + +```bash +# Build +bun build +``` + +## Key Patterns + +- Slack API integration +- Bot functionality +- Event handling diff --git a/packages/slack/README.md b/packages/slack/README.md index a12978d8a6ea..9e7a26612ffe 100644 --- a/packages/slack/README.md +++ b/packages/slack/README.md @@ -1,4 +1,4 @@ -# @opencode-ai/slack +# @opencoder-ai/slack Slack bot integration for opencode that creates threaded conversations. diff --git a/packages/slack/package.json b/packages/slack/package.json index 78a5702228f6..40b09844811d 100644 --- a/packages/slack/package.json +++ b/packages/slack/package.json @@ -1,6 +1,6 @@ { - "name": "@opencode-ai/slack", - "version": "1.1.65", + "name": "@opencoder-ai/slack", + "version": "1.1.63", "type": "module", "license": "MIT", "scripts": { @@ -8,12 +8,12 @@ "typecheck": "tsgo --noEmit" }, "dependencies": { - "@opencode-ai/sdk": "workspace:*", + "@opencoder-ai/sdk": "workspace:*", "@slack/bolt": "^3.17.1" }, "devDependencies": { "@types/node": "catalog:", - "typescript": "catalog:", - "@typescript/native-preview": "catalog:" + "@typescript/native-preview": "catalog:", + "typescript": "catalog:" } } diff --git a/packages/slack/src/index.ts b/packages/slack/src/index.ts index d07e3dfb4161..4f63ee2cc498 100644 --- a/packages/slack/src/index.ts +++ b/packages/slack/src/index.ts @@ -1,5 +1,5 @@ import { App } from "@slack/bolt" -import { createOpencode, type ToolPart } from "@opencode-ai/sdk" +import { createOpencode, type ToolPart } from "@opencoder-ai/sdk" const app = new App({ token: process.env.SLACK_BOT_TOKEN, diff --git a/packages/ui/AGENTS.md b/packages/ui/AGENTS.md new file mode 100644 index 000000000000..2efde6e829b5 --- /dev/null +++ b/packages/ui/AGENTS.md @@ -0,0 +1,37 @@ +# Shared UI Components + +**Package:** `packages/ui` +**Type:** Component library + +## Overview + +Shared UI components used across the application. Built with SolidJS, TailwindCSS styling. + +## Structure + +``` +packages/ui/src/ +├── components/ # UI components +│ ├── file-icons/ +│ └── provider-icons/ +├── context/ # Context providers +├── hooks/ # Shared hooks +├── i18n/ # Internationalization +├── styles/ # Styles including Tailwind +├── theme/ # Theme definitions +└── assets/ # Icons, images, fonts +``` + +## Key Patterns + +- Components use TailwindCSS via `@tailwindcss/vite` +- Icons in `assets/icons/` +- Themes in `theme/themes/` +- I18n support via `i18n/` directory + +## Commands + +```bash +# Build +bun build +``` diff --git a/packages/ui/package.json b/packages/ui/package.json index 5dbbb4605a37..a211702bc73a 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { - "name": "@opencode-ai/ui", - "version": "1.1.65", + "name": "@opencoder-ai/ui", + "version": "1.1.63", "type": "module", "license": "MIT", "exports": { @@ -41,8 +41,8 @@ }, "dependencies": { "@kobalte/core": "catalog:", - "@opencode-ai/sdk": "workspace:*", - "@opencode-ai/util": "workspace:*", + "@opencoder-ai/sdk": "workspace:*", + "@opencoder-ai/util": "workspace:*", "@pierre/diffs": "catalog:", "@shikijs/transformers": "3.9.2", "@solid-primitives/bounds": "0.1.3", @@ -50,7 +50,7 @@ "@solid-primitives/resize-observer": "2.1.3", "@solidjs/meta": "catalog:", "@typescript/native-preview": "catalog:", - "dompurify": "3.3.1", + "dompurify": "catalog:", "fuzzysort": "catalog:", "katex": "0.16.27", "luxon": "catalog:", diff --git a/packages/ui/src/components/diff.tsx b/packages/ui/src/components/diff.tsx index 0966db75e036..fd16b1d82adb 100644 --- a/packages/ui/src/components/diff.tsx +++ b/packages/ui/src/components/diff.tsx @@ -1,4 +1,4 @@ -import { checksum } from "@opencode-ai/util/encode" +import { checksum } from "@opencoder-ai/util/encode" import { FileDiff, type SelectedLineRange, VirtualizedFileDiff } from "@pierre/diffs" import { createMediaQuery } from "@solid-primitives/media" import { createEffect, createMemo, createSignal, onCleanup, splitProps } from "solid-js" diff --git a/packages/ui/src/components/list.tsx b/packages/ui/src/components/list.tsx index aa2347037ea4..0738f44be268 100644 --- a/packages/ui/src/components/list.tsx +++ b/packages/ui/src/components/list.tsx @@ -1,4 +1,4 @@ -import { type FilteredListProps, useFilteredList } from "@opencode-ai/ui/hooks" +import { type FilteredListProps, useFilteredList } from "@opencoder-ai/ui/hooks" import { createEffect, createSignal, For, onCleanup, type JSX, on, Show } from "solid-js" import { createStore } from "solid-js/store" import { useI18n } from "../context/i18n" diff --git a/packages/ui/src/components/markdown.tsx b/packages/ui/src/components/markdown.tsx index 608db818f549..cf895f7b1fa5 100644 --- a/packages/ui/src/components/markdown.tsx +++ b/packages/ui/src/components/markdown.tsx @@ -2,7 +2,7 @@ import { useMarked } from "../context/marked" import { useI18n } from "../context/i18n" import DOMPurify from "dompurify" import morphdom from "morphdom" -import { checksum } from "@opencode-ai/util/encode" +import { checksum } from "@opencoder-ai/util/encode" import { ComponentProps, createEffect, createResource, createSignal, onCleanup, splitProps } from "solid-js" import { isServer } from "solid-js/web" diff --git a/packages/ui/src/components/message-nav.tsx b/packages/ui/src/components/message-nav.tsx index d151633faab7..a0d8a2f1ae7a 100644 --- a/packages/ui/src/components/message-nav.tsx +++ b/packages/ui/src/components/message-nav.tsx @@ -1,4 +1,4 @@ -import { UserMessage } from "@opencode-ai/sdk/v2" +import { UserMessage } from "@opencoder-ai/sdk/v2" import { ComponentProps, For, Match, Show, splitProps, Switch } from "solid-js" import { DiffChanges } from "./diff-changes" import { Tooltip } from "@kobalte/core/tooltip" diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx index 3f61b3186d30..ca248cbc9cb2 100644 --- a/packages/ui/src/components/message-part.tsx +++ b/packages/ui/src/components/message-part.tsx @@ -26,7 +26,7 @@ import { QuestionRequest, QuestionAnswer, QuestionInfo, -} from "@opencode-ai/sdk/v2" +} from "@opencoder-ai/sdk/v2" import { createStore } from "solid-js/store" import { useData } from "../context" import { useDiffComponent } from "../context/diff" @@ -42,9 +42,9 @@ import { Checkbox } from "./checkbox" import { DiffChanges } from "./diff-changes" import { Markdown } from "./markdown" import { ImagePreview } from "./image-preview" -import { findLast } from "@opencode-ai/util/array" -import { getDirectory as _getDirectory, getFilename } from "@opencode-ai/util/path" -import { checksum } from "@opencode-ai/util/encode" +import { findLast } from "@opencoder-ai/util/array" +import { getDirectory as _getDirectory, getFilename } from "@opencoder-ai/util/path" +import { checksum } from "@opencoder-ai/util/encode" import { Tooltip } from "./tooltip" import { IconButton } from "./icon-button" import { createAutoScroll } from "../hooks" diff --git a/packages/ui/src/components/session-review.tsx b/packages/ui/src/components/session-review.tsx index fe2475548ea4..e2739f6f1ad3 100644 --- a/packages/ui/src/components/session-review.tsx +++ b/packages/ui/src/components/session-review.tsx @@ -8,11 +8,11 @@ import { LineComment, LineCommentEditor } from "./line-comment" import { StickyAccordionHeader } from "./sticky-accordion-header" import { useDiffComponent } from "../context/diff" import { useI18n } from "../context/i18n" -import { getDirectory, getFilename } from "@opencode-ai/util/path" -import { checksum } from "@opencode-ai/util/encode" +import { getDirectory, getFilename } from "@opencoder-ai/util/path" +import { checksum } from "@opencoder-ai/util/encode" import { createEffect, createMemo, createSignal, For, Match, Show, Switch, type JSX } from "solid-js" import { createStore } from "solid-js/store" -import { type FileContent, type FileDiff } from "@opencode-ai/sdk/v2" +import { type FileContent, type FileDiff } from "@opencoder-ai/sdk/v2" import { PreloadMultiFileDiffResult } from "@pierre/diffs/ssr" import { type SelectedLineRange } from "@pierre/diffs" import { Dynamic } from "solid-js/web" diff --git a/packages/ui/src/components/session-turn.tsx b/packages/ui/src/components/session-turn.tsx index 9ffa671e6985..e1b54b0c8373 100644 --- a/packages/ui/src/components/session-turn.tsx +++ b/packages/ui/src/components/session-turn.tsx @@ -7,11 +7,11 @@ import { type QuestionRequest, TextPart, ToolPart, -} from "@opencode-ai/sdk/v2/client" +} from "@opencoder-ai/sdk/v2/client" import { useData } from "../context" import { type UiI18nKey, type UiI18nParams, useI18n } from "../context/i18n" -import { Binary } from "@opencode-ai/util/binary" +import { Binary } from "@opencoder-ai/util/binary" import { createEffect, createMemo, createSignal, For, Match, on, onCleanup, ParentProps, Show, Switch } from "solid-js" import { Message, Part } from "./message-part" import { Markdown } from "./markdown" diff --git a/packages/ui/src/context/data.tsx b/packages/ui/src/context/data.tsx index 51bffa0502ad..117ff4e53cfb 100644 --- a/packages/ui/src/context/data.tsx +++ b/packages/ui/src/context/data.tsx @@ -7,7 +7,7 @@ import type { PermissionRequest, QuestionRequest, QuestionAnswer, -} from "@opencode-ai/sdk/v2" +} from "@opencoder-ai/sdk/v2" import { createSimpleContext } from "./helper" import { PreloadMultiFileDiffResult } from "@pierre/diffs/ssr" diff --git a/packages/util/AGENTS.md b/packages/util/AGENTS.md new file mode 100644 index 000000000000..5b91bb45593a --- /dev/null +++ b/packages/util/AGENTS.md @@ -0,0 +1,21 @@ +# Shared Utilities + +**Package:** `packages/util` +**Type:** Shared utility functions + +## Overview + +Common utility functions used across the monorepo. + +## Structure + +``` +packages/util/src/ +└── ... # Utility functions +``` + +## Key Patterns + +- Reusable helper functions +- Common TypeScript utilities +- Shared business logic diff --git a/packages/util/package.json b/packages/util/package.json index f37bb5c1d174..ef73a0f1e99b 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,20 +1,24 @@ { - "name": "@opencode-ai/util", - "version": "1.1.65", + "name": "@opencoder-ai/util", + "version": "1.1.63", "private": true, "type": "module", "license": "MIT", "exports": { - "./*": "./src/*.ts" + "./*": { + "types": "./dist/*.d.ts", + "default": "./src/*.ts" + } }, "scripts": { - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "build": "tsc" }, "dependencies": { "zod": "catalog:" }, "devDependencies": { - "typescript": "catalog:", - "@types/bun": "catalog:" + "@types/bun": "catalog:", + "typescript": "catalog:" } } diff --git a/packages/util/src/error.ts b/packages/util/src/error.ts index 12c27a0a7799..9ef0dfbf168c 100644 --- a/packages/util/src/error.ts +++ b/packages/util/src/error.ts @@ -26,8 +26,8 @@ export abstract class NamedError extends Error { this.name = name } - static isInstance(input: any): input is InstanceType { - return typeof input === "object" && "name" in input && input.name === name + static isInstance(input: unknown): input is { name: Name; data: z.input } { + return typeof input === "object" && input !== null && "name" in input && input.name === name } schema() { diff --git a/packages/util/tsconfig.json b/packages/util/tsconfig.json index 528dcd91d998..2860d0b909d3 100644 --- a/packages/util/tsconfig.json +++ b/packages/util/tsconfig.json @@ -7,8 +7,15 @@ "allowSyntheticDefaultImports": true, "esModuleInterop": true, "allowJs": true, - "noEmit": true, + "noEmit": false, + "declaration": true, + "emitDeclarationOnly": true, + "declarationMap": true, + "outDir": "dist", + "rootDir": "src", "strict": true, "isolatedModules": true - } + }, + "include": ["src"], + "exclude": ["dist", "node_modules"] } diff --git a/packages/web/AGENTS.md b/packages/web/AGENTS.md new file mode 100644 index 000000000000..3c9c1af66dcf --- /dev/null +++ b/packages/web/AGENTS.md @@ -0,0 +1,31 @@ +# Web Marketing Site + +**Package:** `packages/web` +**Type:** Marketing site (Astro) + +## Overview + +Landing page and marketing website built with Astro. + +## Structure + +``` +packages/web/src/ +└── assets/ # Static assets, images +``` + +## Commands + +```bash +# Dev +bun dev + +# Build +bun build +``` + +## Key Patterns + +- Astro static site generator +- TailwindCSS styling +- Static asset management diff --git a/packages/web/package.json b/packages/web/package.json index 7c6698117a79..72bee27b5a2c 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,5 +1,5 @@ { - "name": "@opencode-ai/web", + "name": "@opencoder-ai/web", "type": "module", "license": "MIT", "version": "1.1.65", @@ -17,7 +17,7 @@ "@astrojs/solid-js": "5.1.0", "@astrojs/starlight": "0.34.3", "@fontsource/ibm-plex-mono": "5.2.5", - "@shikijs/transformers": "3.20.0", + "@shikijs/transformers": "3.9.2", "@types/luxon": "catalog:", "ai": "catalog:", "astro": "5.7.13", @@ -35,9 +35,9 @@ "vscode-languageserver-types": "3.17.5" }, "devDependencies": { - "opencode": "workspace:*", - "@types/node": "catalog:", "@astrojs/check": "0.9.6", + "@types/node": "catalog:", + "opencoder": "workspace:*", "typescript": "catalog:" } } diff --git a/packages/web/src/content/docs/custom-tools.mdx b/packages/web/src/content/docs/custom-tools.mdx index 80a19236995b..4b523021dd5b 100644 --- a/packages/web/src/content/docs/custom-tools.mdx +++ b/packages/web/src/content/docs/custom-tools.mdx @@ -26,8 +26,8 @@ They can be defined: The easiest way to create tools is using the `tool()` helper which provides type-safety and validation. -```ts title=".opencode/tools/database.ts" {1} -import { tool } from "@opencode-ai/plugin" +```ts title=".opencode/tool/database.ts" {1} +import { tool } from "@opencoder-ai/plugin" export default tool({ description: "Query the project database", @@ -49,8 +49,8 @@ The **filename** becomes the **tool name**. The above creates a `database` tool. You can also export multiple tools from a single file. Each export becomes **a separate tool** with the name **`_`**: -```ts title=".opencode/tools/math.ts" -import { tool } from "@opencode-ai/plugin" +```ts title=".opencode/tool/math.ts" +import { tool } from "@opencoder-ai/plugin" export const add = tool({ description: "Add two numbers", @@ -112,8 +112,8 @@ export default { Tools receive context about the current session: -```ts title=".opencode/tools/project.ts" {8} -import { tool } from "@opencode-ai/plugin" +```ts title=".opencode/tool/project.ts" {8} +import { tool } from "@opencoder-ai/plugin" export default tool({ description: "Get project information", @@ -149,8 +149,8 @@ print(a + b) Then create the tool definition that invokes it: -```ts title=".opencode/tools/python-add.ts" {10} -import { tool } from "@opencode-ai/plugin" +```ts title=".opencode/tool/python-add.ts" {10} +import { tool } from "@opencoder-ai/plugin" import path from "path" export default tool({ diff --git a/packages/web/src/content/docs/ecosystem.mdx b/packages/web/src/content/docs/ecosystem.mdx index 85839a2d82b8..f640b2fa6dc0 100644 --- a/packages/web/src/content/docs/ecosystem.mdx +++ b/packages/web/src/content/docs/ecosystem.mdx @@ -59,7 +59,7 @@ You can also check out [awesome-opencode](https://github.com/awesome-opencode/aw | [portal](https://github.com/hosenur/portal) | Mobile-first web UI for OpenCode over Tailscale/VPN | | [opencode plugin template](https://github.com/zenobi-us/opencode-plugin-template/) | Template for building OpenCode plugins | | [opencode.nvim](https://github.com/sudo-tee/opencode.nvim) | Neovim frontend for opencode - a terminal-based AI coding agent | -| [ai-sdk-provider-opencode-sdk](https://github.com/ben-vargas/ai-sdk-provider-opencode-sdk) | Vercel AI SDK provider for using OpenCode via @opencode-ai/sdk | +| [ai-sdk-provider-opencode-sdk](https://github.com/ben-vargas/ai-sdk-provider-opencode-sdk) | Vercel AI SDK provider for using OpenCode via @opencoder-ai/sdk | | [OpenChamber](https://github.com/btriapitsyn/openchamber) | Web / Desktop App and VS Code Extension for OpenCode | | [OpenCode-Obsidian](https://github.com/mtymek/opencode-obsidian) | Obsidian plugin that embeds OpenCode in Obsidian's UI | | [OpenWork](https://github.com/different-ai/openwork) | An open-source alternative to Claude Cowork, powered by OpenCode | diff --git a/packages/web/src/content/docs/plugins.mdx b/packages/web/src/content/docs/plugins.mdx index 411b827d22c2..4884bce902ef 100644 --- a/packages/web/src/content/docs/plugins.mdx +++ b/packages/web/src/content/docs/plugins.mdx @@ -128,7 +128,7 @@ The plugin function receives: For TypeScript plugins, you can import types from the plugin package: ```ts title="my-plugin.ts" {1} -import type { Plugin } from "@opencode-ai/plugin" +import type { Plugin } from "@opencoder-ai/plugin" export const MyPlugin: Plugin = async ({ project, client, $, directory, worktree }) => { return { @@ -279,8 +279,8 @@ export const InjectEnvPlugin = async () => { Plugins can also add custom tools to opencode: -```ts title=".opencode/plugins/custom-tools.ts" -import { type Plugin, tool } from "@opencode-ai/plugin" +```ts title=".opencode/plugin/custom-tools.ts" +import { type Plugin, tool } from "@opencoder-ai/plugin" export const CustomToolsPlugin: Plugin = async (ctx) => { return { @@ -335,8 +335,8 @@ Levels: `debug`, `info`, `warn`, `error`. See [SDK documentation](https://openco Customize the context included when a session is compacted: -```ts title=".opencode/plugins/compaction.ts" -import type { Plugin } from "@opencode-ai/plugin" +```ts title=".opencode/plugin/compaction.ts" +import type { Plugin } from "@opencoder-ai/plugin" export const CompactionPlugin: Plugin = async (ctx) => { return { @@ -359,8 +359,8 @@ The `experimental.session.compacting` hook fires before the LLM generates a cont You can also replace the compaction prompt entirely by setting `output.prompt`: -```ts title=".opencode/plugins/custom-compaction.ts" -import type { Plugin } from "@opencode-ai/plugin" +```ts title=".opencode/plugin/custom-compaction.ts" +import type { Plugin } from "@opencoder-ai/plugin" export const CustomCompactionPlugin: Plugin = async (ctx) => { return { diff --git a/packages/web/src/content/docs/sdk.mdx b/packages/web/src/content/docs/sdk.mdx index 24546213be51..4703ff43fc0a 100644 --- a/packages/web/src/content/docs/sdk.mdx +++ b/packages/web/src/content/docs/sdk.mdx @@ -18,7 +18,7 @@ Use it to build integrations and control opencode programmatically. Install the SDK from npm: ```bash -npm install @opencode-ai/sdk +npm install @opencoder-ai/sdk ``` --- @@ -28,7 +28,7 @@ npm install @opencode-ai/sdk Create an instance of opencode: ```javascript -import { createOpencode } from "@opencode-ai/sdk" +import { createOpencode } from "@opencoder-ai/sdk" const { client } = await createOpencode() ``` @@ -52,7 +52,7 @@ This starts both a server and a client You can pass a configuration object to customize behavior. The instance still picks up your `opencode.json`, but you can override or add configuration inline: ```javascript -import { createOpencode } from "@opencode-ai/sdk" +import { createOpencode } from "@opencoder-ai/sdk" const opencode = await createOpencode({ hostname: "127.0.0.1", @@ -72,7 +72,7 @@ opencode.server.close() If you already have a running instance of opencode, you can create a client instance to connect to it: ```javascript -import { createOpencodeClient } from "@opencode-ai/sdk" +import { createOpencodeClient } from "@opencoder-ai/sdk" const client = createOpencodeClient({ baseUrl: "http://localhost:4096", @@ -96,7 +96,7 @@ const client = createOpencodeClient({ The SDK includes TypeScript definitions for all API types. Import them directly: ```typescript -import type { Session, Message, Part } from "@opencode-ai/sdk" +import type { Session, Message, Part } from "@opencoder-ai/sdk" ``` All types are generated from the server's OpenAPI specification and available in the types file. diff --git a/script/changelog.ts b/script/changelog.ts index 5fc30a228bfb..4f523d38faeb 100755 --- a/script/changelog.ts +++ b/script/changelog.ts @@ -1,9 +1,9 @@ #!/usr/bin/env bun import { $ } from "bun" -import { createOpencode } from "@opencode-ai/sdk/v2" +import { createOpencode } from "@opencoder-ai/sdk" import { parseArgs } from "util" -import { Script } from "@opencode-ai/script" +import { Script } from "@opencoder-ai/script" type Release = { tag_name: string diff --git a/script/duplicate-pr.ts b/script/duplicate-pr.ts index b77737c1d417..81371342d844 100755 --- a/script/duplicate-pr.ts +++ b/script/duplicate-pr.ts @@ -2,7 +2,7 @@ import path from "path" import { pathToFileURL } from "bun" -import { createOpencode } from "@opencode-ai/sdk" +import { createOpencode } from "@opencoder-ai/sdk" import { parseArgs } from "util" async function main() { diff --git a/script/publish.ts b/script/publish.ts index 1294f8d793e1..2b064013fb26 100755 --- a/script/publish.ts +++ b/script/publish.ts @@ -1,7 +1,8 @@ #!/usr/bin/env bun import { $ } from "bun" -import { Script } from "@opencode-ai/script" +import { Script } from "@opencoder-ai/script" +import { buildNotes, getLatestRelease } from "./changelog" const highlightsTemplate = `