@lark-project/openclaw-lark-project 2026.3.131

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 (368) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +80 -0
  3. package/README.zh.md +80 -0
  4. package/dist/index.js +172 -0
  5. package/dist/index.js.map +7 -0
  6. package/dist/skills/feishu-bitable/SKILL.md +248 -0
  7. package/dist/skills/feishu-bitable/references/examples.md +813 -0
  8. package/dist/skills/feishu-bitable/references/field-properties.md +763 -0
  9. package/dist/skills/feishu-bitable/references/record-values.md +911 -0
  10. package/dist/skills/feishu-calendar/SKILL.md +244 -0
  11. package/dist/skills/feishu-channel-rules/SKILL.md +18 -0
  12. package/dist/skills/feishu-channel-rules/references/markdown-syntax.md +138 -0
  13. package/dist/skills/feishu-create-doc/SKILL.md +719 -0
  14. package/dist/skills/feishu-fetch-doc/SKILL.md +93 -0
  15. package/dist/skills/feishu-im-read/SKILL.md +163 -0
  16. package/dist/skills/feishu-project/SKILL.md +122 -0
  17. package/dist/skills/feishu-task/SKILL.md +293 -0
  18. package/dist/skills/feishu-troubleshoot/SKILL.md +70 -0
  19. package/dist/skills/feishu-update-doc/SKILL.md +285 -0
  20. package/dist/src/card/builder.js +293 -0
  21. package/dist/src/card/builder.js.map +7 -0
  22. package/dist/src/card/cardkit.js +126 -0
  23. package/dist/src/card/cardkit.js.map +7 -0
  24. package/dist/src/card/flush-controller.js +107 -0
  25. package/dist/src/card/flush-controller.js.map +7 -0
  26. package/dist/src/card/markdown-style.js +57 -0
  27. package/dist/src/card/markdown-style.js.map +7 -0
  28. package/dist/src/card/reply-dispatcher-types.js +39 -0
  29. package/dist/src/card/reply-dispatcher-types.js.map +7 -0
  30. package/dist/src/card/reply-dispatcher.js +245 -0
  31. package/dist/src/card/reply-dispatcher.js.map +7 -0
  32. package/dist/src/card/reply-mode.js +29 -0
  33. package/dist/src/card/reply-mode.js.map +7 -0
  34. package/dist/src/card/streaming-card-controller.js +653 -0
  35. package/dist/src/card/streaming-card-controller.js.map +7 -0
  36. package/dist/src/card/unavailable-guard.js +76 -0
  37. package/dist/src/card/unavailable-guard.js.map +7 -0
  38. package/dist/src/channel/abort-detect.js +79 -0
  39. package/dist/src/channel/abort-detect.js.map +7 -0
  40. package/dist/src/channel/chat-queue.js +50 -0
  41. package/dist/src/channel/chat-queue.js.map +7 -0
  42. package/dist/src/channel/config-adapter.js +89 -0
  43. package/dist/src/channel/config-adapter.js.map +7 -0
  44. package/dist/src/channel/directory.js +133 -0
  45. package/dist/src/channel/directory.js.map +7 -0
  46. package/dist/src/channel/event-handlers.js +175 -0
  47. package/dist/src/channel/event-handlers.js.map +7 -0
  48. package/dist/src/channel/monitor.js +108 -0
  49. package/dist/src/channel/monitor.js.map +7 -0
  50. package/dist/src/channel/onboarding-config.js +76 -0
  51. package/dist/src/channel/onboarding-config.js.map +7 -0
  52. package/dist/src/channel/onboarding-migrate.js +55 -0
  53. package/dist/src/channel/onboarding-migrate.js.map +7 -0
  54. package/dist/src/channel/onboarding.js +285 -0
  55. package/dist/src/channel/onboarding.js.map +7 -0
  56. package/dist/src/channel/plugin.js +260 -0
  57. package/dist/src/channel/plugin.js.map +7 -0
  58. package/dist/src/channel/probe.js +14 -0
  59. package/dist/src/channel/probe.js.map +7 -0
  60. package/dist/src/channel/types.js +1 -0
  61. package/dist/src/channel/types.js.map +7 -0
  62. package/dist/src/commands/auth.js +73 -0
  63. package/dist/src/commands/auth.js.map +7 -0
  64. package/dist/src/commands/diagnose.js +658 -0
  65. package/dist/src/commands/diagnose.js.map +7 -0
  66. package/dist/src/commands/doctor.js +327 -0
  67. package/dist/src/commands/doctor.js.map +7 -0
  68. package/dist/src/commands/index.js +124 -0
  69. package/dist/src/commands/index.js.map +7 -0
  70. package/dist/src/core/accounts.js +129 -0
  71. package/dist/src/core/accounts.js.map +7 -0
  72. package/dist/src/core/agent-config.js +60 -0
  73. package/dist/src/core/agent-config.js.map +7 -0
  74. package/dist/src/core/api-error.js +55 -0
  75. package/dist/src/core/api-error.js.map +7 -0
  76. package/dist/src/core/app-owner-fallback.js +17 -0
  77. package/dist/src/core/app-owner-fallback.js.map +7 -0
  78. package/dist/src/core/app-scope-checker.js +95 -0
  79. package/dist/src/core/app-scope-checker.js.map +7 -0
  80. package/dist/src/core/auth-errors.js +120 -0
  81. package/dist/src/core/auth-errors.js.map +7 -0
  82. package/dist/src/core/chat-info-cache.js +102 -0
  83. package/dist/src/core/chat-info-cache.js.map +7 -0
  84. package/dist/src/core/config-schema.js +150 -0
  85. package/dist/src/core/config-schema.js.map +7 -0
  86. package/dist/src/core/device-flow.js +174 -0
  87. package/dist/src/core/device-flow.js.map +7 -0
  88. package/dist/src/core/feishu-fetch.js +12 -0
  89. package/dist/src/core/feishu-fetch.js.map +7 -0
  90. package/dist/src/core/footer-config.js +16 -0
  91. package/dist/src/core/footer-config.js.map +7 -0
  92. package/dist/src/core/lark-client.js +322 -0
  93. package/dist/src/core/lark-client.js.map +7 -0
  94. package/dist/src/core/lark-logger.js +92 -0
  95. package/dist/src/core/lark-logger.js.map +7 -0
  96. package/dist/src/core/lark-ticket.js +18 -0
  97. package/dist/src/core/lark-ticket.js.map +7 -0
  98. package/dist/src/core/message-unavailable.js +119 -0
  99. package/dist/src/core/message-unavailable.js.map +7 -0
  100. package/dist/src/core/owner-policy.js +25 -0
  101. package/dist/src/core/owner-policy.js.map +7 -0
  102. package/dist/src/core/permission-url.js +37 -0
  103. package/dist/src/core/permission-url.js.map +7 -0
  104. package/dist/src/core/project-auth.js +177 -0
  105. package/dist/src/core/project-auth.js.map +7 -0
  106. package/dist/src/core/project-oauth-flow.js +124 -0
  107. package/dist/src/core/project-oauth-flow.js.map +7 -0
  108. package/dist/src/core/project-token-store.js +172 -0
  109. package/dist/src/core/project-token-store.js.map +7 -0
  110. package/dist/src/core/raw-request.js +45 -0
  111. package/dist/src/core/raw-request.js.map +7 -0
  112. package/dist/src/core/scope-manager.js +62 -0
  113. package/dist/src/core/scope-manager.js.map +7 -0
  114. package/dist/src/core/security-check.js +118 -0
  115. package/dist/src/core/security-check.js.map +7 -0
  116. package/dist/src/core/shutdown-hooks.js +37 -0
  117. package/dist/src/core/shutdown-hooks.js.map +7 -0
  118. package/dist/src/core/targets.js +55 -0
  119. package/dist/src/core/targets.js.map +7 -0
  120. package/dist/src/core/token-store.js +215 -0
  121. package/dist/src/core/token-store.js.map +7 -0
  122. package/dist/src/core/tool-client.js +335 -0
  123. package/dist/src/core/tool-client.js.map +7 -0
  124. package/dist/src/core/tool-scopes.js +207 -0
  125. package/dist/src/core/tool-scopes.js.map +7 -0
  126. package/dist/src/core/tools-config.js +57 -0
  127. package/dist/src/core/tools-config.js.map +7 -0
  128. package/dist/src/core/types.js +1 -0
  129. package/dist/src/core/types.js.map +7 -0
  130. package/dist/src/core/uat-client.js +124 -0
  131. package/dist/src/core/uat-client.js.map +7 -0
  132. package/dist/src/core/version.js +27 -0
  133. package/dist/src/core/version.js.map +7 -0
  134. package/dist/src/messaging/converters/audio.js +19 -0
  135. package/dist/src/messaging/converters/audio.js.map +7 -0
  136. package/dist/src/messaging/converters/calendar.js +46 -0
  137. package/dist/src/messaging/converters/calendar.js.map +7 -0
  138. package/dist/src/messaging/converters/content-converter.js +61 -0
  139. package/dist/src/messaging/converters/content-converter.js.map +7 -0
  140. package/dist/src/messaging/converters/file.js +18 -0
  141. package/dist/src/messaging/converters/file.js.map +7 -0
  142. package/dist/src/messaging/converters/folder.js +18 -0
  143. package/dist/src/messaging/converters/folder.js.map +7 -0
  144. package/dist/src/messaging/converters/hongbao.js +14 -0
  145. package/dist/src/messaging/converters/hongbao.js.map +7 -0
  146. package/dist/src/messaging/converters/image.js +16 -0
  147. package/dist/src/messaging/converters/image.js.map +7 -0
  148. package/dist/src/messaging/converters/index.js +48 -0
  149. package/dist/src/messaging/converters/index.js.map +7 -0
  150. package/dist/src/messaging/converters/interactive/card-converter.js +1040 -0
  151. package/dist/src/messaging/converters/interactive/card-converter.js.map +7 -0
  152. package/dist/src/messaging/converters/interactive/card-utils.js +36 -0
  153. package/dist/src/messaging/converters/interactive/card-utils.js.map +7 -0
  154. package/dist/src/messaging/converters/interactive/index.js +19 -0
  155. package/dist/src/messaging/converters/interactive/index.js.map +7 -0
  156. package/dist/src/messaging/converters/interactive/legacy.js +53 -0
  157. package/dist/src/messaging/converters/interactive/legacy.js.map +7 -0
  158. package/dist/src/messaging/converters/interactive/types.js +23 -0
  159. package/dist/src/messaging/converters/interactive/types.js.map +7 -0
  160. package/dist/src/messaging/converters/location.js +17 -0
  161. package/dist/src/messaging/converters/location.js.map +7 -0
  162. package/dist/src/messaging/converters/merge-forward.js +143 -0
  163. package/dist/src/messaging/converters/merge-forward.js.map +7 -0
  164. package/dist/src/messaging/converters/post.js +113 -0
  165. package/dist/src/messaging/converters/post.js.map +7 -0
  166. package/dist/src/messaging/converters/share.js +22 -0
  167. package/dist/src/messaging/converters/share.js.map +7 -0
  168. package/dist/src/messaging/converters/sticker.js +16 -0
  169. package/dist/src/messaging/converters/sticker.js.map +7 -0
  170. package/dist/src/messaging/converters/system.js +25 -0
  171. package/dist/src/messaging/converters/system.js.map +7 -0
  172. package/dist/src/messaging/converters/text.js +12 -0
  173. package/dist/src/messaging/converters/text.js.map +7 -0
  174. package/dist/src/messaging/converters/todo.js +37 -0
  175. package/dist/src/messaging/converters/todo.js.map +7 -0
  176. package/dist/src/messaging/converters/types.js +1 -0
  177. package/dist/src/messaging/converters/types.js.map +7 -0
  178. package/dist/src/messaging/converters/unknown.js +13 -0
  179. package/dist/src/messaging/converters/unknown.js.map +7 -0
  180. package/dist/src/messaging/converters/utils.js +35 -0
  181. package/dist/src/messaging/converters/utils.js.map +7 -0
  182. package/dist/src/messaging/converters/video-chat.js +21 -0
  183. package/dist/src/messaging/converters/video-chat.js.map +7 -0
  184. package/dist/src/messaging/converters/video.js +30 -0
  185. package/dist/src/messaging/converters/video.js.map +7 -0
  186. package/dist/src/messaging/converters/vote.js +24 -0
  187. package/dist/src/messaging/converters/vote.js.map +7 -0
  188. package/dist/src/messaging/inbound/dedup.js +82 -0
  189. package/dist/src/messaging/inbound/dedup.js.map +7 -0
  190. package/dist/src/messaging/inbound/dispatch-builders.js +98 -0
  191. package/dist/src/messaging/inbound/dispatch-builders.js.map +7 -0
  192. package/dist/src/messaging/inbound/dispatch-commands.js +94 -0
  193. package/dist/src/messaging/inbound/dispatch-commands.js.map +7 -0
  194. package/dist/src/messaging/inbound/dispatch-context.js +96 -0
  195. package/dist/src/messaging/inbound/dispatch-context.js.map +7 -0
  196. package/dist/src/messaging/inbound/dispatch.js +150 -0
  197. package/dist/src/messaging/inbound/dispatch.js.map +7 -0
  198. package/dist/src/messaging/inbound/enrich.js +137 -0
  199. package/dist/src/messaging/inbound/enrich.js.map +7 -0
  200. package/dist/src/messaging/inbound/gate-effects.js +28 -0
  201. package/dist/src/messaging/inbound/gate-effects.js.map +7 -0
  202. package/dist/src/messaging/inbound/gate.js +163 -0
  203. package/dist/src/messaging/inbound/gate.js.map +7 -0
  204. package/dist/src/messaging/inbound/handler.js +132 -0
  205. package/dist/src/messaging/inbound/handler.js.map +7 -0
  206. package/dist/src/messaging/inbound/media-resolver.js +70 -0
  207. package/dist/src/messaging/inbound/media-resolver.js.map +7 -0
  208. package/dist/src/messaging/inbound/mention.js +50 -0
  209. package/dist/src/messaging/inbound/mention.js.map +7 -0
  210. package/dist/src/messaging/inbound/parse-io.js +41 -0
  211. package/dist/src/messaging/inbound/parse-io.js.map +7 -0
  212. package/dist/src/messaging/inbound/parse.js +79 -0
  213. package/dist/src/messaging/inbound/parse.js.map +7 -0
  214. package/dist/src/messaging/inbound/permission.js +30 -0
  215. package/dist/src/messaging/inbound/permission.js.map +7 -0
  216. package/dist/src/messaging/inbound/policy.js +83 -0
  217. package/dist/src/messaging/inbound/policy.js.map +7 -0
  218. package/dist/src/messaging/inbound/reaction-handler.js +162 -0
  219. package/dist/src/messaging/inbound/reaction-handler.js.map +7 -0
  220. package/dist/src/messaging/inbound/user-name-cache.js +172 -0
  221. package/dist/src/messaging/inbound/user-name-cache.js.map +7 -0
  222. package/dist/src/messaging/outbound/actions.js +239 -0
  223. package/dist/src/messaging/outbound/actions.js.map +7 -0
  224. package/dist/src/messaging/outbound/chat-manage.js +74 -0
  225. package/dist/src/messaging/outbound/chat-manage.js.map +7 -0
  226. package/dist/src/messaging/outbound/deliver.js +162 -0
  227. package/dist/src/messaging/outbound/deliver.js.map +7 -0
  228. package/dist/src/messaging/outbound/fetch.js +7 -0
  229. package/dist/src/messaging/outbound/fetch.js.map +7 -0
  230. package/dist/src/messaging/outbound/forward.js +31 -0
  231. package/dist/src/messaging/outbound/forward.js.map +7 -0
  232. package/dist/src/messaging/outbound/media-url-utils.js +101 -0
  233. package/dist/src/messaging/outbound/media-url-utils.js.map +7 -0
  234. package/dist/src/messaging/outbound/media.js +463 -0
  235. package/dist/src/messaging/outbound/media.js.map +7 -0
  236. package/dist/src/messaging/outbound/outbound.js +95 -0
  237. package/dist/src/messaging/outbound/outbound.js.map +7 -0
  238. package/dist/src/messaging/outbound/reactions.js +312 -0
  239. package/dist/src/messaging/outbound/reactions.js.map +7 -0
  240. package/dist/src/messaging/outbound/send.js +194 -0
  241. package/dist/src/messaging/outbound/send.js.map +7 -0
  242. package/dist/src/messaging/outbound/typing.js +77 -0
  243. package/dist/src/messaging/outbound/typing.js.map +7 -0
  244. package/dist/src/messaging/shared/message-lookup.js +84 -0
  245. package/dist/src/messaging/shared/message-lookup.js.map +7 -0
  246. package/dist/src/messaging/types.js +1 -0
  247. package/dist/src/messaging/types.js.map +7 -0
  248. package/dist/src/tools/auto-auth.js +714 -0
  249. package/dist/src/tools/auto-auth.js.map +7 -0
  250. package/dist/src/tools/helpers.js +133 -0
  251. package/dist/src/tools/helpers.js.map +7 -0
  252. package/dist/src/tools/mcp/doc/create.js +35 -0
  253. package/dist/src/tools/mcp/doc/create.js.map +7 -0
  254. package/dist/src/tools/mcp/doc/fetch.js +33 -0
  255. package/dist/src/tools/mcp/doc/fetch.js.map +7 -0
  256. package/dist/src/tools/mcp/doc/index.js +32 -0
  257. package/dist/src/tools/mcp/doc/index.js.map +7 -0
  258. package/dist/src/tools/mcp/doc/update.js +61 -0
  259. package/dist/src/tools/mcp/doc/update.js.map +7 -0
  260. package/dist/src/tools/mcp/project/endpoint.js +25 -0
  261. package/dist/src/tools/mcp/project/endpoint.js.map +7 -0
  262. package/dist/src/tools/mcp/project/index.js +27 -0
  263. package/dist/src/tools/mcp/project/index.js.map +7 -0
  264. package/dist/src/tools/mcp/project/tools.js +579 -0
  265. package/dist/src/tools/mcp/project/tools.js.map +7 -0
  266. package/dist/src/tools/mcp/shared.js +170 -0
  267. package/dist/src/tools/mcp/shared.js.map +7 -0
  268. package/dist/src/tools/oapi/bitable/app-table-field.js +244 -0
  269. package/dist/src/tools/oapi/bitable/app-table-field.js.map +7 -0
  270. package/dist/src/tools/oapi/bitable/app-table-record.js +501 -0
  271. package/dist/src/tools/oapi/bitable/app-table-record.js.map +7 -0
  272. package/dist/src/tools/oapi/bitable/app-table-view.js +226 -0
  273. package/dist/src/tools/oapi/bitable/app-table-view.js.map +7 -0
  274. package/dist/src/tools/oapi/bitable/app-table.js +278 -0
  275. package/dist/src/tools/oapi/bitable/app-table.js.map +7 -0
  276. package/dist/src/tools/oapi/bitable/app.js +200 -0
  277. package/dist/src/tools/oapi/bitable/app.js.map +7 -0
  278. package/dist/src/tools/oapi/bitable/index.js +13 -0
  279. package/dist/src/tools/oapi/bitable/index.js.map +7 -0
  280. package/dist/src/tools/oapi/calendar/calendar.js +131 -0
  281. package/dist/src/tools/oapi/calendar/calendar.js.map +7 -0
  282. package/dist/src/tools/oapi/calendar/event-attendee.js +301 -0
  283. package/dist/src/tools/oapi/calendar/event-attendee.js.map +7 -0
  284. package/dist/src/tools/oapi/calendar/event.js +834 -0
  285. package/dist/src/tools/oapi/calendar/event.js.map +7 -0
  286. package/dist/src/tools/oapi/calendar/freebusy.js +111 -0
  287. package/dist/src/tools/oapi/calendar/freebusy.js.map +7 -0
  288. package/dist/src/tools/oapi/calendar/index.js +11 -0
  289. package/dist/src/tools/oapi/calendar/index.js.map +7 -0
  290. package/dist/src/tools/oapi/chat/chat.js +132 -0
  291. package/dist/src/tools/oapi/chat/chat.js.map +7 -0
  292. package/dist/src/tools/oapi/chat/index.js +11 -0
  293. package/dist/src/tools/oapi/chat/index.js.map +7 -0
  294. package/dist/src/tools/oapi/chat/members.js +83 -0
  295. package/dist/src/tools/oapi/chat/members.js.map +7 -0
  296. package/dist/src/tools/oapi/common/get-user.js +95 -0
  297. package/dist/src/tools/oapi/common/get-user.js.map +7 -0
  298. package/dist/src/tools/oapi/common/index.js +7 -0
  299. package/dist/src/tools/oapi/common/index.js.map +7 -0
  300. package/dist/src/tools/oapi/common/search-user.js +67 -0
  301. package/dist/src/tools/oapi/common/search-user.js.map +7 -0
  302. package/dist/src/tools/oapi/drive/doc-comments.js +310 -0
  303. package/dist/src/tools/oapi/drive/doc-comments.js.map +7 -0
  304. package/dist/src/tools/oapi/drive/doc-media.js +314 -0
  305. package/dist/src/tools/oapi/drive/doc-media.js.map +7 -0
  306. package/dist/src/tools/oapi/drive/file.js +548 -0
  307. package/dist/src/tools/oapi/drive/file.js.map +7 -0
  308. package/dist/src/tools/oapi/drive/index.js +29 -0
  309. package/dist/src/tools/oapi/drive/index.js.map +7 -0
  310. package/dist/src/tools/oapi/helpers.js +199 -0
  311. package/dist/src/tools/oapi/helpers.js.map +7 -0
  312. package/dist/src/tools/oapi/im/format-messages.js +128 -0
  313. package/dist/src/tools/oapi/im/format-messages.js.map +7 -0
  314. package/dist/src/tools/oapi/im/index.js +15 -0
  315. package/dist/src/tools/oapi/im/index.js.map +7 -0
  316. package/dist/src/tools/oapi/im/message-read.js +404 -0
  317. package/dist/src/tools/oapi/im/message-read.js.map +7 -0
  318. package/dist/src/tools/oapi/im/message.js +179 -0
  319. package/dist/src/tools/oapi/im/message.js.map +7 -0
  320. package/dist/src/tools/oapi/im/resource.js +126 -0
  321. package/dist/src/tools/oapi/im/resource.js.map +7 -0
  322. package/dist/src/tools/oapi/im/time-utils.js +169 -0
  323. package/dist/src/tools/oapi/im/time-utils.js.map +7 -0
  324. package/dist/src/tools/oapi/im/user-name-uat.js +103 -0
  325. package/dist/src/tools/oapi/im/user-name-uat.js.map +7 -0
  326. package/dist/src/tools/oapi/index.js +56 -0
  327. package/dist/src/tools/oapi/index.js.map +7 -0
  328. package/dist/src/tools/oapi/sdk-types.js +1 -0
  329. package/dist/src/tools/oapi/sdk-types.js.map +7 -0
  330. package/dist/src/tools/oapi/search/doc-search.js +215 -0
  331. package/dist/src/tools/oapi/search/doc-search.js.map +7 -0
  332. package/dist/src/tools/oapi/search/index.js +25 -0
  333. package/dist/src/tools/oapi/search/index.js.map +7 -0
  334. package/dist/src/tools/oapi/sheets/index.js +25 -0
  335. package/dist/src/tools/oapi/sheets/index.js.map +7 -0
  336. package/dist/src/tools/oapi/sheets/sheet.js +652 -0
  337. package/dist/src/tools/oapi/sheets/sheet.js.map +7 -0
  338. package/dist/src/tools/oapi/task/comment.js +151 -0
  339. package/dist/src/tools/oapi/task/comment.js.map +7 -0
  340. package/dist/src/tools/oapi/task/index.js +11 -0
  341. package/dist/src/tools/oapi/task/index.js.map +7 -0
  342. package/dist/src/tools/oapi/task/subtask.js +175 -0
  343. package/dist/src/tools/oapi/task/subtask.js.map +7 -0
  344. package/dist/src/tools/oapi/task/task.js +405 -0
  345. package/dist/src/tools/oapi/task/task.js.map +7 -0
  346. package/dist/src/tools/oapi/task/tasklist.js +366 -0
  347. package/dist/src/tools/oapi/task/tasklist.js.map +7 -0
  348. package/dist/src/tools/oapi/wiki/index.js +27 -0
  349. package/dist/src/tools/oapi/wiki/index.js.map +7 -0
  350. package/dist/src/tools/oapi/wiki/space-node.js +311 -0
  351. package/dist/src/tools/oapi/wiki/space-node.js.map +7 -0
  352. package/dist/src/tools/oapi/wiki/space.js +148 -0
  353. package/dist/src/tools/oapi/wiki/space.js.map +7 -0
  354. package/dist/src/tools/oauth-batch-auth.js +125 -0
  355. package/dist/src/tools/oauth-batch-auth.js.map +7 -0
  356. package/dist/src/tools/oauth-cards.js +269 -0
  357. package/dist/src/tools/oauth-cards.js.map +7 -0
  358. package/dist/src/tools/oauth.js +538 -0
  359. package/dist/src/tools/oauth.js.map +7 -0
  360. package/dist/src/tools/onboarding-auth.js +101 -0
  361. package/dist/src/tools/onboarding-auth.js.map +7 -0
  362. package/dist/src/tools/project-oauth.js +305 -0
  363. package/dist/src/tools/project-oauth.js.map +7 -0
  364. package/dist/src/tools/tat/im/index.js +9 -0
  365. package/dist/src/tools/tat/im/index.js.map +7 -0
  366. package/dist/src/tools/tat/im/resource.js +123 -0
  367. package/dist/src/tools/tat/im/resource.js.map +7 -0
  368. package/package.json +64 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/messaging/converters/interactive/card-converter.ts"],
4
+ "sourcesContent": ["/**\n * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n */\n\nimport type { Obj, RawCardContent, ConvertCardResult, TextStyle } from './types';\nimport { EMOJI_MAP, CHART_TYPE_NAMES } from './types';\nimport { escapeAttr, formatMillisecondsToISO8601, normalizeTimeFormat } from './card-utils';\nimport { safeParse } from '../utils';\n\ntype ElementConverterFn = (c: CardConverter, elem: Obj, prop: Obj, id: string, depth: number) => string;\n\nexport const MODE = { Concise: 0, Detailed: 1 } as const;\ntype Mode = (typeof MODE)[keyof typeof MODE];\n\nconst elementConverters = new Map<string, ElementConverterFn>([\n ['plain_text', (c, _elem, prop) => c.convertPlainText(prop)],\n ['markdown', (c, _elem, prop) => c.convertMarkdown(prop)],\n ['markdown_v1', (c, elem, prop) => c.convertMarkdownV1(elem, prop)],\n ['text', (c, _elem, prop) => c.convertPlainText(prop)],\n ['div', (c, _elem, prop, id) => c.convertDiv(prop, id)],\n ['note', (c, _elem, prop) => c.convertNote(prop)],\n ['hr', () => '---'],\n ['br', () => '\\n'],\n ['column_set', (c, _elem, prop, _id, depth) => c.convertColumnSet(prop, depth)],\n ['column', (c, _elem, prop, _id, depth) => c.convertColumn(prop, depth)],\n ['person', (c, _elem, prop, id) => c.convertPerson(prop, id)],\n ['person_v1', (c, _elem, prop, id) => c.convertPersonV1(prop, id)],\n ['person_list', (c, _elem, prop) => c.convertPersonList(prop)],\n ['avatar', (c, _elem, prop, id) => c.convertAvatar(prop, id)],\n ['at', (c, _elem, prop) => c.convertAt(prop)],\n ['at_all', () => '@\u6240\u6709\u4EBA'],\n ['button', (c, _elem, prop, id) => c.convertButton(prop, id)],\n ['actions', (c, _elem, prop) => c.convertActions(prop)],\n ['action', (c, _elem, prop) => c.convertActions(prop)],\n ['overflow', (c, _elem, prop) => c.convertOverflow(prop)],\n ['select_static', (c, _elem, prop, id) => c.convertSelect(prop, id, false)],\n ['multi_select_static', (c, _elem, prop, id) => c.convertSelect(prop, id, true)],\n ['select_person', (c, _elem, prop, id) => c.convertSelect(prop, id, false)],\n ['multi_select_person', (c, _elem, prop, id) => c.convertSelect(prop, id, true)],\n ['select_img', (c, _elem, prop, id) => c.convertSelectImg(prop, id)],\n ['input', (c, _elem, prop, id) => c.convertInput(prop, id)],\n ['date_picker', (c, _elem, prop, id) => c.convertDatePicker(prop, id, 'date')],\n ['picker_time', (c, _elem, prop, id) => c.convertDatePicker(prop, id, 'time')],\n ['picker_datetime', (c, _elem, prop, id) => c.convertDatePicker(prop, id, 'datetime')],\n ['checker', (c, _elem, prop, id) => c.convertChecker(prop, id)],\n ['img', (c, _elem, prop, id) => c.convertImage(prop, id)],\n ['image', (c, _elem, prop, id) => c.convertImage(prop, id)],\n ['img_combination', (c, _elem, prop) => c.convertImgCombination(prop)],\n ['table', (c, _elem, prop) => c.convertTable(prop)],\n ['chart', (c, _elem, prop, id) => c.convertChart(prop, id)],\n ['audio', (c, _elem, prop, id) => c.convertAudio(prop, id)],\n ['video', (c, _elem, prop, id) => c.convertVideo(prop, id)],\n ['collapsible_panel', (c, _elem, prop, id) => c.convertCollapsiblePanel(prop, id)],\n ['form', (c, _elem, prop, id) => c.convertForm(prop, id)],\n ['interactive_container', (c, _elem, prop, id) => c.convertInteractiveContainer(prop, id)],\n ['text_tag', (c, _elem, prop) => c.convertTextTag(prop)],\n ['number_tag', (c, _elem, prop) => c.convertNumberTag(prop)],\n ['link', (c, _elem, prop) => c.convertLink(prop)],\n ['emoji', (c, _elem, prop) => c.convertEmoji(prop)],\n ['local_datetime', (c, _elem, prop) => c.convertLocalDatetime(prop)],\n ['list', (c, _elem, prop) => c.convertList(prop)],\n ['blockquote', (c, _elem, prop) => c.convertBlockquote(prop)],\n ['code_block', (c, _elem, prop) => c.convertCodeBlock(prop)],\n ['code_span', (c, _elem, prop) => c.convertCodeSpan(prop)],\n ['heading', (c, _elem, prop) => c.convertHeading(prop)],\n ['fallback_text', (c, _elem, prop) => c.convertFallbackText(prop)],\n ['repeat', (c, _elem, prop) => c.convertRepeat(prop)],\n ['card_header', () => ''],\n ['custom_icon', () => ''],\n ['standard_icon', () => ''],\n]);\n\nexport class CardConverter {\n private mode: Mode;\n private attachment: Obj | undefined;\n\n constructor(mode: Mode) {\n this.mode = mode;\n }\n\n convert(input: RawCardContent): ConvertCardResult {\n const card = safeParse(input.json_card) as Obj | undefined;\n if (!card) {\n return { content: '<card>\\n[\u65E0\u6CD5\u89E3\u6790\u5361\u7247\u5185\u5BB9]\\n</card>', schema: 0 };\n }\n if (input.json_attachment) {\n this.attachment = safeParse(input.json_attachment) as Obj | undefined;\n }\n let schema = input.card_schema ?? 0;\n if (schema === 0) {\n const s = card.schema;\n schema = typeof s === 'number' ? s : 1;\n }\n const header = card.header as Obj | undefined;\n const title = header ? this.extractHeaderTitle(header, schema) : '';\n const body = this.extractBody(card, schema);\n const bodyContent = body ? this.convertBody(body, schema) : '';\n let out = title ? `<card title=\"${escapeAttr(title)}\">\\n` : '<card>\\n';\n if (bodyContent) out += bodyContent + '\\n';\n out += '</card>';\n return { content: out, schema };\n }\n\n private extractBody(card: Obj, _schema: number): Obj | undefined {\n if (card.body && typeof card.body === 'object') {\n return card.body as Obj;\n }\n return undefined;\n }\n\n private extractHeaderTitle(header: Obj, _schema: number): string {\n const prop = header.property as Obj | undefined;\n if (prop) {\n const titleElem = prop.title;\n if (titleElem) return this.extractTextContent(titleElem);\n } else {\n const titleElem = header.title;\n if (titleElem) return this.extractTextContent(titleElem);\n }\n return '';\n }\n\n private convertBody(body: Obj, _schema: number): string {\n let elements: unknown[] | undefined;\n\n const prop = body.property as Obj | undefined;\n if (prop) {\n const e = prop.elements;\n if (Array.isArray(e) && e.length > 0) elements = e;\n }\n\n if (!elements || elements.length === 0) {\n const e = body.elements;\n if (Array.isArray(e)) elements = e;\n }\n\n if (!elements || elements.length === 0) return '';\n return this.convertElements(elements, 0);\n }\n\n convertElements(elements: unknown[], depth: number): string {\n const results: string[] = [];\n for (const elem of elements) {\n if (typeof elem !== 'object' || elem === null) continue;\n const result = this.convertElement(elem as Obj, depth);\n if (result) results.push(result);\n }\n return results.join('\\n');\n }\n\n convertElement(elem: Obj, depth: number): string {\n const tag = (elem.tag as string) ?? '';\n const id = (elem.id as string) ?? '';\n const prop = this.extractProperty(elem);\n\n const fn = elementConverters.get(tag);\n if (fn) return fn(this, elem, prop, id, depth);\n\n return this.convertUnknown(prop, tag);\n }\n\n extractProperty(elem: Obj): Obj {\n if (elem.property && typeof elem.property === 'object') {\n return elem.property as Obj;\n }\n return elem;\n }\n\n extractTextContent(textElem: unknown): string {\n if (textElem == null) return '';\n if (typeof textElem === 'string') return textElem;\n if (typeof textElem === 'object') {\n const m = textElem as Obj;\n if (m.property && typeof m.property === 'object') {\n return this.extractTextFromProperty(m.property as Obj);\n }\n return this.extractTextFromProperty(m);\n }\n return '';\n }\n\n private extractTextFromProperty(prop: Obj): string {\n const i18n = prop.i18nContent as Obj | undefined;\n if (i18n && typeof i18n === 'object') {\n for (const lang of ['zh_cn', 'en_us', 'ja_jp']) {\n const t = i18n[lang];\n if (typeof t === 'string' && t) return t;\n }\n }\n\n if (typeof prop.content === 'string') return prop.content;\n\n const elements = prop.elements;\n if (Array.isArray(elements) && elements.length > 0) {\n const texts: string[] = [];\n for (const elem of elements) {\n if (typeof elem === 'object' && elem !== null) {\n const t = this.extractTextContent(elem);\n if (t) texts.push(t);\n }\n }\n return texts.join('');\n }\n\n if (typeof prop.text === 'string') return prop.text;\n\n return '';\n }\n\n convertPlainText(prop: Obj): string {\n const content = prop.content as string | undefined;\n if (!content) return '';\n const style = this.extractTextStyle(prop);\n return this.applyTextStyle(content, style);\n }\n\n convertMarkdown(prop: Obj): string {\n const elements = prop.elements;\n if (Array.isArray(elements) && elements.length > 0) {\n return this.convertMarkdownElements(elements);\n }\n if (typeof prop.content === 'string') return prop.content;\n return '';\n }\n\n convertMarkdownV1(elem: Obj, prop: Obj): string {\n const elements = prop.elements;\n if (Array.isArray(elements) && elements.length > 0) {\n return this.convertMarkdownElements(elements);\n }\n const fallback = elem.fallback as Obj | undefined;\n if (fallback && typeof fallback === 'object') {\n return this.convertElement(fallback, 0);\n }\n if (typeof prop.content === 'string') return prop.content;\n return '';\n }\n\n convertMarkdownElements(elements: unknown[]): string {\n const parts: string[] = [];\n for (const elem of elements) {\n if (typeof elem !== 'object' || elem === null) continue;\n const result = this.convertElement(elem as Obj, 0);\n if (result) parts.push(result);\n }\n return parts.join('');\n }\n\n convertDiv(prop: Obj, _id: string): string {\n const results: string[] = [];\n\n const textElem = prop.text as Obj | undefined;\n if (textElem && typeof textElem === 'object') {\n const text = this.convertElement(textElem, 0);\n if (text) results.push(text);\n }\n\n const fields = prop.fields as unknown[] | undefined;\n if (Array.isArray(fields) && fields.length > 0) {\n const fieldTexts: string[] = [];\n for (const field of fields) {\n if (typeof field !== 'object' || field === null) continue;\n const fm = field as Obj;\n const te = fm.text as Obj | undefined;\n if (te && typeof te === 'object') {\n const ft = this.convertElement(te, 0);\n if (ft) fieldTexts.push(ft);\n }\n }\n if (fieldTexts.length > 0) results.push(fieldTexts.join('\\n'));\n }\n\n const extraElem = prop.extra as Obj | undefined;\n if (extraElem && typeof extraElem === 'object') {\n const extra = this.convertElement(extraElem, 0);\n if (extra) results.push(extra);\n }\n\n return results.join('\\n');\n }\n\n convertNote(prop: Obj): string {\n const elements = prop.elements as unknown[] | undefined;\n if (!Array.isArray(elements) || elements.length === 0) return '';\n\n const texts: string[] = [];\n for (const elem of elements) {\n if (typeof elem !== 'object' || elem === null) continue;\n const text = this.convertElement(elem as Obj, 0);\n if (text) texts.push(text);\n }\n\n if (texts.length === 0) return '';\n return `\uD83D\uDCDD ${texts.join(' ')}`;\n }\n\n convertLink(prop: Obj): string {\n const content = (prop.content as string) || '\u94FE\u63A5';\n let url = '';\n const urlObj = prop.url as Obj | undefined;\n if (urlObj && typeof urlObj === 'object') {\n url = (urlObj.url as string) || '';\n }\n if (url) return `[${content}](${url})`;\n return content;\n }\n\n convertEmoji(prop: Obj): string {\n const key = (prop.key as string) || '';\n return EMOJI_MAP[key] ?? `:${key}:`;\n }\n\n convertLocalDatetime(prop: Obj): string {\n const milliseconds = prop.milliseconds as string | undefined;\n const fallbackText = prop.fallbackText as string | undefined;\n\n if (milliseconds) {\n const formatted = formatMillisecondsToISO8601(milliseconds);\n if (formatted) return formatted;\n }\n return fallbackText || '';\n }\n\n convertList(prop: Obj): string {\n const items = prop.items as unknown[] | undefined;\n if (!Array.isArray(items) || items.length === 0) return '';\n\n const lines: string[] = [];\n for (const item of items) {\n if (typeof item !== 'object' || item === null) continue;\n const im = item as Obj;\n const level = (im.level as number) || 0;\n const listType = (im.type as string) || '';\n const order = (im.order as number) || 0;\n\n const indent = ' '.repeat(level);\n const marker = listType === 'ol' ? `${Math.floor(order)}.` : '-';\n\n const elements = im.elements as unknown[] | undefined;\n if (Array.isArray(elements)) {\n const content = this.convertMarkdownElements(elements);\n lines.push(`${indent}${marker} ${content}`);\n }\n }\n\n return lines.join('\\n');\n }\n\n convertBlockquote(prop: Obj): string {\n let content = '';\n if (typeof prop.content === 'string') {\n content = prop.content;\n } else {\n const elements = prop.elements as unknown[] | undefined;\n if (Array.isArray(elements)) {\n content = this.convertMarkdownElements(elements);\n }\n }\n if (!content) return '';\n return content\n .split('\\n')\n .map((line) => `> ${line}`)\n .join('\\n');\n }\n\n convertCodeBlock(prop: Obj): string {\n const language = (prop.language as string) || 'plaintext';\n let code = '';\n const contents = prop.contents as unknown[] | undefined;\n if (Array.isArray(contents)) {\n for (const line of contents) {\n if (typeof line !== 'object' || line === null) continue;\n const lm = line as Obj;\n const lineContents = lm.contents as unknown[] | undefined;\n if (Array.isArray(lineContents)) {\n for (const c of lineContents) {\n if (typeof c !== 'object' || c === null) continue;\n const cm = c as Obj;\n if (typeof cm.content === 'string') code += cm.content;\n }\n }\n }\n }\n return `\\`\\`\\`${language}\\n${code}\\`\\`\\``;\n }\n\n convertCodeSpan(prop: Obj): string {\n const content = (prop.content as string) || '';\n return `\\`${content}\\``;\n }\n\n convertHeading(prop: Obj): string {\n let level = (prop.level as number) || 1;\n if (level < 1) level = 1;\n if (level > 6) level = 6;\n\n let content = '';\n if (typeof prop.content === 'string') {\n content = prop.content;\n } else {\n const elements = prop.elements as unknown[] | undefined;\n if (Array.isArray(elements)) {\n content = this.convertMarkdownElements(elements);\n }\n }\n return `${'#'.repeat(level)} ${content}`;\n }\n\n convertFallbackText(prop: Obj): string {\n const textElem = prop.text as Obj | undefined;\n if (textElem && typeof textElem === 'object') {\n return this.extractTextContent(textElem);\n }\n const elements = prop.elements as unknown[] | undefined;\n if (Array.isArray(elements)) {\n return this.convertMarkdownElements(elements);\n }\n return '';\n }\n\n convertTextTag(prop: Obj): string {\n const textElem = prop.text as Obj | undefined;\n let text = '';\n if (textElem && typeof textElem === 'object') {\n text = this.extractTextContent(textElem);\n }\n if (!text) return '';\n return `\u300C${text}\u300D`;\n }\n\n convertNumberTag(prop: Obj): string {\n const textElem = prop.text as Obj | undefined;\n let text = '';\n if (textElem && typeof textElem === 'object') {\n text = this.extractTextContent(textElem);\n }\n if (!text) return '';\n\n const urlObj = prop.url as Obj | undefined;\n if (urlObj && typeof urlObj === 'object') {\n const url = urlObj.url as string | undefined;\n if (url) return `[${text}](${url})`;\n }\n return text;\n }\n\n convertUnknown(prop: Obj | undefined, tag: string): string {\n if (!prop) {\n if (this.mode === MODE.Detailed) return `[\u672A\u77E5\u5185\u5BB9](tag:${tag})`;\n return '[\u672A\u77E5\u5185\u5BB9]';\n }\n\n const paths = ['content', 'text', 'title', 'label', 'placeholder'] as const;\n for (const path of paths) {\n if (prop[path] != null) {\n const text = this.extractTextContent(prop[path]);\n if (text) return text;\n }\n }\n\n const elements = prop.elements as unknown[] | undefined;\n if (Array.isArray(elements) && elements.length > 0) {\n return this.convertElements(elements, 0);\n }\n\n if (this.mode === MODE.Detailed) return `[\u672A\u77E5\u5185\u5BB9](tag:${tag})`;\n return '[\u672A\u77E5\u5185\u5BB9]';\n }\n\n convertColumnSet(prop: Obj, depth: number): string {\n const columns = prop.columns as unknown[] | undefined;\n if (!Array.isArray(columns) || columns.length === 0) return '';\n\n const results: string[] = [];\n for (const col of columns) {\n if (typeof col !== 'object' || col === null) continue;\n const result = this.convertElement(col as Obj, depth + 1);\n if (result) results.push(result);\n }\n return results.join('\\n\\n');\n }\n\n convertColumn(prop: Obj, depth: number): string {\n const elements = prop.elements as unknown[] | undefined;\n if (!Array.isArray(elements) || elements.length === 0) return '';\n return this.convertElements(elements, depth);\n }\n\n convertForm(prop: Obj, _id: string): string {\n let out = '<form>\\n';\n const elements = prop.elements as unknown[] | undefined;\n if (Array.isArray(elements)) {\n out += this.convertElements(elements, 0);\n }\n out += '\\n</form>';\n return out;\n }\n\n convertCollapsiblePanel(prop: Obj, _id: string): string {\n const expanded = prop.expanded === true;\n\n let title = '\u8BE6\u60C5';\n const header = prop.header as Obj | undefined;\n if (header && typeof header === 'object') {\n const titleElem = header.title;\n if (titleElem) {\n const t = this.extractTextContent(titleElem);\n if (t) title = t;\n }\n }\n\n const shouldExpand = expanded || this.mode === MODE.Detailed;\n\n if (shouldExpand) {\n let out = `\u25BC ${title}\\n`;\n const elements = prop.elements as unknown[] | undefined;\n if (Array.isArray(elements)) {\n const content = this.convertElements(elements, 1);\n for (const line of content.split('\\n')) {\n if (line) out += ` ${line}\\n`;\n }\n }\n out += '\u25B2';\n return out;\n }\n\n return `\u25B6 ${title}`;\n }\n\n convertInteractiveContainer(prop: Obj, _id: string): string {\n let url = '';\n const actions = prop.actions as unknown[] | undefined;\n if (Array.isArray(actions) && actions.length > 0) {\n const action = actions[0] as Obj | undefined;\n if (action && typeof action === 'object') {\n const actionType = action.type as string | undefined;\n if (actionType === 'open_url') {\n const actionData = action.action as Obj | undefined;\n if (actionData && typeof actionData === 'object') {\n url = (actionData.url as string) || '';\n }\n }\n }\n }\n\n let out = '<clickable';\n if (url) out += ` url=\"${escapeAttr(url)}\"`;\n if (this.mode === MODE.Detailed && _id) out += ` id=\"${_id}\"`;\n out += '>\\n';\n\n const elements = prop.elements as unknown[] | undefined;\n if (Array.isArray(elements)) {\n out += this.convertElements(elements, 0);\n }\n out += '\\n</clickable>';\n return out;\n }\n\n convertRepeat(prop: Obj): string {\n const elements = prop.elements as unknown[] | undefined;\n if (Array.isArray(elements)) {\n return this.convertElements(elements, 0);\n }\n return '';\n }\n\n convertButton(prop: Obj, _id: string): string {\n let buttonText = '';\n const textElem = prop.text as Obj | undefined;\n if (textElem && typeof textElem === 'object') {\n buttonText = this.extractTextContent(textElem);\n }\n if (!buttonText) buttonText = '\u6309\u94AE';\n\n const disabled = prop.disabled === true;\n if (disabled && this.mode === MODE.Concise) {\n return `[${buttonText} \u2717]`;\n }\n\n const actions = prop.actions as unknown[] | undefined;\n if (Array.isArray(actions)) {\n for (const action of actions) {\n if (typeof action !== 'object' || action === null) continue;\n const am = action as Obj;\n if (am.type === 'open_url') {\n const ad = am.action as Obj | undefined;\n if (ad && typeof ad === 'object') {\n const url = ad.url as string | undefined;\n if (url) return `[${buttonText}](${url})`;\n }\n }\n }\n }\n\n if (disabled && this.mode === MODE.Detailed) {\n let result = `[${buttonText} \u2717]`;\n const tips = prop.disabledTips as Obj | undefined;\n if (tips && typeof tips === 'object') {\n const tipsText = this.extractTextContent(tips);\n if (tipsText) result += `(tips:\"${tipsText}\")`;\n }\n return result;\n }\n\n return `[${buttonText}]`;\n }\n\n convertActions(prop: Obj): string {\n const actions = prop.actions as unknown[] | undefined;\n if (!Array.isArray(actions) || actions.length === 0) return '';\n\n const results: string[] = [];\n for (const action of actions) {\n if (typeof action !== 'object' || action === null) continue;\n const result = this.convertElement(action as Obj, 0);\n if (result) results.push(result);\n }\n return results.join(' ');\n }\n\n convertSelect(prop: Obj, _id: string, isMulti: boolean): string {\n const options = (prop.options as unknown[]) || [];\n\n const selectedValues = new Set<string>();\n if (isMulti) {\n const vals = prop.selectedValues as unknown[] | undefined;\n if (Array.isArray(vals)) {\n for (const v of vals) {\n if (typeof v === 'string') selectedValues.add(v);\n }\n }\n } else {\n const initialOption = prop.initialOption as string | undefined;\n if (typeof initialOption === 'string') selectedValues.add(initialOption);\n const initialIndex = prop.initialIndex as number | undefined;\n if (typeof initialIndex === 'number' && initialIndex >= 0 && initialIndex < options.length) {\n const opt = options[initialIndex] as Obj | undefined;\n if (opt && typeof opt === 'object') {\n const val = opt.value as string | undefined;\n if (val) selectedValues.add(val);\n }\n }\n }\n\n const optionTexts: string[] = [];\n let hasSelected = false;\n for (const opt of options) {\n if (typeof opt !== 'object' || opt === null) continue;\n const om = opt as Obj;\n let optText = '';\n const textElem = om.text as Obj | undefined;\n if (textElem && typeof textElem === 'object') {\n optText = this.extractTextContent(textElem);\n }\n if (!optText) optText = (om.value as string) || '';\n if (!optText) continue;\n\n const value = (om.value as string) || '';\n if (selectedValues.has(value)) {\n optText = '\u2713' + optText;\n hasSelected = true;\n }\n optionTexts.push(optText);\n }\n\n if (optionTexts.length === 0) {\n let placeholder = '\u8BF7\u9009\u62E9';\n const phElem = prop.placeholder as Obj | undefined;\n if (phElem && typeof phElem === 'object') {\n const ph = this.extractTextContent(phElem);\n if (ph) placeholder = ph;\n }\n optionTexts.push(placeholder + ' \u25BC');\n } else if (!hasSelected) {\n optionTexts[optionTexts.length - 1] += ' \u25BC';\n }\n\n let result = `{${optionTexts.join(' / ')}}`;\n\n if (this.mode === MODE.Detailed) {\n const attrs: string[] = [];\n if (isMulti) attrs.push('multi');\n if (_id.includes('person') || prop.type === 'person') attrs.push('type:person');\n if (attrs.length > 0) result += `(${attrs.join(' ')})`;\n }\n\n return result;\n }\n\n convertSelectImg(prop: Obj, _id: string): string {\n const options = prop.options as unknown[] | undefined;\n if (!Array.isArray(options)) return '';\n\n const selectedValues = new Set<string>();\n const vals = prop.selectedValues as unknown[] | undefined;\n if (Array.isArray(vals)) {\n for (const v of vals) {\n if (typeof v === 'string') selectedValues.add(v);\n }\n }\n\n const optTexts: string[] = [];\n for (let i = 0; i < options.length; i++) {\n const opt = options[i] as Obj | undefined;\n if (!opt || typeof opt !== 'object') continue;\n const value = (opt.value as string) || '';\n let text = `\uD83D\uDDBC\uFE0F\u56FE${i + 1}`;\n if (selectedValues.has(value)) text = '\u2713' + text;\n optTexts.push(text);\n }\n\n return `{${optTexts.join(' / ')}}`;\n }\n\n convertInput(prop: Obj, _id: string): string {\n let label = '';\n const labelElem = prop.label as Obj | undefined;\n if (labelElem && typeof labelElem === 'object') {\n label = this.extractTextContent(labelElem);\n }\n\n const defaultValue = (prop.defaultValue as string) || '';\n\n let placeholder = '';\n const phElem = prop.placeholder as Obj | undefined;\n if (phElem && typeof phElem === 'object') {\n placeholder = this.extractTextContent(phElem);\n }\n\n let result: string;\n if (defaultValue) {\n result = defaultValue + '___';\n } else if (placeholder) {\n result = placeholder + '_____';\n } else {\n result = '_____';\n }\n\n if (label) result = label + ': ' + result;\n\n const inputType = prop.inputType as string | undefined;\n if (inputType === 'multiline_text') {\n result = result.replace(/_____/g, '...');\n }\n\n return result;\n }\n\n convertDatePicker(prop: Obj, _id: string, pickerType: string): string {\n let emoji: string;\n let value = '';\n\n switch (pickerType) {\n case 'date':\n emoji = '\uD83D\uDCC5';\n value = (prop.initialDate as string) || '';\n break;\n case 'time':\n emoji = '\uD83D\uDD50';\n value = (prop.initialTime as string) || '';\n break;\n case 'datetime':\n emoji = '\uD83D\uDCC5';\n value = (prop.initialDatetime as string) || '';\n break;\n default:\n emoji = '\uD83D\uDCC5';\n }\n\n if (value) value = normalizeTimeFormat(value);\n\n if (!value) {\n let placeholder = '\u9009\u62E9';\n const phElem = prop.placeholder as Obj | undefined;\n if (phElem && typeof phElem === 'object') {\n const ph = this.extractTextContent(phElem);\n if (ph) placeholder = ph;\n }\n value = placeholder;\n }\n\n return `${emoji} ${value}`;\n }\n\n convertChecker(prop: Obj, _id: string): string {\n const checked = prop.checked === true;\n const checkMark = checked ? '[x]' : '[ ]';\n\n let text = '';\n const textElem = prop.text as Obj | undefined;\n if (textElem && typeof textElem === 'object') {\n text = this.extractTextContent(textElem);\n }\n\n let result = `${checkMark} ${text}`;\n if (this.mode === MODE.Detailed && _id) {\n result += `(id:${_id})`;\n }\n return result;\n }\n\n convertOverflow(prop: Obj): string {\n const options = prop.options as unknown[] | undefined;\n if (!Array.isArray(options) || options.length === 0) return '';\n\n const optTexts: string[] = [];\n for (const opt of options) {\n if (typeof opt !== 'object' || opt === null) continue;\n const om = opt as Obj;\n const textElem = om.text as Obj | undefined;\n if (textElem && typeof textElem === 'object') {\n const text = this.extractTextContent(textElem);\n if (text) optTexts.push(text);\n }\n }\n\n return `\u22EE ${optTexts.join(', ')}`;\n }\n\n convertPerson(prop: Obj, _id: string): string {\n const userID = (prop.userID as string) || '';\n if (!userID) return '';\n\n let personName = '';\n if (this.attachment) {\n const persons = this.attachment.persons as Obj | undefined;\n if (persons && typeof persons === 'object') {\n const person = persons[userID] as Obj | undefined;\n if (person && typeof person === 'object') {\n const content = person.content as string | undefined;\n if (content) personName = content;\n }\n }\n }\n\n if (!personName) {\n const notation = prop.notation as Obj | undefined;\n if (notation && typeof notation === 'object') {\n personName = this.extractTextContent(notation);\n }\n }\n\n if (personName) {\n if (this.mode === MODE.Detailed) return `@${personName}(open_id:${userID})`;\n return `@${personName}`;\n }\n\n if (this.mode === MODE.Detailed) return `@\u7528\u6237(open_id:${userID})`;\n return `@${userID}`;\n }\n\n convertPersonV1(prop: Obj, _id: string): string {\n const userID = (prop.userID as string) || '';\n if (!userID) return '';\n\n let personName = '';\n if (this.attachment) {\n const persons = this.attachment.persons as Obj | undefined;\n if (persons && typeof persons === 'object') {\n const person = persons[userID] as Obj | undefined;\n if (person && typeof person === 'object') {\n const content = person.content as string | undefined;\n if (content) personName = content;\n }\n }\n }\n\n if (personName) {\n if (this.mode === MODE.Detailed) return `@${personName}(open_id:${userID})`;\n return `@${personName}`;\n }\n\n if (this.mode === MODE.Detailed) return `@\u7528\u6237(open_id:${userID})`;\n return `@${userID}`;\n }\n\n convertPersonList(prop: Obj): string {\n const persons = prop.persons as unknown[] | undefined;\n if (!Array.isArray(persons) || persons.length === 0) return '';\n\n const names: string[] = [];\n for (const person of persons) {\n if (typeof person !== 'object' || person === null) continue;\n const pm = person as Obj;\n const personID = (pm.id as string) || '';\n const name = '\u7528\u6237';\n if (this.mode === MODE.Detailed && personID) {\n names.push(`@${name}(id:${personID})`);\n } else {\n names.push(`@${name}`);\n }\n }\n\n return names.join(', ');\n }\n\n convertAvatar(prop: Obj, _id: string): string {\n const userID = (prop.userID as string) || '';\n let result = '\uD83D\uDC64';\n if (this.mode === MODE.Detailed && userID) {\n result += `(id:${userID})`;\n }\n return result;\n }\n\n convertAt(prop: Obj): string {\n const userID = (prop.userID as string) || '';\n if (!userID) return '';\n\n let userName = '';\n let actualUserID = '';\n if (this.attachment) {\n const atUsers = this.attachment.at_users as Obj | undefined;\n if (atUsers && typeof atUsers === 'object') {\n const userInfo = atUsers[userID] as Obj | undefined;\n if (userInfo && typeof userInfo === 'object') {\n const content = userInfo.content as string | undefined;\n if (content) userName = content;\n const uid = userInfo.user_id as string | undefined;\n if (uid) actualUserID = uid;\n }\n }\n }\n\n if (userName) {\n if (this.mode === MODE.Detailed) {\n if (actualUserID) return `@${userName}(user_id:${actualUserID})`;\n return `@${userName}(open_id:${userID})`;\n }\n return `@${userName}`;\n }\n\n if (this.mode === MODE.Detailed) {\n if (actualUserID) return `@\u7528\u6237(user_id:${actualUserID})`;\n return `@\u7528\u6237(open_id:${userID})`;\n }\n return `@${userID}`;\n }\n\n convertImage(prop: Obj, _id: string): string {\n let alt = '\u56FE\u7247';\n const altElem = prop.alt as Obj | undefined;\n if (altElem && typeof altElem === 'object') {\n const altText = this.extractTextContent(altElem);\n if (altText) alt = altText;\n }\n const titleElem = prop.title as Obj | undefined;\n if (titleElem && typeof titleElem === 'object') {\n const titleText = this.extractTextContent(titleElem);\n if (titleText) alt = titleText;\n }\n\n let result = `\uD83D\uDDBC\uFE0F ${alt}`;\n\n if (this.mode === MODE.Detailed) {\n const imageID = prop.imageID as string | undefined;\n if (imageID) {\n const token = this.getImageToken(imageID);\n if (token) {\n result += `(img_token:${token})`;\n } else {\n result += `(img_key:${imageID})`;\n }\n }\n }\n\n return result;\n }\n\n convertImgCombination(prop: Obj): string {\n const imgList = prop.imgList as unknown[] | undefined;\n if (!Array.isArray(imgList) || imgList.length === 0) return '';\n\n let result = `\uD83D\uDDBC\uFE0F ${imgList.length}\u5F20\u56FE\u7247`;\n\n if (this.mode === MODE.Detailed) {\n const keys: string[] = [];\n for (const img of imgList) {\n if (typeof img !== 'object' || img === null) continue;\n const im = img as Obj;\n const imageID = im.imageID as string | undefined;\n if (imageID) keys.push(imageID);\n }\n if (keys.length > 0) result += `(keys:${keys.join(',')})`;\n }\n\n return result;\n }\n\n convertChart(prop: Obj, _id: string): string {\n let title = '\u56FE\u8868';\n let chartType = '';\n const chartSpec = prop.chartSpec as Obj | undefined;\n if (chartSpec && typeof chartSpec === 'object') {\n const titleObj = chartSpec.title as Obj | undefined;\n if (titleObj && typeof titleObj === 'object') {\n const text = titleObj.text as string | undefined;\n if (text) title = text;\n }\n const ct = chartSpec.type as string | undefined;\n if (ct) {\n chartType = ct;\n const typeName = CHART_TYPE_NAMES[chartType];\n if (typeName) title = `${title}${typeName}`;\n }\n }\n\n const summary = this.extractChartSummary(prop, chartType);\n let result = `\uD83D\uDCCA ${title}`;\n if (summary) result += `\\n\u6570\u636E\u6458\u8981: ${summary}`;\n return result;\n }\n\n private extractChartSummary(prop: Obj, chartType: string): string {\n const chartSpec = prop.chartSpec as Obj | undefined;\n if (!chartSpec || typeof chartSpec !== 'object') return '';\n\n const dataObj = chartSpec.data as Obj | undefined;\n if (!dataObj || typeof dataObj !== 'object') return '';\n\n const values = dataObj.values as unknown[] | undefined;\n if (!Array.isArray(values) || values.length === 0) return '';\n\n switch (chartType) {\n case 'line':\n case 'bar':\n case 'area':\n return this.extractLineBarSummary(chartSpec, values);\n case 'pie':\n return this.extractPieSummary(chartSpec, values);\n default:\n return this.extractGenericSummary(values);\n }\n }\n\n private extractLineBarSummary(chartSpec: Obj, values: unknown[]): string {\n const xField = chartSpec.xField as string | undefined;\n const yField = chartSpec.yField as string | undefined;\n\n if (!xField || !yField || values.length === 0) {\n return this.extractGenericSummary(values);\n }\n\n const parts: string[] = [];\n for (const v of values) {\n if (typeof v !== 'object' || v === null) continue;\n const vm = v as Obj;\n parts.push(`${vm[xField]}:${vm[yField]}`);\n }\n return parts.length > 0 ? parts.join(', ') : this.extractGenericSummary(values);\n }\n\n private extractPieSummary(chartSpec: Obj, values: unknown[]): string {\n const categoryField = chartSpec.categoryField as string | undefined;\n const valueField = chartSpec.valueField as string | undefined;\n\n if (!categoryField || !valueField || values.length === 0) {\n return this.extractGenericSummary(values);\n }\n\n const parts: string[] = [];\n for (const v of values) {\n if (typeof v !== 'object' || v === null) continue;\n const vm = v as Obj;\n parts.push(`${vm[categoryField]}:${vm[valueField]}`);\n }\n return parts.length > 0 ? parts.join(', ') : this.extractGenericSummary(values);\n }\n\n private extractGenericSummary(values: unknown[]): string {\n return `${values.length}\u4E2A\u6570\u636E\u70B9`;\n }\n\n convertAudio(prop: Obj, _id: string): string {\n let result = '\uD83C\uDFB5 \u97F3\u9891';\n if (this.mode === MODE.Detailed) {\n const fileID = (prop.fileID as string) || (prop.audioID as string) || '';\n if (fileID) result += `(key:${fileID})`;\n }\n return result;\n }\n\n convertVideo(prop: Obj, _id: string): string {\n let result = '\uD83C\uDFAC \u89C6\u9891';\n if (this.mode === MODE.Detailed) {\n const fileID = (prop.fileID as string) || (prop.videoID as string) || '';\n if (fileID) result += `(key:${fileID})`;\n }\n return result;\n }\n\n convertTable(prop: Obj): string {\n const columns = prop.columns as unknown[] | undefined;\n if (!Array.isArray(columns) || columns.length === 0) return '';\n\n const rows = (prop.rows as unknown[]) || [];\n\n const colNames: string[] = [];\n const colKeys: string[] = [];\n for (const col of columns) {\n if (typeof col !== 'object' || col === null) continue;\n const cm = col as Obj;\n let displayName = (cm.displayName as string) || '';\n const name = (cm.name as string) || '';\n if (!displayName) displayName = name;\n colNames.push(displayName);\n colKeys.push(name);\n }\n\n const lines: string[] = [];\n lines.push('| ' + colNames.join(' | ') + ' |');\n lines.push('|' + colNames.map(() => '------|').join(''));\n\n for (const row of rows) {\n if (typeof row !== 'object' || row === null) continue;\n const rm = row as Obj;\n const cells: string[] = [];\n for (const key of colKeys) {\n let cellValue = '';\n const cellData = rm[key] as Obj | undefined;\n if (cellData && typeof cellData === 'object') {\n if (cellData.data != null) {\n cellValue = this.extractTableCellValue(cellData.data);\n }\n }\n cells.push(cellValue);\n }\n lines.push('| ' + cells.join(' | ') + ' |');\n }\n\n return lines.join('\\n');\n }\n\n private extractTableCellValue(data: unknown): string {\n if (typeof data === 'string') return data;\n if (typeof data === 'number') return data.toFixed(2);\n if (Array.isArray(data)) {\n const texts: string[] = [];\n for (const item of data) {\n if (typeof item === 'object' && item !== null) {\n const im = item as Obj;\n if (typeof im.text === 'string') texts.push(`\u300C${im.text}\u300D`);\n }\n }\n return texts.join(' ');\n }\n if (typeof data === 'object' && data !== null) {\n return this.extractTextContent(data);\n }\n return '';\n }\n\n private extractTextStyle(prop: Obj): TextStyle {\n const style: TextStyle = {\n bold: false,\n italic: false,\n strikethrough: false,\n };\n\n const textStyle = prop.textStyle as Obj | undefined;\n if (!textStyle || typeof textStyle !== 'object') return style;\n\n const attrs = textStyle.attributes as unknown[] | undefined;\n if (Array.isArray(attrs)) {\n for (const attr of attrs) {\n if (typeof attr !== 'string') continue;\n switch (attr) {\n case 'bold':\n style.bold = true;\n break;\n case 'italic':\n style.italic = true;\n break;\n case 'strikethrough':\n style.strikethrough = true;\n break;\n }\n }\n }\n\n return style;\n }\n\n private applyTextStyle(content: string, style: TextStyle): string {\n if (!content) return content;\n if (style.strikethrough) content = `~~${content}~~`;\n if (style.italic) content = `*${content}*`;\n if (style.bold) content = `**${content}**`;\n return content;\n }\n\n private getImageToken(imageID: string): string {\n if (!this.attachment) return '';\n const images = this.attachment.images as Obj | undefined;\n if (!images || typeof images !== 'object') return '';\n const imageInfo = images[imageID] as Obj | undefined;\n if (!imageInfo || typeof imageInfo !== 'object') return '';\n return (imageInfo.token as string) || '';\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,36 @@
1
+ function escapeAttr(s) {
2
+ return s.replace(/"/g, '\\"').replace(/\n/g, "\\n");
3
+ }
4
+ function formatMillisecondsToISO8601(milliseconds) {
5
+ const ms = parseInt(milliseconds, 10);
6
+ if (isNaN(ms)) return "";
7
+ return new Date(ms).toISOString();
8
+ }
9
+ function normalizeTimeFormat(input) {
10
+ if (!input) return "";
11
+ const num = parseInt(input, 10);
12
+ if (!isNaN(num) && String(num) === input.trim()) {
13
+ if (input.length >= 13) {
14
+ return new Date(num).toISOString();
15
+ } else if (input.length >= 10) {
16
+ return new Date(num * 1e3).toISOString();
17
+ }
18
+ }
19
+ if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(input)) {
20
+ return input;
21
+ }
22
+ const dtMatch = /^(\d{4}-\d{2}-\d{2})\s+(\d{2}:\d{2}(?::\d{2})?)$/.exec(input);
23
+ if (dtMatch) {
24
+ const d = /* @__PURE__ */ new Date(`${dtMatch[1]}T${dtMatch[2]}`);
25
+ if (!isNaN(d.getTime())) return d.toISOString();
26
+ }
27
+ if (/^\d{4}-\d{2}-\d{2}$/.test(input)) return input;
28
+ if (/^\d{2}:\d{2}(:\d{2})?$/.test(input)) return input;
29
+ return input;
30
+ }
31
+ export {
32
+ escapeAttr,
33
+ formatMillisecondsToISO8601,
34
+ normalizeTimeFormat
35
+ };
36
+ //# sourceMappingURL=card-utils.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/messaging/converters/interactive/card-utils.ts"],
4
+ "sourcesContent": ["/**\n * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n *\n * Utility functions for card content conversion.\n */\n\nexport function escapeAttr(s: string): string {\n return s.replace(/\"/g, '\\\\\"').replace(/\\n/g, '\\\\n');\n}\n\nexport function formatMillisecondsToISO8601(milliseconds: string): string {\n const ms = parseInt(milliseconds, 10);\n if (isNaN(ms)) return '';\n return new Date(ms).toISOString();\n}\n\nexport function normalizeTimeFormat(input: string): string {\n if (!input) return '';\n\n const num = parseInt(input, 10);\n if (!isNaN(num) && String(num) === input.trim()) {\n if (input.length >= 13) {\n return new Date(num).toISOString();\n } else if (input.length >= 10) {\n return new Date(num * 1000).toISOString();\n }\n }\n\n if (/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}/.test(input)) {\n return input;\n }\n\n const dtMatch = /^(\\d{4}-\\d{2}-\\d{2})\\s+(\\d{2}:\\d{2}(?::\\d{2})?)$/.exec(input);\n if (dtMatch) {\n const d = new Date(`${dtMatch[1]}T${dtMatch[2]}`);\n if (!isNaN(d.getTime())) return d.toISOString();\n }\n\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(input)) return input;\n if (/^\\d{2}:\\d{2}(:\\d{2})?$/.test(input)) return input;\n\n return input;\n}\n"],
5
+ "mappings": "AAOO,SAAS,WAAW,GAAmB;AAC5C,SAAO,EAAE,QAAQ,MAAM,KAAK,EAAE,QAAQ,OAAO,KAAK;AACpD;AAEO,SAAS,4BAA4B,cAA8B;AACxE,QAAM,KAAK,SAAS,cAAc,EAAE;AACpC,MAAI,MAAM,EAAE,EAAG,QAAO;AACtB,SAAO,IAAI,KAAK,EAAE,EAAE,YAAY;AAClC;AAEO,SAAS,oBAAoB,OAAuB;AACzD,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,MAAM,SAAS,OAAO,EAAE;AAC9B,MAAI,CAAC,MAAM,GAAG,KAAK,OAAO,GAAG,MAAM,MAAM,KAAK,GAAG;AAC/C,QAAI,MAAM,UAAU,IAAI;AACtB,aAAO,IAAI,KAAK,GAAG,EAAE,YAAY;AAAA,IACnC,WAAW,MAAM,UAAU,IAAI;AAC7B,aAAO,IAAI,KAAK,MAAM,GAAI,EAAE,YAAY;AAAA,IAC1C;AAAA,EACF;AAEA,MAAI,uCAAuC,KAAK,KAAK,GAAG;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,mDAAmD,KAAK,KAAK;AAC7E,MAAI,SAAS;AACX,UAAM,IAAI,oBAAI,KAAK,GAAG,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE;AAChD,QAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAG,QAAO,EAAE,YAAY;AAAA,EAChD;AAEA,MAAI,sBAAsB,KAAK,KAAK,EAAG,QAAO;AAC9C,MAAI,yBAAyB,KAAK,KAAK,EAAG,QAAO;AAEjD,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,19 @@
1
+ import { safeParse } from "../utils";
2
+ import { CardConverter, MODE } from "./card-converter";
3
+ import { convertLegacyCard } from "./legacy";
4
+ const convertInteractive = (raw) => {
5
+ const parsed = safeParse(raw);
6
+ if (!parsed) {
7
+ return { content: "[interactive card]", resources: [] };
8
+ }
9
+ if (typeof parsed.json_card === "string") {
10
+ const converter = new CardConverter(MODE.Concise);
11
+ const result = converter.convert(parsed);
12
+ return { content: result.content || "[interactive card]", resources: [] };
13
+ }
14
+ return convertLegacyCard(parsed);
15
+ };
16
+ export {
17
+ convertInteractive
18
+ };
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/messaging/converters/interactive/index.ts"],
4
+ "sourcesContent": ["/**\n * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n *\n * Entry point for the interactive (card) message converter.\n */\n\nimport type { ContentConverterFn } from '../types';\nimport { safeParse } from '../utils';\nimport type { Obj, RawCardContent } from './types';\nimport { CardConverter, MODE } from './card-converter';\nimport { convertLegacyCard } from './legacy';\n\nexport const convertInteractive: ContentConverterFn = (raw) => {\n const parsed = safeParse(raw) as Obj | undefined;\n if (!parsed) {\n return { content: '[interactive card]', resources: [] };\n }\n\n if (typeof parsed.json_card === 'string') {\n const converter = new CardConverter(MODE.Concise);\n const result = converter.convert(parsed as unknown as RawCardContent);\n return { content: result.content || '[interactive card]', resources: [] };\n }\n\n return convertLegacyCard(parsed);\n};\n"],
5
+ "mappings": "AAQA,SAAS,iBAAiB;AAE1B,SAAS,eAAe,YAAY;AACpC,SAAS,yBAAyB;AAE3B,MAAM,qBAAyC,CAAC,QAAQ;AAC7D,QAAM,SAAS,UAAU,GAAG;AAC5B,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,SAAS,sBAAsB,WAAW,CAAC,EAAE;AAAA,EACxD;AAEA,MAAI,OAAO,OAAO,cAAc,UAAU;AACxC,UAAM,YAAY,IAAI,cAAc,KAAK,OAAO;AAChD,UAAM,SAAS,UAAU,QAAQ,MAAmC;AACpE,WAAO,EAAE,SAAS,OAAO,WAAW,sBAAsB,WAAW,CAAC,EAAE;AAAA,EAC1E;AAEA,SAAO,kBAAkB,MAAM;AACjC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,53 @@
1
+ function convertLegacyCard(parsed) {
2
+ const texts = [];
3
+ const header = parsed.header;
4
+ if (header) {
5
+ const title = header.title;
6
+ if (title && typeof title.content === "string") {
7
+ texts.push(`**${title.content}**`);
8
+ }
9
+ }
10
+ const body = parsed.body;
11
+ const elements = parsed.elements ?? body?.elements ?? [];
12
+ extractTexts(elements, texts);
13
+ const content = texts.length > 0 ? texts.join("\n") : "[interactive card]";
14
+ return { content, resources: [] };
15
+ }
16
+ function extractTexts(elements, out) {
17
+ if (!Array.isArray(elements)) return;
18
+ for (const el of elements) {
19
+ if (typeof el !== "object" || el === null) continue;
20
+ const elem = el;
21
+ if (elem.tag === "markdown" && typeof elem.content === "string") {
22
+ out.push(elem.content);
23
+ continue;
24
+ }
25
+ if (elem.tag === "div" || elem.tag === "plain_text" || elem.tag === "lark_md") {
26
+ const text = elem.text;
27
+ if (text?.content && typeof text.content === "string") {
28
+ out.push(text.content);
29
+ }
30
+ if (typeof elem.content === "string") {
31
+ out.push(elem.content);
32
+ }
33
+ }
34
+ if (elem.tag === "column_set") {
35
+ const columns = elem.columns;
36
+ if (columns) {
37
+ for (const col of columns) {
38
+ const colObj = col;
39
+ if (colObj.elements) {
40
+ extractTexts(colObj.elements, out);
41
+ }
42
+ }
43
+ }
44
+ }
45
+ if (elem.elements) {
46
+ extractTexts(elem.elements, out);
47
+ }
48
+ }
49
+ }
50
+ export {
51
+ convertLegacyCard
52
+ };
53
+ //# sourceMappingURL=legacy.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/messaging/converters/interactive/legacy.ts"],
4
+ "sourcesContent": ["/**\n * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n *\n * Legacy card converter for non-raw_card_content format.\n */\n\nimport type { Obj } from './types';\n\nexport function convertLegacyCard(parsed: Obj): { content: string; resources: never[] } {\n const texts: string[] = [];\n\n const header = parsed.header as Obj | undefined;\n if (header) {\n const title = header.title as Obj | undefined;\n if (title && typeof title.content === 'string') {\n texts.push(`**${title.content}**`);\n }\n }\n\n const body = parsed.body as Obj | undefined;\n const elements = (parsed.elements ?? body?.elements ?? []) as unknown[];\n extractTexts(elements, texts);\n\n const content = texts.length > 0 ? texts.join('\\n') : '[interactive card]';\n return { content, resources: [] };\n}\n\nfunction extractTexts(elements: unknown[], out: string[]): void {\n if (!Array.isArray(elements)) return;\n\n for (const el of elements) {\n if (typeof el !== 'object' || el === null) continue;\n const elem = el as Obj;\n\n if (elem.tag === 'markdown' && typeof elem.content === 'string') {\n out.push(elem.content);\n continue;\n }\n\n if (elem.tag === 'div' || elem.tag === 'plain_text' || elem.tag === 'lark_md') {\n const text = elem.text as Obj | undefined;\n if (text?.content && typeof text.content === 'string') {\n out.push(text.content);\n }\n if (typeof elem.content === 'string') {\n out.push(elem.content);\n }\n }\n\n if (elem.tag === 'column_set') {\n const columns = elem.columns as unknown[] | undefined;\n if (columns) {\n for (const col of columns) {\n const colObj = col as Obj;\n if (colObj.elements) {\n extractTexts(colObj.elements as unknown[], out);\n }\n }\n }\n }\n\n if (elem.elements) {\n extractTexts(elem.elements as unknown[], out);\n }\n }\n}\n"],
5
+ "mappings": "AASO,SAAS,kBAAkB,QAAsD;AACtF,QAAM,QAAkB,CAAC;AAEzB,QAAM,SAAS,OAAO;AACtB,MAAI,QAAQ;AACV,UAAM,QAAQ,OAAO;AACrB,QAAI,SAAS,OAAO,MAAM,YAAY,UAAU;AAC9C,YAAM,KAAK,KAAK,MAAM,OAAO,IAAI;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,OAAO,OAAO;AACpB,QAAM,WAAY,OAAO,YAAY,MAAM,YAAY,CAAC;AACxD,eAAa,UAAU,KAAK;AAE5B,QAAM,UAAU,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AACtD,SAAO,EAAE,SAAS,WAAW,CAAC,EAAE;AAClC;AAEA,SAAS,aAAa,UAAqB,KAAqB;AAC9D,MAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG;AAE9B,aAAW,MAAM,UAAU;AACzB,QAAI,OAAO,OAAO,YAAY,OAAO,KAAM;AAC3C,UAAM,OAAO;AAEb,QAAI,KAAK,QAAQ,cAAc,OAAO,KAAK,YAAY,UAAU;AAC/D,UAAI,KAAK,KAAK,OAAO;AACrB;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ,SAAS,KAAK,QAAQ,gBAAgB,KAAK,QAAQ,WAAW;AAC7E,YAAM,OAAO,KAAK;AAClB,UAAI,MAAM,WAAW,OAAO,KAAK,YAAY,UAAU;AACrD,YAAI,KAAK,KAAK,OAAO;AAAA,MACvB;AACA,UAAI,OAAO,KAAK,YAAY,UAAU;AACpC,YAAI,KAAK,KAAK,OAAO;AAAA,MACvB;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ,cAAc;AAC7B,YAAM,UAAU,KAAK;AACrB,UAAI,SAAS;AACX,mBAAW,OAAO,SAAS;AACzB,gBAAM,SAAS;AACf,cAAI,OAAO,UAAU;AACnB,yBAAa,OAAO,UAAuB,GAAG;AAAA,UAChD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,UAAU;AACjB,mBAAa,KAAK,UAAuB,GAAG;AAAA,IAC9C;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,23 @@
1
+ const EMOJI_MAP = {
2
+ OK: "\u{1F44C}",
3
+ THUMBSUP: "\u{1F44D}",
4
+ SMILE: "\u{1F60A}",
5
+ HEART: "\u2764\uFE0F",
6
+ CLAP: "\u{1F44F}",
7
+ FIRE: "\u{1F525}",
8
+ PARTY: "\u{1F389}",
9
+ THINK: "\u{1F914}"
10
+ };
11
+ const CHART_TYPE_NAMES = {
12
+ bar: "\u67F1\u72B6\u56FE",
13
+ line: "\u6298\u7EBF\u56FE",
14
+ pie: "\u997C\u56FE",
15
+ area: "\u9762\u79EF\u56FE",
16
+ radar: "\u96F7\u8FBE\u56FE",
17
+ scatter: "\u6563\u70B9\u56FE"
18
+ };
19
+ export {
20
+ CHART_TYPE_NAMES,
21
+ EMOJI_MAP
22
+ };
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/messaging/converters/interactive/types.ts"],
4
+ "sourcesContent": ["/**\n * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n *\n * Types and constants for the interactive (card) converter.\n */\n\nexport type Obj = Record<string, unknown>;\n\nexport interface RawCardContent {\n json_card: string;\n json_attachment?: string;\n card_schema?: number;\n}\n\nexport interface ConvertCardResult {\n content: string;\n schema: number;\n}\n\nexport interface TextStyle {\n bold: boolean;\n italic: boolean;\n strikethrough: boolean;\n}\n\nexport const EMOJI_MAP: Record<string, string> = {\n OK: '\uD83D\uDC4C',\n THUMBSUP: '\uD83D\uDC4D',\n SMILE: '\uD83D\uDE0A',\n HEART: '\u2764\uFE0F',\n CLAP: '\uD83D\uDC4F',\n FIRE: '\uD83D\uDD25',\n PARTY: '\uD83C\uDF89',\n THINK: '\uD83E\uDD14',\n};\n\nexport const CHART_TYPE_NAMES: Record<string, string> = {\n bar: '\u67F1\u72B6\u56FE',\n line: '\u6298\u7EBF\u56FE',\n pie: '\u997C\u56FE',\n area: '\u9762\u79EF\u56FE',\n radar: '\u96F7\u8FBE\u56FE',\n scatter: '\u6563\u70B9\u56FE',\n};\n"],
5
+ "mappings": "AA0BO,MAAM,YAAoC;AAAA,EAC/C,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AACT;AAEO,MAAM,mBAA2C;AAAA,EACtD,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AACX;",
6
+ "names": []
7
+ }
@@ -0,0 +1,17 @@
1
+ import { safeParse } from "./utils";
2
+ const convertLocation = (raw) => {
3
+ const parsed = safeParse(raw);
4
+ const name = parsed?.name ?? "";
5
+ const lat = parsed?.latitude ?? "";
6
+ const lng = parsed?.longitude ?? "";
7
+ const nameAttr = name ? ` name="${name}"` : "";
8
+ const coordsAttr = lat && lng ? ` coords="lat:${lat},lng:${lng}"` : "";
9
+ return {
10
+ content: `<location${nameAttr}${coordsAttr}/>`,
11
+ resources: []
12
+ };
13
+ };
14
+ export {
15
+ convertLocation
16
+ };
17
+ //# sourceMappingURL=location.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/messaging/converters/location.ts"],
4
+ "sourcesContent": ["/**\n * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n *\n * Converter for \"location\" message type.\n */\n\nimport type { ContentConverterFn } from './types';\nimport { safeParse } from './utils';\n\nexport const convertLocation: ContentConverterFn = (raw) => {\n const parsed = safeParse(raw) as\n | {\n name?: string;\n longitude?: string;\n latitude?: string;\n }\n | undefined;\n\n const name = parsed?.name ?? '';\n const lat = parsed?.latitude ?? '';\n const lng = parsed?.longitude ?? '';\n\n const nameAttr = name ? ` name=\"${name}\"` : '';\n const coordsAttr = lat && lng ? ` coords=\"lat:${lat},lng:${lng}\"` : '';\n\n return {\n content: `<location${nameAttr}${coordsAttr}/>`,\n resources: [],\n };\n};\n"],
5
+ "mappings": "AAQA,SAAS,iBAAiB;AAEnB,MAAM,kBAAsC,CAAC,QAAQ;AAC1D,QAAM,SAAS,UAAU,GAAG;AAQ5B,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,MAAM,QAAQ,YAAY;AAChC,QAAM,MAAM,QAAQ,aAAa;AAEjC,QAAM,WAAW,OAAO,UAAU,IAAI,MAAM;AAC5C,QAAM,aAAa,OAAO,MAAM,gBAAgB,GAAG,QAAQ,GAAG,MAAM;AAEpE,SAAO;AAAA,IACL,SAAS,YAAY,QAAQ,GAAG,UAAU;AAAA,IAC1C,WAAW,CAAC;AAAA,EACd;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,143 @@
1
+ import { convertMessageContent, buildConvertContextFromItem } from "./content-converter";
2
+ import { larkLogger } from "../../core/lark-logger";
3
+ const log = larkLogger("converters/merge-forward");
4
+ const convertMergeForward = async (_raw, ctx) => {
5
+ const { accountId, messageId, resolveUserName, batchResolveNames, fetchSubMessages } = ctx;
6
+ if (!fetchSubMessages) {
7
+ return { content: "<forwarded_messages/>", resources: [] };
8
+ }
9
+ const content = await expand(accountId, messageId, resolveUserName, batchResolveNames, fetchSubMessages);
10
+ return { content, resources: [] };
11
+ };
12
+ async function expand(accountId, messageId, resolveUserName, batchResolveNames, fetchSubMessages) {
13
+ let items;
14
+ try {
15
+ items = await fetchSubMessages(messageId);
16
+ } catch (error) {
17
+ log.error("fetch sub-messages failed", {
18
+ messageId,
19
+ error: error instanceof Error ? error.message : String(error)
20
+ });
21
+ return "<forwarded_messages/>";
22
+ }
23
+ if (items.length === 0) {
24
+ return "<forwarded_messages/>";
25
+ }
26
+ const childrenMap = buildChildrenMap(items, messageId);
27
+ const senderIds = collectSenderIds(items, messageId);
28
+ if (senderIds.length > 0 && batchResolveNames) {
29
+ try {
30
+ await batchResolveNames(senderIds);
31
+ } catch (err) {
32
+ log.debug("batchResolveNames failed (best-effort)", {
33
+ error: err instanceof Error ? err.message : String(err)
34
+ });
35
+ }
36
+ }
37
+ return formatSubTree(messageId, childrenMap, accountId, resolveUserName);
38
+ }
39
+ function buildChildrenMap(items, rootMessageId) {
40
+ const map = /* @__PURE__ */ new Map();
41
+ for (const item of items) {
42
+ if (item.message_id === rootMessageId && !item.upper_message_id) {
43
+ continue;
44
+ }
45
+ const parentId = item.upper_message_id ?? rootMessageId;
46
+ let children = map.get(parentId);
47
+ if (!children) {
48
+ children = [];
49
+ map.set(parentId, children);
50
+ }
51
+ children.push(item);
52
+ }
53
+ for (const children of map.values()) {
54
+ children.sort((a, b) => {
55
+ const ta = parseInt(String(a.create_time ?? "0"), 10);
56
+ const tb = parseInt(String(b.create_time ?? "0"), 10);
57
+ return ta - tb;
58
+ });
59
+ }
60
+ return map;
61
+ }
62
+ function collectSenderIds(items, rootMessageId) {
63
+ const ids = /* @__PURE__ */ new Set();
64
+ for (const item of items) {
65
+ if (item.message_id === rootMessageId && !item.upper_message_id) {
66
+ continue;
67
+ }
68
+ if (item.sender?.sender_type === "user") {
69
+ const senderId = item.sender.id;
70
+ if (senderId) {
71
+ ids.add(senderId);
72
+ }
73
+ }
74
+ }
75
+ return [...ids];
76
+ }
77
+ async function formatSubTree(parentId, childrenMap, accountId, resolveUserName) {
78
+ const children = childrenMap.get(parentId);
79
+ if (!children || children.length === 0) {
80
+ return "<forwarded_messages/>";
81
+ }
82
+ const parts = [];
83
+ for (const item of children) {
84
+ try {
85
+ const msgType = item.msg_type ?? "text";
86
+ const senderId = item.sender?.id ?? "unknown";
87
+ const createTime = item.create_time ? parseInt(String(item.create_time), 10) : void 0;
88
+ const timestamp = createTime ? formatTimestamp(createTime) : "unknown";
89
+ const rawContent = item.body?.content ?? "{}";
90
+ let content;
91
+ if (msgType === "merge_forward") {
92
+ const nestedId = item.message_id;
93
+ if (nestedId) {
94
+ content = await formatSubTree(nestedId, childrenMap, accountId, resolveUserName);
95
+ } else {
96
+ content = "<forwarded_messages/>";
97
+ }
98
+ } else {
99
+ const subCtx = {
100
+ ...buildConvertContextFromItem(item, parentId, accountId),
101
+ accountId,
102
+ resolveUserName
103
+ };
104
+ content = (await convertMessageContent(rawContent, msgType, subCtx)).content;
105
+ }
106
+ const displayName = resolveUserName?.(senderId) ?? senderId;
107
+ const indented = indentLines(content, " ");
108
+ parts.push(`[${timestamp}] ${displayName}:
109
+ ${indented}`);
110
+ } catch (err) {
111
+ log.warn("failed to convert sub-message", {
112
+ messageId: item.message_id,
113
+ msgType: item.msg_type ?? "unknown",
114
+ error: err instanceof Error ? err.message : String(err)
115
+ });
116
+ }
117
+ }
118
+ if (parts.length === 0) {
119
+ return "<forwarded_messages/>";
120
+ }
121
+ return `<forwarded_messages>
122
+ ${parts.join("\n")}
123
+ </forwarded_messages>`;
124
+ }
125
+ function formatTimestamp(ms) {
126
+ const date = new Date(ms);
127
+ const utcMs = date.getTime() + date.getTimezoneOffset() * 6e4;
128
+ const bjDate = new Date(utcMs + 8 * 36e5);
129
+ const y = bjDate.getFullYear();
130
+ const mo = String(bjDate.getMonth() + 1).padStart(2, "0");
131
+ const d = String(bjDate.getDate()).padStart(2, "0");
132
+ const h = String(bjDate.getHours()).padStart(2, "0");
133
+ const mi = String(bjDate.getMinutes()).padStart(2, "0");
134
+ const s = String(bjDate.getSeconds()).padStart(2, "0");
135
+ return `${y}-${mo}-${d}T${h}:${mi}:${s}+08:00`;
136
+ }
137
+ function indentLines(text, indent) {
138
+ return text.split("\n").map((line) => `${indent}${line}`).join("\n");
139
+ }
140
+ export {
141
+ convertMergeForward
142
+ };
143
+ //# sourceMappingURL=merge-forward.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/messaging/converters/merge-forward.ts"],
4
+ "sourcesContent": ["/**\n * Copyright (c) 2026 ByteDance Ltd. and/or its affiliates\n * SPDX-License-Identifier: MIT\n *\n * Converter for \"merge_forward\" message type.\n *\n * Unlike other converters this is async \u2014 it fetches sub-messages via\n * the Feishu IM API and recursively expands nested merge_forward messages.\n *\n * The API returns ALL nested sub-messages in a single flat `items`\n * array with `upper_message_id` pointing to the parent container.\n * We build a tree from this flat list and recursively format it \u2014\n * only one API call is needed regardless of nesting depth.\n *\n * This module is a pure \"data \u2192 format\" converter: all API capabilities\n * (`fetchSubMessages`, `batchResolveNames`, `resolveUserName`) are\n * injected via callbacks in `ConvertContext`. Callers are responsible\n * for creating the appropriate callbacks (UAT / TAT / event push).\n */\n\nimport type { ApiMessageItem, ContentConverterFn } from './types';\nimport { convertMessageContent, buildConvertContextFromItem } from './content-converter';\nimport { larkLogger } from '../../core/lark-logger';\n\nconst log = larkLogger('converters/merge-forward');\n\n/**\n * Recursively expand a merge_forward message.\n *\n * Output format aligns with the Go reference implementation:\n * ```\n * <forwarded_messages>\n * [RFC3339] sender_id:\n * message content\n * </forwarded_messages>\n * ```\n */\nexport const convertMergeForward: ContentConverterFn = async (_raw, ctx) => {\n const { accountId, messageId, resolveUserName, batchResolveNames, fetchSubMessages } = ctx;\n\n if (!fetchSubMessages) {\n return { content: '<forwarded_messages/>', resources: [] };\n }\n\n const content = await expand(accountId, messageId, resolveUserName, batchResolveNames, fetchSubMessages);\n return { content, resources: [] };\n};\n\n// ---------------------------------------------------------------------------\n// Single-API-call expansion with tree building\n// ---------------------------------------------------------------------------\n\nasync function expand(\n accountId: string | undefined,\n messageId: string,\n resolveUserName?: (openId: string) => string | undefined,\n batchResolveNames?: (openIds: string[]) => Promise<void>,\n fetchSubMessages?: (messageId: string) => Promise<ApiMessageItem[]>,\n): Promise<string> {\n // --- Phase 1: Fetch (single API call via callback) ---\n let items: ApiMessageItem[];\n try {\n items = await fetchSubMessages!(messageId);\n } catch (error) {\n log.error('fetch sub-messages failed', {\n messageId,\n error: error instanceof Error ? error.message : String(error),\n });\n return '<forwarded_messages/>';\n }\n\n if (items.length === 0) {\n return '<forwarded_messages/>';\n }\n\n // --- Phase 2: Build children map ---\n const childrenMap = buildChildrenMap(items, messageId);\n\n // --- Phase 2.5: Batch resolve sender names (via callback) ---\n const senderIds = collectSenderIds(items, messageId);\n if (senderIds.length > 0 && batchResolveNames) {\n try {\n await batchResolveNames(senderIds);\n } catch (err) {\n log.debug('batchResolveNames failed (best-effort)', {\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n // --- Phase 3: Format tree recursively ---\n return formatSubTree(messageId, childrenMap, accountId, resolveUserName);\n}\n\n// ---------------------------------------------------------------------------\n// Tree building\n// ---------------------------------------------------------------------------\n\n/**\n * Build a map from parent message ID \u2192 ordered child items.\n *\n * The API returns a flat `items` array where each item may carry an\n * `upper_message_id` pointing to its parent container. Items without\n * `upper_message_id` are direct children of the root container.\n *\n * The root container message itself (matching `rootMessageId`) is skipped.\n */\nfunction buildChildrenMap(items: ApiMessageItem[], rootMessageId: string): Map<string, ApiMessageItem[]> {\n const map = new Map<string, ApiMessageItem[]>();\n\n for (const item of items) {\n // Skip the root container message itself\n if (item.message_id === rootMessageId && !item.upper_message_id) {\n continue;\n }\n\n const parentId: string = item.upper_message_id ?? rootMessageId;\n let children = map.get(parentId);\n if (!children) {\n children = [];\n map.set(parentId, children);\n }\n children.push(item);\n }\n\n // Sort each group by create_time ascending\n for (const children of map.values()) {\n children.sort((a, b) => {\n const ta = parseInt(String(a.create_time ?? '0'), 10);\n const tb = parseInt(String(b.create_time ?? '0'), 10);\n return ta - tb;\n });\n }\n\n return map;\n}\n\n// ---------------------------------------------------------------------------\n// Sender ID collection\n// ---------------------------------------------------------------------------\n\n/**\n * Collect all unique sender IDs from non-root items for batch name resolution.\n */\nfunction collectSenderIds(items: ApiMessageItem[], rootMessageId: string): string[] {\n const ids = new Set<string>();\n for (const item of items) {\n // Skip the root container\n if (item.message_id === rootMessageId && !item.upper_message_id) {\n continue;\n }\n if (item.sender?.sender_type === 'user') {\n const senderId: string | undefined = item.sender.id;\n if (senderId) {\n ids.add(senderId);\n }\n }\n }\n return [...ids];\n}\n\n// ---------------------------------------------------------------------------\n// Recursive tree formatting\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively format a sub-tree of messages rooted at `parentId`.\n *\n * For `merge_forward` children this recurses into `formatSubTree`\n * directly (no additional API calls). For other message types it\n * delegates to `convertMessageContent`.\n */\nasync function formatSubTree(\n parentId: string,\n childrenMap: Map<string, ApiMessageItem[]>,\n accountId: string | undefined,\n resolveUserName?: (openId: string) => string | undefined,\n): Promise<string> {\n const children = childrenMap.get(parentId);\n if (!children || children.length === 0) {\n return '<forwarded_messages/>';\n }\n\n const parts: string[] = [];\n\n for (const item of children) {\n try {\n const msgType: string = item.msg_type ?? 'text';\n const senderId: string = item.sender?.id ?? 'unknown';\n const createTime: number | undefined = item.create_time ? parseInt(String(item.create_time), 10) : undefined;\n const timestamp = createTime ? formatTimestamp(createTime) : 'unknown';\n const rawContent: string = item.body?.content ?? '{}';\n\n let content: string;\n\n if (msgType === 'merge_forward') {\n // Recurse into nested merge_forward via the tree \u2014 no API call\n const nestedId: string | undefined = item.message_id;\n if (nestedId) {\n content = await formatSubTree(nestedId, childrenMap, accountId, resolveUserName);\n } else {\n content = '<forwarded_messages/>';\n }\n } else {\n // Delegate to the unified converter system.\n // Do NOT pass cfg/account here \u2014 sub-converters for non-merge_forward\n // types don't need it, and passing it would cause nested\n // merge_forward to re-enter expand() via convertMessageContent.\n const subCtx = {\n ...buildConvertContextFromItem(item, parentId, accountId),\n accountId,\n resolveUserName,\n };\n content = (await convertMessageContent(rawContent, msgType, subCtx)).content;\n }\n\n const displayName = resolveUserName?.(senderId) ?? senderId;\n const indented = indentLines(content, ' ');\n parts.push(`[${timestamp}] ${displayName}:\\n${indented}`);\n } catch (err) {\n log.warn('failed to convert sub-message', {\n messageId: item.message_id,\n msgType: item.msg_type ?? 'unknown',\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n if (parts.length === 0) {\n return '<forwarded_messages/>';\n }\n\n return `<forwarded_messages>\\n${parts.join('\\n')}\\n</forwarded_messages>`;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a millisecond timestamp to RFC 3339 format with +08:00 offset\n * (Beijing time).\n */\nfunction formatTimestamp(ms: number): string {\n const date = new Date(ms);\n const utcMs = date.getTime() + date.getTimezoneOffset() * 60_000;\n const bjDate = new Date(utcMs + 8 * 3600_000);\n\n const y = bjDate.getFullYear();\n const mo = String(bjDate.getMonth() + 1).padStart(2, '0');\n const d = String(bjDate.getDate()).padStart(2, '0');\n const h = String(bjDate.getHours()).padStart(2, '0');\n const mi = String(bjDate.getMinutes()).padStart(2, '0');\n const s = String(bjDate.getSeconds()).padStart(2, '0');\n\n return `${y}-${mo}-${d}T${h}:${mi}:${s}+08:00`;\n}\n\n/** Add a prefix indent to every line of text. */\nfunction indentLines(text: string, indent: string): string {\n return text\n .split('\\n')\n .map((line) => `${indent}${line}`)\n .join('\\n');\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }