Repository navigation
feat(antigravity): dynamically resolve ACP quota test identity and update docs to 1.4.5 - #29
Conversation
…date docs to 1.4.5
[High impact] The PR changes shared thread, provider, analytics, and desktop workflows across the app. Do not merge until credentialed media reads are restricted and differently filtered usage scans merge without losing records. Findings
|
| const session = window.value.webContents.session; | ||
| return yield* Effect.tryPromise(async () => { | ||
| // Like an <img>, send the session's cookies. | ||
| const response = await session.fetch(url, { credentials: "include" }); |
There was a problem hiding this comment.
Renderer can read private responses
readMedia accepts any HTTP(S) URL from the main renderer, sends the desktop session's cookies, and returns the response body—even for non-media content. If renderer code is compromised, it can read authenticated resources that browser CORS would otherwise protect. Checking the window ID does not restrict the destination.
Omit credentials for unrelated origins and restrict credentialed reads to approved destinations, including redirects.
How this was verified: The bridge accepts a caller-supplied URL, fetches it with credentials: "include", and returns its bytes without checking the destination origin.
| // A scan under another model filter counts different records, so its cells are not missing ones. | ||
| if ( | ||
| owner?.source.status !== "ok" || | ||
| Date.parse(environment.summary.readAt) <= Date.parse(owner.environment.summary.readAt) | ||
| Date.parse(environment.summary.readAt) <= Date.parse(owner.environment.summary.readAt) || | ||
| JSON.stringify(environment.summary.modelFilter) !== | ||
| JSON.stringify(owner.environment.summary.modelFilter) |
There was a problem hiding this comment.
Different model filters are checked only when adding partial scans, but claimSources still chooses one owner for an entire shared source. If two environments share a transcript directory and one includes model A while the other includes model B, the newer successful scan wins and the other model's usage disappears. Token and cost totals then depend on which server refreshed last.
Reconcile differently filtered scans without dropping their non-overlapping records, and add a case with two successful scans.
| export const environmentThreadShells = createEnvironmentThreadShellAtoms({ | ||
| catalogValueAtom: environmentCatalog.catalogValueAtom, | ||
| snapshotAtom: threadEnvironment.snapshotAtom, | ||
| hiddenThreadTagsAtom: serverEnvironment.hiddenThreadTagsAtom, |
There was a problem hiding this comment.
Hidden mobile thread stays open
The mobile tag filter hides list rows but leaves an already-open conversation visible. useResolvedThreadSelection still reads the unfiltered point shell, and ThreadRouteScreen renders it without checking hidden keys. Enabling hideTaggedThreads from another client therefore leaves the full conversation on the mobile screen, unlike the new web route guard.
Add the same visibility check to the mobile route while keeping point reads complete for drafts and outboxes.
Summary
apps/server/src/provider/forkAntigravityQuota.test.tsto dynamically resolve the expected fallback version fromresolveAntigravityReleaseAsset("darwin", "arm64")?.versionrather than hardcoding static version strings like1.4.1or1.4.5. This prevents future upstream ACP runtime upgrades from artificially breaking sync checks.forkAntigravityRuntime.tserror message to guide users to install 1.4.5 if an affected 1.4.2-1.4.4 version is encountered.docs/user/fork-install.mdreferences from 1.4.1 to 1.4.5, reflecting upstream PR feat(antigravity): runtime 1.4.5 with real turn failures and subagent work pingdotgg/t3code#28629's resolution of therun-workflowstray file issue.