@tutti-os/workspace-issue-manager 0.0.58 → 0.0.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/react/internal/shell/IssueManagerNodeState.ts","../src/ui/react/internal/reference/IssueManagerReferencePickerState.ts","../src/ui/react/internal/controller/useIssueManagerController.ts","../src/ui/react/internal/controller/IssueManagerControllerCapabilities.ts","../src/services/internal/controllerOutcomes.ts","../src/services/internal/reference/controllerReferenceCommands.ts","../src/services/internal/reference/controllerReferenceOutcomes.ts","../src/services/internal/controllerPlans.ts","../src/services/internal/reference/controllerReferencePlans.ts","../src/services/internal/run/controllerRunCommands.ts","../src/services/internal/save/controllerSaveCommands.ts","../src/services/internal/share/controllerShareCommands.ts","../src/services/internal/controllerAnalytics.ts","../src/services/internal/controllerActions.ts","../src/ui/react/internal/controller/createIssueManagerControllerActionsBridge.ts","../src/ui/react/internal/issue/createIssueManagerIssueBindings.ts","../src/ui/react/internal/task/createIssueManagerTaskBindings.ts","../src/ui/react/internal/controller/createIssueManagerControllerBindings.ts","../src/ui/react/internal/controller/useIssueManagerControllerRuntime.ts","../src/ui/react/internal/shell/IssueManagerNoticeState.ts","../src/ui/react/internal/shell/useIssueManagerNodeView.ts","../src/ui/react/index.ts","../src/ui/IssueManagerNode.tsx","../src/ui/internal/shell/IssueManagerShell.tsx","../src/ui/internal/shell/IssueManagerPanels.tsx","../src/ui/internal/status/IssueManagerStatusBadge.ts","../src/ui/internal/issue/IssueManagerIssueSections.tsx","../src/ui/internal/content/IssueManagerTitleTooltip.tsx","../src/ui/internal/panel/IssueManagerPanelText.ts","../src/ui/internal/panel/IssueManagerPanelSurface.tsx","../src/ui/internal/issue/IssueManagerSubtaskBoard.tsx","../src/ui/internal/issue/IssueManagerIssueAcceptanceState.ts","../src/ui/internal/content/IssueManagerDescriptionSection.tsx","../src/ui/internal/content/IssueManagerRichTextTextarea.tsx","../src/ui/internal/task/IssueManagerTaskAcceptanceCard.tsx","../src/ui/internal/shell/IssueManagerDraftTitleInput.tsx","../src/ui/internal/shell/IssueManagerEditorMotion.ts","../src/ui/internal/shell/IssueManagerBottomBar.tsx","../src/ui/internal/task/IssueManagerRunSections.tsx","../src/ui/internal/shell/IssueManagerTaskDrawerState.ts","../src/ui/internal/shell/IssueManagerFloatingNotice.tsx","../src/ui/internal/shell/IssueManagerSidebar.tsx","../src/ui/internal/shell/IssueManagerSidebarSections.tsx","../src/ui/internal/shell/IssueManagerShellState.ts","../src/ui/internal/shell/IssueManagerSidebarState.ts","../src/ui/internal/shell/IssueManagerTaskComposerPane.tsx","../src/ui/internal/shell/IssueManagerTaskDrawer.tsx","../src/ui/internal/shell/IssueManagerTaskDrawerSections.tsx","../src/ui/internal/shell/useIssueManagerShellView.ts","../src/ui/internal/shell/IssueManagerTaskDrawerEcho.ts","../src/ui/internal/shell/IssueManagerTopicSelector.tsx"],"sourcesContent":["import { useEffect, useEffectEvent, useState } from \"react\";\nimport type {\n IssueManagerIssueSummary,\n IssueManagerTaskSummary,\n IssueManagerCreateTopicInput,\n IssueManagerTopic,\n IssueManagerUpdateTopicInput\n} from \"../../../../contracts/index.ts\";\nimport type { IssueManagerI18nRuntime } from \"../../../../i18n/issueManagerI18n.ts\";\n\ninterface IssueManagerTaskListCollapsedDetail {\n collapsed: boolean;\n nodeId: string;\n workspaceId: string;\n}\n\nconst issueManagerTaskListCollapsedEvent =\n \"tutti:issue-manager-task-list-collapsed\";\n\ntype IssueManagerTopicCreateEventInput = Omit<\n IssueManagerCreateTopicInput,\n \"workspaceId\"\n>;\n\ntype IssueManagerTopicUpdateEventInput = Omit<\n IssueManagerUpdateTopicInput,\n \"workspaceId\"\n>;\n\ninterface IssueManagerTopicHeaderStateDetail {\n activeTopicId: string | null;\n nodeId: string;\n topics: readonly IssueManagerTopic[];\n workspaceId: string;\n}\n\ninterface IssueManagerTopicSelectionDetail {\n nodeId: string;\n topicId: string;\n workspaceId: string;\n}\n\ninterface IssueManagerTopicCreateDetail {\n input: IssueManagerTopicCreateEventInput;\n nodeId: string;\n workspaceId: string;\n}\n\ninterface IssueManagerTopicDeleteDetail {\n nodeId: string;\n topicId: string;\n workspaceId: string;\n}\n\ninterface IssueManagerTopicUpdateDetail {\n input: IssueManagerTopicUpdateEventInput;\n nodeId: string;\n workspaceId: string;\n}\n\ninterface IssueManagerIssueCreateRequestDetail {\n nodeId: string;\n workspaceId: string;\n}\n\ntype IssueManagerEventHubListener<TDetail> = (detail: TDetail) => void;\n\nfunction createIssueManagerKeyedEventHub<TDetail>(input: {\n getKey: (detail: TDetail) => string;\n}) {\n const listenerSetByKey = new Map<\n string,\n Set<IssueManagerEventHubListener<TDetail>>\n >();\n\n return {\n publish(detail: TDetail): void {\n listenerSetByKey.get(input.getKey(detail))?.forEach((listener) => {\n listener(detail);\n });\n },\n subscribe(\n key: string,\n listener: IssueManagerEventHubListener<TDetail>\n ): () => void {\n let listenerSet = listenerSetByKey.get(key);\n if (!listenerSet) {\n listenerSet = new Set();\n listenerSetByKey.set(key, listenerSet);\n }\n listenerSet.add(listener);\n\n return () => {\n listenerSet?.delete(listener);\n if (listenerSet?.size === 0) {\n listenerSetByKey.delete(key);\n }\n };\n }\n };\n}\n\nfunction createIssueManagerKeyedReplayEventHub<TDetail>(input: {\n getKey: (detail: TDetail) => string;\n}) {\n const currentByKey = new Map<string, TDetail>();\n const eventHub = createIssueManagerKeyedEventHub<TDetail>(input);\n\n return {\n get(key: string): TDetail | null {\n return currentByKey.get(key) ?? null;\n },\n publish(detail: TDetail): void {\n currentByKey.set(input.getKey(detail), detail);\n eventHub.publish(detail);\n },\n subscribe(\n key: string,\n listener: IssueManagerEventHubListener<TDetail>\n ): () => void {\n const unsubscribe = eventHub.subscribe(key, listener);\n const current = currentByKey.get(key);\n if (current) {\n listener(current);\n }\n return unsubscribe;\n }\n };\n}\n\nconst issueManagerTopicHeaderStateHub =\n createIssueManagerKeyedReplayEventHub<IssueManagerTopicHeaderStateDetail>({\n getKey: issueManagerNodeScopeKey\n });\nconst issueManagerTopicSelectionHub =\n createIssueManagerKeyedEventHub<IssueManagerTopicSelectionDetail>({\n getKey: issueManagerNodeScopeKey\n });\nconst issueManagerTopicCreateHub =\n createIssueManagerKeyedEventHub<IssueManagerTopicCreateDetail>({\n getKey: issueManagerNodeScopeKey\n });\nconst issueManagerTopicDeleteHub =\n createIssueManagerKeyedEventHub<IssueManagerTopicDeleteDetail>({\n getKey: issueManagerNodeScopeKey\n });\nconst issueManagerTopicUpdateHub =\n createIssueManagerKeyedEventHub<IssueManagerTopicUpdateDetail>({\n getKey: issueManagerNodeScopeKey\n });\nconst issueManagerIssueCreateRequestHub =\n createIssueManagerKeyedEventHub<IssueManagerIssueCreateRequestDetail>({\n getKey: issueManagerNodeScopeKey\n });\n\nexport function resolveIssueManagerTopicHeaderState(input: {\n activeTopicId: string | null;\n nodeId: string;\n workspaceId: string;\n}): IssueManagerTopicHeaderStateDetail {\n return (\n issueManagerTopicHeaderStateHub.get(issueManagerNodeScopeKey(input)) ?? {\n activeTopicId: input.activeTopicId,\n nodeId: input.nodeId,\n topics: [],\n workspaceId: input.workspaceId\n }\n );\n}\n\nexport function dispatchIssueManagerTaskListCollapsed(input: {\n collapsed: boolean;\n nodeId: string;\n workspaceId: string;\n}): void {\n if (typeof window === \"undefined\") {\n return;\n }\n\n window.dispatchEvent(\n new CustomEvent<IssueManagerTaskListCollapsedDetail>(\n issueManagerTaskListCollapsedEvent,\n {\n detail: input\n }\n )\n );\n}\n\nexport function dispatchIssueManagerTopicHeaderState(\n input: IssueManagerTopicHeaderStateDetail\n): void {\n issueManagerTopicHeaderStateHub.publish(input);\n}\n\nexport function dispatchIssueManagerTopicSelection(\n input: IssueManagerTopicSelectionDetail\n): void {\n issueManagerTopicSelectionHub.publish(input);\n}\n\nexport function dispatchIssueManagerTopicCreate(\n input: IssueManagerTopicCreateDetail\n): void {\n issueManagerTopicCreateHub.publish(input);\n}\n\nexport function dispatchIssueManagerTopicDelete(\n input: IssueManagerTopicDeleteDetail\n): void {\n issueManagerTopicDeleteHub.publish(input);\n}\n\nexport function dispatchIssueManagerTopicUpdate(\n input: IssueManagerTopicUpdateDetail\n): void {\n issueManagerTopicUpdateHub.publish(input);\n}\n\nexport function dispatchIssueManagerIssueCreateRequest(\n input: IssueManagerIssueCreateRequestDetail\n): void {\n issueManagerIssueCreateRequestHub.publish(input);\n}\n\nexport function useIssueManagerTaskListCollapsedSync(input: {\n nodeId: string;\n onCollapsedChange: (collapsed: boolean) => void;\n workspaceId: string;\n}): void {\n const onCollapsedChange = useEffectEvent(input.onCollapsedChange);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n const handleTaskListCollapsedChange = (event: Event) => {\n const detail = (event as CustomEvent<IssueManagerTaskListCollapsedDetail>)\n .detail;\n if (\n detail?.nodeId !== input.nodeId ||\n detail.workspaceId !== input.workspaceId\n ) {\n return;\n }\n onCollapsedChange(detail.collapsed);\n };\n\n window.addEventListener(\n issueManagerTaskListCollapsedEvent,\n handleTaskListCollapsedChange\n );\n return () => {\n window.removeEventListener(\n issueManagerTaskListCollapsedEvent,\n handleTaskListCollapsedChange\n );\n };\n }, [input.nodeId, input.workspaceId, onCollapsedChange]);\n}\n\nexport function useIssueManagerTopicHeaderStateSync(input: {\n activeTopicId: string | null;\n nodeId: string;\n workspaceId: string;\n}) {\n const [state, setState] = useState<IssueManagerTopicHeaderStateDetail>(() =>\n resolveIssueManagerTopicHeaderState(input)\n );\n\n useEffect(() => {\n setState((current) =>\n current.activeTopicId === input.activeTopicId &&\n current.nodeId === input.nodeId &&\n current.workspaceId === input.workspaceId &&\n current.topics === resolveIssueManagerTopicHeaderState(input).topics\n ? current\n : resolveIssueManagerTopicHeaderState(input)\n );\n }, [input.activeTopicId, input.nodeId, input.workspaceId]);\n\n useEffect(() => {\n const handleTopicHeaderStateChange = (\n detail: IssueManagerTopicHeaderStateDetail\n ) => {\n setState(detail);\n };\n\n return issueManagerTopicHeaderStateHub.subscribe(\n issueManagerNodeScopeKey(input),\n handleTopicHeaderStateChange\n );\n }, [input.nodeId, input.workspaceId]);\n\n return state;\n}\n\nexport function useIssueManagerTopicHeaderCommandSync(input: {\n nodeId: string;\n onCreateTopic: (topicInput: IssueManagerTopicCreateEventInput) => void;\n onDeleteTopic: (topicId: string) => void;\n onSelectTopic: (topicId: string) => void;\n onUpdateTopic: (topicInput: IssueManagerTopicUpdateEventInput) => void;\n workspaceId: string;\n}): void {\n const onCreateTopic = useEffectEvent(input.onCreateTopic);\n const onDeleteTopic = useEffectEvent(input.onDeleteTopic);\n const onSelectTopic = useEffectEvent(input.onSelectTopic);\n const onUpdateTopic = useEffectEvent(input.onUpdateTopic);\n\n useEffect(() => {\n const handleTopicSelection = (detail: IssueManagerTopicSelectionDetail) => {\n onSelectTopic(detail.topicId);\n };\n const handleTopicCreate = (detail: IssueManagerTopicCreateDetail) => {\n onCreateTopic(detail.input);\n };\n const handleTopicDelete = (detail: IssueManagerTopicDeleteDetail) => {\n onDeleteTopic(detail.topicId);\n };\n const handleTopicUpdate = (detail: IssueManagerTopicUpdateDetail) => {\n onUpdateTopic(detail.input);\n };\n\n const unsubscribeSelection = issueManagerTopicSelectionHub.subscribe(\n issueManagerNodeScopeKey(input),\n handleTopicSelection\n );\n const unsubscribeCreate = issueManagerTopicCreateHub.subscribe(\n issueManagerNodeScopeKey(input),\n handleTopicCreate\n );\n const unsubscribeDelete = issueManagerTopicDeleteHub.subscribe(\n issueManagerNodeScopeKey(input),\n handleTopicDelete\n );\n const unsubscribeUpdate = issueManagerTopicUpdateHub.subscribe(\n issueManagerNodeScopeKey(input),\n handleTopicUpdate\n );\n return () => {\n unsubscribeSelection();\n unsubscribeCreate();\n unsubscribeDelete();\n unsubscribeUpdate();\n };\n }, [\n input.nodeId,\n input.workspaceId,\n onCreateTopic,\n onDeleteTopic,\n onSelectTopic,\n onUpdateTopic\n ]);\n}\n\nexport function useIssueManagerIssueCreateRequestSync(input: {\n nodeId: string;\n onCreateIssue: () => void;\n workspaceId: string;\n}): void {\n const onCreateIssue = useEffectEvent(input.onCreateIssue);\n\n useEffect(() => {\n const handleCreateIssueRequest = () => {\n onCreateIssue();\n };\n\n return issueManagerIssueCreateRequestHub.subscribe(\n issueManagerNodeScopeKey(input),\n handleCreateIssueRequest\n );\n }, [input.nodeId, input.workspaceId, onCreateIssue]);\n}\n\nexport function useIssueManagerNodeHeaderView(input: {\n copy: IssueManagerI18nRuntime;\n isSidebarAutoCollapsed: boolean;\n isSidebarCollapsed: boolean;\n nodeId: string;\n onToggleSidebar: (nextCollapsed: boolean) => void;\n workspaceId: string;\n}) {\n const [manualCollapsed, setManualCollapsed] = useState(\n input.isSidebarCollapsed\n );\n\n useEffect(() => {\n setManualCollapsed(input.isSidebarCollapsed);\n }, [input.isSidebarCollapsed]);\n\n useIssueManagerTaskListCollapsedSync({\n nodeId: input.nodeId,\n onCollapsedChange: setManualCollapsed,\n workspaceId: input.workspaceId\n });\n\n const effectiveCollapsed = input.isSidebarAutoCollapsed || manualCollapsed;\n\n return {\n effectiveCollapsed,\n toggleLabel: effectiveCollapsed\n ? input.copy.t(\"actions.expandIssueList\")\n : input.copy.t(\"actions.collapseIssueList\"),\n toggleSidebar: () => {\n input.onToggleSidebar(!effectiveCollapsed);\n }\n };\n}\n\nfunction issueManagerNodeScopeKey(input: {\n nodeId: string;\n workspaceId: string;\n}): string {\n return `${input.workspaceId}\\0${input.nodeId}`;\n}\n\nexport function resolveIssueManagerSelectedIssue(input: {\n issueDetail: IssueManagerIssueSummary | null;\n issues: readonly IssueManagerIssueSummary[];\n selectedIssueId: string | null;\n}): IssueManagerIssueSummary | null {\n if (!input.selectedIssueId) {\n return null;\n }\n\n return (\n input.issueDetail ??\n input.issues.find((issue) => issue.issueId === input.selectedIssueId) ??\n null\n );\n}\n\nexport function resolveIssueManagerSelectedTask(input: {\n selectedTaskId: string | null;\n taskDetail: IssueManagerTaskSummary | null;\n tasks: readonly IssueManagerTaskSummary[];\n}): IssueManagerTaskSummary | null {\n if (!input.selectedTaskId) {\n return null;\n }\n\n return (\n input.taskDetail ??\n input.tasks.find((task) => task.taskId === input.selectedTaskId) ??\n null\n );\n}\n","export {\n collectVisibleTreeEntries,\n createWorkspaceFileReferenceDirectoryStateFromSnapshot as createReferenceDirectoryStateFromSnapshot,\n mergeExpandedFolderPaths,\n mergePrefetchedDirectoryState,\n normalizeDirectoryPath,\n prefetchReferenceTree,\n workspaceFileReferenceDefaultExpandedDepth as issueManagerReferenceDefaultExpandedDepth,\n type WorkspaceFileReferenceDirectoryState as IssueManagerReferenceDirectoryState\n} from \"@tutti-os/workspace-file-reference/react\";\n","import { useEffect, useMemo, useState } from \"react\";\nimport type {\n RichTextMentionAttrs,\n RichTextTriggerProvider\n} from \"@tutti-os/ui-rich-text/types\";\nimport type { WorkspaceUserProjectService } from \"@tutti-os/workspace-user-project/contracts\";\nimport type { WorkspaceUserProjectI18nRuntime } from \"@tutti-os/workspace-user-project/i18n\";\nimport type {\n IssueManagerAgentProviderOption,\n IssueManagerContextRef,\n IssueManagerFileReference,\n IssueManagerIssueDetail,\n IssueManagerIssueSummary,\n IssueManagerNodeState,\n IssueManagerOpenSource,\n IssueManagerPriority,\n IssueManagerReferenceBundle,\n IssueManagerRun,\n IssueManagerStatus,\n IssueManagerTaskDetail,\n IssueManagerTaskStatusUpdate,\n IssueManagerTopic,\n IssueManagerCreateTopicInput,\n IssueManagerUpdateTopicInput\n} from \"../../../../contracts/index.ts\";\nimport type { IssueManagerFeature } from \"../../../../core/index.ts\";\nimport type { IssueManagerI18nRuntime } from \"../../../../i18n/issueManagerI18n.ts\";\nimport type { IssueManagerControllerService } from \"../../../../services/issueManagerControllerService.interface.ts\";\nimport {\n resolveIssueManagerAgentProviderOptions,\n resolveIssueManagerControllerCapabilities\n} from \"./IssueManagerControllerCapabilities.ts\";\nimport type { IssueManagerFloatingNoticeViewState } from \"../shell/IssueManagerNoticeState.ts\";\nimport type {\n AsyncCollectionState,\n IssueDraft,\n IssueManagerNotificationState,\n TaskDraft\n} from \"../../../../services/controllerTypes.ts\";\nimport type {\n IssueManagerEditorMode,\n IssueManagerReferenceTarget\n} from \"../../../../services/controllerModel.ts\";\nimport { createIssueManagerControllerActionsBridge } from \"./createIssueManagerControllerActionsBridge.ts\";\nimport { createIssueManagerControllerBindings } from \"./createIssueManagerControllerBindings.ts\";\nimport { resolveIssueManagerTopicDeleteErrorMessage } from \"../../../../services/internal/controllerUtils.ts\";\nimport { useIssueManagerControllerRuntime } from \"./useIssueManagerControllerRuntime.ts\";\nimport type { IssueManagerDiagnostics } from \"../../../../internal/issueManagerDiagnostics.ts\";\n\nexport type IssueManagerRichTextSurface = \"issue\" | \"task\";\n\nexport interface UseIssueManagerControllerInput {\n diagnostics?: IssueManagerDiagnostics | null;\n feature: IssueManagerFeature;\n openSource?: IssueManagerOpenSource;\n onStateChange?: (state: IssueManagerNodeState) => void;\n resolveRichTextTriggerProviders?: (input: {\n surface: IssueManagerRichTextSurface;\n workspaceId: string;\n }) => readonly RichTextTriggerProvider[];\n service?: IssueManagerControllerService;\n state?: Partial<IssueManagerNodeState> | null;\n workspaceId: string;\n}\n\nexport interface IssueManagerController {\n attachReferences: (parentKind: \"issue\" | \"task\") => Promise<void>;\n canOpenAgentSessions: boolean;\n canSelectExecutionDirectory: boolean;\n canInviteCollaborators: boolean;\n canReferenceWorkspaceFiles: boolean;\n canUploadWorkspaceFiles: boolean;\n copy: IssueManagerI18nRuntime;\n diagnostics: IssueManagerDiagnostics | null;\n createTopic: (\n input: Omit<IssueManagerCreateTopicInput, \"workspaceId\">\n ) => Promise<void>;\n deleteTopic: (topicId: string) => Promise<void>;\n createTaskDraft: () => void;\n deleteIssue: (options?: { skipConfirmation?: boolean }) => Promise<void>;\n deleteTask: (options?: { skipConfirmation?: boolean }) => Promise<void>;\n dismissNotification: () => void;\n insertReferences: (parentKind: \"issue\" | \"task\") => Promise<void>;\n issueDetail: AsyncCollectionState<IssueManagerIssueDetail | null>;\n issueDraft: IssueDraft;\n issueEditorMode: IssueManagerEditorMode;\n floatingNotice: IssueManagerFloatingNoticeViewState | null;\n issues: AsyncCollectionState<IssueManagerIssueSummary[]>;\n isRunningTask: boolean;\n nodeState: IssueManagerNodeState;\n notification: IssueManagerNotificationState | null;\n openAgentSession: (run: IssueManagerRun) => Promise<void>;\n openMention: (mention: RichTextMentionAttrs) => Promise<void>;\n openReference: (reference: IssueManagerFileReference) => Promise<void>;\n moveTask: (input: {\n targetIndex: number;\n targetStatus: IssueManagerStatus;\n taskId: string;\n visibleTaskIds?: readonly string[];\n }) => Promise<void>;\n providerOptions: readonly IssueManagerAgentProviderOption[];\n executionDirectoryProjectService: WorkspaceUserProjectService | null;\n reportIssueSearchUsage: (query: string) => void;\n refreshAll: () => void;\n referenceTarget: IssueManagerReferenceTarget | null;\n removeContextRef: (ref: IssueManagerContextRef) => Promise<void>;\n runTask: (providerOverride?: string) => Promise<void>;\n saveIssue: () => Promise<void>;\n saveTask: () => Promise<void>;\n setTaskStatus: (\n taskId: string,\n status: IssueManagerTaskStatusUpdate\n ) => Promise<void>;\n setSelectedTaskStatus: (\n status: IssueManagerTaskStatusUpdate\n ) => Promise<void>;\n resolveRichTextTriggerProviders: (\n surface: IssueManagerRichTextSurface\n ) => readonly RichTextTriggerProvider[];\n selectIssue: (issueId: string | null) => void;\n selectTask: (taskId: string | null) => void;\n selectTopic: (topicId: string) => void;\n setIssueContent: (content: string) => void;\n setIssueDraft: (patch: Partial<IssueDraft>) => void;\n setIssueEditorMode: (mode: IssueManagerEditorMode) => void;\n setIssueSearchQuery: (query: string) => void;\n setIssueStatusFilter: (\n value: IssueManagerNodeState[\"issueStatusFilter\"]\n ) => void;\n setIssueTitle: (title: string) => void;\n setReferenceTarget: (target: IssueManagerReferenceTarget | null) => void;\n setSelectedAgentProvider: (provider: string) => void;\n useExecutionDirectory: (path: string | null) => Promise<void>;\n setTaskContent: (content: string) => void;\n setTaskDraft: (patch: Partial<TaskDraft>) => void;\n setTaskEditorMode: (mode: IssueManagerEditorMode) => void;\n setTaskListCollapsed: (collapsed: boolean) => void;\n setTaskPriority: (priority: IssueManagerPriority) => void;\n setTaskTitle: (title: string) => void;\n shareSelection: () => Promise<void>;\n startTaskBreakdown: (providerOverride?: string) => Promise<void>;\n submitReferenceSelection: (\n refs: IssueManagerFileReference[]\n ) => Promise<void>;\n submitReferenceBundleSelection: (input: {\n files: IssueManagerFileReference[];\n bundles: IssueManagerReferenceBundle[];\n }) => Promise<void>;\n taskDetail: AsyncCollectionState<IssueManagerTaskDetail | null>;\n taskDraft: TaskDraft;\n taskEditorMode: IssueManagerEditorMode;\n topics: AsyncCollectionState<IssueManagerTopic[]>;\n updateTopic: (\n input: Omit<IssueManagerUpdateTopicInput, \"workspaceId\">\n ) => Promise<void>;\n uploadReferences: (\n parentKind: \"issue\" | \"task\",\n mode: \"files\" | \"folder\"\n ) => Promise<void>;\n workspaceUserProjectI18n: WorkspaceUserProjectI18nRuntime;\n workspaceId: string;\n}\n\nexport function useIssueManagerController({\n diagnostics,\n feature,\n openSource,\n onStateChange,\n resolveRichTextTriggerProviders,\n service,\n state,\n workspaceId\n}: UseIssueManagerControllerInput): IssueManagerController {\n const copy = feature.i18n;\n const { controllerSession, floatingNotice, snapshot } =\n useIssueManagerControllerRuntime({\n diagnostics,\n feature,\n openSource,\n onStateChange,\n service,\n state,\n workspaceId\n });\n const {\n issueDetail,\n issueDraft,\n issueEditorMode,\n issues,\n isRunningTask,\n nodeState,\n notification,\n referenceTarget,\n taskDetail,\n taskDraft,\n taskEditorMode,\n topics\n } = snapshot;\n const {\n canOpenAgentSessions,\n canInviteCollaborators,\n canReferenceWorkspaceFiles,\n canSelectExecutionDirectory,\n canUploadWorkspaceFiles\n } = useMemo(\n () => resolveIssueManagerControllerCapabilities(feature),\n [feature]\n );\n const [providerOptions, setProviderOptions] = useState(() =>\n resolveIssueManagerAgentProviderOptions(feature)\n );\n\n useEffect(() => {\n setProviderOptions(resolveIssueManagerAgentProviderOptions(feature));\n return feature.agentProviderOptions?.subscribe?.(() => {\n setProviderOptions(resolveIssueManagerAgentProviderOptions(feature));\n });\n }, [feature]);\n\n const actions = createIssueManagerControllerActionsBridge({\n controllerSession,\n copy,\n diagnostics,\n feature,\n issueDetail,\n issueDraft,\n issueEditorMode,\n nodeState,\n referenceTarget,\n taskDetail,\n taskDraft,\n taskEditorMode,\n workspaceId\n });\n const bindings = createIssueManagerControllerBindings({\n controllerSession,\n diagnostics,\n feature,\n issueEditorMode,\n nodeState,\n onResolveRichTextTriggerProviders: resolveRichTextTriggerProviders,\n taskEditorMode,\n workspaceId\n });\n const notifyTopicOperationFailure = (message: string) => {\n feature.notifications?.tips(message);\n controllerSession.setNotification((current) => ({\n id: (current?.id ?? 0) + 1,\n title: message,\n tone: \"destructive\"\n }));\n };\n\n return {\n ...actions,\n ...bindings,\n canOpenAgentSessions,\n canInviteCollaborators,\n canReferenceWorkspaceFiles,\n canSelectExecutionDirectory,\n canUploadWorkspaceFiles,\n copy,\n diagnostics: diagnostics ?? null,\n async createTopic(topicInput) {\n try {\n const topic = await feature.backend.createTopic({\n ...topicInput,\n workspaceId\n });\n controllerSession.updateNodeState((current) => ({\n ...current,\n activeTopicId: topic.topicId\n }));\n controllerSession.refreshAll();\n } catch {\n notifyTopicOperationFailure(copy.t(\"messages.topicCreateFailed\"));\n }\n },\n async deleteTopic(topicId) {\n const trimmedTopicId = topicId.trim();\n if (!trimmedTopicId) {\n return;\n }\n try {\n await feature.backend.deleteTopic({\n topicId: trimmedTopicId,\n workspaceId\n });\n if (nodeState.activeTopicId === trimmedTopicId) {\n controllerSession.updateNodeState((current) => ({\n ...current,\n activeTopicId: null,\n selectedIssueId: null,\n selectedTaskId: null\n }));\n }\n controllerSession.refreshAll();\n } catch (error) {\n notifyTopicOperationFailure(\n resolveIssueManagerTopicDeleteErrorMessage(error, copy)\n );\n }\n },\n issueDetail,\n issueDraft,\n issueEditorMode,\n floatingNotice,\n issues,\n isRunningTask,\n nodeState,\n notification,\n async openMention(mention) {\n await feature.mentionActionHandler?.openMention({\n mention,\n workspaceId\n });\n },\n providerOptions,\n executionDirectoryProjectService:\n feature.executionDirectoryPicker?.service ?? null,\n workspaceUserProjectI18n: feature.workspaceUserProjectI18n,\n referenceTarget,\n selectTopic(topicId: string) {\n const trimmedTopicId = topicId.trim();\n if (!trimmedTopicId) {\n return;\n }\n if (nodeState.activeTopicId !== trimmedTopicId) {\n void Promise.resolve(\n feature.analytics?.track({\n name: \"issue_manager.topic_changed\",\n params: {}\n })\n ).catch(() => undefined);\n }\n controllerSession.updateNodeState((current) => ({\n ...current,\n activeTopicId: trimmedTopicId\n }));\n },\n taskDetail,\n taskDraft,\n taskEditorMode,\n topics,\n async updateTopic(topicInput) {\n try {\n await feature.backend.updateTopic({\n ...topicInput,\n workspaceId\n });\n controllerSession.refreshAll();\n } catch {\n notifyTopicOperationFailure(copy.t(\"messages.topicUpdateFailed\"));\n }\n },\n workspaceId\n };\n}\n","import type {\n IssueManagerAgentProviderOption,\n IssueManagerFileAdapter\n} from \"../../../../contracts/index.ts\";\nimport type { IssueManagerFeature } from \"../../../../core/index.ts\";\n\nexport const defaultIssueManagerAgentProviderOptions = [\n {\n label: \"Codex\",\n provider: \"codex\"\n }\n] as const satisfies readonly IssueManagerAgentProviderOption[];\n\nexport function resolveIssueManagerAgentProviderOptions(\n feature: IssueManagerFeature\n): readonly IssueManagerAgentProviderOption[] {\n if (!feature.agentProviderOptions) {\n return defaultIssueManagerAgentProviderOptions;\n }\n\n const configuredOptions = feature.agentProviderOptions.getOptions();\n const normalizedOptions = configuredOptions\n .map((option) => {\n const disabledReason = option.disabledReason?.trim();\n return {\n ...(option.disabled === true ? { disabled: true } : {}),\n ...(disabledReason ? { disabledReason } : {}),\n ...(option.iconUrl?.trim() ? { iconUrl: option.iconUrl.trim() } : {}),\n label: option.label.trim() || option.provider.trim(),\n provider: option.provider.trim()\n };\n })\n .filter((option) => option.provider && option.label);\n\n return normalizedOptions;\n}\n\nexport interface IssueManagerControllerCapabilities {\n canOpenAgentSessions: boolean;\n canSelectExecutionDirectory: boolean;\n canInviteCollaborators: boolean;\n canReferenceWorkspaceFiles: boolean;\n canUploadWorkspaceFiles: boolean;\n}\n\nexport function resolveIssueManagerControllerCapabilities(\n feature: IssueManagerFeature\n): IssueManagerControllerCapabilities {\n return {\n canOpenAgentSessions:\n typeof feature.agentSessionOpener?.openSession === \"function\",\n canSelectExecutionDirectory: Boolean(\n feature.executionDirectoryPicker?.service\n ),\n canInviteCollaborators:\n feature.ui.showInviteCollaborator === true &&\n typeof feature.shareAdapter?.createIssueLink === \"function\",\n canReferenceWorkspaceFiles:\n hasFileAdapterMethod(feature.fileAdapter, \"requestReferences\") ||\n hasFileAdapterMethod(feature.fileAdapter, \"loadReferenceTree\") ||\n hasFileAdapterMethod(feature.fileAdapter, \"listDirectory\") ||\n hasFileAdapterMethod(feature.fileAdapter, \"searchReferences\"),\n canUploadWorkspaceFiles: hasFileAdapterMethod(\n feature.fileAdapter,\n \"requestUpload\"\n )\n };\n}\n\nfunction hasFileAdapterMethod(\n fileAdapter: IssueManagerFileAdapter | undefined,\n methodName:\n | \"listDirectory\"\n | \"loadReferenceTree\"\n | \"requestReferences\"\n | \"requestUpload\"\n | \"searchReferences\"\n): boolean {\n return typeof Reflect.get(fileAdapter ?? {}, methodName) === \"function\";\n}\n","import type { IssueManagerNodeState } from \"../../contracts/index.ts\";\nimport type {\n IssueManagerEditorMode,\n IssueManagerReferenceTarget\n} from \"./model.ts\";\nimport type {\n IssueDraft,\n IssueManagerNotificationTone,\n TaskDraft\n} from \"./controllerTypes.ts\";\nimport {\n applyIssueManagerIssueSaved,\n applyIssueManagerTaskSaved\n} from \"./controllerState.ts\";\n\nexport interface IssueManagerControllerOutcome {\n issueDraft?: (current: IssueDraft) => IssueDraft;\n issueEditorMode?: IssueManagerEditorMode;\n nodeState?: (current: IssueManagerNodeState) => IssueManagerNodeState;\n notificationKey?: string;\n referenceTarget?: IssueManagerReferenceTarget | null;\n refreshAll?: boolean;\n refreshDetails?: boolean;\n taskDraft?: (current: TaskDraft) => TaskDraft;\n taskEditorMode?: IssueManagerEditorMode;\n}\n\nexport interface ApplyIssueManagerControllerOutcomeInput {\n notify: (title: string, tone?: IssueManagerNotificationTone) => void;\n outcome: IssueManagerControllerOutcome;\n refreshAll: () => void;\n refreshDetails: () => void;\n setIssueDraftInternal: (updater: (current: IssueDraft) => IssueDraft) => void;\n setIssueEditorModeState: (mode: IssueManagerEditorMode) => void;\n setReferenceTarget: (target: IssueManagerReferenceTarget | null) => void;\n setTaskDraftInternal: (updater: (current: TaskDraft) => TaskDraft) => void;\n setTaskEditorModeState: (mode: IssueManagerEditorMode) => void;\n translate: (key: string) => string;\n updateNodeState: (\n updater: (current: IssueManagerNodeState) => IssueManagerNodeState\n ) => void;\n}\n\nexport function applyIssueManagerControllerOutcome(\n input: ApplyIssueManagerControllerOutcomeInput\n): void {\n if (input.outcome.notificationKey) {\n input.notify(input.translate(input.outcome.notificationKey));\n }\n if (input.outcome.issueDraft) {\n input.setIssueDraftInternal(input.outcome.issueDraft);\n }\n if (input.outcome.issueEditorMode) {\n input.setIssueEditorModeState(input.outcome.issueEditorMode);\n }\n if (\"referenceTarget\" in input.outcome) {\n input.setReferenceTarget(input.outcome.referenceTarget ?? null);\n }\n if (input.outcome.taskDraft) {\n input.setTaskDraftInternal(input.outcome.taskDraft);\n }\n if (input.outcome.taskEditorMode) {\n input.setTaskEditorModeState(input.outcome.taskEditorMode);\n }\n if (input.outcome.nodeState) {\n input.updateNodeState(input.outcome.nodeState);\n }\n if (input.outcome.refreshAll) {\n input.refreshAll();\n }\n if (input.outcome.refreshDetails) {\n input.refreshDetails();\n }\n}\n\nexport function createIssueManagerRunTaskSuccessOutcome(input: {\n status: string;\n}): IssueManagerControllerOutcome {\n return {\n notificationKey:\n input.status === \"completed\" || input.status === \"opened\"\n ? undefined\n : \"messages.runFailed\"\n };\n}\n\nexport function createIssueManagerSaveIssueSuccessOutcome(\n issueId: string\n): IssueManagerControllerOutcome {\n return {\n issueEditorMode: \"read\",\n nodeState: (current) => applyIssueManagerIssueSaved(current, issueId),\n refreshAll: true\n };\n}\n\nexport function createIssueManagerSaveTaskSuccessOutcome(\n taskId: string\n): IssueManagerControllerOutcome {\n return {\n nodeState: (current) => applyIssueManagerTaskSaved(current, taskId),\n refreshAll: true,\n taskEditorMode: \"read\"\n };\n}\n","import type {\n IssueManagerContextRef,\n IssueManagerFileReference\n} from \"../../../contracts/index.ts\";\nimport {\n appendIssueManagerWorkspaceFileLinksToContent,\n type IssueManagerFeature\n} from \"../../../core/index.ts\";\nimport type { IssueManagerReferenceTarget } from \"../model.ts\";\nimport {\n toContextRefInput,\n toIssueManagerWorkspaceFileLinkInput\n} from \"../controllerUtils.ts\";\n\nexport function canIssueManagerRequestReferencesDirectly(\n fileAdapter: IssueManagerFeature[\"fileAdapter\"]\n): fileAdapter is NonNullable<IssueManagerFeature[\"fileAdapter\"]> & {\n requestReferences: NonNullable<\n NonNullable<IssueManagerFeature[\"fileAdapter\"]>[\"requestReferences\"]\n >;\n} {\n return Boolean(\n fileAdapter?.requestReferences &&\n !fileAdapter.loadReferenceTree &&\n !fileAdapter.listDirectory &&\n !fileAdapter.searchReferences\n );\n}\n\nexport async function executeIssueManagerRequestReferences(input: {\n fileAdapter: NonNullable<IssueManagerFeature[\"fileAdapter\"]> & {\n requestReferences: NonNullable<\n NonNullable<IssueManagerFeature[\"fileAdapter\"]>[\"requestReferences\"]\n >;\n };\n workspaceId: string;\n}): Promise<IssueManagerFileReference[]> {\n return input.fileAdapter.requestReferences({\n workspaceId: input.workspaceId\n });\n}\n\nexport function canIssueManagerUploadReferences(\n fileAdapter: IssueManagerFeature[\"fileAdapter\"]\n): fileAdapter is NonNullable<IssueManagerFeature[\"fileAdapter\"]> & {\n requestUpload: NonNullable<\n NonNullable<IssueManagerFeature[\"fileAdapter\"]>[\"requestUpload\"]\n >;\n} {\n return typeof fileAdapter?.requestUpload === \"function\";\n}\n\nexport function canIssueManagerOpenReferences(\n fileAdapter: IssueManagerFeature[\"fileAdapter\"]\n): fileAdapter is NonNullable<IssueManagerFeature[\"fileAdapter\"]> & {\n openReference: NonNullable<\n NonNullable<IssueManagerFeature[\"fileAdapter\"]>[\"openReference\"]\n >;\n} {\n return typeof fileAdapter?.openReference === \"function\";\n}\n\nexport async function executeIssueManagerUploadReferences(input: {\n fileAdapter: NonNullable<IssueManagerFeature[\"fileAdapter\"]> & {\n requestUpload: NonNullable<\n NonNullable<IssueManagerFeature[\"fileAdapter\"]>[\"requestUpload\"]\n >;\n };\n mode: \"files\" | \"folder\";\n workspaceId: string;\n}): Promise<IssueManagerFileReference[]> {\n const refs = await input.fileAdapter.requestUpload({\n mode: input.mode,\n targetDirectoryPath: \"/\",\n workspaceId: input.workspaceId\n });\n\n if (refs.length === 0) {\n return refs;\n }\n\n await input.fileAdapter.refreshTree?.({\n depth: 1,\n paths: refs.map((ref) => ref.path),\n workspaceId: input.workspaceId\n });\n\n return refs;\n}\n\nexport function resolveIssueManagerReferenceInsertionContent(input: {\n content: string;\n refs: IssueManagerFileReference[];\n}): string {\n const preparedRefs = prepareIssueManagerReferences(input.refs);\n if (preparedRefs.length === 0) {\n return input.content;\n }\n\n return appendIssueManagerWorkspaceFileLinksToContent(\n input.content,\n preparedRefs.map(toIssueManagerWorkspaceFileLinkInput)\n );\n}\n\nexport async function executeIssueManagerAttachReferences(input: {\n backend: IssueManagerFeature[\"backend\"];\n refs: IssueManagerFileReference[];\n selectedIssueId: string | null;\n target: Exclude<IssueManagerReferenceTarget, { mode: \"insert\" }> | null;\n workspaceId: string;\n}): Promise<boolean> {\n const preparedRefs = prepareIssueManagerReferences(input.refs);\n if (!input.target || preparedRefs.length === 0 || !input.selectedIssueId) {\n return false;\n }\n\n await input.backend.addContextRefs(\n input.target.parentKind === \"task\"\n ? {\n issueId: input.selectedIssueId,\n parentKind: \"task\",\n refs: preparedRefs.map(toContextRefInput),\n taskId: input.target.taskId,\n workspaceId: input.workspaceId\n }\n : {\n issueId: input.selectedIssueId,\n parentKind: \"issue\",\n refs: preparedRefs.map(toContextRefInput),\n workspaceId: input.workspaceId\n }\n );\n\n return true;\n}\n\nexport async function executeIssueManagerOpenReference(input: {\n fileAdapter: NonNullable<IssueManagerFeature[\"fileAdapter\"]> & {\n openReference: NonNullable<\n NonNullable<IssueManagerFeature[\"fileAdapter\"]>[\"openReference\"]\n >;\n };\n reference: IssueManagerFileReference;\n}): Promise<void> {\n await input.fileAdapter.openReference(input.reference);\n}\n\nexport async function executeIssueManagerRemoveContextRef(input: {\n backend: IssueManagerFeature[\"backend\"];\n ref: IssueManagerContextRef;\n workspaceId: string;\n}): Promise<void> {\n await input.backend.removeContextRef(\n input.ref.parentKind === \"task\"\n ? {\n contextRefId: input.ref.contextRefId,\n issueId: input.ref.issueId,\n parentKind: \"task\",\n taskId: input.ref.taskId,\n workspaceId: input.workspaceId\n }\n : {\n contextRefId: input.ref.contextRefId,\n issueId: input.ref.issueId,\n parentKind: \"issue\",\n workspaceId: input.workspaceId\n }\n );\n}\n\nfunction prepareIssueManagerReferences(\n refs: IssueManagerFileReference[]\n): IssueManagerFileReference[] {\n return refs.filter((ref) => ref.path.trim().length > 0);\n}\n","import type {\n IssueManagerFileReference,\n IssueManagerNodeState,\n IssueManagerReferenceBundle\n} from \"../../../contracts/index.ts\";\nimport { appendIssueManagerWorkspaceReferenceMentionsToContent } from \"../../../core/index.ts\";\nimport type { IssueManagerReferenceTarget } from \"../model.ts\";\nimport type { IssueDraft, TaskDraft } from \"../controllerTypes.ts\";\nimport { resolveIssueManagerReferenceInsertionContent } from \"./controllerReferenceCommands.ts\";\n\nexport interface IssueManagerReferenceOutcome {\n issueDraft?: (current: IssueDraft) => IssueDraft;\n nodeState?: (current: IssueManagerNodeState) => IssueManagerNodeState;\n referenceTarget?: IssueManagerReferenceTarget | null;\n refreshAll?: boolean;\n refreshDetails?: boolean;\n taskDraft?: (current: TaskDraft) => TaskDraft;\n}\n\nexport function createIssueManagerOpenReferencePickerOutcome(\n target: IssueManagerReferenceTarget\n): IssueManagerReferenceOutcome {\n return {\n referenceTarget: target\n };\n}\n\nexport function createIssueManagerAttachReferencesOutcome(\n attached: boolean\n): IssueManagerReferenceOutcome {\n return {\n referenceTarget: null,\n refreshDetails: attached\n };\n}\n\nexport function createIssueManagerInsertReferencesOutcome(input: {\n refs: IssueManagerFileReference[];\n target: Extract<IssueManagerReferenceTarget, { mode: \"insert\" }>;\n}): IssueManagerReferenceOutcome {\n return input.target.parentKind === \"issue\"\n ? {\n issueDraft: (current) => ({\n ...current,\n content: resolveIssueManagerReferenceInsertionContent({\n content: current.content,\n refs: input.refs\n })\n }),\n referenceTarget: null\n }\n : {\n referenceTarget: null,\n taskDraft: (current) => ({\n ...current,\n content: resolveIssueManagerReferenceInsertionContent({\n content: current.content,\n refs: input.refs\n })\n })\n };\n}\n\n/**\n * 插入模式下确认 picker 的分组结果:松散文件按文件链接追加,项目/分组(bundle)\n * 折叠成单条 `mention://workspace-reference/...` chip 追加,不展开成文件。\n */\nexport function createIssueManagerInsertReferenceBundlesOutcome(input: {\n files: IssueManagerFileReference[];\n bundles: IssueManagerReferenceBundle[];\n target: Extract<IssueManagerReferenceTarget, { mode: \"insert\" }>;\n workspaceId: string;\n}): IssueManagerReferenceOutcome {\n const applyContent = (content: string): string => {\n const withFiles = resolveIssueManagerReferenceInsertionContent({\n content,\n refs: input.files\n });\n return appendIssueManagerWorkspaceReferenceMentionsToContent(\n withFiles,\n input.bundles.map((bundle) => ({\n source: bundle.source,\n id: bundle.id,\n groupId: bundle.groupId,\n displayName: bundle.displayName,\n iconUrl: bundle.iconUrl,\n fileCount: bundle.fileCount,\n workspaceId: input.workspaceId\n }))\n );\n };\n\n return input.target.parentKind === \"issue\"\n ? {\n issueDraft: (current) => ({\n ...current,\n content: applyContent(current.content)\n }),\n referenceTarget: null\n }\n : {\n referenceTarget: null,\n taskDraft: (current) => ({\n ...current,\n content: applyContent(current.content)\n })\n };\n}\n","import type {\n IssueManagerIssueDetail,\n IssueManagerTaskDetail\n} from \"../../contracts/index.ts\";\nimport type { IssueDraft, TaskDraft } from \"./controllerTypes.ts\";\n\nexport type IssueManagerSavePlan<TResult> =\n | {\n kind: \"blocked\";\n notificationKey: \"messages.titleRequired\" | \"messages.topicListEmpty\";\n }\n | ({ kind: \"ready\" } & TResult);\n\nexport function createIssueManagerRunTaskPlan(input: {\n issueDetail: IssueManagerIssueDetail | null;\n providerOverride?: string;\n selectedAgentProvider: string;\n taskDetail: IssueManagerTaskDetail | null;\n}):\n | {\n kind: \"ready\";\n provider: string;\n shouldUpdateSelectedAgentProvider: boolean;\n }\n | { kind: \"skip\" } {\n if (!input.issueDetail) {\n return { kind: \"skip\" };\n }\n\n const provider =\n input.providerOverride?.trim() || input.selectedAgentProvider.trim();\n if (!provider) {\n return { kind: \"skip\" };\n }\n\n return {\n kind: \"ready\",\n provider,\n shouldUpdateSelectedAgentProvider: provider !== input.selectedAgentProvider\n };\n}\n\nexport function createIssueManagerSaveIssuePlan(input: {\n activeTopicId: string | null;\n issueDraft: IssueDraft;\n}): IssueManagerSavePlan<{ activeTopicId: string }> {\n if (!input.activeTopicId) {\n return {\n kind: \"blocked\",\n notificationKey: \"messages.topicListEmpty\"\n };\n }\n\n const title = input.issueDraft.title.trim();\n if (!title) {\n return {\n kind: \"blocked\",\n notificationKey: \"messages.titleRequired\"\n };\n }\n\n return { kind: \"ready\", activeTopicId: input.activeTopicId };\n}\n\nexport function createIssueManagerSaveTaskPlan(input: {\n selectedIssueId: string | null;\n taskDraft: TaskDraft;\n}): IssueManagerSavePlan<{ selectedIssueId: string }> | { kind: \"skip\" } {\n if (!input.selectedIssueId) {\n return { kind: \"skip\" };\n }\n\n const title = input.taskDraft.title.trim();\n if (!title) {\n return {\n kind: \"blocked\",\n notificationKey: \"messages.titleRequired\"\n };\n }\n\n return {\n kind: \"ready\",\n selectedIssueId: input.selectedIssueId\n };\n}\n\nexport function shouldIssueManagerNotifyRunFailure(status: string): boolean {\n return status !== \"completed\";\n}\n","import type {\n IssueManagerEditorMode,\n IssueManagerReferenceTarget\n} from \"../model.ts\";\n\nexport function createIssueManagerAttachReferenceTarget(\n parentKind: \"issue\" | \"task\",\n selectedTaskId: string | null\n): Extract<IssueManagerReferenceTarget, { mode: \"attach\" }> {\n return parentKind === \"task\"\n ? {\n mode: \"attach\",\n parentKind: \"task\",\n taskId: selectedTaskId ?? \"\"\n }\n : {\n mode: \"attach\",\n parentKind: \"issue\"\n };\n}\n\nexport function createIssueManagerInsertReferenceTarget(\n parentKind: \"issue\" | \"task\",\n selectedTaskId: string | null\n): Extract<IssueManagerReferenceTarget, { mode: \"insert\" }> {\n return parentKind === \"task\"\n ? {\n mode: \"insert\",\n parentKind: \"task\",\n taskId: selectedTaskId ?? \"\"\n }\n : {\n mode: \"insert\",\n parentKind: \"issue\"\n };\n}\n\nexport function createIssueManagerAttachReferencesPlan(input: {\n hasFileAdapter: boolean;\n parentKind: \"issue\" | \"task\";\n requestReferencesDirectly: boolean;\n selectedTaskId: string | null;\n}):\n | {\n kind: \"open_picker\";\n target: Extract<IssueManagerReferenceTarget, { mode: \"attach\" }>;\n }\n | {\n kind: \"request_directly\";\n target: Extract<IssueManagerReferenceTarget, { mode: \"attach\" }>;\n }\n | { kind: \"skip\" } {\n if (!input.hasFileAdapter) {\n return { kind: \"skip\" };\n }\n if (input.parentKind === \"task\" && !input.selectedTaskId) {\n return { kind: \"skip\" };\n }\n\n const target = createIssueManagerAttachReferenceTarget(\n input.parentKind,\n input.selectedTaskId\n );\n return input.requestReferencesDirectly\n ? { kind: \"request_directly\", target }\n : { kind: \"open_picker\", target };\n}\n\nexport function createIssueManagerInsertReferencesPlan(input: {\n hasFileAdapter: boolean;\n parentKind: \"issue\" | \"task\";\n requestReferencesDirectly: boolean;\n selectedTaskId: string | null;\n taskEditorMode: IssueManagerEditorMode;\n}):\n | {\n kind: \"open_picker\";\n target: Extract<IssueManagerReferenceTarget, { mode: \"insert\" }>;\n }\n | {\n kind: \"request_directly\";\n target: Extract<IssueManagerReferenceTarget, { mode: \"insert\" }>;\n }\n | { kind: \"skip\" } {\n if (!input.hasFileAdapter) {\n return { kind: \"skip\" };\n }\n if (\n input.parentKind === \"task\" &&\n !input.selectedTaskId &&\n input.taskEditorMode !== \"create\"\n ) {\n return { kind: \"skip\" };\n }\n\n const target = createIssueManagerInsertReferenceTarget(\n input.parentKind,\n input.selectedTaskId\n );\n return input.requestReferencesDirectly\n ? { kind: \"request_directly\", target }\n : { kind: \"open_picker\", target };\n}\n","import type {\n IssueManagerIssueDetail,\n IssueManagerTaskDetail\n} from \"../../../contracts/index.ts\";\nimport type { IssueManagerFeature } from \"../../../core/index.ts\";\n\nexport async function executeIssueManagerRunTask(input: {\n executionDirectory?: string | null;\n feature: IssueManagerFeature;\n issue: IssueManagerIssueDetail[\"issue\"];\n provider: string;\n task?: IssueManagerTaskDetail[\"task\"];\n workspaceId: string;\n}): Promise<{ errorMessage?: string; status: string }> {\n const result = await input.feature.agentRunner.runTask({\n ...(input.executionDirectory?.trim()\n ? { executionDirectory: input.executionDirectory.trim() }\n : {}),\n issue: input.issue,\n provider: input.provider,\n ...(input.task ? { task: input.task } : {}),\n workspaceId: input.workspaceId\n });\n\n return {\n ...(result.errorMessage?.trim()\n ? { errorMessage: result.errorMessage.trim() }\n : {}),\n status: result.status\n };\n}\n","import type {\n IssueManagerContextRef,\n IssueManagerFileReference,\n IssueManagerIssueDetail,\n IssueManagerIssueSummary,\n IssueManagerTaskDetail,\n IssueManagerTaskSummary\n} from \"../../../contracts/index.ts\";\nimport {\n extractIssueManagerWorkspaceFileLinksFromContent,\n normalizeIssueManagerContent,\n type IssueManagerFeature\n} from \"../../../core/index.ts\";\nimport type { IssueManagerEditorMode } from \"../model.ts\";\nimport type { IssueDraft, TaskDraft } from \"../controllerTypes.ts\";\n\nexport async function executeIssueManagerSaveIssue(input: {\n activeTopicId: string;\n feature: IssueManagerFeature;\n issueDetail: IssueManagerIssueDetail | null;\n issueDraft: IssueDraft;\n issueEditorMode: IssueManagerEditorMode;\n selectedIssueId: string | null;\n workspaceId: string;\n}): Promise<{\n addedContextRefs: IssueManagerFileReference[];\n content: string;\n removedContextRefs: IssueManagerContextRef[];\n savedIssue: IssueManagerIssueSummary;\n}> {\n const content = normalizeIssueManagerContent(input.issueDraft.content);\n const savedIssue =\n input.issueEditorMode === \"create\"\n ? await input.feature.backend.createIssue({\n content,\n title: input.issueDraft.title.trim(),\n topicId: input.activeTopicId,\n workspaceId: input.workspaceId\n })\n : await input.feature.backend.updateIssue({\n content,\n issueId: input.selectedIssueId ?? \"\",\n title: input.issueDraft.title.trim(),\n workspaceId: input.workspaceId\n });\n\n const { addedContextRefs, removedContextRefs } =\n await syncIssueManagerContentReferences({\n backend: input.feature.backend,\n content,\n existingRefs:\n input.issueEditorMode === \"create\"\n ? []\n : (input.issueDetail?.contextRefs.filter(\n (ref) => ref.parentKind === \"issue\"\n ) ?? []),\n issueId: savedIssue.issueId,\n parentKind: \"issue\",\n previousContent:\n input.issueEditorMode === \"create\"\n ? \"\"\n : (input.issueDetail?.issue.content ?? \"\"),\n workspaceId: input.workspaceId\n });\n\n return {\n addedContextRefs,\n content,\n removedContextRefs,\n savedIssue\n };\n}\n\nexport async function executeIssueManagerSaveTask(input: {\n feature: IssueManagerFeature;\n selectedIssueId: string;\n selectedTaskId: string | null;\n taskDetail: IssueManagerTaskDetail | null;\n taskDraft: TaskDraft;\n taskEditorMode: IssueManagerEditorMode;\n workspaceId: string;\n}): Promise<{\n addedContextRefs: IssueManagerFileReference[];\n content: string;\n removedContextRefs: IssueManagerContextRef[];\n savedTask: IssueManagerTaskSummary;\n}> {\n const content = normalizeIssueManagerContent(input.taskDraft.content);\n const savedTask =\n input.taskEditorMode === \"create\"\n ? await input.feature.backend.createTask({\n content,\n issueId: input.selectedIssueId,\n priority: input.taskDraft.priority,\n title: input.taskDraft.title.trim(),\n workspaceId: input.workspaceId\n })\n : await input.feature.backend.updateTask({\n content,\n issueId: input.selectedIssueId,\n priority: input.taskDraft.priority,\n taskId: input.selectedTaskId ?? \"\",\n title: input.taskDraft.title.trim(),\n workspaceId: input.workspaceId\n });\n\n const { addedContextRefs, removedContextRefs } =\n await syncIssueManagerContentReferences({\n backend: input.feature.backend,\n content,\n existingRefs:\n input.taskEditorMode === \"create\"\n ? []\n : (input.taskDetail?.contextRefs.filter(\n (ref) => ref.parentKind === \"task\"\n ) ?? []),\n issueId: input.selectedIssueId,\n parentKind: \"task\",\n previousContent:\n input.taskEditorMode === \"create\"\n ? \"\"\n : (input.taskDetail?.task.content ?? \"\"),\n taskId: savedTask.taskId,\n workspaceId: input.workspaceId\n });\n\n return {\n addedContextRefs,\n content,\n removedContextRefs,\n savedTask\n };\n}\n\ninterface IssueManagerContentReferenceSyncResult {\n addedContextRefs: IssueManagerFileReference[];\n removedContextRefs: IssueManagerContextRef[];\n}\n\nasync function syncIssueManagerContentReferences(input: {\n backend: IssueManagerFeature[\"backend\"];\n content: string;\n existingRefs: IssueManagerContextRef[];\n issueId: string;\n parentKind: \"issue\" | \"task\";\n previousContent: string;\n taskId?: string;\n workspaceId: string;\n}): Promise<IssueManagerContentReferenceSyncResult> {\n const existingPaths = new Set(\n input.existingRefs\n .map((ref) => ref.path.trim())\n .filter((path) => path.length > 0)\n );\n const contentRefs = extractIssueManagerWorkspaceFileLinksFromContent(\n input.content\n );\n const contentPaths = new Set(\n contentRefs.map((ref) => ref.path.trim()).filter((path) => path.length > 0)\n );\n const previousContentPaths = new Set(\n extractIssueManagerWorkspaceFileLinksFromContent(input.previousContent)\n .map((ref) => ref.path.trim())\n .filter((path) => path.length > 0)\n );\n const addedContextRefs = contentRefs.filter((ref) => {\n const path = ref.path.trim();\n return path.length > 0 && !existingPaths.has(path);\n });\n const removedContextRefs = input.existingRefs.filter((ref) => {\n const path = ref.path.trim();\n return previousContentPaths.has(path) && !contentPaths.has(path);\n });\n const missingRefs = addedContextRefs.map((ref) => ({\n displayName: ref.name,\n path: ref.path,\n refType: ref.kind\n }));\n\n if (missingRefs.length > 0) {\n await input.backend.addContextRefs(\n input.parentKind === \"task\"\n ? {\n issueId: input.issueId,\n parentKind: \"task\",\n refs: missingRefs,\n taskId: input.taskId ?? \"\",\n workspaceId: input.workspaceId\n }\n : {\n issueId: input.issueId,\n parentKind: \"issue\",\n refs: missingRefs,\n workspaceId: input.workspaceId\n }\n );\n }\n\n for (const ref of removedContextRefs) {\n await input.backend.removeContextRef(\n ref.parentKind === \"task\"\n ? {\n contextRefId: ref.contextRefId,\n issueId: ref.issueId,\n parentKind: \"task\",\n taskId: ref.taskId,\n workspaceId: input.workspaceId\n }\n : {\n contextRefId: ref.contextRefId,\n issueId: ref.issueId,\n parentKind: \"issue\",\n workspaceId: input.workspaceId\n }\n );\n }\n\n return {\n addedContextRefs: addedContextRefs.map((ref) => ({\n displayName: ref.name,\n kind: ref.kind,\n path: ref.path\n })),\n removedContextRefs\n };\n}\n","import type { IssueManagerFeature } from \"../../../core/index.ts\";\n\nexport function canIssueManagerCreateShareLink(\n shareAdapter: IssueManagerFeature[\"shareAdapter\"]\n): shareAdapter is NonNullable<IssueManagerFeature[\"shareAdapter\"]> & {\n createIssueLink: NonNullable<\n NonNullable<IssueManagerFeature[\"shareAdapter\"]>[\"createIssueLink\"]\n >;\n} {\n return typeof shareAdapter?.createIssueLink === \"function\";\n}\n\nexport async function executeIssueManagerShareSelection(input: {\n issueId: string;\n shareAdapter: NonNullable<IssueManagerFeature[\"shareAdapter\"]> & {\n createIssueLink: NonNullable<\n NonNullable<IssueManagerFeature[\"shareAdapter\"]>[\"createIssueLink\"]\n >;\n };\n taskId: string | null;\n workspaceId: string;\n}): Promise<void> {\n const link = await input.shareAdapter.createIssueLink({\n issueId: input.issueId,\n taskId: input.taskId ?? undefined,\n workspaceId: input.workspaceId\n });\n if (typeof navigator === \"undefined\" || !navigator.clipboard?.writeText) {\n throw new Error(\"issue_manager.clipboard_unavailable\");\n }\n await navigator.clipboard.writeText(link);\n}\n","import type { IssueManagerFileReference } from \"../../contracts/index.ts\";\nimport {\n extractIssueManagerWorkspaceFileLinksFromContent,\n type IssueManagerFeature\n} from \"../../core/index.ts\";\n\nexport function trackIssueManagerAnalytics(\n feature: IssueManagerFeature,\n event: Parameters<NonNullable<IssueManagerFeature[\"analytics\"]>[\"track\"]>[0]\n): void {\n void Promise.resolve(feature.analytics?.track(event)).catch(() => undefined);\n}\n\nexport function trackIssueManagerContextRefsAdded(input: {\n feature: IssueManagerFeature;\n refs: readonly IssueManagerFileReference[];\n targetType: \"issue\" | \"task\";\n}): void {\n const seen = new Set<string>();\n for (const ref of input.refs) {\n const path = ref.path.trim();\n if (!path || seen.has(path)) {\n continue;\n }\n seen.add(path);\n trackIssueManagerAnalytics(input.feature, {\n name: \"issue_manager.context_ref_added\",\n params: {\n refType: issueManagerAnalyticsRefType(ref.kind),\n targetType: input.targetType\n }\n });\n }\n}\n\nexport function trackIssueManagerContentReferenceChanges(input: {\n feature: IssueManagerFeature;\n nextContent: string;\n previousContent: string;\n targetType: \"issue\" | \"task\";\n}): void {\n const previousRefs = extractIssueManagerWorkspaceFileLinksFromContent(\n input.previousContent\n );\n const nextRefs = extractIssueManagerWorkspaceFileLinksFromContent(\n input.nextContent\n );\n const previousPaths = new Set(\n previousRefs.map((ref) => ref.path.trim()).filter(Boolean)\n );\n const nextPaths = new Set(\n nextRefs.map((ref) => ref.path.trim()).filter(Boolean)\n );\n\n trackIssueManagerContextRefsAdded({\n feature: input.feature,\n refs: nextRefs.filter((ref) => !previousPaths.has(ref.path.trim())),\n targetType: input.targetType\n });\n\n for (const path of previousPaths) {\n if (nextPaths.has(path)) {\n continue;\n }\n trackIssueManagerAnalytics(input.feature, {\n name: \"issue_manager.context_ref_removed\",\n params: {\n targetType: input.targetType\n }\n });\n }\n}\n\nfunction issueManagerAnalyticsRefType(\n kind: IssueManagerFileReference[\"kind\"]\n): \"directory\" | \"file\" | \"upload\" {\n return kind === \"folder\" ? \"directory\" : \"file\";\n}\n","import type { Dispatch, SetStateAction } from \"react\";\nimport type {\n IssueManagerContextRef,\n IssueManagerFileReference,\n IssueManagerIssueDetail,\n IssueManagerReferenceBundle,\n IssueManagerRun,\n IssueManagerNodeState,\n IssueManagerStatus,\n IssueManagerTaskDetail,\n IssueManagerTaskSummary,\n IssueManagerTaskStatusUpdate\n} from \"../../contracts/index.ts\";\nimport {\n extractIssueManagerWorkspaceFileLinksFromContent,\n type IssueManagerFeature\n} from \"../../core/index.ts\";\nimport type { IssueManagerI18nRuntime } from \"../../i18n/issueManagerI18n.ts\";\nimport type {\n IssueManagerEditorMode,\n IssueManagerReferenceTarget\n} from \"./model.ts\";\nimport {\n applyIssueManagerControllerOutcome,\n createIssueManagerRunTaskSuccessOutcome,\n createIssueManagerSaveIssueSuccessOutcome,\n createIssueManagerSaveTaskSuccessOutcome,\n type IssueManagerControllerOutcome\n} from \"./controllerOutcomes.ts\";\nimport {\n createIssueManagerAttachReferencesOutcome,\n createIssueManagerInsertReferenceBundlesOutcome,\n createIssueManagerInsertReferencesOutcome,\n createIssueManagerOpenReferencePickerOutcome\n} from \"./reference/controllerReferenceOutcomes.ts\";\nimport {\n createIssueManagerRunTaskPlan,\n createIssueManagerSaveIssuePlan,\n createIssueManagerSaveTaskPlan\n} from \"./controllerPlans.ts\";\nimport {\n createIssueManagerAttachReferencesPlan,\n createIssueManagerInsertReferenceTarget,\n createIssueManagerInsertReferencesPlan\n} from \"./reference/controllerReferencePlans.ts\";\nimport {\n canIssueManagerOpenReferences,\n canIssueManagerRequestReferencesDirectly,\n canIssueManagerUploadReferences,\n executeIssueManagerAttachReferences,\n executeIssueManagerOpenReference,\n executeIssueManagerRequestReferences,\n executeIssueManagerRemoveContextRef,\n executeIssueManagerUploadReferences\n} from \"./reference/controllerReferenceCommands.ts\";\nimport { executeIssueManagerRunTask } from \"./run/controllerRunCommands.ts\";\nimport {\n executeIssueManagerSaveIssue,\n executeIssueManagerSaveTask\n} from \"./save/controllerSaveCommands.ts\";\nimport {\n canIssueManagerCreateShareLink,\n executeIssueManagerShareSelection\n} from \"./share/controllerShareCommands.ts\";\nimport type {\n IssueDraft,\n IssueManagerNotificationTone,\n TaskDraft\n} from \"./controllerTypes.ts\";\nimport {\n confirmIssueManagerMessage,\n defaultTaskPriority,\n resolveIssueManagerErrorMessage\n} from \"./controllerUtils.ts\";\nimport {\n applyIssueManagerIssueDeleted,\n applyIssueManagerSelectedAgentProvider,\n applyIssueManagerSelectedExecutionDirectory,\n applyIssueManagerTaskDeleted\n} from \"./controllerState.ts\";\nimport {\n trackIssueManagerAnalytics,\n trackIssueManagerContextRefsAdded\n} from \"./controllerAnalytics.ts\";\n\ninterface CreateIssueManagerControllerActionsInput {\n copy: IssueManagerI18nRuntime;\n feature: IssueManagerFeature;\n issueDetail: {\n value: IssueManagerIssueDetail | null;\n };\n issueDraft: IssueDraft;\n issueEditorMode: IssueManagerEditorMode;\n nodeState: IssueManagerNodeState;\n referenceTarget: IssueManagerReferenceTarget | null;\n refreshAll: () => void;\n refreshDetails: () => void;\n setNotification: (input: {\n title: string;\n tone?: IssueManagerNotificationTone;\n }) => void;\n setIsRunningTask: Dispatch<SetStateAction<boolean>>;\n setIssueDraftInternal: Dispatch<SetStateAction<IssueDraft>>;\n setIssueEditorModeState: Dispatch<SetStateAction<IssueManagerEditorMode>>;\n setReferenceTarget: Dispatch<\n SetStateAction<IssueManagerReferenceTarget | null>\n >;\n setTaskDraftInternal: Dispatch<SetStateAction<TaskDraft>>;\n setTaskEditorModeState: Dispatch<SetStateAction<IssueManagerEditorMode>>;\n taskDetail: {\n value: IssueManagerTaskDetail | null;\n };\n taskDraft: TaskDraft;\n taskEditorMode: IssueManagerEditorMode;\n updateNodeState: (\n updater:\n | Partial<IssueManagerNodeState>\n | ((current: IssueManagerNodeState) => IssueManagerNodeState)\n ) => void;\n workspaceId: string;\n}\n\ninterface IssueManagerDeleteOptions {\n skipConfirmation?: boolean;\n}\n\nexport interface IssueManagerMoveTaskInput {\n targetIndex: number;\n targetStatus: IssueManagerStatus;\n taskId: string;\n visibleTaskIds?: readonly string[];\n}\n\nexport type { IssueManagerDeleteOptions };\n\nfunction resolveIssueManagerTaskStatusBucket(\n status: IssueManagerStatus\n): string {\n return status;\n}\n\nfunction resolveIssueManagerMovedTaskOrder(input: {\n targetIndex: number;\n targetStatus: IssueManagerStatus;\n taskId: string;\n tasks: readonly IssueManagerTaskSummary[];\n}): IssueManagerTaskSummary[] | null {\n const normalizedTaskId = input.taskId.trim();\n const targetStatus = resolveIssueManagerTaskStatusBucket(input.targetStatus);\n const sourceTask = input.tasks.find(\n (task) => task.taskId === normalizedTaskId\n );\n if (!sourceTask || !targetStatus) {\n return null;\n }\n\n const tasksWithoutMoved = input.tasks.filter(\n (task) => task.taskId !== normalizedTaskId\n );\n const targetTasks = tasksWithoutMoved.filter(\n (task) => resolveIssueManagerTaskStatusBucket(task.status) === targetStatus\n );\n const targetIndex = Math.min(\n Math.max(0, Math.trunc(input.targetIndex)),\n targetTasks.length\n );\n const targetTaskAtIndex = targetTasks[targetIndex];\n const previousTargetTask = targetTasks[targetIndex - 1];\n const sourceStatus =\n resolveIssueManagerTaskStatusBucket(sourceTask.status) === targetStatus\n ? sourceTask.status\n : input.targetStatus;\n const nextTask = {\n ...sourceTask,\n status: sourceStatus\n };\n const insertIndex = targetTaskAtIndex\n ? tasksWithoutMoved.findIndex(\n (task) => task.taskId === targetTaskAtIndex.taskId\n )\n : previousTargetTask\n ? tasksWithoutMoved.findIndex(\n (task) => task.taskId === previousTargetTask.taskId\n ) + 1\n : tasksWithoutMoved.length;\n\n const normalizedInsertIndex =\n insertIndex < 0 ? tasksWithoutMoved.length : insertIndex;\n return [\n ...tasksWithoutMoved.slice(0, normalizedInsertIndex),\n nextTask,\n ...tasksWithoutMoved.slice(normalizedInsertIndex)\n ];\n}\n\n/**\n * Resolves the execution directory (project path) to run a task/breakdown in.\n *\n * The user's explicit per-issue selection (`selectedExecutionDirectory`)\n * always wins. Otherwise this falls back to the same remembered \"default\n * project\" that ad-hoc new agent-GUI sessions use, so a task run/breakdown\n * launched without the user ever touching the execution-directory picker\n * still gets associated with a real project instead of silently landing in\n * the agent runtime's internal session-storage directory (which then shows\n * up as the session's project path in both the session window and the\n * message center).\n */\nasync function resolveIssueManagerExecutionDirectory(input: {\n feature: IssueManagerFeature;\n selectedExecutionDirectory: string | null | undefined;\n}): Promise<string | null> {\n const selected = input.selectedExecutionDirectory?.trim();\n if (selected) {\n return selected;\n }\n try {\n const defaultSelection =\n await input.feature.executionDirectoryPicker?.service?.getDefaultSelection?.();\n return defaultSelection?.path?.trim() || null;\n } catch {\n return null;\n }\n}\n\nexport function createIssueManagerControllerActions(\n input: CreateIssueManagerControllerActionsInput\n) {\n const {\n copy,\n feature,\n issueDetail,\n issueDraft,\n issueEditorMode,\n nodeState,\n referenceTarget,\n refreshAll,\n refreshDetails,\n setNotification,\n setIsRunningTask,\n setIssueDraftInternal,\n setIssueEditorModeState,\n setReferenceTarget,\n setTaskDraftInternal,\n setTaskEditorModeState,\n taskDetail,\n taskDraft,\n taskEditorMode,\n updateNodeState,\n workspaceId\n } = input;\n\n const notifyTip = (\n message: string,\n tone: IssueManagerNotificationTone = \"destructive\"\n ) => {\n setNotification({\n title: message,\n tone\n });\n };\n\n const notifyError = (error: unknown, fallbackKey: string) => {\n setNotification({\n title: resolveIssueManagerErrorMessage(error, copy, fallbackKey),\n tone: \"destructive\"\n });\n };\n\n const applyOutcome = (outcome: IssueManagerControllerOutcome) => {\n applyIssueManagerControllerOutcome({\n notify: notifyTip,\n outcome,\n refreshAll,\n refreshDetails,\n setIssueDraftInternal,\n setIssueEditorModeState,\n setReferenceTarget: (target) => setReferenceTarget(target),\n setTaskDraftInternal,\n setTaskEditorModeState,\n translate: (key) => copy.t(key),\n updateNodeState\n });\n };\n\n const submitReferences = async (\n refs: IssueManagerFileReference[],\n target: IssueManagerReferenceTarget | null = referenceTarget\n ) => {\n if (!target) {\n applyOutcome({\n referenceTarget: null\n });\n return;\n }\n\n if (target.mode === \"insert\") {\n applyOutcome(\n createIssueManagerInsertReferencesOutcome({\n refs,\n target\n })\n );\n trackIssueManagerContextRefsAdded({\n feature,\n refs,\n targetType: target.parentKind\n });\n return;\n }\n\n const attached = await executeIssueManagerAttachReferences({\n backend: feature.backend,\n refs,\n selectedIssueId: nodeState.selectedIssueId,\n target,\n workspaceId\n });\n if (attached) {\n trackIssueManagerContextRefsAdded({\n feature,\n refs,\n targetType: target.parentKind\n });\n }\n applyOutcome(createIssueManagerAttachReferencesOutcome(attached));\n };\n\n const updateTaskStatus = async (\n taskId: string | null | undefined,\n status: IssueManagerTaskStatusUpdate,\n options: { selectTaskOnSuccess: boolean }\n ) => {\n const selectedIssueId = nodeState.selectedIssueId;\n const normalizedTaskId = taskId?.trim() ?? \"\";\n if (!selectedIssueId || !normalizedTaskId) {\n return;\n }\n\n try {\n const task = await feature.backend.updateTask({\n issueId: selectedIssueId,\n status,\n taskId: normalizedTaskId,\n workspaceId\n });\n applyOutcome(\n options.selectTaskOnSuccess\n ? createIssueManagerSaveTaskSuccessOutcome(task.taskId)\n : {\n refreshAll: true\n }\n );\n } catch (error) {\n notifyError(error, \"messages.taskSaveFailed\");\n }\n };\n\n return {\n async attachReferences(parentKind: \"issue\" | \"task\") {\n const fileAdapter = feature.fileAdapter;\n const attachPlan = createIssueManagerAttachReferencesPlan({\n hasFileAdapter: Boolean(fileAdapter),\n parentKind,\n requestReferencesDirectly:\n canIssueManagerRequestReferencesDirectly(fileAdapter),\n selectedTaskId: nodeState.selectedTaskId\n });\n if (attachPlan.kind === \"skip\") {\n return;\n }\n if (attachPlan.kind === \"request_directly\") {\n if (!canIssueManagerRequestReferencesDirectly(fileAdapter)) {\n return;\n }\n const refs = await executeIssueManagerRequestReferences({\n fileAdapter,\n workspaceId\n });\n await submitReferences(refs, attachPlan.target);\n return;\n }\n\n applyOutcome(\n createIssueManagerOpenReferencePickerOutcome(attachPlan.target)\n );\n },\n\n createTaskDraft() {\n setTaskEditorModeState(\"create\");\n setTaskDraftInternal({\n content: nodeState.taskDraftContent ?? \"\",\n priority: defaultTaskPriority,\n title: nodeState.taskDraftTitle ?? \"\"\n });\n updateNodeState((current) => ({\n ...current,\n selectedTaskId: null\n }));\n },\n\n async deleteIssue(options?: IssueManagerDeleteOptions) {\n const selectedIssueId = nodeState.selectedIssueId;\n if (\n !selectedIssueId ||\n (options?.skipConfirmation !== true &&\n !confirmIssueManagerMessage(copy.t(\"confirmations.deleteIssue\")))\n ) {\n return;\n }\n try {\n await feature.backend.deleteIssue({\n issueId: selectedIssueId,\n workspaceId\n });\n trackIssueManagerAnalytics(feature, {\n name: \"issue_manager.issue_deleted\",\n params: { issueId: selectedIssueId }\n });\n setIssueEditorModeState(\"read\");\n setTaskEditorModeState(\"read\");\n updateNodeState((current) => applyIssueManagerIssueDeleted(current));\n refreshAll();\n } catch (error) {\n notifyError(error, \"messages.issueDeleteFailed\");\n }\n },\n\n async deleteTask(options?: IssueManagerDeleteOptions) {\n const selectedIssueId = nodeState.selectedIssueId;\n const selectedTaskId = nodeState.selectedTaskId;\n if (\n !selectedIssueId ||\n !selectedTaskId ||\n (options?.skipConfirmation !== true &&\n !confirmIssueManagerMessage(copy.t(\"confirmations.deleteTask\")))\n ) {\n return;\n }\n\n try {\n await feature.backend.deleteTask({\n issueId: selectedIssueId,\n taskId: selectedTaskId,\n workspaceId\n });\n trackIssueManagerAnalytics(feature, {\n name: \"issue_manager.task_deleted\",\n params: { issueId: selectedIssueId, taskId: selectedTaskId }\n });\n setTaskEditorModeState(\"read\");\n updateNodeState((current) => applyIssueManagerTaskDeleted(current));\n refreshAll();\n } catch (error) {\n notifyError(error, \"messages.taskDeleteFailed\");\n }\n },\n\n async insertReferences(parentKind: \"issue\" | \"task\") {\n const fileAdapter = feature.fileAdapter;\n const insertPlan = createIssueManagerInsertReferencesPlan({\n hasFileAdapter: Boolean(fileAdapter),\n parentKind,\n requestReferencesDirectly:\n canIssueManagerRequestReferencesDirectly(fileAdapter),\n selectedTaskId: nodeState.selectedTaskId,\n taskEditorMode\n });\n if (insertPlan.kind === \"skip\") {\n return;\n }\n if (insertPlan.kind === \"request_directly\") {\n if (!canIssueManagerRequestReferencesDirectly(fileAdapter)) {\n return;\n }\n const refs = await executeIssueManagerRequestReferences({\n fileAdapter,\n workspaceId\n });\n await submitReferences(refs, insertPlan.target);\n return;\n }\n\n applyOutcome(\n createIssueManagerOpenReferencePickerOutcome(insertPlan.target)\n );\n },\n\n async moveTask(move: IssueManagerMoveTaskInput) {\n const selectedIssueId = nodeState.selectedIssueId;\n const normalizedTaskId = move.taskId.trim();\n const allTasks = issueDetail.value?.tasks ?? [];\n const visibleTaskIds = new Set(\n move.visibleTaskIds\n ?.map((taskId) => taskId.trim())\n .filter((taskId) => taskId.length > 0)\n );\n const currentTasks =\n visibleTaskIds.size > 0\n ? allTasks.filter((task) => visibleTaskIds.has(task.taskId))\n : allTasks;\n if (!selectedIssueId || !normalizedTaskId || currentTasks.length === 0) {\n return;\n }\n\n const nextTasks = resolveIssueManagerMovedTaskOrder({\n targetIndex: move.targetIndex,\n targetStatus: move.targetStatus,\n taskId: normalizedTaskId,\n tasks: currentTasks\n });\n if (!nextTasks) {\n return;\n }\n const nextVisibleTasks = [...nextTasks];\n const orderedTasks =\n visibleTaskIds.size > 0\n ? allTasks.map((task) =>\n visibleTaskIds.has(task.taskId)\n ? (nextVisibleTasks.shift() ?? task)\n : task\n )\n : nextTasks;\n\n const previousById = new Map(\n allTasks.map((task, index) => [\n task.taskId,\n {\n sortIndex: task.sortIndex ?? index + 1,\n status: task.status\n }\n ])\n );\n const updates = orderedTasks\n .map((task, index) => {\n const previous = previousById.get(task.taskId);\n const sortIndex = index + 1;\n if (\n previous &&\n previous.sortIndex === sortIndex &&\n previous.status === task.status\n ) {\n return null;\n }\n return {\n sortIndex,\n status: task.status,\n taskId: task.taskId\n };\n })\n .filter(\n (\n update\n ): update is {\n sortIndex: number;\n status: IssueManagerStatus;\n taskId: string;\n } => update !== null\n );\n if (updates.length === 0) {\n return;\n }\n\n try {\n await Promise.all(\n updates.map((update) =>\n feature.backend.updateTask({\n issueId: selectedIssueId,\n sortIndex: update.sortIndex,\n status: update.status,\n taskId: update.taskId,\n workspaceId\n })\n )\n );\n applyOutcome({\n refreshAll: true\n });\n } catch (error) {\n notifyError(error, \"messages.taskSaveFailed\");\n }\n },\n\n async uploadReferences(\n parentKind: \"issue\" | \"task\",\n mode: \"files\" | \"folder\"\n ) {\n const fileAdapter = feature.fileAdapter;\n if (!canIssueManagerUploadReferences(fileAdapter)) {\n return;\n }\n\n const refs = await executeIssueManagerUploadReferences({\n fileAdapter,\n mode,\n workspaceId\n });\n if (refs.length === 0) {\n return;\n }\n await submitReferences(\n refs,\n createIssueManagerInsertReferenceTarget(\n parentKind,\n nodeState.selectedTaskId\n )\n );\n },\n\n async openReference(reference: IssueManagerFileReference) {\n const fileAdapter = feature.fileAdapter;\n if (!canIssueManagerOpenReferences(fileAdapter)) {\n return;\n }\n\n await executeIssueManagerOpenReference({\n fileAdapter,\n reference\n });\n },\n\n async openAgentSession(run: IssueManagerRun) {\n const agentSessionId = run.agentSessionId?.trim() ?? \"\";\n if (!agentSessionId || !feature.agentSessionOpener?.openSession) {\n return;\n }\n\n try {\n await feature.agentSessionOpener.openSession({\n agentSessionId,\n provider: run.agentProvider,\n workspaceId\n });\n } catch (error) {\n notifyTip(\n resolveIssueManagerErrorMessage(\n error,\n copy,\n \"messages.agentSessionOpenFailed\"\n )\n );\n }\n },\n\n async removeContextRef(ref: IssueManagerContextRef) {\n try {\n await executeIssueManagerRemoveContextRef({\n backend: feature.backend,\n ref,\n workspaceId\n });\n trackIssueManagerAnalytics(feature, {\n name: \"issue_manager.context_ref_removed\",\n params: {\n targetType: ref.parentKind\n }\n });\n refreshDetails();\n } catch (error) {\n notifyError(error, \"messages.referenceRemoveFailed\");\n }\n },\n\n async useExecutionDirectory(path: string | null) {\n const executionDirectory = path?.trim() || null;\n updateNodeState((current) =>\n applyIssueManagerSelectedExecutionDirectory(current, executionDirectory)\n );\n if (!executionDirectory) {\n return;\n }\n\n try {\n await feature.executionDirectoryPicker?.use?.({\n path: executionDirectory\n });\n } catch {\n // The selected directory is still valid even if recency tracking fails.\n }\n },\n\n async runTask(providerOverride?: string) {\n const runPlan = createIssueManagerRunTaskPlan({\n issueDetail: issueDetail.value,\n providerOverride,\n selectedAgentProvider: nodeState.selectedAgentProvider,\n taskDetail: taskDetail.value\n });\n if (runPlan.kind !== \"ready\") {\n return;\n }\n const currentIssueDetail = issueDetail.value;\n const currentTaskDetail = taskDetail.value;\n if (!currentIssueDetail) {\n return;\n }\n if (runPlan.shouldUpdateSelectedAgentProvider) {\n updateNodeState((current) =>\n applyIssueManagerSelectedAgentProvider(current, runPlan.provider)\n );\n }\n\n setIsRunningTask(true);\n try {\n const executionDirectory = await resolveIssueManagerExecutionDirectory({\n feature,\n selectedExecutionDirectory: nodeState.selectedExecutionDirectory\n });\n trackIssueManagerAnalytics(feature, {\n name: \"issue_manager.task_run_initiated\",\n params: {\n hasExecutionDirectory: Boolean(executionDirectory),\n issueId: currentIssueDetail.issue.issueId,\n provider: runPlan.provider,\n taskId: currentTaskDetail?.task.taskId ?? null\n }\n });\n const result = await executeIssueManagerRunTask({\n feature,\n issue: currentIssueDetail.issue,\n provider: runPlan.provider,\n executionDirectory,\n task: currentTaskDetail?.task,\n workspaceId\n });\n const outcome = createIssueManagerRunTaskSuccessOutcome({\n status: result.status\n });\n if (outcome.notificationKey && result.errorMessage?.trim()) {\n notifyTip(result.errorMessage.trim());\n } else {\n applyOutcome(outcome);\n }\n } catch (error) {\n notifyTip(\n resolveIssueManagerErrorMessage(error, copy, \"messages.runFailed\")\n );\n } finally {\n setIsRunningTask(false);\n refreshDetails();\n }\n },\n\n async startTaskBreakdown(providerOverride?: string) {\n const breakdownPlan = createIssueManagerRunTaskPlan({\n issueDetail: issueDetail.value,\n providerOverride,\n selectedAgentProvider: nodeState.selectedAgentProvider,\n taskDetail: taskDetail.value\n });\n if (breakdownPlan.kind !== \"ready\") {\n return;\n }\n const currentIssueDetail = issueDetail.value;\n if (!currentIssueDetail) {\n return;\n }\n const breakdownLauncher = feature.agentBreakdownLauncher;\n if (!breakdownLauncher) {\n notifyTip(copy.t(\"messages.breakdownUnavailable\"));\n return;\n }\n if (breakdownPlan.shouldUpdateSelectedAgentProvider) {\n updateNodeState((current) =>\n applyIssueManagerSelectedAgentProvider(\n current,\n breakdownPlan.provider\n )\n );\n }\n\n setIsRunningTask(true);\n try {\n const executionDirectory = await resolveIssueManagerExecutionDirectory({\n feature,\n selectedExecutionDirectory: nodeState.selectedExecutionDirectory\n });\n trackIssueManagerAnalytics(feature, {\n name: \"issue_manager.issue_breakdown_initiated\",\n params: {\n issueId: currentIssueDetail.issue.issueId,\n provider: breakdownPlan.provider\n }\n });\n const result = await breakdownLauncher.startBreakdown({\n ...(executionDirectory ? { executionDirectory } : {}),\n issueDetail: currentIssueDetail,\n provider: breakdownPlan.provider,\n workspaceId\n });\n if (result.status === \"failed\") {\n notifyTip(\n result.errorMessage || copy.t(\"messages.breakdownOpenFailed\")\n );\n }\n } catch (error) {\n notifyTip(\n resolveIssueManagerErrorMessage(\n error,\n copy,\n \"messages.breakdownOpenFailed\"\n )\n );\n } finally {\n setIsRunningTask(false);\n }\n },\n\n async saveIssue() {\n const savePlan = createIssueManagerSaveIssuePlan({\n activeTopicId: nodeState.activeTopicId ?? null,\n issueDraft\n });\n if (savePlan.kind === \"blocked\") {\n notifyTip(copy.t(savePlan.notificationKey));\n return;\n }\n\n try {\n const wasCreate = issueEditorMode === \"create\";\n const { content, removedContextRefs, savedIssue } =\n await executeIssueManagerSaveIssue({\n activeTopicId: savePlan.activeTopicId,\n feature,\n issueDetail: issueDetail.value,\n issueDraft,\n issueEditorMode,\n selectedIssueId: nodeState.selectedIssueId,\n workspaceId\n });\n if (wasCreate) {\n trackIssueManagerAnalytics(feature, {\n name: \"issue_manager.issue_created\",\n params: { issueId: savedIssue.issueId }\n });\n } else {\n trackIssueManagerAnalytics(feature, {\n name: \"issue_manager.issue_saved\",\n params: {\n contextRefCount: countIssueManagerContextRefs({\n content,\n refs: removeIssueManagerContextRefsFromCount(\n issueDetail.value?.contextRefs.filter(\n (ref) => ref.parentKind === \"issue\"\n ),\n removedContextRefs\n )\n }),\n hasDescription: hasIssueManagerDescription(content),\n issueId: savedIssue.issueId,\n taskCount: issueDetail.value?.tasks.length ?? 0\n }\n });\n }\n const outcome = createIssueManagerSaveIssueSuccessOutcome(\n savedIssue.issueId\n );\n applyOutcome(outcome);\n } catch (error) {\n notifyError(error, \"messages.issueSaveFailed\");\n }\n },\n\n async saveTask() {\n const savePlan = createIssueManagerSaveTaskPlan({\n selectedIssueId: nodeState.selectedIssueId,\n taskDraft\n });\n if (savePlan.kind === \"skip\") {\n return;\n }\n if (savePlan.kind === \"blocked\") {\n notifyTip(copy.t(savePlan.notificationKey));\n return;\n }\n\n try {\n const wasCreate = taskEditorMode === \"create\";\n const { content, removedContextRefs, savedTask } =\n await executeIssueManagerSaveTask({\n feature,\n selectedIssueId: savePlan.selectedIssueId,\n selectedTaskId: nodeState.selectedTaskId,\n taskDetail: taskDetail.value,\n taskDraft,\n taskEditorMode,\n workspaceId\n });\n if (wasCreate) {\n trackIssueManagerAnalytics(feature, {\n name: \"issue_manager.task_created\",\n params: {\n issueId: savePlan.selectedIssueId,\n taskId: savedTask.taskId\n }\n });\n } else {\n trackIssueManagerAnalytics(feature, {\n name: \"issue_manager.task_saved\",\n params: {\n contextRefCount: countIssueManagerContextRefs({\n content,\n refs: removeIssueManagerContextRefsFromCount(\n taskDetail.value?.contextRefs.filter(\n (ref) => ref.parentKind === \"task\"\n ),\n removedContextRefs\n )\n }),\n hasDescription: hasIssueManagerDescription(content),\n issueId: savePlan.selectedIssueId,\n taskId: savedTask.taskId\n }\n });\n }\n const outcome = createIssueManagerSaveTaskSuccessOutcome(\n savedTask.taskId\n );\n applyOutcome(outcome);\n } catch (error) {\n notifyError(error, \"messages.taskSaveFailed\");\n }\n },\n\n async setTaskStatus(taskId: string, status: IssueManagerTaskStatusUpdate) {\n await updateTaskStatus(taskId, status, { selectTaskOnSuccess: false });\n },\n\n async setSelectedTaskStatus(status: IssueManagerTaskStatusUpdate) {\n await updateTaskStatus(nodeState.selectedTaskId, status, {\n selectTaskOnSuccess: true\n });\n },\n\n async shareSelection() {\n const selectedIssueId = nodeState.selectedIssueId;\n const shareAdapter = feature.shareAdapter;\n if (!canIssueManagerCreateShareLink(shareAdapter) || !selectedIssueId) {\n return;\n }\n\n try {\n await executeIssueManagerShareSelection({\n issueId: selectedIssueId,\n shareAdapter,\n taskId: nodeState.selectedTaskId,\n workspaceId\n });\n } catch (error) {\n notifyError(error, \"messages.copyShareLinkFailed\");\n }\n },\n\n async submitReferenceSelection(refs: IssueManagerFileReference[]) {\n await submitReferences(refs);\n },\n\n async submitReferenceBundleSelection(input: {\n files: IssueManagerFileReference[];\n bundles: IssueManagerReferenceBundle[];\n }) {\n const target = referenceTarget;\n if (!target) {\n applyOutcome({ referenceTarget: null });\n return;\n }\n\n // 项目/分组(bundle)只在插入模式下折叠成 chip 追加到草稿;附加到已存在事项\n // 的后端 context-ref 仍是按路径存储,暂不支持句柄,故附加模式只提交松散文件。\n if (target.mode === \"insert\" && input.bundles.length > 0) {\n applyOutcome(\n createIssueManagerInsertReferenceBundlesOutcome({\n bundles: input.bundles,\n files: input.files,\n target,\n workspaceId\n })\n );\n trackIssueManagerContextRefsAdded({\n feature,\n refs: input.files,\n targetType: target.parentKind\n });\n return;\n }\n\n await submitReferences(input.files, target);\n }\n };\n}\n\nfunction hasIssueManagerDescription(content: string): boolean {\n return content.trim().length > 0;\n}\n\nfunction countIssueManagerContextRefs(input: {\n content: string;\n refs?: readonly { path: string }[];\n}): number {\n const paths = new Set<string>();\n for (const ref of input.refs ?? []) {\n const path = ref.path.trim();\n if (path) {\n paths.add(path);\n }\n }\n for (const ref of extractIssueManagerWorkspaceFileLinksFromContent(\n input.content\n )) {\n const path = ref.path.trim();\n if (path) {\n paths.add(path);\n }\n }\n return paths.size;\n}\n\nfunction removeIssueManagerContextRefsFromCount<\n T extends { contextRefId: string }\n>(\n refs: readonly T[] | undefined,\n removedRefs: readonly { contextRefId: string }[]\n): T[] {\n if (!refs?.length || removedRefs.length === 0) {\n return [...(refs ?? [])];\n }\n const removedIDs = new Set(removedRefs.map((ref) => ref.contextRefId));\n return refs.filter((ref) => !removedIDs.has(ref.contextRefId));\n}\n","import type { IssueManagerFeature } from \"../../../../core/index.ts\";\nimport type { IssueManagerI18nRuntime } from \"../../../../i18n/issueManagerI18n.ts\";\nimport type { IssueManagerControllerSession } from \"../../../../services/issueManagerControllerService.interface.ts\";\nimport { createIssueManagerControllerActions } from \"../../../../services/internal/controllerActions.ts\";\nimport type {\n IssueDraft,\n IssueManagerNotificationState,\n TaskDraft\n} from \"../../../../services/controllerTypes.ts\";\nimport type {\n IssueManagerEditorMode,\n IssueManagerReferenceTarget\n} from \"../../../../services/controllerModel.ts\";\nimport type {\n IssueManagerIssueDetail,\n IssueManagerNodeState,\n IssueManagerTaskDetail\n} from \"../../../../contracts/index.ts\";\nimport {\n logIssueManagerDiagnostic,\n type IssueManagerDiagnostics\n} from \"../../../../internal/issueManagerDiagnostics.ts\";\n\nexport function createIssueManagerControllerActionsBridge(input: {\n controllerSession: IssueManagerControllerSession;\n copy: IssueManagerI18nRuntime;\n diagnostics?: IssueManagerDiagnostics | null;\n feature: IssueManagerFeature;\n issueDetail: {\n value: IssueManagerIssueDetail | null;\n };\n issueDraft: IssueDraft;\n issueEditorMode: IssueManagerEditorMode;\n nodeState: IssueManagerNodeState;\n referenceTarget: IssueManagerReferenceTarget | null;\n taskDetail: {\n value: IssueManagerTaskDetail | null;\n };\n taskDraft: TaskDraft;\n taskEditorMode: IssueManagerEditorMode;\n workspaceId: string;\n}) {\n const {\n controllerSession,\n copy,\n diagnostics,\n feature,\n issueDetail,\n issueDraft,\n issueEditorMode,\n nodeState,\n referenceTarget,\n taskDetail,\n taskDraft,\n taskEditorMode,\n workspaceId\n } = input;\n\n return createIssueManagerControllerActions({\n copy,\n feature,\n issueDetail,\n issueDraft,\n issueEditorMode,\n nodeState,\n referenceTarget,\n refreshAll: () => controllerSession.refreshAll(),\n refreshDetails: () => controllerSession.refreshDetails(),\n setNotification: (update) =>\n controllerSession.setNotification((current) =>\n createIssueManagerControllerNotificationState(current, update)\n ),\n setIsRunningTask: (update) => controllerSession.setIsRunningTask(update),\n setIssueDraftInternal: (update) =>\n controllerSession.setIssueDraftInternal(update),\n setIssueEditorModeState: (update) => {\n const nextMode =\n typeof update === \"function\" ? update(issueEditorMode) : update;\n logIssueManagerDiagnostic(\n diagnostics,\n \"issue_editor_mode.action_requested\",\n {\n nextIssueEditorMode: nextMode,\n previousIssueEditorMode: issueEditorMode,\n selectedIssueId: nodeState.selectedIssueId,\n selectedTaskId: nodeState.selectedTaskId\n },\n { includeStack: true }\n );\n controllerSession.setIssueEditorModeState(nextMode);\n },\n setReferenceTarget: (update) =>\n controllerSession.setReferenceTarget(update),\n setTaskDraftInternal: (update) =>\n controllerSession.setTaskDraftInternal(update),\n setTaskEditorModeState: (update) => {\n const nextMode =\n typeof update === \"function\" ? update(taskEditorMode) : update;\n logIssueManagerDiagnostic(\n diagnostics,\n \"task_editor_mode.action_requested\",\n {\n nextTaskEditorMode: nextMode,\n previousSelectedTaskId: nodeState.selectedTaskId,\n previousTaskEditorMode: taskEditorMode\n },\n { includeStack: true }\n );\n controllerSession.setTaskEditorModeState(nextMode);\n },\n taskDetail,\n taskDraft,\n taskEditorMode,\n updateNodeState: (updater) => controllerSession.updateNodeState(updater),\n workspaceId\n });\n}\n\nfunction createIssueManagerControllerNotificationState(\n current: IssueManagerNotificationState | null,\n input: {\n title: string;\n tone?: IssueManagerNotificationState[\"tone\"];\n }\n): IssueManagerNotificationState {\n return {\n id: (current?.id ?? 0) + 1,\n title: input.title,\n tone: input.tone ?? \"default\"\n };\n}\n","import type { IssueManagerNodeState } from \"../../../../contracts/index.ts\";\nimport type { IssueManagerFeature } from \"../../../../core/index.ts\";\nimport type {\n IssueDraft,\n IssueManagerControllerSession,\n IssueManagerEditorMode\n} from \"../../../../services/issueManagerControllerService.interface.ts\";\nimport {\n applyIssueManagerIssueEditorModeToNodeState,\n createIssueManagerIssueDraftFromNodeState,\n persistIssueManagerIssueDraftContent\n} from \"../../../../services/internal/controllerState.ts\";\nimport { trackIssueManagerContentReferenceChanges } from \"../../../../services/internal/controllerAnalytics.ts\";\nimport {\n logIssueManagerDiagnostic,\n type IssueManagerDiagnostics\n} from \"../../../../internal/issueManagerDiagnostics.ts\";\n\nexport function createIssueManagerIssueBindings(input: {\n controllerSession: IssueManagerControllerSession;\n diagnostics?: IssueManagerDiagnostics | null;\n feature: IssueManagerFeature;\n issueEditorMode: IssueManagerEditorMode;\n nodeState: IssueManagerNodeState;\n}) {\n const {\n controllerSession,\n diagnostics,\n feature,\n issueEditorMode,\n nodeState\n } = input;\n\n return {\n setIssueContent(content: string) {\n controllerSession.setIssueDraftInternal((current) => {\n trackIssueManagerContentReferenceChanges({\n feature,\n nextContent: content,\n previousContent: current.content,\n targetType: \"issue\"\n });\n return {\n ...current,\n content\n };\n });\n controllerSession.updateNodeState((current) =>\n persistIssueManagerIssueDraftContent(current, issueEditorMode, content)\n );\n },\n setIssueDraft(patch: Partial<IssueDraft>) {\n controllerSession.setIssueDraftInternal((current) => ({\n ...current,\n ...patch\n }));\n },\n setIssueEditorMode(mode: IssueManagerEditorMode) {\n logIssueManagerDiagnostic(\n diagnostics,\n \"issue_editor_mode.requested\",\n {\n nextIssueEditorMode: mode,\n previousIssueEditorMode: issueEditorMode,\n selectedIssueId: nodeState.selectedIssueId,\n selectedTaskId: nodeState.selectedTaskId\n },\n { includeStack: true }\n );\n controllerSession.setIssueEditorModeState(mode);\n if (mode === \"create\") {\n controllerSession.setIssueDraftInternal(\n createIssueManagerIssueDraftFromNodeState(nodeState)\n );\n }\n controllerSession.updateNodeState((current) =>\n applyIssueManagerIssueEditorModeToNodeState(current, mode)\n );\n },\n setIssueSearchQuery(query: string) {\n controllerSession.updateNodeState((current) => ({\n ...current,\n issueSearchQuery: query\n }));\n },\n setIssueStatusFilter(value: IssueManagerNodeState[\"issueStatusFilter\"]) {\n controllerSession.updateNodeState((current) => ({\n ...current,\n issueStatusFilter: value\n }));\n },\n setIssueTitle(title: string) {\n controllerSession.setIssueDraftInternal((current) => ({\n ...current,\n title\n }));\n }\n };\n}\n","import type {\n IssueManagerNodeState,\n IssueManagerPriority\n} from \"../../../../contracts/index.ts\";\nimport type { IssueManagerFeature } from \"../../../../core/index.ts\";\nimport type {\n IssueManagerControllerSession,\n IssueManagerEditorMode,\n TaskDraft\n} from \"../../../../services/issueManagerControllerService.interface.ts\";\nimport {\n applyIssueManagerTaskEditorModeToNodeState,\n applyIssueManagerTaskSelection,\n createIssueManagerTaskDraftFromNodeState,\n persistIssueManagerTaskDraftContent\n} from \"../../../../services/internal/controllerState.ts\";\nimport { trackIssueManagerContentReferenceChanges } from \"../../../../services/internal/controllerAnalytics.ts\";\nimport {\n logIssueManagerDiagnostic,\n type IssueManagerDiagnostics\n} from \"../../../../internal/issueManagerDiagnostics.ts\";\n\nexport function createIssueManagerTaskBindings(input: {\n controllerSession: IssueManagerControllerSession;\n diagnostics?: IssueManagerDiagnostics | null;\n feature: IssueManagerFeature;\n nodeState: IssueManagerNodeState;\n taskEditorMode: IssueManagerEditorMode;\n}) {\n const { controllerSession, diagnostics, feature, nodeState, taskEditorMode } =\n input;\n\n return {\n selectTask(taskId: string | null) {\n controllerSession.updateNodeState((current) => {\n logIssueManagerDiagnostic(\n diagnostics,\n \"task_selection.requested\",\n {\n activeTopicId: current.activeTopicId ?? null,\n nextSelectedTaskId: taskId,\n previousSelectedIssueId: current.selectedIssueId,\n previousSelectedTaskId: current.selectedTaskId,\n taskEditorMode\n },\n { includeStack: true }\n );\n return applyIssueManagerTaskSelection(current, taskId);\n });\n controllerSession.setTaskEditorModeState(\"read\");\n },\n setTaskContent(content: string) {\n controllerSession.setTaskDraftInternal((current) => {\n trackIssueManagerContentReferenceChanges({\n feature,\n nextContent: content,\n previousContent: current.content,\n targetType: \"task\"\n });\n return {\n ...current,\n content\n };\n });\n controllerSession.updateNodeState((current) =>\n persistIssueManagerTaskDraftContent(current, taskEditorMode, content)\n );\n },\n setTaskDraft(patch: Partial<TaskDraft>) {\n controllerSession.setTaskDraftInternal((current) => ({\n ...current,\n ...patch\n }));\n },\n setTaskEditorMode(mode: IssueManagerEditorMode) {\n logIssueManagerDiagnostic(\n diagnostics,\n \"task_editor_mode.requested\",\n {\n nextTaskEditorMode: mode,\n previousSelectedTaskId: nodeState.selectedTaskId,\n previousTaskEditorMode: taskEditorMode\n },\n { includeStack: true }\n );\n controllerSession.setTaskEditorModeState(mode);\n if (mode === \"create\") {\n controllerSession.setTaskDraftInternal(\n createIssueManagerTaskDraftFromNodeState(nodeState)\n );\n }\n controllerSession.updateNodeState((current) =>\n applyIssueManagerTaskEditorModeToNodeState(current, mode)\n );\n },\n setTaskListCollapsed(collapsed: boolean) {\n controllerSession.updateNodeState((current) => ({\n ...current,\n taskListCollapsed: collapsed\n }));\n },\n setTaskPriority(priority: IssueManagerPriority) {\n controllerSession.setTaskDraftInternal((current) => ({\n ...current,\n priority\n }));\n },\n setTaskTitle(title: string) {\n controllerSession.setTaskDraftInternal((current) => ({\n ...current,\n title\n }));\n }\n };\n}\n","import type { RichTextTriggerProvider } from \"@tutti-os/ui-rich-text/types\";\nimport type { IssueManagerNodeState } from \"../../../../contracts/index.ts\";\nimport type { IssueManagerFeature } from \"../../../../core/index.ts\";\nimport type {\n IssueManagerControllerSession,\n IssueManagerEditorMode,\n IssueManagerReferenceTarget\n} from \"../../../../services/issueManagerControllerService.interface.ts\";\nimport { applyIssueManagerIssueSelection } from \"../../../../services/internal/controllerState.ts\";\nimport { createIssueManagerIssueBindings } from \"../issue/createIssueManagerIssueBindings.ts\";\nimport { createIssueManagerTaskBindings } from \"../task/createIssueManagerTaskBindings.ts\";\nimport {\n logIssueManagerDiagnostic,\n type IssueManagerDiagnostics\n} from \"../../../../internal/issueManagerDiagnostics.ts\";\n\nexport function createIssueManagerControllerBindings(input: {\n controllerSession: IssueManagerControllerSession;\n diagnostics?: IssueManagerDiagnostics | null;\n feature: IssueManagerFeature;\n issueEditorMode: IssueManagerEditorMode;\n nodeState: IssueManagerNodeState;\n onResolveRichTextTriggerProviders?: (input: {\n surface: \"issue\" | \"task\";\n workspaceId: string;\n }) => readonly RichTextTriggerProvider[];\n taskEditorMode: IssueManagerEditorMode;\n workspaceId: string;\n}) {\n const {\n controllerSession,\n diagnostics,\n feature,\n issueEditorMode,\n nodeState,\n onResolveRichTextTriggerProviders,\n taskEditorMode,\n workspaceId\n } = input;\n\n const issueBindings = createIssueManagerIssueBindings({\n controllerSession,\n diagnostics,\n feature,\n issueEditorMode,\n nodeState\n });\n const taskBindings = createIssueManagerTaskBindings({\n controllerSession,\n diagnostics,\n feature,\n nodeState,\n taskEditorMode\n });\n\n return {\n ...issueBindings,\n ...taskBindings,\n dismissNotification() {\n controllerSession.setNotification(null);\n },\n refreshAll() {\n controllerSession.refreshAll();\n },\n reportIssueSearchUsage(query: string) {\n controllerSession.reportIssueSearchUsage(query);\n },\n resolveRichTextTriggerProviders(surface: \"issue\" | \"task\") {\n return (\n onResolveRichTextTriggerProviders?.({\n surface,\n workspaceId\n }) ?? []\n );\n },\n selectIssue(issueId: string | null) {\n controllerSession.updateNodeState((current) => {\n logIssueManagerDiagnostic(\n diagnostics,\n \"issue_selection.requested\",\n {\n nextSelectedIssueId: issueId,\n previousSelectedIssueId: current.selectedIssueId,\n previousSelectedTaskId: current.selectedTaskId\n },\n { includeStack: true }\n );\n return applyIssueManagerIssueSelection(current, issueId);\n });\n controllerSession.setIssueEditorModeState(\"read\");\n controllerSession.setTaskEditorModeState(\"read\");\n },\n setReferenceTarget(target: IssueManagerReferenceTarget | null) {\n controllerSession.setReferenceTarget(target);\n },\n setSelectedAgentProvider(provider: string) {\n controllerSession.updateNodeState((current) => ({\n ...current,\n selectedAgentProvider: provider\n }));\n }\n };\n}\n","import { useDeferredValue, useEffect, useMemo } from \"react\";\nimport { useSnapshot } from \"valtio\";\nimport type {\n IssueManagerNodeState,\n IssueManagerOpenSource\n} from \"../../../../contracts/index.ts\";\nimport type { IssueManagerFeature } from \"../../../../core/index.ts\";\nimport { createIssueManagerControllerService } from \"../../../../services/createIssueManagerControllerService.ts\";\nimport type {\n IssueManagerControllerService,\n IssueManagerControllerSession\n} from \"../../../../services/issueManagerControllerService.interface.ts\";\nimport {\n resolveIssueManagerFloatingNoticeViewState,\n type IssueManagerFloatingNoticeViewState\n} from \"../shell/IssueManagerNoticeState.ts\";\nimport type { IssueManagerDiagnostics } from \"../../../../internal/issueManagerDiagnostics.ts\";\n\nexport function useIssueManagerControllerRuntime(input: {\n diagnostics?: IssueManagerDiagnostics | null;\n feature: IssueManagerFeature;\n openSource?: IssueManagerOpenSource;\n onStateChange?: (state: IssueManagerNodeState) => void;\n service?: IssueManagerControllerService;\n state?: Partial<IssueManagerNodeState> | null;\n workspaceId: string;\n}): {\n controllerSession: IssueManagerControllerSession;\n deferredIssueSearch: string;\n floatingNotice: IssueManagerFloatingNoticeViewState | null;\n snapshot: IssueManagerControllerSession[\"store\"];\n} {\n const {\n diagnostics,\n feature,\n openSource,\n onStateChange,\n service,\n state,\n workspaceId\n } = input;\n const controllerService = useMemo(\n () => service ?? createIssueManagerControllerService(),\n [service]\n );\n const controllerSession = useMemo(\n () =>\n controllerService.createSession({\n diagnostics,\n feature,\n openSource,\n state,\n workspaceId\n }),\n [controllerService, diagnostics, feature, openSource, workspaceId]\n );\n const snapshot = useSnapshot(\n controllerSession.store\n ) as IssueManagerControllerSession[\"store\"];\n const deferredIssueSearch = useDeferredValue(\n snapshot.nodeState.issueSearchQuery\n );\n const floatingNotice = resolveIssueManagerFloatingNoticeViewState({\n notification: snapshot.notification\n });\n\n useEffect(() => {\n controllerSession.retain();\n return () => {\n controllerSession.release();\n };\n }, [controllerSession]);\n\n useEffect(() => {\n controllerSession.syncInput({\n deferredIssueSearch,\n onStateChange,\n taskListCollapsed: state?.taskListCollapsed === true\n });\n }, [\n controllerSession,\n deferredIssueSearch,\n onStateChange,\n state?.taskListCollapsed\n ]);\n\n return {\n controllerSession,\n deferredIssueSearch,\n floatingNotice,\n snapshot\n };\n}\n","import type {\n IssueManagerNotificationState,\n IssueManagerNotificationTone\n} from \"../../../../services/controllerTypes.ts\";\n\nconst issueManagerNoticeDurationMs = 3000;\n\nexport interface IssueManagerFloatingNoticeViewState {\n durationMs: number;\n id: number;\n isLoading: boolean;\n title: string;\n tone: IssueManagerNotificationTone;\n}\n\nexport function resolveIssueManagerFloatingNoticeViewState(input: {\n notification: IssueManagerNotificationState | null;\n}): IssueManagerFloatingNoticeViewState | null {\n if (!input.notification) {\n return null;\n }\n\n return {\n durationMs: issueManagerNoticeDurationMs,\n id: input.notification.id,\n isLoading: false,\n title: input.notification.title,\n tone: input.notification.tone\n };\n}\n","import type { RichTextTriggerProvider } from \"@tutti-os/ui-rich-text/types\";\nimport type { ReactNode } from \"react\";\nimport type { ReferenceGroupedSelection } from \"@tutti-os/workspace-file-reference/ui\";\nimport type {\n IssueManagerFileReference,\n IssueManagerNodeState,\n IssueManagerOpenSource\n} from \"../../../../contracts/index.ts\";\nimport type { IssueManagerFeature } from \"../../../../core/index.ts\";\nimport type { IssueManagerControllerService } from \"../../../../services/issueManagerControllerService.interface.ts\";\nimport {\n resolveIssueManagerSelectedIssue,\n resolveIssueManagerSelectedTask,\n useIssueManagerTaskListCollapsedSync\n} from \"./IssueManagerNodeState.ts\";\nimport {\n useIssueManagerController,\n type IssueManagerController,\n type IssueManagerRichTextSurface\n} from \"../controller/useIssueManagerController.ts\";\nimport {\n logIssueManagerDiagnostic,\n type IssueManagerDiagnostics\n} from \"../../../../internal/issueManagerDiagnostics.ts\";\n\nexport interface UseIssueManagerNodeViewInput {\n diagnostics?: IssueManagerDiagnostics | null;\n emptyIllustration?: ReactNode;\n feature: IssueManagerFeature;\n nodeId: string;\n openSource?: IssueManagerOpenSource;\n onStateChange?: (state: IssueManagerNodeState) => void;\n resolveRichTextTriggerProviders?: (input: {\n surface: IssueManagerRichTextSurface;\n workspaceId: string;\n }) => readonly RichTextTriggerProvider[];\n service?: IssueManagerControllerService;\n state?: Partial<IssueManagerNodeState> | null;\n workspaceId: string;\n}\n\nexport function useIssueManagerNodeView({\n diagnostics,\n feature,\n nodeId,\n openSource,\n onStateChange,\n resolveRichTextTriggerProviders,\n service,\n state,\n workspaceId\n}: UseIssueManagerNodeViewInput) {\n const controller = useIssueManagerController({\n diagnostics,\n feature,\n openSource,\n onStateChange,\n resolveRichTextTriggerProviders,\n service,\n state,\n workspaceId\n });\n\n useIssueManagerTaskListCollapsedSync({\n nodeId,\n onCollapsedChange: (collapsed) => {\n controller.setTaskListCollapsed(collapsed);\n },\n workspaceId\n });\n\n const selectedIssue = resolveIssueManagerSelectedIssue({\n issueDetail: controller.issueDetail.value?.issue ?? null,\n issues: controller.issues.value,\n selectedIssueId: controller.nodeState.selectedIssueId\n });\n const selectedTask = resolveIssueManagerSelectedTask({\n selectedTaskId: controller.nodeState.selectedTaskId,\n taskDetail: controller.taskDetail.value?.task ?? null,\n tasks: controller.issueDetail.value?.tasks ?? []\n });\n\n return {\n controller,\n referencePicker: {\n onClose: () => {\n controller.setReferenceTarget(null);\n },\n onConfirm: (refs: IssueManagerFileReference[]) => {\n void controller.submitReferenceSelection(refs);\n },\n onConfirmBundles: (result: ReferenceGroupedSelection) => {\n void controller.submitReferenceBundleSelection({\n bundles: result.bundles\n .filter((bundle) => bundle.handle !== null)\n .map((bundle) => ({\n source: bundle.handle!.source,\n id: bundle.handle!.id,\n groupId: bundle.handle!.groupId ?? null,\n displayName: bundle.displayName,\n iconUrl: bundle.iconUrl ?? null,\n fileCount: bundle.fileCount\n })),\n files: result.files\n });\n },\n open: controller.referenceTarget !== null\n },\n selectedIssue,\n selectedTask,\n shell: {\n onCloseTaskDrawer: () => {\n logIssueManagerDiagnostic(\n controller.diagnostics,\n \"task_drawer.close_requested\",\n {\n selectedIssueId: controller.nodeState.selectedIssueId,\n selectedTaskId: controller.nodeState.selectedTaskId\n }\n );\n controller.selectTask(null);\n },\n onDismissIssueCreate: () => {\n controller.setIssueEditorMode(\"read\");\n }\n }\n };\n}\n\nexport type IssueManagerNodeView = ReturnType<typeof useIssueManagerNodeView>;\nexport type IssueManagerNodeViewController = IssueManagerController;\n","export {\n dispatchIssueManagerTaskListCollapsed,\n dispatchIssueManagerIssueCreateRequest,\n dispatchIssueManagerTopicCreate,\n dispatchIssueManagerTopicDelete,\n dispatchIssueManagerTopicHeaderState,\n dispatchIssueManagerTopicSelection,\n dispatchIssueManagerTopicUpdate,\n resolveIssueManagerSelectedIssue,\n resolveIssueManagerSelectedTask,\n useIssueManagerNodeHeaderView,\n useIssueManagerIssueCreateRequestSync,\n useIssueManagerTopicHeaderCommandSync,\n useIssueManagerTopicHeaderStateSync,\n useIssueManagerTaskListCollapsedSync\n} from \"./internal/shell/IssueManagerNodeState.ts\";\nexport {\n createReferenceDirectoryStateFromSnapshot,\n collectVisibleTreeEntries,\n issueManagerReferenceDefaultExpandedDepth,\n mergeExpandedFolderPaths,\n mergePrefetchedDirectoryState,\n normalizeDirectoryPath,\n prefetchReferenceTree,\n type IssueManagerReferenceDirectoryState\n} from \"./internal/reference/IssueManagerReferencePickerState.ts\";\nexport {\n useIssueManagerController,\n type IssueManagerController,\n type IssueManagerRichTextSurface\n} from \"./internal/controller/useIssueManagerController.ts\";\nexport {\n useIssueManagerNodeView,\n type IssueManagerNodeView,\n type IssueManagerNodeViewController,\n type UseIssueManagerNodeViewInput\n} from \"./internal/shell/useIssueManagerNodeView.ts\";\nexport {\n useWorkspaceFileReferencePickerView as useIssueManagerReferencePickerView,\n type UseWorkspaceFileReferencePickerViewInput as UseIssueManagerReferencePickerViewInput,\n type WorkspaceFileReferencePreviewState as IssueManagerReferencePreviewState\n} from \"@tutti-os/workspace-file-reference/react\";\n","import {\n type CSSProperties,\n useEffect,\n useRef,\n type HTMLAttributes,\n type JSX,\n type ReactNode\n} from \"react\";\nimport type {\n WorkbenchDisplayMode,\n WorkbenchHostNodeHeaderWindowActions\n} from \"@tutti-os/workbench-surface\";\nimport {\n Button,\n FileCreateIcon,\n PanelIcon,\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n WindowTrafficLightIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport {\n ReferenceSourcePicker,\n WorkspaceFileReferencePicker\n} from \"@tutti-os/workspace-file-reference/ui\";\nimport type { IssueManagerI18nRuntime } from \"../i18n/issueManagerI18n.ts\";\nimport type { IssueManagerOpenSource } from \"../contracts/index.ts\";\nimport { logIssueManagerDiagnostic } from \"../internal/issueManagerDiagnostics.ts\";\nimport type { IssueManagerLatestRunStatusRenderer } from \"./latestRunStatusRenderer.ts\";\nimport { IssueManagerShell } from \"./internal/shell/IssueManagerShell.tsx\";\nimport { IssueManagerTopicSelector } from \"./internal/shell/IssueManagerTopicSelector.tsx\";\nimport {\n dispatchIssueManagerTopicCreate,\n dispatchIssueManagerTopicDelete,\n dispatchIssueManagerTopicHeaderState,\n dispatchIssueManagerTopicSelection,\n dispatchIssueManagerTopicUpdate,\n dispatchIssueManagerIssueCreateRequest,\n useIssueManagerIssueCreateRequestSync,\n useIssueManagerTopicHeaderCommandSync,\n useIssueManagerTopicHeaderStateSync,\n useIssueManagerNodeHeaderView,\n useIssueManagerNodeView,\n type UseIssueManagerNodeViewInput\n} from \"./react/index.ts\";\n\nexport { dispatchIssueManagerTaskListCollapsed } from \"./react/index.ts\";\nexport type { IssueManagerLatestRunStatusRenderer } from \"./latestRunStatusRenderer.ts\";\n\nexport interface IssueManagerNodeOpenRequest {\n issueId: string;\n mode?: \"breakdown\" | \"execute\";\n outputDir?: string;\n requestId: string;\n runId?: string;\n taskId?: string;\n topicId?: string;\n}\n\nexport type IssueManagerNodeProps = UseIssueManagerNodeViewInput & {\n openRequest?: IssueManagerNodeOpenRequest | null;\n openSource?: IssueManagerOpenSource;\n renderLatestRunStatus?: IssueManagerLatestRunStatusRenderer;\n};\n\nexport function IssueManagerNode({\n diagnostics,\n emptyIllustration,\n feature,\n nodeId,\n openSource,\n openRequest,\n onStateChange,\n renderLatestRunStatus,\n resolveRichTextTriggerProviders,\n service,\n state,\n workspaceId\n}: IssueManagerNodeProps): JSX.Element {\n const { controller, referencePicker, selectedIssue, selectedTask, shell } =\n useIssueManagerNodeView({\n diagnostics,\n feature,\n nodeId,\n openSource,\n onStateChange,\n resolveRichTextTriggerProviders,\n service,\n state,\n workspaceId\n });\n const lastHandledOpenRequestIdRef = useRef<string | null>(null);\n\n useEffect(() => {\n if (!openRequest?.requestId) {\n return;\n }\n if (lastHandledOpenRequestIdRef.current === openRequest.requestId) {\n logIssueManagerDiagnostic(\n controller.diagnostics,\n \"open_request.skipped_duplicate\",\n {\n issueId: openRequest.issueId,\n requestId: openRequest.requestId,\n taskId: openRequest.taskId?.trim() || null,\n topicId: openRequest.topicId?.trim() || null\n }\n );\n return;\n }\n lastHandledOpenRequestIdRef.current = openRequest.requestId;\n\n logIssueManagerDiagnostic(\n controller.diagnostics,\n \"open_request.consumed\",\n {\n issueId: openRequest.issueId,\n mode: openRequest.mode ?? null,\n requestId: openRequest.requestId,\n taskId: openRequest.taskId?.trim() || null,\n topicId: openRequest.topicId?.trim() || null\n },\n { includeStack: true }\n );\n\n if (openRequest.topicId?.trim()) {\n controller.selectTopic(openRequest.topicId);\n }\n controller.selectIssue(openRequest.issueId);\n controller.selectTask(openRequest.taskId?.trim() || null);\n }, [controller, openRequest]);\n\n useEffect(() => {\n dispatchIssueManagerTopicHeaderState({\n activeTopicId: controller.nodeState.activeTopicId ?? null,\n nodeId,\n topics: controller.topics.value,\n workspaceId\n });\n }, [\n controller.nodeState.activeTopicId,\n controller.topics.value,\n nodeId,\n workspaceId\n ]);\n\n useIssueManagerTopicHeaderCommandSync({\n nodeId,\n onCreateTopic: (topicInput) => {\n void controller.createTopic(topicInput);\n },\n onDeleteTopic: (topicId) => {\n void controller.deleteTopic(topicId);\n },\n onSelectTopic: controller.selectTopic,\n onUpdateTopic: (topicInput) => {\n void controller.updateTopic(topicInput);\n },\n workspaceId\n });\n useIssueManagerIssueCreateRequestSync({\n nodeId,\n onCreateIssue: () => {\n controller.setIssueEditorMode(\"create\");\n },\n workspaceId\n });\n\n return (\n <section\n aria-label={controller.copy.t(\"title\")}\n className=\"flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden text-[var(--text-primary)]\"\n data-issue-manager-node-id={nodeId}\n data-issue-manager-workspace-id={workspaceId}\n >\n <IssueManagerShell\n controller={controller}\n emptyIllustration={emptyIllustration}\n onCloseTaskDrawer={shell.onCloseTaskDrawer}\n onDismissIssueCreate={shell.onDismissIssueCreate}\n renderLatestRunStatus={renderLatestRunStatus}\n selectedIssue={selectedIssue}\n selectedTask={selectedTask}\n />\n\n {feature.referenceSourceAggregator ? (\n <ReferenceSourcePicker\n aggregator={feature.referenceSourceAggregator}\n copy={controller.copy}\n open={referencePicker.open}\n workspaceId={workspaceId}\n onClose={referencePicker.onClose}\n onConfirm={referencePicker.onConfirm}\n onConfirmBundles={referencePicker.onConfirmBundles}\n />\n ) : (\n <WorkspaceFileReferencePicker\n copy={controller.copy}\n fileAdapter={feature.fileAdapter}\n open={referencePicker.open}\n workspaceId={workspaceId}\n onClose={referencePicker.onClose}\n onConfirm={referencePicker.onConfirm}\n />\n )}\n </section>\n );\n}\n\nexport interface IssueManagerNodeHeaderProps extends HTMLAttributes<HTMLElement> {\n activeTopicId?: string | null;\n copy: IssueManagerI18nRuntime;\n defaultActions?: ReactNode;\n displayMode?: WorkbenchDisplayMode;\n isSidebarAutoCollapsed: boolean;\n isSidebarCollapsed: boolean;\n nodeId: string;\n onToggleSidebar: (nextCollapsed: boolean) => void;\n title?: string;\n windowActions?: Pick<\n WorkbenchHostNodeHeaderWindowActions,\n \"close\" | \"minimize\" | \"toggleDisplayMode\"\n >;\n workspaceId: string;\n}\n\nconst issueManagerWorkbenchDragHandleAttribute = \"data-workbench-drag-handle\";\nconst issueManagerHeaderChromeIconButtonClassName =\n \"size-7 min-h-7 min-w-7 cursor-pointer rounded-md p-0 text-[var(--text-secondary)] hover:bg-[color-mix(in_srgb,var(--text-primary)_8%,transparent)] hover:text-[var(--text-primary)]\";\nconst issueManagerHeaderChromeIconClassName = \"size-[18px]\";\nconst issueManagerHeaderTrafficLightClassName =\n \"relative -m-1 size-5 shrink-0 cursor-pointer rounded-full border-0 bg-transparent p-0 text-[color-mix(in_srgb,var(--text-tertiary)_72%,transparent)] opacity-[0.78] outline-none transition-[color,opacity] duration-150 ease-out before:absolute before:inset-1 before:rounded-full before:bg-current before:transition-colors before:duration-150 before:ease-out before:content-[''] group-hover/traffic-lights:opacity-100 group-focus-within/traffic-lights:opacity-100 focus-visible:ring-2 focus-visible:ring-[var(--accent)] focus-visible:ring-offset-1 focus-visible:ring-offset-[var(--background-panel)]\";\n\ntype IssueManagerNodeHeaderDragHandleAttributes = {\n [issueManagerWorkbenchDragHandleAttribute]?: \"true\";\n};\n\nexport function IssueManagerNodeHeader({\n activeTopicId = null,\n className,\n copy,\n defaultActions: _defaultActions,\n displayMode,\n isSidebarAutoCollapsed,\n isSidebarCollapsed,\n nodeId,\n onToggleSidebar,\n title,\n windowActions,\n workspaceId,\n ...headerProps\n}: IssueManagerNodeHeaderProps): JSX.Element {\n const {\n [issueManagerWorkbenchDragHandleAttribute]: dragHandleData,\n onDoubleClick,\n onPointerDown,\n ...restHeaderProps\n } = headerProps as typeof headerProps &\n IssueManagerNodeHeaderDragHandleAttributes;\n const dragHandleProps = {\n \"data-workbench-drag-handle\": dragHandleData,\n onDoubleClick,\n onPointerDown\n };\n const { effectiveCollapsed, toggleLabel, toggleSidebar } =\n useIssueManagerNodeHeaderView({\n copy,\n isSidebarAutoCollapsed,\n isSidebarCollapsed,\n nodeId,\n onToggleSidebar,\n workspaceId\n });\n const topicState = useIssueManagerTopicHeaderStateSync({\n activeTopicId,\n nodeId,\n workspaceId\n });\n const safeDisplayMode = displayMode ?? \"floating\";\n const safeWindowActions = windowActions ?? {\n close: () => undefined,\n minimize: () => undefined,\n toggleDisplayMode: () => undefined\n };\n const displayModeLabel =\n safeDisplayMode === \"fullscreen\"\n ? copy.t(\"actions.restoreWindow\")\n : copy.t(\"actions.maximizeWindow\");\n const sidebarHeaderStyle = {\n width: effectiveCollapsed\n ? \"max-content\"\n : \"min(var(--issue-manager-sidebar-width, 280px), 100%)\"\n } satisfies CSSProperties;\n const topicHeaderStyle = {\n left: effectiveCollapsed\n ? \"50%\"\n : \"calc(min(var(--issue-manager-sidebar-width, 280px), 100%) + ((100% - min(var(--issue-manager-sidebar-width, 280px), 100%)) / 2))\"\n } satisfies CSSProperties;\n\n return (\n <header\n {...restHeaderProps}\n className={cn(\n \"relative flex h-full min-h-0 w-full items-center bg-transparent\",\n className\n )}\n data-workbench-custom-header-border=\"none\"\n >\n <div\n {...dragHandleProps}\n aria-hidden=\"true\"\n className=\"absolute inset-0 cursor-grab active:cursor-grabbing\"\n />\n <div\n {...dragHandleProps}\n className={cn(\n \"relative z-10 flex h-full min-w-0 cursor-grab items-center gap-2 bg-[var(--background-panel)] pr-3 pl-4 active:cursor-grabbing\",\n !effectiveCollapsed && \"border-r border-[var(--border-1)]\"\n )}\n style={sidebarHeaderStyle}\n >\n <div\n className=\"group/traffic-lights flex shrink-0 items-center gap-2\"\n onDoubleClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n >\n <IssueManagerTrafficLightButton\n label={copy.t(\"actions.closeWindow\")}\n tone=\"close\"\n onClick={safeWindowActions.close}\n />\n <IssueManagerTrafficLightButton\n label={copy.t(\"actions.minimizeWindow\")}\n tone=\"minimize\"\n onClick={safeWindowActions.minimize}\n />\n <IssueManagerTrafficLightButton\n label={displayModeLabel}\n pressed={safeDisplayMode === \"fullscreen\"}\n tone=\"maximize\"\n onClick={safeWindowActions.toggleDisplayMode}\n />\n </div>\n <span className=\"min-w-0 shrink truncate text-[15px] font-semibold leading-5 text-[var(--text-primary)]\">\n {title?.trim() || copy.t(\"title\")}\n </span>\n <Button\n aria-label={toggleLabel}\n className={cn(\n !effectiveCollapsed && \"ml-auto\",\n issueManagerHeaderChromeIconButtonClassName\n )}\n data-issue-manager-sidebar-auto-collapsed={\n isSidebarAutoCollapsed ? \"true\" : undefined\n }\n data-issue-manager-sidebar-collapsed={\n effectiveCollapsed ? \"true\" : undefined\n }\n size=\"icon-sm\"\n title={toggleLabel}\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n toggleSidebar();\n }}\n onDoubleClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n >\n <PanelIcon className={issueManagerHeaderChromeIconClassName} />\n </Button>\n {effectiveCollapsed ? (\n <TooltipProvider delayDuration={250} skipDelayDuration={0}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label={copy.t(\"actions.createIssue\")}\n className={issueManagerHeaderChromeIconButtonClassName}\n size=\"icon-sm\"\n type=\"button\"\n variant=\"ghost\"\n onClick={(event) => {\n event.stopPropagation();\n dispatchIssueManagerIssueCreateRequest({\n nodeId,\n workspaceId\n });\n }}\n onDoubleClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n >\n <FileCreateIcon aria-hidden=\"true\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\">\n {copy.t(\"actions.createIssue\")}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n ) : null}\n </div>\n <div\n className=\"pointer-events-none absolute inset-y-0 z-10 flex min-w-0 -translate-x-1/2 items-center justify-center px-3\"\n style={topicHeaderStyle}\n >\n <div\n className=\"pointer-events-auto flex min-w-0 max-w-full items-center\"\n onDoubleClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n >\n <IssueManagerTopicSelector\n activeTopicId={topicState.activeTopicId}\n className=\"max-w-[220px] text-[var(--text-primary)]\"\n copy={copy}\n topics={topicState.topics}\n onCreateTopic={(input) => {\n dispatchIssueManagerTopicCreate({\n input,\n nodeId,\n workspaceId\n });\n }}\n onDeleteTopic={(topicId) => {\n dispatchIssueManagerTopicDelete({\n nodeId,\n topicId,\n workspaceId\n });\n }}\n onSelectTopic={(topicId) => {\n dispatchIssueManagerTopicSelection({\n nodeId,\n topicId,\n workspaceId\n });\n }}\n onUpdateTopic={(input) => {\n dispatchIssueManagerTopicUpdate({\n input,\n nodeId,\n workspaceId\n });\n }}\n />\n </div>\n </div>\n </header>\n );\n}\n\nfunction IssueManagerTrafficLightButton({\n label,\n onClick,\n pressed,\n tone\n}: {\n label: string;\n onClick: () => void;\n pressed?: boolean;\n tone: \"close\" | \"minimize\" | \"maximize\";\n}): JSX.Element {\n const iconName =\n tone === \"maximize\" ? (pressed ? \"unfullscreen\" : \"fullscreen\") : tone;\n const button = (\n <button\n aria-label={label}\n aria-pressed={pressed}\n className={cn(\n issueManagerHeaderTrafficLightClassName,\n tone === \"close\" &&\n \"group-hover/traffic-lights:text-[#ff5f57] group-focus-within/traffic-lights:text-[#ff5f57]\",\n tone === \"minimize\" &&\n \"group-hover/traffic-lights:text-[#ffbd2e] group-focus-within/traffic-lights:text-[#ffbd2e]\",\n tone === \"maximize\" &&\n \"group-hover/traffic-lights:text-[#28c840] group-focus-within/traffic-lights:text-[#28c840]\"\n )}\n type=\"button\"\n onClick={(event) => {\n event.stopPropagation();\n onClick();\n }}\n onDoubleClick={(event) => event.stopPropagation()}\n onPointerDown={(event) => event.stopPropagation()}\n >\n <WindowTrafficLightIcon\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-[5px] z-[1] size-[10px] text-[color-mix(in_srgb,#000_68%,transparent)] opacity-0 transition-opacity duration-150 group-hover/traffic-lights:opacity-100 group-focus-within/traffic-lights:opacity-100\"\n data-issue-manager-traffic-light-icon={iconName}\n iconName={iconName}\n />\n </button>\n );\n\n return (\n <TooltipProvider delayDuration={250} skipDelayDuration={0}>\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent side=\"bottom\">{label}</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n","import {\n useEffect,\n useRef,\n useState,\n type JSX,\n type PointerEvent,\n type ReactNode\n} from \"react\";\nimport { Button, FileCreateIcon, cn } from \"@tutti-os/ui-system\";\nimport type {\n IssueManagerIssueSummary,\n IssueManagerTaskSummary\n} from \"../../../contracts/index.ts\";\nimport { IssueManagerIssuePane } from \"./IssueManagerPanels.tsx\";\nimport { IssueManagerBottomBar } from \"./IssueManagerBottomBar.tsx\";\nimport { IssueManagerFloatingNotice } from \"./IssueManagerFloatingNotice.tsx\";\nimport { IssueManagerSidebar } from \"./IssueManagerSidebar.tsx\";\nimport { IssueManagerTaskComposerPane } from \"./IssueManagerTaskComposerPane.tsx\";\nimport {\n IssueManagerTaskDrawer,\n type IssueManagerTaskDrawerCloseSource\n} from \"./IssueManagerTaskDrawer.tsx\";\nimport type { IssueManagerController } from \"../../react/index.ts\";\nimport { useIssueManagerShellView } from \"./useIssueManagerShellView.ts\";\nimport type { IssueManagerLatestRunStatusRenderer } from \"../../latestRunStatusRenderer.ts\";\nimport { logIssueManagerDiagnostic } from \"../../../internal/issueManagerDiagnostics.ts\";\nimport {\n shouldIgnoreIssueManagerTaskDrawerBackdropEcho,\n type IssueManagerPointerSnapshot\n} from \"./IssueManagerTaskDrawerEcho.ts\";\n\nexport { shouldAutoCollapseIssueManagerSidebar } from \"./useIssueManagerShellView.ts\";\n\nconst issueManagerTaskDrawerExitDurationMs = 180;\n\nexport interface IssueManagerShellProps {\n controller: IssueManagerController;\n emptyIllustration?: ReactNode;\n onCloseTaskDrawer: () => void;\n onDismissIssueCreate: () => void;\n renderLatestRunStatus?: IssueManagerLatestRunStatusRenderer;\n selectedIssue: IssueManagerIssueSummary | null;\n selectedTask: IssueManagerTaskSummary | null;\n}\n\nexport function IssueManagerShell({\n controller,\n emptyIllustration,\n onCloseTaskDrawer,\n onDismissIssueCreate,\n renderLatestRunStatus,\n selectedIssue,\n selectedTask\n}: IssueManagerShellProps): JSX.Element {\n const shellView = useIssueManagerShellView({\n controller,\n selectedIssue,\n selectedTask\n });\n const [renderedTaskDrawerTask, setRenderedTaskDrawerTask] =\n useState<IssueManagerTaskSummary | null>(selectedTask);\n const lastContentPointerDownRef = useRef<IssueManagerPointerSnapshot | null>(\n null\n );\n const taskDrawerOpenPointerRef = useRef<IssueManagerPointerSnapshot | null>(\n null\n );\n const pendingTaskDrawerCloseRef = useRef(false);\n const previousTaskDrawerOpenRef = useRef<{\n isOpen: boolean;\n taskId: string | null;\n }>({\n isOpen: shellView.content.isTaskDrawerOpen,\n taskId: selectedTask?.taskId ?? null\n });\n\n const handleCloseTaskDrawer = (source: IssueManagerTaskDrawerCloseSource) => {\n logIssueManagerDiagnostic(\n controller.diagnostics,\n \"task_drawer.close_source_requested\",\n {\n isTaskDrawerOpen: shellView.content.isTaskDrawerOpen,\n renderedTaskId: renderedTaskDrawerTask?.taskId ?? null,\n selectedIssueId: selectedIssue?.issueId ?? null,\n selectedTaskId: selectedTask?.taskId ?? null,\n source\n }\n );\n pendingTaskDrawerCloseRef.current = true;\n setRenderedTaskDrawerTask(null);\n onCloseTaskDrawer();\n };\n\n const handleContentPointerDownCapture = (\n event: PointerEvent<HTMLDivElement>\n ) => {\n if (shellView.content.isTaskDrawerOpen || event.button !== 0) {\n return;\n }\n lastContentPointerDownRef.current = {\n clientX: event.clientX,\n clientY: event.clientY,\n timeMs: performance.now()\n };\n };\n\n const shouldIgnoreTaskDrawerBackdropClick = (event: {\n clientX: number;\n clientY: number;\n }) => {\n const openPointer = taskDrawerOpenPointerRef.current;\n if (!openPointer) {\n return false;\n }\n const echo = shouldIgnoreIssueManagerTaskDrawerBackdropEcho({\n clickClientX: event.clientX,\n clickClientY: event.clientY,\n nowMs: performance.now(),\n openPointer\n });\n if (echo.ignore) {\n logIssueManagerDiagnostic(\n controller.diagnostics,\n \"task_drawer.backdrop_click_ignored_as_open_echo\",\n {\n clickClientX: event.clientX,\n clickClientY: event.clientY,\n distancePx: echo.distancePx,\n elapsedMs: echo.elapsedMs,\n openClientX: openPointer.clientX,\n openClientY: openPointer.clientY,\n selectedIssueId: selectedIssue?.issueId ?? null,\n selectedTaskId: selectedTask?.taskId ?? null\n }\n );\n }\n return echo.ignore;\n };\n\n useEffect(() => {\n const selectedTaskId = selectedTask?.taskId ?? null;\n const previousOpen = previousTaskDrawerOpenRef.current;\n\n if (shellView.content.isTaskDrawerOpen) {\n if (pendingTaskDrawerCloseRef.current) {\n return undefined;\n }\n if (!previousOpen.isOpen || previousOpen.taskId !== selectedTaskId) {\n taskDrawerOpenPointerRef.current = lastContentPointerDownRef.current;\n logIssueManagerDiagnostic(\n controller.diagnostics,\n \"task_drawer.open_state\",\n {\n isOpen: true,\n openClientX: taskDrawerOpenPointerRef.current?.clientX ?? null,\n openClientY: taskDrawerOpenPointerRef.current?.clientY ?? null,\n selectedIssueId: selectedIssue?.issueId ?? null,\n selectedTaskId,\n selectedTaskTitle: selectedTask?.title ?? null\n }\n );\n }\n previousTaskDrawerOpenRef.current = {\n isOpen: true,\n taskId: selectedTaskId\n };\n if (renderedTaskDrawerTask?.taskId !== selectedTaskId) {\n setRenderedTaskDrawerTask(selectedTask);\n }\n return undefined;\n }\n\n previousTaskDrawerOpenRef.current = {\n isOpen: false,\n taskId: null\n };\n taskDrawerOpenPointerRef.current = null;\n pendingTaskDrawerCloseRef.current = false;\n\n if (!renderedTaskDrawerTask) {\n return undefined;\n }\n\n logIssueManagerDiagnostic(\n controller.diagnostics,\n \"task_drawer.exit_started\",\n {\n renderedTaskId: renderedTaskDrawerTask.taskId,\n renderedTaskTitle: renderedTaskDrawerTask.title,\n selectedIssueId: selectedIssue?.issueId ?? null,\n selectedTaskId: selectedTask?.taskId ?? null\n }\n );\n const timeout = window.setTimeout(() => {\n logIssueManagerDiagnostic(\n controller.diagnostics,\n \"task_drawer.exit_finished\",\n {\n renderedTaskId: renderedTaskDrawerTask.taskId,\n renderedTaskTitle: renderedTaskDrawerTask.title\n }\n );\n setRenderedTaskDrawerTask(null);\n }, issueManagerTaskDrawerExitDurationMs);\n\n return () => {\n window.clearTimeout(timeout);\n };\n }, [\n controller.diagnostics,\n renderedTaskDrawerTask,\n renderedTaskDrawerTask?.taskId,\n selectedIssue?.issueId,\n selectedTask,\n selectedTask?.taskId,\n selectedTask?.title,\n shellView.content.isTaskDrawerOpen\n ]);\n const isTaskDrawerOpenForRender =\n shellView.content.isTaskDrawerOpen && !pendingTaskDrawerCloseRef.current;\n const taskDrawerTask = isTaskDrawerOpenForRender\n ? selectedTask\n : renderedTaskDrawerTask;\n const isTaskDrawerClosing =\n !isTaskDrawerOpenForRender && renderedTaskDrawerTask !== null;\n\n return (\n <div\n className=\"relative grid min-h-0 flex-1 grid-rows-[minmax(0,1fr)] overflow-hidden bg-transparent transition-[grid-template-columns] duration-[180ms] ease-[cubic-bezier(0.4,0,0.2,1)] motion-reduce:transition-none\"\n data-issue-manager-sidebar-auto-collapsed={\n shellView.sidebar.isAutoCollapsed ? \"true\" : undefined\n }\n data-issue-manager-sidebar-collapsed={\n shellView.sidebar.isCollapsed ? \"true\" : undefined\n }\n ref={shellView.layoutRef}\n style={shellView.layoutStyle}\n >\n {shellView.floatingNotice ? (\n <IssueManagerFloatingNotice notice={shellView.floatingNotice} />\n ) : null}\n\n <IssueManagerSidebar\n controller={controller}\n isCollapsed={shellView.sidebar.isCollapsed}\n isNarrowLayout={shellView.isNarrowLayout}\n showStandaloneState={shellView.sidebar.showStandaloneState}\n sidebarViewState={shellView.sidebar.viewState}\n statusCounts={shellView.sidebar.statusCounts}\n />\n\n {shellView.sidebar.isAutoCollapsed ? null : (\n <div\n aria-label={controller.copy.t(\"labels.resizeIssueList\")}\n aria-orientation=\"vertical\"\n aria-valuemax={shellView.resizeHandle.ariaValueMax}\n aria-valuemin={shellView.resizeHandle.ariaValueMin}\n aria-valuenow={shellView.resizeHandle.ariaValueNow}\n className={cn(\n \"group absolute top-0 bottom-0 left-[calc(var(--issue-manager-sidebar-width)-6px)] z-20 w-3 cursor-col-resize touch-none opacity-100 transition-[left,opacity] duration-[180ms,120ms] ease-[cubic-bezier(0.4,0,0.2,1),ease] motion-reduce:transition-none\",\n shellView.sidebar.isCollapsed &&\n \"pointer-events-none left-[-6px] opacity-0\"\n )}\n role=\"separator\"\n tabIndex={0}\n onKeyDown={shellView.resizeHandle.onKeyDown}\n onPointerCancel={shellView.resizeHandle.onPointerCancel}\n onPointerDown={shellView.resizeHandle.onPointerDown}\n onPointerMove={shellView.resizeHandle.onPointerMove}\n onPointerUp={shellView.resizeHandle.onPointerUp}\n >\n <span className=\"absolute top-0 bottom-0 left-1/2 w-px -translate-x-1/2 bg-transparent transition-[background-color,width] duration-150 group-hover:w-0.5 group-hover:bg-[color-mix(in_srgb,var(--border-focus)_40%,transparent)] group-focus-visible:w-0.5 group-focus-visible:bg-[color-mix(in_srgb,var(--border-focus)_40%,transparent)]\" />\n </div>\n )}\n\n <div\n className=\"relative h-full min-h-0 overflow-hidden bg-transparent @container/issue-manager-content\"\n onPointerDownCapture={handleContentPointerDownCapture}\n >\n <div className=\"flex h-full min-h-0 flex-col\">\n <div className=\"min-h-0 flex-1 overflow-hidden\">\n {shellView.content.isIssueEditing ? (\n <IssueManagerIssuePane\n controller={controller}\n renderLatestRunStatus={renderLatestRunStatus}\n selectedIssue={selectedIssue}\n onDismissCreate={onDismissIssueCreate}\n />\n ) : shellView.content.isTaskCreating ? (\n <IssueManagerTaskComposerPane\n controller={controller}\n selectedIssue={selectedIssue}\n onCancel={() => controller.setTaskEditorMode(\"read\")}\n />\n ) : selectedIssue ? (\n <IssueManagerIssuePane\n controller={controller}\n renderLatestRunStatus={renderLatestRunStatus}\n selectedIssue={selectedIssue}\n onDismissCreate={onDismissIssueCreate}\n />\n ) : (\n <IssueManagerShellEmptyState\n controller={controller}\n emptyIllustration={emptyIllustration}\n />\n )}\n </div>\n\n <IssueManagerBottomBar\n controller={controller}\n isNarrowLayout={shellView.isNarrowLayout}\n selectedIssue={selectedIssue}\n visible={shellView.content.showBottomBar}\n />\n </div>\n\n {taskDrawerTask ? (\n <IssueManagerTaskDrawer\n controller={controller}\n isClosing={isTaskDrawerClosing}\n renderLatestRunStatus={renderLatestRunStatus}\n selectedIssue={selectedIssue}\n selectedTask={taskDrawerTask}\n onClose={handleCloseTaskDrawer}\n shouldIgnoreBackdropClick={shouldIgnoreTaskDrawerBackdropClick}\n />\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction IssueManagerShellEmptyState({\n controller,\n emptyIllustration\n}: {\n controller: IssueManagerController;\n emptyIllustration?: ReactNode;\n}): JSX.Element {\n return (\n <div className=\"flex h-full min-h-[320px] items-center justify-center px-10 py-10\">\n <div className=\"grid max-w-[420px] justify-items-center gap-2 text-center\">\n {emptyIllustration ? (\n <div className=\"mb-2\">{emptyIllustration}</div>\n ) : null}\n <h2 className=\"text-[15px] font-semibold leading-5 text-[var(--text-primary)]\">\n {controller.copy.t(\"messages.noIssues\")}\n </h2>\n <p className=\"max-w-[420px] text-[13px] leading-5 text-[var(--text-secondary)]\">\n {controller.copy.t(\"emptyState\")}\n </p>\n <Button\n className=\"mt-2 gap-2\"\n type=\"button\"\n onClick={() => controller.setIssueEditorMode(\"create\")}\n >\n <FileCreateIcon size={16} />\n {controller.copy.t(\"actions.createIssue\")}\n </Button>\n </div>\n </div>\n );\n}\n","import { useState, type JSX } from \"react\";\nimport {\n Badge,\n Button,\n ConfirmationDialog,\n ScrollArea\n} from \"@tutti-os/ui-system\";\nimport type { IssueManagerIssueSummary } from \"../../../contracts/index.ts\";\nimport {\n formatIssueManagerTimestamp,\n resolveIssueManagerStatusLabel\n} from \"../../../services/controllerModel.ts\";\nimport { issueManagerStatusBadgeVariant } from \"../status/IssueManagerStatusBadge.ts\";\nimport {\n IssueManagerLatestRunStatusSection,\n IssueManagerOutputSection,\n IssueManagerSubtaskSection\n} from \"../issue/IssueManagerIssueSections.tsx\";\nimport {\n resolveIssueManagerIssueAcceptanceTaskId,\n resolveIssueManagerIssueRunTaskId,\n resolveIssueManagerVisibleSubtasks\n} from \"../issue/IssueManagerIssueAcceptanceState.ts\";\nimport type { IssueManagerLatestRunStatusRenderer } from \"../../latestRunStatusRenderer.ts\";\nimport { IssueManagerDescriptionSection } from \"../content/IssueManagerDescriptionSection.tsx\";\nimport { IssueManagerTitleTooltip } from \"../content/IssueManagerTitleTooltip.tsx\";\nimport { IssueManagerPaneLoadingState } from \"../panel/IssueManagerPanelSurface.tsx\";\nimport { resolveIssueManagerCreatorLabel } from \"../panel/IssueManagerPanelText.ts\";\nimport { IssueManagerRichTextTextarea } from \"../content/IssueManagerRichTextTextarea.tsx\";\nimport { IssueManagerTaskAcceptanceCard } from \"../task/IssueManagerTaskAcceptanceCard.tsx\";\nimport type { IssueManagerController } from \"../../react/index.ts\";\nimport { IssueManagerDraftTitleInput } from \"./IssueManagerDraftTitleInput.tsx\";\nimport {\n issueManagerEditorFooterFadeInClassName,\n issueManagerEditorRiseInClassName,\n issueManagerEditorRiseInDelay0ClassName,\n issueManagerEditorRiseInDelay1ClassName,\n issueManagerEditorRiseInDelay2ClassName\n} from \"./IssueManagerEditorMotion.ts\";\n\nexport { IssueManagerEmptyIllustration } from \"../panel/IssueManagerPanelSurface.tsx\";\n\nexport function IssueManagerIssuePane({\n controller,\n renderLatestRunStatus,\n selectedIssue,\n onDismissCreate\n}: {\n controller: IssueManagerController;\n renderLatestRunStatus?: IssueManagerLatestRunStatusRenderer;\n selectedIssue: IssueManagerIssueSummary | null;\n onDismissCreate: () => void;\n}): JSX.Element {\n const copy = controller.copy;\n const isIssueTitleMissing = controller.issueDraft.title.trim().length === 0;\n const isCreatingIssue = controller.issueEditorMode === \"create\";\n const isEditingIssue = controller.issueEditorMode === \"edit\";\n const issueContent = selectedIssue?.content ?? \"\";\n const tasks = controller.issueDetail.value?.tasks ?? [];\n const selectedTaskId = controller.nodeState.selectedTaskId;\n const issueLatestRun =\n controller.issueDetail.value?.latestRun ??\n controller.issueDetail.value?.recentRuns[0] ??\n null;\n const issueLatestOutputs = controller.issueDetail.value?.latestOutputs ?? [];\n const issueAcceptanceTaskId = resolveIssueManagerIssueAcceptanceTaskId({\n latestRun: issueLatestRun,\n selectedIssue,\n selectedTaskId,\n tasks\n });\n const issueRunTaskId = resolveIssueManagerIssueRunTaskId({\n latestRun: issueLatestRun,\n selectedIssue,\n tasks\n });\n const visibleTasks = resolveIssueManagerVisibleSubtasks({\n hiddenIssueRunTaskId: issueRunTaskId,\n tasks\n });\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [deleteBusy, setDeleteBusy] = useState(false);\n\n if (isCreatingIssue || isEditingIssue) {\n return (\n <div className=\"flex h-full min-h-0 flex-col overflow-hidden\">\n <ScrollArea\n scrollbarMode=\"native\"\n className=\"min-h-0 flex-1 [&_[data-orientation=vertical][data-slot=scroll-area-scrollbar]]:opacity-100 [&_[data-slot=scroll-area-viewport]]:overscroll-contain\"\n >\n <div className=\"flex min-h-full flex-col gap-[14px] px-7 py-8\">\n <div className=\"flex w-full min-w-0 flex-col gap-3\">\n <div\n className={`${issueManagerEditorRiseInClassName} ${issueManagerEditorRiseInDelay0ClassName}`}\n >\n <h2 className=\"m-0 text-[15px] font-semibold leading-[1.35] text-[var(--text-primary)]\">\n {isCreatingIssue\n ? copy.t(\"actions.createIssue\")\n : copy.t(\"actions.editIssue\")}\n </h2>\n </div>\n <div className=\"flex w-full min-w-0 flex-col gap-6\">\n <label\n className={`flex w-full min-w-0 flex-col gap-2 text-[13px] font-semibold text-[var(--text-secondary)] ${issueManagerEditorRiseInClassName} ${issueManagerEditorRiseInDelay1ClassName}`}\n >\n <span className=\"leading-5\">{copy.t(\"labels.title\")}</span>\n <IssueManagerDraftTitleInput\n placeholder={copy.t(\"composer.issueTitlePlaceholder\")}\n value={controller.issueDraft.title}\n onChange={controller.setIssueTitle}\n />\n </label>\n <div\n className={`flex min-h-0 w-full min-w-0 flex-col gap-2 text-[13px] font-semibold text-[var(--text-secondary)] ${issueManagerEditorRiseInClassName} ${issueManagerEditorRiseInDelay2ClassName}`}\n >\n <span className=\"leading-5\">{copy.t(\"labels.content\")}</span>\n <IssueManagerRichTextTextarea\n controller={controller}\n surface=\"issue\"\n textareaClassName=\"min-h-[180px] resize-none\"\n placeholder={copy.t(\"composer.issueContentPlaceholder\")}\n value={controller.issueDraft.content}\n onChange={controller.setIssueContent}\n />\n </div>\n </div>\n </div>\n </div>\n </ScrollArea>\n <div\n className={`shrink-0 border-t border-border-1 px-7 py-4 ${issueManagerEditorFooterFadeInClassName}`}\n >\n <div className=\"flex items-center justify-end gap-3\">\n <Button\n size=\"dialog\"\n type=\"button\"\n variant=\"secondary\"\n onClick={onDismissCreate}\n >\n {copy.t(\"actions.cancel\")}\n </Button>\n <Button\n disabled={isIssueTitleMissing}\n size=\"dialog\"\n type=\"button\"\n onClick={() => void controller.saveIssue()}\n >\n {copy.t(\"actions.saveIssue\")}\n </Button>\n </div>\n </div>\n </div>\n );\n }\n\n if (!selectedIssue) {\n return <div className=\"h-full min-h-0\" />;\n }\n\n return (\n <div className=\"flex h-full min-h-0 flex-col overflow-hidden\">\n <ScrollArea\n scrollbarMode=\"native\"\n className=\"min-h-0 flex-1 [&_[data-orientation=vertical][data-slot=scroll-area-scrollbar]]:opacity-100 [&_[data-slot=scroll-area-viewport]]:overscroll-contain\"\n >\n <div className=\"px-8 py-7\">\n {controller.issueDetail.isLoading &&\n controller.issueDetail.value === null ? (\n <IssueManagerPaneLoadingState />\n ) : (\n <div className=\"flex w-full min-w-0 flex-col gap-9\">\n <header className=\"grid gap-3\">\n <div className=\"flex items-center justify-between gap-6\">\n <IssueManagerTitleTooltip title={selectedIssue.title}>\n <h2 className=\"line-clamp-2 min-w-0 flex-1 whitespace-normal text-[15px] font-semibold leading-6 text-[var(--text-primary)] [overflow-wrap:anywhere]\">\n {selectedIssue.title}\n </h2>\n </IssueManagerTitleTooltip>\n <div className=\"flex shrink-0 items-center gap-2\">\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => controller.setIssueEditorMode(\"edit\")}\n >\n {copy.t(\"actions.edit\")}\n </Button>\n <Button\n className=\"text-[var(--state-danger)] hover:bg-[var(--on-danger)] hover:text-[var(--state-danger)]\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setDeleteDialogOpen(true)}\n >\n {copy.t(\"actions.delete\")}\n </Button>\n </div>\n </div>\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-2 text-[11px] font-normal leading-[1.3] text-[var(--text-secondary)]\">\n <Badge\n variant={issueManagerStatusBadgeVariant(\n selectedIssue.status\n )}\n >\n {resolveIssueManagerStatusLabel(copy, selectedIssue.status)}\n </Badge>\n <span\n aria-hidden=\"true\"\n className=\"h-4 w-px shrink-0 bg-[var(--line-2)]\"\n />\n <span className=\"text-[11px] font-normal leading-[1.3]\">\n {copy.t(\"labels.creator\")}{\" \"}\n {resolveIssueManagerCreatorLabel(selectedIssue)}\n </span>\n <span\n aria-hidden=\"true\"\n className=\"h-4 w-px shrink-0 bg-[var(--line-2)]\"\n />\n <span className=\"text-[11px] font-normal leading-[1.3]\">\n {copy.t(\"labels.createdAt\")}{\" \"}\n {formatIssueManagerTimestamp(selectedIssue.createdAtUnix) ||\n \"-\"}\n </span>\n </div>\n {issueAcceptanceTaskId ? (\n <IssueManagerTaskAcceptanceCard\n controller={controller}\n taskId={issueAcceptanceTaskId}\n />\n ) : null}\n </header>\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={deleteBusy}\n confirmLabel={copy.t(\"actions.delete\")}\n description={selectedIssue.title}\n open={deleteDialogOpen}\n title={copy.t(\"confirmations.deleteIssue\")}\n tone=\"destructive\"\n onConfirm={() => {\n setDeleteBusy(true);\n void controller\n .deleteIssue({ skipConfirmation: true })\n .finally(() => {\n setDeleteBusy(false);\n setDeleteDialogOpen(false);\n });\n }}\n onOpenChange={setDeleteDialogOpen}\n />\n <IssueManagerDescriptionSection\n content={issueContent}\n emptyLabel={copy.t(\"messages.issueContentEmpty\")}\n label={copy.t(\"labels.description\")}\n onMentionAction={controller.openMention}\n onOpen={controller.openReference}\n variant=\"plain\"\n />\n <IssueManagerLatestRunStatusSection\n copy={copy}\n latestRun={issueLatestRun}\n onOpenAgentSession={\n controller.canOpenAgentSessions\n ? controller.openAgentSession\n : undefined\n }\n renderLatestRunStatus={renderLatestRunStatus}\n title={selectedIssue.title}\n />\n <IssueManagerOutputSection\n copy={copy}\n outputs={issueLatestOutputs}\n onOpen={controller.openReference}\n />\n <IssueManagerSubtaskSection\n copy={copy}\n diagnostics={controller.diagnostics}\n onCreate={controller.createTaskDraft}\n onMoveTask={controller.moveTask}\n onSelectTask={controller.selectTask}\n selectedTaskId={selectedTaskId}\n tasks={visibleTasks}\n />\n </div>\n )}\n </div>\n </ScrollArea>\n </div>\n );\n}\n","import type { IssueManagerStatus } from \"../../../contracts/index.ts\";\n\nexport type IssueManagerStatusBadgeVariant =\n | \"accent\"\n | \"default\"\n | \"destructive\"\n | \"muted\"\n | \"pending\"\n | \"success\"\n | \"warning\";\n\nexport function issueManagerStatusBadgeVariant(\n status: IssueManagerStatus\n): IssueManagerStatusBadgeVariant {\n switch (status) {\n case \"running\":\n return \"accent\";\n case \"pending_acceptance\":\n return \"pending\";\n case \"completed\":\n return \"success\";\n case \"failed\":\n return \"destructive\";\n case \"canceled\":\n return \"muted\";\n default:\n return \"default\";\n }\n}\n","import { useState, type JSX, type MouseEvent } from \"react\";\nimport {\n AgentSessionsIcon,\n Badge,\n Button,\n FileCreateIcon,\n FileIcon,\n ScrollArea,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n IssueManagerFileReference,\n IssueManagerIssueSummary,\n IssueManagerRun,\n IssueManagerRunOutput,\n IssueManagerTaskSummary\n} from \"../../../contracts/index.ts\";\nimport {\n formatIssueManagerTimestamp,\n resolveIssueManagerStatusLabel\n} from \"../../../services/controllerModel.ts\";\nimport { IssueManagerTitleTooltip } from \"../content/IssueManagerTitleTooltip.tsx\";\nimport {\n stripIssueManagerDescriptionTerminalPunctuation,\n summarizeIssueManagerContent\n} from \"../panel/IssueManagerPanelText.ts\";\nimport { IssueManagerTaskListLoadingState } from \"../panel/IssueManagerPanelSurface.tsx\";\nimport { issueManagerStatusBadgeVariant } from \"../status/IssueManagerStatusBadge.ts\";\nimport { IssueManagerSubtaskBoard } from \"./IssueManagerSubtaskBoard.tsx\";\nimport type { IssueManagerLatestRunStatusRenderer } from \"../../latestRunStatusRenderer.ts\";\nimport type { IssueManagerController } from \"../../react/index.ts\";\nimport type { IssueManagerI18nRuntime } from \"../../../i18n/issueManagerI18n.ts\";\nimport { logIssueManagerDiagnostic } from \"../../../internal/issueManagerDiagnostics.ts\";\n\ntype IssueManagerSubtaskViewMode = \"list\" | \"board\";\n\nexport function IssueManagerDetailTextSection({\n body,\n isPlaceholder = false,\n label,\n meta,\n tone = \"muted\"\n}: {\n body: string;\n isPlaceholder?: boolean;\n label: string;\n meta?: string;\n tone?: \"destructive\" | \"muted\";\n}): JSX.Element {\n const bodyText = stripIssueManagerDescriptionTerminalPunctuation(body);\n const metaText = meta\n ? stripIssueManagerDescriptionTerminalPunctuation(meta)\n : null;\n const bodyClassName = cn(\n \"max-w-full whitespace-normal break-words text-[13px] leading-5 [overflow-wrap:anywhere]\",\n isPlaceholder\n ? \"font-normal text-[var(--text-secondary)]\"\n : tone === \"destructive\"\n ? \"font-semibold text-[var(--state-danger)]\"\n : \"font-semibold text-[var(--text-primary)]\"\n );\n\n if (isPlaceholder) {\n return (\n <section className=\"grid gap-2.5\">\n <h3 className=\"text-[13px] font-semibold text-[var(--text-primary)]\">\n {label}\n </h3>\n <p className={bodyClassName}>{bodyText}</p>\n </section>\n );\n }\n\n return (\n <section className=\"grid gap-2.5\">\n <h3 className=\"text-[13px] font-semibold text-[var(--text-primary)]\">\n {label}\n </h3>\n <div className=\"min-w-0 rounded-[12px] border border-[var(--line-2)] px-4 py-3\">\n <p className={bodyClassName}>{bodyText}</p>\n {metaText ? (\n <p className=\"mt-1 truncate text-[11px] font-normal text-[var(--text-secondary)]\">\n {metaText}\n </p>\n ) : null}\n </div>\n </section>\n );\n}\n\nexport function IssueManagerLatestRunStatusSection({\n copy,\n latestRun,\n onOpenAgentSession,\n renderLatestRunStatus,\n title\n}: {\n copy: IssueManagerI18nRuntime;\n latestRun: IssueManagerRun | null;\n onOpenAgentSession?: (run: IssueManagerRun) => Promise<void>;\n renderLatestRunStatus?: IssueManagerLatestRunStatusRenderer;\n title?: string | null;\n}): JSX.Element {\n if (!latestRun) {\n return (\n <IssueManagerDetailTextSection\n body={copy.t(\"messages.noExecutionStatus\")}\n isPlaceholder\n label={copy.t(\"labels.latestRunStatus\")}\n />\n );\n }\n\n const agentSessionId = latestRun.agentSessionId?.trim() ?? \"\";\n const statusLabel = resolveIssueManagerStatusLabel(copy, latestRun.status);\n const summary = latestRun.summary?.trim() ?? \"\";\n const timestamp =\n formatIssueManagerTimestamp(\n latestRun.updatedAtUnix ??\n latestRun.completedAtUnix ??\n latestRun.startedAtUnix ??\n latestRun.createdAtUnix\n ) || \"\";\n const errorMessage = latestRun.errorMessage?.trim() ?? \"\";\n const canOpenAgentSession = Boolean(agentSessionId && onOpenAgentSession);\n const renderedLatestRunStatus =\n agentSessionId && renderLatestRunStatus\n ? renderLatestRunStatus({\n canOpenAgentSession,\n copy,\n latestRun,\n title: title?.trim() || \"\",\n onOpenAgentSession\n })\n : null;\n if (\n renderedLatestRunStatus !== null &&\n renderedLatestRunStatus !== undefined\n ) {\n return (\n <section className=\"grid gap-2.5\">\n <h3 className=\"text-[13px] font-semibold text-[var(--text-primary)]\">\n {copy.t(\"labels.latestRunStatus\")}\n </h3>\n {renderedLatestRunStatus}\n </section>\n );\n }\n\n const primaryText =\n agentSessionId || summary || latestRun.runId || statusLabel;\n const content = (\n <div className=\"flex min-w-0 items-start gap-3\">\n <span\n aria-hidden=\"true\"\n className={cn(\n \"mt-0.5 flex h-7 w-7 shrink-0 items-center justify-center rounded-md border border-[var(--line-2)]\",\n canOpenAgentSession\n ? \"bg-transparency-actived text-primary\"\n : \"bg-transparent text-[var(--text-secondary)]\"\n )}\n >\n <AgentSessionsIcon size={16} />\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <p\n className={cn(\n \"min-w-0 flex-1 text-[13px] font-semibold leading-5 text-[var(--text-primary)] [overflow-wrap:anywhere]\",\n agentSessionId ? \"font-mono\" : \"\"\n )}\n >\n {primaryText}\n </p>\n <Badge variant={issueManagerStatusBadgeVariant(latestRun.status)}>\n {statusLabel}\n </Badge>\n </div>\n {summary && agentSessionId ? (\n <p className=\"mt-1 text-[11px] font-normal leading-5 text-[var(--text-secondary)] [overflow-wrap:anywhere]\">\n {summary}\n </p>\n ) : null}\n {timestamp ? (\n <p className=\"mt-1 truncate text-[11px] font-normal text-[var(--text-secondary)]\">\n {timestamp}\n </p>\n ) : null}\n {errorMessage ? (\n <p className=\"mt-2 text-[11px] font-medium leading-5 text-[var(--state-danger)] [overflow-wrap:anywhere]\">\n {errorMessage}\n </p>\n ) : null}\n </div>\n </div>\n );\n const cardClassName = cn(\n \"min-w-0 rounded-[12px] border border-[var(--line-2)] px-4 py-3\",\n canOpenAgentSession\n ? \"w-full bg-transparent text-left transition-colors hover:bg-transparency-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/25 focus-visible:ring-inset\"\n : \"bg-transparent\"\n );\n\n return (\n <section className=\"grid gap-2.5\">\n <h3 className=\"text-[13px] font-semibold text-[var(--text-primary)]\">\n {copy.t(\"labels.latestRunStatus\")}\n </h3>\n {canOpenAgentSession ? (\n <button\n aria-label={copy.t(\"actions.openAgentSession\")}\n className={cardClassName}\n title={copy.t(\"actions.openAgentSession\")}\n type=\"button\"\n onClick={() => {\n void onOpenAgentSession?.(latestRun);\n }}\n >\n {content}\n </button>\n ) : (\n <div className={cardClassName}>{content}</div>\n )}\n </section>\n );\n}\n\nexport function IssueManagerOutputSection({\n copy,\n onOpen,\n outputs\n}: {\n copy: IssueManagerI18nRuntime;\n onOpen: (reference: IssueManagerFileReference) => Promise<void>;\n outputs: readonly IssueManagerRunOutput[];\n}): JSX.Element {\n return (\n <section className=\"grid gap-2.5\">\n <h3 className=\"text-[13px] font-semibold text-[var(--text-primary)]\">\n {copy.t(\"labels.executionOutputs\")}\n </h3>\n {outputs.length === 0 ? (\n <p className=\"text-[13px] font-normal leading-6 text-[var(--text-secondary)]\">\n {copy.t(\"messages.noExecutionOutputs\")}\n </p>\n ) : (\n <div className=\"overflow-hidden rounded-[12px] border border-[var(--line-2)] bg-transparent\">\n {outputs.map((output) => (\n <button\n aria-label={copy.t(\"actions.openReference\")}\n className=\"flex w-full items-center justify-between gap-4 border-b border-[var(--line-2)] px-4 py-3 text-left transition-colors last:border-b-0 hover:bg-transparency-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/25 focus-visible:ring-inset\"\n key={output.outputId}\n title={copy.t(\"actions.openReference\")}\n type=\"button\"\n onClick={() => {\n void onOpen({\n displayName: output.displayName,\n kind: \"file\",\n path: output.path\n });\n }}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-3\">\n <span\n aria-hidden=\"true\"\n className=\"flex h-8 w-8 shrink-0 items-center justify-center rounded-md bg-[color-mix(in_srgb,var(--folder)_12%,transparent)] text-[var(--folder)]\"\n >\n <FileIcon size={16} />\n </span>\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-[13px] font-semibold text-[var(--text-primary)]\">\n {output.displayName}\n </span>\n <span className=\"mt-1 block truncate text-[11px] font-normal text-[var(--text-secondary)]\">\n {output.path}\n </span>\n </span>\n </span>\n <span className=\"flex shrink-0 items-center gap-2\">\n <span className=\"text-[11px] font-normal text-[var(--text-secondary)]\">\n {formatIssueManagerTimestamp(output.createdAtUnix) || \"\"}\n </span>\n </span>\n </button>\n ))}\n </div>\n )}\n </section>\n );\n}\n\nexport function IssueManagerSubtaskSection({\n copy,\n diagnostics,\n onCreate,\n onMoveTask,\n onSelectTask,\n selectedTaskId,\n tasks\n}: {\n copy: IssueManagerI18nRuntime;\n diagnostics?: IssueManagerController[\"diagnostics\"];\n onCreate: () => void;\n onMoveTask: IssueManagerController[\"moveTask\"];\n onSelectTask: (taskId: string | null) => void;\n selectedTaskId: string | null;\n tasks: readonly IssueManagerTaskSummary[];\n}): JSX.Element {\n const [viewMode, setViewMode] = useState<IssueManagerSubtaskViewMode>(\"list\");\n const handleSelectTask = (\n event: MouseEvent<HTMLButtonElement>,\n task: IssueManagerTaskSummary,\n surface: \"detail_subtasks\" | \"detail_subtasks_board\"\n ) => {\n logIssueManagerDiagnostic(diagnostics, \"task_row.click\", {\n clientX: event.clientX,\n clientY: event.clientY,\n selectedTaskId,\n surface,\n taskId: task.taskId,\n taskTitle: task.title\n });\n onSelectTask(task.taskId);\n };\n\n return (\n <section className=\"grid gap-2.5\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <h3 className=\"text-[13px] font-semibold text-[var(--text-primary)]\">\n {copy.t(\"labels.subtasks\")}\n </h3>\n <div className=\"flex items-center gap-2\">\n <IssueManagerSubtaskViewModeSwitch\n copy={copy}\n value={viewMode}\n onChange={setViewMode}\n />\n <Button\n size=\"dialog\"\n type=\"button\"\n variant=\"ghost\"\n onClick={onCreate}\n >\n <FileCreateIcon size={14} />\n {copy.t(\"actions.add\")}\n </Button>\n </div>\n </div>\n {tasks.length === 0 ? (\n <p className=\"text-[13px] font-normal leading-6 text-[var(--text-secondary)]\">\n {copy.t(\"messages.noSubtasksForIssue\")}\n </p>\n ) : viewMode === \"board\" ? (\n <IssueManagerSubtaskBoard\n copy={copy}\n tasks={tasks}\n onMoveTask={onMoveTask}\n onSelectTask={handleSelectTask}\n />\n ) : (\n <IssueManagerSubtaskList\n copy={copy}\n selectedTaskId={selectedTaskId}\n tasks={tasks}\n onSelectTask={handleSelectTask}\n />\n )}\n </section>\n );\n}\n\nfunction IssueManagerSubtaskViewModeSwitch({\n copy,\n onChange,\n value\n}: {\n copy: IssueManagerI18nRuntime;\n onChange: (value: IssueManagerSubtaskViewMode) => void;\n value: IssueManagerSubtaskViewMode;\n}): JSX.Element {\n const modes: readonly IssueManagerSubtaskViewMode[] = [\"list\", \"board\"];\n\n return (\n <div\n aria-label={copy.t(\"labels.subtaskViewMode\")}\n className=\"relative inline-grid h-8 shrink-0 grid-cols-2 items-center rounded-md bg-[var(--transparency-block)] p-0.5\"\n role=\"group\"\n >\n <span\n aria-hidden=\"true\"\n className={cn(\n \"absolute top-0.5 bottom-0.5 left-0.5 w-[calc((100%-4px)/2)] rounded-[5px] bg-[var(--background-fronted)] transition-transform duration-150 ease-out\",\n value === \"board\" && \"translate-x-full\"\n )}\n />\n {modes.map((mode) => (\n <button\n aria-pressed={value === mode}\n className={cn(\n \"relative z-[1] inline-flex h-7 w-14 items-center justify-center rounded-[5px] px-2.5 text-[12px] font-semibold leading-none transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/25\",\n value === mode\n ? \"text-[var(--text-primary)]\"\n : \"text-[var(--text-secondary)] hover:text-[var(--text-primary)]\"\n )}\n key={mode}\n type=\"button\"\n onClick={() => onChange(mode)}\n >\n {copy.t(mode === \"list\" ? \"labels.listView\" : \"labels.boardView\")}\n </button>\n ))}\n </div>\n );\n}\n\nfunction IssueManagerSubtaskList({\n copy,\n onSelectTask,\n selectedTaskId,\n tasks\n}: {\n copy: IssueManagerI18nRuntime;\n onSelectTask: (\n event: MouseEvent<HTMLButtonElement>,\n task: IssueManagerTaskSummary,\n surface: \"detail_subtasks\"\n ) => void;\n selectedTaskId: string | null;\n tasks: readonly IssueManagerTaskSummary[];\n}): JSX.Element {\n return (\n <div className=\"overflow-hidden rounded-lg border border-[var(--line-2)] bg-transparent\">\n {tasks.map((task) => (\n <button\n className={cn(\n \"flex w-full items-start justify-between gap-4 border-b border-[var(--line-2)] px-4 py-3 text-left transition-colors last:border-b-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/25 focus-visible:ring-inset\",\n selectedTaskId === task.taskId\n ? \"bg-transparency-actived\"\n : \"bg-transparent hover:bg-transparency-hover\"\n )}\n key={task.taskId}\n type=\"button\"\n onClick={(event) => onSelectTask(event, task, \"detail_subtasks\")}\n >\n <IssueManagerSubtaskListContent copy={copy} task={task} />\n <span className=\"shrink-0 text-[11px] font-normal text-[var(--text-secondary)]\">\n {formatIssueManagerTimestamp(\n task.createdAtUnix ?? task.updatedAtUnix\n ) || \"\"}\n </span>\n </button>\n ))}\n </div>\n );\n}\n\nfunction IssueManagerSubtaskListContent({\n copy,\n task\n}: {\n copy: IssueManagerI18nRuntime;\n task: IssueManagerTaskSummary;\n}): JSX.Element {\n return (\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex min-w-0 items-center gap-2.5\">\n <IssueManagerTitleTooltip title={task.title}>\n <span className=\"truncate text-[13px] font-semibold text-[var(--text-primary)]\">\n {task.title}\n </span>\n </IssueManagerTitleTooltip>\n <Badge variant={issueManagerStatusBadgeVariant(task.status)}>\n {resolveIssueManagerStatusLabel(copy, task.status)}\n </Badge>\n </div>\n <p className=\"mt-2 line-clamp-2 text-[11px] font-normal leading-[1.5] text-[var(--text-secondary)]\">\n {summarizeIssueManagerContent(\n task.content,\n copy.t(\"messages.taskContentEmpty\")\n )}\n </p>\n </div>\n );\n}\n\nexport function IssueManagerTaskSection({\n controller,\n selectedIssue,\n selectedTaskId\n}: {\n controller: IssueManagerController;\n selectedIssue: IssueManagerIssueSummary | null;\n selectedTaskId: string | null;\n}): JSX.Element {\n const copy = controller.copy;\n const tasks = controller.issueDetail.value?.tasks ?? [];\n\n return (\n <section className=\"border-t border-[var(--line-2)] bg-transparent\">\n <div className=\"flex items-center justify-between gap-4 border-b border-[var(--line-2)] px-8 py-4\">\n <div>\n <h3 className=\"text-[15px] font-semibold text-[var(--text-primary)]\">\n {copy.t(\"labels.taskList\")}\n </h3>\n </div>\n <Button\n className=\"px-3\"\n disabled={!selectedIssue}\n size=\"dialog\"\n type=\"button\"\n variant=\"secondary\"\n onClick={controller.createTaskDraft}\n >\n <FileCreateIcon size={14} />\n {copy.t(\"actions.createTask\")}\n </Button>\n </div>\n\n <ScrollArea scrollbarMode=\"native\" className=\"h-[16rem]\">\n <div className=\"px-8 py-5\">\n {controller.issueDetail.isLoading &&\n controller.issueDetail.value === null ? (\n <IssueManagerTaskListLoadingState />\n ) : tasks.length === 0 ? (\n <div className=\"overflow-hidden rounded-lg border border-[var(--line-2)] bg-transparent\">\n <div className=\"px-4 py-10 text-center\">\n <p className=\"text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {copy.t(\"messages.noTasks\")}\n </p>\n <p className=\"mt-2 text-[13px] font-normal leading-5 text-[var(--text-secondary)]\">\n {copy.t(\"messages.noTasksForIssueBody\")}\n </p>\n </div>\n </div>\n ) : (\n <div className=\"overflow-hidden rounded-lg border border-[var(--line-2)] bg-transparent\">\n {tasks.map((task) => (\n <button\n className={cn(\n \"block w-full border-b border-[var(--line-2)] px-3.5 py-3.5 text-left transition-colors last:border-b-0 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/25 focus-visible:ring-inset\",\n selectedTaskId === task.taskId\n ? \"bg-transparency-actived\"\n : \"bg-transparent hover:bg-transparency-hover\"\n )}\n key={task.taskId}\n type=\"button\"\n onClick={(event: MouseEvent<HTMLButtonElement>) => {\n logIssueManagerDiagnostic(\n controller.diagnostics,\n \"task_row.click\",\n {\n clientX: event.clientX,\n clientY: event.clientY,\n selectedTaskId,\n surface: \"task_section\",\n taskId: task.taskId,\n taskTitle: task.title\n }\n );\n controller.selectTask(task.taskId);\n }}\n >\n <div className=\"flex min-w-0 flex-col gap-2\">\n <div className=\"flex min-w-0 items-center justify-between gap-3\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2.5\">\n <IssueManagerTitleTooltip title={task.title}>\n <span className=\"line-clamp-1 text-[13px] font-semibold leading-[1.3] text-[var(--text-primary)]\">\n {task.title}\n </span>\n </IssueManagerTitleTooltip>\n <Badge\n variant={issueManagerStatusBadgeVariant(task.status)}\n >\n {resolveIssueManagerStatusLabel(copy, task.status)}\n </Badge>\n </div>\n <p className=\"text-[11px] font-normal leading-[18px] text-[var(--text-secondary)]\">\n {formatIssueManagerTimestamp(\n task.createdAtUnix ?? task.updatedAtUnix\n )}\n </p>\n </div>\n <p className=\"line-clamp-2 text-[11px] font-normal leading-[1.5] text-[var(--text-secondary)]\">\n {summarizeIssueManagerContent(\n task.content,\n copy.t(\"messages.taskContentEmpty\")\n )}\n </p>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n </ScrollArea>\n </section>\n );\n}\n","import { type ReactElement } from \"react\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@tutti-os/ui-system\";\n\nconst TRUNCATED_TITLE_TOOLTIP_DELAY_MS = 300;\n\nexport function IssueManagerTitleTooltip({\n children,\n title\n}: {\n children: ReactElement;\n title: string;\n}): ReactElement {\n return (\n <Tooltip delayDuration={TRUNCATED_TITLE_TOOLTIP_DELAY_MS}>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent\n className=\"max-w-[min(420px,calc(100vw-32px))] whitespace-normal text-left [overflow-wrap:anywhere]\"\n side=\"top\"\n >\n {title}\n </TooltipContent>\n </Tooltip>\n );\n}\n","import { extractIssueManagerPlainTextFromContent } from \"../../../core/index.ts\";\nimport type {\n IssueManagerIssueSummary,\n IssueManagerTaskSummary\n} from \"../../../contracts/index.ts\";\n\nexport function summarizeIssueManagerContent(\n content: string | null | undefined,\n fallback: string\n): string {\n const plainText = stripIssueManagerDescriptionTerminalPunctuation(\n extractIssueManagerPlainTextFromContent(content ?? \"\")\n );\n if (!plainText) {\n return stripIssueManagerDescriptionTerminalPunctuation(fallback);\n }\n if (plainText.length <= 120) {\n return plainText;\n }\n return `${plainText.slice(0, 117)}...`;\n}\n\nexport function stripIssueManagerDescriptionTerminalPunctuation(\n value: string\n): string {\n const trimmed = value.trim();\n if (!trimmed || trimmed.endsWith(\"...\") || trimmed.endsWith(\"…\")) {\n return trimmed;\n }\n return trimmed.replace(/[。..]+$/u, \"\");\n}\n\nexport function resolveTaskCreatorLabel(task: IssueManagerTaskSummary): string {\n return resolveIssueManagerCreatorLabel(task);\n}\n\nexport function resolveIssueManagerCreatorLabel(\n entity:\n | Pick<IssueManagerIssueSummary, \"creatorDisplayName\" | \"creatorUserId\">\n | Pick<IssueManagerTaskSummary, \"creatorDisplayName\" | \"creatorUserId\">\n): string {\n return entity.creatorDisplayName?.trim() || entity.creatorUserId;\n}\n","import { type JSX, type ReactNode } from \"react\";\nimport { Button, FileCreateIcon, cn } from \"@tutti-os/ui-system\";\n\nconst issueManagerLoadingBoneClassName =\n \"h-4 rounded-[4px] bg-[var(--transparency-block)]\";\n\nexport function IssueManagerEmptyIllustration({\n src\n}: {\n src: string;\n}): JSX.Element {\n return (\n <img\n alt=\"\"\n aria-hidden=\"true\"\n className=\"h-[84px] w-[84px] object-contain\"\n decoding=\"async\"\n draggable={false}\n src={src}\n />\n );\n}\n\nexport function IssueManagerTaskEmptyState({\n body,\n ctaLabel,\n illustration,\n onCreate,\n title\n}: {\n body: string;\n ctaLabel: string;\n illustration?: ReactNode;\n onCreate: () => void;\n title: string;\n}): JSX.Element {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center px-6 py-10 text-center\">\n <div className=\"grid max-w-[420px] justify-items-center gap-2\">\n {illustration ? <div className=\"mb-2\">{illustration}</div> : null}\n <p className=\"text-[15px] font-semibold leading-[1.35] text-[var(--text-primary)]\">\n {title}\n </p>\n <p className=\"max-w-[420px] text-[15px] leading-[1.3] text-[var(--text-secondary)]\">\n {body}\n </p>\n <Button\n className=\"mt-2 gap-2 px-[18px]\"\n size=\"dialog\"\n type=\"button\"\n onClick={onCreate}\n >\n <FileCreateIcon size={16} />\n {ctaLabel}\n </Button>\n </div>\n </div>\n );\n}\n\nexport function IssueManagerPaneLoadingState(): JSX.Element {\n return (\n <div\n aria-hidden=\"true\"\n className=\"mx-auto flex w-full max-w-4xl flex-col gap-9\"\n >\n <div className={cn(issueManagerLoadingBoneClassName, \"w-28\")} />\n <div className={cn(issueManagerLoadingBoneClassName, \"w-2/3\")} />\n <div className=\"grid gap-3\">\n <div className={cn(issueManagerLoadingBoneClassName, \"w-24\")} />\n <div className={cn(issueManagerLoadingBoneClassName, \"w-full\")} />\n <div className={cn(issueManagerLoadingBoneClassName, \"w-11/12\")} />\n <div className={cn(issueManagerLoadingBoneClassName, \"w-10/12\")} />\n </div>\n <div className=\"grid gap-3\">\n <div className={cn(issueManagerLoadingBoneClassName, \"w-32\")} />\n <div className={cn(issueManagerLoadingBoneClassName, \"w-full\")} />\n <div className={cn(issueManagerLoadingBoneClassName, \"w-9/12\")} />\n </div>\n </div>\n );\n}\n\nexport function IssueManagerTaskListLoadingState(): JSX.Element {\n return (\n <div aria-hidden=\"true\" className=\"overflow-hidden bg-transparent\">\n {Array.from({ length: 3 }, (_, index) => (\n <div\n className=\"border-b border-border/70 px-3.5 py-3.5 last:border-b-0\"\n key={index}\n >\n <div className=\"flex items-center justify-between gap-3\">\n <div className={cn(issueManagerLoadingBoneClassName, \"w-2/5\")} />\n <div className={cn(issueManagerLoadingBoneClassName, \"w-20\")} />\n </div>\n <div\n className={cn(issueManagerLoadingBoneClassName, \"mt-3 w-full\")}\n />\n <div className={cn(issueManagerLoadingBoneClassName, \"mt-2 w-4/5\")} />\n </div>\n ))}\n </div>\n );\n}\n\nexport function IssueManagerTaskDrawerLoadingState(): JSX.Element {\n return (\n <div aria-hidden=\"true\" className=\"grid gap-5\">\n <div className={cn(issueManagerLoadingBoneClassName, \"w-full\")} />\n <div className=\"grid grid-cols-2 gap-3\">\n <div className={issueManagerLoadingBoneClassName} />\n <div className={issueManagerLoadingBoneClassName} />\n </div>\n <div className=\"grid gap-3\">\n <div className={cn(issueManagerLoadingBoneClassName, \"w-24\")} />\n <div className={cn(issueManagerLoadingBoneClassName, \"w-full\")} />\n <div className={cn(issueManagerLoadingBoneClassName, \"w-11/12\")} />\n <div className={cn(issueManagerLoadingBoneClassName, \"w-9/12\")} />\n </div>\n </div>\n );\n}\n","import {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type DragEvent,\n type JSX,\n type MouseEvent\n} from \"react\";\nimport { cn } from \"@tutti-os/ui-system\";\nimport type {\n IssueManagerStatus,\n IssueManagerTaskSummary\n} from \"../../../contracts/index.ts\";\nimport {\n formatIssueManagerTimestamp,\n resolveIssueManagerStatusLabel\n} from \"../../../services/controllerModel.ts\";\nimport type { IssueManagerI18nRuntime } from \"../../../i18n/issueManagerI18n.ts\";\nimport { IssueManagerTitleTooltip } from \"../content/IssueManagerTitleTooltip.tsx\";\nimport { summarizeIssueManagerContent } from \"../panel/IssueManagerPanelText.ts\";\n\ntype IssueManagerSubtaskBoardStatus =\n | \"not_started\"\n | \"running\"\n | \"pending_acceptance\"\n | \"completed\"\n | \"failed\"\n | \"canceled\";\n\ntype IssueManagerSubtaskDragState = {\n cardHeight: number;\n sourceStatus: IssueManagerSubtaskBoardStatus;\n taskId: string;\n};\ntype IssueManagerSubtaskDropPreview = {\n index: number;\n status: IssueManagerSubtaskBoardStatus;\n};\ntype IssueManagerSubtaskOptimisticDrop = {\n index: number;\n status: IssueManagerSubtaskBoardStatus;\n taskId: string;\n};\n\nconst issueManagerSubtaskBoardStatuses = [\n \"not_started\",\n \"running\",\n \"pending_acceptance\",\n \"completed\",\n \"failed\",\n \"canceled\"\n] as const satisfies readonly IssueManagerSubtaskBoardStatus[];\n\nconst issueManagerTaskStatusDragDataType =\n \"application/x-tutti-issue-manager-task-status-drag\";\nconst issueManagerBoardLayoutItemAttribute =\n \"data-issue-manager-board-layout-item\";\nconst issueManagerBoardLayoutAnimationDurationMs = 180;\nconst issueManagerBoardLayoutAnimationEasing = \"cubic-bezier(0.22,1,0.36,1)\";\nconst issueManagerSubtaskDragShadow = \"var(--shadow-soft)\";\nconst issueManagerSubtaskDragShadowClassName = \"shadow-[var(--shadow-soft)]\";\nconst issueManagerBoardLayoutAnimations = new WeakMap<HTMLElement, Animation>();\nconst issueManagerBoardLayoutInitialScrollSnapshot = {\n left: 0,\n top: 0\n};\n\nconst issueManagerBoardStatusSet: Record<IssueManagerSubtaskBoardStatus, true> =\n {\n canceled: true,\n completed: true,\n failed: true,\n not_started: true,\n pending_acceptance: true,\n running: true\n };\n\nfunction resolveIssueManagerSubtaskBoardStatus(\n status: IssueManagerStatus\n): IssueManagerSubtaskBoardStatus {\n return status in issueManagerBoardStatusSet\n ? (status as IssueManagerSubtaskBoardStatus)\n : \"not_started\";\n}\n\nfunction isIssueManagerTaskBoardStatus(\n status: IssueManagerStatus\n): status is IssueManagerSubtaskBoardStatus {\n return status in issueManagerBoardStatusSet;\n}\n\nfunction canIssueManagerCrossColumnDropTaskStatus(input: {\n sourceStatus: IssueManagerSubtaskBoardStatus;\n targetStatus: IssueManagerSubtaskBoardStatus;\n}): boolean {\n if (input.sourceStatus === \"pending_acceptance\") {\n return (\n input.targetStatus === \"not_started\" || input.targetStatus === \"completed\"\n );\n }\n if (input.sourceStatus === \"completed\") {\n return (\n input.targetStatus === \"not_started\" ||\n input.targetStatus === \"pending_acceptance\"\n );\n }\n return false;\n}\n\nfunction canIssueManagerDropTaskStatus(input: {\n sourceStatus: IssueManagerSubtaskBoardStatus;\n targetStatus: IssueManagerSubtaskBoardStatus;\n}): boolean {\n if (input.sourceStatus === input.targetStatus) {\n return true;\n }\n return canIssueManagerCrossColumnDropTaskStatus(input);\n}\n\nfunction groupIssueManagerSubtasksByStatus(\n tasks: readonly IssueManagerTaskSummary[],\n optimisticDrop: IssueManagerSubtaskOptimisticDrop | null = null\n): Record<IssueManagerSubtaskBoardStatus, IssueManagerTaskSummary[]> {\n const groups: Record<\n IssueManagerSubtaskBoardStatus,\n IssueManagerTaskSummary[]\n > = {\n canceled: [],\n completed: [],\n failed: [],\n not_started: [],\n pending_acceptance: [],\n running: []\n };\n let optimisticTask: IssueManagerTaskSummary | null = null;\n\n for (const task of tasks) {\n if (optimisticDrop?.taskId === task.taskId) {\n optimisticTask = {\n ...task,\n status: optimisticDrop.status\n };\n continue;\n }\n groups[resolveIssueManagerSubtaskBoardStatus(task.status)].push(task);\n }\n\n if (optimisticTask && optimisticDrop) {\n const targetGroup = groups[optimisticDrop.status];\n targetGroup.splice(\n Math.min(Math.max(0, optimisticDrop.index), targetGroup.length),\n 0,\n optimisticTask\n );\n }\n\n return groups;\n}\n\nfunction isIssueManagerOptimisticDropSettled(\n tasks: readonly IssueManagerTaskSummary[],\n optimisticDrop: IssueManagerSubtaskOptimisticDrop\n): boolean {\n const optimisticTask = tasks.find(\n (task) => task.taskId === optimisticDrop.taskId\n );\n if (!optimisticTask) {\n return true;\n }\n if (\n resolveIssueManagerSubtaskBoardStatus(optimisticTask.status) !==\n optimisticDrop.status\n ) {\n return false;\n }\n const targetGroup = tasks.filter(\n (task) =>\n resolveIssueManagerSubtaskBoardStatus(task.status) ===\n optimisticDrop.status\n );\n const taskIndex = targetGroup.findIndex(\n (task) => task.taskId === optimisticDrop.taskId\n );\n if (taskIndex < 0) {\n return false;\n }\n const targetIndex = Math.min(\n Math.max(0, optimisticDrop.index),\n Math.max(0, targetGroup.length - 1)\n );\n return taskIndex === targetIndex;\n}\n\nfunction readIssueManagerTaskStatusDragData(\n dataTransfer: DataTransfer\n): { sourceStatus: IssueManagerSubtaskBoardStatus; taskId: string } | null {\n try {\n const raw = dataTransfer.getData(issueManagerTaskStatusDragDataType);\n const payload = JSON.parse(raw) as Partial<{\n sourceStatus: IssueManagerStatus;\n taskId: unknown;\n }>;\n const taskId =\n typeof payload.taskId === \"string\" ? payload.taskId.trim() : \"\";\n const sourceStatus = payload.sourceStatus ?? \"\";\n if (!taskId || !isIssueManagerTaskBoardStatus(sourceStatus)) {\n return null;\n }\n return {\n sourceStatus,\n taskId\n };\n } catch {\n return null;\n }\n}\n\nfunction writeIssueManagerTaskStatusDragData(\n event: DragEvent<HTMLButtonElement>,\n task: IssueManagerTaskSummary,\n sourceStatus: IssueManagerSubtaskBoardStatus\n): void {\n event.dataTransfer.effectAllowed = \"move\";\n event.dataTransfer.setData(\n issueManagerTaskStatusDragDataType,\n JSON.stringify({ sourceStatus, taskId: task.taskId })\n );\n event.dataTransfer.setData(\"text/plain\", task.taskId);\n}\n\nfunction setIssueManagerTaskDragImage(\n event: DragEvent<HTMLButtonElement>\n): number {\n const source = event.currentTarget;\n const rect = source.getBoundingClientRect();\n const clone = source.cloneNode(true) as HTMLElement;\n clone.style.position = \"fixed\";\n clone.style.pointerEvents = \"none\";\n clone.style.top = \"-10000px\";\n clone.style.left = \"-10000px\";\n clone.style.width = `${rect.width}px`;\n clone.style.borderRadius = \"8px\";\n clone.style.boxShadow = issueManagerSubtaskDragShadow;\n clone.style.background = \"var(--background-fronted)\";\n clone.style.opacity = \"1\";\n document.body.append(clone);\n event.dataTransfer.setDragImage(\n clone,\n Math.max(0, event.clientX - rect.left),\n Math.max(0, event.clientY - rect.top)\n );\n window.setTimeout(() => clone.remove(), 0);\n return rect.height;\n}\n\nfunction resolveIssueManagerDropPreviewIndex(input: {\n draggingTaskId: string | null;\n event: DragEvent<HTMLDivElement>;\n}): number {\n const cards = Array.from(\n input.event.currentTarget.querySelectorAll<HTMLElement>(\n \"[data-issue-manager-board-card]\"\n )\n ).filter(\n (card) => card.dataset.issueManagerBoardCardTaskId !== input.draggingTaskId\n );\n for (const [index, card] of cards.entries()) {\n const rect = card.getBoundingClientRect();\n if (input.event.clientY < rect.top + rect.height / 2) {\n return index;\n }\n }\n return cards.length;\n}\n\nfunction orderIssueManagerTasksForSameColumnDropPreview(input: {\n dragState: IssueManagerSubtaskDragState | null;\n dropPreview: IssueManagerSubtaskDropPreview | null;\n status: IssueManagerSubtaskBoardStatus;\n tasks: readonly IssueManagerTaskSummary[];\n}): readonly IssueManagerTaskSummary[] {\n if (\n !input.dragState ||\n input.dragState.sourceStatus !== input.status ||\n input.dropPreview?.status !== input.status\n ) {\n return input.tasks;\n }\n const sourceTaskIndex = input.tasks.findIndex(\n (task) => task.taskId === input.dragState?.taskId\n );\n if (sourceTaskIndex < 0) {\n return input.tasks;\n }\n const movingTask = input.tasks[sourceTaskIndex];\n if (!movingTask) {\n return input.tasks;\n }\n const nextTasks = input.tasks.filter((_, index) => index !== sourceTaskIndex);\n const targetIndex = Math.min(\n Math.max(0, input.dropPreview.index),\n nextTasks.length\n );\n if (targetIndex === sourceTaskIndex) {\n return input.tasks;\n }\n nextTasks.splice(targetIndex, 0, movingTask);\n return nextTasks;\n}\n\nfunction isLeavingIssueManagerBoardColumn(\n event: DragEvent<HTMLDivElement>\n): boolean {\n const relatedTarget = event.relatedTarget;\n if (\n relatedTarget instanceof Node &&\n event.currentTarget.contains(relatedTarget)\n ) {\n return false;\n }\n const rect = event.currentTarget.getBoundingClientRect();\n return !(\n event.clientX >= rect.left &&\n event.clientX <= rect.right &&\n event.clientY >= rect.top &&\n event.clientY <= rect.bottom\n );\n}\n\nfunction prefersReducedIssueManagerBoardMotion(): boolean {\n return (\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n );\n}\n\nfunction readIssueManagerBoardScrollSnapshot(board: HTMLElement): {\n left: number;\n top: number;\n} {\n const scrollContainer = board.parentElement;\n return {\n left: scrollContainer?.scrollLeft ?? 0,\n top: scrollContainer?.scrollTop ?? 0\n };\n}\n\nfunction useIssueManagerBoardLayoutAnimation() {\n const boardRef = useRef<HTMLDivElement | null>(null);\n const previousRectsRef = useRef<Map<string, DOMRectReadOnly>>(new Map());\n const previousScrollSnapshotRef = useRef(\n issueManagerBoardLayoutInitialScrollSnapshot\n );\n\n useLayoutEffect(() => {\n const board = boardRef.current;\n if (!board) {\n return;\n }\n const elements = Array.from(\n board.querySelectorAll<HTMLElement>(\n `[${issueManagerBoardLayoutItemAttribute}]`\n )\n );\n const nextRects = new Map<string, DOMRectReadOnly>();\n const nextScrollSnapshot = readIssueManagerBoardScrollSnapshot(board);\n const previousScrollSnapshot = previousScrollSnapshotRef.current;\n const didScrollSinceLastLayout =\n previousScrollSnapshot.left !== nextScrollSnapshot.left ||\n previousScrollSnapshot.top !== nextScrollSnapshot.top;\n const shouldAnimate =\n !didScrollSinceLastLayout && !prefersReducedIssueManagerBoardMotion();\n const activeVisualTopByKey = new Map<string, number>();\n\n for (const element of elements) {\n const key = element.getAttribute(issueManagerBoardLayoutItemAttribute);\n const animation = issueManagerBoardLayoutAnimations.get(element);\n if (!key || !animation) {\n continue;\n }\n activeVisualTopByKey.set(key, element.getBoundingClientRect().top);\n animation.cancel();\n issueManagerBoardLayoutAnimations.delete(element);\n }\n\n for (const element of elements) {\n const key = element.getAttribute(issueManagerBoardLayoutItemAttribute);\n if (!key) {\n continue;\n }\n const rect = element.getBoundingClientRect();\n nextRects.set(key, rect);\n const previousRect = previousRectsRef.current.get(key);\n if (!shouldAnimate || !previousRect) {\n continue;\n }\n const deltaY =\n (activeVisualTopByKey.get(key) ?? previousRect.top) - rect.top;\n if (Math.abs(deltaY) < 0.5) {\n continue;\n }\n const animation = element.animate(\n [\n { transform: `translate3d(0, ${deltaY}px, 0)` },\n { transform: \"translate3d(0, 0, 0)\" }\n ],\n {\n duration: issueManagerBoardLayoutAnimationDurationMs,\n easing: issueManagerBoardLayoutAnimationEasing\n }\n );\n issueManagerBoardLayoutAnimations.set(element, animation);\n animation.onfinish = () => {\n if (issueManagerBoardLayoutAnimations.get(element) === animation) {\n issueManagerBoardLayoutAnimations.delete(element);\n }\n };\n animation.oncancel = animation.onfinish;\n }\n\n previousRectsRef.current = nextRects;\n previousScrollSnapshotRef.current = nextScrollSnapshot;\n });\n\n return boardRef;\n}\n\nexport function IssueManagerSubtaskBoard({\n copy,\n onMoveTask,\n onSelectTask,\n tasks\n}: {\n copy: IssueManagerI18nRuntime;\n onMoveTask: (input: {\n targetIndex: number;\n targetStatus: IssueManagerSubtaskBoardStatus;\n taskId: string;\n visibleTaskIds?: readonly string[];\n }) => Promise<void>;\n onSelectTask: (\n event: MouseEvent<HTMLButtonElement>,\n task: IssueManagerTaskSummary,\n surface: \"detail_subtasks_board\"\n ) => void;\n tasks: readonly IssueManagerTaskSummary[];\n}): JSX.Element {\n const [optimisticDrop, setOptimisticDrop] =\n useState<IssueManagerSubtaskOptimisticDrop | null>(null);\n const groups = groupIssueManagerSubtasksByStatus(tasks, optimisticDrop);\n const visibleTaskIds = tasks.map((task) => task.taskId);\n const [dragState, setDragState] =\n useState<IssueManagerSubtaskDragState | null>(null);\n const [dropPreview, setDropPreview] =\n useState<IssueManagerSubtaskDropPreview | null>(null);\n const boardLayoutRef = useIssueManagerBoardLayoutAnimation();\n\n useEffect(() => {\n if (!optimisticDrop) {\n return;\n }\n if (isIssueManagerOptimisticDropSettled(tasks, optimisticDrop)) {\n setOptimisticDrop(null);\n }\n }, [optimisticDrop, tasks]);\n\n const handleTaskDragStart = (\n event: DragEvent<HTMLButtonElement>,\n task: IssueManagerTaskSummary,\n sourceStatus: IssueManagerSubtaskBoardStatus\n ) => {\n const cardHeight = setIssueManagerTaskDragImage(event);\n writeIssueManagerTaskStatusDragData(event, task, sourceStatus);\n setDragState({\n cardHeight,\n sourceStatus,\n taskId: task.taskId\n });\n setOptimisticDrop(null);\n setDropPreview(null);\n };\n const handleTaskDragEnd = () => {\n setDragState(null);\n setDropPreview(null);\n };\n\n return (\n <div className=\"min-w-0 overflow-x-auto pb-1 [scrollbar-width:thin]\">\n <div\n className=\"grid min-w-[1560px] grid-cols-6 gap-3\"\n ref={boardLayoutRef}\n >\n {issueManagerSubtaskBoardStatuses.map((status) => (\n <IssueManagerSubtaskBoardColumn\n copy={copy}\n key={status}\n status={status}\n tasks={groups[status]}\n visibleTaskIds={visibleTaskIds}\n dragState={dragState}\n dropPreview={dropPreview}\n onDropPreviewChange={setDropPreview}\n onOptimisticDropChange={setOptimisticDrop}\n onMoveTask={onMoveTask}\n onSelectTask={onSelectTask}\n onTaskDragEnd={handleTaskDragEnd}\n onTaskDragStart={handleTaskDragStart}\n />\n ))}\n </div>\n </div>\n );\n}\n\nfunction IssueManagerSubtaskBoardColumn({\n copy,\n dragState,\n dropPreview,\n onMoveTask,\n onDropPreviewChange,\n onOptimisticDropChange,\n onSelectTask,\n onTaskDragEnd,\n onTaskDragStart,\n status,\n tasks,\n visibleTaskIds\n}: {\n copy: IssueManagerI18nRuntime;\n dragState: IssueManagerSubtaskDragState | null;\n dropPreview: IssueManagerSubtaskDropPreview | null;\n onMoveTask: (input: {\n targetIndex: number;\n targetStatus: IssueManagerSubtaskBoardStatus;\n taskId: string;\n visibleTaskIds?: readonly string[];\n }) => Promise<void>;\n onDropPreviewChange: (preview: IssueManagerSubtaskDropPreview | null) => void;\n onOptimisticDropChange: (\n optimisticDrop: IssueManagerSubtaskOptimisticDrop | null\n ) => void;\n onSelectTask: (\n event: MouseEvent<HTMLButtonElement>,\n task: IssueManagerTaskSummary,\n surface: \"detail_subtasks_board\"\n ) => void;\n onTaskDragEnd: () => void;\n onTaskDragStart: (\n event: DragEvent<HTMLButtonElement>,\n task: IssueManagerTaskSummary,\n sourceStatus: IssueManagerSubtaskBoardStatus\n ) => void;\n status: IssueManagerSubtaskBoardStatus;\n tasks: readonly IssueManagerTaskSummary[];\n visibleTaskIds: readonly string[];\n}): JSX.Element {\n const canAcceptTaskDrop =\n Boolean(dragState) &&\n canIssueManagerDropTaskStatus({\n sourceStatus: dragState?.sourceStatus ?? \"completed\",\n targetStatus: status\n });\n const handleDragOver = (event: DragEvent<HTMLDivElement>) => {\n if (!canAcceptTaskDrop) {\n return;\n }\n event.preventDefault();\n event.dataTransfer.dropEffect = \"move\";\n const nextPreview = {\n index: resolveIssueManagerDropPreviewIndex({\n draggingTaskId: dragState?.taskId ?? null,\n event\n }),\n status\n };\n if (\n dropPreview?.index !== nextPreview.index ||\n dropPreview?.status !== nextPreview.status\n ) {\n onDropPreviewChange(nextPreview);\n }\n };\n const handleDragLeave = (event: DragEvent<HTMLDivElement>) => {\n if (\n dropPreview?.status === status &&\n isLeavingIssueManagerBoardColumn(event)\n ) {\n onDropPreviewChange(null);\n }\n };\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n const payload = readIssueManagerTaskStatusDragData(event.dataTransfer);\n const taskId = payload?.taskId ?? dragState?.taskId;\n const sourceStatus = payload?.sourceStatus ?? dragState?.sourceStatus;\n if (\n !taskId ||\n !sourceStatus ||\n !canIssueManagerDropTaskStatus({\n sourceStatus,\n targetStatus: status\n })\n ) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n const targetIndex =\n dropPreview?.status === status\n ? dropPreview.index\n : resolveIssueManagerDropPreviewIndex({\n draggingTaskId: taskId,\n event\n });\n onOptimisticDropChange({\n index: targetIndex,\n status,\n taskId\n });\n onDropPreviewChange(null);\n void onMoveTask({\n targetIndex,\n targetStatus: status,\n taskId,\n visibleTaskIds\n }).catch(() => {\n onOptimisticDropChange(null);\n });\n };\n const renderTasks = orderIssueManagerTasksForSameColumnDropPreview({\n dragState,\n dropPreview,\n status,\n tasks\n });\n const isSameColumnDropPreview =\n Boolean(dragState) &&\n dragState?.sourceStatus === status &&\n dropPreview?.status === status &&\n tasks.some((task) => task.taskId === dragState?.taskId);\n const activeDropPreviewDragState =\n dropPreview?.status === status && dragState && !isSameColumnDropPreview\n ? dragState\n : null;\n const renderDropPreview = (renderIndex: number): JSX.Element | null => {\n if (!activeDropPreviewDragState || dropPreview?.index !== renderIndex) {\n return null;\n }\n return (\n <div\n aria-hidden=\"true\"\n className={cn(\n \"rounded-[8px] border border-dashed motion-safe:animate-in motion-safe:fade-in-0 motion-safe:zoom-in-[0.98] motion-safe:duration-[160ms] motion-safe:ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:animate-none\",\n resolveIssueManagerBoardPlaceholderClassName(status)\n )}\n data-issue-manager-board-layout-item={`preview:${status}`}\n data-task-status-drop-preview\n style={{\n height: `${Math.max(\n 64,\n Math.min(activeDropPreviewDragState.cardHeight, 160)\n )}px`\n }}\n />\n );\n };\n\n return (\n <div\n className={cn(\n \"min-h-[220px] rounded-lg border px-2.5 py-2.5\",\n canAcceptTaskDrop &&\n \"transition-shadow duration-[180ms] ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:transition-none\",\n resolveIssueManagerBoardColumnClassName(status)\n )}\n data-task-status-drop-target={canAcceptTaskDrop || undefined}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"flex min-w-0 items-center gap-1.5\">\n <span\n aria-hidden=\"true\"\n className={cn(\n \"size-2 rounded-full\",\n resolveIssueManagerBoardDotClassName(status)\n )}\n />\n <span className=\"truncate text-[12px] font-semibold text-[var(--text-primary)]\">\n {resolveIssueManagerStatusLabel(copy, status)}\n </span>\n </div>\n <span className=\"shrink-0 text-[12px] font-semibold text-[var(--text-secondary)]\">\n {tasks.length}\n </span>\n </div>\n <div className=\"grid gap-2\">\n {renderDropPreview(0)}\n {renderTasks.map((task, index) => {\n const dragStatus = resolveIssueManagerSubtaskBoardStatus(task.status);\n const isDraggingTask = dragState?.taskId === task.taskId;\n return (\n <div\n className=\"grid gap-2\"\n data-issue-manager-board-layout-item={`task:${status}:${task.taskId}`}\n key={task.taskId}\n >\n <button\n className={cn(\n \"rounded-[8px] bg-[var(--background-fronted)] px-3 py-2.5 text-left transition-shadow duration-150 motion-reduce:transition-none focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/25\",\n \"cursor-grab active:cursor-grabbing\",\n isDraggingTask && issueManagerSubtaskDragShadowClassName\n )}\n data-issue-manager-board-card\n data-issue-manager-board-card-task-id={task.taskId}\n draggable\n type=\"button\"\n onClick={(event) =>\n onSelectTask(event, task, \"detail_subtasks_board\")\n }\n onDragEnd={onTaskDragEnd}\n onDragStart={(event) => {\n if (!dragStatus) {\n event.preventDefault();\n return;\n }\n onTaskDragStart(event, task, dragStatus);\n }}\n >\n <IssueManagerTitleTooltip title={task.title}>\n <span className=\"line-clamp-2 text-[13px] font-semibold leading-[1.35] text-[var(--text-primary)] [overflow-wrap:anywhere]\">\n {task.title}\n </span>\n </IssueManagerTitleTooltip>\n <p className=\"mt-2 line-clamp-3 text-[11px] font-normal leading-[1.5] text-[var(--text-secondary)] [overflow-wrap:anywhere]\">\n {summarizeIssueManagerContent(\n task.content,\n copy.t(\"messages.taskContentEmpty\")\n )}\n </p>\n <span className=\"mt-2 block text-[11px] font-normal text-[var(--text-tertiary)]\">\n {formatIssueManagerTimestamp(\n task.createdAtUnix ?? task.updatedAtUnix\n ) || \"\"}\n </span>\n </button>\n {renderDropPreview(index + 1)}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nfunction resolveIssueManagerBoardPlaceholderClassName(\n status: IssueManagerSubtaskBoardStatus\n): string {\n switch (status) {\n case \"pending_acceptance\":\n return \"border-[color-mix(in_srgb,var(--tutti-purple)_24%,transparent)] bg-[color-mix(in_srgb,var(--tutti-purple)_18%,transparent)]\";\n case \"completed\":\n return \"border-[color-mix(in_srgb,var(--state-success)_24%,transparent)] bg-[color-mix(in_srgb,var(--state-success)_18%,transparent)]\";\n case \"not_started\":\n return \"border-[color-mix(in_srgb,var(--text-secondary)_20%,transparent)] bg-[color-mix(in_srgb,var(--text-secondary)_12%,transparent)]\";\n default:\n return \"border-[color-mix(in_srgb,var(--text-secondary)_18%,transparent)] bg-[color-mix(in_srgb,var(--text-secondary)_10%,transparent)]\";\n }\n}\n\nfunction resolveIssueManagerBoardColumnClassName(\n status: IssueManagerSubtaskBoardStatus\n): string {\n switch (status) {\n case \"running\":\n return \"border-[color-mix(in_srgb,var(--status-running)_12%,transparent)] bg-[color-mix(in_srgb,var(--status-running)_8%,transparent)]\";\n case \"pending_acceptance\":\n return \"border-[color-mix(in_srgb,var(--tutti-purple)_12%,transparent)] bg-[color-mix(in_srgb,var(--tutti-purple)_8%,transparent)]\";\n case \"completed\":\n return \"border-[color-mix(in_srgb,var(--state-success)_12%,transparent)] bg-[color-mix(in_srgb,var(--state-success)_8%,transparent)]\";\n case \"failed\":\n return \"border-[color-mix(in_srgb,var(--state-danger)_12%,transparent)] bg-[color-mix(in_srgb,var(--state-danger)_8%,transparent)]\";\n case \"canceled\":\n return \"border-[color-mix(in_srgb,var(--text-secondary)_12%,transparent)] bg-[color-mix(in_srgb,var(--text-secondary)_8%,transparent)]\";\n default:\n return \"border-[color-mix(in_srgb,var(--text-secondary)_12%,transparent)] bg-[color-mix(in_srgb,var(--text-secondary)_8%,transparent)]\";\n }\n}\n\nfunction resolveIssueManagerBoardDotClassName(\n status: IssueManagerSubtaskBoardStatus\n): string {\n switch (status) {\n case \"running\":\n return \"bg-[var(--status-running)]\";\n case \"pending_acceptance\":\n return \"bg-[var(--tutti-purple)]\";\n case \"completed\":\n return \"bg-[var(--state-success)]\";\n case \"failed\":\n return \"bg-[var(--state-danger)]\";\n case \"canceled\":\n return \"bg-[var(--text-tertiary)]\";\n default:\n return \"bg-[var(--text-secondary)]\";\n }\n}\n","import type {\n IssueManagerIssueSummary,\n IssueManagerRun,\n IssueManagerTaskSummary\n} from \"../../../contracts/index.ts\";\n\nexport function resolveIssueManagerIssueAcceptanceTaskId(input: {\n latestRun: IssueManagerRun | null;\n selectedIssue: IssueManagerIssueSummary | null;\n selectedTaskId: string | null;\n tasks: readonly IssueManagerTaskSummary[];\n}): string | null {\n if (\n input.selectedIssue?.status !== \"pending_acceptance\" ||\n input.latestRun?.status !== \"completed\" ||\n input.selectedTaskId\n ) {\n return null;\n }\n\n return resolveIssueManagerIssueRunTaskId({\n latestRun: input.latestRun,\n selectedIssue: input.selectedIssue,\n tasks: input.tasks\n });\n}\n\nexport function resolveIssueManagerIssueRunTaskId(input: {\n latestRun: IssueManagerRun | null;\n selectedIssue: IssueManagerIssueSummary | null;\n tasks: readonly IssueManagerTaskSummary[];\n}): string | null {\n if (!input.selectedIssue) {\n return null;\n }\n\n const taskId = input.latestRun?.taskId?.trim() ?? \"\";\n if (!taskId) {\n return null;\n }\n\n const visibleTask = input.tasks.find((task) => task.taskId === taskId);\n const issueTitle = input.selectedIssue.title.trim();\n const taskTitle = visibleTask?.title.trim() ?? \"\";\n if (visibleTask && taskTitle !== \"\" && taskTitle !== issueTitle) {\n return null;\n }\n\n return taskId;\n}\n\nexport function resolveIssueManagerVisibleSubtasks(input: {\n hiddenIssueRunTaskId: string | null;\n tasks: readonly IssueManagerTaskSummary[];\n}): IssueManagerTaskSummary[] {\n const hiddenTaskId = input.hiddenIssueRunTaskId?.trim() ?? \"\";\n if (!hiddenTaskId) {\n return [...input.tasks];\n }\n\n return input.tasks.filter((task) => {\n return task.taskId !== hiddenTaskId;\n });\n}\n","import { useEffect, useRef, useState, type JSX } from \"react\";\nimport { RichTextReadonlyContent } from \"@tutti-os/ui-rich-text/editor\";\nimport type { RichTextMentionAttrs } from \"@tutti-os/ui-rich-text/types\";\nimport { cn } from \"@tutti-os/ui-system\";\nimport { normalizeIssueManagerContent } from \"../../../core/index.ts\";\nimport type { IssueManagerFileReference } from \"../../../contracts/index.ts\";\nimport { stripIssueManagerDescriptionTerminalPunctuation } from \"../panel/IssueManagerPanelText.ts\";\n\nexport function IssueManagerDescriptionSection({\n content,\n emptyLabel,\n label,\n minHeightClass = \"min-h-[14rem]\",\n onMentionAction,\n onOpen,\n variant = \"card\"\n}: {\n content: string;\n emptyLabel: string;\n label: string;\n minHeightClass?: string;\n onMentionAction?: (mention: RichTextMentionAttrs) => Promise<void>;\n onOpen?: (reference: IssueManagerFileReference) => Promise<void>;\n variant?: \"card\" | \"plain\";\n}): JSX.Element {\n const contentRef = useRef<HTMLDivElement | null>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n const normalizedContent = normalizeIssueManagerContent(content).trim();\n const displayContent =\n stripIssueManagerDescriptionTerminalPunctuation(normalizedContent);\n\n useEffect(() => {\n if (variant === \"plain\") {\n setIsOverflowing(false);\n return;\n }\n if (!displayContent) {\n setIsOverflowing(false);\n return;\n }\n\n const contentElement = contentRef.current;\n if (!contentElement) {\n return;\n }\n\n const measure = () => {\n setIsOverflowing(\n contentElement.scrollHeight > contentElement.clientHeight + 1\n );\n };\n\n measure();\n if (typeof ResizeObserver === \"undefined\") {\n return;\n }\n\n const observer = new ResizeObserver(() => {\n measure();\n });\n observer.observe(contentElement);\n return () => {\n observer.disconnect();\n };\n }, [displayContent, variant]);\n\n if (variant === \"plain\") {\n return (\n <section className=\"grid gap-2\">\n <span className=\"text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {label}\n </span>\n {displayContent ? (\n <div className=\"min-w-0 max-w-full text-[13px] font-normal leading-5 text-[var(--text-secondary)] sm:max-w-3xl\">\n <IssueManagerDescriptionContent\n content={displayContent}\n onMentionAction={onMentionAction}\n onOpen={onOpen}\n />\n </div>\n ) : (\n <p className=\"text-[13px] font-normal leading-5 text-[var(--text-secondary)]\">\n {emptyLabel}\n </p>\n )}\n </section>\n );\n }\n\n return (\n <section className=\"grid gap-2\">\n <span className=\"text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {label}\n </span>\n <div\n className={cn(\n \"relative min-w-0 rounded-lg border border-border-1 bg-transparent px-4 py-3\",\n minHeightClass\n )}\n >\n <div\n className={cn(\n \"min-w-0 max-w-full overflow-x-hidden max-h-[18rem] overflow-y-auto pr-2 text-[13px] font-normal leading-5 text-[var(--text-secondary)]\",\n isOverflowing && \"pb-8\"\n )}\n ref={contentRef}\n >\n {displayContent ? (\n <IssueManagerDescriptionContent\n content={displayContent}\n onMentionAction={onMentionAction}\n onOpen={onOpen}\n />\n ) : (\n <p className=\"font-normal text-[var(--text-secondary)]\">\n {emptyLabel}\n </p>\n )}\n </div>\n {isOverflowing ? (\n <div\n className=\"pointer-events-none absolute right-0 bottom-1 left-0 h-10\"\n style={{\n background:\n \"linear-gradient(to top, var(--background-panel), color-mix(in srgb, var(--background-panel) 80%, transparent), transparent)\"\n }}\n />\n ) : null}\n </div>\n </section>\n );\n}\n\nfunction IssueManagerDescriptionContent({\n content,\n onMentionAction,\n onOpen\n}: {\n content: string;\n onMentionAction?: (mention: RichTextMentionAttrs) => Promise<void>;\n onOpen?: (reference: IssueManagerFileReference) => Promise<void>;\n}): JSX.Element {\n return (\n <RichTextReadonlyContent\n className=\"min-w-0 max-w-full [overflow-wrap:anywhere] [&>*+*]:!mt-1 [&_.tutti-rich-text-mention]:!py-0 [&_.tutti-rich-text-mention]:![line-height:20px] [&_.tutti-rich-text-mention]:align-baseline\"\n paragraphClassName=\"break-words leading-5 [overflow-wrap:anywhere]\"\n value={content}\n onMentionAction={onMentionAction}\n onOpenWorkspaceReference={\n onOpen\n ? (reference) =>\n onOpen({\n displayName: reference.label,\n kind: reference.kind,\n path: reference.path\n })\n : undefined\n }\n />\n );\n}\n","import { useEffect, useMemo, useRef, useState, type JSX } from \"react\";\nimport type { RichTextTriggerQueryMatch } from \"@tutti-os/ui-rich-text/types\";\nimport { RichTextTriggerEditor } from \"@tutti-os/ui-rich-text/editor\";\nimport type { MentionPaletteCategoryConfig } from \"@tutti-os/ui-rich-text/at-panel\";\nimport { Button, LinkIcon, cn } from \"@tutti-os/ui-system\";\nimport type {\n IssueManagerController,\n IssueManagerRichTextSurface\n} from \"../../react/index.ts\";\n\nconst issueManagerRichTextTextareaBaseClassName =\n \"min-h-20 w-full rounded-[8px] border border-transparent bg-[var(--transparency-block)] p-3 text-[13px] font-normal leading-[1.3] text-[var(--text-primary)] transition-[background-color,border-color,color] outline-none shadow-none placeholder:text-[var(--text-placeholder)] hover:bg-[var(--transparency-hover)] focus:bg-[var(--transparency-hover)] focus-visible:border-transparent focus-visible:bg-[var(--transparency-hover)] focus-visible:ring-0 disabled:cursor-not-allowed disabled:bg-[var(--transparency-block)] disabled:text-[var(--text-disabled)] disabled:opacity-100 aria-invalid:border-[var(--state-danger)] aria-invalid:bg-[var(--transparency-block)] aria-invalid:hover:bg-[var(--transparency-hover)] aria-invalid:focus:bg-[var(--transparency-hover)] aria-invalid:focus-visible:bg-[var(--transparency-hover)] aria-invalid:ring-0 aria-invalid:shadow-none\";\n\nconst issueManagerRichTextPlaceholderBaseClassName =\n \"min-h-20 w-full p-3 text-[13px] font-normal leading-[1.3] text-[var(--text-placeholder)]\";\n\nexport function IssueManagerRichTextTextarea({\n controller,\n onChange,\n placeholder,\n surface,\n textareaClassName,\n value\n}: {\n controller: IssueManagerController;\n onChange: (value: string) => void;\n placeholder?: string;\n surface: IssueManagerRichTextSurface;\n textareaClassName?: string;\n value: string;\n}): JSX.Element {\n const providers = useMemo(\n () => controller.resolveRichTextTriggerProviders(surface),\n [controller, surface]\n );\n const mentionPaletteCategories = useMemo(\n () =>\n [\n {\n id: \"agent\",\n label: controller.copy.t(\"richTextAt.agents\"),\n providerIds: [\"agent-target\"]\n },\n {\n id: \"app\",\n label: controller.copy.t(\"richTextAt.apps\"),\n providerIds: [\"workspace-app\"]\n }\n ] satisfies readonly MentionPaletteCategoryConfig<RichTextTriggerQueryMatch>[],\n [controller.copy]\n );\n const showReferenceAction = controller.canReferenceWorkspaceFiles;\n const [focusSignal, setFocusSignal] = useState(0);\n const previousValueRef = useRef(value);\n const wasAddingReferenceRef = useRef(false);\n\n useEffect(() => {\n const isAddingReference =\n controller.referenceTarget?.mode === \"insert\" &&\n controller.referenceTarget.parentKind === surface;\n if (\n wasAddingReferenceRef.current &&\n !isAddingReference &&\n value !== previousValueRef.current\n ) {\n setFocusSignal((current) => current + 1);\n }\n wasAddingReferenceRef.current = isAddingReference;\n previousValueRef.current = value;\n }, [controller.referenceTarget, surface, value]);\n\n return (\n <RichTextTriggerEditor\n focusSignal={focusSignal}\n minQueryLength={0}\n triggerProviders={providers}\n textOverrides={{\n loadingLabel: controller.copy.t(\"richTextAt.loading\"),\n noMatchesLabel: controller.copy.t(\"richTextAt.noMatches\"),\n removeReferenceActionLabel: controller.copy.t(\"actions.removeReference\")\n }}\n palette={{\n categories: mentionPaletteCategories,\n defaultCategoryId: \"agent\",\n labels: {\n tabHint: controller.copy.t(\"richTextAt.switchCategory\"),\n cycleFilter: controller.copy.t(\"richTextAt.switchCategory\"),\n moveSelection: controller.copy.t(\"richTextAt.switchSelection\"),\n empty: controller.copy.t(\"richTextAt.noMatches\")\n }\n }}\n textareaClassName={cn(\n issueManagerRichTextTextareaBaseClassName,\n textareaClassName,\n showReferenceAction && \"pb-11\"\n )}\n placeholderClassName={cn(\n issueManagerRichTextPlaceholderBaseClassName,\n textareaClassName,\n showReferenceAction && \"pb-11\"\n )}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n overlay={\n showReferenceAction ? (\n <div className=\"pointer-events-none absolute inset-x-3 bottom-3 z-10 flex\">\n <Button\n className=\"pointer-events-auto\"\n size=\"default\"\n type=\"button\"\n variant=\"secondary\"\n onClick={() => {\n void controller.insertReferences(surface);\n }}\n >\n <LinkIcon size={14} />\n {controller.copy.t(\"actions.referenceWorkspaceFiles\")}\n </Button>\n </div>\n ) : null\n }\n />\n );\n}\n","import { type JSX } from \"react\";\nimport { Button } from \"@tutti-os/ui-system\";\nimport type { IssueManagerController } from \"../../react/index.ts\";\n\nexport function IssueManagerTaskAcceptanceCard({\n controller,\n taskId\n}: {\n controller: IssueManagerController;\n taskId?: string | null;\n}): JSX.Element {\n const copy = controller.copy;\n const updateStatus = (status: \"completed\" | \"not_started\") => {\n if (taskId) {\n void controller.setTaskStatus(taskId, status);\n return;\n }\n void controller.setSelectedTaskStatus(status);\n };\n\n return (\n <div className=\"grid gap-2 rounded-md border border-[var(--tutti-purple-border)] bg-[var(--tutti-purple-bg)] px-3 py-2\">\n <div className=\"min-w-0 text-[11px] font-normal leading-[1.45] text-[var(--text-secondary)] [overflow-wrap:anywhere]\">\n <span className=\"font-semibold text-[var(--text-primary)]\">\n {copy.t(\"labels.taskAcceptance\")}\n </span>\n <span className=\"mx-1 text-[var(--text-tertiary)]\">·</span>\n <span>{copy.t(\"messages.taskAcceptanceHint\")}</span>\n </div>\n <div className=\"flex items-center justify-end gap-2\">\n <Button\n className=\"h-7 px-2 text-[11px] text-[var(--state-danger)] hover:bg-[var(--on-danger)] hover:text-[var(--state-danger)]\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => updateStatus(\"not_started\")}\n >\n {copy.t(\"actions.rejectTask\")}\n </Button>\n <Button\n className=\"h-7 px-2.5 text-[11px]\"\n type=\"button\"\n variant=\"secondary\"\n onClick={() => updateStatus(\"completed\")}\n >\n {copy.t(\"actions.acceptTask\")}\n </Button>\n </div>\n </div>\n );\n}\n","import { useComposedInputValue } from \"@tutti-os/ui-react-hooks\";\nimport { useLayoutEffect, useRef, type JSX } from \"react\";\nimport { Input } from \"@tutti-os/ui-system\";\n\nexport function IssueManagerDraftTitleInput({\n onChange,\n placeholder,\n value\n}: {\n onChange: (value: string) => void;\n placeholder: string;\n value: string;\n}): JSX.Element {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const pendingSelectionRef = useRef<{\n direction: \"backward\" | \"forward\" | \"none\";\n end: number;\n start: number;\n } | null>(null);\n const titleInput = useComposedInputValue({ onCommit: onChange, value });\n\n useLayoutEffect(() => {\n const input = inputRef.current;\n const selection = pendingSelectionRef.current;\n if (!input || !selection || document.activeElement !== input) {\n return;\n }\n pendingSelectionRef.current = null;\n const maxPosition = input.value.length;\n input.setSelectionRange(\n Math.min(selection.start, maxPosition),\n Math.min(selection.end, maxPosition),\n selection.direction\n );\n }, [titleInput.value, value]);\n\n const rememberSelection = (input: HTMLInputElement) => {\n const start = input.selectionStart;\n const end = input.selectionEnd;\n if (start === null || end === null) {\n return;\n }\n pendingSelectionRef.current = {\n direction: input.selectionDirection ?? \"none\",\n end,\n start\n };\n };\n\n return (\n <Input\n ref={inputRef}\n placeholder={placeholder}\n variant=\"md\"\n value={titleInput.value}\n onBlur={titleInput.onBlur}\n onChange={(event) => {\n rememberSelection(event.currentTarget);\n titleInput.onChange(event);\n }}\n onCompositionEnd={(event) => {\n rememberSelection(event.currentTarget);\n titleInput.onCompositionEnd(event);\n }}\n onCompositionStart={titleInput.onCompositionStart}\n />\n );\n}\n","export const issueManagerEditorRiseInClassName =\n \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-bottom-3 motion-safe:duration-[240ms] motion-safe:ease-[cubic-bezier(0.22,1,0.36,1)] motion-safe:[animation-fill-mode:both] motion-reduce:animate-none\";\n\nexport const issueManagerEditorRiseInDelay0ClassName =\n \"motion-safe:[animation-delay:0ms]\";\n\nexport const issueManagerEditorRiseInDelay1ClassName =\n \"motion-safe:[animation-delay:55ms]\";\n\nexport const issueManagerEditorRiseInDelay2ClassName =\n \"motion-safe:[animation-delay:110ms]\";\n\nexport const issueManagerEditorRiseInDelay3ClassName =\n \"motion-safe:[animation-delay:165ms]\";\n\nexport const issueManagerEditorFooterFadeInClassName =\n \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:duration-[180ms] motion-safe:ease-[cubic-bezier(0.22,1,0.36,1)] motion-safe:[animation-delay:180ms] motion-safe:[animation-fill-mode:both] motion-reduce:animate-none\";\n","import { type JSX } from \"react\";\nimport { Button, cn } from \"@tutti-os/ui-system\";\nimport type { IssueManagerIssueSummary } from \"../../../contracts/index.ts\";\nimport {\n IssueManagerBreakdownActionTrigger,\n IssueManagerExecutionDirectoryTrigger,\n IssueManagerRunActionTrigger\n} from \"../task/IssueManagerRunSections.tsx\";\nimport type { IssueManagerController } from \"../../react/index.ts\";\nimport { isIssueManagerRunControlDisabled } from \"./IssueManagerTaskDrawerState.ts\";\n\nexport interface IssueManagerBottomBarProps {\n controller: IssueManagerController;\n isNarrowLayout: boolean;\n selectedIssue: IssueManagerIssueSummary | null;\n visible: boolean;\n}\n\nexport function IssueManagerBottomBar({\n controller,\n isNarrowLayout,\n selectedIssue,\n visible\n}: IssueManagerBottomBarProps): JSX.Element | null {\n const copy = controller.copy;\n if (!visible || !selectedIssue) {\n return null;\n }\n const runControlsDisabled = isIssueManagerRunControlDisabled({\n selectedIssueStatus: selectedIssue.status,\n selectedTaskStatus: null\n });\n\n return (\n <div className=\"border-t border-[var(--border-1)] bg-transparent px-6 py-4 backdrop-blur\">\n <div\n className={cn(\n \"flex gap-3\",\n isNarrowLayout\n ? \"flex-wrap items-center justify-end\"\n : \"items-center justify-end\"\n )}\n >\n <IssueManagerExecutionDirectoryTrigger\n className=\"mr-auto min-w-0 max-w-[240px] justify-start overflow-hidden\"\n controller={controller}\n disabled={runControlsDisabled}\n />\n <div className=\"flex shrink-0 flex-nowrap items-center justify-end gap-3\">\n <IssueManagerBreakdownActionTrigger\n controller={controller}\n disabled={!selectedIssue}\n triggerVariant=\"button\"\n />\n <IssueManagerRunActionTrigger\n controller={controller}\n disabled={!selectedIssue || runControlsDisabled}\n triggerVariant=\"button\"\n />\n {controller.canInviteCollaborators ? (\n <Button\n className=\"px-4\"\n disabled={!selectedIssue}\n size=\"dialog\"\n type=\"button\"\n onClick={() => {\n void controller.shareSelection();\n }}\n >\n {copy.t(\"actions.inviteCollaborator\")}\n </Button>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n","import { type JSX, type ReactNode } from \"react\";\nimport {\n Badge,\n AgentSessionsIcon,\n Button,\n ChevronDownIcon,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n IssueIcon,\n cn\n} from \"@tutti-os/ui-system\";\nimport { WorkspaceUserProjectSelect } from \"@tutti-os/workspace-user-project/ui\";\nimport type {\n IssueManagerFileReference,\n IssueManagerRun,\n IssueManagerRunOutput\n} from \"../../../contracts/index.ts\";\nimport type { IssueManagerI18nRuntime } from \"../../../i18n/issueManagerI18n.ts\";\nimport {\n formatIssueManagerTimestamp,\n resolveIssueManagerStatusLabel\n} from \"../../../services/controllerModel.ts\";\nimport type { IssueManagerController } from \"../../react/index.ts\";\nimport { issueManagerStatusBadgeVariant } from \"../status/IssueManagerStatusBadge.ts\";\n\nconst providerMenuItemClassName =\n \"min-h-8 overflow-hidden rounded-md px-2.5 py-1.5 text-[13px] font-normal leading-[1.2] text-[var(--text-primary)]\";\nconst providerActionTriggerClassName = \"font-[var(--font-weight-emphasis-cjk)]\";\n\nexport function IssueManagerRunActionTrigger({\n controller,\n disabled = false,\n triggerClassName,\n triggerVariant = \"default\"\n}: {\n controller: IssueManagerController;\n disabled?: boolean;\n triggerClassName?: string;\n triggerVariant?: IssueManagerProviderActionTriggerVariant;\n}): JSX.Element {\n return (\n <IssueManagerProviderActionMenu\n controller={controller}\n disabled={disabled}\n icon={<AgentSessionsIcon size={16} />}\n label={controller.copy.t(\"actions.askAgentToRun\")}\n triggerClassName={triggerClassName}\n triggerVariant={triggerVariant}\n onSelectProvider={(provider) => controller.runTask(provider)}\n />\n );\n}\n\nexport function IssueManagerBreakdownActionTrigger({\n controller,\n disabled = false,\n triggerClassName,\n triggerVariant = \"default\"\n}: {\n controller: IssueManagerController;\n disabled?: boolean;\n triggerClassName?: string;\n triggerVariant?: IssueManagerProviderActionTriggerVariant;\n}): JSX.Element {\n return (\n <IssueManagerProviderActionMenu\n controller={controller}\n disabled={disabled}\n icon={<IssueIcon size={16} />}\n label={controller.copy.t(\"actions.askAgentToBreakdown\")}\n triggerClassName={triggerClassName}\n triggerVariant={triggerVariant}\n triggerButtonVariant=\"secondary\"\n onSelectProvider={(provider) => controller.startTaskBreakdown(provider)}\n />\n );\n}\n\ntype IssueManagerProviderActionTriggerVariant = \"button\" | \"default\";\n\nfunction IssueManagerProviderActionMenu({\n controller,\n disabled,\n icon,\n label,\n onSelectProvider,\n triggerButtonVariant,\n triggerClassName,\n triggerVariant\n}: {\n controller: IssueManagerController;\n disabled: boolean;\n icon: ReactNode;\n label: string;\n onSelectProvider: (provider: string) => Promise<void>;\n triggerButtonVariant?: \"secondary\";\n triggerClassName?: string;\n triggerVariant: IssueManagerProviderActionTriggerVariant;\n}): JSX.Element {\n const providerOptions = controller.providerOptions;\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild disabled={disabled}>\n <Button\n className={cn(\n \"min-w-0\",\n \"[&[data-state=open]_[data-issue-manager-provider-chevron=true]]:rotate-180\",\n providerActionTriggerClassName,\n triggerClassName\n )}\n disabled={disabled}\n size={triggerVariant === \"button\" ? \"dialog\" : \"default\"}\n type=\"button\"\n variant={triggerButtonVariant}\n >\n {icon}\n <span className=\"truncate\">{label}</span>\n <ChevronDownIcon\n className=\"shrink-0 transition-transform duration-200\"\n data-issue-manager-provider-chevron=\"true\"\n size={14}\n />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n className=\"w-[220px] min-w-[220px]\"\n style={{ zIndex: \"var(--z-panel-popover)\" }}\n >\n {providerOptions.length === 0 ? (\n <DropdownMenuItem className={providerMenuItemClassName} disabled>\n {controller.copy.t(\"messages.noAgentProviders\")}\n </DropdownMenuItem>\n ) : (\n providerOptions.map((option) => (\n <DropdownMenuItem\n className={providerMenuItemClassName}\n disabled={option.disabled === true}\n key={option.provider}\n title={option.disabledReason}\n onSelect={() => {\n void onSelectProvider(option.provider);\n }}\n >\n <span className=\"flex min-w-0 flex-1 items-center gap-2 pr-1\">\n <IssueManagerAgentProviderIcon\n fallbackIcon={<AgentSessionsIcon aria-hidden size={15} />}\n iconUrl={option.iconUrl}\n />\n <span className=\"min-w-0 flex-1 truncate\">{option.label}</span>\n </span>\n </DropdownMenuItem>\n ))\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction IssueManagerAgentProviderIcon({\n fallbackIcon,\n iconUrl\n}: {\n fallbackIcon: ReactNode;\n iconUrl?: string | null;\n}): JSX.Element {\n const normalizedIconUrl = iconUrl?.trim();\n\n if (!normalizedIconUrl) {\n return <>{fallbackIcon}</>;\n }\n\n return (\n <img\n alt=\"\"\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 rounded-[4px] object-contain\"\n decoding=\"async\"\n draggable={false}\n src={normalizedIconUrl}\n />\n );\n}\n\nexport function IssueManagerExecutionDirectoryTrigger({\n className,\n controller,\n disabled = false\n}: {\n className?: string;\n controller: IssueManagerController;\n disabled?: boolean;\n}): JSX.Element | null {\n if (!controller.canSelectExecutionDirectory) {\n return null;\n }\n\n return (\n <WorkspaceUserProjectSelect\n classNames={{\n content: \"w-[240px] min-w-[240px]\",\n item: \"min-h-7 overflow-hidden rounded-md py-1 pr-7 pl-2.5 text-[13px] font-normal leading-[1.2] text-[var(--text-primary)]\",\n trigger: cn(\n \"group inline-flex min-h-7 max-w-[240px] min-w-0 items-center gap-1.5 overflow-hidden rounded-md border-0 bg-transparent px-0.5 py-0 text-[13px] font-normal leading-[1.2] text-[var(--text-secondary)] shadow-none outline-none hover:bg-transparent hover:text-[var(--text-primary)] focus:bg-transparent focus:text-[var(--text-primary)] focus-visible:bg-transparent focus-visible:ring-0 disabled:bg-transparent disabled:text-[var(--text-disabled)]\",\n className\n )\n }}\n contentAlign=\"end\"\n disabled={disabled}\n i18n={controller.workspaceUserProjectI18n}\n service={controller.executionDirectoryProjectService}\n selectedProjectPath={controller.nodeState.selectedExecutionDirectory}\n unlistedProjectLabel={controller.copy.t(\n \"labels.customExecutionDirectory\"\n )}\n onProjectPathChange={(path: string | null) => {\n void controller.useExecutionDirectory(path);\n }}\n />\n );\n}\n\nexport function IssueManagerRunPanels({\n copy,\n onOpen,\n outputs,\n recentRuns\n}: {\n copy: IssueManagerI18nRuntime;\n onOpen: (reference: IssueManagerFileReference) => Promise<void>;\n outputs: readonly IssueManagerRunOutput[];\n recentRuns: readonly IssueManagerRun[];\n}): JSX.Element {\n return (\n <div className=\"grid gap-4\">\n <section className=\"rounded-lg border border-border-1 bg-transparent px-4 py-4\">\n <h4 className=\"mb-3 text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {copy.t(\"labels.recentRuns\")}\n </h4>\n {recentRuns.length === 0 ? (\n <p className=\"text-[13px] leading-5 text-[var(--text-secondary)]\">\n {copy.t(\"messages.noRecentRuns\")}\n </p>\n ) : (\n <div className=\"grid gap-2.5\">\n {recentRuns.map((run) => (\n <div\n className=\"rounded-lg border border-[var(--border-2)] bg-transparent px-3.5 py-3\"\n key={run.runId}\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0\">\n <p className=\"truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {run.summary || run.runId}\n </p>\n <p className=\"mt-1 text-[11px] leading-[1.55] text-[var(--text-secondary)]\">\n {formatIssueManagerTimestamp(\n run.updatedAtUnix ?? run.createdAtUnix\n )}\n </p>\n </div>\n <Badge variant={issueManagerStatusBadgeVariant(run.status)}>\n {resolveIssueManagerStatusLabel(copy, run.status)}\n </Badge>\n </div>\n {run.errorMessage ? (\n <p className=\"mt-2 text-[11px] text-[var(--state-danger)]\">\n {run.errorMessage}\n </p>\n ) : null}\n </div>\n ))}\n </div>\n )}\n </section>\n\n <section className=\"rounded-lg border border-border-1 bg-transparent px-4 py-4\">\n <h4 className=\"mb-3 text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {copy.t(\"labels.outputs\")}\n </h4>\n {outputs.length === 0 ? (\n <p className=\"text-[13px] leading-5 text-[var(--text-secondary)]\">\n {copy.t(\"messages.noOutputs\")}\n </p>\n ) : (\n <div className=\"grid gap-2.5\">\n {outputs.map((output) => (\n <button\n className=\"rounded-lg border border-[var(--border-2)] bg-transparent px-3.5 py-3 text-left transition-colors hover:bg-transparency-hover\"\n key={output.outputId}\n type=\"button\"\n onClick={() => {\n void onOpen({\n displayName: output.displayName,\n kind: \"file\",\n path: output.path\n });\n }}\n >\n <p className=\"truncate text-[13px] font-semibold leading-5 text-[var(--text-primary)]\">\n {output.displayName}\n </p>\n <p className=\"mt-1 truncate text-[11px] leading-[1.55] text-[var(--text-secondary)]\">\n {output.path}\n </p>\n </button>\n ))}\n </div>\n )}\n </section>\n </div>\n );\n}\n","import type {\n IssueManagerIssueSummary,\n IssueManagerStatus,\n IssueManagerTaskSummary\n} from \"../../../contracts/index.ts\";\nimport type { IssueManagerController } from \"../../react/index.ts\";\n\nexport interface IssueManagerTaskDrawerViewState {\n bodyKind: \"edit\" | \"loading\" | \"read\";\n isCreate: boolean;\n isEdit: boolean;\n isRead: boolean;\n isTaskTitleMissing: boolean;\n showEditFooter: boolean;\n showReadFooter: boolean;\n showTaskActions: boolean;\n showTaskMetadata: boolean;\n title: string;\n}\n\nexport function resolveIssueManagerTaskDrawerViewState(input: {\n controller: Pick<\n IssueManagerController,\n \"copy\" | \"taskDetail\" | \"taskDraft\" | \"taskEditorMode\"\n >;\n selectedTask: IssueManagerTaskSummary | null;\n}): IssueManagerTaskDrawerViewState {\n const { controller, selectedTask } = input;\n const isCreate = controller.taskEditorMode === \"create\";\n const isEdit = controller.taskEditorMode === \"edit\";\n const isRead = !isCreate && !isEdit;\n const showTaskMetadata = isRead && selectedTask !== null;\n const bodyKind =\n controller.taskDetail.isLoading &&\n isCreate === false &&\n controller.taskDetail.value === null\n ? \"loading\"\n : isCreate || isEdit\n ? \"edit\"\n : \"read\";\n\n return {\n bodyKind,\n isCreate,\n isEdit,\n isRead,\n isTaskTitleMissing: controller.taskDraft.title.trim().length === 0,\n showEditFooter: isCreate || isEdit,\n showReadFooter: showTaskMetadata,\n showTaskActions: showTaskMetadata,\n showTaskMetadata,\n title:\n isCreate || isEdit\n ? isCreate\n ? controller.copy.t(\"actions.createTask\")\n : controller.copy.t(\"actions.editTask\")\n : selectedTask?.title || controller.copy.t(\"labels.taskDetails\")\n };\n}\n\nexport function resolveIssueManagerTaskRefs(input: {\n controller: Pick<IssueManagerController, \"taskDetail\">;\n}) {\n return (\n input.controller.taskDetail.value?.contextRefs.filter(\n (ref) => ref.parentKind === \"task\"\n ) ?? []\n );\n}\n\nexport function canIssueManagerSaveTask(input: {\n selectedIssue: IssueManagerIssueSummary | null;\n view: Pick<IssueManagerTaskDrawerViewState, \"isTaskTitleMissing\">;\n}): boolean {\n return (\n input.selectedIssue !== null && input.view.isTaskTitleMissing === false\n );\n}\n\nexport function isIssueManagerRunControlDisabled(input: {\n disabled?: boolean;\n selectedIssueStatus: IssueManagerStatus | null | undefined;\n selectedTaskStatus: IssueManagerStatus | null | undefined;\n}): boolean {\n if (input.disabled === true) {\n return true;\n }\n return (input.selectedTaskStatus ?? input.selectedIssueStatus) === \"running\";\n}\n","import { type JSX } from \"react\";\nimport { ToastProvider, ToastRoot, ToastTitle } from \"@tutti-os/ui-system\";\nimport type { IssueManagerController } from \"../../react/index.ts\";\n\nexport function IssueManagerFloatingNotice({\n notice\n}: {\n notice: NonNullable<IssueManagerController[\"floatingNotice\"]>;\n}): JSX.Element {\n const variant = notice.tone === \"destructive\" ? \"destructive\" : \"default\";\n\n return (\n <ToastProvider>\n <ToastRoot\n key={notice.id}\n open\n anchor=\"node\"\n busy={notice.isLoading}\n className=\"z-30 w-fit max-w-[min(72vw,40rem)] px-4 py-3 shadow-lg\"\n nodeInsetTopPx={16}\n variant={variant}\n >\n <ToastTitle className=\"whitespace-normal [overflow-wrap:anywhere]\">\n {notice.title}\n </ToastTitle>\n </ToastRoot>\n </ToastProvider>\n );\n}\n","import { type JSX } from \"react\";\nimport { cn } from \"@tutti-os/ui-system\";\nimport {\n IssueManagerSidebarBody,\n IssueManagerSidebarHeader,\n IssueManagerSidebarStandalonePane,\n IssueManagerSidebarStatusTabs\n} from \"./IssueManagerSidebarSections.tsx\";\nimport { resolveIssueManagerSidebarPresentationState } from \"./IssueManagerSidebarState.ts\";\nimport type { IssueManagerController } from \"../../react/index.ts\";\nimport { resolveIssueManagerSubtaskProgressByIssueId } from \"./IssueManagerShellState.ts\";\nimport type {\n issueManagerStatusFilters,\n IssueManagerSidebarViewState\n} from \"./IssueManagerShellState.ts\";\nimport {\n resolveIssueManagerIssueRunTaskId,\n resolveIssueManagerVisibleSubtasks\n} from \"../issue/IssueManagerIssueAcceptanceState.ts\";\n\nexport interface IssueManagerSidebarProps {\n controller: IssueManagerController;\n isCollapsed: boolean;\n isNarrowLayout: boolean;\n showStandaloneState: boolean;\n sidebarViewState: IssueManagerSidebarViewState;\n statusCounts: Record<(typeof issueManagerStatusFilters)[number], number>;\n}\n\nexport function IssueManagerSidebar({\n controller,\n isCollapsed,\n isNarrowLayout,\n showStandaloneState,\n sidebarViewState,\n statusCounts\n}: IssueManagerSidebarProps): JSX.Element {\n const copy = controller.copy;\n const presentation = resolveIssueManagerSidebarPresentationState({\n showStandaloneState,\n sidebarViewState\n });\n const currentIssueDetail =\n controller.issueDetail.value?.issue.issueId ===\n controller.nodeState.selectedIssueId\n ? controller.issueDetail.value\n : null;\n const issueRunTaskId = currentIssueDetail\n ? resolveIssueManagerIssueRunTaskId({\n latestRun:\n currentIssueDetail.latestRun ??\n currentIssueDetail.recentRuns[0] ??\n null,\n selectedIssue: currentIssueDetail.issue,\n tasks: currentIssueDetail.tasks\n })\n : null;\n const visibleTasks = currentIssueDetail\n ? resolveIssueManagerVisibleSubtasks({\n hiddenIssueRunTaskId: issueRunTaskId,\n tasks: currentIssueDetail.tasks\n })\n : [];\n const subtaskProgressByIssueId = resolveIssueManagerSubtaskProgressByIssueId({\n issueId: currentIssueDetail?.issue.issueId ?? null,\n visibleTasks: currentIssueDetail ? visibleTasks : null\n });\n\n return (\n <aside\n aria-hidden={isCollapsed ? \"true\" : undefined}\n className={cn(\n \"relative isolate flex h-full min-h-0 min-w-0 flex-col overflow-hidden bg-transparent opacity-100 transition-[border-color] duration-[140ms] ease-in-out after:pointer-events-none after:absolute after:inset-0 after:z-[1] after:bg-[color-mix(in_srgb,var(--background-panel)_88%,transparent)] after:opacity-0 after:transition-opacity after:duration-[160ms] after:delay-[70ms] motion-reduce:transition-none motion-reduce:after:transition-none [&>*]:transition-[opacity,filter] [&>*]:duration-[160ms] [&>*]:delay-[70ms] [&>*]:ease-in-out motion-reduce:[&>*]:transition-none\",\n isNarrowLayout\n ? \"border-b border-[var(--border-1)]\"\n : \"border-r border-[var(--border-1)]\",\n isCollapsed &&\n \"pointer-events-none border-r-transparent after:opacity-100 after:delay-0 [&>*]:opacity-0 [&>*]:blur-[1px] [&>*]:delay-0 motion-reduce:[&>*]:blur-none\"\n )}\n inert={isCollapsed ? true : undefined}\n >\n <IssueManagerSidebarHeader\n copy={copy}\n issueSearchQuery={controller.nodeState.issueSearchQuery}\n onCreateIssue={() => controller.setIssueEditorMode(\"create\")}\n onIssueSearchUsage={controller.reportIssueSearchUsage}\n onIssueSearchQueryChange={controller.setIssueSearchQuery}\n />\n\n <IssueManagerSidebarStatusTabs\n copy={copy}\n issueStatusFilter={controller.nodeState.issueStatusFilter}\n statusCounts={statusCounts}\n onIssueStatusFilterChange={controller.setIssueStatusFilter}\n />\n\n <div aria-hidden=\"true\" className=\"h-2.5 flex-none\" />\n\n <div\n className={cn(\n \"relative flex min-h-0 flex-col\",\n isNarrowLayout ? \"flex-none\" : \"flex-1\"\n )}\n >\n {presentation.kind !== \"none\" ? (\n <div className=\"flex h-full min-h-0 items-center justify-center px-4 pt-1.5 pb-4\">\n <IssueManagerSidebarStandalonePane\n body={\n presentation.kind === \"empty\" ? presentation.body : undefined\n }\n isNarrowLayout={false}\n kind={presentation.kind}\n retryLabel={\n presentation.kind === \"error\"\n ? presentation.retryLabel\n : undefined\n }\n title={\n presentation.kind === \"error\" ? presentation.title : undefined\n }\n onRetry={() => controller.refreshAll()}\n />\n </div>\n ) : (\n <IssueManagerSidebarBody\n copy={copy}\n isNarrowLayout={isNarrowLayout}\n selectedIssueId={controller.nodeState.selectedIssueId}\n sidebarViewState={sidebarViewState}\n subtaskProgressByIssueId={subtaskProgressByIssueId}\n onRetry={() => controller.refreshAll()}\n onSelectIssue={controller.selectIssue}\n />\n )}\n </div>\n </aside>\n );\n}\n","import { type JSX } from \"react\";\nimport { useComposedInputValue } from \"@tutti-os/ui-react-hooks\";\nimport {\n Badge,\n Button,\n CloseIcon,\n FileCreateIcon,\n Input,\n ScrollArea,\n UnderlineTabs,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n IssueManagerIssueSummary,\n IssueManagerNodeState\n} from \"../../../contracts/index.ts\";\nimport type { IssueManagerI18nRuntime } from \"../../../i18n/issueManagerI18n.ts\";\nimport {\n formatIssueManagerDate,\n resolveIssueManagerStatusLabel\n} from \"../../../services/controllerModel.ts\";\nimport {\n issueManagerStatusFilters,\n resolveIssueManagerSubtaskProgress,\n type IssueManagerSubtaskProgressViewState,\n type IssueManagerSidebarViewState\n} from \"./IssueManagerShellState.ts\";\nimport { issueManagerStatusBadgeVariant } from \"../status/IssueManagerStatusBadge.ts\";\n\nconst issueManagerSidebarHeaderClassName =\n \"grid grid-cols-[minmax(0,1fr)_max-content] items-center gap-2.5 [--agent-gui-rail-control-radius:6px]\";\nconst issueManagerSidebarSearchFieldClassName = \"room-issue-node__search-field\";\nconst issueManagerSidebarSearchInputClassName = \"room-issue-node__search-input\";\nconst issueManagerSidebarCreateButtonClassName =\n \"agent-gui-node__new-conversation-icon-button\";\n\nexport function IssueManagerSidebarHeader({\n copy,\n issueSearchQuery,\n onCreateIssue,\n onIssueSearchUsage,\n onIssueSearchQueryChange\n}: {\n copy: IssueManagerI18nRuntime;\n issueSearchQuery: string;\n onCreateIssue: () => void;\n onIssueSearchUsage: (value: string) => void;\n onIssueSearchQueryChange: (value: string) => void;\n}): JSX.Element {\n return (\n <div className=\"px-4 pb-4\">\n <div className={issueManagerSidebarHeaderClassName}>\n <IssueManagerSearchField\n clearLabel={copy.t(\"actions.clearSearch\")}\n placeholder={copy.t(\"labels.searchIssues\")}\n value={issueSearchQuery}\n onChange={onIssueSearchQueryChange}\n onSearchUsage={onIssueSearchUsage}\n />\n <Button\n className={issueManagerSidebarCreateButtonClassName}\n size=\"dialog\"\n type=\"button\"\n variant=\"secondary\"\n onClick={onCreateIssue}\n >\n <FileCreateIcon aria-hidden=\"true\" />\n <span>{copy.t(\"actions.createIssue\")}</span>\n </Button>\n </div>\n </div>\n );\n}\n\nexport function IssueManagerSidebarStatusTabs({\n copy,\n issueStatusFilter,\n statusCounts,\n onIssueStatusFilterChange\n}: {\n copy: IssueManagerI18nRuntime;\n issueStatusFilter: IssueManagerNodeState[\"issueStatusFilter\"];\n statusCounts: Record<(typeof issueManagerStatusFilters)[number], number>;\n onIssueStatusFilterChange: (\n value: IssueManagerNodeState[\"issueStatusFilter\"]\n ) => void;\n}): JSX.Element {\n return (\n <UnderlineTabs\n ariaLabel={copy.t(\"labels.status\")}\n className=\"px-4\"\n scrollLeftLabel={copy.t(\"labels.scrollStatusTabsLeft\")}\n scrollRightLabel={copy.t(\"labels.scrollStatusTabsRight\")}\n tabs={issueManagerStatusFilters.map((status) => ({\n count: statusCounts[status] ?? 0,\n label:\n status === \"all\"\n ? copy.t(\"labels.allStatus\")\n : resolveIssueManagerStatusLabel(copy, status),\n value: status\n }))}\n value={issueStatusFilter}\n onValueChange={onIssueStatusFilterChange}\n />\n );\n}\n\nexport function IssueManagerSidebarBody({\n copy,\n isNarrowLayout,\n selectedIssueId,\n sidebarViewState,\n subtaskProgressByIssueId,\n onRetry,\n onSelectIssue\n}: {\n copy: IssueManagerI18nRuntime;\n isNarrowLayout: boolean;\n selectedIssueId: string | null;\n sidebarViewState: IssueManagerSidebarViewState;\n subtaskProgressByIssueId: Record<\n string,\n IssueManagerSubtaskProgressViewState | null\n >;\n onRetry: () => void;\n onSelectIssue: (issueId: string | null) => void;\n}): JSX.Element {\n return (\n <ScrollArea\n scrollbarMode=\"native\"\n className={cn(\"min-h-0\", isNarrowLayout ? \"flex-none\" : \"h-full flex-1\")}\n >\n <div\n className={cn(\n \"flex min-h-full flex-col gap-2.5 px-4 pt-1.5 pb-4\",\n isNarrowLayout ? \"min-h-0\" : \"h-full\"\n )}\n >\n {sidebarViewState.kind === \"loading\" ? (\n <IssueManagerSidebarLoadingState isNarrowLayout={isNarrowLayout} />\n ) : sidebarViewState.kind === \"error\" ? (\n <IssueManagerSidebarErrorState\n isNarrowLayout={isNarrowLayout}\n retryLabel={sidebarViewState.retryLabel}\n title={sidebarViewState.title}\n onRetry={onRetry}\n />\n ) : sidebarViewState.kind === \"empty\" ? (\n <IssueManagerSidebarEmptyState\n body={sidebarViewState.body}\n isNarrowLayout={isNarrowLayout}\n />\n ) : (\n <IssueManagerSidebarIssueList\n copy={copy}\n isNarrowLayout={isNarrowLayout}\n issues={sidebarViewState.issues}\n selectedIssueId={selectedIssueId}\n subtaskProgressByIssueId={subtaskProgressByIssueId}\n onSelectIssue={onSelectIssue}\n />\n )}\n </div>\n </ScrollArea>\n );\n}\n\nexport function IssueManagerSidebarStandalonePane({\n body,\n isNarrowLayout,\n kind,\n retryLabel,\n title,\n onRetry\n}: {\n body?: string;\n isNarrowLayout: boolean;\n kind: \"empty\" | \"error\";\n retryLabel?: string;\n title?: string;\n onRetry: () => void;\n}): JSX.Element {\n if (kind === \"error\" && retryLabel) {\n return (\n <IssueManagerSidebarErrorState\n isNarrowLayout={isNarrowLayout}\n retryLabel={retryLabel}\n title={title ?? \"\"}\n onRetry={onRetry}\n />\n );\n }\n\n return (\n <IssueManagerSidebarEmptyState\n body={body ?? \"\"}\n isNarrowLayout={isNarrowLayout}\n />\n );\n}\n\nfunction IssueManagerSearchField({\n clearLabel,\n onChange,\n onSearchUsage,\n placeholder,\n value\n}: {\n clearLabel: string;\n onChange: (value: string) => void;\n onSearchUsage: (value: string) => void;\n placeholder: string;\n value: string;\n}): JSX.Element {\n const searchInput = useComposedInputValue({ onCommit: onChange, value });\n\n return (\n <div\n className={issueManagerSidebarSearchFieldClassName}\n data-has-value={searchInput.value ? \"true\" : \"false\"}\n >\n <Input\n aria-label={placeholder}\n className={cn(\n issueManagerSidebarSearchInputClassName,\n \"[&::-webkit-search-cancel-button]:appearance-none [&::-webkit-search-decoration]:appearance-none\"\n )}\n placeholder={placeholder}\n type=\"search\"\n value={searchInput.value}\n onBlur={(event) => {\n searchInput.onBlur(event);\n onSearchUsage(event.currentTarget.value);\n }}\n onChange={searchInput.onChange}\n onCompositionEnd={searchInput.onCompositionEnd}\n onCompositionStart={searchInput.onCompositionStart}\n />\n {searchInput.value ? (\n <button\n aria-label={clearLabel}\n className=\"room-issue-node__search-clear-button\"\n type=\"button\"\n onClick={searchInput.clearValue}\n onMouseDown={(event) => event.preventDefault()}\n >\n <CloseIcon aria-hidden=\"true\" />\n </button>\n ) : null}\n </div>\n );\n}\n\nfunction IssueManagerSidebarIssueList({\n copy,\n isNarrowLayout,\n issues,\n selectedIssueId,\n subtaskProgressByIssueId,\n onSelectIssue\n}: {\n copy: IssueManagerI18nRuntime;\n isNarrowLayout: boolean;\n issues: readonly IssueManagerIssueSummary[];\n selectedIssueId: string | null;\n subtaskProgressByIssueId: Record<\n string,\n IssueManagerSubtaskProgressViewState | null\n >;\n onSelectIssue: (issueId: string | null) => void;\n}): JSX.Element {\n return (\n <div\n className={cn(\n \"flex gap-2.5\",\n isNarrowLayout\n ? \"flex-row flex-nowrap items-start overflow-x-auto overflow-y-hidden [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n : \"flex-col\"\n )}\n >\n {issues.map((issue) => (\n <IssueManagerSidebarItem\n copy={copy}\n isNarrowLayout={isNarrowLayout}\n issue={issue}\n key={issue.issueId}\n selected={selectedIssueId === issue.issueId}\n subtaskProgress={\n issue.issueId in subtaskProgressByIssueId\n ? subtaskProgressByIssueId[issue.issueId]\n : undefined\n }\n onSelect={onSelectIssue}\n />\n ))}\n </div>\n );\n}\n\nfunction IssueManagerSidebarItem({\n copy,\n isNarrowLayout,\n issue,\n onSelect,\n selected,\n subtaskProgress: subtaskProgressOverride\n}: {\n copy: IssueManagerI18nRuntime;\n isNarrowLayout: boolean;\n issue: IssueManagerIssueSummary;\n onSelect: (issueId: string | null) => void;\n selected: boolean;\n subtaskProgress?: IssueManagerSubtaskProgressViewState | null;\n}): JSX.Element {\n const subtaskProgress =\n subtaskProgressOverride === undefined\n ? resolveIssueManagerSubtaskProgress(issue)\n : subtaskProgressOverride;\n\n return (\n <button\n className={cn(\n \"relative rounded-lg border px-3.5 py-3.5 text-left transition-colors\",\n isNarrowLayout\n ? \"h-24 max-h-24 min-h-24 w-[clamp(220px,58vw,320px)] flex-[0_0_clamp(220px,58vw,320px)] overflow-hidden\"\n : \"w-full\",\n selected\n ? \"border-[var(--border-1)] bg-[var(--background-fronted)]\"\n : \"border-[var(--border-1)] bg-transparent hover:bg-[var(--transparency-block)]\"\n )}\n type=\"button\"\n onClick={() => onSelect(issue.issueId)}\n >\n <Badge\n className=\"absolute top-3.5 right-3.5\"\n variant={issueManagerStatusBadgeVariant(issue.status)}\n >\n {resolveIssueManagerStatusLabel(copy, issue.status)}\n </Badge>\n <div className=\"min-w-0 space-y-2\">\n <p className=\"pr-28 text-[11px] leading-[1.55] text-[var(--text-secondary)]\">\n {formatIssueManagerDate(issue.updatedAtUnix ?? issue.createdAtUnix)}\n </p>\n <p className=\"line-clamp-4 text-[13px] font-medium leading-[1.35rem] text-[var(--text-primary)]\">\n {issue.title}\n </p>\n </div>\n {subtaskProgress ? (\n <div\n aria-label={`${copy.t(\"labels.taskCount\", {\n count: subtaskProgress.total\n })}, ${subtaskProgress.completed}/${subtaskProgress.total}`}\n className=\"mt-3 flex min-w-0 items-center gap-2 text-[11px] font-semibold leading-none text-[var(--text-secondary)]\"\n >\n <span className=\"shrink-0\">\n {copy.t(\"labels.taskCount\", { count: subtaskProgress.total })}\n </span>\n <span\n aria-hidden=\"true\"\n className=\"h-1 w-14 shrink-0 overflow-hidden rounded-full bg-[var(--transparency-block)]\"\n >\n <span\n className=\"block h-full rounded-full bg-[var(--status-running)]\"\n style={{ width: `${subtaskProgress.percent}%` }}\n />\n </span>\n <span className=\"shrink-0 text-[11px] font-semibold leading-none text-[var(--text-secondary)]\">\n {subtaskProgress.completed}/{subtaskProgress.total}\n </span>\n </div>\n ) : null}\n </button>\n );\n}\n\nfunction IssueManagerSidebarLoadingState({\n isNarrowLayout\n}: {\n isNarrowLayout: boolean;\n}): JSX.Element {\n return (\n <div\n aria-hidden=\"true\"\n className={cn(\n \"gap-2.5\",\n isNarrowLayout ? \"flex flex-row flex-nowrap overflow-x-hidden\" : \"grid\"\n )}\n >\n {Array.from({ length: 4 }, (_, index) => (\n <div\n className={cn(\n \"rounded-lg bg-transparent px-3.5 py-3.5\",\n isNarrowLayout &&\n \"h-24 max-h-24 min-h-24 w-[clamp(220px,58vw,320px)] flex-[0_0_clamp(220px,58vw,320px)]\"\n )}\n key={index}\n >\n <div className=\"h-3.5 w-20 rounded-full bg-[var(--transparency-block)]\" />\n <div className=\"mt-3 h-4 w-4/5 rounded-full bg-[var(--transparency-block)]\" />\n <div className=\"mt-4 h-3.5 w-24 rounded-full bg-[var(--transparency-block)]\" />\n </div>\n ))}\n </div>\n );\n}\n\nfunction IssueManagerSidebarEmptyState({\n body,\n isNarrowLayout,\n tone = \"default\"\n}: {\n body: string;\n isNarrowLayout: boolean;\n tone?: \"default\" | \"destructive\";\n}): JSX.Element {\n return (\n <div\n className={cn(\n \"relative flex flex-1 flex-col items-center justify-center self-stretch overflow-hidden p-0 text-center\",\n isNarrowLayout\n ? \"h-24 max-h-24 min-h-24 w-full flex-[0_0_100%]\"\n : \"min-h-full\"\n )}\n >\n <p\n className={cn(\n \"max-w-sm text-[13px] leading-5 text-[var(--text-secondary)]\",\n tone === \"destructive\"\n ? \"text-[var(--state-danger)]\"\n : \"text-[var(--text-secondary)]\"\n )}\n >\n {body}\n </p>\n </div>\n );\n}\n\nfunction IssueManagerSidebarErrorState({\n isNarrowLayout,\n retryLabel,\n title,\n onRetry\n}: {\n isNarrowLayout: boolean;\n retryLabel: string;\n title: string;\n onRetry: () => void;\n}): JSX.Element {\n return (\n <div\n className={cn(\n \"relative flex flex-1 flex-col items-center justify-center self-stretch overflow-hidden px-4 py-6 text-center\",\n isNarrowLayout\n ? \"h-24 max-h-24 min-h-24 w-full flex-[0_0_100%]\"\n : \"min-h-full\"\n )}\n >\n <p className=\"text-[13px] font-semibold leading-5 text-[var(--state-danger)]\">\n {title}\n </p>\n <Button\n className=\"mt-3\"\n size=\"sm\"\n type=\"button\"\n variant=\"secondary\"\n onClick={onRetry}\n >\n {retryLabel}\n </Button>\n </div>\n );\n}\n","import type {\n IssueManagerIssueSummary,\n IssueManagerStatusCounts,\n IssueManagerTaskSummary\n} from \"../../../contracts/index.ts\";\nimport type { IssueManagerI18nRuntime } from \"../../../i18n/issueManagerI18n.ts\";\nimport type { AsyncCollectionState } from \"../../../services/controllerTypes.ts\";\nimport type { IssueManagerEditorMode } from \"../../../services/controllerModel.ts\";\n\nexport const issueManagerStatusFilters = [\n \"all\",\n \"not_started\",\n \"running\",\n \"pending_acceptance\",\n \"completed\",\n \"failed\",\n \"canceled\"\n] as const;\n\nexport type IssueManagerSidebarViewState =\n | {\n kind: \"loading\";\n }\n | {\n kind: \"error\";\n retryLabel: string;\n title: string;\n }\n | {\n body: string;\n kind: \"empty\";\n title: string;\n }\n | {\n issues: readonly IssueManagerIssueSummary[];\n kind: \"list\";\n };\n\nexport function resolveIssueManagerSidebarViewState(input: {\n copy: IssueManagerI18nRuntime;\n issues: AsyncCollectionState<IssueManagerIssueSummary[]>;\n}): IssueManagerSidebarViewState {\n if (\n input.issues.isLoading &&\n input.issues.value.length === 0 &&\n input.issues.hasResolved !== true\n ) {\n return {\n kind: \"loading\"\n };\n }\n\n if (input.issues.error) {\n return {\n kind: \"error\",\n retryLabel: input.copy.t(\"actions.refresh\"),\n title: input.copy.t(\"messages.issueRefreshFailed\")\n };\n }\n\n if (input.issues.value.length === 0) {\n return {\n body: input.copy.t(\"messages.noIssuesForFilterBody\"),\n kind: \"empty\",\n title: input.copy.t(\"messages.noIssuesForFilterTitle\")\n };\n }\n\n return {\n issues: input.issues.value,\n kind: \"list\"\n };\n}\n\nexport function buildIssueManagerStatusCounts(\n issues: readonly IssueManagerIssueSummary[]\n): Record<(typeof issueManagerStatusFilters)[number], number> {\n const counts: Record<(typeof issueManagerStatusFilters)[number], number> = {\n all: issues.length,\n canceled: 0,\n completed: 0,\n failed: 0,\n not_started: 0,\n pending_acceptance: 0,\n running: 0\n };\n\n for (const issue of issues) {\n if (issue.status in counts) {\n counts[issue.status as keyof typeof counts] += 1;\n }\n }\n\n return counts;\n}\n\nexport function resolveIssueManagerStatusCounts(\n input: AsyncCollectionState<IssueManagerIssueSummary[]>\n): Record<(typeof issueManagerStatusFilters)[number], number> {\n return input.statusCounts\n ? mapIssueManagerStatusCounts(input.statusCounts)\n : buildIssueManagerStatusCounts(input.value);\n}\n\nfunction mapIssueManagerStatusCounts(\n counts: IssueManagerStatusCounts\n): Record<(typeof issueManagerStatusFilters)[number], number> {\n return {\n all: counts.all,\n canceled: counts.canceled,\n completed: counts.completed,\n failed: counts.failed,\n not_started: counts.notStarted,\n pending_acceptance: counts.pendingAcceptance,\n running: counts.running\n };\n}\n\nexport interface IssueManagerSubtaskProgressViewState {\n completed: number;\n percent: number;\n total: number;\n}\n\nexport function resolveIssueManagerSubtaskProgress(\n issue: Pick<IssueManagerIssueSummary, \"completedCount\" | \"taskCount\">\n): IssueManagerSubtaskProgressViewState | null {\n const total = Math.max(0, Math.trunc(issue.taskCount ?? 0));\n if (total <= 0) {\n return null;\n }\n\n const completed = Math.min(\n total,\n Math.max(0, Math.trunc(issue.completedCount ?? 0))\n );\n\n return {\n completed,\n percent: (completed / total) * 100,\n total\n };\n}\n\nexport function resolveIssueManagerSubtaskProgressFromTasks(\n tasks: readonly Pick<IssueManagerTaskSummary, \"status\">[]\n): IssueManagerSubtaskProgressViewState | null {\n const total = tasks.length;\n if (total <= 0) {\n return null;\n }\n\n const completed = tasks.filter(\n (task) =>\n task.status === \"completed\" || task.status === \"pending_acceptance\"\n ).length;\n\n return {\n completed,\n percent: (completed / total) * 100,\n total\n };\n}\n\nexport function resolveIssueManagerSubtaskProgressByIssueId(input: {\n issueId: string | null;\n visibleTasks: readonly Pick<IssueManagerTaskSummary, \"status\">[] | null;\n}): Record<string, IssueManagerSubtaskProgressViewState | null> {\n if (!input.issueId || !input.visibleTasks) {\n return {};\n }\n\n return {\n [input.issueId]: resolveIssueManagerSubtaskProgressFromTasks(\n input.visibleTasks\n )\n };\n}\n\nexport interface IssueManagerShellContentViewState {\n isIssueEditing: boolean;\n isTaskCreating: boolean;\n isTaskDrawerOpen: boolean;\n showBottomBar: boolean;\n}\n\nexport function resolveIssueManagerShellContentViewState(input: {\n issueEditorMode: IssueManagerEditorMode;\n selectedIssue: IssueManagerIssueSummary | null;\n selectedTaskPresent: boolean;\n taskEditorMode: IssueManagerEditorMode;\n}): IssueManagerShellContentViewState {\n const isIssueEditing = input.issueEditorMode !== \"read\";\n const isTaskCreating = !isIssueEditing && input.taskEditorMode === \"create\";\n const isTaskDrawerOpen =\n !isIssueEditing &&\n !isTaskCreating &&\n (input.taskEditorMode === \"edit\" || input.selectedTaskPresent);\n\n return {\n isIssueEditing,\n isTaskCreating,\n isTaskDrawerOpen,\n showBottomBar:\n input.selectedIssue !== null &&\n input.issueEditorMode === \"read\" &&\n input.taskEditorMode !== \"create\"\n };\n}\n","import type { IssueManagerSidebarViewState } from \"./IssueManagerShellState.ts\";\n\nexport type IssueManagerSidebarPresentationState =\n | {\n body: string;\n kind: \"empty\";\n }\n | {\n kind: \"error\";\n retryLabel: string;\n title: string;\n }\n | {\n kind: \"none\";\n };\n\nexport function resolveIssueManagerSidebarPresentationState(input: {\n showStandaloneState: boolean;\n sidebarViewState: IssueManagerSidebarViewState;\n}): IssueManagerSidebarPresentationState {\n const { showStandaloneState, sidebarViewState } = input;\n\n if (!showStandaloneState) {\n return { kind: \"none\" };\n }\n\n if (sidebarViewState.kind === \"error\") {\n return {\n kind: \"error\",\n retryLabel: sidebarViewState.retryLabel,\n title: sidebarViewState.title\n };\n }\n\n if (sidebarViewState.kind === \"empty\") {\n return {\n body: sidebarViewState.body,\n kind: \"empty\"\n };\n }\n\n return { kind: \"none\" };\n}\n","import type { JSX } from \"react\";\nimport { Button } from \"@tutti-os/ui-system\";\nimport type { IssueManagerIssueSummary } from \"../../../contracts/index.ts\";\nimport { IssueManagerRichTextTextarea } from \"../content/IssueManagerRichTextTextarea.tsx\";\nimport type { IssueManagerController } from \"../../react/index.ts\";\nimport { IssueManagerDraftTitleInput } from \"./IssueManagerDraftTitleInput.tsx\";\nimport {\n issueManagerEditorFooterFadeInClassName,\n issueManagerEditorRiseInClassName,\n issueManagerEditorRiseInDelay0ClassName,\n issueManagerEditorRiseInDelay1ClassName,\n issueManagerEditorRiseInDelay2ClassName\n} from \"./IssueManagerEditorMotion.ts\";\n\nexport function IssueManagerTaskComposerPane({\n controller,\n onCancel,\n selectedIssue\n}: {\n controller: IssueManagerController;\n onCancel: () => void;\n selectedIssue: IssueManagerIssueSummary | null;\n}): JSX.Element {\n const copy = controller.copy;\n const isTaskTitleMissing = controller.taskDraft.title.trim().length === 0;\n\n return (\n <div className=\"flex h-full min-h-0 flex-col overflow-hidden\">\n <div className=\"flex min-h-0 flex-1 flex-col gap-[14px] overflow-y-auto px-7 py-8\">\n <div className=\"flex w-full min-w-0 flex-col gap-3\">\n <div\n className={`${issueManagerEditorRiseInClassName} ${issueManagerEditorRiseInDelay0ClassName}`}\n >\n <h2 className=\"m-0 text-[15px] font-semibold leading-[1.35] text-[var(--text-primary)]\">\n {copy.t(\"actions.addSubtask\")}\n </h2>\n </div>\n <div className=\"flex w-full min-w-0 flex-col gap-6\">\n <label\n className={`flex w-full min-w-0 flex-col gap-2 text-[13px] font-semibold text-[var(--text-secondary)] ${issueManagerEditorRiseInClassName} ${issueManagerEditorRiseInDelay1ClassName}`}\n >\n <span className=\"leading-5\">{copy.t(\"labels.title\")}</span>\n <IssueManagerDraftTitleInput\n placeholder={copy.t(\"composer.subtaskTitlePlaceholder\")}\n value={controller.taskDraft.title}\n onChange={controller.setTaskTitle}\n />\n </label>\n <div\n className={`flex min-h-0 w-full min-w-0 flex-col gap-2 text-[13px] font-semibold text-[var(--text-secondary)] ${issueManagerEditorRiseInClassName} ${issueManagerEditorRiseInDelay2ClassName}`}\n >\n <span className=\"leading-5\">\n {copy.t(\"labels.requirementDescription\")}\n </span>\n <IssueManagerRichTextTextarea\n controller={controller}\n surface=\"task\"\n textareaClassName=\"min-h-[180px] resize-none\"\n placeholder={copy.t(\"composer.subtaskContentPlaceholder\")}\n value={controller.taskDraft.content}\n onChange={controller.setTaskContent}\n />\n </div>\n </div>\n </div>\n </div>\n\n <div\n className={`shrink-0 border-t border-border-1 px-7 py-4 ${issueManagerEditorFooterFadeInClassName}`}\n >\n <div className=\"flex items-center justify-end gap-3\">\n <Button\n size=\"default\"\n type=\"button\"\n variant=\"secondary\"\n onClick={onCancel}\n >\n {copy.t(\"actions.cancel\")}\n </Button>\n <Button\n disabled={!selectedIssue || isTaskTitleMissing}\n size=\"default\"\n type=\"button\"\n onClick={() => void controller.saveTask()}\n >\n {copy.t(\"actions.saveSubtask\")}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import { useRef, type JSX, type MouseEvent, type PointerEvent } from \"react\";\nimport { ScrollArea, cn } from \"@tutti-os/ui-system\";\nimport type {\n IssueManagerIssueSummary,\n IssueManagerTaskSummary\n} from \"../../../contracts/index.ts\";\nimport { logIssueManagerDiagnostic } from \"../../../internal/issueManagerDiagnostics.ts\";\nimport {\n IssueManagerTaskDrawerBody,\n IssueManagerTaskDrawerFooter,\n IssueManagerTaskDrawerHeader\n} from \"./IssueManagerTaskDrawerSections.tsx\";\nimport type { IssueManagerLatestRunStatusRenderer } from \"../../latestRunStatusRenderer.ts\";\nimport { resolveIssueManagerTaskDrawerViewState } from \"./IssueManagerTaskDrawerState.ts\";\nimport type { IssueManagerController } from \"../../react/index.ts\";\n\nexport type IssueManagerTaskDrawerCloseSource = \"backdrop\" | \"header_back\";\n\nexport function IssueManagerTaskDrawer({\n controller,\n isClosing,\n renderLatestRunStatus,\n selectedIssue,\n selectedTask,\n onClose,\n shouldIgnoreBackdropClick\n}: {\n controller: IssueManagerController;\n isClosing: boolean;\n renderLatestRunStatus?: IssueManagerLatestRunStatusRenderer;\n selectedIssue: IssueManagerIssueSummary | null;\n selectedTask: IssueManagerTaskSummary | null;\n onClose: (source: IssueManagerTaskDrawerCloseSource) => void;\n shouldIgnoreBackdropClick?: (event: {\n clientX: number;\n clientY: number;\n }) => boolean;\n}): JSX.Element {\n const view = resolveIssueManagerTaskDrawerViewState({\n controller,\n selectedTask\n });\n const taskContent = selectedTask?.content ?? \"\";\n const hasRequestedBackdropCloseRef = useRef(false);\n const requestBackdropClose = (\n event: MouseEvent<HTMLDivElement> | PointerEvent<HTMLDivElement>,\n phase: \"click\" | \"pointer_down\"\n ) => {\n const target = event.target;\n logIssueManagerDiagnostic(\n controller.diagnostics,\n \"task_drawer.backdrop_close_event\",\n {\n clientX: event.clientX,\n clientY: event.clientY,\n currentTargetTag: event.currentTarget.tagName,\n hasRequestedBackdropClose: hasRequestedBackdropCloseRef.current,\n isClosing,\n isDirectBackdropClick: event.target === event.currentTarget,\n phase,\n selectedIssueId: selectedIssue?.issueId ?? null,\n selectedTaskId: selectedTask?.taskId ?? null,\n selectedTaskTitle: selectedTask?.title ?? null,\n targetClassName:\n target instanceof HTMLElement ? target.className : null,\n targetTag: target instanceof HTMLElement ? target.tagName : null\n }\n );\n\n if (event.target !== event.currentTarget) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n if (hasRequestedBackdropCloseRef.current) {\n return;\n }\n\n if (shouldIgnoreBackdropClick?.(event)) {\n return;\n }\n\n hasRequestedBackdropCloseRef.current = true;\n onClose(\"backdrop\");\n };\n const handleBackdropPointerDown = (event: PointerEvent<HTMLDivElement>) => {\n if (event.pointerType === \"mouse\" && event.button !== 0) {\n return;\n }\n requestBackdropClose(event, \"pointer_down\");\n };\n const handleBackdropClick = (event: MouseEvent<HTMLDivElement>) => {\n if (hasRequestedBackdropCloseRef.current) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n requestBackdropClose(event, \"click\");\n };\n\n return (\n <div\n className={cn(\n \"absolute inset-0 z-20 flex justify-end overscroll-contain bg-[var(--backdrop)] backdrop-blur-[1px] motion-reduce:animate-none\",\n isClosing\n ? \"motion-safe:animate-out motion-safe:fade-out-0 motion-safe:duration-[180ms] motion-safe:ease-[cubic-bezier(0.4,0,0.2,1)]\"\n : \"motion-safe:animate-in motion-safe:fade-in-0 motion-safe:duration-[180ms] motion-safe:ease-[cubic-bezier(0.4,0,0.2,1)]\"\n )}\n onClick={handleBackdropClick}\n onPointerDown={handleBackdropPointerDown}\n onTouchMove={(event) => {\n event.preventDefault();\n }}\n onWheel={(event) => {\n event.preventDefault();\n }}\n >\n <aside\n className={cn(\n \"flex h-full w-[min(360px,92cqw)] flex-col overscroll-contain border-l border-border-1 bg-background-panel text-[var(--text-primary)] shadow-[-20px_0_60px_var(--shadow-elevated)] @min-[960px]/issue-manager-content:w-[480px] motion-reduce:animate-none\",\n isClosing\n ? \"motion-safe:animate-out motion-safe:slide-out-to-right-full motion-safe:duration-[180ms] motion-safe:ease-[cubic-bezier(0.4,0,0.2,1)]\"\n : \"motion-safe:animate-in motion-safe:slide-in-from-right-full motion-safe:duration-[220ms] motion-safe:ease-[cubic-bezier(0.22,1,0.36,1)]\"\n )}\n onClick={(event) => event.stopPropagation()}\n onTouchMove={(event) => event.stopPropagation()}\n onWheel={(event) => event.stopPropagation()}\n >\n {view.bodyKind === \"edit\" ? null : (\n <IssueManagerTaskDrawerHeader\n controller={controller}\n onClose={() => onClose(\"header_back\")}\n selectedTask={selectedTask}\n view={view}\n />\n )}\n\n <ScrollArea\n scrollbarMode=\"native\"\n className=\"min-h-0 flex-1 [&_[data-slot=scroll-area-viewport]]:overscroll-contain\"\n >\n <div\n className={cn(\n \"flex flex-col\",\n view.bodyKind === \"edit\"\n ? \"gap-[14px] px-6 py-8\"\n : \"gap-8 px-6 pt-1 pb-7\"\n )}\n >\n <IssueManagerTaskDrawerBody\n controller={controller}\n renderLatestRunStatus={renderLatestRunStatus}\n taskContent={taskContent}\n view={view}\n />\n </div>\n </ScrollArea>\n\n <IssueManagerTaskDrawerFooter\n controller={controller}\n selectedIssue={selectedIssue}\n selectedTask={selectedTask}\n view={view}\n />\n </aside>\n </div>\n );\n}\n","import { useState, type JSX } from \"react\";\nimport {\n Badge,\n BareIconButton,\n Button,\n CollapseLinedIcon,\n ConfirmationDialog\n} from \"@tutti-os/ui-system\";\nimport type {\n IssueManagerIssueSummary,\n IssueManagerTaskSummary\n} from \"../../../contracts/index.ts\";\nimport {\n formatIssueManagerTimestamp,\n resolveIssueManagerStatusLabel\n} from \"../../../services/controllerModel.ts\";\nimport { IssueManagerDescriptionSection } from \"../content/IssueManagerDescriptionSection.tsx\";\nimport { IssueManagerTitleTooltip } from \"../content/IssueManagerTitleTooltip.tsx\";\nimport {\n IssueManagerLatestRunStatusSection,\n IssueManagerOutputSection\n} from \"../issue/IssueManagerIssueSections.tsx\";\nimport type { IssueManagerLatestRunStatusRenderer } from \"../../latestRunStatusRenderer.ts\";\nimport { IssueManagerTaskDrawerLoadingState } from \"../panel/IssueManagerPanelSurface.tsx\";\nimport { resolveTaskCreatorLabel } from \"../panel/IssueManagerPanelText.ts\";\nimport { IssueManagerRichTextTextarea } from \"../content/IssueManagerRichTextTextarea.tsx\";\nimport {\n IssueManagerExecutionDirectoryTrigger,\n IssueManagerRunActionTrigger\n} from \"../task/IssueManagerRunSections.tsx\";\nimport { IssueManagerTaskAcceptanceCard } from \"../task/IssueManagerTaskAcceptanceCard.tsx\";\nimport { issueManagerStatusBadgeVariant } from \"../status/IssueManagerStatusBadge.ts\";\nimport { IssueManagerDraftTitleInput } from \"./IssueManagerDraftTitleInput.tsx\";\nimport {\n canIssueManagerSaveTask,\n isIssueManagerRunControlDisabled,\n type IssueManagerTaskDrawerViewState\n} from \"./IssueManagerTaskDrawerState.ts\";\nimport type { IssueManagerController } from \"../../react/index.ts\";\nimport {\n issueManagerEditorFooterFadeInClassName,\n issueManagerEditorRiseInClassName,\n issueManagerEditorRiseInDelay0ClassName,\n issueManagerEditorRiseInDelay1ClassName,\n issueManagerEditorRiseInDelay2ClassName\n} from \"./IssueManagerEditorMotion.ts\";\n\nexport function IssueManagerTaskDrawerHeader({\n controller,\n onClose,\n selectedTask,\n view\n}: {\n controller: IssueManagerController;\n onClose: () => void;\n selectedTask: IssueManagerTaskSummary | null;\n view: Pick<\n IssueManagerTaskDrawerViewState,\n \"showTaskActions\" | \"showTaskMetadata\" | \"title\"\n >;\n}): JSX.Element {\n const copy = controller.copy;\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);\n const [deleteBusy, setDeleteBusy] = useState(false);\n\n return (\n <>\n <div className=\"grid gap-3 px-6 pt-7 pb-3\">\n <div className=\"flex items-center justify-between gap-6\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <BareIconButton\n aria-label={copy.t(\"actions.closeTaskDetails\")}\n size=\"md\"\n title={copy.t(\"actions.closeTaskDetails\")}\n onClick={onClose}\n >\n <CollapseLinedIcon className=\"size-4\" />\n </BareIconButton>\n {view.showTaskMetadata && selectedTask ? (\n <IssueManagerTitleTooltip title={view.title}>\n <h3 className=\"line-clamp-2 min-w-0 flex-1 whitespace-normal text-[15px] font-semibold leading-6 text-[var(--text-primary)] [overflow-wrap:anywhere]\">\n {view.title}\n </h3>\n </IssueManagerTitleTooltip>\n ) : (\n <IssueManagerTitleTooltip title={view.title}>\n <h3 className=\"line-clamp-2 min-w-0 flex-1 whitespace-normal text-[15px] font-semibold leading-[1.35] text-[var(--text-primary)] [overflow-wrap:anywhere]\">\n {view.title}\n </h3>\n </IssueManagerTitleTooltip>\n )}\n </div>\n <div className=\"flex shrink-0 items-center gap-2\">\n {view.showTaskActions && selectedTask ? (\n <>\n <Button\n type=\"button\"\n variant=\"ghost\"\n onClick={() => controller.setTaskEditorMode(\"edit\")}\n >\n {copy.t(\"actions.edit\")}\n </Button>\n <Button\n className=\"text-[var(--state-danger)] hover:bg-[var(--on-danger)] hover:text-[var(--state-danger)]\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => setDeleteDialogOpen(true)}\n >\n {copy.t(\"actions.delete\")}\n </Button>\n </>\n ) : null}\n </div>\n </div>\n {view.showTaskMetadata && selectedTask ? (\n <div className=\"grid gap-2\">\n <IssueManagerTaskMetadataRow\n copy={copy}\n selectedTask={selectedTask}\n />\n {selectedTask.status === \"pending_acceptance\" ? (\n <IssueManagerTaskAcceptanceCard controller={controller} />\n ) : null}\n </div>\n ) : null}\n </div>\n {selectedTask ? (\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmBusy={deleteBusy}\n confirmLabel={copy.t(\"actions.delete\")}\n description={\n <span className=\"block max-w-full whitespace-normal [overflow-wrap:anywhere]\">\n {selectedTask.title}\n </span>\n }\n open={deleteDialogOpen}\n title={copy.t(\"confirmations.deleteTask\")}\n tone=\"destructive\"\n onConfirm={() => {\n setDeleteBusy(true);\n void controller\n .deleteTask({ skipConfirmation: true })\n .finally(() => {\n setDeleteBusy(false);\n setDeleteDialogOpen(false);\n });\n }}\n onOpenChange={setDeleteDialogOpen}\n />\n ) : null}\n </>\n );\n}\n\nfunction IssueManagerTaskMetadataRow({\n copy,\n selectedTask\n}: {\n copy: IssueManagerController[\"copy\"];\n selectedTask: IssueManagerTaskSummary;\n}): JSX.Element {\n return (\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-2 text-[11px] font-normal leading-[1.3] text-[var(--text-secondary)]\">\n <Badge variant={issueManagerStatusBadgeVariant(selectedTask.status)}>\n {resolveIssueManagerStatusLabel(copy, selectedTask.status)}\n </Badge>\n <span\n aria-hidden=\"true\"\n className=\"h-4 w-px shrink-0 bg-[var(--line-2)]\"\n />\n <span className=\"text-[11px] font-normal leading-[1.3]\">\n {copy.t(\"labels.creator\")} {resolveTaskCreatorLabel(selectedTask)}\n </span>\n <span\n aria-hidden=\"true\"\n className=\"h-4 w-px shrink-0 bg-[var(--line-2)]\"\n />\n <span className=\"text-[11px] font-normal leading-[1.3]\">\n {copy.t(\"labels.createdAt\")}{\" \"}\n {formatIssueManagerTimestamp(selectedTask.createdAtUnix) || \"-\"}\n </span>\n </div>\n );\n}\n\nexport function IssueManagerTaskDrawerLoadingBody(): JSX.Element {\n return <IssueManagerTaskDrawerLoadingState />;\n}\n\nexport function IssueManagerTaskDrawerBody({\n controller,\n renderLatestRunStatus,\n taskContent,\n view\n}: {\n controller: IssueManagerController;\n renderLatestRunStatus?: IssueManagerLatestRunStatusRenderer;\n taskContent: string;\n view: Pick<\n IssueManagerTaskDrawerViewState,\n \"bodyKind\" | \"isCreate\" | \"title\"\n >;\n}): JSX.Element {\n if (view.bodyKind === \"loading\") {\n return <IssueManagerTaskDrawerLoadingBody />;\n }\n\n if (view.bodyKind === \"edit\") {\n return (\n <IssueManagerTaskDrawerEditBody\n controller={controller}\n title={view.title}\n />\n );\n }\n\n return (\n <IssueManagerTaskDrawerReadBody\n controller={controller}\n latestRunTitle={view.title}\n renderLatestRunStatus={renderLatestRunStatus}\n taskContent={taskContent}\n />\n );\n}\n\nexport function IssueManagerTaskDrawerEditBody({\n controller,\n title\n}: {\n controller: IssueManagerController;\n title: string;\n}): JSX.Element {\n const copy = controller.copy;\n\n return (\n <div className=\"flex w-full min-w-0 flex-col gap-3\">\n <div\n className={`${issueManagerEditorRiseInClassName} ${issueManagerEditorRiseInDelay0ClassName}`}\n >\n <h2 className=\"m-0 text-[15px] font-semibold leading-[1.35] text-[var(--text-primary)]\">\n {title}\n </h2>\n </div>\n <div className=\"flex w-full min-w-0 flex-col gap-6\">\n <label\n className={`flex w-full min-w-0 flex-col gap-2 text-[13px] font-semibold text-[var(--text-secondary)] ${issueManagerEditorRiseInClassName} ${issueManagerEditorRiseInDelay1ClassName}`}\n >\n <span className=\"leading-5\">{copy.t(\"labels.title\")}</span>\n <IssueManagerDraftTitleInput\n placeholder={copy.t(\"composer.taskTitlePlaceholder\")}\n value={controller.taskDraft.title}\n onChange={controller.setTaskTitle}\n />\n </label>\n <div\n className={`flex min-h-0 w-full min-w-0 flex-col gap-2 text-[13px] font-semibold text-[var(--text-secondary)] ${issueManagerEditorRiseInClassName} ${issueManagerEditorRiseInDelay2ClassName}`}\n >\n <span className=\"leading-5\">{copy.t(\"labels.content\")}</span>\n <IssueManagerRichTextTextarea\n controller={controller}\n surface=\"task\"\n textareaClassName=\"min-h-[180px] resize-none\"\n placeholder={copy.t(\"composer.taskContentPlaceholder\")}\n value={controller.taskDraft.content}\n onChange={controller.setTaskContent}\n />\n </div>\n </div>\n </div>\n );\n}\n\nexport function IssueManagerTaskDrawerReadBody({\n controller,\n latestRunTitle,\n renderLatestRunStatus,\n taskContent\n}: {\n controller: IssueManagerController;\n latestRunTitle: string;\n renderLatestRunStatus?: IssueManagerLatestRunStatusRenderer;\n taskContent: string;\n}): JSX.Element {\n const copy = controller.copy;\n const latestRun =\n controller.taskDetail.value?.latestRun ??\n controller.taskDetail.value?.recentRuns[0] ??\n null;\n const latestOutputs = controller.taskDetail.value?.latestOutputs ?? [];\n\n return (\n <>\n <IssueManagerDescriptionSection\n content={taskContent}\n emptyLabel={copy.t(\"messages.taskContentEmpty\")}\n label={copy.t(\"labels.description\")}\n onMentionAction={controller.openMention}\n onOpen={controller.openReference}\n variant=\"plain\"\n />\n <IssueManagerLatestRunStatusSection\n copy={copy}\n latestRun={latestRun}\n onOpenAgentSession={\n controller.canOpenAgentSessions\n ? controller.openAgentSession\n : undefined\n }\n renderLatestRunStatus={renderLatestRunStatus}\n title={latestRunTitle}\n />\n <IssueManagerOutputSection\n copy={copy}\n outputs={latestOutputs}\n onOpen={controller.openReference}\n />\n </>\n );\n}\n\nexport function IssueManagerTaskDrawerFooter({\n controller,\n selectedIssue,\n selectedTask,\n view\n}: {\n controller: IssueManagerController;\n selectedIssue: IssueManagerIssueSummary | null;\n selectedTask: IssueManagerTaskSummary | null;\n view: Pick<\n IssueManagerTaskDrawerViewState,\n | \"isCreate\"\n | \"isEdit\"\n | \"showEditFooter\"\n | \"showReadFooter\"\n | \"isTaskTitleMissing\"\n >;\n}): JSX.Element | null {\n const copy = controller.copy;\n const runControlsDisabled = isIssueManagerRunControlDisabled({\n selectedIssueStatus: selectedIssue?.status,\n selectedTaskStatus: selectedTask?.status\n });\n\n if (view.showReadFooter && selectedTask) {\n return (\n <div className=\"border-t border-[var(--border-1)] bg-transparent px-6 py-4 backdrop-blur\">\n <div className=\"flex items-center justify-end gap-3\">\n <IssueManagerExecutionDirectoryTrigger\n className=\"mr-auto\"\n controller={controller}\n disabled={runControlsDisabled}\n />\n <IssueManagerRunActionTrigger\n controller={controller}\n disabled={runControlsDisabled}\n triggerVariant=\"button\"\n />\n {controller.canInviteCollaborators ? (\n <Button\n disabled={!selectedIssue}\n size=\"dialog\"\n type=\"button\"\n onClick={() => {\n void controller.shareSelection();\n }}\n >\n {copy.t(\"actions.inviteCollaborator\")}\n </Button>\n ) : null}\n </div>\n </div>\n );\n }\n\n if (view.showEditFooter) {\n return (\n <div\n className={`border-t border-border-1 px-6 py-4 ${issueManagerEditorFooterFadeInClassName}`}\n >\n <div className=\"flex items-center justify-end gap-3\">\n <Button\n size=\"dialog\"\n type=\"button\"\n variant=\"secondary\"\n onClick={() => controller.setTaskEditorMode(\"read\")}\n >\n {copy.t(\"actions.cancel\")}\n </Button>\n <Button\n disabled={\n canIssueManagerSaveTask({\n selectedIssue,\n view\n }) === false\n }\n size=\"dialog\"\n type=\"button\"\n onClick={() => void controller.saveTask()}\n >\n {copy.t(\"actions.saveTask\")}\n </Button>\n </div>\n </div>\n );\n }\n\n return null;\n}\n","import {\n useEffect,\n useEffectEvent,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent,\n type PointerEvent\n} from \"react\";\nimport type {\n IssueManagerIssueSummary,\n IssueManagerTaskSummary\n} from \"../../../contracts/index.ts\";\nimport {\n clampIssueManagerSidebarWidth,\n issueManagerSidebarDefaultWidth,\n issueManagerSidebarMaxWidth,\n issueManagerSidebarMinWidth,\n shouldAutoCollapseIssueManagerSidebar\n} from \"../../../core/index.ts\";\nimport type { IssueManagerController } from \"../../react/index.ts\";\nimport {\n resolveIssueManagerShellContentViewState,\n resolveIssueManagerStatusCounts,\n resolveIssueManagerSidebarViewState\n} from \"./IssueManagerShellState.ts\";\nimport { logIssueManagerDiagnostic } from \"../../../internal/issueManagerDiagnostics.ts\";\n\ninterface SidebarResizeState {\n maxWidth: number;\n pointerId: number;\n startClientX: number;\n startWidth: number;\n}\n\ninterface ShellContentDiagnosticSnapshot {\n isIssueEditing: boolean;\n isTaskCreating: boolean;\n isTaskDrawerOpen: boolean;\n issueEditorMode: string;\n selectedIssueId: string | null;\n selectedTaskId: string | null;\n selectedTaskPresent: boolean;\n taskEditorMode: string;\n}\n\nexport interface UseIssueManagerShellViewInput {\n controller: IssueManagerController;\n selectedIssue: IssueManagerIssueSummary | null;\n selectedTask: IssueManagerTaskSummary | null;\n}\n\nexport function useIssueManagerShellView({\n controller,\n selectedIssue,\n selectedTask\n}: UseIssueManagerShellViewInput) {\n const layoutRef = useRef<HTMLDivElement | null>(null);\n const resizeRef = useRef<SidebarResizeState | null>(null);\n const [sidebarWidth, setSidebarWidth] = useState(\n issueManagerSidebarDefaultWidth\n );\n const [isNarrowLayout, setIsNarrowLayout] = useState(false);\n const dismissNotification = useEffectEvent(() => {\n controller.dismissNotification();\n });\n const floatingNotice = controller.floatingNotice;\n const lastContentDiagnosticRef =\n useRef<ShellContentDiagnosticSnapshot | null>(null);\n\n useEffect(() => {\n const publishLayout = () => {\n const width = layoutRef.current?.getBoundingClientRect().width ?? 0;\n if (!width) {\n return;\n }\n setSidebarWidth((current) =>\n clampIssueManagerSidebarWidth(current, width)\n );\n setIsNarrowLayout(shouldAutoCollapseIssueManagerSidebar(width));\n };\n\n const layout = layoutRef.current;\n const observer =\n layout && typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(publishLayout)\n : null;\n publishLayout();\n if (observer && layout) {\n observer.observe(layout);\n }\n window.addEventListener(\"resize\", publishLayout);\n return () => {\n observer?.disconnect();\n window.removeEventListener(\"resize\", publishLayout);\n };\n }, []);\n\n useEffect(() => {\n if (!floatingNotice) {\n return undefined;\n }\n\n const timeout = window.setTimeout(() => {\n dismissNotification();\n }, floatingNotice.durationMs);\n\n return () => {\n window.clearTimeout(timeout);\n };\n }, [dismissNotification, floatingNotice]);\n\n const content = resolveIssueManagerShellContentViewState({\n issueEditorMode: controller.issueEditorMode,\n selectedIssue,\n selectedTaskPresent: selectedTask !== null,\n taskEditorMode: controller.taskEditorMode\n });\n useEffect(() => {\n const nextDiagnostic: ShellContentDiagnosticSnapshot = {\n isIssueEditing: content.isIssueEditing,\n isTaskCreating: content.isTaskCreating,\n isTaskDrawerOpen: content.isTaskDrawerOpen,\n issueEditorMode: controller.issueEditorMode,\n selectedIssueId: controller.nodeState.selectedIssueId,\n selectedTaskId: controller.nodeState.selectedTaskId,\n selectedTaskPresent: selectedTask !== null,\n taskEditorMode: controller.taskEditorMode\n };\n const previousDiagnostic = lastContentDiagnosticRef.current;\n if (\n previousDiagnostic &&\n previousDiagnostic.isIssueEditing === nextDiagnostic.isIssueEditing &&\n previousDiagnostic.isTaskCreating === nextDiagnostic.isTaskCreating &&\n previousDiagnostic.isTaskDrawerOpen === nextDiagnostic.isTaskDrawerOpen &&\n previousDiagnostic.issueEditorMode === nextDiagnostic.issueEditorMode &&\n previousDiagnostic.selectedIssueId === nextDiagnostic.selectedIssueId &&\n previousDiagnostic.selectedTaskId === nextDiagnostic.selectedTaskId &&\n previousDiagnostic.selectedTaskPresent ===\n nextDiagnostic.selectedTaskPresent &&\n previousDiagnostic.taskEditorMode === nextDiagnostic.taskEditorMode\n ) {\n return;\n }\n lastContentDiagnosticRef.current = nextDiagnostic;\n logIssueManagerDiagnostic(controller.diagnostics, \"shell_content.derived\", {\n isIssueEditing: content.isIssueEditing,\n isTaskCreating: content.isTaskCreating,\n isTaskDrawerOpen: content.isTaskDrawerOpen,\n issueEditorMode: controller.issueEditorMode,\n previousIsTaskDrawerOpen: previousDiagnostic?.isTaskDrawerOpen ?? null,\n previousSelectedTaskId: previousDiagnostic?.selectedTaskId ?? null,\n previousTaskEditorMode: previousDiagnostic?.taskEditorMode ?? null,\n selectedIssueId: controller.nodeState.selectedIssueId,\n selectedTaskId: controller.nodeState.selectedTaskId,\n selectedTaskPresent: selectedTask !== null,\n showBottomBar: content.showBottomBar,\n taskEditorMode: controller.taskEditorMode\n });\n }, [\n content.isIssueEditing,\n content.isTaskCreating,\n content.isTaskDrawerOpen,\n content.showBottomBar,\n controller.diagnostics,\n controller.issueEditorMode,\n controller.nodeState.selectedIssueId,\n controller.nodeState.selectedTaskId,\n controller.taskEditorMode,\n selectedTask\n ]);\n const sidebarViewState = resolveIssueManagerSidebarViewState({\n copy: controller.copy,\n issues: controller.issues\n });\n const statusCounts = resolveIssueManagerStatusCounts(controller.issues);\n const isSidebarAutoCollapsed = isNarrowLayout;\n const isSidebarCollapsed =\n controller.nodeState.taskListCollapsed === true || isSidebarAutoCollapsed;\n\n useEffect(() => {\n const workbenchWindow =\n layoutRef.current?.closest<HTMLElement>(\".workbench-window\") ?? null;\n if (!workbenchWindow) {\n return undefined;\n }\n\n workbenchWindow.style.setProperty(\n \"--issue-manager-sidebar-width\",\n `${sidebarWidth}px`\n );\n workbenchWindow.dataset.issueManagerSidebarCollapsed = isSidebarCollapsed\n ? \"true\"\n : \"false\";\n\n return () => {\n workbenchWindow.style.removeProperty(\"--issue-manager-sidebar-width\");\n delete workbenchWindow.dataset.issueManagerSidebarCollapsed;\n };\n }, [isSidebarCollapsed, sidebarWidth]);\n\n return {\n content,\n floatingNotice,\n isNarrowLayout,\n layoutRef,\n layoutStyle: {\n gridTemplateColumns: isSidebarCollapsed\n ? \"0 minmax(0, 1fr)\"\n : \"var(--issue-manager-sidebar-width) minmax(0, 1fr)\",\n \"--issue-manager-sidebar-width\": `${sidebarWidth}px`\n } as CSSProperties,\n resizeHandle: {\n ariaValueMax: issueManagerSidebarMaxWidth,\n ariaValueMin: issueManagerSidebarMinWidth,\n ariaValueNow: sidebarWidth,\n onKeyDown: (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key !== \"ArrowLeft\" && event.key !== \"ArrowRight\") {\n return;\n }\n const delta = event.key === \"ArrowRight\" ? 16 : -16;\n const layoutWidth =\n layoutRef.current?.getBoundingClientRect().width ?? 0;\n if (!layoutWidth) {\n return;\n }\n event.preventDefault();\n setSidebarWidth((current) =>\n clampIssueManagerSidebarWidth(current + delta, layoutWidth)\n );\n },\n onPointerCancel: (event: PointerEvent<HTMLDivElement>) => {\n resizeRef.current = null;\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n },\n onPointerDown: (event: PointerEvent<HTMLDivElement>) => {\n if (event.button !== 0) {\n return;\n }\n const layoutWidth =\n layoutRef.current?.getBoundingClientRect().width ?? 0;\n if (!layoutWidth) {\n return;\n }\n const startWidth = clampIssueManagerSidebarWidth(\n sidebarWidth,\n layoutWidth\n );\n resizeRef.current = {\n maxWidth: clampIssueManagerSidebarWidth(\n issueManagerSidebarMaxWidth,\n layoutWidth\n ),\n pointerId: event.pointerId,\n startClientX: event.clientX,\n startWidth\n };\n setSidebarWidth(startWidth);\n event.currentTarget.setPointerCapture?.(event.pointerId);\n },\n onPointerMove: (event: PointerEvent<HTMLDivElement>) => {\n const state = resizeRef.current;\n if (!state || state.pointerId !== event.pointerId) {\n return;\n }\n setSidebarWidth(\n Math.min(\n Math.max(\n state.startWidth + event.clientX - state.startClientX,\n issueManagerSidebarMinWidth\n ),\n state.maxWidth\n )\n );\n },\n onPointerUp: (event: PointerEvent<HTMLDivElement>) => {\n resizeRef.current = null;\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n }\n },\n sidebar: {\n isAutoCollapsed: isSidebarAutoCollapsed,\n isCollapsed: isSidebarCollapsed,\n showStandaloneState:\n !isNarrowLayout &&\n (sidebarViewState.kind === \"empty\" ||\n sidebarViewState.kind === \"error\"),\n statusCounts,\n viewState: sidebarViewState\n }\n };\n}\n\nexport { shouldAutoCollapseIssueManagerSidebar } from \"../../../core/index.ts\";\n","const issueManagerTaskDrawerBackdropEchoMs = 900;\nconst issueManagerTaskDrawerBackdropEchoDistancePx = 72;\n\nexport interface IssueManagerPointerSnapshot {\n clientX: number;\n clientY: number;\n timeMs: number;\n}\n\nexport function shouldIgnoreIssueManagerTaskDrawerBackdropEcho(input: {\n clickClientX: number;\n clickClientY: number;\n maxDistancePx?: number;\n maxElapsedMs?: number;\n nowMs: number;\n openPointer: IssueManagerPointerSnapshot | null;\n}): {\n distancePx: number | null;\n elapsedMs: number | null;\n ignore: boolean;\n} {\n if (!input.openPointer) {\n return {\n distancePx: null,\n elapsedMs: null,\n ignore: false\n };\n }\n\n const elapsedMs = input.nowMs - input.openPointer.timeMs;\n const distancePx = Math.hypot(\n input.clickClientX - input.openPointer.clientX,\n input.clickClientY - input.openPointer.clientY\n );\n return {\n distancePx,\n elapsedMs,\n ignore:\n elapsedMs <=\n (input.maxElapsedMs ?? issueManagerTaskDrawerBackdropEchoMs) &&\n distancePx <=\n (input.maxDistancePx ?? issueManagerTaskDrawerBackdropEchoDistancePx)\n };\n}\n","import { useEffect, useState, type FormEvent, type JSX } from \"react\";\nimport {\n BareIconButton,\n Button,\n CheckIcon,\n ChevronDownIcon,\n ConfirmationDialog,\n Dialog,\n DialogContent,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DeleteIcon,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n EditIcon,\n FileCreateIcon,\n Input,\n MoreHorizontalIcon,\n PinFilledIcon,\n PinIcon,\n Textarea,\n cn\n} from \"@tutti-os/ui-system\";\nimport type {\n IssueManagerCreateTopicInput,\n IssueManagerTopic,\n IssueManagerUpdateTopicInput\n} from \"../../../contracts/index.ts\";\nimport type { IssueManagerI18nRuntime } from \"../../../i18n/issueManagerI18n.ts\";\n\nconst topicSelectorMenuItemClassName =\n \"min-h-7 overflow-hidden rounded-md py-1 text-[13px] font-normal leading-[1.2] text-[var(--text-primary)]\";\nconst topicSelectorRowItemClassName =\n \"min-w-0 flex-1 bg-transparent pr-2 pl-1 hover:bg-transparent focus:bg-transparent data-[highlighted]:bg-transparent\";\n\ntype IssueManagerTopicDialogMode =\n | {\n kind: \"create\";\n topic: null;\n }\n | {\n kind: \"edit\";\n topic: IssueManagerTopic;\n };\n\nexport function IssueManagerTopicSelector({\n activeTopicId,\n className,\n copy,\n onCreateTopic,\n onDeleteTopic,\n onSelectTopic,\n onUpdateTopic,\n topics\n}: {\n activeTopicId: string | null;\n className?: string;\n copy: IssueManagerI18nRuntime;\n onCreateTopic: (\n input: Omit<IssueManagerCreateTopicInput, \"workspaceId\">\n ) => void;\n onDeleteTopic: (topicId: string) => void;\n onSelectTopic: (topicId: string) => void;\n onUpdateTopic: (\n input: Omit<IssueManagerUpdateTopicInput, \"workspaceId\">\n ) => void;\n topics: readonly IssueManagerTopic[];\n}): JSX.Element {\n const [dialogMode, setDialogMode] =\n useState<IssueManagerTopicDialogMode | null>(null);\n const [deleteTopic, setDeleteTopic] = useState<IssueManagerTopic | null>(\n null\n );\n const [menuOpen, setMenuOpen] = useState(false);\n const activeTopic = topics.find((topic) => topic.topicId === activeTopicId);\n const topicLabel = copy.t(\"labels.topic\");\n const triggerLabel = formatIssueManagerTopicSelectorTriggerLabel({\n title: activeTopic?.title,\n topicLabel\n });\n\n const openTopicDialog = (mode: IssueManagerTopicDialogMode) => {\n setMenuOpen(false);\n setDialogMode(mode);\n };\n\n return (\n <>\n <DropdownMenu open={menuOpen} onOpenChange={setMenuOpen}>\n <DropdownMenuTrigger asChild>\n <Button\n aria-label={topicLabel}\n className={cn(\n \"max-w-[220px] gap-1 rounded-md border-0 bg-transparent text-[15px] font-normal shadow-none hover:bg-transparent focus:bg-transparent focus-visible:border-0 focus-visible:bg-transparent focus-visible:ring-0 active:bg-transparent aria-expanded:bg-transparent [&[data-state=open]>svg]:rotate-180\",\n className\n )}\n size=\"sm\"\n type=\"button\"\n variant=\"ghost\"\n >\n <span className=\"min-w-0 truncate\">{triggerLabel}</span>\n <ChevronDownIcon className=\"size-4 shrink-0 text-[var(--text-tertiary)] transition-transform duration-200\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-[200px] px-1\">\n {topics.map((topic) => {\n const isPinned = (topic.pinnedAtUnix ?? 0) > 0;\n const isActive = topic.topicId === activeTopicId;\n const pinLabel = isPinned\n ? copy.t(\"actions.unpinTopic\")\n : copy.t(\"actions.pinTopic\");\n\n return (\n <div key={topic.topicId} className=\"min-w-0\">\n <div className=\"group/topic-row relative flex min-h-7 min-w-0 items-center gap-0.5 rounded-md pr-0.5 pl-0.5 hover:bg-[var(--transparency-block)] focus-within:bg-[var(--transparency-block)]\">\n <DropdownMenuItem\n className={cn(\n topicSelectorMenuItemClassName,\n topicSelectorRowItemClassName\n )}\n onSelect={() => {\n setMenuOpen(false);\n onSelectTopic(topic.topicId);\n }}\n >\n <span className=\"flex size-4 shrink-0 items-center justify-center text-[var(--accent)]\">\n {isActive ? <CheckIcon className=\"size-4\" /> : null}\n </span>\n <span className=\"flex min-w-0 flex-1 items-center gap-2\">\n <span className=\"truncate\">{topic.title}</span>\n {topic.isDefault ? (\n <span className=\"shrink-0 text-[11px] text-[var(--text-tertiary)]\">\n {copy.t(\"labels.topicDefault\")}\n </span>\n ) : null}\n </span>\n </DropdownMenuItem>\n <BareIconButton\n aria-label={pinLabel}\n className={cn(\n \"pointer-events-none shrink-0 opacity-0 text-[var(--text-tertiary)] transition-opacity duration-150 group-hover/topic-row:pointer-events-auto group-hover/topic-row:opacity-100 group-focus-within/topic-row:pointer-events-auto group-focus-within/topic-row:opacity-100 hover:text-[var(--text-primary)]\",\n isPinned && \"text-[var(--text-primary)]\"\n )}\n size=\"md\"\n title={pinLabel}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onUpdateTopic({\n pinned: !isPinned,\n topicId: topic.topicId\n });\n }}\n >\n {isPinned ? (\n <PinFilledIcon className=\"size-3.5\" />\n ) : (\n <PinIcon className=\"size-3.5\" />\n )}\n </BareIconButton>\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <BareIconButton\n aria-label={copy.t(\"actions.moreActions\")}\n className=\"pointer-events-none shrink-0 opacity-0 text-[var(--text-tertiary)] transition-opacity duration-150 group-hover/topic-row:pointer-events-auto group-hover/topic-row:opacity-100 group-focus-within/topic-row:pointer-events-auto group-focus-within/topic-row:opacity-100 hover:text-[var(--text-primary)]\"\n size=\"md\"\n title={copy.t(\"actions.moreActions\")}\n onClick={(event) => {\n event.stopPropagation();\n }}\n >\n <MoreHorizontalIcon className=\"size-3.5\" />\n </BareIconButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"end\"\n className=\"w-32\"\n sideOffset={6}\n >\n <DropdownMenuItem\n onSelect={(event) => {\n event.preventDefault();\n openTopicDialog({\n kind: \"edit\",\n topic\n });\n }}\n >\n <EditIcon className=\"size-3.5\" />\n <span>{copy.t(\"actions.editTopic\")}</span>\n </DropdownMenuItem>\n {!topic.isDefault ? (\n <DropdownMenuItem\n variant=\"destructive\"\n onSelect={(event) => {\n event.preventDefault();\n setMenuOpen(false);\n setDeleteTopic(topic);\n }}\n >\n <DeleteIcon className=\"size-3.5\" />\n <span>{copy.t(\"actions.delete\")}</span>\n </DropdownMenuItem>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n );\n })}\n {topics.length === 0 ? (\n <div className=\"px-3 py-2 text-[11px] leading-4 text-[var(--text-tertiary)]\">\n {copy.t(\"messages.topicListEmpty\")}\n </div>\n ) : null}\n <DropdownMenuSeparator />\n <DropdownMenuItem\n className={cn(\n topicSelectorMenuItemClassName,\n \"justify-start gap-2 px-2 text-left\"\n )}\n onSelect={(event) => {\n event.preventDefault();\n openTopicDialog({\n kind: \"create\",\n topic: null\n });\n }}\n >\n <FileCreateIcon className=\"size-3.5\" />\n <span className=\"truncate\">{copy.t(\"actions.createTopic\")}</span>\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n <IssueManagerTopicDialog\n copy={copy}\n mode={dialogMode}\n open={dialogMode !== null}\n onCreateTopic={onCreateTopic}\n onOpenChange={(open) => {\n if (!open) {\n setDialogMode(null);\n }\n }}\n onUpdateTopic={onUpdateTopic}\n />\n <ConfirmationDialog\n cancelLabel={copy.t(\"actions.cancel\")}\n confirmLabel={copy.t(\"actions.delete\")}\n description={deleteTopic?.title}\n open={deleteTopic !== null}\n title={copy.t(\"confirmations.deleteTopic\")}\n tone=\"destructive\"\n onConfirm={() => {\n const topicId = deleteTopic?.topicId;\n setDeleteTopic(null);\n if (topicId) {\n onDeleteTopic(topicId);\n }\n }}\n onOpenChange={(open) => {\n if (!open) {\n setDeleteTopic(null);\n }\n }}\n />\n </>\n );\n}\n\nexport function formatIssueManagerTopicSelectorTriggerLabel(input: {\n title?: string | null;\n topicLabel: string;\n}): string {\n const topicLabel = input.topicLabel.trim();\n const title = input.title?.trim();\n if (!title) {\n return topicLabel;\n }\n return `${topicLabel}-${title}`;\n}\n\nfunction IssueManagerTopicDialog({\n copy,\n mode,\n onCreateTopic,\n onOpenChange,\n onUpdateTopic,\n open\n}: {\n copy: IssueManagerI18nRuntime;\n mode: IssueManagerTopicDialogMode | null;\n onCreateTopic: (\n input: Omit<IssueManagerCreateTopicInput, \"workspaceId\">\n ) => void;\n onOpenChange: (open: boolean) => void;\n onUpdateTopic: (\n input: Omit<IssueManagerUpdateTopicInput, \"workspaceId\">\n ) => void;\n open: boolean;\n}): JSX.Element {\n const [summaryDraft, setSummaryDraft] = useState(\"\");\n const [titleDraft, setTitleDraft] = useState(\"\");\n\n useEffect(() => {\n setTitleDraft(mode?.topic?.title ?? \"\");\n setSummaryDraft(mode?.topic?.summary ?? \"\");\n }, [mode]);\n\n const title = titleDraft.trim();\n const dialogTitle =\n mode?.kind === \"edit\"\n ? copy.t(\"labels.editTopicDialogTitle\")\n : copy.t(\"labels.createTopicDialogTitle\");\n\n const submit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (!mode || !title) {\n return;\n }\n if (mode.kind === \"edit\") {\n onUpdateTopic({\n summary: summaryDraft,\n title,\n topicId: mode.topic.topicId\n });\n } else {\n onCreateTopic({\n summary: summaryDraft,\n title\n });\n }\n onOpenChange(false);\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-[480px]\">\n <DialogHeader>\n <DialogTitle>{dialogTitle}</DialogTitle>\n </DialogHeader>\n <form className=\"grid gap-4\" onSubmit={submit}>\n <label className=\"grid gap-2\">\n <span className=\"text-[11px] font-medium leading-4 text-[var(--text-secondary)]\">\n {copy.t(\"labels.topicTitle\")}\n </span>\n <Input\n autoFocus\n placeholder={copy.t(\"labels.topicTitle\")}\n value={titleDraft}\n onChange={(event) => setTitleDraft(event.target.value)}\n />\n </label>\n <label className=\"grid gap-2\">\n <span className=\"text-[11px] font-medium leading-4 text-[var(--text-secondary)]\">\n {copy.t(\"labels.topicSummary\")}\n </span>\n <Textarea\n className=\"min-h-24 resize-none\"\n placeholder={copy.t(\"labels.topicSummary\")}\n value={summaryDraft}\n onChange={(event) => setSummaryDraft(event.target.value)}\n />\n </label>\n <DialogFooter className=\"pt-2\">\n <Button\n size=\"dialog\"\n type=\"button\"\n variant=\"ghost\"\n onClick={() => onOpenChange(false)}\n >\n {copy.t(\"actions.cancel\")}\n </Button>\n <Button disabled={!title} size=\"dialog\" type=\"submit\">\n {copy.t(\"actions.saveTopic\")}\n </Button>\n </DialogFooter>\n </form>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":["useEffect","useMemo","useState","input","useEffect","useEffect","useMemo","useState","useEffect","useEffect","useRef","Button","FileCreateIcon","Tooltip","TooltipContent","TooltipTrigger","cn","useEffect","useRef","useState","Button","FileCreateIcon","cn","useState","Badge","Button","ScrollArea","useState","Button","FileCreateIcon","cn","jsx","jsxs","jsxs","jsx","jsxs","jsx","useEffect","useState","cn","jsx","jsxs","useState","useEffect","cn","jsx","jsxs","cn","useState","Button","FileCreateIcon","useEffect","useRef","useState","cn","jsx","jsxs","useRef","useState","useEffect","cn","useEffect","useMemo","useRef","useState","Button","cn","jsx","jsxs","Button","jsx","jsxs","useLayoutEffect","useRef","jsx","jsx","jsxs","useState","ScrollArea","Button","Badge","Button","cn","Badge","AgentSessionsIcon","Button","cn","jsx","jsxs","AgentSessionsIcon","Button","cn","jsx","jsxs","cn","Button","jsx","cn","useComposedInputValue","Badge","Button","FileCreateIcon","Input","ScrollArea","cn","jsx","jsxs","Button","FileCreateIcon","ScrollArea","cn","useComposedInputValue","Input","Badge","jsx","jsxs","cn","Button","jsx","jsxs","Button","useRef","ScrollArea","cn","useState","Badge","Button","ConfirmationDialog","Fragment","jsx","jsxs","useState","Button","ConfirmationDialog","Badge","jsx","jsxs","useRef","cn","ScrollArea","useEffect","useEffectEvent","useRef","useState","useRef","useState","useEffectEvent","useEffect","jsx","jsxs","useState","useRef","useEffect","cn","Button","FileCreateIcon","useEffect","useState","BareIconButton","Button","ChevronDownIcon","ConfirmationDialog","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","FileCreateIcon","Input","cn","Fragment","jsx","jsxs","jsx","jsxs","useRef","useEffect","cn","Button","Tooltip","TooltipTrigger","FileCreateIcon","TooltipContent"]}