Files
yetone fa9daa6945 docs: every built-in subscription a plugin serves once moved says so in its code, and AGENTS.md says where a fix for it goes (user: 对内置的订阅 provider 在代码层面和文档层面加上注释,防止又有别的 agent 在改内置订阅 provider 的代码而不知道生效的其实是对应的插件代码) — a moved Cursor, Devin, Grok, Command Code plan, Kiro, Zed, Qoder, Factory, Xiaomi MiMo, ZCode or WorkBuddy (provider.Moved; since v0.1.642 also the default for a new sign-in, provider.Adopt) is signed in, listed, requested and metered by its @magpie-community plugin, and none of the built-in's code in internal/provider/<name>*.go, internal/gateway/<name>.go, internal/zed or internal/qoder serves it; a fix made there alone never reaches those users. Each of those files now opens with a PLUGIN-SERVED notice naming the subscription's id, its plugin package, where the plugin lives (magpie-community/plugins, packages/<name>) and the mover whose min to raise so moved users get the fixed plugin (keepMovedCurrent); Qoder's adds that Qoder CN isn't moved and still runs there. AGENTS.md (CLAUDE.md imports it) lists the moved built-ins with their packages and movers, how to tell whether a user's is moved (move.state "plugin", onPlugins), the order a fix goes in (the plugin, publish, raise min, the built-in only for those not moved), the magpie code that does run for a moved one (internal/plugin, plugins.go, plugin_usage.go, pluginsignin.go, migrate*.go, app.js's subOf/pluginSubs/startPluginSignIn), and the parity tests. movers in migrate.go and SUBS in app.js point there too. TestMovedBuiltinsSayTheirPlugin fails for a mover whose code carries no PLUGIN-SERVED notice naming its id and package (it failed while a wrapped package name was split). Comments and docs only, no behaviour changed. go vet ./internal/..., go build -tags nogui (darwin, GOOS=linux), GOOS=windows go build, go test -tags nogui -count=1 ./... under a temp HOME pass (TestProvidersAnswerWhileListsComeIn and TestClaudeSignedOut failed once on their timing under load, pass alone; untouched).
2026-10-02 19:37:02 +08:00

63 lines
2.0 KiB
Go

package provider
// PLUGIN-SERVED (see AGENTS.md): Zed ("zed") is a deprecated built-in
// subscription served by its plugin, @magpie-community/opencode-zed-auth,
// once moved onto it (provider.Moved; the default for a new sign-in). A
// moved one's sign-ins, models, requests and usage are all the plugin's,
// never this code's (only the move, in migrate*.go, still reads its
// accounts). A fix here alone doesn't reach those users; fix the plugin
// (github.com/magpie-community/plugins, packages/zed) and raise the mover's
// min in internal/provider/migrate_zed.go.
// What a Zed account says of its plan. Zed tells its editor the plan and its
// billing period, not how much of the model allowance is spent, so that is
// all magpie can show: the plan's name, when the period ends, and a plan
// Zed won't serve (overdue invoices) as the error it is.
import (
"context"
"time"
"github.com/yetone/magpie/internal/zed"
)
func zedLoginQuota(ctx context.Context, l Login) SubscriptionQuota {
q := SubscriptionQuota{Provider: "zed", Name: "Zed", Icon: "zed", Plan: l.Plan, User: l.User, Windows: []QuotaWindow{}}
c, ok := zedLookup(l.User)
if !ok {
q.Error = "no such Zed account"
return q
}
ctx, cancel := context.WithTimeout(ctx, 15*time.Second)
defer cancel()
me, err := zed.FetchMe(ctx, zedClient, zedCloud, c.UserID, c.Access, c.SystemID)
if err != nil {
if zedRefused(err) {
err = zedLapse(l.User)
}
q.Error = err.Error()
return q
}
org := c.Org
if org == "" {
org = me.Org()
}
plan := me.PlanID(org)
q.Plan = zed.PlanName(plan)
if plan != c.Plan {
_ = zedEdit(l.User, func(c *zedCreds, s *savedLogin) { c.Plan, s.Plan = plan, q.Plan })
}
if p := me.Plan.SubscriptionPeriod; p != nil {
if at, err := time.Parse(time.RFC3339, p.EndedAt); err == nil {
q.Until = &at
}
}
switch {
case me.Plan.HasOverdueInvoice:
q.Error = "Zed: this account has an overdue invoice, so its models are paused (see zed.dev/account)"
case plan == "zed_free" || plan == "":
q.Plan = "No plan"
}
return q
}