@nextop-os/workspace-issue-manager 0.0.26 → 0.0.28

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.
Files changed (34) hide show
  1. package/dist/{chunk-34KSO5F6.js → chunk-I7SVY3KV.js} +159 -25
  2. package/dist/chunk-I7SVY3KV.js.map +1 -0
  3. package/dist/{chunk-JOUBY4J6.js → chunk-MJXXZPDJ.js} +111 -35
  4. package/dist/chunk-MJXXZPDJ.js.map +1 -0
  5. package/dist/chunk-N6NGQ7DZ.js +14 -0
  6. package/dist/chunk-N6NGQ7DZ.js.map +1 -0
  7. package/dist/{chunk-RJ6HZRQU.js → chunk-SUCZIXKI.js} +66 -20
  8. package/dist/chunk-SUCZIXKI.js.map +1 -0
  9. package/dist/{chunk-K3F67IRA.js → chunk-UT34M3FS.js} +1636 -1679
  10. package/dist/chunk-UT34M3FS.js.map +1 -0
  11. package/dist/contracts/index.d.ts +100 -57
  12. package/dist/core/index.d.ts +14 -6
  13. package/dist/core/index.js +4 -2
  14. package/dist/{feature-2zhsUF_g.d.ts → feature-Daez355C.d.ts} +7 -1
  15. package/dist/i18n/index.js +1 -1
  16. package/dist/index.d.ts +4 -3
  17. package/dist/index.js +5 -3
  18. package/dist/{issueManagerControllerService.interface-BtvnnFla.d.ts → issueManagerControllerService.interface-SdcCRGnc.d.ts} +3 -2
  19. package/dist/services/index.d.ts +4 -3
  20. package/dist/services/index.js +3 -3
  21. package/dist/ui/index.d.ts +5 -3
  22. package/dist/ui/index.js +4 -4
  23. package/dist/workbench/constants.d.ts +6 -0
  24. package/dist/workbench/constants.js +9 -0
  25. package/dist/workbench/constants.js.map +1 -0
  26. package/dist/workbench/index.d.ts +5 -4
  27. package/dist/workbench/index.js +10 -11
  28. package/dist/workbench/index.js.map +1 -1
  29. package/openapi/issue-manager.v1.yaml +366 -2
  30. package/package.json +11 -5
  31. package/dist/chunk-34KSO5F6.js.map +0 -1
  32. package/dist/chunk-JOUBY4J6.js.map +0 -1
  33. package/dist/chunk-K3F67IRA.js.map +0 -1
  34. package/dist/chunk-RJ6HZRQU.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/workbench/index.ts"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport type { RichTextAtProvider } from \"@nextop-os/ui-rich-text/types\";\nimport type {\n WorkbenchContribution,\n WorkbenchFrame,\n WorkbenchHostDockEntry,\n WorkbenchHostExternalStateSource,\n WorkbenchHostLaunchRequest,\n WorkbenchHostLaunchResult,\n WorkbenchHostNodeDefinition\n} from \"@nextop-os/workbench-surface\";\nimport type { IssueManagerNodeState } from \"../contracts/index.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} from \"../ui/IssueManagerNode.tsx\";\n\nexport interface IssueManagerExternalWorkspaceState {\n workspaceId?: string | null;\n}\n\nexport interface CreateIssueManagerWorkbenchNodeDefinitionInput {\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 resolveRichTextAtProviders?: (input: {\n surface: \"issue\" | \"task\";\n workspaceId: string;\n }) => readonly RichTextAtProvider[];\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 const defaultIssueManagerWorkbenchTypeId = \"issue-manager\";\n\nconst defaultIssueManagerNodeFrame: WorkbenchFrame = {\n height: 620,\n width: 960,\n x: 220,\n y: 120\n};\n\nexport function createIssueManagerWorkbenchNodeDefinition<\n TExternalWorkspaceState extends IssueManagerExternalWorkspaceState =\n IssueManagerExternalWorkspaceState\n>({\n emptyIllustration,\n feature,\n frame = defaultIssueManagerNodeFrame,\n onStateChange,\n resolveRichTextAtProviders,\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 feature,\n nodeId: context.node.id,\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 resolveRichTextAtProviders,\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 });\n persistTaskListCollapsed(collapsed);\n };\n\n return createElement(IssueManagerNodeHeader, {\n copy: feature.i18n,\n defaultActions,\n isSidebarAutoCollapsed,\n isSidebarCollapsed,\n nodeId: node.id,\n title: node.title,\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 minimizable: true,\n restoreOnLoad: true\n }\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 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"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/workbench/index.ts"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport type { RichTextAtProvider } from \"@nextop-os/ui-rich-text/types\";\nimport type {\n WorkbenchContribution,\n WorkbenchFrame,\n WorkbenchHostDockEntry,\n WorkbenchHostExternalStateSource,\n WorkbenchHostLaunchRequest,\n WorkbenchHostLaunchResult,\n WorkbenchHostNodeDefinition\n} from \"@nextop-os/workbench-surface\";\nimport type { IssueManagerNodeState } from \"../contracts/index.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} from \"../ui/IssueManagerNode.tsx\";\nexport {\n defaultIssueManagerNodeFrame,\n defaultIssueManagerWorkbenchTypeId\n} from \"./constants.ts\";\nimport {\n defaultIssueManagerNodeFrame,\n defaultIssueManagerWorkbenchTypeId\n} from \"./constants.ts\";\n\nexport interface IssueManagerExternalWorkspaceState {\n workspaceId?: string | null;\n}\n\nexport interface CreateIssueManagerWorkbenchNodeDefinitionInput {\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 resolveRichTextAtProviders?: (input: {\n surface: \"issue\" | \"task\";\n workspaceId: string;\n }) => readonly RichTextAtProvider[];\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 feature,\n frame = defaultIssueManagerNodeFrame,\n onStateChange,\n resolveRichTextAtProviders,\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 feature,\n nodeId: context.node.id,\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 resolveRichTextAtProviders,\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 });\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 ...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 minimizable: true,\n restoreOnLoad: true\n }\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 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"],"mappings":"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","names":[]}
@@ -5,6 +5,125 @@ info:
5
5
  tags:
6
6
  - name: issue
7
7
  paths:
8
+ /v1/workspaces/{workspaceID}/issue-topics:
9
+ parameters:
10
+ - $ref: "#/components/parameters/WorkspaceID"
11
+ get:
12
+ operationId: listWorkspaceIssueTopics
13
+ tags:
14
+ - issue
15
+ summary: List issue-manager topics for one workspace
16
+ responses:
17
+ "200":
18
+ description: Workspace issue topics
19
+ content:
20
+ application/json:
21
+ schema:
22
+ $ref: "#/components/schemas/IssueManagerTopicListResponse"
23
+ "400":
24
+ $ref: "#/components/responses/InvalidRequestError"
25
+ "401":
26
+ $ref: "#/components/responses/UnauthorizedError"
27
+ "404":
28
+ $ref: "#/components/responses/WorkspaceNotFoundError"
29
+ "405":
30
+ $ref: "#/components/responses/MethodNotAllowedError"
31
+ "502":
32
+ $ref: "#/components/responses/WorkspaceOperationError"
33
+ "503":
34
+ $ref: "#/components/responses/ServiceUnavailableError"
35
+ post:
36
+ operationId: createWorkspaceIssueTopic
37
+ tags:
38
+ - issue
39
+ summary: Create one issue-manager topic
40
+ requestBody:
41
+ required: true
42
+ content:
43
+ application/json:
44
+ schema:
45
+ $ref: "#/components/schemas/CreateIssueManagerTopicRequest"
46
+ responses:
47
+ "201":
48
+ description: Workspace issue topic created
49
+ content:
50
+ application/json:
51
+ schema:
52
+ $ref: "#/components/schemas/IssueManagerTopicResponse"
53
+ "400":
54
+ $ref: "#/components/responses/InvalidRequestError"
55
+ "401":
56
+ $ref: "#/components/responses/UnauthorizedError"
57
+ "404":
58
+ $ref: "#/components/responses/WorkspaceNotFoundError"
59
+ "405":
60
+ $ref: "#/components/responses/MethodNotAllowedError"
61
+ "409":
62
+ $ref: "#/components/responses/WorkspaceIssueResourceExistsError"
63
+ "502":
64
+ $ref: "#/components/responses/WorkspaceOperationError"
65
+ "503":
66
+ $ref: "#/components/responses/ServiceUnavailableError"
67
+ /v1/workspaces/{workspaceID}/issue-topics/{topicID}:
68
+ parameters:
69
+ - $ref: "#/components/parameters/WorkspaceID"
70
+ - $ref: "#/components/parameters/IssueManagerTopicID"
71
+ patch:
72
+ operationId: updateWorkspaceIssueTopic
73
+ tags:
74
+ - issue
75
+ summary: Update one issue-manager topic
76
+ requestBody:
77
+ required: true
78
+ content:
79
+ application/json:
80
+ schema:
81
+ $ref: "#/components/schemas/UpdateIssueManagerTopicRequest"
82
+ responses:
83
+ "200":
84
+ description: Workspace issue topic updated
85
+ content:
86
+ application/json:
87
+ schema:
88
+ $ref: "#/components/schemas/IssueManagerTopicResponse"
89
+ "400":
90
+ $ref: "#/components/responses/InvalidRequestError"
91
+ "401":
92
+ $ref: "#/components/responses/UnauthorizedError"
93
+ "404":
94
+ $ref: "#/components/responses/WorkspaceIssueResourceNotFoundError"
95
+ "405":
96
+ $ref: "#/components/responses/MethodNotAllowedError"
97
+ "502":
98
+ $ref: "#/components/responses/WorkspaceOperationError"
99
+ "503":
100
+ $ref: "#/components/responses/ServiceUnavailableError"
101
+ delete:
102
+ operationId: deleteWorkspaceIssueTopic
103
+ tags:
104
+ - issue
105
+ summary: Delete one issue-manager topic
106
+ responses:
107
+ "200":
108
+ description: Workspace issue topic deleted
109
+ content:
110
+ application/json:
111
+ schema:
112
+ $ref: "#/components/schemas/DeleteIssueManagerTopicResponse"
113
+ "400":
114
+ $ref: "#/components/responses/InvalidRequestError"
115
+ "401":
116
+ $ref: "#/components/responses/UnauthorizedError"
117
+ "404":
118
+ $ref: "#/components/responses/WorkspaceIssueResourceNotFoundError"
119
+ "405":
120
+ $ref: "#/components/responses/MethodNotAllowedError"
121
+ "409":
122
+ $ref: "#/components/responses/WorkspaceIssueResourceExistsError"
123
+ "502":
124
+ $ref: "#/components/responses/WorkspaceOperationError"
125
+ "503":
126
+ $ref: "#/components/responses/ServiceUnavailableError"
8
127
  /v1/workspaces/{workspaceID}/issues:
9
128
  parameters:
10
129
  - $ref: "#/components/parameters/WorkspaceID"
@@ -16,6 +135,7 @@ paths:
16
135
  parameters:
17
136
  - $ref: "#/components/parameters/IssueManagerPageSize"
18
137
  - $ref: "#/components/parameters/IssueManagerPageToken"
138
+ - $ref: "#/components/parameters/IssueManagerTopicIDQuery"
19
139
  - $ref: "#/components/parameters/IssueManagerStatusFilter"
20
140
  - $ref: "#/components/parameters/IssueManagerSearchQuery"
21
141
  responses:
@@ -216,6 +336,125 @@ paths:
216
336
  $ref: "#/components/responses/WorkspaceOperationError"
217
337
  "503":
218
338
  $ref: "#/components/responses/ServiceUnavailableError"
339
+ /v1/workspaces/{workspaceID}/issues/{issueID}/runs:
340
+ parameters:
341
+ - $ref: "#/components/parameters/WorkspaceID"
342
+ - $ref: "#/components/parameters/IssueManagerIssueID"
343
+ get:
344
+ operationId: listWorkspaceIssueRuns
345
+ tags:
346
+ - issue
347
+ summary: List runs for one issue-manager issue
348
+ responses:
349
+ "200":
350
+ description: Workspace issue runs
351
+ content:
352
+ application/json:
353
+ schema:
354
+ $ref: "#/components/schemas/IssueManagerRunListResponse"
355
+ "400":
356
+ $ref: "#/components/responses/InvalidRequestError"
357
+ "401":
358
+ $ref: "#/components/responses/UnauthorizedError"
359
+ "404":
360
+ $ref: "#/components/responses/WorkspaceIssueResourceNotFoundError"
361
+ "405":
362
+ $ref: "#/components/responses/MethodNotAllowedError"
363
+ "502":
364
+ $ref: "#/components/responses/WorkspaceOperationError"
365
+ "503":
366
+ $ref: "#/components/responses/ServiceUnavailableError"
367
+ post:
368
+ operationId: createWorkspaceIssueRun
369
+ tags:
370
+ - issue
371
+ summary: Create one run for an issue-manager issue
372
+ requestBody:
373
+ required: true
374
+ content:
375
+ application/json:
376
+ schema:
377
+ $ref: "#/components/schemas/CreateIssueManagerRunRequest"
378
+ responses:
379
+ "201":
380
+ description: Workspace issue run created
381
+ content:
382
+ application/json:
383
+ schema:
384
+ $ref: "#/components/schemas/IssueManagerRunResponse"
385
+ "400":
386
+ $ref: "#/components/responses/InvalidRequestError"
387
+ "401":
388
+ $ref: "#/components/responses/UnauthorizedError"
389
+ "404":
390
+ $ref: "#/components/responses/WorkspaceIssueResourceNotFoundError"
391
+ "405":
392
+ $ref: "#/components/responses/MethodNotAllowedError"
393
+ "409":
394
+ $ref: "#/components/responses/WorkspaceIssueResourceExistsError"
395
+ "502":
396
+ $ref: "#/components/responses/WorkspaceOperationError"
397
+ "503":
398
+ $ref: "#/components/responses/ServiceUnavailableError"
399
+ /v1/workspaces/{workspaceID}/issues/{issueID}/runs/{runID}:
400
+ parameters:
401
+ - $ref: "#/components/parameters/WorkspaceID"
402
+ - $ref: "#/components/parameters/IssueManagerIssueID"
403
+ - $ref: "#/components/parameters/IssueManagerRunID"
404
+ get:
405
+ operationId: getWorkspaceIssueRun
406
+ tags:
407
+ - issue
408
+ summary: Get one issue-manager issue run
409
+ responses:
410
+ "200":
411
+ description: Workspace issue run
412
+ content:
413
+ application/json:
414
+ schema:
415
+ $ref: "#/components/schemas/IssueManagerRunEnvelope"
416
+ "400":
417
+ $ref: "#/components/responses/InvalidRequestError"
418
+ "401":
419
+ $ref: "#/components/responses/UnauthorizedError"
420
+ "404":
421
+ $ref: "#/components/responses/WorkspaceIssueResourceNotFoundError"
422
+ "405":
423
+ $ref: "#/components/responses/MethodNotAllowedError"
424
+ "502":
425
+ $ref: "#/components/responses/WorkspaceOperationError"
426
+ "503":
427
+ $ref: "#/components/responses/ServiceUnavailableError"
428
+ patch:
429
+ operationId: completeWorkspaceIssueRun
430
+ tags:
431
+ - issue
432
+ summary: Complete one issue-manager issue run
433
+ requestBody:
434
+ required: true
435
+ content:
436
+ application/json:
437
+ schema:
438
+ $ref: "#/components/schemas/CompleteIssueManagerRunRequest"
439
+ responses:
440
+ "200":
441
+ description: Workspace issue run completed
442
+ content:
443
+ application/json:
444
+ schema:
445
+ $ref: "#/components/schemas/IssueManagerRunEnvelope"
446
+ "400":
447
+ $ref: "#/components/responses/InvalidRequestError"
448
+ "401":
449
+ $ref: "#/components/responses/UnauthorizedError"
450
+ "404":
451
+ $ref: "#/components/responses/WorkspaceIssueResourceNotFoundError"
452
+ "405":
453
+ $ref: "#/components/responses/MethodNotAllowedError"
454
+ "502":
455
+ $ref: "#/components/responses/WorkspaceOperationError"
456
+ "503":
457
+ $ref: "#/components/responses/ServiceUnavailableError"
219
458
  /v1/workspaces/{workspaceID}/issues/{issueID}/tasks:
220
459
  parameters:
221
460
  - $ref: "#/components/parameters/WorkspaceID"
@@ -561,6 +800,20 @@ components:
561
800
  schema:
562
801
  type: string
563
802
  minLength: 1
803
+ IssueManagerTopicID:
804
+ name: topicID
805
+ in: path
806
+ required: true
807
+ schema:
808
+ type: string
809
+ minLength: 1
810
+ IssueManagerTopicIDQuery:
811
+ name: topicId
812
+ in: query
813
+ required: true
814
+ schema:
815
+ type: string
816
+ minLength: 1
564
817
  IssueManagerTaskID:
565
818
  name: taskID
566
819
  in: path
@@ -705,12 +958,53 @@ components:
705
958
  canceled:
706
959
  type: integer
707
960
  minimum: 0
961
+ IssueManagerTopic:
962
+ type: object
963
+ additionalProperties: false
964
+ required:
965
+ - topicId
966
+ - workspaceId
967
+ - title
968
+ - summary
969
+ - isDefault
970
+ - pinnedAtUnix
971
+ - lastActivityAtUnix
972
+ - createdAtUnix
973
+ - updatedAtUnix
974
+ properties:
975
+ topicId:
976
+ type: string
977
+ workspaceId:
978
+ type: string
979
+ title:
980
+ type: string
981
+ summary:
982
+ type: string
983
+ isDefault:
984
+ type: boolean
985
+ pinnedAtUnix:
986
+ type: integer
987
+ format: int64
988
+ minimum: 0
989
+ lastActivityAtUnix:
990
+ type: integer
991
+ format: int64
992
+ minimum: 0
993
+ createdAtUnix:
994
+ type: integer
995
+ format: int64
996
+ minimum: 0
997
+ updatedAtUnix:
998
+ type: integer
999
+ format: int64
1000
+ minimum: 0
708
1001
  IssueManagerIssue:
709
1002
  type: object
710
1003
  additionalProperties: false
711
1004
  required:
712
1005
  - issueId
713
1006
  - workspaceId
1007
+ - topicId
714
1008
  - title
715
1009
  - content
716
1010
  - status
@@ -731,6 +1025,8 @@ components:
731
1025
  type: string
732
1026
  workspaceId:
733
1027
  type: string
1028
+ topicId:
1029
+ type: string
734
1030
  title:
735
1031
  type: string
736
1032
  content:
@@ -834,7 +1130,6 @@ components:
834
1130
  additionalProperties: false
835
1131
  required:
836
1132
  - runId
837
- - taskId
838
1133
  - issueId
839
1134
  - workspaceId
840
1135
  - requesterUserId
@@ -896,7 +1191,6 @@ components:
896
1191
  required:
897
1192
  - outputId
898
1193
  - runId
899
- - taskId
900
1194
  - issueId
901
1195
  - workspaceId
902
1196
  - path
@@ -1019,6 +1313,24 @@ components:
1019
1313
  properties:
1020
1314
  issue:
1021
1315
  $ref: "#/components/schemas/IssueManagerIssue"
1316
+ IssueManagerTopicResponse:
1317
+ type: object
1318
+ additionalProperties: false
1319
+ required:
1320
+ - topic
1321
+ properties:
1322
+ topic:
1323
+ $ref: "#/components/schemas/IssueManagerTopic"
1324
+ IssueManagerTopicListResponse:
1325
+ type: object
1326
+ additionalProperties: false
1327
+ required:
1328
+ - topics
1329
+ properties:
1330
+ topics:
1331
+ type: array
1332
+ items:
1333
+ $ref: "#/components/schemas/IssueManagerTopic"
1022
1334
  IssueManagerIssueListResponse:
1023
1335
  type: object
1024
1336
  additionalProperties: false
@@ -1045,6 +1357,9 @@ components:
1045
1357
  - issue
1046
1358
  - tasks
1047
1359
  - contextRefs
1360
+ - latestRun
1361
+ - recentRuns
1362
+ - latestOutputs
1048
1363
  properties:
1049
1364
  issue:
1050
1365
  $ref: "#/components/schemas/IssueManagerIssue"
@@ -1056,6 +1371,18 @@ components:
1056
1371
  type: array
1057
1372
  items:
1058
1373
  $ref: "#/components/schemas/IssueManagerContextRef"
1374
+ latestRun:
1375
+ allOf:
1376
+ - $ref: "#/components/schemas/IssueManagerRun"
1377
+ nullable: true
1378
+ recentRuns:
1379
+ type: array
1380
+ items:
1381
+ $ref: "#/components/schemas/IssueManagerRun"
1382
+ latestOutputs:
1383
+ type: array
1384
+ items:
1385
+ $ref: "#/components/schemas/IssueManagerRunOutput"
1059
1386
  IssueManagerTaskResponse:
1060
1387
  type: object
1061
1388
  additionalProperties: false
@@ -1156,15 +1483,42 @@ components:
1156
1483
  type: object
1157
1484
  additionalProperties: false
1158
1485
  required:
1486
+ - topicId
1159
1487
  - title
1160
1488
  properties:
1161
1489
  issueId:
1162
1490
  type: string
1491
+ topicId:
1492
+ type: string
1493
+ minLength: 1
1163
1494
  title:
1164
1495
  type: string
1165
1496
  minLength: 1
1166
1497
  content:
1167
1498
  type: string
1499
+ CreateIssueManagerTopicRequest:
1500
+ type: object
1501
+ additionalProperties: false
1502
+ required:
1503
+ - title
1504
+ properties:
1505
+ topicId:
1506
+ type: string
1507
+ title:
1508
+ type: string
1509
+ minLength: 1
1510
+ summary:
1511
+ type: string
1512
+ UpdateIssueManagerTopicRequest:
1513
+ type: object
1514
+ additionalProperties: false
1515
+ properties:
1516
+ title:
1517
+ type: string
1518
+ summary:
1519
+ type: string
1520
+ pinned:
1521
+ type: boolean
1168
1522
  UpdateIssueManagerIssueRequest:
1169
1523
  type: object
1170
1524
  additionalProperties: false
@@ -1173,6 +1527,8 @@ components:
1173
1527
  type: string
1174
1528
  content:
1175
1529
  type: string
1530
+ status:
1531
+ $ref: "#/components/schemas/IssueManagerStatus"
1176
1532
  CreateIssueManagerTaskRequest:
1177
1533
  type: object
1178
1534
  additionalProperties: false
@@ -1293,6 +1649,14 @@ components:
1293
1649
  properties:
1294
1650
  removed:
1295
1651
  type: boolean
1652
+ DeleteIssueManagerTopicResponse:
1653
+ type: object
1654
+ additionalProperties: false
1655
+ required:
1656
+ - removed
1657
+ properties:
1658
+ removed:
1659
+ type: boolean
1296
1660
  DeleteIssueManagerTaskResponse:
1297
1661
  type: object
1298
1662
  additionalProperties: false
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextop-os/workspace-issue-manager",
3
- "version": "0.0.26",
3
+ "version": "0.0.28",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -34,6 +34,10 @@
34
34
  "types": "./dist/ui/index.d.ts",
35
35
  "import": "./dist/ui/index.js"
36
36
  },
37
+ "./workbench/constants": {
38
+ "types": "./dist/workbench/constants.d.ts",
39
+ "import": "./dist/workbench/constants.js"
40
+ },
37
41
  "./workbench": {
38
42
  "types": "./dist/workbench/index.d.ts",
39
43
  "import": "./dist/workbench/index.js"
@@ -50,10 +54,12 @@
50
54
  "directory": "packages/workspace/issue-manager"
51
55
  },
52
56
  "dependencies": {
53
- "@nextop-os/ui-i18n-runtime": "0.0.26",
54
- "@nextop-os/ui-rich-text": "0.0.26",
55
- "@nextop-os/ui-system": "0.0.26",
56
- "@nextop-os/workbench-surface": "0.0.26",
57
+ "@nextop-os/ui-i18n-runtime": "0.0.28",
58
+ "@nextop-os/ui-rich-text": "0.0.28",
59
+ "@nextop-os/ui-system": "0.0.28",
60
+ "@nextop-os/workbench-surface": "0.0.28",
61
+ "@nextop-os/workspace-file-reference": "0.0.28",
62
+ "@nextop-os/workspace-file-preview": "0.0.28",
57
63
  "valtio": "^2.3.2"
58
64
  },
59
65
  "devDependencies": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/services/internal/model.ts","../src/services/internal/controllerRuntime.ts","../src/services/internal/controllerUtils.ts","../src/services/internal/controllerState.ts","../src/services/internal/issueManagerControllerService.ts","../src/services/createIssueManagerControllerService.ts"],"sourcesContent":["import { formatNextopShortDateTime } from \"@nextop-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 ? formatNextopShortDateTime(date) : null;\n}\n\nexport function formatIssueManagerDate(\n value: number | null | undefined\n): string {\n const date = createIssueManagerDate(value);\n return date ? formatNextopShortDateTime(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 IssueManagerTaskDetail\n} from \"../../contracts/index.ts\";\nimport {\n normalizeIssueManagerNodeState,\n type IssueManagerFeature\n} from \"../../core/index.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}\n\nexport interface CreateIssueManagerControllerRuntimeInput {\n feature: IssueManagerFeature;\n state?: Partial<IssueManagerNodeState> | null;\n workspaceId: string;\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 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 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 onStateChange: ((state: IssueManagerNodeState) => void) | undefined;\n let refCount = 0;\n let retained = false;\n let taskDetailSequence = 0;\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 };\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 setSnapshot((current) => ({\n ...current,\n nodeState: next\n }));\n onStateChange?.(next);\n handleNodeStateTransition(previous, next);\n };\n\n const loadIssues = async () => {\n const sequence = ++issueListSequence;\n setSnapshot((current) => ({\n ...current,\n issues: {\n ...current.issues,\n error: null,\n isLoading: true\n }\n }));\n\n try {\n const result = await input.feature.backend.listIssues({\n searchQuery: deferredIssueSearch || undefined,\n statusFilter: snapshot.nodeState.issueStatusFilter,\n workspaceId: input.workspaceId\n });\n if (!retained || sequence !== issueListSequence) {\n return;\n }\n\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 } 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 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 (\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 return {\n getSnapshot() {\n return snapshot;\n },\n refreshAll() {\n if (!retained) {\n return;\n }\n void loadIssues();\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 },\n retain() {\n refCount += 1;\n if (retained) {\n return;\n }\n retained = true;\n void loadIssues();\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","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","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 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":[]}