@tutti-os/workspace-issue-manager 0.0.39 → 0.0.41

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.
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createIssueManagerI18nRuntime
3
- } from "./chunk-OWZ266HS.js";
3
+ } from "./chunk-3MZ5QNY4.js";
4
4
 
5
5
  // src/core/feature.ts
6
6
  import {
@@ -359,4 +359,4 @@ export {
359
359
  buildIssueManagerRunPrompt,
360
360
  buildIssueManagerTaskBreakdownPrompt
361
361
  };
362
- //# sourceMappingURL=chunk-KSNIBEPN.js.map
362
+ //# sourceMappingURL=chunk-UVQP76CR.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  normalizeIssueManagerContent,
3
3
  normalizeIssueManagerNodeState
4
- } from "./chunk-KSNIBEPN.js";
4
+ } from "./chunk-UVQP76CR.js";
5
5
 
6
6
  // src/services/internal/model.ts
7
7
  import { formatTuttiShortDateTime } from "@tutti-os/ui-system/date-format";
@@ -600,6 +600,28 @@ function createIssueManagerControllerRuntime(input) {
600
600
  }));
601
601
  }
602
602
  };
603
+ const clearIssueCollectionsForTopicChange = () => {
604
+ issueListSequence += 1;
605
+ issueDetailSequence += 1;
606
+ taskDetailSequence += 1;
607
+ setSnapshot((current) => ({
608
+ ...current,
609
+ issueDetail: createAsyncCollectionState(
610
+ null
611
+ ),
612
+ issues: {
613
+ error: null,
614
+ hasResolved: current.issues.hasResolved,
615
+ isLoading: true,
616
+ value: []
617
+ },
618
+ taskDetail: createAsyncCollectionState(
619
+ null
620
+ )
621
+ }));
622
+ syncIssueDraftFromCurrentDetail();
623
+ syncTaskDraftFromCurrentDetail();
624
+ };
603
625
  const clearIssueDetail = () => {
604
626
  setSnapshot((current) => ({
605
627
  ...current,
@@ -725,6 +747,7 @@ function createIssueManagerControllerRuntime(input) {
725
747
  return;
726
748
  }
727
749
  if (previous.activeTopicId !== next.activeTopicId && next.activeTopicId) {
750
+ clearIssueCollectionsForTopicChange();
728
751
  applyNodeState({
729
752
  selectedIssueId: null,
730
753
  selectedTaskId: null
@@ -965,4 +988,4 @@ export {
965
988
  persistIssueManagerTaskDraftContent,
966
989
  createIssueManagerControllerService
967
990
  };
968
- //# sourceMappingURL=chunk-2UL4JU3Q.js.map
991
+ //# sourceMappingURL=chunk-VQTT2NHT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/services/internal/model.ts","../src/services/internal/controllerRuntime.ts","../src/internal/issueManagerDiagnostics.ts","../src/services/internal/controllerUtils.ts","../src/services/internal/controllerState.ts","../src/services/internal/issueManagerControllerService.ts","../src/services/createIssueManagerControllerService.ts"],"sourcesContent":["import { formatTuttiShortDateTime } from \"@tutti-os/ui-system/date-format\";\nimport type {\n IssueManagerFileReference,\n IssueManagerPriority,\n IssueManagerStatus\n} from \"../../contracts/index.ts\";\nimport type { IssueManagerI18nRuntime } from \"../../i18n/issueManagerI18n.ts\";\n\nexport type IssueManagerEditorMode = \"read\" | \"create\" | \"edit\";\n\nexport type IssueManagerReferenceTarget =\n | {\n mode: \"attach\";\n parentKind: \"issue\";\n }\n | {\n mode: \"attach\";\n parentKind: \"task\";\n taskId: string;\n }\n | {\n mode: \"insert\";\n parentKind: \"issue\";\n }\n | {\n mode: \"insert\";\n parentKind: \"task\";\n taskId: string;\n };\n\nexport function createIssueManagerDate(\n value: number | null | undefined\n): Date | null {\n if (!value || !Number.isFinite(value)) {\n return null;\n }\n\n const normalized = value < 1_000_000_000_000 ? value * 1000 : value;\n const date = new Date(normalized);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nexport function formatIssueManagerTimestamp(\n value: number | null | undefined\n): string | null {\n const date = createIssueManagerDate(value);\n return date ? formatTuttiShortDateTime(date) : null;\n}\n\nexport function formatIssueManagerDate(\n value: number | null | undefined\n): string {\n const date = createIssueManagerDate(value);\n return date ? formatTuttiShortDateTime(date) : \"\";\n}\n\nexport function resolveIssueManagerStatusLabel(\n copy: IssueManagerI18nRuntime,\n status: IssueManagerStatus | null | undefined\n): string {\n switch (status) {\n case \"not_started\":\n return copy.t(\"status.notStarted\");\n case \"running\":\n return copy.t(\"status.running\");\n case \"pending_acceptance\":\n return copy.t(\"status.pendingAcceptance\");\n case \"completed\":\n return copy.t(\"status.completed\");\n case \"failed\":\n return copy.t(\"status.failed\");\n case \"canceled\":\n return copy.t(\"status.canceled\");\n default:\n return copy.t(\"status.unknown\");\n }\n}\n\nexport function resolveIssueManagerPriorityLabel(\n copy: IssueManagerI18nRuntime,\n priority: IssueManagerPriority | null | undefined\n): string {\n switch (priority) {\n case \"high\":\n return copy.t(\"priority.high\");\n case \"low\":\n return copy.t(\"priority.low\");\n default:\n return copy.t(\"priority.medium\");\n }\n}\n\nexport function uniqueIssueManagerFileReferences(\n refs: readonly IssueManagerFileReference[]\n): IssueManagerFileReference[] {\n const unique = new Map<string, IssueManagerFileReference>();\n for (const ref of refs) {\n const normalizedPath = ref.path.trim();\n if (!normalizedPath || unique.has(normalizedPath)) {\n continue;\n }\n unique.set(normalizedPath, {\n displayName: ref.displayName?.trim() || undefined,\n kind: ref.kind === \"folder\" ? \"folder\" : \"file\",\n path: normalizedPath\n });\n }\n return [...unique.values()];\n}\n\nexport function parentDirectoryPath(path: string): string | null {\n const trimmed = path.trim();\n if (!trimmed || trimmed === \"/\") {\n return null;\n }\n\n const normalized =\n trimmed.endsWith(\"/\") && trimmed.length > 1\n ? trimmed.slice(0, -1)\n : trimmed;\n const index = normalized.lastIndexOf(\"/\");\n if (index <= 0) {\n return \"/\";\n }\n return normalized.slice(0, index) || \"/\";\n}\n","import type { SetStateAction } from \"react\";\nimport { proxy } from \"valtio/vanilla\";\nimport type {\n IssueManagerIssueDetail,\n IssueManagerIssueSummary,\n IssueManagerNodeState,\n IssueManagerOpenSource,\n IssueManagerOpenTrigger,\n IssueManagerTaskDetail,\n IssueManagerTopic\n} from \"../../contracts/index.ts\";\nimport {\n normalizeIssueManagerNodeState,\n type IssueManagerFeature\n} from \"../../core/index.ts\";\nimport {\n logIssueManagerDiagnostic,\n type IssueManagerDiagnostics\n} from \"../../internal/issueManagerDiagnostics.ts\";\nimport { resolveIssueManagerErrorMessage } from \"./controllerUtils.ts\";\nimport {\n applyIssueManagerIssueDetailResultToNodeState,\n applyIssueManagerIssueListResultToNodeState,\n createIssueManagerIssueDraftFromNodeState,\n createIssueManagerTaskDraftFromNodeState,\n syncIssueManagerIssueDraftFromDetail,\n syncIssueManagerTaskDraftFromDetail\n} from \"./controllerState.ts\";\nimport type {\n AsyncCollectionState,\n IssueDraft,\n IssueManagerNotificationState,\n TaskDraft\n} from \"./controllerTypes.ts\";\nimport type {\n IssueManagerEditorMode,\n IssueManagerReferenceTarget\n} from \"./model.ts\";\n\nexport interface IssueManagerControllerSnapshot {\n issueDetail: AsyncCollectionState<IssueManagerIssueDetail | null>;\n issueDraft: IssueDraft;\n issueEditorMode: IssueManagerEditorMode;\n issues: AsyncCollectionState<IssueManagerIssueSummary[]>;\n isRunningTask: boolean;\n nodeState: IssueManagerNodeState;\n notification: IssueManagerNotificationState | null;\n referenceTarget: IssueManagerReferenceTarget | null;\n taskDetail: AsyncCollectionState<IssueManagerTaskDetail | null>;\n taskDraft: TaskDraft;\n taskEditorMode: IssueManagerEditorMode;\n topics: AsyncCollectionState<IssueManagerTopic[]>;\n}\n\nexport interface CreateIssueManagerControllerRuntimeInput {\n diagnostics?: IssueManagerDiagnostics | null;\n feature: IssueManagerFeature;\n openSource?: IssueManagerOpenSource;\n state?: Partial<IssueManagerNodeState> | null;\n workspaceId: string;\n}\n\nfunction createIssueManagerOpenedParams(source: IssueManagerOpenSource): {\n source: IssueManagerOpenSource;\n trigger: IssueManagerOpenTrigger;\n} {\n return {\n source,\n trigger:\n source === \"restore\" || source === \"agent_command\"\n ? \"automatic\"\n : \"manual\"\n };\n}\n\nexport interface SyncIssueManagerControllerRuntimeInput {\n deferredIssueSearch: string;\n onStateChange?: (state: IssueManagerNodeState) => void;\n taskListCollapsed: boolean;\n}\n\nexport interface IssueManagerControllerRuntime {\n getSnapshot(): IssueManagerControllerSnapshot;\n refreshAll(): void;\n refreshDetails(): void;\n release(): void;\n reportIssueSearchUsage(query: string): void;\n retain(): void;\n readonly store: IssueManagerControllerSnapshot;\n setIsRunningTask(update: SetStateAction<boolean>): void;\n setIssueDraftInternal(update: SetStateAction<IssueDraft>): void;\n setIssueEditorModeState(update: SetStateAction<IssueManagerEditorMode>): void;\n setReferenceTarget(\n update: SetStateAction<IssueManagerReferenceTarget | null>\n ): void;\n setNotification(\n update: SetStateAction<IssueManagerNotificationState | null>\n ): void;\n setTaskDraftInternal(update: SetStateAction<TaskDraft>): void;\n setTaskEditorModeState(update: SetStateAction<IssueManagerEditorMode>): void;\n subscribe(listener: () => void): () => void;\n syncInput(input: SyncIssueManagerControllerRuntimeInput): void;\n updateNodeState(\n updater:\n | Partial<IssueManagerNodeState>\n | ((current: IssueManagerNodeState) => IssueManagerNodeState)\n ): void;\n}\n\nexport function createIssueManagerControllerRuntime(\n input: CreateIssueManagerControllerRuntimeInput\n): IssueManagerControllerRuntime {\n const diagnostics = input.diagnostics ?? null;\n const normalizedNodeState = normalizeIssueManagerNodeState(input.state);\n const listeners = new Set<() => void>();\n let deferredIssueSearch = normalizedNodeState.issueSearchQuery;\n let issueDetailSequence = 0;\n let issueListSequence = 0;\n let lastResolvedIssueSearchQuery: string | null = null;\n let hasReportedOpened = false;\n let onStateChange: ((state: IssueManagerNodeState) => void) | undefined;\n let pendingIssueSearchAnalyticsQuery: string | null = null;\n let refCount = 0;\n let retained = false;\n let taskDetailSequence = 0;\n let topicListSequence = 0;\n let unsubscribeIssueUpdates: (() => void) | null = null;\n let snapshot: IssueManagerControllerSnapshot = {\n issueDetail: createAsyncCollectionState<IssueManagerIssueDetail | null>(\n null\n ),\n issueDraft: createIssueManagerIssueDraftFromNodeState(normalizedNodeState),\n issueEditorMode: \"read\",\n issues: createAsyncCollectionState<IssueManagerIssueSummary[]>([], {\n hasResolved: false\n }),\n isRunningTask: false,\n nodeState: normalizedNodeState,\n notification: null,\n referenceTarget: null,\n taskDetail: createAsyncCollectionState<IssueManagerTaskDetail | null>(null),\n taskDraft: createIssueManagerTaskDraftFromNodeState(normalizedNodeState),\n taskEditorMode: \"read\",\n topics: createAsyncCollectionState<IssueManagerTopic[]>([], {\n hasResolved: false\n })\n };\n const store = proxy(snapshot);\n\n const notify = () => {\n for (const listener of listeners) {\n listener();\n }\n };\n\n const setSnapshot = (\n updater:\n | Partial<IssueManagerControllerSnapshot>\n | ((\n current: IssueManagerControllerSnapshot\n ) => IssueManagerControllerSnapshot)\n ) => {\n const next =\n typeof updater === \"function\"\n ? updater(snapshot)\n : {\n ...snapshot,\n ...updater\n };\n if (next === snapshot) {\n return;\n }\n snapshot = next;\n Object.assign(store, next);\n notify();\n };\n\n const syncIssueDraftFromCurrentDetail = () => {\n const nextIssueDraft = syncIssueManagerIssueDraftFromDetail(\n snapshot.issueDraft,\n snapshot.issueDetail.value,\n snapshot.issueEditorMode\n );\n if (nextIssueDraft === snapshot.issueDraft) {\n return;\n }\n setSnapshot((current) => ({\n ...current,\n issueDraft: nextIssueDraft\n }));\n };\n\n const syncTaskDraftFromCurrentDetail = () => {\n const nextTaskDraft = syncIssueManagerTaskDraftFromDetail(\n snapshot.taskDraft,\n snapshot.taskDetail.value,\n snapshot.taskEditorMode\n );\n if (nextTaskDraft === snapshot.taskDraft) {\n return;\n }\n setSnapshot((current) => ({\n ...current,\n taskDraft: nextTaskDraft\n }));\n };\n\n const applyNodeState = (\n updater:\n | Partial<IssueManagerNodeState>\n | ((current: IssueManagerNodeState) => IssueManagerNodeState)\n ) => {\n const previous = snapshot.nodeState;\n const next =\n typeof updater === \"function\"\n ? updater(previous)\n : ({\n ...previous,\n ...updater\n } satisfies IssueManagerNodeState);\n if (next === previous) {\n return;\n }\n\n if (\n previous.activeTopicId !== next.activeTopicId ||\n previous.selectedIssueId !== next.selectedIssueId ||\n previous.selectedTaskId !== next.selectedTaskId ||\n previous.taskListCollapsed !== next.taskListCollapsed\n ) {\n logIssueManagerDiagnostic(\n diagnostics,\n \"node_state.changed\",\n {\n nextActiveTopicId: next.activeTopicId ?? null,\n nextSelectedIssueId: next.selectedIssueId,\n nextSelectedTaskId: next.selectedTaskId,\n nextTaskListCollapsed: next.taskListCollapsed === true,\n previousActiveTopicId: previous.activeTopicId ?? null,\n previousSelectedIssueId: previous.selectedIssueId,\n previousSelectedTaskId: previous.selectedTaskId,\n previousTaskListCollapsed: previous.taskListCollapsed === true\n },\n { includeStack: true }\n );\n }\n\n setSnapshot((current) => ({\n ...current,\n nodeState: next\n }));\n onStateChange?.(next);\n handleNodeStateTransition(previous, next);\n };\n\n const loadTopics = async () => {\n const sequence = ++topicListSequence;\n setSnapshot((current) => ({\n ...current,\n topics: {\n ...current.topics,\n error: null,\n isLoading: true\n }\n }));\n\n try {\n const result = await input.feature.backend.listTopics({\n workspaceId: input.workspaceId\n });\n if (!retained || sequence !== topicListSequence) {\n return;\n }\n if (result.topics.length === 0) {\n throw new Error(input.feature.i18n.t(\"messages.topicListEmpty\"));\n }\n\n setSnapshot((current) => ({\n ...current,\n topics: {\n error: null,\n hasResolved: true,\n isLoading: false,\n value: result.topics\n }\n }));\n const currentActiveTopicId = snapshot.nodeState.activeTopicId;\n const currentTopicExists = result.topics.some(\n (topic) => topic.topicId === currentActiveTopicId\n );\n const activeTopicId = currentTopicExists\n ? currentActiveTopicId\n : (result.topics[0]?.topicId ?? null);\n applyNodeState({\n activeTopicId\n });\n if (activeTopicId && activeTopicId === currentActiveTopicId) {\n void loadIssues();\n }\n } catch (error) {\n if (!retained || sequence !== topicListSequence) {\n return;\n }\n setSnapshot((current) => ({\n ...current,\n topics: {\n error: resolveIssueManagerErrorMessage(error, input.feature.i18n),\n hasResolved: true,\n isLoading: false,\n value: []\n }\n }));\n }\n };\n\n const trackIssueSearchAnalytics = (\n inputValue: string,\n resultCount: number\n ) => {\n const query = inputValue.trim();\n if (!query) {\n return;\n }\n void Promise.resolve(\n input.feature.analytics?.track({\n name: \"issue_manager.task_searched\",\n params: {\n queryLength: query.length,\n resultCount\n }\n })\n ).catch(() => undefined);\n };\n\n const flushPendingIssueSearchAnalytics = (\n searchQuery: string,\n resultCount: number\n ) => {\n if (pendingIssueSearchAnalyticsQuery !== searchQuery || !searchQuery) {\n return;\n }\n pendingIssueSearchAnalyticsQuery = null;\n trackIssueSearchAnalytics(searchQuery, resultCount);\n };\n\n const loadIssues = async () => {\n const searchQuery = deferredIssueSearch.trim();\n const activeTopicId = snapshot.nodeState.activeTopicId;\n const sequence = ++issueListSequence;\n if (!activeTopicId) {\n lastResolvedIssueSearchQuery = searchQuery;\n setSnapshot((current) => ({\n ...current,\n issues: {\n error: null,\n hasResolved: true,\n isLoading: false,\n value: []\n }\n }));\n flushPendingIssueSearchAnalytics(searchQuery, 0);\n return;\n }\n setSnapshot((current) => ({\n ...current,\n issues: {\n ...current.issues,\n error: null,\n isLoading: true\n }\n }));\n\n try {\n const listIssues = (\n statusFilter: IssueManagerNodeState[\"issueStatusFilter\"]\n ) =>\n input.feature.backend.listIssues({\n searchQuery: searchQuery || undefined,\n statusFilter,\n topicId: activeTopicId,\n workspaceId: input.workspaceId\n });\n const result = await listIssues(snapshot.nodeState.issueStatusFilter);\n if (!retained || sequence !== issueListSequence) {\n return;\n }\n\n lastResolvedIssueSearchQuery = searchQuery;\n setSnapshot((current) => ({\n ...current,\n issues: {\n error: null,\n hasResolved: true,\n isLoading: false,\n statusCounts: result.statusCounts ?? current.issues.statusCounts,\n value: result.issues\n }\n }));\n applyNodeState((current) =>\n applyIssueManagerIssueListResultToNodeState(current, result)\n );\n flushPendingIssueSearchAnalytics(searchQuery, result.issues.length);\n } catch (error) {\n if (!retained || sequence !== issueListSequence) {\n return;\n }\n setSnapshot((current) => ({\n ...current,\n issues: {\n error: resolveIssueManagerErrorMessage(error, input.feature.i18n),\n hasResolved: true,\n isLoading: false,\n statusCounts: current.issues.statusCounts,\n value: []\n }\n }));\n }\n };\n\n const clearIssueCollectionsForTopicChange = () => {\n issueListSequence += 1;\n issueDetailSequence += 1;\n taskDetailSequence += 1;\n setSnapshot((current) => ({\n ...current,\n issueDetail: createAsyncCollectionState<IssueManagerIssueDetail | null>(\n null\n ),\n issues: {\n error: null,\n hasResolved: current.issues.hasResolved,\n isLoading: true,\n value: []\n },\n taskDetail: createAsyncCollectionState<IssueManagerTaskDetail | null>(\n null\n )\n }));\n syncIssueDraftFromCurrentDetail();\n syncTaskDraftFromCurrentDetail();\n };\n\n const clearIssueDetail = () => {\n setSnapshot((current) => ({\n ...current,\n issueDetail: createAsyncCollectionState<IssueManagerIssueDetail | null>(\n null\n )\n }));\n syncIssueDraftFromCurrentDetail();\n };\n\n const clearTaskDetail = () => {\n setSnapshot((current) => ({\n ...current,\n taskDetail: createAsyncCollectionState<IssueManagerTaskDetail | null>(\n null\n )\n }));\n syncTaskDraftFromCurrentDetail();\n };\n\n const loadIssueDetail = async () => {\n const selectedIssueId = snapshot.nodeState.selectedIssueId;\n issueDetailSequence += 1;\n const sequence = issueDetailSequence;\n if (!selectedIssueId) {\n clearIssueDetail();\n clearTaskDetail();\n return;\n }\n\n setSnapshot((current) => ({\n ...current,\n issueDetail: {\n ...current.issueDetail,\n error: null,\n isLoading: true\n }\n }));\n\n try {\n const result = await input.feature.backend.getIssueDetail({\n issueId: selectedIssueId,\n workspaceId: input.workspaceId\n });\n if (!retained || sequence !== issueDetailSequence) {\n return;\n }\n\n setSnapshot((current) => ({\n ...current,\n issueDetail: {\n error: null,\n isLoading: false,\n value: result\n }\n }));\n syncIssueDraftFromCurrentDetail();\n applyNodeState((current) =>\n applyIssueManagerIssueDetailResultToNodeState(current, result)\n );\n } catch (error) {\n if (!retained || sequence !== issueDetailSequence) {\n return;\n }\n\n setSnapshot((current) => ({\n ...current,\n issueDetail: {\n error: resolveIssueManagerErrorMessage(error, input.feature.i18n),\n isLoading: false,\n value: null\n }\n }));\n syncIssueDraftFromCurrentDetail();\n }\n };\n\n const loadTaskDetail = async () => {\n const selectedIssueId = snapshot.nodeState.selectedIssueId;\n const selectedTaskId = snapshot.nodeState.selectedTaskId;\n taskDetailSequence += 1;\n const sequence = taskDetailSequence;\n if (!selectedIssueId || !selectedTaskId) {\n clearTaskDetail();\n return;\n }\n\n setSnapshot((current) => ({\n ...current,\n taskDetail: {\n ...current.taskDetail,\n error: null,\n isLoading: true\n }\n }));\n\n try {\n const result = await input.feature.backend.getTaskDetail({\n issueId: selectedIssueId,\n taskId: selectedTaskId,\n workspaceId: input.workspaceId\n });\n if (!retained || sequence !== taskDetailSequence) {\n return;\n }\n\n setSnapshot((current) => ({\n ...current,\n taskDetail: {\n error: null,\n isLoading: false,\n value: result\n }\n }));\n syncTaskDraftFromCurrentDetail();\n } catch (error) {\n if (!retained || sequence !== taskDetailSequence) {\n return;\n }\n\n setSnapshot((current) => ({\n ...current,\n taskDetail: {\n error: resolveIssueManagerErrorMessage(error, input.feature.i18n),\n isLoading: false,\n value: null\n }\n }));\n syncTaskDraftFromCurrentDetail();\n }\n };\n\n const handleNodeStateTransition = (\n previous: IssueManagerNodeState,\n next: IssueManagerNodeState\n ) => {\n if (!retained) {\n return;\n }\n\n if (previous.activeTopicId !== next.activeTopicId && next.activeTopicId) {\n clearIssueCollectionsForTopicChange();\n applyNodeState({\n selectedIssueId: null,\n selectedTaskId: null\n });\n void loadIssues();\n return;\n }\n\n if (\n previous.issueStatusFilter !== next.issueStatusFilter &&\n deferredIssueSearch === snapshot.nodeState.issueSearchQuery\n ) {\n void loadIssues();\n }\n\n if (previous.selectedIssueId !== next.selectedIssueId) {\n void loadIssueDetail();\n return;\n }\n\n if (previous.selectedTaskId !== next.selectedTaskId) {\n void loadTaskDetail();\n }\n };\n\n const retainIssueUpdates = () => {\n if (unsubscribeIssueUpdates || !input.feature.eventSource) {\n return;\n }\n unsubscribeIssueUpdates = input.feature.eventSource.subscribeToIssueUpdates(\n input.workspaceId,\n (event) => {\n if (event.workspaceId.trim() !== input.workspaceId.trim()) {\n return;\n }\n void loadTopics();\n void loadIssueDetail();\n void loadTaskDetail();\n }\n );\n try {\n const connectResult = input.feature.eventSource.connect?.();\n if (connectResult) {\n void connectResult.catch(() => {});\n }\n } catch {\n // Keep the controller usable when the event stream is temporarily down.\n }\n };\n\n const releaseIssueUpdates = () => {\n unsubscribeIssueUpdates?.();\n unsubscribeIssueUpdates = null;\n };\n\n return {\n getSnapshot() {\n return snapshot;\n },\n refreshAll() {\n if (!retained) {\n return;\n }\n void loadTopics();\n void loadIssueDetail();\n void loadTaskDetail();\n },\n refreshDetails() {\n if (!retained) {\n return;\n }\n void loadIssueDetail();\n void loadTaskDetail();\n },\n release() {\n refCount = Math.max(0, refCount - 1);\n if (refCount > 0) {\n return;\n }\n retained = false;\n issueListSequence += 1;\n issueDetailSequence += 1;\n taskDetailSequence += 1;\n topicListSequence += 1;\n releaseIssueUpdates();\n },\n reportIssueSearchUsage(query) {\n const searchQuery = query.trim();\n if (!searchQuery) {\n return;\n }\n pendingIssueSearchAnalyticsQuery = searchQuery;\n if (\n lastResolvedIssueSearchQuery === searchQuery &&\n !snapshot.issues.isLoading\n ) {\n flushPendingIssueSearchAnalytics(\n searchQuery,\n snapshot.issues.value.length\n );\n }\n },\n retain() {\n refCount += 1;\n if (retained) {\n return;\n }\n retained = true;\n if (!hasReportedOpened) {\n hasReportedOpened = true;\n void Promise.resolve(\n input.feature.analytics?.track({\n name: \"issue_manager.opened\",\n params: createIssueManagerOpenedParams(\n input.openSource ?? \"restore\"\n )\n })\n ).catch(() => undefined);\n }\n retainIssueUpdates();\n void loadTopics();\n void loadIssueDetail();\n void loadTaskDetail();\n },\n setIsRunningTask(update) {\n setSnapshot((current) => ({\n ...current,\n isRunningTask: resolveSetStateAction(update, current.isRunningTask)\n }));\n },\n setIssueDraftInternal(update) {\n setSnapshot((current) => ({\n ...current,\n issueDraft: resolveSetStateAction(update, current.issueDraft)\n }));\n },\n setIssueEditorModeState(update) {\n const nextMode = resolveSetStateAction(update, snapshot.issueEditorMode);\n setSnapshot((current) => ({\n ...current,\n issueEditorMode: nextMode\n }));\n syncIssueDraftFromCurrentDetail();\n },\n setReferenceTarget(update) {\n setSnapshot((current) => ({\n ...current,\n referenceTarget: resolveSetStateAction(update, current.referenceTarget)\n }));\n },\n setNotification(update) {\n setSnapshot((current) => ({\n ...current,\n notification: resolveSetStateAction(update, current.notification)\n }));\n },\n setTaskDraftInternal(update) {\n setSnapshot((current) => ({\n ...current,\n taskDraft: resolveSetStateAction(update, current.taskDraft)\n }));\n },\n setTaskEditorModeState(update) {\n const nextMode = resolveSetStateAction(update, snapshot.taskEditorMode);\n setSnapshot((current) => ({\n ...current,\n taskEditorMode: nextMode\n }));\n syncTaskDraftFromCurrentDetail();\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n syncInput(nextInput) {\n onStateChange = nextInput.onStateChange;\n if (deferredIssueSearch !== nextInput.deferredIssueSearch) {\n deferredIssueSearch = nextInput.deferredIssueSearch;\n if (retained) {\n void loadIssues();\n }\n }\n\n if (\n (snapshot.nodeState.taskListCollapsed === true) !==\n nextInput.taskListCollapsed\n ) {\n applyNodeState((current) => ({\n ...current,\n taskListCollapsed: nextInput.taskListCollapsed\n }));\n }\n },\n updateNodeState(updater) {\n applyNodeState(updater);\n },\n store\n };\n}\n\nfunction createAsyncCollectionState<TValue>(\n value: TValue,\n options?: Pick<AsyncCollectionState<TValue>, \"hasResolved\">\n): AsyncCollectionState<TValue> {\n return {\n error: null,\n ...options,\n isLoading: false,\n value\n };\n}\n\nfunction resolveSetStateAction<TValue>(\n update: SetStateAction<TValue>,\n current: TValue\n): TValue {\n return typeof update === \"function\"\n ? (update as (value: TValue) => TValue)(current)\n : update;\n}\n","export interface IssueManagerDiagnostics {\n log(\n event: string,\n details: Record<string, unknown>,\n options?: { includeStack?: boolean }\n ): void;\n}\n\nexport function logIssueManagerDiagnostic(\n diagnostics: IssueManagerDiagnostics | null | undefined,\n event: string,\n details: Record<string, unknown> = {},\n options: { includeStack?: boolean } = {}\n): void {\n diagnostics?.log(\n event,\n {\n ...details,\n ...(options.includeStack ? { stack: new Error().stack } : {})\n },\n options\n );\n}\n","import type {\n IssueManagerIssueSummary,\n IssueManagerFileReference,\n IssueManagerPriority,\n IssueManagerTaskSummary\n} from \"../../contracts/index.ts\";\nimport type { IssueManagerWorkspaceFileLinkInput } from \"../../core/index.ts\";\nimport type { IssueManagerI18nRuntime } from \"../../i18n/issueManagerI18n.ts\";\n\nexport const defaultTaskPriority: IssueManagerPriority = \"medium\";\n\nexport function resolveIssueManagerSelectedIssueId(\n currentSelectedIssueId: string | null | undefined,\n issues: readonly IssueManagerIssueSummary[]\n): string | null {\n if (\n currentSelectedIssueId &&\n issues.some((issue) => issue.issueId === currentSelectedIssueId)\n ) {\n return currentSelectedIssueId;\n }\n return issues[0]?.issueId ?? null;\n}\n\nexport function resolveIssueManagerSelectedTaskId(\n currentSelectedTaskId: string | null | undefined,\n tasks: readonly IssueManagerTaskSummary[]\n): string | null {\n if (\n currentSelectedTaskId &&\n tasks.some((task) => task.taskId === currentSelectedTaskId)\n ) {\n return currentSelectedTaskId;\n }\n return null;\n}\n\nexport function toContextRefInput(ref: IssueManagerFileReference) {\n return {\n displayName: ref.displayName,\n path: ref.path,\n refType: ref.kind === \"folder\" ? \"folder\" : \"file\"\n };\n}\n\nexport function toIssueManagerWorkspaceFileLinkInput(\n ref: IssueManagerFileReference\n): IssueManagerWorkspaceFileLinkInput {\n return {\n kind: ref.kind === \"folder\" ? \"folder\" : \"file\",\n name: ref.displayName,\n path: ref.path\n };\n}\n\nexport function confirmIssueManagerMessage(message: string): boolean {\n try {\n return globalThis.confirm?.(message) ?? true;\n } catch {\n return true;\n }\n}\n\nexport function resolveIssueManagerErrorMessage(\n error: unknown,\n copy?: IssueManagerI18nRuntime,\n fallbackKey?: string\n): string {\n const raw =\n error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : String(error);\n\n if (!copy) {\n return raw;\n }\n\n if (raw === \"issue_manager.upload_type_conflict\") {\n return copy.t(\"messages.uploadTypeConflict\");\n }\n if (raw === \"issue_manager.clipboard_unavailable\") {\n return copy.t(\"messages.clipboardUnavailable\");\n }\n if (raw === \"issue_manager.workspace_path_unavailable\") {\n return copy.t(\"messages.workspacePathUnavailable\");\n }\n if (raw === \"issue_manager.run_status_missing\") {\n return copy.t(\"messages.runStatusMissing\");\n }\n if (raw === \"issue_manager.run_timed_out\") {\n return copy.t(\"messages.runTimedOut\");\n }\n if (raw.startsWith(\"issue_manager.run_exit_code:\")) {\n return copy.t(\"messages.runExitCode\", {\n code: raw.slice(\"issue_manager.run_exit_code:\".length)\n });\n }\n\n return fallbackKey ? copy.t(fallbackKey) : raw;\n}\n\nexport function resolveIssueManagerTopicDeleteErrorMessage(\n error: unknown,\n copy: IssueManagerI18nRuntime\n): string {\n const protocolError = extractProtocolErrorShape(error);\n if (!protocolError) {\n return resolveIssueManagerErrorMessage(\n error,\n copy,\n \"messages.topicDeleteFailed\"\n );\n }\n\n if (protocolError.reason === \"workspace_issue_topic_not_empty\") {\n return copy.t(\"messages.topicDeleteNotEmpty\");\n }\n\n if (protocolError.reason === \"workspace_issue_topic_not_found\") {\n return copy.t(\"messages.topicDeleteNotFound\");\n }\n\n if (\n protocolError.code === \"invalid_request\" &&\n protocolError.reason === \"malformed_request\"\n ) {\n return copy.t(\"messages.topicDeleteDefaultForbidden\");\n }\n\n return copy.t(\"messages.topicDeleteFailed\");\n}\n\ninterface ProtocolErrorShape {\n code: string;\n reason?: string;\n}\n\nfunction extractProtocolErrorShape(error: unknown): ProtocolErrorShape | null {\n if (isProtocolErrorShape(error)) {\n return error;\n }\n\n if (typeof error !== \"object\" || error === null || !(\"error\" in error)) {\n return null;\n }\n\n const nestedError = (error as { error?: unknown }).error;\n return isProtocolErrorShape(nestedError) ? nestedError : null;\n}\n\nfunction isProtocolErrorShape(value: unknown): value is ProtocolErrorShape {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"code\" in value &&\n typeof (value as { code?: unknown }).code === \"string\" &&\n (!(\"reason\" in value) ||\n typeof (value as { reason?: unknown }).reason === \"string\" ||\n typeof (value as { reason?: unknown }).reason === \"undefined\")\n );\n}\n","import type {\n IssueManagerIssueDetail,\n IssueManagerListIssuesResult,\n IssueManagerNodeState,\n IssueManagerPriority,\n IssueManagerTaskDetail\n} from \"../../contracts/index.ts\";\nimport { normalizeIssueManagerContent } from \"../../core/index.ts\";\nimport type { IssueManagerEditorMode } from \"./model.ts\";\nimport type { IssueDraft, TaskDraft } from \"./controllerTypes.ts\";\nimport {\n defaultTaskPriority,\n resolveIssueManagerSelectedIssueId,\n resolveIssueManagerSelectedTaskId\n} from \"./controllerUtils.ts\";\n\nexport function createIssueManagerIssueDraftFromNodeState(\n state:\n | Pick<IssueManagerNodeState, \"issueDraftContent\" | \"issueDraftTitle\">\n | null\n | undefined\n): IssueDraft {\n return {\n content: state?.issueDraftContent ?? \"\",\n title: state?.issueDraftTitle ?? \"\"\n };\n}\n\nexport function createIssueManagerTaskDraftFromNodeState(\n state:\n | Pick<IssueManagerNodeState, \"taskDraftContent\" | \"taskDraftTitle\">\n | null\n | undefined,\n priority: IssueManagerPriority = defaultTaskPriority\n): TaskDraft {\n return {\n content: state?.taskDraftContent ?? \"\",\n priority,\n title: state?.taskDraftTitle ?? \"\"\n };\n}\n\nexport function applyIssueManagerIssueSelection(\n current: IssueManagerNodeState,\n issueId: string | null\n): IssueManagerNodeState {\n return {\n ...current,\n selectedIssueId: issueId,\n selectedTaskId: null\n };\n}\n\nexport function applyIssueManagerTaskSelection(\n current: IssueManagerNodeState,\n taskId: string | null\n): IssueManagerNodeState {\n return {\n ...current,\n selectedTaskId: taskId\n };\n}\n\nexport function applyIssueManagerIssueDeleted(\n current: IssueManagerNodeState\n): IssueManagerNodeState {\n return {\n ...current,\n selectedIssueId: null,\n selectedTaskId: null\n };\n}\n\nexport function applyIssueManagerTaskDeleted(\n current: IssueManagerNodeState\n): IssueManagerNodeState {\n return {\n ...current,\n selectedTaskId: null\n };\n}\n\nexport function applyIssueManagerSelectedAgentProvider(\n current: IssueManagerNodeState,\n provider: string\n): IssueManagerNodeState {\n return {\n ...current,\n selectedAgentProvider: provider\n };\n}\n\nexport function applyIssueManagerSelectedExecutionDirectory(\n current: IssueManagerNodeState,\n executionDirectory: string | null\n): IssueManagerNodeState {\n return {\n ...current,\n selectedExecutionDirectory: executionDirectory?.trim() || null\n };\n}\n\nexport function applyIssueManagerIssueListResultToNodeState(\n current: IssueManagerNodeState,\n result: Pick<IssueManagerListIssuesResult, \"issues\" | \"nextPageToken\">\n): IssueManagerNodeState {\n return {\n ...current,\n issueListNextPageToken: result.nextPageToken ?? null,\n selectedIssueId: resolveIssueManagerSelectedIssueId(\n current.selectedIssueId,\n result.issues\n )\n };\n}\n\nexport function applyIssueManagerIssueDetailResultToNodeState(\n current: IssueManagerNodeState,\n detail: Pick<IssueManagerIssueDetail, \"tasks\">\n): IssueManagerNodeState {\n return {\n ...current,\n selectedTaskId: resolveIssueManagerSelectedTaskId(\n current.selectedTaskId,\n detail.tasks\n )\n };\n}\n\nexport function syncIssueManagerIssueDraftFromDetail(\n current: IssueDraft,\n detail: IssueManagerIssueDetail | null,\n editorMode: IssueManagerEditorMode\n): IssueDraft {\n if (editorMode !== \"read\") {\n return current;\n }\n return {\n content: normalizeIssueManagerContent(detail?.issue.content ?? \"\"),\n title: detail?.issue.title ?? \"\"\n };\n}\n\nexport function syncIssueManagerTaskDraftFromDetail(\n current: TaskDraft,\n detail: IssueManagerTaskDetail | null,\n editorMode: IssueManagerEditorMode\n): TaskDraft {\n if (editorMode !== \"read\") {\n return current;\n }\n return {\n content: normalizeIssueManagerContent(detail?.task.content ?? \"\"),\n priority: detail?.task.priority ?? defaultTaskPriority,\n title: detail?.task.title ?? \"\"\n };\n}\n\nexport function applyIssueManagerIssueEditorModeToNodeState(\n current: IssueManagerNodeState,\n editorMode: IssueManagerEditorMode\n): IssueManagerNodeState {\n if (editorMode === \"create\") {\n return current;\n }\n return {\n ...current,\n issueDraftContent: null,\n issueDraftTitle: null\n };\n}\n\nexport function applyIssueManagerTaskEditorModeToNodeState(\n current: IssueManagerNodeState,\n editorMode: IssueManagerEditorMode\n): IssueManagerNodeState {\n if (editorMode === \"create\") {\n return current;\n }\n return {\n ...current,\n taskDraftContent: null,\n taskDraftTitle: null\n };\n}\n\nexport function applyIssueManagerIssueSaved(\n current: IssueManagerNodeState,\n issueId: string\n): IssueManagerNodeState {\n return {\n ...current,\n issueDraftContent: null,\n issueDraftTitle: null,\n selectedIssueId: issueId\n };\n}\n\nexport function applyIssueManagerTaskSaved(\n current: IssueManagerNodeState,\n taskId: string\n): IssueManagerNodeState {\n return {\n ...current,\n selectedTaskId: taskId,\n taskDraftContent: null,\n taskDraftTitle: null\n };\n}\n\nexport function persistIssueManagerIssueDraftContent(\n current: IssueManagerNodeState,\n editorMode: IssueManagerEditorMode,\n content: string\n): IssueManagerNodeState {\n if (editorMode !== \"create\") {\n return current;\n }\n return {\n ...current,\n issueDraftContent: content\n };\n}\n\nexport function persistIssueManagerIssueDraftTitle(\n current: IssueManagerNodeState,\n editorMode: IssueManagerEditorMode,\n title: string\n): IssueManagerNodeState {\n if (editorMode !== \"create\") {\n return current;\n }\n return {\n ...current,\n issueDraftTitle: title\n };\n}\n\nexport function persistIssueManagerTaskDraftContent(\n current: IssueManagerNodeState,\n editorMode: IssueManagerEditorMode,\n content: string\n): IssueManagerNodeState {\n if (editorMode !== \"create\") {\n return current;\n }\n return {\n ...current,\n taskDraftContent: content\n };\n}\n\nexport function persistIssueManagerTaskDraftTitle(\n current: IssueManagerNodeState,\n editorMode: IssueManagerEditorMode,\n title: string\n): IssueManagerNodeState {\n if (editorMode !== \"create\") {\n return current;\n }\n return {\n ...current,\n taskDraftTitle: title\n };\n}\n","import type {\n CreateIssueManagerControllerSessionInput,\n IssueManagerControllerService,\n IssueManagerControllerSession\n} from \"../issueManagerControllerService.interface.ts\";\nimport { createIssueManagerControllerRuntime } from \"./controllerRuntime.ts\";\n\nexport class DefaultIssueManagerControllerService implements IssueManagerControllerService {\n createSession(\n input: CreateIssueManagerControllerSessionInput\n ): IssueManagerControllerSession {\n return createIssueManagerControllerRuntime(input);\n }\n}\n","import { DefaultIssueManagerControllerService } from \"./internal/issueManagerControllerService.ts\";\nimport type { IssueManagerControllerService } from \"./issueManagerControllerService.interface.ts\";\n\nexport function createIssueManagerControllerService(): IssueManagerControllerService {\n return new DefaultIssueManagerControllerService();\n}\n"],"mappings":"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","names":[]}
@@ -31,8 +31,8 @@ import {
31
31
  resolveIssueManagerExpandedFrame,
32
32
  resolveIssueManagerWorkspaceRuntimePath,
33
33
  shouldAutoCollapseIssueManagerSidebar
34
- } from "../chunk-KSNIBEPN.js";
35
- import "../chunk-OWZ266HS.js";
34
+ } from "../chunk-UVQP76CR.js";
35
+ import "../chunk-3MZ5QNY4.js";
36
36
  export {
37
37
  appendIssueManagerWorkspaceFileLinksToContent,
38
38
  appendIssueManagerWorkspaceReferenceMentionsToContent,
@@ -4,7 +4,7 @@ import {
4
4
  issueManagerI18nModule,
5
5
  issueManagerI18nNamespace,
6
6
  issueManagerI18nResources
7
- } from "../chunk-OWZ266HS.js";
7
+ } from "../chunk-3MZ5QNY4.js";
8
8
  export {
9
9
  createIssueManagerI18nRuntime,
10
10
  issueManagerI18nModule,
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ import {
9
9
  resolveIssueManagerPriorityLabel,
10
10
  resolveIssueManagerStatusLabel,
11
11
  uniqueIssueManagerFileReferences
12
- } from "./chunk-2UL4JU3Q.js";
12
+ } from "./chunk-VQTT2NHT.js";
13
13
  import {
14
14
  appendIssueManagerWorkspaceFileLinksToContent,
15
15
  appendIssueManagerWorkspaceReferenceMentionsToContent,
@@ -43,13 +43,13 @@ import {
43
43
  resolveIssueManagerExpandedFrame,
44
44
  resolveIssueManagerWorkspaceRuntimePath,
45
45
  shouldAutoCollapseIssueManagerSidebar
46
- } from "./chunk-KSNIBEPN.js";
46
+ } from "./chunk-UVQP76CR.js";
47
47
  import {
48
48
  createIssueManagerI18nRuntime,
49
49
  issueManagerI18nModule,
50
50
  issueManagerI18nNamespace,
51
51
  issueManagerI18nResources
52
- } from "./chunk-OWZ266HS.js";
52
+ } from "./chunk-3MZ5QNY4.js";
53
53
  export {
54
54
  appendIssueManagerWorkspaceFileLinksToContent,
55
55
  appendIssueManagerWorkspaceReferenceMentionsToContent,
@@ -8,9 +8,9 @@ import {
8
8
  resolveIssueManagerPriorityLabel,
9
9
  resolveIssueManagerStatusLabel,
10
10
  uniqueIssueManagerFileReferences
11
- } from "../chunk-2UL4JU3Q.js";
12
- import "../chunk-KSNIBEPN.js";
13
- import "../chunk-OWZ266HS.js";
11
+ } from "../chunk-VQTT2NHT.js";
12
+ import "../chunk-UVQP76CR.js";
13
+ import "../chunk-3MZ5QNY4.js";
14
14
  export {
15
15
  createIssueManagerControllerService,
16
16
  createIssueManagerDate,
@@ -1,4 +1,5 @@
1
1
  import { ReactNode, JSX, HTMLAttributes } from 'react';
2
+ import { WorkbenchDisplayMode, WorkbenchHostNodeHeaderWindowActions } from '@tutti-os/workbench-surface';
2
3
  import { IssueManagerI18nRuntime } from '../i18n/index.js';
3
4
  import { IssueManagerOpenSource, IssueManagerNodeState, IssueManagerStatus } from '../contracts/index.js';
4
5
  import { a as IssueManagerLatestRunStatusRenderer } from '../latestRunStatusRenderer-B_9yU0CM.js';
@@ -49,14 +50,16 @@ interface IssueManagerNodeHeaderProps extends HTMLAttributes<HTMLElement> {
49
50
  activeTopicId?: string | null;
50
51
  copy: IssueManagerI18nRuntime;
51
52
  defaultActions?: ReactNode;
53
+ displayMode?: WorkbenchDisplayMode;
52
54
  isSidebarAutoCollapsed: boolean;
53
55
  isSidebarCollapsed: boolean;
54
56
  nodeId: string;
55
57
  onToggleSidebar: (nextCollapsed: boolean) => void;
56
58
  title?: string;
59
+ windowActions?: Pick<WorkbenchHostNodeHeaderWindowActions, "close" | "minimize" | "toggleDisplayMode">;
57
60
  workspaceId: string;
58
61
  }
59
- declare function IssueManagerNodeHeader({ activeTopicId, className, copy, defaultActions, isSidebarAutoCollapsed, isSidebarCollapsed, nodeId, onToggleSidebar, title, workspaceId, ...headerProps }: IssueManagerNodeHeaderProps): JSX.Element;
62
+ declare function IssueManagerNodeHeader({ activeTopicId, className, copy, defaultActions: _defaultActions, displayMode, isSidebarAutoCollapsed, isSidebarCollapsed, nodeId, onToggleSidebar, title, windowActions, workspaceId, ...headerProps }: IssueManagerNodeHeaderProps): JSX.Element;
60
63
 
61
64
  type IssueManagerMentionStatusTone = "amber" | "blue" | "green" | "neutral" | "purple" | "red";
62
65
  type IssueManagerStatusBadgeVariant = "accent" | "default" | "destructive" | "muted" | "pending" | "success" | "warning";
package/dist/ui/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  IssueManagerNode,
3
3
  IssueManagerNodeHeader
4
- } from "../chunk-YDDAKCBT.js";
5
- import "../chunk-2UL4JU3Q.js";
6
- import "../chunk-KSNIBEPN.js";
7
- import "../chunk-OWZ266HS.js";
4
+ } from "../chunk-UKHXZOVZ.js";
5
+ import "../chunk-VQTT2NHT.js";
6
+ import "../chunk-UVQP76CR.js";
7
+ import "../chunk-3MZ5QNY4.js";
8
8
 
9
9
  // src/ui/internal/status/IssueManagerStatusPresentation.ts
10
10
  function resolveIssueManagerStatusPresentation(status) {
@@ -2,14 +2,14 @@ import {
2
2
  IssueManagerNode,
3
3
  IssueManagerNodeHeader,
4
4
  dispatchIssueManagerTaskListCollapsed
5
- } from "../chunk-YDDAKCBT.js";
6
- import "../chunk-2UL4JU3Q.js";
5
+ } from "../chunk-UKHXZOVZ.js";
6
+ import "../chunk-VQTT2NHT.js";
7
7
  import {
8
8
  normalizeIssueManagerNodeState,
9
9
  resolveIssueManagerExpandedFrame,
10
10
  shouldAutoCollapseIssueManagerSidebar
11
- } from "../chunk-KSNIBEPN.js";
12
- import "../chunk-OWZ266HS.js";
11
+ } from "../chunk-UVQP76CR.js";
12
+ import "../chunk-3MZ5QNY4.js";
13
13
  import {
14
14
  defaultIssueManagerNodeFrame,
15
15
  defaultIssueManagerWorkbenchTypeId
@@ -120,10 +120,16 @@ function createIssueManagerWorkbenchNodeDefinition({
120
120
  activeTopicId: nodeState.activeTopicId ?? null,
121
121
  copy: feature.i18n,
122
122
  defaultActions,
123
+ displayMode: node.displayMode,
123
124
  isSidebarAutoCollapsed,
124
125
  isSidebarCollapsed,
125
126
  nodeId: node.id,
126
127
  title: node.title,
128
+ windowActions: {
129
+ close: windowActions.close,
130
+ minimize: windowActions.minimize,
131
+ toggleDisplayMode: windowActions.toggleDisplayMode
132
+ },
127
133
  workspaceId: externalWorkspaceState.workspaceId ?? "",
128
134
  ...dragHandleProps,
129
135
  onPointerDown: (event) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/workbench/index.ts","../../src/workbench/openActivation.ts"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport type { RichTextTriggerProvider } from \"@tutti-os/ui-rich-text/types\";\nimport type {\n WorkbenchContribution,\n WorkbenchFrame,\n WorkbenchHostActivation,\n WorkbenchHostDockEntry,\n WorkbenchHostExternalStateSource,\n WorkbenchHostLaunchRequest,\n WorkbenchHostLaunchResult,\n WorkbenchHostNodeDefinition\n} from \"@tutti-os/workbench-surface\";\nimport type {\n IssueManagerNodeState,\n IssueManagerOpenSource\n} from \"../contracts/index.ts\";\nimport type { IssueManagerDiagnostics } from \"../internal/issueManagerDiagnostics.ts\";\nimport {\n normalizeIssueManagerNodeState,\n resolveIssueManagerExpandedFrame,\n shouldAutoCollapseIssueManagerSidebar,\n type IssueManagerFeature\n} from \"../core/index.ts\";\nimport type { IssueManagerControllerService } from \"../services/issueManagerControllerService.interface.ts\";\nimport {\n dispatchIssueManagerTaskListCollapsed,\n IssueManagerNode,\n IssueManagerNodeHeader,\n type IssueManagerNodeOpenRequest\n} from \"../ui/IssueManagerNode.tsx\";\nimport type { IssueManagerLatestRunStatusRenderer } from \"../ui/latestRunStatusRenderer.ts\";\nexport {\n defaultIssueManagerNodeFrame,\n defaultIssueManagerWorkbenchTypeId\n} from \"./constants.ts\";\nexport {\n issueManagerOpenActivationType,\n readIssueManagerOpenActivationPayload,\n type IssueManagerOpenActivationPayload\n} from \"./openActivation.ts\";\nimport {\n defaultIssueManagerNodeFrame,\n defaultIssueManagerWorkbenchTypeId\n} from \"./constants.ts\";\nimport { readIssueManagerOpenActivationPayload } from \"./openActivation.ts\";\n\nexport interface IssueManagerExternalWorkspaceState {\n workspaceId?: string | null;\n}\n\nexport interface CreateIssueManagerWorkbenchNodeDefinitionInput {\n diagnostics?: IssueManagerDiagnostics | null;\n emptyIllustration?: ReactNode;\n feature: IssueManagerFeature;\n frame?: WorkbenchFrame;\n onStateChange?: (input: {\n instanceId: string;\n instanceKey?: string | null;\n nodeId: string;\n state: IssueManagerNodeState;\n workspaceState: IssueManagerExternalWorkspaceState;\n }) => void;\n resolveRichTextTriggerProviders?: (input: {\n surface: \"issue\" | \"task\";\n workspaceId: string;\n }) => readonly RichTextTriggerProvider[];\n renderLatestRunStatus?: IssueManagerLatestRunStatusRenderer;\n service?: IssueManagerControllerService;\n title?: string;\n typeId?: string;\n}\n\nexport interface CreateIssueManagerWorkbenchLaunchHandlerInput {\n frame?: WorkbenchFrame;\n title?: string;\n typeId?: string;\n}\n\nexport interface CreateIssueManagerDockEntryInput {\n dockIcon?: ReactNode;\n feature: IssueManagerFeature;\n id?: string;\n order?: number;\n separatorAfter?: boolean;\n sectionId?: string;\n typeId?: string;\n}\n\nexport interface CreateIssueManagerWorkbenchContributionInput {\n contributionId?: string;\n dockEntry?: Omit<CreateIssueManagerDockEntryInput, \"feature\">;\n externalStateSource?: WorkbenchHostExternalStateSource<\n Partial<IssueManagerNodeState> | null,\n IssueManagerExternalWorkspaceState\n >;\n feature: IssueManagerFeature;\n node?: Omit<CreateIssueManagerWorkbenchNodeDefinitionInput, \"feature\">;\n typeId?: string;\n}\n\nexport function createIssueManagerWorkbenchNodeDefinition<\n TExternalWorkspaceState extends IssueManagerExternalWorkspaceState =\n IssueManagerExternalWorkspaceState\n>({\n emptyIllustration,\n diagnostics,\n feature,\n frame = defaultIssueManagerNodeFrame,\n onStateChange,\n resolveRichTextTriggerProviders,\n renderLatestRunStatus,\n service,\n title,\n typeId = defaultIssueManagerWorkbenchTypeId\n}: CreateIssueManagerWorkbenchNodeDefinitionInput): WorkbenchHostNodeDefinition<\n Partial<IssueManagerNodeState> | null,\n TExternalWorkspaceState\n> {\n return {\n frame,\n instance: {\n mode: \"single\"\n },\n renderBody: (context) =>\n createElement(IssueManagerNode, {\n emptyIllustration,\n diagnostics,\n feature,\n nodeId: context.node.id,\n openRequest: toIssueManagerNodeOpenRequest(context.activation),\n openSource: resolveIssueManagerOpenSource(\n context.node.data.launchSource\n ),\n onStateChange: onStateChange\n ? (state) =>\n onStateChange({\n instanceId: context.instanceId,\n instanceKey: context.instanceKey ?? null,\n nodeId: context.node.id,\n state,\n workspaceState: context.externalWorkspaceState\n })\n : undefined,\n renderLatestRunStatus,\n resolveRichTextTriggerProviders,\n service,\n state: context.externalNodeState,\n workspaceId: context.externalWorkspaceState.workspaceId ?? \"\"\n }),\n renderHeader: ({\n defaultActions,\n dragHandleProps,\n externalNodeState,\n externalWorkspaceState,\n instanceId,\n instanceKey,\n isFocused,\n node,\n surfaceSize,\n windowActions\n }) => {\n const nodeState = normalizeIssueManagerNodeState(externalNodeState);\n const isSidebarAutoCollapsed = shouldAutoCollapseIssueManagerSidebar(\n node.frame.width\n );\n const isSidebarCollapsed =\n nodeState.taskListCollapsed === true || isSidebarAutoCollapsed;\n const persistTaskListCollapsed = (collapsed: boolean) => {\n onStateChange?.({\n instanceId,\n instanceKey: instanceKey ?? null,\n nodeId: node.id,\n state: {\n ...nodeState,\n taskListCollapsed: collapsed\n },\n workspaceState: externalWorkspaceState\n });\n };\n const applyTaskListCollapsed = (collapsed: boolean) => {\n dispatchIssueManagerTaskListCollapsed({\n collapsed,\n nodeId: node.id,\n workspaceId: externalWorkspaceState.workspaceId ?? \"\"\n });\n persistTaskListCollapsed(collapsed);\n };\n\n return createElement(IssueManagerNodeHeader, {\n activeTopicId: nodeState.activeTopicId ?? null,\n copy: feature.i18n,\n defaultActions,\n isSidebarAutoCollapsed,\n isSidebarCollapsed,\n nodeId: node.id,\n title: node.title,\n workspaceId: externalWorkspaceState.workspaceId ?? \"\",\n ...dragHandleProps,\n onPointerDown: (event) => {\n dragHandleProps.onPointerDown?.(event);\n if (!isFocused) {\n windowActions.focus();\n }\n },\n onToggleSidebar: (nextCollapsed) => {\n if (\n isSidebarCollapsed &&\n nextCollapsed === false &&\n node.displayMode !== \"fullscreen\"\n ) {\n windowActions.resize(\n resolveIssueManagerExpandedFrame(node.frame, surfaceSize.width)\n );\n applyTaskListCollapsed(false);\n return;\n }\n\n applyTaskListCollapsed(nextCollapsed);\n }\n });\n },\n title: title ?? feature.i18n.t(\"title\"),\n typeId,\n window: {\n closable: true,\n defaultOpen: false,\n minimizedDock: {\n kind: \"snapshot\"\n },\n minimizable: true,\n restoreOnLoad: true\n }\n };\n}\n\nfunction resolveIssueManagerOpenSource(\n launchSource: string | null | undefined\n): IssueManagerOpenSource {\n switch (launchSource) {\n case \"agent_command\":\n case \"command\":\n case \"dock\":\n case \"keyboard\":\n case \"launchpad\":\n return launchSource;\n default:\n return \"restore\";\n }\n}\n\nfunction toIssueManagerNodeOpenRequest(\n activation: WorkbenchHostActivation | null\n): IssueManagerNodeOpenRequest | null {\n const payload = readIssueManagerOpenActivationPayload(activation);\n if (!payload) {\n return null;\n }\n return {\n ...payload,\n requestId: String(activation?.sequence ?? \"\")\n };\n}\n\nexport function createIssueManagerDockEntry({\n dockIcon,\n feature,\n id,\n order,\n separatorAfter,\n sectionId,\n typeId = defaultIssueManagerWorkbenchTypeId\n}: CreateIssueManagerDockEntryInput): WorkbenchHostDockEntry {\n return {\n icon: dockIcon ?? null,\n id: id ?? typeId,\n label: feature.i18n.t(\"dockLabel\"),\n launchBehavior: \"enabled\",\n matchNode: (node) => node.data.typeId === typeId,\n order,\n resolvePopupItem: ({ node }) => ({\n revision: node.title,\n title: node.title\n }),\n separatorAfter,\n sectionId,\n typeId,\n visibility: \"always\"\n };\n}\n\nexport function createIssueManagerDockIconImage(src: string): ReactNode {\n return createElement(\"img\", {\n alt: \"\",\n \"aria-hidden\": \"true\",\n \"data-issue-manager-dock-icon\": \"true\",\n draggable: false,\n src\n });\n}\n\nexport function createIssueManagerWorkbenchLaunchHandler({\n frame = defaultIssueManagerNodeFrame,\n title,\n typeId = defaultIssueManagerWorkbenchTypeId\n}: CreateIssueManagerWorkbenchLaunchHandlerInput = {}): (\n request: WorkbenchHostLaunchRequest\n) => Promise<WorkbenchHostLaunchResult | null> {\n return (request) => {\n if (request.typeId !== typeId) {\n return Promise.resolve(null);\n }\n\n return Promise.resolve({\n defaultFrame: frame,\n dockEntryId: request.dockEntryId ?? typeId,\n framePolicy: \"cascade\",\n instanceId: typeId,\n title,\n typeId\n });\n };\n}\n\nexport function createIssueManagerWorkbenchContribution({\n contributionId,\n dockEntry,\n externalStateSource,\n feature,\n node,\n typeId = defaultIssueManagerWorkbenchTypeId\n}: CreateIssueManagerWorkbenchContributionInput): WorkbenchContribution {\n return {\n dockEntries: [\n createIssueManagerDockEntry({\n ...dockEntry,\n feature,\n typeId\n })\n ],\n externalStateSource,\n id: contributionId ?? typeId,\n nodes: [\n createIssueManagerWorkbenchNodeDefinition({\n ...node,\n feature,\n typeId\n })\n ],\n onLaunchRequest: createIssueManagerWorkbenchLaunchHandler({\n frame: node?.frame,\n title: node?.title,\n typeId\n })\n };\n}\n","import type { WorkbenchHostActivation } from \"@tutti-os/workbench-surface\";\n\nexport const issueManagerOpenActivationType = \"open-workspace-issue\";\n\nexport interface IssueManagerOpenActivationPayload {\n issueId: string;\n mode?: \"breakdown\" | \"execute\";\n outputDir?: string;\n runId?: string;\n taskId?: string;\n topicId?: string;\n}\n\nexport function readIssueManagerOpenActivationPayload(\n activation: WorkbenchHostActivation | null\n): IssueManagerOpenActivationPayload | null {\n if (\n activation?.type !== issueManagerOpenActivationType ||\n !activation.payload ||\n typeof activation.payload !== \"object\"\n ) {\n return null;\n }\n\n const typed =\n activation.payload as Partial<IssueManagerOpenActivationPayload>;\n const issueId = typed.issueId?.trim() || \"\";\n if (!issueId) {\n return null;\n }\n\n return {\n issueId,\n ...(typed.mode === \"breakdown\" || typed.mode === \"execute\"\n ? { mode: typed.mode }\n : {}),\n ...(typed.outputDir?.trim() ? { outputDir: typed.outputDir.trim() } : {}),\n ...(typed.runId?.trim() ? { runId: typed.runId.trim() } : {}),\n ...(typed.taskId?.trim() ? { taskId: typed.taskId.trim() } : {}),\n ...(typed.topicId?.trim() ? { topicId: typed.topicId.trim() } : {})\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/workbench/index.ts","../../src/workbench/openActivation.ts"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport type { RichTextTriggerProvider } from \"@tutti-os/ui-rich-text/types\";\nimport type {\n WorkbenchContribution,\n WorkbenchFrame,\n WorkbenchHostActivation,\n WorkbenchHostDockEntry,\n WorkbenchHostExternalStateSource,\n WorkbenchHostLaunchRequest,\n WorkbenchHostLaunchResult,\n WorkbenchHostNodeDefinition\n} from \"@tutti-os/workbench-surface\";\nimport type {\n IssueManagerNodeState,\n IssueManagerOpenSource\n} from \"../contracts/index.ts\";\nimport type { IssueManagerDiagnostics } from \"../internal/issueManagerDiagnostics.ts\";\nimport {\n normalizeIssueManagerNodeState,\n resolveIssueManagerExpandedFrame,\n shouldAutoCollapseIssueManagerSidebar,\n type IssueManagerFeature\n} from \"../core/index.ts\";\nimport type { IssueManagerControllerService } from \"../services/issueManagerControllerService.interface.ts\";\nimport {\n dispatchIssueManagerTaskListCollapsed,\n IssueManagerNode,\n IssueManagerNodeHeader,\n type IssueManagerNodeOpenRequest\n} from \"../ui/IssueManagerNode.tsx\";\nimport type { IssueManagerLatestRunStatusRenderer } from \"../ui/latestRunStatusRenderer.ts\";\nexport {\n defaultIssueManagerNodeFrame,\n defaultIssueManagerWorkbenchTypeId\n} from \"./constants.ts\";\nexport {\n issueManagerOpenActivationType,\n readIssueManagerOpenActivationPayload,\n type IssueManagerOpenActivationPayload\n} from \"./openActivation.ts\";\nimport {\n defaultIssueManagerNodeFrame,\n defaultIssueManagerWorkbenchTypeId\n} from \"./constants.ts\";\nimport { readIssueManagerOpenActivationPayload } from \"./openActivation.ts\";\n\nexport interface IssueManagerExternalWorkspaceState {\n workspaceId?: string | null;\n}\n\nexport interface CreateIssueManagerWorkbenchNodeDefinitionInput {\n diagnostics?: IssueManagerDiagnostics | null;\n emptyIllustration?: ReactNode;\n feature: IssueManagerFeature;\n frame?: WorkbenchFrame;\n onStateChange?: (input: {\n instanceId: string;\n instanceKey?: string | null;\n nodeId: string;\n state: IssueManagerNodeState;\n workspaceState: IssueManagerExternalWorkspaceState;\n }) => void;\n resolveRichTextTriggerProviders?: (input: {\n surface: \"issue\" | \"task\";\n workspaceId: string;\n }) => readonly RichTextTriggerProvider[];\n renderLatestRunStatus?: IssueManagerLatestRunStatusRenderer;\n service?: IssueManagerControllerService;\n title?: string;\n typeId?: string;\n}\n\nexport interface CreateIssueManagerWorkbenchLaunchHandlerInput {\n frame?: WorkbenchFrame;\n title?: string;\n typeId?: string;\n}\n\nexport interface CreateIssueManagerDockEntryInput {\n dockIcon?: ReactNode;\n feature: IssueManagerFeature;\n id?: string;\n order?: number;\n separatorAfter?: boolean;\n sectionId?: string;\n typeId?: string;\n}\n\nexport interface CreateIssueManagerWorkbenchContributionInput {\n contributionId?: string;\n dockEntry?: Omit<CreateIssueManagerDockEntryInput, \"feature\">;\n externalStateSource?: WorkbenchHostExternalStateSource<\n Partial<IssueManagerNodeState> | null,\n IssueManagerExternalWorkspaceState\n >;\n feature: IssueManagerFeature;\n node?: Omit<CreateIssueManagerWorkbenchNodeDefinitionInput, \"feature\">;\n typeId?: string;\n}\n\nexport function createIssueManagerWorkbenchNodeDefinition<\n TExternalWorkspaceState extends IssueManagerExternalWorkspaceState =\n IssueManagerExternalWorkspaceState\n>({\n emptyIllustration,\n diagnostics,\n feature,\n frame = defaultIssueManagerNodeFrame,\n onStateChange,\n resolveRichTextTriggerProviders,\n renderLatestRunStatus,\n service,\n title,\n typeId = defaultIssueManagerWorkbenchTypeId\n}: CreateIssueManagerWorkbenchNodeDefinitionInput): WorkbenchHostNodeDefinition<\n Partial<IssueManagerNodeState> | null,\n TExternalWorkspaceState\n> {\n return {\n frame,\n instance: {\n mode: \"single\"\n },\n renderBody: (context) =>\n createElement(IssueManagerNode, {\n emptyIllustration,\n diagnostics,\n feature,\n nodeId: context.node.id,\n openRequest: toIssueManagerNodeOpenRequest(context.activation),\n openSource: resolveIssueManagerOpenSource(\n context.node.data.launchSource\n ),\n onStateChange: onStateChange\n ? (state) =>\n onStateChange({\n instanceId: context.instanceId,\n instanceKey: context.instanceKey ?? null,\n nodeId: context.node.id,\n state,\n workspaceState: context.externalWorkspaceState\n })\n : undefined,\n renderLatestRunStatus,\n resolveRichTextTriggerProviders,\n service,\n state: context.externalNodeState,\n workspaceId: context.externalWorkspaceState.workspaceId ?? \"\"\n }),\n renderHeader: ({\n defaultActions,\n dragHandleProps,\n externalNodeState,\n externalWorkspaceState,\n instanceId,\n instanceKey,\n isFocused,\n node,\n surfaceSize,\n windowActions\n }) => {\n const nodeState = normalizeIssueManagerNodeState(externalNodeState);\n const isSidebarAutoCollapsed = shouldAutoCollapseIssueManagerSidebar(\n node.frame.width\n );\n const isSidebarCollapsed =\n nodeState.taskListCollapsed === true || isSidebarAutoCollapsed;\n const persistTaskListCollapsed = (collapsed: boolean) => {\n onStateChange?.({\n instanceId,\n instanceKey: instanceKey ?? null,\n nodeId: node.id,\n state: {\n ...nodeState,\n taskListCollapsed: collapsed\n },\n workspaceState: externalWorkspaceState\n });\n };\n const applyTaskListCollapsed = (collapsed: boolean) => {\n dispatchIssueManagerTaskListCollapsed({\n collapsed,\n nodeId: node.id,\n workspaceId: externalWorkspaceState.workspaceId ?? \"\"\n });\n persistTaskListCollapsed(collapsed);\n };\n\n return createElement(IssueManagerNodeHeader, {\n activeTopicId: nodeState.activeTopicId ?? null,\n copy: feature.i18n,\n defaultActions,\n displayMode: node.displayMode,\n isSidebarAutoCollapsed,\n isSidebarCollapsed,\n nodeId: node.id,\n title: node.title,\n windowActions: {\n close: windowActions.close,\n minimize: windowActions.minimize,\n toggleDisplayMode: windowActions.toggleDisplayMode\n },\n workspaceId: externalWorkspaceState.workspaceId ?? \"\",\n ...dragHandleProps,\n onPointerDown: (event) => {\n dragHandleProps.onPointerDown?.(event);\n if (!isFocused) {\n windowActions.focus();\n }\n },\n onToggleSidebar: (nextCollapsed) => {\n if (\n isSidebarCollapsed &&\n nextCollapsed === false &&\n node.displayMode !== \"fullscreen\"\n ) {\n windowActions.resize(\n resolveIssueManagerExpandedFrame(node.frame, surfaceSize.width)\n );\n applyTaskListCollapsed(false);\n return;\n }\n\n applyTaskListCollapsed(nextCollapsed);\n }\n });\n },\n title: title ?? feature.i18n.t(\"title\"),\n typeId,\n window: {\n closable: true,\n defaultOpen: false,\n minimizedDock: {\n kind: \"snapshot\"\n },\n minimizable: true,\n restoreOnLoad: true\n }\n };\n}\n\nfunction resolveIssueManagerOpenSource(\n launchSource: string | null | undefined\n): IssueManagerOpenSource {\n switch (launchSource) {\n case \"agent_command\":\n case \"command\":\n case \"dock\":\n case \"keyboard\":\n case \"launchpad\":\n return launchSource;\n default:\n return \"restore\";\n }\n}\n\nfunction toIssueManagerNodeOpenRequest(\n activation: WorkbenchHostActivation | null\n): IssueManagerNodeOpenRequest | null {\n const payload = readIssueManagerOpenActivationPayload(activation);\n if (!payload) {\n return null;\n }\n return {\n ...payload,\n requestId: String(activation?.sequence ?? \"\")\n };\n}\n\nexport function createIssueManagerDockEntry({\n dockIcon,\n feature,\n id,\n order,\n separatorAfter,\n sectionId,\n typeId = defaultIssueManagerWorkbenchTypeId\n}: CreateIssueManagerDockEntryInput): WorkbenchHostDockEntry {\n return {\n icon: dockIcon ?? null,\n id: id ?? typeId,\n label: feature.i18n.t(\"dockLabel\"),\n launchBehavior: \"enabled\",\n matchNode: (node) => node.data.typeId === typeId,\n order,\n resolvePopupItem: ({ node }) => ({\n revision: node.title,\n title: node.title\n }),\n separatorAfter,\n sectionId,\n typeId,\n visibility: \"always\"\n };\n}\n\nexport function createIssueManagerDockIconImage(src: string): ReactNode {\n return createElement(\"img\", {\n alt: \"\",\n \"aria-hidden\": \"true\",\n \"data-issue-manager-dock-icon\": \"true\",\n draggable: false,\n src\n });\n}\n\nexport function createIssueManagerWorkbenchLaunchHandler({\n frame = defaultIssueManagerNodeFrame,\n title,\n typeId = defaultIssueManagerWorkbenchTypeId\n}: CreateIssueManagerWorkbenchLaunchHandlerInput = {}): (\n request: WorkbenchHostLaunchRequest\n) => Promise<WorkbenchHostLaunchResult | null> {\n return (request) => {\n if (request.typeId !== typeId) {\n return Promise.resolve(null);\n }\n\n return Promise.resolve({\n defaultFrame: frame,\n dockEntryId: request.dockEntryId ?? typeId,\n framePolicy: \"cascade\",\n instanceId: typeId,\n title,\n typeId\n });\n };\n}\n\nexport function createIssueManagerWorkbenchContribution({\n contributionId,\n dockEntry,\n externalStateSource,\n feature,\n node,\n typeId = defaultIssueManagerWorkbenchTypeId\n}: CreateIssueManagerWorkbenchContributionInput): WorkbenchContribution {\n return {\n dockEntries: [\n createIssueManagerDockEntry({\n ...dockEntry,\n feature,\n typeId\n })\n ],\n externalStateSource,\n id: contributionId ?? typeId,\n nodes: [\n createIssueManagerWorkbenchNodeDefinition({\n ...node,\n feature,\n typeId\n })\n ],\n onLaunchRequest: createIssueManagerWorkbenchLaunchHandler({\n frame: node?.frame,\n title: node?.title,\n typeId\n })\n };\n}\n","import type { WorkbenchHostActivation } from \"@tutti-os/workbench-surface\";\n\nexport const issueManagerOpenActivationType = \"open-workspace-issue\";\n\nexport interface IssueManagerOpenActivationPayload {\n issueId: string;\n mode?: \"breakdown\" | \"execute\";\n outputDir?: string;\n runId?: string;\n taskId?: string;\n topicId?: string;\n}\n\nexport function readIssueManagerOpenActivationPayload(\n activation: WorkbenchHostActivation | null\n): IssueManagerOpenActivationPayload | null {\n if (\n activation?.type !== issueManagerOpenActivationType ||\n !activation.payload ||\n typeof activation.payload !== \"object\"\n ) {\n return null;\n }\n\n const typed =\n activation.payload as Partial<IssueManagerOpenActivationPayload>;\n const issueId = typed.issueId?.trim() || \"\";\n if (!issueId) {\n return null;\n }\n\n return {\n issueId,\n ...(typed.mode === \"breakdown\" || typed.mode === \"execute\"\n ? { mode: typed.mode }\n : {}),\n ...(typed.outputDir?.trim() ? { outputDir: typed.outputDir.trim() } : {}),\n ...(typed.runId?.trim() ? { runId: typed.runId.trim() } : {}),\n ...(typed.taskId?.trim() ? { taskId: typed.taskId.trim() } : {}),\n ...(typed.topicId?.trim() ? { topicId: typed.topicId.trim() } : {})\n };\n}\n"],"mappings":"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","names":[]}
@@ -559,6 +559,42 @@ paths:
559
559
  $ref: "#/components/responses/WorkspaceOperationError"
560
560
  "503":
561
561
  $ref: "#/components/responses/ServiceUnavailableError"
562
+ /v1/workspaces/{workspaceID}/issues/{issueID}/tasks/batch-create:
563
+ parameters:
564
+ - $ref: "#/components/parameters/WorkspaceID"
565
+ - $ref: "#/components/parameters/IssueManagerIssueID"
566
+ post:
567
+ operationId: createWorkspaceIssueTasks
568
+ tags:
569
+ - issue
570
+ summary: Create ordered tasks for an issue-manager issue
571
+ requestBody:
572
+ required: true
573
+ content:
574
+ application/json:
575
+ schema:
576
+ $ref: "#/components/schemas/CreateIssueManagerTasksRequest"
577
+ responses:
578
+ "201":
579
+ description: Workspace issue tasks created
580
+ content:
581
+ application/json:
582
+ schema:
583
+ $ref: "#/components/schemas/IssueManagerTasksResponse"
584
+ "400":
585
+ $ref: "#/components/responses/InvalidRequestError"
586
+ "401":
587
+ $ref: "#/components/responses/UnauthorizedError"
588
+ "404":
589
+ $ref: "#/components/responses/WorkspaceIssueResourceNotFoundError"
590
+ "405":
591
+ $ref: "#/components/responses/MethodNotAllowedError"
592
+ "409":
593
+ $ref: "#/components/responses/WorkspaceIssueResourceExistsError"
594
+ "502":
595
+ $ref: "#/components/responses/WorkspaceOperationError"
596
+ "503":
597
+ $ref: "#/components/responses/ServiceUnavailableError"
562
598
  /v1/workspaces/{workspaceID}/issues/{issueID}/tasks/{taskID}:
563
599
  parameters:
564
600
  - $ref: "#/components/parameters/WorkspaceID"
@@ -1494,6 +1530,16 @@ components:
1494
1530
  properties:
1495
1531
  task:
1496
1532
  $ref: "#/components/schemas/IssueManagerTask"
1533
+ IssueManagerTasksResponse:
1534
+ type: object
1535
+ additionalProperties: false
1536
+ required:
1537
+ - tasks
1538
+ properties:
1539
+ tasks:
1540
+ type: array
1541
+ items:
1542
+ $ref: "#/components/schemas/IssueManagerTask"
1497
1543
  IssueManagerTaskListResponse:
1498
1544
  type: object
1499
1545
  additionalProperties: false
@@ -1651,6 +1697,17 @@ components:
1651
1697
  type: integer
1652
1698
  format: int64
1653
1699
  minimum: 0
1700
+ CreateIssueManagerTasksRequest:
1701
+ type: object
1702
+ additionalProperties: false
1703
+ required:
1704
+ - tasks
1705
+ properties:
1706
+ tasks:
1707
+ type: array
1708
+ minItems: 1
1709
+ items:
1710
+ $ref: "#/components/schemas/CreateIssueManagerTaskRequest"
1654
1711
  UpdateIssueManagerTaskRequest:
1655
1712
  type: object
1656
1713
  additionalProperties: false
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tutti-os/workspace-issue-manager",
3
- "version": "0.0.39",
3
+ "version": "0.0.41",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -54,14 +54,14 @@
54
54
  "directory": "packages/workspace/issue-manager"
55
55
  },
56
56
  "dependencies": {
57
- "@tutti-os/ui-i18n-runtime": "0.0.39",
58
- "@tutti-os/ui-react-hooks": "0.0.39",
59
- "@tutti-os/ui-rich-text": "0.0.39",
60
- "@tutti-os/ui-system": "0.0.39",
61
- "@tutti-os/workbench-surface": "0.0.39",
62
- "@tutti-os/workspace-file-reference": "0.0.39",
63
- "@tutti-os/workspace-file-preview": "0.0.39",
64
- "@tutti-os/workspace-user-project": "0.0.39",
57
+ "@tutti-os/ui-i18n-runtime": "0.0.41",
58
+ "@tutti-os/ui-react-hooks": "0.0.41",
59
+ "@tutti-os/ui-rich-text": "0.0.41",
60
+ "@tutti-os/ui-system": "0.0.41",
61
+ "@tutti-os/workbench-surface": "0.0.41",
62
+ "@tutti-os/workspace-file-reference": "0.0.41",
63
+ "@tutti-os/workspace-file-preview": "0.0.41",
64
+ "@tutti-os/workspace-user-project": "0.0.41",
65
65
  "valtio": "^2.3.2"
66
66
  },
67
67
  "devDependencies": {