@tutti-os/workspace-issue-manager 0.0.16 → 0.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createIssueManagerI18nRuntime
3
- } from "./chunk-TER7RTXO.js";
3
+ } from "./chunk-OAASJITJ.js";
4
4
 
5
5
  // src/core/feature.ts
6
6
  import {
@@ -31,6 +31,7 @@ function createIssueManagerFeature(input) {
31
31
  identityAdapter: input.identityAdapter,
32
32
  mentionActionHandler: input.mentionActionHandler,
33
33
  notifications: input.notifications,
34
+ referenceSourceAggregator: input.referenceSourceAggregator,
34
35
  shareAdapter: input.shareAdapter,
35
36
  ui: {
36
37
  showInviteCollaborator: input.ui?.showInviteCollaborator ?? true
@@ -86,6 +87,44 @@ var extractIssueManagerPlainTextWithoutFilesFromContent = extractPlainTextWithou
86
87
  var createIssueManagerMentionHref = createRichTextMentionHref;
87
88
  var createIssueManagerMentionMarkdown = createRichTextMentionMarkdown;
88
89
  var parseIssueManagerMentionHref = parseRichTextMentionHref;
90
+ function createIssueManagerWorkspaceReferenceMentionMarkdown(input) {
91
+ const id = input.id.trim();
92
+ const displayName = input.displayName.trim();
93
+ if (!id || !displayName) {
94
+ return "";
95
+ }
96
+ const scope = {
97
+ workspaceId: input.workspaceId,
98
+ source: input.source
99
+ };
100
+ const groupId = input.groupId?.trim();
101
+ if (groupId) {
102
+ scope.groupId = groupId;
103
+ }
104
+ const iconUrl = input.iconUrl?.trim();
105
+ if (iconUrl) {
106
+ scope.icon = iconUrl;
107
+ }
108
+ if (input.fileCount != null && input.fileCount > 0) {
109
+ scope.count = String(input.fileCount);
110
+ }
111
+ return createRichTextMentionMarkdown({
112
+ providerId: "workspace-reference",
113
+ entityId: id,
114
+ label: displayName,
115
+ scope
116
+ });
117
+ }
118
+ function appendIssueManagerWorkspaceReferenceMentionsToContent(content, bundles) {
119
+ const base = normalizeRichTextContent(content);
120
+ const rendered = bundles.map(
121
+ (bundle) => createIssueManagerWorkspaceReferenceMentionMarkdown(bundle)
122
+ ).filter((markdown) => markdown.length > 0);
123
+ if (rendered.length === 0) {
124
+ return base;
125
+ }
126
+ return base ? `${base} ${rendered.join(" ")}` : rendered.join(" ");
127
+ }
89
128
  var extractIssueManagerMentionsFromContent = extractRichTextMentionsFromContent;
90
129
  var removeIssueManagerMentionFromContent = removeRichTextMentionFromContent;
91
130
 
@@ -305,6 +344,8 @@ export {
305
344
  createIssueManagerMentionHref,
306
345
  createIssueManagerMentionMarkdown,
307
346
  parseIssueManagerMentionHref,
347
+ createIssueManagerWorkspaceReferenceMentionMarkdown,
348
+ appendIssueManagerWorkspaceReferenceMentionsToContent,
308
349
  extractIssueManagerMentionsFromContent,
309
350
  removeIssueManagerMentionFromContent,
310
351
  issueManagerSidebarDefaultWidth,
@@ -322,4 +363,4 @@ export {
322
363
  buildIssueManagerRunPrompt,
323
364
  buildIssueManagerTaskBreakdownPrompt
324
365
  };
325
- //# sourceMappingURL=chunk-7O62INYA.js.map
366
+ //# sourceMappingURL=chunk-7VN33U2R.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 解析;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":";;;;;AAEA;AAAA,EACE;AAAA,OAEK;AA2EA,IAAM,+BAAsD;AAAA,EACjE,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,4BAA4B;AAAA,EAC5B,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,mBAAmB;AACrB;AAEO,SAAS,0BACd,OACqB;AACrB,SAAO;AAAA,IACL,wBAAwB,MAAM;AAAA,IAC9B,WAAW,MAAM;AAAA,IACjB,sBAAsB,MAAM;AAAA,IAC5B,oBAAoB,MAAM;AAAA,IAC1B,aAAa,MAAM;AAAA,IACnB,SAAS,MAAM;AAAA,IACf,aAAa,MAAM;AAAA,IACnB,0BAA0B,MAAM;AAAA,IAChC,aAAa,MAAM;AAAA,IACnB,MAAM,8BAA8B,MAAM,IAAI;AAAA,IAC9C,iBAAiB,MAAM;AAAA,IACvB,sBAAsB,MAAM;AAAA,IAC5B,eAAe,MAAM;AAAA,IACrB,2BAA2B,MAAM;AAAA,IACjC,cAAc,MAAM;AAAA,IACpB,IAAI;AAAA,MACF,wBAAwB,MAAM,IAAI,0BAA0B;AAAA,IAC9D;AAAA,IACA,0BAA0B,sCAAsC,MAAM,IAAI;AAAA,EAC5E;AACF;AAEO,SAAS,+BACd,OACuB;AACvB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,eAAe,wBAAwB,OAAO,aAAa;AAAA,IAC3D,kBAAkB,OAAO,kBAAkB,KAAK,KAAK;AAAA,IACrD,mBAAmB,OAAO,qBAAqB;AAAA,IAC/C,uBAAuB,OAAO,uBAAuB,KAAK,KAAK;AAAA,IAC/D,4BAA4B;AAAA,MAC1B,OAAO;AAAA,IACT;AAAA,IACA,iBAAiB,wBAAwB,OAAO,eAAe;AAAA,IAC/D,gBAAgB,wBAAwB,OAAO,cAAc;AAAA,IAC7D,mBAAmB,OAAO,sBAAsB;AAAA,EAClD;AACF;AAEA,SAAS,wBACP,OACe;AACf,QAAM,UAAU,OAAO,KAAK,KAAK;AACjC,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;;;AC7IA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAaA,IAAM,+BAA+B;AAErC,IAAM,6CACX;AAEK,IAAM,8CACX;AAEK,IAAM,gDACX;AAEK,IAAM,mDACX;AAEK,IAAM,iDACX;AAEK,IAAM,0CACX;AAEK,IAAM,sDACX;AAEK,IAAM,gCAAgC;AACtC,IAAM,oCAAoC;AAC1C,IAAM,+BAA+B;AAiBrC,SAAS,oDACd,OACQ;AACR,QAAM,KAAK,MAAM,GAAG,KAAK;AACzB,QAAM,cAAc,MAAM,YAAY,KAAK;AAC3C,MAAI,CAAC,MAAM,CAAC,aAAa;AACvB,WAAO;AAAA,EACT;AACA,QAAM,QAAgC;AAAA,IACpC,aAAa,MAAM;AAAA,IACnB,QAAQ,MAAM;AAAA,EAChB;AACA,QAAM,UAAU,MAAM,SAAS,KAAK;AACpC,MAAI,SAAS;AACX,UAAM,UAAU;AAAA,EAClB;AACA,QAAM,UAAU,MAAM,SAAS,KAAK;AACpC,MAAI,SAAS;AACX,UAAM,OAAO;AAAA,EACf;AACA,MAAI,MAAM,aAAa,QAAQ,MAAM,YAAY,GAAG;AAClD,UAAM,QAAQ,OAAO,MAAM,SAAS;AAAA,EACtC;AACA,SAAO,8BAA8B;AAAA,IACnC,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,OAAO;AAAA,IACP;AAAA,EACF,CAAC;AACH;AAKO,SAAS,sDACd,SACA,SACQ;AACR,QAAM,OAAO,yBAAyB,OAAO;AAC7C,QAAM,WAAW,QACd;AAAA,IAAI,CAAC,WACJ,oDAAoD,MAAM;AAAA,EAC5D,EACC,OAAO,CAAC,aAAa,SAAS,SAAS,CAAC;AAC3C,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AACA,SAAO,OAAO,GAAG,IAAI,IAAI,SAAS,KAAK,GAAG,CAAC,KAAK,SAAS,KAAK,GAAG;AACnE;AACO,IAAM,yCACX;AACK,IAAM,uCACX;;;ACzHK,IAAM,kCAAkC;AACxC,IAAM,8BAA8B;AACpC,IAAM,8BAA8B;AACpC,IAAM,2BAA2B;AACjC,IAAM,oCAAoC;AAC1C,IAAM,oCACX,8BAA8B;AAEzB,SAAS,8BACd,OACA,aACQ;AACR,QAAM,WAAW,KAAK;AAAA,IACpB;AAAA,IACA,KAAK;AAAA,MACH;AAAA,MACA,cAAc;AAAA,IAChB;AAAA,EACF;AACA,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,2BAA2B,GAAG,QAAQ;AACxE;AAEO,SAAS,sCACd,gBACS;AACT,SACE,OAAO,SAAS,cAAc,KAC9B,iBAAiB,KACjB,KAAK,MAAM,cAAc,IAAI;AAEjC;AAEO,SAAS,iCAEd,OAAe,cAA8B;AAC7C,QAAM,iBAAiB,KAAK;AAAA,IAC1B;AAAA,IACA,KAAK;AAAA,MACH;AAAA,MACA,MAAM,QAAQ;AAAA,IAChB;AAAA,EACF;AACA,QAAM,QAAQ,KAAK;AAAA,IACjB,KAAK,IAAI,MAAM,OAAO,cAAc;AAAA,IACpC,KAAK,IAAI,MAAM,OAAO,YAAY;AAAA,EACpC;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,GAAG,eAAe,KAAK,CAAC;AAAA,EACxD;AACF;;;AC9BO,SAAS,+BACd,OACQ;AACR,QAAM,cAAc,MAAM,YAAY,KAAK;AAC3C,QAAM,UAAU,MAAM,QAAQ,KAAK;AACnC,MAAI,CAAC,eAAe,CAAC,SAAS;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC;AAAA,EACF,CAAC;AACD,mCAAiC,QAAQ,WAAW,MAAM,OAAO;AACjE;AAAA,IACE;AAAA,IACA;AAAA,IACA,qBAAqB,MAAM,IAAI;AAAA,EACjC;AACA,mCAAiC,QAAQ,UAAU,MAAM,MAAM;AAC/D,mCAAiC,QAAQ,SAAS,MAAM,KAAK;AAC7D,mCAAiC,QAAQ,aAAa,MAAM,SAAS;AACrE,SAAO;AAAA,IACL,6BAA6B,mBAAmB,OAAO,CAAC;AAAA,IACxD,OAAO,SAAS;AAAA,EAClB,EAAE,KAAK,GAAG;AACZ;AAEO,SAAS,+BACd,MACoC;AACpC,QAAM,cAAc,KAAK,KAAK;AAC9B,MAAI,CAAC,YAAY,YAAY,EAAE,WAAW,2BAA2B,GAAG;AACtE,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,IAAI,IAAI,WAAW;AAAA,EAC3B,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,IAAI,aAAa,cAAc,IAAI,aAAa,mBAAmB;AACrE,WAAO;AAAA,EACT;AACA,MAAI,yCAAyC,IAAI,YAAY,GAAG;AAC9D,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,IAAI,aAAa,IAAI,aAAa,GAAG,KAAK,KAAK;AACnE,QAAM,UAAU;AAAA,IACd,IAAI,SAAS,QAAQ,QAAQ,EAAE;AAAA,EACjC,EAAE,KAAK;AACP,MAAI,CAAC,eAAe,CAAC,SAAS;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,qBAAqB,IAAI,aAAa,IAAI,MAAM,CAAC;AAC9D,QAAM,UAAU,oBAAoB,IAAI,cAAc,SAAS;AAC/D,QAAM,SAAS,oBAAoB,IAAI,cAAc,QAAQ;AAC7D,QAAM,QAAQ,oBAAoB,IAAI,cAAc,OAAO;AAC3D,QAAM,YAAY,oBAAoB,IAAI,cAAc,WAAW;AAEnE,SAAO;AAAA,IACL;AAAA,IACA,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,IACvB,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,IACjC,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC;AAAA,IACzB,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC3B,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,IAC7B;AAAA,EACF;AACF;AAEA,SAAS,iCACP,QACA,KACA,OACM;AACN,QAAM,aAAa,OAAO,KAAK,KAAK;AACpC,MAAI,YAAY;AACd,WAAO,IAAI,KAAK,UAAU;AAAA,EAC5B;AACF;AAEA,SAAS,oBACP,QACA,KACoB;AACpB,QAAM,QAAQ,OAAO,IAAI,GAAG,GAAG,KAAK,KAAK;AACzC,SAAO,SAAS;AAClB;AAEA,IAAM,mCAAmC,oBAAI,IAAI;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,yCACP,QACS;AACT,SAAO,CAAC,GAAG,OAAO,KAAK,CAAC,EAAE,KAAK,CAAC,QAAQ;AACtC,UAAM,gBAAgB,IAAI,KAAK;AAC/B,WACE,CAAC,iCAAiC,IAAI,aAAa,KACnD,cAAc,WAAW,OAAO;AAAA,EAEpC,CAAC;AACH;AAEA,SAAS,uBAAuB,OAAuB;AACrD,MAAI;AACF,WAAO,mBAAmB,KAAK;AAAA,EACjC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBACP,OACuC;AACvC,SAAO,UAAU,eAAe,UAAU,YAAY,QAAQ;AAChE;;;ACzIO,SAAS,wCACd,eACA,eACQ;AACR,QAAM,0BAA0B,cAAc,KAAK,EAAE,QAAQ,QAAQ,EAAE;AACvE,QAAM,0BAA0B,cAAc,KAAK;AAEnD,MAAI,CAAC,2BAA2B,CAAC,yBAAyB;AACxD,WAAO;AAAA,EACT;AAEA,MACE,4BAA4B,2BAC5B,wBAAwB,WAAW,GAAG,uBAAuB,GAAG,GAChE;AACA,WAAO;AAAA,EACT;AAEA,MAAI,4BAA4B,cAAc;AAC5C,WAAO;AAAA,EACT;AAEA,MAAI,wBAAwB,WAAW,aAAa,GAAG;AACrD,WAAO,GAAG,uBAAuB,IAAI,wBAAwB,MAAM,cAAc,MAAM,CAAC;AAAA,EAC1F;AAEA,MAAI,CAAC,wBAAwB,WAAW,GAAG,GAAG;AAC5C,WAAO,GAAG,uBAAuB,IAAI,wBAAwB,QAAQ,QAAQ,EAAE,CAAC;AAAA,EAClF;AAEA,SAAO;AACT;AAEO,SAAS,2BAA2B,OAKhC;AACT,QAAM,kBAAkB,8BAA8B;AAAA,IACpD,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ,MAAM;AAAA,EACR,CAAC;AACD,SAAO;AAAA,IACL,MAAM,MAAM,EAAE,yBAAyB,KAAK;AAAA,IAC5C;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,qCAAqC,OAQ1C;AACT,QAAM,QAAQ,MAAM,YAAY;AAChC,QAAM,eAAe,8BAA8B;AAAA,IACjD;AAAA,IACA,MAAM;AAAA,EACR,CAAC;AAED,SAAO;AAAA,IACL,MAAM,MAAM,EAAE,2BAA2B,KACvC;AAAA,IACF;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,8BAA8B,OAM5B;AACT,QAAM,aAAa,CAAC,MAAM,MAAM,MAAM,KAAK,GAAG,MAAM,MAAM,MAAM,KAAK,KAAK,EAAE,EACzE,OAAO,OAAO,EACd;AAAA,IAAI,CAAC,UACJ,+BAA+B,MAAM,QAAQ,OAAO,EAAE,EAAE,KAAK,CAAC;AAAA,EAChE;AACF,QAAM,OAAO,+BAA+B;AAAA,IAC1C,SAAS,MAAM,MAAM;AAAA,IACrB,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM;AAAA,IACjB,OAAO,MAAM;AAAA,IACb,QAAQ,MAAM,MAAM;AAAA,IACpB,SAAS,MAAM,MAAM;AAAA,IACrB,aAAa,MAAM,MAAM;AAAA,EAC3B,CAAC;AACD,SAAO,KAAK,WAAW,KAAK,KAAK,CAAC,KAAK,IAAI;AAC7C;AAEA,SAAS,+BAA+B,OAAuB;AAC7D,SAAO,MACJ,WAAW,MAAM,MAAM,EACvB,WAAW,KAAK,KAAK,EACrB,WAAW,KAAK,KAAK,EACrB,WAAW,MAAM,GAAG,EACpB,WAAW,MAAM,GAAG;AACzB;","names":[]}
@@ -24,9 +24,10 @@ import {
24
24
  resolveIssueManagerTopicDeleteErrorMessage,
25
25
  toContextRefInput,
26
26
  toIssueManagerWorkspaceFileLinkInput
27
- } from "./chunk-GLGNWTCD.js";
27
+ } from "./chunk-PBN62U6U.js";
28
28
  import {
29
29
  appendIssueManagerWorkspaceFileLinksToContent,
30
+ appendIssueManagerWorkspaceReferenceMentionsToContent,
30
31
  clampIssueManagerSidebarWidth,
31
32
  extractIssueManagerPlainTextFromContent,
32
33
  extractIssueManagerWorkspaceFileLinksFromContent,
@@ -35,7 +36,7 @@ import {
35
36
  issueManagerSidebarMinWidth,
36
37
  normalizeIssueManagerContent,
37
38
  shouldAutoCollapseIssueManagerSidebar
38
- } from "./chunk-7O62INYA.js";
39
+ } from "./chunk-7VN33U2R.js";
39
40
 
40
41
  // src/ui/react/internal/shell/IssueManagerNodeState.ts
41
42
  import { useEffect, useEffectEvent, useState } from "react";
@@ -493,6 +494,39 @@ function createIssueManagerInsertReferencesOutcome(input) {
493
494
  })
494
495
  };
495
496
  }
497
+ function createIssueManagerInsertReferenceBundlesOutcome(input) {
498
+ const applyContent = (content) => {
499
+ const withFiles = resolveIssueManagerReferenceInsertionContent({
500
+ content,
501
+ refs: input.files
502
+ });
503
+ return appendIssueManagerWorkspaceReferenceMentionsToContent(
504
+ withFiles,
505
+ input.bundles.map((bundle) => ({
506
+ source: bundle.source,
507
+ id: bundle.id,
508
+ groupId: bundle.groupId,
509
+ displayName: bundle.displayName,
510
+ iconUrl: bundle.iconUrl,
511
+ fileCount: bundle.fileCount,
512
+ workspaceId: input.workspaceId
513
+ }))
514
+ );
515
+ };
516
+ return input.target.parentKind === "issue" ? {
517
+ issueDraft: (current) => ({
518
+ ...current,
519
+ content: applyContent(current.content)
520
+ }),
521
+ referenceTarget: null
522
+ } : {
523
+ referenceTarget: null,
524
+ taskDraft: (current) => ({
525
+ ...current,
526
+ content: applyContent(current.content)
527
+ })
528
+ };
529
+ }
496
530
 
497
531
  // src/services/internal/controllerPlans.ts
498
532
  function createIssueManagerRunTaskPlan(input) {
@@ -1398,6 +1432,30 @@ function createIssueManagerControllerActions(input) {
1398
1432
  },
1399
1433
  async submitReferenceSelection(refs) {
1400
1434
  await submitReferences(refs);
1435
+ },
1436
+ async submitReferenceBundleSelection(input2) {
1437
+ const target = referenceTarget;
1438
+ if (!target) {
1439
+ applyOutcome({ referenceTarget: null });
1440
+ return;
1441
+ }
1442
+ if (target.mode === "insert" && input2.bundles.length > 0) {
1443
+ applyOutcome(
1444
+ createIssueManagerInsertReferenceBundlesOutcome({
1445
+ bundles: input2.bundles,
1446
+ files: input2.files,
1447
+ target,
1448
+ workspaceId
1449
+ })
1450
+ );
1451
+ trackIssueManagerContextRefsAdded({
1452
+ feature,
1453
+ refs: input2.files,
1454
+ targetType: target.parentKind
1455
+ });
1456
+ return;
1457
+ }
1458
+ await submitReferences(input2.files, target);
1401
1459
  }
1402
1460
  };
1403
1461
  }
@@ -2063,6 +2121,19 @@ function useIssueManagerNodeView({
2063
2121
  onConfirm: (refs) => {
2064
2122
  void controller.submitReferenceSelection(refs);
2065
2123
  },
2124
+ onConfirmBundles: (result) => {
2125
+ void controller.submitReferenceBundleSelection({
2126
+ bundles: result.bundles.filter((bundle) => bundle.handle !== null).map((bundle) => ({
2127
+ source: bundle.handle.source,
2128
+ id: bundle.handle.id,
2129
+ groupId: bundle.handle.groupId ?? null,
2130
+ displayName: bundle.displayName,
2131
+ iconUrl: bundle.iconUrl ?? null,
2132
+ fileCount: bundle.fileCount
2133
+ })),
2134
+ files: result.files
2135
+ });
2136
+ },
2066
2137
  open: controller.referenceTarget !== null
2067
2138
  },
2068
2139
  selectedIssue,
@@ -2097,7 +2168,10 @@ import {
2097
2168
  useRef as useRef7
2098
2169
  } from "react";
2099
2170
  import { Button as Button13, PanelIcon, cn as cn11 } from "@tutti-os/ui-system";
2100
- import { WorkspaceFileReferencePicker } from "@tutti-os/workspace-file-reference/ui";
2171
+ import {
2172
+ ReferenceSourcePicker,
2173
+ WorkspaceFileReferencePicker
2174
+ } from "@tutti-os/workspace-file-reference/ui";
2101
2175
 
2102
2176
  // src/ui/internal/shell/IssueManagerShell.tsx
2103
2177
  import {
@@ -5603,7 +5677,18 @@ function IssueManagerNode({
5603
5677
  selectedTask
5604
5678
  }
5605
5679
  ),
5606
- /* @__PURE__ */ jsx19(
5680
+ feature.referenceSourceAggregator ? /* @__PURE__ */ jsx19(
5681
+ ReferenceSourcePicker,
5682
+ {
5683
+ aggregator: feature.referenceSourceAggregator,
5684
+ copy: controller.copy,
5685
+ open: referencePicker.open,
5686
+ workspaceId,
5687
+ onClose: referencePicker.onClose,
5688
+ onConfirm: referencePicker.onConfirm,
5689
+ onConfirmBundles: referencePicker.onConfirmBundles
5690
+ }
5691
+ ) : /* @__PURE__ */ jsx19(
5607
5692
  WorkspaceFileReferencePicker,
5608
5693
  {
5609
5694
  copy: controller.copy,
@@ -5767,4 +5852,4 @@ export {
5767
5852
  IssueManagerNode,
5768
5853
  IssueManagerNodeHeader
5769
5854
  };
5770
- //# sourceMappingURL=chunk-BSI36JGO.js.map
5855
+ //# sourceMappingURL=chunk-GEH4QNB6.js.map