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/read.ts
DELETED
|
@@ -1,388 +0,0 @@
|
|
|
1
|
-
import { Effect, Option, Schema, Scope, Stream } from "effect"
|
|
2
|
-
import { NonNegativeInt } from "@opencode-ai/core/schema"
|
|
3
|
-
import * as path from "path"
|
|
4
|
-
import * as Tool from "./tool"
|
|
5
|
-
import { FSUtil } from "@opencode-ai/core/fs-util"
|
|
6
|
-
import { LSP } from "@/lsp/lsp"
|
|
7
|
-
import DESCRIPTION from "./read.txt"
|
|
8
|
-
import DESCRIPTION_ZH from "./read.zh.txt"
|
|
9
|
-
import { InstanceState } from "@/effect/instance-state"
|
|
10
|
-
import { assertExternalDirectoryEffect } from "./external-directory"
|
|
11
|
-
import { Instruction } from "../session/instruction"
|
|
12
|
-
import { loadDescription } from "./description"
|
|
13
|
-
import { isPdfAttachment, sniffAttachmentMime } from "@/util/media"
|
|
14
|
-
|
|
15
|
-
const DEFAULT_READ_LIMIT = 2000
|
|
16
|
-
const MAX_LINE_LENGTH = 2000
|
|
17
|
-
const MAX_LINE_SUFFIX = `... (line truncated to ${MAX_LINE_LENGTH} chars)`
|
|
18
|
-
const MAX_BYTES = 50 * 1024
|
|
19
|
-
const MAX_BYTES_LABEL = `${MAX_BYTES / 1024} KB`
|
|
20
|
-
const SAMPLE_BYTES = 4096
|
|
21
|
-
const SUPPORTED_IMAGE_MIMES = new Set(["image/jpeg", "image/png", "image/gif", "image/webp"])
|
|
22
|
-
|
|
23
|
-
class ReadStop extends Schema.TaggedErrorClass<ReadStop>()("ReadStop", {}) {}
|
|
24
|
-
|
|
25
|
-
// `offset` and `limit` were originally `z.coerce.number()` — the runtime
|
|
26
|
-
// coercion was useful when the tool was called from a shell but serves no
|
|
27
|
-
// purpose in the LLM tool-call path (the model emits typed JSON). The JSON
|
|
28
|
-
// Schema output is identical (`type: "number"`), so the LLM view is
|
|
29
|
-
// unchanged; purely CLI-facing uses must now send numbers rather than strings.
|
|
30
|
-
export const Parameters = Schema.Struct({
|
|
31
|
-
filePath: Schema.String.annotate({ description: "The absolute path to the file or directory to read" }),
|
|
32
|
-
offset: Schema.optional(NonNegativeInt).annotate({
|
|
33
|
-
description: "The line number to start reading from (1-indexed)",
|
|
34
|
-
}),
|
|
35
|
-
limit: Schema.optional(NonNegativeInt).annotate({
|
|
36
|
-
description: "The maximum number of lines to read (defaults to 2000)",
|
|
37
|
-
}),
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
type Display =
|
|
41
|
-
| {
|
|
42
|
-
type: "directory"
|
|
43
|
-
path: string
|
|
44
|
-
entries: string[]
|
|
45
|
-
offset: number
|
|
46
|
-
totalEntries: number
|
|
47
|
-
truncated: boolean
|
|
48
|
-
}
|
|
49
|
-
| {
|
|
50
|
-
type: "file"
|
|
51
|
-
path: string
|
|
52
|
-
text: string
|
|
53
|
-
lineStart: number
|
|
54
|
-
lineEnd: number
|
|
55
|
-
totalLines: number
|
|
56
|
-
truncated: boolean
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
type Metadata = {
|
|
60
|
-
preview: string
|
|
61
|
-
truncated: boolean
|
|
62
|
-
loaded: string[]
|
|
63
|
-
display?: Display
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export const ReadTool = Tool.define<
|
|
67
|
-
typeof Parameters,
|
|
68
|
-
Metadata,
|
|
69
|
-
FSUtil.Service | Instruction.Service | LSP.Service | Scope.Scope
|
|
70
|
-
>(
|
|
71
|
-
"read",
|
|
72
|
-
Effect.gen(function* () {
|
|
73
|
-
const fs = yield* FSUtil.Service
|
|
74
|
-
const instruction = yield* Instruction.Service
|
|
75
|
-
const lsp = yield* LSP.Service
|
|
76
|
-
const scope = yield* Scope.Scope
|
|
77
|
-
|
|
78
|
-
const miss = Effect.fn("ReadTool.miss")(function* (filepath: string) {
|
|
79
|
-
const dir = path.dirname(filepath)
|
|
80
|
-
const base = path.basename(filepath)
|
|
81
|
-
const items = yield* fs.readDirectory(dir).pipe(
|
|
82
|
-
Effect.map((items) =>
|
|
83
|
-
items
|
|
84
|
-
.filter(
|
|
85
|
-
(item) =>
|
|
86
|
-
item.toLowerCase().includes(base.toLowerCase()) || base.toLowerCase().includes(item.toLowerCase()),
|
|
87
|
-
)
|
|
88
|
-
.map((item) => path.join(dir, item))
|
|
89
|
-
.slice(0, 3),
|
|
90
|
-
),
|
|
91
|
-
Effect.catch(() => Effect.succeed([] as string[])),
|
|
92
|
-
)
|
|
93
|
-
|
|
94
|
-
if (items.length > 0) {
|
|
95
|
-
return yield* Effect.fail(
|
|
96
|
-
new Error(`File not found: ${filepath}\n\nDid you mean one of these?\n${items.join("\n")}`),
|
|
97
|
-
)
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
return yield* Effect.fail(new Error(`File not found: ${filepath}`))
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
const list = Effect.fn("ReadTool.list")(function* (filepath: string) {
|
|
104
|
-
const items = yield* fs.readDirectoryEntries(filepath)
|
|
105
|
-
return yield* Effect.forEach(
|
|
106
|
-
items,
|
|
107
|
-
Effect.fnUntraced(function* (item) {
|
|
108
|
-
if (item.type === "directory") return item.name + "/"
|
|
109
|
-
if (item.type !== "symlink") return item.name
|
|
110
|
-
|
|
111
|
-
const target = yield* fs.stat(path.join(filepath, item.name)).pipe(Effect.catch(() => Effect.void))
|
|
112
|
-
if (target?.type === "Directory") return item.name + "/"
|
|
113
|
-
return item.name
|
|
114
|
-
}),
|
|
115
|
-
{ concurrency: "unbounded" },
|
|
116
|
-
).pipe(Effect.map((items: string[]) => items.sort((a, b) => a.localeCompare(b))))
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
const warm = Effect.fn("ReadTool.warm")(function* (filepath: string) {
|
|
120
|
-
// LSP warm-up is optional; do not let a background defect fail an otherwise successful read.
|
|
121
|
-
yield* lsp.touchFile(filepath).pipe(Effect.ignoreCause, Effect.forkIn(scope))
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
const readSample = Effect.fn("ReadTool.readSample")(function* (
|
|
125
|
-
filepath: string,
|
|
126
|
-
fileSize: number,
|
|
127
|
-
sampleSize: number,
|
|
128
|
-
) {
|
|
129
|
-
if (fileSize === 0) return new Uint8Array()
|
|
130
|
-
|
|
131
|
-
return yield* Effect.scoped(
|
|
132
|
-
Effect.gen(function* () {
|
|
133
|
-
const file = yield* fs.open(filepath, { flag: "r" })
|
|
134
|
-
return Option.getOrElse(yield* file.readAlloc(Math.min(sampleSize, fileSize)), () => new Uint8Array())
|
|
135
|
-
}),
|
|
136
|
-
)
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
const lines = Effect.fn("ReadTool.lines")(function* (filepath: string, opts: { limit: number; offset: number }) {
|
|
140
|
-
const start = opts.offset - 1
|
|
141
|
-
const raw: string[] = []
|
|
142
|
-
const flags = { bytes: 0, count: 0, cut: false, more: false, done: false }
|
|
143
|
-
|
|
144
|
-
// Note: prefer manual TextDecoder over Stream.decodeText — when the source stream
|
|
145
|
-
// ends without flushing, decodeText drops the final unterminated line. We also
|
|
146
|
-
// avoid Stream.runForEachWhile (it currently swallows the final unterminated
|
|
147
|
-
// line of the upstream splitLines pipeline) and use a tagged error to stop the
|
|
148
|
-
// upstream file stream as soon as the byte cap is reached.
|
|
149
|
-
const decoder = new TextDecoder("utf-8")
|
|
150
|
-
yield* fs.stream(filepath).pipe(
|
|
151
|
-
Stream.map((bytes) => decoder.decode(bytes, { stream: true })),
|
|
152
|
-
Stream.splitLines,
|
|
153
|
-
Stream.runForEach((text) =>
|
|
154
|
-
Effect.gen(function* () {
|
|
155
|
-
if (flags.done) return yield* new ReadStop()
|
|
156
|
-
flags.count += 1
|
|
157
|
-
if (flags.count <= start) return
|
|
158
|
-
|
|
159
|
-
if (raw.length >= opts.limit) {
|
|
160
|
-
flags.more = true
|
|
161
|
-
return
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
const line = text.length > MAX_LINE_LENGTH ? text.substring(0, MAX_LINE_LENGTH) + MAX_LINE_SUFFIX : text
|
|
165
|
-
const size = Buffer.byteLength(line, "utf-8") + (raw.length > 0 ? 1 : 0)
|
|
166
|
-
if (flags.bytes + size <= MAX_BYTES) {
|
|
167
|
-
raw.push(line)
|
|
168
|
-
flags.bytes += size
|
|
169
|
-
return
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
flags.cut = true
|
|
173
|
-
flags.more = true
|
|
174
|
-
flags.done = true
|
|
175
|
-
return yield* new ReadStop()
|
|
176
|
-
}),
|
|
177
|
-
),
|
|
178
|
-
Effect.catchTag("ReadStop", () => Effect.void),
|
|
179
|
-
)
|
|
180
|
-
|
|
181
|
-
return { raw, count: flags.count, cut: flags.cut, more: flags.more, offset: opts.offset }
|
|
182
|
-
})
|
|
183
|
-
|
|
184
|
-
const isBinaryFile = (filepath: string, bytes: Uint8Array) => {
|
|
185
|
-
const ext = path.extname(filepath).toLowerCase()
|
|
186
|
-
switch (ext) {
|
|
187
|
-
case ".zip":
|
|
188
|
-
case ".tar":
|
|
189
|
-
case ".gz":
|
|
190
|
-
case ".exe":
|
|
191
|
-
case ".dll":
|
|
192
|
-
case ".so":
|
|
193
|
-
case ".class":
|
|
194
|
-
case ".jar":
|
|
195
|
-
case ".war":
|
|
196
|
-
case ".7z":
|
|
197
|
-
case ".doc":
|
|
198
|
-
case ".docx":
|
|
199
|
-
case ".xls":
|
|
200
|
-
case ".xlsx":
|
|
201
|
-
case ".ppt":
|
|
202
|
-
case ".pptx":
|
|
203
|
-
case ".odt":
|
|
204
|
-
case ".ods":
|
|
205
|
-
case ".odp":
|
|
206
|
-
case ".bin":
|
|
207
|
-
case ".dat":
|
|
208
|
-
case ".obj":
|
|
209
|
-
case ".o":
|
|
210
|
-
case ".a":
|
|
211
|
-
case ".lib":
|
|
212
|
-
case ".wasm":
|
|
213
|
-
case ".pyc":
|
|
214
|
-
case ".pyo":
|
|
215
|
-
return true
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
if (bytes.length === 0) return false
|
|
219
|
-
|
|
220
|
-
let nonPrintableCount = 0
|
|
221
|
-
for (let i = 0; i < bytes.length; i++) {
|
|
222
|
-
if (bytes[i] === 0) return true
|
|
223
|
-
if (bytes[i] < 9 || (bytes[i] > 13 && bytes[i] < 32)) {
|
|
224
|
-
nonPrintableCount++
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
return nonPrintableCount / bytes.length > 0.3
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
const run = Effect.fn("ReadTool.execute")(function* (
|
|
232
|
-
params: Schema.Schema.Type<typeof Parameters>,
|
|
233
|
-
ctx: Tool.Context<Metadata>,
|
|
234
|
-
) {
|
|
235
|
-
const instance = yield* InstanceState.context
|
|
236
|
-
let filepath = params.filePath
|
|
237
|
-
if (!path.isAbsolute(filepath)) {
|
|
238
|
-
filepath = path.resolve(instance.directory, filepath)
|
|
239
|
-
}
|
|
240
|
-
if (process.platform === "win32") {
|
|
241
|
-
filepath = FSUtil.normalizePath(filepath)
|
|
242
|
-
}
|
|
243
|
-
const title = path.relative(instance.worktree, filepath)
|
|
244
|
-
|
|
245
|
-
const stat = yield* fs.stat(filepath).pipe(
|
|
246
|
-
Effect.catchIf(
|
|
247
|
-
(err) => "reason" in err && err.reason._tag === "NotFound",
|
|
248
|
-
() => Effect.succeed(undefined),
|
|
249
|
-
),
|
|
250
|
-
)
|
|
251
|
-
|
|
252
|
-
yield* assertExternalDirectoryEffect(ctx, filepath, {
|
|
253
|
-
bypass: Boolean(ctx.extra?.["bypassCwdCheck"]),
|
|
254
|
-
kind: stat?.type === "Directory" ? "directory" : "file",
|
|
255
|
-
})
|
|
256
|
-
|
|
257
|
-
yield* ctx.ask({
|
|
258
|
-
permission: "read",
|
|
259
|
-
patterns: [path.relative(instance.worktree, filepath)],
|
|
260
|
-
always: ["*"],
|
|
261
|
-
metadata: {},
|
|
262
|
-
})
|
|
263
|
-
|
|
264
|
-
if (!stat) return yield* miss(filepath)
|
|
265
|
-
|
|
266
|
-
if (stat.type === "Directory") {
|
|
267
|
-
const items = yield* list(filepath)
|
|
268
|
-
const limit = params.limit ?? DEFAULT_READ_LIMIT
|
|
269
|
-
const offset = params.offset || 1
|
|
270
|
-
const start = offset - 1
|
|
271
|
-
const sliced = items.slice(start, start + limit)
|
|
272
|
-
const truncated = start + sliced.length < items.length
|
|
273
|
-
|
|
274
|
-
return {
|
|
275
|
-
title,
|
|
276
|
-
output: [
|
|
277
|
-
`<path>${filepath}</path>`,
|
|
278
|
-
`<type>directory</type>`,
|
|
279
|
-
`<entries>`,
|
|
280
|
-
sliced.join("\n"),
|
|
281
|
-
truncated
|
|
282
|
-
? `\n(Showing ${sliced.length} of ${items.length} entries. Use 'offset' parameter to read beyond entry ${offset + sliced.length})`
|
|
283
|
-
: `\n(${items.length} entries)`,
|
|
284
|
-
`</entries>`,
|
|
285
|
-
].join("\n"),
|
|
286
|
-
metadata: {
|
|
287
|
-
preview: sliced.slice(0, 20).join("\n"),
|
|
288
|
-
truncated,
|
|
289
|
-
loaded: [] as string[],
|
|
290
|
-
display: {
|
|
291
|
-
type: "directory" as const,
|
|
292
|
-
path: filepath,
|
|
293
|
-
entries: sliced,
|
|
294
|
-
offset,
|
|
295
|
-
totalEntries: items.length,
|
|
296
|
-
truncated,
|
|
297
|
-
},
|
|
298
|
-
},
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
const loaded = yield* instruction.resolve(ctx.messages, filepath, ctx.messageID)
|
|
303
|
-
const sample = yield* readSample(filepath, Number(stat.size), SAMPLE_BYTES)
|
|
304
|
-
|
|
305
|
-
const mime = sniffAttachmentMime(sample, FSUtil.mimeType(filepath))
|
|
306
|
-
const isImage = SUPPORTED_IMAGE_MIMES.has(mime)
|
|
307
|
-
|
|
308
|
-
if (isImage || isPdfAttachment(mime)) {
|
|
309
|
-
const bytes = yield* fs.readFile(filepath)
|
|
310
|
-
const msg = isPdfAttachment(mime) ? "PDF read successfully" : "Image read successfully"
|
|
311
|
-
return {
|
|
312
|
-
title,
|
|
313
|
-
output: msg,
|
|
314
|
-
metadata: {
|
|
315
|
-
preview: msg,
|
|
316
|
-
truncated: false,
|
|
317
|
-
loaded: loaded.map((item) => item.filepath),
|
|
318
|
-
},
|
|
319
|
-
attachments: [
|
|
320
|
-
{
|
|
321
|
-
type: "file" as const,
|
|
322
|
-
mime,
|
|
323
|
-
url: `data:${mime};base64,${Buffer.from(bytes).toString("base64")}`,
|
|
324
|
-
},
|
|
325
|
-
],
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
if (isBinaryFile(filepath, sample)) {
|
|
330
|
-
return yield* Effect.fail(new Error(`Cannot read binary file: ${filepath}`))
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
const file = yield* lines(filepath, { limit: params.limit ?? DEFAULT_READ_LIMIT, offset: params.offset || 1 })
|
|
334
|
-
if (file.count < file.offset && !(file.count === 0 && file.offset === 1)) {
|
|
335
|
-
return yield* Effect.fail(
|
|
336
|
-
new Error(`Offset ${file.offset} is out of range for this file (${file.count} lines)`),
|
|
337
|
-
)
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
let output = [`<path>${filepath}</path>`, `<type>file</type>`, "<content>\n"].join("\n")
|
|
341
|
-
output += file.raw.map((line, i) => `${i + file.offset}: ${line}`).join("\n")
|
|
342
|
-
|
|
343
|
-
const last = file.offset + file.raw.length - 1
|
|
344
|
-
const next = last + 1
|
|
345
|
-
const truncated = file.more || file.cut
|
|
346
|
-
if (file.cut) {
|
|
347
|
-
output += `\n\n(Output capped at ${MAX_BYTES_LABEL}. Showing lines ${file.offset}-${last}. Use offset=${next} to continue.)`
|
|
348
|
-
} else if (file.more) {
|
|
349
|
-
output += `\n\n(Showing lines ${file.offset}-${last} of ${file.count}. Use offset=${next} to continue.)`
|
|
350
|
-
} else {
|
|
351
|
-
output += `\n\n(End of file - total ${file.count} lines)`
|
|
352
|
-
}
|
|
353
|
-
output += "\n</content>"
|
|
354
|
-
|
|
355
|
-
yield* warm(filepath)
|
|
356
|
-
|
|
357
|
-
if (loaded.length > 0) {
|
|
358
|
-
output += `\n\n<system-reminder>\n${loaded.map((item) => item.content).join("\n\n")}\n</system-reminder>`
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
return {
|
|
362
|
-
title,
|
|
363
|
-
output,
|
|
364
|
-
metadata: {
|
|
365
|
-
preview: file.raw.slice(0, 20).join("\n"),
|
|
366
|
-
truncated,
|
|
367
|
-
loaded: loaded.map((item) => item.filepath),
|
|
368
|
-
display: {
|
|
369
|
-
type: "file" as const,
|
|
370
|
-
path: filepath,
|
|
371
|
-
text: file.raw.join("\n"),
|
|
372
|
-
lineStart: file.offset,
|
|
373
|
-
lineEnd: last,
|
|
374
|
-
totalLines: file.count,
|
|
375
|
-
truncated,
|
|
376
|
-
},
|
|
377
|
-
},
|
|
378
|
-
}
|
|
379
|
-
})
|
|
380
|
-
|
|
381
|
-
return {
|
|
382
|
-
description: loadDescription(DESCRIPTION, DESCRIPTION_ZH),
|
|
383
|
-
parameters: Parameters,
|
|
384
|
-
execute: (params: Schema.Schema.Type<typeof Parameters>, ctx: Tool.Context<Metadata>) =>
|
|
385
|
-
run(params, ctx).pipe(Effect.orDie),
|
|
386
|
-
}
|
|
387
|
-
}),
|
|
388
|
-
)
|
package/src/tool/read.txt
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
Read a file or directory from the local filesystem. If the path does not exist, an error is returned.
|
|
2
|
-
|
|
3
|
-
Usage:
|
|
4
|
-
- The filePath parameter should be an absolute path.
|
|
5
|
-
- By default, this tool returns up to 2000 lines from the start of the file.
|
|
6
|
-
- The offset parameter is the line number to start from (1-indexed).
|
|
7
|
-
- To read later sections, call this tool again with a larger offset.
|
|
8
|
-
- Use the grep tool to find specific content in large files or files with long lines.
|
|
9
|
-
- If you are unsure of the correct file path, use the glob tool to look up filenames by glob pattern.
|
|
10
|
-
- Contents are returned with each line prefixed by its line number as `<line>: <content>`. For example, if a file has contents "foo\n", you will receive "1: foo\n". For directories, entries are returned one per line (without line numbers) with a trailing `/` for subdirectories.
|
|
11
|
-
- Any line longer than 2000 characters is truncated.
|
|
12
|
-
- Call this tool in parallel when you know there are multiple files you want to read.
|
|
13
|
-
- Avoid tiny repeated slices (30 line chunks). If you need more context, read a larger window.
|
|
14
|
-
- This tool can read image files and PDFs and return them as file attachments.
|
package/src/tool/read.zh.txt
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
从本地文件系统读取文件或目录。如果路径不存在,将返回错误。
|
|
2
|
-
|
|
3
|
-
用法:
|
|
4
|
-
- filePath 参数应为绝对路径。
|
|
5
|
-
- 默认情况下,此工具从文件开头返回最多 2000 行。
|
|
6
|
-
- offset 参数是起始行号(从 1 开始)。
|
|
7
|
-
- 要读取后续部分,请使用更大的 offset 再次调用此工具。
|
|
8
|
-
- 使用 grep 工具在大文件或长行文件中查找特定内容。
|
|
9
|
-
- 如果不确定正确的文件路径,请使用 glob 工具通过 glob 模式查找文件名。
|
|
10
|
-
- 返回内容时,每行以行号作为前缀,格式为 `<行号>: <内容>`。例如,如果文件内容为 "foo\n",您将收到 "1: foo\n"。对于目录,每个条目占一行(不带行号),子目录以 `/` 结尾。
|
|
11
|
-
- 任何超过 2000 个字符的行将被截断。
|
|
12
|
-
- 当您知道要读取多个文件时,请并行调用此工具。
|
|
13
|
-
- 避免微小的重复切片(30 行块)。如果需要更多上下文,请读取更大的窗口。
|
|
14
|
-
- 此工具可以读取图像文件和 PDF,并将它们作为文件附件返回。
|