424fd48449
gui tests: usage-refresh-flight and usage-refresh wait for the Overview's figures, not its skeleton — renderUsageLoading fills #stats with four .kpi.loading-kpi tiles while the opening read is on its way, so "#stats .kpi" was found before the page had its numbers; the timer then had nothing to read again (refreshUsage reads only once usage is drawn) and Chromium, quicker to the fast-forward, saw no second request ("in flight: usage x2 (have usage)"). They wait for a tile that isn't a skeleton. The one-in-flight, queued-ask and failure-releases checks are unchanged. Pass in Chromium and WebKit three runs each (usage-refresh in en and zh); failed in Chromium on 6e623d16.
yetone2026-10-06 05:44:14 +08:00
28dd70f61f
gui: a dialog's fields no longer scroll sideways in the Mac app when the dialog scrolls — WebKit laid a framed editor's grid out at the full width and then let the 8px Mac scrollbar (4dab45e3) take its right edge, so a disconnect preview in a 560x420 window ran 8px wide; the bar's room is now always kept, taken out of the right padding, so fields end where they did when nothing scrolls. agent-disconnect-preview measures the body's content box up to the scrollbar (clientWidth) rather than its outer edge; its "no horizontal overflow" check fails in WebKit without the fix and passes with it in Chromium and WebKit, en and zh. account-arrange, editor-short-window, models-free-only, models-fold, names-fold, plugin-market, whats-new, old-webkit and click-scroll pass in both (plugin-move fails in Chromium the same without the change).
yetone2026-10-06 05:41:14 +08:00
2bdb0d0e7b
gui: a session's title on the Sessions page keeps 100px+ in a 420px window when the list scrolls — its row's five 12px gaps (check, title, cost, Resume, terminal, delete) left the title 90px once the page's scrollbar took 10px (WebKit, a long list); narrow rows (≤560px) now have 8px gaps, the title 110px. sessions-usage-open.test.cjs ("its title keeps room to be read") fails in WebKit without it and passes with it in Chromium and WebKit, en and zh; sess-agent-strip, sessions-bar-names, -folder-delete, -manage, -purge, -today, -toolbar, old-webkit and click-scroll pass in both (sessions-overview and sessions-talk fail in WebKit the same on 6e623d16).
yetone2026-10-06 05:30:42 +08:00
aab2e4412a
gui tests: routing-levels and rate-limited-sink wheel the group editor's row into sight before clicking it — the editor grew, so its Levels and Order rows sat at the 1400px window's foot; WebKit's own scroll into view left a 3px sliver above the footer and clicked the footer ("footer intercepts pointer events"). They wheel as the tests' Save already does (the page puts back a scroll the reader didn't make). The click-moves-nothing checks are unchanged. Pass in Chromium and WebKit, en and zh; failed in WebKit on 6e623d16.
yetone2026-10-06 05:21:50 +08:00
b8b7ee507a
gui tests: zcode-site-layout clicks the ZCode app's sign-in where it is, with the mouse — Playwright's own scroll into view moved the 440px window's page by 3px before its click, which the test's "the click scrolled" check caught; a mouse click there moves nothing (probed: #view-providers stays at 442). The no-scroll check is unchanged. Passes in Chromium and WebKit, en and zh, at 440, 700 and 960px; failed on 6e623d16.
yetone2026-10-06 05:18:58 +08:00
becdf36fc3
gui tests: zcode-site starts ZCode's sign-in on the Providers page with its list read — subOf tells a subscription moved onto its plugin from that list (pluginSubs reads providers.plugins), so starting the sign-in on the Agents page before /api/providers was ever read threw and the site step never came. The app only starts a sign-in from the Providers page, which reads the list first. Passes in Chromium and WebKit, en and zh; failed on 6e623d16.
yetone2026-10-06 05:18:58 +08:00
3ab27186c9
cleanup: drop eight functions nothing calls — catalog.ProviderEnv/ProviderAvailable, subscriptionRun.attached, hasTool, kiroSignedIn, SetModelSame (SetModelPrefs calls setModelSame itself; the comments name it), sessions.claudeFiles and plugin.SetConfig. Found with deadcode -test -tags nogui and checked by git grep across .go and .js; the ones only the GUI build or one platform calls stay. vet on darwin, linux, windows; catalog, gateway, provider, sessions and plugin tests pass.
yetone2026-10-06 05:34:29 +08:00
a11a1f2f93
gui tests: session-terminal opens a 1000px-tall window — settings rows were added above the Session terminal row, so in 700px it sat at the foot of #view-settings; Playwright scrolled it in before each click, the scroll closed the menu the first click opened (a menu closes on a scroll), and the second click opened it again ("a second click closes it", Chromium) or found the row out of reach (WebKit). A real click on the open menu's button closes it. Passes in Chromium and WebKit, en and zh; failed on 6e623d16.
yetone2026-10-06 05:04:14 +08:00
80279137d5
gui tests: redact-rule-row expects the phone-width web layout at 640px — f3ba9184 (#391, two days after the test) wraps every web settings row there, so the added rule's Remove sits on the line under its name at the row's right edge; the test checks that at ≤760px and the same-line layout at 1100px. The fields' one-line, flush-edge checks and "the click moved nothing" are unchanged. Passes in Chromium and WebKit, en and zh, both widths; failed at 640px on 6e623d16.
yetone2026-10-06 05:01:51 +08:00
362405aaa1
gui tests: seg-contrast follows ec10d3bd, which took the grey track out from under the light switch (the owner: 这个 tab 栏的背景灰色条有点丑) — in light the white thumb sits on the header and is told off by its shadow, so the test asks for 1.05:1 there plus a thumb edge; dark keeps 1.5:1. Passes in Chromium and WebKit, en and zh; failed on 6e623d16.
yetone2026-10-06 05:01:18 +08:00
daab41b566
gui tests: model-price-tiers types the tier's "over" amount and presses Enter — Chromium's fill selected the box, and its blur's change pre-filled the input price with 1, so the price read "12,5". Passes in Chromium and WebKit, en and zh; failed in Chromium on 6e623d16.
yetone2026-10-06 05:01:18 +08:00
7ca9419bcf
gui tests: lightweight and provider-levels-scroll find their rows where the pages put them now — settings rows were added above Lightweight mode, so in a 700px window its segs sat under the footer (the test's window is 1000px tall); and a model row carries its price under its name, so the fixed scrollTop 260 left model-5 out of sight and Playwright's own scroll moved the list. provider-levels-scroll scrolls each row's levels to mid-list by hand (and throws if it can't), then checks a click moves nothing, as before. Pass in Chromium and WebKit, en and zh; failed on 6e623d16.
yetone2026-10-06 05:01:18 +08:00
82be8c14a5
gui tests: a model chip's right-click settles in Chromium before its menu is read
yetone2026-10-06 04:59:38 +08:00
69665a6960
gui: styles hold up in Safari 15.0–15.3 again (macOS 12, #220) — no :has(), and :focus-visible kept out of selector lists
yetone2026-10-06 04:59:32 +08:00
a3726f657e
gui tests: agent-leave-magpie turns the switch off on its fake server too, so closing the model list (which reads /api/state again) no longer turns it back on under the click
yetone2026-10-06 04:49:53 +08:00
29e1ad2b63
gui tests: name-suffix-where-named waits for the line under "Provider in model names" to follow a pick — the pick is shown at once, and the line is redrawn when settings/plain-names answers (suffixSegs), so in Chromium the test read the old "My Sol · Relay" before the answer came. It now waits up to 2s for the new line, then checks the one post; the no-scroll check is unchanged. Passes in Chromium and WebKit, en and zh; Chromium failed on 6e623d16.
yetone2026-10-06 04:44:27 +08:00
5cdfe5a92d
gui tests: gateway-model-info expects a routing group's tooltip as afc6623c (#885) words it — "Reasoning: low, medium, high (the levels every model in it has)" and "Accepts images (one of its models does)", since #756 one member that sees is enough. Passes in Chromium and WebKit; failed on 6e623d16.
yetone2026-10-06 04:44:27 +08:00
da7144fd06
gui tests: usage-ledger-chart and web-page follow the Requests tab as it is — its strip has a fifth total, Output speed (5464a362, #860), its metrics a fourth, Speed, and its split a "Model · provider" choice second (f506d08d), so the tests' Provider click (nth(1)) picked Model · provider, the many-providers ranking never came, and web-page's hasText "Provider" matched both buttons. usage-ledger-chart names each split's place (SPLIT) and expects the five totals, four metrics and four splits in en and zh; web-page clicks the split whose text is exactly Provider. No click-scroll or layout assertion is changed. Both pass in Chromium and WebKit, en and zh; both failed on 6e623d16.
yetone2026-10-06 04:44:23 +08:00
5a4c69fbdc
docs: contributors.md lists lunar-me under authors reviewed with extra care (the maintainer chose not to block), with the evidence and what the extra care is
yetone2026-10-06 04:52:27 +08:00
6e623d1651
tui: a first run with no model catalog says "… syncing model catalog" while it syncs, and S doesn't start a second sync meanwhile
yetone2026-10-06 04:31:29 +08:00
6b975ea9fd
gui: i18n.js has each Chinese string once, and i18n-keys.test.cjs fails when a language has a key twice
yetone2026-10-06 04:30:32 +08:00
17f790b145
agent: five package-level twins nothing calls are gone — isCodexGateway, ccProviderJSON, fxProvider, hermesProvider and writeMiniMaxEntry
yetone2026-10-06 04:04:47 +08:00
89825eca1a
go.mod: go mod tidy — moejs is required directly (internal/gateway imports it), and go.sum drops testify 1.11.1 and go-spew/go-difflib, which nothing builds with
yetone2026-10-06 04:01:01 +08:00
690d4c921a
ci: a Test run on main finishes instead of being cancelled by the next push, and the workflow's token can only read
yetone2026-10-06 03:56:52 +08:00
fa7a0f23a8
gateway: a streamed reply whose vendor goes quiet keeps its agent alive on a timer of its own, held or passed, so a proxy in front doesn't end it (#947, jorben) — a vendor that sent its 200 and response.created and then nothing had the stream held for its first content with no event to scan, so the agent got no headers at all until it spoke again, and Cloudflare in front of a remote magpie ended the request at 125s (524); a translated reply quiet mid-way was kept alive only as the vendor sent something, and the proxy reset it. holdWriter.watch now runs beside every streamed try (it was only Group.FirstToken's watchFirst): past keepHeldAfter it sends a held try's agent the stream's 200 and SSE comments (keepAlive), none of the try, so another account may still answer in the same stream; once passed, a comment goes between two of its lines after keepaliveEvery of quiet; it stops after keepaliveLongest with nothing from the vendor, and Gemini streams get none (#934). Covers every protocol, relayed or translated. quiet_keepalive_test.go is new (held, mid-reply, failover after keepalives, the 5-minute cap, Responses/Anthropic/Chat relayed and Anthropic from Chat) and fails without the change. go vet, go build (darwin, GOOS=linux nogui, GOOS=windows) and go test -tags nogui ./... under a temp HOME pass (TestUserPath in internal/proc failed once under the full run and passes alone).
yetone2026-10-06 03:39:47 +08:00
9ae796d5b5
docs: contributors.md says what stops a community PR's review for possible harm, what is closed unreviewed and when an author is proposed for blocking, and AGENTS.md links it
yetone2026-10-06 03:50:07 +08:00
4b03eda97c
docs: LESSONS.md gets the review of 10-06's commits — five lessons seen a second day (siblings, both engines and ja/de, red tests that weren't load, one goal per commit) and a new one: fix what an error is about, not only its label
yetone2026-10-06 03:49:31 +08:00
34bfb9cab5
gui: the Japanese "RTK can't be given to {agent}" has the English string's placeholders again
yetone2026-10-06 03:48:04 +08:00
ccdd18e3f0
provider: Kiro's identity refresh reads askKiroIdentity before its goroutine starts, not inside it
yetone2026-10-06 03:48:04 +08:00
bfe8bcafb8
provider: ForgetAccounts also forgets which accounts were asked for their model lists a moment ago, so accounts read afresh are asked again
yetone2026-10-06 03:48:04 +08:00
b363327d4e
provider: a logins.json magpie can't read keeps the accounts read before, and one that doesn't parse is copied aside before it is written over, not read as no accounts
yetone2026-10-06 03:48:04 +08:00
963d8d9d88
gateway: a provider that turns Codex's image tool away with a bare 400 is asked again without it, and isn't offered it again once that works, so a plain chat no longer breaks on it; a ChatGPT sign-in, openai.com and a Codex backend that takes it still get it (#949, cjyrainbow)
yetone2026-10-06 03:38:55 +08:00
aab93f9fa8
gateway: in turn, a new conversation goes to the model or account the fewest live conversations are on, so two sessions of one routing group kept for the session no longer share a model (#946, Moody-Sin) — in turn counts requests, not conversations, so a second session started after the first had sent an even number of requests went to the model the first was kept on. leastHeld counts the conversations of the scope answered in the last 30 minutes per key/account and model and puts the least held first; ties, resting ones and a group with a group in it keep routing's order. TestRotateSpreadsSessions is new and fails (after 2 and 4 requests) without the change. go vet, go build (darwin, GOOS=linux nogui, GOOS=windows), the gateway package and go test -race -count=20 of TestRotateSpreadsSessions/TestAffinity pass; go test -tags nogui ./... under a temp HOME failed only TestWSLProbeFindsBunOmp, TestProvidersAnswerWhileListsComeIn, TestUserPath and TestClaudeSignedOut under the full run's load, each passing on its own.
yetone2026-10-06 03:32:58 +08:00
76dc5aed48
gui: Routing flies a request still under way when the page's first frame came before the trace, and the Requests table's sideways scrollbar goes once the table fits; GUI tests brought up to date with the app
yetone2026-10-06 03:20:25 +08:00
5ecb1dc365
provider: moved WorkBuddy subscriptions update to the plugin's 0.1.9, whose chats from Codex and Claude Code pass WorkBuddy's channel check (#182, snzkYuurei on X)
yetone2026-10-06 03:13:02 +08:00
303819c583
docs: LESSONS.md keeps what the nightly review of merged work finds, and agents read it before changing code
yetoneandClaude Opus 5.52026-10-06 03:10:21 +08:00
9f78d74507
gui: the Routing page's head has New group, by Hide accounts, which opens an empty routing group's editor and brings it into view (#944, mintonight) — the groups' New group sat only at their own head, below the live stage and the requests, out of sight on a first look, so a user used the groups magpie finds for days without knowing one of any models could be made. The head's New group has a plus and a tooltip saying what a group is (zh/ja/de); its click opens the editor, scrolls to it only through scrollOnPurpose and focuses the name without a scroll of its own. The groups' own New group has the plus too. group-new-head.test.cjs is new (Chromium, WebKit; English, Chinese) and fails 4/4 without the change. go vet, go build (GOOS=linux nogui, GOOS=windows), go test -tags nogui ./... under a temp HOME and the group-* and click-scroll GUI tests pass.
yetone2026-10-06 03:03:11 +08:00
b0607ef5a6
provider: the ChatGPT API subscription lists, beside the models its account catalog lists, those Codex lists for the plan, which the token runs though the catalog leaves them out (#933, knothhe)
yetone2026-10-06 02:25:01 +08:00
ab47042ba8
agent: Codex on one of magpie's models beside its ChatGPT sign-in stays connected when Codex writes one of its own models back, and connecting keeps the model it was on through magpie where it can't join (#940, xybio)
yetone2026-10-06 02:25:01 +08:00
4c170cbad6
library, gui: DeepSeek Harness is listed under Library › RTK with why RTK has no hook for it, not left out (lc on Discord) — RTK rewrites the shell command an agent is about to run, and dsh's hooks can only allow or deny one (its Claude Code bridge drops updatedInput; deepseek-harness's pre-tool-input-rewrite is only proposed), and rtk 0.51's init has no --agent dsh (rtk-ai/rtk#3847; the open #3934 only adds AGENTS.md text, which rewrites nothing). So the RTK tab left dsh out and it read as magpie not seeing it. rtkNoHook names it with the reason: the row has a No RTK hook tag (zh/ja/de) and a switch that can't be turned on, magpie library rtk prints the reason, and on/off for dsh answer it instead of "rtk has no hook for dsh". TestRTKNoHookListed and library-rtk-nohook.test.cjs (Chromium, WebKit, en/zh) are new and fail without the change. go vet, go build (darwin, GOOS=linux nogui, GOOS=windows) and go test -tags nogui ./... under a temp HOME pass (TestProvidersAnswerWhileListsComeIn and TestUserPath failed once under the full run's load and pass on their own).
yetone2026-10-06 02:17:07 +08:00
4c5a30dc0e
gui: Routing shows request cache rates and output speeds, with metrics chosen as they are ticked (#941)
Zhu Wang2026-10-06 02:23:28 +08:00
90b1ac7956
update, gui: Add to PATH on Windows writes a magpie.cmd beside an app not named magpie.exe, so the site's magpie-windows-amd64.exe runs as magpie in a new terminal, and says so (#942, mintonight)
yetone2026-10-06 02:10:59 +08:00
a5df344e43
docs: code-standards gets the acceptance criteria a change must show before merge or release and the PR review patterns, and docs/subsystems covers gateway routing, agent wiring, providers and accounts, the library and the GUI shell (Junjie Zhou on Discord)
yetone2026-10-06 02:17:03 +08:00
58ecd4454c
davsync, agent: sync turned off and on again to the same server keeps what changed here, and an agent shown only routing groups connects on the first (#939, aiirobyte)
yetone2026-10-06 02:16:08 +08:00
ede0efb054
codexcat, gateway, gui: Settings › Codex auto-review model picks the model Codex's auto-review decides approvals on (#938, guitaoliu)
yetone2026-10-06 01:53:44 +08:00
a806409394
gui: a skill's name and its group's repository stay in the row beside many agents' chips, and a group's head reads as its card's title, not one more skill (#936, liuweifeng)
yetone2026-10-06 01:51:47 +08:00
1330b9660e
agent: VS Code Insiders is an agent of its own, its Chat given magpie's models in Code - Insiders/User as VS Code's is in Code/User (wani on Discord)
yetone2026-10-06 01:25:59 +08:00
c6e318e1d2
gui: a Usage › Sessions agent clicked at the end of its scrolled strip stays in view in WebKit, after #937 (#929, liuweifeng)
yetone2026-10-06 01:13:21 +08:00
926bcaa379
docs: code standards distilled from PR reviews, linked from AGENTS.md (Junjie Zhou on Discord)
yetone2026-10-06 01:37:44 +08:00
29e6d14857
gui: Usage → Sessions' agent filter scrolls in itself, not the page (#929) (#937)
Junjie Zhou2026-10-06 01:36:41 +08:00
e63fbb0e69
gateway: a 429 that says the balance is spent is out of credit, not a rate limit (kkgg on Discord: GLM 直接429了)
yetone2026-10-06 01:28:58 +08:00
7a926dd3ce
provider, gateway, gui: a ChatGPT plan can be signed in with OpenAI's Sign in with ChatGPT, as the ChatGPT API subscription, and asked on api.openai.com's Responses with the agent's own instructions (#933, knothhe)
yetone2026-10-06 01:22:37 +08:00
8d3cf5f86e
gateway: a Gemini reply that says nothing is asked again on the same account before it fails, so a long conversation that ends with only reasoning a few times running goes on instead of stopping the agent (#667, tianshuo886)
yetone2026-10-06 01:11:11 +08:00
86f48071cc
gateway: an image or a PDF sent as Gemini's inline_data, or as a Chat Completions file part, reaches the model, and a Gemini stream gets no keepalive comment (#934, handong66)
yetone2026-10-06 01:09:26 +08:00
1e0829b125
gui, gateway, settings: the Usage page's agent rows show their cache hit rate, and web search can go to the search APIs first (#925, xiaozhu1337; #928, hypooo)
yetone2026-10-06 00:47:30 +08:00
9fb9a8ab81
library: an edit made in an agent's copy of a skill goes to the library and the other agents, rather than being undone at the next start (Joren on Discord)
yetone2026-10-06 00:37:47 +08:00
4c35c1b8e6
provider, gui: removing the Codex account in use signs Codex in to another of its accounts first, rather than leaving it signed out (vincentzhang1_55530 on Discord)
yetone2026-10-06 00:37:41 +08:00
6d198f7f23
library, gui: a repository's skills are one group on the Library page however each came in — the skills CLI's lock, a git clone, or installed from it again (White Immortal on Discord)
yetone2026-10-06 00:36:31 +08:00
b2a3449021
gui, agent: the models picked for a WSL agent are the ones its picker, its own menu and the gateway list, and a model taken out leaves the picker at once (#927, cjyrainbow)
yetone2026-10-06 00:31:46 +08:00
951b4f1324
provider, gui: a key's balance is drawn over time on the Usage page, with when it runs out at that pace by a least-squares line, and a click enlarges a curve (TJHHHH on Discord)
yetone2026-10-06 00:01:09 +08:00
652e5e1ec5
ci: the gateway's race suite runs over one process per core, not one at a time (wizzy-yang, #923)
yetone2026-10-05 23:54:00 +08:00
3c9c633e5d
provider, gui: a sub2api panel's /v1/usage is read with its field left empty, so its balance needs only the key (Singrun, #881)
yetone2026-10-05 23:47:05 +08:00
fff33ba55b
gui: an agent's model list takes a second click for Hide all and Show all, which say they are every provider's (#920, cjyrainbow)
yetone2026-10-05 23:23:47 +08:00
7b96b59205
agent: Alma is told what each of magpie's models costs, so its usage page counts their cost (#919, Magixyne)
yetone2026-10-05 23:23:40 +08:00
56cfb8fbba
gateway, provider: a subscription refused for a pool of its allowance that counts some models only rests for that model, not the account (Xiaopodev on X) — Cursor's Other Models used up kept Auto and Composer, still in Cursor Models, off the account too: the refusal rested the whole account by its restKey. Allowance.Pooled says a refusal is the model's alone when the windows full for it each count some models only (a plugin's models/notModels pool, Opus's own week), or none known full, only pools count it; restAfter then rests restID (account/model), which every rest check already looks at beside restKey. Tested with the owner's real Cursor account in a sandbox HOME: its real pools read Auto and Composer in Cursor Models, Opus and GPT in Other Models; after an Other Models refusal for claude-opus-5-5 only that model rested, and cursor/auto and cursor/composer-2.5 answered 200 through the account. TestAllowancePooled and TestPoolRefusalRestsTheModelOnly are new; the latter fails without the change. go vet, go build (darwin, GOOS=linux nogui, GOOS=windows) and go test -tags nogui ./... under a temp HOME pass.
yetone2026-10-05 23:21:24 +08:00
fbaf27bce1
agent: dsh's web search goes through magpie while dsh is on one of magpie's models (Packing1 on Discord)
yetone2026-10-05 22:58:06 +08:00
055f17883f
gateway: a Claude subscription conversation the client sends back rewritten goes on in the run that had its last turn, and Claude Code's temp images go with their session (#912, margbug01) — Alma takes the [Context: …] block out of its last user message once the turn is over, the <alma_notification> block out of the end of the reply, and picks the tools for each turn, so turnKey, which hashes all of it, never matched and every turn started a new claude -p told the whole conversation, written to the prompt cache again with its images. ended keeps a looseTurn beside the key: the settings without the tools, the conversation before the last turn hashed, and the last turn's messages one by one. When the exact key misses, rewritten takes the one idle run or saved session whose looseTurn has the same owner, settings and earlier turns, the same roles, tool calls and results in the last turn, where a user message only had one part taken out (cutFrom) and the reply is a non-empty start of what the run said. Two that could be it start a new run, as does an idle run not told a tool offered now (offers) or a saved session one of whose tools is gone (toolsCover). Claude Code's <CLAUDE_CODE_TMPDIR or /tmp>/claude-<uid>/<work project>/<session> folder, where it keeps the images it was given, is removed with the session (removeSession), and the sweep removes those a stopped gateway left once their session file is gone and nothing in them changed for a day; CLAUDE_CODE_TMPDIR joins agentenv.Vars. Old images are still sent to a new run: replacing them would change what the model sees. docs/subsystems/claude-subscription-bridge.md is new. claude_rewritten_test.go has a case for each relaxation (failing before the change) and one for each rule that keeps another conversation out (each failing with that rule taken out). Tested for real with the owner's Claude Max account in a sandbox HOME: turn one asked with a [Context] block and two tools, turn two sent it back with the block taken out, the reply cut short and one tool, and went on in the same claude process ("goes on in its run", cache_read 1932). go vet, go build (darwin, GOOS=linux nogui, GOOS=windows) and go test -tags nogui ./... under a temp HOME pass.
yetone2026-10-05 22:28:00 +08:00
3a30ac87c2
catalog, gui: a 1-hour cache write is 2× input for a Claude model only, any other's unset is its 5-minute price and isn't shown (PAMI on Discord)
yetone2026-10-05 22:52:42 +08:00
a532d1586c
gateway: a tool call DeepSeek writes into its text as {"name":…} then <parameter name="k">v, its closes missing, is the call (#917, Moody-Sin)
yetone2026-10-05 22:49:04 +08:00
c13f3bfb7a
provider: two Codex accounts of one email in two Team workspaces each go by a name of their own, so removing or refreshing one never touches the other (vincentzhang on Discord)
yetone2026-10-05 22:50:07 +08:00
4ff1d51690
settings, gui: Windows and Linux start at 110% text size until one is picked, and a new text size leaves no blank room at the page's foot (#914, #911, emo172)
yetone2026-10-05 22:48:43 +08:00
b358a5ca83
gui: a routing group in a routing group says what agents are told of it, and where its reasoning is set (#915)
wizzy-yangandwizzy-yang2026-10-05 22:49:23 +08:00
c5b57b9077
gateway, usage, gui: a relay's reply of tool calls ended "end_turn" or "tool_calls" goes on to the calls, a tool_use whose start carries its input keeps it, an Anthropic stream that just stops is an error, and every request says its protocol and the upstream's stop reason (蓝猫 on Discord)
yetone2026-10-05 22:46:28 +08:00
df95ac6bc2
docs, site: Integrating your app or agent with magpie, at docs/integrating.md and usemagpie.ai/docs/integrate (#918, Magixyne)
yetone2026-10-05 22:46:35 +08:00
47f0824c6b
gui: the update sheet names the newest release, not the one downloaded hours ago (#910, Moody-Sin), and Names & levels folds where it opened and opens folded (#868, Hu9956)
yetone2026-10-05 22:20:56 +08:00
bc00ee1df2
plugin, provider: a program a plugin starts has magpie's proxy, and a CLI login with no link says why (𝕏 on Discord)
yetone2026-10-05 22:25:30 +08:00
2086884bef
sessions: a session goes by the name its agent shows for it — Codex's thread name (session_index.jsonl), the one a Claude Code session was renamed to (/rename), else the title the agent made — and by its first prompt only when it has none (TJHHHH on Discord)
yetone2026-10-05 22:17:45 +08:00
0ef7066915
gui, proc: a magpie in a container holding the gateway's port is said as a container's to stop, Settings can move this magpie's gateway past it, and the take-over button is bordered in dark mode (leslie_luo on Discord)
yetone2026-10-05 22:19:33 +08:00
2033df0faa
gateway, gui: WorkBuddy turning away an agent's system prompt ("unapproved channel") rests no account, its mates are asked last, and the Routing page tells it as the prompt, not the reasoning level (lemon on Discord)
yetone2026-10-05 22:19:33 +08:00
11a2d359a1
agent: VS Code's magpie models and default model go in each of its profiles too, so a window on another profile lists them in Chat (TJHHHH on Discord)
yetone2026-10-05 22:14:48 +08:00
db812921a6
plugins_cli: magpie plugin off, on and rm take a plugin's short name, as options does (the owner, testing for real) — magpie plugin off think-tags answered no plugin "think-tags" while magpie plugin options think-tags found it, so the names the community READMEs and usemagpie.ai's docs write worked for one command only. installedName turns a short name (think-tags for @magpie-community/middleware-think-tags, plugin.ShortName) into the installed plugin's package name for on, off and rm; a name a plugin has itself, or one no plugin has, is kept as it was. Found and tested end to end in a sandbox HOME with a real DeepSeek account: Model Map and Think Tags installed by clicking Install under Plugins › Discover › Gateway middleware in the real app (from a local verdaccio registry holding the real packages, until their first npm publish; magpie built with npmRegistry pointed at it), an alias set in Model Map's Options editor served by deepseek-flash and named back, think-tags off by short name let the model's <think>…</think> through and on took it out ("51"), rm think-tags by short name and Model Map's Remove in the app left plugins.json empty and the alias unknown. TestPluginOnOffRmShortName is new and fails without the change. go vet, go build (GOOS=linux nogui, GOOS=windows) and go test -tags nogui ./... under a temp HOME pass.
yetone2026-10-05 22:08:24 +08:00
71d2da1f42
catalog, usage, gateway, gui: a price can have a long-context tier and a 1-hour cache write, and the price boxes take decimals (PAMI on Discord)
yetone2026-10-05 21:56:56 +08:00
74c67785c8
gui: a group's model picker ticks a member with its reasoning fixed and takes it out on a click, and the routing groups can be filtered by name and model (#907, Moody-Sin; PAMI on Discord)
yetone2026-10-05 21:44:49 +08:00
9dda306a33
provider, gateway: a provider's header.anthropic-beta is added to the betas the agent asked, not put in their place (PAMI on Discord)
yetone2026-10-05 21:44:18 +08:00
852b61f9c4
provider, gui: a provider with hundreds of keys folds its Accounts list behind All N keys, with a filter and removing many at once, and several keys pasted into the API key field are saved as its accounts (361 on Discord)
yetone2026-10-05 21:42:01 +08:00
307f413687
gateway: a tool call GLM writes into its text in its own format is made, and Codex's exec gets its code as a custom tool call (#906, nullburn)
yetone2026-10-05 21:34:33 +08:00
2a57b7bb60
tui: magpie tui serves the gateway while it is open when no other magpie does, so agents it connected reach it in WSL (gnayiab on X)
yetone2026-10-05 21:28:58 +08:00
43a6595035
provider, gui: Codex's only account can be signed out from its row, as codex logout does, and removing the account Codex is on while another is saved says what to do, in the reader's language (mamba on Discord) — removing Codex's only account failed with "codex is signed in to <user> now; switch to another account first", with no other account to switch to, and Providers › Codex › Sign out hit the same error, as it forgets the account in use last. ForgetLogin on the account Codex is signed in to, with no other Codex account saved, now signs Codex out as codex logout does: ~/.codex/auth.json is deleted, magpie forgets the account and drops what it served (magpie only knows file-stored Codex sign-ins, liveLogin reads auth.json, and the keychain is never touched); one signed in but not saved yet is signed out the same way. With another saved it is still refused, now as a SignedInError ("Codex is signed in to <user> now: sign it in to another of its accounts first (Use on that account), then remove this one"), which /api answers with code signed_in, the agent and the user, and app.js says in en/zh/ja/de. The only Codex account's row in its editor has Sign out (退出登录), asked in the app's own dialog, whose Cancel, Escape and backdrop go back to the editor and send nothing (closeConfirmAsk follows a dialog's back), then posts login/forget; the removed-provider Sign out dialog for Codex says Codex itself is signed out too. Claude Code keeps the refusal: its sign-in may be in the keychain, which magpie never touches, and magpie serves its saved accounts while it is signed out (claudeStandIn) and treats its /logout apart (claudeLoggedOut). TestCodexSignOutLastAccount (refused with another saved, auth.json kept; signed out when the last; an unsaved sign-in signed out; an unknown account still an error), TestForgetAccountSignsCodexOut (fails without the change with mamba's error) and TestClaudeInUseStillRefused are new; codex-signout.test.cjs (WebKit, en and zh: the button and its title, the dialog, Cancel and Escape post nothing and go back to the editor, the post and its status, no Sign out with two accounts, the translated refusal, no select, no left border, no scroll) fails without the change. The account-*, own-signin-remove, saved-signedout-remove, reset-reminder and click-scroll tests pass in WebKit; Chromium wouldn't launch on this machine. go vet, go build (darwin, GOOS=linux nogui, GOOS=windows) and go test -tags nogui ./... under a temp HOME pass.
yetone2026-10-05 21:22:50 +08:00
528d6c12dc
agent, gui: Codex left on model_provider = "magpie" with no [model_providers.magpie] loads its config again, and connecting with nothing in magpie says what to do, in the reader's language (Tystem on Discord) — the Codex app said "无法加载 config.toml … Model provider magpie not found", magpie showed Codex as not connected on "deepseek-flash", and its switch answered only "Codex can't be connected to magpie", in English. Codex looks model_provider up in [model_providers.*] as it loads config.toml (codex-rs: "Model provider {id} not found"), so the key without the table keeps it from loading any config, a new thread too, not just an old one. magpie never writes one without the other: it takes model_provider out whenever it steps out as the provider (disconnect, Unwire, a model of Codex's own, Join) and keeps the table so the threads started on magpie still open. That is unchanged, and TestCodexSteppingOutLeavesNoHalfState now covers it. Another tool or a hand edit had taken the table away. Sync, at magpie's start and whenever the catalog changes, now writes the table back whenever the config names magpie as its provider, at the top or in a profile, and has no table, whether Codex is connected or not. Check reports that state too. A config magpie can't parse is still only reported, never written to. A Connect that finds none of magpie's models because no provider or subscription has been added answers agent.NoModelsError, "Add a provider or subscription in magpie first, then connect Codex". /api answers it with code no_models and the agent's name, which app.js says through t() (en/zh/ja/de). docs/reference.md no longer says the table goes with a native model. TestCodexProviderWithoutTable (top and profile: Check says so, Sync writes the table) and TestConnectWithNoModels in internal/agent, TestAgentConnectNoModels in internal/gui, and agent-connect-no-models.test.cjs (WebKit, en/zh/ja/de: the toast in the reader's language, the switch back off, no scroll, no native dialog) are new and fail without the change; the latter's en case passes either way, as the server's message is English. Chromium wouldn't launch on this machine for this test or the existing agent-connect.test.cjs. TestCodexSyncAddsBaseURLToProvider now expects the table added to a hand-made provider that had none. go vet, go build (darwin, GOOS=linux nogui, GOOS=windows) and go test -tags nogui ./... under a temp HOME pass. In the first full run, internal/gui's TestProvidersAnswerWhileListsComeIn and internal/proc's TestUserPath failed under load; both passed alone and in the second full run.
yetone2026-10-05 21:09:13 +08:00
9debc58397
gateway: a Cline reply that is not streamed reaches the agent as the completion itself, not in Cline's {success, data} envelope (6094S on Discord) — Cline's API answers a request with "stream": false as {"success":true,"data":{chat.completion}}, and magpie passed that on byte for byte to an agent asking the Chat API of ClinePass (cline-pass/deepseek-v4.1-flash): a client looking for choices at the top failed, Alma's tool-model calls with "Invalid JSON response". Streams were fine, and a translated request is asked of Cline as a stream, so only the Chat API's whole replies were hit. forwardOnce now takes the envelope off a Cline provider's (IsCline: the ClinePass preset or a cline.bot host) JSON reply (clineUnwrapped): success true with an object data goes on as data, so chatWhole, the usage sniffer and the agent see the completion; success false goes on as {"error":{"message":…}}, a 502 when it came with a 2xx, which writeError puts in the agent's API's shape. A stream, a compressed reply, a body without success and another provider's replies pass as they came. The community plugin @magpie-community/opencode-cline-auth already unwraps it (unwrapped in index.mjs) and needs nothing. TestClineEnvelopeUnwrapped (the completion on the Chat API, another provider's body untouched, a refusal as an error, a stream untouched) fails without the change. No Cline account to test with; Cline's real API answers a request without a key with a plain {"error":…} 401, which is unchanged. go vet, go build (darwin, GOOS=linux nogui, GOOS=windows) and go test -tags nogui ./... under a temp HOME pass.
yetone2026-10-05 20:56:37 +08:00
e9262f7ea8
provider, gui: a Grok account answered 429 shows a spent Rate limit window on its card until the limit lifts (H20 on Discord) — a free Grok account read 100 left while its requests came back 429 after a short while: Grok's billing (/v1/billing?format=credits, all the CLI's /usage reads too) says nothing of a plan's rate limit, and a period's credits unused read 0% used. @magpie-community/opencode-grok-auth 0.1.7 keeps the account's last 429 and its usage puts a "Rate limit" window at 100%, aside (the gateway already rests the account), before the period's, until the reset the 429 named (Retry-After, or a *ratelimit*reset* header), or with none until a request goes through or 5 minutes pass; grok's mover min is raised to it. The built-in, which only accounts that haven't moved use, is left as it was. "Rate limit" in zh/ja/de. The plugin's new usage test fails on 0.1.6; its 20 tests pass, and against the owner's real Grok account (read-only) the plugin's usage gave the week at 0% before and the Rate limit window first after a 429 through its fetch. go vet, go build (darwin, GOOS=linux nogui, GOOS=windows) and go test -tags nogui ./... under a temp HOME pass.
yetone2026-10-05 20:58:54 +08:00
2f135ed4d5
plugin, gui, docs: Plugins says which plugins are providers and which are middleware, lists the community's ready-made middleware, and edits a middleware's options in its row (the owner) — the Plugins page still read as if every plugin were a subscription, and nothing showed what a middleware does or let you set its options without editing plugins.json. Every Discover card and Installed row now carries a Provider or Middleware chip (both for a plugin that is both), also for one that is off (isMiddleware/middlewareOnly from the server, read from its files); Discover splits into Subscriptions and Gateway middleware ("runs in magpie's gateway on what every agent sends and gets back, whichever provider serves it"), the latter from market entries with "kind": "middleware" and no providers or icon (the built-in market.json lists the five new @magpie-community/middleware-* packages: param-override, model-map, system-prompt, word-guard, think-tags, mostly New API's channel settings with the same JSON). A middleware row has Options: a JSON editor in the row, starting from the package's magpie.options example when none are set, which validates it is an object, saves (POST /api/plugins/options) for the next request, clears, and cancels with Esc. magpie plugin options takes a short name (model-map for @magpie-community/middleware-model-map; plugin.ShortName, also in SetOptions). en/zh/ja/de. Docs: usemagpie.ai/docs/plugins (en/zh/ja) gains Ready-made middleware and Options and the registry's kind; reference.md, both READMEs and docs/subsystems/gateway-middleware.md likewise. Tested with a real DeepSeek account and real Claude Code through magpie web --gateway in a sandbox HOME, with all five installed and options set by short name: a mapped model named back, max_tokens capped, a prompt appended for claude only, word-guard's 400 and param-override's 403 in the agent's shape, <think> stripped from Chat and Responses streams and a whole Anthropic reply, reasoning_content moved into the text; /api/plugins showed the kinds and the example. TestSetOptionsShortName is new; TestBuiltinMarket checks a middleware entry has no providers or icon and no other kind. plugin-middleware.test.cjs (Chromium and WebKit, en and zh: the chips, Discover's two sections, the options editor with its errors, no select, no scroll, no left border) fails without the change; the other plugin tests and click-scroll pass in WebKit (plugin-market's section name updated; plugin-move fails only under parallel load and passes alone). go vet, go build (darwin, GOOS=linux nogui, GOOS=windows) and go test -tags nogui ./... under a temp HOME pass.
yetone2026-10-05 20:50:06 +08:00
80dc07d021
provider, gateway: switching Claude accounts no longer signs one out — the account switched away from is saved with the sign-in Claude Code has that moment, and the gateway lets go of its runs on the account switched to (0xAncientTwo on X)
yetone2026-10-05 20:42:48 +08:00