onlycode 1.18.0 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/{opencode.cjs → onlycode.cjs} +8 -42
- package/package.json +12 -147
- package/src/account/account.ts +0 -463
- package/src/account/repo.ts +0 -173
- package/src/account/schema.ts +0 -99
- package/src/account/url.ts +0 -8
- package/src/acp/agent.ts +0 -95
- package/src/acp/config-option.ts +0 -203
- package/src/acp/content.ts +0 -250
- package/src/acp/directory.ts +0 -210
- package/src/acp/error.ts +0 -90
- package/src/acp/event.ts +0 -342
- package/src/acp/permission.ts +0 -124
- package/src/acp/profile.ts +0 -42
- package/src/acp/service.ts +0 -1048
- package/src/acp/session.ts +0 -231
- package/src/acp/tool.ts +0 -367
- package/src/acp/usage.ts +0 -232
- package/src/agent/agent.ts +0 -459
- package/src/agent/generate.txt +0 -75
- package/src/agent/prompt/compaction.txt +0 -9
- package/src/agent/prompt/explore.txt +0 -18
- package/src/agent/prompt/summary.txt +0 -11
- package/src/agent/prompt/title.txt +0 -44
- package/src/agent/subagent-permissions.ts +0 -27
- package/src/audio.d.ts +0 -14
- package/src/auth/index.ts +0 -99
- package/src/background/job.ts +0 -39
- package/src/bus/global.ts +0 -22
- package/src/cli/bootstrap.ts +0 -11
- package/src/cli/cmd/account.ts +0 -264
- package/src/cli/cmd/acp.ts +0 -73
- package/src/cli/cmd/agent.ts +0 -259
- package/src/cli/cmd/attach.ts +0 -97
- package/src/cli/cmd/cmd.ts +0 -7
- package/src/cli/cmd/db.ts +0 -62
- package/src/cli/cmd/debug/agent.handler.ts +0 -193
- package/src/cli/cmd/debug/agent.ts +0 -27
- package/src/cli/cmd/debug/config.ts +0 -14
- package/src/cli/cmd/debug/file.ts +0 -73
- package/src/cli/cmd/debug/index.ts +0 -87
- package/src/cli/cmd/debug/lsp.ts +0 -50
- package/src/cli/cmd/debug/ripgrep.ts +0 -79
- package/src/cli/cmd/debug/scrap.ts +0 -15
- package/src/cli/cmd/debug/skill.ts +0 -15
- package/src/cli/cmd/debug/snapshot.ts +0 -50
- package/src/cli/cmd/debug/startup.ts +0 -11
- package/src/cli/cmd/debug/v2.ts +0 -44
- package/src/cli/cmd/export.ts +0 -292
- package/src/cli/cmd/generate.ts +0 -54
- package/src/cli/cmd/github.handler.ts +0 -1593
- package/src/cli/cmd/github.shared.ts +0 -30
- package/src/cli/cmd/github.ts +0 -42
- package/src/cli/cmd/import.ts +0 -224
- package/src/cli/cmd/mcp.ts +0 -849
- package/src/cli/cmd/models.ts +0 -66
- package/src/cli/cmd/plug.ts +0 -230
- package/src/cli/cmd/pr.ts +0 -115
- package/src/cli/cmd/prompt-display.ts +0 -1
- package/src/cli/cmd/providers.ts +0 -534
- package/src/cli/cmd/run/demo.ts +0 -1274
- package/src/cli/cmd/run/entry.body.ts +0 -205
- package/src/cli/cmd/run/footer.command.tsx +0 -1064
- package/src/cli/cmd/run/footer.menu.tsx +0 -351
- package/src/cli/cmd/run/footer.permission.tsx +0 -472
- package/src/cli/cmd/run/footer.prompt.tsx +0 -1306
- package/src/cli/cmd/run/footer.question.tsx +0 -573
- package/src/cli/cmd/run/footer.subagent.tsx +0 -173
- package/src/cli/cmd/run/footer.ts +0 -1129
- package/src/cli/cmd/run/footer.view.tsx +0 -943
- package/src/cli/cmd/run/footer.width.ts +0 -27
- package/src/cli/cmd/run/permission.shared.ts +0 -256
- package/src/cli/cmd/run/prompt.editor.ts +0 -157
- package/src/cli/cmd/run/prompt.shared.ts +0 -153
- package/src/cli/cmd/run/question.shared.ts +0 -340
- package/src/cli/cmd/run/runtime.boot.ts +0 -202
- package/src/cli/cmd/run/runtime.lifecycle.ts +0 -406
- package/src/cli/cmd/run/runtime.queue.ts +0 -349
- package/src/cli/cmd/run/runtime.shared.ts +0 -17
- package/src/cli/cmd/run/runtime.stdin.ts +0 -37
- package/src/cli/cmd/run/runtime.ts +0 -814
- package/src/cli/cmd/run/scrollback.shared.ts +0 -92
- package/src/cli/cmd/run/scrollback.surface.ts +0 -431
- package/src/cli/cmd/run/scrollback.writer.tsx +0 -352
- package/src/cli/cmd/run/session-data.ts +0 -1113
- package/src/cli/cmd/run/session-replay.ts +0 -374
- package/src/cli/cmd/run/session.shared.ts +0 -196
- package/src/cli/cmd/run/splash.ts +0 -275
- package/src/cli/cmd/run/stream.transport.ts +0 -1462
- package/src/cli/cmd/run/stream.ts +0 -175
- package/src/cli/cmd/run/subagent-data.ts +0 -876
- package/src/cli/cmd/run/theme.ts +0 -690
- package/src/cli/cmd/run/tool.ts +0 -1489
- package/src/cli/cmd/run/trace.ts +0 -94
- package/src/cli/cmd/run/turn-summary.ts +0 -47
- package/src/cli/cmd/run/types.ts +0 -350
- package/src/cli/cmd/run/variant.shared.ts +0 -215
- package/src/cli/cmd/run.ts +0 -894
- package/src/cli/cmd/serve.ts +0 -24
- package/src/cli/cmd/session.ts +0 -147
- package/src/cli/cmd/stats.ts +0 -393
- package/src/cli/cmd/tui.ts +0 -224
- package/src/cli/cmd/uninstall.ts +0 -353
- package/src/cli/cmd/upgrade.ts +0 -74
- package/src/cli/cmd/web.ts +0 -84
- package/src/cli/effect/prompt.ts +0 -37
- package/src/cli/effect-cmd.ts +0 -96
- package/src/cli/error.ts +0 -130
- package/src/cli/heap.ts +0 -45
- package/src/cli/logo-pixel.ts +0 -35
- package/src/cli/logo.ts +0 -1
- package/src/cli/network.ts +0 -64
- package/src/cli/tui/layer.ts +0 -7
- package/src/cli/tui/validate-session.ts +0 -29
- package/src/cli/tui/worker.ts +0 -71
- package/src/cli/ui.ts +0 -148
- package/src/cli/upgrade.ts +0 -53
- package/src/command/index.ts +0 -184
- package/src/command/template/initialize.txt +0 -66
- package/src/command/template/review.txt +0 -101
- package/src/config/agent.ts +0 -59
- package/src/config/command.ts +0 -39
- package/src/config/config.ts +0 -686
- package/src/config/entry-name.ts +0 -19
- package/src/config/managed.ts +0 -69
- package/src/config/markdown.ts +0 -36
- package/src/config/parse.ts +0 -79
- package/src/config/paths.ts +0 -45
- package/src/config/plugin.ts +0 -79
- package/src/config/tui-cwd.ts +0 -5
- package/src/config/tui-host-attention.ts +0 -21
- package/src/config/tui-migrate.ts +0 -132
- package/src/config/tui.ts +0 -274
- package/src/config/variable.ts +0 -91
- package/src/control-plane/adapters/index.ts +0 -41
- package/src/control-plane/adapters/worktree.ts +0 -96
- package/src/control-plane/dev/README.md +0 -19
- package/src/control-plane/dev/debug-workspace-plugin.ts +0 -73
- package/src/control-plane/types.ts +0 -59
- package/src/control-plane/util.ts +0 -39
- package/src/control-plane/workspace-adapter-runtime.ts +0 -51
- package/src/control-plane/workspace-context.ts +0 -26
- package/src/control-plane/workspace.ts +0 -989
- package/src/effect/app-runtime.ts +0 -132
- package/src/effect/bootstrap-runtime.ts +0 -23
- package/src/effect/bridge.ts +0 -84
- package/src/effect/config-service.ts +0 -67
- package/src/effect/instance-ref.ts +0 -11
- package/src/effect/instance-registry.ts +0 -12
- package/src/effect/instance-state.ts +0 -69
- package/src/effect/promise.ts +0 -17
- package/src/effect/run-service.ts +0 -47
- package/src/effect/runner.ts +0 -217
- package/src/effect/runtime-flags.ts +0 -79
- package/src/env/index.ts +0 -43
- package/src/event-v2-bridge.ts +0 -79
- package/src/format/formatter.ts +0 -404
- package/src/format/index.ts +0 -205
- package/src/git/index.ts +0 -350
- package/src/id/id.ts +0 -80
- package/src/ide/index.ts +0 -61
- package/src/image/image.ts +0 -174
- package/src/index.ts +0 -142
- package/src/installation/index.ts +0 -350
- package/src/lsp/client.ts +0 -650
- package/src/lsp/diagnostic.ts +0 -29
- package/src/lsp/language.ts +0 -121
- package/src/lsp/launch.ts +0 -21
- package/src/lsp/lsp.ts +0 -511
- package/src/lsp/server.ts +0 -1983
- package/src/markdown.d.ts +0 -4
- package/src/mcp/auth.ts +0 -174
- package/src/mcp/catalog.ts +0 -153
- package/src/mcp/index.ts +0 -953
- package/src/mcp/oauth-callback.ts +0 -233
- package/src/mcp/oauth-provider.ts +0 -206
- package/src/node.ts +0 -4
- package/src/patch/index.ts +0 -686
- package/src/permission/arity.ts +0 -163
- package/src/permission/evaluate.ts +0 -1
- package/src/permission/index.ts +0 -230
- package/src/plugin/azure.ts +0 -26
- package/src/plugin/cloudflare.ts +0 -76
- package/src/plugin/digitalocean.ts +0 -383
- package/src/plugin/github-copilot/copilot.ts +0 -414
- package/src/plugin/github-copilot/models.ts +0 -246
- package/src/plugin/index.ts +0 -316
- package/src/plugin/install.ts +0 -439
- package/src/plugin/loader.ts +0 -237
- package/src/plugin/meta.ts +0 -188
- package/src/plugin/openai/README.md +0 -31
- package/src/plugin/openai/codex.ts +0 -641
- package/src/plugin/openai/ws-pool.ts +0 -270
- package/src/plugin/openai/ws.ts +0 -381
- package/src/plugin/pty-environment.ts +0 -24
- package/src/plugin/shared.ts +0 -323
- package/src/plugin/snowflake-cortex.ts +0 -529
- package/src/plugin/tui/internal.ts +0 -10
- package/src/plugin/tui/runtime.ts +0 -1130
- package/src/plugin/xai.ts +0 -716
- package/src/project/bootstrap-service.ts +0 -9
- package/src/project/bootstrap.ts +0 -76
- package/src/project/instance-context.ts +0 -24
- package/src/project/instance-layer.ts +0 -11
- package/src/project/instance-runtime.ts +0 -16
- package/src/project/instance-store.ts +0 -209
- package/src/project/project.ts +0 -519
- package/src/project/vcs.ts +0 -431
- package/src/provider/auth.ts +0 -233
- package/src/provider/error.ts +0 -188
- package/src/provider/model-status.ts +0 -8
- package/src/provider/provider.ts +0 -1975
- package/src/provider/transform.ts +0 -1543
- package/src/question/index.ts +0 -229
- package/src/question/schema.ts +0 -10
- package/src/server/auth.ts +0 -48
- package/src/server/event.ts +0 -13
- package/src/server/global-lifecycle.ts +0 -28
- package/src/server/init-projectors.ts +0 -3
- package/src/server/mdns.ts +0 -47
- package/src/server/projectors.ts +0 -1
- package/src/server/proxy-util.ts +0 -48
- package/src/server/routes/instance/httpapi/AGENTS.md +0 -39
- package/src/server/routes/instance/httpapi/api.ts +0 -78
- package/src/server/routes/instance/httpapi/errors.ts +0 -193
- package/src/server/routes/instance/httpapi/groups/config.ts +0 -65
- package/src/server/routes/instance/httpapi/groups/control-plane.ts +0 -35
- package/src/server/routes/instance/httpapi/groups/control.ts +0 -76
- package/src/server/routes/instance/httpapi/groups/event.ts +0 -29
- package/src/server/routes/instance/httpapi/groups/experimental.ts +0 -275
- package/src/server/routes/instance/httpapi/groups/file.ts +0 -185
- package/src/server/routes/instance/httpapi/groups/global.ts +0 -138
- package/src/server/routes/instance/httpapi/groups/instance.ts +0 -206
- package/src/server/routes/instance/httpapi/groups/mcp.ts +0 -156
- package/src/server/routes/instance/httpapi/groups/metadata.ts +0 -18
- package/src/server/routes/instance/httpapi/groups/permission.ts +0 -61
- package/src/server/routes/instance/httpapi/groups/project-copy.ts +0 -32
- package/src/server/routes/instance/httpapi/groups/project.ts +0 -93
- package/src/server/routes/instance/httpapi/groups/provider.ts +0 -101
- package/src/server/routes/instance/httpapi/groups/pty.ts +0 -172
- package/src/server/routes/instance/httpapi/groups/query.ts +0 -12
- package/src/server/routes/instance/httpapi/groups/question.ts +0 -74
- package/src/server/routes/instance/httpapi/groups/session.ts +0 -462
- package/src/server/routes/instance/httpapi/groups/sync.ts +0 -113
- package/src/server/routes/instance/httpapi/groups/tui.ts +0 -208
- package/src/server/routes/instance/httpapi/groups/workspace.ts +0 -141
- package/src/server/routes/instance/httpapi/handlers/config.ts +0 -34
- package/src/server/routes/instance/httpapi/handlers/control-plane.ts +0 -37
- package/src/server/routes/instance/httpapi/handlers/control.ts +0 -43
- package/src/server/routes/instance/httpapi/handlers/event.ts +0 -99
- package/src/server/routes/instance/httpapi/handlers/experimental.ts +0 -192
- package/src/server/routes/instance/httpapi/handlers/file.ts +0 -139
- package/src/server/routes/instance/httpapi/handlers/global.ts +0 -156
- package/src/server/routes/instance/httpapi/handlers/instance.ts +0 -110
- package/src/server/routes/instance/httpapi/handlers/mcp.ts +0 -111
- package/src/server/routes/instance/httpapi/handlers/permission.ts +0 -41
- package/src/server/routes/instance/httpapi/handlers/project-copy.ts +0 -83
- package/src/server/routes/instance/httpapi/handlers/project.ts +0 -63
- package/src/server/routes/instance/httpapi/handlers/provider.ts +0 -113
- package/src/server/routes/instance/httpapi/handlers/pty.ts +0 -273
- package/src/server/routes/instance/httpapi/handlers/question.ts +0 -54
- package/src/server/routes/instance/httpapi/handlers/session-errors.ts +0 -21
- package/src/server/routes/instance/httpapi/handlers/session.ts +0 -440
- package/src/server/routes/instance/httpapi/handlers/sync.ts +0 -89
- package/src/server/routes/instance/httpapi/handlers/tui.ts +0 -131
- package/src/server/routes/instance/httpapi/handlers/workspace.ts +0 -102
- package/src/server/routes/instance/httpapi/lifecycle.ts +0 -54
- package/src/server/routes/instance/httpapi/middleware/authorization.ts +0 -150
- package/src/server/routes/instance/httpapi/middleware/compression.ts +0 -64
- package/src/server/routes/instance/httpapi/middleware/cors-vary.ts +0 -29
- package/src/server/routes/instance/httpapi/middleware/error.ts +0 -43
- package/src/server/routes/instance/httpapi/middleware/fence.ts +0 -25
- package/src/server/routes/instance/httpapi/middleware/instance-context.ts +0 -43
- package/src/server/routes/instance/httpapi/middleware/proxy.ts +0 -108
- package/src/server/routes/instance/httpapi/middleware/schema-error.ts +0 -41
- package/src/server/routes/instance/httpapi/middleware/workspace-routing.ts +0 -250
- package/src/server/routes/instance/httpapi/public.ts +0 -535
- package/src/server/routes/instance/httpapi/server.ts +0 -298
- package/src/server/routes/instance/httpapi/websocket-tracker.ts +0 -57
- package/src/server/server.ts +0 -225
- package/src/server/shared/fence.ts +0 -60
- package/src/server/shared/pty-ticket.ts +0 -15
- package/src/server/shared/public-ui.ts +0 -12
- package/src/server/shared/tui-control.ts +0 -28
- package/src/server/shared/ui.ts +0 -108
- package/src/server/shared/workspace-routing.ts +0 -38
- package/src/server/tui-event.ts +0 -53
- package/src/session/compaction.ts +0 -620
- package/src/session/instruction.ts +0 -241
- package/src/session/llm/AGENTS.md +0 -90
- package/src/session/llm/ai-sdk.ts +0 -288
- package/src/session/llm/native-request.ts +0 -196
- package/src/session/llm/native-runtime.ts +0 -195
- package/src/session/llm/request.ts +0 -216
- package/src/session/llm.ts +0 -415
- package/src/session/message-error.ts +0 -14
- package/src/session/message-v2.ts +0 -747
- package/src/session/message.ts +0 -148
- package/src/session/overflow.ts +0 -34
- package/src/session/processor.ts +0 -1084
- package/src/session/prompt/anthropic.txt +0 -109
- package/src/session/prompt/beast.txt +0 -151
- package/src/session/prompt/build-switch.txt +0 -9
- package/src/session/prompt/codex.txt +0 -83
- package/src/session/prompt/copilot-gpt-5.txt +0 -147
- package/src/session/prompt/default.txt +0 -99
- package/src/session/prompt/gemini.txt +0 -159
- package/src/session/prompt/gpt.txt +0 -111
- package/src/session/prompt/kimi.txt +0 -99
- package/src/session/prompt/plan-mode.txt +0 -74
- package/src/session/prompt/plan-reminder-anthropic.txt +0 -71
- package/src/session/prompt/plan.txt +0 -30
- package/src/session/prompt/trinity.txt +0 -101
- package/src/session/prompt.ts +0 -1707
- package/src/session/reminders.ts +0 -92
- package/src/session/retry.ts +0 -201
- package/src/session/revert.ts +0 -160
- package/src/session/run-state.ts +0 -156
- package/src/session/schema.ts +0 -26
- package/src/session/session.ts +0 -1119
- package/src/session/status.ts +0 -97
- package/src/session/summary.ts +0 -165
- package/src/session/system.ts +0 -117
- package/src/session/todo.ts +0 -90
- package/src/session/tools.ts +0 -207
- package/src/share/session.ts +0 -61
- package/src/share/share-next.ts +0 -385
- package/src/skill/discovery.ts +0 -109
- package/src/skill/index.ts +0 -366
- package/src/snapshot/index.ts +0 -808
- package/src/sql.d.ts +0 -4
- package/src/storage/schema.ts +0 -5
- package/src/storage/storage.ts +0 -329
- package/src/sync/README.md +0 -179
- package/src/sync/schema.ts +0 -11
- package/src/temporary.ts +0 -31
- package/src/tool/apply_patch.ts +0 -315
- package/src/tool/apply_patch.txt +0 -33
- package/src/tool/apply_patch.zh.txt +0 -33
- package/src/tool/description.ts +0 -100
- package/src/tool/edit.ts +0 -739
- package/src/tool/edit.txt +0 -10
- package/src/tool/edit.zh.txt +0 -10
- package/src/tool/external-directory.ts +0 -49
- package/src/tool/glob.ts +0 -78
- package/src/tool/glob.txt +0 -6
- package/src/tool/glob.zh.txt +0 -6
- package/src/tool/grep.ts +0 -114
- package/src/tool/grep.txt +0 -8
- package/src/tool/grep.zh.txt +0 -8
- package/src/tool/invalid.ts +0 -21
- package/src/tool/json-schema.ts +0 -164
- package/src/tool/lsp.ts +0 -115
- package/src/tool/lsp.txt +0 -24
- package/src/tool/lsp.zh.txt +0 -24
- package/src/tool/mcp-websearch.ts +0 -96
- package/src/tool/plan-enter.txt +0 -14
- package/src/tool/plan-enter.zh.txt +0 -14
- package/src/tool/plan-exit.txt +0 -13
- package/src/tool/plan-exit.zh.txt +0 -13
- package/src/tool/plan.ts +0 -81
- package/src/tool/question.ts +0 -46
- package/src/tool/question.txt +0 -10
- package/src/tool/question.zh.txt +0 -10
- package/src/tool/read.ts +0 -388
- package/src/tool/read.txt +0 -14
- package/src/tool/read.zh.txt +0 -14
- package/src/tool/registry.ts +0 -440
- package/src/tool/schema.ts +0 -14
- package/src/tool/shell/id.ts +0 -19
- package/src/tool/shell/prompt.ts +0 -307
- package/src/tool/shell/shell.txt +0 -21
- package/src/tool/shell.ts +0 -657
- package/src/tool/skill.ts +0 -73
- package/src/tool/skill.txt +0 -5
- package/src/tool/skill.zh.txt +0 -5
- package/src/tool/task.ts +0 -348
- package/src/tool/task.txt +0 -19
- package/src/tool/task.zh.txt +0 -19
- package/src/tool/todo.ts +0 -59
- package/src/tool/todowrite.txt +0 -44
- package/src/tool/todowrite.zh.txt +0 -44
- package/src/tool/tool.ts +0 -183
- package/src/tool/truncate.ts +0 -158
- package/src/tool/truncation-dir.ts +0 -4
- package/src/tool/webfetch.ts +0 -194
- package/src/tool/webfetch.txt +0 -13
- package/src/tool/webfetch.zh.txt +0 -13
- package/src/tool/websearch.ts +0 -145
- package/src/tool/websearch.txt +0 -14
- package/src/tool/websearch.zh.txt +0 -14
- package/src/tool/write.ts +0 -106
- package/src/tool/write.txt +0 -8
- package/src/tool/write.zh.txt +0 -8
- package/src/util/archive.ts +0 -17
- package/src/util/bom.ts +0 -27
- package/src/util/data-url.ts +0 -9
- package/src/util/defer.ts +0 -10
- package/src/util/effect-http-client.ts +0 -11
- package/src/util/error.ts +0 -1
- package/src/util/filesystem.ts +0 -251
- package/src/util/html.ts +0 -8
- package/src/util/iife.ts +0 -3
- package/src/util/lazy.ts +0 -20
- package/src/util/local-context.ts +0 -25
- package/src/util/locale.ts +0 -2
- package/src/util/media.ts +0 -26
- package/src/util/process.ts +0 -177
- package/src/util/proxy-env.ts +0 -72
- package/src/util/queue.ts +0 -32
- package/src/util/record.ts +0 -1
- package/src/util/repository.ts +0 -232
- package/src/util/rpc.ts +0 -66
- package/src/util/signal.ts +0 -12
- package/src/util/timeout.ts +0 -13
- package/src/util/token.ts +0 -1
- package/src/util/wildcard.ts +0 -59
- package/src/worktree/index.ts +0 -654
package/src/acp/session.ts
DELETED
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
import type { McpServer } from "@agentclientprotocol/sdk"
|
|
2
|
-
import type { Message, Part } from "@opencode-ai/sdk/v2"
|
|
3
|
-
import { ProviderV2 } from "@opencode-ai/core/provider"
|
|
4
|
-
import { ModelV2 } from "@opencode-ai/core/model"
|
|
5
|
-
import { Context, Effect, Layer, Ref } from "effect"
|
|
6
|
-
import * as ACPError from "./error"
|
|
7
|
-
|
|
8
|
-
export type SelectedModel = {
|
|
9
|
-
providerID: ProviderV2.ID
|
|
10
|
-
modelID: ModelV2.ID
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export type KnownMessagePartMetadata = {
|
|
14
|
-
messageId: string
|
|
15
|
-
partId: string
|
|
16
|
-
partType?: Part["type"]
|
|
17
|
-
role?: Message["role"]
|
|
18
|
-
ignored?: boolean
|
|
19
|
-
toolCallId?: string
|
|
20
|
-
metadata?: unknown
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export type Info = {
|
|
24
|
-
id: string
|
|
25
|
-
cwd: string
|
|
26
|
-
mcpServers: readonly McpServer[]
|
|
27
|
-
createdAt: Date
|
|
28
|
-
model?: SelectedModel
|
|
29
|
-
variant?: string
|
|
30
|
-
modeId?: string
|
|
31
|
-
knownParts: ReadonlyMap<string, KnownMessagePartMetadata>
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export type StoreInput = {
|
|
35
|
-
id: string
|
|
36
|
-
cwd: string
|
|
37
|
-
mcpServers?: readonly McpServer[]
|
|
38
|
-
createdAt?: Date
|
|
39
|
-
model?: SelectedModel
|
|
40
|
-
variant?: string
|
|
41
|
-
modeId?: string
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export type RecordPartMetadataInput = {
|
|
45
|
-
sessionId: string
|
|
46
|
-
messageId: string
|
|
47
|
-
partId: string
|
|
48
|
-
partType?: Part["type"]
|
|
49
|
-
role?: Message["role"]
|
|
50
|
-
ignored?: boolean
|
|
51
|
-
toolCallId?: string
|
|
52
|
-
metadata?: unknown
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export type PartMetadataLookupInput = {
|
|
56
|
-
sessionId: string
|
|
57
|
-
messageId: string
|
|
58
|
-
partId: string
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export type Interface = {
|
|
62
|
-
readonly create: (input: StoreInput) => Effect.Effect<Info>
|
|
63
|
-
readonly load: (input: StoreInput) => Effect.Effect<Info>
|
|
64
|
-
readonly list: (cwd?: string) => Effect.Effect<readonly Info[]>
|
|
65
|
-
readonly get: (sessionId: string) => Effect.Effect<Info, ACPError.SessionNotFoundError>
|
|
66
|
-
readonly tryGet: (sessionId: string) => Effect.Effect<Info | undefined>
|
|
67
|
-
readonly remove: (sessionId: string) => Effect.Effect<Info | undefined>
|
|
68
|
-
readonly setModel: (
|
|
69
|
-
sessionId: string,
|
|
70
|
-
model: SelectedModel | undefined,
|
|
71
|
-
) => Effect.Effect<Info, ACPError.SessionNotFoundError>
|
|
72
|
-
readonly getModel: (sessionId: string) => Effect.Effect<SelectedModel | undefined, ACPError.SessionNotFoundError>
|
|
73
|
-
readonly setVariant: (
|
|
74
|
-
sessionId: string,
|
|
75
|
-
variant: string | undefined,
|
|
76
|
-
) => Effect.Effect<Info, ACPError.SessionNotFoundError>
|
|
77
|
-
readonly getVariant: (sessionId: string) => Effect.Effect<string | undefined, ACPError.SessionNotFoundError>
|
|
78
|
-
readonly setMode: (
|
|
79
|
-
sessionId: string,
|
|
80
|
-
modeId: string | undefined,
|
|
81
|
-
) => Effect.Effect<Info, ACPError.SessionNotFoundError>
|
|
82
|
-
readonly getMode: (sessionId: string) => Effect.Effect<string | undefined, ACPError.SessionNotFoundError>
|
|
83
|
-
readonly recordPartMetadata: (
|
|
84
|
-
input: RecordPartMetadataInput,
|
|
85
|
-
) => Effect.Effect<KnownMessagePartMetadata, ACPError.SessionNotFoundError>
|
|
86
|
-
readonly getPartMetadata: (
|
|
87
|
-
input: PartMetadataLookupInput,
|
|
88
|
-
) => Effect.Effect<KnownMessagePartMetadata | undefined, ACPError.SessionNotFoundError>
|
|
89
|
-
readonly tryGetPartMetadata: (input: PartMetadataLookupInput) => Effect.Effect<KnownMessagePartMetadata | undefined>
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
export class Service extends Context.Service<Service, Interface>()("@opencode/ACP/Session") {}
|
|
93
|
-
|
|
94
|
-
type State = Map<string, Info>
|
|
95
|
-
|
|
96
|
-
export const layer = Layer.effect(
|
|
97
|
-
Service,
|
|
98
|
-
Effect.gen(function* () {
|
|
99
|
-
const sessions = yield* Ref.make<State>(new Map())
|
|
100
|
-
|
|
101
|
-
const store = Effect.fn("ACP.Session.store")(function* (input: StoreInput) {
|
|
102
|
-
const session = makeSession(input)
|
|
103
|
-
yield* Ref.update(sessions, (state) => new Map(state).set(session.id, session))
|
|
104
|
-
return snapshot(session)
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
const tryGet = Effect.fn("ACP.Session.tryGet")(function* (sessionId: string) {
|
|
108
|
-
const session = (yield* Ref.get(sessions)).get(sessionId)
|
|
109
|
-
if (!session) return
|
|
110
|
-
return snapshot(session)
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
const get = Effect.fn("ACP.Session.get")(function* (sessionId: string) {
|
|
114
|
-
const session = yield* tryGet(sessionId)
|
|
115
|
-
if (session) return session
|
|
116
|
-
return yield* new ACPError.SessionNotFoundError({ sessionId })
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
const update = Effect.fn("ACP.Session.update")(function* (sessionId: string, fn: (session: Info) => Info) {
|
|
120
|
-
const result = yield* Ref.modify(sessions, (state) => {
|
|
121
|
-
const session = state.get(sessionId)
|
|
122
|
-
if (!session) return [undefined, state] as const
|
|
123
|
-
const next = fn(session)
|
|
124
|
-
return [snapshot(next), new Map(state).set(sessionId, next)] as const
|
|
125
|
-
})
|
|
126
|
-
if (result) return result
|
|
127
|
-
return yield* new ACPError.SessionNotFoundError({ sessionId })
|
|
128
|
-
})
|
|
129
|
-
|
|
130
|
-
const remove = Effect.fn("ACP.Session.remove")(function* (sessionId: string) {
|
|
131
|
-
return yield* Ref.modify(sessions, (state) => {
|
|
132
|
-
const session = state.get(sessionId)
|
|
133
|
-
if (!session) return [undefined, state] as const
|
|
134
|
-
const next = new Map(state)
|
|
135
|
-
next.delete(sessionId)
|
|
136
|
-
return [snapshot(session), next] as const
|
|
137
|
-
})
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
const setModel: Interface["setModel"] = Effect.fn("ACP.Session.setModel")((sessionId, model) =>
|
|
141
|
-
update(sessionId, (session) => ({ ...session, model })),
|
|
142
|
-
)
|
|
143
|
-
|
|
144
|
-
const setVariant: Interface["setVariant"] = Effect.fn("ACP.Session.setVariant")((sessionId, variant) =>
|
|
145
|
-
update(sessionId, (session) => ({ ...session, variant })),
|
|
146
|
-
)
|
|
147
|
-
|
|
148
|
-
const setMode: Interface["setMode"] = Effect.fn("ACP.Session.setMode")((sessionId, modeId) =>
|
|
149
|
-
update(sessionId, (session) => ({ ...session, modeId })),
|
|
150
|
-
)
|
|
151
|
-
|
|
152
|
-
const recordPartMetadata: Interface["recordPartMetadata"] = Effect.fn("ACP.Session.recordPartMetadata")((input) => {
|
|
153
|
-
const metadata = {
|
|
154
|
-
messageId: input.messageId,
|
|
155
|
-
partId: input.partId,
|
|
156
|
-
partType: input.partType,
|
|
157
|
-
role: input.role,
|
|
158
|
-
ignored: input.ignored,
|
|
159
|
-
toolCallId: input.toolCallId,
|
|
160
|
-
metadata: input.metadata,
|
|
161
|
-
}
|
|
162
|
-
return update(input.sessionId, (session) => ({
|
|
163
|
-
...session,
|
|
164
|
-
knownParts: new Map(session.knownParts).set(partMetadataKey(input), metadata),
|
|
165
|
-
})).pipe(Effect.as(metadata))
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
return Service.of({
|
|
169
|
-
create: store,
|
|
170
|
-
load: store,
|
|
171
|
-
list: Effect.fn("ACP.Session.list")(function* (cwd?: string) {
|
|
172
|
-
return [...(yield* Ref.get(sessions)).values()]
|
|
173
|
-
.filter((session) => !cwd || session.cwd === cwd)
|
|
174
|
-
.map(snapshot)
|
|
175
|
-
.toSorted((a, b) => b.createdAt.getTime() - a.createdAt.getTime())
|
|
176
|
-
}),
|
|
177
|
-
get,
|
|
178
|
-
tryGet,
|
|
179
|
-
remove,
|
|
180
|
-
setModel,
|
|
181
|
-
getModel: Effect.fn("ACP.Session.getModel")(function* (sessionId) {
|
|
182
|
-
return (yield* get(sessionId)).model
|
|
183
|
-
}),
|
|
184
|
-
setVariant,
|
|
185
|
-
getVariant: Effect.fn("ACP.Session.getVariant")(function* (sessionId) {
|
|
186
|
-
return (yield* get(sessionId)).variant
|
|
187
|
-
}),
|
|
188
|
-
setMode,
|
|
189
|
-
getMode: Effect.fn("ACP.Session.getMode")(function* (sessionId) {
|
|
190
|
-
return (yield* get(sessionId)).modeId
|
|
191
|
-
}),
|
|
192
|
-
recordPartMetadata,
|
|
193
|
-
getPartMetadata: Effect.fn("ACP.Session.getPartMetadata")(function* (input) {
|
|
194
|
-
return (yield* get(input.sessionId)).knownParts.get(partMetadataKey(input))
|
|
195
|
-
}),
|
|
196
|
-
tryGetPartMetadata: Effect.fn("ACP.Session.tryGetPartMetadata")(function* (input) {
|
|
197
|
-
return (yield* tryGet(input.sessionId))?.knownParts.get(partMetadataKey(input))
|
|
198
|
-
}),
|
|
199
|
-
})
|
|
200
|
-
}),
|
|
201
|
-
)
|
|
202
|
-
|
|
203
|
-
export const defaultLayer = layer
|
|
204
|
-
|
|
205
|
-
function makeSession(input: StoreInput): Info {
|
|
206
|
-
return {
|
|
207
|
-
id: input.id,
|
|
208
|
-
cwd: input.cwd,
|
|
209
|
-
mcpServers: [...(input.mcpServers ?? [])],
|
|
210
|
-
createdAt: input.createdAt ? new Date(input.createdAt) : new Date(),
|
|
211
|
-
model: input.model,
|
|
212
|
-
variant: input.variant,
|
|
213
|
-
modeId: input.modeId,
|
|
214
|
-
knownParts: new Map(),
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
function snapshot(session: Info): Info {
|
|
219
|
-
return {
|
|
220
|
-
...session,
|
|
221
|
-
mcpServers: [...session.mcpServers],
|
|
222
|
-
createdAt: new Date(session.createdAt),
|
|
223
|
-
knownParts: new Map(session.knownParts),
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
function partMetadataKey(input: { messageId: string; partId: string }) {
|
|
228
|
-
return `${input.messageId}:${input.partId}`
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
export * as ACPSession from "./session"
|
package/src/acp/tool.ts
DELETED
|
@@ -1,367 +0,0 @@
|
|
|
1
|
-
import { isAbsolute, resolve } from "path"
|
|
2
|
-
import type { ToolCall, ToolCallContent, ToolCallLocation, ToolCallUpdate, ToolKind } from "@agentclientprotocol/sdk"
|
|
3
|
-
|
|
4
|
-
export type ToolInput = Record<string, unknown>
|
|
5
|
-
|
|
6
|
-
export type ToolAttachment = {
|
|
7
|
-
readonly mime?: string
|
|
8
|
-
readonly url?: string
|
|
9
|
-
readonly [key: string]: unknown
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export type CompletedToolState = {
|
|
13
|
-
readonly status: "completed"
|
|
14
|
-
readonly input: ToolInput
|
|
15
|
-
readonly output: string
|
|
16
|
-
readonly metadata?: unknown
|
|
17
|
-
readonly attachments?: ReadonlyArray<ToolAttachment>
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export type RunningToolState = {
|
|
21
|
-
readonly status: "running"
|
|
22
|
-
readonly input: ToolInput
|
|
23
|
-
readonly title?: string
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export type ErrorToolState = {
|
|
27
|
-
readonly status: "error"
|
|
28
|
-
readonly input: ToolInput
|
|
29
|
-
readonly error: string
|
|
30
|
-
readonly metadata?: unknown
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export type ImageAttachment = {
|
|
34
|
-
readonly mimeType: string
|
|
35
|
-
readonly data: string
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export function toToolKind(toolName: string): ToolKind {
|
|
39
|
-
const tool = toolName.toLocaleLowerCase()
|
|
40
|
-
|
|
41
|
-
switch (tool) {
|
|
42
|
-
case "bash":
|
|
43
|
-
case "shell":
|
|
44
|
-
return "execute"
|
|
45
|
-
|
|
46
|
-
case "webfetch":
|
|
47
|
-
return "fetch"
|
|
48
|
-
|
|
49
|
-
case "edit":
|
|
50
|
-
case "apply_patch":
|
|
51
|
-
case "patch":
|
|
52
|
-
case "write":
|
|
53
|
-
return "edit"
|
|
54
|
-
|
|
55
|
-
case "grep":
|
|
56
|
-
case "glob":
|
|
57
|
-
case "context":
|
|
58
|
-
case "context7_resolve_library_id":
|
|
59
|
-
case "context7_get_library_docs":
|
|
60
|
-
return "search"
|
|
61
|
-
|
|
62
|
-
case "read":
|
|
63
|
-
return "read"
|
|
64
|
-
|
|
65
|
-
case "task":
|
|
66
|
-
return "think"
|
|
67
|
-
|
|
68
|
-
default:
|
|
69
|
-
return "other"
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export function toLocations(toolName: string, input: ToolInput, cwd?: string): ToolCallLocation[] {
|
|
74
|
-
const tool = toolName.toLocaleLowerCase()
|
|
75
|
-
|
|
76
|
-
switch (tool) {
|
|
77
|
-
case "bash":
|
|
78
|
-
case "shell": {
|
|
79
|
-
const workdir = shellWorkdir(input, cwd)
|
|
80
|
-
return workdir ? [{ path: workdir }] : []
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
case "read":
|
|
84
|
-
case "edit":
|
|
85
|
-
case "write":
|
|
86
|
-
return locationFrom(input.filePath ?? input.filepath)
|
|
87
|
-
|
|
88
|
-
case "external_directory":
|
|
89
|
-
return locationFrom(input.filePath ?? input.filepath, input.parentDir, input.directories)
|
|
90
|
-
|
|
91
|
-
case "grep":
|
|
92
|
-
case "glob":
|
|
93
|
-
case "context":
|
|
94
|
-
case "context7_resolve_library_id":
|
|
95
|
-
case "context7_get_library_docs":
|
|
96
|
-
return locationFrom(input.path)
|
|
97
|
-
|
|
98
|
-
default:
|
|
99
|
-
return []
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
export function completedToolContent(toolName: string, state: CompletedToolState): ToolCallContent[] {
|
|
104
|
-
const text =
|
|
105
|
-
toolName.toLocaleLowerCase() === "read" ? (readDisplayText(state.metadata) ?? state.output) : state.output
|
|
106
|
-
const content: ToolCallContent[] = [
|
|
107
|
-
{
|
|
108
|
-
type: "content",
|
|
109
|
-
content: {
|
|
110
|
-
type: "text",
|
|
111
|
-
text,
|
|
112
|
-
},
|
|
113
|
-
},
|
|
114
|
-
]
|
|
115
|
-
|
|
116
|
-
if (toToolKind(toolName) === "edit") {
|
|
117
|
-
content.push(...diffContent(state.input))
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
content.push(...imageContents(state.attachments ?? []))
|
|
121
|
-
return content
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
export function pendingToolCall(input: {
|
|
125
|
-
readonly toolCallId: string
|
|
126
|
-
readonly toolName: string
|
|
127
|
-
readonly state: { readonly input: ToolInput; readonly title?: string }
|
|
128
|
-
readonly cwd?: string
|
|
129
|
-
}): ToolCall {
|
|
130
|
-
return {
|
|
131
|
-
toolCallId: input.toolCallId,
|
|
132
|
-
title: toolTitle(input.toolName, input.state.input, input.state.title),
|
|
133
|
-
kind: toToolKind(input.toolName),
|
|
134
|
-
status: "pending",
|
|
135
|
-
locations: toLocations(input.toolName, input.state.input, input.cwd),
|
|
136
|
-
rawInput: rawInput(input.toolName, input.state.input, input.cwd),
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
export function runningToolUpdate(input: {
|
|
141
|
-
readonly toolCallId: string
|
|
142
|
-
readonly toolName: string
|
|
143
|
-
readonly state: RunningToolState
|
|
144
|
-
readonly output?: string
|
|
145
|
-
readonly cwd?: string
|
|
146
|
-
}): ToolCallUpdate {
|
|
147
|
-
const content = input.output
|
|
148
|
-
? [
|
|
149
|
-
{
|
|
150
|
-
type: "content" as const,
|
|
151
|
-
content: {
|
|
152
|
-
type: "text" as const,
|
|
153
|
-
text: input.output,
|
|
154
|
-
},
|
|
155
|
-
},
|
|
156
|
-
]
|
|
157
|
-
: undefined
|
|
158
|
-
|
|
159
|
-
return {
|
|
160
|
-
toolCallId: input.toolCallId,
|
|
161
|
-
status: "in_progress",
|
|
162
|
-
kind: toToolKind(input.toolName),
|
|
163
|
-
title: toolTitle(input.toolName, input.state.input, input.state.title),
|
|
164
|
-
locations: toLocations(input.toolName, input.state.input, input.cwd),
|
|
165
|
-
rawInput: rawInput(input.toolName, input.state.input, input.cwd),
|
|
166
|
-
...(content ? { content } : {}),
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
export function duplicateRunningToolUpdate(input: {
|
|
171
|
-
readonly toolCallId: string
|
|
172
|
-
readonly toolName: string
|
|
173
|
-
readonly state: RunningToolState
|
|
174
|
-
readonly cwd?: string
|
|
175
|
-
}): ToolCallUpdate {
|
|
176
|
-
return {
|
|
177
|
-
toolCallId: input.toolCallId,
|
|
178
|
-
status: "in_progress",
|
|
179
|
-
kind: toToolKind(input.toolName),
|
|
180
|
-
title: toolTitle(input.toolName, input.state.input, input.state.title),
|
|
181
|
-
locations: toLocations(input.toolName, input.state.input, input.cwd),
|
|
182
|
-
rawInput: rawInput(input.toolName, input.state.input, input.cwd),
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
export function completedToolUpdate(input: {
|
|
187
|
-
readonly toolCallId: string
|
|
188
|
-
readonly toolName: string
|
|
189
|
-
readonly state: CompletedToolState & { readonly title?: string }
|
|
190
|
-
readonly cwd?: string
|
|
191
|
-
}): ToolCallUpdate {
|
|
192
|
-
return {
|
|
193
|
-
toolCallId: input.toolCallId,
|
|
194
|
-
status: "completed",
|
|
195
|
-
kind: toToolKind(input.toolName),
|
|
196
|
-
title: toolTitle(input.toolName, input.state.input, input.state.title),
|
|
197
|
-
locations: toLocations(input.toolName, input.state.input, input.cwd),
|
|
198
|
-
content: completedToolContent(input.toolName, input.state),
|
|
199
|
-
rawInput: rawInput(input.toolName, input.state.input, input.cwd),
|
|
200
|
-
rawOutput: completedToolRawOutput(input.state),
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
export function errorToolUpdate(input: {
|
|
205
|
-
readonly toolCallId: string
|
|
206
|
-
readonly toolName: string
|
|
207
|
-
readonly state: ErrorToolState
|
|
208
|
-
readonly cwd?: string
|
|
209
|
-
}): ToolCallUpdate {
|
|
210
|
-
return {
|
|
211
|
-
toolCallId: input.toolCallId,
|
|
212
|
-
status: "failed",
|
|
213
|
-
kind: toToolKind(input.toolName),
|
|
214
|
-
title: toolTitle(input.toolName, input.state.input, undefined),
|
|
215
|
-
locations: toLocations(input.toolName, input.state.input, input.cwd),
|
|
216
|
-
rawInput: rawInput(input.toolName, input.state.input, input.cwd),
|
|
217
|
-
content: [
|
|
218
|
-
{
|
|
219
|
-
type: "content",
|
|
220
|
-
content: {
|
|
221
|
-
type: "text",
|
|
222
|
-
text: input.state.error,
|
|
223
|
-
},
|
|
224
|
-
},
|
|
225
|
-
],
|
|
226
|
-
rawOutput: {
|
|
227
|
-
error: input.state.error,
|
|
228
|
-
metadata: input.state.metadata,
|
|
229
|
-
},
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
export function completedToolRawOutput(state: CompletedToolState) {
|
|
234
|
-
return {
|
|
235
|
-
output: state.output,
|
|
236
|
-
...(state.metadata !== undefined ? { metadata: state.metadata } : {}),
|
|
237
|
-
...(state.attachments?.length ? { attachments: state.attachments } : {}),
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
export function imageContents(attachments: ReadonlyArray<ToolAttachment>): ToolCallContent[] {
|
|
242
|
-
return extractImageAttachments(attachments).map((attachment): ToolCallContent => {
|
|
243
|
-
return {
|
|
244
|
-
type: "content",
|
|
245
|
-
content: {
|
|
246
|
-
type: "image",
|
|
247
|
-
mimeType: attachment.mimeType,
|
|
248
|
-
data: attachment.data,
|
|
249
|
-
},
|
|
250
|
-
}
|
|
251
|
-
})
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
export function extractImageAttachments(attachments: ReadonlyArray<ToolAttachment>): ImageAttachment[] {
|
|
255
|
-
return attachments.flatMap((attachment): ImageAttachment[] => {
|
|
256
|
-
const data = dataUrlImage(attachment)
|
|
257
|
-
return data ? [data] : []
|
|
258
|
-
})
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
export function shellOutputSnapshot(state: { readonly metadata?: unknown }) {
|
|
262
|
-
if (!state.metadata || typeof state.metadata !== "object") return undefined
|
|
263
|
-
return stringValue((state.metadata as Record<string, unknown>).output)
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
// For shell tools, surface the actual command as the title so it stays visible
|
|
267
|
-
// before output lands; non-shell tools keep their model-provided title.
|
|
268
|
-
function toolTitle(toolName: string, input: ToolInput, fallback: string | undefined) {
|
|
269
|
-
if (isShell(toolName)) return shellCommand(input) ?? stringValue(input.description) ?? fallback ?? toolName
|
|
270
|
-
return fallback || toolName
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
// Enrich shell rawInput with the resolved working directory so clients can show
|
|
274
|
-
// where the command runs, unless the model already specified one.
|
|
275
|
-
function rawInput(toolName: string, input: ToolInput, cwd?: string): ToolInput {
|
|
276
|
-
if (!isShell(toolName)) return input
|
|
277
|
-
if (input.cwd || input.workdir) return input
|
|
278
|
-
const workdir = shellWorkdir(input, cwd)
|
|
279
|
-
return workdir ? { ...input, cwd: workdir } : input
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
function shellWorkdir(input: ToolInput, cwd?: string) {
|
|
283
|
-
const explicit = stringValue(input.workdir) ?? stringValue(input.cwd)
|
|
284
|
-
return resolvePath(explicit, cwd) ?? cwd
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
function resolvePath(value: string | undefined, cwd?: string) {
|
|
288
|
-
if (!value) return undefined
|
|
289
|
-
if (isAbsolute(value)) return value
|
|
290
|
-
return resolve(cwd ?? process.cwd(), value)
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
function shellCommand(input: ToolInput) {
|
|
294
|
-
return stringValue(input.command) ?? stringValue(input.cmd)
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
function isShell(toolName: string) {
|
|
298
|
-
const tool = toolName.toLocaleLowerCase()
|
|
299
|
-
return tool === "bash" || tool === "shell"
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
export const mapToolKind = toToolKind
|
|
303
|
-
export const extractLocations = toLocations
|
|
304
|
-
export const buildCompletedToolContent = completedToolContent
|
|
305
|
-
export const buildCompletedRawOutput = completedToolRawOutput
|
|
306
|
-
export const extractShellOutputSnapshot = shellOutputSnapshot
|
|
307
|
-
export const buildPendingToolCall = pendingToolCall
|
|
308
|
-
export const buildRunningToolUpdate = runningToolUpdate
|
|
309
|
-
export const buildDuplicateRunningToolUpdate = duplicateRunningToolUpdate
|
|
310
|
-
export const buildCompletedToolUpdate = completedToolUpdate
|
|
311
|
-
export const buildErrorToolUpdate = errorToolUpdate
|
|
312
|
-
|
|
313
|
-
function locationFrom(...values: unknown[]): ToolCallLocation[] {
|
|
314
|
-
return Array.from(
|
|
315
|
-
new Set(
|
|
316
|
-
values.flatMap((value): string[] => {
|
|
317
|
-
if (Array.isArray(value)) {
|
|
318
|
-
return value.filter((item): item is string => typeof item === "string" && item.length > 0)
|
|
319
|
-
}
|
|
320
|
-
const path = stringValue(value)
|
|
321
|
-
return path ? [path] : []
|
|
322
|
-
}),
|
|
323
|
-
),
|
|
324
|
-
(path) => ({ path }),
|
|
325
|
-
)
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
function diffContent(input: ToolInput): ToolCallContent[] {
|
|
329
|
-
const oldText = stringValue(input.oldString)
|
|
330
|
-
const newText = stringValue(input.newString) ?? stringValue(input.content)
|
|
331
|
-
if (oldText === undefined || newText === undefined) return []
|
|
332
|
-
|
|
333
|
-
return [
|
|
334
|
-
{
|
|
335
|
-
type: "diff",
|
|
336
|
-
path: stringValue(input.filePath) ?? "",
|
|
337
|
-
oldText,
|
|
338
|
-
newText,
|
|
339
|
-
},
|
|
340
|
-
]
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
function readDisplayText(metadata: unknown) {
|
|
344
|
-
if (!metadata || typeof metadata !== "object") return undefined
|
|
345
|
-
const display = (metadata as Record<string, unknown>).display
|
|
346
|
-
if (!display || typeof display !== "object") return undefined
|
|
347
|
-
const info = display as Record<string, unknown>
|
|
348
|
-
if (info.type === "file") return stringValue(info.text)
|
|
349
|
-
if (info.type === "directory" && Array.isArray(info.entries)) {
|
|
350
|
-
return info.entries.filter((item): item is string => typeof item === "string").join("\n")
|
|
351
|
-
}
|
|
352
|
-
return undefined
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
function dataUrlImage(attachment: ToolAttachment) {
|
|
356
|
-
const match = stringValue(attachment.url)?.match(/^data:([^;,]+)(?:;[^,]*)*;base64,(.*)$/)
|
|
357
|
-
const mime = match?.[1] ?? stringValue(attachment.mime)
|
|
358
|
-
if (!mime?.startsWith("image/")) return undefined
|
|
359
|
-
|
|
360
|
-
const data = match?.[2]
|
|
361
|
-
if (data === undefined) return undefined
|
|
362
|
-
return { mimeType: mime, data }
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
function stringValue(value: unknown) {
|
|
366
|
-
return typeof value === "string" ? value : undefined
|
|
367
|
-
}
|