Files
yetone 52c8e838d2 providers, sign-in, tray, plugins: four of StringKe's reports on Discord — (1) Removing a provider left its editor open and listed, and a second Remove said there was no such provider: the removal had been made, but moving the agents off its models failed on one agent whose config couldn't be written, and Reseat returned that as the change's error; now such an agent is a move with its error ("still on X, not moved: …", a warning in the panel, a line in the CLI and TUI), the others are moved, and the panel, told a delete failed, re-reads the list and closes the editor when the provider is gone. (2) The sign-in waiting sheet shows the sign-in link itself, selected whole on a click, with a copy button, for a browser other than the one that opens. (3) A subscription with several accounts offers "Account in use" among the menu bar's usages, following the account the gateway goes to first. (4) The Antigravity plugin's sign-in never started: magpie called every plugin's authorize with an inputs object, the way OpenCode's CLI does, and opencode-antigravity-auth then asked its Project ID on the terminal — magpie's stdin — until the minute ran out; inputs now go only to a method with prompts, as OpenCode's TUI passes them (checked against the real package under Bun in a sandbox: the Google sign-in URL comes back at once). TestReseatUnmovable, TestTrayInUse, TestInUseOf, TestAuthorizeNoPrompts, provider-remove.test.cjs, signin-link.test.cjs and tray-inuse.test.cjs fail without the change. go vet, go build -tags nogui (darwin, GOOS=linux), GOOS=windows go build, go test -tags nogui ./... pass; click-scroll, old-webkit, tray-usages, plugin-signin, signin-callback, factory-sub pass.
2026-09-30 20:45:23 +08:00

28 lines
1.0 KiB
JavaScript

// A plugin whose OAuth method asks nothing and tells OpenCode's CLI from
// its TUI by the inputs, as opencode-antigravity-auth does: given an object
// (opencode auth login) it asks its questions on the terminal and answers
// only once signed in; given none (/connect) it gives the page to open.
export const CLIFlowPlugin = async () => ({
auth: {
provider: "cliflow",
methods: [
{
type: "oauth",
label: "OAuth",
authorize: async (inputs) => {
if (inputs) {
process.stderr.write("Project ID (leave blank to use your default project): ")
await new Promise(() => {}) // the terminal's answer, never coming
}
return {
url: "https://cliflow.invalid/auth",
instructions: "Paste the code",
method: "code",
callback: async (code) => (code === "good" ? { type: "success", refresh: "r", access: "a", expires: 0, accountId: "me@cliflow" } : { type: "failed" }),
}
},
},
],
},
})