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
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { AsyncLocalStorage } from "async_hooks"
|
|
2
|
-
|
|
3
|
-
export class NotFound extends Error {
|
|
4
|
-
constructor(public override readonly name: string) {
|
|
5
|
-
super(`No context found for ${name}`)
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export function create<T>(name: string) {
|
|
10
|
-
const storage = new AsyncLocalStorage<T>()
|
|
11
|
-
return {
|
|
12
|
-
use() {
|
|
13
|
-
const result = storage.getStore()
|
|
14
|
-
if (!result) {
|
|
15
|
-
throw new NotFound(name)
|
|
16
|
-
}
|
|
17
|
-
return result
|
|
18
|
-
},
|
|
19
|
-
provide<R>(value: T, fn: () => R) {
|
|
20
|
-
return storage.run(value, fn)
|
|
21
|
-
},
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export * as LocalContext from "./local-context"
|
package/src/util/locale.ts
DELETED
package/src/util/media.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
const startsWith = (bytes: Uint8Array, prefix: number[]) => prefix.every((value, index) => bytes[index] === value)
|
|
2
|
-
|
|
3
|
-
export function isPdfAttachment(mime: string) {
|
|
4
|
-
return mime === "application/pdf"
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export function isMedia(mime: string) {
|
|
8
|
-
return mime.startsWith("image/") || isPdfAttachment(mime)
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function isImageAttachment(mime: string) {
|
|
12
|
-
return mime.startsWith("image/") && mime !== "image/svg+xml" && mime !== "image/vnd.fastbidsheet"
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function sniffAttachmentMime(bytes: Uint8Array, fallback: string) {
|
|
16
|
-
if (startsWith(bytes, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) return "image/png"
|
|
17
|
-
if (startsWith(bytes, [0xff, 0xd8, 0xff])) return "image/jpeg"
|
|
18
|
-
if (startsWith(bytes, [0x47, 0x49, 0x46, 0x38])) return "image/gif"
|
|
19
|
-
if (startsWith(bytes, [0x42, 0x4d])) return "image/bmp"
|
|
20
|
-
if (startsWith(bytes, [0x25, 0x50, 0x44, 0x46, 0x2d])) return "application/pdf"
|
|
21
|
-
if (startsWith(bytes, [0x52, 0x49, 0x46, 0x46]) && startsWith(bytes.subarray(8), [0x57, 0x45, 0x42, 0x50])) {
|
|
22
|
-
return "image/webp"
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return fallback
|
|
26
|
-
}
|
package/src/util/process.ts
DELETED
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
import { type ChildProcess } from "child_process"
|
|
2
|
-
import type { Stream } from "node:stream"
|
|
3
|
-
import launch from "cross-spawn"
|
|
4
|
-
import { buffer } from "node:stream/consumers"
|
|
5
|
-
import { errorMessage } from "./error"
|
|
6
|
-
|
|
7
|
-
export type Stdio = "inherit" | "pipe" | "ignore" | number | Stream
|
|
8
|
-
export type Shell = boolean | string
|
|
9
|
-
|
|
10
|
-
export interface Options {
|
|
11
|
-
cwd?: string
|
|
12
|
-
env?: NodeJS.ProcessEnv | null
|
|
13
|
-
stdin?: Stdio
|
|
14
|
-
stdout?: Stdio
|
|
15
|
-
stderr?: Stdio
|
|
16
|
-
shell?: Shell
|
|
17
|
-
abort?: AbortSignal
|
|
18
|
-
kill?: NodeJS.Signals | number
|
|
19
|
-
timeout?: number
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface RunOptions extends Omit<Options, "stdout" | "stderr"> {
|
|
23
|
-
nothrow?: boolean
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface Result {
|
|
27
|
-
code: number
|
|
28
|
-
stdout: Buffer
|
|
29
|
-
stderr: Buffer
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface TextResult extends Result {
|
|
33
|
-
text: string
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export class RunFailedError extends Error {
|
|
37
|
-
readonly cmd: string[]
|
|
38
|
-
readonly code: number
|
|
39
|
-
readonly stdout: Buffer
|
|
40
|
-
readonly stderr: Buffer
|
|
41
|
-
|
|
42
|
-
constructor(cmd: string[], code: number, stdout: Buffer, stderr: Buffer) {
|
|
43
|
-
const text = stderr.toString().trim()
|
|
44
|
-
super(
|
|
45
|
-
text
|
|
46
|
-
? `Command failed with code ${code}: ${cmd.join(" ")}\n${text}`
|
|
47
|
-
: `Command failed with code ${code}: ${cmd.join(" ")}`,
|
|
48
|
-
)
|
|
49
|
-
this.name = "ProcessRunFailedError"
|
|
50
|
-
this.cmd = [...cmd]
|
|
51
|
-
this.code = code
|
|
52
|
-
this.stdout = stdout
|
|
53
|
-
this.stderr = stderr
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export type Child = ChildProcess & { exited: Promise<number> }
|
|
58
|
-
|
|
59
|
-
export function spawn(cmd: string[], opts: Options = {}): Child {
|
|
60
|
-
if (cmd.length === 0) throw new Error("Command is required")
|
|
61
|
-
opts.abort?.throwIfAborted()
|
|
62
|
-
|
|
63
|
-
const proc = launch(cmd[0], cmd.slice(1), {
|
|
64
|
-
cwd: opts.cwd,
|
|
65
|
-
shell: opts.shell,
|
|
66
|
-
env: opts.env === null ? {} : opts.env ? { ...process.env, ...opts.env } : undefined,
|
|
67
|
-
stdio: [opts.stdin ?? "ignore", opts.stdout ?? "ignore", opts.stderr ?? "ignore"],
|
|
68
|
-
windowsHide: process.platform === "win32",
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
let closed = false
|
|
72
|
-
let timer: ReturnType<typeof setTimeout> | undefined
|
|
73
|
-
|
|
74
|
-
const abort = () => {
|
|
75
|
-
if (closed) return
|
|
76
|
-
if (proc.exitCode !== null || proc.signalCode !== null) return
|
|
77
|
-
closed = true
|
|
78
|
-
|
|
79
|
-
proc.kill(opts.kill ?? "SIGTERM")
|
|
80
|
-
|
|
81
|
-
const ms = opts.timeout ?? 5_000
|
|
82
|
-
if (ms <= 0) return
|
|
83
|
-
timer = setTimeout(() => proc.kill("SIGKILL"), ms)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const exited = new Promise<number>((resolve, reject) => {
|
|
87
|
-
const done = () => {
|
|
88
|
-
opts.abort?.removeEventListener("abort", abort)
|
|
89
|
-
if (timer) clearTimeout(timer)
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
proc.once("exit", (code, signal) => {
|
|
93
|
-
done()
|
|
94
|
-
resolve(code ?? (signal ? 1 : 0))
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
proc.once("error", (error) => {
|
|
98
|
-
done()
|
|
99
|
-
reject(error)
|
|
100
|
-
})
|
|
101
|
-
})
|
|
102
|
-
void exited.catch(() => undefined)
|
|
103
|
-
|
|
104
|
-
if (opts.abort) {
|
|
105
|
-
opts.abort.addEventListener("abort", abort, { once: true })
|
|
106
|
-
if (opts.abort.aborted) abort()
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const child = proc as Child
|
|
110
|
-
child.exited = exited
|
|
111
|
-
return child
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export async function run(cmd: string[], opts: RunOptions = {}): Promise<Result> {
|
|
115
|
-
const proc = spawn(cmd, {
|
|
116
|
-
cwd: opts.cwd,
|
|
117
|
-
env: opts.env,
|
|
118
|
-
stdin: opts.stdin,
|
|
119
|
-
shell: opts.shell,
|
|
120
|
-
abort: opts.abort,
|
|
121
|
-
kill: opts.kill,
|
|
122
|
-
timeout: opts.timeout,
|
|
123
|
-
stdout: "pipe",
|
|
124
|
-
stderr: "pipe",
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
if (!proc.stdout || !proc.stderr) throw new Error("Process output not available")
|
|
128
|
-
|
|
129
|
-
const out = await Promise.all([proc.exited, buffer(proc.stdout), buffer(proc.stderr)])
|
|
130
|
-
.then(([code, stdout, stderr]) => ({
|
|
131
|
-
code,
|
|
132
|
-
stdout,
|
|
133
|
-
stderr,
|
|
134
|
-
}))
|
|
135
|
-
.catch((err: unknown) => {
|
|
136
|
-
if (!opts.nothrow) throw err
|
|
137
|
-
return {
|
|
138
|
-
code: 1,
|
|
139
|
-
stdout: Buffer.alloc(0),
|
|
140
|
-
stderr: Buffer.from(errorMessage(err)),
|
|
141
|
-
}
|
|
142
|
-
})
|
|
143
|
-
if (out.code === 0 || opts.nothrow) return out
|
|
144
|
-
throw new RunFailedError(cmd, out.code, out.stdout, out.stderr)
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Duplicated in `packages/sdk/js/src/process.ts` because the SDK cannot import
|
|
148
|
-
// `opencode` without creating a cycle. Keep both copies in sync.
|
|
149
|
-
export async function stop(proc: ChildProcess) {
|
|
150
|
-
if (proc.exitCode !== null || proc.signalCode !== null) return
|
|
151
|
-
|
|
152
|
-
if (process.platform !== "win32" || !proc.pid) {
|
|
153
|
-
proc.kill()
|
|
154
|
-
return
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
const out = await run(["taskkill", "/pid", String(proc.pid), "/T", "/F"], {
|
|
158
|
-
nothrow: true,
|
|
159
|
-
})
|
|
160
|
-
|
|
161
|
-
if (out.code === 0) return
|
|
162
|
-
proc.kill()
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
export async function text(cmd: string[], opts: RunOptions = {}): Promise<TextResult> {
|
|
166
|
-
const out = await run(cmd, opts)
|
|
167
|
-
return {
|
|
168
|
-
...out,
|
|
169
|
-
text: out.stdout.toString(),
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
export async function lines(cmd: string[], opts: RunOptions = {}): Promise<string[]> {
|
|
174
|
-
return (await text(cmd, opts)).text.split(/\r?\n/).filter(Boolean)
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
export * as Process from "./process"
|
package/src/util/proxy-env.ts
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Adapted from proxy-from-env: https://github.com/Rob--W/proxy-from-env
|
|
3
|
-
*
|
|
4
|
-
* The MIT License
|
|
5
|
-
*
|
|
6
|
-
* Copyright (C) 2016-2018 Rob Wu <rob@robwu.nl>
|
|
7
|
-
*
|
|
8
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
9
|
-
* this software and associated documentation files (the "Software"), to deal in
|
|
10
|
-
* the Software without restriction, including without limitation the rights to
|
|
11
|
-
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
12
|
-
* of the Software, and to permit persons to whom the Software is furnished to do
|
|
13
|
-
* so, subject to the following conditions:
|
|
14
|
-
*
|
|
15
|
-
* The above copyright notice and this permission notice shall be included in all
|
|
16
|
-
* copies or substantial portions of the Software.
|
|
17
|
-
*
|
|
18
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
19
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
20
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
21
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
22
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
23
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
24
|
-
* SOFTWARE.
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
const DEFAULT_PORTS: Record<string, number> = {
|
|
28
|
-
ftp: 21,
|
|
29
|
-
gopher: 70,
|
|
30
|
-
http: 80,
|
|
31
|
-
https: 443,
|
|
32
|
-
ws: 80,
|
|
33
|
-
wss: 443,
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function getProxyForUrl(input: string | URL) {
|
|
37
|
-
const url = typeof input === "string" ? (URL.canParse(input) ? new URL(input) : undefined) : input
|
|
38
|
-
if (!url) return
|
|
39
|
-
|
|
40
|
-
const protocol = url.protocol.split(":", 1)[0]
|
|
41
|
-
const hostname = url.host.replace(/:\d*$/, "")
|
|
42
|
-
const port = Number.parseInt(url.port) || DEFAULT_PORTS[protocol] || 0
|
|
43
|
-
if (!shouldProxy(hostname, port)) return
|
|
44
|
-
|
|
45
|
-
const proxy = env(`${protocol}_proxy`) || env("all_proxy")
|
|
46
|
-
if (!proxy) return
|
|
47
|
-
return proxy.includes("://") ? proxy : `${protocol}://${proxy}`
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function shouldProxy(hostname: string, port: number) {
|
|
51
|
-
const noProxy = env("no_proxy").toLowerCase()
|
|
52
|
-
if (!noProxy) return true
|
|
53
|
-
if (noProxy === "*") return false
|
|
54
|
-
|
|
55
|
-
return noProxy.split(/[,\s]/).every((proxy) => {
|
|
56
|
-
if (!proxy) return true
|
|
57
|
-
|
|
58
|
-
const parsed = proxy.match(/^(.+):(\d+)$/)
|
|
59
|
-
const proxyHostname = parsed ? parsed[1] : proxy
|
|
60
|
-
const proxyPort = parsed ? Number.parseInt(parsed[2]) : 0
|
|
61
|
-
if (proxyPort && proxyPort !== port) return true
|
|
62
|
-
|
|
63
|
-
if (!/^[.*]/.test(proxyHostname)) return hostname !== proxyHostname
|
|
64
|
-
return !hostname.endsWith(proxyHostname.startsWith("*") ? proxyHostname.slice(1) : proxyHostname)
|
|
65
|
-
})
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function env(key: string) {
|
|
69
|
-
return process.env[key.toLowerCase()] || process.env[key.toUpperCase()] || ""
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export * as ProxyEnv from "./proxy-env"
|
package/src/util/queue.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
export class AsyncQueue<T> implements AsyncIterable<T> {
|
|
2
|
-
private queue: T[] = []
|
|
3
|
-
private resolvers: ((value: T) => void)[] = []
|
|
4
|
-
|
|
5
|
-
push(item: T) {
|
|
6
|
-
const resolve = this.resolvers.shift()
|
|
7
|
-
if (resolve) resolve(item)
|
|
8
|
-
else this.queue.push(item)
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
async next(): Promise<T> {
|
|
12
|
-
if (this.queue.length > 0) return this.queue.shift()!
|
|
13
|
-
return new Promise((resolve) => this.resolvers.push(resolve))
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
async *[Symbol.asyncIterator]() {
|
|
17
|
-
while (true) yield await this.next()
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export async function work<T>(concurrency: number, items: T[], fn: (item: T) => Promise<void>) {
|
|
22
|
-
const pending = [...items]
|
|
23
|
-
await Promise.all(
|
|
24
|
-
Array.from({ length: concurrency }, async () => {
|
|
25
|
-
while (true) {
|
|
26
|
-
const item = pending.pop()
|
|
27
|
-
if (item === undefined) return
|
|
28
|
-
await fn(item)
|
|
29
|
-
}
|
|
30
|
-
}),
|
|
31
|
-
)
|
|
32
|
-
}
|
package/src/util/record.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from "@opencode-ai/tui/util/record"
|
package/src/util/repository.ts
DELETED
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
import path from "path"
|
|
2
|
-
import { fileURLToPath } from "url"
|
|
3
|
-
import { Schema } from "effect"
|
|
4
|
-
import { Global } from "@opencode-ai/core/global"
|
|
5
|
-
|
|
6
|
-
type BaseReference = {
|
|
7
|
-
host: string
|
|
8
|
-
path: string
|
|
9
|
-
segments: string[]
|
|
10
|
-
owner?: string
|
|
11
|
-
repo: string
|
|
12
|
-
remote: string
|
|
13
|
-
label: string
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export type RemoteReference = BaseReference & {
|
|
17
|
-
protocol?: string
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export type FileReference = BaseReference & {
|
|
21
|
-
host: "file"
|
|
22
|
-
protocol: "file:"
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export type Reference = RemoteReference | FileReference
|
|
26
|
-
|
|
27
|
-
export class InvalidRepositoryReferenceError extends Schema.TaggedErrorClass<InvalidRepositoryReferenceError>()(
|
|
28
|
-
"RepositoryInvalidReferenceError",
|
|
29
|
-
{
|
|
30
|
-
repository: Schema.String,
|
|
31
|
-
message: Schema.String,
|
|
32
|
-
},
|
|
33
|
-
) {}
|
|
34
|
-
|
|
35
|
-
export class UnsupportedLocalRepositoryError extends Schema.TaggedErrorClass<UnsupportedLocalRepositoryError>()(
|
|
36
|
-
"RepositoryUnsupportedLocalRepositoryError",
|
|
37
|
-
{
|
|
38
|
-
repository: Schema.String,
|
|
39
|
-
message: Schema.String,
|
|
40
|
-
},
|
|
41
|
-
) {}
|
|
42
|
-
|
|
43
|
-
export class InvalidRepositoryBranchError extends Schema.TaggedErrorClass<InvalidRepositoryBranchError>()(
|
|
44
|
-
"RepositoryInvalidBranchError",
|
|
45
|
-
{
|
|
46
|
-
branch: Schema.String,
|
|
47
|
-
message: Schema.String,
|
|
48
|
-
},
|
|
49
|
-
) {}
|
|
50
|
-
|
|
51
|
-
export type RepositoryError =
|
|
52
|
-
| InvalidRepositoryReferenceError
|
|
53
|
-
| UnsupportedLocalRepositoryError
|
|
54
|
-
| InvalidRepositoryBranchError
|
|
55
|
-
|
|
56
|
-
export function isRepositoryError(error: unknown): error is RepositoryError {
|
|
57
|
-
return (
|
|
58
|
-
error instanceof InvalidRepositoryReferenceError ||
|
|
59
|
-
error instanceof UnsupportedLocalRepositoryError ||
|
|
60
|
-
error instanceof InvalidRepositoryBranchError
|
|
61
|
-
)
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function normalizeRepositoryInput(input: string) {
|
|
65
|
-
return input
|
|
66
|
-
.trim()
|
|
67
|
-
.replace(/^git\+/, "")
|
|
68
|
-
.replace(/#.*$/, "")
|
|
69
|
-
.replace(/\/+$/, "")
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
function trimGitSuffix(input: string) {
|
|
73
|
-
return input.replace(/\.git$/, "")
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function parts(input: string) {
|
|
77
|
-
return input
|
|
78
|
-
.split("/")
|
|
79
|
-
.map((item) => trimGitSuffix(item.trim()))
|
|
80
|
-
.filter(Boolean)
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function safeHost(input: string) {
|
|
84
|
-
return Boolean(input) && !input.startsWith("-") && !/[\s/\\]/.test(input)
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function safeSegment(input: string) {
|
|
88
|
-
return input !== "." && input !== ".." && !input.includes(":") && !/[\s/\\]/.test(input)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
function hostLike(input: string) {
|
|
92
|
-
return input.includes(".") || input.includes(":") || input === "localhost"
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
function withSlash(input: string) {
|
|
96
|
-
return input.endsWith("/") ? input : `${input}/`
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
function githubRemote(pathname: string) {
|
|
100
|
-
const base = process.env.OPENCODE_REPO_CLONE_GITHUB_BASE_URL
|
|
101
|
-
if (!base) return `https://github.com/${pathname}.git`
|
|
102
|
-
return new URL(`${pathname}.git`, withSlash(base)).href
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function buildRemoteReference(input: { host: string; segments: string[]; remote?: string; protocol?: string }) {
|
|
106
|
-
const segments = input.segments.map(trimGitSuffix).filter(Boolean)
|
|
107
|
-
if (!safeHost(input.host) || !segments.length || segments.some((segment) => !safeSegment(segment))) return null
|
|
108
|
-
const pathname = segments.join("/")
|
|
109
|
-
const repo = segments[segments.length - 1]
|
|
110
|
-
const host = input.host.toLowerCase()
|
|
111
|
-
return {
|
|
112
|
-
host,
|
|
113
|
-
path: pathname,
|
|
114
|
-
segments,
|
|
115
|
-
owner: segments.length === 2 ? segments[0] : undefined,
|
|
116
|
-
repo,
|
|
117
|
-
remote: input.remote ?? (host === "github.com" ? githubRemote(pathname) : `https://${host}/${pathname}.git`),
|
|
118
|
-
label: host === "github.com" && segments.length === 2 ? pathname : `${host}/${pathname}`,
|
|
119
|
-
protocol: input.protocol,
|
|
120
|
-
} satisfies RemoteReference
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
function buildFileReference(input: { url: URL; remote: string }) {
|
|
124
|
-
const filePath = path.normalize(fileURLToPath(input.url))
|
|
125
|
-
const segments = filePath.split(/[\\/]+/).filter(Boolean)
|
|
126
|
-
if (!segments.length) return null
|
|
127
|
-
return {
|
|
128
|
-
host: "file",
|
|
129
|
-
path: filePath,
|
|
130
|
-
segments: segments.map((segment) => segment.replace(/:$/, "")),
|
|
131
|
-
owner: undefined,
|
|
132
|
-
repo: trimGitSuffix(segments[segments.length - 1]),
|
|
133
|
-
remote: input.remote,
|
|
134
|
-
label: filePath,
|
|
135
|
-
protocol: "file:",
|
|
136
|
-
} satisfies FileReference
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
export function parseRepositoryReference(input: string) {
|
|
140
|
-
const cleaned = normalizeRepositoryInput(input)
|
|
141
|
-
if (!cleaned) return null
|
|
142
|
-
|
|
143
|
-
const githubPrefixed = cleaned.match(/^github:([^/\s]+)\/([^/\s]+)$/)
|
|
144
|
-
if (githubPrefixed) {
|
|
145
|
-
return buildRemoteReference({ host: "github.com", segments: [githubPrefixed[1], githubPrefixed[2]] })
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
if (!cleaned.includes("://")) {
|
|
149
|
-
const scp = cleaned.match(/^(?:[^@/\s]+@)?([^:/\s]+):(.+)$/)
|
|
150
|
-
if (scp) return buildRemoteReference({ host: scp[1], segments: parts(scp[2]), remote: cleaned })
|
|
151
|
-
|
|
152
|
-
const direct = parts(cleaned)
|
|
153
|
-
if (direct.length >= 2 && hostLike(direct[0])) {
|
|
154
|
-
return buildRemoteReference({ host: direct[0], segments: direct.slice(1) })
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
if (direct.length === 2) {
|
|
158
|
-
return buildRemoteReference({ host: "github.com", segments: direct })
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
try {
|
|
163
|
-
const url = new URL(cleaned)
|
|
164
|
-
if (url.protocol === "file:") return buildFileReference({ url, remote: cleaned })
|
|
165
|
-
const pathname = parts(url.pathname)
|
|
166
|
-
const host = url.host
|
|
167
|
-
return buildRemoteReference({
|
|
168
|
-
host,
|
|
169
|
-
segments: pathname,
|
|
170
|
-
remote: host === "github.com" ? githubRemote(pathname.join("/")) : cleaned,
|
|
171
|
-
protocol: url.protocol,
|
|
172
|
-
})
|
|
173
|
-
} catch {
|
|
174
|
-
return null
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
export function isFileRepositoryReference(reference: Reference): reference is FileReference {
|
|
179
|
-
return reference.protocol === "file:"
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
export function isRemoteRepositoryReference(reference: Reference): reference is RemoteReference {
|
|
183
|
-
return !isFileRepositoryReference(reference)
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
export function parseRemoteRepositoryReference(input: string) {
|
|
187
|
-
const reference = parseRepositoryReference(input)
|
|
188
|
-
if (!reference) {
|
|
189
|
-
throw new InvalidRepositoryReferenceError({
|
|
190
|
-
repository: input,
|
|
191
|
-
message: "Repository must be a git URL, host/path reference, or GitHub owner/repo shorthand",
|
|
192
|
-
})
|
|
193
|
-
}
|
|
194
|
-
if (!isRemoteRepositoryReference(reference)) {
|
|
195
|
-
throw new UnsupportedLocalRepositoryError({
|
|
196
|
-
repository: input,
|
|
197
|
-
message: "Local file repositories are not supported",
|
|
198
|
-
})
|
|
199
|
-
}
|
|
200
|
-
return reference
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
export function validateRepositoryBranch(branch: string) {
|
|
204
|
-
if (!/^[A-Za-z0-9/_.-]+$/.test(branch) || branch.startsWith("-") || branch.includes("..")) {
|
|
205
|
-
throw new InvalidRepositoryBranchError({
|
|
206
|
-
branch,
|
|
207
|
-
message:
|
|
208
|
-
"Branch must contain only alphanumeric characters, /, _, ., and -, and cannot start with - or contain ..",
|
|
209
|
-
})
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
export function parseGitHubRemote(input: string) {
|
|
214
|
-
const cleaned = normalizeRepositoryInput(input)
|
|
215
|
-
if (!cleaned.includes("://") && !cleaned.match(/^(?:[^@/\s]+@)?github\.com:/)) return null
|
|
216
|
-
|
|
217
|
-
const parsed = parseRepositoryReference(cleaned)
|
|
218
|
-
if (!parsed || parsed.host !== "github.com" || !parsed.owner || parsed.segments.length !== 2) return null
|
|
219
|
-
return { owner: parsed.owner, repo: parsed.repo }
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
export function repositoryCachePath(input: Reference) {
|
|
223
|
-
return path.join(Global.Path.repos, ...input.host.split(":"), ...input.segments)
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
export function repositoryCacheIdentity(input: Reference) {
|
|
227
|
-
return `${input.host}/${input.path}`
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
export function sameRepositoryReference(left: Reference, right: Reference) {
|
|
231
|
-
return repositoryCacheIdentity(left) === repositoryCacheIdentity(right)
|
|
232
|
-
}
|
package/src/util/rpc.ts
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
type Definition = {
|
|
2
|
-
[method: string]: (input: any) => any
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
export function listen(rpc: Definition) {
|
|
6
|
-
onmessage = async (evt) => {
|
|
7
|
-
const parsed = JSON.parse(evt.data)
|
|
8
|
-
if (parsed.type === "rpc.request") {
|
|
9
|
-
const result = await rpc[parsed.method](parsed.input)
|
|
10
|
-
postMessage(JSON.stringify({ type: "rpc.result", result, id: parsed.id }))
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function emit(event: string, data: unknown) {
|
|
16
|
-
postMessage(JSON.stringify({ type: "rpc.event", event, data }))
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function client<T extends Definition>(target: {
|
|
20
|
-
postMessage: (data: string) => void | null
|
|
21
|
-
onmessage: ((this: Worker, ev: MessageEvent<any>) => any) | null
|
|
22
|
-
}) {
|
|
23
|
-
const pending = new Map<number, (result: any) => void>()
|
|
24
|
-
const listeners = new Map<string, Set<(data: any) => void>>()
|
|
25
|
-
let id = 0
|
|
26
|
-
target.onmessage = async (evt) => {
|
|
27
|
-
const parsed = JSON.parse(evt.data)
|
|
28
|
-
if (parsed.type === "rpc.result") {
|
|
29
|
-
const resolve = pending.get(parsed.id)
|
|
30
|
-
if (resolve) {
|
|
31
|
-
resolve(parsed.result)
|
|
32
|
-
pending.delete(parsed.id)
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
if (parsed.type === "rpc.event") {
|
|
36
|
-
const handlers = listeners.get(parsed.event)
|
|
37
|
-
if (handlers) {
|
|
38
|
-
for (const handler of handlers) {
|
|
39
|
-
handler(parsed.data)
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return {
|
|
45
|
-
call<Method extends keyof T>(method: Method, input: Parameters<T[Method]>[0]): Promise<ReturnType<T[Method]>> {
|
|
46
|
-
const requestId = id++
|
|
47
|
-
return new Promise((resolve) => {
|
|
48
|
-
pending.set(requestId, resolve)
|
|
49
|
-
target.postMessage(JSON.stringify({ type: "rpc.request", method, input, id: requestId }))
|
|
50
|
-
})
|
|
51
|
-
},
|
|
52
|
-
on<Data>(event: string, handler: (data: Data) => void) {
|
|
53
|
-
let handlers = listeners.get(event)
|
|
54
|
-
if (!handlers) {
|
|
55
|
-
handlers = new Set()
|
|
56
|
-
listeners.set(event, handlers)
|
|
57
|
-
}
|
|
58
|
-
handlers.add(handler)
|
|
59
|
-
return () => {
|
|
60
|
-
handlers!.delete(handler)
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export * as Rpc from "./rpc"
|
package/src/util/signal.ts
DELETED
package/src/util/timeout.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export function withTimeout<T>(promise: Promise<T>, ms: number, label?: string): Promise<T> {
|
|
2
|
-
let timeout: NodeJS.Timeout
|
|
3
|
-
return Promise.race([
|
|
4
|
-
promise.finally(() => {
|
|
5
|
-
clearTimeout(timeout)
|
|
6
|
-
}),
|
|
7
|
-
new Promise<never>((_, reject) => {
|
|
8
|
-
timeout = setTimeout(() => {
|
|
9
|
-
reject(new Error(label ?? `Operation timed out after ${ms}ms`))
|
|
10
|
-
}, ms)
|
|
11
|
-
}),
|
|
12
|
-
])
|
|
13
|
-
}
|
package/src/util/token.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { Token, estimate } from "@opencode-ai/core/util/token"
|