onlycode 1.18.0 → 1.19.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/package.json +11 -146
- 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/web.ts
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { Effect } from "effect"
|
|
2
|
-
import { UI } from "../ui"
|
|
3
|
-
import { effectCmd } from "../effect-cmd"
|
|
4
|
-
import { withNetworkOptions, resolveNetworkOptions } from "../network"
|
|
5
|
-
import { Flag } from "@opencode-ai/core/flag/flag"
|
|
6
|
-
import open from "open"
|
|
7
|
-
import { networkInterfaces } from "os"
|
|
8
|
-
|
|
9
|
-
function getNetworkIPs() {
|
|
10
|
-
const nets = networkInterfaces()
|
|
11
|
-
const results: string[] = []
|
|
12
|
-
|
|
13
|
-
for (const name of Object.keys(nets)) {
|
|
14
|
-
const net = nets[name]
|
|
15
|
-
if (!net) continue
|
|
16
|
-
|
|
17
|
-
for (const netInfo of net) {
|
|
18
|
-
// Skip internal and non-IPv4 addresses
|
|
19
|
-
if (netInfo.internal || netInfo.family !== "IPv4") continue
|
|
20
|
-
|
|
21
|
-
// Skip Docker bridge networks (typically 172.x.x.x)
|
|
22
|
-
if (netInfo.address.startsWith("172.")) continue
|
|
23
|
-
|
|
24
|
-
results.push(netInfo.address)
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
return results
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export const WebCommand = effectCmd({
|
|
32
|
-
command: "web",
|
|
33
|
-
builder: (yargs) => withNetworkOptions(yargs),
|
|
34
|
-
describe: "start opencode server and open web interface",
|
|
35
|
-
// Server loads instances per-request via x-opencode-directory header — no
|
|
36
|
-
// ambient project InstanceContext needed at startup.
|
|
37
|
-
instance: false,
|
|
38
|
-
handler: Effect.fn("Cli.web")(function* (args) {
|
|
39
|
-
const { Server } = yield* Effect.promise(() => import("../../server/server"))
|
|
40
|
-
if (!Flag.OPENCODE_SERVER_PASSWORD) {
|
|
41
|
-
UI.println(UI.Style.TEXT_WARNING_BOLD + "! OPENCODE_SERVER_PASSWORD is not set; server is unsecured.")
|
|
42
|
-
}
|
|
43
|
-
const opts = yield* resolveNetworkOptions(args)
|
|
44
|
-
const server = yield* Effect.promise(() => Server.listen(opts))
|
|
45
|
-
UI.empty()
|
|
46
|
-
UI.println(UI.logo(" "))
|
|
47
|
-
UI.empty()
|
|
48
|
-
|
|
49
|
-
if (opts.hostname === "0.0.0.0") {
|
|
50
|
-
// Show localhost for local access
|
|
51
|
-
const localhostUrl = `http://localhost:${server.port}`
|
|
52
|
-
UI.println(UI.Style.TEXT_INFO_BOLD + " Local access: ", UI.Style.TEXT_NORMAL, localhostUrl)
|
|
53
|
-
|
|
54
|
-
// Show network IPs for remote access
|
|
55
|
-
const networkIPs = getNetworkIPs()
|
|
56
|
-
if (networkIPs.length > 0) {
|
|
57
|
-
for (const ip of networkIPs) {
|
|
58
|
-
UI.println(
|
|
59
|
-
UI.Style.TEXT_INFO_BOLD + " Network access: ",
|
|
60
|
-
UI.Style.TEXT_NORMAL,
|
|
61
|
-
`http://${ip}:${server.port}`,
|
|
62
|
-
)
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (opts.mdns) {
|
|
67
|
-
UI.println(
|
|
68
|
-
UI.Style.TEXT_INFO_BOLD + " mDNS: ",
|
|
69
|
-
UI.Style.TEXT_NORMAL,
|
|
70
|
-
`${opts.mdnsDomain}:${server.port}`,
|
|
71
|
-
)
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// Open localhost in browser
|
|
75
|
-
open(localhostUrl).catch(() => {})
|
|
76
|
-
} else {
|
|
77
|
-
const displayUrl = server.url.toString()
|
|
78
|
-
UI.println(UI.Style.TEXT_INFO_BOLD + " Web interface: ", UI.Style.TEXT_NORMAL, displayUrl)
|
|
79
|
-
open(displayUrl).catch(() => {})
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
yield* Effect.never
|
|
83
|
-
}),
|
|
84
|
-
})
|
package/src/cli/effect/prompt.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import * as prompts from "@clack/prompts"
|
|
2
|
-
import { Effect, Option } from "effect"
|
|
3
|
-
|
|
4
|
-
export const intro = (msg: string) => Effect.sync(() => prompts.intro(msg))
|
|
5
|
-
export const outro = (msg: string) => Effect.sync(() => prompts.outro(msg))
|
|
6
|
-
|
|
7
|
-
export const log = {
|
|
8
|
-
info: (msg: string) => Effect.sync(() => prompts.log.info(msg)),
|
|
9
|
-
error: (msg: string) => Effect.sync(() => prompts.log.error(msg)),
|
|
10
|
-
warn: (msg: string) => Effect.sync(() => prompts.log.warn(msg)),
|
|
11
|
-
success: (msg: string) => Effect.sync(() => prompts.log.success(msg)),
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const optional = <Value>(result: Value | symbol) => {
|
|
15
|
-
if (prompts.isCancel(result)) return Option.none<Value>()
|
|
16
|
-
return Option.some(result)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export const select = <Value>(opts: Parameters<typeof prompts.select<Value>>[0]) =>
|
|
20
|
-
Effect.promise(() => prompts.select(opts)).pipe(Effect.map((result) => optional(result)))
|
|
21
|
-
|
|
22
|
-
export const autocomplete = <Value>(opts: Parameters<typeof prompts.autocomplete<Value>>[0]) =>
|
|
23
|
-
Effect.promise(() => prompts.autocomplete(opts)).pipe(Effect.map((result) => optional(result)))
|
|
24
|
-
|
|
25
|
-
export const text = (opts: Parameters<typeof prompts.text>[0]) =>
|
|
26
|
-
Effect.promise(() => prompts.text(opts)).pipe(Effect.map((result) => optional(result)))
|
|
27
|
-
|
|
28
|
-
export const password = (opts: Parameters<typeof prompts.password>[0]) =>
|
|
29
|
-
Effect.promise(() => prompts.password(opts)).pipe(Effect.map((result) => optional(result)))
|
|
30
|
-
|
|
31
|
-
export const spinner = () => {
|
|
32
|
-
const s = prompts.spinner()
|
|
33
|
-
return {
|
|
34
|
-
start: (msg: string) => Effect.sync(() => s.start(msg)),
|
|
35
|
-
stop: (msg: string, code?: number) => Effect.sync(() => s.stop(msg, code)),
|
|
36
|
-
}
|
|
37
|
-
}
|
package/src/cli/effect-cmd.ts
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import type { Argv } from "yargs"
|
|
2
|
-
import { Effect, Schema } from "effect"
|
|
3
|
-
import type { AppServices } from "@/effect/app-runtime"
|
|
4
|
-
import type { InstanceStore } from "@/project/instance-store"
|
|
5
|
-
import { cmd, type WithDoubleDash } from "./cmd/cmd"
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* User-visible command failure. Throw via `fail("...")` from an effectCmd handler
|
|
9
|
-
* to surface a printed message + non-zero exit. Recognised by the global error
|
|
10
|
-
* formatter in `src/cli/error.ts` (FormatError), so the existing top-level
|
|
11
|
-
* catch + cleanup in `src/index.ts` runs normally.
|
|
12
|
-
*/
|
|
13
|
-
export class CliError extends Schema.TaggedErrorClass<CliError>()("CliError", {
|
|
14
|
-
message: Schema.String,
|
|
15
|
-
exitCode: Schema.optional(Schema.Number),
|
|
16
|
-
}) {}
|
|
17
|
-
|
|
18
|
-
export const fail = (message: string, exitCode = 1) => Effect.fail(new CliError({ message, exitCode }))
|
|
19
|
-
|
|
20
|
-
interface EffectCmdOpts<Args, A> {
|
|
21
|
-
command: string | readonly string[]
|
|
22
|
-
aliases?: string | readonly string[]
|
|
23
|
-
describe: string | false
|
|
24
|
-
builder?: (yargs: Argv) => Argv<Args>
|
|
25
|
-
/**
|
|
26
|
-
* Whether the command needs a project InstanceContext. Defaults to true.
|
|
27
|
-
*
|
|
28
|
-
* `true` (default): wraps the handler in `InstanceStore.Service.provide({directory})`
|
|
29
|
-
* so `InstanceRef` resolves to a loaded `InstanceContext`. Auto-disposes via
|
|
30
|
-
* `Effect.ensuring(store.dispose(ctx))` on every Exit (matches the legacy
|
|
31
|
-
* `bootstrap()` finally-disposal). Runs InstanceBootstrap (config + plugin
|
|
32
|
-
* init + LSP/File/etc forks) eagerly.
|
|
33
|
-
*
|
|
34
|
-
* `false`: skip the instance entirely. Saves the InstanceBootstrap work and
|
|
35
|
-
* suppresses the `server.instance.disposed` IPC event. The handler runs
|
|
36
|
-
* directly under AppRuntime — it can yield any `AppServices` but must not
|
|
37
|
-
* yield `InstanceRef` (it'd be undefined, causing a defect).
|
|
38
|
-
*
|
|
39
|
-
* Function form: `(args) => boolean` decides per-invocation. Useful for
|
|
40
|
-
* commands like `run --attach <url>` where one flag flips between local
|
|
41
|
-
* (needs instance) and remote (doesn't).
|
|
42
|
-
*
|
|
43
|
-
* Use `false` for commands that don't read project state (e.g. `models`,
|
|
44
|
-
* `serve`, `web`, `account`, `db`, `upgrade`).
|
|
45
|
-
*/
|
|
46
|
-
instance?: boolean | ((args: Args) => boolean)
|
|
47
|
-
/** Defaults to process.cwd(). Override for commands that take a directory positional. */
|
|
48
|
-
directory?: (args: Args) => string
|
|
49
|
-
handler: (args: WithDoubleDash<Args>) => Effect.Effect<A, CliError, AppServices | InstanceStore.Service>
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Effect-native CLI command builder. Wraps yargs `cmd()` so the handler body is
|
|
54
|
-
* an `Effect` with `InstanceRef` provided and any `AppServices` yieldable.
|
|
55
|
-
*
|
|
56
|
-
* The handler is wrapped in `Effect.ensuring(store.dispose(ctx))` so the loaded
|
|
57
|
-
* InstanceContext is disposed (runDisposers + IPC `server.instance.disposed`)
|
|
58
|
-
* on every Exit — success, typed failure, defect, or interruption. Matches the
|
|
59
|
-
* legacy `bootstrap()` finally-disposal semantics without per-handler boilerplate.
|
|
60
|
-
*
|
|
61
|
-
* Errors propagate to the existing top-level handler in `src/index.ts`; use
|
|
62
|
-
* `fail("...")` for user-visible domain failures (clean exit, formatted message).
|
|
63
|
-
*
|
|
64
|
-
* Handlers are typically `Effect.fn("Cli.<name>")(function*(args) { ... })`,
|
|
65
|
-
* which adds a named tracing span per CLI invocation. Once all commands use
|
|
66
|
-
* `effectCmd`, swapping the underlying `cmd()` factory for effect/cli's
|
|
67
|
-
* `Command.make(...)` won't touch any handler bodies.
|
|
68
|
-
*/
|
|
69
|
-
export const effectCmd = <Args, A>(opts: EffectCmdOpts<Args, A>) =>
|
|
70
|
-
cmd<{}, Args>({
|
|
71
|
-
command: opts.command,
|
|
72
|
-
aliases: opts.aliases,
|
|
73
|
-
describe: opts.describe,
|
|
74
|
-
builder: opts.builder as never,
|
|
75
|
-
async handler(rawArgs) {
|
|
76
|
-
const { AppRuntime } = await import("@/effect/app-runtime")
|
|
77
|
-
// yargs typing wraps Args in ArgumentsCamelCase<WithDoubleDash<...>>; cast at the boundary.
|
|
78
|
-
const args = rawArgs as unknown as WithDoubleDash<Args>
|
|
79
|
-
const useInstance = typeof opts.instance === "function" ? opts.instance(args) : opts.instance !== false
|
|
80
|
-
if (!useInstance) {
|
|
81
|
-
await AppRuntime.runPromise(opts.handler(args))
|
|
82
|
-
return
|
|
83
|
-
}
|
|
84
|
-
const { InstanceStore } = await import("@/project/instance-store")
|
|
85
|
-
const { InstanceRef } = await import("@/effect/instance-ref")
|
|
86
|
-
const directory = opts.directory?.(args) ?? process.cwd()
|
|
87
|
-
const { store, ctx } = await AppRuntime.runPromise(
|
|
88
|
-
InstanceStore.Service.use((store) => store.load({ directory }).pipe(Effect.map((ctx) => ({ store, ctx })))),
|
|
89
|
-
)
|
|
90
|
-
try {
|
|
91
|
-
await AppRuntime.runPromise(opts.handler(args).pipe(Effect.provideService(InstanceRef, ctx)))
|
|
92
|
-
} finally {
|
|
93
|
-
await AppRuntime.runPromise(store.dispose(ctx))
|
|
94
|
-
}
|
|
95
|
-
},
|
|
96
|
-
})
|
package/src/cli/error.ts
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { NamedError } from "@opencode-ai/core/util/error"
|
|
2
|
-
import { errorFormat } from "@/util/error"
|
|
3
|
-
import { isRecord } from "@/util/record"
|
|
4
|
-
|
|
5
|
-
type ConfigIssue = { message: string; path: string[] }
|
|
6
|
-
|
|
7
|
-
function isTaggedError(error: unknown, tag: string): error is Record<string, unknown> {
|
|
8
|
-
return isRecord(error) && error._tag === tag
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function configData(input: unknown, tag: string): Record<string, unknown> | undefined {
|
|
12
|
-
if (!isRecord(input)) return undefined
|
|
13
|
-
if (input.name === tag && isRecord(input.data)) return input.data
|
|
14
|
-
if (input._tag === tag) return input
|
|
15
|
-
return undefined
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function stringField(input: Record<string, unknown>, key: string): string | undefined {
|
|
19
|
-
return typeof input[key] === "string" ? input[key] : undefined
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function configIssues(input: Record<string, unknown>): ConfigIssue[] {
|
|
23
|
-
return Array.isArray(input.issues)
|
|
24
|
-
? input.issues.filter((issue): issue is ConfigIssue => {
|
|
25
|
-
if (!isRecord(issue)) return false
|
|
26
|
-
return (
|
|
27
|
-
typeof issue.message === "string" &&
|
|
28
|
-
Array.isArray(issue.path) &&
|
|
29
|
-
issue.path.every((x) => typeof x === "string")
|
|
30
|
-
)
|
|
31
|
-
})
|
|
32
|
-
: []
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export function FormatError(input: unknown): string | undefined {
|
|
36
|
-
if (input instanceof Error && isRecord(input.cause) && "body" in input.cause) {
|
|
37
|
-
const formatted = FormatError(input.cause.body)
|
|
38
|
-
if (formatted) return formatted
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// CliError: domain failure surfaced from an effectCmd handler via fail("...")
|
|
42
|
-
if (isTaggedError(input, "CliError")) {
|
|
43
|
-
if (typeof input.exitCode === "number") process.exitCode = input.exitCode
|
|
44
|
-
return stringField(input, "message") ?? ""
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// MCPFailed: { name: string }
|
|
48
|
-
if (NamedError.hasName(input, "MCPFailed")) {
|
|
49
|
-
const data = isRecord(input) && isRecord(input.data) ? stringField(input.data, "name") : undefined
|
|
50
|
-
return `MCP server "${data}" failed. Note, opencode does not support MCP authentication yet.`
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// AccountServiceError, AccountTransportError: TaggedErrorClass
|
|
54
|
-
if (isTaggedError(input, "AccountServiceError") || isTaggedError(input, "AccountTransportError")) {
|
|
55
|
-
return stringField(input, "message") ?? ""
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// ProviderModelNotFoundError: { providerID: string, modelID: string, suggestions?: string[] }
|
|
59
|
-
const providerModelNotFound = configData(input, "ProviderModelNotFoundError")
|
|
60
|
-
if (providerModelNotFound) {
|
|
61
|
-
const suggestions = Array.isArray(providerModelNotFound.suggestions)
|
|
62
|
-
? providerModelNotFound.suggestions.filter((x) => typeof x === "string")
|
|
63
|
-
: []
|
|
64
|
-
return [
|
|
65
|
-
`Model not found: ${stringField(providerModelNotFound, "providerID")}/${stringField(providerModelNotFound, "modelID")}`,
|
|
66
|
-
...(suggestions.length ? ["Did you mean: " + suggestions.join(", ")] : []),
|
|
67
|
-
`Try: \`opencode models\` to list available models`,
|
|
68
|
-
`Or check your config (opencode.json) provider/model names`,
|
|
69
|
-
].join("\n")
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// ProviderInitError: { providerID: string }
|
|
73
|
-
const providerInit = configData(input, "ProviderInitError")
|
|
74
|
-
if (providerInit) {
|
|
75
|
-
return `Failed to initialize provider "${stringField(providerInit, "providerID")}". Check credentials and configuration.`
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
// ConfigJsonError: { path: string, message?: string }
|
|
79
|
-
const configJson = configData(input, "ConfigJsonError")
|
|
80
|
-
if (configJson) {
|
|
81
|
-
const message = stringField(configJson, "message")
|
|
82
|
-
return `Config file at ${stringField(configJson, "path")} is not valid JSON(C)` + (message ? `: ${message}` : "")
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// ConfigDirectoryTypoError: { dir: string, path: string, suggestion: string }
|
|
86
|
-
const configDirectoryTypo = configData(input, "ConfigDirectoryTypoError")
|
|
87
|
-
if (configDirectoryTypo) {
|
|
88
|
-
return `Directory "${stringField(configDirectoryTypo, "dir")}" in ${stringField(configDirectoryTypo, "path")} is not valid. Rename the directory to "${stringField(configDirectoryTypo, "suggestion")}" or remove it. This is a common typo.`
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// ConfigFrontmatterError: { message: string }
|
|
92
|
-
const configFrontmatter = configData(input, "ConfigFrontmatterError")
|
|
93
|
-
if (configFrontmatter) {
|
|
94
|
-
return stringField(configFrontmatter, "message") ?? ""
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// ConfigRemoteAuthError: { url: string, remote: string }
|
|
98
|
-
const remoteAuth = configData(input, "ConfigRemoteAuthError")
|
|
99
|
-
if (remoteAuth) {
|
|
100
|
-
const url = stringField(remoteAuth, "url")
|
|
101
|
-
const remote = stringField(remoteAuth, "remote")
|
|
102
|
-
return [
|
|
103
|
-
`Failed to load remote config${remote ? ` from ${remote}` : ""}: the server returned a login page instead of JSON.`,
|
|
104
|
-
`Authentication is missing or has expired (the endpoint is likely behind an SSO or identity-aware proxy).`,
|
|
105
|
-
...(url ? [`Run \`opencode auth login ${url}\` to re-authenticate.`] : []),
|
|
106
|
-
].join("\n")
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// ConfigInvalidError: { path?: string, message?: string, issues?: Array<{ message: string, path: string[] }> }
|
|
110
|
-
const configInvalid = configData(input, "ConfigInvalidError")
|
|
111
|
-
if (configInvalid) {
|
|
112
|
-
const path = stringField(configInvalid, "path")
|
|
113
|
-
const message = stringField(configInvalid, "message")
|
|
114
|
-
const issues = configIssues(configInvalid)
|
|
115
|
-
return [
|
|
116
|
-
`Configuration is invalid${path && path !== "config" ? ` at ${path}` : ""}` + (message ? `: ${message}` : ""),
|
|
117
|
-
...issues.map((issue) => "↳ " + issue.message + " " + issue.path.join(".")),
|
|
118
|
-
].join("\n")
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// UICancelledError: user cancelled an interactive CLI prompt
|
|
122
|
-
if (isTaggedError(input, "UICancelledError") || NamedError.hasName(input, "UICancelledError")) {
|
|
123
|
-
return ""
|
|
124
|
-
}
|
|
125
|
-
return undefined
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
export function FormatUnknownError(input: unknown): string {
|
|
129
|
-
return errorFormat(input)
|
|
130
|
-
}
|
package/src/cli/heap.ts
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import path from "path"
|
|
2
|
-
import { writeHeapSnapshot } from "node:v8"
|
|
3
|
-
import { Flag } from "@opencode-ai/core/flag/flag"
|
|
4
|
-
import { Global } from "@opencode-ai/core/global"
|
|
5
|
-
const MINUTE = 60_000
|
|
6
|
-
const LIMIT = 2 * 1024 * 1024 * 1024
|
|
7
|
-
|
|
8
|
-
let timer: Timer | undefined
|
|
9
|
-
let lock = false
|
|
10
|
-
let armed = true
|
|
11
|
-
|
|
12
|
-
export function start() {
|
|
13
|
-
if (!Flag.OPENCODE_AUTO_HEAP_SNAPSHOT) return
|
|
14
|
-
if (timer) return
|
|
15
|
-
|
|
16
|
-
const run = async () => {
|
|
17
|
-
if (lock) return
|
|
18
|
-
|
|
19
|
-
const stat = process.memoryUsage()
|
|
20
|
-
if (stat.rss <= LIMIT) {
|
|
21
|
-
armed = true
|
|
22
|
-
return
|
|
23
|
-
}
|
|
24
|
-
if (!armed) return
|
|
25
|
-
|
|
26
|
-
lock = true
|
|
27
|
-
armed = false
|
|
28
|
-
const file = path.join(
|
|
29
|
-
Global.Path.log,
|
|
30
|
-
`heap-${process.pid}-${new Date().toISOString().replace(/[:.]/g, "")}.heapsnapshot`,
|
|
31
|
-
)
|
|
32
|
-
await Promise.resolve()
|
|
33
|
-
.then(() => writeHeapSnapshot(file))
|
|
34
|
-
.catch(() => {})
|
|
35
|
-
|
|
36
|
-
lock = false
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
timer = setInterval(() => {
|
|
40
|
-
void run()
|
|
41
|
-
}, MINUTE)
|
|
42
|
-
timer.unref?.()
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export * as Heap from "./heap"
|
package/src/cli/logo-pixel.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
// ONLYCODE pixel-style Logo
|
|
2
|
-
// Each letter 8 chars wide, 7 rows tall, 1 space between letters
|
|
3
|
-
|
|
4
|
-
export const pixelLogo = {
|
|
5
|
-
only: [
|
|
6
|
-
"████████ ██ ██ ██ ██ ██",
|
|
7
|
-
"██ ██ ███ ██ ██ ██ ██",
|
|
8
|
-
"██ ██ ████ ██ ██ ██ ██ ",
|
|
9
|
-
"██ ██ ████████ ██ ████ ",
|
|
10
|
-
"██ ██ ██ ████ ██ ██ ",
|
|
11
|
-
"██ ██ ██ ███ ██ ██ ",
|
|
12
|
-
"████████ ██ ██ ████████ ██ "
|
|
13
|
-
],
|
|
14
|
-
code: [
|
|
15
|
-
"████████ ████████ ██████ ████████",
|
|
16
|
-
"██ ██ ██ ██ ██ ██ ",
|
|
17
|
-
"██ ██ ██ ██ ██ ██ ",
|
|
18
|
-
"██ ██ ██ ██ ██ ████████",
|
|
19
|
-
"██ ██ ██ ██ ██ ██ ",
|
|
20
|
-
"██ ██ ██ ██ ██ ██ ",
|
|
21
|
-
"████████ ████████ ██████ ████████"
|
|
22
|
-
],
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Color config
|
|
26
|
-
export const pixelColors = {
|
|
27
|
-
only: {
|
|
28
|
-
fg: "#22c55e",
|
|
29
|
-
style: "bold #22c55e",
|
|
30
|
-
},
|
|
31
|
-
code: {
|
|
32
|
-
fg: "#4ade80",
|
|
33
|
-
style: "bold #4ade80",
|
|
34
|
-
},
|
|
35
|
-
}
|
package/src/cli/logo.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from "@opencode-ai/tui/logo"
|
package/src/cli/network.ts
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import type { Argv, InferredOptionTypes } from "yargs"
|
|
2
|
-
import { ConfigV1 } from "@opencode-ai/core/v1/config/config"
|
|
3
|
-
import type { Config } from "@/config/config"
|
|
4
|
-
import { Effect } from "effect"
|
|
5
|
-
|
|
6
|
-
const options = {
|
|
7
|
-
port: {
|
|
8
|
-
type: "number" as const,
|
|
9
|
-
describe: "port to listen on",
|
|
10
|
-
default: 0,
|
|
11
|
-
},
|
|
12
|
-
hostname: {
|
|
13
|
-
type: "string" as const,
|
|
14
|
-
describe: "hostname to listen on",
|
|
15
|
-
default: "127.0.0.1",
|
|
16
|
-
},
|
|
17
|
-
mdns: {
|
|
18
|
-
type: "boolean" as const,
|
|
19
|
-
describe: "enable mDNS service discovery (defaults hostname to 0.0.0.0)",
|
|
20
|
-
default: false,
|
|
21
|
-
},
|
|
22
|
-
"mdns-domain": {
|
|
23
|
-
type: "string" as const,
|
|
24
|
-
describe: "custom domain name for mDNS service (default: opencode.local)",
|
|
25
|
-
default: "opencode.local",
|
|
26
|
-
},
|
|
27
|
-
cors: {
|
|
28
|
-
type: "string" as const,
|
|
29
|
-
array: true,
|
|
30
|
-
describe: "additional domains to allow for CORS",
|
|
31
|
-
default: [] as string[],
|
|
32
|
-
},
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export type NetworkOptions = InferredOptionTypes<typeof options>
|
|
36
|
-
|
|
37
|
-
export function withNetworkOptions<T>(yargs: Argv<T>) {
|
|
38
|
-
return yargs.options(options)
|
|
39
|
-
}
|
|
40
|
-
export const resolveNetworkOptions = Effect.fn("Cli.resolveNetworkOptions")(function* (args: NetworkOptions) {
|
|
41
|
-
const { Config } = yield* Effect.promise(() => import("@/config/config"))
|
|
42
|
-
const config = yield* Config.Service.use((cfg) => cfg.getGlobal())
|
|
43
|
-
return resolveNetworkOptionsNoConfig(args, config)
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
export function resolveNetworkOptionsNoConfig(args: NetworkOptions, config?: ConfigV1.Info) {
|
|
47
|
-
const portExplicitlySet = process.argv.includes("--port")
|
|
48
|
-
const hostnameExplicitlySet = process.argv.includes("--hostname")
|
|
49
|
-
const mdnsExplicitlySet = process.argv.includes("--mdns")
|
|
50
|
-
const mdnsDomainExplicitlySet = process.argv.includes("--mdns-domain")
|
|
51
|
-
const mdns = mdnsExplicitlySet ? args.mdns : (config?.server?.mdns ?? args.mdns)
|
|
52
|
-
const mdnsDomain = mdnsDomainExplicitlySet ? args["mdns-domain"] : (config?.server?.mdnsDomain ?? args["mdns-domain"])
|
|
53
|
-
const port = portExplicitlySet ? args.port : (config?.server?.port ?? args.port)
|
|
54
|
-
const hostname = hostnameExplicitlySet
|
|
55
|
-
? args.hostname
|
|
56
|
-
: mdns && !config?.server?.hostname
|
|
57
|
-
? "0.0.0.0"
|
|
58
|
-
: (config?.server?.hostname ?? args.hostname)
|
|
59
|
-
const configCors = config?.server?.cors ?? []
|
|
60
|
-
const argsCors = Array.isArray(args.cors) ? args.cors : args.cors ? [args.cors] : []
|
|
61
|
-
const cors = [...configCors, ...argsCors]
|
|
62
|
-
|
|
63
|
-
return { hostname, port, mdns, mdnsDomain, cors }
|
|
64
|
-
}
|
package/src/cli/tui/layer.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { createOpencodeClient } from "@opencode-ai/sdk/v2"
|
|
2
|
-
import { SessionID } from "@/session/schema"
|
|
3
|
-
import { Schema } from "effect"
|
|
4
|
-
|
|
5
|
-
const decodeSessionID = Schema.decodeUnknownSync(SessionID)
|
|
6
|
-
|
|
7
|
-
export async function validateSession(input: {
|
|
8
|
-
url: string
|
|
9
|
-
sessionID?: string
|
|
10
|
-
directory?: string
|
|
11
|
-
fetch?: typeof fetch
|
|
12
|
-
headers?: RequestInit["headers"]
|
|
13
|
-
}) {
|
|
14
|
-
if (!input.sessionID) return
|
|
15
|
-
|
|
16
|
-
let sessionID: SessionID
|
|
17
|
-
try {
|
|
18
|
-
sessionID = decodeSessionID(input.sessionID)
|
|
19
|
-
} catch (error) {
|
|
20
|
-
throw new Error(`Invalid session ID: ${error instanceof Error ? error.message : "unknown error"}`, { cause: error })
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
await createOpencodeClient({
|
|
24
|
-
baseUrl: input.url,
|
|
25
|
-
directory: input.directory,
|
|
26
|
-
fetch: input.fetch,
|
|
27
|
-
headers: input.headers,
|
|
28
|
-
}).session.get({ sessionID }, { throwOnError: true })
|
|
29
|
-
}
|
package/src/cli/tui/worker.ts
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { Server } from "@/server/server"
|
|
2
|
-
import { InstanceRuntime } from "@/project/instance-runtime"
|
|
3
|
-
import { Rpc } from "@/util/rpc"
|
|
4
|
-
import { upgrade } from "@/cli/upgrade"
|
|
5
|
-
import { Config } from "@/config/config"
|
|
6
|
-
import { GlobalBus } from "@/bus/global"
|
|
7
|
-
import { ServerAuth } from "@/server/auth"
|
|
8
|
-
import { writeHeapSnapshot } from "node:v8"
|
|
9
|
-
import { Heap } from "@/cli/heap"
|
|
10
|
-
import { AppRuntime } from "@/effect/app-runtime"
|
|
11
|
-
import { Effect } from "effect"
|
|
12
|
-
import { disposeAllInstancesAndEmitGlobalDisposed } from "@/server/global-lifecycle"
|
|
13
|
-
|
|
14
|
-
Heap.start()
|
|
15
|
-
|
|
16
|
-
// Subscribe to global events and forward them via RPC
|
|
17
|
-
GlobalBus.on("event", (event) => {
|
|
18
|
-
Rpc.emit("global.event", event)
|
|
19
|
-
})
|
|
20
|
-
|
|
21
|
-
let server: Awaited<ReturnType<typeof Server.listen>> | undefined
|
|
22
|
-
|
|
23
|
-
export const rpc = {
|
|
24
|
-
async fetch(input: { url: string; method: string; headers: Record<string, string>; body?: string }) {
|
|
25
|
-
const headers = { ...input.headers }
|
|
26
|
-
const auth = ServerAuth.header()
|
|
27
|
-
if (auth && !headers["authorization"] && !headers["Authorization"]) {
|
|
28
|
-
headers["Authorization"] = auth
|
|
29
|
-
}
|
|
30
|
-
const request = new Request(input.url, {
|
|
31
|
-
method: input.method,
|
|
32
|
-
headers,
|
|
33
|
-
body: input.body,
|
|
34
|
-
})
|
|
35
|
-
const response = await Server.Default().app.fetch(request)
|
|
36
|
-
const body = await response.text()
|
|
37
|
-
return {
|
|
38
|
-
status: response.status,
|
|
39
|
-
headers: Object.fromEntries(response.headers.entries()),
|
|
40
|
-
body,
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
snapshot() {
|
|
44
|
-
const result = writeHeapSnapshot("server.heapsnapshot")
|
|
45
|
-
return result
|
|
46
|
-
},
|
|
47
|
-
async server(input: { port: number; hostname: string; mdns?: boolean; cors?: string[] }) {
|
|
48
|
-
if (server) await server.stop(true)
|
|
49
|
-
server = await Server.listen(input)
|
|
50
|
-
return { url: server.url.toString() }
|
|
51
|
-
},
|
|
52
|
-
async checkUpgrade(input: { directory: string }) {
|
|
53
|
-
await InstanceRuntime.load({ directory: input.directory })
|
|
54
|
-
await upgrade().catch(() => {})
|
|
55
|
-
},
|
|
56
|
-
async reload() {
|
|
57
|
-
await AppRuntime.runPromise(
|
|
58
|
-
Effect.gen(function* () {
|
|
59
|
-
const cfg = yield* Config.Service
|
|
60
|
-
yield* cfg.invalidate()
|
|
61
|
-
yield* disposeAllInstancesAndEmitGlobalDisposed({ swallowErrors: true })
|
|
62
|
-
}),
|
|
63
|
-
)
|
|
64
|
-
},
|
|
65
|
-
async shutdown() {
|
|
66
|
-
await InstanceRuntime.disposeAllInstances()
|
|
67
|
-
if (server) await server.stop(true)
|
|
68
|
-
},
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
Rpc.listen(rpc)
|