@xihe-lab/tapd-core 2.0.0-rc.1 → 2.0.0-rc.2
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.md +22 -0
- package/dist/registry/richtext-manifests.generated.d.ts +1 -1
- package/dist/registry/richtext-manifests.generated.d.ts.map +1 -1
- package/dist/registry/richtext-manifests.generated.js +1 -1
- package/dist/registry/richtext-manifests.generated.js.map +1 -1
- package/dist/registry/richtext.d.ts +9 -0
- package/dist/registry/richtext.d.ts.map +1 -1
- package/dist/registry/richtext.js +33 -15
- package/dist/registry/richtext.js.map +1 -1
- package/dist/registry/richtext.test.js +70 -7
- package/dist/registry/richtext.test.js.map +1 -1
- package/dist/richtext/attachment-anchor.d.ts +58 -0
- package/dist/richtext/attachment-anchor.d.ts.map +1 -0
- package/dist/richtext/attachment-anchor.js +221 -0
- package/dist/richtext/attachment-anchor.js.map +1 -0
- package/dist/richtext/attachment-anchor.test.d.ts +2 -0
- package/dist/richtext/attachment-anchor.test.d.ts.map +1 -0
- package/dist/richtext/attachment-anchor.test.js +149 -0
- package/dist/richtext/attachment-anchor.test.js.map +1 -0
- package/dist/richtext/escape.d.ts +7 -0
- package/dist/richtext/escape.d.ts.map +1 -0
- package/dist/richtext/escape.js +60 -0
- package/dist/richtext/escape.js.map +1 -0
- package/dist/richtext/index.d.ts +15 -0
- package/dist/richtext/index.d.ts.map +1 -0
- package/dist/richtext/index.js +35 -0
- package/dist/richtext/index.js.map +1 -0
- package/dist/richtext/mention.d.ts +49 -0
- package/dist/richtext/mention.d.ts.map +1 -0
- package/dist/richtext/mention.js +179 -0
- package/dist/richtext/mention.js.map +1 -0
- package/dist/richtext/mention.test.d.ts +2 -0
- package/dist/richtext/mention.test.d.ts.map +1 -0
- package/dist/richtext/mention.test.js +123 -0
- package/dist/richtext/mention.test.js.map +1 -0
- package/dist/richtext/pipeline.d.ts +5 -0
- package/dist/richtext/pipeline.d.ts.map +1 -0
- package/dist/richtext/pipeline.js +199 -0
- package/dist/richtext/pipeline.js.map +1 -0
- package/dist/richtext/round-trip.test.d.ts +2 -0
- package/dist/richtext/round-trip.test.d.ts.map +1 -0
- package/dist/richtext/round-trip.test.js +105 -0
- package/dist/richtext/round-trip.test.js.map +1 -0
- package/dist/sdk-routes.d.ts.map +1 -1
- package/dist/sdk-routes.js +4 -0
- package/dist/sdk-routes.js.map +1 -1
- package/dist/tapd-client.d.ts +45 -0
- package/dist/tapd-client.d.ts.map +1 -1
- package/dist/tapd-client.js +74 -0
- package/dist/tapd-client.js.map +1 -1
- package/dist/tools/attachment.d.ts +47 -0
- package/dist/tools/attachment.d.ts.map +1 -1
- package/dist/tools/attachment.js +247 -1
- package/dist/tools/attachment.js.map +1 -1
- package/dist/tools/attachment.test.d.ts +2 -0
- package/dist/tools/attachment.test.d.ts.map +1 -0
- package/dist/tools/attachment.test.js +432 -0
- package/dist/tools/attachment.test.js.map +1 -0
- package/dist/tools/bug.d.ts.map +1 -1
- package/dist/tools/bug.js +3 -0
- package/dist/tools/bug.js.map +1 -1
- package/dist/tools/comment.d.ts.map +1 -1
- package/dist/tools/comment.js +3 -0
- package/dist/tools/comment.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/media.d.ts +9 -0
- package/dist/tools/media.d.ts.map +1 -0
- package/dist/tools/media.js +45 -0
- package/dist/tools/media.js.map +1 -0
- package/dist/tools/richtext-wiring.test.d.ts +2 -0
- package/dist/tools/richtext-wiring.test.d.ts.map +1 -0
- package/dist/tools/richtext-wiring.test.js +302 -0
- package/dist/tools/richtext-wiring.test.js.map +1 -0
- package/dist/tools/story.d.ts.map +1 -1
- package/dist/tools/story.js +3 -0
- package/dist/tools/story.js.map +1 -1
- package/dist/tools/task.d.ts.map +1 -1
- package/dist/tools/task.js +3 -0
- package/dist/tools/task.js.map +1 -1
- package/dist/tools/utility.d.ts.map +1 -1
- package/dist/tools/utility.js +133 -12
- package/dist/tools/utility.js.map +1 -1
- package/dist/tools/wiki.d.ts.map +1 -1
- package/dist/tools/wiki.js +20 -5
- package/dist/tools/wiki.js.map +1 -1
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +8 -5
- package/dist/tools/zz-acceptance-echo.d.ts +0 -3
- package/dist/tools/zz-acceptance-echo.d.ts.map +0 -1
- package/dist/tools/zz-acceptance-echo.js +0 -9
- package/dist/tools/zz-acceptance-echo.js.map +0 -1
package/dist/tapd-client.js
CHANGED
|
@@ -11,6 +11,9 @@
|
|
|
11
11
|
* - POST SDK failures throw directly (never fallback, avoid duplicate writes)
|
|
12
12
|
* - Set TAPD_SDK_DISABLED=1 to bypass the SDK entirely (rollback switch)
|
|
13
13
|
*/
|
|
14
|
+
import { ReadStream } from 'node:fs';
|
|
15
|
+
import { readFile } from 'node:fs/promises';
|
|
16
|
+
import { basename } from 'node:path';
|
|
14
17
|
import TapdSdk from '@opentapd/tapd-node-sdk';
|
|
15
18
|
import { SDK_ROUTES } from './sdk-routes.js';
|
|
16
19
|
export class TapdClient {
|
|
@@ -248,5 +251,76 @@ export class TapdClient {
|
|
|
248
251
|
async post(path, params) {
|
|
249
252
|
return this.route('POST', path, params);
|
|
250
253
|
}
|
|
254
|
+
/**
|
|
255
|
+
* POST a multipart (file upload) request — the streaming channel for upload
|
|
256
|
+
* endpoints (`/files/upload_attachment`, `/files/upload_image`, ...).
|
|
257
|
+
*
|
|
258
|
+
* Keeps registry.exec the single execution path (FSD §2 ruling: streaming
|
|
259
|
+
* calls never bypass TapdClient, so audit / timeout / read-only gating and
|
|
260
|
+
* auth stay unified).
|
|
261
|
+
*
|
|
262
|
+
* Routing mirrors route() POST semantics:
|
|
263
|
+
* - When `POST <path>` is mapped in SDK_ROUTES and the SDK is enabled, the
|
|
264
|
+
* request goes through the SDK, which builds multipart/form-data when any
|
|
265
|
+
* param value is an fs.ReadStream (node-sdk/src/sdk.js:159).
|
|
266
|
+
* - POST failures throw directly (never fall back / retry — a flaky network
|
|
267
|
+
* must not duplicate an upload).
|
|
268
|
+
* - Without an SDK route (or with TAPD_SDK_DISABLED=1 rollback switch on),
|
|
269
|
+
* falls back to a fetch-based multipart upload (Node 20+ global FormData).
|
|
270
|
+
*/
|
|
271
|
+
async postFile(path, params) {
|
|
272
|
+
const sdkMethod = this.sdkEnabled ? SDK_ROUTES[`POST ${path}`] : undefined;
|
|
273
|
+
if (sdkMethod) {
|
|
274
|
+
// Scalars are stringified up-front: the SDK appends values to a
|
|
275
|
+
// form-data payload as-is, so numbers/booleans must arrive as strings.
|
|
276
|
+
const sdkParams = {};
|
|
277
|
+
for (const [key, value] of Object.entries(params)) {
|
|
278
|
+
if (value === undefined)
|
|
279
|
+
continue;
|
|
280
|
+
sdkParams[key] = value instanceof ReadStream ? value : String(value);
|
|
281
|
+
}
|
|
282
|
+
const sdk = this.getSdk();
|
|
283
|
+
const response = await sdk[sdkMethod](sdkParams);
|
|
284
|
+
return this.unwrap(response);
|
|
285
|
+
}
|
|
286
|
+
return this.postMultipartViaFetch(path, params);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* fetch-based multipart fallback (no SDK route / SDK disabled). Node 20+
|
|
290
|
+
* global fetch serializes FormData bodies (boundary included) automatically.
|
|
291
|
+
*/
|
|
292
|
+
async postMultipartViaFetch(path, params) {
|
|
293
|
+
const form = new FormData();
|
|
294
|
+
for (const [key, value] of Object.entries(params)) {
|
|
295
|
+
if (value === undefined)
|
|
296
|
+
continue;
|
|
297
|
+
if (value instanceof ReadStream) {
|
|
298
|
+
const filePath = typeof value.path === 'string' ? value.path : value.path.toString('utf8');
|
|
299
|
+
// undici FormData only accepts Blob/string values — buffer the bytes
|
|
300
|
+
// for the fallback path (the SDK path streams without buffering).
|
|
301
|
+
const bytes = await readFile(filePath);
|
|
302
|
+
form.append(key, new Blob([bytes]), basename(filePath));
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
form.append(key, String(value));
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
const url = new URL(path, this.baseUrl);
|
|
309
|
+
const response = await fetch(url.toString(), {
|
|
310
|
+
method: 'POST',
|
|
311
|
+
headers: { 'Authorization': this.authHeader },
|
|
312
|
+
body: form,
|
|
313
|
+
});
|
|
314
|
+
if (!response.ok) {
|
|
315
|
+
const errorText = await response.text();
|
|
316
|
+
throw new Error(`TAPD API error: ${response.status} ${response.statusText} - ${errorText.slice(0, 200)}`);
|
|
317
|
+
}
|
|
318
|
+
const contentType = response.headers.get('content-type');
|
|
319
|
+
if (!contentType?.includes('application/json')) {
|
|
320
|
+
const text = await response.text();
|
|
321
|
+
throw new Error(`TAPD API returned non-JSON response: ${text.slice(0, 100)}`);
|
|
322
|
+
}
|
|
323
|
+
return this.unwrap(await response.json());
|
|
324
|
+
}
|
|
251
325
|
}
|
|
252
326
|
//# sourceMappingURL=tapd-client.js.map
|
package/dist/tapd-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tapd-client.js","sourceRoot":"","sources":["../src/tapd-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,OAAO,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"tapd-client.js","sourceRoot":"","sources":["../src/tapd-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,50 @@
|
|
|
1
1
|
import type { ToolDef } from '../types.js';
|
|
2
|
+
/** TAPD upload limit — mirrors the SDK axios maxBodyLength (300MB). */
|
|
3
|
+
export declare const MAX_UPLOAD_BYTES: number;
|
|
4
|
+
/** FSD §6: files above 50MB get a size warning in the tool result. */
|
|
5
|
+
export declare const LARGE_FILE_WARN_BYTES: number;
|
|
6
|
+
export interface LocalFile {
|
|
7
|
+
absolutePath: string;
|
|
8
|
+
size: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Resolve a user-supplied local file path to an absolute path and verify it is
|
|
12
|
+
* an existing regular file within the 300MB upload limit.
|
|
13
|
+
* - `~` expansion is a defense for direct (MCP) callers; the CLI flags layer
|
|
14
|
+
* normalizes paths before invoking core (FSD §2).
|
|
15
|
+
* - Throws a descriptive Error for ENOENT / directory / oversize.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveLocalFile(fileArg: string): LocalFile;
|
|
18
|
+
/**
|
|
19
|
+
* Zod refine helper: turn a missing/oversized local file into an INVALID_ARGS
|
|
20
|
+
* schema error (CLI maps INVALID_ARGS to usage exit 2 per FSD §3.1) instead of
|
|
21
|
+
* a runtime API error. The file is re-validated in the handler for direct
|
|
22
|
+
* callers that bypass registry parsing.
|
|
23
|
+
*/
|
|
24
|
+
export declare function localFileRefine(): (v: string) => boolean;
|
|
25
|
+
/** Strip path separators / control chars — an uploaded filename is a label, never a path. */
|
|
26
|
+
export declare function sanitizeFilename(name: string): string;
|
|
27
|
+
export interface AttachmentAnchorInput {
|
|
28
|
+
workspace_id: string | number;
|
|
29
|
+
id: string | number;
|
|
30
|
+
/** Display name (data-name + anchor text). */
|
|
31
|
+
filename: string;
|
|
32
|
+
/** File size in bytes (data-size — the front-end formats it). */
|
|
33
|
+
size: number;
|
|
34
|
+
/** TAPD preview/file-type hint; defaults from the filename extension. */
|
|
35
|
+
file_type?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Build the R6 data五件套 attachment anchor for TAPD rich-text fields
|
|
39
|
+
* (comments / description). Verified minimal template (research comment 369):
|
|
40
|
+
* the front-end rebuilds its attachment component purely from the data
|
|
41
|
+
* attributes, so inner spans can be omitted.
|
|
42
|
+
*
|
|
43
|
+
* Exported for the Wave 2 richtext conversion library
|
|
44
|
+
* (`[📎 name](attach:<ws>/<id>)` → anchor), not a tool itself (FSD §2 ruling 2).
|
|
45
|
+
*/
|
|
46
|
+
export declare function buildAttachmentAnchor(input: AttachmentAnchorInput): string;
|
|
47
|
+
/** `[📎 <name>](attach:<ws>/<id>)` — md 管道场景的附件引用(P3 语法接线用)。 */
|
|
48
|
+
export declare function buildAttachmentMarkdown(workspaceId: string | number, id: string | number, filename: string): string;
|
|
2
49
|
export declare const attachmentTools: ToolDef[];
|
|
3
50
|
//# sourceMappingURL=attachment.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../src/tools/attachment.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../src/tools/attachment.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAW3C,uEAAuE;AACvE,eAAO,MAAM,gBAAgB,QAAoB,CAAC;AAClD,sEAAsE;AACtE,eAAO,MAAM,qBAAqB,QAAmB,CAAC;AAEtD,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAQD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAe3D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CASxD;AAED,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIrD;AAkBD,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAa1E;AAED,gEAAgE;AAChE,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnH;AAgBD,eAAO,MAAM,eAAe,EAAE,OAAO,EAiOpC,CAAC"}
|
package/dist/tools/attachment.js
CHANGED
|
@@ -1,5 +1,123 @@
|
|
|
1
|
+
import { createReadStream, existsSync, statSync } from 'node:fs';
|
|
2
|
+
import { writeFile } from 'node:fs/promises';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import os from 'node:os';
|
|
1
6
|
import { z } from 'zod';
|
|
2
7
|
import { TapdClient } from '../tapd-client.js';
|
|
8
|
+
// Wave 2 接线收敛(需求 1139814312001001548):file-type 词汇表以 core/richtext 的
|
|
9
|
+
// R6 四桶映射(FILE_TYPE_BY_EXTENSION)为准,本文件不再另设一套已知类型判断;
|
|
10
|
+
// 未知扩展名保留 A 侧「直通」契约(前端取回退图标,data-name/size 仍可渲染)。
|
|
11
|
+
import { FILE_TYPE_BY_EXTENSION } from '../richtext/index.js';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Shared file/anchor helpers (reused by tools/media.ts and Wave 2 richtext lib)
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
/** TAPD upload limit — mirrors the SDK axios maxBodyLength (300MB). */
|
|
16
|
+
export const MAX_UPLOAD_BYTES = 300 * 1024 * 1024;
|
|
17
|
+
/** FSD §6: files above 50MB get a size warning in the tool result. */
|
|
18
|
+
export const LARGE_FILE_WARN_BYTES = 50 * 1024 * 1024;
|
|
19
|
+
function expandTilde(p) {
|
|
20
|
+
if (p === '~')
|
|
21
|
+
return os.homedir();
|
|
22
|
+
if (p === '~/' || p.startsWith('~/'))
|
|
23
|
+
return path.join(os.homedir(), p.slice(2));
|
|
24
|
+
return p;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolve a user-supplied local file path to an absolute path and verify it is
|
|
28
|
+
* an existing regular file within the 300MB upload limit.
|
|
29
|
+
* - `~` expansion is a defense for direct (MCP) callers; the CLI flags layer
|
|
30
|
+
* normalizes paths before invoking core (FSD §2).
|
|
31
|
+
* - Throws a descriptive Error for ENOENT / directory / oversize.
|
|
32
|
+
*/
|
|
33
|
+
export function resolveLocalFile(fileArg) {
|
|
34
|
+
const absolutePath = path.resolve(expandTilde(fileArg));
|
|
35
|
+
if (!existsSync(absolutePath)) {
|
|
36
|
+
throw new Error(`file not found: ${fileArg} (resolved: ${absolutePath})`);
|
|
37
|
+
}
|
|
38
|
+
const stat = statSync(absolutePath);
|
|
39
|
+
if (!stat.isFile()) {
|
|
40
|
+
throw new Error(`not a regular file: ${absolutePath}`);
|
|
41
|
+
}
|
|
42
|
+
if (stat.size > MAX_UPLOAD_BYTES) {
|
|
43
|
+
throw new Error(`file too large: ${fileArg} is ${(stat.size / 1024 / 1024).toFixed(1)}MB, TAPD upload limit is 300MB`);
|
|
44
|
+
}
|
|
45
|
+
return { absolutePath, size: stat.size };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Zod refine helper: turn a missing/oversized local file into an INVALID_ARGS
|
|
49
|
+
* schema error (CLI maps INVALID_ARGS to usage exit 2 per FSD §3.1) instead of
|
|
50
|
+
* a runtime API error. The file is re-validated in the handler for direct
|
|
51
|
+
* callers that bypass registry parsing.
|
|
52
|
+
*/
|
|
53
|
+
export function localFileRefine() {
|
|
54
|
+
return (v) => {
|
|
55
|
+
try {
|
|
56
|
+
resolveLocalFile(v);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** Strip path separators / control chars — an uploaded filename is a label, never a path. */
|
|
65
|
+
export function sanitizeFilename(name) {
|
|
66
|
+
const base = name.split(/[/\\]/).pop() ?? '';
|
|
67
|
+
const cleaned = base.replace(/[\r\n\t\0]/g, ' ').trim();
|
|
68
|
+
return cleaned.length > 0 ? cleaned.slice(0, 255) : 'attachment';
|
|
69
|
+
}
|
|
70
|
+
function escapeHtml(s) {
|
|
71
|
+
return s
|
|
72
|
+
.replace(/&/g, '&')
|
|
73
|
+
.replace(/</g, '<')
|
|
74
|
+
.replace(/>/g, '>')
|
|
75
|
+
.replace(/"/g, '"');
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* TAPD front-end file-type vocabulary. Only the plain-text family is
|
|
79
|
+
* evidenced end-to-end (research R6: data-file-type="text" renders perfectly);
|
|
80
|
+
* unknown extensions pass through as-is and the front-end picks its fallback
|
|
81
|
+
* icon while still showing name/size from the data attributes.
|
|
82
|
+
*/
|
|
83
|
+
const TEXT_LIKE_EXTENSIONS = new Set(['txt', 'text', 'log', 'md', 'csv', 'json', 'xml', 'yml', 'yaml']);
|
|
84
|
+
/**
|
|
85
|
+
* Build the R6 data五件套 attachment anchor for TAPD rich-text fields
|
|
86
|
+
* (comments / description). Verified minimal template (research comment 369):
|
|
87
|
+
* the front-end rebuilds its attachment component purely from the data
|
|
88
|
+
* attributes, so inner spans can be omitted.
|
|
89
|
+
*
|
|
90
|
+
* Exported for the Wave 2 richtext conversion library
|
|
91
|
+
* (`[📎 name](attach:<ws>/<id>)` → anchor), not a tool itself (FSD §2 ruling 2).
|
|
92
|
+
*/
|
|
93
|
+
export function buildAttachmentAnchor(input) {
|
|
94
|
+
const dot = input.filename.lastIndexOf('.');
|
|
95
|
+
const ext = dot > -1 && dot < input.filename.length - 1 ? input.filename.slice(dot + 1).toLowerCase() : '';
|
|
96
|
+
const fileType = input.file_type
|
|
97
|
+
?? (FILE_TYPE_BY_EXTENSION[ext]) // richtext R6 四桶优先(text/image/pdf)
|
|
98
|
+
?? (TEXT_LIKE_EXTENSIONS.has(ext) ? 'text' : ext || 'other'); // 未收录:A 侧文本族 → text,其余扩展名直通
|
|
99
|
+
const name = escapeHtml(input.filename);
|
|
100
|
+
const size = Math.max(0, Math.round(input.size));
|
|
101
|
+
return (`<a data-is-tapd-attachment="true" data-can-preview="true" data-file-type="${escapeHtml(fileType)}"` +
|
|
102
|
+
` data-name="${name}" data-size="${size}" target="_blank" rel="noopener"` +
|
|
103
|
+
` href="/${input.workspace_id}/attachments/preview_attachments/${input.id}/story_description_attachment">${name}</a>`);
|
|
104
|
+
}
|
|
105
|
+
/** `[📎 <name>](attach:<ws>/<id>)` — md 管道场景的附件引用(P3 语法接线用)。 */
|
|
106
|
+
export function buildAttachmentMarkdown(workspaceId, id, filename) {
|
|
107
|
+
return `[📎 ${filename}](attach:${workspaceId}/${id})`;
|
|
108
|
+
}
|
|
109
|
+
function optionalSizeWarning(size) {
|
|
110
|
+
return size > LARGE_FILE_WARN_BYTES
|
|
111
|
+
? { warning: `file is ${(size / 1024 / 1024).toFixed(1)}MB (>50MB), upload/download may be slow` }
|
|
112
|
+
: {};
|
|
113
|
+
}
|
|
114
|
+
function requireWorkspaceId(params) {
|
|
115
|
+
const workspaceId = params.workspace_id ?? TapdClient.getDefaultWorkspaceId();
|
|
116
|
+
if (!workspaceId) {
|
|
117
|
+
throw new Error('workspace_id is required (either provide it or set TAPD_DEFAULT_WORKSPACE_ID env)');
|
|
118
|
+
}
|
|
119
|
+
return workspaceId;
|
|
120
|
+
}
|
|
3
121
|
export const attachmentTools = [
|
|
4
122
|
// Standard TAPD API attachment tools
|
|
5
123
|
{
|
|
@@ -45,7 +163,7 @@ export const attachmentTools = [
|
|
|
45
163
|
},
|
|
46
164
|
{
|
|
47
165
|
name: 'tapd_get_attachment_download_url',
|
|
48
|
-
description: 'Get download URL for a single attachment (valid for 300s)',
|
|
166
|
+
description: 'Get download URL for a single attachment (valid for 300s)。注意:推荐改用 tapd_download_attachment(走 /attachments/down 端点,无需额外权限;本工具的 documents_down 端点需要 attachments::documents_down 授权)。',
|
|
49
167
|
inputSchema: z.object({
|
|
50
168
|
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
51
169
|
id: z.string().describe('Attachment ID (required);必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度'),
|
|
@@ -59,6 +177,134 @@ export const attachmentTools = [
|
|
|
59
177
|
return client.get('/attachments/documents_down', { ...params, workspace_id: workspaceId });
|
|
60
178
|
},
|
|
61
179
|
},
|
|
180
|
+
// ---------------------------------------------------------------------
|
|
181
|
+
// rc.2 rich-media collaboration tools (FSD §3.1-3.3, requirement 1139814312001001546)
|
|
182
|
+
// ---------------------------------------------------------------------
|
|
183
|
+
{
|
|
184
|
+
name: 'tapd_upload_attachment',
|
|
185
|
+
description: '上传本地文件为 TAPD 附件并绑定到实体(需求/缺陷/任务,一次调用完成上传+绑定)。返回附件元数据、embed_html(R6 data 五件套锚点,可原样拼入评论/描述富文本)与 embed_md([📎 文件名](attach:<ws>/<id>))。附件随后可通过 tapd_download_attachment 下载。文件上限 300MB。',
|
|
186
|
+
inputSchema: z.object({
|
|
187
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
188
|
+
file_path: z.string().min(1).refine(localFileRefine(), { message: '本地文件不存在(或超过 300MB 上限)' }).describe('本地文件路径(绝对路径,或相对当前工作目录)'),
|
|
189
|
+
entity_type: z.enum(['story', 'bug', 'task']).describe('绑定实体类型;entity_id 必须是该类型实体的真实 ID(严格同体型,不做跨表侥幸绑定)'),
|
|
190
|
+
entity_id: z.string().describe('目标实体长 ID;必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度'),
|
|
191
|
+
filename: z.string().optional().describe('上传后显示的文件名,缺省取 file_path 的 basename'),
|
|
192
|
+
}),
|
|
193
|
+
handler: async (client, params) => {
|
|
194
|
+
const workspaceId = requireWorkspaceId(params);
|
|
195
|
+
const { absolutePath, size } = resolveLocalFile(params.file_path);
|
|
196
|
+
const filename = sanitizeFilename(params.filename ?? path.basename(absolutePath));
|
|
197
|
+
const data = await client.postFile('/files/upload_attachment', {
|
|
198
|
+
workspace_id: workspaceId,
|
|
199
|
+
filename,
|
|
200
|
+
type: params.entity_type,
|
|
201
|
+
entry_id: params.entity_id,
|
|
202
|
+
file: createReadStream(absolutePath),
|
|
203
|
+
});
|
|
204
|
+
const attachment = (data?.Attachment ?? data ?? {});
|
|
205
|
+
const id = typeof attachment.id === 'string' || typeof attachment.id === 'number'
|
|
206
|
+
? String(attachment.id)
|
|
207
|
+
: '';
|
|
208
|
+
if (id === '') {
|
|
209
|
+
throw new Error(`unexpected uploadAttachment response (no Attachment.id): ${JSON.stringify(data).slice(0, 200)}`);
|
|
210
|
+
}
|
|
211
|
+
const finalName = typeof attachment.filename === 'string' && attachment.filename !== ''
|
|
212
|
+
? attachment.filename
|
|
213
|
+
: filename;
|
|
214
|
+
const finalSize = Number(attachment.size ?? size) || size;
|
|
215
|
+
return {
|
|
216
|
+
...attachment,
|
|
217
|
+
embed_html: buildAttachmentAnchor({ workspace_id: workspaceId, id, filename: finalName, size: finalSize }),
|
|
218
|
+
embed_md: buildAttachmentMarkdown(workspaceId, id, finalName),
|
|
219
|
+
...optionalSizeWarning(size),
|
|
220
|
+
};
|
|
221
|
+
},
|
|
222
|
+
cli: { resource: 'attachment', action: 'upload', positional: 'file_path' },
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
name: 'tapd_download_attachment',
|
|
226
|
+
description: '下载 TAPD 附件:走 /attachments/down(attachment#r,无需额外授权)拿到 file.tapd.cn 签名 URL(300s 有效)。不带 out_path 时仅返回 {download_url, filename, content_type} 供自行 fetch;带 out_path(必须位于当前工作目录内)时直接落盘并返回 {saved_to, bytes, sha1}。',
|
|
227
|
+
inputSchema: z.object({
|
|
228
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
229
|
+
id: z.string().describe('Attachment ID (required);必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度'),
|
|
230
|
+
out_path: z.string().optional().describe('保存路径(已存在的目录则取附件名落盘;否则视为完整文件路径)。必须在当前工作目录内。省略时仅返回下载元数据'),
|
|
231
|
+
}),
|
|
232
|
+
handler: async (client, params) => {
|
|
233
|
+
const workspaceId = requireWorkspaceId(params);
|
|
234
|
+
const data = await client.get('/attachments/down', {
|
|
235
|
+
workspace_id: workspaceId,
|
|
236
|
+
id: params.id,
|
|
237
|
+
});
|
|
238
|
+
const attachment = ((data?.Attachment ?? data) ?? {});
|
|
239
|
+
const downloadUrl = typeof attachment.download_url === 'string' ? attachment.download_url : undefined;
|
|
240
|
+
if (!downloadUrl) {
|
|
241
|
+
throw new Error(`no download_url returned for attachment ${params.id}: ${JSON.stringify(data).slice(0, 200)}`);
|
|
242
|
+
}
|
|
243
|
+
const filename = typeof attachment.filename === 'string' && attachment.filename !== ''
|
|
244
|
+
? attachment.filename
|
|
245
|
+
: `attachment-${params.id}`;
|
|
246
|
+
const meta = {
|
|
247
|
+
id: params.id,
|
|
248
|
+
filename,
|
|
249
|
+
download_url: downloadUrl,
|
|
250
|
+
...(typeof attachment.content_type === 'string' ? { content_type: attachment.content_type } : {}),
|
|
251
|
+
};
|
|
252
|
+
if (!params.out_path) {
|
|
253
|
+
return meta;
|
|
254
|
+
}
|
|
255
|
+
// Path traversal guard: the resolved target must stay inside process.cwd().
|
|
256
|
+
const cwd = process.cwd();
|
|
257
|
+
const resolvedOut = path.resolve(expandTilde(params.out_path));
|
|
258
|
+
if (resolvedOut !== cwd && !resolvedOut.startsWith(cwd + path.sep)) {
|
|
259
|
+
throw new Error(`out_path must stay within the working directory (${cwd}): ${params.out_path}`);
|
|
260
|
+
}
|
|
261
|
+
const stat = existsSync(resolvedOut) ? statSync(resolvedOut) : undefined;
|
|
262
|
+
const target = stat?.isDirectory() ? path.join(resolvedOut, sanitizeFilename(filename)) : resolvedOut;
|
|
263
|
+
// The signature URL points at file.tapd.cn — plain GET, no TAPD API auth.
|
|
264
|
+
const response = await fetch(downloadUrl);
|
|
265
|
+
if (!response.ok) {
|
|
266
|
+
throw new Error(`failed to download attachment bytes: HTTP ${response.status} ${response.statusText}`);
|
|
267
|
+
}
|
|
268
|
+
const bytes = Buffer.from(await response.arrayBuffer());
|
|
269
|
+
await writeFile(target, bytes);
|
|
270
|
+
const sha1 = createHash('sha1').update(bytes).digest('hex');
|
|
271
|
+
return {
|
|
272
|
+
...meta,
|
|
273
|
+
saved_to: target,
|
|
274
|
+
bytes: bytes.length,
|
|
275
|
+
sha1,
|
|
276
|
+
...optionalSizeWarning(bytes.length),
|
|
277
|
+
};
|
|
278
|
+
},
|
|
279
|
+
cli: { resource: 'attachment', action: 'download', positional: 'id' },
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
name: 'tapd_attach_external_file',
|
|
283
|
+
description: '将第三方系统文件挂接到 TAPD 实体(不传输文件本体,仅登记标题+链接,FSD §3.3)。type 目前服务端仅支持 png/psd。',
|
|
284
|
+
write: true,
|
|
285
|
+
inputSchema: z.object({
|
|
286
|
+
workspace_id: z.number().optional().describe('项目ID(可省略,使用默认配置)'),
|
|
287
|
+
title: z.string().min(1).describe('第三方附件标题'),
|
|
288
|
+
source_url: z.string().min(1).describe('第三方附件链接'),
|
|
289
|
+
entity_type: z.enum(['story', 'bug', 'task']).describe('挂接实体类型(story/bug/task)'),
|
|
290
|
+
entity_id: z.string().describe('目标实体长 ID;必须以字符串(带引号)传递,禁止传数值,20 位 ID 超出 JS 安全整数范围会丢精度'),
|
|
291
|
+
type: z.enum(['png', 'psd']).default('png').describe('附件类型,目前服务端只支持 png/psd'),
|
|
292
|
+
creator: z.string().optional().describe('创建人,缺省为当前授权用户'),
|
|
293
|
+
}),
|
|
294
|
+
handler: async (client, params) => {
|
|
295
|
+
const workspaceId = requireWorkspaceId(params);
|
|
296
|
+
return client.post('/open_app_obj_attachment', {
|
|
297
|
+
workspace_id: workspaceId,
|
|
298
|
+
title: params.title,
|
|
299
|
+
type: params.type ?? 'png',
|
|
300
|
+
entry_type: params.entity_type,
|
|
301
|
+
entry_id: params.entity_id,
|
|
302
|
+
source_url: params.source_url,
|
|
303
|
+
...(params.creator !== undefined ? { creator: params.creator } : {}),
|
|
304
|
+
});
|
|
305
|
+
},
|
|
306
|
+
cli: { resource: 'attachment', action: 'attach-external' },
|
|
307
|
+
},
|
|
62
308
|
// Mini (轻协作) API attachment tools
|
|
63
309
|
{
|
|
64
310
|
name: 'tapd_mini_get_attachments',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment.js","sourceRoot":"","sources":["../../src/tools/attachment.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"attachment.js","sourceRoot":"","sources":["../../src/tools/attachment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachment.test.d.ts","sourceRoot":"","sources":["../../src/tools/attachment.test.ts"],"names":[],"mappings":""}
|