@xihe-lab/tapd-core 2.0.0-rc.1 → 2.0.0-rc.3

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 (158) hide show
  1. package/README.md +23 -0
  2. package/dist/advisor/index.d.ts.map +1 -1
  3. package/dist/advisor/index.js +2 -0
  4. package/dist/advisor/index.js.map +1 -1
  5. package/dist/cache/read-cache.d.ts +136 -0
  6. package/dist/cache/read-cache.d.ts.map +1 -0
  7. package/dist/cache/read-cache.js +322 -0
  8. package/dist/cache/read-cache.js.map +1 -0
  9. package/dist/cache/read-cache.test.d.ts +2 -0
  10. package/dist/cache/read-cache.test.d.ts.map +1 -0
  11. package/dist/cache/read-cache.test.js +429 -0
  12. package/dist/cache/read-cache.test.js.map +1 -0
  13. package/dist/errors/index.d.ts +120 -0
  14. package/dist/errors/index.d.ts.map +1 -0
  15. package/dist/errors/index.js +429 -0
  16. package/dist/errors/index.js.map +1 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +2 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/registry/registry.d.ts +7 -0
  22. package/dist/registry/registry.d.ts.map +1 -1
  23. package/dist/registry/registry.js +9 -3
  24. package/dist/registry/registry.js.map +1 -1
  25. package/dist/registry/registry.test.js +293 -2
  26. package/dist/registry/registry.test.js.map +1 -1
  27. package/dist/registry/richtext-manifests.generated.d.ts +1 -1
  28. package/dist/registry/richtext-manifests.generated.d.ts.map +1 -1
  29. package/dist/registry/richtext-manifests.generated.js +1 -1
  30. package/dist/registry/richtext-manifests.generated.js.map +1 -1
  31. package/dist/registry/richtext.d.ts +9 -0
  32. package/dist/registry/richtext.d.ts.map +1 -1
  33. package/dist/registry/richtext.js +33 -15
  34. package/dist/registry/richtext.js.map +1 -1
  35. package/dist/registry/richtext.test.js +70 -7
  36. package/dist/registry/richtext.test.js.map +1 -1
  37. package/dist/richtext/attachment-anchor.d.ts +58 -0
  38. package/dist/richtext/attachment-anchor.d.ts.map +1 -0
  39. package/dist/richtext/attachment-anchor.js +221 -0
  40. package/dist/richtext/attachment-anchor.js.map +1 -0
  41. package/dist/richtext/attachment-anchor.test.d.ts +2 -0
  42. package/dist/richtext/attachment-anchor.test.d.ts.map +1 -0
  43. package/dist/richtext/attachment-anchor.test.js +149 -0
  44. package/dist/richtext/attachment-anchor.test.js.map +1 -0
  45. package/dist/richtext/escape.d.ts +7 -0
  46. package/dist/richtext/escape.d.ts.map +1 -0
  47. package/dist/richtext/escape.js +60 -0
  48. package/dist/richtext/escape.js.map +1 -0
  49. package/dist/richtext/index.d.ts +15 -0
  50. package/dist/richtext/index.d.ts.map +1 -0
  51. package/dist/richtext/index.js +35 -0
  52. package/dist/richtext/index.js.map +1 -0
  53. package/dist/richtext/mention.d.ts +49 -0
  54. package/dist/richtext/mention.d.ts.map +1 -0
  55. package/dist/richtext/mention.js +179 -0
  56. package/dist/richtext/mention.js.map +1 -0
  57. package/dist/richtext/mention.test.d.ts +2 -0
  58. package/dist/richtext/mention.test.d.ts.map +1 -0
  59. package/dist/richtext/mention.test.js +123 -0
  60. package/dist/richtext/mention.test.js.map +1 -0
  61. package/dist/richtext/pipeline.d.ts +5 -0
  62. package/dist/richtext/pipeline.d.ts.map +1 -0
  63. package/dist/richtext/pipeline.js +199 -0
  64. package/dist/richtext/pipeline.js.map +1 -0
  65. package/dist/richtext/round-trip.test.d.ts +2 -0
  66. package/dist/richtext/round-trip.test.d.ts.map +1 -0
  67. package/dist/richtext/round-trip.test.js +105 -0
  68. package/dist/richtext/round-trip.test.js.map +1 -0
  69. package/dist/sdk-routes.d.ts.map +1 -1
  70. package/dist/sdk-routes.js +4 -0
  71. package/dist/sdk-routes.js.map +1 -1
  72. package/dist/tapd-client.d.ts +79 -2
  73. package/dist/tapd-client.d.ts.map +1 -1
  74. package/dist/tapd-client.js +177 -24
  75. package/dist/tapd-client.js.map +1 -1
  76. package/dist/tools/attachment.d.ts +47 -0
  77. package/dist/tools/attachment.d.ts.map +1 -1
  78. package/dist/tools/attachment.js +278 -32
  79. package/dist/tools/attachment.js.map +1 -1
  80. package/dist/tools/attachment.test.d.ts +2 -0
  81. package/dist/tools/attachment.test.d.ts.map +1 -0
  82. package/dist/tools/attachment.test.js +432 -0
  83. package/dist/tools/attachment.test.js.map +1 -0
  84. package/dist/tools/board.js +22 -22
  85. package/dist/tools/board.js.map +1 -1
  86. package/dist/tools/bug.d.ts.map +1 -1
  87. package/dist/tools/bug.js +262 -259
  88. package/dist/tools/bug.js.map +1 -1
  89. package/dist/tools/changes.js +20 -20
  90. package/dist/tools/changes.js.map +1 -1
  91. package/dist/tools/comment.d.ts.map +1 -1
  92. package/dist/tools/comment.js +26 -23
  93. package/dist/tools/comment.js.map +1 -1
  94. package/dist/tools/custom-fields.js +16 -16
  95. package/dist/tools/custom-fields.js.map +1 -1
  96. package/dist/tools/image.js +2 -2
  97. package/dist/tools/image.js.map +1 -1
  98. package/dist/tools/index.d.ts.map +1 -1
  99. package/dist/tools/index.js +2 -0
  100. package/dist/tools/index.js.map +1 -1
  101. package/dist/tools/iteration.js +50 -50
  102. package/dist/tools/iteration.js.map +1 -1
  103. package/dist/tools/media.d.ts +9 -0
  104. package/dist/tools/media.d.ts.map +1 -0
  105. package/dist/tools/media.js +45 -0
  106. package/dist/tools/media.js.map +1 -0
  107. package/dist/tools/mini-comment.js +27 -27
  108. package/dist/tools/mini-comment.js.map +1 -1
  109. package/dist/tools/mini-item.js +83 -83
  110. package/dist/tools/mini-item.js.map +1 -1
  111. package/dist/tools/mini-workspace.js +5 -5
  112. package/dist/tools/mini-workspace.js.map +1 -1
  113. package/dist/tools/program.js +7 -7
  114. package/dist/tools/program.js.map +1 -1
  115. package/dist/tools/relations.js +14 -14
  116. package/dist/tools/relations.js.map +1 -1
  117. package/dist/tools/release.js +53 -53
  118. package/dist/tools/release.js.map +1 -1
  119. package/dist/tools/report.js +8 -8
  120. package/dist/tools/report.js.map +1 -1
  121. package/dist/tools/richtext-wiring.test.d.ts +2 -0
  122. package/dist/tools/richtext-wiring.test.d.ts.map +1 -0
  123. package/dist/tools/richtext-wiring.test.js +302 -0
  124. package/dist/tools/richtext-wiring.test.js.map +1 -0
  125. package/dist/tools/settings.js +77 -77
  126. package/dist/tools/settings.js.map +1 -1
  127. package/dist/tools/source.js +14 -14
  128. package/dist/tools/source.js.map +1 -1
  129. package/dist/tools/story.d.ts.map +1 -1
  130. package/dist/tools/story.js +123 -120
  131. package/dist/tools/story.js.map +1 -1
  132. package/dist/tools/task.d.ts.map +1 -1
  133. package/dist/tools/task.js +126 -123
  134. package/dist/tools/task.js.map +1 -1
  135. package/dist/tools/test.js +117 -117
  136. package/dist/tools/test.js.map +1 -1
  137. package/dist/tools/timesheet.js +23 -23
  138. package/dist/tools/timesheet.js.map +1 -1
  139. package/dist/tools/user.js +8 -8
  140. package/dist/tools/user.js.map +1 -1
  141. package/dist/tools/utility.d.ts +17 -0
  142. package/dist/tools/utility.d.ts.map +1 -1
  143. package/dist/tools/utility.js +204 -88
  144. package/dist/tools/utility.js.map +1 -1
  145. package/dist/tools/wiki.d.ts.map +1 -1
  146. package/dist/tools/wiki.js +71 -56
  147. package/dist/tools/wiki.js.map +1 -1
  148. package/dist/tools/workflow.js +26 -26
  149. package/dist/tools/workflow.js.map +1 -1
  150. package/dist/tools/workspace.js +16 -16
  151. package/dist/tools/workspace.js.map +1 -1
  152. package/dist/types.d.ts +5 -0
  153. package/dist/types.d.ts.map +1 -1
  154. package/package.json +15 -11
  155. package/dist/tools/zz-acceptance-echo.d.ts +0 -3
  156. package/dist/tools/zz-acceptance-echo.d.ts.map +0 -1
  157. package/dist/tools/zz-acceptance-echo.js +0 -9
  158. package/dist/tools/zz-acceptance-echo.js.map +0 -1
@@ -0,0 +1,429 @@
1
+ /**
2
+ * TapdError —— 结构化错误模型(错误降级详情)
3
+ *
4
+ * 设计目标:工具报错时输出"足够人工接管"的信息,而不是薄薄一行状态码 + message。
5
+ * - 统一字段:内部错误码 / HTTP 状态 / endpoint / TAPD 服务端原始 status+info / 脱敏参数
6
+ * - hint:针对性修复建议(按错误码定制)
7
+ * - takeover:人工接管指引(建议检查项 / 开放平台·后台操作路径 / 需收集的信息)
8
+ * - JSON 友好:`toJSON()` 返回纯结构;`message` 首行保留人可读摘要(兼容旧日志/测试),
9
+ * 首行之后追加 `tapd-error <code>:` + pretty JSON 块——MCP 层只透出 message 字符串即可
10
+ * 完整携带结构(mcp 仓零改动受益)。
11
+ */
12
+ const SENSITIVE_KEY = /password|token|secret|credential/i;
13
+ const MAX_PARAM_TEXT = 300;
14
+ /**
15
+ * 错误详情参数脱敏:
16
+ * - 凭证类字段(password/token/secret/credential)一律掩码为 ***(与 registry 审计同规则)
17
+ * - 超长字符串截断(description/content 类字段不应淹没错误详情)
18
+ */
19
+ export function sanitizeParamsForError(params) {
20
+ if (!params)
21
+ return undefined;
22
+ const out = {};
23
+ for (const [key, value] of Object.entries(params)) {
24
+ if (value === undefined)
25
+ continue;
26
+ if (SENSITIVE_KEY.test(key)) {
27
+ out[key] = '***';
28
+ continue;
29
+ }
30
+ if (typeof value === 'string' && value.length > MAX_PARAM_TEXT) {
31
+ out[key] = `${value.slice(0, MAX_PARAM_TEXT)}…(truncated ${value.length} chars)`;
32
+ continue;
33
+ }
34
+ out[key] = value;
35
+ }
36
+ return out;
37
+ }
38
+ /** 从 TAPD 错误响应体提取业务 status / info(JSON 或纯文本均兼容)。 */
39
+ function parseTapdBody(bodyText) {
40
+ const trimmed = bodyText.trim();
41
+ if (trimmed.startsWith('{')) {
42
+ try {
43
+ const parsed = JSON.parse(trimmed);
44
+ return {
45
+ ...(typeof parsed.status === 'number' ? { tapdStatus: parsed.status } : {}),
46
+ ...(typeof parsed.info === 'string'
47
+ ? { tapdMessage: parsed.info }
48
+ : typeof parsed.message === 'string'
49
+ ? { tapdMessage: parsed.message }
50
+ : {}),
51
+ };
52
+ }
53
+ catch {
54
+ // 落入纯文本分支
55
+ }
56
+ }
57
+ return { tapdMessage: trimmed.slice(0, 500) || undefined };
58
+ }
59
+ /** 解析 Retry-After 头(秒数或 HTTP 日期)为毫秒;无法解析返回 undefined。 */
60
+ export function parseRetryAfterMs(header) {
61
+ if (!header)
62
+ return undefined;
63
+ const asSeconds = Number(header);
64
+ if (Number.isFinite(asSeconds) && asSeconds >= 0)
65
+ return Math.round(asSeconds * 1000);
66
+ const asDate = Date.parse(header);
67
+ if (!Number.isNaN(asDate))
68
+ return Math.max(0, asDate - Date.now());
69
+ return undefined;
70
+ }
71
+ /** 从 403 文案中提取 TAPD 权限 scope 形态(如 stories::workitem_types)。 */
72
+ function extractScope(text) {
73
+ const match = text?.match(/[a-zA-Z_]+::[a-zA-Z_]+/);
74
+ return match?.[0];
75
+ }
76
+ function hasIdParam(ctx) {
77
+ return ctx.params !== undefined && 'id' in ctx.params;
78
+ }
79
+ const OPEN_PLATFORM_WHERE = [
80
+ 'TAPD 开放平台(https://open.tapd.cn)→ 我的应用 → API 权限/接口权限管理',
81
+ '企业 TAPD 管理后台 → 应用与授权(确认应用可见范围与项目授权)',
82
+ ];
83
+ function baseCollect(ctx) {
84
+ return [
85
+ '本错误详情 JSON(code/endpoint/tapdMessage/params)',
86
+ ...(ctx ? [`请求方式:${ctx.method} ${ctx.path}`] : []),
87
+ '凭证类型(OAuth Access Token / Basic Auth)',
88
+ ];
89
+ }
90
+ /**
91
+ * 按错误码生成针对性 hint + takeover。
92
+ * 独立成纯函数便于单测各状态码的指引内容。
93
+ */
94
+ export function buildGuidance(code, ctx, info) {
95
+ const attempts = info?.attempts;
96
+ switch (code) {
97
+ case 'TAPD_HTTP_401':
98
+ case 'TAPD_HTTP_403': {
99
+ const scope = extractScope(info?.tapdMessage);
100
+ const is403 = code === 'TAPD_HTTP_403';
101
+ return {
102
+ hint: is403
103
+ ? `权限不足:当前凭证未被授权访问该接口${scope ? `(tapdMessage 提示 scope: ${scope})` : ''}。注意 Basic Auth 仅支持读取类 API,写操作必须 OAuth。`
104
+ : '认证失败(401):Access Token 无效/过期,或 Basic 凭证(api_user/api_password)错误。',
105
+ takeover: {
106
+ checks: is403
107
+ ? [
108
+ '确认凭证类型:Basic Auth 遇写接口(create/update)必 403,改用 OAuth token',
109
+ `在开放平台应用权限页确认接口对应 scope(${scope ?? '见 tapdMessage'})已申请并审批生效`,
110
+ '确认 token 对目标 workspace_id 所在项目有授权',
111
+ '用同一凭证 curl 直连该 endpoint 复现,排除网关/代理差异',
112
+ ]
113
+ : [
114
+ 'OAuth token 有有效期,确认是否已过期,重新走授权流程换取新 token',
115
+ 'Basic 模式确认 api_user/api_password 与公司 ID 匹配',
116
+ '确认系统时间正常(时间偏移会导致签名/Token 校验失败)',
117
+ ],
118
+ where: OPEN_PLATFORM_WHERE,
119
+ collect: [...baseCollect(ctx), ...(scope ? [`缺失 scope:${scope}`] : ['所需 scope(从 tapdMessage 或接口文档确认)'])],
120
+ },
121
+ };
122
+ }
123
+ case 'TAPD_BAD_ID':
124
+ case 'TAPD_HTTP_404':
125
+ return {
126
+ hint: '资源不存在(404):优先核对 ID 形态——19-20 位长 ID 必须按字符串传递(数值会精度损毁);'
127
+ + '≤9 位短 ID 需先换算长 ID(tapd_short_to_long_id / TapdClient.toLongId,云环境前缀 11 + workspace_id + 补零 9 位);再确认 id 与 workspace_id 同项目、资源未被删除。',
128
+ takeover: {
129
+ checks: [
130
+ 'id 是否以 number 传输(长 ID 超过 2^53 会精度丢失,必须字符串语义)',
131
+ '短 ID 是否已按 workspace_id 换算成长 ID(短 ID 跨项目会查错/查空)',
132
+ 'workspace_id 与 id 是否归属同一项目',
133
+ '换 tapd_get_stories/bugs/tasks 按 name 或创建时间范围检索,确认资源确实存在',
134
+ ],
135
+ collect: baseCollect(ctx),
136
+ },
137
+ };
138
+ case 'TAPD_RATE_LIMIT':
139
+ return {
140
+ hint: `触发 TAPD 接口限流(429):GET 已自动指数退避重试 ${attempts ?? '?'} 次仍失败。`
141
+ + (info?.retryAfterMs !== undefined
142
+ ? `服务端 Retry-After 要求等待约 ${info.retryAfterMs}ms。`
143
+ : '响应未携带 Retry-After。')
144
+ + '建议降低调用频率与批量并发(max_workers)、错峰执行。',
145
+ takeover: {
146
+ checks: [
147
+ '尊重 Retry-After 显式等待后重试(客户端已按其退避)',
148
+ '批量拉取降低 max_workers(默认 3)或分批',
149
+ '高频场景确认是否可改用批量查询接口(一次条件查询替代逐 ID 拉取)',
150
+ ],
151
+ collect: baseCollect(ctx),
152
+ },
153
+ };
154
+ case 'TAPD_NETWORK':
155
+ return {
156
+ hint: `网络层失败:检查代理/VPN、DNS 与 TAPD_API_BASE_URL 配置。GET 已自动重试 ${attempts ?? '?'} 次;`
157
+ + 'POST 不重试(防重复创建)——确认无部分写入后再重放。',
158
+ takeover: {
159
+ checks: [
160
+ 'curl 直连 TAPD_API_BASE_URL 验证网络连通性',
161
+ '检查是否有企业代理/防火墙拦截 api.tapd.cn',
162
+ 'POST 类操作先核对 TAPD 后台是否已产生数据,避免重放造成重复创建',
163
+ ],
164
+ collect: [...baseCollect(ctx), 'cause 中的底层网络错误信息(ECONNREFUSED/ETIMEDOUT 等)'],
165
+ },
166
+ };
167
+ case 'TAPD_NON_JSON':
168
+ return {
169
+ hint: '响应非 JSON:通常是网关/代理返回了 HTML 拦截页或服务端异常页。检查 TAPD_API_BASE_URL 是否被中间层改写。',
170
+ takeover: {
171
+ checks: [
172
+ '确认 TAPD_API_BASE_URL 指向官方 api.tapd.cn(或指定网关)',
173
+ '若走企业代理,确认代理对 API 域名的响应未被替换',
174
+ '重试一次排除瞬时网关错误',
175
+ ],
176
+ collect: baseCollect(ctx),
177
+ },
178
+ };
179
+ case 'TAPD_SDK_ERROR':
180
+ return {
181
+ hint: 'SDK 通道抛错:POST 请求不回退 fetch(防重复写入)。可设 TAPD_SDK_DISABLED=1 做对照(仅 GET 会回退 fetch),'
182
+ + '并核对该端点的 SDK_ROUTES 映射与参数编码(POST 会还原字面 \\n 为换行)。',
183
+ takeover: {
184
+ checks: [
185
+ '设 TAPD_SDK_DISABLED=1 复跑:GET 若成功则问题定位在 SDK 通道',
186
+ '确认 @opentapd/tapd-node-sdk 版本与该端点支持度',
187
+ 'POST 操作先核对 TAPD 后台是否已产生数据',
188
+ ],
189
+ collect: [...baseCollect(ctx), 'SDK 抛出的原始 cause'],
190
+ },
191
+ };
192
+ case 'TAPD_TIMEOUT':
193
+ return {
194
+ hint: `工具执行超时(${info?.timeoutMs ?? '?'}ms):调大 ExecContext.timeoutMs(CLI 用 --timeout),`
195
+ + '或缩小查询范围(fields 裁剪、时间窗收窄、limit 调小)后重试。单条慢查询优先排查是否全表条件扫描。',
196
+ takeover: {
197
+ checks: [
198
+ '确认超时发生时长:偶发超时调大 timeoutMs 即可;稳定超时先优化查询条件',
199
+ '批量并发 max_workers 过高会拖慢单请求,适当调低',
200
+ '网络抓包/TAPD 后台确认服务端是否有慢查询公告',
201
+ ],
202
+ collect: [...baseCollect(), `timeoutMs=${info?.timeoutMs ?? '?'}`, '工具名与参数'],
203
+ },
204
+ };
205
+ case 'TAPD_PARTIAL':
206
+ return {
207
+ hint: '批量操作失败(0 项成功,逐项错误见 items):可按 items 单独重试失败项'
208
+ + '——单项失败通常是数据形态/权限问题,不必整批重跑。',
209
+ takeover: {
210
+ checks: [
211
+ '按 items 逐项核对 error.code 与 hint(常见为单条 ID 形态或权限问题)',
212
+ '只重试失败项,避免整批重放',
213
+ '失败集中出现同一 code 时按该 code 的接管指引处理',
214
+ ],
215
+ collect: ['items 中每项的 id + error.code', '失败项占比(判断是个别数据问题还是系统性问题)'],
216
+ },
217
+ };
218
+ case 'TAPD_API_STATUS':
219
+ return {
220
+ hint: `TAPD 业务错误(HTTP 200 但响应体 status=${String(info?.httpStatus ?? '?')}≠1):`
221
+ + '常见原因为参数不合法、无权限或资源当前状态不允许该操作,以 tapdMessage 为准处理。',
222
+ takeover: {
223
+ checks: [
224
+ '按 tapdMessage 核对参数(字段格式/枚举值/必填项)',
225
+ '确认资源当前状态允许该操作(如已关闭的缺陷不能再指派)',
226
+ '写接口确认凭证为 OAuth 且对应 scope 已开通',
227
+ ],
228
+ collect: [...baseCollect(ctx), 'tapdStatus 与 tapdMessage 原文'],
229
+ },
230
+ };
231
+ default: {
232
+ if (code.startsWith('TAPD_HTTP_5')) {
233
+ return {
234
+ hint: `TAPD 服务端错误(${code.replace('TAPD_HTTP_', '')}):通常为瞬时故障。GET 已自动重试 ${attempts ?? '?'} 次;`
235
+ + 'POST 不重试(防重复创建)——确认无部分写入后再重放。',
236
+ takeover: {
237
+ checks: [
238
+ '稍候重试(5xx 多为瞬时)',
239
+ 'POST 操作先核对 TAPD 后台是否已产生数据',
240
+ '持续出现时查 TAPD 服务状态或联系平台管理员',
241
+ ],
242
+ collect: baseCollect(ctx),
243
+ },
244
+ };
245
+ }
246
+ if (code.startsWith('TAPD_HTTP_')) {
247
+ return {
248
+ hint: `请求被 TAPD 拒绝(HTTP ${code.replace('TAPD_HTTP_', '')}):核对 params 字段格式`
249
+ + '(日期 YYYY-MM-DD、长 ID 字符串语义、枚举取值),以 tapdMessage 为准修正后重试。',
250
+ takeover: {
251
+ checks: [
252
+ '对照 tapd-api-reference 核对参数名与取值格式',
253
+ '长 ID 类参数确认字符串语义未被数值化',
254
+ '确认 workspace_id 正确且资源存在',
255
+ ],
256
+ collect: baseCollect(ctx),
257
+ },
258
+ };
259
+ }
260
+ return {
261
+ hint: '未分类错误:按 cause 与堆栈定位;若确认由 TAPD 响应引发,请收集详情反馈补充错误分类。',
262
+ takeover: {
263
+ checks: ['查看 cause 与调用堆栈定位抛错来源', '核对最近一次成功的同工具调用参数差异'],
264
+ collect: baseCollect(ctx),
265
+ },
266
+ };
267
+ }
268
+ }
269
+ }
270
+ /** message 组装:首行摘要 + 结构化 JSON 块(MCP 透出 message 即携带全量结构)。 */
271
+ function buildMessage(detail) {
272
+ const head = detail.message;
273
+ const block = JSON.stringify(detail, null, 2);
274
+ return `${head}\ntapd-error ${detail.code}:\n${block}`;
275
+ }
276
+ /**
277
+ * 统一错误对象。
278
+ * - `message` 首行 = detail.message(人可读摘要,兼容旧日志/test 对首行的依赖)
279
+ * - `toJSON()` 返回纯结构(registry 会挂到 ExecResult.error.detail)
280
+ */
281
+ export class TapdError extends Error {
282
+ detail;
283
+ constructor(detail) {
284
+ super(buildMessage(detail));
285
+ this.name = 'TapdError';
286
+ this.detail = detail;
287
+ }
288
+ toJSON() {
289
+ return this.detail;
290
+ }
291
+ /** HTTP 非 2xx:按状态码归一语义码(429→RATE_LIMIT,404+id→BAD_ID)。 */
292
+ static http(ctx, httpStatus, statusText, bodyText, opts = {}) {
293
+ const body = parseTapdBody(bodyText);
294
+ const tapdMessage = body.tapdMessage ?? '';
295
+ let code = `TAPD_HTTP_${httpStatus}`;
296
+ if (httpStatus === 429)
297
+ code = 'TAPD_RATE_LIMIT';
298
+ else if (httpStatus === 404 && hasIdParam(ctx))
299
+ code = 'TAPD_BAD_ID';
300
+ const summary = tapdMessage !== '' ? tapdMessage : bodyText.slice(0, 200) || statusText;
301
+ const { hint, takeover } = buildGuidance(code, ctx, {
302
+ httpStatus,
303
+ tapdMessage,
304
+ retryAfterMs: opts.retryAfterMs,
305
+ attempts: opts.attempts,
306
+ });
307
+ return new TapdError({
308
+ code,
309
+ message: `TAPD API error: ${httpStatus} ${ctx.method} ${ctx.path} - ${summary}`,
310
+ httpStatus,
311
+ method: ctx.method,
312
+ endpoint: ctx.path,
313
+ ...(body.tapdStatus !== undefined ? { tapdStatus: body.tapdStatus } : {}),
314
+ ...(tapdMessage !== '' ? { tapdMessage } : {}),
315
+ ...(ctx.params ? { params: ctx.params } : {}),
316
+ ...(opts.retryAfterMs !== undefined ? { retryAfterMs: opts.retryAfterMs } : {}),
317
+ ...(opts.attempts !== undefined ? { attempts: opts.attempts } : {}),
318
+ hint,
319
+ takeover,
320
+ });
321
+ }
322
+ /** HTTP 200 但响应体 status !== 1(TAPD 业务错误)。 */
323
+ static apiStatus(ctx, tapdStatus, info, attempts) {
324
+ const { hint, takeover } = buildGuidance('TAPD_API_STATUS', ctx, { httpStatus: tapdStatus });
325
+ return new TapdError({
326
+ code: 'TAPD_API_STATUS',
327
+ message: `TAPD API error: ${info === '' ? 'Unknown error' : info}`,
328
+ method: ctx.method,
329
+ endpoint: ctx.path,
330
+ tapdStatus,
331
+ ...(info !== '' ? { tapdMessage: info } : {}),
332
+ ...(ctx.params ? { params: ctx.params } : {}),
333
+ ...(attempts !== undefined ? { attempts } : {}),
334
+ hint,
335
+ takeover,
336
+ });
337
+ }
338
+ /** 响应非 JSON(网关/代理/异常页)。 */
339
+ static nonJson(ctx, text, attempts) {
340
+ const { hint, takeover } = buildGuidance('TAPD_NON_JSON', ctx);
341
+ return new TapdError({
342
+ code: 'TAPD_NON_JSON',
343
+ message: `TAPD API returned non-JSON response: ${text.slice(0, 100)}`,
344
+ method: ctx.method,
345
+ endpoint: ctx.path,
346
+ ...(ctx.params ? { params: ctx.params } : {}),
347
+ ...(attempts !== undefined ? { attempts } : {}),
348
+ hint,
349
+ takeover,
350
+ ...(text !== '' ? { cause: text.slice(0, 500) } : {}),
351
+ });
352
+ }
353
+ /** 网络层失败(fetch reject:DNS/连接/中断)。 */
354
+ static network(ctx, cause, attempts) {
355
+ const causeMessage = cause instanceof Error ? cause.message : String(cause);
356
+ const { hint, takeover } = buildGuidance('TAPD_NETWORK', ctx, { attempts });
357
+ return new TapdError({
358
+ code: 'TAPD_NETWORK',
359
+ message: `TAPD API network error: ${causeMessage}`,
360
+ method: ctx.method,
361
+ endpoint: ctx.path,
362
+ ...(ctx.params ? { params: ctx.params } : {}),
363
+ ...(attempts !== undefined ? { attempts } : {}),
364
+ hint,
365
+ takeover,
366
+ cause: causeMessage,
367
+ });
368
+ }
369
+ /** SDK 通道抛错(POST 不回退 fetch)。 */
370
+ static sdk(ctx, cause) {
371
+ const causeMessage = cause instanceof Error ? cause.message : String(cause);
372
+ const { hint, takeover } = buildGuidance('TAPD_SDK_ERROR', ctx);
373
+ return new TapdError({
374
+ code: 'TAPD_SDK_ERROR',
375
+ message: `TAPD SDK error: ${causeMessage}`,
376
+ method: ctx.method,
377
+ endpoint: ctx.path,
378
+ ...(ctx.params ? { params: ctx.params } : {}),
379
+ hint,
380
+ takeover,
381
+ cause: causeMessage,
382
+ });
383
+ }
384
+ /** registry 层工具执行超时。 */
385
+ static timeout(tool, timeoutMs, args) {
386
+ const { hint, takeover } = buildGuidance('TAPD_TIMEOUT', undefined, { timeoutMs });
387
+ return new TapdError({
388
+ code: 'TAPD_TIMEOUT',
389
+ message: `tool timed out after ${timeoutMs}ms`,
390
+ tool,
391
+ ...(args ? { params: args } : {}),
392
+ hint,
393
+ takeover,
394
+ });
395
+ }
396
+ /**
397
+ * 批量操作全部失败(部分失败时 handler 返回降级聚合结构,不抛错)。
398
+ * items 携带逐项 TapdErrorDetail,保证"全部失败"也不丢任何单项信息。
399
+ */
400
+ static partial(ctx, total, failed) {
401
+ const items = failed.map(f => ({ id: f.id, error: f.error.toJSON() }));
402
+ const first = failed[0]?.error.detail.message ?? 'unknown';
403
+ const { hint, takeover } = buildGuidance('TAPD_PARTIAL', ctx, { total: items.length });
404
+ return new TapdError({
405
+ code: 'TAPD_PARTIAL',
406
+ message: `batch operation failed: 0/${total} succeeded via ${ctx.method} ${ctx.path}; first error: ${first}`,
407
+ method: ctx.method,
408
+ endpoint: ctx.path,
409
+ ...(ctx.params ? { params: ctx.params } : {}),
410
+ hint,
411
+ takeover,
412
+ items,
413
+ });
414
+ }
415
+ /** 未分类错误统一包一层(保留原 message 为首行摘要)。 */
416
+ static wrap(cause, tool) {
417
+ const causeMessage = cause instanceof Error ? cause.message : String(cause);
418
+ const { hint, takeover } = buildGuidance('TAPD_UNKNOWN');
419
+ return new TapdError({
420
+ code: 'TAPD_UNKNOWN',
421
+ message: causeMessage,
422
+ ...(tool ? { tool } : {}),
423
+ hint,
424
+ takeover,
425
+ cause: cause instanceof Error ? (cause.stack ?? causeMessage) : causeMessage,
426
+ });
427
+ }
428
+ }
429
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,8 @@
1
1
  export type { ToolDef, TapdResponse, CliMeta } from './types.js';
2
2
  export { TapdClient } from './tapd-client.js';
3
+ export { TapdError, buildGuidance, parseRetryAfterMs, sanitizeParamsForError, type BatchFailureItem, type RequestContext, type TapdErrorCode, type TapdErrorDetail, type TapdTakeover, } from './errors/index.js';
4
+ export { CACHE_TTL_MS, cacheStats, invalidateCache, type CacheStats, } from './cache/read-cache.js';
5
+ export type { BatchDegradedResult } from './tools/utility.js';
3
6
  export { allTools } from './tools/index.js';
4
7
  export { ToolRegistry, type Entry, type ExecContext, type AuditEvent, type CliErrorCode, type ExecResult, type DerivedCommand, } from './registry/registry.js';
5
8
  export { resolveWrite } from './registry/write-policy.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,KAAK,KAAK,EACV,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,KAAK,YAAY,EACjB,KAAK,UAAU,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,aAAa,EACb,UAAU,EACV,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,UAAU,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,YAAY,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EACZ,UAAU,EACV,eAAe,EACf,KAAK,UAAU,GAChB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,KAAK,KAAK,EACV,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,KAAK,YAAY,EACjB,KAAK,UAAU,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,KAAK,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,aAAa,EACb,UAAU,EACV,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,UAAU,GAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,6 @@
1
1
  export { TapdClient } from './tapd-client.js';
2
+ export { TapdError, buildGuidance, parseRetryAfterMs, sanitizeParamsForError, } from './errors/index.js';
3
+ export { CACHE_TTL_MS, cacheStats, invalidateCache, } from './cache/read-cache.js';
2
4
  export { allTools } from './tools/index.js';
3
5
  export { ToolRegistry, } from './registry/registry.js';
4
6
  export { resolveWrite } from './registry/write-policy.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EACL,YAAY,GAOb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EACL,iBAAiB,EACjB,SAAS,GAGV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAA4B,MAAM,8BAA8B,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,aAAa,EACb,UAAU,GAQX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAA+D,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,sBAAsB,GAMvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EACZ,UAAU,EACV,eAAe,GAEhB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EACL,YAAY,GAOb,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EACL,iBAAiB,EACjB,SAAS,GAGV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAA4B,MAAM,8BAA8B,CAAC;AACvF,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,UAAU,EACV,cAAc,EACd,aAAa,EACb,UAAU,GAQX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAA+D,MAAM,oBAAoB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import type { ToolDef } from '../types.js';
2
2
  import type { TapdClient } from '../tapd-client.js';
3
+ import type { TapdErrorDetail } from '../errors/index.js';
3
4
  export type Entry = 'cli' | 'mcp';
4
5
  export interface ExecContext {
5
6
  entry: Entry;
@@ -23,6 +24,12 @@ export interface ExecResult<T = unknown> {
23
24
  error?: {
24
25
  code: CliErrorCode;
25
26
  message: string;
27
+ /**
28
+ * 结构化错误详情(TapdError.toJSON()):API_ERROR / TIMEOUT 时携带。
29
+ * message 首行为人可读摘要,其后内嵌同一份 JSON 块——只读 message 的消费方
30
+ * (如 MCP 透出)也能拿到全量结构;能拿到 detail 字段的则可直接用对象。
31
+ */
32
+ detail?: TapdErrorDetail;
26
33
  };
27
34
  }
28
35
  export interface DerivedCommand {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAOpD,MAAM,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAElC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GACpB,gBAAgB,GAChB,cAAc,GACd,mBAAmB,GACnB,cAAc,GACd,WAAW,GACX,SAAS,CAAC;AAEd,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAiCD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA8B;IAE3C,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI;IAchC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAItC,IAAI,IAAI,OAAO,EAAE;IAIjB,QAAQ,IAAI,cAAc,EAAE;IAatB,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,WAAW,EAChB,aAAa,CAAC,EAAE,MAAM,UAAU,GAC/B,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;CAmE1B"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAQ1D,MAAM,MAAM,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAElC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GACpB,gBAAgB,GAChB,cAAc,GACd,mBAAmB,GACnB,cAAc,GACd,WAAW,GACX,SAAS,CAAC;AAEd,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE;QACN,IAAI,EAAE,YAAY,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB;;;;WAIG;QACH,MAAM,CAAC,EAAE,eAAe,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAiCD,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA8B;IAE3C,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,IAAI;IAchC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAItC,IAAI,IAAI,OAAO,EAAE;IAIjB,QAAQ,IAAI,cAAc,EAAE;IAatB,IAAI,CAAC,CAAC,GAAG,OAAO,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,WAAW,EAChB,aAAa,CAAC,EAAE,MAAM,UAAU,GAC/B,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;CAwE1B"}
@@ -1,3 +1,4 @@
1
+ import { TapdError } from '../errors/index.js';
1
2
  import { resolveWrite } from './write-policy.js';
2
3
  import { deriveCommand } from './derive-command.js';
3
4
  import { MANUAL_CLI_META, EXPLICIT_WRITE } from './cli-meta.js';
@@ -119,12 +120,17 @@ export class ToolRegistry {
119
120
  }
120
121
  catch (error) {
121
122
  if (error instanceof TimeoutSignal) {
123
+ // 超时也走结构化模型:带 hint(调 timeoutMs / 收窄查询)与脱敏参数
124
+ const timeoutError = TapdError.timeout(name, ctx.timeoutMs ?? DEFAULT_TIMEOUT_MS, sanitizeArgs(parsed.data));
122
125
  finish(false, 'TIMEOUT');
123
- return { ok: false, error: { code: 'TIMEOUT', message: error.message } };
126
+ return { ok: false, error: { code: 'TIMEOUT', message: timeoutError.message, detail: timeoutError.toJSON() } };
124
127
  }
125
- const message = error instanceof Error ? error.message : 'Unknown error';
128
+ // 错误路径统一走 TapdError 模型:TapdError 原样保留结构;普通 Error/未知抛出物
129
+ // 包一层 TAPD_UNKNOWN。message = 首行人可读摘要 + 内嵌结构化 JSON 块,
130
+ // 只透出 message 的消费方(MCP/日志)也能拿到全量接管信息。
131
+ const tapdError = error instanceof TapdError ? error : TapdError.wrap(error, name);
126
132
  finish(false, 'API_ERROR');
127
- return { ok: false, error: { code: 'API_ERROR', message } };
133
+ return { ok: false, error: { code: 'API_ERROR', message: tapdError.message, detail: tapdError.toJSON() } };
128
134
  }
129
135
  }
130
136
  }
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"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"}