@tutti-os/workspace-issue-manager 0.0.46 → 0.0.47
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.
package/dist/ui/index.js
CHANGED
package/dist/workbench/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
IssueManagerNode,
|
|
3
3
|
IssueManagerNodeHeader,
|
|
4
4
|
dispatchIssueManagerTaskListCollapsed
|
|
5
|
-
} from "../chunk-
|
|
5
|
+
} from "../chunk-MHE2AAJA.js";
|
|
6
6
|
import "../chunk-7WFVJWJA.js";
|
|
7
7
|
import {
|
|
8
8
|
normalizeIssueManagerNodeState,
|
|
@@ -139,7 +139,7 @@ function createIssueManagerWorkbenchNodeDefinition({
|
|
|
139
139
|
}
|
|
140
140
|
},
|
|
141
141
|
onToggleSidebar: (nextCollapsed) => {
|
|
142
|
-
if (
|
|
142
|
+
if (isSidebarAutoCollapsed && nextCollapsed === false && node.displayMode !== "fullscreen") {
|
|
143
143
|
windowActions.resize(
|
|
144
144
|
resolveIssueManagerExpandedFrame(node.frame, surfaceSize.width)
|
|
145
145
|
);
|
|
@@ -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 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":[]}
|
|
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 isSidebarAutoCollapsed &&\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":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tutti-os/workspace-issue-manager",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.47",
|
|
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.
|
|
58
|
-
"@tutti-os/ui-react-hooks": "0.0.
|
|
59
|
-
"@tutti-os/ui-rich-text": "0.0.
|
|
60
|
-
"@tutti-os/ui-system": "0.0.
|
|
61
|
-
"@tutti-os/workbench-surface": "0.0.
|
|
62
|
-
"@tutti-os/workspace-file-reference": "0.0.
|
|
63
|
-
"@tutti-os/workspace-file-preview": "0.0.
|
|
64
|
-
"@tutti-os/workspace-user-project": "0.0.
|
|
57
|
+
"@tutti-os/ui-i18n-runtime": "0.0.47",
|
|
58
|
+
"@tutti-os/ui-react-hooks": "0.0.47",
|
|
59
|
+
"@tutti-os/ui-rich-text": "0.0.47",
|
|
60
|
+
"@tutti-os/ui-system": "0.0.47",
|
|
61
|
+
"@tutti-os/workbench-surface": "0.0.47",
|
|
62
|
+
"@tutti-os/workspace-file-reference": "0.0.47",
|
|
63
|
+
"@tutti-os/workspace-file-preview": "0.0.47",
|
|
64
|
+
"@tutti-os/workspace-user-project": "0.0.47",
|
|
65
65
|
"valtio": "^2.3.2"
|
|
66
66
|
},
|
|
67
67
|
"devDependencies": {
|