Skip to content

Commit 33d2144

Browse files
committed
Merge tag 'v1.2.26' into upstream/merge-v1.2.26
# Conflicts: # .github/workflows/publish.yml # .github/workflows/test.yml # README.ar.md # README.bn.md # README.br.md # README.bs.md # README.da.md # README.de.md # README.es.md # README.fr.md # README.gr.md # README.it.md # README.ja.md # README.ko.md # README.md # README.no.md # README.pl.md # README.ru.md # README.th.md # README.tr.md # README.uk.md # README.zh.md # README.zht.md # bun.lock # infra/console.ts # nix/hashes.json # package.json # packages/app/e2e/AGENTS.md # packages/app/e2e/actions.ts # packages/app/e2e/app/home.spec.ts # packages/app/e2e/app/server-default.spec.ts # packages/app/e2e/app/titlebar-history.spec.ts # packages/app/e2e/commands/panels.spec.ts # packages/app/e2e/files/file-tree.spec.ts # packages/app/e2e/fixtures.ts # packages/app/e2e/projects/project-edit.spec.ts # packages/app/e2e/projects/projects-close.spec.ts # packages/app/e2e/projects/projects-switch.spec.ts # packages/app/e2e/projects/workspace-new-session.spec.ts # packages/app/e2e/projects/workspaces.spec.ts # packages/app/e2e/prompt/prompt-async.spec.ts # packages/app/e2e/prompt/prompt-slash-terminal.spec.ts # packages/app/e2e/prompt/prompt.spec.ts # packages/app/e2e/selectors.ts # packages/app/e2e/session/session-composer-dock.spec.ts # packages/app/e2e/session/session-undo-redo.spec.ts # packages/app/e2e/settings/settings-keybinds.spec.ts # packages/app/e2e/settings/settings.spec.ts # packages/app/e2e/sidebar/sidebar-popover-actions.spec.ts # packages/app/e2e/sidebar/sidebar-session-links.spec.ts # packages/app/e2e/sidebar/sidebar.spec.ts # packages/app/e2e/terminal/terminal-init.spec.ts # packages/app/e2e/terminal/terminal.spec.ts # packages/app/e2e/tsconfig.json # packages/app/e2e/utils.ts # packages/app/package.json # packages/app/playwright.config.ts # packages/app/public/oc-theme-preload.js # packages/app/script/e2e-local.ts # packages/app/src/app.tsx # packages/app/src/components/dialog-custom-provider.tsx # packages/app/src/components/dialog-fork.tsx # packages/app/src/components/dialog-select-file.tsx # packages/app/src/components/dialog-select-model-unpaid.tsx # packages/app/src/components/dialog-select-model.tsx # packages/app/src/components/dialog-select-server.tsx # packages/app/src/components/prompt-input.tsx # packages/app/src/components/prompt-input/attachments.ts # packages/app/src/components/prompt-input/submit.test.ts # packages/app/src/components/prompt-input/submit.ts # packages/app/src/components/server/server-row.tsx # packages/app/src/components/session-context-usage.tsx # packages/app/src/components/session/session-context-tab.tsx # packages/app/src/components/session/session-header.tsx # packages/app/src/components/session/session-new-view.tsx # packages/app/src/components/session/session-sortable-terminal-tab.tsx # packages/app/src/components/settings-general.tsx # packages/app/src/components/settings-keybinds.tsx # packages/app/src/components/settings-models.tsx # packages/app/src/components/settings-providers.tsx # packages/app/src/components/status-popover.tsx # packages/app/src/components/terminal.tsx # packages/app/src/components/titlebar.tsx # packages/app/src/context/command.tsx # packages/app/src/context/file.tsx # packages/app/src/context/global-sdk.tsx # packages/app/src/context/global-sync.test.ts # packages/app/src/context/global-sync.tsx # packages/app/src/context/global-sync/bootstrap.ts # packages/app/src/context/global-sync/child-store.test.ts # packages/app/src/context/global-sync/child-store.ts # packages/app/src/context/global-sync/event-reducer.test.ts # packages/app/src/context/global-sync/event-reducer.ts # packages/app/src/context/highlights.tsx # packages/app/src/context/language.tsx # packages/app/src/context/layout.tsx # packages/app/src/context/local.tsx # packages/app/src/context/model-variant.test.ts # packages/app/src/context/model-variant.ts # packages/app/src/context/permission-auto-respond.test.ts # packages/app/src/context/permission-auto-respond.ts # packages/app/src/context/permission.tsx # packages/app/src/context/platform.tsx # packages/app/src/context/prompt.tsx # packages/app/src/context/server.tsx # packages/app/src/context/settings.tsx # packages/app/src/context/sync-optimistic.test.ts # packages/app/src/context/sync.tsx # packages/app/src/context/terminal.test.ts # packages/app/src/context/terminal.tsx # packages/app/src/entry.tsx # packages/app/src/hooks/use-providers.ts # packages/app/src/i18n/ar.ts # packages/app/src/i18n/br.ts # packages/app/src/i18n/bs.ts # packages/app/src/i18n/da.ts # packages/app/src/i18n/de.ts # packages/app/src/i18n/en.ts # packages/app/src/i18n/es.ts # packages/app/src/i18n/fr.ts # packages/app/src/i18n/ja.ts # packages/app/src/i18n/ko.ts # packages/app/src/i18n/no.ts # packages/app/src/i18n/pl.ts # packages/app/src/i18n/ru.ts # packages/app/src/i18n/th.ts # packages/app/src/i18n/tr.ts # packages/app/src/i18n/zh.ts # packages/app/src/i18n/zht.ts # packages/app/src/index.css # packages/app/src/pages/directory-layout.tsx # packages/app/src/pages/error.tsx # packages/app/src/pages/layout.tsx # packages/app/src/pages/layout/helpers.test.ts # packages/app/src/pages/layout/helpers.ts # packages/app/src/pages/layout/sidebar-items.tsx # packages/app/src/pages/layout/sidebar-project.tsx # packages/app/src/pages/layout/sidebar-shell.tsx # packages/app/src/pages/layout/sidebar-workspace.tsx # packages/app/src/pages/session.tsx # packages/app/src/pages/session/composer/index.ts # packages/app/src/pages/session/composer/session-composer-region.tsx # packages/app/src/pages/session/composer/session-composer-state.test.ts # packages/app/src/pages/session/composer/session-composer-state.ts # packages/app/src/pages/session/composer/session-question-dock.tsx # packages/app/src/pages/session/composer/session-todo-dock.tsx # packages/app/src/pages/session/file-tabs.tsx # packages/app/src/pages/session/helpers.test.ts # packages/app/src/pages/session/helpers.ts # packages/app/src/pages/session/message-timeline.tsx # packages/app/src/pages/session/review-tab.tsx # packages/app/src/pages/session/session-side-panel.tsx # packages/app/src/pages/session/terminal-label.ts # packages/app/src/pages/session/terminal-panel.tsx # packages/app/src/pages/session/use-session-commands.tsx # packages/app/src/pages/session/use-session-hash-scroll.ts # packages/app/src/utils/agent.ts # packages/app/src/utils/persist.test.ts # packages/app/src/utils/persist.ts # packages/app/src/utils/server-health.ts # packages/console/app/package.json # packages/console/app/src/component/footer.tsx # packages/console/app/src/component/header.tsx # packages/console/app/src/component/icon.tsx # packages/console/app/src/config.ts # packages/console/app/src/i18n/ar.ts # packages/console/app/src/i18n/br.ts # packages/console/app/src/i18n/da.ts # packages/console/app/src/i18n/de.ts # packages/console/app/src/i18n/en.ts # packages/console/app/src/i18n/es.ts # packages/console/app/src/i18n/fr.ts # packages/console/app/src/i18n/it.ts # packages/console/app/src/i18n/ja.ts # packages/console/app/src/i18n/ko.ts # packages/console/app/src/i18n/no.ts # packages/console/app/src/i18n/pl.ts # packages/console/app/src/i18n/ru.ts # packages/console/app/src/i18n/th.ts # packages/console/app/src/i18n/tr.ts # packages/console/app/src/i18n/zh.ts # packages/console/app/src/i18n/zht.ts # packages/console/app/src/routes/go/index.css # packages/console/app/src/routes/go/index.tsx # packages/console/app/src/routes/legal/privacy-policy/index.tsx # packages/console/app/src/routes/legal/terms-of-service/index.tsx # packages/console/app/src/routes/workspace/[id].tsx # packages/console/app/src/routes/workspace/[id]/billing/billing-section.tsx # packages/console/app/src/routes/workspace/[id]/billing/index.tsx # packages/console/app/src/routes/workspace/[id]/go/lite-section.module.css # packages/console/app/src/routes/workspace/[id]/go/lite-section.tsx # packages/console/app/src/routes/workspace/[id]/index.tsx # packages/console/app/src/routes/workspace/[id]/usage/graph-section.module.css # packages/console/app/src/routes/workspace/[id]/usage/graph-section.tsx # packages/console/app/src/routes/workspace/[id]/usage/usage-section.module.css # packages/console/app/src/routes/workspace/[id]/usage/usage-section.tsx # packages/console/app/src/routes/zen/index.tsx # packages/console/app/src/routes/zen/util/handler.ts # packages/console/app/src/routes/zen/util/rateLimiter.ts # packages/console/core/package.json # packages/console/core/src/billing.ts # packages/console/core/src/lite.ts # packages/console/core/src/model.ts # packages/console/core/sst-env.d.ts # packages/console/function/package.json # packages/console/function/sst-env.d.ts # packages/console/mail/package.json # packages/console/resource/sst-env.d.ts # packages/desktop-electron/electron.vite.config.ts # packages/desktop-electron/package.json # packages/desktop-electron/scripts/finalize-latest-yml.ts # packages/desktop-electron/scripts/utils.ts # packages/desktop-electron/src/main/cli.ts # packages/desktop-electron/src/main/index.ts # packages/desktop-electron/src/main/ipc.ts # packages/desktop-electron/src/main/menu.ts # packages/desktop-electron/src/main/server.ts # packages/desktop-electron/src/main/windows.ts # packages/desktop-electron/src/preload/index.ts # packages/desktop-electron/src/preload/types.ts # packages/desktop-electron/src/renderer/i18n/index.ts # packages/desktop-electron/src/renderer/index.html # packages/desktop-electron/src/renderer/index.tsx # packages/desktop-electron/src/renderer/loading.html # packages/desktop-electron/src/renderer/loading.tsx # packages/desktop-electron/tsconfig.json # packages/desktop/package.json # packages/desktop/scripts/finalize-latest-json.ts # packages/desktop/scripts/utils.ts # packages/desktop/src-tauri/src/lib.rs # packages/desktop/src-tauri/src/server.rs # packages/desktop/src/bindings.ts # packages/desktop/src/i18n/index.ts # packages/desktop/src/index.tsx # packages/desktop/src/menu.ts # packages/enterprise/package.json # packages/enterprise/src/core/share.ts # packages/enterprise/src/routes/api/[...path].ts # packages/enterprise/src/routes/share/[shareID].tsx # packages/enterprise/sst-env.d.ts # packages/enterprise/test/core/share.test.ts # packages/extensions/zed/extension.toml # packages/function/package.json # packages/function/sst-env.d.ts # packages/opencode/package.json # packages/opencode/script/build.ts # packages/opencode/src/acp/agent.ts # packages/opencode/src/cli/cmd/pr.ts # packages/opencode/src/cli/cmd/providers.ts # packages/opencode/src/cli/cmd/tui/app.tsx # packages/opencode/src/cli/cmd/tui/context/sync.tsx # packages/opencode/src/cli/cmd/tui/thread.ts # packages/opencode/src/cli/cmd/tui/worker.ts # packages/opencode/src/cli/cmd/uninstall.ts # packages/opencode/src/installation/index.ts # packages/opencode/src/project/project.ts # packages/opencode/src/provider/provider.ts # packages/opencode/src/server/server.ts # packages/opencode/src/session/compaction.ts # packages/opencode/src/session/index.ts # packages/opencode/src/session/processor.ts # packages/opencode/src/session/prompt.ts # packages/opencode/src/share/share-next.ts # packages/opencode/src/tool/truncation.ts # packages/slack/package.json # packages/storybook/.storybook/mocks/solid-router.tsx # packages/ui/package.json # packages/ui/script/colors.txt # packages/ui/src/assets/icons/app/android-studio.svg # packages/ui/src/assets/icons/app/antigravity.svg # packages/ui/src/assets/icons/app/cursor.svg # packages/ui/src/assets/icons/app/file-explorer.svg # packages/ui/src/assets/icons/app/finder.png # packages/ui/src/assets/icons/app/ghostty.svg # packages/ui/src/assets/icons/app/iterm2.svg # packages/ui/src/assets/icons/app/powershell.svg # packages/ui/src/assets/icons/app/sublimetext.svg # packages/ui/src/assets/icons/app/terminal.png # packages/ui/src/assets/icons/app/textmate.png # packages/ui/src/assets/icons/app/vscode.svg # packages/ui/src/assets/icons/app/warp.png # packages/ui/src/assets/icons/app/xcode.png # packages/ui/src/assets/icons/app/zed-dark.svg # packages/ui/src/assets/icons/app/zed.svg # packages/ui/src/components/animated-number.tsx # packages/ui/src/components/basic-tool.css # packages/ui/src/components/basic-tool.tsx # packages/ui/src/components/button.css # packages/ui/src/components/card.css # packages/ui/src/components/card.stories.tsx # packages/ui/src/components/card.tsx # packages/ui/src/components/dropdown-menu.css # packages/ui/src/components/file-search.tsx # packages/ui/src/components/file.tsx # packages/ui/src/components/font.tsx # packages/ui/src/components/icon.tsx # packages/ui/src/components/line-comment-annotations.tsx # packages/ui/src/components/line-comment.tsx # packages/ui/src/components/list.tsx # packages/ui/src/components/markdown.css # packages/ui/src/components/markdown.tsx # packages/ui/src/components/message-part.css # packages/ui/src/components/message-part.tsx # packages/ui/src/components/popover.tsx # packages/ui/src/components/resize-handle.stories.tsx # packages/ui/src/components/scroll-view.tsx # packages/ui/src/components/select.tsx # packages/ui/src/components/session-review.tsx # packages/ui/src/components/session-turn.css # packages/ui/src/components/session-turn.tsx # packages/ui/src/components/shell-submessage-motion.stories.tsx # packages/ui/src/components/spinner.tsx # packages/ui/src/components/tabs.css # packages/ui/src/components/text-reveal.stories.tsx # packages/ui/src/components/text-reveal.tsx # packages/ui/src/components/text-shimmer.tsx # packages/ui/src/components/text-strikethrough.stories.tsx # packages/ui/src/components/text-strikethrough.tsx # packages/ui/src/components/thinking-heading.stories.tsx # packages/ui/src/components/todo-panel-motion.stories.tsx # packages/ui/src/components/tool-count-summary.stories.tsx # packages/ui/src/components/tool-status-title.tsx # packages/ui/src/components/tooltip.tsx # packages/ui/src/context/marked.tsx # packages/ui/src/i18n/ar.ts # packages/ui/src/i18n/br.ts # packages/ui/src/i18n/bs.ts # packages/ui/src/i18n/da.ts # packages/ui/src/i18n/de.ts # packages/ui/src/i18n/en.ts # packages/ui/src/i18n/es.ts # packages/ui/src/i18n/fr.ts # packages/ui/src/i18n/ja.ts # packages/ui/src/i18n/ko.ts # packages/ui/src/i18n/no.ts # packages/ui/src/i18n/pl.ts # packages/ui/src/i18n/ru.ts # packages/ui/src/i18n/th.ts # packages/ui/src/i18n/tr.ts # packages/ui/src/i18n/zh.ts # packages/ui/src/i18n/zht.ts # packages/ui/src/pierre/file-find.ts # packages/ui/src/pierre/selection-bridge.ts # packages/ui/src/styles/animations.css # packages/ui/src/styles/index.css # packages/ui/src/styles/tailwind/colors.css # packages/ui/src/styles/tailwind/utilities.css # packages/ui/src/styles/theme.css # packages/ui/src/theme/color.ts # packages/ui/src/theme/context.tsx # packages/ui/src/theme/default-themes.ts # packages/ui/src/theme/desktop-theme.schema.json # packages/ui/src/theme/index.ts # packages/ui/src/theme/loader.ts # packages/ui/src/theme/resolve.ts # packages/ui/src/theme/themes/aura.json # packages/ui/src/theme/themes/ayu.json # packages/ui/src/theme/themes/carbonfox.json # packages/ui/src/theme/themes/catppuccin.json # packages/ui/src/theme/themes/dracula.json # packages/ui/src/theme/themes/gruvbox.json # packages/ui/src/theme/themes/monokai.json # packages/ui/src/theme/themes/nightowl.json # packages/ui/src/theme/themes/nord.json # packages/ui/src/theme/themes/oc-2.json # packages/ui/src/theme/themes/onedarkpro.json # packages/ui/src/theme/themes/shadesofpurple.json # packages/ui/src/theme/themes/solarized.json # packages/ui/src/theme/themes/tokyonight.json # packages/ui/src/theme/themes/vesper.json # packages/ui/src/theme/types.ts # packages/web/package.json # packages/web/src/content/docs/agents.mdx # packages/web/src/content/docs/ar/ecosystem.mdx # packages/web/src/content/docs/ar/keybinds.mdx # packages/web/src/content/docs/bs/ecosystem.mdx # packages/web/src/content/docs/bs/keybinds.mdx # packages/web/src/content/docs/config.mdx # packages/web/src/content/docs/da/ecosystem.mdx # packages/web/src/content/docs/da/keybinds.mdx # packages/web/src/content/docs/de/ecosystem.mdx # packages/web/src/content/docs/de/keybinds.mdx # packages/web/src/content/docs/ecosystem.mdx # packages/web/src/content/docs/es/ecosystem.mdx # packages/web/src/content/docs/es/keybinds.mdx # packages/web/src/content/docs/fr/ecosystem.mdx # packages/web/src/content/docs/fr/keybinds.mdx # packages/web/src/content/docs/go.mdx # packages/web/src/content/docs/it/ecosystem.mdx # packages/web/src/content/docs/it/keybinds.mdx # packages/web/src/content/docs/it/zen.mdx # packages/web/src/content/docs/ja/ecosystem.mdx # packages/web/src/content/docs/ja/keybinds.mdx # packages/web/src/content/docs/keybinds.mdx # packages/web/src/content/docs/ko/ecosystem.mdx # packages/web/src/content/docs/ko/keybinds.mdx # packages/web/src/content/docs/nb/ecosystem.mdx # packages/web/src/content/docs/nb/keybinds.mdx # packages/web/src/content/docs/pl/ecosystem.mdx # packages/web/src/content/docs/pl/keybinds.mdx # packages/web/src/content/docs/providers.mdx # packages/web/src/content/docs/pt-br/ecosystem.mdx # packages/web/src/content/docs/pt-br/keybinds.mdx # packages/web/src/content/docs/ru/ecosystem.mdx # packages/web/src/content/docs/ru/keybinds.mdx # packages/web/src/content/docs/th/ecosystem.mdx # packages/web/src/content/docs/th/keybinds.mdx # packages/web/src/content/docs/tr/ecosystem.mdx # packages/web/src/content/docs/tr/keybinds.mdx # packages/web/src/content/docs/zen.mdx # packages/web/src/content/docs/zh-cn/ecosystem.mdx # packages/web/src/content/docs/zh-cn/keybinds.mdx # packages/web/src/content/docs/zh-cn/providers.mdx # packages/web/src/content/docs/zh-tw/ecosystem.mdx # packages/web/src/content/docs/zh-tw/keybinds.mdx # sdks/vscode/package.json # sst-env.d.ts
2 parents f5466e7 + d954026 commit 33d2144

659 files changed

Lines changed: 128760 additions & 3500 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/actions/setup-bun/action.yml

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,6 @@ description: "Setup Bun with caching and install dependencies"
33
runs:
44
using: "composite"
55
steps:
6-
- name: Cache Bun dependencies
7-
uses: actions/cache@v4
8-
with:
9-
path: ~/.bun/install/cache
10-
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lockb') }}
11-
restore-keys: |
12-
${{ runner.os }}-bun-
13-
146
- name: Get baseline download URL
157
id: bun-url
168
shell: bash
@@ -31,6 +23,23 @@ runs:
3123
bun-version-file: ${{ !steps.bun-url.outputs.url && 'package.json' || '' }}
3224
bun-download-url: ${{ steps.bun-url.outputs.url }}
3325

26+
- name: Get cache directory
27+
id: cache
28+
shell: bash
29+
run: echo "dir=$(bun pm cache)" >> "$GITHUB_OUTPUT"
30+
31+
- name: Cache Bun dependencies
32+
uses: actions/cache@v4
33+
with:
34+
path: ${{ steps.cache.outputs.dir }}
35+
key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lock') }}
36+
restore-keys: |
37+
${{ runner.os }}-bun-
38+
39+
- name: Install setuptools for distutils compatibility
40+
run: python3 -m pip install setuptools || pip install setuptools || true
41+
shell: bash
42+
3443
- name: Install dependencies
3544
run: bun install
3645
shell: bash

.github/workflows/storybook.yml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
name: storybook
2+
3+
on:
4+
push:
5+
branches: [dev]
6+
paths:
7+
- ".github/workflows/storybook.yml"
8+
- "package.json"
9+
- "bun.lock"
10+
- "packages/storybook/**"
11+
- "packages/ui/**"
12+
pull_request:
13+
branches: [dev]
14+
paths:
15+
- ".github/workflows/storybook.yml"
16+
- "package.json"
17+
- "bun.lock"
18+
- "packages/storybook/**"
19+
- "packages/ui/**"
20+
workflow_dispatch:
21+
22+
concurrency:
23+
group: ${{ github.workflow }}-${{ github.ref }}
24+
cancel-in-progress: true
25+
26+
jobs:
27+
build:
28+
name: storybook build
29+
runs-on: blacksmith-4vcpu-ubuntu-2404
30+
steps:
31+
- name: Checkout repository
32+
uses: actions/checkout@v4
33+
34+
- name: Setup Bun
35+
uses: ./.github/actions/setup-bun
36+
37+
- name: Build Storybook
38+
run: bun --cwd packages/storybook build

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ ts-dist
1717
/result
1818
refs
1919
Session.vim
20-
opencode.json
20+
/opencode.json
2121
a.out
2222
target
2323
.scripts

.opencode/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
plans/
22
bun.lock
33
package.json
4+
package-lock.json

.opencode/opencode.jsonc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
"options": {},
66
},
77
},
8+
"permission": {
9+
"edit": {
10+
"packages/opencode/migration/*": "deny",
11+
},
12+
},
813
"mcp": {},
914
"tools": {
1015
"github-triage": false,

.opencode/tool/github-pr-search.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Use this tool to search GitHub pull requests by title and description.
22

3-
This tool searches PRs in the sst/opencode repository and returns LLM-friendly results including:
3+
This tool searches PRs in the anomalyco/opencode repository and returns LLM-friendly results including:
44
- PR number and title
55
- Author
66
- State (open/closed/merged)

.opencode/tool/github-triage.ts

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,8 @@ import DESCRIPTION from "./github-triage.txt"
55
const TEAM = {
66
desktop: ["adamdotdevin", "iamdavidhill", "Brendonovich", "nexxeln"],
77
zen: ["fwang", "MrMushrooooom"],
8-
tui: [
9-
"thdxr",
10-
"kommander",
11-
// "rekram1-node" (on vacation)
12-
],
13-
core: [
14-
"thdxr",
15-
// "rekram1-node", (on vacation)
16-
"jlongster",
17-
],
8+
tui: ["thdxr", "kommander", "rekram1-node"],
9+
core: ["thdxr", "rekram1-node", "jlongster"],
1810
docs: ["R44VC0RP"],
1911
windows: ["Hona"],
2012
} as const
@@ -50,7 +42,10 @@ async function githubFetch(endpoint: string, options: RequestInit = {}) {
5042
export default tool({
5143
description: DESCRIPTION,
5244
args: {
53-
assignee: tool.schema.enum(ASSIGNEES as [string, ...string[]]).describe("The username of the assignee"),
45+
assignee: tool.schema
46+
.enum(ASSIGNEES as [string, ...string[]])
47+
.describe("The username of the assignee")
48+
.default("rekram1-node"),
5449
labels: tool.schema
5550
.array(tool.schema.enum(["nix", "opentui", "perf", "web", "desktop", "zen", "docs", "windows", "core"]))
5651
.describe("The labels(s) to add to the issue")
@@ -73,8 +68,7 @@ export default tool({
7368
results.push("Dropped label: nix (issue does not mention nix)")
7469
}
7570

76-
// const assignee = nix ? "rekram1-node" : web ? pick(TEAM.desktop) : args.assignee
77-
const assignee = web ? pick(TEAM.desktop) : args.assignee
71+
const assignee = nix ? "rekram1-node" : web ? pick(TEAM.desktop) : args.assignee
7872

7973
if (labels.includes("zen") && !zen) {
8074
throw new Error("Only add the zen label when issue title/body contains 'zen'")

.opencode/tool/github-triage.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,3 @@ Choose labels and assignee using the current triage policy and ownership rules.
44
Pick the most fitting labels for the issue and assign one owner.
55

66
If unsure, choose the team/section with the most overlap with the issue and assign a member from that team at random.
7-
8-
(Note: rekram1-node is on vacation, do not assign issues to him.)

AGENTS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,7 @@ const table = sqliteTable("session", {
122122
- Avoid mocks as much as possible
123123
- Test actual implementation, do not duplicate logic into tests
124124
- Tests cannot run from repo root (guard: `do-not-run-tests-from-root`); run from package dirs like `packages/opencode`.
125+
126+
## Type Checking
127+
128+
- Always run `bun typecheck` from package directories (e.g., `packages/opencode`), never `tsc` directly.

README.vi.md

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
<p align="center">
2+
<a href="https://opencode.ai">
3+
<picture>
4+
<source srcset="packages/console/app/src/asset/logo-ornate-dark.svg" media="(prefers-color-scheme: dark)">
5+
<source srcset="packages/console/app/src/asset/logo-ornate-light.svg" media="(prefers-color-scheme: light)">
6+
<img src="packages/console/app/src/asset/logo-ornate-light.svg" alt="OpenCode logo">
7+
</picture>
8+
</a>
9+
</p>
10+
<p align="center">Trợ lý lập trình AI mã nguồn mở.</p>
11+
<p align="center">
12+
<a href="https://opencode.ai/discord"><img alt="Discord" src="https://img.shields.io/discord/1391832426048651334?style=flat-square&label=discord" /></a>
13+
<a href="https://www.npmjs.com/package/opencode-ai"><img alt="npm" src="https://img.shields.io/npm/v/opencode-ai?style=flat-square" /></a>
14+
<a href="https://github.com/anomalyco/opencode/actions/workflows/publish.yml"><img alt="Build status" src="https://img.shields.io/github/actions/workflow/status/anomalyco/opencode/publish.yml?style=flat-square&branch=dev" /></a>
15+
</p>
16+
17+
<p align="center">
18+
<a href="README.md">English</a> |
19+
<a href="README.zh.md">简体中文</a> |
20+
<a href="README.zht.md">繁體中文</a> |
21+
<a href="README.ko.md">한국어</a> |
22+
<a href="README.de.md">Deutsch</a> |
23+
<a href="README.es.md">Español</a> |
24+
<a href="README.fr.md">Français</a> |
25+
<a href="README.it.md">Italiano</a> |
26+
<a href="README.da.md">Dansk</a> |
27+
<a href="README.ja.md">日本語</a> |
28+
<a href="README.pl.md">Polski</a> |
29+
<a href="README.ru.md">Русский</a> |
30+
<a href="README.bs.md">Bosanski</a> |
31+
<a href="README.ar.md">العربية</a> |
32+
<a href="README.no.md">Norsk</a> |
33+
<a href="README.br.md">Português (Brasil)</a> |
34+
<a href="README.th.md">ไทย</a> |
35+
<a href="README.tr.md">Türkçe</a> |
36+
<a href="README.uk.md">Українська</a> |
37+
<a href="README.bn.md">বাংলা</a> |
38+
<a href="README.gr.md">Ελληνικά</a> |
39+
<a href="README.vi.md">Tiếng Việt</a>
40+
</p>
41+
42+
[![OpenCode Terminal UI](packages/web/src/assets/lander/screenshot.png)](https://opencode.ai)
43+
44+
---
45+
46+
### Cài đặt
47+
48+
```bash
49+
# YOLO
50+
curl -fsSL https://opencode.ai/install | bash
51+
52+
# Các trình quản lý gói (Package managers)
53+
npm i -g opencode-ai@latest # hoặc bun/pnpm/yarn
54+
scoop install opencode # Windows
55+
choco install opencode # Windows
56+
brew install anomalyco/tap/opencode # macOS và Linux (khuyên dùng, luôn cập nhật)
57+
brew install opencode # macOS và Linux (công thức brew chính thức, ít cập nhật hơn)
58+
sudo pacman -S opencode # Arch Linux (Bản ổn định)
59+
paru -S opencode-bin # Arch Linux (Bản mới nhất từ AUR)
60+
mise use -g opencode # Mọi hệ điều hành
61+
nix run nixpkgs#opencode # hoặc github:anomalyco/opencode cho nhánh dev mới nhất
62+
```
63+
64+
> [!TIP]
65+
> Hãy xóa các phiên bản cũ hơn 0.1.x trước khi cài đặt.
66+
67+
### Ứng dụng Desktop (BETA)
68+
69+
OpenCode cũng có sẵn dưới dạng ứng dụng desktop. Tải trực tiếp từ [trang releases](https://github.com/anomalyco/opencode/releases) hoặc [opencode.ai/download](https://opencode.ai/download).
70+
71+
| Nền tảng | Tải xuống |
72+
| --------------------- | ------------------------------------- |
73+
| macOS (Apple Silicon) | `opencode-desktop-darwin-aarch64.dmg` |
74+
| macOS (Intel) | `opencode-desktop-darwin-x64.dmg` |
75+
| Windows | `opencode-desktop-windows-x64.exe` |
76+
| Linux | `.deb`, `.rpm`, hoặc AppImage |
77+
78+
```bash
79+
# macOS (Homebrew)
80+
brew install --cask opencode-desktop
81+
# Windows (Scoop)
82+
scoop bucket add extras; scoop install extras/opencode-desktop
83+
```
84+
85+
#### Thư mục cài đặt
86+
87+
Tập lệnh cài đặt tuân theo thứ tự ưu tiên sau cho đường dẫn cài đặt:
88+
89+
1. `$OPENCODE_INSTALL_DIR` - Thư mục cài đặt tùy chỉnh
90+
2. `$XDG_BIN_DIR` - Đường dẫn tuân thủ XDG Base Directory Specification
91+
3. `$HOME/bin` - Thư mục nhị phân tiêu chuẩn của người dùng (nếu tồn tại hoặc có thể tạo)
92+
4. `$HOME/.opencode/bin` - Mặc định dự phòng
93+
94+
```bash
95+
# Ví dụ
96+
OPENCODE_INSTALL_DIR=/usr/local/bin curl -fsSL https://opencode.ai/install | bash
97+
XDG_BIN_DIR=$HOME/.local/bin curl -fsSL https://opencode.ai/install | bash
98+
```
99+
100+
### Agents (Đại diện)
101+
102+
OpenCode bao gồm hai agent được tích hợp sẵn mà bạn có thể chuyển đổi bằng phím `Tab`.
103+
104+
- **build** - Agent mặc định, có toàn quyền truy cập cho công việc lập trình
105+
- **plan** - Agent chỉ đọc dùng để phân tích và khám phá mã nguồn
106+
- Mặc định từ chối việc chỉnh sửa tệp
107+
- Hỏi quyền trước khi chạy các lệnh bash
108+
- Lý tưởng để khám phá các codebase lạ hoặc lên kế hoạch thay đổi
109+
110+
Ngoài ra còn có một subagent **general** dùng cho các tìm kiếm phức tạp và tác vụ nhiều bước.
111+
Agent này được sử dụng nội bộ và có thể gọi bằng cách dùng `@general` trong tin nhắn.
112+
113+
Tìm hiểu thêm về [agents](https://opencode.ai/docs/agents).
114+
115+
### Tài liệu
116+
117+
Để biết thêm thông tin về cách cấu hình OpenCode, [**hãy truy cập tài liệu của chúng tôi**](https://opencode.ai/docs).
118+
119+
### Đóng góp
120+
121+
Nếu bạn muốn đóng góp cho OpenCode, vui lòng đọc [tài liệu hướng dẫn đóng góp](./CONTRIBUTING.md) trước khi gửi pull request.
122+
123+
### Xây dựng trên nền tảng OpenCode
124+
125+
Nếu bạn đang làm việc trên một dự án liên quan đến OpenCode và sử dụng "opencode" như một phần của tên dự án, ví dụ "opencode-dashboard" hoặc "opencode-mobile", vui lòng thêm một ghi chú vào README của bạn để làm rõ rằng dự án đó không được xây dựng bởi đội ngũ OpenCode và không liên kết với chúng tôi dưới bất kỳ hình thức nào.
126+
127+
### Các câu hỏi thường gặp (FAQ)
128+
129+
#### OpenCode khác biệt thế nào so với Claude Code?
130+
131+
Về mặt tính năng, nó rất giống Claude Code. Dưới đây là những điểm khác biệt chính:
132+
133+
- 100% mã nguồn mở
134+
- Không bị ràng buộc với bất kỳ nhà cung cấp nào. Mặc dù chúng tôi khuyên dùng các mô hình được cung cấp qua [OpenCode Zen](https://opencode.ai/zen), OpenCode có thể được sử dụng với Claude, OpenAI, Google, hoặc thậm chí các mô hình chạy cục bộ. Khi các mô hình phát triển, khoảng cách giữa chúng sẽ thu hẹp lại và giá cả sẽ giảm, vì vậy việc không phụ thuộc vào nhà cung cấp là rất quan trọng.
135+
- Hỗ trợ LSP ngay từ đầu
136+
- Tập trung vào TUI (Giao diện người dùng dòng lệnh). OpenCode được xây dựng bởi những người dùng neovim và đội ngũ tạo ra [terminal.shop](https://terminal.shop); chúng tôi sẽ đẩy giới hạn của những gì có thể làm được trên terminal lên mức tối đa.
137+
- Kiến trúc client/server. Chẳng hạn, điều này cho phép OpenCode chạy trên máy tính của bạn trong khi bạn điều khiển nó từ xa qua một ứng dụng di động, nghĩa là frontend TUI chỉ là một trong những client có thể dùng.
138+
139+
---
140+
141+
**Tham gia cộng đồng của chúng tôi** [Discord](https://discord.gg/opencode) | [X.com](https://x.com/opencode)

0 commit comments

Comments
 (0)