Repository navigation
[release] v0.128.4 - #8024
Merged
Merged
[release] v0.128.4#8024
Conversation
HARNESS_KINDS in version.ts was not extended when Codex became a harness of its own (its own model catalog, its own CODEX_HOME setup, routed through run-plan.ts like the others). Its only consumer is the /health payload, so nothing was gated on the omission, but a client probing /health concluded Codex was unsupported on this runner. Fixes #5693
Real captured output: git show of the pre-fix HARNESS_KINDS line, the actual runnerInfo() JSON after the fix, and the actual passing vitest run for version.test.ts. Rendered to PNG via headless Chrome for the PR's required demo image.
Jinja2 control blocks were not scanned, so variables used only in {% if %} / {% elif %} / {% for %} were missing from input_keys, and loop targets were listed as inputs. Scan control blocks in source order, track names the template binds, and skip syntax tokens.
Fixes #7669
Ignore attribute assignment targets such as ns.found instead of recursing forever, and ignore identifiers after a subscript so items[0].name adds only items. Parse filtered and subscripted interpolations with the same syntax-aware scanner so bound names do not leak.
Bind the target before a filter on a block set, ignore constants in plain interpolations, and evaluate every with right-hand side before binding targets. Add tests for each case.
Scan filter arguments on filtered block assignments so filter arguments are still detected as inputs.
…isions fresh - workflow-changed invalidates only the named workflow's latest-revision keys; ready stays broad - a tab raises its own ready only while it follows, so a load no longer refetches the agent list twice - the latest-revision query revalidates after commits instead of staying disabled once primed - batched latest-revision reads group by artifact on the server instead of pulling every revision - an already cached revision body is not written to IndexedDB again
- records-changed and badge invalidations collapse to a leading and a trailing call per 500 ms - the bound revision primes the detail cache, so the chat does not fetch it twice - immutable IndexedDB entries expire after 30 days and are swept at boot - logout marks the session signed out, leaves the data screens, then clears both caches
…he spans per session - the Traces tab no longer mounts the sessions list or its span reads - each session's spans are cached on their own, so a new page does not refetch older sessions - annotations attach through one index instead of a scan per span
…let poll, debounce skill search
…reen The docked rail stays mounted under display: none on narrow screens, so the meter polled the wallet every 10 s with nothing visible.
- a failed latest-revision refetch keeps the cached revision instead of storing null - a workflow-changed id also matches a host key that names the workflow by its bound id - the bound revision is primed under the project it was fetched for - a session whose spans failed to load stays listed - a follower drops its own ready once the leader relays one
In transcript replay, approvalRenderHints grouped unresolved allow decisions by coarse tool name and treated any subsequent result for that tool name as execution of the call. When multiple calls to the same tool were approved simultaneously (e.g. 14 parallel tool calls): 1. Only the final approval was marked lastPending; all earlier ones were marked stalePending. 2. As soon as any one call finished executing, all remaining approvals for that tool were marked executed. 3. Turn-pause sentinels (DEFERRED_NOT_EXECUTED_PREFIX or APPROVED_EXECUTION_RESULT_UNKNOWN) were treated as execution results. Index tool calls by ID from history and resolve canonical call keys using approvedCallKey. Group unresolved approvals by call identity so distinct parallel calls stay pending, correlate executions by toolCallId or call key, and ignore synthetic pause sentinels. Signed-off-by: Yunus Ardaguney <yunusarda-sudo@users.noreply.github.com>
Signed-off-by: Yunus Ardaguney <yunusarda-sudo@users.noreply.github.com>
Read edit_workflows once in ConfigPane and pass disabled into AgentBuildPanel, which hands it to the config and automation sections. In the MCP drawer, hide Remove from agent, the personal sign-in line and the login-expired banner when disabled, so a Viewer reads the no-access text instead.
When an agent asked for two connections in one step, the first one paused the turn and the runner closed the second as not executed. The second call's gate could arrive a moment later and still park: it saved a pending interaction row that no card showed. The server waits for every pending row before it continues a turn, so the turn never continued and new messages stayed queued. The tracer now remembers the calls settleOpenToolCalls closed, and every park seam (client-tool relay, approval seam, ACP gates) skips such a call. The agent asks again on the next turn, as the deferred chip already says. Entire-Checkpoint: 01M6EGJRAZ702D5TBYRJHNDS9G
…ve a hidden chat a clean not-found page - The chat Share dialog says that nobody else can open the link while the chat is private with nobody added, and the copy toast says the same. - A chat the reader cannot open renders on its own page, without the tab strip, the config pane, or the agent of the chat opened before it. - The agent's Shared with project text says that its chats stay private.
A chat with no turns has no session row, and the fresh-session marker lives only in memory. After a reload the access check read the missing row as "not known yet" forever, so the composer stayed disabled under the "New messages still work" notice. On a route that names the agent, treat a successful read with no row as known when nothing blocks the chat. The server still checks access when the message is sent.
Another person's private chat also reads as no row, so the agent on the route cannot tell it from an empty chat of our own. Keep a record of the sessions this tab created in sessionStorage, which survives a reload, and unlock only those. The in-memory fresh marker, which decides hydration, is unchanged.
… reads A schedule created before the agent's latest revision loaded, or after that read failed, stored its instruction under the fallback "message" key. A chat agent reads only "messages", so the first run started an empty chat. The field fixed the key only when the shape changed while it was mounted, so a saved schedule kept the wrong key. Create now waits for the agent's revision and says why on the instruction field. Once the revision is known, the field moves a message stored under the fallback key to the key the agent reads. Closes #7936
…ceeds A Gmail connection is stored before the Google sign-in, and the first one became the person's default even though it was not valid. When the person gave up and connected again, the new working connection was not the default, so agent runs picked the broken one. Now a new personal connection is the default only when it is valid at creation (an app with no sign-in). When a sign-in succeeds, the connection becomes the default unless a valid default already exists. An invalid default is replaced.
docs: add WahidSaeed as a contributor for code
…s-agent fix(frontend): store a schedule's instruction under the key its agent reads
…approval-hints fix(runner): correlate approval execution by call identity (#7951)
…en tests web/AGENTS.md asks every host, test harnesses included, to pass the shared queryClient to the provider and to queryClientAtom.
[perf] Cut wasted API requests on /m
fix(frontend): keep the add to queue picker open after the Add menu closes
test(frontend): send the shallow flag in the test set commit router mock
…detection [7669] fix(frontend): detect Jinja variables in control blocks
docs: add TPSJASPER as a contributor for code
…page on /m without a token Address CodeRabbit on #8033: the error stayed after the user edited a field, and the /m gate sent a Classic mode user on a tokenless reset page back to /auth. Add Storybook stories for the form, mismatch and invalid link states. Entire-Checkpoint: 01M6GJ620DC17ZMGJ2VPPCDWDQ
Comment on lines
+585
to
+586
| const template = input | ||
| .replace(/\{#[\s\S]*?#\}/g, "") |
fix(frontend): add the /m page a member password reset link opens
The agent page opens the create drawer with the agent's revision id. The create waits for the agent's latest revision, and that read takes the agent's own id, so it found nothing and every create stopped. The drawer now passes the agent id from the references, as the automations screen does.
fix(frontend): create an automation from the agent page again
- Mount the evaluator drawer inside an open @agenta/ui dialog, so it opens above the New Evaluation modal and shares its focus trap. Stay in the modal after an inline create. - Isolate the comparison generations panel, so its sticky z-[99] cells stay under modals. - Restore the solid border on the variant summary cards. - Inset the comparison inputs to match the toolbar and run controls. - Wrap the unused-columns summary inside its column. - Keep the testset search focus ring inside the sidebar scroll box.
fix(frontend): /w playground layering and spacing in compare mode
mmabrouk
approved these changes
Nov 3, 2026
mmabrouk
left a comment
Member
There was a problem hiding this comment.
🤖 The AI agent says: Approved on Mahmoud's instruction after the v0.128.4 production deploy went green in US (run 41671971690) and EU (run 41674198610), with both live checks passing.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
New version v0.128.4 in
Final QA
fix(frontend): let an empty chat send after a reload #7978 In /m, open a new chat from an agent, send nothing, reload the page, then send a message. Pass: the composer is enabled after the reload and the message sends. Also check that a
?agent=link to a chat this tab did not create stays locked. A real agent answer was not checked (the QA provider keys had no credit), so confirm one reply arrives.[fix] Make a personal connection the default when its sign-in succeeds #7977 With personal accounts on, start connecting Gmail and close the Google window. Pass: the new connection shows as not connected and is not the default. Connect Gmail again and finish the sign-in. Pass: the new connection is the default and an agent that uses Gmail runs with it. Also connect a second Gmail while a working default exists. Pass: the first stays the default. The real Google sign-in window was not tested (the callback was called with a server-signed state).
fix(runner): do not park a tool call the pause already closed #7983 On staging (Daytona sandbox, Claude harness, Haiku), make an agent ask to connect two integrations in one step, for example Exa and Gmail. Connect the first one when its card appears. Pass: the agent goes on, shows a new card for the second integration, and the next message you send runs instead of waiting in the queue. A local run with the local sandbox passed 3 times out of 3, but its logs cannot show that the late second gate (the race this PR fixes) happened in those runs. The unit tests drive that exact order.
fix(frontend): lock the /m agent editor for a Viewer #7979 In /m, open an agent as an Owner and as a Viewer in the same project. Pass: the Owner can edit everything. The Viewer sees no add buttons (tools, integrations, subagents, MCP servers, skills, automations), no per-item remove, and disabled model and policy controls. A locked MCP row does not open (existing rule for every item kind). The personal sign-in line and the login-expired banner for a Viewer were only covered by unit tests, because the QA MCP server had no auth.
fix(frontend): warn that a private chat link opens for nobody, and show a clean not-found page #7984 On /m, open a private chat with nobody added and open Share: the line "Nobody else can open this link yet..." shows under Copy share link, and copying shows "Link copied. Nobody else can open it yet." Open that link as another member: the not-found page shows "If someone sent you this link, ask them to add you from Share."
fix(frontend): store a schedule's instruction under the key its agent reads #7980 On /m, create a new schedule for an agent and save it. Pass: the schedule run receives the instruction (open the run, the agent answers the instruction). Press Create while the agent is still loading: the message "Loading the agent. Try again in a moment." shows and nothing is saved.
fix(runner): correlate approval execution by call identity (#7951) #7975 On staging (Daytona sandbox, Claude harness, Haiku), give an agent a tool that needs approval and ask it to call that tool 5 times with different arguments in one step. While the 5 approval cards wait, make the resume cold (restart the runner, or let the session go idle until it is evicted), then approve all 5. Pass: each of the 5 calls runs exactly once (check the trace or the side effect, not the agent's text), and none runs twice. A local cold run with mistral-large-latest passed (3 of 3 ran once; the old code ran 1). With mistral-small-latest the model once wrote the calls as text and called nothing, so also try one small model.
[perf] Cut wasted API requests on /m #7969 On /m with wallets enforced, open home on a narrow window and wait a minute. Pass: no
wallets/summaryrequest repeats; on a wide window the sidebar credits meter still updates. Log out. Pass: you land on/authwith no bounce to/, and IndexedDBagenta-query-cacheis empty. In the playground, edit an agent's instructions. Pass: the version pill shows the new revision without a reload. In a long chat run, the transcript still updates live and approval prompts clear when answered. A local check covered Observability only (Traces tab 19 to 14 requests, Delete and Add to queue send trace ids); wallets were off there.[7669] fix(frontend): detect Jinja variables in control blocks #7719 In /m, open a chat app, set Prompt Syntax to Jinja2 and paste the template from [Bug] Jinja2 variables used only inside {% if %} / {% for %} are missing from input_keys, so invoke returns 400 #7669. Pass: the variables panel shows company, is_vip, tickets and customer_message, and not ticket. Run it with is_vip true and one ticket, commit, and call /services/chat/v0/invoke with those four inputs. Pass: HTTP 200, not 400. Also check that an existing Jinja2 prompt that uses only {{ name }} variables keeps the same fields.
fix(frontend): add the /m page a member password reset link opens #8033 On oss.preview (password sign-in), an admin opens /m Settings > Members, picks Reset password for a member, and copies the link. The member opens the link while signed out. Pass: the link opens the /m page "Set a new password" (not the sign-in screen); the member sets a new password, sees "Password updated", and signs in with it; the old password no longer works; opening the same link again shows "This link no longer works". The new text waits for Mahmoud's approval (listed in the PR).