onlycode 1.18.0 → 1.20.0
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/bin/{opencode.cjs → onlycode.cjs} +8 -42
- package/package.json +12 -147
- package/src/account/account.ts +0 -463
- package/src/account/repo.ts +0 -173
- package/src/account/schema.ts +0 -99
- package/src/account/url.ts +0 -8
- package/src/acp/agent.ts +0 -95
- package/src/acp/config-option.ts +0 -203
- package/src/acp/content.ts +0 -250
- package/src/acp/directory.ts +0 -210
- package/src/acp/error.ts +0 -90
- package/src/acp/event.ts +0 -342
- package/src/acp/permission.ts +0 -124
- package/src/acp/profile.ts +0 -42
- package/src/acp/service.ts +0 -1048
- package/src/acp/session.ts +0 -231
- package/src/acp/tool.ts +0 -367
- package/src/acp/usage.ts +0 -232
- package/src/agent/agent.ts +0 -459
- package/src/agent/generate.txt +0 -75
- package/src/agent/prompt/compaction.txt +0 -9
- package/src/agent/prompt/explore.txt +0 -18
- package/src/agent/prompt/summary.txt +0 -11
- package/src/agent/prompt/title.txt +0 -44
- package/src/agent/subagent-permissions.ts +0 -27
- package/src/audio.d.ts +0 -14
- package/src/auth/index.ts +0 -99
- package/src/background/job.ts +0 -39
- package/src/bus/global.ts +0 -22
- package/src/cli/bootstrap.ts +0 -11
- package/src/cli/cmd/account.ts +0 -264
- package/src/cli/cmd/acp.ts +0 -73
- package/src/cli/cmd/agent.ts +0 -259
- package/src/cli/cmd/attach.ts +0 -97
- package/src/cli/cmd/cmd.ts +0 -7
- package/src/cli/cmd/db.ts +0 -62
- package/src/cli/cmd/debug/agent.handler.ts +0 -193
- package/src/cli/cmd/debug/agent.ts +0 -27
- package/src/cli/cmd/debug/config.ts +0 -14
- package/src/cli/cmd/debug/file.ts +0 -73
- package/src/cli/cmd/debug/index.ts +0 -87
- package/src/cli/cmd/debug/lsp.ts +0 -50
- package/src/cli/cmd/debug/ripgrep.ts +0 -79
- package/src/cli/cmd/debug/scrap.ts +0 -15
- package/src/cli/cmd/debug/skill.ts +0 -15
- package/src/cli/cmd/debug/snapshot.ts +0 -50
- package/src/cli/cmd/debug/startup.ts +0 -11
- package/src/cli/cmd/debug/v2.ts +0 -44
- package/src/cli/cmd/export.ts +0 -292
- package/src/cli/cmd/generate.ts +0 -54
- package/src/cli/cmd/github.handler.ts +0 -1593
- package/src/cli/cmd/github.shared.ts +0 -30
- package/src/cli/cmd/github.ts +0 -42
- package/src/cli/cmd/import.ts +0 -224
- package/src/cli/cmd/mcp.ts +0 -849
- package/src/cli/cmd/models.ts +0 -66
- package/src/cli/cmd/plug.ts +0 -230
- package/src/cli/cmd/pr.ts +0 -115
- package/src/cli/cmd/prompt-display.ts +0 -1
- package/src/cli/cmd/providers.ts +0 -534
- package/src/cli/cmd/run/demo.ts +0 -1274
- package/src/cli/cmd/run/entry.body.ts +0 -205
- package/src/cli/cmd/run/footer.command.tsx +0 -1064
- package/src/cli/cmd/run/footer.menu.tsx +0 -351
- package/src/cli/cmd/run/footer.permission.tsx +0 -472
- package/src/cli/cmd/run/footer.prompt.tsx +0 -1306
- package/src/cli/cmd/run/footer.question.tsx +0 -573
- package/src/cli/cmd/run/footer.subagent.tsx +0 -173
- package/src/cli/cmd/run/footer.ts +0 -1129
- package/src/cli/cmd/run/footer.view.tsx +0 -943
- package/src/cli/cmd/run/footer.width.ts +0 -27
- package/src/cli/cmd/run/permission.shared.ts +0 -256
- package/src/cli/cmd/run/prompt.editor.ts +0 -157
- package/src/cli/cmd/run/prompt.shared.ts +0 -153
- package/src/cli/cmd/run/question.shared.ts +0 -340
- package/src/cli/cmd/run/runtime.boot.ts +0 -202
- package/src/cli/cmd/run/runtime.lifecycle.ts +0 -406
- package/src/cli/cmd/run/runtime.queue.ts +0 -349
- package/src/cli/cmd/run/runtime.shared.ts +0 -17
- package/src/cli/cmd/run/runtime.stdin.ts +0 -37
- package/src/cli/cmd/run/runtime.ts +0 -814
- package/src/cli/cmd/run/scrollback.shared.ts +0 -92
- package/src/cli/cmd/run/scrollback.surface.ts +0 -431
- package/src/cli/cmd/run/scrollback.writer.tsx +0 -352
- package/src/cli/cmd/run/session-data.ts +0 -1113
- package/src/cli/cmd/run/session-replay.ts +0 -374
- package/src/cli/cmd/run/session.shared.ts +0 -196
- package/src/cli/cmd/run/splash.ts +0 -275
- package/src/cli/cmd/run/stream.transport.ts +0 -1462
- package/src/cli/cmd/run/stream.ts +0 -175
- package/src/cli/cmd/run/subagent-data.ts +0 -876
- package/src/cli/cmd/run/theme.ts +0 -690
- package/src/cli/cmd/run/tool.ts +0 -1489
- package/src/cli/cmd/run/trace.ts +0 -94
- package/src/cli/cmd/run/turn-summary.ts +0 -47
- package/src/cli/cmd/run/types.ts +0 -350
- package/src/cli/cmd/run/variant.shared.ts +0 -215
- package/src/cli/cmd/run.ts +0 -894
- package/src/cli/cmd/serve.ts +0 -24
- package/src/cli/cmd/session.ts +0 -147
- package/src/cli/cmd/stats.ts +0 -393
- package/src/cli/cmd/tui.ts +0 -224
- package/src/cli/cmd/uninstall.ts +0 -353
- package/src/cli/cmd/upgrade.ts +0 -74
- package/src/cli/cmd/web.ts +0 -84
- package/src/cli/effect/prompt.ts +0 -37
- package/src/cli/effect-cmd.ts +0 -96
- package/src/cli/error.ts +0 -130
- package/src/cli/heap.ts +0 -45
- package/src/cli/logo-pixel.ts +0 -35
- package/src/cli/logo.ts +0 -1
- package/src/cli/network.ts +0 -64
- package/src/cli/tui/layer.ts +0 -7
- package/src/cli/tui/validate-session.ts +0 -29
- package/src/cli/tui/worker.ts +0 -71
- package/src/cli/ui.ts +0 -148
- package/src/cli/upgrade.ts +0 -53
- package/src/command/index.ts +0 -184
- package/src/command/template/initialize.txt +0 -66
- package/src/command/template/review.txt +0 -101
- package/src/config/agent.ts +0 -59
- package/src/config/command.ts +0 -39
- package/src/config/config.ts +0 -686
- package/src/config/entry-name.ts +0 -19
- package/src/config/managed.ts +0 -69
- package/src/config/markdown.ts +0 -36
- package/src/config/parse.ts +0 -79
- package/src/config/paths.ts +0 -45
- package/src/config/plugin.ts +0 -79
- package/src/config/tui-cwd.ts +0 -5
- package/src/config/tui-host-attention.ts +0 -21
- package/src/config/tui-migrate.ts +0 -132
- package/src/config/tui.ts +0 -274
- package/src/config/variable.ts +0 -91
- package/src/control-plane/adapters/index.ts +0 -41
- package/src/control-plane/adapters/worktree.ts +0 -96
- package/src/control-plane/dev/README.md +0 -19
- package/src/control-plane/dev/debug-workspace-plugin.ts +0 -73
- package/src/control-plane/types.ts +0 -59
- package/src/control-plane/util.ts +0 -39
- package/src/control-plane/workspace-adapter-runtime.ts +0 -51
- package/src/control-plane/workspace-context.ts +0 -26
- package/src/control-plane/workspace.ts +0 -989
- package/src/effect/app-runtime.ts +0 -132
- package/src/effect/bootstrap-runtime.ts +0 -23
- package/src/effect/bridge.ts +0 -84
- package/src/effect/config-service.ts +0 -67
- package/src/effect/instance-ref.ts +0 -11
- package/src/effect/instance-registry.ts +0 -12
- package/src/effect/instance-state.ts +0 -69
- package/src/effect/promise.ts +0 -17
- package/src/effect/run-service.ts +0 -47
- package/src/effect/runner.ts +0 -217
- package/src/effect/runtime-flags.ts +0 -79
- package/src/env/index.ts +0 -43
- package/src/event-v2-bridge.ts +0 -79
- package/src/format/formatter.ts +0 -404
- package/src/format/index.ts +0 -205
- package/src/git/index.ts +0 -350
- package/src/id/id.ts +0 -80
- package/src/ide/index.ts +0 -61
- package/src/image/image.ts +0 -174
- package/src/index.ts +0 -142
- package/src/installation/index.ts +0 -350
- package/src/lsp/client.ts +0 -650
- package/src/lsp/diagnostic.ts +0 -29
- package/src/lsp/language.ts +0 -121
- package/src/lsp/launch.ts +0 -21
- package/src/lsp/lsp.ts +0 -511
- package/src/lsp/server.ts +0 -1983
- package/src/markdown.d.ts +0 -4
- package/src/mcp/auth.ts +0 -174
- package/src/mcp/catalog.ts +0 -153
- package/src/mcp/index.ts +0 -953
- package/src/mcp/oauth-callback.ts +0 -233
- package/src/mcp/oauth-provider.ts +0 -206
- package/src/node.ts +0 -4
- package/src/patch/index.ts +0 -686
- package/src/permission/arity.ts +0 -163
- package/src/permission/evaluate.ts +0 -1
- package/src/permission/index.ts +0 -230
- package/src/plugin/azure.ts +0 -26
- package/src/plugin/cloudflare.ts +0 -76
- package/src/plugin/digitalocean.ts +0 -383
- package/src/plugin/github-copilot/copilot.ts +0 -414
- package/src/plugin/github-copilot/models.ts +0 -246
- package/src/plugin/index.ts +0 -316
- package/src/plugin/install.ts +0 -439
- package/src/plugin/loader.ts +0 -237
- package/src/plugin/meta.ts +0 -188
- package/src/plugin/openai/README.md +0 -31
- package/src/plugin/openai/codex.ts +0 -641
- package/src/plugin/openai/ws-pool.ts +0 -270
- package/src/plugin/openai/ws.ts +0 -381
- package/src/plugin/pty-environment.ts +0 -24
- package/src/plugin/shared.ts +0 -323
- package/src/plugin/snowflake-cortex.ts +0 -529
- package/src/plugin/tui/internal.ts +0 -10
- package/src/plugin/tui/runtime.ts +0 -1130
- package/src/plugin/xai.ts +0 -716
- package/src/project/bootstrap-service.ts +0 -9
- package/src/project/bootstrap.ts +0 -76
- package/src/project/instance-context.ts +0 -24
- package/src/project/instance-layer.ts +0 -11
- package/src/project/instance-runtime.ts +0 -16
- package/src/project/instance-store.ts +0 -209
- package/src/project/project.ts +0 -519
- package/src/project/vcs.ts +0 -431
- package/src/provider/auth.ts +0 -233
- package/src/provider/error.ts +0 -188
- package/src/provider/model-status.ts +0 -8
- package/src/provider/provider.ts +0 -1975
- package/src/provider/transform.ts +0 -1543
- package/src/question/index.ts +0 -229
- package/src/question/schema.ts +0 -10
- package/src/server/auth.ts +0 -48
- package/src/server/event.ts +0 -13
- package/src/server/global-lifecycle.ts +0 -28
- package/src/server/init-projectors.ts +0 -3
- package/src/server/mdns.ts +0 -47
- package/src/server/projectors.ts +0 -1
- package/src/server/proxy-util.ts +0 -48
- package/src/server/routes/instance/httpapi/AGENTS.md +0 -39
- package/src/server/routes/instance/httpapi/api.ts +0 -78
- package/src/server/routes/instance/httpapi/errors.ts +0 -193
- package/src/server/routes/instance/httpapi/groups/config.ts +0 -65
- package/src/server/routes/instance/httpapi/groups/control-plane.ts +0 -35
- package/src/server/routes/instance/httpapi/groups/control.ts +0 -76
- package/src/server/routes/instance/httpapi/groups/event.ts +0 -29
- package/src/server/routes/instance/httpapi/groups/experimental.ts +0 -275
- package/src/server/routes/instance/httpapi/groups/file.ts +0 -185
- package/src/server/routes/instance/httpapi/groups/global.ts +0 -138
- package/src/server/routes/instance/httpapi/groups/instance.ts +0 -206
- package/src/server/routes/instance/httpapi/groups/mcp.ts +0 -156
- package/src/server/routes/instance/httpapi/groups/metadata.ts +0 -18
- package/src/server/routes/instance/httpapi/groups/permission.ts +0 -61
- package/src/server/routes/instance/httpapi/groups/project-copy.ts +0 -32
- package/src/server/routes/instance/httpapi/groups/project.ts +0 -93
- package/src/server/routes/instance/httpapi/groups/provider.ts +0 -101
- package/src/server/routes/instance/httpapi/groups/pty.ts +0 -172
- package/src/server/routes/instance/httpapi/groups/query.ts +0 -12
- package/src/server/routes/instance/httpapi/groups/question.ts +0 -74
- package/src/server/routes/instance/httpapi/groups/session.ts +0 -462
- package/src/server/routes/instance/httpapi/groups/sync.ts +0 -113
- package/src/server/routes/instance/httpapi/groups/tui.ts +0 -208
- package/src/server/routes/instance/httpapi/groups/workspace.ts +0 -141
- package/src/server/routes/instance/httpapi/handlers/config.ts +0 -34
- package/src/server/routes/instance/httpapi/handlers/control-plane.ts +0 -37
- package/src/server/routes/instance/httpapi/handlers/control.ts +0 -43
- package/src/server/routes/instance/httpapi/handlers/event.ts +0 -99
- package/src/server/routes/instance/httpapi/handlers/experimental.ts +0 -192
- package/src/server/routes/instance/httpapi/handlers/file.ts +0 -139
- package/src/server/routes/instance/httpapi/handlers/global.ts +0 -156
- package/src/server/routes/instance/httpapi/handlers/instance.ts +0 -110
- package/src/server/routes/instance/httpapi/handlers/mcp.ts +0 -111
- package/src/server/routes/instance/httpapi/handlers/permission.ts +0 -41
- package/src/server/routes/instance/httpapi/handlers/project-copy.ts +0 -83
- package/src/server/routes/instance/httpapi/handlers/project.ts +0 -63
- package/src/server/routes/instance/httpapi/handlers/provider.ts +0 -113
- package/src/server/routes/instance/httpapi/handlers/pty.ts +0 -273
- package/src/server/routes/instance/httpapi/handlers/question.ts +0 -54
- package/src/server/routes/instance/httpapi/handlers/session-errors.ts +0 -21
- package/src/server/routes/instance/httpapi/handlers/session.ts +0 -440
- package/src/server/routes/instance/httpapi/handlers/sync.ts +0 -89
- package/src/server/routes/instance/httpapi/handlers/tui.ts +0 -131
- package/src/server/routes/instance/httpapi/handlers/workspace.ts +0 -102
- package/src/server/routes/instance/httpapi/lifecycle.ts +0 -54
- package/src/server/routes/instance/httpapi/middleware/authorization.ts +0 -150
- package/src/server/routes/instance/httpapi/middleware/compression.ts +0 -64
- package/src/server/routes/instance/httpapi/middleware/cors-vary.ts +0 -29
- package/src/server/routes/instance/httpapi/middleware/error.ts +0 -43
- package/src/server/routes/instance/httpapi/middleware/fence.ts +0 -25
- package/src/server/routes/instance/httpapi/middleware/instance-context.ts +0 -43
- package/src/server/routes/instance/httpapi/middleware/proxy.ts +0 -108
- package/src/server/routes/instance/httpapi/middleware/schema-error.ts +0 -41
- package/src/server/routes/instance/httpapi/middleware/workspace-routing.ts +0 -250
- package/src/server/routes/instance/httpapi/public.ts +0 -535
- package/src/server/routes/instance/httpapi/server.ts +0 -298
- package/src/server/routes/instance/httpapi/websocket-tracker.ts +0 -57
- package/src/server/server.ts +0 -225
- package/src/server/shared/fence.ts +0 -60
- package/src/server/shared/pty-ticket.ts +0 -15
- package/src/server/shared/public-ui.ts +0 -12
- package/src/server/shared/tui-control.ts +0 -28
- package/src/server/shared/ui.ts +0 -108
- package/src/server/shared/workspace-routing.ts +0 -38
- package/src/server/tui-event.ts +0 -53
- package/src/session/compaction.ts +0 -620
- package/src/session/instruction.ts +0 -241
- package/src/session/llm/AGENTS.md +0 -90
- package/src/session/llm/ai-sdk.ts +0 -288
- package/src/session/llm/native-request.ts +0 -196
- package/src/session/llm/native-runtime.ts +0 -195
- package/src/session/llm/request.ts +0 -216
- package/src/session/llm.ts +0 -415
- package/src/session/message-error.ts +0 -14
- package/src/session/message-v2.ts +0 -747
- package/src/session/message.ts +0 -148
- package/src/session/overflow.ts +0 -34
- package/src/session/processor.ts +0 -1084
- package/src/session/prompt/anthropic.txt +0 -109
- package/src/session/prompt/beast.txt +0 -151
- package/src/session/prompt/build-switch.txt +0 -9
- package/src/session/prompt/codex.txt +0 -83
- package/src/session/prompt/copilot-gpt-5.txt +0 -147
- package/src/session/prompt/default.txt +0 -99
- package/src/session/prompt/gemini.txt +0 -159
- package/src/session/prompt/gpt.txt +0 -111
- package/src/session/prompt/kimi.txt +0 -99
- package/src/session/prompt/plan-mode.txt +0 -74
- package/src/session/prompt/plan-reminder-anthropic.txt +0 -71
- package/src/session/prompt/plan.txt +0 -30
- package/src/session/prompt/trinity.txt +0 -101
- package/src/session/prompt.ts +0 -1707
- package/src/session/reminders.ts +0 -92
- package/src/session/retry.ts +0 -201
- package/src/session/revert.ts +0 -160
- package/src/session/run-state.ts +0 -156
- package/src/session/schema.ts +0 -26
- package/src/session/session.ts +0 -1119
- package/src/session/status.ts +0 -97
- package/src/session/summary.ts +0 -165
- package/src/session/system.ts +0 -117
- package/src/session/todo.ts +0 -90
- package/src/session/tools.ts +0 -207
- package/src/share/session.ts +0 -61
- package/src/share/share-next.ts +0 -385
- package/src/skill/discovery.ts +0 -109
- package/src/skill/index.ts +0 -366
- package/src/snapshot/index.ts +0 -808
- package/src/sql.d.ts +0 -4
- package/src/storage/schema.ts +0 -5
- package/src/storage/storage.ts +0 -329
- package/src/sync/README.md +0 -179
- package/src/sync/schema.ts +0 -11
- package/src/temporary.ts +0 -31
- package/src/tool/apply_patch.ts +0 -315
- package/src/tool/apply_patch.txt +0 -33
- package/src/tool/apply_patch.zh.txt +0 -33
- package/src/tool/description.ts +0 -100
- package/src/tool/edit.ts +0 -739
- package/src/tool/edit.txt +0 -10
- package/src/tool/edit.zh.txt +0 -10
- package/src/tool/external-directory.ts +0 -49
- package/src/tool/glob.ts +0 -78
- package/src/tool/glob.txt +0 -6
- package/src/tool/glob.zh.txt +0 -6
- package/src/tool/grep.ts +0 -114
- package/src/tool/grep.txt +0 -8
- package/src/tool/grep.zh.txt +0 -8
- package/src/tool/invalid.ts +0 -21
- package/src/tool/json-schema.ts +0 -164
- package/src/tool/lsp.ts +0 -115
- package/src/tool/lsp.txt +0 -24
- package/src/tool/lsp.zh.txt +0 -24
- package/src/tool/mcp-websearch.ts +0 -96
- package/src/tool/plan-enter.txt +0 -14
- package/src/tool/plan-enter.zh.txt +0 -14
- package/src/tool/plan-exit.txt +0 -13
- package/src/tool/plan-exit.zh.txt +0 -13
- package/src/tool/plan.ts +0 -81
- package/src/tool/question.ts +0 -46
- package/src/tool/question.txt +0 -10
- package/src/tool/question.zh.txt +0 -10
- package/src/tool/read.ts +0 -388
- package/src/tool/read.txt +0 -14
- package/src/tool/read.zh.txt +0 -14
- package/src/tool/registry.ts +0 -440
- package/src/tool/schema.ts +0 -14
- package/src/tool/shell/id.ts +0 -19
- package/src/tool/shell/prompt.ts +0 -307
- package/src/tool/shell/shell.txt +0 -21
- package/src/tool/shell.ts +0 -657
- package/src/tool/skill.ts +0 -73
- package/src/tool/skill.txt +0 -5
- package/src/tool/skill.zh.txt +0 -5
- package/src/tool/task.ts +0 -348
- package/src/tool/task.txt +0 -19
- package/src/tool/task.zh.txt +0 -19
- package/src/tool/todo.ts +0 -59
- package/src/tool/todowrite.txt +0 -44
- package/src/tool/todowrite.zh.txt +0 -44
- package/src/tool/tool.ts +0 -183
- package/src/tool/truncate.ts +0 -158
- package/src/tool/truncation-dir.ts +0 -4
- package/src/tool/webfetch.ts +0 -194
- package/src/tool/webfetch.txt +0 -13
- package/src/tool/webfetch.zh.txt +0 -13
- package/src/tool/websearch.ts +0 -145
- package/src/tool/websearch.txt +0 -14
- package/src/tool/websearch.zh.txt +0 -14
- package/src/tool/write.ts +0 -106
- package/src/tool/write.txt +0 -8
- package/src/tool/write.zh.txt +0 -8
- package/src/util/archive.ts +0 -17
- package/src/util/bom.ts +0 -27
- package/src/util/data-url.ts +0 -9
- package/src/util/defer.ts +0 -10
- package/src/util/effect-http-client.ts +0 -11
- package/src/util/error.ts +0 -1
- package/src/util/filesystem.ts +0 -251
- package/src/util/html.ts +0 -8
- package/src/util/iife.ts +0 -3
- package/src/util/lazy.ts +0 -20
- package/src/util/local-context.ts +0 -25
- package/src/util/locale.ts +0 -2
- package/src/util/media.ts +0 -26
- package/src/util/process.ts +0 -177
- package/src/util/proxy-env.ts +0 -72
- package/src/util/queue.ts +0 -32
- package/src/util/record.ts +0 -1
- package/src/util/repository.ts +0 -232
- package/src/util/rpc.ts +0 -66
- package/src/util/signal.ts +0 -12
- package/src/util/timeout.ts +0 -13
- package/src/util/token.ts +0 -1
- package/src/util/wildcard.ts +0 -59
- package/src/worktree/index.ts +0 -654
package/src/cli/cmd/tui.ts
DELETED
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
import { cmd } from "@/cli/cmd/cmd"
|
|
2
|
-
import { Rpc } from "@/util/rpc"
|
|
3
|
-
import { type rpc } from "../tui/worker"
|
|
4
|
-
import path from "path"
|
|
5
|
-
import { fileURLToPath } from "url"
|
|
6
|
-
import { UI } from "@/cli/ui"
|
|
7
|
-
import { errorMessage } from "@opencode-ai/tui/util/error"
|
|
8
|
-
import { withTimeout } from "@/util/timeout"
|
|
9
|
-
import { withNetworkOptions, resolveNetworkOptionsNoConfig } from "@/cli/network"
|
|
10
|
-
import { Filesystem } from "@/util/filesystem"
|
|
11
|
-
import type { GlobalEvent } from "@opencode-ai/sdk/v2"
|
|
12
|
-
import type { EventSource } from "@opencode-ai/tui/context/sdk"
|
|
13
|
-
import { writeHeapSnapshot } from "v8"
|
|
14
|
-
import { validateSession } from "../tui/validate-session"
|
|
15
|
-
import { win32InstallCtrlCGuard } from "@opencode-ai/tui/terminal-win32"
|
|
16
|
-
|
|
17
|
-
declare global {
|
|
18
|
-
const OPENCODE_WORKER_PATH: string
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
type RpcClient = ReturnType<typeof Rpc.client<typeof rpc>>
|
|
22
|
-
|
|
23
|
-
function createWorkerFetch(client: RpcClient): typeof fetch {
|
|
24
|
-
const fn = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
|
|
25
|
-
const request = new Request(input, init)
|
|
26
|
-
const body = request.body ? await request.text() : undefined
|
|
27
|
-
const result = await client.call("fetch", {
|
|
28
|
-
url: request.url,
|
|
29
|
-
method: request.method,
|
|
30
|
-
headers: Object.fromEntries(request.headers.entries()),
|
|
31
|
-
body,
|
|
32
|
-
})
|
|
33
|
-
return new Response(result.body, {
|
|
34
|
-
status: result.status,
|
|
35
|
-
headers: result.headers,
|
|
36
|
-
})
|
|
37
|
-
}
|
|
38
|
-
return fn as typeof fetch
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function createEventSource(client: RpcClient): EventSource {
|
|
42
|
-
return {
|
|
43
|
-
subscribe: async (handler) => {
|
|
44
|
-
return client.on<GlobalEvent>("global.event", (e) => {
|
|
45
|
-
handler(e)
|
|
46
|
-
})
|
|
47
|
-
},
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async function target() {
|
|
52
|
-
if (typeof OPENCODE_WORKER_PATH !== "undefined") return OPENCODE_WORKER_PATH
|
|
53
|
-
const dist = new URL("./cli/tui/worker.js", import.meta.url)
|
|
54
|
-
if (await Filesystem.exists(fileURLToPath(dist))) return dist
|
|
55
|
-
return new URL("../tui/worker.ts", import.meta.url)
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async function input(value?: string) {
|
|
59
|
-
const piped = process.stdin.isTTY ? undefined : await Bun.stdin.text()
|
|
60
|
-
if (!value) return piped
|
|
61
|
-
if (!piped) return value
|
|
62
|
-
return piped + "\n" + value
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export function resolveThreadDirectory(project?: string, envPWD = process.env.PWD, cwd = process.cwd()) {
|
|
66
|
-
const root = Filesystem.resolve(envPWD ?? cwd)
|
|
67
|
-
if (project) return Filesystem.resolve(path.isAbsolute(project) ? project : path.join(root, project))
|
|
68
|
-
return Filesystem.resolve(cwd)
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export const TuiThreadCommand = cmd({
|
|
72
|
-
command: "$0 [project]",
|
|
73
|
-
describe: "start opencode tui",
|
|
74
|
-
builder: (yargs) =>
|
|
75
|
-
withNetworkOptions(yargs)
|
|
76
|
-
.positional("project", {
|
|
77
|
-
type: "string",
|
|
78
|
-
describe: "path to start opencode in",
|
|
79
|
-
})
|
|
80
|
-
.option("model", {
|
|
81
|
-
type: "string",
|
|
82
|
-
alias: ["m"],
|
|
83
|
-
describe: "model to use in the format of provider/model",
|
|
84
|
-
})
|
|
85
|
-
.option("continue", {
|
|
86
|
-
alias: ["c"],
|
|
87
|
-
describe: "continue the last session",
|
|
88
|
-
type: "boolean",
|
|
89
|
-
})
|
|
90
|
-
.option("session", {
|
|
91
|
-
alias: ["s"],
|
|
92
|
-
type: "string",
|
|
93
|
-
describe: "session id to continue",
|
|
94
|
-
})
|
|
95
|
-
.option("fork", {
|
|
96
|
-
type: "boolean",
|
|
97
|
-
describe: "fork the session when continuing (use with --continue or --session)",
|
|
98
|
-
})
|
|
99
|
-
.option("prompt", {
|
|
100
|
-
type: "string",
|
|
101
|
-
describe: "prompt to use",
|
|
102
|
-
})
|
|
103
|
-
.option("agent", {
|
|
104
|
-
type: "string",
|
|
105
|
-
describe: "agent to use",
|
|
106
|
-
}),
|
|
107
|
-
handler: async (args) => {
|
|
108
|
-
const unguard = win32InstallCtrlCGuard()
|
|
109
|
-
try {
|
|
110
|
-
const { TuiConfig } = await import("@/config/tui")
|
|
111
|
-
if (args.fork && !args.continue && !args.session) {
|
|
112
|
-
UI.error("--fork requires --continue or --session")
|
|
113
|
-
process.exitCode = 1
|
|
114
|
-
return
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
// Resolve relative --project paths from PWD, then use the real cwd after
|
|
118
|
-
// chdir so the thread and worker share the same directory key.
|
|
119
|
-
const next = resolveThreadDirectory(args.project)
|
|
120
|
-
const file = await target()
|
|
121
|
-
try {
|
|
122
|
-
process.chdir(next)
|
|
123
|
-
} catch {
|
|
124
|
-
UI.error("Failed to change directory to " + next)
|
|
125
|
-
return
|
|
126
|
-
}
|
|
127
|
-
const cwd = Filesystem.resolve(process.cwd())
|
|
128
|
-
|
|
129
|
-
const worker = new Worker(file)
|
|
130
|
-
const client = Rpc.client<typeof rpc>(worker)
|
|
131
|
-
const reload = () => {
|
|
132
|
-
client.call("reload", undefined).catch(() => {})
|
|
133
|
-
}
|
|
134
|
-
process.on("SIGUSR2", reload)
|
|
135
|
-
|
|
136
|
-
let stopped = false
|
|
137
|
-
const stop = async () => {
|
|
138
|
-
if (stopped) return
|
|
139
|
-
stopped = true
|
|
140
|
-
process.off("SIGUSR2", reload)
|
|
141
|
-
await withTimeout(client.call("shutdown", undefined), 5000).catch(() => {})
|
|
142
|
-
worker.terminate()
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
const prompt = await input(args.prompt)
|
|
146
|
-
const config = await TuiConfig.get()
|
|
147
|
-
|
|
148
|
-
const network = resolveNetworkOptionsNoConfig(args)
|
|
149
|
-
const external =
|
|
150
|
-
process.argv.includes("--port") ||
|
|
151
|
-
process.argv.includes("--hostname") ||
|
|
152
|
-
process.argv.includes("--mdns") ||
|
|
153
|
-
network.mdns ||
|
|
154
|
-
network.port !== 0 ||
|
|
155
|
-
network.hostname !== "127.0.0.1"
|
|
156
|
-
|
|
157
|
-
const transport = external
|
|
158
|
-
? {
|
|
159
|
-
url: (await client.call("server", network)).url,
|
|
160
|
-
fetch: undefined,
|
|
161
|
-
events: undefined,
|
|
162
|
-
}
|
|
163
|
-
: {
|
|
164
|
-
url: "http://opencode.internal",
|
|
165
|
-
fetch: createWorkerFetch(client),
|
|
166
|
-
events: createEventSource(client),
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
try {
|
|
170
|
-
await validateSession({
|
|
171
|
-
url: transport.url,
|
|
172
|
-
sessionID: args.session,
|
|
173
|
-
directory: cwd,
|
|
174
|
-
fetch: transport.fetch,
|
|
175
|
-
})
|
|
176
|
-
} catch (error) {
|
|
177
|
-
UI.error(errorMessage(error))
|
|
178
|
-
process.exitCode = 1
|
|
179
|
-
return
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
setTimeout(() => {
|
|
183
|
-
client.call("checkUpgrade", { directory: cwd }).catch(() => {})
|
|
184
|
-
}, 1000).unref?.()
|
|
185
|
-
|
|
186
|
-
try {
|
|
187
|
-
const { Effect } = await import("effect")
|
|
188
|
-
const { run } = await import("../tui/layer")
|
|
189
|
-
const { createLegacyTuiPluginHost } = await import("@/plugin/tui/runtime")
|
|
190
|
-
await Effect.runPromise(
|
|
191
|
-
run({
|
|
192
|
-
url: transport.url,
|
|
193
|
-
async onSnapshot() {
|
|
194
|
-
const tui = writeHeapSnapshot("tui.heapsnapshot")
|
|
195
|
-
const server = await client.call("snapshot", undefined)
|
|
196
|
-
return [tui, server]
|
|
197
|
-
},
|
|
198
|
-
config,
|
|
199
|
-
pluginHost: createLegacyTuiPluginHost(),
|
|
200
|
-
directory: cwd,
|
|
201
|
-
fetch: transport.fetch,
|
|
202
|
-
events: transport.events,
|
|
203
|
-
args: {
|
|
204
|
-
continue: args.continue,
|
|
205
|
-
sessionID: args.session,
|
|
206
|
-
agent: args.agent,
|
|
207
|
-
model: args.model,
|
|
208
|
-
prompt,
|
|
209
|
-
fork: args.fork,
|
|
210
|
-
},
|
|
211
|
-
}),
|
|
212
|
-
)
|
|
213
|
-
} finally {
|
|
214
|
-
await stop()
|
|
215
|
-
}
|
|
216
|
-
} finally {
|
|
217
|
-
try {
|
|
218
|
-
unguard?.()
|
|
219
|
-
} catch {}
|
|
220
|
-
}
|
|
221
|
-
process.exit(0)
|
|
222
|
-
},
|
|
223
|
-
})
|
|
224
|
-
// scratch
|
package/src/cli/cmd/uninstall.ts
DELETED
|
@@ -1,353 +0,0 @@
|
|
|
1
|
-
import type { Argv } from "yargs"
|
|
2
|
-
import { UI } from "../ui"
|
|
3
|
-
import * as prompts from "@clack/prompts"
|
|
4
|
-
import { Installation } from "../../installation"
|
|
5
|
-
import { Global } from "@opencode-ai/core/global"
|
|
6
|
-
import fs from "fs/promises"
|
|
7
|
-
import path from "path"
|
|
8
|
-
import os from "os"
|
|
9
|
-
import { Filesystem } from "@/util/filesystem"
|
|
10
|
-
import { Process } from "@/util/process"
|
|
11
|
-
|
|
12
|
-
interface UninstallArgs {
|
|
13
|
-
keepConfig: boolean
|
|
14
|
-
keepData: boolean
|
|
15
|
-
dryRun: boolean
|
|
16
|
-
force: boolean
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
interface RemovalTargets {
|
|
20
|
-
directories: Array<{ path: string; label: string; keep: boolean }>
|
|
21
|
-
shellConfig: string | null
|
|
22
|
-
binary: string | null
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export const UninstallCommand = {
|
|
26
|
-
command: "uninstall",
|
|
27
|
-
describe: "uninstall opencode and remove all related files",
|
|
28
|
-
builder: (yargs: Argv) =>
|
|
29
|
-
yargs
|
|
30
|
-
.option("keep-config", {
|
|
31
|
-
alias: "c",
|
|
32
|
-
type: "boolean",
|
|
33
|
-
describe: "keep configuration files",
|
|
34
|
-
default: false,
|
|
35
|
-
})
|
|
36
|
-
.option("keep-data", {
|
|
37
|
-
alias: "d",
|
|
38
|
-
type: "boolean",
|
|
39
|
-
describe: "keep session data and snapshots",
|
|
40
|
-
default: false,
|
|
41
|
-
})
|
|
42
|
-
.option("dry-run", {
|
|
43
|
-
type: "boolean",
|
|
44
|
-
describe: "show what would be removed without removing",
|
|
45
|
-
default: false,
|
|
46
|
-
})
|
|
47
|
-
.option("force", {
|
|
48
|
-
alias: "f",
|
|
49
|
-
type: "boolean",
|
|
50
|
-
describe: "skip confirmation prompts",
|
|
51
|
-
default: false,
|
|
52
|
-
}),
|
|
53
|
-
|
|
54
|
-
handler: async (args: UninstallArgs) => {
|
|
55
|
-
UI.empty()
|
|
56
|
-
UI.println(UI.logo(" "))
|
|
57
|
-
UI.empty()
|
|
58
|
-
prompts.intro("Uninstall OnlyCode")
|
|
59
|
-
|
|
60
|
-
const method = await Installation.method()
|
|
61
|
-
prompts.log.info(`Installation method: ${method}`)
|
|
62
|
-
|
|
63
|
-
const targets = await collectRemovalTargets(args, method)
|
|
64
|
-
|
|
65
|
-
await showRemovalSummary(targets, method)
|
|
66
|
-
|
|
67
|
-
if (!args.force && !args.dryRun) {
|
|
68
|
-
const confirm = await prompts.confirm({
|
|
69
|
-
message: "Are you sure you want to uninstall?",
|
|
70
|
-
initialValue: false,
|
|
71
|
-
})
|
|
72
|
-
if (!confirm || prompts.isCancel(confirm)) {
|
|
73
|
-
prompts.outro("Cancelled")
|
|
74
|
-
return
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
if (args.dryRun) {
|
|
79
|
-
prompts.log.warn("Dry run - no changes made")
|
|
80
|
-
prompts.outro("Done")
|
|
81
|
-
return
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
await executeUninstall(method, targets)
|
|
85
|
-
|
|
86
|
-
prompts.outro("Done")
|
|
87
|
-
},
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
async function collectRemovalTargets(args: UninstallArgs, method: Installation.Method): Promise<RemovalTargets> {
|
|
91
|
-
const directories: RemovalTargets["directories"] = [
|
|
92
|
-
{ path: Global.Path.data, label: "Data", keep: args.keepData },
|
|
93
|
-
{ path: Global.Path.cache, label: "Cache", keep: false },
|
|
94
|
-
{ path: Global.Path.config, label: "Config", keep: args.keepConfig },
|
|
95
|
-
{ path: Global.Path.state, label: "State", keep: false },
|
|
96
|
-
]
|
|
97
|
-
|
|
98
|
-
const shellConfig = method === "curl" ? await getShellConfigFile() : null
|
|
99
|
-
const binary = method === "curl" ? process.execPath : null
|
|
100
|
-
|
|
101
|
-
return { directories, shellConfig, binary }
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
async function showRemovalSummary(targets: RemovalTargets, method: Installation.Method) {
|
|
105
|
-
prompts.log.message("The following will be removed:")
|
|
106
|
-
|
|
107
|
-
for (const dir of targets.directories) {
|
|
108
|
-
const exists = await fs
|
|
109
|
-
.access(dir.path)
|
|
110
|
-
.then(() => true)
|
|
111
|
-
.catch(() => false)
|
|
112
|
-
if (!exists) continue
|
|
113
|
-
|
|
114
|
-
const size = await getDirectorySize(dir.path)
|
|
115
|
-
const sizeStr = formatSize(size)
|
|
116
|
-
const status = dir.keep ? UI.Style.TEXT_DIM + "(keeping)" : ""
|
|
117
|
-
const prefix = dir.keep ? "○" : "✓"
|
|
118
|
-
|
|
119
|
-
prompts.log.info(` ${prefix} ${dir.label}: ${shortenPath(dir.path)} ${UI.Style.TEXT_DIM}(${sizeStr})${status}`)
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (targets.binary) {
|
|
123
|
-
prompts.log.info(` ✓ Binary: ${shortenPath(targets.binary)}`)
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if (targets.shellConfig) {
|
|
127
|
-
prompts.log.info(` ✓ Shell PATH in ${shortenPath(targets.shellConfig)}`)
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
if (method !== "curl" && method !== "unknown") {
|
|
131
|
-
const cmds: Record<string, string> = {
|
|
132
|
-
npm: "npm uninstall -g opencode-ai",
|
|
133
|
-
pnpm: "pnpm uninstall -g opencode-ai",
|
|
134
|
-
bun: "bun remove -g opencode-ai",
|
|
135
|
-
yarn: "yarn global remove opencode-ai",
|
|
136
|
-
brew: "brew uninstall opencode",
|
|
137
|
-
choco: "choco uninstall opencode",
|
|
138
|
-
scoop: "scoop uninstall opencode",
|
|
139
|
-
}
|
|
140
|
-
prompts.log.info(` ✓ Package: ${cmds[method] || method}`)
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
async function executeUninstall(method: Installation.Method, targets: RemovalTargets) {
|
|
145
|
-
const spinner = prompts.spinner()
|
|
146
|
-
const errors: string[] = []
|
|
147
|
-
|
|
148
|
-
for (const dir of targets.directories) {
|
|
149
|
-
if (dir.keep) {
|
|
150
|
-
prompts.log.step(`Skipping ${dir.label} (--keep-${dir.label.toLowerCase()})`)
|
|
151
|
-
continue
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
const exists = await fs
|
|
155
|
-
.access(dir.path)
|
|
156
|
-
.then(() => true)
|
|
157
|
-
.catch(() => false)
|
|
158
|
-
if (!exists) continue
|
|
159
|
-
|
|
160
|
-
spinner.start(`Removing ${dir.label}...`)
|
|
161
|
-
const err = await fs.rm(dir.path, { recursive: true, force: true }).catch((e) => e)
|
|
162
|
-
if (err) {
|
|
163
|
-
spinner.stop(`Failed to remove ${dir.label}`, 1)
|
|
164
|
-
errors.push(`${dir.label}: ${err.message}`)
|
|
165
|
-
continue
|
|
166
|
-
}
|
|
167
|
-
spinner.stop(`Removed ${dir.label}`)
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
if (targets.shellConfig) {
|
|
171
|
-
spinner.start("Cleaning shell config...")
|
|
172
|
-
const err = await cleanShellConfig(targets.shellConfig).catch((e) => e)
|
|
173
|
-
if (err) {
|
|
174
|
-
spinner.stop("Failed to clean shell config", 1)
|
|
175
|
-
errors.push(`Shell config: ${err.message}`)
|
|
176
|
-
} else {
|
|
177
|
-
spinner.stop("Cleaned shell config")
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
if (method !== "curl" && method !== "unknown") {
|
|
182
|
-
const cmds: Record<string, string[]> = {
|
|
183
|
-
npm: ["npm", "uninstall", "-g", "opencode-ai"],
|
|
184
|
-
pnpm: ["pnpm", "uninstall", "-g", "opencode-ai"],
|
|
185
|
-
bun: ["bun", "remove", "-g", "opencode-ai"],
|
|
186
|
-
yarn: ["yarn", "global", "remove", "opencode-ai"],
|
|
187
|
-
brew: ["brew", "uninstall", "opencode"],
|
|
188
|
-
choco: ["choco", "uninstall", "opencode"],
|
|
189
|
-
scoop: ["scoop", "uninstall", "opencode"],
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
const cmd = cmds[method]
|
|
193
|
-
if (cmd) {
|
|
194
|
-
spinner.start(`Running ${cmd.join(" ")}...`)
|
|
195
|
-
const result = await Process.run(method === "choco" ? ["choco", "uninstall", "opencode", "-y", "-r"] : cmd, {
|
|
196
|
-
nothrow: true,
|
|
197
|
-
})
|
|
198
|
-
if (result.code !== 0) {
|
|
199
|
-
spinner.stop(`Package manager uninstall failed: exit code ${result.code}`, 1)
|
|
200
|
-
const text = `${result.stdout.toString("utf8")}\n${result.stderr.toString("utf8")}`
|
|
201
|
-
if (method === "choco" && text.includes("not running from an elevated command shell")) {
|
|
202
|
-
prompts.log.warn(`You may need to run '${cmd.join(" ")}' from an elevated command shell`)
|
|
203
|
-
} else {
|
|
204
|
-
prompts.log.warn(`You may need to run manually: ${cmd.join(" ")}`)
|
|
205
|
-
}
|
|
206
|
-
} else {
|
|
207
|
-
spinner.stop("Package removed")
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
if (method === "curl" && targets.binary) {
|
|
213
|
-
UI.empty()
|
|
214
|
-
prompts.log.message("To finish removing the binary, run:")
|
|
215
|
-
prompts.log.info(` rm "${targets.binary}"`)
|
|
216
|
-
|
|
217
|
-
const binDir = path.dirname(targets.binary)
|
|
218
|
-
if (binDir.includes(".opencode")) {
|
|
219
|
-
prompts.log.info(` rmdir "${binDir}" 2>/dev/null`)
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
if (errors.length > 0) {
|
|
224
|
-
UI.empty()
|
|
225
|
-
prompts.log.warn("Some operations failed:")
|
|
226
|
-
for (const err of errors) {
|
|
227
|
-
prompts.log.error(` ${err}`)
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
UI.empty()
|
|
232
|
-
prompts.log.success("Thank you for using OnlyCode!")
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
async function getShellConfigFile(): Promise<string | null> {
|
|
236
|
-
const shell = path.basename(process.env.SHELL || "bash")
|
|
237
|
-
const home = os.homedir()
|
|
238
|
-
const xdgConfig = process.env.XDG_CONFIG_HOME || path.join(home, ".config")
|
|
239
|
-
|
|
240
|
-
const configFiles: Record<string, string[]> = {
|
|
241
|
-
fish: [path.join(xdgConfig, "fish", "config.fish")],
|
|
242
|
-
zsh: [
|
|
243
|
-
path.join(home, ".zshrc"),
|
|
244
|
-
path.join(home, ".zshenv"),
|
|
245
|
-
path.join(xdgConfig, "zsh", ".zshrc"),
|
|
246
|
-
path.join(xdgConfig, "zsh", ".zshenv"),
|
|
247
|
-
],
|
|
248
|
-
bash: [
|
|
249
|
-
path.join(home, ".bashrc"),
|
|
250
|
-
path.join(home, ".bash_profile"),
|
|
251
|
-
path.join(home, ".profile"),
|
|
252
|
-
path.join(xdgConfig, "bash", ".bashrc"),
|
|
253
|
-
path.join(xdgConfig, "bash", ".bash_profile"),
|
|
254
|
-
],
|
|
255
|
-
ash: [path.join(home, ".ashrc"), path.join(home, ".profile")],
|
|
256
|
-
sh: [path.join(home, ".profile")],
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
const candidates = configFiles[shell] || configFiles.bash
|
|
260
|
-
|
|
261
|
-
for (const file of candidates) {
|
|
262
|
-
const exists = await fs
|
|
263
|
-
.access(file)
|
|
264
|
-
.then(() => true)
|
|
265
|
-
.catch(() => false)
|
|
266
|
-
if (!exists) continue
|
|
267
|
-
|
|
268
|
-
const content = await Filesystem.readText(file).catch(() => "")
|
|
269
|
-
if (content.includes("# opencode") || content.includes(".opencode/bin")) {
|
|
270
|
-
return file
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
return null
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
async function cleanShellConfig(file: string) {
|
|
278
|
-
const content = await Filesystem.readText(file)
|
|
279
|
-
const lines = content.split("\n")
|
|
280
|
-
|
|
281
|
-
const filtered: string[] = []
|
|
282
|
-
let skip = false
|
|
283
|
-
|
|
284
|
-
for (const line of lines) {
|
|
285
|
-
const trimmed = line.trim()
|
|
286
|
-
|
|
287
|
-
if (trimmed === "# opencode") {
|
|
288
|
-
skip = true
|
|
289
|
-
continue
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
if (skip) {
|
|
293
|
-
skip = false
|
|
294
|
-
if (trimmed.includes(".opencode/bin") || trimmed.includes("fish_add_path")) {
|
|
295
|
-
continue
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
if (
|
|
300
|
-
(trimmed.startsWith("export PATH=") && trimmed.includes(".opencode/bin")) ||
|
|
301
|
-
(trimmed.startsWith("fish_add_path") && trimmed.includes(".opencode"))
|
|
302
|
-
) {
|
|
303
|
-
continue
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
filtered.push(line)
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
while (filtered.length > 0 && filtered[filtered.length - 1].trim() === "") {
|
|
310
|
-
filtered.pop()
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
const output = filtered.join("\n") + "\n"
|
|
314
|
-
await Filesystem.write(file, output)
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
async function getDirectorySize(dir: string): Promise<number> {
|
|
318
|
-
let total = 0
|
|
319
|
-
|
|
320
|
-
const walk = async (current: string) => {
|
|
321
|
-
const entries = await fs.readdir(current, { withFileTypes: true }).catch(() => [])
|
|
322
|
-
|
|
323
|
-
for (const entry of entries) {
|
|
324
|
-
const full = path.join(current, entry.name)
|
|
325
|
-
if (entry.isDirectory()) {
|
|
326
|
-
await walk(full)
|
|
327
|
-
continue
|
|
328
|
-
}
|
|
329
|
-
if (entry.isFile()) {
|
|
330
|
-
const stat = await fs.stat(full).catch(() => null)
|
|
331
|
-
if (stat) total += stat.size
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
await walk(dir)
|
|
337
|
-
return total
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
function formatSize(bytes: number): string {
|
|
341
|
-
if (bytes < 1024) return `${bytes} B`
|
|
342
|
-
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`
|
|
343
|
-
if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`
|
|
344
|
-
return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
function shortenPath(p: string): string {
|
|
348
|
-
const home = os.homedir()
|
|
349
|
-
if (p.startsWith(home)) {
|
|
350
|
-
return p.replace(home, "~")
|
|
351
|
-
}
|
|
352
|
-
return p
|
|
353
|
-
}
|
package/src/cli/cmd/upgrade.ts
DELETED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import type { Argv } from "yargs"
|
|
2
|
-
import { UI } from "../ui"
|
|
3
|
-
import * as prompts from "@clack/prompts"
|
|
4
|
-
import { Installation } from "../../installation"
|
|
5
|
-
import { InstallationVersion } from "@opencode-ai/core/installation/version"
|
|
6
|
-
|
|
7
|
-
export const UpgradeCommand = {
|
|
8
|
-
command: "upgrade [target]",
|
|
9
|
-
describe: "upgrade opencode to the latest or a specific version",
|
|
10
|
-
builder: (yargs: Argv) => {
|
|
11
|
-
return yargs
|
|
12
|
-
.positional("target", {
|
|
13
|
-
describe: "version to upgrade to, for ex '0.1.48' or 'v0.1.48'",
|
|
14
|
-
type: "string",
|
|
15
|
-
})
|
|
16
|
-
.option("method", {
|
|
17
|
-
alias: "m",
|
|
18
|
-
describe: "installation method to use",
|
|
19
|
-
type: "string",
|
|
20
|
-
choices: ["curl", "npm", "pnpm", "bun", "brew", "choco", "scoop"],
|
|
21
|
-
})
|
|
22
|
-
},
|
|
23
|
-
handler: async (args: { target?: string; method?: string }) => {
|
|
24
|
-
UI.empty()
|
|
25
|
-
UI.println(UI.logo(" "))
|
|
26
|
-
UI.empty()
|
|
27
|
-
prompts.intro("Upgrade")
|
|
28
|
-
const detectedMethod = await Installation.method()
|
|
29
|
-
const method = (args.method as Installation.Method) ?? detectedMethod
|
|
30
|
-
if (method === "unknown") {
|
|
31
|
-
prompts.log.error(`opencode is installed to ${process.execPath} and may be managed by a package manager`)
|
|
32
|
-
const install = await prompts.select({
|
|
33
|
-
message: "Install anyways?",
|
|
34
|
-
options: [
|
|
35
|
-
{ label: "Yes", value: true },
|
|
36
|
-
{ label: "No", value: false },
|
|
37
|
-
],
|
|
38
|
-
initialValue: false,
|
|
39
|
-
})
|
|
40
|
-
if (!install) {
|
|
41
|
-
prompts.outro("Done")
|
|
42
|
-
return
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
prompts.log.info("Using method: " + method)
|
|
46
|
-
const target = args.target ? args.target.replace(/^v/, "") : await Installation.latest()
|
|
47
|
-
|
|
48
|
-
if (InstallationVersion === target) {
|
|
49
|
-
prompts.log.warn(`opencode upgrade skipped: ${target} is already installed`)
|
|
50
|
-
prompts.outro("Done")
|
|
51
|
-
return
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
prompts.log.info(`From ${InstallationVersion} → ${target}`)
|
|
55
|
-
const spinner = prompts.spinner()
|
|
56
|
-
spinner.start("Upgrading...")
|
|
57
|
-
const err = await Installation.upgrade(method, target).catch((err) => err)
|
|
58
|
-
if (err) {
|
|
59
|
-
spinner.stop("Upgrade failed", 1)
|
|
60
|
-
if (err instanceof Installation.UpgradeFailedError) {
|
|
61
|
-
// necessary because choco only allows install/upgrade in elevated terminals
|
|
62
|
-
if (method === "choco" && err.stderr.includes("not running from an elevated command shell")) {
|
|
63
|
-
prompts.log.error("Please run the terminal as Administrator and try again")
|
|
64
|
-
} else {
|
|
65
|
-
prompts.log.error(err.stderr)
|
|
66
|
-
}
|
|
67
|
-
} else if (err instanceof Error) prompts.log.error(err.message)
|
|
68
|
-
prompts.outro("Done")
|
|
69
|
-
return
|
|
70
|
-
}
|
|
71
|
-
spinner.stop("Upgrade complete")
|
|
72
|
-
prompts.outro("Done")
|
|
73
|
-
},
|
|
74
|
-
}
|