rird 1.0.200
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +27 -0
- package/Dockerfile +18 -0
- package/README.md +15 -0
- package/bin/opencode +336 -0
- package/bin/pty-wrapper.js +285 -0
- package/bunfig.toml +4 -0
- package/facebook_ads_library.png +0 -0
- package/nul`nif +0 -0
- package/package.json +111 -0
- package/parsers-config.ts +239 -0
- package/rird-1.0.199.tgz +0 -0
- package/script/build-windows.ts +54 -0
- package/script/build.ts +167 -0
- package/script/postinstall.mjs +544 -0
- package/script/publish-registries.ts +187 -0
- package/script/publish.ts +72 -0
- package/script/schema.ts +47 -0
- package/src/acp/README.md +164 -0
- package/src/acp/agent.ts +1063 -0
- package/src/acp/session.ts +101 -0
- package/src/acp/types.ts +22 -0
- package/src/agent/agent.ts +367 -0
- package/src/agent/generate.txt +75 -0
- package/src/agent/prompt/compaction.txt +12 -0
- package/src/agent/prompt/explore.txt +18 -0
- package/src/agent/prompt/summary.txt +10 -0
- package/src/agent/prompt/title.txt +36 -0
- package/src/auth/index.ts +70 -0
- package/src/bun/index.ts +114 -0
- package/src/bus/bus-event.ts +43 -0
- package/src/bus/global.ts +10 -0
- package/src/bus/index.ts +105 -0
- package/src/cli/bootstrap.ts +17 -0
- package/src/cli/cmd/acp.ts +88 -0
- package/src/cli/cmd/agent.ts +256 -0
- package/src/cli/cmd/auth.ts +391 -0
- package/src/cli/cmd/cmd.ts +7 -0
- package/src/cli/cmd/debug/config.ts +15 -0
- package/src/cli/cmd/debug/file.ts +91 -0
- package/src/cli/cmd/debug/index.ts +43 -0
- package/src/cli/cmd/debug/lsp.ts +48 -0
- package/src/cli/cmd/debug/ripgrep.ts +83 -0
- package/src/cli/cmd/debug/scrap.ts +15 -0
- package/src/cli/cmd/debug/skill.ts +15 -0
- package/src/cli/cmd/debug/snapshot.ts +48 -0
- package/src/cli/cmd/export.ts +88 -0
- package/src/cli/cmd/generate.ts +38 -0
- package/src/cli/cmd/github.ts +1400 -0
- package/src/cli/cmd/import.ts +98 -0
- package/src/cli/cmd/mcp.ts +654 -0
- package/src/cli/cmd/models.ts +77 -0
- package/src/cli/cmd/pr.ts +112 -0
- package/src/cli/cmd/run.ts +368 -0
- package/src/cli/cmd/serve.ts +31 -0
- package/src/cli/cmd/session.ts +106 -0
- package/src/cli/cmd/stats.ts +298 -0
- package/src/cli/cmd/tui/app.tsx +696 -0
- package/src/cli/cmd/tui/attach.ts +30 -0
- package/src/cli/cmd/tui/component/border.tsx +21 -0
- package/src/cli/cmd/tui/component/dialog-agent.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-command.tsx +124 -0
- package/src/cli/cmd/tui/component/dialog-mcp.tsx +86 -0
- package/src/cli/cmd/tui/component/dialog-model.tsx +245 -0
- package/src/cli/cmd/tui/component/dialog-provider.tsx +224 -0
- package/src/cli/cmd/tui/component/dialog-session-list.tsx +102 -0
- package/src/cli/cmd/tui/component/dialog-session-rename.tsx +31 -0
- package/src/cli/cmd/tui/component/dialog-stash.tsx +86 -0
- package/src/cli/cmd/tui/component/dialog-status.tsx +162 -0
- package/src/cli/cmd/tui/component/dialog-tag.tsx +44 -0
- package/src/cli/cmd/tui/component/dialog-theme-list.tsx +50 -0
- package/src/cli/cmd/tui/component/did-you-know.tsx +85 -0
- package/src/cli/cmd/tui/component/logo.tsx +35 -0
- package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +574 -0
- package/src/cli/cmd/tui/component/prompt/history.tsx +108 -0
- package/src/cli/cmd/tui/component/prompt/index.tsx +1090 -0
- package/src/cli/cmd/tui/component/prompt/stash.tsx +101 -0
- package/src/cli/cmd/tui/component/tips.ts +27 -0
- package/src/cli/cmd/tui/component/todo-item.tsx +32 -0
- package/src/cli/cmd/tui/context/args.tsx +14 -0
- package/src/cli/cmd/tui/context/directory.ts +13 -0
- package/src/cli/cmd/tui/context/exit.tsx +23 -0
- package/src/cli/cmd/tui/context/helper.tsx +25 -0
- package/src/cli/cmd/tui/context/keybind.tsx +101 -0
- package/src/cli/cmd/tui/context/kv.tsx +49 -0
- package/src/cli/cmd/tui/context/local.tsx +354 -0
- package/src/cli/cmd/tui/context/prompt.tsx +18 -0
- package/src/cli/cmd/tui/context/route.tsx +46 -0
- package/src/cli/cmd/tui/context/sdk.tsx +74 -0
- package/src/cli/cmd/tui/context/sync.tsx +372 -0
- package/src/cli/cmd/tui/context/theme/aura.json +69 -0
- package/src/cli/cmd/tui/context/theme/ayu.json +80 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +233 -0
- package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +233 -0
- package/src/cli/cmd/tui/context/theme/catppuccin.json +112 -0
- package/src/cli/cmd/tui/context/theme/cobalt2.json +228 -0
- package/src/cli/cmd/tui/context/theme/cursor.json +249 -0
- package/src/cli/cmd/tui/context/theme/dracula.json +219 -0
- package/src/cli/cmd/tui/context/theme/everforest.json +241 -0
- package/src/cli/cmd/tui/context/theme/flexoki.json +237 -0
- package/src/cli/cmd/tui/context/theme/github.json +233 -0
- package/src/cli/cmd/tui/context/theme/gruvbox.json +95 -0
- package/src/cli/cmd/tui/context/theme/kanagawa.json +77 -0
- package/src/cli/cmd/tui/context/theme/lucent-orng.json +227 -0
- package/src/cli/cmd/tui/context/theme/material.json +235 -0
- package/src/cli/cmd/tui/context/theme/matrix.json +77 -0
- package/src/cli/cmd/tui/context/theme/mercury.json +252 -0
- package/src/cli/cmd/tui/context/theme/monokai.json +221 -0
- package/src/cli/cmd/tui/context/theme/nightowl.json +221 -0
- package/src/cli/cmd/tui/context/theme/nord.json +223 -0
- package/src/cli/cmd/tui/context/theme/one-dark.json +84 -0
- package/src/cli/cmd/tui/context/theme/orng.json +245 -0
- package/src/cli/cmd/tui/context/theme/palenight.json +222 -0
- package/src/cli/cmd/tui/context/theme/rird.json +245 -0
- package/src/cli/cmd/tui/context/theme/rosepine.json +234 -0
- package/src/cli/cmd/tui/context/theme/solarized.json +223 -0
- package/src/cli/cmd/tui/context/theme/synthwave84.json +226 -0
- package/src/cli/cmd/tui/context/theme/tokyonight.json +243 -0
- package/src/cli/cmd/tui/context/theme/vercel.json +245 -0
- package/src/cli/cmd/tui/context/theme/vesper.json +218 -0
- package/src/cli/cmd/tui/context/theme/zenburn.json +223 -0
- package/src/cli/cmd/tui/context/theme.tsx +1109 -0
- package/src/cli/cmd/tui/event.ts +40 -0
- package/src/cli/cmd/tui/routes/home.tsx +138 -0
- package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +64 -0
- package/src/cli/cmd/tui/routes/session/dialog-message.tsx +109 -0
- package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +26 -0
- package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +47 -0
- package/src/cli/cmd/tui/routes/session/footer.tsx +88 -0
- package/src/cli/cmd/tui/routes/session/header.tsx +125 -0
- package/src/cli/cmd/tui/routes/session/index.tsx +1864 -0
- package/src/cli/cmd/tui/routes/session/sidebar.tsx +318 -0
- package/src/cli/cmd/tui/spawn.ts +60 -0
- package/src/cli/cmd/tui/thread.ts +142 -0
- package/src/cli/cmd/tui/ui/dialog-alert.tsx +57 -0
- package/src/cli/cmd/tui/ui/dialog-confirm.tsx +83 -0
- package/src/cli/cmd/tui/ui/dialog-help.tsx +38 -0
- package/src/cli/cmd/tui/ui/dialog-prompt.tsx +77 -0
- package/src/cli/cmd/tui/ui/dialog-select.tsx +332 -0
- package/src/cli/cmd/tui/ui/dialog.tsx +170 -0
- package/src/cli/cmd/tui/ui/spinner.ts +368 -0
- package/src/cli/cmd/tui/ui/toast.tsx +100 -0
- package/src/cli/cmd/tui/util/clipboard.ts +127 -0
- package/src/cli/cmd/tui/util/editor.ts +32 -0
- package/src/cli/cmd/tui/util/terminal.ts +114 -0
- package/src/cli/cmd/tui/worker.ts +63 -0
- package/src/cli/cmd/uninstall.ts +344 -0
- package/src/cli/cmd/upgrade.ts +100 -0
- package/src/cli/cmd/web.ts +84 -0
- package/src/cli/error.ts +56 -0
- package/src/cli/ui.ts +84 -0
- package/src/cli/upgrade.ts +25 -0
- package/src/command/index.ts +80 -0
- package/src/command/template/initialize.txt +10 -0
- package/src/command/template/review.txt +97 -0
- package/src/config/config.ts +995 -0
- package/src/config/markdown.ts +41 -0
- package/src/env/index.ts +26 -0
- package/src/file/ignore.ts +83 -0
- package/src/file/index.ts +328 -0
- package/src/file/ripgrep.ts +393 -0
- package/src/file/time.ts +64 -0
- package/src/file/watcher.ts +103 -0
- package/src/flag/flag.ts +46 -0
- package/src/format/formatter.ts +315 -0
- package/src/format/index.ts +137 -0
- package/src/global/index.ts +52 -0
- package/src/id/id.ts +73 -0
- package/src/ide/index.ts +76 -0
- package/src/index.ts +240 -0
- package/src/installation/index.ts +239 -0
- package/src/lsp/client.ts +229 -0
- package/src/lsp/index.ts +485 -0
- package/src/lsp/language.ts +116 -0
- package/src/lsp/server.ts +1895 -0
- package/src/mcp/auth.ts +135 -0
- package/src/mcp/index.ts +690 -0
- package/src/mcp/oauth-callback.ts +200 -0
- package/src/mcp/oauth-provider.ts +154 -0
- package/src/patch/index.ts +622 -0
- package/src/permission/index.ts +199 -0
- package/src/plugin/index.ts +91 -0
- package/src/project/bootstrap.ts +31 -0
- package/src/project/instance.ts +78 -0
- package/src/project/project.ts +221 -0
- package/src/project/state.ts +65 -0
- package/src/project/vcs.ts +76 -0
- package/src/provider/auth.ts +143 -0
- package/src/provider/models-macro.ts +11 -0
- package/src/provider/models.ts +106 -0
- package/src/provider/provider.ts +1071 -0
- package/src/provider/sdk/openai-compatible/src/README.md +5 -0
- package/src/provider/sdk/openai-compatible/src/index.ts +2 -0
- package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +100 -0
- package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +303 -0
- package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +22 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +18 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +22 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +207 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +1713 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +177 -0
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +1 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +88 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +128 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +115 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +65 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +104 -0
- package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +103 -0
- package/src/provider/transform.ts +455 -0
- package/src/pty/index.ts +231 -0
- package/src/security/guardrails.test.ts +341 -0
- package/src/security/guardrails.ts +558 -0
- package/src/security/index.ts +19 -0
- package/src/server/error.ts +36 -0
- package/src/server/project.ts +79 -0
- package/src/server/server.ts +2642 -0
- package/src/server/tui.ts +71 -0
- package/src/session/compaction.ts +223 -0
- package/src/session/index.ts +461 -0
- package/src/session/llm.ts +201 -0
- package/src/session/message-v2.ts +690 -0
- package/src/session/message.ts +189 -0
- package/src/session/processor.ts +409 -0
- package/src/session/prompt/act-switch.txt +5 -0
- package/src/session/prompt/anthropic-20250930.txt +166 -0
- package/src/session/prompt/anthropic.txt +85 -0
- package/src/session/prompt/anthropic_spoof.txt +1 -0
- package/src/session/prompt/beast.txt +103 -0
- package/src/session/prompt/codex.txt +304 -0
- package/src/session/prompt/copilot-gpt-5.txt +138 -0
- package/src/session/prompt/gemini.txt +85 -0
- package/src/session/prompt/max-steps.txt +16 -0
- package/src/session/prompt/plan-reminder-anthropic.txt +35 -0
- package/src/session/prompt/plan.txt +24 -0
- package/src/session/prompt/polaris.txt +84 -0
- package/src/session/prompt/qwen.txt +106 -0
- package/src/session/prompt.ts +1509 -0
- package/src/session/retry.ts +86 -0
- package/src/session/revert.ts +108 -0
- package/src/session/sensitive-filter.test.ts +327 -0
- package/src/session/sensitive-filter.ts +466 -0
- package/src/session/status.ts +76 -0
- package/src/session/summary.ts +194 -0
- package/src/session/system.ts +120 -0
- package/src/session/todo.ts +37 -0
- package/src/share/share-next.ts +194 -0
- package/src/share/share.ts +87 -0
- package/src/shell/shell.ts +67 -0
- package/src/skill/index.ts +1 -0
- package/src/skill/skill.ts +83 -0
- package/src/snapshot/index.ts +197 -0
- package/src/storage/storage.ts +226 -0
- package/src/tests/agent.test.ts +308 -0
- package/src/tests/build-guards.test.ts +267 -0
- package/src/tests/config.test.ts +664 -0
- package/src/tests/tool-registry.test.ts +589 -0
- package/src/tool/bash.ts +317 -0
- package/src/tool/bash.txt +158 -0
- package/src/tool/batch.ts +175 -0
- package/src/tool/batch.txt +24 -0
- package/src/tool/codesearch.ts +168 -0
- package/src/tool/codesearch.txt +12 -0
- package/src/tool/edit.ts +675 -0
- package/src/tool/edit.txt +10 -0
- package/src/tool/glob.ts +65 -0
- package/src/tool/glob.txt +6 -0
- package/src/tool/grep.ts +121 -0
- package/src/tool/grep.txt +8 -0
- package/src/tool/invalid.ts +17 -0
- package/src/tool/ls.ts +110 -0
- package/src/tool/ls.txt +1 -0
- package/src/tool/lsp-diagnostics.ts +26 -0
- package/src/tool/lsp-diagnostics.txt +1 -0
- package/src/tool/lsp-hover.ts +31 -0
- package/src/tool/lsp-hover.txt +1 -0
- package/src/tool/lsp.ts +87 -0
- package/src/tool/lsp.txt +19 -0
- package/src/tool/multiedit.ts +46 -0
- package/src/tool/multiedit.txt +41 -0
- package/src/tool/patch.ts +233 -0
- package/src/tool/patch.txt +1 -0
- package/src/tool/read.ts +219 -0
- package/src/tool/read.txt +12 -0
- package/src/tool/registry.ts +162 -0
- package/src/tool/skill.ts +100 -0
- package/src/tool/task.ts +136 -0
- package/src/tool/task.txt +51 -0
- package/src/tool/todo.ts +39 -0
- package/src/tool/todoread.txt +14 -0
- package/src/tool/todowrite.txt +167 -0
- package/src/tool/tool.ts +71 -0
- package/src/tool/webfetch.ts +198 -0
- package/src/tool/webfetch.txt +13 -0
- package/src/tool/websearch.ts +180 -0
- package/src/tool/websearch.txt +11 -0
- package/src/tool/write.ts +110 -0
- package/src/tool/write.txt +8 -0
- package/src/util/archive.ts +16 -0
- package/src/util/color.ts +19 -0
- package/src/util/context.ts +25 -0
- package/src/util/defer.ts +12 -0
- package/src/util/eventloop.ts +20 -0
- package/src/util/filesystem.ts +83 -0
- package/src/util/fn.ts +11 -0
- package/src/util/iife.ts +3 -0
- package/src/util/keybind.ts +102 -0
- package/src/util/lazy.ts +11 -0
- package/src/util/license.ts +325 -0
- package/src/util/locale.ts +81 -0
- package/src/util/lock.ts +98 -0
- package/src/util/log.ts +180 -0
- package/src/util/queue.ts +32 -0
- package/src/util/rpc.ts +42 -0
- package/src/util/scrap.ts +10 -0
- package/src/util/signal.ts +12 -0
- package/src/util/timeout.ts +14 -0
- package/src/util/token.ts +7 -0
- package/src/util/wildcard.ts +54 -0
- package/sst-env.d.ts +9 -0
- package/test/agent/agent.test.ts +146 -0
- package/test/bun.test.ts +53 -0
- package/test/cli/github-remote.test.ts +80 -0
- package/test/config/agent-color.test.ts +66 -0
- package/test/config/config.test.ts +535 -0
- package/test/config/markdown.test.ts +89 -0
- package/test/file/ignore.test.ts +10 -0
- package/test/fixture/fixture.ts +36 -0
- package/test/fixture/lsp/fake-lsp-server.js +77 -0
- package/test/ide/ide.test.ts +82 -0
- package/test/keybind.test.ts +421 -0
- package/test/lsp/client.test.ts +95 -0
- package/test/mcp/headers.test.ts +153 -0
- package/test/patch/patch.test.ts +348 -0
- package/test/preload.ts +57 -0
- package/test/project/project.test.ts +72 -0
- package/test/provider/provider.test.ts +1809 -0
- package/test/provider/transform.test.ts +411 -0
- package/test/session/retry.test.ts +111 -0
- package/test/session/session.test.ts +71 -0
- package/test/skill/skill.test.ts +131 -0
- package/test/snapshot/snapshot.test.ts +939 -0
- package/test/tool/__snapshots__/tool.test.ts.snap +9 -0
- package/test/tool/bash.test.ts +434 -0
- package/test/tool/grep.test.ts +108 -0
- package/test/tool/patch.test.ts +259 -0
- package/test/tool/read.test.ts +42 -0
- package/test/util/iife.test.ts +36 -0
- package/test/util/lazy.test.ts +50 -0
- package/test/util/timeout.test.ts +21 -0
- package/test/util/wildcard.test.ts +55 -0
- package/tsconfig.json +16 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { $ } from "bun"
|
|
3
|
+
import { Script } from "@opencode-ai/script"
|
|
4
|
+
|
|
5
|
+
if (!Script.preview) {
|
|
6
|
+
// Calculate SHA values
|
|
7
|
+
const arm64Sha = await $`sha256sum ./dist/opencode-linux-arm64.tar.gz | cut -d' ' -f1`.text().then((x) => x.trim())
|
|
8
|
+
const x64Sha = await $`sha256sum ./dist/opencode-linux-x64.tar.gz | cut -d' ' -f1`.text().then((x) => x.trim())
|
|
9
|
+
const macX64Sha = await $`sha256sum ./dist/opencode-darwin-x64.zip | cut -d' ' -f1`.text().then((x) => x.trim())
|
|
10
|
+
const macArm64Sha = await $`sha256sum ./dist/opencode-darwin-arm64.zip | cut -d' ' -f1`.text().then((x) => x.trim())
|
|
11
|
+
|
|
12
|
+
const [pkgver, _subver = ""] = Script.version.split(/(-.*)/, 2)
|
|
13
|
+
|
|
14
|
+
// arch
|
|
15
|
+
const binaryPkgbuild = [
|
|
16
|
+
"# Maintainer: dax",
|
|
17
|
+
"# Maintainer: adam",
|
|
18
|
+
"",
|
|
19
|
+
"pkgname='opencode-bin'",
|
|
20
|
+
`pkgver=${pkgver}`,
|
|
21
|
+
`_subver=${_subver}`,
|
|
22
|
+
"options=('!debug' '!strip')",
|
|
23
|
+
"pkgrel=1",
|
|
24
|
+
"pkgdesc='The AI Browser Agent built for the terminal.'",
|
|
25
|
+
"url='https://github.com/sst/opencode'",
|
|
26
|
+
"arch=('aarch64' 'x86_64')",
|
|
27
|
+
"license=('MIT')",
|
|
28
|
+
"provides=('opencode')",
|
|
29
|
+
"conflicts=('opencode')",
|
|
30
|
+
"depends=('ripgrep')",
|
|
31
|
+
"",
|
|
32
|
+
`source_aarch64=("\${pkgname}_\${pkgver}_aarch64.tar.gz::https://github.com/sst/opencode/releases/download/v\${pkgver}\${_subver}/opencode-linux-arm64.tar.gz")`,
|
|
33
|
+
`sha256sums_aarch64=('${arm64Sha}')`,
|
|
34
|
+
|
|
35
|
+
`source_x86_64=("\${pkgname}_\${pkgver}_x86_64.tar.gz::https://github.com/sst/opencode/releases/download/v\${pkgver}\${_subver}/opencode-linux-x64.tar.gz")`,
|
|
36
|
+
`sha256sums_x86_64=('${x64Sha}')`,
|
|
37
|
+
"",
|
|
38
|
+
"package() {",
|
|
39
|
+
' install -Dm755 ./opencode "${pkgdir}/usr/bin/opencode"',
|
|
40
|
+
"}",
|
|
41
|
+
"",
|
|
42
|
+
].join("\n")
|
|
43
|
+
|
|
44
|
+
// Source-based PKGBUILD for opencode
|
|
45
|
+
const sourcePkgbuild = [
|
|
46
|
+
"# Maintainer: dax",
|
|
47
|
+
"# Maintainer: adam",
|
|
48
|
+
"",
|
|
49
|
+
"pkgname='opencode'",
|
|
50
|
+
`pkgver=${pkgver}`,
|
|
51
|
+
`_subver=${_subver}`,
|
|
52
|
+
"options=('!debug' '!strip')",
|
|
53
|
+
"pkgrel=1",
|
|
54
|
+
"pkgdesc='The AI Browser Agent built for the terminal.'",
|
|
55
|
+
"url='https://github.com/sst/opencode'",
|
|
56
|
+
"arch=('aarch64' 'x86_64')",
|
|
57
|
+
"license=('MIT')",
|
|
58
|
+
"provides=('opencode')",
|
|
59
|
+
"conflicts=('opencode-bin')",
|
|
60
|
+
"depends=('ripgrep')",
|
|
61
|
+
"makedepends=('git' 'bun-bin' 'go')",
|
|
62
|
+
"",
|
|
63
|
+
`source=("opencode-\${pkgver}.tar.gz::https://github.com/sst/opencode/archive/v\${pkgver}\${_subver}.tar.gz")`,
|
|
64
|
+
`sha256sums=('SKIP')`,
|
|
65
|
+
"",
|
|
66
|
+
"build() {",
|
|
67
|
+
` cd "opencode-\${pkgver}"`,
|
|
68
|
+
` bun install`,
|
|
69
|
+
" cd ./packages/opencode",
|
|
70
|
+
` OPENCODE_CHANNEL=latest OPENCODE_VERSION=${pkgver} bun run ./script/build.ts --single`,
|
|
71
|
+
"}",
|
|
72
|
+
"",
|
|
73
|
+
"package() {",
|
|
74
|
+
` cd "opencode-\${pkgver}/packages/opencode"`,
|
|
75
|
+
' mkdir -p "${pkgdir}/usr/bin"',
|
|
76
|
+
' target_arch="x64"',
|
|
77
|
+
' case "$CARCH" in',
|
|
78
|
+
' x86_64) target_arch="x64" ;;',
|
|
79
|
+
' aarch64) target_arch="arm64" ;;',
|
|
80
|
+
' *) printf "unsupported architecture: %s\\n" "$CARCH" >&2 ; return 1 ;;',
|
|
81
|
+
" esac",
|
|
82
|
+
' libc=""',
|
|
83
|
+
" if command -v ldd >/dev/null 2>&1; then",
|
|
84
|
+
" if ldd --version 2>&1 | grep -qi musl; then",
|
|
85
|
+
' libc="-musl"',
|
|
86
|
+
" fi",
|
|
87
|
+
" fi",
|
|
88
|
+
' if [ -z "$libc" ] && ls /lib/ld-musl-* >/dev/null 2>&1; then',
|
|
89
|
+
' libc="-musl"',
|
|
90
|
+
" fi",
|
|
91
|
+
' base=""',
|
|
92
|
+
' if [ "$target_arch" = "x64" ]; then',
|
|
93
|
+
" if ! grep -qi avx2 /proc/cpuinfo 2>/dev/null; then",
|
|
94
|
+
' base="-baseline"',
|
|
95
|
+
" fi",
|
|
96
|
+
" fi",
|
|
97
|
+
' bin="dist/opencode-linux-${target_arch}${base}${libc}/bin/opencode"',
|
|
98
|
+
' if [ ! -f "$bin" ]; then',
|
|
99
|
+
' printf "unable to find binary for %s%s%s\\n" "$target_arch" "$base" "$libc" >&2',
|
|
100
|
+
" return 1",
|
|
101
|
+
" fi",
|
|
102
|
+
' install -Dm755 "$bin" "${pkgdir}/usr/bin/opencode"',
|
|
103
|
+
"}",
|
|
104
|
+
"",
|
|
105
|
+
].join("\n")
|
|
106
|
+
|
|
107
|
+
for (const [pkg, pkgbuild] of [
|
|
108
|
+
["opencode-bin", binaryPkgbuild],
|
|
109
|
+
["opencode", sourcePkgbuild],
|
|
110
|
+
]) {
|
|
111
|
+
for (let i = 0; i < 30; i++) {
|
|
112
|
+
try {
|
|
113
|
+
await $`rm -rf ./dist/aur-${pkg}`
|
|
114
|
+
await $`git clone ssh://aur@aur.archlinux.org/${pkg}.git ./dist/aur-${pkg}`
|
|
115
|
+
await $`cd ./dist/aur-${pkg} && git checkout master`
|
|
116
|
+
await Bun.file(`./dist/aur-${pkg}/PKGBUILD`).write(pkgbuild)
|
|
117
|
+
await $`cd ./dist/aur-${pkg} && makepkg --printsrcinfo > .SRCINFO`
|
|
118
|
+
await $`cd ./dist/aur-${pkg} && git add PKGBUILD .SRCINFO`
|
|
119
|
+
await $`cd ./dist/aur-${pkg} && git commit -m "Update to v${Script.version}"`
|
|
120
|
+
await $`cd ./dist/aur-${pkg} && git push`
|
|
121
|
+
break
|
|
122
|
+
} catch (e) {
|
|
123
|
+
continue
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Homebrew formula
|
|
129
|
+
const homebrewFormula = [
|
|
130
|
+
"# typed: false",
|
|
131
|
+
"# frozen_string_literal: true",
|
|
132
|
+
"",
|
|
133
|
+
"# This file was generated by GoReleaser. DO NOT EDIT.",
|
|
134
|
+
"class Opencode < Formula",
|
|
135
|
+
` desc "The AI Browser Agent built for the terminal."`,
|
|
136
|
+
` homepage "https://github.com/sst/opencode"`,
|
|
137
|
+
` version "${Script.version.split("-")[0]}"`,
|
|
138
|
+
"",
|
|
139
|
+
` depends_on "ripgrep"`,
|
|
140
|
+
"",
|
|
141
|
+
" on_macos do",
|
|
142
|
+
" if Hardware::CPU.intel?",
|
|
143
|
+
` url "https://github.com/sst/opencode/releases/download/v${Script.version}/opencode-darwin-x64.zip"`,
|
|
144
|
+
` sha256 "${macX64Sha}"`,
|
|
145
|
+
"",
|
|
146
|
+
" def install",
|
|
147
|
+
' bin.install "opencode"',
|
|
148
|
+
" end",
|
|
149
|
+
" end",
|
|
150
|
+
" if Hardware::CPU.arm?",
|
|
151
|
+
` url "https://github.com/sst/opencode/releases/download/v${Script.version}/opencode-darwin-arm64.zip"`,
|
|
152
|
+
` sha256 "${macArm64Sha}"`,
|
|
153
|
+
"",
|
|
154
|
+
" def install",
|
|
155
|
+
' bin.install "opencode"',
|
|
156
|
+
" end",
|
|
157
|
+
" end",
|
|
158
|
+
" end",
|
|
159
|
+
"",
|
|
160
|
+
" on_linux do",
|
|
161
|
+
" if Hardware::CPU.intel? and Hardware::CPU.is_64_bit?",
|
|
162
|
+
` url "https://github.com/sst/opencode/releases/download/v${Script.version}/opencode-linux-x64.tar.gz"`,
|
|
163
|
+
` sha256 "${x64Sha}"`,
|
|
164
|
+
" def install",
|
|
165
|
+
' bin.install "opencode"',
|
|
166
|
+
" end",
|
|
167
|
+
" end",
|
|
168
|
+
" if Hardware::CPU.arm? and Hardware::CPU.is_64_bit?",
|
|
169
|
+
` url "https://github.com/sst/opencode/releases/download/v${Script.version}/opencode-linux-arm64.tar.gz"`,
|
|
170
|
+
` sha256 "${arm64Sha}"`,
|
|
171
|
+
" def install",
|
|
172
|
+
' bin.install "opencode"',
|
|
173
|
+
" end",
|
|
174
|
+
" end",
|
|
175
|
+
" end",
|
|
176
|
+
"end",
|
|
177
|
+
"",
|
|
178
|
+
"",
|
|
179
|
+
].join("\n")
|
|
180
|
+
|
|
181
|
+
await $`rm -rf ./dist/homebrew-tap`
|
|
182
|
+
await $`git clone https://${process.env["GITHUB_TOKEN"]}@github.com/sst/homebrew-tap.git ./dist/homebrew-tap`
|
|
183
|
+
await Bun.file("./dist/homebrew-tap/opencode.rb").write(homebrewFormula)
|
|
184
|
+
await $`cd ./dist/homebrew-tap && git add opencode.rb`
|
|
185
|
+
await $`cd ./dist/homebrew-tap && git commit -m "Update to v${Script.version}"`
|
|
186
|
+
await $`cd ./dist/homebrew-tap && git push`
|
|
187
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { $ } from "bun"
|
|
3
|
+
import pkg from "../package.json"
|
|
4
|
+
import { Script } from "@opencode-ai/script"
|
|
5
|
+
import { fileURLToPath } from "url"
|
|
6
|
+
|
|
7
|
+
const dir = fileURLToPath(new URL("..", import.meta.url))
|
|
8
|
+
process.chdir(dir)
|
|
9
|
+
|
|
10
|
+
const { binaries } = await import("./build.ts")
|
|
11
|
+
{
|
|
12
|
+
const name = `${pkg.name}-${process.platform}-${process.arch}`
|
|
13
|
+
console.log(`smoke test: running dist/${name}/bin/opencode --version`)
|
|
14
|
+
await $`./dist/${name}/bin/opencode --version`
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
await $`mkdir -p ./dist/${pkg.name}`
|
|
18
|
+
await $`cp -r ./bin ./dist/${pkg.name}/bin`
|
|
19
|
+
// Rename bin/opencode to bin/rird so the npm bin config works
|
|
20
|
+
await $`mv ./dist/${pkg.name}/bin/opencode ./dist/${pkg.name}/bin/${pkg.name}`
|
|
21
|
+
await $`cp ./script/postinstall.mjs ./dist/${pkg.name}/postinstall.mjs`
|
|
22
|
+
|
|
23
|
+
await Bun.file(`./dist/${pkg.name}/package.json`).write(
|
|
24
|
+
JSON.stringify(
|
|
25
|
+
{
|
|
26
|
+
name: pkg.name + "-ai",
|
|
27
|
+
bin: {
|
|
28
|
+
[pkg.name]: `./bin/${pkg.name}`,
|
|
29
|
+
},
|
|
30
|
+
scripts: {
|
|
31
|
+
postinstall: "bun ./postinstall.mjs || node ./postinstall.mjs",
|
|
32
|
+
},
|
|
33
|
+
version: Script.version,
|
|
34
|
+
optionalDependencies: binaries,
|
|
35
|
+
},
|
|
36
|
+
null,
|
|
37
|
+
2,
|
|
38
|
+
),
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
const tags = [Script.channel]
|
|
42
|
+
|
|
43
|
+
const tasks = Object.entries(binaries).map(async ([name]) => {
|
|
44
|
+
if (process.platform !== "win32") {
|
|
45
|
+
await $`chmod -R 755 .`.cwd(`./dist/${name}`)
|
|
46
|
+
}
|
|
47
|
+
await $`bun pm pack`.cwd(`./dist/${name}`)
|
|
48
|
+
for (const tag of tags) {
|
|
49
|
+
await $`npm publish *.tgz --access public --tag ${tag}`.cwd(`./dist/${name}`)
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
await Promise.all(tasks)
|
|
53
|
+
for (const tag of tags) {
|
|
54
|
+
await $`cd ./dist/${pkg.name} && bun pm pack && npm publish *.tgz --access public --tag ${tag}`
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (!Script.preview) {
|
|
58
|
+
// Create archives for GitHub release
|
|
59
|
+
for (const key of Object.keys(binaries)) {
|
|
60
|
+
if (key.includes("linux")) {
|
|
61
|
+
await $`tar -czf ../../${key}.tar.gz *`.cwd(`dist/${key}/bin`)
|
|
62
|
+
} else {
|
|
63
|
+
await $`zip -r ../../${key}.zip *`.cwd(`dist/${key}/bin`)
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const image = "ghcr.io/sst/opencode"
|
|
68
|
+
const platforms = "linux/amd64,linux/arm64"
|
|
69
|
+
const tags = [`${image}:${Script.version}`, `${image}:latest`]
|
|
70
|
+
const tagFlags = tags.flatMap((t) => ["-t", t])
|
|
71
|
+
await $`docker buildx build --platform ${platforms} ${tagFlags} --push .`
|
|
72
|
+
}
|
package/script/schema.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
|
|
3
|
+
import { z } from "zod"
|
|
4
|
+
import { Config } from "../src/config/config"
|
|
5
|
+
|
|
6
|
+
const file = process.argv[2]
|
|
7
|
+
console.log(file)
|
|
8
|
+
|
|
9
|
+
const result = z.toJSONSchema(Config.Info, {
|
|
10
|
+
io: "input", // Generate input shape (treats optional().default() as not required)
|
|
11
|
+
/**
|
|
12
|
+
* We'll use the `default` values of the field as the only value in `examples`.
|
|
13
|
+
* This will ensure no docs are needed to be read, as the configuration is
|
|
14
|
+
* self-documenting.
|
|
15
|
+
*
|
|
16
|
+
* See https://json-schema.org/draft/2020-12/draft-bhutton-json-schema-validation-00#rfc.section.9.5
|
|
17
|
+
*/
|
|
18
|
+
override(ctx) {
|
|
19
|
+
const schema = ctx.jsonSchema
|
|
20
|
+
|
|
21
|
+
// Preserve strictness: set additionalProperties: false for objects
|
|
22
|
+
if (schema && typeof schema === "object" && schema.type === "object" && schema.additionalProperties === undefined) {
|
|
23
|
+
schema.additionalProperties = false
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Add examples and default descriptions for string fields with defaults
|
|
27
|
+
if (schema && typeof schema === "object" && "type" in schema && schema.type === "string" && schema?.default) {
|
|
28
|
+
if (!schema.examples) {
|
|
29
|
+
schema.examples = [schema.default]
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
schema.description = [schema.description || "", `default: \`${schema.default}\``]
|
|
33
|
+
.filter(Boolean)
|
|
34
|
+
.join("\n\n")
|
|
35
|
+
.trim()
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
}) as Record<string, unknown> & {
|
|
39
|
+
allowComments?: boolean
|
|
40
|
+
allowTrailingCommas?: boolean
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// used for json lsps since config supports jsonc
|
|
44
|
+
result.allowComments = true
|
|
45
|
+
result.allowTrailingCommas = true
|
|
46
|
+
|
|
47
|
+
await Bun.write(file, JSON.stringify(result, null, 2))
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# ACP (Agent Client Protocol) Implementation
|
|
2
|
+
|
|
3
|
+
This directory contains a clean, protocol-compliant implementation of the [Agent Client Protocol](https://agentclientprotocol.com/) for RIRD.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
The implementation follows a clean separation of concerns:
|
|
8
|
+
|
|
9
|
+
### Core Components
|
|
10
|
+
|
|
11
|
+
- **`agent.ts`** - Implements the `Agent` interface from `@agentclientprotocol/sdk`
|
|
12
|
+
- Handles initialization and capability negotiation
|
|
13
|
+
- Manages session lifecycle (`session/new`, `session/load`)
|
|
14
|
+
- Processes prompts and returns responses
|
|
15
|
+
- Properly implements ACP protocol v1
|
|
16
|
+
|
|
17
|
+
- **`client.ts`** - Implements the `Client` interface for client-side capabilities
|
|
18
|
+
- File operations (`readTextFile`, `writeTextFile`)
|
|
19
|
+
- Permission requests (auto-approves for now)
|
|
20
|
+
- Terminal support (stub implementation)
|
|
21
|
+
|
|
22
|
+
- **`session.ts`** - Session state management
|
|
23
|
+
- Creates and tracks ACP sessions
|
|
24
|
+
- Maps ACP sessions to internal RIRD sessions
|
|
25
|
+
- Maintains working directory context
|
|
26
|
+
- Handles MCP server configurations
|
|
27
|
+
|
|
28
|
+
- **`server.ts`** - ACP server startup and lifecycle
|
|
29
|
+
- Sets up JSON-RPC over stdio using the official library
|
|
30
|
+
- Manages graceful shutdown on SIGTERM/SIGINT
|
|
31
|
+
- Provides Instance context for the agent
|
|
32
|
+
|
|
33
|
+
- **`types.ts`** - Type definitions for internal use
|
|
34
|
+
|
|
35
|
+
## Usage
|
|
36
|
+
|
|
37
|
+
### Command Line
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
# Start the ACP server in the current directory
|
|
41
|
+
rird acp
|
|
42
|
+
|
|
43
|
+
# Start in a specific directory
|
|
44
|
+
rird acp --cwd /path/to/project
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Programmatic
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import { ACPServer } from "./acp/server"
|
|
51
|
+
|
|
52
|
+
await ACPServer.start()
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Integration with Zed
|
|
56
|
+
|
|
57
|
+
Add to your Zed configuration (`~/.config/zed/settings.json`):
|
|
58
|
+
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"agent_servers": {
|
|
62
|
+
"RIRD": {
|
|
63
|
+
"command": "rird",
|
|
64
|
+
"args": ["acp"]
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Protocol Compliance
|
|
71
|
+
|
|
72
|
+
This implementation follows the ACP specification v1:
|
|
73
|
+
|
|
74
|
+
✅ **Initialization**
|
|
75
|
+
|
|
76
|
+
- Proper `initialize` request/response with protocol version negotiation
|
|
77
|
+
- Capability advertisement (`agentCapabilities`)
|
|
78
|
+
- Authentication support (stub)
|
|
79
|
+
|
|
80
|
+
✅ **Session Management**
|
|
81
|
+
|
|
82
|
+
- `session/new` - Create new conversation sessions
|
|
83
|
+
- `session/load` - Resume existing sessions (basic support)
|
|
84
|
+
- Working directory context (`cwd`)
|
|
85
|
+
- MCP server configuration support
|
|
86
|
+
|
|
87
|
+
✅ **Prompting**
|
|
88
|
+
|
|
89
|
+
- `session/prompt` - Process user messages
|
|
90
|
+
- Content block handling (text, resources)
|
|
91
|
+
- Response with stop reasons
|
|
92
|
+
|
|
93
|
+
✅ **Client Capabilities**
|
|
94
|
+
|
|
95
|
+
- File read/write operations
|
|
96
|
+
- Permission requests
|
|
97
|
+
- Terminal support (stub for future)
|
|
98
|
+
|
|
99
|
+
## Current Limitations
|
|
100
|
+
|
|
101
|
+
### Not Yet Implemented
|
|
102
|
+
|
|
103
|
+
1. **Streaming Responses** - Currently returns complete responses instead of streaming via `session/update` notifications
|
|
104
|
+
2. **Tool Call Reporting** - Doesn't report tool execution progress
|
|
105
|
+
3. **Session Modes** - No mode switching support yet
|
|
106
|
+
4. **Authentication** - No actual auth implementation
|
|
107
|
+
5. **Terminal Support** - Placeholder only
|
|
108
|
+
6. **Session Persistence** - `session/load` doesn't restore actual conversation history
|
|
109
|
+
|
|
110
|
+
### Future Enhancements
|
|
111
|
+
|
|
112
|
+
- **Real-time Streaming**: Implement `session/update` notifications for progressive responses
|
|
113
|
+
- **Tool Call Visibility**: Report tool executions as they happen
|
|
114
|
+
- **Session Persistence**: Save and restore full conversation history
|
|
115
|
+
- **Mode Support**: Implement different operational modes (ask, code, etc.)
|
|
116
|
+
- **Enhanced Permissions**: More sophisticated permission handling
|
|
117
|
+
- **Terminal Integration**: Full terminal support via RIRD's bash tool
|
|
118
|
+
|
|
119
|
+
## Testing
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# Run ACP tests
|
|
123
|
+
bun test test/acp.test.ts
|
|
124
|
+
|
|
125
|
+
# Test manually with stdio
|
|
126
|
+
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":1}}' | rird acp
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Design Decisions
|
|
130
|
+
|
|
131
|
+
### Why the Official Library?
|
|
132
|
+
|
|
133
|
+
We use `@agentclientprotocol/sdk` instead of implementing JSON-RPC ourselves because:
|
|
134
|
+
|
|
135
|
+
- Ensures protocol compliance
|
|
136
|
+
- Handles edge cases and future protocol versions
|
|
137
|
+
- Reduces maintenance burden
|
|
138
|
+
- Works with other ACP clients automatically
|
|
139
|
+
|
|
140
|
+
### Clean Architecture
|
|
141
|
+
|
|
142
|
+
Each component has a single responsibility:
|
|
143
|
+
|
|
144
|
+
- **Agent** = Protocol interface
|
|
145
|
+
- **Client** = Client-side operations
|
|
146
|
+
- **Session** = State management
|
|
147
|
+
- **Server** = Lifecycle and I/O
|
|
148
|
+
|
|
149
|
+
This makes the codebase maintainable and testable.
|
|
150
|
+
|
|
151
|
+
### Mapping to RIRD
|
|
152
|
+
|
|
153
|
+
ACP sessions map cleanly to RIRD's internal session model:
|
|
154
|
+
|
|
155
|
+
- ACP `session/new` → creates internal Session
|
|
156
|
+
- ACP `session/prompt` → uses SessionPrompt.prompt()
|
|
157
|
+
- Working directory context preserved per-session
|
|
158
|
+
- Tool execution uses existing ToolRegistry
|
|
159
|
+
|
|
160
|
+
## References
|
|
161
|
+
|
|
162
|
+
- [ACP Specification](https://agentclientprotocol.com/)
|
|
163
|
+
- [TypeScript Library](https://github.com/agentclientprotocol/typescript-sdk)
|
|
164
|
+
- [Protocol Examples](https://github.com/agentclientprotocol/typescript-sdk/tree/main/src/examples)
|