Skip to content

[release] v0.128.4 - #8024

Merged
mmabrouk merged 215 commits into
mainfrom
release/v0.128.4
Nov 3, 2026
Merged

mmabrouk merged 215 commits into
mainfrom
release/v0.128.4

Conversation

@github-actions

@github-actions github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

New version v0.128.4 in

  • web
    • web/oss
    • web/ee
    • web/mobile
  • services
  • api
  • sdks
    • sdks/python
  • clients
    • clients/python
    • clients/typescript
  • kubernetes
    • kubernetes/helm

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/summary request repeats; on a wide window the sidebar credits meter still updates. Log out. Pass: you land on /auth with no bounce to /, and IndexedDB agenta-query-cache is 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).

WahidSaeed and others added 30 commits August 3, 2026 23:03
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
…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.
…ntical calls (#7951)

Part of #7951.

Signed-off-by: Yunus Ardaguney <yunusarda-sudo@users.noreply.github.com>
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.
allcontributors Bot and others added 22 commits November 3, 2026 10:19
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, "")
mmabrouk and others added 5 commits November 3, 2026 12:45
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 mmabrouk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 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.

@mmabrouk
mmabrouk merged commit ab04932 into main Nov 3, 2026
84 of 91 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants