onlycode 1.18.0 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/{opencode.cjs → onlycode.cjs} +8 -42
- package/package.json +12 -147
- package/src/account/account.ts +0 -463
- package/src/account/repo.ts +0 -173
- package/src/account/schema.ts +0 -99
- package/src/account/url.ts +0 -8
- package/src/acp/agent.ts +0 -95
- package/src/acp/config-option.ts +0 -203
- package/src/acp/content.ts +0 -250
- package/src/acp/directory.ts +0 -210
- package/src/acp/error.ts +0 -90
- package/src/acp/event.ts +0 -342
- package/src/acp/permission.ts +0 -124
- package/src/acp/profile.ts +0 -42
- package/src/acp/service.ts +0 -1048
- package/src/acp/session.ts +0 -231
- package/src/acp/tool.ts +0 -367
- package/src/acp/usage.ts +0 -232
- package/src/agent/agent.ts +0 -459
- package/src/agent/generate.txt +0 -75
- package/src/agent/prompt/compaction.txt +0 -9
- package/src/agent/prompt/explore.txt +0 -18
- package/src/agent/prompt/summary.txt +0 -11
- package/src/agent/prompt/title.txt +0 -44
- package/src/agent/subagent-permissions.ts +0 -27
- package/src/audio.d.ts +0 -14
- package/src/auth/index.ts +0 -99
- package/src/background/job.ts +0 -39
- package/src/bus/global.ts +0 -22
- package/src/cli/bootstrap.ts +0 -11
- package/src/cli/cmd/account.ts +0 -264
- package/src/cli/cmd/acp.ts +0 -73
- package/src/cli/cmd/agent.ts +0 -259
- package/src/cli/cmd/attach.ts +0 -97
- package/src/cli/cmd/cmd.ts +0 -7
- package/src/cli/cmd/db.ts +0 -62
- package/src/cli/cmd/debug/agent.handler.ts +0 -193
- package/src/cli/cmd/debug/agent.ts +0 -27
- package/src/cli/cmd/debug/config.ts +0 -14
- package/src/cli/cmd/debug/file.ts +0 -73
- package/src/cli/cmd/debug/index.ts +0 -87
- package/src/cli/cmd/debug/lsp.ts +0 -50
- package/src/cli/cmd/debug/ripgrep.ts +0 -79
- package/src/cli/cmd/debug/scrap.ts +0 -15
- package/src/cli/cmd/debug/skill.ts +0 -15
- package/src/cli/cmd/debug/snapshot.ts +0 -50
- package/src/cli/cmd/debug/startup.ts +0 -11
- package/src/cli/cmd/debug/v2.ts +0 -44
- package/src/cli/cmd/export.ts +0 -292
- package/src/cli/cmd/generate.ts +0 -54
- package/src/cli/cmd/github.handler.ts +0 -1593
- package/src/cli/cmd/github.shared.ts +0 -30
- package/src/cli/cmd/github.ts +0 -42
- package/src/cli/cmd/import.ts +0 -224
- package/src/cli/cmd/mcp.ts +0 -849
- package/src/cli/cmd/models.ts +0 -66
- package/src/cli/cmd/plug.ts +0 -230
- package/src/cli/cmd/pr.ts +0 -115
- package/src/cli/cmd/prompt-display.ts +0 -1
- package/src/cli/cmd/providers.ts +0 -534
- package/src/cli/cmd/run/demo.ts +0 -1274
- package/src/cli/cmd/run/entry.body.ts +0 -205
- package/src/cli/cmd/run/footer.command.tsx +0 -1064
- package/src/cli/cmd/run/footer.menu.tsx +0 -351
- package/src/cli/cmd/run/footer.permission.tsx +0 -472
- package/src/cli/cmd/run/footer.prompt.tsx +0 -1306
- package/src/cli/cmd/run/footer.question.tsx +0 -573
- package/src/cli/cmd/run/footer.subagent.tsx +0 -173
- package/src/cli/cmd/run/footer.ts +0 -1129
- package/src/cli/cmd/run/footer.view.tsx +0 -943
- package/src/cli/cmd/run/footer.width.ts +0 -27
- package/src/cli/cmd/run/permission.shared.ts +0 -256
- package/src/cli/cmd/run/prompt.editor.ts +0 -157
- package/src/cli/cmd/run/prompt.shared.ts +0 -153
- package/src/cli/cmd/run/question.shared.ts +0 -340
- package/src/cli/cmd/run/runtime.boot.ts +0 -202
- package/src/cli/cmd/run/runtime.lifecycle.ts +0 -406
- package/src/cli/cmd/run/runtime.queue.ts +0 -349
- package/src/cli/cmd/run/runtime.shared.ts +0 -17
- package/src/cli/cmd/run/runtime.stdin.ts +0 -37
- package/src/cli/cmd/run/runtime.ts +0 -814
- package/src/cli/cmd/run/scrollback.shared.ts +0 -92
- package/src/cli/cmd/run/scrollback.surface.ts +0 -431
- package/src/cli/cmd/run/scrollback.writer.tsx +0 -352
- package/src/cli/cmd/run/session-data.ts +0 -1113
- package/src/cli/cmd/run/session-replay.ts +0 -374
- package/src/cli/cmd/run/session.shared.ts +0 -196
- package/src/cli/cmd/run/splash.ts +0 -275
- package/src/cli/cmd/run/stream.transport.ts +0 -1462
- package/src/cli/cmd/run/stream.ts +0 -175
- package/src/cli/cmd/run/subagent-data.ts +0 -876
- package/src/cli/cmd/run/theme.ts +0 -690
- package/src/cli/cmd/run/tool.ts +0 -1489
- package/src/cli/cmd/run/trace.ts +0 -94
- package/src/cli/cmd/run/turn-summary.ts +0 -47
- package/src/cli/cmd/run/types.ts +0 -350
- package/src/cli/cmd/run/variant.shared.ts +0 -215
- package/src/cli/cmd/run.ts +0 -894
- package/src/cli/cmd/serve.ts +0 -24
- package/src/cli/cmd/session.ts +0 -147
- package/src/cli/cmd/stats.ts +0 -393
- package/src/cli/cmd/tui.ts +0 -224
- package/src/cli/cmd/uninstall.ts +0 -353
- package/src/cli/cmd/upgrade.ts +0 -74
- package/src/cli/cmd/web.ts +0 -84
- package/src/cli/effect/prompt.ts +0 -37
- package/src/cli/effect-cmd.ts +0 -96
- package/src/cli/error.ts +0 -130
- package/src/cli/heap.ts +0 -45
- package/src/cli/logo-pixel.ts +0 -35
- package/src/cli/logo.ts +0 -1
- package/src/cli/network.ts +0 -64
- package/src/cli/tui/layer.ts +0 -7
- package/src/cli/tui/validate-session.ts +0 -29
- package/src/cli/tui/worker.ts +0 -71
- package/src/cli/ui.ts +0 -148
- package/src/cli/upgrade.ts +0 -53
- package/src/command/index.ts +0 -184
- package/src/command/template/initialize.txt +0 -66
- package/src/command/template/review.txt +0 -101
- package/src/config/agent.ts +0 -59
- package/src/config/command.ts +0 -39
- package/src/config/config.ts +0 -686
- package/src/config/entry-name.ts +0 -19
- package/src/config/managed.ts +0 -69
- package/src/config/markdown.ts +0 -36
- package/src/config/parse.ts +0 -79
- package/src/config/paths.ts +0 -45
- package/src/config/plugin.ts +0 -79
- package/src/config/tui-cwd.ts +0 -5
- package/src/config/tui-host-attention.ts +0 -21
- package/src/config/tui-migrate.ts +0 -132
- package/src/config/tui.ts +0 -274
- package/src/config/variable.ts +0 -91
- package/src/control-plane/adapters/index.ts +0 -41
- package/src/control-plane/adapters/worktree.ts +0 -96
- package/src/control-plane/dev/README.md +0 -19
- package/src/control-plane/dev/debug-workspace-plugin.ts +0 -73
- package/src/control-plane/types.ts +0 -59
- package/src/control-plane/util.ts +0 -39
- package/src/control-plane/workspace-adapter-runtime.ts +0 -51
- package/src/control-plane/workspace-context.ts +0 -26
- package/src/control-plane/workspace.ts +0 -989
- package/src/effect/app-runtime.ts +0 -132
- package/src/effect/bootstrap-runtime.ts +0 -23
- package/src/effect/bridge.ts +0 -84
- package/src/effect/config-service.ts +0 -67
- package/src/effect/instance-ref.ts +0 -11
- package/src/effect/instance-registry.ts +0 -12
- package/src/effect/instance-state.ts +0 -69
- package/src/effect/promise.ts +0 -17
- package/src/effect/run-service.ts +0 -47
- package/src/effect/runner.ts +0 -217
- package/src/effect/runtime-flags.ts +0 -79
- package/src/env/index.ts +0 -43
- package/src/event-v2-bridge.ts +0 -79
- package/src/format/formatter.ts +0 -404
- package/src/format/index.ts +0 -205
- package/src/git/index.ts +0 -350
- package/src/id/id.ts +0 -80
- package/src/ide/index.ts +0 -61
- package/src/image/image.ts +0 -174
- package/src/index.ts +0 -142
- package/src/installation/index.ts +0 -350
- package/src/lsp/client.ts +0 -650
- package/src/lsp/diagnostic.ts +0 -29
- package/src/lsp/language.ts +0 -121
- package/src/lsp/launch.ts +0 -21
- package/src/lsp/lsp.ts +0 -511
- package/src/lsp/server.ts +0 -1983
- package/src/markdown.d.ts +0 -4
- package/src/mcp/auth.ts +0 -174
- package/src/mcp/catalog.ts +0 -153
- package/src/mcp/index.ts +0 -953
- package/src/mcp/oauth-callback.ts +0 -233
- package/src/mcp/oauth-provider.ts +0 -206
- package/src/node.ts +0 -4
- package/src/patch/index.ts +0 -686
- package/src/permission/arity.ts +0 -163
- package/src/permission/evaluate.ts +0 -1
- package/src/permission/index.ts +0 -230
- package/src/plugin/azure.ts +0 -26
- package/src/plugin/cloudflare.ts +0 -76
- package/src/plugin/digitalocean.ts +0 -383
- package/src/plugin/github-copilot/copilot.ts +0 -414
- package/src/plugin/github-copilot/models.ts +0 -246
- package/src/plugin/index.ts +0 -316
- package/src/plugin/install.ts +0 -439
- package/src/plugin/loader.ts +0 -237
- package/src/plugin/meta.ts +0 -188
- package/src/plugin/openai/README.md +0 -31
- package/src/plugin/openai/codex.ts +0 -641
- package/src/plugin/openai/ws-pool.ts +0 -270
- package/src/plugin/openai/ws.ts +0 -381
- package/src/plugin/pty-environment.ts +0 -24
- package/src/plugin/shared.ts +0 -323
- package/src/plugin/snowflake-cortex.ts +0 -529
- package/src/plugin/tui/internal.ts +0 -10
- package/src/plugin/tui/runtime.ts +0 -1130
- package/src/plugin/xai.ts +0 -716
- package/src/project/bootstrap-service.ts +0 -9
- package/src/project/bootstrap.ts +0 -76
- package/src/project/instance-context.ts +0 -24
- package/src/project/instance-layer.ts +0 -11
- package/src/project/instance-runtime.ts +0 -16
- package/src/project/instance-store.ts +0 -209
- package/src/project/project.ts +0 -519
- package/src/project/vcs.ts +0 -431
- package/src/provider/auth.ts +0 -233
- package/src/provider/error.ts +0 -188
- package/src/provider/model-status.ts +0 -8
- package/src/provider/provider.ts +0 -1975
- package/src/provider/transform.ts +0 -1543
- package/src/question/index.ts +0 -229
- package/src/question/schema.ts +0 -10
- package/src/server/auth.ts +0 -48
- package/src/server/event.ts +0 -13
- package/src/server/global-lifecycle.ts +0 -28
- package/src/server/init-projectors.ts +0 -3
- package/src/server/mdns.ts +0 -47
- package/src/server/projectors.ts +0 -1
- package/src/server/proxy-util.ts +0 -48
- package/src/server/routes/instance/httpapi/AGENTS.md +0 -39
- package/src/server/routes/instance/httpapi/api.ts +0 -78
- package/src/server/routes/instance/httpapi/errors.ts +0 -193
- package/src/server/routes/instance/httpapi/groups/config.ts +0 -65
- package/src/server/routes/instance/httpapi/groups/control-plane.ts +0 -35
- package/src/server/routes/instance/httpapi/groups/control.ts +0 -76
- package/src/server/routes/instance/httpapi/groups/event.ts +0 -29
- package/src/server/routes/instance/httpapi/groups/experimental.ts +0 -275
- package/src/server/routes/instance/httpapi/groups/file.ts +0 -185
- package/src/server/routes/instance/httpapi/groups/global.ts +0 -138
- package/src/server/routes/instance/httpapi/groups/instance.ts +0 -206
- package/src/server/routes/instance/httpapi/groups/mcp.ts +0 -156
- package/src/server/routes/instance/httpapi/groups/metadata.ts +0 -18
- package/src/server/routes/instance/httpapi/groups/permission.ts +0 -61
- package/src/server/routes/instance/httpapi/groups/project-copy.ts +0 -32
- package/src/server/routes/instance/httpapi/groups/project.ts +0 -93
- package/src/server/routes/instance/httpapi/groups/provider.ts +0 -101
- package/src/server/routes/instance/httpapi/groups/pty.ts +0 -172
- package/src/server/routes/instance/httpapi/groups/query.ts +0 -12
- package/src/server/routes/instance/httpapi/groups/question.ts +0 -74
- package/src/server/routes/instance/httpapi/groups/session.ts +0 -462
- package/src/server/routes/instance/httpapi/groups/sync.ts +0 -113
- package/src/server/routes/instance/httpapi/groups/tui.ts +0 -208
- package/src/server/routes/instance/httpapi/groups/workspace.ts +0 -141
- package/src/server/routes/instance/httpapi/handlers/config.ts +0 -34
- package/src/server/routes/instance/httpapi/handlers/control-plane.ts +0 -37
- package/src/server/routes/instance/httpapi/handlers/control.ts +0 -43
- package/src/server/routes/instance/httpapi/handlers/event.ts +0 -99
- package/src/server/routes/instance/httpapi/handlers/experimental.ts +0 -192
- package/src/server/routes/instance/httpapi/handlers/file.ts +0 -139
- package/src/server/routes/instance/httpapi/handlers/global.ts +0 -156
- package/src/server/routes/instance/httpapi/handlers/instance.ts +0 -110
- package/src/server/routes/instance/httpapi/handlers/mcp.ts +0 -111
- package/src/server/routes/instance/httpapi/handlers/permission.ts +0 -41
- package/src/server/routes/instance/httpapi/handlers/project-copy.ts +0 -83
- package/src/server/routes/instance/httpapi/handlers/project.ts +0 -63
- package/src/server/routes/instance/httpapi/handlers/provider.ts +0 -113
- package/src/server/routes/instance/httpapi/handlers/pty.ts +0 -273
- package/src/server/routes/instance/httpapi/handlers/question.ts +0 -54
- package/src/server/routes/instance/httpapi/handlers/session-errors.ts +0 -21
- package/src/server/routes/instance/httpapi/handlers/session.ts +0 -440
- package/src/server/routes/instance/httpapi/handlers/sync.ts +0 -89
- package/src/server/routes/instance/httpapi/handlers/tui.ts +0 -131
- package/src/server/routes/instance/httpapi/handlers/workspace.ts +0 -102
- package/src/server/routes/instance/httpapi/lifecycle.ts +0 -54
- package/src/server/routes/instance/httpapi/middleware/authorization.ts +0 -150
- package/src/server/routes/instance/httpapi/middleware/compression.ts +0 -64
- package/src/server/routes/instance/httpapi/middleware/cors-vary.ts +0 -29
- package/src/server/routes/instance/httpapi/middleware/error.ts +0 -43
- package/src/server/routes/instance/httpapi/middleware/fence.ts +0 -25
- package/src/server/routes/instance/httpapi/middleware/instance-context.ts +0 -43
- package/src/server/routes/instance/httpapi/middleware/proxy.ts +0 -108
- package/src/server/routes/instance/httpapi/middleware/schema-error.ts +0 -41
- package/src/server/routes/instance/httpapi/middleware/workspace-routing.ts +0 -250
- package/src/server/routes/instance/httpapi/public.ts +0 -535
- package/src/server/routes/instance/httpapi/server.ts +0 -298
- package/src/server/routes/instance/httpapi/websocket-tracker.ts +0 -57
- package/src/server/server.ts +0 -225
- package/src/server/shared/fence.ts +0 -60
- package/src/server/shared/pty-ticket.ts +0 -15
- package/src/server/shared/public-ui.ts +0 -12
- package/src/server/shared/tui-control.ts +0 -28
- package/src/server/shared/ui.ts +0 -108
- package/src/server/shared/workspace-routing.ts +0 -38
- package/src/server/tui-event.ts +0 -53
- package/src/session/compaction.ts +0 -620
- package/src/session/instruction.ts +0 -241
- package/src/session/llm/AGENTS.md +0 -90
- package/src/session/llm/ai-sdk.ts +0 -288
- package/src/session/llm/native-request.ts +0 -196
- package/src/session/llm/native-runtime.ts +0 -195
- package/src/session/llm/request.ts +0 -216
- package/src/session/llm.ts +0 -415
- package/src/session/message-error.ts +0 -14
- package/src/session/message-v2.ts +0 -747
- package/src/session/message.ts +0 -148
- package/src/session/overflow.ts +0 -34
- package/src/session/processor.ts +0 -1084
- package/src/session/prompt/anthropic.txt +0 -109
- package/src/session/prompt/beast.txt +0 -151
- package/src/session/prompt/build-switch.txt +0 -9
- package/src/session/prompt/codex.txt +0 -83
- package/src/session/prompt/copilot-gpt-5.txt +0 -147
- package/src/session/prompt/default.txt +0 -99
- package/src/session/prompt/gemini.txt +0 -159
- package/src/session/prompt/gpt.txt +0 -111
- package/src/session/prompt/kimi.txt +0 -99
- package/src/session/prompt/plan-mode.txt +0 -74
- package/src/session/prompt/plan-reminder-anthropic.txt +0 -71
- package/src/session/prompt/plan.txt +0 -30
- package/src/session/prompt/trinity.txt +0 -101
- package/src/session/prompt.ts +0 -1707
- package/src/session/reminders.ts +0 -92
- package/src/session/retry.ts +0 -201
- package/src/session/revert.ts +0 -160
- package/src/session/run-state.ts +0 -156
- package/src/session/schema.ts +0 -26
- package/src/session/session.ts +0 -1119
- package/src/session/status.ts +0 -97
- package/src/session/summary.ts +0 -165
- package/src/session/system.ts +0 -117
- package/src/session/todo.ts +0 -90
- package/src/session/tools.ts +0 -207
- package/src/share/session.ts +0 -61
- package/src/share/share-next.ts +0 -385
- package/src/skill/discovery.ts +0 -109
- package/src/skill/index.ts +0 -366
- package/src/snapshot/index.ts +0 -808
- package/src/sql.d.ts +0 -4
- package/src/storage/schema.ts +0 -5
- package/src/storage/storage.ts +0 -329
- package/src/sync/README.md +0 -179
- package/src/sync/schema.ts +0 -11
- package/src/temporary.ts +0 -31
- package/src/tool/apply_patch.ts +0 -315
- package/src/tool/apply_patch.txt +0 -33
- package/src/tool/apply_patch.zh.txt +0 -33
- package/src/tool/description.ts +0 -100
- package/src/tool/edit.ts +0 -739
- package/src/tool/edit.txt +0 -10
- package/src/tool/edit.zh.txt +0 -10
- package/src/tool/external-directory.ts +0 -49
- package/src/tool/glob.ts +0 -78
- package/src/tool/glob.txt +0 -6
- package/src/tool/glob.zh.txt +0 -6
- package/src/tool/grep.ts +0 -114
- package/src/tool/grep.txt +0 -8
- package/src/tool/grep.zh.txt +0 -8
- package/src/tool/invalid.ts +0 -21
- package/src/tool/json-schema.ts +0 -164
- package/src/tool/lsp.ts +0 -115
- package/src/tool/lsp.txt +0 -24
- package/src/tool/lsp.zh.txt +0 -24
- package/src/tool/mcp-websearch.ts +0 -96
- package/src/tool/plan-enter.txt +0 -14
- package/src/tool/plan-enter.zh.txt +0 -14
- package/src/tool/plan-exit.txt +0 -13
- package/src/tool/plan-exit.zh.txt +0 -13
- package/src/tool/plan.ts +0 -81
- package/src/tool/question.ts +0 -46
- package/src/tool/question.txt +0 -10
- package/src/tool/question.zh.txt +0 -10
- package/src/tool/read.ts +0 -388
- package/src/tool/read.txt +0 -14
- package/src/tool/read.zh.txt +0 -14
- package/src/tool/registry.ts +0 -440
- package/src/tool/schema.ts +0 -14
- package/src/tool/shell/id.ts +0 -19
- package/src/tool/shell/prompt.ts +0 -307
- package/src/tool/shell/shell.txt +0 -21
- package/src/tool/shell.ts +0 -657
- package/src/tool/skill.ts +0 -73
- package/src/tool/skill.txt +0 -5
- package/src/tool/skill.zh.txt +0 -5
- package/src/tool/task.ts +0 -348
- package/src/tool/task.txt +0 -19
- package/src/tool/task.zh.txt +0 -19
- package/src/tool/todo.ts +0 -59
- package/src/tool/todowrite.txt +0 -44
- package/src/tool/todowrite.zh.txt +0 -44
- package/src/tool/tool.ts +0 -183
- package/src/tool/truncate.ts +0 -158
- package/src/tool/truncation-dir.ts +0 -4
- package/src/tool/webfetch.ts +0 -194
- package/src/tool/webfetch.txt +0 -13
- package/src/tool/webfetch.zh.txt +0 -13
- package/src/tool/websearch.ts +0 -145
- package/src/tool/websearch.txt +0 -14
- package/src/tool/websearch.zh.txt +0 -14
- package/src/tool/write.ts +0 -106
- package/src/tool/write.txt +0 -8
- package/src/tool/write.zh.txt +0 -8
- package/src/util/archive.ts +0 -17
- package/src/util/bom.ts +0 -27
- package/src/util/data-url.ts +0 -9
- package/src/util/defer.ts +0 -10
- package/src/util/effect-http-client.ts +0 -11
- package/src/util/error.ts +0 -1
- package/src/util/filesystem.ts +0 -251
- package/src/util/html.ts +0 -8
- package/src/util/iife.ts +0 -3
- package/src/util/lazy.ts +0 -20
- package/src/util/local-context.ts +0 -25
- package/src/util/locale.ts +0 -2
- package/src/util/media.ts +0 -26
- package/src/util/process.ts +0 -177
- package/src/util/proxy-env.ts +0 -72
- package/src/util/queue.ts +0 -32
- package/src/util/record.ts +0 -1
- package/src/util/repository.ts +0 -232
- package/src/util/rpc.ts +0 -66
- package/src/util/signal.ts +0 -12
- package/src/util/timeout.ts +0 -13
- package/src/util/token.ts +0 -1
- package/src/util/wildcard.ts +0 -59
- package/src/worktree/index.ts +0 -654
|
@@ -1,340 +0,0 @@
|
|
|
1
|
-
// Pure state machine for the question UI.
|
|
2
|
-
//
|
|
3
|
-
// Supports both single-question and multi-question flows. Single questions
|
|
4
|
-
// submit immediately on selection. Multi-question flows use tabs and a
|
|
5
|
-
// final confirmation step.
|
|
6
|
-
//
|
|
7
|
-
// State transitions:
|
|
8
|
-
// questionSelect → picks an option (single: submits, multi: toggles/advances)
|
|
9
|
-
// questionSave → saves custom text input
|
|
10
|
-
// questionMove → arrow key navigation through options
|
|
11
|
-
// questionSetTab → tab navigation between questions
|
|
12
|
-
// questionSubmit → builds the final QuestionReply with all answers
|
|
13
|
-
//
|
|
14
|
-
// Custom answers: if a question has custom=true, an extra "Type your own
|
|
15
|
-
// answer" option appears. Selecting it enters editing mode with a text field.
|
|
16
|
-
import type { QuestionInfo, QuestionRequest } from "@opencode-ai/sdk/v2"
|
|
17
|
-
import type { QuestionReject, QuestionReply } from "./types"
|
|
18
|
-
|
|
19
|
-
export type QuestionBodyState = {
|
|
20
|
-
requestID: string
|
|
21
|
-
tab: number
|
|
22
|
-
answers: string[][]
|
|
23
|
-
custom: string[]
|
|
24
|
-
selected: number
|
|
25
|
-
editing: boolean
|
|
26
|
-
submitting: boolean
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export type QuestionStep = {
|
|
30
|
-
state: QuestionBodyState
|
|
31
|
-
reply?: QuestionReply
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function createQuestionBodyState(requestID: string): QuestionBodyState {
|
|
35
|
-
return {
|
|
36
|
-
requestID,
|
|
37
|
-
tab: 0,
|
|
38
|
-
answers: [],
|
|
39
|
-
custom: [],
|
|
40
|
-
selected: 0,
|
|
41
|
-
editing: false,
|
|
42
|
-
submitting: false,
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export function questionSync(state: QuestionBodyState, requestID: string): QuestionBodyState {
|
|
47
|
-
if (state.requestID === requestID) {
|
|
48
|
-
return state
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return createQuestionBodyState(requestID)
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export function questionSingle(request: QuestionRequest): boolean {
|
|
55
|
-
return request.questions.length === 1 && request.questions[0]?.multiple !== true
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export function questionTabs(request: QuestionRequest): number {
|
|
59
|
-
return questionSingle(request) ? 1 : request.questions.length + 1
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export function questionConfirm(request: QuestionRequest, state: QuestionBodyState): boolean {
|
|
63
|
-
return !questionSingle(request) && state.tab === request.questions.length
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export function questionInfo(request: QuestionRequest, state: QuestionBodyState): QuestionInfo | undefined {
|
|
67
|
-
return request.questions[state.tab]
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export function questionCustom(request: QuestionRequest, state: QuestionBodyState): boolean {
|
|
71
|
-
return questionInfo(request, state)?.custom !== false
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export function questionInput(state: QuestionBodyState): string {
|
|
75
|
-
return state.custom[state.tab] ?? ""
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export function questionPicked(state: QuestionBodyState): boolean {
|
|
79
|
-
const value = questionInput(state)
|
|
80
|
-
if (!value) {
|
|
81
|
-
return false
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
return state.answers[state.tab]?.includes(value) ?? false
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
export function questionOther(request: QuestionRequest, state: QuestionBodyState): boolean {
|
|
88
|
-
const info = questionInfo(request, state)
|
|
89
|
-
if (!info || info.custom === false) {
|
|
90
|
-
return false
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return state.selected === info.options.length
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export function questionTotal(request: QuestionRequest, state: QuestionBodyState): number {
|
|
97
|
-
const info = questionInfo(request, state)
|
|
98
|
-
if (!info) {
|
|
99
|
-
return 0
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
return info.options.length + (questionCustom(request, state) ? 1 : 0)
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
export function questionAnswers(state: QuestionBodyState, count: number): string[][] {
|
|
106
|
-
return Array.from({ length: count }, (_, idx) => state.answers[idx] ?? [])
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
export function questionSetTab(state: QuestionBodyState, tab: number): QuestionBodyState {
|
|
110
|
-
return {
|
|
111
|
-
...state,
|
|
112
|
-
tab,
|
|
113
|
-
selected: 0,
|
|
114
|
-
editing: false,
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
export function questionSetSelected(state: QuestionBodyState, selected: number): QuestionBodyState {
|
|
119
|
-
return {
|
|
120
|
-
...state,
|
|
121
|
-
selected,
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
export function questionSetEditing(state: QuestionBodyState, editing: boolean): QuestionBodyState {
|
|
126
|
-
return {
|
|
127
|
-
...state,
|
|
128
|
-
editing,
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
export function questionSetSubmitting(state: QuestionBodyState, submitting: boolean): QuestionBodyState {
|
|
133
|
-
return {
|
|
134
|
-
...state,
|
|
135
|
-
submitting,
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
function storeAnswers(state: QuestionBodyState, tab: number, list: string[]): QuestionBodyState {
|
|
140
|
-
const answers = [...state.answers]
|
|
141
|
-
answers[tab] = list
|
|
142
|
-
return {
|
|
143
|
-
...state,
|
|
144
|
-
answers,
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
export function questionStoreCustom(state: QuestionBodyState, tab: number, text: string): QuestionBodyState {
|
|
149
|
-
const custom = [...state.custom]
|
|
150
|
-
custom[tab] = text
|
|
151
|
-
return {
|
|
152
|
-
...state,
|
|
153
|
-
custom,
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
function questionPick(
|
|
158
|
-
state: QuestionBodyState,
|
|
159
|
-
request: QuestionRequest,
|
|
160
|
-
answer: string,
|
|
161
|
-
custom = false,
|
|
162
|
-
): QuestionStep {
|
|
163
|
-
const answers = [...state.answers]
|
|
164
|
-
answers[state.tab] = [answer]
|
|
165
|
-
let next: QuestionBodyState = {
|
|
166
|
-
...state,
|
|
167
|
-
answers,
|
|
168
|
-
editing: false,
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
if (custom) {
|
|
172
|
-
const list = [...state.custom]
|
|
173
|
-
list[state.tab] = answer
|
|
174
|
-
next = {
|
|
175
|
-
...next,
|
|
176
|
-
custom: list,
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
if (questionSingle(request)) {
|
|
181
|
-
return {
|
|
182
|
-
state: next,
|
|
183
|
-
reply: {
|
|
184
|
-
requestID: request.id,
|
|
185
|
-
answers: [[answer]],
|
|
186
|
-
},
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
return {
|
|
191
|
-
state: questionSetTab(next, state.tab + 1),
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
function questionToggle(state: QuestionBodyState, answer: string): QuestionBodyState {
|
|
196
|
-
const list = [...(state.answers[state.tab] ?? [])]
|
|
197
|
-
const idx = list.indexOf(answer)
|
|
198
|
-
if (idx === -1) {
|
|
199
|
-
list.push(answer)
|
|
200
|
-
} else {
|
|
201
|
-
list.splice(idx, 1)
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
return storeAnswers(state, state.tab, list)
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
export function questionMove(state: QuestionBodyState, request: QuestionRequest, dir: -1 | 1): QuestionBodyState {
|
|
208
|
-
const total = questionTotal(request, state)
|
|
209
|
-
if (total === 0) {
|
|
210
|
-
return state
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
return {
|
|
214
|
-
...state,
|
|
215
|
-
selected: (state.selected + dir + total) % total,
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
export function questionSelect(state: QuestionBodyState, request: QuestionRequest): QuestionStep {
|
|
220
|
-
const info = questionInfo(request, state)
|
|
221
|
-
if (!info) {
|
|
222
|
-
return { state }
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
if (questionOther(request, state)) {
|
|
226
|
-
if (!info.multiple) {
|
|
227
|
-
return {
|
|
228
|
-
state: questionSetEditing(state, true),
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
const value = questionInput(state)
|
|
233
|
-
if (value && questionPicked(state)) {
|
|
234
|
-
return {
|
|
235
|
-
state: questionToggle(state, value),
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
return {
|
|
240
|
-
state: questionSetEditing(state, true),
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
const option = info.options[state.selected]
|
|
245
|
-
if (!option) {
|
|
246
|
-
return { state }
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
if (info.multiple) {
|
|
250
|
-
return {
|
|
251
|
-
state: questionToggle(state, option.label),
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
return questionPick(state, request, option.label)
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
export function questionSave(state: QuestionBodyState, request: QuestionRequest): QuestionStep {
|
|
259
|
-
const info = questionInfo(request, state)
|
|
260
|
-
if (!info) {
|
|
261
|
-
return { state }
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
const value = questionInput(state).trim()
|
|
265
|
-
const prev = state.custom[state.tab]
|
|
266
|
-
if (!value) {
|
|
267
|
-
if (!prev) {
|
|
268
|
-
return {
|
|
269
|
-
state: questionSetEditing(state, false),
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
const next = questionStoreCustom(state, state.tab, "")
|
|
274
|
-
return {
|
|
275
|
-
state: questionSetEditing(
|
|
276
|
-
storeAnswers(
|
|
277
|
-
next,
|
|
278
|
-
state.tab,
|
|
279
|
-
(state.answers[state.tab] ?? []).filter((item) => item !== prev),
|
|
280
|
-
),
|
|
281
|
-
false,
|
|
282
|
-
),
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
if (info.multiple) {
|
|
287
|
-
const answers = [...(state.answers[state.tab] ?? [])]
|
|
288
|
-
if (prev) {
|
|
289
|
-
const idx = answers.indexOf(prev)
|
|
290
|
-
if (idx !== -1) {
|
|
291
|
-
answers.splice(idx, 1)
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
if (!answers.includes(value)) {
|
|
296
|
-
answers.push(value)
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
const next = questionStoreCustom(state, state.tab, value)
|
|
300
|
-
return {
|
|
301
|
-
state: questionSetEditing(storeAnswers(next, state.tab, answers), false),
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
return questionPick(state, request, value, true)
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
export function questionSubmit(request: QuestionRequest, state: QuestionBodyState): QuestionReply {
|
|
309
|
-
return {
|
|
310
|
-
requestID: request.id,
|
|
311
|
-
answers: questionAnswers(state, request.questions.length),
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
export function questionReject(request: QuestionRequest): QuestionReject {
|
|
316
|
-
return {
|
|
317
|
-
requestID: request.id,
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
export function questionHint(request: QuestionRequest, state: QuestionBodyState): string {
|
|
322
|
-
if (state.submitting) {
|
|
323
|
-
return "Waiting for question event..."
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
if (questionConfirm(request, state)) {
|
|
327
|
-
return "enter submit esc dismiss"
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
if (state.editing) {
|
|
331
|
-
return "enter save esc cancel"
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
const info = questionInfo(request, state)
|
|
335
|
-
if (questionSingle(request)) {
|
|
336
|
-
return `↑↓ select enter ${info?.multiple ? "toggle" : "submit"} esc dismiss`
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
return `⇆ tab ↑↓ select enter ${info?.multiple ? "toggle" : "confirm"} esc dismiss`
|
|
340
|
-
}
|
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
// Boot-time resolution for direct interactive mode.
|
|
2
|
-
//
|
|
3
|
-
// These functions run concurrently at startup to gather everything the runtime
|
|
4
|
-
// needs before the first frame: TUI keymap config, diff display style,
|
|
5
|
-
// model variant list with context limits, and session history for the prompt
|
|
6
|
-
// history ring. All are async because they read config or hit the SDK, but
|
|
7
|
-
// none block each other.
|
|
8
|
-
import { Context, Effect, Layer } from "effect"
|
|
9
|
-
import { resolve } from "@opencode-ai/tui/config"
|
|
10
|
-
import { TuiConfig } from "@/config/tui"
|
|
11
|
-
import { makeRuntime } from "@/effect/run-service"
|
|
12
|
-
import { reusePendingTask } from "./runtime.shared"
|
|
13
|
-
import { resolveSession, sessionHistory } from "./session.shared"
|
|
14
|
-
import type { RunDiffStyle, RunInput, RunPrompt, RunProvider, RunTuiConfig } from "./types"
|
|
15
|
-
import { pickVariant } from "./variant.shared"
|
|
16
|
-
|
|
17
|
-
export type ModelInfo = {
|
|
18
|
-
providers: RunProvider[]
|
|
19
|
-
variants: string[]
|
|
20
|
-
limits: Record<string, number>
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export type SessionInfo = {
|
|
24
|
-
first: boolean
|
|
25
|
-
history: RunPrompt[]
|
|
26
|
-
variant: string | undefined
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
type Config = Awaited<ReturnType<typeof TuiConfig.get>>
|
|
30
|
-
type BootService = {
|
|
31
|
-
readonly resolveModelInfo: (
|
|
32
|
-
sdk: RunInput["sdk"],
|
|
33
|
-
directory: string,
|
|
34
|
-
model: RunInput["model"],
|
|
35
|
-
) => Effect.Effect<ModelInfo>
|
|
36
|
-
readonly resolveSessionInfo: (
|
|
37
|
-
sdk: RunInput["sdk"],
|
|
38
|
-
sessionID: string,
|
|
39
|
-
model: RunInput["model"],
|
|
40
|
-
) => Effect.Effect<SessionInfo>
|
|
41
|
-
readonly resolveRunTuiConfig: () => Effect.Effect<RunTuiConfig>
|
|
42
|
-
readonly resolveDiffStyle: () => Effect.Effect<RunDiffStyle>
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const configTask: { current?: Promise<Config> } = {}
|
|
46
|
-
|
|
47
|
-
class Service extends Context.Service<Service, BootService>()("@opencode/RunBoot") {}
|
|
48
|
-
|
|
49
|
-
function loadConfig() {
|
|
50
|
-
return reusePendingTask(configTask, () => TuiConfig.get())
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function emptyModelInfo(): ModelInfo {
|
|
54
|
-
return {
|
|
55
|
-
providers: [],
|
|
56
|
-
variants: [],
|
|
57
|
-
limits: {},
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function emptySessionInfo(): SessionInfo {
|
|
62
|
-
return {
|
|
63
|
-
first: true,
|
|
64
|
-
history: [],
|
|
65
|
-
variant: undefined,
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function defaultRunTuiConfig(): RunTuiConfig {
|
|
70
|
-
return {
|
|
71
|
-
...resolve({}, { terminalSuspend: process.platform !== "win32" }),
|
|
72
|
-
diff_style: "auto",
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function runTuiConfig(config: Config | undefined): RunTuiConfig {
|
|
77
|
-
if (!config) {
|
|
78
|
-
return defaultRunTuiConfig()
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
keybinds: config.keybinds,
|
|
83
|
-
leader_timeout: config.leader_timeout,
|
|
84
|
-
diff_style: config.diff_style ?? "auto",
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const layer = Layer.effect(
|
|
89
|
-
Service,
|
|
90
|
-
Effect.gen(function* () {
|
|
91
|
-
const config = Effect.fn("RunBoot.config")(() => Effect.promise(() => loadConfig().catch(() => undefined)))
|
|
92
|
-
|
|
93
|
-
const resolveModelInfo = Effect.fn("RunBoot.resolveModelInfo")(function* (
|
|
94
|
-
sdk: RunInput["sdk"],
|
|
95
|
-
directory: string,
|
|
96
|
-
model: RunInput["model"],
|
|
97
|
-
) {
|
|
98
|
-
const connected = yield* Effect.promise(() =>
|
|
99
|
-
sdk.config
|
|
100
|
-
.providers({ directory })
|
|
101
|
-
.then((item) => item.data?.providers)
|
|
102
|
-
.catch(() => undefined),
|
|
103
|
-
)
|
|
104
|
-
const providers = yield* Effect.promise(() =>
|
|
105
|
-
connected
|
|
106
|
-
? Promise.resolve(connected)
|
|
107
|
-
: sdk.provider
|
|
108
|
-
.list()
|
|
109
|
-
.then((item) => item.data?.all ?? [])
|
|
110
|
-
.catch(() => []),
|
|
111
|
-
)
|
|
112
|
-
const limits = Object.fromEntries(
|
|
113
|
-
providers.flatMap((provider) =>
|
|
114
|
-
Object.entries(provider.models ?? {}).flatMap(([modelID, info]) => {
|
|
115
|
-
const limit = info?.limit?.context
|
|
116
|
-
if (typeof limit !== "number" || limit <= 0) {
|
|
117
|
-
return []
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
return [[`${provider.id}/${modelID}`, limit] as const]
|
|
121
|
-
}),
|
|
122
|
-
),
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
if (!model) {
|
|
126
|
-
return {
|
|
127
|
-
providers,
|
|
128
|
-
variants: [],
|
|
129
|
-
limits,
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
const info = providers.find((item) => item.id === model.providerID)?.models?.[model.modelID]
|
|
134
|
-
return {
|
|
135
|
-
providers,
|
|
136
|
-
variants: Object.keys(info?.variants ?? {}),
|
|
137
|
-
limits,
|
|
138
|
-
}
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
const resolveSessionInfo = Effect.fn("RunBoot.resolveSessionInfo")(function* (
|
|
142
|
-
sdk: RunInput["sdk"],
|
|
143
|
-
sessionID: string,
|
|
144
|
-
model: RunInput["model"],
|
|
145
|
-
) {
|
|
146
|
-
const session = yield* Effect.promise(() => resolveSession(sdk, sessionID).catch(() => undefined))
|
|
147
|
-
if (!session) {
|
|
148
|
-
return emptySessionInfo()
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
return {
|
|
152
|
-
first: session.first,
|
|
153
|
-
history: sessionHistory(session),
|
|
154
|
-
variant: pickVariant(model, session),
|
|
155
|
-
}
|
|
156
|
-
})
|
|
157
|
-
|
|
158
|
-
const resolveRunTuiConfig = Effect.fn("RunBoot.resolveRunTuiConfig")(function* () {
|
|
159
|
-
return runTuiConfig(yield* config())
|
|
160
|
-
})
|
|
161
|
-
|
|
162
|
-
const resolveDiffStyle = Effect.fn("RunBoot.resolveDiffStyle")(function* () {
|
|
163
|
-
return runTuiConfig(yield* config()).diff_style ?? "auto"
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
return Service.of({
|
|
167
|
-
resolveModelInfo,
|
|
168
|
-
resolveSessionInfo,
|
|
169
|
-
resolveRunTuiConfig,
|
|
170
|
-
resolveDiffStyle,
|
|
171
|
-
})
|
|
172
|
-
}),
|
|
173
|
-
)
|
|
174
|
-
|
|
175
|
-
const runtime = makeRuntime(Service, layer)
|
|
176
|
-
|
|
177
|
-
// Fetches available variants and context limits for every provider/model pair.
|
|
178
|
-
export async function resolveModelInfo(
|
|
179
|
-
sdk: RunInput["sdk"],
|
|
180
|
-
directory: string,
|
|
181
|
-
model: RunInput["model"],
|
|
182
|
-
): Promise<ModelInfo> {
|
|
183
|
-
return runtime.runPromise((svc) => svc.resolveModelInfo(sdk, directory, model)).catch(() => emptyModelInfo())
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// Fetches session messages to determine if this is the first turn and build prompt history.
|
|
187
|
-
export async function resolveSessionInfo(
|
|
188
|
-
sdk: RunInput["sdk"],
|
|
189
|
-
sessionID: string,
|
|
190
|
-
model: RunInput["model"],
|
|
191
|
-
): Promise<SessionInfo> {
|
|
192
|
-
return runtime.runPromise((svc) => svc.resolveSessionInfo(sdk, sessionID, model)).catch(() => emptySessionInfo())
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
// Reads TUI config once for direct mode keymap setup and display preferences.
|
|
196
|
-
export async function resolveRunTuiConfig(): Promise<RunTuiConfig> {
|
|
197
|
-
return runtime.runPromise((svc) => svc.resolveRunTuiConfig()).catch(() => defaultRunTuiConfig())
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
export async function resolveDiffStyle(): Promise<RunDiffStyle> {
|
|
201
|
-
return runtime.runPromise((svc) => svc.resolveDiffStyle()).catch(() => "auto")
|
|
202
|
-
}
|