9010 lines · 340.6 KB · TypeScript
RawDownload
import { useLoadBalancedEnvironment } from "../hooks/useLoadBalancedEnvironment";import type { UsageLimitSourceSnapshots } from "@t3tools/contracts";import {  collectProviderUsageLimits,  hasProviderUsageLimits,  isUsageLimitsCommand,} from "@t3tools/shared/usageLimits";import { feedbackBannerItem } from "./chat/ComposerFeedback";import { usageLimitsBannerItem } from "./chat/ComposerUsageLimits";import { derivePendingRequests } from "@t3tools/client-runtime/pending-requests";import {  questionAttachmentDraftId,  questionAttachmentDraftPrefix,  clearQuestionAttachmentDraft,  useQuestionAttachmentPreparation,} from "../questionAttachments";import { useAttachmentUploadStore } from "../lib/attachmentUploadQueue";import {  type AssistantCitation,  type ApprovalRequestId,  type ChatFileAttachment,  DEFAULT_MODEL,  type EnvironmentId,  type MessageId,  type ModelSelection,  type ProjectScript,  type ProjectId,  type ProviderApprovalDecision,  type PreviewAnnotationPayload,  ProviderInstanceId,  type ServerProvider,  type ResolvedKeybindingsConfig,  type ScopedThreadRef,  type ThreadId,  type ThreadLinkedPullRequest,  type TurnId,  type KeybindingCommand,  OrchestrationThreadActivity,  PROVIDER_SEND_TURN_MAX_ATTACHMENTS,  ProviderInteractionMode,  ProviderDriverKind,  resolveEnvironmentMachineKind,  RuntimeMode,  TerminalOpenInput,} from "@t3tools/contracts";import { type EnvironmentConnectionPresentation } from "@t3tools/client-runtime/connection";import { wasBootstrapThreadDeleted } from "@t3tools/client-runtime/errors";import { type CodexArtifactTemplate } from "@t3tools/client-runtime/codex-artifact-templates";import { effectiveSnoozed, threadWokeAt } from "@t3tools/client-runtime/state/thread-settled";import {  parseCodexFeedbackCommand,  submitCodexFeedback,  type CodexFeedbackSubmission,} from "@t3tools/client-runtime/state/threads";import {  parseScopedThreadKey,  scopedThreadKey,  scopeProjectRef,  scopeThreadRef,} from "@t3tools/client-runtime/environment";import {  applyClaudePromptEffortPrefix,  createModelSelection,  resolvePromptInjectedEffort,} from "@t3tools/shared/model";import {  projectScriptCwd,  projectScriptRuntimeEnv,  resolveProjectScripts,} from "@t3tools/shared/projectScripts";import { truncate } from "@t3tools/shared/String";import { resolveThreadReferenceCopyTarget } from "@t3tools/shared/threadReference";import {  getTerminalLabel,  nextTerminalId,  resolveTerminalSessionLabel,} from "@t3tools/shared/terminalLabels";import { Debouncer } from "@tanstack/react-pacer";import { useAtomValue } from "@effect/atom-react";import {  lazy,  memo,  Suspense,  useCallback,  useEffect,  useEffectEvent,  useLayoutEffect,  useMemo,  useRef,  useState,} from "react";import { flushSync } from "react-dom";import { useLocation, useNavigate } from "@tanstack/react-router";import { assistantCitationsToPlainText } from "@t3tools/shared/assistantCitations";import { assistantCitationFromLocation } from "../lib/assistantCitationNavigation";import type { AssistantCitationSourceAnchor } from "~/lib/assistantTextSelection";import { useShallow } from "zustand/react/shallow";import {  isAtomCommandInterrupted,  mapAtomCommandResult,  settlePromise,  squashAtomCommandFailure,  type AtomCommandResult,} from "@t3tools/client-runtime/state/runtime";import * as Cause from "effect/Cause";import * as Schema from "effect/Schema";import { AsyncResult } from "effect/unstable/reactivity";import { isElectron } from "../env";import { readLocalApi } from "../localApi";import { useDiffPanelStore } from "../diffPanelStore";import {  collapseExpandedComposerCursor,  type ComposerSubmissionIntent,  parseStandaloneComposerSlashCommand,} from "../composer-logic";import {  createMessageAttachmentPreviewProjector,  derivePhase,  deriveTimelineEntriesWithState,  deriveActiveWorkStartedAt,  deriveActivePlanState,  findLatestProposedPlan,  deriveWorkLogEntries,  hasActionableProposedPlan,  isLatestTurnSettled,  selectHandoffImageResources,  type TimelineEntriesProjection,} from "../session-logic";import { type LegendListRef } from "@legendapp/list/react";import {  CHAT_TIMELINE_ANCHOR_OFFSET,  getAnchoredTurnMetrics,  timelineContentOverflowsViewport,  type TimelineScrollMode,} from "./chat/timelineScrollAnchoring";import {  buildPendingUserInputAnswers,  derivePendingUserInputProgress,  setPendingUserInputCustomAnswer,  togglePendingUserInputOptionSelection,  type PendingUserInputDraftAnswer,} from "../pendingUserInput";import { useUiStateStore } from "../uiStateStore";import {  latestWorkspaceMutationId,  useWorkspaceMutationRefresh,} from "../hooks/useWorkspaceMutationRefresh";import {  buildPlanImplementationThreadTitle,  buildPlanImplementationPrompt,  resolvePlanFollowUpSubmission,} from "../proposedPlan";import {  DEFAULT_INTERACTION_MODE,  DEFAULT_RUNTIME_MODE,  DEFAULT_THREAD_TERMINAL_ID,  MAX_TERMINALS_PER_GROUP,  type ChatMessage,  isBrowserPreviewAttachment,  isImageAttachment,  type SessionPhase,  type Thread,} from "../types";import { useTheme } from "../hooks/useTheme";import { writeTextToClipboard } from "../hooks/useCopyToClipboard";import { isCommandPaletteOpen } from "../commandPaletteBus";import { subscribeSnapShotComposerFocus } from "../lib/desktopSnapShot";import { buildTemporaryWorktreeBranchName } from "@t3tools/shared/git";import { useMediaQuery } from "../hooks/useMediaQuery";import { RIGHT_PANEL_INLINE_LAYOUT_MEDIA_QUERY } from "../rightPanelLayout";import {  pullRequestSurface,  selectActiveRightPanel,  selectActiveRightPanelSurface,  selectThreadRightPanelState,  type RightPanelSurface,  useRightPanelStore,} from "../rightPanelStore";import {  isPreviewSupportedInRuntime,  setActivePreviewTab,  useThreadPreviewState,} from "../previewStateStore";import { previewRuntimeTabId } from "../browser/previewRuntimeTabId";import { BrowserSettingsReadError } from "../browser/openFileInPreview";import { addBrowserSurface } from "./preview/addBrowserSurface";import { closePreviewSession } from "./preview/closePreviewSession";import { ThreadPreviewMiniPlayer } from "./preview/ThreadPreviewMiniPlayer";import { subscribePreviewAction } from "./preview/previewActionBus";import { getConfiguredPreviewUrls } from "./preview/previewEmptyStateLogic";import { makeWorkspaceFileDropHandlers } from "./chat/workspaceFileDrop";import {  isSameSidebarThreadRef,  useSidebarPendingFileDropStore,} from "../sidebarPendingFileDropStore";import {  selectThreadPreviewMiniPlayer,  usePreviewMiniPlayerStore,} from "../previewMiniPlayerStore";import { isThreadOwnPullRequest } from "./pullRequest/pullRequestDetail.logic";import { PullRequestDetailPanel } from "./pullRequest/PullRequestDetailPanel";import { PullRequestDetailGhost } from "./pullRequest/PullRequestGhosts";import { PullRequestsUnavailableState } from "./pullRequest/PullRequestsUnavailableState";import { RightPanelTabs } from "./RightPanelTabs";import { AgentsPanel } from "./AgentsPanel";import { LinkPullRequestDialogHost } from "./pullRequest/LinkPullRequestDialog";import { ThreadPullRequestsPanel } from "./pullRequest/ThreadPullRequestsPanel";import { useDeviceState } from "~/state/device";import { DeviceSetup } from "./device/DeviceSetup";import { Dialog } from "./ui/dialog";import { WizardPopup } from "./ui/wizard";import {  deriveAgentPanelModel,  foldSubagentActivities,} from "@t3tools/client-runtime/state/subagentRuntime";import { BranchToolbar } from "./BranchToolbar";import { resolveShortcutCommand, shortcutLabelForCommand } from "../keybindings";import ThreadTerminalDrawer from "./ThreadTerminalDrawer";import {  AlarmClockIcon,  CheckCircle2Icon,  ChevronDownIcon,  GitBranchIcon,  Minimize2Icon,  PaperclipIcon,  WifiOffIcon,} from "lucide-react";import { cn, randomHex } from "~/lib/utils";import { stackedThreadToast, toastManager } from "./ui/toast";import { decodeProjectScriptKeybindingRule } from "~/lib/projectScriptKeybindings";import { type NewProjectScriptInput } from "./ProjectScriptsControl";import {  buildProjectScript,  commandForProjectScript,  nextProjectScriptId,  projectScriptIdFromCommand,} from "~/projectScripts";import { newDraftId, newMessageId, newThreadId } from "~/lib/utils";import { useBrowserHistoryStore } from "~/browserHistoryStore";import { registerFaviconProjectForThread } from "~/browserFaviconStore";import { getProviderModelCapabilities } from "../providerModels";import {  applyProviderInstanceSettings,  deriveProviderInstanceEntries,  NO_PROVIDER_MODEL_SELECTION,  sortProviderInstanceEntries,} from "../providerInstances";import {  useClientSettings,  useClientSettingsHydrated,  useEnvironmentSettings,} from "../hooks/useSettings";import { useNowMinute } from "../hooks/useNowMinute";import { usePanelAnimationSettings, usePanelPresence } from "../panelAnimations";import { useNewThreadHandler } from "../hooks/useHandleNewThread";import { useOpenPanelPullRequestUrl } from "../hooks/useOpenPanelPullRequestUrl";import { useThreadActions } from "../hooks/useThreadActions";import { resolveAppModelSelectionForInstance } from "../modelSelection";import { confirmTerminalClose, isTerminalCloseConfirmPending } from "../lib/terminalCloseConfirm";import { isPreviewFocused } from "../lib/previewFocus";import { getTerminalFocusOwner } from "../lib/terminalFocus";import {  preventRepeatedTerminalCloseShortcut,  preventTerminalCloseShortcut,} from "../lib/terminalCloseShortcut";import { resolveNewDraftStartFromOrigin } from "../lib/chatThreadActions";import {  derivePhysicalProjectKey,  deriveLogicalProjectKeyFromSettings,  selectProjectGroupingSettings,} from "../logicalProject";import { buildPhysicalToLogicalProjectKeyMap } from "../sidebarProjectGrouping";import { buildDraftThreadRouteParams, buildThreadRouteParams } from "../threadRoutes";import {  beginBackgroundDraftSubmissionByRef,  clearBackgroundDraftSubmissionByRef,  composerDraftHasUserContent,  type ComposerFileAttachment,  type ComposerImageAttachment,  type DraftThreadEnvMode,  finalizePromotedDraftThreadByRef,  markPromotedDraftThreadByRef,  useComposerDraftStore,  DraftId,} from "../composerDraftStore";import {  appendTerminalContextsToPrompt,  formatTerminalContextLabel,  type TerminalContextDraft,  type TerminalContextSelection,} from "../lib/terminalContext";import {  appendElementContextsToPrompt,  type ElementContextDraft,  formatElementContextLabel,} from "../lib/elementContext";import { appendPreviewAnnotationPrompt } from "../lib/previewAnnotation";import { appendReviewCommentsToPrompt, type ReviewCommentContext } from "../reviewCommentContext";import { environmentCatalog } from "../connection/catalog";import { selectThreadTerminalUiState, useTerminalUiStateStore } from "../terminalUiStateStore";import { useKnownTerminalSessions, useThreadRunningTerminalIds } from "../state/terminalSessions";import { useEnvironmentQuery } from "../state/query";import {  environmentServerConfigsAtom,  primaryServerAvailableEditorsAtom,  primaryServerKeybindingsAtom,  primaryServerSettingsAtom,  serverEnvironment,} from "../state/server";import { terminalEnvironment } from "../state/terminal";import { threadEnvironment, useEnvironmentThread } from "../state/threads";import {  requestOlderThreadTurns,  threadHasOlderTurns,} from "@t3tools/client-runtime/state/threads";import { resolveProviderSkillsForCwd } from "@t3tools/client-runtime/providerSkills";import { vcsEnvironment } from "../state/vcs";import { useEnvironments, usePrimaryEnvironment } from "../state/environments";import {  useProject,  useProjects,  useThread,  useThreadRefs,  useThreadShell,} from "../state/entities";import { environmentShell } from "../state/shell";import { ChatComposer, type ChatComposerHandle } from "./chat/ChatComposer";import { createPageScrollController, type PageScrollKey } from "./chat/pageScrollController";import { DraftHeroHeadline } from "./chat/DraftHeroHeadline";import { ExpandedImageDialog } from "./chat/ExpandedImageDialog";import { PullRequestThreadDialog } from "./PullRequestThreadDialog";import { MessagesTimeline } from "./chat/MessagesTimeline";import type { AssistantCitationRequest } from "./chat/AssistantCitationSource";import { resolveTimelineIsAtEnd } from "./chat/MessagesTimeline.logic";import { resolveComposerTimelineInset, resolveScrollToEndClearance } from "./composerFooterLayout";import { ChatHeader } from "./chat/ChatHeader";import { PanelLayoutControls, RightPanelMaximizeControl } from "./chat/PanelLayoutControls";import { expandedImageKey, type ExpandedImagePreview } from "./chat/ExpandedImagePreview";import { NoActiveThreadState } from "./NoActiveThreadState";import { WorkspacePageHeader } from "./WorkspacePageHeader";import {  type EnvironmentOption,  resolveEffectiveEnvMode,  resolveLocalCheckoutBranchMismatch,  shouldShowComposerContextStrip,  shouldShowEnvironmentIndicator,} from "./BranchToolbar.logic";import {  getProviderStatusBannerKey,  ProviderStatusBanner,  shouldShowProviderStatusBanner,} from "./chat/ProviderStatusBanner";import {  dismissThreadErrorBannerForSession,  getThreadErrorBannerKey,  isThreadErrorBannerDismissedForSession,  shouldShowThreadErrorBanner,  ThreadErrorBanner,} from "./chat/ThreadErrorBanner";import type { ComposerBannerStackItem } from "./chat/ComposerBannerStack";import { ComposerSurface } from "./chat/ComposerSurface";import {  hasAvailableCompactionProvider,  hasDismissedResumeCompaction,  shouldOfferResumeCompaction,} from "./chat/ContextWindowMeter.logic";import { deriveLatestContextWindowSnapshot, formatContextWindowTokens } from "../lib/contextWindow";import {  DRAFT_HERO_TRANSITION_ANIMATION_ID,  DRAFT_HERO_TRANSITION_DURATION_MS,  DRAFT_HERO_TRANSITION_EASING,  MOBILE_COMPOSER_VIEW_TRANSITION_NAME,  MOBILE_DRAFT_HEADLINE_VIEW_TRANSITION_NAME,  runMobileComposerTransition,} from "./chat/draftHeroTransition";import {  MAX_HIDDEN_MOUNTED_TERMINAL_THREADS,  agentControlledBrowserCloseConfirmation,  branchMismatchKey,  buildExpiredTerminalContextToastCopy,  buildLocalDraftThread,  buildLoadingThreadFromShell,  buildRunningThreadTurnInterruptInput,  buildThreadTurnInterruptInput,  collectUserMessageBlobPreviewUrls,  createLocalDispatchSnapshot,  deriveComposerSendState,  dismissBranchMismatchForSession,  hasEnvironmentReconnectWarningGraceElapsed,  latestTurnStartFailureId,  scheduleEnvironmentReconnectWarning,  hasServerAcknowledgedLocalDispatch,  isBranchMismatchDismissedForSession,  shouldDockDraftHeroForSubmission,  shouldReleaseTimelineAnchorForToolActivity,  shouldShowBranchMismatchBanner,  shouldShowPlanFollowUpPrompt,  shouldOpenProactivePullRequest,  shouldRetargetThreadPullRequestPanel,  shouldOpenProactiveTurnDiff,  shouldRenderPreviewMiniPlayer,  getStartedThreadModelChangeBlockReason,  LAST_INVOKED_SCRIPT_BY_PROJECT_KEY,  LastInvokedScriptByProjectSchema,  type LocalDispatchSnapshot,  PullRequestDialogState,  cloneComposerImageForRetry,  deriveLockedProvider,  readFileAsDataUrl,  resolveFileAttachmentUrl,  reconcileMountedTerminalThreadIds,  recallCheckoutIsRepo,  rememberCheckoutIsRepo,  resolveBackgroundDraftWorkspaceOptions,  resolveComposerInteractionMode,  resolveComposerProviderSelection,  resolveDraftHeroState,  isPaintOnlyThreadTimeline,  peekHeldThreadTimeline,  peekRememberedThreadTimeline,  rememberReadyThreadTimeline,  resolveThreadSwitchTimeline,  timelineHasEphemeralPreviewUrls,  observeProactivePanelUserChoice,  resolveProactiveTurnDiffAction,  resolveThreadMetadataUpdateForNextTurn,  resolveSendEnvMode,  revokeBlobPreviewUrl,  revokeUserMessagePreviewUrls,  shouldWriteThreadErrorToCurrentServerThread,  startNewThreadForProject,  codexArtifactTemplatePromptToAppend,  toolGroupConsumesUpwardNavigation,  waitForStartedServerThread,  shouldRefocusComposerOnWindowFocus,} from "./ChatView.logic";import type { ThreadSyncPhase } from "../threadSync";import { useLocalStorage } from "~/hooks/useLocalStorage";import { useComposerHandleContext } from "../composerHandleContext";import {  awaitAttachmentUploads,  getUploadedAttachments,  releaseDraftAttachments,  startAttachmentUpload,} from "../lib/attachmentUploadQueue";import { sanitizeThreadErrorMessage } from "~/rpc/transportError";import { RightPanelSheet } from "./RightPanelSheet";import { previewEnvironment } from "../state/preview";import { clampFileAttachmentUploadBytes } from "@t3tools/client-runtime/state/attachments";import { appAtomRegistry } from "../rpc/atomRegistry";import { fileAttachmentCapabilityBlockReason } from "./chat/composerAttachmentFiles";import { assetEnvironment } from "../state/assets";import { readPreparedConnection } from "../state/session";import { useAtomCommand } from "../state/use-atom-command";import { useAtomQueryRunner } from "../state/use-atom-query-runner";import { Button } from "./ui/button";import {  AlertDialog,  AlertDialogClose,  AlertDialogDescription,  AlertDialogFooter,  AlertDialogHeader,  AlertDialogPopup,  AlertDialogTitle,} from "./ui/alert-dialog";import { Tooltip, TooltipPopup, TooltipTrigger } from "./ui/tooltip";import { ServerUpdateAction } from "./ServerUpdateAction";import { useAutoBalanceUpdateBanner } from "./chat/useAutoBalanceUpdateBanner";import {  ComposerServerUpdateIcon,  ComposerServerUpdateStatus,} from "./chat/ComposerServerUpdateStatus";import {  buildVersionMismatchDismissalKey,  dismissServerUpdateFailure,  dismissVersionMismatch,  isServerUpdateFailureDismissed,  isVersionMismatchDismissed,  resolveServerConfigVersionMismatch,  resolveServerSelfUpdateCapability,  serverUpdateGuidance,  supportsDesktopAppUpdate,  supportsServerUpdateThreadContinuation,} from "../versionSkew";import { useAssetUrls } from "../assets/assetUrls";import { ATTACHMENT_ONLY_BOOTSTRAP_PROMPT } from "./chat/composerPromptHistory"; const EMPTY_ACTIVITIES: OrchestrationThreadActivity[] = [];const EMPTY_PROVIDERS: ServerProvider[] = [];const EMPTY_USAGE_LIMIT_SOURCES: UsageLimitSourceSnapshots = [];const EMPTY_PROVIDER_SKILLS: ServerProvider["skills"] = [];const EMPTY_PENDING_USER_INPUT_ANSWERS: Record<string, PendingUserInputDraftAnswer> = {};function useDraftHeroLayoutTransition(isDraftHeroState: boolean) {  const transitionGroupRef = useRef<HTMLDivElement | null>(null);  const composerAnchorRef = useRef<HTMLDivElement | null>(null);  const previousStateRef = useRef(isDraftHeroState);  const previousComposerRectRef = useRef<DOMRect | null>(null);  const animationRef = useRef<Animation | null>(null);  const attachTransitionGroupRef = (element: HTMLDivElement | null) => {    transitionGroupRef.current = element;

Lines 1–500 of 9010.