@nextop-os/workspace-issue-manager 0.0.17 → 0.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/{chunk-5YEGAJKA.js → chunk-5Y5GVLKU.js} +38 -4
  2. package/dist/chunk-5Y5GVLKU.js.map +1 -0
  3. package/dist/chunk-LEL6VWU4.js +1 -0
  4. package/dist/chunk-V75TAM27.js +209 -0
  5. package/dist/chunk-V75TAM27.js.map +1 -0
  6. package/dist/chunk-WSFC2COJ.js +4329 -0
  7. package/dist/chunk-WSFC2COJ.js.map +1 -0
  8. package/dist/chunk-ZWDF5XA7.js +735 -0
  9. package/dist/chunk-ZWDF5XA7.js.map +1 -0
  10. package/dist/contracts/index.d.ts +62 -33
  11. package/dist/core/index.d.ts +44 -0
  12. package/dist/core/index.js +60 -0
  13. package/dist/core/index.js.map +1 -0
  14. package/dist/{feature-B6_wXych.d.ts → feature-2zhsUF_g.d.ts} +11 -1
  15. package/dist/i18n/index.js +1 -1
  16. package/dist/index.d.ts +8 -34
  17. package/dist/index.js +47 -4
  18. package/dist/issueManagerControllerService.interface-B_Jr7Xw_.d.ts +101 -0
  19. package/dist/services/index.d.ts +11 -0
  20. package/dist/services/index.js +24 -0
  21. package/dist/services/index.js.map +1 -0
  22. package/dist/ui/index.d.ts +37 -0
  23. package/dist/ui/index.js +12 -0
  24. package/dist/ui/index.js.map +1 -0
  25. package/dist/workbench/index.d.ts +9 -2
  26. package/dist/workbench/index.js +88 -4
  27. package/dist/workbench/index.js.map +1 -1
  28. package/package.json +20 -8
  29. package/dist/chunk-5YEGAJKA.js.map +0 -1
  30. package/dist/chunk-LYYOPZIJ.js +0 -308
  31. package/dist/chunk-LYYOPZIJ.js.map +0 -1
  32. package/dist/chunk-RX6P2DPR.js +0 -3316
  33. package/dist/chunk-RX6P2DPR.js.map +0 -1
  34. package/dist/react/index.d.ts +0 -17
  35. package/dist/react/index.js +0 -11
  36. /package/dist/{react/index.js.map → chunk-LEL6VWU4.js.map} +0 -0
@@ -1,308 +0,0 @@
1
- import {
2
- createIssueManagerI18nRuntime
3
- } from "./chunk-5YEGAJKA.js";
4
-
5
- // src/core/feature.ts
6
- var defaultIssueManagerNodeState = {
7
- issueSearchQuery: "",
8
- issueStatusFilter: "all",
9
- selectedAgentProvider: "codex",
10
- selectedIssueId: null,
11
- selectedTaskId: null
12
- };
13
- function createIssueManagerFeature(input) {
14
- return {
15
- agentRunner: input.agentRunner,
16
- backend: input.backend,
17
- fileAdapter: input.fileAdapter,
18
- i18n: createIssueManagerI18nRuntime(input.i18n),
19
- identityAdapter: input.identityAdapter,
20
- shareAdapter: input.shareAdapter
21
- };
22
- }
23
- function normalizeIssueManagerNodeState(state) {
24
- return {
25
- ...defaultIssueManagerNodeState,
26
- ...state,
27
- issueSearchQuery: state?.issueSearchQuery?.trim() ?? "",
28
- issueStatusFilter: state?.issueStatusFilter ?? "all",
29
- selectedAgentProvider: state?.selectedAgentProvider?.trim() || "codex",
30
- selectedIssueId: normalizeNullableString(state?.selectedIssueId),
31
- selectedTaskId: normalizeNullableString(state?.selectedTaskId)
32
- };
33
- }
34
- function normalizeNullableString(value) {
35
- const trimmed = value?.trim() ?? "";
36
- return trimmed.length > 0 ? trimmed : null;
37
- }
38
-
39
- // src/core/content.ts
40
- var markdownLinkPattern = /\[([^\]]+)\]\(([^)\s]+)\)/g;
41
- var markdownImagePattern = /!\[([^\]]*)\]\(([^)\s]+)\)/g;
42
- var externalLinkPrefix = /^(?:[a-z]+:)?\/\//i;
43
- var mentionLinkPrefix = /^mention:\/\//i;
44
- function normalizeLineEndings(value) {
45
- return value.replace(/\r\n?/g, "\n");
46
- }
47
- function normalizeIssueManagerContent(value) {
48
- const trimmed = normalizeLineEndings(value ?? "").trim();
49
- if (!trimmed) {
50
- return "";
51
- }
52
- const markdown = convertLegacyDocumentString(trimmed);
53
- return markdown || trimmed;
54
- }
55
- function convertLegacyDocumentString(value) {
56
- try {
57
- const parsed = JSON.parse(value);
58
- if (parsed?.type !== "doc" || !Array.isArray(parsed.content)) {
59
- return "";
60
- }
61
- return renderLegacyNodesToMarkdown(parsed.content).trim();
62
- } catch {
63
- return "";
64
- }
65
- }
66
- function renderLegacyNodesToMarkdown(nodes) {
67
- return nodes.map((node) => renderLegacyNodeToMarkdown(node)).filter((part) => part.length > 0).join("\n\n");
68
- }
69
- function renderLegacyNodeToMarkdown(node) {
70
- if (!node) {
71
- return "";
72
- }
73
- if (node.type === "text") {
74
- return node.text ?? "";
75
- }
76
- if (node.type === "workspaceFileLink") {
77
- const attrs = node.attrs ?? {};
78
- const kind = attrs.kind === "folder" ? "folder" : "file";
79
- const hrefValue = (typeof attrs.href === "string" ? attrs.href : void 0) || (typeof attrs.path === "string" ? attrs.path : void 0) || "";
80
- const href = normalizeIssueManagerWorkspaceFileLinkHref(hrefValue, kind);
81
- const label = (typeof attrs.name === "string" ? attrs.name : void 0)?.trim() || href.split("/").filter(Boolean).at(-1) || href;
82
- return href && label ? `[${label}](${href})` : label;
83
- }
84
- if (Array.isArray(node.content)) {
85
- const inline = node.content.map((child) => renderLegacyNodeToMarkdown(child)).filter((part) => part.length > 0).join("").trim();
86
- if (!inline) {
87
- return "";
88
- }
89
- if (node.type === "paragraph") {
90
- return inline;
91
- }
92
- return inline;
93
- }
94
- return "";
95
- }
96
- function normalizeWorkspacePath(pathOrHref, kind) {
97
- const trimmed = pathOrHref.trim();
98
- if (!trimmed) {
99
- return "";
100
- }
101
- if (kind === "folder" && !trimmed.endsWith("/")) {
102
- return `${trimmed}/`;
103
- }
104
- return trimmed;
105
- }
106
- function isWorkspaceReferenceHref(href) {
107
- const trimmed = href.trim();
108
- if (!trimmed || mentionLinkPrefix.test(trimmed) || externalLinkPrefix.test(trimmed)) {
109
- return false;
110
- }
111
- return true;
112
- }
113
- function normalizeIssueManagerWorkspaceFileLinkHref(pathOrHref, kind = "file") {
114
- return normalizeWorkspacePath(pathOrHref, kind);
115
- }
116
- function createIssueManagerWorkspaceFileLinkMarkdown(input) {
117
- const kind = input.kind === "folder" ? "folder" : "file";
118
- const href = normalizeIssueManagerWorkspaceFileLinkHref(input.path, kind);
119
- const displayName = input.name?.trim() || href.split("/").filter(Boolean).at(-1) || href || input.path.trim();
120
- if (!href || !displayName) {
121
- return "";
122
- }
123
- return `[${displayName}](${href})`;
124
- }
125
- function appendIssueManagerWorkspaceFileLinksToContent(value, refs) {
126
- const content = normalizeIssueManagerContent(value);
127
- const existing = new Set(
128
- extractIssueManagerWorkspaceFileLinksFromContent(content).map(
129
- (ref) => ref.path
130
- )
131
- );
132
- const rendered = refs.map((ref) => {
133
- const kind = ref.kind === "folder" ? "folder" : "file";
134
- const path = normalizeIssueManagerWorkspaceFileLinkHref(ref.path, kind);
135
- if (!path || existing.has(path)) {
136
- return "";
137
- }
138
- existing.add(path);
139
- return createIssueManagerWorkspaceFileLinkMarkdown({
140
- ...ref,
141
- kind,
142
- path
143
- });
144
- }).filter(Boolean);
145
- if (rendered.length === 0) {
146
- return content;
147
- }
148
- return content ? `${content}
149
-
150
- ${rendered.join("\n")}` : rendered.join("\n");
151
- }
152
- function extractIssueManagerWorkspaceFileLinksFromContent(value) {
153
- const content = normalizeIssueManagerContent(value);
154
- const refs = /* @__PURE__ */ new Map();
155
- for (const match of content.matchAll(markdownLinkPattern)) {
156
- const name = match[1]?.trim() ?? "";
157
- const href = match[2]?.trim() ?? "";
158
- if (!name || !isWorkspaceReferenceHref(href)) {
159
- continue;
160
- }
161
- const kind = href.endsWith("/") ? "folder" : "file";
162
- const path = normalizeIssueManagerWorkspaceFileLinkHref(href, kind);
163
- if (!path || refs.has(path)) {
164
- continue;
165
- }
166
- refs.set(path, {
167
- href: path,
168
- kind,
169
- name,
170
- path
171
- });
172
- }
173
- return [...refs.values()];
174
- }
175
- function removeIssueManagerWorkspaceFileLinkFromContent(content, path) {
176
- const targetPath = path.trim();
177
- if (!targetPath) {
178
- return normalizeIssueManagerContent(content);
179
- }
180
- const normalized = normalizeIssueManagerContent(content);
181
- const next = normalized.split("\n").filter((line) => {
182
- const trimmed = line.trim();
183
- if (!trimmed) {
184
- return true;
185
- }
186
- const refs = extractIssueManagerWorkspaceFileLinksFromContent(trimmed);
187
- return !refs.some((ref) => ref.path === targetPath) || refs.length > 1;
188
- }).join("\n").replace(/\n{3,}/g, "\n\n");
189
- return next.trim();
190
- }
191
- function extractIssueManagerPlainTextFromContent(value) {
192
- const content = normalizeIssueManagerContent(value);
193
- if (!content) {
194
- return "";
195
- }
196
- return content.replace(markdownImagePattern, " $1 ").replace(markdownLinkPattern, " $1 ").replace(/^[\s>*#+-]+/gm, " ").replace(/`([^`]+)`/g, " $1 ").replace(/[*_~]/g, " ").replace(/\s+/g, " ").trim();
197
- }
198
- function extractIssueManagerPlainTextWithoutFilesFromContent(value) {
199
- const content = normalizeIssueManagerContent(value);
200
- if (!content) {
201
- return "";
202
- }
203
- return content.replace(markdownImagePattern, " ").replace(markdownLinkPattern, " ").replace(/^[\s>*#+-]+/gm, " ").replace(/`([^`]+)`/g, " $1 ").replace(/[*_~]/g, " ").replace(/\s+/g, " ").trim();
204
- }
205
-
206
- // src/core/runPrompt.ts
207
- function buildIssueManagerRunOutputDir(issueId, taskId, runId) {
208
- return `/workspace/issues/${issueId}/tasks/${taskId}/runs/${runId}`;
209
- }
210
- function buildIssueManagerUploadDir(issueId, taskId) {
211
- const normalizedTaskId = taskId?.trim();
212
- if (normalizedTaskId) {
213
- return `/workspace/issues/${issueId}/tasks/${normalizedTaskId}/attachments`;
214
- }
215
- return `/workspace/issues/${issueId}/attachments`;
216
- }
217
- function resolveIssueManagerWorkspaceRuntimePath(workspaceRoot, requestedPath) {
218
- const normalizedWorkspaceRoot = workspaceRoot.trim().replace(/\/+$/, "");
219
- const normalizedRequestedPath = requestedPath.trim();
220
- if (!normalizedWorkspaceRoot || !normalizedRequestedPath) {
221
- return normalizedRequestedPath;
222
- }
223
- if (normalizedRequestedPath === normalizedWorkspaceRoot || normalizedRequestedPath.startsWith(`${normalizedWorkspaceRoot}/`)) {
224
- return normalizedRequestedPath;
225
- }
226
- if (normalizedRequestedPath === "/workspace") {
227
- return normalizedWorkspaceRoot;
228
- }
229
- if (normalizedRequestedPath.startsWith("/workspace/")) {
230
- return `${normalizedWorkspaceRoot}/${normalizedRequestedPath.slice("/workspace/".length)}`;
231
- }
232
- if (!normalizedRequestedPath.startsWith("/")) {
233
- return `${normalizedWorkspaceRoot}/${normalizedRequestedPath.replace(/^\/+/, "")}`;
234
- }
235
- return normalizedRequestedPath;
236
- }
237
- function buildIssueManagerRunPrompt(input) {
238
- const outputDir = resolveIssueManagerWorkspaceRuntimePath(
239
- input.workspaceRoot,
240
- buildIssueManagerRunOutputDir(
241
- input.issue.issueId,
242
- input.task.taskId,
243
- input.runId
244
- )
245
- );
246
- const workspaceFileRefs = collectIssueManagerWorkspaceReferencePaths(
247
- input.task.content || "",
248
- input.issue.content || ""
249
- ).map(
250
- (refPath) => `- [file] ${resolveIssueManagerWorkspaceRuntimePath(input.workspaceRoot, refPath)}`
251
- ).join("\n");
252
- const taskContent = extractIssueManagerPlainTextFromContent(
253
- input.task.content || ""
254
- );
255
- const issueContent = extractIssueManagerPlainTextFromContent(
256
- input.issue.content || ""
257
- );
258
- return [
259
- "\u4F60\u6B63\u5728\u5904\u7406\u4E00\u4E2A\u5DE5\u4F5C\u533A\u4EFB\u52A1\u3002",
260
- "",
261
- `Issue \u6807\u9898\uFF1A${input.issue.title}`,
262
- `Issue \u5185\u5BB9\uFF1A${issueContent || "\uFF08\u65E0\u8865\u5145\u5185\u5BB9\uFF09"}`,
263
- `Task \u6807\u9898\uFF1A${input.task.title}`,
264
- `Task \u5185\u5BB9\uFF1A${taskContent || "\uFF08\u65E0\u8865\u5145\u5185\u5BB9\uFF09"}`,
265
- `\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\uFF1A${input.workspaceRoot}`,
266
- `\u4EFB\u52A1\u8F93\u51FA\u76EE\u5F55\uFF1A${outputDir}`,
267
- "",
268
- "\u5F15\u7528\u8D44\u6599\uFF1A",
269
- workspaceFileRefs || "- \uFF08\u65E0\u5F15\u7528\u8D44\u6599\uFF09",
270
- "",
271
- "\u6267\u884C\u8981\u6C42\uFF1A",
272
- `1. \u5728 ${input.workspaceRoot} \u4E0B\u5DE5\u4F5C\uFF0C\u4E0D\u8981\u5207\u6362\u5230\u5176\u4ED6\u65E0\u5173\u76EE\u5F55\u3002`,
273
- "2. \u5982\u9700\u8BFB\u53D6\u5F15\u7528\u8D44\u6599\uFF0C\u8BF7\u76F4\u63A5\u4F7F\u7528\u4E0A\u9762\u7684\u8DEF\u5F84\u3002",
274
- `3. \u5982\u679C\u7528\u6237\u6CA1\u6709\u53E6\u884C\u6307\u5B9A\u4F4D\u7F6E\uFF0C\u6240\u6709\u6700\u7EC8\u4EA7\u7269\u90FD\u5199\u5165 ${outputDir}/\u3002`,
275
- "4. \u81F3\u5C11\u8F93\u51FA summary.md\uFF0C\u8BF4\u660E\u5904\u7406\u7ED3\u679C\u3001\u6539\u52A8\u4E0E\u7ED3\u8BBA\u3002",
276
- "5. \u4E0D\u8981\u628A\u6700\u7EC8\u4EA7\u7269\u5199\u5230\u5DE5\u4F5C\u533A\u4E4B\u5916\u3002"
277
- ].join("\n");
278
- }
279
- function collectIssueManagerWorkspaceReferencePaths(...contents) {
280
- const paths = /* @__PURE__ */ new Set();
281
- for (const content of contents) {
282
- for (const ref of extractIssueManagerWorkspaceFileLinksFromContent(
283
- content
284
- )) {
285
- paths.add(ref.path);
286
- }
287
- }
288
- return [...paths];
289
- }
290
-
291
- export {
292
- defaultIssueManagerNodeState,
293
- createIssueManagerFeature,
294
- normalizeIssueManagerNodeState,
295
- normalizeIssueManagerContent,
296
- normalizeIssueManagerWorkspaceFileLinkHref,
297
- createIssueManagerWorkspaceFileLinkMarkdown,
298
- appendIssueManagerWorkspaceFileLinksToContent,
299
- extractIssueManagerWorkspaceFileLinksFromContent,
300
- removeIssueManagerWorkspaceFileLinkFromContent,
301
- extractIssueManagerPlainTextFromContent,
302
- extractIssueManagerPlainTextWithoutFilesFromContent,
303
- buildIssueManagerRunOutputDir,
304
- buildIssueManagerUploadDir,
305
- resolveIssueManagerWorkspaceRuntimePath,
306
- buildIssueManagerRunPrompt
307
- };
308
- //# sourceMappingURL=chunk-LYYOPZIJ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/feature.ts","../src/core/content.ts","../src/core/runPrompt.ts"],"sourcesContent":["import type { I18nRuntime } from \"@nextop-os/ui-i18n-runtime\";\nimport {\n createIssueManagerI18nRuntime,\n type IssueManagerI18nRuntime\n} from \"../i18n/issueManagerI18n.ts\";\nimport type {\n IssueManagerAgentRunner,\n IssueManagerBackend,\n IssueManagerFileAdapter,\n IssueManagerIdentityAdapter,\n IssueManagerNodeState,\n IssueManagerShareAdapter\n} from \"../contracts/index.ts\";\n\nexport interface IssueManagerFeature {\n agentRunner: IssueManagerAgentRunner;\n backend: IssueManagerBackend;\n fileAdapter?: IssueManagerFileAdapter;\n i18n: IssueManagerI18nRuntime;\n identityAdapter: IssueManagerIdentityAdapter;\n shareAdapter?: IssueManagerShareAdapter;\n}\n\nexport interface CreateIssueManagerFeatureInput {\n agentRunner: IssueManagerAgentRunner;\n backend: IssueManagerBackend;\n fileAdapter?: IssueManagerFileAdapter;\n i18n?: I18nRuntime<string>;\n identityAdapter: IssueManagerIdentityAdapter;\n shareAdapter?: IssueManagerShareAdapter;\n}\n\nexport const defaultIssueManagerNodeState: IssueManagerNodeState = {\n issueSearchQuery: \"\",\n issueStatusFilter: \"all\",\n selectedAgentProvider: \"codex\",\n selectedIssueId: null,\n selectedTaskId: null\n};\n\nexport function createIssueManagerFeature(\n input: CreateIssueManagerFeatureInput\n): IssueManagerFeature {\n return {\n agentRunner: input.agentRunner,\n backend: input.backend,\n fileAdapter: input.fileAdapter,\n i18n: createIssueManagerI18nRuntime(input.i18n),\n identityAdapter: input.identityAdapter,\n shareAdapter: input.shareAdapter\n };\n}\n\nexport function normalizeIssueManagerNodeState(\n state: Partial<IssueManagerNodeState> | null | undefined\n): IssueManagerNodeState {\n return {\n ...defaultIssueManagerNodeState,\n ...state,\n issueSearchQuery: state?.issueSearchQuery?.trim() ?? \"\",\n issueStatusFilter: state?.issueStatusFilter ?? \"all\",\n selectedAgentProvider: state?.selectedAgentProvider?.trim() || \"codex\",\n selectedIssueId: normalizeNullableString(state?.selectedIssueId),\n selectedTaskId: normalizeNullableString(state?.selectedTaskId)\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","export type IssueManagerWorkspaceFileLinkRef = {\n href: string;\n kind: \"file\" | \"folder\";\n name: string;\n path: string;\n};\n\nexport type IssueManagerWorkspaceFileLinkInput = {\n kind?: \"file\" | \"folder\";\n name?: string | null;\n path: string;\n};\n\nconst markdownLinkPattern = /\\[([^\\]]+)\\]\\(([^)\\s]+)\\)/g;\nconst markdownImagePattern = /!\\[([^\\]]*)\\]\\(([^)\\s]+)\\)/g;\nconst externalLinkPrefix = /^(?:[a-z]+:)?\\/\\//i;\nconst mentionLinkPrefix = /^mention:\\/\\//i;\n\ntype LegacyJSONContentNode = {\n attrs?: Record<string, unknown>;\n content?: LegacyJSONContentNode[];\n text?: string;\n type?: string;\n};\n\nfunction normalizeLineEndings(value: string): string {\n return value.replace(/\\r\\n?/g, \"\\n\");\n}\n\nexport function normalizeIssueManagerContent(value?: string | null): string {\n const trimmed = normalizeLineEndings(value ?? \"\").trim();\n if (!trimmed) {\n return \"\";\n }\n\n const markdown = convertLegacyDocumentString(trimmed);\n return markdown || trimmed;\n}\n\nfunction convertLegacyDocumentString(value: string): string {\n try {\n const parsed = JSON.parse(value) as LegacyJSONContentNode;\n if (parsed?.type !== \"doc\" || !Array.isArray(parsed.content)) {\n return \"\";\n }\n\n return renderLegacyNodesToMarkdown(parsed.content).trim();\n } catch {\n return \"\";\n }\n}\n\nfunction renderLegacyNodesToMarkdown(nodes: LegacyJSONContentNode[]): string {\n return nodes\n .map((node) => renderLegacyNodeToMarkdown(node))\n .filter((part) => part.length > 0)\n .join(\"\\n\\n\");\n}\n\nfunction renderLegacyNodeToMarkdown(\n node: LegacyJSONContentNode | null | undefined\n): string {\n if (!node) {\n return \"\";\n }\n\n if (node.type === \"text\") {\n return node.text ?? \"\";\n }\n\n if (node.type === \"workspaceFileLink\") {\n const attrs = node.attrs ?? {};\n const kind = attrs.kind === \"folder\" ? \"folder\" : \"file\";\n const hrefValue =\n (typeof attrs.href === \"string\" ? attrs.href : undefined) ||\n (typeof attrs.path === \"string\" ? attrs.path : undefined) ||\n \"\";\n const href = normalizeIssueManagerWorkspaceFileLinkHref(hrefValue, kind);\n const label =\n (typeof attrs.name === \"string\" ? attrs.name : undefined)?.trim() ||\n href.split(\"/\").filter(Boolean).at(-1) ||\n href;\n return href && label ? `[${label}](${href})` : label;\n }\n\n if (Array.isArray(node.content)) {\n const inline = node.content\n .map((child) => renderLegacyNodeToMarkdown(child))\n .filter((part) => part.length > 0)\n .join(\"\")\n .trim();\n if (!inline) {\n return \"\";\n }\n if (node.type === \"paragraph\") {\n return inline;\n }\n return inline;\n }\n\n return \"\";\n}\n\nfunction normalizeWorkspacePath(\n pathOrHref: string,\n kind: \"file\" | \"folder\"\n): string {\n const trimmed = pathOrHref.trim();\n if (!trimmed) {\n return \"\";\n }\n if (kind === \"folder\" && !trimmed.endsWith(\"/\")) {\n return `${trimmed}/`;\n }\n return trimmed;\n}\n\nfunction isWorkspaceReferenceHref(href: string): boolean {\n const trimmed = href.trim();\n if (\n !trimmed ||\n mentionLinkPrefix.test(trimmed) ||\n externalLinkPrefix.test(trimmed)\n ) {\n return false;\n }\n return true;\n}\n\nexport function normalizeIssueManagerWorkspaceFileLinkHref(\n pathOrHref: string,\n kind: \"file\" | \"folder\" = \"file\"\n): string {\n return normalizeWorkspacePath(pathOrHref, kind);\n}\n\nexport function createIssueManagerWorkspaceFileLinkMarkdown(\n input: IssueManagerWorkspaceFileLinkInput\n): string {\n const kind = input.kind === \"folder\" ? \"folder\" : \"file\";\n const href = normalizeIssueManagerWorkspaceFileLinkHref(input.path, kind);\n const displayName =\n input.name?.trim() ||\n href.split(\"/\").filter(Boolean).at(-1) ||\n href ||\n input.path.trim();\n if (!href || !displayName) {\n return \"\";\n }\n return `[${displayName}](${href})`;\n}\n\nexport function appendIssueManagerWorkspaceFileLinksToContent(\n value: string | null | undefined,\n refs: readonly IssueManagerWorkspaceFileLinkInput[]\n): string {\n const content = normalizeIssueManagerContent(value);\n const existing = new Set(\n extractIssueManagerWorkspaceFileLinksFromContent(content).map(\n (ref) => ref.path\n )\n );\n const rendered = refs\n .map((ref) => {\n const kind = ref.kind === \"folder\" ? \"folder\" : \"file\";\n const path = normalizeIssueManagerWorkspaceFileLinkHref(ref.path, kind);\n if (!path || existing.has(path)) {\n return \"\";\n }\n existing.add(path);\n return createIssueManagerWorkspaceFileLinkMarkdown({\n ...ref,\n kind,\n path\n });\n })\n .filter(Boolean);\n\n if (rendered.length === 0) {\n return content;\n }\n\n return content ? `${content}\\n\\n${rendered.join(\"\\n\")}` : rendered.join(\"\\n\");\n}\n\nexport function extractIssueManagerWorkspaceFileLinksFromContent(\n value: string | null | undefined\n): IssueManagerWorkspaceFileLinkRef[] {\n const content = normalizeIssueManagerContent(value);\n const refs = new Map<string, IssueManagerWorkspaceFileLinkRef>();\n for (const match of content.matchAll(markdownLinkPattern)) {\n const name = match[1]?.trim() ?? \"\";\n const href = match[2]?.trim() ?? \"\";\n if (!name || !isWorkspaceReferenceHref(href)) {\n continue;\n }\n const kind = href.endsWith(\"/\") ? \"folder\" : \"file\";\n const path = normalizeIssueManagerWorkspaceFileLinkHref(href, kind);\n if (!path || refs.has(path)) {\n continue;\n }\n refs.set(path, {\n href: path,\n kind,\n name,\n path\n });\n }\n return [...refs.values()];\n}\n\nexport function removeIssueManagerWorkspaceFileLinkFromContent(\n content: string,\n path: string\n): string {\n const targetPath = path.trim();\n if (!targetPath) {\n return normalizeIssueManagerContent(content);\n }\n const normalized = normalizeIssueManagerContent(content);\n const next = normalized\n .split(\"\\n\")\n .filter((line) => {\n const trimmed = line.trim();\n if (!trimmed) {\n return true;\n }\n const refs = extractIssueManagerWorkspaceFileLinksFromContent(trimmed);\n return !refs.some((ref) => ref.path === targetPath) || refs.length > 1;\n })\n .join(\"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\");\n return next.trim();\n}\n\nexport function extractIssueManagerPlainTextFromContent(\n value?: string | null\n): string {\n const content = normalizeIssueManagerContent(value);\n if (!content) {\n return \"\";\n }\n return content\n .replace(markdownImagePattern, \" $1 \")\n .replace(markdownLinkPattern, \" $1 \")\n .replace(/^[\\s>*#+-]+/gm, \" \")\n .replace(/`([^`]+)`/g, \" $1 \")\n .replace(/[*_~]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nexport function extractIssueManagerPlainTextWithoutFilesFromContent(\n value?: string | null\n): string {\n const content = normalizeIssueManagerContent(value);\n if (!content) {\n return \"\";\n }\n return content\n .replace(markdownImagePattern, \" \")\n .replace(markdownLinkPattern, \" \")\n .replace(/^[\\s>*#+-]+/gm, \" \")\n .replace(/`([^`]+)`/g, \" $1 \")\n .replace(/[*_~]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n","import type {\n IssueManagerIssueSummary,\n IssueManagerTaskSummary\n} from \"../contracts/index.ts\";\nimport {\n extractIssueManagerPlainTextFromContent,\n extractIssueManagerWorkspaceFileLinksFromContent\n} from \"./content.ts\";\n\nexport function buildIssueManagerRunOutputDir(\n issueId: string,\n taskId: string,\n runId: string\n): string {\n return `/workspace/issues/${issueId}/tasks/${taskId}/runs/${runId}`;\n}\n\nexport function buildIssueManagerUploadDir(\n issueId: string,\n taskId?: string | null\n): string {\n const normalizedTaskId = taskId?.trim();\n if (normalizedTaskId) {\n return `/workspace/issues/${issueId}/tasks/${normalizedTaskId}/attachments`;\n }\n return `/workspace/issues/${issueId}/attachments`;\n}\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 issue: IssueManagerIssueSummary;\n runId: string;\n task: IssueManagerTaskSummary;\n workspaceRoot: string;\n}): string {\n const outputDir = resolveIssueManagerWorkspaceRuntimePath(\n input.workspaceRoot,\n buildIssueManagerRunOutputDir(\n input.issue.issueId,\n input.task.taskId,\n input.runId\n )\n );\n const workspaceFileRefs = collectIssueManagerWorkspaceReferencePaths(\n input.task.content || \"\",\n input.issue.content || \"\"\n )\n .map(\n (refPath) =>\n `- [file] ${resolveIssueManagerWorkspaceRuntimePath(input.workspaceRoot, refPath)}`\n )\n .join(\"\\n\");\n const taskContent = extractIssueManagerPlainTextFromContent(\n input.task.content || \"\"\n );\n const issueContent = extractIssueManagerPlainTextFromContent(\n input.issue.content || \"\"\n );\n\n return [\n \"你正在处理一个工作区任务。\",\n \"\",\n `Issue 标题:${input.issue.title}`,\n `Issue 内容:${issueContent || \"(无补充内容)\"}`,\n `Task 标题:${input.task.title}`,\n `Task 内容:${taskContent || \"(无补充内容)\"}`,\n `当前工作目录:${input.workspaceRoot}`,\n `任务输出目录:${outputDir}`,\n \"\",\n \"引用资料:\",\n workspaceFileRefs || \"- (无引用资料)\",\n \"\",\n \"执行要求:\",\n `1. 在 ${input.workspaceRoot} 下工作,不要切换到其他无关目录。`,\n \"2. 如需读取引用资料,请直接使用上面的路径。\",\n `3. 如果用户没有另行指定位置,所有最终产物都写入 ${outputDir}/。`,\n \"4. 至少输出 summary.md,说明处理结果、改动与结论。\",\n \"5. 不要把最终产物写到工作区之外。\"\n ].join(\"\\n\");\n}\n\nfunction collectIssueManagerWorkspaceReferencePaths(\n ...contents: string[]\n): string[] {\n const paths = new Set<string>();\n for (const content of contents) {\n for (const ref of extractIssueManagerWorkspaceFileLinksFromContent(\n content\n )) {\n paths.add(ref.path);\n }\n }\n return [...paths];\n}\n"],"mappings":"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","names":[]}