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/acp/usage.ts
DELETED
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
import type { AgentSideConnection, Usage } from "@agentclientprotocol/sdk"
|
|
2
|
-
import type { AssistantMessage as OnlyCodeAssistantMessage, Message } from "@opencode-ai/sdk/v2"
|
|
3
|
-
import { InstanceRef } from "@/effect/instance-ref"
|
|
4
|
-
import { InstanceStore } from "@/project/instance-store"
|
|
5
|
-
import { ProviderV2 } from "@opencode-ai/core/provider"
|
|
6
|
-
import { ModelV2 } from "@opencode-ai/core/model"
|
|
7
|
-
import { Provider } from "@/provider/provider"
|
|
8
|
-
import { Context, Effect, Layer, SynchronizedRef } from "effect"
|
|
9
|
-
|
|
10
|
-
export type AssistantTokenCost = Pick<OnlyCodeAssistantMessage, "cost" | "tokens">
|
|
11
|
-
|
|
12
|
-
export type AssistantMessage = AssistantTokenCost &
|
|
13
|
-
Pick<OnlyCodeAssistantMessage, "role"> &
|
|
14
|
-
Partial<Pick<OnlyCodeAssistantMessage, "providerID" | "modelID">>
|
|
15
|
-
|
|
16
|
-
export type SessionMessage = {
|
|
17
|
-
readonly info: { readonly role: Message["role"] } | AssistantMessage
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export type MessagesInput = {
|
|
21
|
-
readonly sessionID: string
|
|
22
|
-
readonly directory: string
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export type SDK = {
|
|
26
|
-
readonly session: {
|
|
27
|
-
readonly messages: (
|
|
28
|
-
parameters: { readonly sessionID: string; readonly directory: string },
|
|
29
|
-
options: { readonly throwOnError: true },
|
|
30
|
-
) => Promise<{ readonly data?: readonly SessionMessage[] | null }>
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export interface MessageLoaderInterface {
|
|
35
|
-
readonly messages: (input: MessagesInput) => Effect.Effect<readonly SessionMessage[], unknown>
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export interface ContextLimitLoaderInterface {
|
|
39
|
-
readonly providers: (directory: string) => Effect.Effect<Record<ProviderV2.ID, Provider.Info>, unknown>
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export type UsageConnection = Pick<AgentSideConnection, "sessionUpdate">
|
|
43
|
-
|
|
44
|
-
export interface Interface {
|
|
45
|
-
readonly buildUsage: (message: AssistantTokenCost) => Usage
|
|
46
|
-
readonly latestAssistantMessage: (messages: readonly SessionMessage[]) => AssistantMessage | undefined
|
|
47
|
-
readonly totalSessionCost: (messages: readonly SessionMessage[]) => number
|
|
48
|
-
readonly contextLimit: (input: {
|
|
49
|
-
readonly directory: string
|
|
50
|
-
readonly providerID: ProviderV2.ID
|
|
51
|
-
readonly modelID: ModelV2.ID
|
|
52
|
-
}) => Effect.Effect<number | undefined>
|
|
53
|
-
readonly sendUpdate: (input: {
|
|
54
|
-
readonly connection: UsageConnection
|
|
55
|
-
readonly sessionID: string
|
|
56
|
-
readonly directory: string
|
|
57
|
-
}) => Effect.Effect<void>
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export class MessageLoader extends Context.Service<MessageLoader, MessageLoaderInterface>()(
|
|
61
|
-
"@opencode/ACPUsageMessageLoader",
|
|
62
|
-
) {}
|
|
63
|
-
|
|
64
|
-
export class ContextLimitLoader extends Context.Service<ContextLimitLoader, ContextLimitLoaderInterface>()(
|
|
65
|
-
"@opencode/ACPUsageContextLimitLoader",
|
|
66
|
-
) {}
|
|
67
|
-
|
|
68
|
-
export class Service extends Context.Service<Service, Interface>()("@opencode/ACPUsage") {}
|
|
69
|
-
|
|
70
|
-
export function messageLoaderFromSDK(sdk: SDK): MessageLoaderInterface {
|
|
71
|
-
return MessageLoader.of({
|
|
72
|
-
messages: (input) =>
|
|
73
|
-
Effect.promise(() =>
|
|
74
|
-
sdk.session
|
|
75
|
-
.messages({ sessionID: input.sessionID, directory: input.directory }, { throwOnError: true })
|
|
76
|
-
.then((response) => response.data ?? []),
|
|
77
|
-
),
|
|
78
|
-
})
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export const messageLoaderLayer = (sdk: SDK) => Layer.succeed(MessageLoader, messageLoaderFromSDK(sdk))
|
|
82
|
-
|
|
83
|
-
export function buildUsage(message: AssistantTokenCost): Usage {
|
|
84
|
-
const cachedReadTokens = message.tokens.cache.read
|
|
85
|
-
const cachedWriteTokens = message.tokens.cache.write
|
|
86
|
-
const thoughtTokens = message.tokens.reasoning
|
|
87
|
-
|
|
88
|
-
return {
|
|
89
|
-
inputTokens: message.tokens.input,
|
|
90
|
-
outputTokens: message.tokens.output,
|
|
91
|
-
totalTokens: message.tokens.input + message.tokens.output + thoughtTokens + cachedReadTokens + cachedWriteTokens,
|
|
92
|
-
...(thoughtTokens > 0 ? { thoughtTokens } : {}),
|
|
93
|
-
...(cachedReadTokens > 0 ? { cachedReadTokens } : {}),
|
|
94
|
-
...(cachedWriteTokens > 0 ? { cachedWriteTokens } : {}),
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
export function latestAssistantMessage(messages: readonly SessionMessage[]): AssistantMessage | undefined {
|
|
99
|
-
return messages
|
|
100
|
-
.filter((message): message is { readonly info: AssistantMessage } => message.info.role === "assistant")
|
|
101
|
-
.at(-1)?.info
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export function totalSessionCost(messages: readonly SessionMessage[]): number {
|
|
105
|
-
return messages
|
|
106
|
-
.filter((message): message is { readonly info: AssistantMessage } => message.info.role === "assistant")
|
|
107
|
-
.reduce((sum, message) => sum + message.info.cost, 0)
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export function findContextLimit(
|
|
111
|
-
providers: Record<ProviderV2.ID, Provider.Info>,
|
|
112
|
-
providerID: ProviderV2.ID,
|
|
113
|
-
modelID: ModelV2.ID,
|
|
114
|
-
): number | undefined {
|
|
115
|
-
return providers[providerID]?.models[modelID]?.limit.context
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
export const contextLimitLoaderLayer = Layer.effect(
|
|
119
|
-
ContextLimitLoader,
|
|
120
|
-
Effect.gen(function* () {
|
|
121
|
-
const store = yield* InstanceStore.Service
|
|
122
|
-
const provider = yield* Provider.Service
|
|
123
|
-
|
|
124
|
-
return ContextLimitLoader.of({
|
|
125
|
-
providers: Effect.fn("ACPUsageContextLimitLoader.providers")(function* (directory) {
|
|
126
|
-
const ctx = yield* store.load({ directory })
|
|
127
|
-
return yield* Effect.gen(function* () {
|
|
128
|
-
return yield* provider.list()
|
|
129
|
-
}).pipe(Effect.provideService(InstanceRef, ctx))
|
|
130
|
-
}),
|
|
131
|
-
})
|
|
132
|
-
}),
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
export const layer = Layer.effect(
|
|
136
|
-
Service,
|
|
137
|
-
Effect.gen(function* () {
|
|
138
|
-
const messageLoader = yield* MessageLoader
|
|
139
|
-
const contextLimitLoader = yield* ContextLimitLoader
|
|
140
|
-
const limits = yield* SynchronizedRef.make(new Map<string, Effect.Effect<number | undefined>>())
|
|
141
|
-
|
|
142
|
-
const cachedLimit = Effect.fnUntraced(function* (input: {
|
|
143
|
-
readonly directory: string
|
|
144
|
-
readonly providerID: ProviderV2.ID
|
|
145
|
-
readonly modelID: ModelV2.ID
|
|
146
|
-
}) {
|
|
147
|
-
return yield* SynchronizedRef.modifyEffect(
|
|
148
|
-
limits,
|
|
149
|
-
Effect.fnUntraced(function* (items) {
|
|
150
|
-
const key = `${input.directory}\u0000${input.providerID}\u0000${input.modelID}`
|
|
151
|
-
const current = items.get(key)
|
|
152
|
-
if (current) return [current, items] as const
|
|
153
|
-
const next = yield* Effect.cached(
|
|
154
|
-
contextLimitLoader.providers(input.directory).pipe(
|
|
155
|
-
Effect.map((providers) => findContextLimit(providers, input.providerID, input.modelID)),
|
|
156
|
-
Effect.catch((error) =>
|
|
157
|
-
Effect.logError("failed to get providers for usage context limit", { error: error }).pipe(
|
|
158
|
-
Effect.as(undefined),
|
|
159
|
-
),
|
|
160
|
-
),
|
|
161
|
-
),
|
|
162
|
-
)
|
|
163
|
-
return [next, new Map(items).set(key, next)] as const
|
|
164
|
-
}),
|
|
165
|
-
)
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
const contextLimit = Effect.fn("ACPUsage.contextLimit")(function* (input: {
|
|
169
|
-
readonly directory: string
|
|
170
|
-
readonly providerID: ProviderV2.ID
|
|
171
|
-
readonly modelID: ModelV2.ID
|
|
172
|
-
}) {
|
|
173
|
-
return yield* yield* cachedLimit(input)
|
|
174
|
-
})
|
|
175
|
-
|
|
176
|
-
const sendUpdate = Effect.fn("ACPUsage.sendUpdate")(function* (input: {
|
|
177
|
-
readonly connection: UsageConnection
|
|
178
|
-
readonly sessionID: string
|
|
179
|
-
readonly directory: string
|
|
180
|
-
}) {
|
|
181
|
-
const messages = yield* messageLoader
|
|
182
|
-
.messages({ sessionID: input.sessionID, directory: input.directory })
|
|
183
|
-
.pipe(
|
|
184
|
-
Effect.catch((error) =>
|
|
185
|
-
Effect.logError("failed to fetch messages for usage update", { error: error }).pipe(Effect.as(undefined)),
|
|
186
|
-
),
|
|
187
|
-
)
|
|
188
|
-
if (!messages) return
|
|
189
|
-
|
|
190
|
-
const message = latestAssistantMessage(messages)
|
|
191
|
-
if (!message) return
|
|
192
|
-
if (!message.providerID || !message.modelID) return
|
|
193
|
-
|
|
194
|
-
const size = yield* contextLimit({
|
|
195
|
-
directory: input.directory,
|
|
196
|
-
providerID: ProviderV2.ID.make(message.providerID),
|
|
197
|
-
modelID: ModelV2.ID.make(message.modelID),
|
|
198
|
-
})
|
|
199
|
-
if (!size) return
|
|
200
|
-
|
|
201
|
-
yield* Effect.promise(() =>
|
|
202
|
-
input.connection
|
|
203
|
-
.sessionUpdate({
|
|
204
|
-
sessionId: input.sessionID,
|
|
205
|
-
update: {
|
|
206
|
-
sessionUpdate: "usage_update",
|
|
207
|
-
used: message.tokens.input + message.tokens.cache.read,
|
|
208
|
-
size,
|
|
209
|
-
cost: { amount: totalSessionCost(messages), currency: "USD" },
|
|
210
|
-
},
|
|
211
|
-
})
|
|
212
|
-
.catch(() => {}),
|
|
213
|
-
)
|
|
214
|
-
})
|
|
215
|
-
|
|
216
|
-
return Service.of({
|
|
217
|
-
buildUsage,
|
|
218
|
-
latestAssistantMessage,
|
|
219
|
-
totalSessionCost,
|
|
220
|
-
contextLimit,
|
|
221
|
-
sendUpdate,
|
|
222
|
-
})
|
|
223
|
-
}),
|
|
224
|
-
)
|
|
225
|
-
|
|
226
|
-
export const defaultLayer = layer.pipe(
|
|
227
|
-
Layer.provide(contextLimitLoaderLayer),
|
|
228
|
-
Layer.provide(Provider.defaultLayer),
|
|
229
|
-
Layer.provide(InstanceStore.defaultLayer),
|
|
230
|
-
)
|
|
231
|
-
|
|
232
|
-
export * as UsageService from "./usage"
|
package/src/agent/agent.ts
DELETED
|
@@ -1,459 +0,0 @@
|
|
|
1
|
-
import { LayerNode } from "@opencode-ai/core/effect/layer-node"
|
|
2
|
-
import { PermissionV1 } from "@opencode-ai/core/v1/permission"
|
|
3
|
-
import { Config } from "@/config/config"
|
|
4
|
-
import { serviceUse } from "@opencode-ai/core/effect/service-use"
|
|
5
|
-
import { Provider } from "@/provider/provider"
|
|
6
|
-
|
|
7
|
-
import { generateObject, streamObject, type ModelMessage } from "ai"
|
|
8
|
-
import { Truncate } from "@/tool/truncate"
|
|
9
|
-
import { Auth } from "../auth"
|
|
10
|
-
import { ProviderTransform } from "@/provider/transform"
|
|
11
|
-
|
|
12
|
-
import PROMPT_GENERATE from "./generate.txt"
|
|
13
|
-
import PROMPT_COMPACTION from "./prompt/compaction.txt"
|
|
14
|
-
import PROMPT_EXPLORE from "./prompt/explore.txt"
|
|
15
|
-
import PROMPT_SUMMARY from "./prompt/summary.txt"
|
|
16
|
-
import PROMPT_TITLE from "./prompt/title.txt"
|
|
17
|
-
import { Permission } from "@/permission"
|
|
18
|
-
import { mergeDeep, pipe, sortBy, values } from "remeda"
|
|
19
|
-
import { Global } from "@opencode-ai/core/global"
|
|
20
|
-
import path from "path"
|
|
21
|
-
import { Plugin } from "@/plugin"
|
|
22
|
-
import { Skill } from "../skill"
|
|
23
|
-
import { Effect, Context, Layer, Schema } from "effect"
|
|
24
|
-
import { InstanceState } from "@/effect/instance-state"
|
|
25
|
-
import * as Option from "effect/Option"
|
|
26
|
-
import * as OtelTracer from "@effect/opentelemetry/Tracer"
|
|
27
|
-
import { AbsolutePath, type DeepMutable } from "@opencode-ai/core/schema"
|
|
28
|
-
import { ProviderV2 } from "@opencode-ai/core/provider"
|
|
29
|
-
import { ModelV2 } from "@opencode-ai/core/model"
|
|
30
|
-
import { LocationServiceMap } from "@opencode-ai/core/location-layer"
|
|
31
|
-
import { PluginBoot } from "@opencode-ai/core/plugin/boot"
|
|
32
|
-
import { Reference } from "@opencode-ai/core/reference"
|
|
33
|
-
import { Location } from "@opencode-ai/core/location"
|
|
34
|
-
|
|
35
|
-
export const Info = Schema.Struct({
|
|
36
|
-
name: Schema.String,
|
|
37
|
-
description: Schema.optional(Schema.String),
|
|
38
|
-
mode: Schema.Literals(["subagent", "primary", "all"]),
|
|
39
|
-
native: Schema.optional(Schema.Boolean),
|
|
40
|
-
hidden: Schema.optional(Schema.Boolean),
|
|
41
|
-
topP: Schema.optional(Schema.Finite),
|
|
42
|
-
temperature: Schema.optional(Schema.Finite),
|
|
43
|
-
color: Schema.optional(Schema.String),
|
|
44
|
-
permission: PermissionV1.Ruleset,
|
|
45
|
-
model: Schema.optional(
|
|
46
|
-
Schema.Struct({
|
|
47
|
-
modelID: ModelV2.ID,
|
|
48
|
-
providerID: ProviderV2.ID,
|
|
49
|
-
}),
|
|
50
|
-
),
|
|
51
|
-
variant: Schema.optional(Schema.String),
|
|
52
|
-
prompt: Schema.optional(Schema.String),
|
|
53
|
-
options: Schema.Record(Schema.String, Schema.Unknown),
|
|
54
|
-
steps: Schema.optional(Schema.Finite),
|
|
55
|
-
}).annotate({ identifier: "Agent" })
|
|
56
|
-
export type Info = DeepMutable<Schema.Schema.Type<typeof Info>>
|
|
57
|
-
|
|
58
|
-
const GeneratedAgent = Schema.Struct({
|
|
59
|
-
identifier: Schema.String,
|
|
60
|
-
whenToUse: Schema.String,
|
|
61
|
-
systemPrompt: Schema.String,
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
export interface Interface {
|
|
65
|
-
readonly get: (agent: string) => Effect.Effect<Info>
|
|
66
|
-
readonly list: () => Effect.Effect<Info[]>
|
|
67
|
-
readonly defaultInfo: () => Effect.Effect<Info>
|
|
68
|
-
readonly defaultAgent: () => Effect.Effect<string>
|
|
69
|
-
readonly generate: (input: {
|
|
70
|
-
description: string
|
|
71
|
-
model?: { providerID: ProviderV2.ID; modelID: ModelV2.ID }
|
|
72
|
-
}) => Effect.Effect<
|
|
73
|
-
{
|
|
74
|
-
identifier: string
|
|
75
|
-
whenToUse: string
|
|
76
|
-
systemPrompt: string
|
|
77
|
-
},
|
|
78
|
-
Provider.DefaultModelError
|
|
79
|
-
>
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
type State = Omit<Interface, "generate">
|
|
83
|
-
|
|
84
|
-
export class Service extends Context.Service<Service, Interface>()("@opencode/Agent") {}
|
|
85
|
-
|
|
86
|
-
export const use = serviceUse(Service)
|
|
87
|
-
|
|
88
|
-
export const layer = Layer.effect(
|
|
89
|
-
Service,
|
|
90
|
-
Effect.gen(function* () {
|
|
91
|
-
const config = yield* Config.Service
|
|
92
|
-
const auth = yield* Auth.Service
|
|
93
|
-
const plugin = yield* Plugin.Service
|
|
94
|
-
const skill = yield* Skill.Service
|
|
95
|
-
const provider = yield* Provider.Service
|
|
96
|
-
const locations = yield* LocationServiceMap
|
|
97
|
-
|
|
98
|
-
const state = yield* InstanceState.make<State>(
|
|
99
|
-
Effect.fn("Agent.state")(function* (ctx) {
|
|
100
|
-
const cfg = yield* config.get()
|
|
101
|
-
const skillDirs = yield* skill.dirs()
|
|
102
|
-
const referenceDirs = yield* Effect.gen(function* () {
|
|
103
|
-
yield* (yield* PluginBoot.Service).wait()
|
|
104
|
-
return (yield* (yield* Reference.Service).list()).map((reference) => reference.path)
|
|
105
|
-
}).pipe(Effect.provide(locations.get(Location.Ref.make({ directory: AbsolutePath.make(ctx.directory) }))))
|
|
106
|
-
const whitelistedDirs = [
|
|
107
|
-
Truncate.GLOB,
|
|
108
|
-
path.join(Global.Path.tmp, "*"),
|
|
109
|
-
...skillDirs.map((dir) => path.join(dir, "*")),
|
|
110
|
-
...referenceDirs.map((dir) => path.join(dir, "*")),
|
|
111
|
-
]
|
|
112
|
-
const readonlyExternalDirectory = {
|
|
113
|
-
"*": "ask",
|
|
114
|
-
...Object.fromEntries(whitelistedDirs.map((dir) => [dir, "allow"])),
|
|
115
|
-
} satisfies Record<string, "allow" | "ask" | "deny">
|
|
116
|
-
|
|
117
|
-
const defaults = Permission.fromConfig({
|
|
118
|
-
"*": "allow",
|
|
119
|
-
doom_loop: "ask",
|
|
120
|
-
external_directory: {
|
|
121
|
-
"*": "ask",
|
|
122
|
-
...Object.fromEntries(whitelistedDirs.map((dir) => [dir, "allow"])),
|
|
123
|
-
},
|
|
124
|
-
question: "deny",
|
|
125
|
-
plan_enter: "deny",
|
|
126
|
-
plan_exit: "deny",
|
|
127
|
-
// mirrors github.com/github/gitignore Node.gitignore pattern for .env files
|
|
128
|
-
read: {
|
|
129
|
-
"*": "allow",
|
|
130
|
-
"*.env": "ask",
|
|
131
|
-
"*.env.*": "ask",
|
|
132
|
-
"*.env.example": "allow",
|
|
133
|
-
},
|
|
134
|
-
})
|
|
135
|
-
|
|
136
|
-
const user = Permission.fromConfig(cfg.permission ?? {})
|
|
137
|
-
|
|
138
|
-
const agents: Record<string, Info> = {
|
|
139
|
-
build: {
|
|
140
|
-
name: "build",
|
|
141
|
-
description: "The default agent. Executes tools based on configured permissions.",
|
|
142
|
-
options: {},
|
|
143
|
-
permission: Permission.merge(
|
|
144
|
-
defaults,
|
|
145
|
-
Permission.fromConfig({
|
|
146
|
-
question: "allow",
|
|
147
|
-
plan_enter: "allow",
|
|
148
|
-
}),
|
|
149
|
-
user,
|
|
150
|
-
),
|
|
151
|
-
mode: "primary",
|
|
152
|
-
native: true,
|
|
153
|
-
},
|
|
154
|
-
plan: {
|
|
155
|
-
name: "plan",
|
|
156
|
-
description: "Plan mode. Disallows all edit tools.",
|
|
157
|
-
options: {},
|
|
158
|
-
permission: Permission.merge(
|
|
159
|
-
defaults,
|
|
160
|
-
Permission.fromConfig({
|
|
161
|
-
question: "allow",
|
|
162
|
-
plan_exit: "allow",
|
|
163
|
-
task: {
|
|
164
|
-
general: "deny",
|
|
165
|
-
},
|
|
166
|
-
external_directory: {
|
|
167
|
-
[path.join(Global.Path.data, "plans", "*")]: "allow",
|
|
168
|
-
},
|
|
169
|
-
edit: {
|
|
170
|
-
"*": "deny",
|
|
171
|
-
[path.join(".opencode", "plans", "*.md")]: "allow",
|
|
172
|
-
[path.relative(ctx.worktree, path.join(Global.Path.data, path.join("plans", "*.md")))]: "allow",
|
|
173
|
-
},
|
|
174
|
-
}),
|
|
175
|
-
user,
|
|
176
|
-
),
|
|
177
|
-
mode: "primary",
|
|
178
|
-
native: true,
|
|
179
|
-
},
|
|
180
|
-
general: {
|
|
181
|
-
name: "general",
|
|
182
|
-
description: `General-purpose agent for researching complex questions and executing multi-step tasks. Use this agent to execute multiple units of work in parallel.`,
|
|
183
|
-
permission: Permission.merge(
|
|
184
|
-
defaults,
|
|
185
|
-
Permission.fromConfig({
|
|
186
|
-
todowrite: "deny",
|
|
187
|
-
}),
|
|
188
|
-
user,
|
|
189
|
-
),
|
|
190
|
-
options: {},
|
|
191
|
-
mode: "subagent",
|
|
192
|
-
native: true,
|
|
193
|
-
},
|
|
194
|
-
explore: {
|
|
195
|
-
name: "explore",
|
|
196
|
-
permission: Permission.merge(
|
|
197
|
-
defaults,
|
|
198
|
-
Permission.fromConfig({
|
|
199
|
-
"*": "deny",
|
|
200
|
-
grep: "allow",
|
|
201
|
-
glob: "allow",
|
|
202
|
-
list: "allow",
|
|
203
|
-
bash: "allow",
|
|
204
|
-
webfetch: "allow",
|
|
205
|
-
websearch: "allow",
|
|
206
|
-
read: "allow",
|
|
207
|
-
external_directory: readonlyExternalDirectory,
|
|
208
|
-
}),
|
|
209
|
-
user,
|
|
210
|
-
),
|
|
211
|
-
description: `Fast agent specialized for exploring codebases. Use this when you need to quickly find files by patterns (eg. "src/components/**/*.tsx"), search code for keywords (eg. "API endpoints"), or answer questions about the codebase (eg. "how do API endpoints work?"). When calling this agent, specify the desired thoroughness level: "quick" for basic searches, "medium" for moderate exploration, or "very thorough" for comprehensive analysis across multiple locations and naming conventions.`,
|
|
212
|
-
prompt: PROMPT_EXPLORE,
|
|
213
|
-
options: {},
|
|
214
|
-
mode: "subagent",
|
|
215
|
-
native: true,
|
|
216
|
-
},
|
|
217
|
-
compaction: {
|
|
218
|
-
name: "compaction",
|
|
219
|
-
mode: "primary",
|
|
220
|
-
native: true,
|
|
221
|
-
hidden: true,
|
|
222
|
-
prompt: PROMPT_COMPACTION,
|
|
223
|
-
permission: Permission.merge(
|
|
224
|
-
defaults,
|
|
225
|
-
Permission.fromConfig({
|
|
226
|
-
"*": "deny",
|
|
227
|
-
}),
|
|
228
|
-
user,
|
|
229
|
-
),
|
|
230
|
-
options: {},
|
|
231
|
-
},
|
|
232
|
-
title: {
|
|
233
|
-
name: "title",
|
|
234
|
-
mode: "primary",
|
|
235
|
-
options: {},
|
|
236
|
-
native: true,
|
|
237
|
-
hidden: true,
|
|
238
|
-
temperature: 0.5,
|
|
239
|
-
permission: Permission.merge(
|
|
240
|
-
defaults,
|
|
241
|
-
Permission.fromConfig({
|
|
242
|
-
"*": "deny",
|
|
243
|
-
}),
|
|
244
|
-
user,
|
|
245
|
-
),
|
|
246
|
-
prompt: PROMPT_TITLE,
|
|
247
|
-
},
|
|
248
|
-
summary: {
|
|
249
|
-
name: "summary",
|
|
250
|
-
mode: "primary",
|
|
251
|
-
options: {},
|
|
252
|
-
native: true,
|
|
253
|
-
hidden: true,
|
|
254
|
-
permission: Permission.merge(
|
|
255
|
-
defaults,
|
|
256
|
-
Permission.fromConfig({
|
|
257
|
-
"*": "deny",
|
|
258
|
-
}),
|
|
259
|
-
user,
|
|
260
|
-
),
|
|
261
|
-
prompt: PROMPT_SUMMARY,
|
|
262
|
-
},
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
for (const [key, value] of Object.entries(cfg.agent ?? {})) {
|
|
266
|
-
if (value.disable) {
|
|
267
|
-
delete agents[key]
|
|
268
|
-
continue
|
|
269
|
-
}
|
|
270
|
-
let item = agents[key]
|
|
271
|
-
if (!item)
|
|
272
|
-
item = agents[key] = {
|
|
273
|
-
name: key,
|
|
274
|
-
mode: "all",
|
|
275
|
-
permission: Permission.merge(defaults, user),
|
|
276
|
-
options: {},
|
|
277
|
-
native: false,
|
|
278
|
-
}
|
|
279
|
-
if (value.model) item.model = Provider.parseModel(value.model)
|
|
280
|
-
item.variant = value.variant ?? item.variant
|
|
281
|
-
item.prompt = value.prompt ?? item.prompt
|
|
282
|
-
item.description = value.description ?? item.description
|
|
283
|
-
item.temperature = value.temperature ?? item.temperature
|
|
284
|
-
item.topP = value.top_p ?? item.topP
|
|
285
|
-
item.mode = value.mode ?? item.mode
|
|
286
|
-
item.color = value.color ?? item.color
|
|
287
|
-
item.hidden = value.hidden ?? item.hidden
|
|
288
|
-
item.name = value.name ?? item.name
|
|
289
|
-
item.steps = value.steps ?? item.steps
|
|
290
|
-
item.options = mergeDeep(item.options, value.options ?? {})
|
|
291
|
-
item.permission = Permission.merge(item.permission, Permission.fromConfig(value.permission ?? {}))
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
// Ensure Truncate.GLOB is allowed unless explicitly configured
|
|
295
|
-
for (const name in agents) {
|
|
296
|
-
const agent = agents[name]
|
|
297
|
-
const explicit = agent.permission.some((r) => {
|
|
298
|
-
if (r.permission !== "external_directory") return false
|
|
299
|
-
if (r.action !== "deny") return false
|
|
300
|
-
return r.pattern === Truncate.GLOB
|
|
301
|
-
})
|
|
302
|
-
if (explicit) continue
|
|
303
|
-
|
|
304
|
-
agents[name].permission = Permission.merge(
|
|
305
|
-
agents[name].permission,
|
|
306
|
-
Permission.fromConfig({ external_directory: { [Truncate.GLOB]: "allow" } }),
|
|
307
|
-
)
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
const get = Effect.fnUntraced(function* (agent: string) {
|
|
311
|
-
return agents[agent]
|
|
312
|
-
})
|
|
313
|
-
|
|
314
|
-
const list = Effect.fnUntraced(function* () {
|
|
315
|
-
const cfg = yield* config.get()
|
|
316
|
-
return pipe(
|
|
317
|
-
agents,
|
|
318
|
-
values(),
|
|
319
|
-
sortBy(
|
|
320
|
-
[(x) => (cfg.default_agent ? x.name === cfg.default_agent : x.name === "build"), "desc"],
|
|
321
|
-
[(x) => x.name, "asc"],
|
|
322
|
-
),
|
|
323
|
-
)
|
|
324
|
-
})
|
|
325
|
-
|
|
326
|
-
const defaultInfo = Effect.fnUntraced(function* () {
|
|
327
|
-
const c = yield* config.get()
|
|
328
|
-
if (c.default_agent) {
|
|
329
|
-
const agent = agents[c.default_agent]
|
|
330
|
-
if (!agent) throw new Error(`default agent "${c.default_agent}" not found`)
|
|
331
|
-
if (agent.mode === "subagent") throw new Error(`default agent "${c.default_agent}" is a subagent`)
|
|
332
|
-
if (agent.hidden === true) throw new Error(`default agent "${c.default_agent}" is hidden`)
|
|
333
|
-
return agent
|
|
334
|
-
}
|
|
335
|
-
const visible = Object.values(agents).find((a) => a.mode !== "subagent" && a.hidden !== true)
|
|
336
|
-
if (!visible) throw new Error("no primary visible agent found")
|
|
337
|
-
return visible
|
|
338
|
-
})
|
|
339
|
-
|
|
340
|
-
const defaultAgent = Effect.fnUntraced(function* () {
|
|
341
|
-
return (yield* defaultInfo()).name
|
|
342
|
-
})
|
|
343
|
-
|
|
344
|
-
return {
|
|
345
|
-
get,
|
|
346
|
-
list,
|
|
347
|
-
defaultInfo,
|
|
348
|
-
defaultAgent,
|
|
349
|
-
} satisfies State
|
|
350
|
-
}),
|
|
351
|
-
)
|
|
352
|
-
|
|
353
|
-
return Service.of({
|
|
354
|
-
get: Effect.fn("Agent.get")(function* (agent: string) {
|
|
355
|
-
return yield* InstanceState.useEffect(state, (s) => s.get(agent))
|
|
356
|
-
}),
|
|
357
|
-
list: Effect.fn("Agent.list")(function* () {
|
|
358
|
-
return yield* InstanceState.useEffect(state, (s) => s.list())
|
|
359
|
-
}),
|
|
360
|
-
defaultInfo: Effect.fn("Agent.defaultInfo")(function* () {
|
|
361
|
-
return yield* InstanceState.useEffect(state, (s) => s.defaultInfo())
|
|
362
|
-
}),
|
|
363
|
-
defaultAgent: Effect.fn("Agent.defaultAgent")(function* () {
|
|
364
|
-
return yield* InstanceState.useEffect(state, (s) => s.defaultAgent())
|
|
365
|
-
}),
|
|
366
|
-
generate: Effect.fn("Agent.generate")(function* (input: {
|
|
367
|
-
description: string
|
|
368
|
-
model?: { providerID: ProviderV2.ID; modelID: ModelV2.ID }
|
|
369
|
-
}) {
|
|
370
|
-
const cfg = yield* config.get()
|
|
371
|
-
const model = input.model ?? (yield* provider.defaultModel())
|
|
372
|
-
const resolved = yield* provider.getModel(model.providerID, model.modelID)
|
|
373
|
-
const language = yield* provider.getLanguage(resolved)
|
|
374
|
-
const tracer = cfg.experimental?.openTelemetry
|
|
375
|
-
? Option.getOrUndefined(yield* Effect.serviceOption(OtelTracer.OtelTracer))
|
|
376
|
-
: undefined
|
|
377
|
-
|
|
378
|
-
const system = [PROMPT_GENERATE]
|
|
379
|
-
yield* plugin.trigger("experimental.chat.system.transform", { model: resolved }, { system })
|
|
380
|
-
const existing = yield* InstanceState.useEffect(state, (s) => s.list())
|
|
381
|
-
|
|
382
|
-
// TODO: clean this up so provider specific logic doesnt bleed over
|
|
383
|
-
const authInfo = yield* auth.get(model.providerID).pipe(Effect.orDie)
|
|
384
|
-
const isOpenaiOauth = model.providerID === "openai" && authInfo?.type === "oauth"
|
|
385
|
-
|
|
386
|
-
const params = {
|
|
387
|
-
experimental_telemetry: {
|
|
388
|
-
isEnabled: cfg.experimental?.openTelemetry,
|
|
389
|
-
tracer,
|
|
390
|
-
metadata: {
|
|
391
|
-
userId: cfg.username ?? "unknown",
|
|
392
|
-
},
|
|
393
|
-
},
|
|
394
|
-
temperature: 0.3,
|
|
395
|
-
messages: [
|
|
396
|
-
...(isOpenaiOauth
|
|
397
|
-
? []
|
|
398
|
-
: system.map(
|
|
399
|
-
(item): ModelMessage => ({
|
|
400
|
-
role: "system",
|
|
401
|
-
content: item,
|
|
402
|
-
}),
|
|
403
|
-
)),
|
|
404
|
-
{
|
|
405
|
-
role: "user",
|
|
406
|
-
content: `Create an agent configuration based on this request: "${input.description}".\n\nIMPORTANT: The following identifiers already exist and must NOT be used: ${existing.map((i) => i.name).join(", ")}\n Return ONLY the JSON object, no other text, do not wrap in backticks`,
|
|
407
|
-
},
|
|
408
|
-
],
|
|
409
|
-
model: language,
|
|
410
|
-
schema: Object.assign(
|
|
411
|
-
Schema.toStandardSchemaV1(GeneratedAgent),
|
|
412
|
-
Schema.toStandardJSONSchemaV1(GeneratedAgent),
|
|
413
|
-
),
|
|
414
|
-
} satisfies Parameters<typeof generateObject>[0]
|
|
415
|
-
|
|
416
|
-
if (isOpenaiOauth) {
|
|
417
|
-
return yield* Effect.promise(async () => {
|
|
418
|
-
const result = streamObject({
|
|
419
|
-
...params,
|
|
420
|
-
providerOptions: ProviderTransform.providerOptions(resolved, {
|
|
421
|
-
instructions: system.join("\n"),
|
|
422
|
-
store: false,
|
|
423
|
-
}),
|
|
424
|
-
onError: () => {},
|
|
425
|
-
})
|
|
426
|
-
for await (const part of result.fullStream) {
|
|
427
|
-
if (part.type === "error") throw part.error
|
|
428
|
-
}
|
|
429
|
-
return result.object
|
|
430
|
-
})
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
return yield* Effect.promise(() => generateObject(params).then((r) => r.object))
|
|
434
|
-
}),
|
|
435
|
-
})
|
|
436
|
-
}),
|
|
437
|
-
)
|
|
438
|
-
|
|
439
|
-
export const defaultLayer = layer.pipe(
|
|
440
|
-
Layer.provide(Plugin.defaultLayer),
|
|
441
|
-
Layer.provide(Provider.defaultLayer),
|
|
442
|
-
Layer.provide(Auth.defaultLayer),
|
|
443
|
-
Layer.provide(Config.defaultLayer),
|
|
444
|
-
Layer.provide(Skill.defaultLayer),
|
|
445
|
-
Layer.provide(LocationServiceMap.layer),
|
|
446
|
-
)
|
|
447
|
-
|
|
448
|
-
const locationServiceMapNode = LayerNode.make(LocationServiceMap.layer, [])
|
|
449
|
-
|
|
450
|
-
export const node = LayerNode.make(layer, [
|
|
451
|
-
Config.node,
|
|
452
|
-
Auth.node,
|
|
453
|
-
Plugin.node,
|
|
454
|
-
Skill.node,
|
|
455
|
-
Provider.node,
|
|
456
|
-
locationServiceMapNode,
|
|
457
|
-
])
|
|
458
|
-
|
|
459
|
-
export * as Agent from "./agent"
|