@sireai/optimus 0.1.44 → 0.1.46

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 (92) hide show
  1. package/dist/cli/feedback-delivery.js +13 -8
  2. package/dist/cli/feedback-delivery.js.map +1 -1
  3. package/dist/cli/optimus.js +370 -63
  4. package/dist/cli/optimus.js.map +1 -1
  5. package/dist/integrations/feishu/feishu-client.d.ts +13 -0
  6. package/dist/integrations/feishu/feishu-client.js +111 -6
  7. package/dist/integrations/feishu/feishu-client.js.map +1 -1
  8. package/dist/integrations/feishu/feishu-reference-material-downloader.d.ts +34 -0
  9. package/dist/integrations/feishu/feishu-reference-material-downloader.js +572 -0
  10. package/dist/integrations/feishu/feishu-reference-material-downloader.js.map +1 -0
  11. package/dist/integrations/feishu/feishu-token-store.d.ts +25 -1
  12. package/dist/integrations/feishu/feishu-token-store.js +148 -4
  13. package/dist/integrations/feishu/feishu-token-store.js.map +1 -1
  14. package/dist/integrations/feishu/feishu-user-auth-service.d.ts +39 -0
  15. package/dist/integrations/feishu/feishu-user-auth-service.js +228 -0
  16. package/dist/integrations/feishu/feishu-user-auth-service.js.map +1 -0
  17. package/dist/integrations/jira/jira-cli.js +127 -19
  18. package/dist/integrations/jira/jira-cli.js.map +1 -1
  19. package/dist/task-environment/delivery/commit-message/coder-commit-message-template.d.ts +12 -0
  20. package/dist/task-environment/delivery/commit-message/coder-commit-message-template.js +105 -0
  21. package/dist/task-environment/delivery/commit-message/coder-commit-message-template.js.map +1 -0
  22. package/dist/task-environment/delivery/commit-message/commit-message-builder.js +2 -1
  23. package/dist/task-environment/delivery/commit-message/commit-message-builder.js.map +1 -1
  24. package/dist/task-environment/delivery/feishu-analysis-doc-service.d.ts +6 -0
  25. package/dist/task-environment/delivery/feishu-analysis-doc-service.js +106 -34
  26. package/dist/task-environment/delivery/feishu-analysis-doc-service.js.map +1 -1
  27. package/dist/task-environment/delivery/feishu-content/feishu-content-renderer.js +16 -1
  28. package/dist/task-environment/delivery/feishu-content/feishu-content-renderer.js.map +1 -1
  29. package/dist/task-environment/delivery/feishu-content/feishu-copy-config.d.ts +6 -0
  30. package/dist/task-environment/delivery/feishu-content/feishu-copy-config.js +19 -0
  31. package/dist/task-environment/delivery/feishu-content/feishu-copy-config.js.map +1 -1
  32. package/dist/task-environment/delivery/feishu-notifier.js +13 -11
  33. package/dist/task-environment/delivery/feishu-notifier.js.map +1 -1
  34. package/dist/task-environment/delivery/feishu-templates/coder-message-template.d.ts +6 -0
  35. package/dist/task-environment/delivery/feishu-templates/coder-message-template.js +58 -0
  36. package/dist/task-environment/delivery/feishu-templates/coder-message-template.js.map +1 -0
  37. package/dist/task-environment/delivery/feishu-templates/template-registry.js +2 -0
  38. package/dist/task-environment/delivery/feishu-templates/template-registry.js.map +1 -1
  39. package/dist/task-environment/delivery/task-delivery-dispatcher.js +6 -0
  40. package/dist/task-environment/delivery/task-delivery-dispatcher.js.map +1 -1
  41. package/dist/task-environment/delivery/task-delivery-service.d.ts +1 -0
  42. package/dist/task-environment/delivery/task-delivery-service.js +124 -8
  43. package/dist/task-environment/delivery/task-delivery-service.js.map +1 -1
  44. package/dist/task-environment/delivery/task-publication-service.js +9 -6
  45. package/dist/task-environment/delivery/task-publication-service.js.map +1 -1
  46. package/dist/task-environment/document-input/document-structure.d.ts +13 -0
  47. package/dist/task-environment/document-input/document-structure.js +438 -0
  48. package/dist/task-environment/document-input/document-structure.js.map +1 -0
  49. package/dist/task-environment/intake/manual-problem-intake.js +36 -0
  50. package/dist/task-environment/intake/manual-problem-intake.js.map +1 -1
  51. package/dist/task-environment/observability/logger.d.ts +1 -0
  52. package/dist/task-environment/observability/logger.js +26 -0
  53. package/dist/task-environment/observability/logger.js.map +1 -1
  54. package/dist/task-environment/observability/runtime-panel.js +10 -1
  55. package/dist/task-environment/observability/runtime-panel.js.map +1 -1
  56. package/dist/task-environment/orchestration/reference-material-relocator.d.ts +2 -0
  57. package/dist/task-environment/orchestration/reference-material-relocator.js +69 -0
  58. package/dist/task-environment/orchestration/reference-material-relocator.js.map +1 -0
  59. package/dist/task-environment/orchestration/task-orchestrator.d.ts +3 -0
  60. package/dist/task-environment/orchestration/task-orchestrator.js +182 -8
  61. package/dist/task-environment/orchestration/task-orchestrator.js.map +1 -1
  62. package/dist/task-environment/orchestration/task-package-inputs.js +7 -1
  63. package/dist/task-environment/orchestration/task-package-inputs.js.map +1 -1
  64. package/dist/task-environment/orchestration/task-runtime-policy.js +11 -0
  65. package/dist/task-environment/orchestration/task-runtime-policy.js.map +1 -1
  66. package/dist/task-environment/orchestration/triage-runner.js +3 -0
  67. package/dist/task-environment/orchestration/triage-runner.js.map +1 -1
  68. package/dist/task-environment/runtime/optimus-runtime.js +3 -0
  69. package/dist/task-environment/runtime/optimus-runtime.js.map +1 -1
  70. package/dist/task-environment/storage/sqlite-task-store.d.ts +4 -0
  71. package/dist/task-environment/storage/sqlite-task-store.js +70 -1
  72. package/dist/task-environment/storage/sqlite-task-store.js.map +1 -1
  73. package/dist/task-environment/task-handler-descriptor.d.ts +5 -0
  74. package/dist/task-environment/task-handler-descriptor.js +15 -0
  75. package/dist/task-environment/task-handler-descriptor.js.map +1 -0
  76. package/dist/types.d.ts +47 -1
  77. package/embedded-skills/shared/feishu-task-inputs/SKILL.md +56 -0
  78. package/embedded-skills/shared/feishu-task-inputs/scripts/fetch-feishu-doc.mjs +756 -0
  79. package/embedded-skills/shared/feishu-task-inputs/skill.json +5 -0
  80. package/package.json +4 -1
  81. package/task-harnesses/coder/ACCEPT.md +73 -0
  82. package/task-harnesses/coder/CONSTRAINTS.md +72 -0
  83. package/task-harnesses/coder/CONTEXT.md +36 -0
  84. package/task-harnesses/coder/EVOLUTION.md +83 -0
  85. package/task-harnesses/coder/ROLE.md +39 -0
  86. package/task-harnesses/coder/STANDARD.md +258 -0
  87. package/task-harnesses/coder/manifest.json +13 -0
  88. package/task-harnesses/pm/ACCEPT.md +7 -0
  89. package/task-harnesses/pm/CONSTRAINTS.md +5 -0
  90. package/task-harnesses/pm/ROLE.md +5 -8
  91. package/task-harnesses/pm/STANDARD.md +83 -124
  92. package/task-harnesses/registry.json +4 -0
@@ -0,0 +1,572 @@
1
+ import { access, mkdir, open, rm, writeFile } from "node:fs/promises";
2
+ import { basename, dirname, extname, join } from "node:path";
3
+ import { FeishuClient, FeishuIntegrationError } from "./feishu-client.js";
4
+ export class FeishuReferenceMaterialDownloader {
5
+ client;
6
+ fetchImpl;
7
+ rootDir;
8
+ logger;
9
+ constructor(options = {}) {
10
+ this.client = options.client ?? new FeishuClient({
11
+ ...(options.config ? { config: options.config } : {})
12
+ });
13
+ this.fetchImpl = options.fetchImpl ?? globalThis.fetch?.bind(globalThis);
14
+ this.rootDir = options.rootDir?.trim() || join(options.config?.storage.rootDir ?? "", "remote-inputs");
15
+ this.logger = options.logger;
16
+ }
17
+ isConfigured() {
18
+ return Boolean(this.rootDir) && this.client.isConfigured();
19
+ }
20
+ async downloadReferenceMaterials(materials, namespace, sourceUrl) {
21
+ if (!materials.length || !this.isConfigured()) {
22
+ return materials;
23
+ }
24
+ const targetDir = join(this.rootDir, sanitizeFileName(namespace) || "remote-document", "attachments");
25
+ await mkdir(targetDir, { recursive: true });
26
+ const downloadable = materials.filter((material) => this.shouldDownload(material));
27
+ await this.logger?.info("reference_materials.download_started", {
28
+ namespace,
29
+ sourceUrl: sourceUrl ?? null,
30
+ rootDir: this.rootDir,
31
+ targetDir,
32
+ materialCount: materials.length,
33
+ downloadableCount: downloadable.length,
34
+ ...summarizeReferenceMaterialContract(materials)
35
+ });
36
+ const downloadedByIdentity = new Map();
37
+ const output = [];
38
+ let downloadedCount = 0;
39
+ let skippedCount = 0;
40
+ let failedCount = 0;
41
+ for (const material of materials) {
42
+ if (!this.shouldDownload(material)) {
43
+ output.push(material);
44
+ continue;
45
+ }
46
+ const identity = this.buildIdentity(material);
47
+ if (identity && downloadedByIdentity.has(identity)) {
48
+ output.push({
49
+ ...material,
50
+ ...downloadedByIdentity.get(identity)
51
+ });
52
+ continue;
53
+ }
54
+ const downloaded = await this.downloadSingleMaterial(material, targetDir);
55
+ if (identity) {
56
+ downloadedByIdentity.set(identity, downloaded);
57
+ }
58
+ if (downloaded.downloadStatus === "downloaded") {
59
+ downloadedCount += 1;
60
+ }
61
+ else if (downloaded.downloadStatus === "failed") {
62
+ failedCount += 1;
63
+ }
64
+ else {
65
+ skippedCount += 1;
66
+ }
67
+ output.push(downloaded);
68
+ }
69
+ await this.logger?.info("reference_materials.download_completed", {
70
+ namespace,
71
+ targetDir,
72
+ materialCount: materials.length,
73
+ downloadableCount: downloadable.length,
74
+ downloadedCount,
75
+ skippedCount,
76
+ failedCount,
77
+ ...summarizeReferenceMaterialContract(output)
78
+ });
79
+ return output;
80
+ }
81
+ shouldDownload(material) {
82
+ return isFeishuManagedReferenceMaterial(material);
83
+ }
84
+ buildIdentity(material) {
85
+ return material.token?.trim()
86
+ || material.url?.trim()
87
+ || undefined;
88
+ }
89
+ async downloadSingleMaterial(material, targetDir) {
90
+ let directUrlFailureReason;
91
+ if (isFeishuAuthcodeDownloadUrl(material.url)) {
92
+ try {
93
+ return await this.downloadMaterialViaDirectUrl(material, targetDir);
94
+ }
95
+ catch (error) {
96
+ directUrlFailureReason = this.formatDownloadError(error);
97
+ await this.logger?.warn("reference_materials.download_item", {
98
+ title: material.title,
99
+ type: material.type,
100
+ status: "direct_url_failed",
101
+ reason: directUrlFailureReason,
102
+ url: material.url,
103
+ hasLocalPath: false,
104
+ hasInlineContent: hasInlineContent(material)
105
+ });
106
+ }
107
+ }
108
+ const token = material.token?.trim() || extractFeishuFileTokenFromUrl(material.url);
109
+ if (!token) {
110
+ const skipped = directUrlFailureReason
111
+ ? {
112
+ ...material,
113
+ downloadStatus: "failed",
114
+ downloadError: `direct_url_failed: ${directUrlFailureReason}`
115
+ }
116
+ : {
117
+ ...material,
118
+ downloadStatus: "skipped",
119
+ downloadError: "download_token_missing"
120
+ };
121
+ await this.logger?.warn("reference_materials.download_item", {
122
+ title: material.title,
123
+ type: material.type,
124
+ status: skipped.downloadStatus,
125
+ reason: skipped.downloadError,
126
+ hasLocalPath: false,
127
+ hasInlineContent: hasInlineContent(skipped)
128
+ });
129
+ return skipped;
130
+ }
131
+ const candidatePaths = material.type === "image"
132
+ ? [
133
+ `/open-apis/drive/v1/medias/${encodeURIComponent(token)}/download`,
134
+ `/open-apis/drive/v1/files/${encodeURIComponent(token)}/download`
135
+ ]
136
+ : [
137
+ `/open-apis/drive/v1/files/${encodeURIComponent(token)}/download`,
138
+ `/open-apis/drive/v1/medias/${encodeURIComponent(token)}/download`
139
+ ];
140
+ let lastError = directUrlFailureReason ? `direct_url_failed: ${directUrlFailureReason}` : undefined;
141
+ for (const candidate of candidatePaths) {
142
+ try {
143
+ const downloaded = await this.client.getBinary(candidate);
144
+ return await this.persistDownloadedMaterial(material, token, targetDir, downloaded.buffer, downloaded.fileName, downloaded.contentType, candidate);
145
+ }
146
+ catch (error) {
147
+ lastError = appendDownloadError(lastError, this.formatDownloadError(error));
148
+ }
149
+ }
150
+ const failed = {
151
+ ...material,
152
+ token,
153
+ downloadStatus: "failed",
154
+ downloadError: lastError ?? "download_failed"
155
+ };
156
+ await this.logger?.warn("reference_materials.download_item", {
157
+ title: material.title,
158
+ type: material.type,
159
+ token,
160
+ status: failed.downloadStatus,
161
+ reason: failed.downloadError,
162
+ hasLocalPath: false,
163
+ hasInlineContent: hasInlineContent(failed)
164
+ });
165
+ return failed;
166
+ }
167
+ async downloadMaterialViaDirectUrl(material, targetDir) {
168
+ if (!this.fetchImpl) {
169
+ throw new Error("global_fetch_unavailable");
170
+ }
171
+ const fileName = ensureExtension(resolvePreferredFileName(material, undefined, material.mimeType), material, material.mimeType);
172
+ const outputPath = await resolveUniquePath(targetDir, fileName);
173
+ const response = await this.fetchImpl(material.url.trim());
174
+ if (!response.ok) {
175
+ throw new Error(`direct_url_request_failed: ${response.status} ${response.statusText}`.trim());
176
+ }
177
+ const responseFileName = readFileNameFromHeaders(response.headers);
178
+ const contentType = response.headers.get("content-type")?.trim() || undefined;
179
+ const buffer = Buffer.from(await response.arrayBuffer());
180
+ const finalPath = responseFileName
181
+ ? await this.persistDownloadedBuffer(material, outputPath, responseFileName, contentType, buffer)
182
+ : await this.persistDirectBuffer(outputPath, buffer);
183
+ return await this.persistExistingLocalFile(material, material.token?.trim() || extractFeishuFileTokenFromUrl(material.url), finalPath, "feishu_authcode_url");
184
+ }
185
+ async persistDownloadedBuffer(material, provisionalPath, responseFileName, contentType, buffer) {
186
+ const targetDir = dirname(provisionalPath);
187
+ const fileName = ensureExtension(resolvePreferredFileName(material, responseFileName, contentType), material, contentType);
188
+ const finalPath = await resolveUniquePath(targetDir, fileName);
189
+ await writeFile(finalPath, buffer);
190
+ return finalPath;
191
+ }
192
+ async persistDirectBuffer(outputPath, buffer) {
193
+ await writeFile(outputPath, buffer);
194
+ return outputPath;
195
+ }
196
+ async persistDownloadedMaterial(material, token, targetDir, buffer, responseFileName, contentType, via) {
197
+ const fileName = ensureExtension(resolvePreferredFileName(material, responseFileName, contentType), material, contentType);
198
+ const outputPath = await resolveUniquePath(targetDir, fileName);
199
+ await writeFile(outputPath, buffer);
200
+ return await this.finalizeLocalMaterialFile({
201
+ ...material,
202
+ token,
203
+ localPath: outputPath,
204
+ downloadStatus: "downloaded",
205
+ ...(contentType ? { mimeType: material.mimeType ?? contentType } : {})
206
+ }, outputPath, via);
207
+ }
208
+ async persistExistingLocalFile(material, token, outputPath, via) {
209
+ const contentType = material.mimeType ?? extensionToMimeType(extname(outputPath));
210
+ return await this.finalizeLocalMaterialFile({
211
+ ...material,
212
+ localPath: outputPath,
213
+ downloadStatus: "downloaded",
214
+ ...(token ? { token } : {}),
215
+ ...(contentType ? { mimeType: contentType } : {})
216
+ }, outputPath, via);
217
+ }
218
+ async finalizeLocalMaterialFile(result, outputPath, via) {
219
+ try {
220
+ const validatedMimeType = await validateDownloadedMaterial(result, outputPath);
221
+ if (validatedMimeType) {
222
+ result.mimeType = validatedMimeType;
223
+ }
224
+ }
225
+ catch (error) {
226
+ await rm(outputPath, { force: true }).catch(() => undefined);
227
+ throw error;
228
+ }
229
+ await this.logger?.info("reference_materials.download_item", {
230
+ title: result.title,
231
+ type: result.type,
232
+ token: result.token,
233
+ status: result.downloadStatus,
234
+ localPath: outputPath,
235
+ ...(via ? { via } : {}),
236
+ hasLocalPath: true,
237
+ hasInlineContent: hasInlineContent(result)
238
+ });
239
+ return result;
240
+ }
241
+ formatDownloadError(error) {
242
+ if (error instanceof FeishuIntegrationError) {
243
+ const detail = error.diagnostics.detail?.trim();
244
+ return detail ? `${error.message} ${detail}` : error.message;
245
+ }
246
+ if (error && typeof error === "object") {
247
+ const record = error;
248
+ const message = typeof record.message === "string" ? record.message.trim() : "";
249
+ const stderr = typeof record.stderr === "string" ? record.stderr.trim() : "";
250
+ const stdout = typeof record.stdout === "string" ? record.stdout.trim() : "";
251
+ const detail = stderr || stdout;
252
+ if (message && detail && !message.includes(detail)) {
253
+ return `${message} ${detail}`;
254
+ }
255
+ if (message) {
256
+ return message;
257
+ }
258
+ if (detail) {
259
+ return detail;
260
+ }
261
+ }
262
+ if (error instanceof Error) {
263
+ return error.message;
264
+ }
265
+ return String(error);
266
+ }
267
+ }
268
+ function readFileNameFromHeaders(headers) {
269
+ const contentDisposition = headers.get("content-disposition")?.trim();
270
+ if (!contentDisposition) {
271
+ return undefined;
272
+ }
273
+ const utf8Match = contentDisposition.match(/filename\*\s*=\s*UTF-8''([^;]+)/iu);
274
+ if (utf8Match?.[1]) {
275
+ try {
276
+ return decodeURIComponent(utf8Match[1]).trim();
277
+ }
278
+ catch {
279
+ return utf8Match[1].trim();
280
+ }
281
+ }
282
+ const quotedMatch = contentDisposition.match(/filename\s*=\s*"([^"]+)"/iu);
283
+ if (quotedMatch?.[1]) {
284
+ return quotedMatch[1].trim();
285
+ }
286
+ const plainMatch = contentDisposition.match(/filename\s*=\s*([^;]+)/iu);
287
+ return plainMatch?.[1]?.trim();
288
+ }
289
+ function hasInlineContent(material) {
290
+ return typeof material.content === "string" && material.content.trim().length > 0;
291
+ }
292
+ async function validateDownloadedMaterial(material, outputPath) {
293
+ if (material.type !== "image") {
294
+ return material.mimeType;
295
+ }
296
+ const header = await readFileHeader(outputPath, 512);
297
+ const detectedMimeType = detectImageMimeType(header);
298
+ if (!detectedMimeType) {
299
+ throw new Error("downloaded_file_is_not_a_supported_image");
300
+ }
301
+ return detectedMimeType;
302
+ }
303
+ async function readFileHeader(path, byteCount) {
304
+ const handle = await open(path, "r");
305
+ try {
306
+ const buffer = Buffer.alloc(byteCount);
307
+ const { bytesRead } = await handle.read(buffer, 0, byteCount, 0);
308
+ return buffer.subarray(0, bytesRead);
309
+ }
310
+ finally {
311
+ await handle.close();
312
+ }
313
+ }
314
+ function detectImageMimeType(buffer) {
315
+ if (buffer.length >= 8
316
+ && buffer[0] === 0x89
317
+ && buffer[1] === 0x50
318
+ && buffer[2] === 0x4e
319
+ && buffer[3] === 0x47
320
+ && buffer[4] === 0x0d
321
+ && buffer[5] === 0x0a
322
+ && buffer[6] === 0x1a
323
+ && buffer[7] === 0x0a) {
324
+ return "image/png";
325
+ }
326
+ if (buffer.length >= 3
327
+ && buffer[0] === 0xff
328
+ && buffer[1] === 0xd8
329
+ && buffer[2] === 0xff) {
330
+ return "image/jpeg";
331
+ }
332
+ if (buffer.length >= 6) {
333
+ const gifHeader = buffer.subarray(0, 6).toString("ascii");
334
+ if (gifHeader === "GIF87a" || gifHeader === "GIF89a") {
335
+ return "image/gif";
336
+ }
337
+ }
338
+ if (buffer.length >= 12) {
339
+ const riff = buffer.subarray(0, 4).toString("ascii");
340
+ const webp = buffer.subarray(8, 12).toString("ascii");
341
+ if (riff === "RIFF" && webp === "WEBP") {
342
+ return "image/webp";
343
+ }
344
+ }
345
+ const text = buffer.toString("utf8").trimStart();
346
+ if (/^(?:<\?xml[\s\S]*?)?<svg\b/iu.test(text)) {
347
+ return "image/svg+xml";
348
+ }
349
+ return undefined;
350
+ }
351
+ function appendDownloadError(current, next) {
352
+ const normalizedNext = next.trim();
353
+ if (!current?.trim()) {
354
+ return normalizedNext;
355
+ }
356
+ if (!normalizedNext) {
357
+ return current;
358
+ }
359
+ if (current.includes(normalizedNext)) {
360
+ return current;
361
+ }
362
+ return `${current} | ${normalizedNext}`;
363
+ }
364
+ function summarizeReferenceMaterialContract(materials) {
365
+ let localPathCount = 0;
366
+ let inlineContentCount = 0;
367
+ let downloadedStatusCount = 0;
368
+ let failedStatusCount = 0;
369
+ let skippedStatusCount = 0;
370
+ for (const material of materials) {
371
+ if (material.localPath?.trim()) {
372
+ localPathCount += 1;
373
+ }
374
+ if (hasInlineContent(material)) {
375
+ inlineContentCount += 1;
376
+ }
377
+ if (material.downloadStatus === "downloaded") {
378
+ downloadedStatusCount += 1;
379
+ }
380
+ else if (material.downloadStatus === "failed") {
381
+ failedStatusCount += 1;
382
+ }
383
+ else if (material.downloadStatus === "skipped") {
384
+ skippedStatusCount += 1;
385
+ }
386
+ }
387
+ return {
388
+ localPathCount,
389
+ inlineContentCount,
390
+ downloadedStatusCount,
391
+ failedStatusCount,
392
+ skippedStatusCount
393
+ };
394
+ }
395
+ function extractFeishuFileTokenFromUrl(url) {
396
+ const normalized = url?.trim();
397
+ if (!normalized) {
398
+ return undefined;
399
+ }
400
+ const match = normalized.match(/\/file\/([^/?#]+)/u);
401
+ return match?.[1]?.trim();
402
+ }
403
+ function isFeishuAuthcodeDownloadUrl(url) {
404
+ const normalized = url?.trim();
405
+ if (!normalized) {
406
+ return false;
407
+ }
408
+ try {
409
+ const parsed = new URL(normalized);
410
+ return parsed.protocol === "https:"
411
+ && /(?:^|\.)feishu\.cn$/iu.test(parsed.hostname)
412
+ && parsed.pathname.includes("/space/api/box/stream/download/authcode/");
413
+ }
414
+ catch {
415
+ return false;
416
+ }
417
+ }
418
+ function isFeishuFileResourceUrl(url) {
419
+ const normalized = url?.trim();
420
+ if (!normalized) {
421
+ return false;
422
+ }
423
+ try {
424
+ const parsed = new URL(normalized);
425
+ return /(?:^|\.)feishu\.cn$|(?:^|\.)larksuite\.com$/iu.test(parsed.hostname)
426
+ && /\/file\/[^/?#]+/u.test(parsed.pathname);
427
+ }
428
+ catch {
429
+ return false;
430
+ }
431
+ }
432
+ function resolvePreferredFileName(material, responseFileName, contentType) {
433
+ const stableName = buildStableReferenceMaterialName(material, responseFileName, contentType);
434
+ if (stableName) {
435
+ return stableName;
436
+ }
437
+ const candidates = [
438
+ responseFileName,
439
+ material.title,
440
+ material.token ? `${material.type}-${material.token}` : undefined
441
+ ];
442
+ for (const candidate of candidates) {
443
+ const normalized = sanitizeFileName(candidate);
444
+ if (normalized) {
445
+ return normalized;
446
+ }
447
+ }
448
+ const fallbackExt = extensionFromMimeType(contentType) || extensionFromMimeType(material.mimeType);
449
+ return `${material.type}${fallbackExt ?? ""}`;
450
+ }
451
+ function buildStableReferenceMaterialName(material, sourceFileName, contentType) {
452
+ if (material.type !== "image") {
453
+ return undefined;
454
+ }
455
+ const extension = extensionFromFileName(sourceFileName)
456
+ || extensionFromMimeType(contentType)
457
+ || extensionFromMimeType(material.mimeType)
458
+ || ".png";
459
+ const identity = sanitizeFileName(material.assetId)
460
+ || (Number.isFinite(material.order) ? String(material.order).padStart(3, "0") : undefined)
461
+ || sanitizeFileName(material.token);
462
+ if (!identity) {
463
+ return `image${extension}`;
464
+ }
465
+ return `image-${identity}${extension}`;
466
+ }
467
+ function extensionFromFileName(fileName) {
468
+ const extension = extname(fileName?.trim() ?? "").toLowerCase();
469
+ switch (extension) {
470
+ case ".png":
471
+ case ".jpg":
472
+ case ".jpeg":
473
+ case ".webp":
474
+ case ".gif":
475
+ case ".svg":
476
+ return extension;
477
+ default:
478
+ return undefined;
479
+ }
480
+ }
481
+ function ensureExtension(fileName, material, contentType) {
482
+ if (extname(fileName)) {
483
+ return fileName;
484
+ }
485
+ const extension = extensionFromMimeType(contentType)
486
+ || extensionFromMimeType(material.mimeType)
487
+ || (material.type === "image" ? ".png" : undefined);
488
+ return extension ? `${fileName}${extension}` : fileName;
489
+ }
490
+ function extensionFromMimeType(mimeType) {
491
+ const normalized = mimeType?.trim().toLowerCase();
492
+ if (!normalized) {
493
+ return undefined;
494
+ }
495
+ switch (normalized) {
496
+ case "image/png":
497
+ return ".png";
498
+ case "image/jpeg":
499
+ return ".jpeg";
500
+ case "image/webp":
501
+ return ".webp";
502
+ case "image/gif":
503
+ return ".gif";
504
+ case "image/svg+xml":
505
+ return ".svg";
506
+ case "text/html":
507
+ return ".html";
508
+ case "text/markdown":
509
+ return ".md";
510
+ case "application/json":
511
+ return ".json";
512
+ case "text/plain":
513
+ return ".txt";
514
+ default:
515
+ return undefined;
516
+ }
517
+ }
518
+ function extensionToMimeType(extension) {
519
+ switch (extension.trim().toLowerCase()) {
520
+ case ".png":
521
+ return "image/png";
522
+ case ".jpg":
523
+ case ".jpeg":
524
+ return "image/jpeg";
525
+ case ".webp":
526
+ return "image/webp";
527
+ case ".gif":
528
+ return "image/gif";
529
+ case ".svg":
530
+ return "image/svg+xml";
531
+ case ".html":
532
+ return "text/html";
533
+ case ".md":
534
+ return "text/markdown";
535
+ case ".json":
536
+ return "application/json";
537
+ case ".txt":
538
+ return "text/plain";
539
+ default:
540
+ return undefined;
541
+ }
542
+ }
543
+ function sanitizeFileName(value) {
544
+ const normalized = value?.trim().replace(/[\\/:*?"<>|]+/gu, "-").replace(/\s+/gu, " ");
545
+ return normalized ? basename(normalized) : undefined;
546
+ }
547
+ export function isFeishuManagedReferenceMaterial(material) {
548
+ if (material.type === "file") {
549
+ return true;
550
+ }
551
+ if (material.type === "image") {
552
+ return Boolean(material.token?.trim()) || isFeishuFileResourceUrl(material.url) || isFeishuAuthcodeDownloadUrl(material.url);
553
+ }
554
+ return false;
555
+ }
556
+ async function resolveUniquePath(directory, fileName) {
557
+ const extension = extname(fileName);
558
+ const stem = extension ? fileName.slice(0, -extension.length) : fileName;
559
+ for (let attempt = 0; attempt < 10_000; attempt += 1) {
560
+ const candidateName = attempt === 0 ? fileName : `${stem}-${attempt}${extension}`;
561
+ const candidatePath = join(directory, candidateName);
562
+ try {
563
+ await access(candidatePath);
564
+ continue;
565
+ }
566
+ catch {
567
+ return candidatePath;
568
+ }
569
+ }
570
+ throw new Error(`Unable to resolve unique path for ${fileName}.`);
571
+ }
572
+ //# sourceMappingURL=feishu-reference-material-downloader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feishu-reference-material-downloader.js","sourceRoot":"","sources":["../../../src/integrations/feishu/feishu-reference-material-downloader.ts"],"names":[],"mappings":"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"}
@@ -2,16 +2,40 @@ export interface FeishuTenantTokenRecord {
2
2
  tenantAccessToken: string;
3
3
  expireAtMs: number;
4
4
  }
5
+ export interface FeishuUserTokenRecord {
6
+ userAccessToken: string;
7
+ refreshToken: string;
8
+ expireAtMs: number;
9
+ refreshExpireAtMs: number;
10
+ openId?: string;
11
+ tenantKey?: string;
12
+ userId?: string;
13
+ source?: "optimus" | "feishu_cli";
14
+ }
5
15
  export interface FeishuTokenStore {
6
16
  readTenantToken(): Promise<FeishuTenantTokenRecord | undefined>;
7
17
  writeTenantToken(record: FeishuTenantTokenRecord): Promise<void>;
8
18
  clearTenantToken(): Promise<void>;
19
+ readUserToken(): Promise<FeishuUserTokenRecord | undefined>;
20
+ writeUserToken(record: FeishuUserTokenRecord): Promise<void>;
21
+ clearUserToken(): Promise<void>;
22
+ adoptLegacyUserToken?(): Promise<FeishuUserTokenRecord | undefined>;
9
23
  }
10
24
  export declare function resolveDefaultFeishuTokenPath(): string;
25
+ export declare function resolveLegacyFeishuCliTokenPath(): string;
11
26
  export declare class FileFeishuTokenStore implements FeishuTokenStore {
12
27
  private readonly path;
13
- constructor(path?: string);
28
+ private readonly legacyCliPath;
29
+ private static readonly LEGACY_IMPORT_DISABLED_FLAG;
30
+ constructor(path?: string, legacyCliPath?: string);
14
31
  readTenantToken(): Promise<FeishuTenantTokenRecord | undefined>;
15
32
  writeTenantToken(record: FeishuTenantTokenRecord): Promise<void>;
16
33
  clearTenantToken(): Promise<void>;
34
+ readUserToken(): Promise<FeishuUserTokenRecord | undefined>;
35
+ writeUserToken(record: FeishuUserTokenRecord): Promise<void>;
36
+ clearUserToken(): Promise<void>;
37
+ adoptLegacyUserToken(): Promise<FeishuUserTokenRecord | undefined>;
38
+ private readRaw;
39
+ private readLegacyCliUserToken;
40
+ private writeRaw;
17
41
  }