refactor: group renderer session launch lifecycle (#33586)

* refactor: organize renderer session launch lifecycle

* refactor: consolidate launch registry test imports
This commit is contained in:
Neil
2026-10-25 12:25:32 -07:00
committed by GitHub
parent 965468492e
commit c6ce72d0c2
84 changed files with 443 additions and 225 deletions
+1 -1
View File
@@ -1113,7 +1113,7 @@
1 test-no-wall-clock:src/renderer/src/lib/browser-history-match.performance.test.ts
1 test-no-wall-clock:src/renderer/src/lib/paired-runtime-closed-tab-resume.test.ts
2 test-no-wall-clock:src/renderer/src/lib/settled-worker-wake-policy.test.ts
2 test-no-wall-clock:src/renderer/src/lib/structured-agent-session-launch-persistence.test.ts
2 test-no-wall-clock:src/renderer/src/lib/agent-session/launch/structured-agent-session-launch-persistence.test.ts
2 test-no-wall-clock:src/renderer/src/lib/use-tab-agent-observed-signal-dispatch.test.tsx
2 test-no-wall-clock:src/renderer/src/lib/wake-sleeping-agents-live-unmounted-pane.test.ts
1 test-no-wall-clock:src/renderer/src/lib/workspace-activation-path-gate.test.ts
+4 -4
View File
@@ -10115,15 +10115,15 @@
"src/renderer/src/lib/structured-agent-session-launch-exited-owner.test.ts": 1103,
"src/renderer/src/lib/structured-agent-session-launch-join-delivery.test.ts": 611,
"src/renderer/src/lib/structured-agent-session-launch-options.test.ts": 611,
"src/renderer/src/lib/structured-agent-session-launch-persistence.test.ts": 421,
"src/renderer/src/lib/agent-session/launch/structured-agent-session-launch-persistence.test.ts": 421,
"src/renderer/src/lib/structured-agent-session-launch-probe-outage.test.ts": 1687,
"src/renderer/src/lib/structured-agent-session-launch-prompt-stop.test.ts": 433,
"src/renderer/src/lib/structured-agent-session-launch-prompt.test.ts": 513,
"src/renderer/src/lib/structured-agent-session-launch-record.test.ts": 279,
"src/renderer/src/lib/agent-session/launch/structured-agent-session-launch-record.test.ts": 279,
"src/renderer/src/lib/structured-agent-session-launch-registered-agent.test.ts": 643,
"src/renderer/src/lib/structured-agent-session-launch-reload.test.ts": 637,
"src/renderer/src/lib/agent-session/launch/structured-agent-session-launch-reload.test.ts": 637,
"src/renderer/src/lib/structured-agent-session-launch-resume-identity.test.ts": 679,
"src/renderer/src/lib/structured-agent-session-launch-unconfirmed-or-retried.test.ts": 656,
"src/renderer/src/lib/agent-session/launch/structured-agent-session-launch-unconfirmed-or-retried.test.ts": 656,
"src/renderer/src/lib/structured-agent-session-launch.test.ts": 822,
"src/renderer/src/lib/structured-agent-session-new-chat-own-launch.test.ts": 701,
"src/renderer/src/lib/agent-session/structured-agent-session-provisional-tab.test.ts": 829,
@@ -73,11 +73,11 @@ vi.mock('@/runtime/structured-agent-session-client', () => ({
}))
import { useAppStore } from '@/store'
import { notifyStructuredLaunchListeners } from '@/lib/structured-agent-session-launch-registry'
import { notifyStructuredLaunchListeners } from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import {
writeStructuredAgentLaunchRecord,
deleteStructuredAgentLaunchRecord
} from '@/lib/structured-agent-session-launch-persistence'
} from '@/lib/agent-session/launch/structured-agent-session-launch-persistence'
import { StructuredAgentSessionStatusBridge } from './StructuredAgentSessionStatusBridge'
import {
getStructuredAgentSessionStatusFeed,
@@ -5,7 +5,7 @@ import { projectStatus } from './structured-agent-session-status-projection'
import {
getStructuredAgentSessionLaunchLifecycle,
subscribeStructuredAgentLaunchStatus
} from '@/lib/structured-agent-session-launch-registry'
} from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import { getStructuredAgentSessionLaunchFailedAt } from '@/lib/structured-agent-session-launch-failed-at'
import { useAppStore } from '@/store'
import type { AppState } from '@/store/types'
@@ -2,6 +2,7 @@
// Refused creates publish no host session; bridge launch failures into tab/workspace rows until retry or closure.
import type * as LaunchErrors from '@/lib/structured-agent-session-launch-errors'
import { act, cleanup, render, waitFor } from '@testing-library/react'
import { afterEach, beforeEach, describe, expect, it, vi, type Mock } from 'vitest'
import type { AgentSessionStatusEvent } from '../../../../shared/agent-session-wire'
@@ -63,15 +64,29 @@ vi.mock('@/runtime/local-structured-session-tabs-sync/inventory-refresh', () =>
refreshLocalStructuredSessionTabs: vi.fn(async () => [])
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
const launchErrorMocks = vi.hoisted(() => {
class StructuredAgentSessionCreateRefusalError extends Error {}
return { StructuredAgentSessionCreateRefusalError }
})
vi.mock('@/lib/structured-agent-session-launch-errors', async () => ({
...(await vi.importActual<typeof LaunchErrors>('@/lib/structured-agent-session-launch-errors')),
...launchErrorMocks
}))
vi.mock('@/lib/structured-agent-session-launch-create-call', () => ({
launchStructuredAgentSession: mocks.launch
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
return {
createStructuredAgentSessionLaunchIntent: mocks.createIntent,
retryStructuredAgentSessionLaunchIntent: mocks.retryIntent,
restoreStructuredAgentSessionLaunchIntent: mocks.restoreIntent,
abandonStructuredAgentSessionLaunchIntent: vi.fn(),
launchStructuredAgentSession: mocks.launch,
StructuredAgentSessionCreateRefusalError
StructuredAgentSessionCreateRefusalError:
launchErrorMocks.StructuredAgentSessionCreateRefusalError
}
})
@@ -81,8 +96,8 @@ import {
retryStructuredAgentSessionLaunch,
startStructuredAgentLaunch
} from '@/lib/structured-agent-session-launch'
import { resetStructuredAgentLaunchRegistryForTests } from '@/lib/structured-agent-session-launch-registry'
import { resetStructuredAgentLaunchPersistenceForTests } from '@/lib/structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import { resetStructuredAgentLaunchPersistenceForTests } from '@/lib/agent-session/launch/structured-agent-session-launch-persistence'
import { resetStructuredAgentSessionStatusFeedsForTests } from '@/runtime/structured-agent-session-status-feed'
import {
resetTerminalTabActivityFlagsCacheForTest,
@@ -2,6 +2,7 @@
// Lost create replies remain unmarked and recheck on reconnect; only confirmed failures earn failure marks.
import type * as LaunchErrors from '@/lib/structured-agent-session-launch-errors'
import { act, cleanup, render, waitFor } from '@testing-library/react'
import { afterEach, beforeEach, describe, expect, it, vi, type Mock } from 'vitest'
import type { RuntimeMobileSessionTabsResult } from '../../../../shared/runtime-types'
@@ -64,15 +65,29 @@ vi.mock('@/runtime/local-structured-session-tabs-sync/inventory-refresh', () =>
refreshLocalStructuredSessionTabs: mocks.refresh
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
const launchErrorMocks = vi.hoisted(() => {
class StructuredAgentSessionCreateRefusalError extends Error {}
return { StructuredAgentSessionCreateRefusalError }
})
vi.mock('@/lib/structured-agent-session-launch-errors', async () => ({
...(await vi.importActual<typeof LaunchErrors>('@/lib/structured-agent-session-launch-errors')),
...launchErrorMocks
}))
vi.mock('@/lib/structured-agent-session-launch-create-call', () => ({
launchStructuredAgentSession: mocks.launch
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
return {
createStructuredAgentSessionLaunchIntent: mocks.createIntent,
retryStructuredAgentSessionLaunchIntent: vi.fn((prior: unknown) => prior),
restoreStructuredAgentSessionLaunchIntent: mocks.restoreIntent,
abandonStructuredAgentSessionLaunchIntent: vi.fn(),
launchStructuredAgentSession: mocks.launch,
StructuredAgentSessionCreateRefusalError
StructuredAgentSessionCreateRefusalError:
launchErrorMocks.StructuredAgentSessionCreateRefusalError
}
})
@@ -84,9 +99,9 @@ import {
getStructuredAgentSessionLaunchLifecycle,
markStructuredAgentSessionLaunchCancelled,
resetStructuredAgentLaunchRegistryForTests
} from '@/lib/structured-agent-session-launch-registry'
import { resetStructuredAgentLaunchPersistenceForTests } from '@/lib/structured-agent-session-launch-persistence'
import { recheckUnconfirmedStructuredAgentLaunches } from '@/lib/structured-agent-session-launch-unconfirmed-recheck'
} from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import { resetStructuredAgentLaunchPersistenceForTests } from '@/lib/agent-session/launch/structured-agent-session-launch-persistence'
import { recheckUnconfirmedStructuredAgentLaunches } from '@/lib/agent-session/launch/structured-agent-session-launch-unconfirmed-recheck'
import { resetStructuredAgentSessionStatusFeedsForTests } from '@/runtime/structured-agent-session-status-feed'
import {
resetTerminalTabActivityFlagsCacheForTest,
@@ -26,6 +26,10 @@ vi.mock('@/runtime/structured-agent-session-client', () => ({
callStructuredAgentSession: mocks.call
}))
vi.mock('@/lib/structured-agent-session-launch-create-call', () => ({
launchStructuredAgentSession: mocks.launch
}))
vi.mock('@/lib/launch-structured-agent-session', async () => {
const actual = await vi.importActual<typeof LaunchIntentModule>(
'@/lib/launch-structured-agent-session'
@@ -64,8 +68,8 @@ import {
} from '@/lib/structured-agent-session-launch'
import type { RuntimeClientTarget } from '../../../../shared/runtime-client-target'
import { dispatchStructuredAgentSessionComposerCommand } from '../../../../shared/structured-agent-session-composer'
import { resetStructuredAgentLaunchPersistenceForTests } from '@/lib/structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from '@/lib/structured-agent-session-launch-registry'
import { resetStructuredAgentLaunchPersistenceForTests } from '@/lib/agent-session/launch/structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import { useNativeChatProvisionalLaunch } from './use-native-chat-provisional-launch'
import { useStructuredAgentSession } from './use-structured-agent-session'
import { resetHostModelCatalogSnapshotsForTests } from '@/runtime/host-model-catalog-snapshots'
@@ -7,7 +7,7 @@ import {
useStructuredAgentSessionLaunchLifecycle
} from '@/lib/structured-agent-session-launch'
import { getStructuredAgentSessionLaunchSelection } from '@/lib/structured-agent-session-launch-options'
import { subscribeStructuredAgentLaunchStatus } from '@/lib/structured-agent-session-launch-registry'
import { subscribeStructuredAgentLaunchStatus } from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import { relaunchFailedStructuredAgentSessionWithMessage } from '@/lib/structured-agent-session-launch-message'
import { toRuntimeWorktreeSelector } from '@/runtime/runtime-worktree-selector'
@@ -20,7 +20,7 @@ import {
} from '../../../../shared/structured-agent-cli-conversation-adoption'
import { structuredAgentSessionPaneKey } from '../../../../shared/structured-agent-session-projection'
import type { Tab } from '../../../../shared/tab-types'
import { getStructuredAgentSessionLaunchLifecycle } from '@/lib/structured-agent-session-launch-registry'
import { getStructuredAgentSessionLaunchLifecycle } from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import { structuredLaunchConversationOwner } from '@/lib/structured-agent-session-launch-failure'
import { structuredAgentSessionTargetForHost } from '@/runtime/structured-agent-session-owner'
import { getStructuredAgentSessionStatusFeed } from '@/runtime/structured-agent-session-status-feed'
@@ -3,7 +3,7 @@
import type { ReactNode } from 'react'
import { cleanup, fireEvent, render, renderHook } from '@testing-library/react'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import type { StructuredLaunchState } from '@/lib/structured-agent-session-launch-registry'
import type { StructuredLaunchState } from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import type { StructuredLaunchAttempt } from '@/lib/structured-agent-session-launch-request'
import type * as WorktreeFixtures from '@/store/slices/worktrees-slice-test-fixtures'
@@ -72,7 +72,7 @@ import * as menuRows from './use-new-tab-agent-menu-rows'
import {
resetStructuredAgentLaunchRegistryForTests,
setStructuredLaunchState
} from '@/lib/structured-agent-session-launch-registry'
} from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
const WORKTREE_ID = 'worktree-1'
@@ -74,7 +74,7 @@ import {
readStructuredAgentLaunchRecord,
writeStructuredAgentLaunchRecord,
resetStructuredAgentLaunchPersistenceForTests
} from '@/lib/structured-agent-session-launch-persistence'
} from '@/lib/agent-session/launch/structured-agent-session-launch-persistence'
import {
reserveStructuredLaunchSlot,
restoreStructuredLaunchSurfaces,
@@ -94,7 +94,7 @@ import { runCliChatResume } from './cli-chat-resume-run'
import {
resetStructuredAgentLaunchRegistryForTests,
structuredLaunchStates
} from '@/lib/structured-agent-session-launch-registry'
} from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import { isEmptyWorkspaceDefaultSurfacePending } from '@/lib/empty-workspace-default-surface-claims'
import {
clearWebSessionFocusIntent,
@@ -24,7 +24,7 @@ vi.mock('@/runtime/structured-agent-session-owner', () => ({
vi.mock('./structured-agent-session-launch-message', () => ({
relaunchFailedStructuredAgentSessionWithMessage: mocks.relaunch
}))
vi.mock('./structured-agent-session-launch-registry', () => ({
vi.mock('./agent-session/launch/structured-agent-session-launch-registry', () => ({
getStructuredAgentSessionLaunchLifecycle: () => mocks.launch.lifecycle
}))
vi.mock('./active-agent-note-send', () => ({ sendNotesToActiveAgentSession: vi.fn() }))
+1 -1
View File
@@ -2,7 +2,7 @@ import type { ActiveAgentNotesSendResult } from './active-agent-note-send-result
import type { AgentMessageTarget } from './agent-message-target'
import { sendNotesToActiveAgentSession } from './active-agent-note-send'
import { relaunchFailedStructuredAgentSessionWithMessage } from './structured-agent-session-launch-message'
import { getStructuredAgentSessionLaunchLifecycle } from './structured-agent-session-launch-registry'
import { getStructuredAgentSessionLaunchLifecycle } from './agent-session/launch/structured-agent-session-launch-registry'
import { sendStructuredAgentSessionMessage } from '@/components/native-chat/structured-agent-session-message-sender'
import { structuredAgentSessionTargetForTab } from '@/runtime/structured-agent-session-owner'
import { useAppStore } from '@/store'
@@ -1,4 +1,4 @@
import type { StructuredLaunchSurfaceAddress } from './structured-agent-session-launch-record'
import type { StructuredLaunchSurfaceAddress } from './agent-session/launch/structured-agent-session-launch-record'
import type { StructuredAgentSessionResumeSource } from '../../../shared/structured-agent-session-create'
import type { TuiAgent } from '../../../shared/tui-agent'
import {
@@ -3,7 +3,7 @@ import {
structuredLaunchStates,
type StructuredLaunchState
} from './structured-agent-session-launch-registry'
import type { AgentLaunchRequestId } from './agent-launch-request-id'
import type { AgentLaunchRequestId } from '../../agent-launch-request-id'
// Coalesce re-delivery of one action only. Other actions and failed/unconfirmed retries open independent chats/text; conversation resumes still hold because hosts refuse duplicate adoption.
function holdsLaunchIdentity(
@@ -1,23 +1,23 @@
import { useAppStore } from '@/store'
import { useAppStore } from '@/store/index'
import { removeStructuredLaunchSlot } from './structured-agent-session-launch-slot'
import {
materializeStructuredLaunchSurface,
findStructuredLaunchTab
} from './structured-agent-session-launch-surface'
import { StructuredAgentSessionCreateRefusalError } from '@/lib/launch-structured-agent-session'
} from '../../structured-agent-session-launch-surface'
import { StructuredAgentSessionCreateRefusalError } from '@/lib/structured-agent-session-launch-errors'
import {
settleStructuredLaunchCallers,
structuredLaunchCallersHavePendingWork
} from '@/lib/structured-agent-session-launch-callers'
import type { StructuredAgentLaunchReceipt } from '@/lib/structured-agent-session-launch-recovery'
import { structuredLaunchFailure } from './structured-agent-session-launch-failure'
import type { StructuredAgentLaunchReceipt } from '@/lib/agent-session/launch/structured-agent-session-launch-recovery'
import { structuredLaunchFailure } from '../../structured-agent-session-launch-failure'
import {
deleteStructuredLaunchStateIfCurrent,
notifyStructuredLaunchListeners,
retireStructuredAgentSessionLaunchCancellationTombstone,
type StructuredLaunchState
} from './structured-agent-session-launch-registry'
import { recordUnlistedCreatedChat } from './structured-agent-session-unlisted-created-chats'
import { recordUnlistedCreatedChat } from '../../structured-agent-session-unlisted-created-chats'
function cleanupLaunchState(state: StructuredLaunchState): void {
if (deleteStructuredLaunchStateIfCurrent(state)) {
@@ -9,10 +9,10 @@ import {
retireAbsentStructuredAgentLaunchCancellationTombstonesPersisted,
retireStructuredAgentLaunchCancellationTombstonePersisted,
writeStructuredAgentLaunchRecord,
markStructuredAgentLaunchCancelledPersisted,
structuredAgentLaunchRecordFor
markStructuredAgentLaunchCancelledPersisted
} from './structured-agent-session-launch-persistence'
import type { StructuredAgentSessionLaunchIntent } from './launch-structured-agent-session'
import { structuredAgentLaunchRecordFor } from './structured-agent-session-launch-record'
import type { StructuredAgentSessionLaunchIntent } from '../../launch-structured-agent-session'
const SERVER = 'runtime:server-1'
const TOMBSTONES_KEY = 'orca:structuredAgentLaunchCancelledSessions:v1'
@@ -1,20 +1,16 @@
import { structuredAgentSessionTabId } from '../../../shared/structured-agent-session-projection'
import { structuredAgentSessionTabId } from '../../../../../shared/structured-agent-session-projection'
import {
validRecord,
parseStructuredLaunchSurfaceAddress,
type StructuredAgentLaunchPersistedRecord
} from './structured-agent-session-launch-record'
export {
structuredAgentLaunchRecordFor,
type StructuredAgentLaunchPersistedRecord,
type StructuredAgentLaunchPersistedLifecycle
} from './structured-agent-session-launch-record'
import { parseStructuredLaunchSeedOptions } from '../../../shared/native-chat-session-option-defaults'
import { parseStructuredLaunchSeedOptions } from '../../../../../shared/native-chat-session-option-defaults'
import {
LOCAL_EXECUTION_HOST_ID,
parseExecutionHostId,
type ExecutionHostId
} from '../../../shared/execution-host'
} from '../../../../../shared/execution-host'
const LAUNCH_STORAGE_KEY = 'orca:structuredAgentLaunches:v1'
const TOMBSTONE_STORAGE_KEY = 'orca:structuredAgentLaunchCancelledSessions:v1'
@@ -1,6 +1,6 @@
import type { StructuredLaunchCaller } from './structured-agent-session-launch-callers'
import type { StructuredLaunchCaller } from '../../structured-agent-session-launch-callers'
import type { StructuredAgentLaunchReceipt } from './structured-agent-session-launch-recovery'
import { STRUCTURED_AGENT_SESSION_SEND_BUDGET_MS } from '@/components/native-chat/structured-agent-session-message-sender'
import { STRUCTURED_AGENT_SESSION_SEND_BUDGET_MS } from '@/components/native-chat/structured-agent-session-send-runtime'
import {
notifyStructuredLaunchListeners,
type StructuredLaunchState
@@ -1,5 +1,5 @@
import { recoverPublishedSessionReceipt } from './structured-agent-session-launch-recovery'
import { publishStructuredLaunchCreateOptions } from './structured-agent-session-launch-create-message'
import { publishStructuredLaunchCreateOptions } from '../../structured-agent-session-launch-create-message'
import { trackLaunchSettlement } from './structured-agent-session-launch-outcome-tracking'
import { trackStructuredLaunchConfirmationDeadline } from './structured-agent-session-launch-prompt-outcome'
import { restorePersistedStructuredLaunchState } from './structured-agent-session-launch-reload'
@@ -1,5 +1,5 @@
import type { ExecutionHostId } from '../../../shared/execution-host'
import type { RuntimeMobileSessionTabsResult } from '../../../shared/runtime-types'
import type { ExecutionHostId } from '../../../../../shared/execution-host'
import type { RuntimeMobileSessionTabsResult } from '../../../../../shared/runtime-session-contracts'
import { deleteStructuredAgentLaunchRecord } from './structured-agent-session-launch-persistence'
import {
getPersistedStructuredAgentLaunchRecord,
@@ -7,7 +7,7 @@ import {
hasStructuredAgentSessionLaunchCancellationTombstone,
notifyStructuredLaunchListeners
} from './structured-agent-session-launch-registry'
import { forgetUnlistedCreatedChat } from './structured-agent-session-unlisted-created-chats'
import { forgetUnlistedCreatedChat } from '../../structured-agent-session-unlisted-created-chats'
function confirmStructuredLaunchFirstMessagePublication(
worktreeId: string,
@@ -1,13 +1,13 @@
import { isTuiAgent } from '../../../shared/tui-agent-config'
import type { TuiAgent } from '../../../shared/tui-agent'
import { isTuiAgent } from '../../../../../shared/tui-agent-config'
import type { TuiAgent } from '../../../../../shared/tui-agent'
import type {
StructuredAgentSessionFirstMessage,
StructuredAgentSessionResumeSource
} from '../../../shared/structured-agent-session-create'
import { isAgentSessionOptions } from '../../../shared/agent-session-record'
import { SendBodyStructure } from '../../../shared/rpc-contract/structured-agent-session-message-params'
import { parseExecutionHostId, type ExecutionHostId } from '../../../shared/execution-host'
import type { StructuredAgentSessionLaunchIntent } from './launch-structured-agent-session'
} from '../../../../../shared/structured-agent-session-create'
import { isAgentSessionOptions } from '../../../../../shared/agent-session-record'
import { SendBodyStructure } from '../../../../../shared/rpc-contract/structured-agent-session-message-params'
import { parseExecutionHostId, type ExecutionHostId } from '../../../../../shared/execution-host'
import type { StructuredAgentSessionLaunchIntent } from '../../launch-structured-agent-session'
export type StructuredAgentLaunchPersistedLifecycle = 'pending' | 'visibility-unknown' | 'failed'
@@ -1,17 +1,17 @@
import type { AgentSessionHistoryResult } from '../../../shared/agent-session-wire'
import type { AgentSessionHistoryResult } from '../../../../../shared/agent-session-wire'
import type {
AgentJournalCursor,
AgentJournalSubmission
} from '../../../shared/agent-session-journal-types'
} from '../../../../../shared/agent-session-journal-types'
import {
launchStructuredAgentSession,
StructuredAgentSessionCreateRefusalError,
type StructuredAgentSessionLaunchIntent,
type StructuredLaunchHostSeedListener
} from '@/lib/launch-structured-agent-session'
} from '@/lib/structured-agent-session-launch-create-call'
import { StructuredAgentSessionCreateRefusalError } from '@/lib/structured-agent-session-launch-errors'
import type { StructuredAgentSessionLaunchIntent } from '@/lib/launch-structured-agent-session'
import { callStructuredAgentSession } from '@/runtime/structured-agent-session-client'
import { readStructuredSessionTabInventory } from '@/runtime/structured-session-tab-inventory'
import { publishStructuredAgentSessionCreateHydration } from './structured-agent-session-create-hydration'
import { publishStructuredAgentSessionCreateHydration } from '../../structured-agent-session-create-hydration'
export type StructuredAgentLaunchReceipt = {
sessionId: string
@@ -1,22 +1,22 @@
import { useSyncExternalStore } from 'react'
import type { TuiAgent } from '../../../shared/tui-agent'
import type { StructuredLaunchFailure } from './structured-agent-session-launch-failure'
import type { StructuredAgentSessionResumeSource } from '../../../shared/structured-agent-session-create'
import { LOCAL_EXECUTION_HOST_ID, type ExecutionHostId } from '../../../shared/execution-host'
import type { TuiAgent } from '../../../../../shared/tui-agent'
import type { StructuredLaunchFailure } from '../../structured-agent-session-launch-failure'
import type { StructuredAgentSessionResumeSource } from '../../../../../shared/structured-agent-session-create'
import { LOCAL_EXECUTION_HOST_ID, type ExecutionHostId } from '../../../../../shared/execution-host'
import type { StructuredLaunchRecoveryState } from './structured-agent-session-launch-recovery'
import type { StructuredLaunchSelection } from './structured-agent-session-launch-options'
import type { StructuredLaunchSelection } from '../../structured-agent-session-launch-options'
import type {
StructuredAgentLaunchOptions,
StructuredLaunchCallerGroup
} from './structured-agent-session-launch-callers'
} from '../../structured-agent-session-launch-callers'
import {
deleteStructuredAgentLaunchRecord,
hasStructuredAgentLaunchCancellationTombstonePersisted,
readStructuredAgentLaunchRecord,
structuredAgentLaunchRecordFor,
writeStructuredAgentLaunchRecord,
type StructuredAgentLaunchPersistedRecord
writeStructuredAgentLaunchRecord
} from './structured-agent-session-launch-persistence'
import type { StructuredAgentLaunchPersistedRecord } from './structured-agent-session-launch-record'
import { structuredAgentLaunchRecordFor } from './structured-agent-session-launch-record'
import {
removeStructuredLaunchSlot,
type StructuredLaunchSlotOwner
@@ -26,12 +26,12 @@ import {
resetStructuredAgentLaunchCancellationForTests,
retireAbsentStructuredAgentLaunchCancellations,
retireStructuredAgentLaunchCancellation
} from './launch-cancel-tombstones-compat/structured-agent-session-launch-cancellation'
import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../shared/layout-owner-switch'
} from '../../launch-cancel-tombstones-compat/structured-agent-session-launch-cancellation'
import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../../shared/layout-owner-switch'
import {
cancelStructuredAgentLaunchOnLocalHost,
resetStructuredAgentLocalLaunchCancelsForTests
} from './structured-agent-session-local-launch-cancel'
} from '../../structured-agent-session-local-launch-cancel'
export type StructuredLaunchState = StructuredLaunchRecoveryState & {
identity: string
@@ -1,9 +1,10 @@
// @vitest-environment happy-dom
import type * as LaunchErrors from '@/lib/structured-agent-session-launch-errors'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import type { RuntimeMobileSessionTabsResult } from '../../../shared/runtime-session-contracts'
import type { RuntimeMobileSessionTabsResult } from '../../../../../shared/runtime-session-contracts'
import type { StructuredAgentSessionLaunchIntent } from '@/lib/launch-structured-agent-session'
import type * as RecoveryModule from '@/lib/structured-agent-session-launch-recovery'
import type * as RecoveryModule from '@/lib/agent-session/launch/structured-agent-session-launch-recovery'
const mocks = vi.hoisted(() => ({
abandonIntent: vi.fn(),
@@ -16,21 +17,35 @@ const mocks = vi.hoisted(() => ({
refresh: vi.fn()
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
const launchErrorMocks = vi.hoisted(() => {
class StructuredAgentSessionCreateRefusalError extends Error {}
return { StructuredAgentSessionCreateRefusalError }
})
vi.mock('@/lib/structured-agent-session-launch-errors', async () => ({
...(await vi.importActual<typeof LaunchErrors>('@/lib/structured-agent-session-launch-errors')),
...launchErrorMocks
}))
vi.mock('@/lib/structured-agent-session-launch-create-call', () => ({
launchStructuredAgentSession: mocks.launch
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
return {
abandonStructuredAgentSessionLaunchIntent: mocks.abandonIntent,
createStructuredAgentSessionLaunchIntent: vi.fn(),
launchStructuredAgentSession: mocks.launch,
restoreStructuredAgentSessionLaunchIntent: mocks.restoreIntent,
retryStructuredAgentSessionLaunchIntent: mocks.retryIntent,
StructuredAgentSessionCreateRefusalError
StructuredAgentSessionCreateRefusalError:
launchErrorMocks.StructuredAgentSessionCreateRefusalError
}
})
vi.mock('@/lib/structured-agent-session-launch-recovery', async () => {
vi.mock('@/lib/agent-session/launch/structured-agent-session-launch-recovery', async () => {
const actual = await vi.importActual<typeof RecoveryModule>(
'@/lib/structured-agent-session-launch-recovery'
'@/lib/agent-session/launch/structured-agent-session-launch-recovery'
)
return { ...actual, launchAndReconcile: vi.fn(actual.launchAndReconcile) }
})
@@ -60,7 +75,7 @@ vi.mock('@/lib/agent-catalog', () => ({
getAgentLabel: (agent: string) => (agent === 'codex' ? 'Codex' : 'Claude')
}))
import { retryStructuredAgentSessionLaunch } from './structured-agent-session-launch'
import { retryStructuredAgentSessionLaunch } from '../../structured-agent-session-launch'
import { resetStructuredAgentLaunchPersistenceForTests } from './structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from './structured-agent-session-launch-registry'
@@ -1,19 +1,19 @@
import {
restoreStructuredAgentSessionLaunchIntent,
StructuredAgentSessionOwnerUnresolvedError,
type StructuredAgentSessionLaunchIntent
} from './launch-structured-agent-session'
} from '../../launch-structured-agent-session'
import { StructuredAgentSessionOwnerUnresolvedError } from '../../structured-agent-session-launch-errors'
import {
createStructuredLaunchCallerGroup,
type StructuredLaunchCallerGroup
} from './structured-agent-session-launch-callers'
} from '../../structured-agent-session-launch-callers'
import {
getPersistedStructuredAgentLaunchRecord,
setStructuredLaunchState,
structuredLaunchIdentity,
type StructuredLaunchState
} from './structured-agent-session-launch-registry'
import { initialStructuredLaunchSelection } from './structured-agent-session-launch-options'
import { initialStructuredLaunchSelection } from '../../structured-agent-session-launch-options'
export function restorePersistedStructuredLaunchState(
worktreeId: string,
@@ -1,5 +1,5 @@
import type { TabsSlice } from '@/store/slices/tabs/tabs-slice-contract'
import { structuredAgentSessionTabId } from '../../../shared/structured-agent-session-projection'
import { structuredAgentSessionTabId } from '../../../../../shared/structured-agent-session-projection'
export type StructuredLaunchSlotOwner = Pick<
TabsSlice,
@@ -1,7 +1,8 @@
// @vitest-environment happy-dom
import type * as LaunchErrors from '@/lib/structured-agent-session-launch-errors'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import type { RuntimeMobileSessionTabsResult } from '../../../shared/runtime-session-contracts'
import type { RuntimeMobileSessionTabsResult } from '../../../../../shared/runtime-session-contracts'
import type { StructuredAgentSessionLaunchIntent } from '@/lib/launch-structured-agent-session'
const mocks = vi.hoisted(() => ({
@@ -18,15 +19,29 @@ const mocks = vi.hoisted(() => ({
vi.mock('sonner', () => ({ toast: { error: mocks.toastError, message: vi.fn() } }))
vi.mock('@/lib/launch-structured-agent-session', () => {
const launchErrorMocks = vi.hoisted(() => {
class StructuredAgentSessionCreateRefusalError extends Error {}
return { StructuredAgentSessionCreateRefusalError }
})
vi.mock('@/lib/structured-agent-session-launch-errors', async () => ({
...(await vi.importActual<typeof LaunchErrors>('@/lib/structured-agent-session-launch-errors')),
...launchErrorMocks
}))
vi.mock('@/lib/structured-agent-session-launch-create-call', () => ({
launchStructuredAgentSession: mocks.launch
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
return {
createStructuredAgentSessionLaunchIntent: mocks.createIntent,
retryStructuredAgentSessionLaunchIntent: mocks.retryIntent,
restoreStructuredAgentSessionLaunchIntent: mocks.restoreIntent,
abandonStructuredAgentSessionLaunchIntent: mocks.abandonIntent,
launchStructuredAgentSession: mocks.launch,
StructuredAgentSessionCreateRefusalError
StructuredAgentSessionCreateRefusalError:
launchErrorMocks.StructuredAgentSessionCreateRefusalError
}
})
@@ -62,7 +77,7 @@ vi.mock('@/lib/focus-terminal-tab-surface', () => ({ focusTerminalTabSurface: vi
// The structured route hands the launch's own delivery result back unchanged.
vi.mock('@/lib/launch-agent-in-new-tab', async () => {
const launch = await import('./structured-agent-session-launch')
const launch = await import('../../structured-agent-session-launch')
return {
launchAgentInNewTab: (args: {
requestId: string
@@ -85,17 +100,19 @@ vi.mock('@/lib/launch-agent-in-new-tab', async () => {
}
})
import { StructuredAgentSessionCreateRefusalError } from '@/lib/launch-structured-agent-session'
import { StructuredAgentSessionCreateRefusalError } from '@/lib/structured-agent-session-launch-errors'
import { refreshLocalStructuredSessionTabs } from '@/runtime/local-structured-session-tabs-sync/inventory-refresh'
import { runSourceControlAgentActionStart } from '@/components/right-sidebar/runSourceControlAgentActionStart'
import { getStructuredAgentLaunchStatus } from '../../structured-agent-session-launch-status'
import {
getStructuredAgentLaunchStatus,
getStructuredAgentSessionLaunchLifecycle,
resetStructuredAgentLaunchRegistryForTests
} from './structured-agent-session-launch-registry'
import {
retryStructuredAgentSessionLaunch,
startStructuredAgentLaunch
} from './structured-agent-session-launch'
} from '../../structured-agent-session-launch'
import { resetStructuredAgentLaunchPersistenceForTests } from './structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from './structured-agent-session-launch-registry'
const WORKTREE_ID = 'wt-unconfirmed-or-retried'
@@ -1,6 +1,6 @@
import type { ExecutionHostId } from '../../../shared/execution-host'
import { useAppStore } from '@/store'
import { retryStructuredAgentSessionLaunch } from './structured-agent-session-launch'
import type { ExecutionHostId } from '../../../../../shared/execution-host'
import { useAppStore } from '@/store/index'
import { retryStructuredAgentSessionLaunch } from '../../structured-agent-session-launch'
import {
getStructuredAgentSessionLaunchLifecycle,
getStructuredAgentSessionLaunchOwner,
@@ -11,7 +11,7 @@ import { useNativeChatProvisionalLaunch } from '@/components/native-chat/use-nat
import {
getStructuredAgentSessionLaunchFailure,
resetStructuredAgentLaunchRegistryForTests
} from '../structured-agent-session-launch-registry'
} from './launch/structured-agent-session-launch-registry'
import { structuredSessionNotices } from '@/components/native-chat/native-chat-structured-session-notices'
import type { AgentTerminalLaunchCompletion } from '../structured-agent-session-launch-admission'
import {
@@ -1,5 +1,6 @@
// @vitest-environment happy-dom
import type * as LaunchErrors from '@/lib/structured-agent-session-launch-errors'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
const mockCreateTab = vi.fn()
@@ -150,22 +151,44 @@ vi.mock('@/runtime/web-runtime-session-environment', () => ({
vi.mock('../../../shared/terminal-surface-id', () => ({
isWebTerminalSurfaceTabId: vi.fn(() => false)
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
const launchErrorMocks = vi.hoisted(() => {
class StructuredAgentSessionCreateRefusalError extends Error {}
class StructuredAgentSessionHostDeclinedError extends StructuredAgentSessionCreateRefusalError {}
class StructuredAgentSessionHostUnreachableError extends StructuredAgentSessionCreateRefusalError {}
class StructuredAgentSessionOwnerUnresolvedError extends Error {}
return {
createStructuredAgentSessionLaunchIntent: mockCreateStructuredCodexSessionLaunchIntent,
abandonStructuredAgentSessionLaunchIntent: mockAbandonStructuredAgentSessionLaunchIntent,
retryStructuredAgentSessionLaunchIntent: mockRetryStructuredAgentSessionLaunchIntent,
launchStructuredAgentSession: mockLaunchStructuredCodexSession,
StructuredAgentSessionCreateRefusalError,
StructuredAgentSessionHostDeclinedError,
StructuredAgentSessionHostUnreachableError,
StructuredAgentSessionOwnerUnresolvedError
}
})
vi.mock('@/lib/structured-agent-session-launch-errors', async () => ({
...(await vi.importActual<typeof LaunchErrors>('@/lib/structured-agent-session-launch-errors')),
...launchErrorMocks
}))
vi.mock('@/lib/structured-agent-session-launch-create-call', () => ({
launchStructuredAgentSession: mockLaunchStructuredCodexSession
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
return {
createStructuredAgentSessionLaunchIntent: mockCreateStructuredCodexSessionLaunchIntent,
abandonStructuredAgentSessionLaunchIntent: mockAbandonStructuredAgentSessionLaunchIntent,
retryStructuredAgentSessionLaunchIntent: mockRetryStructuredAgentSessionLaunchIntent,
launchStructuredAgentSession: mockLaunchStructuredCodexSession,
StructuredAgentSessionCreateRefusalError:
launchErrorMocks.StructuredAgentSessionCreateRefusalError,
StructuredAgentSessionHostDeclinedError:
launchErrorMocks.StructuredAgentSessionHostDeclinedError,
StructuredAgentSessionHostUnreachableError:
launchErrorMocks.StructuredAgentSessionHostUnreachableError,
StructuredAgentSessionOwnerUnresolvedError:
launchErrorMocks.StructuredAgentSessionOwnerUnresolvedError
}
})
vi.mock('@/runtime/local-structured-session-tabs-sync/inventory-refresh', () => ({
refreshLocalStructuredSessionTabs: mockRefreshLocalStructuredSessionTabs
}))
@@ -1,19 +1,19 @@
// @vitest-environment happy-dom
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import type { StructuredLaunchSlotOwner } from '@/lib/structured-agent-session-launch-slot'
import type { StructuredLaunchSlotOwner } from '@/lib/agent-session/launch/structured-agent-session-launch-slot'
import type { RuntimeMobileSessionTabsResult } from '../../../../shared/runtime-types'
import { suppressCancelledStructuredSessionTabs } from '@/runtime/structured-agent-session-tab-retirement'
import type { StructuredLaunchState } from '../structured-agent-session-launch-registry'
import type { StructuredLaunchState } from '../agent-session/launch/structured-agent-session-launch-registry'
import {
hasStructuredAgentSessionLaunchCancellationTombstone,
markStructuredAgentSessionLaunchCancelled,
retireAbsentStructuredAgentSessionLaunchCancellationTombstones,
resetStructuredAgentLaunchRegistryForTests,
setStructuredLaunchState
} from '../structured-agent-session-launch-registry'
} from '../agent-session/launch/structured-agent-session-launch-registry'
import { beginStructuredAgentSessionAuthoritativeInventory } from './structured-agent-session-launch-cancellation'
import { resetStructuredAgentLaunchPersistenceForTests } from '../structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchPersistenceForTests } from '../agent-session/launch/structured-agent-session-launch-persistence'
import { refreshLocalStructuredSessionTabs } from '@/runtime/local-structured-session-tabs-sync/inventory-refresh'
import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../../shared/layout-owner-switch'
import type { ExecutionHostId } from '../../../../shared/execution-host'
@@ -6,7 +6,7 @@ import {
readStructuredAgentLaunchCancellationTombstoneSessionIds,
retireAbsentStructuredAgentLaunchCancellationTombstonesPersisted,
retireStructuredAgentLaunchCancellationTombstonePersisted
} from '../structured-agent-session-launch-persistence'
} from '../agent-session/launch/structured-agent-session-launch-persistence'
type CancellationRetirement = {
retireAfterInventory: number | null
@@ -1,4 +1,4 @@
import type { StructuredLaunchSurfaceAddress } from './structured-agent-session-launch-record'
import type { StructuredLaunchSurfaceAddress } from './agent-session/launch/structured-agent-session-launch-record'
import type { TuiAgent } from '../../../shared/tui-agent'
import {
createStructuredAgentSessionId,
@@ -1,5 +1,6 @@
// @vitest-environment happy-dom
import type * as LaunchErrors from '@/lib/structured-agent-session-launch-errors'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import type { RuntimeMobileSessionTabsResult } from '../../../shared/runtime-session-contracts'
import type { StructuredAgentSessionLaunchIntent } from '@/lib/launch-structured-agent-session'
@@ -12,15 +13,29 @@ const mocks = vi.hoisted(() => ({
vi.mock('sonner', () => ({ toast: { error: vi.fn(), message: vi.fn() } }))
vi.mock('@/lib/launch-structured-agent-session', () => {
const launchErrorMocks = vi.hoisted(() => {
class StructuredAgentSessionCreateRefusalError extends Error {}
return { StructuredAgentSessionCreateRefusalError }
})
vi.mock('@/lib/structured-agent-session-launch-errors', async () => ({
...(await vi.importActual<typeof LaunchErrors>('@/lib/structured-agent-session-launch-errors')),
...launchErrorMocks
}))
vi.mock('@/lib/structured-agent-session-launch-create-call', () => ({
launchStructuredAgentSession: mocks.launch
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
return {
createStructuredAgentSessionLaunchIntent: mocks.createIntent,
retryStructuredAgentSessionLaunchIntent: (intent: unknown) => intent,
restoreStructuredAgentSessionLaunchIntent: vi.fn(),
abandonStructuredAgentSessionLaunchIntent: vi.fn(),
launchStructuredAgentSession: mocks.launch,
StructuredAgentSessionCreateRefusalError
StructuredAgentSessionCreateRefusalError:
launchErrorMocks.StructuredAgentSessionCreateRefusalError
}
})
@@ -70,8 +85,8 @@ import {
retryStructuredAgentSessionLaunch,
startStructuredAgentLaunch
} from './structured-agent-session-launch'
import { resetStructuredAgentLaunchPersistenceForTests } from './structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from './structured-agent-session-launch-registry'
import { resetStructuredAgentLaunchPersistenceForTests } from './agent-session/launch/structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from './agent-session/launch/structured-agent-session-launch-registry'
import {
holdNotesForSend,
isNoteInFlight,
@@ -1,3 +1,4 @@
import type * as LaunchErrors from '@/lib/structured-agent-session-launch-errors'
import { beforeEach, describe, expect, it, vi } from 'vitest'
const mocks = vi.hoisted(() => ({
@@ -10,8 +11,18 @@ vi.mock('@/lib/structured-agent-session-launch', () => ({
cancelStructuredAgentLaunch: mocks.cancelStructuredAgentLaunch
}))
const launchErrorMocks = vi.hoisted(() => {
return { StructuredAgentSessionCreateRefusalError: class extends Error {} }
})
vi.mock('@/lib/structured-agent-session-launch-errors', async () => ({
...(await vi.importActual<typeof LaunchErrors>('@/lib/structured-agent-session-launch-errors')),
...launchErrorMocks
}))
vi.mock('@/lib/launch-structured-agent-session', () => ({
StructuredAgentSessionCreateRefusalError: class extends Error {}
StructuredAgentSessionCreateRefusalError:
launchErrorMocks.StructuredAgentSessionCreateRefusalError
}))
import { StructuredAgentSessionCreateRefusalError } from '@/lib/launch-structured-agent-session'
@@ -3,7 +3,7 @@ import { translate } from '@/i18n/i18n'
import {
getStructuredLaunchStateBySessionId,
notifyStructuredLaunchListeners
} from './structured-agent-session-launch-registry'
} from './agent-session/launch/structured-agent-session-launch-registry'
import { focusTerminalTabSurface } from './focus-terminal-tab-surface'
import type { Tab } from '../../../shared/tab-types'
import type { StructuredAgentLaunchSettlement } from '@/lib/structured-agent-launch-settlement'
@@ -1,6 +1,6 @@
import type { AgentSessionHistoryPage } from '../../../shared/agent-session-wire'
import type { StructuredAgentSessionLaunchIntent } from './launch-structured-agent-session'
import { hasStructuredAgentLaunchCancellationTombstonePersisted } from './structured-agent-session-launch-persistence'
import { hasStructuredAgentLaunchCancellationTombstonePersisted } from './agent-session/launch/structured-agent-session-launch-persistence'
import { wasStructuredAgentLaunchClosedByLocalCancel } from './structured-agent-session-local-launch-cancel'
import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../shared/layout-owner-switch'
import { getStructuredAgentSessionReadOwner } from '@/components/native-chat/structured-agent-session-read-owner'
@@ -1,5 +1,6 @@
// @vitest-environment happy-dom
import type * as LaunchErrors from '@/lib/structured-agent-session-launch-errors'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import type { RuntimeMobileSessionTabsResult } from '../../../shared/runtime-session-contracts'
import type { StructuredAgentSessionLaunchIntent } from '@/lib/launch-structured-agent-session'
@@ -18,15 +19,29 @@ const mocks = vi.hoisted(() => ({
vi.mock('sonner', () => ({ toast: { error: vi.fn(), message: vi.fn() } }))
vi.mock('@/lib/launch-structured-agent-session', () => {
const launchErrorMocks = vi.hoisted(() => {
class StructuredAgentSessionCreateRefusalError extends Error {}
return { StructuredAgentSessionCreateRefusalError }
})
vi.mock('@/lib/structured-agent-session-launch-errors', async () => ({
...(await vi.importActual<typeof LaunchErrors>('@/lib/structured-agent-session-launch-errors')),
...launchErrorMocks
}))
vi.mock('@/lib/structured-agent-session-launch-create-call', () => ({
launchStructuredAgentSession: mocks.launch
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
return {
createStructuredAgentSessionLaunchIntent: mocks.createIntent,
retryStructuredAgentSessionLaunchIntent: mocks.retryIntent,
restoreStructuredAgentSessionLaunchIntent: mocks.restoreIntent,
abandonStructuredAgentSessionLaunchIntent: mocks.abandonIntent,
launchStructuredAgentSession: mocks.launch,
StructuredAgentSessionCreateRefusalError
StructuredAgentSessionCreateRefusalError:
launchErrorMocks.StructuredAgentSessionCreateRefusalError
}
})
@@ -87,8 +102,8 @@ import {
readNativeChatDraftCache
} from '@/components/native-chat/native-chat-draft-cache'
import { structuredAgentSessionDraftScopeKey } from '@/components/native-chat/native-chat-composer-draft-store'
import { resetStructuredAgentLaunchPersistenceForTests } from './structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from './structured-agent-session-launch-registry'
import { resetStructuredAgentLaunchPersistenceForTests } from './agent-session/launch/structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from './agent-session/launch/structured-agent-session-launch-registry'
type Receipt = { sessionId: string; fence: number }
@@ -1,4 +1,4 @@
import type { StructuredLaunchSurfaceAddress } from './structured-agent-session-launch-record'
import type { StructuredLaunchSurfaceAddress } from './agent-session/launch/structured-agent-session-launch-record'
import { settleStructuredAgentLaunchPrompt } from '@/lib/structured-agent-session-launch-prompt'
import type {
StagedStructuredLaunchPrompt,
@@ -1,9 +1,10 @@
// @vitest-environment happy-dom
import type * as LaunchErrors from '@/lib/structured-agent-session-launch-errors'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { toast } from 'sonner'
import type { RuntimeMobileSessionTabsResult } from '../../../shared/runtime-session-contracts'
import type * as RecoveryModule from '@/lib/structured-agent-session-launch-recovery'
import type * as RecoveryModule from '@/lib/agent-session/launch/structured-agent-session-launch-recovery'
import type { StructuredAgentSessionLaunchIntent } from '@/lib/launch-structured-agent-session'
import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../shared/layout-owner-switch'
@@ -28,21 +29,35 @@ vi.mock('sonner', () => ({
}
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
const launchErrorMocks = vi.hoisted(() => {
class StructuredAgentSessionCreateRefusalError extends Error {}
return { StructuredAgentSessionCreateRefusalError }
})
vi.mock('@/lib/structured-agent-session-launch-errors', async () => ({
...(await vi.importActual<typeof LaunchErrors>('@/lib/structured-agent-session-launch-errors')),
...launchErrorMocks
}))
vi.mock('@/lib/structured-agent-session-launch-create-call', () => ({
launchStructuredAgentSession: mocks.launch
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
return {
createStructuredAgentSessionLaunchIntent: mocks.createIntent,
retryStructuredAgentSessionLaunchIntent: mocks.retryIntent,
restoreStructuredAgentSessionLaunchIntent: mocks.restoreIntent,
abandonStructuredAgentSessionLaunchIntent: mocks.abandonIntent,
launchStructuredAgentSession: mocks.launch,
StructuredAgentSessionCreateRefusalError
StructuredAgentSessionCreateRefusalError:
launchErrorMocks.StructuredAgentSessionCreateRefusalError
}
})
vi.mock('@/lib/structured-agent-session-launch-recovery', async () => {
vi.mock('@/lib/agent-session/launch/structured-agent-session-launch-recovery', async () => {
const actual = await vi.importActual<typeof RecoveryModule>(
'@/lib/structured-agent-session-launch-recovery'
'@/lib/agent-session/launch/structured-agent-session-launch-recovery'
)
return { ...actual, launchAndReconcile: vi.fn(actual.launchAndReconcile) }
})
@@ -102,8 +117,8 @@ import {
} from '@/components/native-chat/native-chat-draft-cache'
import { structuredAgentSessionDraftScopeKey } from '@/components/native-chat/native-chat-composer-draft-store'
import { hasStagedStructuredLaunchPrompt } from './structured-agent-session-launch-prompt'
import { resetStructuredAgentLaunchPersistenceForTests } from './structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from './structured-agent-session-launch-registry'
import { resetStructuredAgentLaunchPersistenceForTests } from './agent-session/launch/structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from './agent-session/launch/structured-agent-session-launch-registry'
function launchIntent(
worktreeId: string,
@@ -22,7 +22,7 @@ import {
abandonStructuredAgentSessionLaunchIntent,
type StructuredAgentSessionLaunchIntent
} from './launch-structured-agent-session'
import type { StructuredAgentLaunchReceipt } from './structured-agent-session-launch-recovery'
import type { StructuredAgentLaunchReceipt } from './agent-session/launch/structured-agent-session-launch-recovery'
import {
StructuredAgentSessionCreateError,
StructuredAgentSessionCreateAbandonedError,
@@ -62,13 +62,13 @@ import {
} from './structured-agent-session-launch'
import { holdStructuredAgentSessionLaunchOption } from './structured-agent-session-launch-options'
import { recordHostModelCatalogSnapshot } from '@/runtime/host-model-catalog-snapshots'
import { resetStructuredAgentLaunchRegistryForTests } from './structured-agent-session-launch-registry'
import { resetStructuredAgentLaunchRegistryForTests } from './agent-session/launch/structured-agent-session-launch-registry'
import {
resetStructuredAgentLaunchPersistenceForTests,
readStructuredAgentLaunchRecord
} from './structured-agent-session-launch-persistence'
} from './agent-session/launch/structured-agent-session-launch-persistence'
import { newAgentLaunchRequestId } from './agent-launch-request-id'
import { markStructuredAgentSessionLaunchPublished } from './structured-agent-session-launch-publication'
import { markStructuredAgentSessionLaunchPublished } from './agent-session/launch/structured-agent-session-launch-publication'
import { StructuredAgentSessionCreateRefusalError } from './structured-agent-session-launch-errors'
import {
getStructuredAgentSessionReadOwner,
@@ -1,11 +1,11 @@
import { structuredAgentSessionCreateFingerprint } from '../../../shared/structured-agent-session-mutation'
import type { StructuredLaunchState } from './structured-agent-session-launch-registry'
import { notifyStructuredLaunchListeners } from './structured-agent-session-launch-registry'
import type { StructuredLaunchState } from './agent-session/launch/structured-agent-session-launch-registry'
import { notifyStructuredLaunchListeners } from './agent-session/launch/structured-agent-session-launch-registry'
import {
prepareStructuredLaunchPromptForCreate,
prepareLegacyStructuredLaunchPrompts
} from './structured-agent-session-launch-prompt'
import type { StructuredAgentLaunchReceipt } from './structured-agent-session-launch-recovery'
import type { StructuredAgentLaunchReceipt } from './agent-session/launch/structured-agent-session-launch-recovery'
import {
structuredAgentSessionOptionView,
structuredAgentSessionSendSelection
@@ -3,7 +3,7 @@ import {
getPersistedStructuredAgentLaunchRecord,
getStructuredLaunchStateBySessionId,
subscribeStructuredAgentLaunchStatus
} from './structured-agent-session-launch-registry'
} from './agent-session/launch/structured-agent-session-launch-registry'
/** Unknown capability keeps Stop unavailable until create can publish or choose the old flow. */
export function useStructuredLaunchCreateSupport(sessionId: string): boolean | undefined {
@@ -1,5 +1,6 @@
// @vitest-environment happy-dom
import type * as LaunchErrors from '@/lib/structured-agent-session-launch-errors'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import type { RuntimeMobileSessionTabsResult } from '../../../shared/runtime-session-contracts'
import type { StructuredAgentSessionLaunchIntent } from '@/lib/launch-structured-agent-session'
@@ -17,15 +18,29 @@ const mocks = vi.hoisted(() => ({
vi.mock('sonner', () => ({ toast: { error: vi.fn(), message: vi.fn() } }))
vi.mock('@/lib/launch-structured-agent-session', () => {
const launchErrorMocks = vi.hoisted(() => {
class StructuredAgentSessionCreateRefusalError extends Error {}
return { StructuredAgentSessionCreateRefusalError }
})
vi.mock('@/lib/structured-agent-session-launch-errors', async () => ({
...(await vi.importActual<typeof LaunchErrors>('@/lib/structured-agent-session-launch-errors')),
...launchErrorMocks
}))
vi.mock('@/lib/structured-agent-session-launch-create-call', () => ({
launchStructuredAgentSession: mocks.launch
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
return {
createStructuredAgentSessionLaunchIntent: mocks.createIntent,
retryStructuredAgentSessionLaunchIntent: mocks.retryIntent,
restoreStructuredAgentSessionLaunchIntent: mocks.restoreIntent,
abandonStructuredAgentSessionLaunchIntent: mocks.abandonIntent,
launchStructuredAgentSession: mocks.launch,
StructuredAgentSessionCreateRefusalError
StructuredAgentSessionCreateRefusalError:
launchErrorMocks.StructuredAgentSessionCreateRefusalError
}
})
@@ -80,8 +95,8 @@ import {
discardStructuredLaunchPrompts,
hasStagedStructuredLaunchPrompt
} from './structured-agent-session-launch-prompt'
import { resetStructuredAgentLaunchPersistenceForTests } from './structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from './structured-agent-session-launch-registry'
import { resetStructuredAgentLaunchPersistenceForTests } from './agent-session/launch/structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from './agent-session/launch/structured-agent-session-launch-registry'
const WORKTREE_ID = 'wt-different-request'
@@ -52,8 +52,8 @@ import {
import {
getStructuredAgentSessionLaunchFailure,
resetStructuredAgentLaunchRegistryForTests
} from './structured-agent-session-launch-registry'
import { resetStructuredAgentLaunchPersistenceForTests } from './structured-agent-session-launch-persistence'
} from './agent-session/launch/structured-agent-session-launch-registry'
import { resetStructuredAgentLaunchPersistenceForTests } from './agent-session/launch/structured-agent-session-launch-persistence'
import { structuredSessionNotices } from '@/components/native-chat/native-chat-structured-session-notices'
const WORKTREE = 'wt-1'
@@ -3,7 +3,7 @@ import {
getPersistedStructuredAgentLaunchRecord,
getStructuredLaunchStateBySessionId,
subscribeStructuredAgentLaunchStatus
} from './structured-agent-session-launch-registry'
} from './agent-session/launch/structured-agent-session-launch-registry'
/** Read failure time from memory or persisted record; undefined before failure or for older records without timestamps. */
export function getStructuredAgentSessionLaunchFailedAt(sessionId: string): number | undefined {
@@ -1,8 +1,9 @@
// @vitest-environment happy-dom
import type * as LaunchErrors from '@/lib/structured-agent-session-launch-errors'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import type { RuntimeMobileSessionTabsResult } from '../../../shared/runtime-session-contracts'
import type * as RecoveryModule from '@/lib/structured-agent-session-launch-recovery'
import type * as RecoveryModule from '@/lib/agent-session/launch/structured-agent-session-launch-recovery'
const mocks = vi.hoisted(() => ({
abandonIntent: vi.fn(),
@@ -18,19 +19,33 @@ const mocks = vi.hoisted(() => ({
vi.mock('sonner', () => ({ toast: { error: vi.fn(), message: vi.fn() } }))
vi.mock('@/lib/launch-structured-agent-session', () => {
const launchErrorMocks = vi.hoisted(() => {
class StructuredAgentSessionCreateRefusalError extends Error {}
return { StructuredAgentSessionCreateRefusalError }
})
vi.mock('@/lib/structured-agent-session-launch-errors', async () => ({
...(await vi.importActual<typeof LaunchErrors>('@/lib/structured-agent-session-launch-errors')),
...launchErrorMocks
}))
vi.mock('@/lib/structured-agent-session-launch-create-call', () => ({
launchStructuredAgentSession: mocks.launch
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
return {
createStructuredAgentSessionLaunchIntent: mocks.createIntent,
abandonStructuredAgentSessionLaunchIntent: mocks.abandonIntent,
launchStructuredAgentSession: mocks.launch,
StructuredAgentSessionCreateRefusalError
StructuredAgentSessionCreateRefusalError:
launchErrorMocks.StructuredAgentSessionCreateRefusalError
}
})
vi.mock('@/lib/structured-agent-session-launch-recovery', async () => {
vi.mock('@/lib/agent-session/launch/structured-agent-session-launch-recovery', async () => {
const actual = await vi.importActual<typeof RecoveryModule>(
'@/lib/structured-agent-session-launch-recovery'
'@/lib/agent-session/launch/structured-agent-session-launch-recovery'
)
return { ...actual, launchAndReconcile: vi.fn(actual.launchAndReconcile) }
})
@@ -9,10 +9,10 @@ import {
import {
getStructuredAgentSessionLaunchLifecycle,
getStructuredLaunchStateBySessionId
} from './structured-agent-session-launch-registry'
} from './agent-session/launch/structured-agent-session-launch-registry'
import { retryStructuredAgentSessionLaunch } from './structured-agent-session-launch'
import { newAgentLaunchRequestId } from './agent-launch-request-id'
import { trackStructuredLaunchPromptOutcome } from './structured-agent-session-launch-prompt-outcome'
import { trackStructuredLaunchPromptOutcome } from './agent-session/launch/structured-agent-session-launch-prompt-outcome'
/** Null when the chat's start has not failed, or its restart could not begin. */
export function relaunchFailedStructuredAgentSessionWithMessage(
@@ -1,5 +1,6 @@
// @vitest-environment happy-dom
import type * as LaunchErrors from '@/lib/structured-agent-session-launch-errors'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import type { RuntimeMobileSessionTabsResult } from '../../../shared/runtime-session-contracts'
import type { StructuredAgentSessionLaunchIntent } from '@/lib/launch-structured-agent-session'
@@ -20,15 +21,29 @@ const mocks = vi.hoisted(() => ({
vi.mock('sonner', () => ({ toast: { error: vi.fn(), message: vi.fn() } }))
vi.mock('@/lib/launch-structured-agent-session', () => {
const launchErrorMocks = vi.hoisted(() => {
class StructuredAgentSessionCreateRefusalError extends Error {}
return { StructuredAgentSessionCreateRefusalError }
})
vi.mock('@/lib/structured-agent-session-launch-errors', async () => ({
...(await vi.importActual<typeof LaunchErrors>('@/lib/structured-agent-session-launch-errors')),
...launchErrorMocks
}))
vi.mock('@/lib/structured-agent-session-launch-create-call', () => ({
launchStructuredAgentSession: mocks.launch
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
return {
createStructuredAgentSessionLaunchIntent: mocks.createIntent,
retryStructuredAgentSessionLaunchIntent: mocks.retryIntent,
restoreStructuredAgentSessionLaunchIntent: vi.fn(),
abandonStructuredAgentSessionLaunchIntent: vi.fn(),
launchStructuredAgentSession: mocks.launch,
StructuredAgentSessionCreateRefusalError
StructuredAgentSessionCreateRefusalError:
launchErrorMocks.StructuredAgentSessionCreateRefusalError
}
})
@@ -72,12 +87,12 @@ import {
getStructuredAgentSessionLaunchSelection,
holdStructuredAgentSessionLaunchOption
} from './structured-agent-session-launch-options'
import { resetStructuredAgentLaunchPersistenceForTests } from './structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchPersistenceForTests } from './agent-session/launch/structured-agent-session-launch-persistence'
import {
resetStructuredAgentLaunchRegistryForTests,
subscribeStructuredAgentLaunchStatus
} from './structured-agent-session-launch-registry'
import { markStructuredAgentSessionLaunchPublished } from './structured-agent-session-launch-publication'
} from './agent-session/launch/structured-agent-session-launch-registry'
import { markStructuredAgentSessionLaunchPublished } from './agent-session/launch/structured-agent-session-launch-publication'
import { CODEX_SESSION_OPTION_CATALOG } from '../../../shared/agent-session-option-catalog-claude-codex'
import {
applyStructuredAgentSessionModelCatalog,
@@ -14,13 +14,13 @@ import { createBrowserUuid } from '@/lib/browser-uuid'
import {
StructuredAgentSessionLaunchCancelledError,
type StructuredAgentLaunchReceipt
} from './structured-agent-session-launch-recovery'
} from './agent-session/launch/structured-agent-session-launch-recovery'
import {
getStructuredLaunchStateBySessionId,
notifyStructuredLaunchListeners,
subscribeStructuredAgentLaunchStatus,
type StructuredLaunchState
} from './structured-agent-session-launch-registry'
} from './agent-session/launch/structured-agent-session-launch-registry'
import {
agentSessionRefusalFailure,
agentSessionThrownFailure,
@@ -43,7 +43,7 @@ import {
createStructuredAgentSessionLaunchIntent,
StructuredAgentSessionCreateUnknownOutcomeError
} from '@/lib/launch-structured-agent-session'
import { launchAndReconcile } from '@/lib/structured-agent-session-launch-recovery'
import { launchAndReconcile } from '@/lib/agent-session/launch/structured-agent-session-launch-recovery'
function launchState(executionHostId: 'local' | 'runtime:server-1') {
return {
@@ -1,5 +1,5 @@
import { structuredAgentSessionSendBody } from '../../../shared/structured-agent-session-send-mutation'
import type { StructuredAgentLaunchReceipt } from './structured-agent-session-launch-recovery'
import type { StructuredAgentLaunchReceipt } from './agent-session/launch/structured-agent-session-launch-recovery'
import type { StructuredAgentSessionFirstMessage } from '../../../shared/structured-agent-session-create'
import { StructuredAgentSessionCreateRefusalError } from './structured-agent-session-launch-errors'
import { agentSessionThrownFailure } from '../../../shared/agent-session-write-failure'
@@ -2,7 +2,7 @@ import { structuredAgentSessionCreateFingerprint } from '../../../shared/structu
import {
setStructuredLaunchState,
type StructuredLaunchState
} from './structured-agent-session-launch-registry'
} from './agent-session/launch/structured-agent-session-launch-registry'
// Joiners without the source terminal survive its close: hand off unsent create to conversation-ID resume, as History does.
export function releaseStructuredLaunchSource(state: StructuredLaunchState): void {
@@ -1,10 +1,10 @@
import type { TuiAgent } from '../../../shared/tui-agent'
import { structuredLaunchesHoldingIdentity } from './structured-agent-session-launch-holders'
import { structuredLaunchesHoldingIdentity } from './agent-session/launch/structured-agent-session-launch-holders'
import {
structuredLaunchIdentity,
structuredLaunchStates,
type StructuredAgentLaunchStatus
} from './structured-agent-session-launch-registry'
} from './agent-session/launch/structured-agent-session-launch-registry'
/** Whether a chat for this pair is being created here: its own first create, or an adoption. */
export function getStructuredAgentLaunchStatus(
@@ -12,16 +12,16 @@ import { defaultAgentChatLabel } from '../../../shared/agent-session/agent-sessi
import { structuredAgentSessionTabId } from '../../../shared/structured-agent-session-projection'
import { useAppStore } from '@/store'
import { resolveUnifiedTabCreatePlacement } from '@/store/slices/tabs/tabs-create-placement'
import type { StructuredLaunchSurfaceAddress } from './structured-agent-session-launch-record'
import type { StructuredLaunchSurfaceAddress } from './agent-session/launch/structured-agent-session-launch-record'
import {
readStructuredAgentLaunchRecord,
readStructuredAgentLaunchRecords,
writeStructuredAgentLaunchRecord
} from './structured-agent-session-launch-persistence'
} from './agent-session/launch/structured-agent-session-launch-persistence'
import {
getStructuredAgentSessionLaunchOwner,
getStructuredLaunchStateBySessionId
} from './structured-agent-session-launch-registry'
} from './agent-session/launch/structured-agent-session-launch-registry'
import {
structuredAgentSessionFocusOwner,
structuredAgentSessionTargetForHost
@@ -1,9 +1,10 @@
// @vitest-environment happy-dom
import type * as LaunchErrors from '@/lib/structured-agent-session-launch-errors'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { toast } from 'sonner'
import type { RuntimeMobileSessionTabsResult } from '../../../shared/runtime-session-contracts'
import type * as RecoveryModule from '@/lib/structured-agent-session-launch-recovery'
import type * as RecoveryModule from '@/lib/agent-session/launch/structured-agent-session-launch-recovery'
import type { StructuredAgentSessionLaunchIntent } from '@/lib/launch-structured-agent-session'
const mocks = vi.hoisted(() => ({
@@ -27,21 +28,35 @@ vi.mock('sonner', () => ({
}
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
const launchErrorMocks = vi.hoisted(() => {
class StructuredAgentSessionCreateRefusalError extends Error {}
return { StructuredAgentSessionCreateRefusalError }
})
vi.mock('@/lib/structured-agent-session-launch-errors', async () => ({
...(await vi.importActual<typeof LaunchErrors>('@/lib/structured-agent-session-launch-errors')),
...launchErrorMocks
}))
vi.mock('@/lib/structured-agent-session-launch-create-call', () => ({
launchStructuredAgentSession: mocks.launch
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
return {
createStructuredAgentSessionLaunchIntent: mocks.createIntent,
retryStructuredAgentSessionLaunchIntent: mocks.retryIntent,
restoreStructuredAgentSessionLaunchIntent: mocks.restoreIntent,
abandonStructuredAgentSessionLaunchIntent: mocks.abandonIntent,
launchStructuredAgentSession: mocks.launch,
StructuredAgentSessionCreateRefusalError
StructuredAgentSessionCreateRefusalError:
launchErrorMocks.StructuredAgentSessionCreateRefusalError
}
})
vi.mock('@/lib/structured-agent-session-launch-recovery', async () => {
vi.mock('@/lib/agent-session/launch/structured-agent-session-launch-recovery', async () => {
const actual = await vi.importActual<typeof RecoveryModule>(
'@/lib/structured-agent-session-launch-recovery'
'@/lib/agent-session/launch/structured-agent-session-launch-recovery'
)
return { ...actual, launchAndReconcile: vi.fn(actual.launchAndReconcile) }
})
@@ -94,7 +109,7 @@ vi.mock('@/lib/agent-catalog', () => ({
import { StructuredAgentSessionCreateRefusalError } from '@/lib/launch-structured-agent-session'
import { refreshLocalStructuredSessionTabs } from '@/runtime/local-structured-session-tabs-sync/inventory-refresh'
import { launchAndReconcile } from '@/lib/structured-agent-session-launch-recovery'
import { launchAndReconcile } from '@/lib/agent-session/launch/structured-agent-session-launch-recovery'
import {
cancelStructuredAgentLaunch,
getStructuredAgentSessionLaunchLifecycle,
@@ -108,8 +123,8 @@ import {
} from '@/components/native-chat/native-chat-draft-cache'
import { structuredAgentSessionDraftScopeKey } from '@/components/native-chat/native-chat-composer-draft-store'
import { hasStagedStructuredLaunchPrompt } from './structured-agent-session-launch-prompt'
import { resetStructuredAgentLaunchPersistenceForTests } from './structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from './structured-agent-session-launch-registry'
import { resetStructuredAgentLaunchPersistenceForTests } from './agent-session/launch/structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from './agent-session/launch/structured-agent-session-launch-registry'
import { getStructuredAgentSessionLaunchSelection } from './structured-agent-session-launch-options'
function launchIntent(
@@ -15,7 +15,7 @@ import {
launchAndReconcile,
reconcileUnknownLaunch,
type StructuredAgentLaunchReceipt
} from '@/lib/structured-agent-session-launch-recovery'
} from '@/lib/agent-session/launch/structured-agent-session-launch-recovery'
import type { StructuredPromptDeliveryResult } from '@/lib/structured-agent-session-launch-prompt'
import {
addStructuredLaunchCaller,
@@ -33,9 +33,9 @@ import {
setStructuredLaunchState,
structuredLaunchIdentity,
type StructuredLaunchState
} from './structured-agent-session-launch-registry'
import { restorePersistedStructuredLaunchState } from './structured-agent-session-launch-reload'
import { getJoinableStructuredLaunchState } from './structured-agent-session-launch-holders'
} from './agent-session/launch/structured-agent-session-launch-registry'
import { restorePersistedStructuredLaunchState } from './agent-session/launch/structured-agent-session-launch-reload'
import { getJoinableStructuredLaunchState } from './agent-session/launch/structured-agent-session-launch-holders'
import {
prepareStructuredLaunchCreateMessage,
publishStructuredLaunchCreateOptions
@@ -43,11 +43,11 @@ import {
import {
maybeCleanupLaunchState,
trackLaunchSettlement
} from './structured-agent-session-launch-outcome-tracking'
} from './agent-session/launch/structured-agent-session-launch-outcome-tracking'
import {
trackStructuredLaunchPromptOutcome,
trackStructuredLaunchConfirmationDeadline
} from './structured-agent-session-launch-prompt-outcome'
} from './agent-session/launch/structured-agent-session-launch-prompt-outcome'
import { repeatedStructuredLaunchAttempt } from './structured-agent-session-launch-request'
import { initialStructuredLaunchSelection } from './structured-agent-session-launch-options'
import { releaseStructuredLaunchSource } from './structured-agent-session-launch-source-handoff'
@@ -65,7 +65,7 @@ export {
useStructuredAgentSessionLaunchLifecycle,
type StructuredAgentLaunchStatus,
type StructuredAgentSessionLaunchLifecycle
} from './structured-agent-session-launch-registry'
} from './agent-session/launch/structured-agent-session-launch-registry'
export * from './structured-agent-session-launch-status'
export { useStructuredAgentSessionLaunchSelection } from './structured-agent-session-launch-options'
@@ -1,6 +1,6 @@
import { hasRuntimeRpcErrorCode } from '../../../shared/runtime-rpc-error-code'
import { retireStructuredAgentSessionTab } from '@/runtime/structured-agent-session-tab-retirement'
import { deleteStructuredAgentLaunchRecord } from './structured-agent-session-launch-persistence'
import { deleteStructuredAgentLaunchRecord } from './agent-session/launch/structured-agent-session-launch-persistence'
// Chats a cancel closed on this machine's host; session ids are never reused.
const closedByLocalCancel = new Set<string>()
@@ -1,5 +1,6 @@
// @vitest-environment happy-dom
import type * as LaunchErrors from '@/lib/structured-agent-session-launch-errors'
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import type { RuntimeMobileSessionTabsResult } from '../../../shared/runtime-session-contracts'
import type { Tab, TabGroup, TabGroupLayoutNode } from '../../../shared/tab-types'
@@ -64,16 +65,31 @@ vi.mock('@/lib/agent-catalog', () => ({
getAgentLabel: () => 'Codex',
getAgentCatalog: () => [{ id: 'codex', label: 'Codex' }]
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
const launchErrorMocks = vi.hoisted(() => {
class StructuredAgentSessionCreateRefusalError extends Error {}
class StructuredAgentSessionOwnerUnresolvedError extends Error {}
return { StructuredAgentSessionCreateRefusalError, StructuredAgentSessionOwnerUnresolvedError }
})
vi.mock('@/lib/structured-agent-session-launch-errors', async () => ({
...(await vi.importActual<typeof LaunchErrors>('@/lib/structured-agent-session-launch-errors')),
...launchErrorMocks
}))
vi.mock('@/lib/structured-agent-session-launch-create-call', () => ({
launchStructuredAgentSession: mocks.launch
}))
vi.mock('@/lib/launch-structured-agent-session', () => {
return {
createStructuredAgentSessionLaunchIntent: mocks.createIntent,
retryStructuredAgentSessionLaunchIntent: vi.fn(),
abandonStructuredAgentSessionLaunchIntent: vi.fn(),
launchStructuredAgentSession: mocks.launch,
StructuredAgentSessionCreateRefusalError,
StructuredAgentSessionOwnerUnresolvedError
StructuredAgentSessionCreateRefusalError:
launchErrorMocks.StructuredAgentSessionCreateRefusalError,
StructuredAgentSessionOwnerUnresolvedError:
launchErrorMocks.StructuredAgentSessionOwnerUnresolvedError
}
})
// Each pick opens its chat once its host admits it; here this machine admits at once.
@@ -167,8 +183,8 @@ import {
discardStructuredLaunchPrompts,
hasStagedStructuredLaunchPrompt
} from './structured-agent-session-launch-prompt'
import { resetStructuredAgentLaunchPersistenceForTests } from './structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from './structured-agent-session-launch-registry'
import { resetStructuredAgentLaunchPersistenceForTests } from './agent-session/launch/structured-agent-session-launch-persistence'
import { resetStructuredAgentLaunchRegistryForTests } from './agent-session/launch/structured-agent-session-launch-registry'
import { ORCA_LAYOUT_OWNER_IS_MAIN } from '../../../shared/layout-owner-switch'
import { createTestStore, makeWorktree, seedStore } from '@/store/slices/store-test-helpers'
import {
@@ -1,4 +1,4 @@
import { readStructuredAgentLaunchRecords } from './structured-agent-session-launch-persistence'
import { readStructuredAgentLaunchRecords } from './agent-session/launch/structured-agent-session-launch-persistence'
import type { ExecutionHostId } from '../../../shared/execution-host'
import { parseExecutionHostId } from '../../../shared/execution-host'
import type { WorkspaceKey } from '../../../shared/folder-workspace-types'
@@ -1,4 +1,4 @@
import { structuredLaunchSlotIds } from './structured-agent-session-launch-persistence'
import { structuredLaunchSlotIds } from './agent-session/launch/structured-agent-session-launch-persistence'
import type { Tab, TabGroup, TabGroupLayoutNode } from '../../../shared/tab-types'
import type { WorkspaceSessionState } from '../../../shared/workspace-session-state-types'
import type { WorkspaceSessionSnapshot } from './workspace-session'
@@ -23,7 +23,7 @@ import {
const mocks = vi.hoisted(() => ({ recheckUnconfirmedLaunches: vi.fn() }))
vi.mock('../lib/structured-agent-session-launch-unconfirmed-recheck', () => ({
vi.mock('../lib/agent-session/launch/structured-agent-session-launch-unconfirmed-recheck', () => ({
recheckUnconfirmedStructuredAgentLaunches: mocks.recheckUnconfirmedLaunches
}))
@@ -2,7 +2,7 @@ import type {
RuntimeMobileSessionTabsRemovedResult,
RuntimeMobileSessionTabsResult
} from '../../../../shared/runtime-types'
import { markStructuredAgentSessionLaunchesPublished } from '../../lib/structured-agent-session-launch-publication'
import { markStructuredAgentSessionLaunchesPublished } from '../../lib/agent-session/launch/structured-agent-session-launch-publication'
import type { WorktreeRuntimeOwnerState } from '../../lib/worktree-runtime-owner-state'
import { getExecutionHostIdForWorktree } from '../../lib/worktree-runtime-owner'
import { applyWebSessionTabsSnapshot } from '../web-session-tabs-sync/snapshot-api'
@@ -24,7 +24,7 @@ import {
hostSnapshotAffirmsAgentSessions,
hostSnapshotAffirmsWorktreeContents
} from '../host-session-snapshot-authority'
import { retireAbsentStructuredAgentSessionLaunchCancellationTombstones } from '../../lib/structured-agent-session-launch-registry'
import { retireAbsentStructuredAgentSessionLaunchCancellationTombstones } from '../../lib/agent-session/launch/structured-agent-session-launch-registry'
import { LOCAL_EXECUTION_HOST_ID } from '../../../../shared/execution-host'
import {
beginStructuredAgentSessionAuthoritativeInventory,
@@ -10,7 +10,7 @@ import {
refreshLocalStructuredSessionTabs,
restoreLocalStructuredSessionTabsOnce
} from './inventory-refresh'
import { recheckUnconfirmedStructuredAgentLaunches } from '../../lib/structured-agent-session-launch-unconfirmed-recheck'
import { recheckUnconfirmedStructuredAgentLaunches } from '../../lib/agent-session/launch/structured-agent-session-launch-unconfirmed-recheck'
import { scheduleRetiredEpochRepair } from './retired-epoch-repair'
import {
applyStructuredSessionTabSnapshots,
@@ -1,7 +1,7 @@
// @vitest-environment happy-dom
import { beforeEach, describe, expect, it, vi } from 'vitest'
import type { StructuredLaunchSlotOwner } from '@/lib/structured-agent-session-launch-slot'
import type { StructuredLaunchSlotOwner } from '@/lib/agent-session/launch/structured-agent-session-launch-slot'
import type { RuntimeMobileSessionTabsResult } from '../../../shared/runtime-types'
import type { RuntimeClientTarget } from '../../../shared/runtime-client-target'
@@ -33,7 +33,7 @@ import {
markStructuredAgentSessionLaunchCancelled,
resetStructuredAgentLaunchRegistryForTests,
retireAbsentStructuredAgentSessionLaunchCancellationTombstones
} from '@/lib/structured-agent-session-launch-registry'
} from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import {
beginStructuredAgentSessionAuthoritativeInventory,
resetStructuredAgentLaunchCancellationForTests,
@@ -42,7 +42,7 @@ import {
import {
resetStructuredAgentLaunchPersistenceForTests,
writeStructuredAgentLaunchRecord
} from '@/lib/structured-agent-session-launch-persistence'
} from '@/lib/agent-session/launch/structured-agent-session-launch-persistence'
import { suppressCancelledStructuredSessionTabs } from './structured-agent-session-tab-retirement'
import { applyWebSessionTabsStorePatch } from './web-session-tabs-sync/store-patch'
const layoutOwner: StructuredLaunchSlotOwner = {
@@ -1,7 +1,7 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
import type { RuntimeMobileSessionTabsResult } from '../../../shared/runtime-types'
import type { markStructuredAgentSessionLaunchCancelled } from '@/lib/structured-agent-session-launch-registry'
import type { StructuredLaunchSlotOwner } from '@/lib/structured-agent-session-launch-slot'
import type { markStructuredAgentSessionLaunchCancelled } from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import type { StructuredLaunchSlotOwner } from '@/lib/agent-session/launch/structured-agent-session-launch-slot'
import type { RuntimeClientTarget } from '../../../shared/runtime-client-target'
const mocks = vi.hoisted(() => ({
@@ -25,7 +25,7 @@ const mocks = vi.hoisted(() => ({
>()
}))
vi.mock('@/lib/structured-agent-session-launch-registry', () => ({
vi.mock('@/lib/agent-session/launch/structured-agent-session-launch-registry', () => ({
hasStructuredAgentSessionLaunchCancellationTombstone: mocks.hasTombstone,
markStructuredAgentSessionLaunchCancelled: mocks.markCancelled
}))
@@ -1,9 +1,9 @@
import type { StructuredLaunchSlotOwner } from '@/lib/structured-agent-session-launch-slot'
import type { StructuredLaunchSlotOwner } from '@/lib/agent-session/launch/structured-agent-session-launch-slot'
import type { RuntimeMobileSessionTabsResult } from '../../../shared/runtime-types'
import {
hasStructuredAgentSessionLaunchCancellationTombstone,
markStructuredAgentSessionLaunchCancelled
} from '@/lib/structured-agent-session-launch-registry'
} from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import { forgetUnlistedCreatedChat } from '@/lib/structured-agent-session-unlisted-created-chats'
import { discardStructuredAgentSessionChatSends } from '@/lib/structured-agent-session-launch-prompt'
import { stopStructuredAgentSessionSends } from '@/components/native-chat/structured-agent-session-message-sender'
@@ -5,7 +5,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'
import type { RuntimeMobileSessionTabsResult } from '../../../shared/runtime-types'
import type { RuntimeClientTarget } from '../../../shared/runtime-client-target'
import type { ExecutionHostId } from '../../../shared/execution-host'
import type { StructuredLaunchSlotOwner } from '@/lib/structured-agent-session-launch-slot'
import type { StructuredLaunchSlotOwner } from '@/lib/agent-session/launch/structured-agent-session-launch-slot'
import { useAppStore } from '@/store'
import { recoverWebSessionTerminalOrphansBeforeApply } from './web-session-terminal-orphan-recovery'
@@ -49,12 +49,12 @@ import {
resetStructuredAgentLaunchRegistryForTests,
setStructuredLaunchState,
type StructuredLaunchState
} from '@/lib/structured-agent-session-launch-registry'
} from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import {
readStructuredAgentLaunchRecord,
resetStructuredAgentLaunchPersistenceForTests,
writeStructuredAgentLaunchRecord
} from '@/lib/structured-agent-session-launch-persistence'
} from '@/lib/agent-session/launch/structured-agent-session-launch-persistence'
import { wasStructuredAgentLaunchClosedByLocalCancel } from '@/lib/structured-agent-session-local-launch-cancel'
import {
beginStructuredAgentSessionTabClose,
@@ -1,4 +1,4 @@
import { structuredLaunchSlotIds } from '@/lib/structured-agent-session-launch-persistence'
import { structuredLaunchSlotIds } from '@/lib/agent-session/launch/structured-agent-session-launch-persistence'
import type { TabGroup, TabGroupLayoutNode } from '../../../shared/tab-types'
import {
pickNextActiveTab,
@@ -13,7 +13,7 @@ const mocks = vi.hoisted(() => ({
recheckUnconfirmedLaunches: vi.fn()
}))
vi.mock('@/lib/structured-agent-session-launch-unconfirmed-recheck', () => ({
vi.mock('@/lib/agent-session/launch/structured-agent-session-launch-unconfirmed-recheck', () => ({
recheckUnconfirmedStructuredAgentLaunches: mocks.recheckUnconfirmedLaunches
}))
@@ -20,7 +20,7 @@ import {
sameOpenFiles,
webSessionOpenFilesForWorktree
} from './state-equality-files'
import { shouldRetainStructuredAgentSessionLaunchTab } from '@/lib/structured-agent-session-launch-registry'
import { shouldRetainStructuredAgentSessionLaunchTab } from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import { executionHostIdForSessionTabsOwner } from '../local-structured-session-owner'
import { isAgentSessionTabOfAnotherHost } from './mirror-row-ownership'
import { isUnlistedCreatedChat } from '@/lib/structured-agent-session-unlisted-created-chats'
@@ -1,6 +1,6 @@
import { toRuntimeExecutionHostId } from '../../../../shared/execution-host'
import type { RuntimeMobileSessionTabsResult } from '../../../../shared/runtime-types'
import { recheckUnconfirmedStructuredAgentLaunches } from '../../lib/structured-agent-session-launch-unconfirmed-recheck'
import { recheckUnconfirmedStructuredAgentLaunches } from '../../lib/agent-session/launch/structured-agent-session-launch-unconfirmed-recheck'
import { useAppStore } from '../../store'
import { recoverMirroredTerminalOrphansBeforeApply } from './mirror-terminal-orphan-recovery'
import { queueAcceptedWebSessionTerminalSnapshot } from '../web-session-terminal-handle-events'
@@ -1,7 +1,7 @@
import {
markStructuredAgentSessionLaunchesPublished,
publishedStructuredSessions
} from '@/lib/structured-agent-session-launch-publication'
} from '@/lib/agent-session/launch/structured-agent-session-launch-publication'
import { toRuntimeExecutionHostId } from '../../../../shared/execution-host'
import type { AppState } from '../../store'
import { useAppStore } from '../../store'
@@ -1,4 +1,4 @@
import { readStructuredAgentLaunchRecord } from '@/lib/structured-agent-session-launch-persistence'
import { readStructuredAgentLaunchRecord } from '@/lib/agent-session/launch/structured-agent-session-launch-persistence'
import type {
RuntimeMobileSessionTabsResult,
RuntimeMobileSessionAgentTab
@@ -24,7 +24,7 @@ import type {
import type { Tab } from '../../../../shared/tab-types'
import type { ExecutionHostId } from '../../../../shared/execution-host'
import { structuredAgentSessionTabId } from '../../../../shared/structured-agent-session-projection'
import { hasStructuredAgentSessionLaunchCancellationTombstone } from '@/lib/structured-agent-session-launch-registry'
import { hasStructuredAgentSessionLaunchCancellationTombstone } from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import { withPendingPaneTitleRenames } from '../pending-pane-title-renames'
import {
isMirroredTerminalOfAnotherEnvironment,
@@ -1,4 +1,4 @@
import { structuredLaunchSlotIds } from '@/lib/structured-agent-session-launch-persistence'
import { structuredLaunchSlotIds } from '@/lib/agent-session/launch/structured-agent-session-launch-persistence'
import type { Tab, TabGroup, TabGroupLayoutNode } from '../../../../shared/tab-types'
import type { WorkspaceSessionState } from '../../../../shared/workspace-session-state-types'
import { isValidTerminalTabId } from '../../../../shared/terminal-tab-id'
@@ -12,7 +12,7 @@ import { beginStructuredAgentSessionTabClose } from '@/runtime/structured-agent-
import {
hasStructuredAgentSessionLaunchCancellationTombstone,
shouldRetainStructuredAgentSessionLaunchTab
} from '@/lib/structured-agent-session-launch-registry'
} from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import { structuredAgentSessionTabId } from '../../../../../shared/structured-agent-session-projection'
import { clearWebSessionFocusIntentIfMatches } from '@/runtime/web-session-focus-intent'
import { ownsGlobalSelection } from '../../global-selection-owner'
@@ -1,4 +1,4 @@
import { structuredLaunchSlotIds } from '@/lib/structured-agent-session-launch-persistence'
import { structuredLaunchSlotIds } from '@/lib/agent-session/launch/structured-agent-session-launch-persistence'
import { createBrowserUuid } from '@/lib/browser-uuid'
import { getActiveExecutionHostIdForWorktree } from '@/lib/unified-tab-host-ownership'
import type { Tab, TabGroup } from '../../../../../shared/tab-types'
@@ -1,4 +1,4 @@
import { structuredLaunchSlotIds } from '@/lib/structured-agent-session-launch-persistence'
import { structuredLaunchSlotIds } from '@/lib/agent-session/launch/structured-agent-session-launch-persistence'
import type { AppState } from '../../types'
import type { Tab } from '../../../../../shared/tab-types'
import { dedupeTabOrder } from '../../../../../shared/workspace-layout/tab-order'
@@ -19,12 +19,12 @@ import {
readStructuredAgentLaunchRecord,
resetStructuredAgentLaunchPersistenceForTests,
writeStructuredAgentLaunchRecord
} from '@/lib/structured-agent-session-launch-persistence'
} from '@/lib/agent-session/launch/structured-agent-session-launch-persistence'
import { wasStructuredAgentLaunchClosedByLocalCancel } from '@/lib/structured-agent-session-local-launch-cancel'
import {
hasStructuredAgentSessionLaunchCancellationTombstone,
resetStructuredAgentLaunchRegistryForTests
} from '@/lib/structured-agent-session-launch-registry'
} from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
vi.mock('sonner', () => ({
toast: { warning: vi.fn(), info: vi.fn(), success: vi.fn(), error: vi.fn(), dismiss: vi.fn() }
@@ -8,10 +8,10 @@ import {
markStructuredAgentSessionLaunchCancelledSilently,
shouldRetainStructuredAgentSessionLaunchTab,
structuredLaunchStates
} from '@/lib/structured-agent-session-launch-registry'
} from '@/lib/agent-session/launch/structured-agent-session-launch-registry'
import { discardStructuredAgentSessionChatSends } from '@/lib/structured-agent-session-launch-prompt'
import { forgetUnlistedCreatedChat } from '@/lib/structured-agent-session-unlisted-created-chats'
import { readStructuredAgentLaunchRecords } from '@/lib/structured-agent-session-launch-persistence'
import { readStructuredAgentLaunchRecords } from '@/lib/agent-session/launch/structured-agent-session-launch-persistence'
import { retireStructuredAgentSessionReadOwner } from '@/components/native-chat/structured-agent-session-read-owner-registry'
import { clearWebSessionFocusIntentIfMatches } from '@/runtime/web-session-focus-intent'
import {
@@ -14,10 +14,11 @@ export const LOCAL_STORAGE_MODULE_DISPOSITIONS: Record<string, WslMoveFieldDispo
disposition: 'rewrite-desktop',
item: 43
},
'src/renderer/src/lib/structured-agent-session-launch-persistence.ts': notApplicableDisposition(
44,
'Chats stay local on the desktop (owner decision C), so their launch records stay as written.'
),
'src/renderer/src/lib/agent-session/launch/structured-agent-session-launch-persistence.ts':
notApplicableDisposition(
44,
'Chats stay local on the desktop (owner decision C), so their launch records stay as written.'
),
'src/renderer/src/components/editor/file-view-preference-storage.ts': {
disposition: 'rewrite-desktop',
item: 72,