superun-ai-cli 0.1.27 → 0.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.en.md CHANGED
@@ -292,9 +292,29 @@ After the user explicitly asks to launch the site, use `chat publish status <ses
292
292
 
293
293
  `chat publish start --indexing allow|deny` controls search-engine indexing, not visitor access. Change site visibility with `chat publish visibility`. If the service requires acknowledgment of cloud costs, review them before explicitly passing `--acknowledge-cloud-fee`.
294
294
 
295
- ## Attachments
295
+ ## Text input and attachments
296
296
 
297
- `chat create/send` accepts repeated `--file <path>` options. Small text files may be included directly in the message; other files are uploaded and approved before the message is sent. The per-file limit is 20 MB.
297
+ `chat create/send/test/review` supports repeated `--file <path>` options for local uploads. Supply text through mutually exclusive `--message <text>` or `--input <file>` / `--input -`. JSON accepts only `content` or `message`, not `attachments`, inline file data, or attachment URLs. `--input` reads request JSON; only `--file` uploads a file. create/send also accepts files without text.
298
+
299
+ ```bash
300
+ superun-ai chat create --message "Build a chat summary app using the attachment" --file ./feishu-group-digest.md
301
+ superun-ai chat send <sessionId> --input ./request.json --file ./design.png --file ./requirements.pdf
302
+ ```
303
+
304
+ The CLI loads Glow's current file extension and size rules before uploading. Current China production limits are listed below; the connected environment's response is authoritative.
305
+
306
+ | Category | Supported extensions | Current per-file limit |
307
+ | --- | --- | --- |
308
+ | Images | png, jpg, jpeg, webp, gif | 20 MB; try Glow's compression flow when exceeded |
309
+ | Text and code | txt, md, svg, js, ts, jsx, tsx, py, java, cpp, c, h, cs, php, rb, go, rs, swift, html, css, scss, less, json, xml, yaml, yml | 5 MB |
310
+ | Documents | pdf, docx | 50 MB |
311
+ | Spreadsheets | xlsx, xls; csv | Excel 30 MB; CSV 5 MB |
312
+ | Video | mp4, mov, webm, avi, wmv, flv, mkv | 15 MB; readable duration of at most 5 minutes plus 2 seconds tolerance |
313
+ | Audio and archives | mp3, wav, ogg, flac, m4a, aac, zip, rar | 15 MB |
314
+
315
+ Each message allows at most 10 files, including at most 5 PDFs. Image dimensions/pixel count, PDF pages, and Word image counts follow the same rules as Glow. Current China production limits are 29900 pixels per image edge, 24999999 total pixels, and 800 PDF pages or Word images. Missing configuration, invalid files, audit failures, or preprocessing failures stop the entire message instead of silently dropping attachments.
316
+
317
+ Every file, including small Markdown/TXT files, is uploaded and audited before being sent as `name/url/mediaType/meta`. PDFs, Word documents, and Excel/CSV files use Glow's preprocessing services and retain their parsed metadata. File text and Base64 are never sent as attachment `content`. Progress goes to stderr; the creation message is sent once, after every attachment is ready. `--no-wait` still completes upload, audit, and preprocessing. Bundled dependencies read image dimensions and video duration locally without requiring FFmpeg. Do not upload `.env` or CLI credential files.
298
318
 
299
319
  `session get --include-attachments` returns visible attachments. `chat state --include-file <name>` reads a named visible file. System files and secret configuration are not returned as result attachments.
300
320
 
package/README.md CHANGED
@@ -420,9 +420,29 @@ superun-ai chat publish visibility <sessionId> private
420
420
 
421
421
  `chat publish start --indexing allow|deny` 控制搜索引擎索引,不限制用户访问;站点上下线使用 `chat publish visibility`。若服务端要求确认云服务费用,了解费用后可显式传入 `--acknowledge-cloud-fee`。
422
422
 
423
- ## 附件
423
+ ## 文本输入与附件
424
424
 
425
- `chat create/send` 支持重复传入 `--file <path>`。小型文本文件可以直接作为内容输入,其余文件上传并完成审核后才发送消息。单文件上限 20MB。
425
+ `chat create/send/test/review` 支持重复使用 `--file <path>` 上传本地文件。文本仍通过互斥的 `--message <text>` 或 `--input <file>` / `--input -` 传入;JSON 只包含 `content` 或 `message`,不接受 `attachments`、内联文件内容或附件 URL。`--input` 读取的是请求 JSON,不会将该 JSON 文件上传;要上传文件必须显式使用 `--file`。create/send 也支持仅传文件。
426
+
427
+ ```bash
428
+ superun-ai chat create --message "根据附件制作聊天消息总结应用" --file ./feishu-group-digest.md
429
+ superun-ai chat send <sessionId> --input ./request.json --file ./design.png --file ./requirements.pdf
430
+ ```
431
+
432
+ CLI 每次上传前读取 Glow 同源的服务端格式和大小限制。当前主站配置如下,实际限制以当前连接环境返回为准:
433
+
434
+ | 文件类别 | 支持扩展名 | 当前单文件上限 |
435
+ | --- | --- | --- |
436
+ | 图片 | png、jpg、jpeg、webp、gif | 20MB,超限时按 Glow 流程尝试压缩 |
437
+ | 文本及代码 | txt、md、svg、js、ts、jsx、tsx、py、java、cpp、c、h、cs、php、rb、go、rs、swift、html、css、scss、less、json、xml、yaml、yml | 5MB |
438
+ | 文档 | pdf、docx | 50MB |
439
+ | 表格 | xlsx、xls;csv | Excel 30MB,CSV 5MB |
440
+ | 视频 | mp4、mov、webm、avi、wmv、flv、mkv | 15MB,必须能读取时长且不超过 5 分钟(含 2 秒容差) |
441
+ | 音频及压缩包 | mp3、wav、ogg、flac、m4a、aac、zip、rar | 15MB |
442
+
443
+ 每条消息最多 10 个文件,其中 PDF 最多 5 个;图片宽高、总像素、PDF 页数和 Word 图片数按同源规则校验。当前主站图片单边不超过 29900 像素,总像素不超过 24999999,PDF 页数和 Word 图片数上限为 800。格式配置不可用、文件不合法、审核失败或预处理失败时整条消息停止,不静默丢弃附件。
444
+
445
+ 所有文件(包括很小的 Markdown/TXT)都先上传、审核,再按 Glow 的 `name/url/mediaType/meta` 结构发送;PDF、Word、Excel/CSV 按同源服务预处理,保留解析元数据。不会把文件正文或 Base64 放入附件 `content`。上传过程写入 stderr,只有全部附件就绪后才发出一次创作消息;`--no-wait` 也会完成上传、审核和预处理。图片尺寸和视频时长由随包依赖在本机读取,无需安装 FFmpeg。不要上传 `.env` 或 CLI 凭据等敏感文件。
426
446
 
427
447
  `session get --include-attachments` 返回可见附件清单;`chat state --include-file <name>` 读取指定可见附件正文。系统文件和密钥配置文件不会作为结果附件返回。
428
448
 
@@ -1,9 +1,11 @@
1
1
  /** 对话创建、工具回复和项目内容更新。@author xiuyu.yi */
2
2
  import type { ApiClient } from '../transport/api-client.js';
3
3
  import type { JsonObject } from '../contracts/value.js';
4
+ import type { InputAttachment } from './upload-api.js';
4
5
  export type ChatInput = {
5
6
  sessionId?: string;
6
7
  content: string;
8
+ attachments?: InputAttachment[];
7
9
  model?: string;
8
10
  minDuration?: number;
9
11
  previewVersionId?: number;
@@ -16,7 +18,6 @@ export type ChatInput = {
16
18
  preReplyMessageId?: string;
17
19
  parallelSelectRequest?: JsonObject;
18
20
  excludedInheritedRoundExtraKeys?: Array<string>;
19
- attachments?: Array<JsonObject>;
20
21
  };
21
22
  export declare class AgentCommandApi {
22
23
  private readonly client;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-command-api.js","sourceRoot":"","sources":["../../src/api/agent-command-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-command-api.js","sourceRoot":"","sources":["../../src/api/agent-command-api.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,10 @@
1
1
  import type { CreationRuntime } from '../runtime.js';
2
+ import type { JsonObject } from '../contracts/value.js';
3
+ import type { PreparedFile } from './upload-files.js';
2
4
  export type InputAttachment = {
3
5
  name: string;
6
+ url: string;
4
7
  mediaType: string;
5
- content?: string;
6
- url?: string;
8
+ meta?: JsonObject;
7
9
  };
8
- export declare function uploadAttachment(service: CreationRuntime, path: string): Promise<InputAttachment>;
10
+ export declare function uploadAttachment(service: CreationRuntime, file: PreparedFile): Promise<InputAttachment>;
@@ -1,71 +1,205 @@
1
- /** 文件上传凭据申请、内容上传和审核状态查询。@author xiuyu.yi */
2
- import { readFile, stat } from 'node:fs/promises';
3
- import { basename, extname } from 'node:path';
4
- import { list, object, text, requiredText } from '../contracts/value.js';
1
+ /** 复用 Glow 的七牛上传、审核和文档预处理,只发送 URL 附件。@author xiuyu.yi */
2
+ import { z } from 'zod';
5
3
  import { pollOperation } from '../commands/shared.js';
4
+ import { list, object, requiredText } from '../contracts/value.js';
6
5
  import { CliError } from '../output/exit-codes.js';
7
- const MIME = {
8
- txt: 'text/plain',
9
- md: 'text/markdown',
10
- json: 'application/json',
11
- csv: 'text/csv',
12
- pdf: 'application/pdf',
13
- png: 'image/png',
14
- jpg: 'image/jpeg',
15
- jpeg: 'image/jpeg',
16
- webp: 'image/webp',
17
- gif: 'image/gif',
18
- docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
19
- xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
20
- };
21
- export async function uploadAttachment(service, path) {
22
- const name = basename(path), extension = extname(name).slice(1).toLowerCase();
23
- const mediaType = MIME[extension];
24
- if (!mediaType)
25
- throw new CliError('INVALID_ARGUMENT', '不支持该附件扩展名');
26
- const info = await stat(path).catch(() => undefined);
27
- if (!info?.isFile() || info.size > 20 * 1024 * 1024)
28
- throw new CliError('INVALID_ARGUMENT', '附件必须为不超过 20MB 的普通文件');
29
- const bytes = await readFile(path);
30
- if (['txt', 'md', 'json', 'csv'].includes(extension) && bytes.length <= 256_000)
31
- return { name, mediaType, content: bytes.toString('utf8') };
32
- const tokenResponse = await service.client.request(`/api/uxa-center/support/FileUpload/getUploadToken?fileType=${encodeURIComponent(extension)}`, undefined, { method: 'GET' });
33
- const token = object(tokenResponse.data), credential = requiredText(token.token, '上传凭据');
6
+ import { HttpClient } from '../transport/http-client.js';
7
+ import { getSuperunHostingDomain } from '../config/runtime-config.js';
8
+ import { MAX_PIXELS, MB } from './upload-files.js';
9
+ const urlSchema = z
10
+ .string()
11
+ .url()
12
+ .refine((value) => {
13
+ const url = new URL(value);
14
+ return ['http:', 'https:'].includes(url.protocol) && !url.username && !url.password;
15
+ });
16
+ const numberSchema = z.number().finite().nonnegative();
17
+ function parse(schema, value, label) {
18
+ const result = schema.safeParse(value);
19
+ if (!result.success)
20
+ throw new CliError('PROTOCOL_ERROR', `${label}返回的数据无效,尚未发送创作消息`);
21
+ return result.data;
22
+ }
23
+ async function uploadToCdn(service, file) {
24
+ const response = await service.client.request(`/api/uxa-center/support/FileUpload/getUploadToken?fileType=${encodeURIComponent(file.extension)}`, undefined, { method: 'GET' });
25
+ const token = object(response.data), credential = requiredText(token.token, '上传凭据');
34
26
  service.output.registerSecret(credential);
35
27
  const encryptedId = requiredText(token.encryptedId, '上传记录');
36
28
  const form = new FormData();
37
29
  form.append('token', credential);
38
- form.append('file', new Blob([bytes], { type: mediaType }), name);
30
+ form.append('file', file.blob, file.name);
31
+ const signal = service.client.signal;
39
32
  let uploaded;
40
33
  try {
41
34
  uploaded = await fetch('https://upload-na0.qiniup.com', {
42
35
  method: 'POST',
43
36
  body: form,
44
37
  redirect: 'error',
45
- signal: service.client.signal
46
- ? AbortSignal.any([service.client.signal, AbortSignal.timeout(60_000)])
47
- : AbortSignal.timeout(60_000),
38
+ signal: signal ? AbortSignal.any([signal, AbortSignal.timeout(60_000)]) : AbortSignal.timeout(60_000),
48
39
  });
49
40
  }
50
41
  catch {
51
- throw new CliError('OUTCOME_UNKNOWN', '附件上传结果不确定,尚未发送创作消息');
42
+ throw new CliError(signal?.aborted ? 'INTERRUPTED' : 'OUTCOME_UNKNOWN', `${file.name}:上传已中断或结果不确定,尚未发送创作消息`);
52
43
  }
44
+ await uploaded.body?.cancel();
53
45
  if (!uploaded.ok)
54
- throw new CliError('BUSINESS_ERROR', '附件上传失败,尚未发送创作消息');
55
- const file = await pollOperation(async () => {
56
- const result = object(await service.client.call('/api/uxa-center/support/FileUpload/queryFileUrl', {
46
+ throw new CliError('BUSINESS_ERROR', `${file.name}:附件上传失败,尚未发送创作消息`);
47
+ service.output.log(`${file.name}:上传完成,等待审核`);
48
+ return pollOperation(async () => {
49
+ const response = object(await service.client.call('/api/uxa-center/support/FileUpload/queryFileUrl', {
57
50
  encryptedIds: [encryptedId],
58
51
  }));
59
- const item = object(list(result.items)[0]);
60
- if (item.auditStatus === 1 || item.auditStatus === 4)
61
- return item;
62
- if (item.auditStatus === 0)
63
- return item;
64
- throw new CliError('BUSINESS_ERROR', '附件审核未通过');
65
- }, (item) => item.auditStatus !== 0, { timeout: 180, signal: service.client.signal });
66
- const url = text(file.url);
67
- if (!url)
68
- throw new CliError('PROTOCOL_ERROR', '附件审核完成但没有可用地址');
69
- return { name, mediaType, url };
52
+ const item = object(list(response.items)[0]);
53
+ switch (item.auditStatus) {
54
+ case 0:
55
+ return undefined;
56
+ case 1:
57
+ case 4:
58
+ return parse(urlSchema, item.url, '附件审核');
59
+ case 2:
60
+ throw new CliError('BUSINESS_ERROR', `${file.name}:附件审核未通过,尚未发送创作消息`);
61
+ case 3:
62
+ throw new CliError('BUSINESS_ERROR', `${file.name}:附件审核结果存疑,尚未发送创作消息`);
63
+ default:
64
+ throw new CliError('BUSINESS_ERROR', `${file.name}:附件审核异常,尚未发送创作消息`);
65
+ }
66
+ }, (url) => url !== undefined, { timeout: 180, signal }).then((url) => url);
67
+ }
68
+ async function preprocess(service, path, payload) {
69
+ const domain = getSuperunHostingDomain(service.client.config.endpoint) === 'superun.yun' ? 'superun.com' : 'superun.ai';
70
+ const response = await new HttpClient().request({
71
+ url: `https://heavylift.${domain}/document/${path}/json`,
72
+ body: payload,
73
+ headers: { 'content-type': 'application/json' },
74
+ write: true,
75
+ timeoutMs: 300_000,
76
+ signal: service.client.signal,
77
+ });
78
+ const taskId = requiredText(object(response.data).taskId, '文件预处理任务');
79
+ return pollOperation(async () => {
80
+ const task = object(await service.client.call('/api/uxa-center/support/FileUpload/pollFileTask', { taskId }));
81
+ if (task.status === 0 || task.status === 1)
82
+ return undefined;
83
+ if (task.status === 3)
84
+ throw new CliError('BUSINESS_ERROR', '附件预处理失败,尚未发送创作消息');
85
+ if (task.status !== 2 || typeof task.result !== 'string')
86
+ throw new CliError('PROTOCOL_ERROR', '附件预处理返回未知状态,尚未发送创作消息');
87
+ let result;
88
+ try {
89
+ result = object(JSON.parse(task.result));
90
+ }
91
+ catch {
92
+ throw new CliError('PROTOCOL_ERROR', '无法读取附件预处理结果,尚未发送创作消息');
93
+ }
94
+ if (result.code !== 0)
95
+ throw new CliError('BUSINESS_ERROR', result.code === 10002 ? '不支持加密 PDF,尚未发送创作消息' : '附件预处理未通过,尚未发送创作消息');
96
+ return object(result.data);
97
+ }, (result) => result !== undefined, { timeout: 300, signal: service.client.signal }).then((result) => result);
98
+ }
99
+ function checkSize(file, bytes) {
100
+ if (bytes > file.rule.size * MB)
101
+ throw new CliError('INVALID_ARGUMENT', `${file.name}:处理后文件仍超过 ${file.rule.size}MB,尚未发送创作消息`);
102
+ }
103
+ function checkLimit(file, value, limit, label) {
104
+ if (limit !== undefined && value > limit)
105
+ throw new CliError('INVALID_ARGUMENT', `${file.name}:${label}超过 ${limit},尚未发送创作消息`);
106
+ }
107
+ const bytesToMb = (bytes) => Math.round((bytes / MB) * 100) / 100;
108
+ export async function uploadAttachment(service, file) {
109
+ service.output.log(`${file.name}:正在上传附件`);
110
+ const url = await uploadToCdn(service, file);
111
+ const attachment = { name: file.name, url, mediaType: file.mediaType };
112
+ const { extension, rule } = file;
113
+ if (file.image) {
114
+ let { width, height } = file.image;
115
+ let fileSize = file.blob.size;
116
+ const maxPixels = Math.min(rule.maxPixels ?? MAX_PIXELS, MAX_PIXELS);
117
+ if (fileSize > rule.size * MB || width * height > maxPixels) {
118
+ service.output.log(`${file.name}:正在压缩图片`);
119
+ const result = parse(z.object({
120
+ image_url: urlSchema,
121
+ width: numberSchema.positive(),
122
+ height: numberSchema.positive(),
123
+ file_size: numberSchema,
124
+ }), await preprocess(service, 'compress-image', {
125
+ image_url: url,
126
+ max_dimension: width * height > maxPixels
127
+ ? Math.floor(Math.max(width, height) * Math.sqrt(maxPixels / (width * height)))
128
+ : -1,
129
+ }), '图片压缩');
130
+ attachment.url = result.image_url;
131
+ width = result.width;
132
+ height = result.height;
133
+ fileSize = result.file_size;
134
+ }
135
+ checkSize(file, fileSize);
136
+ checkLimit(file, Math.max(width, height), rule.maxSize, '图片宽高');
137
+ checkLimit(file, width * height, maxPixels, '图片总像素');
138
+ attachment.meta = { image: { image_url: attachment.url, width, height, file_size: bytesToMb(fileSize) } };
139
+ }
140
+ else if (extension === 'pdf') {
141
+ service.output.log(`${file.name}:正在预处理 PDF`);
142
+ const result = parse(z.object({
143
+ url: urlSchema,
144
+ parsed_file_size: numberSchema,
145
+ parsed_page_count: numberSchema,
146
+ agent_representation: z.enum(['native_pdf', 'text_link']).optional(),
147
+ representation_reason: z.string().nullable().optional(),
148
+ }), await preprocess(service, 'compress-pdf', {
149
+ pdf_url: url,
150
+ compress_level: 'medium',
151
+ grayscale: false,
152
+ keep_pages: [],
153
+ }), 'PDF 预处理');
154
+ checkSize(file, result.parsed_file_size);
155
+ checkLimit(file, result.parsed_page_count, rule.visualCount, 'PDF 页数');
156
+ attachment.url = result.url;
157
+ attachment.meta = {
158
+ parsed_visual_count: result.parsed_page_count,
159
+ parsed_file_size: bytesToMb(result.parsed_file_size),
160
+ agent_representation: result.agent_representation ?? 'native_pdf',
161
+ representation_reason: result.representation_reason ?? null,
162
+ };
163
+ }
164
+ else if (extension === 'docx') {
165
+ service.output.log(`${file.name}:正在解析 Word 文档`);
166
+ const result = parse(z.object({
167
+ url: urlSchema.nullable().optional(),
168
+ parsed_url: urlSchema,
169
+ parsed_image_map: z.record(z.string()).default({}),
170
+ parsed_file_size: numberSchema,
171
+ parsed_text_length: numberSchema,
172
+ }), await preprocess(service, 'docx-to-md', { docx_url: url }), 'Word 预处理');
173
+ checkSize(file, result.parsed_file_size);
174
+ const count = Object.keys(result.parsed_image_map).length;
175
+ checkLimit(file, count, rule.visualCount, '文档图片数');
176
+ checkLimit(file, result.parsed_text_length, rule.textLimit, '文本长度');
177
+ attachment.url = result.url ?? result.parsed_url;
178
+ attachment.meta = {
179
+ parsed_url: result.parsed_url,
180
+ parsed_image_map: result.parsed_image_map,
181
+ parsed_visual_count: count,
182
+ parsed_file_size: bytesToMb(result.parsed_file_size),
183
+ parsed_text_length: result.parsed_text_length,
184
+ };
185
+ }
186
+ else if (['xlsx', 'xls', 'csv'].includes(extension)) {
187
+ service.output.log(`${file.name}:正在解析表格`);
188
+ const csv = extension === 'csv';
189
+ const result = parse(z.object({
190
+ url: urlSchema.nullable().optional(),
191
+ items: z.array(z
192
+ .object({
193
+ csv_url: urlSchema,
194
+ row_count: numberSchema,
195
+ rows: z.array(z.array(z.string())).optional(),
196
+ })
197
+ .passthrough()),
198
+ }), await preprocess(service, csv ? 'csv-parse' : 'xlsx-to-csv', csv ? { csv_url: url } : { xlsx_url: url }), '表格预处理');
199
+ attachment.url = result.url ?? url;
200
+ attachment.meta = { parsed_file_size: bytesToMb(file.blob.size), csvs: result.items };
201
+ }
202
+ service.output.log(`${file.name}:附件已就绪`);
203
+ return attachment;
70
204
  }
71
205
  //# sourceMappingURL=upload-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"upload-api.js","sourceRoot":"","sources":["../../src/api/upload-api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upload-api.js","sourceRoot":"","sources":["../../src/api/upload-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { z } from 'zod';
2
+ import type { CreationRuntime } from '../runtime.js';
3
+ export declare const MB: number;
4
+ export declare const MAX_PIXELS = 24999999;
5
+ declare const ruleSchema: z.ZodObject<{
6
+ fileType: z.ZodEnum<["image", "text", "raw"]>;
7
+ ext: z.ZodString;
8
+ size: z.ZodNumber;
9
+ maxSize: z.ZodOptional<z.ZodNumber>;
10
+ maxPixels: z.ZodOptional<z.ZodNumber>;
11
+ visualCount: z.ZodOptional<z.ZodNumber>;
12
+ textLimit: z.ZodOptional<z.ZodNumber>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ fileType: "image" | "text" | "raw";
15
+ ext: string;
16
+ size: number;
17
+ maxSize?: number | undefined;
18
+ maxPixels?: number | undefined;
19
+ visualCount?: number | undefined;
20
+ textLimit?: number | undefined;
21
+ }, {
22
+ fileType: "image" | "text" | "raw";
23
+ ext: string;
24
+ size: number;
25
+ maxSize?: number | undefined;
26
+ maxPixels?: number | undefined;
27
+ visualCount?: number | undefined;
28
+ textLimit?: number | undefined;
29
+ }>;
30
+ export type UploadRule = z.infer<typeof ruleSchema>;
31
+ export type PreparedFile = {
32
+ name: string;
33
+ extension: string;
34
+ mediaType: string;
35
+ rule: UploadRule;
36
+ blob: Blob;
37
+ image?: {
38
+ width: number;
39
+ height: number;
40
+ };
41
+ };
42
+ /** 整批完成本地校验后才申请上传凭据,避免静默丢弃附件或发送不完整需求。 */
43
+ export declare function prepareUploadFiles(service: CreationRuntime, paths: string[]): Promise<PreparedFile[]>;
44
+ export {};
@@ -0,0 +1,154 @@
1
+ /** 与 Glow 同源的上传白名单、数量、大小和媒体预检。@author xiuyu.yi */
2
+ import { openAsBlob } from 'node:fs';
3
+ import { stat } from 'node:fs/promises';
4
+ import { basename, extname } from 'node:path';
5
+ import { Worker } from 'node:worker_threads';
6
+ import { z } from 'zod';
7
+ import { CliError } from '../output/exit-codes.js';
8
+ export const MB = 1024 * 1024;
9
+ export const MAX_PIXELS = 24_999_999;
10
+ const ruleSchema = z.object({
11
+ fileType: z.enum(['image', 'text', 'raw']),
12
+ ext: z.string().min(1),
13
+ size: z.number().finite().positive(),
14
+ maxSize: z.number().finite().positive().optional(),
15
+ maxPixels: z.number().finite().positive().optional(),
16
+ visualCount: z.coerce.number().finite().positive().optional(),
17
+ textLimit: z.number().finite().positive().optional(),
18
+ });
19
+ const MIME = {
20
+ png: 'image/png',
21
+ jpg: 'image/jpeg',
22
+ jpeg: 'image/jpeg',
23
+ webp: 'image/webp',
24
+ gif: 'image/gif',
25
+ svg: 'image/svg+xml',
26
+ pdf: 'application/pdf',
27
+ docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
28
+ xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
29
+ xls: 'application/vnd.ms-excel',
30
+ csv: 'text/csv',
31
+ txt: 'text/plain',
32
+ md: 'text/markdown',
33
+ json: 'application/json',
34
+ js: 'text/javascript',
35
+ jsx: 'text/javascript',
36
+ ts: 'text/plain',
37
+ tsx: 'text/plain',
38
+ html: 'text/html',
39
+ css: 'text/css',
40
+ scss: 'text/plain',
41
+ less: 'text/plain',
42
+ xml: 'application/xml',
43
+ yaml: 'text/yaml',
44
+ yml: 'text/yaml',
45
+ mp4: 'video/mp4',
46
+ mov: 'video/quicktime',
47
+ webm: 'video/webm',
48
+ avi: 'video/x-msvideo',
49
+ wmv: 'video/x-ms-wmv',
50
+ flv: 'video/x-flv',
51
+ mkv: 'video/x-matroska',
52
+ mp3: 'audio/mpeg',
53
+ wav: 'audio/wav',
54
+ ogg: 'audio/ogg',
55
+ flac: 'audio/flac',
56
+ m4a: 'audio/mp4',
57
+ aac: 'audio/aac',
58
+ zip: 'application/zip',
59
+ rar: 'application/vnd.rar',
60
+ };
61
+ for (const ext of ['py', 'java', 'cpp', 'c', 'h', 'cs', 'php', 'rb', 'go', 'rs', 'swift'])
62
+ MIME[ext] = 'text/plain';
63
+ function readMedia(path, image, signal) {
64
+ return new Promise((resolve, reject) => {
65
+ const worker = new Worker(new URL('./upload-media-worker.js', import.meta.url), {
66
+ workerData: { path, image },
67
+ execArgv: [],
68
+ });
69
+ let finished = false;
70
+ const finish = (error, result) => {
71
+ if (finished)
72
+ return;
73
+ finished = true;
74
+ clearTimeout(timer);
75
+ signal?.removeEventListener('abort', abort);
76
+ void worker.terminate();
77
+ if (error)
78
+ reject(error);
79
+ else
80
+ resolve(result);
81
+ };
82
+ const abort = () => finish(new CliError('INTERRUPTED', '已取消附件预检,尚未发送创作消息'));
83
+ const timer = setTimeout(() => finish(new CliError('INVALID_ARGUMENT', `${basename(path)}:无法在 30 秒内读取媒体信息`)), 30_000);
84
+ worker.once('message', (result) => finish(undefined, result));
85
+ worker.once('error', () => finish(new CliError('INVALID_ARGUMENT', `${basename(path)}:无法读取媒体信息,请检查文件是否损坏`)));
86
+ worker.once('exit', () => {
87
+ if (!finished)
88
+ finish(new CliError('INVALID_ARGUMENT', `${basename(path)}:媒体预检未返回结果`));
89
+ });
90
+ signal?.addEventListener('abort', abort, { once: true });
91
+ if (signal?.aborted)
92
+ abort();
93
+ });
94
+ }
95
+ /** 整批完成本地校验后才申请上传凭据,避免静默丢弃附件或发送不完整需求。 */
96
+ export async function prepareUploadFiles(service, paths) {
97
+ if (!paths.length)
98
+ return [];
99
+ if (paths.length > 10)
100
+ throw new CliError('INVALID_ARGUMENT', '每条消息最多上传 10 个文件');
101
+ if (paths.filter((path) => extname(path).toLowerCase() === '.pdf').length > 5)
102
+ throw new CliError('INVALID_ARGUMENT', '每条消息最多上传 5 个 PDF');
103
+ const response = await service.client.request('/web-api/config/file-ext-config', undefined, {
104
+ method: 'GET',
105
+ });
106
+ const config = z.object({ fileExts: z.record(ruleSchema) }).safeParse(response.data);
107
+ if (!config.success || !Object.keys(config.data.fileExts).length)
108
+ throw new CliError('PROTOCOL_ERROR', '未取得有效的附件格式限制,尚未上传文件');
109
+ const prepared = [];
110
+ for (const path of paths) {
111
+ if (service.client.signal?.aborted)
112
+ throw new CliError('INTERRUPTED', '已取消附件预检');
113
+ const name = basename(path), extension = extname(name).slice(1).toLowerCase();
114
+ const rule = config.data.fileExts[extension], mediaType = MIME[extension];
115
+ if (!rule || !mediaType || rule.ext.toLowerCase() !== extension)
116
+ throw new CliError('INVALID_ARGUMENT', `${name}:不支持此文件格式`, {
117
+ supportedExtensions: Object.keys(config.data.fileExts).filter((ext) => MIME[ext]),
118
+ });
119
+ const info = await stat(path).catch(() => undefined);
120
+ if (!info?.isFile() || info.size === 0)
121
+ throw new CliError('INVALID_ARGUMENT', `${name}:附件必须是可读取的非空普通文件`);
122
+ // 图片允许先按 Glow 的流程压缩,其余格式在上传前检查原文件大小。
123
+ if (rule.fileType !== 'image' && info.size > rule.size * MB)
124
+ throw new CliError('INVALID_ARGUMENT', `${name}:文件不能超过 ${rule.size}MB`);
125
+ const item = {
126
+ name,
127
+ extension,
128
+ mediaType,
129
+ rule,
130
+ blob: await openAsBlob(path, { type: mediaType }),
131
+ };
132
+ if (rule.fileType === 'image' || mediaType.startsWith('video/')) {
133
+ const media = await readMedia(path, rule.fileType === 'image', service.client.signal);
134
+ if (rule.fileType === 'image') {
135
+ const { width, height } = media;
136
+ if (!width || !height || !Number.isFinite(width * height))
137
+ throw new CliError('INVALID_ARGUMENT', `${name}:无法读取图片尺寸`);
138
+ if (rule.maxSize && Math.max(width, height) > rule.maxSize)
139
+ throw new CliError('INVALID_ARGUMENT', `${name}:图片宽高不能超过 ${rule.maxSize} 像素`);
140
+ item.image = { width, height };
141
+ }
142
+ else if (!media.hasVideo ||
143
+ !media.duration ||
144
+ !Number.isFinite(media.duration) ||
145
+ media.duration <= 0 ||
146
+ media.duration > 302) {
147
+ throw new CliError('INVALID_ARGUMENT', `${name}:视频必须能读取时长且不超过 5 分钟(含 2 秒容差)`);
148
+ }
149
+ }
150
+ prepared.push(item);
151
+ }
152
+ return prepared;
153
+ }
154
+ //# sourceMappingURL=upload-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-files.js","sourceRoot":"","sources":["../../src/api/upload-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,37 @@
1
+ /** 在独立线程读取图片尺寸和视频时长,避免损坏文件阻塞 CLI。@author xiuyu.yi */
2
+ import { open } from 'node:fs/promises';
3
+ import { openAsBlob } from 'node:fs';
4
+ import { parentPort, workerData } from 'node:worker_threads';
5
+ import mediaInfoFactory from 'mediainfo.js';
6
+ import { imageDimensionsFromStream } from 'image-dimensions';
7
+ if (workerData.image) {
8
+ const image = await imageDimensionsFromStream((await openAsBlob(workerData.path)).stream());
9
+ parentPort?.postMessage({ ...image, hasVideo: false });
10
+ }
11
+ else {
12
+ const file = await open(workerData.path, 'r');
13
+ try {
14
+ const media = await mediaInfoFactory({ format: 'object' });
15
+ try {
16
+ const result = await media.analyzeData((await file.stat()).size, async (size, offset) => {
17
+ const buffer = Buffer.alloc(size);
18
+ const { bytesRead } = await file.read(buffer, 0, size, offset);
19
+ return buffer.subarray(0, bytesRead);
20
+ });
21
+ const tracks = result.media?.track ?? [];
22
+ const video = tracks.find((track) => track['@type'] === 'Video');
23
+ const general = tracks.find((track) => track['@type'] === 'General');
24
+ parentPort?.postMessage({
25
+ duration: general?.Duration ?? video?.Duration,
26
+ hasVideo: Boolean(video),
27
+ });
28
+ }
29
+ finally {
30
+ media.close();
31
+ }
32
+ }
33
+ finally {
34
+ await file.close();
35
+ }
36
+ }
37
+ //# sourceMappingURL=upload-media-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-media-worker.js","sourceRoot":"","sources":["../../src/api/upload-media-worker.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,gBAAgB,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,MAAM,KAAK,GAAG,MAAM,yBAAyB,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5F,UAAU,EAAE,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AACzD,CAAC;KAAM,CAAC;IACN,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;gBACtF,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAClC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC/D,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC;YACjE,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC;YACrE,UAAU,EAAE,WAAW,CAAC;gBACtB,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,KAAK,EAAE,QAAQ;gBAC9C,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC;aACzB,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { object, text } from '../../contracts/value.js';
3
3
  import { CliError } from '../../output/exit-codes.js';
4
+ import { prepareUploadFiles } from '../../api/upload-files.js';
4
5
  import { uploadAttachment } from '../../api/upload-api.js';
5
6
  import { currentRound, roundMessage } from '../../conversation/round-selector.js';
6
7
  import { AUTO_TEST_DEFAULT_MESSAGE, AUTO_TEST_OPERATION_KEY, AUTO_TEST_SOURCE_KEY, } from '../../conversation/auto-test.js';
@@ -11,28 +12,18 @@ const inputSchema = z
11
12
  .object({
12
13
  content: z.string().optional(),
13
14
  message: z.string().optional(),
14
- attachments: z
15
- .array(z
16
- .object({
17
- name: z.string(),
18
- mediaType: z.string().optional(),
19
- content: z.string().optional(),
20
- url: z.string().url().optional(),
21
- meta: z.record(z.unknown()).optional(),
22
- })
23
- .strict())
24
- .default([]),
25
15
  })
26
16
  .strict();
27
17
  export const appendValue = (value, previous) => [...previous, value];
28
18
  export function messageOptions(command) {
29
19
  return withWait(command
30
20
  .option('--message <text>', '需求文本')
31
- .option('--input <file>', 'JSON 输入文件,- 表示标准输入')
32
- .option('--file <path>', '附加本地文件,可重复使用', appendValue, []));
21
+ .option('--input <file>', '仅含 content 或 message 文本字段的 JSON 文件,- 表示标准输入')
22
+ .option('--file <path>', '上传本地附件,可重复使用;格式和大小以服务端限制为准', appendValue, []));
33
23
  }
34
24
  export async function sendMessage(context, sessionId, command, check) {
35
25
  const options = object(command.opts());
26
+ const files = z.array(z.string()).parse(options.file ?? []);
36
27
  const testFollowup = text(options.testFollowup), reviewFollowup = text(options.reviewFollowup);
37
28
  if (testFollowup && reviewFollowup)
38
29
  throw new CliError('INVALID_ARGUMENT', '不能同时回复自动测试和代码审查报告');
@@ -42,8 +33,8 @@ export async function sendMessage(context, sessionId, command, check) {
42
33
  const operationKey = checkKind === 'review' ? CODE_REVIEW_OPERATION_KEY : AUTO_TEST_OPERATION_KEY;
43
34
  const sourceKey = checkKind === 'review' ? CODE_REVIEW_SOURCE_KEY : AUTO_TEST_SOURCE_KEY;
44
35
  const hasMessage = typeof options.message === 'string', hasInput = typeof options.input === 'string';
45
- if ((hasMessage && hasInput) || (!check && !hasMessage && !hasInput))
46
- throw new CliError('INVALID_ARGUMENT', '必须且只能指定 --message 或 --input');
36
+ if ((hasMessage && hasInput) || (!check && !hasMessage && !hasInput && !files.length))
37
+ throw new CliError('INVALID_ARGUMENT', '请指定 --message、--input 或 --file;--message 与 --input 不能同时使用');
47
38
  const raw = typeof options.input === 'string'
48
39
  ? await readInput(options.input)
49
40
  : {
@@ -56,14 +47,12 @@ export async function sendMessage(context, sessionId, command, check) {
56
47
  };
57
48
  const parsed = inputSchema.safeParse(raw);
58
49
  if (!parsed.success || (parsed.data.content !== undefined && parsed.data.message !== undefined))
59
- throw new CliError('INVALID_ARGUMENT', '输入只接受 content/message 与 attachments,且内容字段不能重复');
50
+ throw new CliError('INVALID_ARGUMENT', 'JSON 只接受 content 或 message 文本字段,不能同时提供;附件请使用 --file,不接受内联内容或附件 URL');
60
51
  const input = parsed.data, content = input.content ?? input.message ?? '';
61
- const files = z.array(z.string()).parse(options.file);
62
- if (!content.trim() && !files.length && !input.attachments.length)
63
- throw new CliError('INVALID_ARGUMENT', '需求或附件不能为空');
64
- if (check && !content.trim())
65
- throw new CliError('INVALID_ARGUMENT', `${label}范围不能为空;省略 --message 可检查刚才完成的内容`);
52
+ if (!content.trim() && (check || !files.length))
53
+ throw new CliError('INVALID_ARGUMENT', check ? `${label}范围不能为空;省略 --message 可检查刚才完成的内容` : '需求文本不能为空');
66
54
  const service = await runtime(context, command);
55
+ const preparedFiles = await prepareUploadFiles(service, files);
67
56
  const previous = sessionId && (options.wait !== false || checkKind) ? await service.load(sessionId) : undefined;
68
57
  let operation;
69
58
  if (checkKind && previous) {
@@ -83,15 +72,15 @@ export async function sendMessage(context, sessionId, command, check) {
83
72
  });
84
73
  operation = check ?? 'repair';
85
74
  }
86
- const attachments = [...input.attachments];
87
- for (const file of files)
75
+ const attachments = [];
76
+ for (const file of preparedFiles)
88
77
  attachments.push(await uploadAttachment(service, file));
89
78
  const previousMessageId = previous ? roundMessage(previous, currentRound(previous))?.messageId : undefined;
90
79
  const create = sessionId ? undefined : await service.config.creation(content);
91
80
  const response = await businessWrite(context, service, sessionId, () => service.command.chat({
92
81
  sessionId,
93
82
  content,
94
- attachments,
83
+ ...(attachments.length ? { attachments } : {}),
95
84
  model: text(options.model),
96
85
  workspaceId: text(options.workspaceId),
97
86
  ...(operation
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/commands/chat/message.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../src/commands/chat/message.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "superun-ai-cli",
3
- "version": "0.1.27",
3
+ "version": "0.1.29",
4
4
  "description": "通过需求梳理、架构设计与开发协作,将网站和应用的想法转化为可持续迭代、可部署运维的生产级系统。",
5
5
  "author": "xiuyu.yi",
6
6
  "license": "UNLICENSED",
@@ -34,6 +34,8 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "commander": "14.0.0",
37
+ "image-dimensions": "2.5.0",
38
+ "mediainfo.js": "0.3.5",
37
39
  "semver": "7.7.2",
38
40
  "zod": "3.25.76"
39
41
  },