Nit-only round. Two comments still described the target as holding the value
resolution had read, which the previous commit removed, and `ResolvedDraft` still
declared a `value` field no caller reads. The field is gone with them, so the type
says what it is: where the draft lives.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Third CI round, third P1 from the same source. `ResolvedDraftTarget` carried the
draft's value alongside its key, so that a body reading the draft it just resolved
would not fetch twice. Every reader that merges onto that value can be stale by
the time it runs: a tool awaits other work before writing, and the user can edit,
save and close the editor in that window.
The first two rounds patched `readGlobalDraftValue` — once for the open editor,
once for the editor that closed. Codex then found the same bug in the next reader
along: `write_flow` restores `inline_script.<id>` placeholders through
`getGlobalDraft`, so a body saved during the wait came back as the old code. Worse
than before the patches, since the metadata around it was now preserved: the user
would see their settings survive and their code silently revert.
So the value is gone from the type. A resolved target is a path and a storage key,
nothing else, and the two readers below it fetch: the cell if an editor holds one,
else the backend. The cost is one request on calls that used to answer from the
carried value; three P1s came out of saving it.
`addressedDisplayPath` named the item from that value; it now asks the open
editor, which answers synchronously and is the only place a name can be fresher
than the stored draft anyway.
Tests: the placeholder race Codex described, which fails against the previous
commit's code. Also drops a comment line the `fresh` removal left restating the
sentence above it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Seven conflicts, all in the app-write path and all the same shape: main added a
code diff to each app tool's result (`finishAppDraftWrite` grew a `codeDiff`
argument, and the file tools capture the before-text), while this branch changed
those same calls to address a resolved target and report the name the app deploys
under. Both kept: the diff argument and `inlineRunnableDiff` from main, the
resolved target and `appPath` closure from here. Main's side of each hunk still
called `loadAppDraftValue(args.path, …)` and read `{ value }` from it, which no
longer type-checks — the merged helpers take a target and return the value — so
the call shape had to come from this side.
The last conflict is the ACTIVE EDITOR block: main added an `isNew` hint telling
the model not to create a second item over a template, this branch emits the
storage key as `path` with the chosen name as `draft_path`. Both are now emitted.
Main also added `quickjs-emscripten-core`, so this worktree needed `npm install`;
without it `tsc` reports the module missing.
One test, `test_run_step opens an aiagent step on the step's own configuration`,
hangs after this merge. It hangs the same way on pristine `origin/main`
(`eab3dd5a52`, 30s with the timeout raised), so it arrived with main rather than
with this resolution — a seventh pre-existing failure, not a regression.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat: choose build with AI or code when creating a raw app
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: carry the picked data table into a new-app session and seed only on 404
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: wait for data tables before build with AI and stop re-registering on edits
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: create apps without an unusable data table and name session-seeded apps
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat: rename new-app choices and hint where to switch to AI later
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat: open a run as a pushed page on narrow runs page
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep modifier-click multi-select and arrow keys on the narrow runs list
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: leave the narrow re-run page once the re-run is sent, and clear the opened run on reset
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: close the re-run options once a table re-run completes
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: serve the raw-app preview shell sandboxed, load a blob copy in the editor
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: give the preview shell the deployed app wrapper's sandbox flags
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix: drop the add a prompt for AI button from the run page
* fix: open the run page in the session preview from a plain chat button
* fix: rename additional prompt for AI to AI prompt
* fix: put the run page chat button beside advanced when no AI prompt
* fix: search slow runs filters by time windows instead of timing out
* fix: cancel a pending runs page when its listing is reset
* fix: keep runs scan windows disjoint at microsecond precision
* fix: race the single runs request against the window scan
* fix: list the cursor window when a runs scan starts at the oldest job
* fix: show the runs history scan as an info alert
* fix: show runs scan progress as a bar and keep the session button on the searchbar row
* fix: stop a runs scan whose windows are no faster when narrower
* fix: right-align the runs searchbar row when the header wraps
* fix: keep the runs scan stop button inside a narrow list pane
A team plan canceled mid-month now keeps premium until the 1st, capped at the
executions its final invoice paid for. That reuses the past-due cap, so the job
refusal and the UI toast said "your last invoice is unpaid". Word both for a
canceled plan, and show it on the plan settings page.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat(ai-chat): show per-file diffs for raw app edits
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep reference runnable writes on the generic tool card
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: extend diff row highlights across horizontal overflow
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: collapse queued and running chat tool calls into a waiting row
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: correct the waiting-row comment in groupToolRuns
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: fold queued calls only behind a call in flight, after edit groups
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: stop a waiting row before queued calls that form an edit or explore group
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: flush proxied responses before the dev supervisor closes the client
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* chore: shorten dev supervisor close-path comment
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* refactor: use the session tab strip for workflow sdk module tabs
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep module deletion on the explicit button and tab order view-only
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* refactor: use the design-system button for module deletion
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: let modified keys through file tabs and keep keyboard rename off the tab
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: route modified enter past the dnd zone so page shortcuts fire from draggable tabs
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: forward modified enter from dnd item wrappers too
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: evaluate field conditions and step test inputs in QuickJS
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: answer single-quoted field conditions without loading the engine
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: bound expression recursion and ignore leading blank space
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: card layout and load-more for the audit logs page
* fix: stream audit log load-more with stop control and show inline filters from fhd
* fix: fit audit log filters to measured header width and hold timeline during load-more
* fix: keep audit log load-more available when a trimmed short batch has rows left
* fix: stream the ai chat compaction request instead of waiting on it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: reject a compaction stream stopped midway instead of keeping partial text
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: reject a compaction stream that ends without a finish reason
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* test: cover a completed responses stream in the streamed completion helper
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* feat: redesign the service logs page
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: drop a stale jump after a cached host switch and remove unused max_lines
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep focus on url sync and expose host selection and new logs to assistive tech
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: reset the tail on dropdown host picks, resume refresh after search, key log cache by host
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: clear the pending jump when a host switch needs no fetch
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat: show upcoming events when hovering a schedule's cron expression
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: read cron version from the draft for draft-only schedule previews
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat: replace the AI input filling toggle with an additional prompt for AI
* feat: pass the additional prompt for AI to MCP clients and shared AI guidance
* feat: shrink the run page AI card to a button and a collapsed prompt
* fix: offer writers a way to add a prompt for AI from the run page
* fix: keep a resource default set in the schema when the script is redeployed
Fixes#11493
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep a schema resource default only while the arg stays that resource type
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: drop a scalar resource default when the arg becomes a list
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: let legacy draft-only items be discarded from the home page
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: describe the legacy draft move guard as it now is
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* feat: add an instance setting routing all dependency jobs to one tag
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: keep bunnative locks on bun and explain the default dependency routing
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Codex blocked the round on the other half of the previous fix. Reading the cell
first covers an editor that stays open, but the user can also edit, save, and
close the editor while a tool waits — `write_flow` waits on the provider catalog.
Closing releases the cell, so the read fell back to the value captured at dispatch,
which is now older than the row the editor just saved: the write reverted the saved
summary and settings and dropped a staged rename, and it did not even conflict,
because the save had advanced the syncer's timestamp.
`readGlobalDraftValue` no longer consults that value at all — the cell if an editor
holds one, else the backend. Both of its callers merge onto what it returns, so
neither could ever use a value that predates the wait, and the `fresh` flag that
let the deploy opt out of it goes with it: there is nothing left to opt out of.
Only the storage key is reused across the wait now, never the contents.
The cost is one request per write, which is what the captured value was saving. Two
P1s came out of that saving.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat: add test key button to AI resource drawers
* fix: scope-check inline AI resource values and keep test model editable
* fix: keep test model editable for unsaved resources, own-key provider check
* fix: restore the save to workspace button on inline flow steps
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: make the inline step save to workspace button icon only
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: offer user scopes in the slack scope editor and drop the generated description on type change
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: offer slack write scopes as bot and user scope options
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Four conflicts, all where main reshaped code this branch had added to.
`open_preview` grew an access-gated `schemaFor` and a view/edit `mode`, and
`openSessionPreview` gained `workspace` + `access` parameters: kept both, with this
branch's `draftTarget` and `ctx.target` threaded through the new signature. Main
also added an early return for pipelines, which makes this branch's
`kind === 'pipeline'` guard on the path unreachable — dropped it, along with the
pipeline comment the restructure stranded above non-pipeline code.
`draftWriteFailure` took main's `DRAFT_CONFLICT_RESULT` / `DRAFT_SAVE_FAILED_RESULT`
constants with this branch's `displayPath`, and `init_app` took main's rewritten
template message with this branch's resolved target.
`setDeployedInSessionHandler`: main replaced `syncPreviewWithDeployed` with
`itemDeployed`, which also stops sync, discards, bumps the deploy revision and
invalidates both workspace caches, and added those invalidations to the
not-mounted path. Kept all of it, with this branch's forget-and-retarget when the
deploy moved the item, and `itemDeployed` now called at the path the tab was
retargeted to — identical to the addressed path when nothing moved.
Outside the conflicts, main renamed `isEditorTabFor(url, target)` to
`isItemTabFor(url, target, side)` for its editor/viewer tab split. The merge kept
this branch's two calls to the old name without flagging it, so `retargetEditorItem`
threw at runtime while compiling clean; both now pass `'edit'`, the side whose cell
can be raced.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat(sessions): show an item's deployed page in the preview panel
The preview panel showed an item's editor and nothing else. It now shows the
deployed page too, as a tab of its own.
**Two sides, two tabs.** The editor and the deployed page are different things
to look at, so `isItemTabFor` keys on the side rather than the item: asking for
a side already open focuses it, asking for the other opens it alongside. Two
editors for one item still cannot coexist — they would race its single
(kind, path) cell — but an editor beside a viewer is safe, since the viewer
reads the deployed version over the API and holds no cell. The tab breadcrumb
keeps re-pointing in place; `Exit & see details` and the detail page's `Edit`
open the other side instead of consuming the one you are on. A tab's label
carries `(edit)` when it is the editor side.
**The detail pages moved out of their routes.** `/scripts/get` and `/flows/get`
are now thin wrappers over `ScriptDetail` and `FlowDetail`, which the panel
renders too. Everything they reach — drawers, triggers, saved inputs — is scoped
to the viewer's workspace through `setOperatingWorkspace`, and every navigation
they attempt is caught by `interceptNav` and turned into a move inside the
panel, so nothing takes the browser out of the session. A plain click is
intercepted; ⌘-click and middle-click still open a real tab, which is why the
pages keep their `href`s.
**The picker opens what exists.** A row opens the deployed page, or the editor
when nothing is deployed there, and carries a Draft / Draft only badge in the
review dock's words. `WorkspaceItem` gained `draftOnly` and `hasDraft` from the
listers, which already returned both; deploys now invalidate the picker cache
through `itemDeployed`, so a just-deployed item stops reading as a draft. Rows
also carry a hover Edit action, reachable from the keyboard with the pick
modifier.
`open_preview` gained a `mode`, narrowed out of the advertised schema for a
session that cannot write drafts and re-checked per path in the handler, where
a refusal reports "couldn't check" apart from "denied". The mode is resolved
before those checks, so a call that omits it is gated as the editor it will
become.
Alongside, the workspace a detail page acts on is now the one it is showing
rather than the one the browser is navigated to: `MoveDrawer`,
`toggleWorkspaceErrorHandler` and the pages' own permission gates read the
operating workspace and its acting user, and `RunForm` mints a password
argument's ephemeral variable there too — in a fork session all of these
previously answered for the parent. `InWorkspaceAppViewer` hands the app's
`ctx` user down as a prop instead of writing the global `userStore`, which from
a session tab was re-pointing every permission check on the page.
Fixes found on the way: `DetailPageLayout` claimed `h-screen` inside a panel
that is not the viewport; Edit on a historical script version dropped the
version from the intercepted click; the Run button stayed spinning after a run
that left the page mounted; and the window-level run shortcut fired from a
collapsed panel and from keys another handler had already claimed.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
* fix(sessions): historical edits, stale not-found, shared edit rights, tab labels
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): keep deployed-page links and workspace reads in the session
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): scope detail hrefs to the session, re-point the viewer's own tab
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): keep a previewed raw app's route out of the session URL
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): resolve edit-in-fork against the session workspace
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): read advanced run tags from the session workspace
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): fork from the session workspace, star only navigation items
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): mount only the side a preview tab shows
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): address CI review round 1 findings
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): route links in a deployed page's drawers through the panel
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): tell the chat which deployed page the panel shows
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): only a 404 reads as an undeployed raw app
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): scope the unparseable-JSON run gate to the form
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): a flow deleted from the panel stays in its tab
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): the picker's edit shortcut works on the current row
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): load-error toasts say what failed
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix(sessions): keep an oversized invalid JSON editor in its form's run gate
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* revert: keep main's draft_only description in openapi.yaml
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
* feat: let slack connects issue a user token via user_scope
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: keep trailing newline in ee-repo-ref
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: bump ee-repo-ref
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: name the provider in slack token descriptions and refresh them on reconnect
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: drop the generated slack description when connecting another provider
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: drop the slack scope pin migration, slack ignores scope on refresh
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix: clear the generated slack description on client-credentials connects too
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: update ee-repo-ref to ff4d04f17721d84fb9a1f655af50ff7e4e7dcbc7
This commit updates the EE repository reference after PR #837 was merged in windmill-ee-private.
Previous ee-repo-ref: 83298dcf23574d5ed05e6c767bf1d9b067ab7a95
New ee-repo-ref: ff4d04f17721d84fb9a1f655af50ff7e4e7dcbc7
Automated by sync-ee-ref workflow.
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Ruben Fiszel <ruben@windmill.dev>
Co-authored-by: windmill-internal-app[bot] <windmill-internal-app[bot]@users.noreply.github.com>
* feat: show human labels for oauth scope options in the connect dialog
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: always show scope checkboxes, label gdocs and gchat scopes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* feat: offer default scopes as checkboxes for every oauth provider
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix: block runs while a JSON input does not parse
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: clear json editor error on unmount and flush editors before run
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: restore validity when a nullable arg input is cleared
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: let field editors parse before the run check and reset the message on view switch
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* fix: clear the run refusal message when form validity changes
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* oauth: add gdocs and gchat providers, gchat icon
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* oauth: Google sign-in button for every accounts.google.com provider, least-privilege gchat default
- AppConnectInner: derive isGoogleSignin from the registry auth_url instead of a
hardcoded list, so gdocs/gchat/gforms/gcloud/gworkspace get Google's button.
- gchat default scopes: chat.messages is a restricted scope; default to
chat.spaces.readonly + chat.messages.create (both sensitive). chat.messages /
chat.messages.readonly stay selectable.
- BRAND_COLORS.md: GchatIcon row in sort order.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix: keep flow graph rendered between deploy and navigation
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* refactor: rename flow snapshot to avoid shadowing in loadFlow
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>