Repository navigation
feat: managed policy for organization-wide T3 Code configuration - #27197
Conversation
A machine-wide policy file (/etc/t3code/policy.json, /Library/Application Support/T3Code/policy.json, C:\ProgramData\T3Code\policy.json) sets defaults and locks for server settings. Defaults fill keys the user's file leaves out; locks are laid over every settings read, including each project's overrides, and writes that try to change them are refused. Policy values are never persisted, so removing the file restores the user's own settings. A file this build cannot fully enforce stops the server. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ged policy `show` prints the policy that applies on this machine, or says there is none. `check <file>` validates a draft before an administrator deploys it, with the same decoding and enforcement checks the server runs at startup. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On web and desktop, a settings row whose key the environment's policy locks shows its control inert with "Managed by <organization>" and no reset. On mobile, server settings pages say which organization manages some of them; a locked write is refused with the server's message. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Administrators can set `limits.maxRuntimeMode`. Until now only MCP callers had a mode limit; the user's own commands were unlimited. The orchestrator reads the ceiling once from the policy summary and checks each planned command's events inside the thread's command lock. It refuses a thread created or switched above the ceiling, and refuses a turn started or steered on a thread already above it. The refusal names the organization and the ceiling. It records no receipt, so the same command succeeds once the mode is lowered. Renames, stops and lowering the mode still work on a thread above the ceiling. A caller's own limit is narrowed to the ceiling, and queued runs on a thread above the ceiling are held. A policy whose own defaultRuntimeMode is above the ceiling fails to load. A user's stored default, or a project default, above the ceiling reads back as the ceiling, so new threads keep working. The stored value is left unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A policy file can now say which clients a machine serves (`limits.clients`: desktop, local-browser, remote) and whether T3 Connect is allowed (`limits.connect`). - Startup checks the auth policy the server would run under against `clients` before binding, so a non-loopback host or Tailscale Serve is refused with an error naming the organization, never a silent fallback. `unsafe-no-auth` is refused under any policy file. - Without `remote`, EnvironmentAuth refuses to create pairing links (the startup link for this machine's browser still works) and revokes link-paired sessions and unused links on startup. Connect is treated as remote access, so it is off too. - With Connect off, CloudLink unlinks on startup and refuses link, relay-config, preference, health, and mint requests; the endpoint runtime never starts a connector; the relay client refuses to install; `t3 connect`, `link`, `login`, and `publish` print the policy message. Status, unlink, and logout stay available. - Clients see the effective limits in `ManagedPolicySummary.limits`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e import A managed policy can now set `limits.webhookTasks`, `limits.telemetry`, and `limits.browserCookieImport`. Leaving one out means no restriction; only `false` restricts. Clients see the flags in `ManagedPolicySummary.limits`. - Webhook tasks: the scheduled-task service refuses to save a webhook task, so WS RPC and the MCP tools behave the same. Existing webhook tasks are kept, carry `blockedByPolicy` in the list and MCP read models, and queued deliveries are skipped. The hook route answers 403 before any lookup, run, or delivery log. - Telemetry: product analytics is off under policy whatever T3CODE_TELEMETRY_ENABLED says. Policy cannot turn it on. - Cookie import: the desktop main process reads the policy file on each import and refuses when the policy forbids it. It also refuses when the file cannot be read or decoded. Refusals all use one message shape: "Example Corp's policy does not allow webhook tasks." Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ances A managed policy's `limits.providers` now lets an administrator allow only some provider drivers and pin the environment, binary path, and launch arguments of every instance of a driver (for example Claude through Bedrock). Disallowed drivers' instances stay in settings and show as unavailable with the policy's reason; creating or enabling one is refused, and built-in text generation, review-guide, and branch-naming selections no longer fall back onto them. Pinned fields are laid over instances at read time and never written to the settings file; locked ones refuse edits like locked settings do. Unknown drivers or fields a driver lacks fail the policy at load. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A managed policy can now set limits.updates: mode (auto, manual, off), an https feedUrl, and allowNightly. Clients see it in ManagedPolicySummary.limits.updates. The desktop main process reads the policy file itself. off stops all checks, manual keeps checks while downloads and installs stay user-initiated, feedUrl points electron-updater at a generic feed, and allowNightly: false refuses the nightly channel and holds an install already on nightly until its user switches to stable. A policy file the desktop cannot read or decode turns updates off and logs why. On the server, ServerSelfUpdate and `t3 update` refuse under off and refuse non-stable targets without nightly, with one message: "<organization> manages T3 Code updates." Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…very surface Clients and the server now phrase a policy refusal the same way: the runtime-mode ceiling, a switched-off capability, a disallowed provider, and managed updates each have one helper in the contract. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A hook reads an environment's policy summary, a wrapper shows a control inert with the policy's reason, and settings rows accept a managed reason so any row can be locked the way locked settings already are. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…m off When an environment's policy refuses remote clients, pairing links and the network and Tailscale toggles show inert with the policy's reason; they can still be turned off. When it refuses T3 Connect, linking, agent activity, webhook holding, guest sharing, and the onboarding publish step are unavailable, while link status and unlinking stay. Server updates an administrator manages show the reason instead of an update button, and update-all leaves those environments out. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The composer's permissions picker, reached from the chip, the effort menu, the overflow menu, and mod+shift+a, keeps modes above the administrator's ceiling listed but disabled with the policy's reason. A thread or draft already above the ceiling cannot send; a notice above the composer explains why and switches it to the broadest allowed mode in one click. The default permissions setting disables the same modes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The add-provider dialog offers only drivers the policy allows, ACP Registry included. An instance of a disallowed driver shows its enable switch inert with the policy's reason, and the model picker shows why it is unavailable rather than calling it disabled in settings. Instance fields the policy pins (binary path, launch arguments, environment variables) are read-only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When the policy refuses webhook tasks, the schedule dialog disables the webhook trigger with the reason, and an existing webhook task shows the server's explanation instead of its URL, token, and secret controls. Pause, delete, and switching to a timer stay. Scheduled tasks save in a mode at or below the administrator's ceiling, since they have no mode picker. When the policy refuses cookie import, the import menu says so, and a refusal from the desktop shows the policy's message rather than a generic read failure. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When an administrator manages updates, the sidebar pill, update toasts, the About version row and channel picker, and the update-everything flow give the policy's message instead of offering an update or claiming this build cannot update. Nightly is unavailable when the policy disallows it. Usage data notices say when the policy turned analytics off, and About names the organization that manages the environment with its support link. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When an environment's managed policy caps runtime modes, the thread settings sheet, the new-task sheet, and the scheduled-task mode picker show the modes above the ceiling disabled with the policy's reason. A new task's stale draft mode above the ceiling falls back to the default, and new scheduled tasks start at the ceiling instead of full access. A thread above the ceiling shows the reason above the composer with a button that switches it to the ceiling. Queued messages above the ceiling are handed back to the composer with the server's wording instead of failing settings sync, which retried forever. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…llows Every model picker drops drivers the environment's policy does not allow. A thread or draft already on one shows its model as unavailable, and sending explains that the organization's policy does not allow the provider instead of waiting for the server to refuse. Provider sign-in lists them no more. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… them Server settings pages disable each row or choice a managed policy locks on any selected environment, and name the organization in the row or section footer. The default permissions choices also disable modes above a managed ceiling. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… tasks New tasks no longer offer the webhook trigger when the environment's policy turns webhook tasks off. An existing webhook task keeps the option so it can switch to a timer, but shows the policy's reason in place of its URL and token rotation, and the task list shows the server's blocked reason. Pause, delete, and switching to a timer still work. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An environment with a managed policy says "Managed by <organization>" under its version and links to the organization's support page when the policy has one. When the policy turns updates off, the page shows the policy's reason in place of the update check and install actions, which the server refuses. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rns off Connect Turning Live Activities or ongoing activity on or off links each environment to T3 Connect. An environment whose managed policy turns Connect off refuses that, which failed the whole change for every environment. Those environments are now skipped, like ones this session cannot configure. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The agent sign-in page loads without the server's config, so the approval details now carry the managed runtime-mode ceiling. Access levels above it are disabled and say which organization limits them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e administrator's A user could beat `limits.maxRuntimeMode` without touching the thread's mode: `--dangerously-skip-permissions` in Claude's launch arguments, a wrapper script as any CLI's binary, a config directory with allow rules, an ACP registry command that starts in its own skip-approval mode, or `T3CODE_CODEX_LAUNCH_ARGS` in the server's environment. With a ceiling set, each driver's launch fields (binaryPath, launchArgs, homePath, shadowHomePath, ACP commandPath/commandArgs, OpenCode serverUrl, whichever its schema has) and its whole environment take only what `limits.providers.instances` pins, or the built-in default. Edits to them are refused as managed settings; stored values stay in the file and return once the policy is gone. Drivers launch without `T3CODE_CODEX_LAUNCH_ARGS`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… picks stay under it A run resumed after a restart reached the provider without the orchestrator's ceiling check, so a thread whose mode predates the policy kept running above it. RuntimePolicyV2 now refuses those, and the turn fails with the same "limits threads to" message the orchestrator uses. The runtime policy also carries the ceiling to adapters. An ACP session mode a user picks through `_t3/session-mode` or a mode config option is applied only when the flavor can place it under the ceiling; Antigravity maps its `default`/`auto_edit`/`yolo` modes, and other agents' modes are skipped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mode ceiling Imported threads were created in full access, above any ceiling, and the importer writes events directly, so the orchestrator never refused them. Under a ceiling they now take the project's default runtime mode, which the policy already keeps under it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Such a task saved fine and then failed every run as dispatch_failed. Saving an enabled task above the ceiling now fails with the policy's message, so every surface (WS, MCP) explains it up front. A disabled task can still be saved, so one stored above the ceiling can be turned off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A project override with enabled: true on an instance of a driver the policy leaves out saved, while the same change on the instance itself was refused. Both are now refused the same way. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… reads, and rollout checks (#28000) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com> Co-authored-by: maria-rcks <maria@kuuro.net>
| for (const [driver, known] of KNOWN_DRIVERS) { | ||
| const pin = pins.get(driver); | ||
| const bypasses = pin === undefined ? [] : Object.keys(PIN_BYPASS_FIELDS.get(driver) ?? {}); | ||
| if (maxRuntimeMode !== undefined) { |
There was a problem hiding this comment.
🟠 High policy/managedProviders.ts:319
With limits.maxRuntimeMode set, applyLimits deletes administrator-locked launch settings unless they are duplicated in limits.providers.instances, so effective settings no longer honor accepted settings locks; for example, a locked Claude binaryPath and gateway environment are replaced with no binary path and an empty environment. This branch builds its config rule from the provider pin (which can be absent) and sets environment: "all", overwriting values already applied by managed.applyLocks; preserve those locked values or reject the conflicting policy combination.
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @apps/server/src/policy/managedProviders.ts around line 319:
With `limits.maxRuntimeMode` set, `applyLimits` deletes administrator-locked launch settings unless they are duplicated in `limits.providers.instances`, so effective settings no longer honor accepted settings locks; for example, a locked Claude `binaryPath` and gateway environment are replaced with no binary path and an empty environment. This branch builds its config rule from the provider pin (which can be absent) and sets `environment: "all"`, overwriting values already applied by `managed.applyLocks`; preserve those locked values or reject the conflicting policy combination.
# Conflicts: # apps/desktop/src/backend/DesktopServerExposure.ts # apps/mobile/src/features/settings/SettingsScheduledTasksRouteScreen.tsx # apps/mobile/src/features/threads/ThreadDetailScreen.tsx # apps/server/src/cli/connect.ts # apps/server/src/cli/update.test.ts # apps/server/src/cloud/ManagedEndpointRuntime.ts # apps/server/src/orchestration-v2/Orchestrator.ts # apps/server/src/orchestration-v2/ProviderTurnStartService.ts # apps/server/src/orchestration-v2/RuntimePolicy.test.ts # apps/server/src/project/AgentSessionImporter.test.ts # apps/server/src/provider/ProviderInstanceRegistry.ts # apps/server/src/provider/ProviderInstanceRegistryHydration.ts # apps/server/src/provider/agentContextBudget.json # apps/server/src/scheduledTasks/ScheduledTaskService.test.ts # apps/server/src/scheduledTasks/ScheduledTaskService.ts # apps/server/src/serverSettings.ts # apps/server/src/telemetry/AnalyticsService.ts # apps/web/src/components/auth/ConnectAgentSurface.tsx # apps/web/src/components/chat/ComposerFooterControls.tsx # apps/web/src/components/settings/AddProviderInstanceDialog.tsx # apps/web/src/components/settings/ProviderInstanceCard.tsx # apps/web/src/components/settings/ProviderSettingsForm.tsx # apps/web/src/components/settings/StorageSettings.tsx # apps/web/src/components/sidebar/updateEverything.logic.test.ts # evals/mcp-tool-use/cases/visual-preview.ndjson # packages/provider-acp/src/server/adapter.ts # packages/provider-core/src/server/instanceEnvironment.ts
| idPrefix={idPrefix} | ||
| variant={variant} | ||
| onChange={onChange} | ||
| managedReason={managed?.keys.has(field.key) ? managed.reason : undefined} |
There was a problem hiding this comment.
🟡 Medium settings/ProviderSettingsForm.tsx:690
Local ACP instances under maxRuntimeMode still expose editable commandArgs, even though the server marks config.commandArgs as managed, so policy rejects the edits without explaining why. managedReason reaches only the schema-derived rows; pass the lock reason to ProviderCommandArguments and disable its Add, edit, and Remove controls when locked.
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @apps/web/src/components/settings/ProviderSettingsForm.tsx around line 690:
Local ACP instances under `maxRuntimeMode` still expose editable `commandArgs`, even though the server marks `config.commandArgs` as managed, so policy rejects the edits without explaining why. `managedReason` reaches only the schema-derived rows; pass the lock reason to `ProviderCommandArguments` and disable its Add, edit, and Remove controls when locked.
|
|
||
| const loadSettingsFromDisk = Effect.gen(function* () { | ||
| let settings = DEFAULT_SERVER_SETTINGS; | ||
| let settings = managed.defaults; |
There was a problem hiding this comment.
🟠 High src/serverSettings.ts:757
Policy-provided inline secrets are copied into the user secret store and can remain active after the policy is removed. Because loadSettingsFromDisk starts from managed.defaults, its migration path treats those values as user settings, redacts them, and persists the changed settings; keep policy-derived secrets out of that path or compare against equivalently transformed defaults without storing them.
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @apps/server/src/serverSettings.ts around line 757:
Policy-provided inline secrets are copied into the user secret store and can remain active after the policy is removed. Because `loadSettingsFromDisk` starts from `managed.defaults`, its migration path treats those values as user settings, redacts them, and persists the changed settings; keep policy-derived secrets out of that path or compare against equivalently transformed defaults without storing them.
| {rows.length > 0 ? ( | ||
| <div className="mt-3 min-w-0 space-y-2 pb-2"> | ||
| {rows.map((variable, index) => { | ||
| if (props.managed?.names.has(variable.name)) { |
There was a problem hiding this comment.
🟡 Medium settings/ProviderInstanceCard.tsx:437
A user-created or renamed variable disappears from the editor when its name matches a managed variable, leaving it impossible to correct or remove. This check hides rows based on their current draft name, and reconcileRowsDraft retains that draft when the environment is unchanged; reject managed names before updating the draft or distinguish policy-provided rows from user rows.
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @apps/web/src/components/settings/ProviderInstanceCard.tsx around line 437:
A user-created or renamed variable disappears from the editor when its name matches a managed variable, leaving it impossible to correct or remove. This check hides rows based on their current draft name, and `reconcileRowsDraft` retains that draft when the environment is unchanged; reject managed names before updating the draft or distinguish policy-provided rows from user rows.
…able where needed - A policy whose settings hold a credential is refused: the server would move it into the user's secret store, where it would outlive the policy. - A user variable cannot be renamed to a pinned name, which would hide it as the policy's. - A locked ACP argument list shows read-only with the policy's reason. - A disabled webhook task keeps its fields visible while webhook tasks are off, so it can be fixed and saved. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
**v0.1.7-nightly.20261101.4048** · 47 changes from 33 contributors - **Organization-wide policies.** IT teams can centrally configure approvals, provider gateways, updates, and access to T3 Connect. - **Pointer lock in browser preview.** Test games and 3D viewers that capture the mouse in the desktop browser preview. - **GitLab review status.** See approval badges and filter merge requests by review status. - **PDF reading position.** PDF previews keep their page and zoom when you switch threads. ### Plus 39 more bug fixes and performance improvements. <details> <summary>Full changelog</summary> ## What's Changed * fix(cli): close legacy database before deleting it on Windows by @UtkarshUsername in pingdotgg/t3code#27629 * perf(cursor): load the agent SDK only when needed by @Yash-Singh1 in pingdotgg/t3code#28718 * fix(mobile): restore the reserved compose space on Android by @PixPMusic in pingdotgg/t3code#28819 * fix(mobile): thread links show their thread's title by @juliusmarminge in pingdotgg/t3code#26485 * fix(web): ChatView browser test no longer times out on CI by @juliusmarminge in pingdotgg/t3code#28834 * fix(mobile): sent messages rise into place instead of dropping in by @mozzius in pingdotgg/t3code#28660 * feat: managed policy for organization-wide T3 Code configuration by @juliusmarminge in pingdotgg/t3code#27197 * fix(server): force-stop timed out login shell probes by @hbw00111 in pingdotgg/t3code#7295 * fix(server): finish short reads before returning workspace text by @saphid in pingdotgg/t3code#14989 * perf(client-runtime): merge shell deltas once per received batch by @saphid in pingdotgg/t3code#18416 * perf(web): coalesce overlapping file tree refreshes by @saphid in pingdotgg/t3code#18421 * perf(clients): bound subagent preview processing to the visible prefix by @luke2x in pingdotgg/t3code#21277 * fix(server): avoid transient GitHub mergeability sync churn by @saphid in pingdotgg/t3code#22022 * test(server): stopped-queue steering test no longer races queue promotion by @tris203 in pingdotgg/t3code#22529 * fix(mobile): single-comment PR discussions say "1 comment", not "1 comments" by @MarcoDotIO in pingdotgg/t3code#22926 * fix(client): reject incomplete GitHub owner paths before lookup by @naveed949 in pingdotgg/t3code#23024 * fix(server): accept case-insensitive MCP bearer schemes by @Rish-it in pingdotgg/t3code#23782 * fix(shared): keep Azure clone URLs valid when switching protocols by @Zacharon in pingdotgg/t3code#24005 * fix(web): honor editableFocus in shortcut conditions by @unmanbearpig in pingdotgg/t3code#24134 * fix(scripts): launch check:changed on Windows without a vp shim by @Zacharon in pingdotgg/t3code#24164 * fix(web,mobile): time out client activity reports that never settle by @skyhong2002 in pingdotgg/t3code#24362 * fix(web): the welcome wizard keeps the project selection when you go back a stage by @Jacksondr5 in pingdotgg/t3code#24719 * fix(forgejo): merged and closed pull request lists only return their own rows by @rishabhx29 in pingdotgg/t3code#24772 * fix(clients): background work Stop stays pending until the stopped tasks leave by @Srijan-D in pingdotgg/t3code#25002 * fix(server): device list warnings keep the hub's error detail by @Jacksondr5 in pingdotgg/t3code#25248 * perf(client-runtime): index checkpoint answers in one bounded scan by @saphid in pingdotgg/t3code#25258 * fix(desktop): allow pointer lock in the built-in browser by @msfeldstein in pingdotgg/t3code#25275 * fix(desktop): keep preview download settings out of app exports by @mayesidev in pingdotgg/t3code#25428 * fix(web): PDF previews keep their page across thread switches by @ashx-j in pingdotgg/t3code#25496 * fix(server): unlink_pull_request reports a dismissed stack PR as not linked by @MarcoDotIO in pingdotgg/t3code#25561 * fix(client-runtime): re-pairing at a new address uses the new token by @abdulsalamgs in pingdotgg/t3code#25591 * docs(orchestration-v2): Codex rollback uses thread/revert on paginated threads by @SouthCarpet in pingdotgg/t3code#25705 * fix(web): keep inward mini browser resizes from growing by @diddletime in pingdotgg/t3code#26027 * fix(web): PR merge buttons stay in place while the stack loads by @GisTypical in pingdotgg/t3code#26077 * fix(web): Arabic paragraphs with many English terms now read right to left by @ahmedverona34-bot in pingdotgg/t3code#26095 * fix(web): dark-mode <picture> images load instead of showing "Image unavailable" by @Vikas-Maur in pingdotgg/t3code#26398 * fix(server): foreground Claude forks no longer show as finished the moment they start by @henrychu04 in pingdotgg/t3code#26459 * perf(server): hydrate only the requested project page by @Adamulek123 in pingdotgg/t3code#26655 * perf(effect-acp): frame large ACP stdout lines in linear time by @hieu-lee in pingdotgg/t3code#26686 * perf(shared): fold command output without copying scrollback per chunk by @hieu-lee in pingdotgg/t3code#26691 * perf(web): composer serializes each draft doc once per keystroke by @hieu-lee in pingdotgg/t3code#26720 * fix(gitlab): merge requests show their approval state by @oss96 in pingdotgg/t3code#26877 * test: remove unreachable sidebar helper suites by @t3-code-bot[bot] in pingdotgg/t3code#26920 * perf(clients): thread search reuses per-thread fields across keystrokes by @hieu-lee in pingdotgg/t3code#26936 * perf(mobile): reuse chat lists across navigation renders by @PixPMusic in pingdotgg/t3code#27026 * test(web): pass stale to the stack menu refusal test by @maria-rcks in pingdotgg/t3code#28887 * fix(server): keep a gateway's Claude reset time on a direct 429 by @tyler-b4innova in pingdotgg/t3code#25438 ## New Contributors * @mozzius made their first contribution in pingdotgg/t3code#28660 * @hbw00111 made their first contribution in pingdotgg/t3code#7295 * @Rish-it made their first contribution in pingdotgg/t3code#23782 * @Zacharon made their first contribution in pingdotgg/t3code#24005 * @Srijan-D made their first contribution in pingdotgg/t3code#25002 * @msfeldstein made their first contribution in pingdotgg/t3code#25275 * @abdulsalamgs made their first contribution in pingdotgg/t3code#25591 * @diddletime made their first contribution in pingdotgg/t3code#26027 * @GisTypical made their first contribution in pingdotgg/t3code#26077 * @ahmedverona34-bot made their first contribution in pingdotgg/t3code#26095 * @Vikas-Maur made their first contribution in pingdotgg/t3code#26398 * @oss96 made their first contribution in pingdotgg/t3code#26877 * @tyler-b4innova made their first contribution in pingdotgg/t3code#25438 **Full Changelog**: pingdotgg/t3code@v0.1.7-nightly.20261101.4035...v0.1.7-nightly.20261101.4048 </details> Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.7-nightly.20261101.4048
… (Typechecking apps/server) Failing check: Typechecking apps/server "Typechecking apps/server" failed on 14 errors across three test files. The fixes below clear all of them: the apps/server typecheck now passes, `check_seams` passes, and the three test files pass (17 tests). **Why it failed.** Two upstream changes broke tests: - **Managed policy (pingdotgg#27197).** `AnalyticsService` and `ServerSelfUpdate.make()` now need a new `ManagedPolicy` service. Two fork-owned tests never provided it, so they didn't typecheck: `apps/server/src/fork/runtime-owner/selfUpdateSwitch.test.ts` and `apps/server/src/fork/telemetry-off/AnalyticsService.test.ts`. - **New scheduled-task tests.** Upstream added two tests to `apps/server/src/scheduledTasks/ScheduledTaskService.test.ts` that mock `ManagedProjectFolders` with `namedProjectsRoot`. The fork's `file-placement` seam removed that field, and the four older mocks in the same file already carry the seam. **What I changed.** - In both fork tests I now provide `ManagedPolicy.layerTest()`, the same way upstream's matching tests do. Upstream's selfUpdate test merges it next to `ServerConfig.layer`; I did the same in the switch test and added it to the platform layers in the telemetry-off test. - In `ScheduledTaskService.test.ts` I replaced the two new `namedProjectsRoot: "/projects"` lines with the existing `// fork: file-placement` marker line, just as the older four do. - I raised that file's `file-placement` count in `docs/fork/seams.tsv` from 4 to 6.
… (Running the fork's tests in apps/desktop) Failing check: Running the fork's tests in apps/desktop **What failed:** one test in `apps/desktop/src/backend/DesktopServerExposure.test.ts`, "starts local-only, Serve off, when a managed policy keeps clients local". Upstream added it in pingdotgg#27197 along with the managed policy feature. It turns Tailscale Serve on while a policy limits clients to `["desktop"]`, and it expects the choice to be saved but not applied. Instead, `setTailscaleServeEnabled` threw `DesktopTailscaleServeRefusedError` with reason `not-logged-in`. **Why:** the fork's `tailnet-ownership` seam in `setTailscaleServeEnabled` checks Serve on the machine before saving the setting, and refuses if a Serve claim would fail. Upstream's policy code (`withinPolicy` / `remoteAllowed`) now keeps Serve off whenever the policy keeps clients local. The seam didn't know about that, so it still ran the check. Tailscale isn't logged in on the test machine, so the check refused, though the backend would never have used Serve. **What I changed:** - **`apps/desktop/src/backend/DesktopServerExposure.ts`:** the seam's Serve check now runs only when the policy allows remote clients (`input.enabled && remoteAllowed`). I added a `// fork: tailnet-ownership` marker above that statement and a one-line comment explaining why. Upstream code is untouched. - **`docs/fork/seams.tsv`:** raised that file's marked-line count from 20 to 21. **Checks run:** - The test file now passes, 13 of 13. - `check_seams`, the format check and lint on the file all pass. - The desktop typecheck printed no errors, but its output ended at the cache-miss line, so I didn't see a final pass/fail result. The integration's full rerun will confirm it.
… (Running the fork's tests in apps/mobile) Failing check: Running the fork's tests in apps/mobile **What failed:** In apps/mobile, `src/reactCompilerCoverage.test.ts` failed on "compiles src/features/threads/ThreadSettingsSheet.tsx". The React Compiler skipped the file and reported `PreserveManualMemo: Existing memoization could not be preserved` twice at line 534. No other mobile test failed. **Why:** Line 534 is a `fork: library` seam: a `discardPendingModel` function wrapped in `useCallback(..., [])`. Upstream's managed-policy commit (pingdotgg#27197) changed the same component, `ThreadSettingsSessionProvider`, so it now runs `runtimeModeChoices` through `withManagedRuntimeModeLimits(..., [config?.managedPolicy])`. After that change the compiler would no longer keep the fork's manual `useCallback`, so it gave up on the whole file. Upstream's own code compiles fine. The fork seam is what tripped the check. **What I changed:** I edited only the seam lines in `apps/mobile/src/features/threads/ThreadSettingsSheet.tsx`. `discardPendingModel` is now a plain arrow function, the `fork: library` marker is still on it, and the compiler memoizes it itself. Its only body is two state setters, so it stays stable for the `useFocusEffect` in `ThreadSettingsDetailsScreen`. The `useCallback` import is still used there. I didn't touch any upstream code, and the file did not need to go on the bailout list. The full `reactCompilerCoverage.test.ts` now passes (1239/1239), and lint and `check_seams` report nothing on the change.
- compileCache.ts: take upstream's prepared server bytecode flow (pingdotgg#28572), keep Cody's cody/compile-cache directory. - runtimeInstructions.ts: Antigravity now skips PR linking (pingdotgg#28629); Cody's final-answer block moves into runtimeInfo so both returns carry it. - MessagesTimeline.logic.ts: Cody's wrap-up answers count as terminal replies, so they get upstream's hover timestamp while commands run (pingdotgg#28610). - BranchToolbarBranchSelector.tsx: take upstream's undeferred branch search (pingdotgg#27434), keep Cody's full-ref keys. - Mobile scheduled tasks: keep Cody's "Post runs to" picker and label beside upstream's managed-policy webhook notice and blocked-by-policy line (pingdotgg#27197). - tailscale.test.ts: keep both new imports. - Upstream tests rebranded: cody:// app links in DesktopLifecycle.test.ts, Cody branding in the DesktopStartupRecovery.test.ts stub, full refs from WorktreeBaseBranchPicker. Both desktop tests join personal-fixes.json. - Windows sign-in setting: drop try/finally so React Compiler optimizes it (reactCompilerCoverage). - Superseded: none. Adapted: none; worktree base fetch still goes through Cody's resolveWorktreeBaseRemote, which upstream now calls once and passes along (pingdotgg#28582). - personal-fork skill: sync notes for this run.
* fix(web): changing the sidebar project filter starts the list at the top (pingdotgg#27327) * fix(web): find the fallback model in Settings search (pingdotgg#27376) * fix(web): Backspace no longer re-nests a checkbox under a bullet (pingdotgg#27384) * perf(server): reuse compiled modules for CLI commands (pingdotgg#27433) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): preview tab list shows desktop tabs that loaded before the server attached (pingdotgg#27456) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(web): Esc in the theme color picker restores the previous color (pingdotgg#27472) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(shared): preserve escaped trailing whitespace in CLI arguments (pingdotgg#27485) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(shared): preserve surrogate pairs in truncated CSV cells (pingdotgg#27497) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(gitlab): report an expired glab OAuth login as an auth error (pingdotgg#27511) * fix(web): expanded SVG diagrams fill the image viewer (pingdotgg#27519) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(web): configure reasoning for the fallback model (pingdotgg#27593) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(web): keep diff base selector available after errors (pingdotgg#27635) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(mobile): resume continues a usage-limited thread before its queue (pingdotgg#27662) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(client): a new thread's content no longer stays blank after an early 404 (pingdotgg#27722) Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> * fix(web): skill labels show the skill's own name (pingdotgg#27741) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): disclose truncated history in imported threads (pingdotgg#27743) * fix(opencode): recover Go limits after a startup timeout (pingdotgg#27757) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): worktree threads get their generated branch name when a branch named t3 exists (pingdotgg#27815) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): restart continuation checks before repeating side effects (pingdotgg#27836) * fix(shared): /Model with a query still opens the model picker (pingdotgg#27837) * fix(server): empty primary cookie no longer blocks bearer auth (pingdotgg#27848) Co-authored-by: maria-rcks <maria@kuuro.net> * perf(mobile): text files open in half the time on a remote host (pingdotgg#27850) * fix(web): composer fallback keeps the effort of a model saved under an alias (pingdotgg#27859) Co-authored-by: maria-rcks <maria@kuuro.net> * perf(server): skip no-op settlement decisions (pingdotgg#27897) Co-authored-by: Omar <76748259+omar9848492@users.noreply.github.com> * fix(codex): a failed write to the app-server no longer leaves requests hanging (pingdotgg#27924) Co-authored-by: Trevor Edwards <9443483+trevoedwards@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): projects without a repository stop spawning git on every lookup (pingdotgg#27980) * fix(server): scheduled tasks start from the default branch, not always main (pingdotgg#27983) * fix(server): subagent threads no longer inherit a pending title job (pingdotgg#27990) Co-authored-by: Claude Code (claude-opus-5-5) <claude-code@logueos.local> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): show mixed automatic defaults across environments (pingdotgg#28005) * fix(client): the folder browser shows folders added or removed while T3 runs (pingdotgg#28064) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): chat folds stay closed until tapped, as on web and desktop (pingdotgg#28072) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): align composer context icons and space their labels (pingdotgg#28083) * fix(web): horizontal scrolling inside diff and file panes no longer switches threads (pingdotgg#28091) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): remember T3 Connect HTTP/2 fallback across restarts (pingdotgg#28105) * fix(server): provider updates no longer time out mid-download (pingdotgg#28132) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): delegate_task accepts the inherited options orchestrator_capabilities reports (pingdotgg#28133) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): finished threads leave Working once the grace ends (pingdotgg#28169) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): sidebar drops a deleted project's filter with the local environment disabled (pingdotgg#28179) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): terminal URLs like redis:// no longer become broken file links (pingdotgg#28189) Co-authored-by: MarcoDotIO <20867620+MarcoDotIO@users.noreply.github.com> * fix(web): skill menus show loading while project skills arrive (pingdotgg#28209) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(desktop): SnapShots keep working on Hyprland after an app update (pingdotgg#28240) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): Tab completes folder names in the add-project browser (pingdotgg#28243) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(web): make Changes and PR Code file lists resizable (pingdotgg#28244) Co-authored-by: Lukas Tomondy <lukas.tomondy@moonpyre.com> * perf(web): main thread updates no longer re-render an open side chat (pingdotgg#28264) * perf(server): skip unused parent data when forking threads (pingdotgg#28265) * perf(server): stop summarizing side chat context at its cap (pingdotgg#28266) * perf(web): typing in a thread no longer re-renders sidebar drafts (pingdotgg#28267) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(scripts): Alchemy reference sync reads the catalog version (pingdotgg#28268) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * docs(mobile): mobile README links the store apps instead of calling the app unreleased (pingdotgg#28269) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(web): render minimap highlights without extra nodes (pingdotgg#28270) * fix(ci): a change to the T3 Connect troubleshooting guide runs the server test that reads it (pingdotgg#28273) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(scripts): report:renders works on machines without ~/.cache (pingdotgg#28274) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * docs: composer banner guidance names a consumer that still exists (pingdotgg#28276) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * docs(mobile): name the Android 16 Agent Live Updates switch in the notifications guide (pingdotgg#28310) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): prevent composer image thumbnail flicker (pingdotgg#28499) * fix(clients): questions always move a thread out of Working (pingdotgg#28515) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(scheduler): run a scheduled task once at a specific date and time (pingdotgg#28104) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): stopping a Claude turn no longer hangs without an acknowledgement (pingdotgg#16419) Co-authored-by: Codex (gpt-6.1-sol) <noreply@openai.com> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * feat(mcp): preview_open goes straight to a dev-server port (pingdotgg#28027) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(server): interrupted scheduled task runs no longer stay busy (pingdotgg#28474) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(desktop): preserve host focus on preview pointer presses (pingdotgg#28549) * fix(web): add spacing above PR detail metadata (pingdotgg#28573) * feat(dev): add startup profiling for cold-start diagnosis (pingdotgg#28566) * feat(clients): surface child approvals in parent threads (pingdotgg#28516) * feat(release): update notes lead with up to 7 highlights (pingdotgg#28593) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * test(server): pin clock in saved-usage window test (pingdotgg#28603) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): sidebar project filter no longer refocuses after a pick (pingdotgg#28605) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(desktop): prepare server bytecode cache in native builds (pingdotgg#28572) * fix(desktop): discover shell environment without blocking startup (pingdotgg#28556) * fix(server): refresh Changes totals after remote polls (pingdotgg#28600) * perf(codex): trace app server request latency (pingdotgg#28666) * fix(web): align pull request file viewed checkboxes (pingdotgg#28665) * fix(desktop): skip prepared server bytecode on Linux (pingdotgg#28700) * fix(cli): close legacy database before deleting it on Windows (pingdotgg#27629) * perf(cursor): load the agent SDK only when needed (pingdotgg#28718) * fix(mobile): restore the reserved compose space on Android (pingdotgg#28819) * fix(mobile): thread links show their thread's title (pingdotgg#26485) * fix(web): ChatView browser test no longer times out on CI (pingdotgg#28834) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): sent messages rise into place instead of dropping in (pingdotgg#28660) Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> * feat: managed policy for organization-wide T3 Code configuration (pingdotgg#27197) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com> Co-authored-by: Theo Browne <me@t3.gg> Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): force-stop timed out login shell probes (pingdotgg#7295) Co-authored-by: hbw00111 <196409728+hbw00111@users.noreply.github.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): finish short reads before returning workspace text (pingdotgg#14989) Co-authored-by: SAPHID <saphid@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * perf(client-runtime): merge shell deltas once per received batch (pingdotgg#18416) Co-authored-by: SAPHID <saphid@users.noreply.github.com> Co-authored-by: GPT-6.1 Sol <noreply@openai.com> * perf(web): coalesce overlapping file tree refreshes (pingdotgg#18421) Co-authored-by: SAPHID <saphid@users.noreply.github.com> Co-authored-by: GPT-6.1 Sol <noreply@openai.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> * perf(clients): bound subagent preview processing to the visible prefix (pingdotgg#21277) * fix(server): avoid transient GitHub mergeability sync churn (pingdotgg#22022) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: SAPHID <saphid@users.noreply.github.com> * test(server): stopped-queue steering test no longer races queue promotion (pingdotgg#22529) * fix(mobile): single-comment PR discussions say "1 comment", not "1 comments" (pingdotgg#22926) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(client): reject incomplete GitHub owner paths before lookup (pingdotgg#23024) Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): accept case-insensitive MCP bearer schemes (pingdotgg#23782) Co-authored-by: maria-rcks <maria@kuuro.net> Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(shared): keep Azure clone URLs valid when switching protocols (pingdotgg#24005) Co-authored-by: maria-rcks <maria@kuuro.net> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): honor editableFocus in shortcut conditions (pingdotgg#24134) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(scripts): launch check:changed on Windows without a vp shim (pingdotgg#24164) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(web,mobile): time out client activity reports that never settle (pingdotgg#24362) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): the welcome wizard keeps the project selection when you go back a stage (pingdotgg#24719) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(forgejo): merged and closed pull request lists only return their own rows (pingdotgg#24772) * fix(clients): background work Stop stays pending until the stopped tasks leave (pingdotgg#25002) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): device list warnings keep the hub's error detail (pingdotgg#25248) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(client-runtime): index checkpoint answers in one bounded scan (pingdotgg#25258) Co-authored-by: SAPHID <saphid@users.noreply.github.com> * fix(desktop): allow pointer lock in the built-in browser (pingdotgg#25275) Co-authored-by: Michael Feldstein <michael@feldstein-macbook-air.tail8b57b.ts.net> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(desktop): keep preview download settings out of app exports (pingdotgg#25428) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(web): PDF previews keep their page across thread switches (pingdotgg#25496) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): unlink_pull_request reports a dismissed stack PR as not linked (pingdotgg#25561) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(client-runtime): re-pairing at a new address uses the new token (pingdotgg#25591) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * docs(orchestration-v2): Codex rollback uses thread/revert on paginated threads (pingdotgg#25705) * fix(web): keep inward mini browser resizes from growing (pingdotgg#26027) * fix(web): PR merge buttons stay in place while the stack loads (pingdotgg#26077) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(web): Arabic paragraphs with many English terms now read right to left (pingdotgg#26095) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(web): dark-mode <picture> images load instead of showing "Image unavailable" (pingdotgg#26398) Co-authored-by: Vikas - AWS Auto <vikasmaur.in.13@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): foreground Claude forks no longer show as finished the moment they start (pingdotgg#26459) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): hydrate only the requested project page (pingdotgg#26655) * perf(effect-acp): frame large ACP stdout lines in linear time (pingdotgg#26686) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(shared): fold command output without copying scrollback per chunk (pingdotgg#26691) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(web): composer serializes each draft doc once per keystroke (pingdotgg#26720) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(gitlab): merge requests show their approval state (pingdotgg#26877) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * test: remove unreachable sidebar helper suites (pingdotgg#26920) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: maria-rcks <maria@kuuro.net> * perf(clients): thread search reuses per-thread fields across keystrokes (pingdotgg#26936) Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> * perf(mobile): reuse chat lists across navigation renders (pingdotgg#27026) Co-authored-by: maria-rcks <maria@kuuro.net> * test(web): pass stale to the stack menu refusal test (pingdotgg#28887) Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(server): keep a gateway's Claude reset time on a direct 429 (pingdotgg#25438) Co-authored-by: maria-rcks <maria@kuuro.net> * perf(shared): skip parsing cached terminal styles (pingdotgg#27041) * perf(web): compact changed-file directories once (pingdotgg#27073) * fix(web): chat text can be cited while file search is open (pingdotgg#27131) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(mobile): Home list no longer opens scrolled down (pingdotgg#27155) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): clean unchanged worktrees without a remote (pingdotgg#27175) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(web): settled shelf no longer crashes with several projects filtered (pingdotgg#27231) Co-authored-by: maria-rcks <maria@kuuro.net> Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(server): t3_thread_read pages no longer split an emoji in half (pingdotgg#27273) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(desktop): disable blocked t3 CLI installation (pingdotgg#27286) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(claude): approval cards close when Claude withdraws the request (pingdotgg#27320) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): Claude threads revert to the message after a /compact (pingdotgg#27381) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): show why Codex hooks stopped a turn (pingdotgg#27399) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(client): a resume no longer re-renders every home row five times (pingdotgg#27404) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * perf(server): stop measuring replay bytes once over budget (pingdotgg#27405) * fix(web): Enter selects the first branch search result (pingdotgg#27434) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(client-runtime): threads with many images no longer flood a remote with URL requests (pingdotgg#27440) Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> * fix(web): format inline code typed with a dead-key backtick (pingdotgg#27457) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): Claude no longer tries to update itself through a mise command wrapper (pingdotgg#27466) Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> * perf(client): avoid temporary arrays in inbox snapshots (pingdotgg#27467) * fix(mobile): give drafts the current thread card layout (pingdotgg#28789) * fix(server): delegated tasks finish even when the child leaves a watcher running (pingdotgg#27468) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): preserve surrogate pairs in generated thread titles (pingdotgg#27483) * fix(shared): preserve files outside log rotation naming (pingdotgg#27503) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): a preview navigation that fails mid-load keeps its failure (pingdotgg#27537) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(web): Settings search finds rows by their titles (pingdotgg#27540) * docs(opencode): say where compaction is configured (pingdotgg#27614) Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> * fix(server): Antigravity no longer delays server startup by deleting old runtimes (pingdotgg#27651) Co-authored-by: Lukas <340913497+LukeCommits@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): the undo notice no longer pushes the update button out of the sidebar (pingdotgg#27695) Co-authored-by: Nicholas Wasmiller <derped@mnpl.fyi> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(providers): Antigravity API-key setup says Connect (pingdotgg#27759) * fix(effect-acp): honor advertised session delete capability (pingdotgg#27771) Co-authored-by: maria-rcks <maria@kuuro.net> * fix(web): bare URL links keep trailing underscores and tildes (pingdotgg#27794) * perf(client): repeated server settings keep the same settings object (pingdotgg#27818) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): preview browser picks up Chrome 156.0.8078.79 security fixes (pingdotgg#27822) * fix(shared): truncate keeps emoji whole (pingdotgg#27841) * fix(shared): inverted terminal ranges emit no fake lines (pingdotgg#27843) * fix(mobile): markdown images no longer shake on Android (pingdotgg#27943) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(shared): opening a database waits for another process's lock (pingdotgg#28288) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * Show the full title in lineage/side-chat row tooltips (pingdotgg#28326) * fix(server): look up a run's turn-start items by run, not by walking thread history (pingdotgg#28343) * fix(web): skip star prompt when the server check is unavailable (pingdotgg#28364) Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com> * perf(server): reuse untracked paths in Git status (pingdotgg#28374) * perf(server): avoid building unused peer HTTP clients (pingdotgg#28405) * fix(provider): show exit details when ACP session startup crashes (pingdotgg#28419) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): folder rows no longer jump at larger interface font sizes (pingdotgg#28428) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): Changes row no longer shows +0 while Diff has edits (pingdotgg#28439) * fix(clients): pasting a path copied from Finder or Explorer adds that folder (pingdotgg#28460) * fix: paste-as-text shortcut on non-Latin layouts (pingdotgg#28470) * fix(server): let slow worktree submodule checkouts finish (pingdotgg#28482) * fix(server): an old link card no longer keeps a thread asking for input (pingdotgg#28491) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): clicking a file in the Files tree keeps focus on that row (pingdotgg#28521) * docs(claude): explain idle compaction fallback (pingdotgg#28532) Co-authored-by: maria-rcks <maria@kuuro.net> * perf(shared): strip plan prefixes in linear time (pingdotgg#28537) * perf(shared): count terminal resume lines without allocations (pingdotgg#28539) * perf(web): terminal updates no longer re-render every sidebar row and chat (pingdotgg#28563) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(web): chat view redraws no longer re-render the composer or side chat timeline (pingdotgg#28564) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * perf(server): worktree creation spawns fewer git processes (pingdotgg#28582) Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> * fix(web): many automations no longer hide the thread details Automations section (pingdotgg#28585) * fix(clients): open a delegated child's approval on the environment it runs in (pingdotgg#28592) Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> * fix(web): finished replies keep their hover timestamp while commands run (pingdotgg#28610) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): treat a repository's only non-origin remote as its primary remote (pingdotgg#22119) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: GPT-6.1 Sol <noreply@openai.com> Co-authored-by: maria-rcks <maria@kuuro.net> * perf(server): sort the working-tree file list once per status read (pingdotgg#22499) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): keep theme color alpha when a hex value is typed (pingdotgg#23136) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(web): keep saved sensitive variables from losing their value (pingdotgg#23168) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * perf(server): t3_thread_read loads a page's items in one query (pingdotgg#23176) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): use loaded branch for untouched worktree base (pingdotgg#23241) Co-authored-by: GPT-6.1 Sol <noreply@openai.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): report a created PR as created when its lookup fails (pingdotgg#23242) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(opencode): steers keep the turn's agent, variant and instructions (pingdotgg#23270) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * perf(ci): skip PR vouch jobs for ordinary comments (pingdotgg#23387) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): sort pull request lists and timelines by time (pingdotgg#23588) Co-authored-by: GPT-6.1 Sol <noreply@openai.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(ci): thread transfer report stops paging all main CI runs (pingdotgg#23633) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): T3 Connect keeps a log file of its tunnel connector (pingdotgg#24485) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(server): saving a shortcut no longer deletes rules it can't read (pingdotgg#24494) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(web): installing two providers at once starts both (pingdotgg#24655) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): Codex switches respect each instance's CODEX_HOME variable (pingdotgg#24664) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> * fix(server): dev seeding accepts migration histories the server boots (pingdotgg#24665) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(web): interval settings save when editing ends, not per keystroke (pingdotgg#24673) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(web): a failed plan follow-up no longer overwrites the next draft (pingdotgg#24684) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(server): selected-file commits stop when the index reset fails (pingdotgg#28275) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(opencode): OpenCode installs T3 can't identify no longer get an Update button that hangs (pingdotgg#28278) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): MCP calls skip the caller's message history (pingdotgg#28282) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(web): streamed replies render a list's code block as the finished reply does (pingdotgg#28285) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(ci): a providerEnv.ts change runs every package's tests (pingdotgg#28286) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(opencode): OpenCode 1.x text generation deletes its scratch session (pingdotgg#28294) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> * fix(scripts): check:changed no longer passes failing .github/scripts tests (pingdotgg#28296) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): Diagnostics memory no longer reads "1024.0 MB" (pingdotgg#28300) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): sending a message no longer rereads the thread from the database after settle, snooze or title updates (pingdotgg#28301) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): device tools keep the typed text when a command fails (pingdotgg#28323) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): turn diffs keep the agent's files when git's diff.relative is on (pingdotgg#28361) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): tracked clones keep an explicit SSH protocol on fallback and Retry (pingdotgg#28365) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(claude): Claude text generation stops saving throwaway transcripts (pingdotgg#28367) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(desktop): bound the Linux xdg-mime registration like its sibling helpers (pingdotgg#28368) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(opencode): OpenCode 1.x text generation gives up after 3 minutes like every other runner (pingdotgg#28372) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): a fork no longer inherits the source thread's pin, auto-settle and delegation state (pingdotgg#28378) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): deleting a thread clears its saved right-panel, diff-panel and mini-player state (pingdotgg#28386) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): command projection failures keep their cause (pingdotgg#28389) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(providers): slow Grok, Pi and fx starts no longer show as unavailable (pingdotgg#28400) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(evals): GPT eval summaries no longer call a proxied run free (pingdotgg#28403) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): truncated text stays the same when projected again (pingdotgg#28418) * fix(desktop): a settings relaunch no longer replays the link that launched the app (pingdotgg#28464) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): Codex sessions get T3CODE_THREAD_ID like Claude sessions (pingdotgg#28604) * feat(usage): filter Usage totals by provider and model (pingdotgg#28952) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): allow folder references on saved local desktop servers (pingdotgg#27785) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): clarify the waiting label for background work (pingdotgg#28969) * fix(preview): agent browser use no longer steals composer focus (pingdotgg#28613) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): token telemetry counts each request once and only confirmed models (pingdotgg#29001) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * update the claude entrypoint identifier for accuracy (pingdotgg#28410) * fix(web): keep pending pull request actions scoped to each request (pingdotgg#29005) * fix(desktop): load the renderer while the backend starts (pingdotgg#28715) * fix(web): settings search no longer jumps or clears on an IME Enter or Escape (pingdotgg#28298) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maria-rcks <maria@kuuro.net> Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com> * fix(mobile): explain why voice input is unavailable (pingdotgg#28698) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(server): Codex calls t3_thread_wait directly instead of from Code Mode (pingdotgg#29026) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * refactor(server): name Codex's direct-only T3 MCP server t3-code-direct (pingdotgg#29068) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(mobile): files with brackets in their names attach on Android (pingdotgg#28983) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): Stop ends a run whose provider turn already finished (pingdotgg#28520) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): a linked retry closes the waiting link card it names (pingdotgg#28387) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): a stored boolean settledOverride no longer stops startup (pingdotgg#28314) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): remote updates no longer fail when the staged preflight is slow on a loaded host (pingdotgg#28201) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): idle compaction survives a late update for an earlier run (pingdotgg#28102) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): usage prices bare model names at the maker's rate when a reseller marks them up (pingdotgg#28004) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): model picker uses the full window height in short windows (pingdotgg#29017) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(server): open clients no longer stay on "Updating" after a provider update (pingdotgg#27992) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * ci(release): preview releases run from any branch (pingdotgg#27828) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(desktop): save and copy any image the app can show (pingdotgg#29079) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(chat): threads show when you switch models or effort (pingdotgg#28995) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat(antigravity): runtime 1.4.5 with real turn failures and subagent work (pingdotgg#28629) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * feat: tag threads and hide tagged threads while recording (pingdotgg#29053) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * perf(cli): short commands like t3 --version no longer load the whole server (pingdotgg#29127) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> * fix(web): play completion sounds without delay (pingdotgg#29146) Completion alerts waited two seconds after the client received a completed thread state. Audio was also fetched and decoded only when an alert needed to play, adding a first-play delay. Notify immediately when the thread shell reports completion, and preload both sounds when a user gesture unlocks audio. Keep completion deduplication and suppression for existing, archived, and stopped runs. This intentionally removes the continuation grace for completion alerts. A completed run can now notify before an automatic continuation starts. The sidebar's two-second placement grace and server settlement behavior remain in place. Validation: `vp run check:changed` passes after merging current main, including 40 affected tests, formatting, lint, unused-code checks, affected typechecks, and React compiler checks. Tests cover immediate completion, duplicate suppression across reconnects, preloaded audio reuse, and retrying failed loads on alerts without retrying on every gesture. Audible timing has not been verified in a live client. Model: GPT 6.1 Sol. Harness: Codex through T3 Code. * fix(web): preserve scroll position when expanding work details (pingdotgg#29166) * fix(server): Claude threads no longer join the Claude session that launched T3 (pingdotgg#29169) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Igor Makowski <56691628+Mnigos@users.noreply.github.com> Co-authored-by: Lakshmi Tanmay <lakshmi@voltcrash.com> Co-authored-by: Lee Keun Hwee <56650238+Geuni620@users.noreply.github.com> Co-authored-by: maria-rcks <maria@kuuro.net> Co-authored-by: Cameron Chisholm <cam@camchis.com> Co-authored-by: Einar Andersson <72999+drdator@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: maco <gosarmarcel7@gmail.com> Co-authored-by: Daniel Walsh <walshydev@gmail.com> Co-authored-by: Melbourne Baldove <18225174+melbaldove@users.noreply.github.com> Co-authored-by: BelKed <66956532+BelKed@users.noreply.github.com> Co-authored-by: Nate Glasby <109429948+NathanGlasby@users.noreply.github.com> Co-authored-by: AbdelrahmanTamer21 <70696275+AbdelrahmanTamer21@users.noreply.github.com> Co-authored-by: Will Adams-Keane <willadamskeane@gmail.com> Co-authored-by: juuulianx <150259733+juuulianx@users.noreply.github.com> Co-authored-by: MarcoDotIO <Marcus.Arnett10@gmail.com> Co-authored-by: xlurie <42911814+xlurie@users.noreply.github.com> Co-authored-by: samkelly880 <hawk@invert.nz> Co-authored-by: Mantas Kantautas <mantas.kantautas@gmail.com> Co-authored-by: Omar <76748259+omar7550@users.noreply.github.com> Co-authored-by: Omar <76748259+omar9848492@users.noreply.github.com> Co-authored-by: Trevor <trevoedwards@users.noreply.github.com> Co-authored-by: Trevor Edwards <9443483+trevoedwards@users.noreply.github.com> Co-authored-by: Pyseph <45090858+Pyseph@users.noreply.github.com> Co-authored-by: Vux <tuanvux01@gmail.com> Co-authored-by: Dreighto <andreokoc@gmail.com> Co-authored-by: Claude Code (claude-opus-5-5) <claude-code@logueos.local> Co-authored-by: James Tatum <jtatum@gmail.com> Co-authored-by: M.Umais Adeed <165276382+Umais-Adeed@users.noreply.github.com> Co-authored-by: Etan Heyman <93338119+EtanHey@users.noreply.github.com> Co-authored-by: ABDUL RAHMAN JAMSHID NASSER AL RASHDI <143622128+Ajraba04@users.noreply.github.com> Co-authored-by: Shawn <5414767+playcations@users.noreply.github.com> Co-authored-by: NotAnNvidiaFan <85665968+NotAnNvidiaFan@users.noreply.github.com> Co-authored-by: tiliakoos <73005126+tiliakoos@users.noreply.github.com> Co-authored-by: MarcoDotIO <20867620+MarcoDotIO@users.noreply.github.com> Co-authored-by: Ryan McDonough <Rhinomcd@gmail.com> Co-authored-by: Michael Morahan <morahan.mike@gmail.com> Co-authored-by: Lukas <lukas.tom42@gmail.com> Co-authored-by: Lukas Tomondy <lukas.tomondy@moonpyre.com> Co-authored-by: Yuruzuu <108398860+Yuruzuu@users.noreply.github.com> Co-authored-by: Victor Vogel <satsdev@only21mil.xyz> Co-authored-by: Yash Singh <saiansh2525@gmail.com> Co-authored-by: Theo Browne <me@t3.gg> Co-authored-by: yaacovcorcos <coryacos1@gmail.com> Co-authored-by: Codex (gpt-6.1-sol) <noreply@openai.com> Co-authored-by: maria-rcks <254055478+maria-rcks@users.noreply.github.com> Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com> Co-authored-by: Alex <me@pixp.cc> Co-authored-by: Julius Marminge <julius0216@outlook.com> Co-authored-by: Samuel Newman <mozzius@protonmail.com> Co-authored-by: Matthew Feroz <136640686+MatthewFeroz@users.noreply.github.com> Co-authored-by: Adamulek123 <adam.bogucki2018@gmail.com> Co-authored-by: hbw00111 <2277038744@qq.com> Co-authored-by: hbw00111 <196409728+hbw00111@users.noreply.github.com> Co-authored-by: Alex Southwell <saphid@gmail.com> Co-authored-by: SAPHID <saphid@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: luke <97411838+luke2x@users.noreply.github.com> Co-authored-by: Tristan Knight <admin@snappeh.com> Co-authored-by: Naveed Iqbal <naveediqbal949@gmail.com> Co-authored-by: Cursor <cursoragent@cursor.com> Co-authored-by: Rishit <104666906+Rish-it@users.noreply.github.com> Co-authored-by: Zach <113211893+Zacharon@users.noreply.github.com> Co-authored-by: Ivan Fedyunin <unmanbearpig@gmail.com> Co-authored-by: Sky Hong <sky9109@gmail.com> Co-authored-by: Jackson Miller <jackson@jackson.codes> Co-authored-by: Rishabh_t106 <rishabh.j.tripathi2903@gmail.com> Co-authored-by: Srijan Dubey <87586713+Srijan-D@users.noreply.github.com> Co-authored-by: Michael Feldstein <msfeldstein@gmail.com> Co-authored-by: Michael Feldstein <michael@feldstein-macbook-air.tail8b57b.ts.net> Co-authored-by: Isaac Mayes <github@mayesid.com> Co-authored-by: ash <ash8val@gmail.com> Co-authored-by: عبدالسلام <144791955+abdulsalamgs@users.noreply.github.com> Co-authored-by: Fuksss <fuxik12345@gmail.com> Co-authored-by: diddletime <ktjae11@gmail.com> Co-authored-by: Gerardo Torres <62493842+GisTypical@users.noreply.github.com> Co-authored-by: Ahmed Mostafa <ahmedverona34@gmail.com> Co-authored-by: Vikas-Maur <68019002+Vikas-Maur@users.noreply.github.com> Co-authored-by: Vikas - AWS Auto <vikasmaur.in.13@gmail.com> Co-authored-by: Henry Chu <henrychu04@gmail.com> Co-authored-by: Hieu Le <78847613+hieu-lee@users.noreply.github.com> Co-authored-by: oss96 <45469086+oss96@users.noreply.github.com> Co-authored-by: t3-code-bot[bot] <269035359+t3-code-bot[bot]@users.noreply.github.com> Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com> Co-authored-by: tyler-b4innova <104792926+tyler-b4innova@users.noreply.github.com> Co-authored-by: Abhijeet Singh <asingh9829@gmail.com> Co-authored-by: melvinmng <melvinmng@icloud.com> Co-authored-by: Jagrat <46803744+jagrat7@users.noreply.github.com> Co-authored-by: Sparsh Kaushik <github@sparshkaushik.com> Co-authored-by: ahalekelly <7078138+ahalekelly@users.noreply.github.com> Co-authored-by: Narayan Joshi <159036898+Narayan201120@users.noreply.github.com> Co-authored-by: Aleks Tatter <alekstatter@gmail.com> Co-authored-by: voida6 <kainth.ravdeep@gmail.com> Co-authored-by: Gourav Kumar Dhiman <gkrdhiman@gmail.com> Co-authored-by: Byntham <135178921+Byntham@users.noreply.github.com> Co-authored-by: Craig Davison <5341072+davisonio@users.noreply.github.com> Co-authored-by: Wagner Rosa <wagner.deoliveira@revvity.com> Co-authored-by: Lukas <dyd.lukas.real@gmail.com> Co-authored-by: Lukas <340913497+LukeCommits@users.noreply.github.com> Co-authored-by: Nicholas Wasmiller <derped@mineperial.com> Co-authored-by: Nicholas Wasmiller <derped@mnpl.fyi> Co-authored-by: kamkm <99585688+Kamkmgamer@users.noreply.github.com> Co-authored-by: Dmytro Mishchenko <narmdv5@gmail.com> Co-authored-by: Solomon Botchway <62394255+snnbotchway@users.noreply.github.com> Co-authored-by: Fatih ÖZDİL <72515197+fatihozdil@users.noreply.github.com> Co-authored-by: Behzad Motaghi <behzad@motaghi.dk> Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com> Co-authored-by: Guanying Chen <138278175+gchen0002@users.noreply.github.com> Co-authored-by: shivam <91240327+shivamhwp@users.noreply.github.com> Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: sergiiopm <120517513+sergiiopm@users.noreply.github.com> Co-authored-by: William Sedlacek <william.sedlacek@icloud.com> Co-authored-by: Kim Khoi Lam <83523907+kimkhoi2202@users.noreply.github.com> Co-authored-by: ValeraZSD <48602572+ValeraZSD@users.noreply.github.com> Co-authored-by: Dmitry Farafonov <mail.xaber@gmail.com> Co-authored-by: George Nijo <george.nijo8@gmail.com> Co-authored-by: Shkumbin Hasani <34962865+shkumbinhasani@users.noreply.github.com> Co-authored-by: Rob Homewood <rob.homewood@googlemail.com> Co-authored-by: Bilal Irfan <bilalirfancontact@gmail.com> Co-authored-by: Ruslan Panamarenka <album.777.leo@gmail.com>
Merges `pingdotgg/t3code` `main` at `91f66f88de` (435 commits since
`80a2351fcb`) into the fork. Branches from `main`; nothing stacked.
## Resolution
- 25 conflicts, each resolved by the verdict `preflight.mjs` printed.
Landed 1222 files against 1224 in the upstream range. The gap is the
deleted `cli/pair.ts` / `pair.test.ts`, plus `PreviewEmptyState.tsx`
keeping the fork's copy, whose text does not promise discovered local
servers. The fork delta is 770 files (766 before).
- Fork deltas re-applied on upstream's new structure:
- **Composer:** the `FEATURES.accessMode` gate moved from the dropped
`extraMenuContent` to the new model-picker footer
(`ComposerModelEffort.tsx`).
- **Project settings:** the `projectManagement` wrap now also covers
upstream's Pin/Archive rows.
- **`ChatView.tsx`:** the fork dialog and script props survive
upstream's side chats and its re-indented `ThreadDetailsPanel`.
- **Sidebar:** `isSidebarSubagentThread` became upstream's
`isSidebarHiddenThread` with the fork's `source` arm.
- **Dispatch acknowledgement:** `hasServerAcknowledgedLocalDispatch`
keeps the fork's wider connecting rule.
- **Terminal sessions:** the known-sessions atom reads `.terminals`.
- Collateral fixes found by tests:
- The thread-shell navigation filter also hides side chats.
- Upstream's new terminal-sessions test uses the fork's metadata-scan
shape.
- Upstream's interval tests opt in to `providerConfiguration`.
- `agentContextBudget.json` is upstream's plus 108 bytes (`47646`).
`pnpm-lock.yaml` is re-derived.
- Inventory:
- New path-policy entries: `terminal-sessions-metadata-read`,
`sidebar-hidden-thread`, `chat-view-dispatch-ack`.
- `chat-composer-gates` now includes `ComposerModelEffort.tsx`.
- Two duplicate-add exceptions added; the stale DiffPanel exception is
retired.
- Unsupported methods: ADD 0. DROP `artifacts.setVisibility`: Moatless
now dispatches it, but `apps/server` refuses it, so it is declared as
exception `artifacts-set-visibility-upstream-refusal` instead of dropped
from the union.
- The merge commit was made with `--no-verify` (knip, as on 2026-10-31).
## Verification
- `verify.mjs --fast`: green. This covers duplicate-adds, tripwires,
resolution-check, unsupported-methods, lockfile, format, lint, typecheck
and the web build.
- Tests: the full parallel pass hit the 3600 s deadline, so each package
was then run alone.
- **Passed:** web, client-runtime, desktop, mobile, contracts and the
other small packages. On its re-run, web passed 540 of 541 files. The
failure was `fileEditorDismissal.browser.test.tsx`, which is identical
to upstream and passed when run alone. The flaky PDF reload test in
`AttachmentFilePreview` also passed alone.
- **Known sandbox failures, same as 2026-10-31:**
- `t3`: RepositoryIdentityResolver, GitVcsDriver, GitVcsDriverCore,
CodexChatGptAuth and CodexManagedRuntime fail on the git `insteadOf`
rewrite and `/tmp`.
- `provider-opencode`: `OpenCodeServerLedger` fails on `/tmp`.
- Not caused by this merge.
## Usable as-is
- Model and effort in one control (pingdotgg#28057), with the Permissions menu
gated by `FEATURES.accessMode`.
- The context meter shows tokens against the limit (pingdotgg#27892).
- Copy app version (pingdotgg#24788), plus sidebar and minimap polish and many
client perf commits.
- Child approvals surface in the parent thread (pingdotgg#28516). This works to
the extent Moatless reports subagent requests.
## Unsupported in Moatless / needs implementation
- **Side chats (pingdotgg#26901):**
- Wire: `thread.fork` with `sideChat: true`, `lineage.sideChat`, and the
`environment.capabilities.sideChats` capability.
- Today: Moatless reports no capability, so the client never offers side
chats.
- To implement: persist `lineage.sideChat`, keep side chats out of
listings, and seed them from a capped summary of the parent
(`apps/server/src/orchestration-v2/ContextHandoffService.ts`). Then
report the capability.
- **Project pin/archive (pingdotgg#26154):**
- Wire: `pinnedAt` / `archivedAt` on the project shell, `pinned` /
`archived` on `project.update`, and the `projectOrganization`
capability.
- Today: hidden by the capability and by `FEATURES.projectManagement`.
- **One-time scheduled tasks (pingdotgg#28104):** the `{type:"once", runAt}`
trigger and the `oneTimeSchedules` capability. Moot while
`FEATURES.scheduledTasks` hides scheduled tasks.
- **Managed policy (pingdotgg#27197):** `managedPolicy` in server config, with
`packages/contracts/src/managedPolicy.ts`. Moatless sends none, so
`ManagedControl` / `ManagedNotice` never render. Only worth doing if an
org policy is wanted.
- **Usage model filter (pingdotgg#28952):** `modelFilter` on
`server.getUsageSummary` is ignored by Moatless, so the summary reads as
unfiltered.
- The new capabilities are recorded in `docs/fork/gaps.md` (capabilities
entry).
## Backend behavior to consider reproducing in Moatless
- **Forks:** a fork does not inherit its source's pin, auto-settle or
delegation state (pingdotgg#28378).
- **Thread delete:** `thread.delete` takes `onlyIfUnused`.
- **Failed worktree setup:** a worktree thread whose setup failed is
flagged instead of running in the project checkout
(`orchestrationV2WorktreePending`).
- **Scheduled tasks:** a one-shot trigger, and interrupted runs no
longer stay busy (pingdotgg#28104, pingdotgg#28474).
- **Usage:**
- The model filter applies server-side, and each request is counted once
(pingdotgg#28952, pingdotgg#29001).
- Days-old usage-limit recoveries are not re-armed (pingdotgg#21735).
- Continuation checks restart before repeating side effects (pingdotgg#27836).
- **Worktree and VCS:**
- Fewer git processes on worktree creation (pingdotgg#28582), and slow submodule
checkouts may finish (pingdotgg#28482).
- `diff.relative` no longer breaks turn diffs (pingdotgg#28361).
- Selected-file commits keep merge ancestry (pingdotgg#24744).
- **MCP orchestrator tools:**
- `preview_open` goes to a dev-server port (pingdotgg#28027).
- Multi-PR link/unlink (pingdotgg#27994, pingdotgg#27925).
- `delegate_task` accepts reported capabilities (pingdotgg#28133).
- **Provider runtime:**
- Codex gets `T3CODE_THREAD_ID` (pingdotgg#28604).
- Claude reverts correctly after `/compact` (pingdotgg#27381).
- Stopping a Claude turn no longer hangs (pingdotgg#16419).
- These are recorded under _Runtime fixes upstream made to its own
server_ in `docs/fork/gaps.md`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---
Moatless task:
https://moatless.soaplabstest.com/tasks/c48ef9db-84ec-45d9-91eb-6e5602378e6a
Companies that want to roll T3 Code out to their teams have no way to configure it centrally. Every setting belongs to whoever runs the app, so an IT team can't require approvals, keep phones and T3 Connect off a machine, pin providers to a company gateway, or control updates.
Docs: https://github.com/pingdotgg/t3code/blob/t3/managed-policy/docs/user/managed-policy.md
This adds a managed policy, which an administrator deploys with their usual device management tool, in one of these places:
com.t3tools.t3code/Library/Application Support/T3Code/policy.jsonPolicy(REG_SZ, JSON) underHKLM\SOFTWARE\Policies\T3Tools\T3CodeC:\ProgramData\T3Code\policy.json/etc/t3code/policy.jsonA machine with both a native policy and a file refuses to start rather than merging them.
The server on that machine enforces it for every client: desktop, browser, mobile, MCP agents, scheduled tasks and the CLI.
What a policy can do
settings: a default or a lock for any server setting, by path. Locked controls show "Managed by ⟨org⟩" on web and mobile. Policy values are never written into the user'ssettings.json, so removing the file brings back what users had chosen. Locks also apply inside per-project overrides.limits.maxRuntimeMode: the broadest permission mode allowed. It's enforced in the orchestrator for every command, including turn start, MCP agent sign-in, scheduled tasks and ACP session modes. A thread already above the cap is refused new turns, with a one-click switch down, and is never silently lowered. Under a cap, provider launch settings and the provider environment come from the policy only, because wrapper binaries, launch flags orNODE_OPTIONScould otherwise turn off a provider's approvals.limits.clients(desktop,local-browser,remote) andlimits.connect: the server refuses to bind wider than allowed, stops issuing pairing links, and revokes earlier pairings at startup. Withoutremote, T3 Connect is off too.limits.webhookTasks,browserCookieImportandtelemetry: turn each one off. Telemetry off covers product analytics and the server's and desktop's relay traces.limits.providers: an allowed driver list, plus fields set on every instance of a driver (env vars, base URL, binary path, launch args), locked or as defaults. This is how an admin routes Claude through Bedrock or a gateway.limits.updates:mode: "off", a desktopfeedUrlmirror, andallowNightly: false.t3 policy showandt3 policy check <file>.Any problem in the file stops the server: invalid JSON, an unknown key, or a wrong type. A key this build can't enforce would otherwise look enforced. Admin docs are in
docs/user/managed-policy.md.Not covered yet
~/.claude,~/.codex). The docs point admins to each provider's managed settings.feedUrlonly redirects the desktop app;t3 updatestill goes through npm and GitHub.Verification
vp run check:changedpasses: format, lint, knip, typecheck of 36 packages, and 75 test files (893 tests). It includes new tests for the settings overlay, lock vetting, the mode cap in the orchestrator, auth and Connect refusals, webhook tasks, provider hydration and update policy.Nothing has been checked in a running client yet, so there are no screenshots. Still to check by hand: the managed rows in web and mobile settings, the disabled mode options and switch-down button in the composer, and the provider environment editor locking.
Built with Claude Opus 5.5 in Claude Code, inside T3 Code.
🤖 Generated with Claude Code