Repository navigation
Conversation
There was a problem hiding this comment.
Effect service conventions review: two findings in apps/desktop/src/app/DesktopDeepLink.ts, both about inputs to the service that never appear in the Effect environment. The service shape, make/layer naming, dependency acquisition via yield* Foo.Foo, and the native-callback runPromiseWith bridge all match the existing DesktopClerk/DesktopWindow patterns.
Posted via Macroscope — Effect Service Conventions
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit ddae088e7a678c890a16e6f1936ab6d37a169366. Configure here.
ApprovabilityVerdict: Not approved Macroscope's review found this PR not approvable — This PR introduces a cross-platform desktop deep-link workflow spanning OS dispatch, main/preload IPC buffering, window focusing, and renderer navigation, along with a guard that changes index draft behavior. It also adds a static-analysis suppression in the test suite, so the scope and diagnostic override require human review. You can add or adjust custom eligibility rules. Learn more. |
There was a problem hiding this comment.
Effect service conventions: the two earlier findings (ambient process.argv, module-global early capture) are addressed — HostProcessArguments and the EarlyOpenUrlCapture reference are both injected now. One remaining item, on the new requeue channel.
Posted via Macroscope — Effect Service Conventions
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
There was a problem hiding this comment.
All clear
Posted via Macroscope — Effect Service Conventions
There was a problem hiding this comment.
reviewed 03fb83e59de393240f9ce45a3a4b6bfbd4234dc9. no new standalone code blocker found.
all 27 DesktopDeepLink tests passed. standalone desktop typecheck reported TS2883 in updatesTestHarness.ts; the same errors reproduce on base 8b2838e0e8a73d3fa6476940445c372e47b99db4.
the documented #8976 integration step is still required. current heads conflict in DesktopClerk.ts and DesktopClerk.test.ts. after retaining #8976's clerk side in a temporary combined tree, desktop typecheck reproduces TS2554 at apps/desktop/src/app/DesktopDeepLink.ts:147. pass environment.distributionId to getDesktopScheme, preserve the distribution-specific clerk behavior, and rerun downstream cold/warm-link verification on the final resolved head. existing evidence for a different combined commit does not certify this current pair.
required checks are successful or skipped; github reports a clean individual merge into main. no fresh packaged macos/linux os-link run was performed here. leaving a comment pending integration, not requesting changes to the standalone one-argument call before its dependency lands.
|
Note GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer. |
|
Testing note, in case it saves a reviewer some time. On a machine with the released build installed, Dispatching at the dev bundle explicitly avoids it: What I verified on macOS 26.6 (Apple silicon), branch at
I did not get as far as confirming navigation end to end. My dev profile was still on the onboarding wizard with no threads yet, which I take to be the queue-until-acknowledged path described in the PR body rather than a failure. Flagging the LaunchServices behaviour mainly because it is easy to mistake for one. |
|
Note: GPT-6 on behalf of shivam (@shivamhwp). Send the unsubscribe request during listener cleanup, before a replacement listener subscribes. The current Accept the existing Cover the remount with the real preload and main subscription handlers, using gates for the delayed reply and an awaited delivery operation. The two nested |
|
Corroborating the second point, since it decides whether this closes #9745. The
The On the unsubscribe ordering: agreed, and it is reachable on an ordinary remount rather than a rare race. Cleanup and the replacement mount run in the same commit, so the new On coverage: worth noting |
367240d to
ba76625
Compare
|
Pushed
An independent review (GPT-5.6 Sol, high) then caught one more real gap: the UUID-only thread segment rejected On the earlier testing note from @genr8r: correct, LaunchServices routes All 87 focused desktop tests pass; desktop/web/contracts typecheck clean. |
|
Note on the |
…randed URL scheme The desktop main process parses exact thread links — the <scheme>://threads/<environmentId>/<threadId> shape the app itself emits for agent awareness and mobile widgets, plus the <scheme>://app/... form — from macOS open-url events, second-instance argv, and cold-start argv. Environment ids are server UUIDs; thread ids accept any single encoded segment so imported `import:<provider>:<session>` threads resolve too. The newest link is retained until a subscribed renderer acknowledges its generation, so a link survives onboarding, reloads, and route unmounts. Renderer teardown unsubscribes immediately so a delayed subscribe reply or StrictMode remount cannot unregister a replacement listener, and stale generations are dropped rather than navigated back to. The root route navigates to the thread; the index route no longer replaces a thread a cold deep link already selected. Fork adaptation: MT Code installs next to T3 Code, so the OS scheme is derived from branding (`mtcode://` for "MT Code", `t3code://` otherwise, `-dev` suffix unpackaged) and claimed through the ElectronApp setAsDefaultProtocolClient seam on packaged macOS/Windows builds. Packaging already declares both schemes via scripts/lib/desktop-distro.ts. The renderer's internal t3code://app origin is unchanged. (cherry picked from commit ba76625) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This comment has been minimized.
This comment has been minimized.
1 similar comment
This comment has been minimized.
This comment has been minimized.
|
Two things on The "already on this thread" short circuit misses imported thread ids.
if (readPathname() === `/${environmentId}/${threadId}`) {
return;
}
For UUID thread ids the two forms are identical, so the guard works. For the Comparing params rather than the rendered path sidesteps the encoding question: const params = useParams({ strict: false });
if (params.environmentId === environmentId && params.threadId === threadId) {
return;
}Both changed web files are untested. The desktop side gets 812 lines of new coverage. Related and smaller: the index guard reads Checked, and not worth anyone's time:
One merge note: the repro in #9745 is |
|
Note This comment is posted by Julius' dot The description says current-head visual proof is still outstanding and identifies the supplied cold/warm link media as historical. I inspected that media, but the linked capture follow-up in saphid/t3code-personal#150 returns 404 to this account, so I cannot establish whether newer proof exists. To complete the verification assessment, please attach accessible before/after screenshots and a short recording showing cold and warm thread navigation for the current implementation, or link existing evidence that reviewers can access. |
|
Review requested
Logged so this PR shows when a maintainer was asked to review it. |
813f30f to
4d8139c
Compare
|
Review requested
Logged so this PR shows when a maintainer was asked to review it. |
|
Current-head verification on macOS, for the evidence requested above. Before is
Warm, after. T3 is on "Colour notes: blue", and clicking the green link switches it. Cold, after. T3 is closed, and clicking the blue link launches it into that thread. Before ( MP4s and notes are in https://gist.github.com/Goobles/83f224b390e73a2a66e3a21ab1ee13c4.
If you test cold launch from a shell that T3 Code started, unset My use case is a local task dashboard that links each task to the T3 thread working on it. Written by claude-opus-5-5 via Claude Code in T3 Code on spr-gobius-d. |
The mobile app opens t3code://threads/<environmentId>/<threadId>, and agent awareness emits that shape, but the desktop app only raised its window. Thread links now ride the existing web-link path: DesktopWebLinks keeps the newest one until the renderer listens (cold start, reload), then the renderer navigates to the thread. On macOS a link that arrives with no window open opens one, the way a Dock click does. - strict parse: scheme, threads host, UUID environment, one encoded thread segment, nothing else - the index route no longer starts a draft over a thread link that already navigated away (from pingdotgg#8246) - docs/user/thread-links.md A smaller take on pingdotgg#8246, which covers the same links with its own delivery handshake. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On macOS and Linux the desktop app registers the t3code:// scheme and opens t3code://threads/<environmentId>/<threadId> links in the matching thread, including cold-start links macOS delivers before the window exists. Rebased onto main as a single commit (the branch previously carried a merge from main). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
4d8139c to
10aa0eb
Compare
…odule Main moved host process references to @t3tools/shared/HostProcess (pingdotgg#17641). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Note 🤖 Claude Opus 5.5 responding on behalf of Theo Closing this in favor of #18454, which ships prompt links across web, desktop, and mobile. Thread deep links on desktop are part of it: |





Model: Claude Opus 5.5, with a later maintenance pass by GPT-6 Astra. Rebased onto current main with Claude Opus 5.5 on 2026-10-12.
1. Problem and reproduction
External tools and the app's own agent-awareness links cannot open a specific desktop thread. Open
t3code://threads/<environmentId>/<threadId>while the desktop app is closed or already running; this PR routes the desktop renderer to that thread.2. Cause
Scheme registration already exists on main, but thread links need main-process dispatch, buffering until a renderer subscribes, and navigation that is not overwritten by the index route's draft creation.
3. What changed
DesktopDeepLinkaccepts thethreadsandapphosts, a UUID environment ID, and one encoded thread-ID segment (including imported IDs). It handles early macOSopen-url, cold-start argv, and second-instance argv. The newest link stays buffered until its subscribed renderer acknowledges the matching generation. Unsubscribe, stale replies, and renderer destruction preserve delivery to a subsequent subscriber. A root route listener navigates, and the index route reads the live path before starting a draft.Merged main
7445aa733ada33e45289e5aa5055f79142556513into the branch rather than rebasing to preserve existing review history. The channel conflict retains upstream's paste-as-text channel alongside the four deep-link channels. The deep-link sender shape now lives at its own boundary; the shared IPC event and existing IPC/snapshot tests are identical to main. The preload regression supplies the window mock needed by upstream's macOS inset handling.4. Scope and exclusions
This remains desktop thread-link handling. It does not change OAuth callbacks, upstream paste-as-text, notification badges, protocol registration, provider adapters, or mobile navigation. The shared bridge hook is optional for older desktop clients. No unrelated formatting or generated files are added to the contribution.
5. Affected surfaces
Desktop OS URL dispatch and desktop-rendered web routing, including navigation from other screens and cold-start draft prevention. The IPC bridge contract is additive. Browser-only web and both mobile clients retain their existing behavior. Links select an environment; local/remote connectivity still uses existing environment handling. Windows/Linux argv paths have unit coverage, not real-client execution here.
6. Verification
Exact head:
b06456ca725c11ade0e41d59748612604a22c5c5(20 September 2026).From
apps/desktop:vp test run src/app/DesktopDeepLink.test.ts src/ipc/DesktopIpc.test.ts src/ipc/methods/snapShot.test.ts src/app/DesktopLifecycle.test.ts src/window/DesktopWindow.test.ts src/ssh/DesktopSshPasswordPrompts.test.ts src/ipc/methods/window.test.ts src/window/DesktopApplicationMenu.test.ts src/ipc/methods/notificationBadge.test.ts9 files, 111 tests passed, exit 0. Includes real-preload/IPC remount sequencing, ID-only sender rejection without consuming the buffered link, and upstream paste-as-text and notification-badge tests.
From the repository root:
vp run --filter @t3tools/desktop typecheck: exit 0.vp run --filter @t3tools/web typecheck: exit 0 when run alone. The initial concurrent invocation exited 137 for web; the isolated retry passed.vp run --filter @t3tools/desktop --filter @t3tools/web --filter @t3tools/contracts typecheck: contracts passed; the initial desktop failures exposed the IPC compatibility issue fixed above. Final desktop and web results are the separate commands above.git diff --name-only origin/main HEADsupplied the 15 final contribution paths tovp fmt --check; exit 0. Its 14 TypeScript paths suppliedvp lint; exit 0 with three warnings on unchanged upstream route lines (two effect dependency warnings and one render-ref warning).git diff origin/main HEAD --check: exit 0.The first test attempt exposed the stale preload harness and a concurrent Electron runtime installation race. After adapting our harness and running
node apps/desktop/scripts/ensure-electron-runtime.mjs, all selected suites passed. Commit hooks left the tested source tree unchanged.7. Known gaps and risks
Not review-ready: current-head visual proof remains outstanding. No browser, desktop GUI, remote/relay/tunnel session, Windows/Linux client, or SwiftUI simulator build was exercised in this maintenance pass. Fresh light/dark before/after captures and cold/warm interaction video belong to the proof follow-up. Historical recordings below do not certify this head. CI on the pushed head must be evaluated separately; prior green checks or the earlier Release Smoke failure are not current-head results.
No fresh independent reviewer or visual inspector ran in this no-delegation pass. No review was re-requested.
8. Historical media — not current-head proof
These artifacts were recorded on an earlier revision. The cold-link comparison is a two-frame GIF, not a continuous interaction recording.
Historical warm-link recording · Historical annotated recording
9. Related work
Consumes thread links emitted by #9745. Maintenance tracking: saphid/t3code-personal#151; current-head capture follow-up: #150.
This maintenance pass: GPT-6 Astra in the Codex harness. Earlier implementation attribution remains in the branch history.