nuwaxcode 1.1.32 → 1.1.44
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/nuwaxcode +19 -1
- package/package.json +15 -117
- package/{script/postinstall.mjs → postinstall.mjs} +18 -6
- package/AGENTS.md +0 -27
- package/Dockerfile +0 -18
- package/README.md +0 -15
- package/bunfig.toml +0 -7
- package/parsers-config.ts +0 -253
- package/script/build.ts +0 -172
- package/script/publish-registries.ts +0 -187
- package/script/publish.ts +0 -70
- package/script/schema.ts +0 -47
- package/src/acp/README.md +0 -164
- package/src/acp/agent.ts +0 -1280
- package/src/acp/session.ts +0 -111
- package/src/acp/types.ts +0 -24
- package/src/agent/agent.ts +0 -332
- package/src/agent/generate.txt +0 -75
- package/src/agent/prompt/compaction.txt +0 -12
- package/src/agent/prompt/explore.txt +0 -18
- package/src/agent/prompt/summary.txt +0 -11
- package/src/agent/prompt/title.txt +0 -43
- package/src/auth/index.ts +0 -73
- package/src/bun/index.ts +0 -134
- package/src/bus/bus-event.ts +0 -43
- package/src/bus/global.ts +0 -10
- package/src/bus/index.ts +0 -105
- package/src/cli/bootstrap.ts +0 -17
- package/src/cli/cmd/acp.ts +0 -69
- package/src/cli/cmd/agent.ts +0 -257
- package/src/cli/cmd/auth.ts +0 -400
- package/src/cli/cmd/cmd.ts +0 -7
- package/src/cli/cmd/debug/agent.ts +0 -166
- package/src/cli/cmd/debug/config.ts +0 -16
- package/src/cli/cmd/debug/file.ts +0 -97
- package/src/cli/cmd/debug/index.ts +0 -48
- package/src/cli/cmd/debug/lsp.ts +0 -52
- package/src/cli/cmd/debug/ripgrep.ts +0 -87
- package/src/cli/cmd/debug/scrap.ts +0 -16
- package/src/cli/cmd/debug/skill.ts +0 -16
- package/src/cli/cmd/debug/snapshot.ts +0 -52
- package/src/cli/cmd/export.ts +0 -88
- package/src/cli/cmd/generate.ts +0 -38
- package/src/cli/cmd/github.ts +0 -1548
- package/src/cli/cmd/import.ts +0 -98
- package/src/cli/cmd/mcp.ts +0 -755
- package/src/cli/cmd/models.ts +0 -77
- package/src/cli/cmd/pr.ts +0 -112
- package/src/cli/cmd/run.ts +0 -395
- package/src/cli/cmd/serve.ts +0 -20
- package/src/cli/cmd/session.ts +0 -135
- package/src/cli/cmd/stats.ts +0 -402
- package/src/cli/cmd/tui/app.tsx +0 -761
- package/src/cli/cmd/tui/attach.ts +0 -31
- package/src/cli/cmd/tui/component/border.tsx +0 -21
- package/src/cli/cmd/tui/component/dialog-agent.tsx +0 -31
- package/src/cli/cmd/tui/component/dialog-command.tsx +0 -148
- package/src/cli/cmd/tui/component/dialog-mcp.tsx +0 -86
- package/src/cli/cmd/tui/component/dialog-model.tsx +0 -234
- package/src/cli/cmd/tui/component/dialog-provider.tsx +0 -256
- package/src/cli/cmd/tui/component/dialog-session-list.tsx +0 -114
- package/src/cli/cmd/tui/component/dialog-session-rename.tsx +0 -31
- package/src/cli/cmd/tui/component/dialog-stash.tsx +0 -87
- package/src/cli/cmd/tui/component/dialog-status.tsx +0 -164
- package/src/cli/cmd/tui/component/dialog-tag.tsx +0 -44
- package/src/cli/cmd/tui/component/dialog-theme-list.tsx +0 -50
- package/src/cli/cmd/tui/component/logo.tsx +0 -88
- package/src/cli/cmd/tui/component/prompt/autocomplete.tsx +0 -632
- package/src/cli/cmd/tui/component/prompt/frecency.tsx +0 -89
- package/src/cli/cmd/tui/component/prompt/history.tsx +0 -108
- package/src/cli/cmd/tui/component/prompt/index.tsx +0 -1096
- package/src/cli/cmd/tui/component/prompt/stash.tsx +0 -101
- package/src/cli/cmd/tui/component/textarea-keybindings.ts +0 -73
- package/src/cli/cmd/tui/component/tips.tsx +0 -153
- package/src/cli/cmd/tui/component/todo-item.tsx +0 -32
- package/src/cli/cmd/tui/context/args.tsx +0 -14
- package/src/cli/cmd/tui/context/directory.ts +0 -13
- package/src/cli/cmd/tui/context/exit.tsx +0 -23
- package/src/cli/cmd/tui/context/helper.tsx +0 -25
- package/src/cli/cmd/tui/context/keybind.tsx +0 -101
- package/src/cli/cmd/tui/context/kv.tsx +0 -52
- package/src/cli/cmd/tui/context/local.tsx +0 -402
- package/src/cli/cmd/tui/context/prompt.tsx +0 -18
- package/src/cli/cmd/tui/context/route.tsx +0 -46
- package/src/cli/cmd/tui/context/sdk.tsx +0 -94
- package/src/cli/cmd/tui/context/sync.tsx +0 -427
- package/src/cli/cmd/tui/context/theme/aura.json +0 -69
- package/src/cli/cmd/tui/context/theme/ayu.json +0 -80
- package/src/cli/cmd/tui/context/theme/carbonfox.json +0 -248
- package/src/cli/cmd/tui/context/theme/catppuccin-frappe.json +0 -233
- package/src/cli/cmd/tui/context/theme/catppuccin-macchiato.json +0 -233
- package/src/cli/cmd/tui/context/theme/catppuccin.json +0 -112
- package/src/cli/cmd/tui/context/theme/cobalt2.json +0 -228
- package/src/cli/cmd/tui/context/theme/cursor.json +0 -249
- package/src/cli/cmd/tui/context/theme/dracula.json +0 -219
- package/src/cli/cmd/tui/context/theme/everforest.json +0 -241
- package/src/cli/cmd/tui/context/theme/flexoki.json +0 -237
- package/src/cli/cmd/tui/context/theme/github.json +0 -233
- package/src/cli/cmd/tui/context/theme/gruvbox.json +0 -95
- package/src/cli/cmd/tui/context/theme/kanagawa.json +0 -77
- package/src/cli/cmd/tui/context/theme/lucent-orng.json +0 -237
- package/src/cli/cmd/tui/context/theme/material.json +0 -235
- package/src/cli/cmd/tui/context/theme/matrix.json +0 -77
- package/src/cli/cmd/tui/context/theme/mercury.json +0 -252
- package/src/cli/cmd/tui/context/theme/monokai.json +0 -221
- package/src/cli/cmd/tui/context/theme/nightowl.json +0 -221
- package/src/cli/cmd/tui/context/theme/nord.json +0 -223
- package/src/cli/cmd/tui/context/theme/one-dark.json +0 -84
- package/src/cli/cmd/tui/context/theme/orng.json +0 -249
- package/src/cli/cmd/tui/context/theme/osaka-jade.json +0 -93
- package/src/cli/cmd/tui/context/theme/palenight.json +0 -222
- package/src/cli/cmd/tui/context/theme/rosepine.json +0 -234
- package/src/cli/cmd/tui/context/theme/solarized.json +0 -223
- package/src/cli/cmd/tui/context/theme/synthwave84.json +0 -226
- package/src/cli/cmd/tui/context/theme/tokyonight.json +0 -243
- package/src/cli/cmd/tui/context/theme/vercel.json +0 -245
- package/src/cli/cmd/tui/context/theme/vesper.json +0 -218
- package/src/cli/cmd/tui/context/theme/zenburn.json +0 -223
- package/src/cli/cmd/tui/context/theme.tsx +0 -1152
- package/src/cli/cmd/tui/event.ts +0 -48
- package/src/cli/cmd/tui/routes/home.tsx +0 -140
- package/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +0 -64
- package/src/cli/cmd/tui/routes/session/dialog-message.tsx +0 -109
- package/src/cli/cmd/tui/routes/session/dialog-subagent.tsx +0 -26
- package/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +0 -47
- package/src/cli/cmd/tui/routes/session/footer.tsx +0 -91
- package/src/cli/cmd/tui/routes/session/header.tsx +0 -136
- package/src/cli/cmd/tui/routes/session/index.tsx +0 -2050
- package/src/cli/cmd/tui/routes/session/permission.tsx +0 -495
- package/src/cli/cmd/tui/routes/session/question.tsx +0 -435
- package/src/cli/cmd/tui/routes/session/sidebar.tsx +0 -312
- package/src/cli/cmd/tui/thread.ts +0 -165
- package/src/cli/cmd/tui/ui/dialog-alert.tsx +0 -57
- package/src/cli/cmd/tui/ui/dialog-confirm.tsx +0 -83
- package/src/cli/cmd/tui/ui/dialog-export-options.tsx +0 -204
- package/src/cli/cmd/tui/ui/dialog-help.tsx +0 -38
- package/src/cli/cmd/tui/ui/dialog-prompt.tsx +0 -77
- package/src/cli/cmd/tui/ui/dialog-select.tsx +0 -354
- package/src/cli/cmd/tui/ui/dialog.tsx +0 -167
- package/src/cli/cmd/tui/ui/link.tsx +0 -28
- package/src/cli/cmd/tui/ui/spinner.ts +0 -368
- package/src/cli/cmd/tui/ui/toast.tsx +0 -100
- package/src/cli/cmd/tui/util/clipboard.ts +0 -160
- package/src/cli/cmd/tui/util/editor.ts +0 -32
- package/src/cli/cmd/tui/util/signal.ts +0 -7
- package/src/cli/cmd/tui/util/terminal.ts +0 -114
- package/src/cli/cmd/tui/util/transcript.ts +0 -98
- package/src/cli/cmd/tui/worker.ts +0 -152
- package/src/cli/cmd/uninstall.ts +0 -357
- package/src/cli/cmd/upgrade.ts +0 -73
- package/src/cli/cmd/web.ts +0 -81
- package/src/cli/error.ts +0 -57
- package/src/cli/network.ts +0 -53
- package/src/cli/ui.ts +0 -84
- package/src/cli/upgrade.ts +0 -25
- package/src/command/index.ts +0 -131
- package/src/command/template/initialize.txt +0 -10
- package/src/command/template/review.txt +0 -99
- package/src/config/config.ts +0 -1255
- package/src/config/markdown.ts +0 -93
- package/src/env/index.ts +0 -26
- package/src/file/ignore.ts +0 -83
- package/src/file/index.ts +0 -411
- package/src/file/ripgrep.ts +0 -409
- package/src/file/time.ts +0 -64
- package/src/file/watcher.ts +0 -118
- package/src/flag/flag.ts +0 -54
- package/src/format/formatter.ts +0 -359
- package/src/format/index.ts +0 -137
- package/src/global/index.ts +0 -55
- package/src/id/id.ts +0 -83
- package/src/ide/index.ts +0 -76
- package/src/index.ts +0 -159
- package/src/installation/index.ts +0 -246
- package/src/lsp/client.ts +0 -252
- package/src/lsp/index.ts +0 -485
- package/src/lsp/language.ts +0 -119
- package/src/lsp/server.ts +0 -2046
- package/src/mcp/auth.ts +0 -135
- package/src/mcp/index.ts +0 -926
- package/src/mcp/oauth-callback.ts +0 -200
- package/src/mcp/oauth-provider.ts +0 -154
- package/src/patch/index.ts +0 -680
- package/src/permission/arity.ts +0 -163
- package/src/permission/index.ts +0 -210
- package/src/permission/next.ts +0 -269
- package/src/plugin/codex.ts +0 -493
- package/src/plugin/copilot.ts +0 -269
- package/src/plugin/index.ts +0 -135
- package/src/project/bootstrap.ts +0 -35
- package/src/project/instance.ts +0 -91
- package/src/project/project.ts +0 -320
- package/src/project/state.ts +0 -66
- package/src/project/vcs.ts +0 -76
- package/src/provider/auth.ts +0 -147
- package/src/provider/models-macro.ts +0 -11
- package/src/provider/models.ts +0 -112
- package/src/provider/provider.ts +0 -1219
- package/src/provider/sdk/openai-compatible/src/README.md +0 -5
- package/src/provider/sdk/openai-compatible/src/index.ts +0 -2
- package/src/provider/sdk/openai-compatible/src/openai-compatible-provider.ts +0 -100
- package/src/provider/sdk/openai-compatible/src/responses/convert-to-openai-responses-input.ts +0 -303
- package/src/provider/sdk/openai-compatible/src/responses/map-openai-responses-finish-reason.ts +0 -22
- package/src/provider/sdk/openai-compatible/src/responses/openai-config.ts +0 -18
- package/src/provider/sdk/openai-compatible/src/responses/openai-error.ts +0 -22
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-api-types.ts +0 -207
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-language-model.ts +0 -1732
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-prepare-tools.ts +0 -177
- package/src/provider/sdk/openai-compatible/src/responses/openai-responses-settings.ts +0 -1
- package/src/provider/sdk/openai-compatible/src/responses/tool/code-interpreter.ts +0 -88
- package/src/provider/sdk/openai-compatible/src/responses/tool/file-search.ts +0 -128
- package/src/provider/sdk/openai-compatible/src/responses/tool/image-generation.ts +0 -115
- package/src/provider/sdk/openai-compatible/src/responses/tool/local-shell.ts +0 -65
- package/src/provider/sdk/openai-compatible/src/responses/tool/web-search-preview.ts +0 -104
- package/src/provider/sdk/openai-compatible/src/responses/tool/web-search.ts +0 -103
- package/src/provider/transform.ts +0 -724
- package/src/pty/index.ts +0 -229
- package/src/question/index.ts +0 -171
- package/src/scheduler/index.ts +0 -61
- package/src/server/error.ts +0 -36
- package/src/server/mdns.ts +0 -59
- package/src/server/routes/config.ts +0 -92
- package/src/server/routes/experimental.ts +0 -157
- package/src/server/routes/file.ts +0 -197
- package/src/server/routes/global.ts +0 -135
- package/src/server/routes/mcp.ts +0 -225
- package/src/server/routes/permission.ts +0 -68
- package/src/server/routes/project.ts +0 -82
- package/src/server/routes/provider.ts +0 -165
- package/src/server/routes/pty.ts +0 -169
- package/src/server/routes/question.ts +0 -98
- package/src/server/routes/session.ts +0 -935
- package/src/server/routes/tui.ts +0 -379
- package/src/server/server.ts +0 -578
- package/src/session/compaction.ts +0 -225
- package/src/session/index.ts +0 -488
- package/src/session/llm.ts +0 -279
- package/src/session/message-v2.ts +0 -702
- package/src/session/message.ts +0 -189
- package/src/session/processor.ts +0 -406
- package/src/session/prompt/anthropic-20250930.txt +0 -166
- package/src/session/prompt/anthropic.txt +0 -105
- package/src/session/prompt/anthropic_spoof.txt +0 -1
- package/src/session/prompt/beast.txt +0 -147
- package/src/session/prompt/build-switch.txt +0 -5
- package/src/session/prompt/codex.txt +0 -73
- package/src/session/prompt/codex_header.txt +0 -72
- package/src/session/prompt/copilot-gpt-5.txt +0 -143
- package/src/session/prompt/gemini.txt +0 -155
- package/src/session/prompt/max-steps.txt +0 -16
- package/src/session/prompt/plan-reminder-anthropic.txt +0 -67
- package/src/session/prompt/plan.txt +0 -26
- package/src/session/prompt/qwen.txt +0 -109
- package/src/session/prompt.ts +0 -1805
- package/src/session/retry.ts +0 -90
- package/src/session/revert.ts +0 -108
- package/src/session/status.ts +0 -76
- package/src/session/summary.ts +0 -150
- package/src/session/system.ts +0 -138
- package/src/session/todo.ts +0 -37
- package/src/share/share-next.ts +0 -194
- package/src/share/share.ts +0 -87
- package/src/shell/shell.ts +0 -67
- package/src/skill/index.ts +0 -1
- package/src/skill/skill.ts +0 -136
- package/src/snapshot/index.ts +0 -236
- package/src/storage/storage.ts +0 -227
- package/src/tool/apply_patch.ts +0 -277
- package/src/tool/apply_patch.txt +0 -1
- package/src/tool/bash.ts +0 -258
- package/src/tool/bash.txt +0 -115
- package/src/tool/batch.ts +0 -175
- package/src/tool/batch.txt +0 -24
- package/src/tool/codesearch.ts +0 -132
- package/src/tool/codesearch.txt +0 -12
- package/src/tool/edit.ts +0 -645
- package/src/tool/edit.txt +0 -10
- package/src/tool/external-directory.ts +0 -32
- package/src/tool/glob.ts +0 -77
- package/src/tool/glob.txt +0 -6
- package/src/tool/grep.ts +0 -154
- package/src/tool/grep.txt +0 -8
- package/src/tool/invalid.ts +0 -17
- package/src/tool/ls.ts +0 -121
- package/src/tool/ls.txt +0 -1
- package/src/tool/lsp.ts +0 -96
- package/src/tool/lsp.txt +0 -19
- package/src/tool/multiedit.ts +0 -46
- package/src/tool/multiedit.txt +0 -41
- package/src/tool/plan-enter.txt +0 -14
- package/src/tool/plan-exit.txt +0 -13
- package/src/tool/plan.ts +0 -130
- package/src/tool/question.ts +0 -33
- package/src/tool/question.txt +0 -10
- package/src/tool/read.ts +0 -202
- package/src/tool/read.txt +0 -12
- package/src/tool/registry.ts +0 -158
- package/src/tool/skill.ts +0 -75
- package/src/tool/task.ts +0 -188
- package/src/tool/task.txt +0 -60
- package/src/tool/todo.ts +0 -53
- package/src/tool/todoread.txt +0 -14
- package/src/tool/todowrite.txt +0 -167
- package/src/tool/tool.ts +0 -88
- package/src/tool/truncation.ts +0 -106
- package/src/tool/webfetch.ts +0 -182
- package/src/tool/webfetch.txt +0 -13
- package/src/tool/websearch.ts +0 -150
- package/src/tool/websearch.txt +0 -14
- package/src/tool/write.ts +0 -80
- package/src/tool/write.txt +0 -8
- package/src/util/archive.ts +0 -16
- package/src/util/color.ts +0 -19
- package/src/util/context.ts +0 -25
- package/src/util/defer.ts +0 -12
- package/src/util/eventloop.ts +0 -20
- package/src/util/filesystem.ts +0 -93
- package/src/util/fn.ts +0 -11
- package/src/util/format.ts +0 -20
- package/src/util/iife.ts +0 -3
- package/src/util/keybind.ts +0 -103
- package/src/util/lazy.ts +0 -18
- package/src/util/locale.ts +0 -81
- package/src/util/lock.ts +0 -98
- package/src/util/log.ts +0 -180
- package/src/util/queue.ts +0 -32
- package/src/util/rpc.ts +0 -66
- package/src/util/scrap.ts +0 -10
- package/src/util/signal.ts +0 -12
- package/src/util/timeout.ts +0 -14
- package/src/util/token.ts +0 -7
- package/src/util/wildcard.ts +0 -56
- package/src/worktree/index.ts +0 -217
- package/sst-env.d.ts +0 -9
- package/test/acp/event-subscription.test.ts +0 -436
- package/test/acp/system-prompt.test.ts +0 -262
- package/test/agent/agent.test.ts +0 -638
- package/test/bun.test.ts +0 -53
- package/test/cli/github-action.test.ts +0 -129
- package/test/cli/github-remote.test.ts +0 -80
- package/test/cli/tui/transcript.test.ts +0 -297
- package/test/config/agent-color.test.ts +0 -66
- package/test/config/config.test.ts +0 -1414
- package/test/config/fixtures/empty-frontmatter.md +0 -4
- package/test/config/fixtures/frontmatter.md +0 -28
- package/test/config/fixtures/no-frontmatter.md +0 -1
- package/test/config/markdown.test.ts +0 -192
- package/test/file/ignore.test.ts +0 -10
- package/test/file/path-traversal.test.ts +0 -198
- package/test/fixture/fixture.ts +0 -45
- package/test/fixture/lsp/fake-lsp-server.js +0 -77
- package/test/ide/ide.test.ts +0 -82
- package/test/keybind.test.ts +0 -421
- package/test/lsp/client.test.ts +0 -95
- package/test/mcp/headers.test.ts +0 -153
- package/test/mcp/oauth-browser.test.ts +0 -261
- package/test/patch/patch.test.ts +0 -348
- package/test/permission/arity.test.ts +0 -33
- package/test/permission/next.test.ts +0 -652
- package/test/permission-task.test.ts +0 -319
- package/test/plugin/codex.test.ts +0 -123
- package/test/preload.ts +0 -65
- package/test/project/project.test.ts +0 -120
- package/test/provider/amazon-bedrock.test.ts +0 -268
- package/test/provider/gitlab-duo.test.ts +0 -286
- package/test/provider/provider.test.ts +0 -2149
- package/test/provider/transform.test.ts +0 -1596
- package/test/question/question.test.ts +0 -300
- package/test/scheduler.test.ts +0 -73
- package/test/server/session-list.test.ts +0 -39
- package/test/server/session-select.test.ts +0 -78
- package/test/session/compaction.test.ts +0 -293
- package/test/session/llm.test.ts +0 -90
- package/test/session/message-v2.test.ts +0 -662
- package/test/session/retry.test.ts +0 -131
- package/test/session/revert-compact.test.ts +0 -285
- package/test/session/session.test.ts +0 -71
- package/test/skill/skill.test.ts +0 -185
- package/test/snapshot/snapshot.test.ts +0 -939
- package/test/tool/__snapshots__/tool.test.ts.snap +0 -9
- package/test/tool/apply_patch.test.ts +0 -515
- package/test/tool/bash.test.ts +0 -320
- package/test/tool/external-directory.test.ts +0 -126
- package/test/tool/fixtures/large-image.png +0 -0
- package/test/tool/fixtures/models-api.json +0 -33453
- package/test/tool/grep.test.ts +0 -109
- package/test/tool/question.test.ts +0 -105
- package/test/tool/read.test.ts +0 -332
- package/test/tool/registry.test.ts +0 -76
- package/test/tool/truncation.test.ts +0 -159
- package/test/util/filesystem.test.ts +0 -39
- package/test/util/format.test.ts +0 -59
- package/test/util/iife.test.ts +0 -36
- package/test/util/lazy.test.ts +0 -50
- package/test/util/lock.test.ts +0 -72
- package/test/util/timeout.test.ts +0 -21
- package/test/util/wildcard.test.ts +0 -75
- package/tsconfig.json +0 -16
package/src/cli/cmd/agent.ts
DELETED
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
import { cmd } from "./cmd"
|
|
2
|
-
import * as prompts from "@clack/prompts"
|
|
3
|
-
import { UI } from "../ui"
|
|
4
|
-
import { Global } from "../../global"
|
|
5
|
-
import { Agent } from "../../agent/agent"
|
|
6
|
-
import { Provider } from "../../provider/provider"
|
|
7
|
-
import path from "path"
|
|
8
|
-
import fs from "fs/promises"
|
|
9
|
-
import matter from "gray-matter"
|
|
10
|
-
import { Instance } from "../../project/instance"
|
|
11
|
-
import { EOL } from "os"
|
|
12
|
-
import type { Argv } from "yargs"
|
|
13
|
-
|
|
14
|
-
type AgentMode = "all" | "primary" | "subagent"
|
|
15
|
-
|
|
16
|
-
const AVAILABLE_TOOLS = [
|
|
17
|
-
"bash",
|
|
18
|
-
"read",
|
|
19
|
-
"write",
|
|
20
|
-
"edit",
|
|
21
|
-
"list",
|
|
22
|
-
"glob",
|
|
23
|
-
"grep",
|
|
24
|
-
"webfetch",
|
|
25
|
-
"task",
|
|
26
|
-
"todowrite",
|
|
27
|
-
"todoread",
|
|
28
|
-
]
|
|
29
|
-
|
|
30
|
-
const AgentCreateCommand = cmd({
|
|
31
|
-
command: "create",
|
|
32
|
-
describe: "create a new agent",
|
|
33
|
-
builder: (yargs: Argv) =>
|
|
34
|
-
yargs
|
|
35
|
-
.option("path", {
|
|
36
|
-
type: "string",
|
|
37
|
-
describe: "directory path to generate the agent file",
|
|
38
|
-
})
|
|
39
|
-
.option("description", {
|
|
40
|
-
type: "string",
|
|
41
|
-
describe: "what the agent should do",
|
|
42
|
-
})
|
|
43
|
-
.option("mode", {
|
|
44
|
-
type: "string",
|
|
45
|
-
describe: "agent mode",
|
|
46
|
-
choices: ["all", "primary", "subagent"] as const,
|
|
47
|
-
})
|
|
48
|
-
.option("tools", {
|
|
49
|
-
type: "string",
|
|
50
|
-
describe: `comma-separated list of tools to enable (default: all). Available: "${AVAILABLE_TOOLS.join(", ")}"`,
|
|
51
|
-
})
|
|
52
|
-
.option("model", {
|
|
53
|
-
type: "string",
|
|
54
|
-
alias: ["m"],
|
|
55
|
-
describe: "model to use in the format of provider/model",
|
|
56
|
-
}),
|
|
57
|
-
async handler(args) {
|
|
58
|
-
await Instance.provide({
|
|
59
|
-
directory: process.cwd(),
|
|
60
|
-
async fn() {
|
|
61
|
-
const cliPath = args.path
|
|
62
|
-
const cliDescription = args.description
|
|
63
|
-
const cliMode = args.mode as AgentMode | undefined
|
|
64
|
-
const cliTools = args.tools
|
|
65
|
-
|
|
66
|
-
const isFullyNonInteractive = cliPath && cliDescription && cliMode && cliTools !== undefined
|
|
67
|
-
|
|
68
|
-
if (!isFullyNonInteractive) {
|
|
69
|
-
UI.empty()
|
|
70
|
-
prompts.intro("Create agent")
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const project = Instance.project
|
|
74
|
-
|
|
75
|
-
// Determine scope/path
|
|
76
|
-
let targetPath: string
|
|
77
|
-
if (cliPath) {
|
|
78
|
-
targetPath = path.join(cliPath, "agent")
|
|
79
|
-
} else {
|
|
80
|
-
let scope: "global" | "project" = "global"
|
|
81
|
-
if (project.vcs === "git") {
|
|
82
|
-
const scopeResult = await prompts.select({
|
|
83
|
-
message: "Location",
|
|
84
|
-
options: [
|
|
85
|
-
{
|
|
86
|
-
label: "Current project",
|
|
87
|
-
value: "project" as const,
|
|
88
|
-
hint: Instance.worktree,
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
label: "Global",
|
|
92
|
-
value: "global" as const,
|
|
93
|
-
hint: Global.Path.config,
|
|
94
|
-
},
|
|
95
|
-
],
|
|
96
|
-
})
|
|
97
|
-
if (prompts.isCancel(scopeResult)) throw new UI.CancelledError()
|
|
98
|
-
scope = scopeResult
|
|
99
|
-
}
|
|
100
|
-
targetPath = path.join(
|
|
101
|
-
scope === "global" ? Global.Path.config : path.join(Instance.worktree, ".opencode"),
|
|
102
|
-
"agent",
|
|
103
|
-
)
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// Get description
|
|
107
|
-
let description: string
|
|
108
|
-
if (cliDescription) {
|
|
109
|
-
description = cliDescription
|
|
110
|
-
} else {
|
|
111
|
-
const query = await prompts.text({
|
|
112
|
-
message: "Description",
|
|
113
|
-
placeholder: "What should this agent do?",
|
|
114
|
-
validate: (x) => (x && x.length > 0 ? undefined : "Required"),
|
|
115
|
-
})
|
|
116
|
-
if (prompts.isCancel(query)) throw new UI.CancelledError()
|
|
117
|
-
description = query
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Generate agent
|
|
121
|
-
const spinner = prompts.spinner()
|
|
122
|
-
spinner.start("Generating agent configuration...")
|
|
123
|
-
const model = args.model ? Provider.parseModel(args.model) : undefined
|
|
124
|
-
const generated = await Agent.generate({ description, model }).catch((error) => {
|
|
125
|
-
spinner.stop(`LLM failed to generate agent: ${error.message}`, 1)
|
|
126
|
-
if (isFullyNonInteractive) process.exit(1)
|
|
127
|
-
throw new UI.CancelledError()
|
|
128
|
-
})
|
|
129
|
-
spinner.stop(`Agent ${generated.identifier} generated`)
|
|
130
|
-
|
|
131
|
-
// Select tools
|
|
132
|
-
let selectedTools: string[]
|
|
133
|
-
if (cliTools !== undefined) {
|
|
134
|
-
selectedTools = cliTools ? cliTools.split(",").map((t) => t.trim()) : AVAILABLE_TOOLS
|
|
135
|
-
} else {
|
|
136
|
-
const result = await prompts.multiselect({
|
|
137
|
-
message: "Select tools to enable",
|
|
138
|
-
options: AVAILABLE_TOOLS.map((tool) => ({
|
|
139
|
-
label: tool,
|
|
140
|
-
value: tool,
|
|
141
|
-
})),
|
|
142
|
-
initialValues: AVAILABLE_TOOLS,
|
|
143
|
-
})
|
|
144
|
-
if (prompts.isCancel(result)) throw new UI.CancelledError()
|
|
145
|
-
selectedTools = result
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// Get mode
|
|
149
|
-
let mode: AgentMode
|
|
150
|
-
if (cliMode) {
|
|
151
|
-
mode = cliMode
|
|
152
|
-
} else {
|
|
153
|
-
const modeResult = await prompts.select({
|
|
154
|
-
message: "Agent mode",
|
|
155
|
-
options: [
|
|
156
|
-
{
|
|
157
|
-
label: "All",
|
|
158
|
-
value: "all" as const,
|
|
159
|
-
hint: "Can function in both primary and subagent roles",
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
label: "Primary",
|
|
163
|
-
value: "primary" as const,
|
|
164
|
-
hint: "Acts as a primary/main agent",
|
|
165
|
-
},
|
|
166
|
-
{
|
|
167
|
-
label: "Subagent",
|
|
168
|
-
value: "subagent" as const,
|
|
169
|
-
hint: "Can be used as a subagent by other agents",
|
|
170
|
-
},
|
|
171
|
-
],
|
|
172
|
-
initialValue: "all" as const,
|
|
173
|
-
})
|
|
174
|
-
if (prompts.isCancel(modeResult)) throw new UI.CancelledError()
|
|
175
|
-
mode = modeResult
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
// Build tools config
|
|
179
|
-
const tools: Record<string, boolean> = {}
|
|
180
|
-
for (const tool of AVAILABLE_TOOLS) {
|
|
181
|
-
if (!selectedTools.includes(tool)) {
|
|
182
|
-
tools[tool] = false
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// Build frontmatter
|
|
187
|
-
const frontmatter: {
|
|
188
|
-
description: string
|
|
189
|
-
mode: AgentMode
|
|
190
|
-
tools?: Record<string, boolean>
|
|
191
|
-
} = {
|
|
192
|
-
description: generated.whenToUse,
|
|
193
|
-
mode,
|
|
194
|
-
}
|
|
195
|
-
if (Object.keys(tools).length > 0) {
|
|
196
|
-
frontmatter.tools = tools
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// Write file
|
|
200
|
-
const content = matter.stringify(generated.systemPrompt, frontmatter)
|
|
201
|
-
const filePath = path.join(targetPath, `${generated.identifier}.md`)
|
|
202
|
-
|
|
203
|
-
await fs.mkdir(targetPath, { recursive: true })
|
|
204
|
-
|
|
205
|
-
const file = Bun.file(filePath)
|
|
206
|
-
if (await file.exists()) {
|
|
207
|
-
if (isFullyNonInteractive) {
|
|
208
|
-
console.error(`Error: Agent file already exists: ${filePath}`)
|
|
209
|
-
process.exit(1)
|
|
210
|
-
}
|
|
211
|
-
prompts.log.error(`Agent file already exists: ${filePath}`)
|
|
212
|
-
throw new UI.CancelledError()
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
await Bun.write(filePath, content)
|
|
216
|
-
|
|
217
|
-
if (isFullyNonInteractive) {
|
|
218
|
-
console.log(filePath)
|
|
219
|
-
} else {
|
|
220
|
-
prompts.log.success(`Agent created: ${filePath}`)
|
|
221
|
-
prompts.outro("Done")
|
|
222
|
-
}
|
|
223
|
-
},
|
|
224
|
-
})
|
|
225
|
-
},
|
|
226
|
-
})
|
|
227
|
-
|
|
228
|
-
const AgentListCommand = cmd({
|
|
229
|
-
command: "list",
|
|
230
|
-
describe: "list all available agents",
|
|
231
|
-
async handler() {
|
|
232
|
-
await Instance.provide({
|
|
233
|
-
directory: process.cwd(),
|
|
234
|
-
async fn() {
|
|
235
|
-
const agents = await Agent.list()
|
|
236
|
-
const sortedAgents = agents.sort((a, b) => {
|
|
237
|
-
if (a.native !== b.native) {
|
|
238
|
-
return a.native ? -1 : 1
|
|
239
|
-
}
|
|
240
|
-
return a.name.localeCompare(b.name)
|
|
241
|
-
})
|
|
242
|
-
|
|
243
|
-
for (const agent of sortedAgents) {
|
|
244
|
-
process.stdout.write(`${agent.name} (${agent.mode})` + EOL)
|
|
245
|
-
process.stdout.write(` ${JSON.stringify(agent.permission, null, 2)}` + EOL)
|
|
246
|
-
}
|
|
247
|
-
},
|
|
248
|
-
})
|
|
249
|
-
},
|
|
250
|
-
})
|
|
251
|
-
|
|
252
|
-
export const AgentCommand = cmd({
|
|
253
|
-
command: "agent",
|
|
254
|
-
describe: "manage agents",
|
|
255
|
-
builder: (yargs) => yargs.command(AgentCreateCommand).command(AgentListCommand).demandCommand(),
|
|
256
|
-
async handler() {},
|
|
257
|
-
})
|
package/src/cli/cmd/auth.ts
DELETED
|
@@ -1,400 +0,0 @@
|
|
|
1
|
-
import { Auth } from "../../auth"
|
|
2
|
-
import { cmd } from "./cmd"
|
|
3
|
-
import * as prompts from "@clack/prompts"
|
|
4
|
-
import { UI } from "../ui"
|
|
5
|
-
import { ModelsDev } from "../../provider/models"
|
|
6
|
-
import { map, pipe, sortBy, values } from "remeda"
|
|
7
|
-
import path from "path"
|
|
8
|
-
import os from "os"
|
|
9
|
-
import { Config } from "../../config/config"
|
|
10
|
-
import { Global } from "../../global"
|
|
11
|
-
import { Plugin } from "../../plugin"
|
|
12
|
-
import { Instance } from "../../project/instance"
|
|
13
|
-
import type { Hooks } from "@opencode-ai/plugin"
|
|
14
|
-
|
|
15
|
-
type PluginAuth = NonNullable<Hooks["auth"]>
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Handle plugin-based authentication flow.
|
|
19
|
-
* Returns true if auth was handled, false if it should fall through to default handling.
|
|
20
|
-
*/
|
|
21
|
-
async function handlePluginAuth(plugin: { auth: PluginAuth }, provider: string): Promise<boolean> {
|
|
22
|
-
let index = 0
|
|
23
|
-
if (plugin.auth.methods.length > 1) {
|
|
24
|
-
const method = await prompts.select({
|
|
25
|
-
message: "Login method",
|
|
26
|
-
options: [
|
|
27
|
-
...plugin.auth.methods.map((x, index) => ({
|
|
28
|
-
label: x.label,
|
|
29
|
-
value: index.toString(),
|
|
30
|
-
})),
|
|
31
|
-
],
|
|
32
|
-
})
|
|
33
|
-
if (prompts.isCancel(method)) throw new UI.CancelledError()
|
|
34
|
-
index = parseInt(method)
|
|
35
|
-
}
|
|
36
|
-
const method = plugin.auth.methods[index]
|
|
37
|
-
|
|
38
|
-
// Handle prompts for all auth types
|
|
39
|
-
await Bun.sleep(10)
|
|
40
|
-
const inputs: Record<string, string> = {}
|
|
41
|
-
if (method.prompts) {
|
|
42
|
-
for (const prompt of method.prompts) {
|
|
43
|
-
if (prompt.condition && !prompt.condition(inputs)) {
|
|
44
|
-
continue
|
|
45
|
-
}
|
|
46
|
-
if (prompt.type === "select") {
|
|
47
|
-
const value = await prompts.select({
|
|
48
|
-
message: prompt.message,
|
|
49
|
-
options: prompt.options,
|
|
50
|
-
})
|
|
51
|
-
if (prompts.isCancel(value)) throw new UI.CancelledError()
|
|
52
|
-
inputs[prompt.key] = value
|
|
53
|
-
} else {
|
|
54
|
-
const value = await prompts.text({
|
|
55
|
-
message: prompt.message,
|
|
56
|
-
placeholder: prompt.placeholder,
|
|
57
|
-
validate: prompt.validate ? (v) => prompt.validate!(v ?? "") : undefined,
|
|
58
|
-
})
|
|
59
|
-
if (prompts.isCancel(value)) throw new UI.CancelledError()
|
|
60
|
-
inputs[prompt.key] = value
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
if (method.type === "oauth") {
|
|
66
|
-
const authorize = await method.authorize(inputs)
|
|
67
|
-
|
|
68
|
-
if (authorize.url) {
|
|
69
|
-
prompts.log.info("Go to: " + authorize.url)
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (authorize.method === "auto") {
|
|
73
|
-
if (authorize.instructions) {
|
|
74
|
-
prompts.log.info(authorize.instructions)
|
|
75
|
-
}
|
|
76
|
-
const spinner = prompts.spinner()
|
|
77
|
-
spinner.start("Waiting for authorization...")
|
|
78
|
-
const result = await authorize.callback()
|
|
79
|
-
if (result.type === "failed") {
|
|
80
|
-
spinner.stop("Failed to authorize", 1)
|
|
81
|
-
}
|
|
82
|
-
if (result.type === "success") {
|
|
83
|
-
const saveProvider = result.provider ?? provider
|
|
84
|
-
if ("refresh" in result) {
|
|
85
|
-
const { type: _, provider: __, refresh, access, expires, ...extraFields } = result
|
|
86
|
-
await Auth.set(saveProvider, {
|
|
87
|
-
type: "oauth",
|
|
88
|
-
refresh,
|
|
89
|
-
access,
|
|
90
|
-
expires,
|
|
91
|
-
...extraFields,
|
|
92
|
-
})
|
|
93
|
-
}
|
|
94
|
-
if ("key" in result) {
|
|
95
|
-
await Auth.set(saveProvider, {
|
|
96
|
-
type: "api",
|
|
97
|
-
key: result.key,
|
|
98
|
-
})
|
|
99
|
-
}
|
|
100
|
-
spinner.stop("Login successful")
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (authorize.method === "code") {
|
|
105
|
-
const code = await prompts.text({
|
|
106
|
-
message: "Paste the authorization code here: ",
|
|
107
|
-
validate: (x) => (x && x.length > 0 ? undefined : "Required"),
|
|
108
|
-
})
|
|
109
|
-
if (prompts.isCancel(code)) throw new UI.CancelledError()
|
|
110
|
-
const result = await authorize.callback(code)
|
|
111
|
-
if (result.type === "failed") {
|
|
112
|
-
prompts.log.error("Failed to authorize")
|
|
113
|
-
}
|
|
114
|
-
if (result.type === "success") {
|
|
115
|
-
const saveProvider = result.provider ?? provider
|
|
116
|
-
if ("refresh" in result) {
|
|
117
|
-
const { type: _, provider: __, refresh, access, expires, ...extraFields } = result
|
|
118
|
-
await Auth.set(saveProvider, {
|
|
119
|
-
type: "oauth",
|
|
120
|
-
refresh,
|
|
121
|
-
access,
|
|
122
|
-
expires,
|
|
123
|
-
...extraFields,
|
|
124
|
-
})
|
|
125
|
-
}
|
|
126
|
-
if ("key" in result) {
|
|
127
|
-
await Auth.set(saveProvider, {
|
|
128
|
-
type: "api",
|
|
129
|
-
key: result.key,
|
|
130
|
-
})
|
|
131
|
-
}
|
|
132
|
-
prompts.log.success("Login successful")
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
prompts.outro("Done")
|
|
137
|
-
return true
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
if (method.type === "api") {
|
|
141
|
-
if (method.authorize) {
|
|
142
|
-
const result = await method.authorize(inputs)
|
|
143
|
-
if (result.type === "failed") {
|
|
144
|
-
prompts.log.error("Failed to authorize")
|
|
145
|
-
}
|
|
146
|
-
if (result.type === "success") {
|
|
147
|
-
const saveProvider = result.provider ?? provider
|
|
148
|
-
await Auth.set(saveProvider, {
|
|
149
|
-
type: "api",
|
|
150
|
-
key: result.key,
|
|
151
|
-
})
|
|
152
|
-
prompts.log.success("Login successful")
|
|
153
|
-
}
|
|
154
|
-
prompts.outro("Done")
|
|
155
|
-
return true
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
return false
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
export const AuthCommand = cmd({
|
|
163
|
-
command: "auth",
|
|
164
|
-
describe: "manage credentials",
|
|
165
|
-
builder: (yargs) =>
|
|
166
|
-
yargs.command(AuthLoginCommand).command(AuthLogoutCommand).command(AuthListCommand).demandCommand(),
|
|
167
|
-
async handler() {},
|
|
168
|
-
})
|
|
169
|
-
|
|
170
|
-
export const AuthListCommand = cmd({
|
|
171
|
-
command: "list",
|
|
172
|
-
aliases: ["ls"],
|
|
173
|
-
describe: "list providers",
|
|
174
|
-
async handler() {
|
|
175
|
-
UI.empty()
|
|
176
|
-
const authPath = path.join(Global.Path.data, "auth.json")
|
|
177
|
-
const homedir = os.homedir()
|
|
178
|
-
const displayPath = authPath.startsWith(homedir) ? authPath.replace(homedir, "~") : authPath
|
|
179
|
-
prompts.intro(`Credentials ${UI.Style.TEXT_DIM}${displayPath}`)
|
|
180
|
-
const results = Object.entries(await Auth.all())
|
|
181
|
-
const database = await ModelsDev.get()
|
|
182
|
-
|
|
183
|
-
for (const [providerID, result] of results) {
|
|
184
|
-
const name = database[providerID]?.name || providerID
|
|
185
|
-
prompts.log.info(`${name} ${UI.Style.TEXT_DIM}${result.type}`)
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
prompts.outro(`${results.length} credentials`)
|
|
189
|
-
|
|
190
|
-
// Environment variables section
|
|
191
|
-
const activeEnvVars: Array<{ provider: string; envVar: string }> = []
|
|
192
|
-
|
|
193
|
-
for (const [providerID, provider] of Object.entries(database)) {
|
|
194
|
-
for (const envVar of provider.env) {
|
|
195
|
-
if (process.env[envVar]) {
|
|
196
|
-
activeEnvVars.push({
|
|
197
|
-
provider: provider.name || providerID,
|
|
198
|
-
envVar,
|
|
199
|
-
})
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
if (activeEnvVars.length > 0) {
|
|
205
|
-
UI.empty()
|
|
206
|
-
prompts.intro("Environment")
|
|
207
|
-
|
|
208
|
-
for (const { provider, envVar } of activeEnvVars) {
|
|
209
|
-
prompts.log.info(`${provider} ${UI.Style.TEXT_DIM}${envVar}`)
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
prompts.outro(`${activeEnvVars.length} environment variable` + (activeEnvVars.length === 1 ? "" : "s"))
|
|
213
|
-
}
|
|
214
|
-
},
|
|
215
|
-
})
|
|
216
|
-
|
|
217
|
-
export const AuthLoginCommand = cmd({
|
|
218
|
-
command: "login [url]",
|
|
219
|
-
describe: "log in to a provider",
|
|
220
|
-
builder: (yargs) =>
|
|
221
|
-
yargs.positional("url", {
|
|
222
|
-
describe: "opencode auth provider",
|
|
223
|
-
type: "string",
|
|
224
|
-
}),
|
|
225
|
-
async handler(args) {
|
|
226
|
-
await Instance.provide({
|
|
227
|
-
directory: process.cwd(),
|
|
228
|
-
async fn() {
|
|
229
|
-
UI.empty()
|
|
230
|
-
prompts.intro("Add credential")
|
|
231
|
-
if (args.url) {
|
|
232
|
-
const wellknown = await fetch(`${args.url}/.well-known/opencode`).then((x) => x.json() as any)
|
|
233
|
-
prompts.log.info(`Running \`${wellknown.auth.command.join(" ")}\``)
|
|
234
|
-
const proc = Bun.spawn({
|
|
235
|
-
cmd: wellknown.auth.command,
|
|
236
|
-
stdout: "pipe",
|
|
237
|
-
})
|
|
238
|
-
const exit = await proc.exited
|
|
239
|
-
if (exit !== 0) {
|
|
240
|
-
prompts.log.error("Failed")
|
|
241
|
-
prompts.outro("Done")
|
|
242
|
-
return
|
|
243
|
-
}
|
|
244
|
-
const token = await new Response(proc.stdout).text()
|
|
245
|
-
await Auth.set(args.url, {
|
|
246
|
-
type: "wellknown",
|
|
247
|
-
key: wellknown.auth.env,
|
|
248
|
-
token: token.trim(),
|
|
249
|
-
})
|
|
250
|
-
prompts.log.success("Logged into " + args.url)
|
|
251
|
-
prompts.outro("Done")
|
|
252
|
-
return
|
|
253
|
-
}
|
|
254
|
-
await ModelsDev.refresh().catch(() => {})
|
|
255
|
-
|
|
256
|
-
const config = await Config.get()
|
|
257
|
-
|
|
258
|
-
const disabled = new Set(config.disabled_providers ?? [])
|
|
259
|
-
const enabled = config.enabled_providers ? new Set(config.enabled_providers) : undefined
|
|
260
|
-
|
|
261
|
-
const providers = await ModelsDev.get().then((x) => {
|
|
262
|
-
const filtered: Record<string, (typeof x)[string]> = {}
|
|
263
|
-
for (const [key, value] of Object.entries(x)) {
|
|
264
|
-
if ((enabled ? enabled.has(key) : true) && !disabled.has(key)) {
|
|
265
|
-
filtered[key] = value
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
return filtered
|
|
269
|
-
})
|
|
270
|
-
|
|
271
|
-
const priority: Record<string, number> = {
|
|
272
|
-
opencode: 0,
|
|
273
|
-
anthropic: 1,
|
|
274
|
-
"github-copilot": 2,
|
|
275
|
-
openai: 3,
|
|
276
|
-
google: 4,
|
|
277
|
-
openrouter: 5,
|
|
278
|
-
vercel: 6,
|
|
279
|
-
}
|
|
280
|
-
let provider = await prompts.autocomplete({
|
|
281
|
-
message: "Select provider",
|
|
282
|
-
maxItems: 8,
|
|
283
|
-
options: [
|
|
284
|
-
...pipe(
|
|
285
|
-
providers,
|
|
286
|
-
values(),
|
|
287
|
-
sortBy(
|
|
288
|
-
(x) => priority[x.id] ?? 99,
|
|
289
|
-
(x) => x.name ?? x.id,
|
|
290
|
-
),
|
|
291
|
-
map((x) => ({
|
|
292
|
-
label: x.name,
|
|
293
|
-
value: x.id,
|
|
294
|
-
hint: {
|
|
295
|
-
opencode: "recommended",
|
|
296
|
-
anthropic: "Claude Max or API key",
|
|
297
|
-
openai: "ChatGPT Plus/Pro or API key",
|
|
298
|
-
}[x.id],
|
|
299
|
-
})),
|
|
300
|
-
),
|
|
301
|
-
{
|
|
302
|
-
value: "other",
|
|
303
|
-
label: "Other",
|
|
304
|
-
},
|
|
305
|
-
],
|
|
306
|
-
})
|
|
307
|
-
|
|
308
|
-
if (prompts.isCancel(provider)) throw new UI.CancelledError()
|
|
309
|
-
|
|
310
|
-
const plugin = await Plugin.list().then((x) => x.find((x) => x.auth?.provider === provider))
|
|
311
|
-
if (plugin && plugin.auth) {
|
|
312
|
-
const handled = await handlePluginAuth({ auth: plugin.auth }, provider)
|
|
313
|
-
if (handled) return
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
if (provider === "other") {
|
|
317
|
-
provider = await prompts.text({
|
|
318
|
-
message: "Enter provider id",
|
|
319
|
-
validate: (x) => (x && x.match(/^[0-9a-z-]+$/) ? undefined : "a-z, 0-9 and hyphens only"),
|
|
320
|
-
})
|
|
321
|
-
if (prompts.isCancel(provider)) throw new UI.CancelledError()
|
|
322
|
-
provider = provider.replace(/^@ai-sdk\//, "")
|
|
323
|
-
if (prompts.isCancel(provider)) throw new UI.CancelledError()
|
|
324
|
-
|
|
325
|
-
// Check if a plugin provides auth for this custom provider
|
|
326
|
-
const customPlugin = await Plugin.list().then((x) => x.find((x) => x.auth?.provider === provider))
|
|
327
|
-
if (customPlugin && customPlugin.auth) {
|
|
328
|
-
const handled = await handlePluginAuth({ auth: customPlugin.auth }, provider)
|
|
329
|
-
if (handled) return
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
prompts.log.warn(
|
|
333
|
-
`This only stores a credential for ${provider} - you will need configure it in opencode.json, check the docs for examples.`,
|
|
334
|
-
)
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
if (provider === "amazon-bedrock") {
|
|
338
|
-
prompts.log.info(
|
|
339
|
-
"Amazon Bedrock authentication priority:\n" +
|
|
340
|
-
" 1. Bearer token (AWS_BEARER_TOKEN_BEDROCK or /connect)\n" +
|
|
341
|
-
" 2. AWS credential chain (profile, access keys, IAM roles, EKS IRSA)\n\n" +
|
|
342
|
-
"Configure via opencode.json options (profile, region, endpoint) or\n" +
|
|
343
|
-
"AWS environment variables (AWS_PROFILE, AWS_REGION, AWS_ACCESS_KEY_ID, AWS_WEB_IDENTITY_TOKEN_FILE).",
|
|
344
|
-
)
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
if (provider === "opencode") {
|
|
348
|
-
prompts.log.info("Create an api key at https://opencode.ai/auth")
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
if (provider === "vercel") {
|
|
352
|
-
prompts.log.info("You can create an api key at https://vercel.link/ai-gateway-token")
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
if (["cloudflare", "cloudflare-ai-gateway"].includes(provider)) {
|
|
356
|
-
prompts.log.info(
|
|
357
|
-
"Cloudflare AI Gateway can be configured with CLOUDFLARE_GATEWAY_ID, CLOUDFLARE_ACCOUNT_ID, and CLOUDFLARE_API_TOKEN environment variables. Read more: https://opencode.ai/docs/providers/#cloudflare-ai-gateway",
|
|
358
|
-
)
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
const key = await prompts.password({
|
|
362
|
-
message: "Enter your API key",
|
|
363
|
-
validate: (x) => (x && x.length > 0 ? undefined : "Required"),
|
|
364
|
-
})
|
|
365
|
-
if (prompts.isCancel(key)) throw new UI.CancelledError()
|
|
366
|
-
await Auth.set(provider, {
|
|
367
|
-
type: "api",
|
|
368
|
-
key,
|
|
369
|
-
})
|
|
370
|
-
|
|
371
|
-
prompts.outro("Done")
|
|
372
|
-
},
|
|
373
|
-
})
|
|
374
|
-
},
|
|
375
|
-
})
|
|
376
|
-
|
|
377
|
-
export const AuthLogoutCommand = cmd({
|
|
378
|
-
command: "logout",
|
|
379
|
-
describe: "log out from a configured provider",
|
|
380
|
-
async handler() {
|
|
381
|
-
UI.empty()
|
|
382
|
-
const credentials = await Auth.all().then((x) => Object.entries(x))
|
|
383
|
-
prompts.intro("Remove credential")
|
|
384
|
-
if (credentials.length === 0) {
|
|
385
|
-
prompts.log.error("No credentials found")
|
|
386
|
-
return
|
|
387
|
-
}
|
|
388
|
-
const database = await ModelsDev.get()
|
|
389
|
-
const providerID = await prompts.select({
|
|
390
|
-
message: "Select provider",
|
|
391
|
-
options: credentials.map(([key, value]) => ({
|
|
392
|
-
label: (database[key]?.name || key) + UI.Style.TEXT_DIM + " (" + value.type + ")",
|
|
393
|
-
value: key,
|
|
394
|
-
})),
|
|
395
|
-
})
|
|
396
|
-
if (prompts.isCancel(providerID)) throw new UI.CancelledError()
|
|
397
|
-
await Auth.remove(providerID)
|
|
398
|
-
prompts.outro("Logout successful")
|
|
399
|
-
},
|
|
400
|
-
})
|