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/tool/websearch.ts
DELETED
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
import { Effect, Schema } from "effect"
|
|
2
|
-
import { HttpClient } from "effect/unstable/http"
|
|
3
|
-
import * as Tool from "./tool"
|
|
4
|
-
import * as McpWebSearch from "./mcp-websearch"
|
|
5
|
-
import DESCRIPTION from "./websearch.txt"
|
|
6
|
-
import DESCRIPTION_ZH from "./websearch.zh.txt"
|
|
7
|
-
import { checksum } from "@opencode-ai/core/util/encode"
|
|
8
|
-
import { InstallationVersion } from "@opencode-ai/core/installation/version"
|
|
9
|
-
import { RuntimeFlags } from "@/effect/runtime-flags"
|
|
10
|
-
import { loadDescription } from "./description"
|
|
11
|
-
|
|
12
|
-
export const Parameters = Schema.Struct({
|
|
13
|
-
query: Schema.String.annotate({ description: "Websearch query" }),
|
|
14
|
-
numResults: Schema.optional(Schema.Number).annotate({
|
|
15
|
-
description: "Number of search results to return (default: 8)",
|
|
16
|
-
}),
|
|
17
|
-
livecrawl: Schema.optional(Schema.Literals(["fallback", "preferred"])).annotate({
|
|
18
|
-
description:
|
|
19
|
-
"Live crawl mode - 'fallback': use live crawling as backup if cached content unavailable, 'preferred': prioritize live crawling (default: 'fallback')",
|
|
20
|
-
}),
|
|
21
|
-
type: Schema.optional(Schema.Literals(["auto", "fast", "deep"])).annotate({
|
|
22
|
-
description: "Search type - 'auto': balanced search (default), 'fast': quick results, 'deep': comprehensive search",
|
|
23
|
-
}),
|
|
24
|
-
contextMaxCharacters: Schema.optional(Schema.Number).annotate({
|
|
25
|
-
description: "Maximum characters for context string optimized for LLMs (default: 10000)",
|
|
26
|
-
}),
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
const WebSearchProviderSchema = Schema.Literals(["exa", "parallel"])
|
|
30
|
-
export type WebSearchProvider = Schema.Schema.Type<typeof WebSearchProviderSchema>
|
|
31
|
-
|
|
32
|
-
export function selectWebSearchProvider(sessionID: string, flags = { exa: false, parallel: false }): WebSearchProvider {
|
|
33
|
-
const override = process.env.OPENCODE_WEBSEARCH_PROVIDER
|
|
34
|
-
if (override === "exa" || override === "parallel") return override
|
|
35
|
-
if (flags.parallel) return "parallel"
|
|
36
|
-
if (flags.exa) return "exa"
|
|
37
|
-
|
|
38
|
-
return Number.parseInt(checksum(sessionID) ?? "0", 36) % 2 === 0 ? "exa" : "parallel"
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function webSearchProviderLabel(provider: unknown) {
|
|
42
|
-
if (provider === "parallel") return "Parallel Web Search"
|
|
43
|
-
if (provider === "exa") return "Exa Web Search"
|
|
44
|
-
return "Web Search"
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export function webSearchModelName(extra: Tool.Context["extra"]) {
|
|
48
|
-
const model = extra?.model
|
|
49
|
-
if (!model || typeof model !== "object") return undefined
|
|
50
|
-
const api = "api" in model && model.api && typeof model.api === "object" ? model.api : undefined
|
|
51
|
-
const apiID = api && "id" in api && typeof api.id === "string" ? api.id : undefined
|
|
52
|
-
const id = "id" in model && typeof model.id === "string" ? model.id : undefined
|
|
53
|
-
return (apiID ?? id)?.slice(0, 100)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function parallelAuthHeaders() {
|
|
57
|
-
const headers = { "User-Agent": `opencode/${InstallationVersion}` }
|
|
58
|
-
if (!process.env.PARALLEL_API_KEY) return headers
|
|
59
|
-
return { ...headers, Authorization: `Bearer ${process.env.PARALLEL_API_KEY}` }
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function callProvider(
|
|
63
|
-
http: HttpClient.HttpClient,
|
|
64
|
-
provider: WebSearchProvider,
|
|
65
|
-
params: Schema.Schema.Type<typeof Parameters>,
|
|
66
|
-
ctx: Tool.Context,
|
|
67
|
-
) {
|
|
68
|
-
if (provider === "parallel") {
|
|
69
|
-
return McpWebSearch.call(
|
|
70
|
-
http,
|
|
71
|
-
McpWebSearch.PARALLEL_URL,
|
|
72
|
-
"web_search",
|
|
73
|
-
McpWebSearch.ParallelSearchArgs,
|
|
74
|
-
{
|
|
75
|
-
objective: params.query,
|
|
76
|
-
search_queries: [params.query],
|
|
77
|
-
session_id: ctx.sessionID,
|
|
78
|
-
model_name: webSearchModelName(ctx.extra),
|
|
79
|
-
},
|
|
80
|
-
"25 seconds",
|
|
81
|
-
parallelAuthHeaders(),
|
|
82
|
-
)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return McpWebSearch.call(
|
|
86
|
-
http,
|
|
87
|
-
McpWebSearch.EXA_URL,
|
|
88
|
-
"web_search_exa",
|
|
89
|
-
McpWebSearch.SearchArgs,
|
|
90
|
-
{
|
|
91
|
-
query: params.query,
|
|
92
|
-
type: params.type || "auto",
|
|
93
|
-
numResults: params.numResults || 8,
|
|
94
|
-
livecrawl: params.livecrawl || "fallback",
|
|
95
|
-
contextMaxCharacters: params.contextMaxCharacters,
|
|
96
|
-
},
|
|
97
|
-
"25 seconds",
|
|
98
|
-
)
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export const WebSearchTool = Tool.define(
|
|
102
|
-
"websearch",
|
|
103
|
-
Effect.gen(function* () {
|
|
104
|
-
const http = yield* HttpClient.HttpClient
|
|
105
|
-
const flags = yield* RuntimeFlags.Service
|
|
106
|
-
|
|
107
|
-
return {
|
|
108
|
-
get description() {
|
|
109
|
-
return loadDescription(DESCRIPTION, DESCRIPTION_ZH).replace("{{year}}", new Date().getFullYear().toString())
|
|
110
|
-
},
|
|
111
|
-
parameters: Parameters,
|
|
112
|
-
execute: (params: Schema.Schema.Type<typeof Parameters>, ctx: Tool.Context) =>
|
|
113
|
-
Effect.gen(function* () {
|
|
114
|
-
const provider = selectWebSearchProvider(ctx.sessionID, {
|
|
115
|
-
exa: flags.enableExa,
|
|
116
|
-
parallel: flags.enableParallel,
|
|
117
|
-
})
|
|
118
|
-
const title = webSearchProviderLabel(provider)
|
|
119
|
-
yield* ctx.metadata({ title: `${title} "${params.query}"`, metadata: { provider } })
|
|
120
|
-
|
|
121
|
-
yield* ctx.ask({
|
|
122
|
-
permission: "websearch",
|
|
123
|
-
patterns: [params.query],
|
|
124
|
-
always: ["*"],
|
|
125
|
-
metadata: {
|
|
126
|
-
query: params.query,
|
|
127
|
-
numResults: params.numResults,
|
|
128
|
-
livecrawl: params.livecrawl,
|
|
129
|
-
type: params.type,
|
|
130
|
-
contextMaxCharacters: params.contextMaxCharacters,
|
|
131
|
-
provider,
|
|
132
|
-
},
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
const result = yield* callProvider(http, provider, params, ctx)
|
|
136
|
-
|
|
137
|
-
return {
|
|
138
|
-
output: result ?? "No search results found. Please try a different query.",
|
|
139
|
-
title: `${title}: ${params.query}`,
|
|
140
|
-
metadata: { provider },
|
|
141
|
-
}
|
|
142
|
-
}).pipe(Effect.orDie),
|
|
143
|
-
}
|
|
144
|
-
}),
|
|
145
|
-
)
|
package/src/tool/websearch.txt
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
- Search the web using the session's web search provider - performs real-time web searches and can scrape content from specific URLs
|
|
2
|
-
- Provides up-to-date information for current events and recent data
|
|
3
|
-
- Supports configurable result counts and returns the content from the most relevant websites
|
|
4
|
-
- Use this tool for accessing information beyond knowledge cutoff
|
|
5
|
-
- Searches are performed automatically within a single API call
|
|
6
|
-
|
|
7
|
-
Usage notes:
|
|
8
|
-
- Supports live crawling modes when available: 'fallback' (backup if cached unavailable) or 'preferred' (prioritize live crawling)
|
|
9
|
-
- Search types when available: 'auto' (balanced), 'fast' (quick results), 'deep' (comprehensive search)
|
|
10
|
-
- Configurable context length for optimal LLM integration
|
|
11
|
-
- Domain filtering and advanced search options available
|
|
12
|
-
|
|
13
|
-
The current year is {{year}}. You MUST use this year when searching for recent information or current events
|
|
14
|
-
- Example: If the current year is 2026 and the user asks for "latest AI news", search for "AI news 2026", NOT "AI news 2025"
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
- 使用会话的网页搜索提供商搜索网页 - 执行实时网页搜索并可以从特定 URL 抓取内容
|
|
2
|
-
- 提供当前事件和最新数据的最新信息
|
|
3
|
-
- 支持可配置的结果数量并返回来自最相关网站的内容
|
|
4
|
-
- 使用此工具访问超出知识截止日期的信息
|
|
5
|
-
- 搜索在单个 API 调用中自动执行
|
|
6
|
-
|
|
7
|
-
使用说明:
|
|
8
|
-
- 支持实时爬取模式(如果可用):'fallback'(如果缓存不可用则作为备份)或 'preferred'(优先实时爬取)
|
|
9
|
-
- 搜索类型(如果可用):'auto'(平衡)、'fast'(快速结果)、'deep'(全面搜索)
|
|
10
|
-
- 可配置的上下文长度,以实现最佳 LLM 集成
|
|
11
|
-
- 提供域名筛选和高级搜索选项
|
|
12
|
-
|
|
13
|
-
当前年份是 {{year}}。在搜索最新信息或当前事件时,您必须使用此年份
|
|
14
|
-
- 示例:如果当前年份是 2026 年,用户询问 "最新 AI 新闻",请搜索 "AI 新闻 2026",而不是 "AI 新闻 2025"
|
package/src/tool/write.ts
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import { Schema } from "effect"
|
|
2
|
-
import * as path from "path"
|
|
3
|
-
import { Effect } from "effect"
|
|
4
|
-
import * as Tool from "./tool"
|
|
5
|
-
import { LSP } from "@/lsp/lsp"
|
|
6
|
-
import { createTwoFilesPatch } from "diff"
|
|
7
|
-
import DESCRIPTION from "./write.txt"
|
|
8
|
-
import DESCRIPTION_ZH from "./write.zh.txt"
|
|
9
|
-
import { EventV2Bridge } from "@/event-v2-bridge"
|
|
10
|
-
import { FileSystem } from "@opencode-ai/core/filesystem"
|
|
11
|
-
import { Watcher } from "@opencode-ai/core/filesystem/watcher"
|
|
12
|
-
import { Format } from "../format"
|
|
13
|
-
import { FSUtil } from "@opencode-ai/core/fs-util"
|
|
14
|
-
import { InstanceState } from "@/effect/instance-state"
|
|
15
|
-
import { trimDiff } from "./edit"
|
|
16
|
-
import { assertExternalDirectoryEffect } from "./external-directory"
|
|
17
|
-
import * as Bom from "@/util/bom"
|
|
18
|
-
import { loadDescription } from "./description"
|
|
19
|
-
|
|
20
|
-
const MAX_PROJECT_DIAGNOSTICS_FILES = 5
|
|
21
|
-
|
|
22
|
-
export const Parameters = Schema.Struct({
|
|
23
|
-
content: Schema.String.annotate({ description: "The content to write to the file" }),
|
|
24
|
-
filePath: Schema.String.annotate({
|
|
25
|
-
description: "The absolute path to the file to write (must be absolute, not relative)",
|
|
26
|
-
}),
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
export const WriteTool = Tool.define(
|
|
30
|
-
"write",
|
|
31
|
-
Effect.gen(function* () {
|
|
32
|
-
const lsp = yield* LSP.Service
|
|
33
|
-
const fs = yield* FSUtil.Service
|
|
34
|
-
const events = yield* EventV2Bridge.Service
|
|
35
|
-
const format = yield* Format.Service
|
|
36
|
-
|
|
37
|
-
return {
|
|
38
|
-
description: loadDescription(DESCRIPTION, DESCRIPTION_ZH),
|
|
39
|
-
parameters: Parameters,
|
|
40
|
-
execute: (params: { content: string; filePath: string }, ctx: Tool.Context) =>
|
|
41
|
-
Effect.gen(function* () {
|
|
42
|
-
const instance = yield* InstanceState.context
|
|
43
|
-
const filepath = path.isAbsolute(params.filePath)
|
|
44
|
-
? params.filePath
|
|
45
|
-
: path.join(instance.directory, params.filePath)
|
|
46
|
-
yield* assertExternalDirectoryEffect(ctx, filepath)
|
|
47
|
-
|
|
48
|
-
const exists = yield* fs.existsSafe(filepath)
|
|
49
|
-
const source = exists ? yield* Bom.readFile(fs, filepath) : { bom: false, text: "" }
|
|
50
|
-
const next = Bom.split(params.content)
|
|
51
|
-
const desiredBom = source.bom || next.bom
|
|
52
|
-
const contentOld = source.text
|
|
53
|
-
const contentNew = next.text
|
|
54
|
-
|
|
55
|
-
const diff = trimDiff(createTwoFilesPatch(filepath, filepath, contentOld, contentNew))
|
|
56
|
-
yield* ctx.ask({
|
|
57
|
-
permission: "edit",
|
|
58
|
-
patterns: [path.relative(instance.worktree, filepath)],
|
|
59
|
-
always: ["*"],
|
|
60
|
-
metadata: {
|
|
61
|
-
filepath,
|
|
62
|
-
diff,
|
|
63
|
-
},
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
yield* fs.writeWithDirs(filepath, Bom.join(contentNew, desiredBom))
|
|
67
|
-
if (yield* format.file(filepath)) {
|
|
68
|
-
yield* Bom.syncFile(fs, filepath, desiredBom)
|
|
69
|
-
}
|
|
70
|
-
yield* events.publish(FileSystem.Event.Edited, { file: filepath })
|
|
71
|
-
yield* events.publish(Watcher.Event.Updated, {
|
|
72
|
-
file: filepath,
|
|
73
|
-
event: exists ? "change" : "add",
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
let output = "Wrote file successfully."
|
|
77
|
-
yield* lsp.touchFile(filepath, "document")
|
|
78
|
-
const diagnostics = yield* lsp.diagnostics()
|
|
79
|
-
const normalizedFilepath = FSUtil.normalizePath(filepath)
|
|
80
|
-
let projectDiagnosticsCount = 0
|
|
81
|
-
for (const [file, issues] of Object.entries(diagnostics)) {
|
|
82
|
-
const current = file === normalizedFilepath
|
|
83
|
-
if (!current && projectDiagnosticsCount >= MAX_PROJECT_DIAGNOSTICS_FILES) continue
|
|
84
|
-
const block = LSP.Diagnostic.report(current ? filepath : file, issues)
|
|
85
|
-
if (!block) continue
|
|
86
|
-
if (current) {
|
|
87
|
-
output += `\n\nLSP errors detected in this file, please fix:\n${block}`
|
|
88
|
-
continue
|
|
89
|
-
}
|
|
90
|
-
projectDiagnosticsCount++
|
|
91
|
-
output += `\n\nLSP errors detected in other files:\n${block}`
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
return {
|
|
95
|
-
title: path.relative(instance.worktree, filepath),
|
|
96
|
-
metadata: {
|
|
97
|
-
diagnostics,
|
|
98
|
-
filepath,
|
|
99
|
-
exists: exists,
|
|
100
|
-
},
|
|
101
|
-
output,
|
|
102
|
-
}
|
|
103
|
-
}).pipe(Effect.orDie),
|
|
104
|
-
}
|
|
105
|
-
}),
|
|
106
|
-
)
|
package/src/tool/write.txt
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
Writes a file to the local filesystem.
|
|
2
|
-
|
|
3
|
-
Usage:
|
|
4
|
-
- This tool will overwrite the existing file if there is one at the provided path.
|
|
5
|
-
- If this is an existing file, you MUST use the Read tool first to read the file's contents. This tool will fail if you did not read the file first.
|
|
6
|
-
- ALWAYS prefer editing existing files in the codebase. NEVER write new files unless explicitly required.
|
|
7
|
-
- NEVER proactively create documentation files (*.md) or README files. Only create documentation files if explicitly requested by the User.
|
|
8
|
-
- Only use emojis if the user explicitly requests it. Avoid writing emojis to files unless asked.
|
package/src/tool/write.zh.txt
DELETED
package/src/util/archive.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import path from "path"
|
|
2
|
-
import * as Process from "./process"
|
|
3
|
-
|
|
4
|
-
export async function extractZip(zipPath: string, destDir: string) {
|
|
5
|
-
if (process.platform === "win32") {
|
|
6
|
-
const winZipPath = path.resolve(zipPath)
|
|
7
|
-
const winDestDir = path.resolve(destDir)
|
|
8
|
-
// $global:ProgressPreference suppresses PowerShell's blue progress bar popup
|
|
9
|
-
const cmd = `$global:ProgressPreference = 'SilentlyContinue'; Expand-Archive -Path '${winZipPath}' -DestinationPath '${winDestDir}' -Force`
|
|
10
|
-
await Process.run(["powershell", "-NoProfile", "-NonInteractive", "-Command", cmd])
|
|
11
|
-
return
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
await Process.run(["unzip", "-o", "-q", zipPath, "-d", destDir])
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export * as Archive from "./archive"
|
package/src/util/bom.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Effect } from "effect"
|
|
2
|
-
import { FSUtil } from "@opencode-ai/core/fs-util"
|
|
3
|
-
|
|
4
|
-
const BOM_CODE = 0xfeff
|
|
5
|
-
const BOM = String.fromCharCode(BOM_CODE)
|
|
6
|
-
|
|
7
|
-
export function split(text: string) {
|
|
8
|
-
if (text.charCodeAt(0) !== BOM_CODE) return { bom: false, text }
|
|
9
|
-
return { bom: true, text: text.slice(1) }
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function join(text: string, bom: boolean) {
|
|
13
|
-
const stripped = split(text).text
|
|
14
|
-
if (!bom) return stripped
|
|
15
|
-
return BOM + stripped
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export const readFile = Effect.fn("Bom.readFile")(function* (fs: FSUtil.Interface, filePath: string) {
|
|
19
|
-
return split(new TextDecoder("utf-8", { ignoreBOM: true }).decode(yield* fs.readFile(filePath)))
|
|
20
|
-
})
|
|
21
|
-
|
|
22
|
-
export const syncFile = Effect.fn("Bom.syncFile")(function* (fs: FSUtil.Interface, filePath: string, bom: boolean) {
|
|
23
|
-
const current = yield* readFile(fs, filePath)
|
|
24
|
-
if (current.bom === bom) return current.text
|
|
25
|
-
yield* fs.writeWithDirs(filePath, join(current.text, bom))
|
|
26
|
-
return current.text
|
|
27
|
-
})
|
package/src/util/data-url.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export function decodeDataUrl(url: string) {
|
|
2
|
-
const idx = url.indexOf(",")
|
|
3
|
-
if (idx === -1) return ""
|
|
4
|
-
|
|
5
|
-
const head = url.slice(0, idx)
|
|
6
|
-
const body = url.slice(idx + 1)
|
|
7
|
-
if (head.includes(";base64")) return Buffer.from(body, "base64").toString("utf8")
|
|
8
|
-
return decodeURIComponent(body)
|
|
9
|
-
}
|
package/src/util/defer.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Schedule } from "effect"
|
|
2
|
-
import { HttpClient } from "effect/unstable/http"
|
|
3
|
-
|
|
4
|
-
export const withTransientReadRetry = <E, R>(client: HttpClient.HttpClient.With<E, R>) =>
|
|
5
|
-
client.pipe(
|
|
6
|
-
HttpClient.retryTransient({
|
|
7
|
-
retryOn: "errors-and-responses",
|
|
8
|
-
times: 2,
|
|
9
|
-
schedule: Schedule.exponential(200).pipe(Schedule.jittered),
|
|
10
|
-
}),
|
|
11
|
-
)
|
package/src/util/error.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from "@opencode-ai/tui/util/error"
|
package/src/util/filesystem.ts
DELETED
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
import { chmod, mkdir, readFile, stat as statFile, writeFile } from "fs/promises"
|
|
2
|
-
import { createWriteStream, existsSync, statSync } from "fs"
|
|
3
|
-
import { realpathSync } from "fs"
|
|
4
|
-
import { dirname, isAbsolute, join, resolve as pathResolve, win32 } from "path"
|
|
5
|
-
import { Readable } from "stream"
|
|
6
|
-
import { pipeline } from "stream/promises"
|
|
7
|
-
import { Glob } from "@opencode-ai/core/util/glob"
|
|
8
|
-
import { FSUtil } from "@opencode-ai/core/fs-util"
|
|
9
|
-
import { fileURLToPath } from "url"
|
|
10
|
-
|
|
11
|
-
// Fast sync version for metadata checks
|
|
12
|
-
export async function exists(p: string): Promise<boolean> {
|
|
13
|
-
return existsSync(p)
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export async function isDir(p: string): Promise<boolean> {
|
|
17
|
-
try {
|
|
18
|
-
return statSync(p).isDirectory()
|
|
19
|
-
} catch {
|
|
20
|
-
return false
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function stat(p: string): ReturnType<typeof statSync> | undefined {
|
|
25
|
-
return statSync(p, { throwIfNoEntry: false }) ?? undefined
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export async function statAsync(p: string): Promise<ReturnType<typeof statSync> | undefined> {
|
|
29
|
-
return statFile(p).catch((e) => {
|
|
30
|
-
if (isEnoent(e)) return undefined
|
|
31
|
-
throw e
|
|
32
|
-
})
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export async function size(p: string): Promise<number> {
|
|
36
|
-
const s = stat(p)?.size ?? 0
|
|
37
|
-
return typeof s === "bigint" ? Number(s) : s
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export async function readText(p: string): Promise<string> {
|
|
41
|
-
return readFile(p, "utf-8")
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export async function readJson<T = unknown>(p: string): Promise<T> {
|
|
45
|
-
return JSON.parse(await readFile(p, "utf-8"))
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export async function readBytes(p: string): Promise<Buffer> {
|
|
49
|
-
return readFile(p)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export async function readArrayBuffer(p: string): Promise<ArrayBuffer> {
|
|
53
|
-
const buf = await readFile(p)
|
|
54
|
-
return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength) as ArrayBuffer
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function isEnoent(e: unknown): e is { code: "ENOENT" } {
|
|
58
|
-
return typeof e === "object" && e !== null && "code" in e && (e as { code: string }).code === "ENOENT"
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export async function write(p: string, content: string | Buffer | Uint8Array, mode?: number): Promise<void> {
|
|
62
|
-
try {
|
|
63
|
-
if (mode) {
|
|
64
|
-
await writeFile(p, content, { mode })
|
|
65
|
-
} else {
|
|
66
|
-
await writeFile(p, content)
|
|
67
|
-
}
|
|
68
|
-
} catch (e) {
|
|
69
|
-
if (isEnoent(e)) {
|
|
70
|
-
await mkdir(dirname(p), { recursive: true })
|
|
71
|
-
if (mode) {
|
|
72
|
-
await writeFile(p, content, { mode })
|
|
73
|
-
} else {
|
|
74
|
-
await writeFile(p, content)
|
|
75
|
-
}
|
|
76
|
-
return
|
|
77
|
-
}
|
|
78
|
-
throw e
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
export async function writeJson(p: string, data: unknown, mode?: number): Promise<void> {
|
|
83
|
-
return write(p, JSON.stringify(data, null, 2), mode)
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export async function writeStream(
|
|
87
|
-
p: string,
|
|
88
|
-
stream: ReadableStream<Uint8Array> | Readable,
|
|
89
|
-
mode?: number,
|
|
90
|
-
): Promise<void> {
|
|
91
|
-
const dir = dirname(p)
|
|
92
|
-
if (!existsSync(dir)) {
|
|
93
|
-
await mkdir(dir, { recursive: true })
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const nodeStream = stream instanceof ReadableStream ? Readable.fromWeb(stream as any) : stream
|
|
97
|
-
const writeStream = createWriteStream(p)
|
|
98
|
-
await pipeline(nodeStream, writeStream)
|
|
99
|
-
|
|
100
|
-
if (mode) {
|
|
101
|
-
await chmod(p, mode)
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export async function mimeType(p: string): Promise<string> {
|
|
106
|
-
const { lookup } = await import("mime-types")
|
|
107
|
-
return lookup(p) || "application/octet-stream"
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* On Windows, normalize a path to its canonical casing using the filesystem.
|
|
112
|
-
* This is needed because Windows paths are case-insensitive but LSP servers
|
|
113
|
-
* may return paths with different casing than what we send them.
|
|
114
|
-
*/
|
|
115
|
-
export function normalizePath(p: string): string {
|
|
116
|
-
if (process.platform !== "win32") return p
|
|
117
|
-
const resolved = win32.normalize(win32.resolve(windowsPath(p)))
|
|
118
|
-
try {
|
|
119
|
-
return realpathSync.native(resolved)
|
|
120
|
-
} catch {
|
|
121
|
-
return resolved
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
export function normalizePathPattern(p: string): string {
|
|
126
|
-
if (process.platform !== "win32") return p
|
|
127
|
-
if (p === "*") return p
|
|
128
|
-
const match = p.match(/^(.*)[\\/]\*$/)
|
|
129
|
-
if (!match) return normalizePath(p)
|
|
130
|
-
const dir = /^[A-Za-z]:$/.test(match[1]) ? match[1] + "\\" : match[1]
|
|
131
|
-
return join(normalizePath(dir), "*")
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// We cannot rely on path.resolve() here because git.exe may come from Git Bash, Cygwin, or MSYS2, so we need to translate these paths at the boundary.
|
|
135
|
-
// Also resolves symlinks so that callers using the result as a cache key
|
|
136
|
-
// always get the same canonical path for a given physical directory.
|
|
137
|
-
export function resolve(p: string): string {
|
|
138
|
-
const resolved = pathResolve(windowsPath(p))
|
|
139
|
-
try {
|
|
140
|
-
return normalizePath(realpathSync(resolved))
|
|
141
|
-
} catch (e) {
|
|
142
|
-
if (isEnoent(e)) return normalizePath(resolved)
|
|
143
|
-
throw e
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export function resolveFilePath(root: string, file: string): string {
|
|
148
|
-
const raw = file.startsWith("file://") ? fileURLToPath(file) : file
|
|
149
|
-
if (isAbsolute(raw)) return raw
|
|
150
|
-
return pathResolve(root, raw)
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
export function windowsPath(p: string): string {
|
|
154
|
-
if (process.platform !== "win32") return p
|
|
155
|
-
return (
|
|
156
|
-
p
|
|
157
|
-
.replace(/^\/([a-zA-Z]):(?:[\\/]|$)/, (_, drive) => `${drive.toUpperCase()}:/`)
|
|
158
|
-
// Git Bash for Windows paths are typically /<drive>/...
|
|
159
|
-
.replace(/^\/([a-zA-Z])(?:\/|$)/, (_, drive) => `${drive.toUpperCase()}:/`)
|
|
160
|
-
// Cygwin git paths are typically /cygdrive/<drive>/...
|
|
161
|
-
.replace(/^\/cygdrive\/([a-zA-Z])(?:\/|$)/, (_, drive) => `${drive.toUpperCase()}:/`)
|
|
162
|
-
// WSL paths are typically /mnt/<drive>/...
|
|
163
|
-
.replace(/^\/mnt\/([a-zA-Z])(?:\/|$)/, (_, drive) => `${drive.toUpperCase()}:/`)
|
|
164
|
-
)
|
|
165
|
-
}
|
|
166
|
-
export function overlaps(a: string, b: string) {
|
|
167
|
-
return FSUtil.overlaps(a, b)
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
export function contains(parent: string, child: string) {
|
|
171
|
-
return FSUtil.contains(parent, child)
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
export async function findUp(
|
|
175
|
-
target: string,
|
|
176
|
-
start: string,
|
|
177
|
-
stop?: string,
|
|
178
|
-
options?: { rootFirst?: boolean },
|
|
179
|
-
): Promise<string[]>
|
|
180
|
-
export async function findUp(
|
|
181
|
-
target: string[],
|
|
182
|
-
start: string,
|
|
183
|
-
stop?: string,
|
|
184
|
-
options?: { rootFirst?: boolean },
|
|
185
|
-
): Promise<string[]>
|
|
186
|
-
export async function findUp(
|
|
187
|
-
target: string | string[],
|
|
188
|
-
start: string,
|
|
189
|
-
stop?: string,
|
|
190
|
-
options?: { rootFirst?: boolean },
|
|
191
|
-
) {
|
|
192
|
-
const dirs = [start]
|
|
193
|
-
let current = start
|
|
194
|
-
while (true) {
|
|
195
|
-
if (stop === current) break
|
|
196
|
-
const parent = dirname(current)
|
|
197
|
-
if (parent === current) break
|
|
198
|
-
dirs.push(parent)
|
|
199
|
-
current = parent
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
const targets = Array.isArray(target) ? target : [target]
|
|
203
|
-
const result = []
|
|
204
|
-
for (const dir of options?.rootFirst ? dirs.toReversed() : dirs) {
|
|
205
|
-
for (const item of targets) {
|
|
206
|
-
const search = join(dir, item)
|
|
207
|
-
if (await exists(search)) result.push(search)
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
return result
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
export async function* up(options: { targets: string[]; start: string; stop?: string }) {
|
|
214
|
-
const { targets, start, stop } = options
|
|
215
|
-
let current = start
|
|
216
|
-
while (true) {
|
|
217
|
-
for (const target of targets) {
|
|
218
|
-
const search = join(current, target)
|
|
219
|
-
if (await exists(search)) yield search
|
|
220
|
-
}
|
|
221
|
-
if (stop === current) break
|
|
222
|
-
const parent = dirname(current)
|
|
223
|
-
if (parent === current) break
|
|
224
|
-
current = parent
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
export async function globUp(pattern: string, start: string, stop?: string) {
|
|
229
|
-
let current = start
|
|
230
|
-
const result = []
|
|
231
|
-
while (true) {
|
|
232
|
-
try {
|
|
233
|
-
const matches = await Glob.scan(pattern, {
|
|
234
|
-
cwd: current,
|
|
235
|
-
absolute: true,
|
|
236
|
-
include: "file",
|
|
237
|
-
dot: true,
|
|
238
|
-
})
|
|
239
|
-
result.push(...matches)
|
|
240
|
-
} catch {
|
|
241
|
-
// Skip invalid glob patterns
|
|
242
|
-
}
|
|
243
|
-
if (stop === current) break
|
|
244
|
-
const parent = dirname(current)
|
|
245
|
-
if (parent === current) break
|
|
246
|
-
current = parent
|
|
247
|
-
}
|
|
248
|
-
return result
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
export * as Filesystem from "./filesystem"
|
package/src/util/html.ts
DELETED
package/src/util/iife.ts
DELETED
package/src/util/lazy.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
export function lazy<T>(fn: () => T) {
|
|
2
|
-
let value: T | undefined
|
|
3
|
-
let loaded = false
|
|
4
|
-
|
|
5
|
-
const result = (): T => {
|
|
6
|
-
if (loaded) return value as T
|
|
7
|
-
value = fn()
|
|
8
|
-
loaded = true
|
|
9
|
-
return value as T
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
result.reset = () => {
|
|
13
|
-
loaded = false
|
|
14
|
-
value = undefined
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
result.loaded = () => loaded
|
|
18
|
-
|
|
19
|
-
return result
|
|
20
|
-
}
|