Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
30eb7e7
fix(mobile): overlay sidebar header blurs content scrolling under it …
juliusmarminge Oct 28, 2026
fec83a1
fix(web): numbered composer lists nest and lift correctly (#17138)
michal-billtech Oct 28, 2026
612a8e5
feat(mobile): add dynamic workflows to the Agents sheet (#18642)
Bil0000 Oct 28, 2026
237498c
fix(ci): Android merges stop cutting a new Play Store build every tim…
juliusmarminge Oct 28, 2026
886d8f6
fix(mobile): dictation confirm button no longer hugs the small compos…
juliusmarminge Oct 28, 2026
be6ff17
feat(devices): lease simulators and emulators from a Simlock pool (al…
juliusmarminge Oct 28, 2026
ba18706
fix(mobile): use a native split button for Android merges (#26373)
PixPMusic Oct 28, 2026
9e09926
docs: settings paths name the Environments and Sharing & access pages…
juliusmarminge Oct 28, 2026
9826dbb
docs(agents): agents verify in a browser or simulator without asking …
juliusmarminge Oct 28, 2026
5b89a53
feat(pull-requests): manage GitHub maintainer edits (#25588)
Bil0000 Oct 28, 2026
d464631
fix(web): image chips drop the pill and match other chips (#26379)
flamboh Oct 28, 2026
e34067e
fix(mobile): align settled and active thread rows (#26622)
PixPMusic Oct 28, 2026
e677e97
fix(server): publish local git status before remote lookup (#21046)
JustYannicc Oct 29, 2026
26caea2
fix(server): outside MCP clients get thread links they can open (#26642)
t3dotgg Oct 29, 2026
725573f
fix(web): double-click selects the whole inline code span (#26639)
t3dotgg Oct 29, 2026
b287102
fix(acp): ID-only command approvals keep the tracked command and gran…
juliusmarminge Oct 29, 2026
37a9ca0
fix(cursor): subagent ls, lint and MCP results no longer fail the par…
juliusmarminge Oct 29, 2026
29f33af
perf(web): long-thread timeline rebuilds 45 → 9 ms, tool updates 12 →…
juliusmarminge Oct 29, 2026
a42bdd4
fix(mobile): a thread opened while reconnecting no longer turns into …
shivamhwp Oct 29, 2026
221610f
fix(web): keep settled drop hint inside the sidebar viewport (#26736)
Yash-Singh1 Oct 29, 2026
be7d86f
feat(devices): Simlock setup uses each machine's agent-device token, …
juliusmarminge Oct 29, 2026
a5448f4
fix(web): pull request diff follows the file tree, with a hide-tests …
juliusmarminge Oct 29, 2026
8ff9ae1
fix(mobile): delivered messages no longer reappear at the bottom of l…
juliusmarminge Oct 29, 2026
d8f4980
ci(mobile): fork PRs now get the Native Change label (#26755)
juliusmarminge Oct 29, 2026
5eebf77
fix(claude): command approvals show the command, not Claude's descrip…
maria-rcks Oct 29, 2026
7b87466
docs: add nixpkgs installation instructions (#26750)
0x4bs3nt Oct 29, 2026
861a51a
feat(server,web,mobile): fall back when the default provider is out o…
maria-rcks Oct 29, 2026
783581d
fix(ci): fork PRs now resolve in workflow_run PR lookups (#26779)
juliusmarminge Oct 29, 2026
8298664
fix(server,cursor,opencode): refresh provider usage when a turn hits …
maria-rcks Oct 29, 2026
fe219c4
fix(web): keep tool groups collapsed after a usage-limit pause (#24937)
shivamhwp Oct 29, 2026
7632c3d
fix(mobile): photo-library PNGs no longer fail after resizing (#26522)
shivamhwp Oct 29, 2026
ab1e221
fix(server): guest links no longer return file diffs (#26538)
nexxeln Oct 29, 2026
eb565e1
fix(claude): Open diff shows Claude edits as a diff instead of raw JS…
nexxeln Oct 29, 2026
dac8b11
chore: vouch nexxeln (#26812)
t3dotgg Oct 29, 2026
f855f01
chore(release): prepare v0.1.4
t3-code-bot[bot] Oct 29, 2026
310c128
feat(web): Labs toggle keeps 5h, weekly, and context limits in view (…
t3dotgg Oct 29, 2026
6d82a22
fix(desktop): bump Electron to 44.10.0 for the Node.js Brotli fix (CV…
nabettu Oct 29, 2026
da1eab0
chore: make agent mistakes fail early (#26167)
t3dotgg Oct 29, 2026
ccaa3ad
feat(marketing): hero shows four agents running at once (#26875)
t3dotgg Oct 29, 2026
35b298a
fix(web): undo notice moves to the sidebar footer so it never covers …
t3dotgg Oct 29, 2026
58e60bf
feat: turn a No project thread into a project (#26767)
t3dotgg Oct 29, 2026
4432fbe
feat(antigravity): Claude and GPT models, thinking levels, and diff e…
t3dotgg Oct 29, 2026
d7935f1
feat(web): choose what the thread details card shows (#26904)
t3dotgg Oct 29, 2026
f2943ee
feat(updates): switch your whole fleet between Stable and Nightly in …
t3dotgg Oct 29, 2026
c1876b5
fix(antigravity): file reads no longer show unrelated errors (#26910)
t3dotgg Oct 29, 2026
b5fc7be
feat(release): release notes and the update popover open with a short…
t3dotgg Oct 29, 2026
48247dd
fix(cli): t3 starts on a fresh Ubuntu server without libatomic (#26912)
t3dotgg Oct 29, 2026
e6ca170
fix(web): update everything no longer waits on npm for service hosts …
t3dotgg Oct 29, 2026
3748c5c
test(web): pin the npm wait floor for update everything (#26921)
t3dotgg Oct 29, 2026
7f55281
fix(antigravity): served reads stop spinning and duplicate model name…
t3dotgg Oct 29, 2026
9acb769
fix(server): queue Copilot follow-ups without killing background agen…
shivamhwp Oct 29, 2026
4453f53
fix(web): Antigravity effort no longer shows a speedometer in the com…
t3dotgg Oct 29, 2026
6d450a4
fix(release): Linux CLI archives build on runners without package doc…
t3dotgg Oct 29, 2026
88ab83e
fix(web): reconnecting notice no longer shifts the new thread compose…
t3dotgg Oct 29, 2026
20497e4
feat(marketing): homepage looks like the app (#26960)
t3dotgg Oct 29, 2026
37fbefd
chore(release): prepare v0.1.5
t3dotgg Oct 29, 2026
960d576
fix(cli): restore Windows desktop launcher console input (#24870)
t3-code-bot[bot] Oct 29, 2026
09a7675
chore(coil): merge upstream/main 960d5761c1 (57 commits)
radroid Oct 29, 2026
0d3d6e6
fix(coil): knip:check passes on the fork
radroid Oct 29, 2026
d0a53da
ci(coil): the daily sync's merge commit skips authoring hooks
radroid Oct 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 2 additions & 2 deletions .agents/skills/test-t3-mobile/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ This installs the dev client for the checkout's native fingerprint: from the
device, the local cache, or the shared cache in seconds, building once only
when no machine has that fingerprint yet (5-15 minutes, logged to the file it
names). The device id may be omitted when exactly one device is booted. It
prints one JSON line; on failure it names the next command. Authorized mobile
verification includes that step unless the user prohibits it.
prints one JSON line; on failure it names the next command. Mobile verification
includes that step unless the user prohibits it.

For a device you opened in an agent-device session elsewhere (a device pool,
cloud, or remote host), run `vp run mobile:install <ios|android> --session <s>`
Expand Down
1 change: 1 addition & 0 deletions .github/VOUCHED.td
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ github:myacoub91
github:naMqe-h
github:nateEc
github:naveed949
github:nexxeln
github:nmggithub
github:Noojuno
github:notkainoa
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/agent-context-budget.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,5 +51,5 @@ jobs:
echo "Accepted by the agent-context-increase label."
exit 0
fi
echo "::error file=$BUDGET::Agent context grew compared to main. Cut the added text, or ask a maintainer to add the agent-context-increase label."
echo "::error file=$BUDGET::Agent context grew compared to main. Cut the added text and rerun the evals that cover it (evals/README.md), or ask a maintainer to add the agent-context-increase label."
exit 1
189 changes: 189 additions & 0 deletions .github/workflows/mobile-fingerprint-label.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
name: Mobile Fingerprint Label

# Trusted half of mobile-fingerprint-check.yml. That workflow runs PR code
# (fork PRs included) with a read-only token and records which platforms'
# fingerprints changed. This one runs from main with a write token and syncs
# the "📱 Native Change" label. It never checks out or runs PR code.
#
# A PR can edit the check workflow it runs under, so the recorded result is
# untrusted data: it is validated, and at worst a PR mislabels itself.

on:
workflow_run:
workflows: [Mobile Fingerprint Check]
types: [completed]

permissions:
contents: read

jobs:
label:
name: Sync native change label
# A cancelled run was superseded by a newer push, whose run labels instead.
if: >-
github.event.workflow_run.event == 'pull_request' &&
github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-24.04
timeout-minutes: 5
permissions:
actions: read
contents: read
issues: write
pull-requests: write
steps:
- id: pr
name: Resolve the pull request behind the check
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
with:
script: |
const run = context.payload.workflow_run;
const { owner, repo } = context.repo;
const artifacts = await github.paginate(github.rest.actions.listWorkflowRunArtifacts, {
owner,
repo,
run_id: run.id,
per_page: 100,
});
const results = artifacts.filter(
(artifact) => artifact.name === "fingerprint-result" && !artifact.expired,
);
if (results.length !== 1) {
core.info(`Expected one fingerprint-result artifact; found ${results.length}. Skipping.`);
return;
}
// workflow_run.pull_requests and the commit-to-PR lookup are both
// empty for fork PRs, so list open PRs by head owner and branch.
// Requiring the PR's current head to be the checked commit keeps a
// slow run for an older push from overwriting a newer result.
const open = await github.paginate(github.rest.pulls.list, {
owner,
repo,
state: "open",
head: `${run.head_repository?.owner?.login}:${run.head_branch}`,
per_page: 100,
});
const matching = open.filter(
(candidate) =>
candidate.state === "open" &&
candidate.head.sha === run.head_sha &&
candidate.head.ref === run.head_branch &&
candidate.head.repo?.full_name === run.head_repository?.full_name,
);
if (matching.length !== 1) {
core.info(`Expected one open PR at ${run.head_sha}; found ${matching.length}. Skipping.`);
return;
}
core.setOutput("artifact_id", String(results[0].id));
core.setOutput("pr_number", String(matching[0].number));
# Read the archive as bytes; never extract PR-produced files into a
# workspace this job runs code from.
- id: result
name: Read changed platforms
if: steps.pr.outputs.pr_number != ''
shell: bash
env:
GH_TOKEN: ${{ github.token }}
ARTIFACT_ID: ${{ steps.pr.outputs.artifact_id }}
run: |
set -euo pipefail
gh api "repos/${GITHUB_REPOSITORY}/actions/artifacts/${ARTIFACT_ID}/zip" > "$RUNNER_TEMP/fingerprint-result.zip"
changed="$(unzip -p "$RUNNER_TEMP/fingerprint-result.zip" changed-platforms)"
if [[ ! "$changed" =~ ^((ios|android)( (ios|android))?)?$ ]]; then
echo "Unexpected changed-platforms value '$changed'." >&2
exit 1
fi
echo "changed_platforms=$changed" >> "$GITHUB_OUTPUT"
- name: Sync native change label
if: steps.pr.outputs.pr_number != ''
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8
env:
PR_NUMBER: ${{ steps.pr.outputs.pr_number }}
CHANGED_PLATFORMS: ${{ steps.result.outputs.changed_platforms }}
with:
script: |
const managedLabel = {
name: "📱 Native Change",
color: "d93f0b",
description:
"Changes the native fingerprint; merging blocks production OTAs until a new store build ships.",
};
const nativeChanged = (process.env.CHANGED_PLATFORMS ?? "").trim() !== "";
const issueNumber = Number(process.env.PR_NUMBER);
try {
const { data: existing } = await github.rest.issues.getLabel({
owner: context.repo.owner,
repo: context.repo.repo,
name: managedLabel.name,
});
if (
existing.color !== managedLabel.color ||
(existing.description ?? "") !== managedLabel.description
) {
await github.rest.issues.updateLabel({
owner: context.repo.owner,
repo: context.repo.repo,
name: managedLabel.name,
color: managedLabel.color,
description: managedLabel.description,
});
}
} catch (error) {
if (error.status !== 404) {
throw error;
}
try {
await github.rest.issues.createLabel({
owner: context.repo.owner,
repo: context.repo.repo,
name: managedLabel.name,
color: managedLabel.color,
description: managedLabel.description,
});
} catch (createError) {
if (createError.status !== 422) {
throw createError;
}
}
}
const { data: currentLabels } = await github.rest.issues.listLabelsOnIssue({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
per_page: 100,
});
const hasLabel = currentLabels.some((label) => label.name === managedLabel.name);
if (nativeChanged && !hasLabel) {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
labels: [managedLabel.name],
});
} else if (!nativeChanged && hasLabel) {
try {
await github.rest.issues.removeLabel({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
name: managedLabel.name,
});
} catch (removeError) {
if (removeError.status !== 404) {
throw removeError;
}
}
}
core.info(
`PR #${issueNumber}: native fingerprint ${nativeChanged ? `changed (${process.env.CHANGED_PLATFORMS})` : "unchanged"}`,
);
7 changes: 3 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ An empty database is a bad test. Seed your worktree's `.t3` with a copy of real

## Verifying

- Before you push, run `vp run check:changed`. It runs CI's fast checks for changed files: format, lint, knip, typecheck of affected packages and dependents, and tests beside changes. CI still runs the full test suites.
- Before you push, run `vp run check:changed`. It runs CI's fast checks for changed files: format, lint, knip, typecheck of affected packages and dependents, tests beside changes, and the cross-file checks those miss. CI still runs the full test suites.
- While you iterate, run `vp test run <files>`. For big files, add `-t "<name>"`.
- Use `vp run typecheck`, not `npx tsc`; it caches per package. Both run tsc-rs (`typescript` is the `@tsc-rs/typescript` drop-in).
- Run `node -e` snippets from `apps/server` or the owning package. `effect` does not resolve from the repo root.
Expand Down Expand Up @@ -135,11 +135,11 @@ An empty database is a bad test. Seed your worktree's `.t3` with a copy of real
});
```

- Upon request, user-visible frontend changes should get one integrated pass in a real client: `test-t3-app` for web, `test-t3-mobile` for mobile. The primary agent does this once after integrating. Subagents do not launch their own dev servers. Ask permission before doing computer use or spinning up browsers.
- User-visible frontend changes should get one integrated pass in a real client: `test-t3-app` for web, `test-t3-mobile` for mobile. The primary agent does this once after integrating. Subagents do not launch their own dev servers.

- Real agent turns cost money. To watch a turn stream through the pipeline and UI, use the free `Replay (dev)` provider that `vp run dev` registers; [test-t3-app](.agents/skills/test-t3-app/SKILL.md) shows how to start one. Use a real provider only when the change depends on that provider's behavior, and then pick its cheapest model, such as Haiku for Claude or Luna for Codex.

For authorized mobile verification, a missing or outdated native client is an install step, not a blocker. Run `vp run mobile:install <ios|android> [device-id]` on the device host before starting Metro; it targets the only booted simulator or connected Android device when the id is omitted. It installs the dev client for this checkout's native fingerprint from the shared cache in seconds and builds only when no machine has built it yet, so prefer it over `expo run:*`, `xcodebuild`, or `gradlew`, which rebuild from scratch. Its stdout is one JSON line; build output goes to the log it names. See `test-t3-mobile` for the full workflow.
For mobile verification, a missing or outdated native client is an install step, not a blocker. Run `vp run mobile:install <ios|android> [device-id]` on the device host before starting Metro; it targets the only booted simulator or connected Android device when the id is omitted. It installs the dev client for this checkout's native fingerprint from the shared cache in seconds and builds only when no machine has built it yet, so prefer it over `expo run:*`, `xcodebuild`, or `gradlew`, which rebuild from scratch. Its stdout is one JSON line; build output goes to the log it names. See `test-t3-mobile` for the full workflow.

## Evals

Expand Down Expand Up @@ -215,5 +215,4 @@ Architecture and its constraints: `docs/internals/overview.md`. Glossary: `docs/

## Additional tips

- Don't verify with browsers or computer use unless the user explicitly agrees or requests it.
- Security is important, but should not be over-indexed on, especially for dev mode/maintainer-only features.
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,16 @@ yay -S t3code-nightly-bin

The AUR packaging is maintained in this repository under [`packaging/aur`](./packaging/aur).

#### Nix (nixpkgs)

```bash
nix profile add github:NixOS/nixpkgs/nixos-unstable#t3code
```

The package is maintained in [nixpkgs](https://github.com/NixOS/nixpkgs/tree/nixos-unstable/pkgs/by-name/t3/t3code)
and includes the desktop app (`t3code-desktop`) and the `t3` command.
See [Nix installation](./docs/user/install.md#nix-nixpkgs) for NixOS configuration and updates.

## Some notes

We are very very early in this project. Expect bugs.
Expand Down
4 changes: 2 additions & 2 deletions apps/desktop/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@t3tools/desktop",
"version": "0.1.3",
"version": "0.1.5",
"private": true,
"type": "module",
"main": "dist-electron/boot.cjs",
Expand All @@ -22,7 +22,7 @@
"@t3tools/tailscale": "workspace:*",
"dbus-next": "0.10.2",
"effect": "catalog:",
"electron": "44.9.3",
"electron": "44.10.0",
"electron-store": "^8.2.0",
"electron-updater": "^6.8.9",
"electron-webauthn": "catalog:",
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/coil/updateDelivery/UpdateDelivery.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ type DeliveryServices =
| FileSystem.FileSystem
| HttpClient.HttpClient;

export const make = Effect.gen(function* () {
const make = Effect.gen(function* () {
const environment = yield* DesktopEnvironment.DesktopEnvironment;
const fileSystem = yield* FileSystem.FileSystem;
const electronWindow = yield* ElectronWindow.ElectronWindow;
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/coil/updateDelivery/connectionHealth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export const WATCHDOG_TIMEOUT_MS = SERVER_HEARTBEAT_INTERVAL_MS * 2.5;
export const FLOOR_POLL_INTERVAL_MS = 15 * 60_000;

/** Reconnect backoff. Capped low because the relay closes streams every 15 min by design. */
export const RECONNECT_BASE_DELAY_MS = 1_000;
const RECONNECT_BASE_DELAY_MS = 1_000;
export const RECONNECT_MAX_DELAY_MS = 60_000;

export type ConnectionVerdict =
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/coil/updateDelivery/decision.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import {
* fails during a build. It must never be treated as a commit hash — an app that believes its own
* commit is "unknown" differs from every real manifest and would update on every payload, forever.
*/
export const UNKNOWN_COMMIT_HASH = "unknown";
const UNKNOWN_COMMIT_HASH = "unknown";

export interface InstalledBuild {
/** From `DesktopAppIdentity`. Absent for any build that has no embedded hash. */
Expand Down
1 change: 0 additions & 1 deletion apps/desktop/src/coil/updateDelivery/manifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ export const UpdateManifest = Schema.Struct({
});
export type UpdateManifest = typeof UpdateManifest.Type;

export const decodeUpdateManifest = Schema.decodeUnknownEffect(UpdateManifest);
export const decodeUpdateManifestJson = Schema.decodeEffect(Schema.fromJsonString(UpdateManifest));

export function findAssetForPlatform(
Expand Down
2 changes: 1 addition & 1 deletion apps/desktop/src/coil/updateDelivery/restart.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import * as DesktopShutdown from "../../app/DesktopShutdown.ts";
* enough that a hung one costs the user ten seconds rather than their whole session. The relaunch
* is armed before the timer starts, so a forced exit still comes back up.
*/
export const SHUTDOWN_GRACE = Duration.seconds(10);
const SHUTDOWN_GRACE = Duration.seconds(10);

export type RestartOutcome = "graceful" | "forced-after-timeout";

Expand Down
18 changes: 12 additions & 6 deletions apps/desktop/src/ipc/methods/updates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,14 @@ export const getUpdateState = DesktopIpc.makeIpcMethod({

export const setUpdateChannel = DesktopIpc.makeIpcMethod({
channel: IpcChannels.UPDATE_SET_CHANNEL_CHANNEL,
payload: DesktopUpdateChannelSchema,
payload: Schema.Struct({
channel: DesktopUpdateChannelSchema,
minimumVersion: Schema.optional(Schema.String),
}),
result: DesktopUpdateStateSchema,
handler: Effect.fn("desktop.ipc.updates.setChannel")(function* (channel) {
handler: Effect.fn("desktop.ipc.updates.setChannel")(function* ({ channel, minimumVersion }) {
const updates = yield* DesktopUpdates.DesktopUpdates;
return yield* updates.setChannel(channel);
return yield* updates.setChannel(channel, { minimumVersion });
}),
});

Expand All @@ -43,11 +46,14 @@ export const downloadUpdate = DesktopIpc.makeIpcMethod({

export const installUpdate = DesktopIpc.makeIpcMethod({
channel: IpcChannels.UPDATE_INSTALL_CHANNEL,
payload: Schema.Void,
/** A version installs only that downloaded build, never one that replaced it. */
payload: Schema.UndefinedOr(Schema.String),
result: DesktopUpdateActionResultSchema,
handler: Effect.fn("desktop.ipc.updates.install")(function* () {
handler: Effect.fn("desktop.ipc.updates.install")(function* (expectedVersion) {
const updates = yield* DesktopUpdates.DesktopUpdates;
return yield* updates.install;
if (expectedVersion === undefined) return yield* updates.install;
const { accepted, completed, state } = yield* updates.installPrepared(expectedVersion);
return { accepted, completed, state };
}),
});

Expand Down
7 changes: 4 additions & 3 deletions apps/desktop/src/preload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -278,11 +278,12 @@ contextBridge.exposeInMainWorld("desktopBridge", {
};
},
getUpdateState: () => ipcRenderer.invoke(IpcChannels.UPDATE_GET_STATE_CHANNEL),
setUpdateChannel: (channel) =>
ipcRenderer.invoke(IpcChannels.UPDATE_SET_CHANNEL_CHANNEL, channel),
setUpdateChannel: (channel, minimumVersion) =>
ipcRenderer.invoke(IpcChannels.UPDATE_SET_CHANNEL_CHANNEL, { channel, minimumVersion }),
checkForUpdate: () => ipcRenderer.invoke(IpcChannels.UPDATE_CHECK_CHANNEL),
downloadUpdate: () => ipcRenderer.invoke(IpcChannels.UPDATE_DOWNLOAD_CHANNEL),
installUpdate: () => ipcRenderer.invoke(IpcChannels.UPDATE_INSTALL_CHANNEL),
installUpdate: (expectedVersion) =>
ipcRenderer.invoke(IpcChannels.UPDATE_INSTALL_CHANNEL, expectedVersion),
cliCommand: {
getState: () => ipcRenderer.invoke(IpcChannels.CLI_COMMAND_GET_STATE_CHANNEL),
install: () => ipcRenderer.invoke(IpcChannels.CLI_COMMAND_INSTALL_CHANNEL),
Expand Down
4 changes: 2 additions & 2 deletions apps/desktop/src/settings/DesktopAppSettings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import {
normalizeLinuxPasswordStorePreference,
type LinuxPasswordStorePreference,
} from "../linuxSecretStorage.ts";
import { resolveDefaultDesktopUpdateChannel } from "../updates/updateChannels.ts";
import { desktopUpdateChannelOf } from "@t3tools/shared/cliRelease";
import { isValidDistroName } from "../wsl/wslPathParsing.ts";

export interface DesktopSettings {
Expand Down Expand Up @@ -180,7 +180,7 @@ export class DesktopAppSettings extends Context.Service<
export function resolveDefaultDesktopSettings(appVersion: string): DesktopSettings {
return {
...DEFAULT_DESKTOP_SETTINGS,
updateChannel: resolveDefaultDesktopUpdateChannel(appVersion),
updateChannel: desktopUpdateChannelOf(appVersion),
};
}

Expand Down
Loading
Loading