Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
133 commits
Select commit Hold shift + click to select a range
8acf756
feat(teleport): add the import/export engine without native formats
cursoragent Aug 15, 2026
75a3793
feat(teleport): add the import picker and export button
cursoragent Aug 15, 2026
1700d19
feat(teleport): add Codex native session support
cursoragent Aug 15, 2026
dbc8452
feat(teleport): add OpenCode native session support
cursoragent Aug 15, 2026
2048109
feat(teleport): add Claude native session support
cursoragent Aug 15, 2026
38eac2f
feat(teleport): add Grok native session support
cursoragent Aug 15, 2026
5062f81
fix(opencode): settle the session when a turn is aborted
cursoragent Aug 15, 2026
9de48da
fix(opencode): unstick Working when Stop has no live session
cursoragent Aug 15, 2026
3620294
test(teleport): use generic fixture paths
cursoragent Aug 15, 2026
6a51d21
test(teleport): use generic fixture paths
cursoragent Aug 15, 2026
f86f532
test(teleport): use generic fixture paths
cursoragent Aug 15, 2026
959ef15
test(teleport): use generic fixture paths
cursoragent Aug 15, 2026
d24730c
test(teleport): use generic fixture paths
cursoragent Aug 15, 2026
3ac60c2
test(teleport): use generic fixture paths
cursoragent Aug 15, 2026
9594bd8
test(teleport): use generic OpenCode fixture copy
cursoragent Aug 15, 2026
10503d6
merge(teleport): stack UI on sanitized backend
cursoragent Aug 15, 2026
5cca3e4
merge(teleport): stack Codex on UI
cursoragent Aug 15, 2026
daccf14
merge(teleport): stack Claude on Codex
cursoragent Aug 15, 2026
0c490e2
merge(teleport): stack Grok on Claude
cursoragent Aug 15, 2026
87fd928
merge(teleport): stack OpenCode on Grok
cursoragent Aug 15, 2026
18ed3c0
Merge branch 'main' into cursor/teleport-opencode-1e23
baanish Aug 15, 2026
b3ac6a8
fix(web): match teleport controls to existing header primitives
cursoragent Aug 16, 2026
468bc93
fix(teleport): close lock, path, and projection holes from review
cursoragent Aug 16, 2026
77fbd25
refactor(teleport): collocate TeleportService in one module
cursoragent Aug 16, 2026
9e479d0
fix(web): hide teleport when the server lacks the capability
cursoragent Aug 16, 2026
15193f8
fix(teleport): discover Codex and Claude sessions across instance homes
cursoragent Aug 16, 2026
d075c83
fix(teleport): keep busy threads and OpenCode paths from corrupting s…
cursoragent Aug 16, 2026
3b38975
fix(teleport): distinguish lock probes and write to instance homes
cursoragent Aug 16, 2026
95fba97
fix(teleport): keep custom instances on the selected native session
cursoragent Aug 16, 2026
d76928b
test(web): drop duplicated teleport capability cases
cursoragent Aug 16, 2026
1cb4f0f
fix(teleport): match existing threads by provider instance
cursoragent Aug 16, 2026
ef27858
fix(teleport): write OpenCode sqlite sessions the CLI can resume
cursoragent Aug 16, 2026
cb5633b
fix(teleport): keep export from splitting T3 and the native CLI
cursoragent Aug 16, 2026
a0c3154
fix(mobile): keep drafts when a thread is in the native CLI
cursoragent Aug 16, 2026
9e1d363
fix(web): show a disabled cursor while teleport is busy
cursoragent Aug 17, 2026
702df18
fix(teleport): keep discovery from mixing CLI homes and transcripts
cursoragent Aug 17, 2026
db4a2dc
fix(teleport): apply OpenCode cwd rules to explicit native paths
cursoragent Aug 17, 2026
4f7f53b
fix(teleport): drop Grok and OpenCode native session formats
cursoragent Aug 17, 2026
579dadc
fix(teleport): register native formats through an Effect service
cursoragent Aug 17, 2026
838953a
fix(teleport): probe native locks through ProcessRunner
cursoragent Aug 17, 2026
f700884
fix(opencode): wait for abort before accepting a new turn
cursoragent Aug 17, 2026
d75a839
fix(orchestration): prune only a thread's own attachments
cursoragent Aug 17, 2026
616a55e
fix(web): list physical projects for teleport import
cursoragent Aug 17, 2026
95c5b6e
fix(teleport): honor empty extra-instance home paths
cursoragent Aug 17, 2026
a5966af
fix(opencode): complete the abort gate with Effect 4 APIs
cursoragent Aug 17, 2026
26c6932
fix(opencode): emit one abort for concurrent Stop
cursoragent Aug 17, 2026
276620a
fix(teleport): import worktree threads back into their project
cursoragent Aug 17, 2026
f712cbd
fix(teleport): restore presence when export fails after pending
cursoragent Aug 17, 2026
84ea40b
fix(teleport): keep export cleanup from failing the original error
cursoragent Aug 17, 2026
5c6d9e1
fix(teleport): derive error messages and delete failed imports
cursoragent Aug 17, 2026
1fe0b03
fix(teleport): derive write errors from stage
cursoragent Aug 17, 2026
b65ca1a
fix(teleport): bind in-place imports before replacing history
cursoragent Aug 17, 2026
5328a96
Merge pingdotgg/t3code main into teleport tip.
cursoragent Aug 18, 2026
6c15543
fix(web): theme TeleportOutButton like other header controls
cursoragent Aug 19, 2026
f1ace6f
fix(web): keep teleported-out composer drafts unmutated
cursoragent Aug 19, 2026
710bd1c
Merge branch 'main' into cursor/teleport-opencode-1e23
baanish Aug 19, 2026
af47f2c
fix(teleport): commit in-place import as one T3 state transition
cursoragent Aug 19, 2026
49935d1
Merge branch 'main' into cursor/teleport-opencode-1e23
baanish Aug 19, 2026
aa2fad3
fix(teleport): revert importing fence on interrupt and defects
cursoragent Aug 19, 2026
535e79a
Merge branch 'main' into cursor/teleport-opencode-1e23
cursoragent Aug 19, 2026
6868b38
Merge branch 'main' into cursor/teleport-opencode-1e23
cursoragent Aug 20, 2026
40508c9
fix(web): keep locked composer drafts unmutated after async work
cursoragent Aug 20, 2026
d311e79
fix(teleport): preserve native session identity and history
cursoragent Aug 21, 2026
edb1f99
fix(teleport): recover interrupted transitions without stale state
cursoragent Aug 21, 2026
199ba38
fix(teleport): match native CLI storage contracts
cursoragent Aug 21, 2026
939c3b2
fix(teleport): never overwrite imported native transcripts
cursoragent Aug 21, 2026
e23a590
fix(web): block all draft edits while teleported out
cursoragent Aug 21, 2026
5b01da0
Merge remote-tracking branch 'refs/remotes/upstream/main' into cursor…
cursoragent Aug 21, 2026
03a5b30
style(teleport): apply repository formatting
cursoragent Aug 21, 2026
590c40c
feat(teleport): fork native changes after ownership conflicts
cursoragent Aug 21, 2026
f45f89e
fix(web): wait for native fork before navigation
cursoragent Aug 21, 2026
38a5432
Merge remote-tracking branch 'origin/main' into cursor/teleport-7136-…
cursoragent Aug 22, 2026
616c5a8
fix(teleport): fall back when lsof cannot be spawned
cursoragent Aug 22, 2026
660d4d8
fix(teleport): load archived threads for in-place import
cursoragent Aug 22, 2026
47974aa
fix(teleport): reject unknown instances and walk Claude homes once
cursoragent Aug 22, 2026
0e6a26c
fix(teleport): restore provider binding if import reverts
cursoragent Aug 22, 2026
9a414b1
fix(web): drop stale native-conflict results on navigation
cursoragent Aug 22, 2026
a157784
fix(web): pass nativePath through command-palette imports
cursoragent Aug 22, 2026
3005c58
fix(web): prefer newer teleport snapshots when merging
cursoragent Aug 22, 2026
6160132
fix(opencode): close the session when abort is unconfirmed
cursoragent Aug 22, 2026
906a8e5
fix(opencode): reject in-flight sendTurn after unconfirmed abort
cursoragent Aug 22, 2026
e65e163
fix(orchestration): reject turn start on archived threads
cursoragent Aug 22, 2026
b7592d0
fix(teleport): skip directory bind when pending export never wrote
cursoragent Aug 22, 2026
e180081
Merge origin/main into cursor/teleport-7136-mirror-4ce4
cursoragent Aug 22, 2026
4440cfa
fix(teleport): clear teleport after a failed first-time import
cursoragent Aug 23, 2026
6ce36a1
fix(teleport): gate HTTP turn.start and skip createThread revision ch…
cursoragent Aug 23, 2026
0b7e30a
fix(web): keep teleport composer lock while messages load
cursoragent Aug 23, 2026
20b0b14
fix(teleport): keep in-place import path-stable and sanitize director…
cursoragent Aug 23, 2026
3345225
chore(server): drop unused OrchestrationDispatchCommandError import
cursoragent Aug 23, 2026
00e0a64
Merge origin/main into cursor/teleport-7136-mirror-4ce4
cursoragent Aug 23, 2026
a3a2c3a
Merge origin/main into cursor/teleport-7136-mirror-4ce4
cursoragent Aug 24, 2026
e64e31a
Merge origin/main into cursor/teleport-7136-mirror-4ce4
cursoragent Aug 26, 2026
93d32f2
fix(teleport): keep HTTP native-revision gate when createThread targe…
cursoragent Aug 27, 2026
cba5020
fix(client-runtime): prefer shell teleport when lastSyncedAt ties
cursoragent Aug 27, 2026
96d1750
fix(server): skip unsupported providers in teleport projection backfill
cursoragent Aug 27, 2026
1a43461
revert leftover OpenCode abort-gate from teleport PR
cursoragent Aug 27, 2026
60d2b0b
fix(server): decode teleport backfill test JSON through Schema
cursoragent Aug 27, 2026
770cb25
fix(teleport): revert importing fence if beginImporting is interrupted
cursoragent Aug 27, 2026
652cfc2
fix(teleport): delete first-time directory row on failed in-place import
cursoragent Aug 27, 2026
3c03a67
fix(teleport): delete leftover new-thread imports on crash recovery
cursoragent Aug 27, 2026
1576ab4
fix(teleport): recover directory finalize after a committed T3 import
cursoragent Aug 27, 2026
51ed3b2
fix(teleport): fail closed when lsof is missing and the file exists
cursoragent Aug 27, 2026
bd0bb8d
fix(teleport): fail Windows native replace if bak restore is lost
cursoragent Aug 27, 2026
1db4196
docs(teleport): record that withInFlight is process-local
cursoragent Aug 27, 2026
414ebad
style(teleport): apply bun fmt to atomicity durability diffs
cursoragent Aug 27, 2026
4de291f
fix(teleport): correct atomicity recovery types after durability holes
cursoragent Aug 27, 2026
6099bcc
fix(teleport): pass optional recovery history without exactOptional m…
cursoragent Aug 27, 2026
10c7f76
fix(teleport): keep Windows bak restore distinct from a failed replace
cursoragent Aug 27, 2026
ca3e9b7
test(teleport): fix in-place directory delete and Windows bak restore…
cursoragent Aug 27, 2026
3a0b870
fix(teleport): treat a cleared shell teleport as authoritative
cursoragent Aug 27, 2026
968dd32
fix(teleport): only block image attach on the teleport composer lock
cursoragent Aug 27, 2026
51ad9f6
fix(teleport): keep Codex assistant text that looks like a user wrapper
cursoragent Aug 27, 2026
051f3b2
fix(teleport): compare in-place import paths even when nativePath is …
cursoragent Aug 27, 2026
2226e4d
fix(teleport): stop discovery walks from looping on directory symlinks
cursoragent Aug 27, 2026
b4da56b
fix(teleport): enforce the 20 MiB session cap while reading
cursoragent Aug 27, 2026
8b0b719
fix(teleport): clean claimed attachments when the HTTP revision gate …
cursoragent Aug 27, 2026
c6d3425
fix(teleport): return latestTurn for archived by-id thread snapshots
cursoragent Aug 27, 2026
def2c2f
fix(teleport): decode instance homes with envelope replacement semantics
cursoragent Aug 27, 2026
7074e17
fix(teleport): rebuild export revert payload from thread teleport state
cursoragent Aug 27, 2026
006365a
fix(teleport): repair directory presence after interrupted import rec…
cursoragent Aug 27, 2026
5798b44
fix(teleport): close import batch, export, and recovery identity holes
cursoragent Aug 27, 2026
247f14a
fix(teleport): wrap Windows rename mock without mutating readonly Fil…
cursoragent Aug 27, 2026
55e775d
fix(teleport): abort import batches before partial load/unlock commits
cursoragent Aug 27, 2026
5575b58
fix(teleport): fail closed on binding reads and retry startup recovery
cursoragent Aug 27, 2026
8aa769f
fix(web): keep composer inserts and chip removes on the teleport lock
cursoragent Aug 27, 2026
446921a
fix(teleport): stand the format registry with Layer.succeed
cursoragent Aug 27, 2026
4060bca
fix(web): disable Compact context while the composer is teleported out
cursoragent Aug 27, 2026
5064489
fix(teleport): refresh thread snapshot before directory finalize reco…
cursoragent Aug 27, 2026
618c971
fix(web): ignore composer menu picks while teleport-locked
cursoragent Aug 27, 2026
d4d943f
fix(teleport): use Effect.catchTags for schema-version skips
cursoragent Aug 28, 2026
25c4dbc
fix(teleport): bind listSessions cwd to a registered project
cursoragent Aug 28, 2026
c0451b9
fix(teleport): clear stale native binding after failed export recovery
cursoragent Aug 28, 2026
a6b7b47
fix(teleport): hash native sessions through Effect Crypto
cursoragent Aug 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 19 additions & 10 deletions apps/mobile/src/features/threads/ThreadComposer.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import type {
EnvironmentId,
MessageId,
ModelSelection,
OrchestrationThreadShell,
ProviderInteractionMode,
RuntimeMode,
ServerConfig as T3ServerConfig,
import {
isTeleportedOut,
teleportSendDisabledReason,
type EnvironmentId,
type MessageId,
type ModelSelection,
type OrchestrationThreadShell,
type ProviderInteractionMode,
type RuntimeMode,
type ServerConfig as T3ServerConfig,
} from "@t3tools/contracts";
import {
detectComposerTrigger,
Expand Down Expand Up @@ -291,10 +293,13 @@ export const ThreadComposer = memo(function ThreadComposer(props: ThreadComposer

const [previewImageUri, setPreviewImageUri] = useState<string | null>(null);
const hasContent = props.draftMessage.trim().length > 0 || props.draftAttachments.length > 0;
const teleportedOut = isTeleportedOut(props.selectedThread.teleport);
const teleportSendBlockReason = teleportSendDisabledReason(props.selectedThread.teleport);
// Opening and presentation count as active so the composer stays expanded
// while focus moves between its native editor and the settings picker.
const isExpanded = isFocused || settingsSheetPresentation.isActive;
const canSend = hasContent;
const canSend = hasContent && !teleportedOut;
const placeholder = teleportSendBlockReason ?? props.placeholder;
Comment on lines +296 to +302

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Expose the teleport-in path on mobile

When a thread is teleported out from web or desktop and then opened on mobile, this permanently disables its composer, but a repo-wide search of apps/mobile finds no import action or use of the new Teleport RPCs. The user therefore cannot perform the reverse transition from that client and must switch surfaces merely to recover the thread; mobile needs an import control rather than only enforcing the blocked state.

AGENTS.md reference: AGENTS.md:L65-L74

Useful? React with 👍 / 👎.


// Notify the parent from the derived value, not focus events: the parent
// sizes the feed inset from this, and blur-during-sheet would otherwise
Expand Down Expand Up @@ -548,6 +553,9 @@ export const ThreadComposer = memo(function ThreadComposer(props: ThreadComposer
const { onChangeDraftMessage, onUpdateInteractionMode, draftMessage, onSendMessage } = props;

const handleSend = useCallback(async () => {
if (isTeleportedOut(props.selectedThread.teleport)) {
return;
}
const threadKey = scopedThreadKey(props.environmentId, props.selectedThread.id);
if (inFlightThreadIdsRef.current.has(threadKey)) return;
inFlightThreadIdsRef.current.add(threadKey);
Expand All @@ -574,6 +582,7 @@ export const ThreadComposer = memo(function ThreadComposer(props: ThreadComposer
props.environmentLabel,
props.selectedThread.id,
props.selectedThread.title,
props.selectedThread.teleport,
]);
const handleCommandSelect = useCallback(
(item: ComposerCommandItem) => {
Expand Down Expand Up @@ -802,7 +811,7 @@ export const ThreadComposer = memo(function ThreadComposer(props: ThreadComposer
onChangeText={props.onChangeDraftMessage}
onSelectionChange={handleSelectionChange}
onPasteImages={(uris) => void props.onNativePasteImages(uris)}
placeholder={props.placeholder}
placeholder={placeholder}
onFocus={handleFocus}
onBlur={handleBlur}
onSubmit={handleSend}
Expand Down
4 changes: 4 additions & 0 deletions apps/mobile/src/state/use-thread-composer-state.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import * as Cause from "effect/Cause";

import {
CommandId,
isTeleportedOut,
MessageId,
type EnvironmentId,
type ModelSelection,
Expand Down Expand Up @@ -166,6 +167,9 @@ export function useThreadComposerState() {
const threadKey = scopedThreadKey(selectedThreadShell.environmentId, selectedThreadShell.id);
const draft = getComposerDraftSnapshot(threadKey);
const thread = selectedThreadDetail ?? selectedThreadShell;
if (isTeleportedOut(thread.teleport)) {
return null;
}
const text = draft.text.trim();
const attachments = draft.attachments;
if (text.length === 0 && attachments.length === 0) {
Expand Down
5 changes: 5 additions & 0 deletions apps/server/src/auth/RpcAuthorization.ts
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,11 @@ export const RPC_REQUIRED_SCOPES = {
[WS_METHODS.subscribeServerLifecycle]: AuthOrchestrationReadScope,
[WS_METHODS.subscribeAuthAccess]: AuthAccessReadScope,
[WS_METHODS.subscribeBackgroundPolicy]: AuthOrchestrationReadScope,
[WS_METHODS.teleportListSessions]: AuthOrchestrationReadScope,
[WS_METHODS.teleportImportSessions]: AuthOrchestrationOperateScope,
[WS_METHODS.teleportExportSession]: AuthOrchestrationOperateScope,
[WS_METHODS.teleportCheckNativeRevision]: AuthOrchestrationReadScope,
[WS_METHODS.teleportForkNativeDivergence]: AuthOrchestrationOperateScope,
} as const satisfies Readonly<Record<WsRpcMethod, AuthEnvironmentScope>>;

export function requiredScopeForRpcMethod(method: string): AuthEnvironmentScope {
Expand Down
13 changes: 13 additions & 0 deletions apps/server/src/bin.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import * as ProjectionSnapshotQuery from "./orchestration/Services/ProjectionSna
import * as OrchestrationEngine from "./orchestration/Services/OrchestrationEngine.ts";
import { OrchestrationLayerLive } from "./orchestration/runtimeLayer.ts";
import { orchestrationHttpApiLayer } from "./orchestration/http.ts";
import * as TeleportService from "./teleport/TeleportService.ts";
import { layerConfig as SqlitePersistenceLayerLive } from "./persistence/Layers/Sqlite.ts";
import * as RepositoryIdentityResolver from "./project/RepositoryIdentityResolver.ts";
import {
Expand Down Expand Up @@ -119,6 +120,18 @@ const withLiveProjectCliServer = <A, E, R>(baseDir: string, run: () => Effect.Ef
const routesLayer = HttpApiBuilder.layer(ProjectCliHttpApi).pipe(
Layer.provide(orchestrationHttpApiLayer),
Layer.provide(environmentAuthenticatedAuthLayer),
Layer.provide(
Layer.mock(TeleportService.TeleportService)({
listSessions: () => Effect.die("TeleportService.listSessions unused in CLI tests"),
importSessions: () => Effect.die("TeleportService.importSessions unused in CLI tests"),
exportSession: () => Effect.die("TeleportService.exportSession unused in CLI tests"),
checkNativeRevision: () =>
Effect.die("TeleportService.checkNativeRevision unused in CLI tests"),
forkNativeDivergence: () =>
Effect.die("TeleportService.forkNativeDivergence unused in CLI tests"),
requireNativeRevisionForTurn: () => Effect.void,
}),
),
);
const appLayer = HttpRouter.serve(routesLayer, {
disableListenLog: true,
Expand Down
1 change: 1 addition & 0 deletions apps/server/src/environment/ServerEnvironment.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ it.layer(NodeServices.layer)("ServerEnvironmentLive", (it) => {
expect(second.capabilities.pullRequests).toBe(true);
expect(second.capabilities.threadTitleRegeneration).toBe(true);
expect(second.capabilities.threadPullRequestLinking).toBe(true);
expect(second.capabilities.teleport).toBe(true);
expect(second.capabilities.agentActivityPublishing).toBe(false);
}),
);
Expand Down
1 change: 1 addition & 0 deletions apps/server/src/environment/ServerEnvironment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,7 @@ export const make = Effect.gen(function* () {
threadPinReorder: true,
threadTitleRegeneration: true,
threadPullRequestLinking: true,
teleport: true,
...(serverSelfUpdate === null ? {} : { serverSelfUpdate }),
...(serverSelfUpdate === "boot-service" ? { serverSelfUpdateProgress: true } : {}),
},
Expand Down
Loading
Loading