@tutti-os/workspace-issue-manager 0.0.32 → 0.0.33

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,7 +1,7 @@
1
1
  import {
2
2
  normalizeIssueManagerContent,
3
3
  normalizeIssueManagerNodeState
4
- } from "./chunk-ETRH7S2A.js";
4
+ } from "./chunk-MQSZDN7T.js";
5
5
 
6
6
  // src/services/internal/model.ts
7
7
  import { formatTuttiShortDateTime } from "@tutti-os/ui-system/date-format";
@@ -990,4 +990,4 @@ export {
990
990
  persistIssueManagerTaskDraftContent,
991
991
  createIssueManagerControllerService
992
992
  };
993
- //# sourceMappingURL=chunk-SKXBZIGI.js.map
993
+ //# sourceMappingURL=chunk-AFYBY6G4.js.map
@@ -24,7 +24,7 @@ import {
24
24
  resolveIssueManagerTopicDeleteErrorMessage,
25
25
  toContextRefInput,
26
26
  toIssueManagerWorkspaceFileLinkInput
27
- } from "./chunk-SKXBZIGI.js";
27
+ } from "./chunk-AFYBY6G4.js";
28
28
  import {
29
29
  appendIssueManagerWorkspaceFileLinksToContent,
30
30
  appendIssueManagerWorkspaceReferenceMentionsToContent,
@@ -36,7 +36,7 @@ import {
36
36
  issueManagerSidebarMinWidth,
37
37
  normalizeIssueManagerContent,
38
38
  shouldAutoCollapseIssueManagerSidebar
39
- } from "./chunk-ETRH7S2A.js";
39
+ } from "./chunk-MQSZDN7T.js";
40
40
 
41
41
  // src/ui/react/internal/shell/IssueManagerNodeState.ts
42
42
  import { useEffect, useEffectEvent, useState } from "react";
@@ -6549,4 +6549,4 @@ export {
6549
6549
  IssueManagerNode,
6550
6550
  IssueManagerNodeHeader
6551
6551
  };
6552
- //# sourceMappingURL=chunk-DYOOXQA7.js.map
6552
+ //# sourceMappingURL=chunk-AM6P2Q3K.js.map
@@ -101,10 +101,6 @@ function createIssueManagerWorkspaceReferenceMentionMarkdown(input) {
101
101
  if (groupId) {
102
102
  scope.groupId = groupId;
103
103
  }
104
- const iconUrl = input.iconUrl?.trim();
105
- if (iconUrl) {
106
- scope.icon = iconUrl;
107
- }
108
104
  if (input.fileCount != null && input.fileCount > 0) {
109
105
  scope.count = String(input.fileCount);
110
106
  }
@@ -363,4 +359,4 @@ export {
363
359
  buildIssueManagerRunPrompt,
364
360
  buildIssueManagerTaskBreakdownPrompt
365
361
  };
366
- //# sourceMappingURL=chunk-ETRH7S2A.js.map
362
+ //# sourceMappingURL=chunk-MQSZDN7T.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/feature.ts","../src/core/content.ts","../src/core/layout.ts","../src/core/workspaceIssueMention.ts","../src/core/runPrompt.ts"],"sourcesContent":["import type { I18nRuntime } from \"@tutti-os/ui-i18n-runtime\";\nimport type { RichTextMentionAttrs } from \"@tutti-os/ui-rich-text/types\";\nimport {\n createWorkspaceUserProjectI18nRuntime,\n type WorkspaceUserProjectI18nRuntime\n} from \"@tutti-os/workspace-user-project/i18n\";\nimport type { ReferenceSourceAggregator } from \"@tutti-os/workspace-file-reference/core\";\nimport {\n createIssueManagerI18nRuntime,\n type IssueManagerI18nRuntime\n} from \"../i18n/issueManagerI18n.ts\";\nimport type {\n IssueManagerAgentBreakdownLauncher,\n IssueManagerAgentProviderOptionsAdapter,\n IssueManagerAnalyticsAdapter,\n IssueManagerExecutionDirectoryPicker,\n IssueManagerAgentSessionOpener,\n IssueManagerAgentRunner,\n IssueManagerBackend,\n IssueManagerEventSource,\n IssueManagerFileAdapter,\n IssueManagerIdentityAdapter,\n IssueManagerNodeState,\n IssueManagerShareAdapter\n} from \"../contracts/index.ts\";\n\nexport interface IssueManagerNotificationSink {\n tips(title: string): void;\n}\n\nexport interface IssueManagerMentionActionHandler {\n openMention(input: {\n mention: RichTextMentionAttrs;\n workspaceId: string;\n }): Promise<void> | void;\n}\n\nexport interface IssueManagerFeatureUIConfig {\n showInviteCollaborator: boolean;\n}\n\nexport interface IssueManagerFeature {\n agentBreakdownLauncher?: IssueManagerAgentBreakdownLauncher;\n analytics?: IssueManagerAnalyticsAdapter;\n agentProviderOptions?: IssueManagerAgentProviderOptionsAdapter;\n agentSessionOpener?: IssueManagerAgentSessionOpener;\n agentRunner: IssueManagerAgentRunner;\n backend: IssueManagerBackend;\n eventSource?: IssueManagerEventSource;\n executionDirectoryPicker?: IssueManagerExecutionDirectoryPicker;\n fileAdapter?: IssueManagerFileAdapter;\n i18n: IssueManagerI18nRuntime;\n identityAdapter: IssueManagerIdentityAdapter;\n mentionActionHandler?: IssueManagerMentionActionHandler;\n notifications?: IssueManagerNotificationSink;\n referenceSourceAggregator?: ReferenceSourceAggregator;\n shareAdapter?: IssueManagerShareAdapter;\n ui: IssueManagerFeatureUIConfig;\n workspaceUserProjectI18n: WorkspaceUserProjectI18nRuntime;\n}\n\nexport interface CreateIssueManagerFeatureInput {\n agentBreakdownLauncher?: IssueManagerAgentBreakdownLauncher;\n analytics?: IssueManagerAnalyticsAdapter;\n agentProviderOptions?: IssueManagerAgentProviderOptionsAdapter;\n agentSessionOpener?: IssueManagerAgentSessionOpener;\n agentRunner: IssueManagerAgentRunner;\n backend: IssueManagerBackend;\n eventSource?: IssueManagerEventSource;\n executionDirectoryPicker?: IssueManagerExecutionDirectoryPicker;\n fileAdapter?: IssueManagerFileAdapter;\n i18n?: I18nRuntime<string>;\n identityAdapter: IssueManagerIdentityAdapter;\n mentionActionHandler?: IssueManagerMentionActionHandler;\n notifications?: IssueManagerNotificationSink;\n referenceSourceAggregator?: ReferenceSourceAggregator;\n shareAdapter?: IssueManagerShareAdapter;\n ui?: Partial<IssueManagerFeatureUIConfig>;\n}\n\nexport const defaultIssueManagerNodeState: IssueManagerNodeState = {\n activeTopicId: null,\n issueSearchQuery: \"\",\n issueStatusFilter: \"all\",\n selectedAgentProvider: \"codex\",\n selectedExecutionDirectory: null,\n selectedIssueId: null,\n selectedTaskId: null,\n taskListCollapsed: false\n};\n\nexport function createIssueManagerFeature(\n input: CreateIssueManagerFeatureInput\n): IssueManagerFeature {\n return {\n agentBreakdownLauncher: input.agentBreakdownLauncher,\n analytics: input.analytics,\n agentProviderOptions: input.agentProviderOptions,\n agentSessionOpener: input.agentSessionOpener,\n agentRunner: input.agentRunner,\n backend: input.backend,\n eventSource: input.eventSource,\n executionDirectoryPicker: input.executionDirectoryPicker,\n fileAdapter: input.fileAdapter,\n i18n: createIssueManagerI18nRuntime(input.i18n),\n identityAdapter: input.identityAdapter,\n mentionActionHandler: input.mentionActionHandler,\n notifications: input.notifications,\n referenceSourceAggregator: input.referenceSourceAggregator,\n shareAdapter: input.shareAdapter,\n ui: {\n showInviteCollaborator: input.ui?.showInviteCollaborator ?? true\n },\n workspaceUserProjectI18n: createWorkspaceUserProjectI18nRuntime(input.i18n)\n };\n}\n\nexport function normalizeIssueManagerNodeState(\n state: Partial<IssueManagerNodeState> | null | undefined\n): IssueManagerNodeState {\n return {\n ...defaultIssueManagerNodeState,\n ...state,\n activeTopicId: normalizeNullableString(state?.activeTopicId),\n issueSearchQuery: state?.issueSearchQuery?.trim() ?? \"\",\n issueStatusFilter: state?.issueStatusFilter ?? \"all\",\n selectedAgentProvider: state?.selectedAgentProvider?.trim() || \"codex\",\n selectedExecutionDirectory: normalizeNullableString(\n state?.selectedExecutionDirectory\n ),\n selectedIssueId: normalizeNullableString(state?.selectedIssueId),\n selectedTaskId: normalizeNullableString(state?.selectedTaskId),\n taskListCollapsed: state?.taskListCollapsed === true\n };\n}\n\nfunction normalizeNullableString(\n value: string | null | undefined\n): string | null {\n const trimmed = value?.trim() ?? \"\";\n return trimmed.length > 0 ? trimmed : null;\n}\n","import {\n appendRichTextLinksToContent,\n createRichTextLinkMarkdown,\n createRichTextMentionHref,\n createRichTextMentionMarkdown,\n extractPlainTextFromContent,\n extractPlainTextWithoutFilesFromContent,\n extractRichTextLinksFromContent,\n extractRichTextMentionsFromContent,\n normalizeRichTextContent,\n normalizeRichTextLinkHref,\n parseRichTextMentionHref,\n removeRichTextLinkFromContent,\n removeRichTextMentionFromContent\n} from \"@tutti-os/ui-rich-text/core\";\nimport type {\n RichTextLinkInput,\n RichTextLinkRef\n} from \"@tutti-os/ui-rich-text/core\";\nimport type { RichTextMentionAttrs } from \"@tutti-os/ui-rich-text/types\";\n\nexport type IssueManagerWorkspaceFileLinkRef = RichTextLinkRef;\nexport type IssueManagerWorkspaceFileLinkInput = RichTextLinkInput;\n\nexport type IssueManagerMentionRef = RichTextMentionAttrs;\nexport type IssueManagerMentionAttrs = RichTextMentionAttrs;\n\nexport const normalizeIssueManagerContent = normalizeRichTextContent;\n\nexport const normalizeIssueManagerWorkspaceFileLinkHref =\n normalizeRichTextLinkHref;\n\nexport const createIssueManagerWorkspaceFileLinkMarkdown =\n createRichTextLinkMarkdown;\n\nexport const appendIssueManagerWorkspaceFileLinksToContent =\n appendRichTextLinksToContent;\n\nexport const extractIssueManagerWorkspaceFileLinksFromContent =\n extractRichTextLinksFromContent;\n\nexport const removeIssueManagerWorkspaceFileLinkFromContent =\n removeRichTextLinkFromContent;\n\nexport const extractIssueManagerPlainTextFromContent =\n extractPlainTextFromContent;\n\nexport const extractIssueManagerPlainTextWithoutFilesFromContent =\n extractPlainTextWithoutFilesFromContent;\n\nexport const createIssueManagerMentionHref = createRichTextMentionHref;\nexport const createIssueManagerMentionMarkdown = createRichTextMentionMarkdown;\nexport const parseIssueManagerMentionHref = parseRichTextMentionHref;\n\nexport interface IssueManagerWorkspaceReferenceMentionInput {\n source: \"app\" | \"task\";\n id: string;\n groupId?: string | null;\n displayName: string;\n iconUrl?: string | null;\n fileCount?: number;\n workspaceId: string;\n}\n\n/**\n * 把一个「项目/分组」折叠成单条 `mention://workspace-reference/...` chip 的 markdown。\n * 句柄(source + id + groupId)随 query 编码,运行时交给 agent 解析;count 仅供展示。\n * 与 agent 端 `buildAgentWorkspaceReferenceMentionHref` 的参数名保持一致。\n */\nexport function createIssueManagerWorkspaceReferenceMentionMarkdown(\n input: IssueManagerWorkspaceReferenceMentionInput\n): string {\n const id = input.id.trim();\n const displayName = input.displayName.trim();\n if (!id || !displayName) {\n return \"\";\n }\n const scope: Record<string, string> = {\n workspaceId: input.workspaceId,\n source: input.source\n };\n const groupId = input.groupId?.trim();\n if (groupId) {\n scope.groupId = groupId;\n }\n if (input.fileCount != null && input.fileCount > 0) {\n scope.count = String(input.fileCount);\n }\n return createRichTextMentionMarkdown({\n providerId: \"workspace-reference\",\n entityId: id,\n label: displayName,\n scope\n });\n}\n\n/**\n * 把若干项目 chip 追加到内容尾部(以空格分隔,沿用文件链接的拼接形态)。\n */\nexport function appendIssueManagerWorkspaceReferenceMentionsToContent(\n content: string,\n bundles: readonly IssueManagerWorkspaceReferenceMentionInput[]\n): string {\n const base = normalizeRichTextContent(content);\n const rendered = bundles\n .map((bundle) =>\n createIssueManagerWorkspaceReferenceMentionMarkdown(bundle)\n )\n .filter((markdown) => markdown.length > 0);\n if (rendered.length === 0) {\n return base;\n }\n return base ? `${base} ${rendered.join(\" \")}` : rendered.join(\" \");\n}\nexport const extractIssueManagerMentionsFromContent =\n extractRichTextMentionsFromContent;\nexport const removeIssueManagerMentionFromContent =\n removeRichTextMentionFromContent;\n","export const issueManagerSidebarDefaultWidth = 280;\nexport const issueManagerSidebarMinWidth = 248;\nexport const issueManagerSidebarMaxWidth = 520;\nexport const issueManagerMainMinWidth = 420;\nexport const issueManagerDefaultNodeFrameWidth = 860;\nexport const issueManagerExpandedFrameMinWidth =\n issueManagerSidebarMinWidth + issueManagerMainMinWidth;\n\nexport function clampIssueManagerSidebarWidth(\n width: number,\n layoutWidth: number\n): number {\n const maxWidth = Math.max(\n issueManagerSidebarMinWidth,\n Math.min(\n issueManagerSidebarMaxWidth,\n layoutWidth - issueManagerMainMinWidth\n )\n );\n return Math.min(Math.max(width, issueManagerSidebarMinWidth), maxWidth);\n}\n\nexport function shouldAutoCollapseIssueManagerSidebar(\n containerWidth: number\n): boolean {\n return (\n Number.isFinite(containerWidth) &&\n containerWidth > 0 &&\n Math.round(containerWidth) < issueManagerExpandedFrameMinWidth\n );\n}\n\nexport function resolveIssueManagerExpandedFrame<\n TFrame extends { width: number; x: number }\n>(frame: TFrame, surfaceWidth: number): TFrame {\n const preferredWidth = Math.max(\n issueManagerExpandedFrameMinWidth,\n Math.min(\n issueManagerDefaultNodeFrameWidth,\n frame.width + issueManagerSidebarDefaultWidth\n )\n );\n const width = Math.min(\n Math.max(frame.width, preferredWidth),\n Math.max(frame.width, surfaceWidth)\n );\n\n return {\n ...frame,\n width,\n x: Math.max(0, Math.min(frame.x, surfaceWidth - width))\n };\n}\n","export type WorkspaceIssueMentionMode = \"breakdown\" | \"execute\";\n\nexport interface BuildWorkspaceIssueMentionHrefInput {\n issueId: string;\n mode?: WorkspaceIssueMentionMode;\n outputDir?: string | null;\n runId?: string | null;\n taskId?: string | null;\n topicId?: string | null;\n workspaceId: string;\n}\n\nexport interface ParsedWorkspaceIssueMention {\n issueId: string;\n mode?: WorkspaceIssueMentionMode;\n outputDir?: string;\n runId?: string;\n taskId?: string;\n topicId?: string;\n workspaceId: string;\n}\n\nexport function buildWorkspaceIssueMentionHref(\n input: BuildWorkspaceIssueMentionHrefInput\n): string {\n const workspaceId = input.workspaceId.trim();\n const issueId = input.issueId.trim();\n if (!workspaceId || !issueId) {\n return \"\";\n }\n\n const params = new URLSearchParams({\n workspaceId\n });\n appendWorkspaceIssueMentionParam(params, \"topicId\", input.topicId);\n appendWorkspaceIssueMentionParam(\n params,\n \"mode\",\n normalizeMentionMode(input.mode)\n );\n appendWorkspaceIssueMentionParam(params, \"taskId\", input.taskId);\n appendWorkspaceIssueMentionParam(params, \"runId\", input.runId);\n appendWorkspaceIssueMentionParam(params, \"outputDir\", input.outputDir);\n return [\n `mention://workspace-issue/${encodeURIComponent(issueId)}`,\n params.toString()\n ].join(\"?\");\n}\n\nexport function parseWorkspaceIssueMentionHref(\n href: string\n): ParsedWorkspaceIssueMention | null {\n const trimmedHref = href.trim();\n if (!trimmedHref.toLowerCase().startsWith(\"mention://workspace-issue\")) {\n return null;\n }\n\n let url: URL;\n try {\n url = new URL(trimmedHref);\n } catch {\n return null;\n }\n if (url.protocol !== \"mention:\" || url.hostname !== \"workspace-issue\") {\n return null;\n }\n if (hasUnsupportedWorkspaceIssueMentionParam(url.searchParams)) {\n return null;\n }\n\n const workspaceId = url.searchParams.get(\"workspaceId\")?.trim() || \"\";\n const issueId = safeDecodeURIComponent(\n url.pathname.replace(/^\\/+/, \"\")\n ).trim();\n if (!workspaceId || !issueId) {\n return null;\n }\n\n const mode = normalizeMentionMode(url.searchParams.get(\"mode\"));\n const topicId = optionalSearchParam(url.searchParams, \"topicId\");\n const taskId = optionalSearchParam(url.searchParams, \"taskId\");\n const runId = optionalSearchParam(url.searchParams, \"runId\");\n const outputDir = optionalSearchParam(url.searchParams, \"outputDir\");\n\n return {\n issueId,\n ...(mode ? { mode } : {}),\n ...(outputDir ? { outputDir } : {}),\n ...(runId ? { runId } : {}),\n ...(taskId ? { taskId } : {}),\n ...(topicId ? { topicId } : {}),\n workspaceId\n };\n}\n\nfunction appendWorkspaceIssueMentionParam(\n params: URLSearchParams,\n key: string,\n value: string | null | undefined\n): void {\n const normalized = value?.trim() || \"\";\n if (normalized) {\n params.set(key, normalized);\n }\n}\n\nfunction optionalSearchParam(\n params: URLSearchParams,\n key: string\n): string | undefined {\n const value = params.get(key)?.trim() || \"\";\n return value || undefined;\n}\n\nconst workspaceIssueMentionQueryParams = new Set([\n \"workspaceId\",\n \"topicId\",\n \"mode\",\n \"taskId\",\n \"runId\",\n \"outputDir\"\n]);\n\nfunction hasUnsupportedWorkspaceIssueMentionParam(\n params: URLSearchParams\n): boolean {\n return [...params.keys()].some((key) => {\n const normalizedKey = key.trim();\n return (\n !workspaceIssueMentionQueryParams.has(normalizedKey) ||\n normalizedKey.startsWith(\"meta.\")\n );\n });\n}\n\nfunction safeDecodeURIComponent(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return \"\";\n }\n}\n\nfunction normalizeMentionMode(\n value: string | null | undefined\n): WorkspaceIssueMentionMode | undefined {\n return value === \"breakdown\" || value === \"execute\" ? value : undefined;\n}\n","import type {\n IssueManagerContextRef,\n IssueManagerIssueSummary,\n IssueManagerTaskSummary\n} from \"../contracts/index.ts\";\nimport type { IssueManagerI18nRuntime } from \"../i18n/issueManagerI18n.ts\";\nimport { buildWorkspaceIssueMentionHref } from \"./workspaceIssueMention.ts\";\n\ntype IssueManagerPromptCopy = Pick<IssueManagerI18nRuntime, \"t\">;\n\nexport function resolveIssueManagerWorkspaceRuntimePath(\n workspaceRoot: string,\n requestedPath: string\n): string {\n const normalizedWorkspaceRoot = workspaceRoot.trim().replace(/\\/+$/, \"\");\n const normalizedRequestedPath = requestedPath.trim();\n\n if (!normalizedWorkspaceRoot || !normalizedRequestedPath) {\n return normalizedRequestedPath;\n }\n\n if (\n normalizedRequestedPath === normalizedWorkspaceRoot ||\n normalizedRequestedPath.startsWith(`${normalizedWorkspaceRoot}/`)\n ) {\n return normalizedRequestedPath;\n }\n\n if (normalizedRequestedPath === \"/workspace\") {\n return normalizedWorkspaceRoot;\n }\n\n if (normalizedRequestedPath.startsWith(\"/workspace/\")) {\n return `${normalizedWorkspaceRoot}/${normalizedRequestedPath.slice(\"/workspace/\".length)}`;\n }\n\n if (!normalizedRequestedPath.startsWith(\"/\")) {\n return `${normalizedWorkspaceRoot}/${normalizedRequestedPath.replace(/^\\/+/, \"\")}`;\n }\n\n return normalizedRequestedPath;\n}\n\nexport function buildIssueManagerRunPrompt(input: {\n copy?: IssueManagerPromptCopy;\n issue: IssueManagerIssueSummary;\n task?: IssueManagerTaskSummary;\n workspaceRoot: string;\n}): string {\n const mentionMarkdown = buildIssueManagerIssueMention({\n issue: input.issue,\n task: input.task,\n mode: \"execute\"\n });\n return [\n input.copy?.t(\"runPrompts.executeIntro\") ?? \"Handle this task reference.\",\n \"\",\n mentionMarkdown\n ].join(\"\\n\");\n}\n\nexport function buildIssueManagerTaskBreakdownPrompt(input: {\n copy?: IssueManagerPromptCopy;\n issueDetail: {\n contextRefs: readonly IssueManagerContextRef[];\n issue: IssueManagerIssueSummary;\n tasks: readonly IssueManagerTaskSummary[];\n };\n workspaceId: string;\n}): string {\n const issue = input.issueDetail.issue;\n const issueMention = buildIssueManagerIssueMention({\n issue,\n mode: \"breakdown\"\n });\n\n return [\n input.copy?.t(\"runPrompts.breakdownIntro\") ??\n \"Break this task reference down into executable tasks.\",\n \"\",\n issueMention\n ].join(\"\\n\");\n}\n\nfunction buildIssueManagerIssueMention(input: {\n issue: IssueManagerIssueSummary;\n task?: IssueManagerTaskSummary;\n mode: \"breakdown\" | \"execute\";\n outputDir?: string | null;\n runId?: string | null;\n}): string {\n const labelParts = [input.issue.title.trim(), input.task?.title.trim() || \"\"]\n .filter(Boolean)\n .map((value) =>\n escapeIssueManagerMentionLabel(value.replace(/^@+/, \"\").trim())\n );\n const href = buildWorkspaceIssueMentionHref({\n issueId: input.issue.issueId,\n mode: input.mode,\n outputDir: input.outputDir,\n runId: input.runId,\n taskId: input.task?.taskId,\n topicId: input.issue.topicId,\n workspaceId: input.issue.workspaceId\n });\n return `[@${labelParts.join(\" / \")}](${href})`;\n}\n\nfunction escapeIssueManagerMentionLabel(value: string): string {\n return value\n .replaceAll(\"\\\\\", \"\\\\\\\\\")\n .replaceAll(\"[\", \"\\\\[\")\n .replaceAll(\"]\", \"\\\\]\")\n .replaceAll(\"\\r\", \" \")\n .replaceAll(\"\\n\", \" \");\n}\n"],"mappings":"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","names":[]}
@@ -35,7 +35,7 @@ interface IssueManagerWorkspaceReferenceMentionInput {
35
35
  }
36
36
  /**
37
37
  * 把一个「项目/分组」折叠成单条 `mention://workspace-reference/...` chip 的 markdown。
38
- * 句柄(source + id + groupId)随 query 编码,运行时交给 agent 解析;icon/count 仅供展示。
38
+ * 句柄(source + id + groupId)随 query 编码,运行时交给 agent 解析;count 仅供展示。
39
39
  * 与 agent 端 `buildAgentWorkspaceReferenceMentionHref` 的参数名保持一致。
40
40
  */
41
41
  declare function createIssueManagerWorkspaceReferenceMentionMarkdown(input: IssueManagerWorkspaceReferenceMentionInput): string;
@@ -31,7 +31,7 @@ import {
31
31
  resolveIssueManagerExpandedFrame,
32
32
  resolveIssueManagerWorkspaceRuntimePath,
33
33
  shouldAutoCollapseIssueManagerSidebar
34
- } from "../chunk-ETRH7S2A.js";
34
+ } from "../chunk-MQSZDN7T.js";
35
35
  import "../chunk-UR3NVHQY.js";
36
36
  export {
37
37
  appendIssueManagerWorkspaceFileLinksToContent,
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ import {
9
9
  resolveIssueManagerPriorityLabel,
10
10
  resolveIssueManagerStatusLabel,
11
11
  uniqueIssueManagerFileReferences
12
- } from "./chunk-SKXBZIGI.js";
12
+ } from "./chunk-AFYBY6G4.js";
13
13
  import {
14
14
  appendIssueManagerWorkspaceFileLinksToContent,
15
15
  appendIssueManagerWorkspaceReferenceMentionsToContent,
@@ -43,7 +43,7 @@ import {
43
43
  resolveIssueManagerExpandedFrame,
44
44
  resolveIssueManagerWorkspaceRuntimePath,
45
45
  shouldAutoCollapseIssueManagerSidebar
46
- } from "./chunk-ETRH7S2A.js";
46
+ } from "./chunk-MQSZDN7T.js";
47
47
  import {
48
48
  createIssueManagerI18nRuntime,
49
49
  issueManagerI18nModule,
@@ -8,8 +8,8 @@ import {
8
8
  resolveIssueManagerPriorityLabel,
9
9
  resolveIssueManagerStatusLabel,
10
10
  uniqueIssueManagerFileReferences
11
- } from "../chunk-SKXBZIGI.js";
12
- import "../chunk-ETRH7S2A.js";
11
+ } from "../chunk-AFYBY6G4.js";
12
+ import "../chunk-MQSZDN7T.js";
13
13
  import "../chunk-UR3NVHQY.js";
14
14
  export {
15
15
  createIssueManagerControllerService,
package/dist/ui/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  IssueManagerNode,
3
3
  IssueManagerNodeHeader
4
- } from "../chunk-DYOOXQA7.js";
5
- import "../chunk-SKXBZIGI.js";
6
- import "../chunk-ETRH7S2A.js";
4
+ } from "../chunk-AM6P2Q3K.js";
5
+ import "../chunk-AFYBY6G4.js";
6
+ import "../chunk-MQSZDN7T.js";
7
7
  import "../chunk-UR3NVHQY.js";
8
8
  export {
9
9
  IssueManagerNode,
@@ -2,13 +2,13 @@ import {
2
2
  IssueManagerNode,
3
3
  IssueManagerNodeHeader,
4
4
  dispatchIssueManagerTaskListCollapsed
5
- } from "../chunk-DYOOXQA7.js";
6
- import "../chunk-SKXBZIGI.js";
5
+ } from "../chunk-AM6P2Q3K.js";
6
+ import "../chunk-AFYBY6G4.js";
7
7
  import {
8
8
  normalizeIssueManagerNodeState,
9
9
  resolveIssueManagerExpandedFrame,
10
10
  shouldAutoCollapseIssueManagerSidebar
11
- } from "../chunk-ETRH7S2A.js";
11
+ } from "../chunk-MQSZDN7T.js";
12
12
  import "../chunk-UR3NVHQY.js";
13
13
  import {
14
14
  defaultIssueManagerNodeFrame,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tutti-os/workspace-issue-manager",
3
- "version": "0.0.32",
3
+ "version": "0.0.33",
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.32",
58
- "@tutti-os/ui-react-hooks": "0.0.32",
59
- "@tutti-os/ui-rich-text": "0.0.32",
60
- "@tutti-os/ui-system": "0.0.32",
61
- "@tutti-os/workbench-surface": "0.0.32",
62
- "@tutti-os/workspace-file-reference": "0.0.32",
63
- "@tutti-os/workspace-file-preview": "0.0.32",
64
- "@tutti-os/workspace-user-project": "0.0.32",
57
+ "@tutti-os/ui-i18n-runtime": "0.0.33",
58
+ "@tutti-os/ui-react-hooks": "0.0.33",
59
+ "@tutti-os/ui-rich-text": "0.0.33",
60
+ "@tutti-os/ui-system": "0.0.33",
61
+ "@tutti-os/workbench-surface": "0.0.33",
62
+ "@tutti-os/workspace-file-reference": "0.0.33",
63
+ "@tutti-os/workspace-file-preview": "0.0.33",
64
+ "@tutti-os/workspace-user-project": "0.0.33",
65
65
  "valtio": "^2.3.2"
66
66
  },
67
67
  "devDependencies": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/feature.ts","../src/core/content.ts","../src/core/layout.ts","../src/core/workspaceIssueMention.ts","../src/core/runPrompt.ts"],"sourcesContent":["import type { I18nRuntime } from \"@tutti-os/ui-i18n-runtime\";\nimport type { RichTextMentionAttrs } from \"@tutti-os/ui-rich-text/types\";\nimport {\n createWorkspaceUserProjectI18nRuntime,\n type WorkspaceUserProjectI18nRuntime\n} from \"@tutti-os/workspace-user-project/i18n\";\nimport type { ReferenceSourceAggregator } from \"@tutti-os/workspace-file-reference/core\";\nimport {\n createIssueManagerI18nRuntime,\n type IssueManagerI18nRuntime\n} from \"../i18n/issueManagerI18n.ts\";\nimport type {\n IssueManagerAgentBreakdownLauncher,\n IssueManagerAgentProviderOptionsAdapter,\n IssueManagerAnalyticsAdapter,\n IssueManagerExecutionDirectoryPicker,\n IssueManagerAgentSessionOpener,\n IssueManagerAgentRunner,\n IssueManagerBackend,\n IssueManagerEventSource,\n IssueManagerFileAdapter,\n IssueManagerIdentityAdapter,\n IssueManagerNodeState,\n IssueManagerShareAdapter\n} from \"../contracts/index.ts\";\n\nexport interface IssueManagerNotificationSink {\n tips(title: string): void;\n}\n\nexport interface IssueManagerMentionActionHandler {\n openMention(input: {\n mention: RichTextMentionAttrs;\n workspaceId: string;\n }): Promise<void> | void;\n}\n\nexport interface IssueManagerFeatureUIConfig {\n showInviteCollaborator: boolean;\n}\n\nexport interface IssueManagerFeature {\n agentBreakdownLauncher?: IssueManagerAgentBreakdownLauncher;\n analytics?: IssueManagerAnalyticsAdapter;\n agentProviderOptions?: IssueManagerAgentProviderOptionsAdapter;\n agentSessionOpener?: IssueManagerAgentSessionOpener;\n agentRunner: IssueManagerAgentRunner;\n backend: IssueManagerBackend;\n eventSource?: IssueManagerEventSource;\n executionDirectoryPicker?: IssueManagerExecutionDirectoryPicker;\n fileAdapter?: IssueManagerFileAdapter;\n i18n: IssueManagerI18nRuntime;\n identityAdapter: IssueManagerIdentityAdapter;\n mentionActionHandler?: IssueManagerMentionActionHandler;\n notifications?: IssueManagerNotificationSink;\n referenceSourceAggregator?: ReferenceSourceAggregator;\n shareAdapter?: IssueManagerShareAdapter;\n ui: IssueManagerFeatureUIConfig;\n workspaceUserProjectI18n: WorkspaceUserProjectI18nRuntime;\n}\n\nexport interface CreateIssueManagerFeatureInput {\n agentBreakdownLauncher?: IssueManagerAgentBreakdownLauncher;\n analytics?: IssueManagerAnalyticsAdapter;\n agentProviderOptions?: IssueManagerAgentProviderOptionsAdapter;\n agentSessionOpener?: IssueManagerAgentSessionOpener;\n agentRunner: IssueManagerAgentRunner;\n backend: IssueManagerBackend;\n eventSource?: IssueManagerEventSource;\n executionDirectoryPicker?: IssueManagerExecutionDirectoryPicker;\n fileAdapter?: IssueManagerFileAdapter;\n i18n?: I18nRuntime<string>;\n identityAdapter: IssueManagerIdentityAdapter;\n mentionActionHandler?: IssueManagerMentionActionHandler;\n notifications?: IssueManagerNotificationSink;\n referenceSourceAggregator?: ReferenceSourceAggregator;\n shareAdapter?: IssueManagerShareAdapter;\n ui?: Partial<IssueManagerFeatureUIConfig>;\n}\n\nexport const defaultIssueManagerNodeState: IssueManagerNodeState = {\n activeTopicId: null,\n issueSearchQuery: \"\",\n issueStatusFilter: \"all\",\n selectedAgentProvider: \"codex\",\n selectedExecutionDirectory: null,\n selectedIssueId: null,\n selectedTaskId: null,\n taskListCollapsed: false\n};\n\nexport function createIssueManagerFeature(\n input: CreateIssueManagerFeatureInput\n): IssueManagerFeature {\n return {\n agentBreakdownLauncher: input.agentBreakdownLauncher,\n analytics: input.analytics,\n agentProviderOptions: input.agentProviderOptions,\n agentSessionOpener: input.agentSessionOpener,\n agentRunner: input.agentRunner,\n backend: input.backend,\n eventSource: input.eventSource,\n executionDirectoryPicker: input.executionDirectoryPicker,\n fileAdapter: input.fileAdapter,\n i18n: createIssueManagerI18nRuntime(input.i18n),\n identityAdapter: input.identityAdapter,\n mentionActionHandler: input.mentionActionHandler,\n notifications: input.notifications,\n referenceSourceAggregator: input.referenceSourceAggregator,\n shareAdapter: input.shareAdapter,\n ui: {\n showInviteCollaborator: input.ui?.showInviteCollaborator ?? true\n },\n workspaceUserProjectI18n: createWorkspaceUserProjectI18nRuntime(input.i18n)\n };\n}\n\nexport function normalizeIssueManagerNodeState(\n state: Partial<IssueManagerNodeState> | null | undefined\n): IssueManagerNodeState {\n return {\n ...defaultIssueManagerNodeState,\n ...state,\n activeTopicId: normalizeNullableString(state?.activeTopicId),\n issueSearchQuery: state?.issueSearchQuery?.trim() ?? \"\",\n issueStatusFilter: state?.issueStatusFilter ?? \"all\",\n selectedAgentProvider: state?.selectedAgentProvider?.trim() || \"codex\",\n selectedExecutionDirectory: normalizeNullableString(\n state?.selectedExecutionDirectory\n ),\n selectedIssueId: normalizeNullableString(state?.selectedIssueId),\n selectedTaskId: normalizeNullableString(state?.selectedTaskId),\n taskListCollapsed: state?.taskListCollapsed === true\n };\n}\n\nfunction normalizeNullableString(\n value: string | null | undefined\n): string | null {\n const trimmed = value?.trim() ?? \"\";\n return trimmed.length > 0 ? trimmed : null;\n}\n","import {\n appendRichTextLinksToContent,\n createRichTextLinkMarkdown,\n createRichTextMentionHref,\n createRichTextMentionMarkdown,\n extractPlainTextFromContent,\n extractPlainTextWithoutFilesFromContent,\n extractRichTextLinksFromContent,\n extractRichTextMentionsFromContent,\n normalizeRichTextContent,\n normalizeRichTextLinkHref,\n parseRichTextMentionHref,\n removeRichTextLinkFromContent,\n removeRichTextMentionFromContent\n} from \"@tutti-os/ui-rich-text/core\";\nimport type {\n RichTextLinkInput,\n RichTextLinkRef\n} from \"@tutti-os/ui-rich-text/core\";\nimport type { RichTextMentionAttrs } from \"@tutti-os/ui-rich-text/types\";\n\nexport type IssueManagerWorkspaceFileLinkRef = RichTextLinkRef;\nexport type IssueManagerWorkspaceFileLinkInput = RichTextLinkInput;\n\nexport type IssueManagerMentionRef = RichTextMentionAttrs;\nexport type IssueManagerMentionAttrs = RichTextMentionAttrs;\n\nexport const normalizeIssueManagerContent = normalizeRichTextContent;\n\nexport const normalizeIssueManagerWorkspaceFileLinkHref =\n normalizeRichTextLinkHref;\n\nexport const createIssueManagerWorkspaceFileLinkMarkdown =\n createRichTextLinkMarkdown;\n\nexport const appendIssueManagerWorkspaceFileLinksToContent =\n appendRichTextLinksToContent;\n\nexport const extractIssueManagerWorkspaceFileLinksFromContent =\n extractRichTextLinksFromContent;\n\nexport const removeIssueManagerWorkspaceFileLinkFromContent =\n removeRichTextLinkFromContent;\n\nexport const extractIssueManagerPlainTextFromContent =\n extractPlainTextFromContent;\n\nexport const extractIssueManagerPlainTextWithoutFilesFromContent =\n extractPlainTextWithoutFilesFromContent;\n\nexport const createIssueManagerMentionHref = createRichTextMentionHref;\nexport const createIssueManagerMentionMarkdown = createRichTextMentionMarkdown;\nexport const parseIssueManagerMentionHref = parseRichTextMentionHref;\n\nexport interface IssueManagerWorkspaceReferenceMentionInput {\n source: \"app\" | \"task\";\n id: string;\n groupId?: string | null;\n displayName: string;\n iconUrl?: string | null;\n fileCount?: number;\n workspaceId: string;\n}\n\n/**\n * 把一个「项目/分组」折叠成单条 `mention://workspace-reference/...` chip 的 markdown。\n * 句柄(source + id + groupId)随 query 编码,运行时交给 agent 解析;icon/count 仅供展示。\n * 与 agent 端 `buildAgentWorkspaceReferenceMentionHref` 的参数名保持一致。\n */\nexport function createIssueManagerWorkspaceReferenceMentionMarkdown(\n input: IssueManagerWorkspaceReferenceMentionInput\n): string {\n const id = input.id.trim();\n const displayName = input.displayName.trim();\n if (!id || !displayName) {\n return \"\";\n }\n const scope: Record<string, string> = {\n workspaceId: input.workspaceId,\n source: input.source\n };\n const groupId = input.groupId?.trim();\n if (groupId) {\n scope.groupId = groupId;\n }\n const iconUrl = input.iconUrl?.trim();\n if (iconUrl) {\n scope.icon = iconUrl;\n }\n if (input.fileCount != null && input.fileCount > 0) {\n scope.count = String(input.fileCount);\n }\n return createRichTextMentionMarkdown({\n providerId: \"workspace-reference\",\n entityId: id,\n label: displayName,\n scope\n });\n}\n\n/**\n * 把若干项目 chip 追加到内容尾部(以空格分隔,沿用文件链接的拼接形态)。\n */\nexport function appendIssueManagerWorkspaceReferenceMentionsToContent(\n content: string,\n bundles: readonly IssueManagerWorkspaceReferenceMentionInput[]\n): string {\n const base = normalizeRichTextContent(content);\n const rendered = bundles\n .map((bundle) =>\n createIssueManagerWorkspaceReferenceMentionMarkdown(bundle)\n )\n .filter((markdown) => markdown.length > 0);\n if (rendered.length === 0) {\n return base;\n }\n return base ? `${base} ${rendered.join(\" \")}` : rendered.join(\" \");\n}\nexport const extractIssueManagerMentionsFromContent =\n extractRichTextMentionsFromContent;\nexport const removeIssueManagerMentionFromContent =\n removeRichTextMentionFromContent;\n","export const issueManagerSidebarDefaultWidth = 280;\nexport const issueManagerSidebarMinWidth = 248;\nexport const issueManagerSidebarMaxWidth = 520;\nexport const issueManagerMainMinWidth = 420;\nexport const issueManagerDefaultNodeFrameWidth = 860;\nexport const issueManagerExpandedFrameMinWidth =\n issueManagerSidebarMinWidth + issueManagerMainMinWidth;\n\nexport function clampIssueManagerSidebarWidth(\n width: number,\n layoutWidth: number\n): number {\n const maxWidth = Math.max(\n issueManagerSidebarMinWidth,\n Math.min(\n issueManagerSidebarMaxWidth,\n layoutWidth - issueManagerMainMinWidth\n )\n );\n return Math.min(Math.max(width, issueManagerSidebarMinWidth), maxWidth);\n}\n\nexport function shouldAutoCollapseIssueManagerSidebar(\n containerWidth: number\n): boolean {\n return (\n Number.isFinite(containerWidth) &&\n containerWidth > 0 &&\n Math.round(containerWidth) < issueManagerExpandedFrameMinWidth\n );\n}\n\nexport function resolveIssueManagerExpandedFrame<\n TFrame extends { width: number; x: number }\n>(frame: TFrame, surfaceWidth: number): TFrame {\n const preferredWidth = Math.max(\n issueManagerExpandedFrameMinWidth,\n Math.min(\n issueManagerDefaultNodeFrameWidth,\n frame.width + issueManagerSidebarDefaultWidth\n )\n );\n const width = Math.min(\n Math.max(frame.width, preferredWidth),\n Math.max(frame.width, surfaceWidth)\n );\n\n return {\n ...frame,\n width,\n x: Math.max(0, Math.min(frame.x, surfaceWidth - width))\n };\n}\n","export type WorkspaceIssueMentionMode = \"breakdown\" | \"execute\";\n\nexport interface BuildWorkspaceIssueMentionHrefInput {\n issueId: string;\n mode?: WorkspaceIssueMentionMode;\n outputDir?: string | null;\n runId?: string | null;\n taskId?: string | null;\n topicId?: string | null;\n workspaceId: string;\n}\n\nexport interface ParsedWorkspaceIssueMention {\n issueId: string;\n mode?: WorkspaceIssueMentionMode;\n outputDir?: string;\n runId?: string;\n taskId?: string;\n topicId?: string;\n workspaceId: string;\n}\n\nexport function buildWorkspaceIssueMentionHref(\n input: BuildWorkspaceIssueMentionHrefInput\n): string {\n const workspaceId = input.workspaceId.trim();\n const issueId = input.issueId.trim();\n if (!workspaceId || !issueId) {\n return \"\";\n }\n\n const params = new URLSearchParams({\n workspaceId\n });\n appendWorkspaceIssueMentionParam(params, \"topicId\", input.topicId);\n appendWorkspaceIssueMentionParam(\n params,\n \"mode\",\n normalizeMentionMode(input.mode)\n );\n appendWorkspaceIssueMentionParam(params, \"taskId\", input.taskId);\n appendWorkspaceIssueMentionParam(params, \"runId\", input.runId);\n appendWorkspaceIssueMentionParam(params, \"outputDir\", input.outputDir);\n return [\n `mention://workspace-issue/${encodeURIComponent(issueId)}`,\n params.toString()\n ].join(\"?\");\n}\n\nexport function parseWorkspaceIssueMentionHref(\n href: string\n): ParsedWorkspaceIssueMention | null {\n const trimmedHref = href.trim();\n if (!trimmedHref.toLowerCase().startsWith(\"mention://workspace-issue\")) {\n return null;\n }\n\n let url: URL;\n try {\n url = new URL(trimmedHref);\n } catch {\n return null;\n }\n if (url.protocol !== \"mention:\" || url.hostname !== \"workspace-issue\") {\n return null;\n }\n if (hasUnsupportedWorkspaceIssueMentionParam(url.searchParams)) {\n return null;\n }\n\n const workspaceId = url.searchParams.get(\"workspaceId\")?.trim() || \"\";\n const issueId = safeDecodeURIComponent(\n url.pathname.replace(/^\\/+/, \"\")\n ).trim();\n if (!workspaceId || !issueId) {\n return null;\n }\n\n const mode = normalizeMentionMode(url.searchParams.get(\"mode\"));\n const topicId = optionalSearchParam(url.searchParams, \"topicId\");\n const taskId = optionalSearchParam(url.searchParams, \"taskId\");\n const runId = optionalSearchParam(url.searchParams, \"runId\");\n const outputDir = optionalSearchParam(url.searchParams, \"outputDir\");\n\n return {\n issueId,\n ...(mode ? { mode } : {}),\n ...(outputDir ? { outputDir } : {}),\n ...(runId ? { runId } : {}),\n ...(taskId ? { taskId } : {}),\n ...(topicId ? { topicId } : {}),\n workspaceId\n };\n}\n\nfunction appendWorkspaceIssueMentionParam(\n params: URLSearchParams,\n key: string,\n value: string | null | undefined\n): void {\n const normalized = value?.trim() || \"\";\n if (normalized) {\n params.set(key, normalized);\n }\n}\n\nfunction optionalSearchParam(\n params: URLSearchParams,\n key: string\n): string | undefined {\n const value = params.get(key)?.trim() || \"\";\n return value || undefined;\n}\n\nconst workspaceIssueMentionQueryParams = new Set([\n \"workspaceId\",\n \"topicId\",\n \"mode\",\n \"taskId\",\n \"runId\",\n \"outputDir\"\n]);\n\nfunction hasUnsupportedWorkspaceIssueMentionParam(\n params: URLSearchParams\n): boolean {\n return [...params.keys()].some((key) => {\n const normalizedKey = key.trim();\n return (\n !workspaceIssueMentionQueryParams.has(normalizedKey) ||\n normalizedKey.startsWith(\"meta.\")\n );\n });\n}\n\nfunction safeDecodeURIComponent(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return \"\";\n }\n}\n\nfunction normalizeMentionMode(\n value: string | null | undefined\n): WorkspaceIssueMentionMode | undefined {\n return value === \"breakdown\" || value === \"execute\" ? value : undefined;\n}\n","import type {\n IssueManagerContextRef,\n IssueManagerIssueSummary,\n IssueManagerTaskSummary\n} from \"../contracts/index.ts\";\nimport type { IssueManagerI18nRuntime } from \"../i18n/issueManagerI18n.ts\";\nimport { buildWorkspaceIssueMentionHref } from \"./workspaceIssueMention.ts\";\n\ntype IssueManagerPromptCopy = Pick<IssueManagerI18nRuntime, \"t\">;\n\nexport function resolveIssueManagerWorkspaceRuntimePath(\n workspaceRoot: string,\n requestedPath: string\n): string {\n const normalizedWorkspaceRoot = workspaceRoot.trim().replace(/\\/+$/, \"\");\n const normalizedRequestedPath = requestedPath.trim();\n\n if (!normalizedWorkspaceRoot || !normalizedRequestedPath) {\n return normalizedRequestedPath;\n }\n\n if (\n normalizedRequestedPath === normalizedWorkspaceRoot ||\n normalizedRequestedPath.startsWith(`${normalizedWorkspaceRoot}/`)\n ) {\n return normalizedRequestedPath;\n }\n\n if (normalizedRequestedPath === \"/workspace\") {\n return normalizedWorkspaceRoot;\n }\n\n if (normalizedRequestedPath.startsWith(\"/workspace/\")) {\n return `${normalizedWorkspaceRoot}/${normalizedRequestedPath.slice(\"/workspace/\".length)}`;\n }\n\n if (!normalizedRequestedPath.startsWith(\"/\")) {\n return `${normalizedWorkspaceRoot}/${normalizedRequestedPath.replace(/^\\/+/, \"\")}`;\n }\n\n return normalizedRequestedPath;\n}\n\nexport function buildIssueManagerRunPrompt(input: {\n copy?: IssueManagerPromptCopy;\n issue: IssueManagerIssueSummary;\n task?: IssueManagerTaskSummary;\n workspaceRoot: string;\n}): string {\n const mentionMarkdown = buildIssueManagerIssueMention({\n issue: input.issue,\n task: input.task,\n mode: \"execute\"\n });\n return [\n input.copy?.t(\"runPrompts.executeIntro\") ?? \"Handle this task reference.\",\n \"\",\n mentionMarkdown\n ].join(\"\\n\");\n}\n\nexport function buildIssueManagerTaskBreakdownPrompt(input: {\n copy?: IssueManagerPromptCopy;\n issueDetail: {\n contextRefs: readonly IssueManagerContextRef[];\n issue: IssueManagerIssueSummary;\n tasks: readonly IssueManagerTaskSummary[];\n };\n workspaceId: string;\n}): string {\n const issue = input.issueDetail.issue;\n const issueMention = buildIssueManagerIssueMention({\n issue,\n mode: \"breakdown\"\n });\n\n return [\n input.copy?.t(\"runPrompts.breakdownIntro\") ??\n \"Break this task reference down into executable tasks.\",\n \"\",\n issueMention\n ].join(\"\\n\");\n}\n\nfunction buildIssueManagerIssueMention(input: {\n issue: IssueManagerIssueSummary;\n task?: IssueManagerTaskSummary;\n mode: \"breakdown\" | \"execute\";\n outputDir?: string | null;\n runId?: string | null;\n}): string {\n const labelParts = [input.issue.title.trim(), input.task?.title.trim() || \"\"]\n .filter(Boolean)\n .map((value) =>\n escapeIssueManagerMentionLabel(value.replace(/^@+/, \"\").trim())\n );\n const href = buildWorkspaceIssueMentionHref({\n issueId: input.issue.issueId,\n mode: input.mode,\n outputDir: input.outputDir,\n runId: input.runId,\n taskId: input.task?.taskId,\n topicId: input.issue.topicId,\n workspaceId: input.issue.workspaceId\n });\n return `[@${labelParts.join(\" / \")}](${href})`;\n}\n\nfunction escapeIssueManagerMentionLabel(value: string): string {\n return value\n .replaceAll(\"\\\\\", \"\\\\\\\\\")\n .replaceAll(\"[\", \"\\\\[\")\n .replaceAll(\"]\", \"\\\\]\")\n .replaceAll(\"\\r\", \" \")\n .replaceAll(\"\\n\", \" \");\n}\n"],"mappings":"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","names":[]}