weaver-work-cli 0.1.2 → 0.1.5

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 (405) hide show
  1. package/README.md +176 -78
  2. package/dist/cmd/setup/index.js +5 -5
  3. package/dist/cmd/skills/index.js +1 -1
  4. package/dist/core/hooks.js +7 -0
  5. package/dist/index.js +0 -0
  6. package/dist/internal/e10/auth/commands.js +159 -54
  7. package/dist/internal/e10/auth/xiaoe.js +268 -0
  8. package/dist/internal/e10/context.js +16 -2
  9. package/dist/internal/e10/index.js +1 -0
  10. package/dist/internal/e10/request-runtime.js +345 -0
  11. package/dist/internal/skills/install.js +48 -6
  12. package/dist/internal/skills/reader.js +27 -0
  13. package/dist/shortcuts/archive/continuation.js +70 -0
  14. package/dist/shortcuts/archive/errors.js +53 -0
  15. package/dist/shortcuts/archive/host.js +197 -0
  16. package/dist/shortcuts/archive/index.js +363 -0
  17. package/dist/shortcuts/archive/manifest.js +45 -0
  18. package/dist/shortcuts/archive/operations/archive-info.js +55 -0
  19. package/dist/shortcuts/archive/operations/borrow-car.js +146 -0
  20. package/dist/shortcuts/archive/operations/borrow-list.js +200 -0
  21. package/dist/shortcuts/archive/operations/confirm.js +46 -0
  22. package/dist/shortcuts/archive/operations/download.js +238 -0
  23. package/dist/shortcuts/archive/operations/flow-url.js +240 -0
  24. package/dist/shortcuts/archive/operations/fonds.js +95 -0
  25. package/dist/shortcuts/archive/operations/getPageUrl.js +137 -0
  26. package/dist/shortcuts/archive/operations/registry.js +43 -0
  27. package/dist/shortcuts/archive/operations/search.js +88 -0
  28. package/dist/shortcuts/archive/operations/shared.js +120 -0
  29. package/dist/shortcuts/archive/operations/types.js +23 -0
  30. package/dist/shortcuts/archive/operations/upload.js +182 -0
  31. package/dist/shortcuts/archive/operations.js +13 -0
  32. package/dist/shortcuts/archive/render/search-format.js +276 -0
  33. package/dist/shortcuts/archive/render/search-view.js +125 -0
  34. package/dist/shortcuts/asset/continuation.js +70 -0
  35. package/dist/shortcuts/asset/errors.js +67 -0
  36. package/dist/shortcuts/asset/host.js +438 -0
  37. package/dist/shortcuts/asset/index.js +255 -0
  38. package/dist/shortcuts/asset/manifest.js +471 -0
  39. package/dist/shortcuts/asset/operations/query.js +249 -0
  40. package/dist/shortcuts/asset/operations/registry.js +85 -0
  41. package/dist/shortcuts/asset/operations/shared.js +100 -0
  42. package/dist/shortcuts/asset/operations/type-cache.js +49 -0
  43. package/dist/shortcuts/asset/operations/types.js +1 -0
  44. package/dist/shortcuts/asset/operations/viewlink.js +117 -0
  45. package/dist/shortcuts/asset/operations/write.js +435 -0
  46. package/dist/shortcuts/asset/operations.js +9 -0
  47. package/dist/shortcuts/calendar/continuation.js +70 -0
  48. package/dist/shortcuts/calendar/errors.js +53 -0
  49. package/dist/shortcuts/calendar/host.js +148 -0
  50. package/dist/shortcuts/calendar/index.js +125 -0
  51. package/dist/shortcuts/calendar/manifest.js +26 -0
  52. package/dist/shortcuts/calendar/operations/read.js +259 -0
  53. package/dist/shortcuts/calendar/operations/registry.js +31 -0
  54. package/dist/shortcuts/calendar/operations/shared.js +132 -0
  55. package/dist/shortcuts/calendar/operations/types.js +25 -0
  56. package/dist/shortcuts/calendar/operations/write.js +439 -0
  57. package/dist/shortcuts/calendar/operations.js +8 -0
  58. package/dist/shortcuts/ehr/continuation.js +70 -0
  59. package/dist/shortcuts/ehr/errors.js +53 -0
  60. package/dist/shortcuts/ehr/host.js +213 -0
  61. package/dist/shortcuts/ehr/index.js +205 -0
  62. package/dist/shortcuts/ehr/manifest.js +47 -0
  63. package/dist/shortcuts/ehr/operations/attend-read.js +373 -0
  64. package/dist/shortcuts/ehr/operations/attend-write.js +514 -0
  65. package/dist/shortcuts/ehr/operations/hr-contact.js +363 -0
  66. package/dist/shortcuts/ehr/operations/hr-ds.js +298 -0
  67. package/dist/shortcuts/ehr/operations/hr-report.js +386 -0
  68. package/dist/shortcuts/ehr/operations/recruit-write.js +1629 -0
  69. package/dist/shortcuts/ehr/operations/recruit.js +803 -0
  70. package/dist/shortcuts/ehr/operations/registry.js +43 -0
  71. package/dist/shortcuts/ehr/operations/salary.js +319 -0
  72. package/dist/shortcuts/ehr/operations/shared.js +246 -0
  73. package/dist/shortcuts/ehr/operations/types.js +25 -0
  74. package/dist/shortcuts/ehr/operations.js +25 -0
  75. package/dist/shortcuts/esb/continuation.js +70 -0
  76. package/dist/shortcuts/esb/errors.js +65 -0
  77. package/dist/shortcuts/esb/host.js +187 -0
  78. package/dist/shortcuts/esb/index.js +112 -0
  79. package/dist/shortcuts/esb/manifest.js +91 -0
  80. package/dist/shortcuts/esb/operations/input-format.js +31 -0
  81. package/dist/shortcuts/esb/operations/registry.js +48 -0
  82. package/dist/shortcuts/esb/operations/shared.js +152 -0
  83. package/dist/shortcuts/esb/operations/trigger.js +76 -0
  84. package/dist/shortcuts/esb/operations/types.js +21 -0
  85. package/dist/shortcuts/esb/operations.js +15 -0
  86. package/dist/shortcuts/fna/continuation.js +70 -0
  87. package/dist/shortcuts/fna/errors.js +59 -0
  88. package/dist/shortcuts/fna/host.js +146 -0
  89. package/dist/shortcuts/fna/index.js +111 -0
  90. package/dist/shortcuts/fna/manifest.js +41 -0
  91. package/dist/shortcuts/fna/operations/budget.js +124 -0
  92. package/dist/shortcuts/fna/operations/expense-center.js +148 -0
  93. package/dist/shortcuts/fna/operations/invoice-writeoff.js +212 -0
  94. package/dist/shortcuts/fna/operations/loan.js +195 -0
  95. package/dist/shortcuts/fna/operations/registry.js +35 -0
  96. package/dist/shortcuts/fna/operations/shared.js +210 -0
  97. package/dist/shortcuts/fna/operations/types.js +25 -0
  98. package/dist/shortcuts/fna/operations.js +19 -0
  99. package/dist/shortcuts/hrm/errors.js +38 -0
  100. package/dist/shortcuts/hrm/host.js +156 -0
  101. package/dist/shortcuts/hrm/index.js +111 -0
  102. package/dist/shortcuts/hrm/manifest.js +32 -0
  103. package/dist/shortcuts/hrm/operations/employee.js +338 -0
  104. package/dist/shortcuts/hrm/operations/org.js +110 -0
  105. package/dist/shortcuts/hrm/operations/position.js +176 -0
  106. package/dist/shortcuts/hrm/operations/registry.js +33 -0
  107. package/dist/shortcuts/hrm/operations/shared.js +143 -0
  108. package/dist/shortcuts/hrm/operations/types.js +23 -0
  109. package/dist/shortcuts/hrm/operations.js +19 -0
  110. package/dist/shortcuts/index.js +24 -0
  111. package/dist/shortcuts/invoice/host.js +99 -94
  112. package/dist/shortcuts/invoice/index.js +58 -59
  113. package/dist/shortcuts/invoice/manifest.js +200 -3
  114. package/dist/shortcuts/invoice/operations/browse-field.js +17 -0
  115. package/dist/shortcuts/invoice/operations/issuing.js +198 -0
  116. package/dist/shortcuts/invoice/operations/registry.js +17 -0
  117. package/dist/shortcuts/invoice/operations/reim.js +401 -0
  118. package/dist/shortcuts/invoice/operations/shared.js +247 -0
  119. package/dist/shortcuts/jiuchuanhui/cache.js +441 -0
  120. package/dist/shortcuts/jiuchuanhui/continuation.js +70 -0
  121. package/dist/shortcuts/jiuchuanhui/errors.js +59 -0
  122. package/dist/shortcuts/jiuchuanhui/host.js +159 -0
  123. package/dist/shortcuts/jiuchuanhui/index.js +109 -0
  124. package/dist/shortcuts/jiuchuanhui/manifest.js +469 -0
  125. package/dist/shortcuts/jiuchuanhui/operations/datajson.js +214 -0
  126. package/dist/shortcuts/jiuchuanhui/operations/esb.js +157 -0
  127. package/dist/shortcuts/jiuchuanhui/operations/generic.js +146 -0
  128. package/dist/shortcuts/jiuchuanhui/operations/registry.js +133 -0
  129. package/dist/shortcuts/jiuchuanhui/operations/shared.js +158 -0
  130. package/dist/shortcuts/jiuchuanhui/operations/types.js +1 -0
  131. package/dist/shortcuts/jiuchuanhui/operations.js +8 -0
  132. package/dist/shortcuts/mail/continuation.js +70 -0
  133. package/dist/shortcuts/mail/errors.js +53 -0
  134. package/dist/shortcuts/mail/host.js +182 -0
  135. package/dist/shortcuts/mail/index.js +519 -0
  136. package/dist/shortcuts/mail/manifest.js +38 -0
  137. package/dist/shortcuts/mail/operations/mail-blacklist.js +79 -0
  138. package/dist/shortcuts/mail/operations/mail-contacts.js +195 -0
  139. package/dist/shortcuts/mail/operations/mail-manage.js +335 -0
  140. package/dist/shortcuts/mail/operations/mail-read.js +508 -0
  141. package/dist/shortcuts/mail/operations/mail-send.js +474 -0
  142. package/dist/shortcuts/mail/operations/mail-sign.js +203 -0
  143. package/dist/shortcuts/mail/operations/mail-template.js +170 -0
  144. package/dist/shortcuts/mail/operations/registry.js +41 -0
  145. package/dist/shortcuts/mail/operations/shared.js +64 -0
  146. package/dist/shortcuts/mail/operations/types.js +27 -0
  147. package/dist/shortcuts/mail/operations.js +19 -0
  148. package/dist/shortcuts/meeting/continuation.js +70 -0
  149. package/dist/shortcuts/meeting/errors.js +63 -0
  150. package/dist/shortcuts/meeting/host.js +167 -0
  151. package/dist/shortcuts/meeting/index.js +123 -0
  152. package/dist/shortcuts/meeting/manifest.js +64 -0
  153. package/dist/shortcuts/meeting/operations/catalogs.js +58 -0
  154. package/dist/shortcuts/meeting/operations/change.js +242 -0
  155. package/dist/shortcuts/meeting/operations/conflicts.js +142 -0
  156. package/dist/shortcuts/meeting/operations/create.js +349 -0
  157. package/dist/shortcuts/meeting/operations/env.js +191 -0
  158. package/dist/shortcuts/meeting/operations/lifecycle.js +139 -0
  159. package/dist/shortcuts/meeting/operations/meetings.js +73 -0
  160. package/dist/shortcuts/meeting/operations/receipts.js +195 -0
  161. package/dist/shortcuts/meeting/operations/registry.js +47 -0
  162. package/dist/shortcuts/meeting/operations/rooms.js +132 -0
  163. package/dist/shortcuts/meeting/operations/shared.js +112 -0
  164. package/dist/shortcuts/meeting/operations/signs.js +41 -0
  165. package/dist/shortcuts/meeting/operations/types.js +25 -0
  166. package/dist/shortcuts/meeting/operations.js +19 -0
  167. package/dist/shortcuts/plan/continuation.js +70 -0
  168. package/dist/shortcuts/plan/errors.js +70 -0
  169. package/dist/shortcuts/plan/host.js +180 -0
  170. package/dist/shortcuts/plan/index.js +150 -0
  171. package/dist/shortcuts/plan/manifest.js +53 -0
  172. package/dist/shortcuts/plan/operations/link.js +256 -0
  173. package/dist/shortcuts/plan/operations/read.js +259 -0
  174. package/dist/shortcuts/plan/operations/registry.js +33 -0
  175. package/dist/shortcuts/plan/operations/shared.js +246 -0
  176. package/dist/shortcuts/plan/operations/types.js +49 -0
  177. package/dist/shortcuts/plan/operations/version.js +49 -0
  178. package/dist/shortcuts/plan/operations/write.js +710 -0
  179. package/dist/shortcuts/plan/operations.js +8 -0
  180. package/dist/shortcuts/yimiaoban/continuation.js +70 -0
  181. package/dist/shortcuts/yimiaoban/errors.js +61 -0
  182. package/dist/shortcuts/yimiaoban/host.js +469 -0
  183. package/dist/shortcuts/yimiaoban/index.js +271 -0
  184. package/dist/shortcuts/yimiaoban/manifest.js +28 -0
  185. package/dist/shortcuts/yimiaoban/operations/file-user.js +288 -0
  186. package/dist/shortcuts/yimiaoban/operations/group-read.js +477 -0
  187. package/dist/shortcuts/yimiaoban/operations/group-write.js +591 -0
  188. package/dist/shortcuts/yimiaoban/operations/msg-parse.js +429 -0
  189. package/dist/shortcuts/yimiaoban/operations/msg-sync.js +519 -0
  190. package/dist/shortcuts/yimiaoban/operations/msg-write.js +593 -0
  191. package/dist/shortcuts/yimiaoban/operations/person.js +102 -0
  192. package/dist/shortcuts/yimiaoban/operations/registry.js +38 -0
  193. package/dist/shortcuts/yimiaoban/operations/session.js +437 -0
  194. package/dist/shortcuts/yimiaoban/operations/shared.js +236 -0
  195. package/dist/shortcuts/yimiaoban/operations/types.js +27 -0
  196. package/dist/shortcuts/yimiaoban/operations/write-util.js +78 -0
  197. package/dist/shortcuts/yimiaoban/operations.js +8 -0
  198. package/docs/SKILL.md +11 -7
  199. package/docs/_catalog.md +28 -5
  200. package/docs/agent-invoice.md +19 -9
  201. package/docs/agent-skill-install.md +141 -22
  202. package/docs/calendar.md +87 -0
  203. package/docs/e10-auth.md +28 -9
  204. package/docs/ehr.md +186 -0
  205. package/docs/esb.md +64 -0
  206. package/docs/fna.md +72 -0
  207. package/docs/hrm.md +89 -0
  208. package/docs/invoice.md +61 -20
  209. package/docs/jiuchuanhui.md +131 -0
  210. package/docs/meeting.md +48 -0
  211. package/docs/operation-manual.md +443 -0
  212. package/docs/plan.md +82 -0
  213. package/docs/wenshuding.md +129 -0
  214. package/docs/yimiaoban.md +86 -0
  215. package/docs/ziguanjia.md +89 -0
  216. package/package.json +4 -4
  217. package/scripts/package-skill.mjs +127 -34
  218. package/scripts/postbuild.mjs +13 -0
  219. package/skill-template/business-info.json +16 -2
  220. package/skill-template/domains/calendar.md +15 -0
  221. package/skill-template/domains/esb.md +13 -0
  222. package/skill-template/domains/hrm.md +16 -0
  223. package/skill-template/domains/jiuchuanhui.md +23 -0
  224. package/skill-template/domains/jucailin.md +22 -0
  225. package/skill-template/domains/mail.md +21 -0
  226. package/skill-template/domains/meeting.md +3 -0
  227. package/skill-template/domains/plan.md +17 -0
  228. package/skill-template/domains/qiyecheng.md +17 -0
  229. package/skill-template/domains/shared.md +5 -3
  230. package/skill-template/domains/skill-maker.md +10 -0
  231. package/skill-template/domains/wenshuding.md +22 -0
  232. package/skill-template/domains/{invoice.md → yepiaotong.md} +4 -0
  233. package/skill-template/domains/yimiaoban.md +21 -0
  234. package/skill-template/domains/ziguanjia.md +21 -0
  235. package/skill-template/master-skill-template.md +12 -6
  236. package/skill-template/skill-template.md +26 -10
  237. package/skills/weaver-e10-calendar/SKILL.md +102 -0
  238. package/skills/weaver-e10-calendar/product.json +8 -0
  239. package/skills/weaver-e10-calendar/references/calendar-app-check.md +65 -0
  240. package/skills/weaver-e10-calendar/references/calendar-dict.md +55 -0
  241. package/skills/weaver-e10-calendar/references/calendar-query.md +70 -0
  242. package/skills/weaver-e10-calendar/references/calendar-write.md +97 -0
  243. package/skills/weaver-e10-calendar/references/source-manifest.json +54 -0
  244. package/skills/weaver-e10-esb/SKILL.md +103 -0
  245. package/skills/weaver-e10-esb/product.json +8 -0
  246. package/skills/weaver-e10-esb/references/input-format.md +52 -0
  247. package/skills/weaver-e10-esb/references/source-manifest.json +242 -0
  248. package/skills/weaver-e10-esb/references/trigger.md +99 -0
  249. package/skills/weaver-e10-hrm/SKILL.md +88 -0
  250. package/skills/weaver-e10-hrm/product.json +8 -0
  251. package/skills/weaver-e10-hrm/references/employee.md +109 -0
  252. package/skills/weaver-e10-hrm/references/org.md +95 -0
  253. package/skills/weaver-e10-hrm/references/position.md +95 -0
  254. package/skills/weaver-e10-hrm/references/source-manifest.json +121 -0
  255. package/skills/weaver-e10-jiuchuanhui/SKILL.md +175 -0
  256. package/skills/weaver-e10-jiuchuanhui/product.json +8 -0
  257. package/skills/weaver-e10-jiuchuanhui/references/cache.md +110 -0
  258. package/skills/weaver-e10-jiuchuanhui/references/clue.md +61 -0
  259. package/skills/weaver-e10-jiuchuanhui/references/contact-plan.md +56 -0
  260. package/skills/weaver-e10-jiuchuanhui/references/contact-records.md +48 -0
  261. package/skills/weaver-e10-jiuchuanhui/references/contact.md +56 -0
  262. package/skills/weaver-e10-jiuchuanhui/references/customer.md +69 -0
  263. package/skills/weaver-e10-jiuchuanhui/references/disabled-capabilities.md +24 -0
  264. package/skills/weaver-e10-jiuchuanhui/references/discovery-config.md +60 -0
  265. package/skills/weaver-e10-jiuchuanhui/references/general-helpers.md +59 -0
  266. package/skills/weaver-e10-jiuchuanhui/references/jiuchuanhui-entry.md +60 -0
  267. package/skills/weaver-e10-jiuchuanhui/references/sale.md +72 -0
  268. package/skills/weaver-e10-jiuchuanhui/references/source-manifest.json +2632 -0
  269. package/skills/weaver-e10-jucailin/SKILL.md +102 -0
  270. package/skills/weaver-e10-jucailin/product.json +8 -0
  271. package/skills/weaver-e10-jucailin/references/attend-read.md +73 -0
  272. package/skills/weaver-e10-jucailin/references/attend-write.md +82 -0
  273. package/skills/weaver-e10-jucailin/references/hr-contact.md +92 -0
  274. package/skills/weaver-e10-jucailin/references/hr-datasource.md +104 -0
  275. package/skills/weaver-e10-jucailin/references/hr-report.md +76 -0
  276. package/skills/weaver-e10-jucailin/references/recruit-read.md +76 -0
  277. package/skills/weaver-e10-jucailin/references/recruit-write.md +70 -0
  278. package/skills/weaver-e10-jucailin/references/safety-boundaries.md +35 -0
  279. package/skills/weaver-e10-jucailin/references/salary.md +110 -0
  280. package/skills/weaver-e10-jucailin/references/source-manifest.json +152 -0
  281. package/skills/weaver-e10-mail/SKILL.md +152 -0
  282. package/skills/weaver-e10-mail/product.json +8 -0
  283. package/skills/weaver-e10-mail/references/mail-agent-entry.md +47 -0
  284. package/skills/weaver-e10-mail/references/mail-attachment.md +30 -0
  285. package/skills/weaver-e10-mail/references/mail-blacklist.md +27 -0
  286. package/skills/weaver-e10-mail/references/mail-contacts.md +33 -0
  287. package/skills/weaver-e10-mail/references/mail-manage.md +44 -0
  288. package/skills/weaver-e10-mail/references/mail-read.md +76 -0
  289. package/skills/weaver-e10-mail/references/mail-send.md +43 -0
  290. package/skills/weaver-e10-mail/references/mail-sign.md +33 -0
  291. package/skills/weaver-e10-mail/references/mail-template.md +31 -0
  292. package/skills/weaver-e10-mail/references/safety-boundaries.md +32 -0
  293. package/skills/weaver-e10-meeting/SKILL.md +106 -0
  294. package/skills/weaver-e10-meeting/product.json +8 -0
  295. package/skills/weaver-e10-meeting/references/meeting-change.md +67 -0
  296. package/skills/weaver-e10-meeting/references/meeting-create.md +52 -0
  297. package/skills/weaver-e10-meeting/references/meeting-lifecycle.md +57 -0
  298. package/skills/weaver-e10-meeting/references/meeting-queries.md +61 -0
  299. package/skills/weaver-e10-meeting/references/meeting-receipts-signs.md +48 -0
  300. package/skills/weaver-e10-meeting/references/meeting-update.md +7 -0
  301. package/skills/weaver-e10-meeting/references/source-manifest.json +50 -0
  302. package/skills/weaver-e10-plan/SKILL.md +140 -0
  303. package/skills/weaver-e10-plan/product.json +8 -0
  304. package/skills/weaver-e10-plan/references/plan-collect-and-compose.md +123 -0
  305. package/skills/weaver-e10-plan/references/plan-overview-and-routing.md +138 -0
  306. package/skills/weaver-e10-plan/references/plan-report-query.md +154 -0
  307. package/skills/weaver-e10-plan/references/plan-report-remind.md +104 -0
  308. package/skills/weaver-e10-plan/references/plan-report-write.md +162 -0
  309. package/skills/weaver-e10-plan/references/source-manifest.json +858 -0
  310. package/skills/weaver-e10-qiyecheng/SKILL.md +119 -0
  311. package/skills/weaver-e10-qiyecheng/product.json +8 -0
  312. package/skills/weaver-e10-qiyecheng/references/budget.md +65 -0
  313. package/skills/weaver-e10-qiyecheng/references/catalog.md +56 -0
  314. package/skills/weaver-e10-qiyecheng/references/expense-center.md +51 -0
  315. package/skills/weaver-e10-qiyecheng/references/invoice-writeoff.md +57 -0
  316. package/skills/weaver-e10-qiyecheng/references/loan-management.md +59 -0
  317. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +698 -0
  318. package/skills/weaver-e10-shared/SKILL.md +90 -0
  319. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +127 -0
  320. package/skills/{weaver-work-cli-shared → weaver-e10-shared}/references/json-output-contract.md +34 -0
  321. package/skills/weaver-e10-shared/references/weaver-e10-installation.md +110 -0
  322. package/skills/weaver-e10-skill-maker/SKILL.md +78 -0
  323. package/skills/weaver-e10-skill-maker/product.json +8 -0
  324. package/skills/weaver-e10-skill-maker/references/business-skill-generation.md +124 -0
  325. package/skills/weaver-e10-skill-maker/references/detector-validation.md +101 -0
  326. package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +230 -0
  327. package/skills/weaver-e10-skill-maker/references/post-generation-install.md +105 -0
  328. package/skills/weaver-e10-skill-maker/references/source-update-detection.md +261 -0
  329. package/skills/weaver-e10-skill-maker/references/weaver-skill-style.md +141 -0
  330. package/skills/weaver-e10-wenshuding/SKILL.md +158 -0
  331. package/skills/weaver-e10-wenshuding/product.json +8 -0
  332. package/skills/weaver-e10-wenshuding/references/archive-agent-entry.md +63 -0
  333. package/skills/weaver-e10-wenshuding/references/archive-borrow-car.md +52 -0
  334. package/skills/weaver-e10-wenshuding/references/archive-borrow-list.md +52 -0
  335. package/skills/weaver-e10-wenshuding/references/archive-disabled-capabilities.md +22 -0
  336. package/skills/weaver-e10-wenshuding/references/archive-download.md +48 -0
  337. package/skills/weaver-e10-wenshuding/references/archive-flow.md +46 -0
  338. package/skills/weaver-e10-wenshuding/references/archive-fonds.md +34 -0
  339. package/skills/weaver-e10-wenshuding/references/archive-info.md +33 -0
  340. package/skills/weaver-e10-wenshuding/references/archive-search.md +52 -0
  341. package/skills/weaver-e10-wenshuding/references/archive-upload.md +41 -0
  342. package/skills/weaver-e10-wenshuding/references/source-manifest.json +517 -0
  343. package/skills/weaver-e10-yepiaotong/SKILL.md +184 -0
  344. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-add.md +1 -1
  345. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-agent-entry.md +16 -9
  346. package/skills/weaver-e10-yepiaotong/references/invoice-browse-field-data.md +204 -0
  347. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-delete.md +1 -1
  348. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-detail.md +13 -5
  349. package/skills/weaver-e10-yepiaotong/references/invoice-disabled-capabilities.md +28 -0
  350. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-download.md +9 -2
  351. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-enterprise-list.md +12 -4
  352. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-file-upload.md +9 -2
  353. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-import.md +16 -7
  354. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +120 -0
  355. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-field-rules.md +161 -0
  356. package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +99 -0
  357. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-ocr-preview.md +12 -4
  358. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-personal-list.md +12 -4
  359. package/skills/weaver-e10-yepiaotong/references/invoice-red.md +261 -0
  360. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +97 -0
  361. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-update.md +1 -1
  362. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-validation-preview.md +9 -2
  363. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +1340 -0
  364. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +845 -0
  365. package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +94 -0
  366. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +449 -0
  367. package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +266 -0
  368. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +494 -0
  369. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +1103 -0
  370. package/skills/weaver-e10-yimiaoban/SKILL.md +104 -0
  371. package/skills/weaver-e10-yimiaoban/product.json +8 -0
  372. package/skills/weaver-e10-yimiaoban/references/ding-write.md +68 -0
  373. package/skills/weaver-e10-yimiaoban/references/error-codes.md +85 -0
  374. package/skills/weaver-e10-yimiaoban/references/field-resolution.md +46 -0
  375. package/skills/weaver-e10-yimiaoban/references/file-user-i18n.md +54 -0
  376. package/skills/weaver-e10-yimiaoban/references/group-read.md +55 -0
  377. package/skills/weaver-e10-yimiaoban/references/group-write.md +72 -0
  378. package/skills/weaver-e10-yimiaoban/references/msg-read.md +59 -0
  379. package/skills/weaver-e10-yimiaoban/references/msg-write.md +64 -0
  380. package/skills/weaver-e10-yimiaoban/references/person.md +44 -0
  381. package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +61 -0
  382. package/skills/weaver-e10-yimiaoban/references/session-sysmsg.md +47 -0
  383. package/skills/weaver-e10-yimiaoban/references/source-manifest.json +485 -0
  384. package/skills/weaver-e10-ziguanjia/SKILL.md +163 -0
  385. package/skills/weaver-e10-ziguanjia/product.json +8 -0
  386. package/skills/weaver-e10-ziguanjia/references/source-manifest.json +147 -0
  387. package/skills/weaver-e10-ziguanjia/references/ziguanjia-agent-entry.md +65 -0
  388. package/skills/weaver-e10-ziguanjia/references/ziguanjia-create.md +45 -0
  389. package/skills/weaver-e10-ziguanjia/references/ziguanjia-depre.md +48 -0
  390. package/skills/weaver-e10-ziguanjia/references/ziguanjia-disabled-capabilities.md +22 -0
  391. package/skills/weaver-e10-ziguanjia/references/ziguanjia-purch.md +57 -0
  392. package/skills/weaver-e10-ziguanjia/references/ziguanjia-query.md +62 -0
  393. package/skills/weaver-e10-ziguanjia/references/ziguanjia-repair.md +83 -0
  394. package/skills/weaver-e10-ziguanjia/references/ziguanjia-resolve.md +49 -0
  395. package/skills/weaver-e10-ziguanjia/references/ziguanjia-return.md +70 -0
  396. package/skills/weaver-e10-ziguanjia/references/ziguanjia-update.md +45 -0
  397. package/skills/weaver-e10-ziguanjia/references/ziguanjia-use.md +60 -0
  398. package/skills/weaver-e10-ziguanjia/references/ziguanjia-viewlink.md +81 -0
  399. package/skills/weaver-work-cli-invoice/SKILL.md +0 -122
  400. package/skills/weaver-work-cli-invoice/references/invoice-disabled-capabilities.md +0 -26
  401. package/skills/weaver-work-cli-shared/SKILL.md +0 -63
  402. package/skills/weaver-work-cli-shared/references/e10-auth-and-session.md +0 -90
  403. package/skills/weaver-work-cli-shared/references/weaver-work-cli-installation.md +0 -73
  404. /package/skills/{weaver-work-cli-shared → weaver-e10-shared}/references/high-risk-write.md +0 -0
  405. /package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/product.json +0 -0
@@ -0,0 +1,102 @@
1
+ import { ymbValidationError } from '../errors.js';
2
+ import { READ, schemaOf, ymbSuccess, } from './types.js';
3
+ import { splitIds } from './shared.js';
4
+ /** 姓名 → 人员解析(数据采集走 hrm,不用 IM 群成员姓名接口)。 */
5
+ const personResolve = {
6
+ name: 'yimiaoban.person.resolve',
7
+ resource: 'person',
8
+ method: 'person.resolve',
9
+ action: 'yimiaoban.person.resolve',
10
+ summary: '按姓名/工号/手机/邮箱模糊查询在职员工,返回 uid/cid/部门等(供发消息与成员解析)',
11
+ capability: 'person',
12
+ risk: READ,
13
+ inputSchema: schemaOf({
14
+ name: { type: 'string', minLength: 1, description: '姓名(模糊)/工号/手机/邮箱' },
15
+ }, { required: ['name'], description: '人员解析:输入一个查询关键字' }),
16
+ handler: async (args, { host }) => {
17
+ const name = String(args.name ?? '').trim();
18
+ if (!name)
19
+ throw ymbValidationError('name_required', 'name 必填');
20
+ const employees = await host.searchEmployeeByName(name);
21
+ const rows = employees.map((e) => ({
22
+ uid: e.uid,
23
+ name: e.name,
24
+ department: e.department,
25
+ departmentId: e.departmentId,
26
+ subCompany: e.subCompany,
27
+ position: e.position,
28
+ jobNum: e.jobNum,
29
+ mobile: e.mobile,
30
+ cid: e.cid,
31
+ ok: Boolean(e.uid && e.cid && e.uid !== '0' && e.cid !== '0'),
32
+ }));
33
+ return ymbSuccess('yimiaoban.person.resolve', {
34
+ total: rows.length,
35
+ keyword: name,
36
+ employees: rows,
37
+ });
38
+ },
39
+ };
40
+ /** uid 批量解析(emp-by-ids 语义)。 */
41
+ const personResolveByIds = {
42
+ name: 'yimiaoban.person.resolveByIds',
43
+ resource: 'person',
44
+ method: 'person.resolveByIds',
45
+ action: 'yimiaoban.person.resolveByIds',
46
+ summary: '按 uid 列表批量解析人员姓名/部门/岗位/cid(一次最多 100,超出自动分批)',
47
+ capability: 'person',
48
+ risk: READ,
49
+ inputSchema: schemaOf({
50
+ ids: { type: 'array', items: { type: 'string' }, description: '人员 uid 列表' },
51
+ }, { required: ['ids'], description: '按 id 批量解析人员' }),
52
+ handler: async (args, { host }) => {
53
+ const ids = Array.isArray(args.ids) ? args.ids.map((x) => String(x)).filter(Boolean) : [];
54
+ if (ids.length === 0)
55
+ throw ymbValidationError('ids_required', 'ids 不能为空');
56
+ const map = await host.resolveUsersByIds(ids);
57
+ return ymbSuccess('yimiaoban.person.resolveByIds', {
58
+ requested: ids.length,
59
+ resolved: Object.keys(map).length,
60
+ employees: ids
61
+ .map((uid) => map[uid])
62
+ .filter(Boolean)
63
+ .map((u) => ({
64
+ uid: u.uid,
65
+ name: u.name,
66
+ department: u.department,
67
+ departmentId: u.departmentId,
68
+ subCompany: u.subCompany,
69
+ position: u.position,
70
+ jobNum: u.jobNum,
71
+ mobile: u.mobile,
72
+ cid: u.cid,
73
+ ok: Boolean(u.uid && u.cid && u.uid !== '0' && u.cid !== '0'),
74
+ })),
75
+ });
76
+ },
77
+ };
78
+ /** 成员 uid 列表 → [{cid, uid}],失败者进 failed(cid 来自成员自身 hrm 解析,可能跨团队)。 */
79
+ async function resolveMemberUsers(uidListRaw, host) {
80
+ const uidArr = Array.isArray(uidListRaw)
81
+ ? uidListRaw.map((x) => String(x)).filter(Boolean)
82
+ : splitIds(uidListRaw, 'users');
83
+ const map = await host.resolveUsersByIds(uidArr);
84
+ const users = [];
85
+ const failed = [];
86
+ for (const uid of uidArr) {
87
+ const u = map[uid];
88
+ const cid = u?.cid ?? '';
89
+ const uidOk = uid !== '' && uid !== '0';
90
+ if (!uidOk || !cid || cid === '0') {
91
+ failed.push({ uid, name: u?.name || '' });
92
+ continue;
93
+ }
94
+ users.push({ cid, uid });
95
+ }
96
+ return { users, failed };
97
+ }
98
+ export { resolveMemberUsers };
99
+ export const personOperations = [
100
+ personResolve,
101
+ personResolveByIds,
102
+ ];
@@ -0,0 +1,38 @@
1
+ import { ymbValidationError } from '../errors.js';
2
+ import { groupReadOperations } from './group-read.js';
3
+ import { groupWriteOperations } from './group-write.js';
4
+ import { msgReadOperations } from './msg-sync.js';
5
+ import { msgWriteOperations } from './msg-write.js';
6
+ import { sessionOperations } from './session.js';
7
+ import { personOperations } from './person.js';
8
+ import { fileUserOperations } from './file-user.js';
9
+ function buildRegistry() {
10
+ const registry = new Map();
11
+ const definitions = [
12
+ ...personOperations,
13
+ ...msgReadOperations,
14
+ ...msgWriteOperations,
15
+ ...groupReadOperations,
16
+ ...groupWriteOperations,
17
+ ...sessionOperations,
18
+ ...fileUserOperations,
19
+ ];
20
+ for (const definition of definitions) {
21
+ if (registry.has(definition.name)) {
22
+ throw new Error(`duplicate yimiaoban operation: ${definition.name}`);
23
+ }
24
+ registry.set(definition.name, definition);
25
+ }
26
+ return registry;
27
+ }
28
+ const ymbOperationRegistry = buildRegistry();
29
+ export function ymbOperationDefinitions() {
30
+ return [...ymbOperationRegistry.values()];
31
+ }
32
+ export function getYmbOperation(operation) {
33
+ const definition = ymbOperationRegistry.get(operation);
34
+ if (!definition) {
35
+ throw ymbValidationError('operation_unknown', `易秒办不支持操作:${operation}`);
36
+ }
37
+ return definition;
38
+ }
@@ -0,0 +1,437 @@
1
+ import { ymbValidationError } from '../errors.js';
2
+ import { READ, schemaOf, ymbSuccess, } from './types.js';
3
+ import { assertImOk, formatFullTime, parseMsg, resolveAuthUid, str, toUint, unwrapInner, } from './shared.js';
4
+ import { collapseNewlines, escapePipe, extractFiles, extractImgs, extractVideos, parseContent, senderName, } from './msg-parse.js';
5
+ const MAX_MSG_ID = String((1n << 63n) - 1n);
6
+ const DEFAULT_PAGE_SIZE = 20;
7
+ const MAX_PAGE_SIZE = 50;
8
+ /** 会话类型归类。 */
9
+ export function sessionTypeName(type) {
10
+ if ([1, 6, 9].includes(type))
11
+ return '单聊';
12
+ if ([2, 3, 7, 11].includes(type))
13
+ return '群聊';
14
+ if ([4, 10].includes(type))
15
+ return '系统';
16
+ return '其它';
17
+ }
18
+ /** 会话列表。 */
19
+ const sessionList = {
20
+ name: 'yimiaoban.session.list',
21
+ resource: 'session',
22
+ method: 'session.list',
23
+ action: 'yimiaoban.session.list',
24
+ summary: '拉取当前用户会话列表(单聊/群聊/系统消息,解析名称与副标题)',
25
+ capability: 'session',
26
+ risk: READ,
27
+ inputSchema: schemaOf({
28
+ num: { type: 'integer', minimum: 1, maximum: 50, description: '单页条数(默认 20)' },
29
+ msgid: { type: 'string', description: '锚点消息 id(默认 int64 max 从最新)' },
30
+ flag: { type: 'integer', enum: [0, 1, 2], description: '0 up+down / 1 up / 2 down(默认 2)' },
31
+ type: { type: 'integer', description: '仅展示该 session_type' },
32
+ around: { type: 'boolean', description: '附近语义(flag=0 且 up/down 各半)' },
33
+ }, { description: '拉取会话列表' }),
34
+ handler: async (args, { host }) => {
35
+ const num = Math.min(toUint(args.num, 'num') ?? DEFAULT_PAGE_SIZE, MAX_PAGE_SIZE);
36
+ const flag = args.flag !== undefined ? Number(args.flag) : 2;
37
+ const around = args.around === true;
38
+ const curAnchor = args.msgid !== undefined && args.msgid !== '' ? String(args.msgid) : MAX_MSG_ID;
39
+ const isNewestAnchor = curAnchor === MAX_MSG_ID;
40
+ const splitUpDown = around || (flag === 0 && !isNewestAnchor);
41
+ const half = Math.floor(num / 2);
42
+ const downSize = splitUpDown ? Math.max(half, 1) : num;
43
+ const upSize = splitUpDown ? Math.max(num - half, 1) : num;
44
+ const body = {
45
+ msgid: curAnchor,
46
+ flag,
47
+ view: 0,
48
+ sview: 0,
49
+ reminder: 0,
50
+ top: 1,
51
+ };
52
+ if (flag !== 2)
53
+ body.up = { page_size: upSize, msgid: '0' };
54
+ if (flag !== 1)
55
+ body.down = { page_size: downSize, msgid: '0' };
56
+ const res = await host.request({
57
+ method: 'POST',
58
+ path: '/api/em/msg/executeIm/data/getSessionContext',
59
+ body,
60
+ operation: 'yimiaoban.session.list',
61
+ });
62
+ assertImOk(res, '拉取会话列表');
63
+ const inner = unwrapInner(res);
64
+ const sessions = [...(inner?.down_datas || []), ...(inner?.up_datas || [])];
65
+ // 批量收集需要解析的对象:单聊对方 fuser / 群 id / 系统 group id
66
+ const singleTargets = new Map();
67
+ const groupIds = new Set();
68
+ const sysGroupIds = new Set();
69
+ for (const s of sessions) {
70
+ const type = Number(s?.session_type ?? -1);
71
+ if ([1, 6, 9].includes(type) && s?.fuser?.uid) {
72
+ singleTargets.set(String(s.fuser.uid), { cid: str(s.fuser.cid), uid: str(s.fuser.uid) });
73
+ }
74
+ else if ([2, 3, 7, 11].includes(type) && s?.group_id) {
75
+ groupIds.add(String(s.group_id));
76
+ }
77
+ else if ([4, 10].includes(type) && s?.group) {
78
+ sysGroupIds.add(Number(s.group));
79
+ }
80
+ }
81
+ const [personMap, groupRes] = await Promise.all([
82
+ host.resolveUsersByIds([...singleTargets.keys()]),
83
+ groupIds.size ? host.request({ method: 'POST', path: '/api/em/msg/executeIm/group/queryGroupInfo', body: { trans_id: 0, type: 0, mask: 0, group_id: [...groupIds], flag: 0 }, operation: 'yimiaoban.session.list.groups' }) : Promise.resolve(null),
84
+ ]);
85
+ const groupInfoMap = new Map();
86
+ if (groupRes) {
87
+ const gi = unwrapInner(groupRes)?.datas || [];
88
+ for (const g of gi)
89
+ if (g?.name)
90
+ groupInfoMap.set(str(g.group_id ?? g.id), g.name);
91
+ }
92
+ const sysNameMap = new Map();
93
+ if (sysGroupIds.size) {
94
+ const sysRes = await host.request({
95
+ method: 'POST',
96
+ path: '/api/em/msg/executeIm/system-msg/syncGroupType',
97
+ body: { gids: [...sysGroupIds], tids: [], lang: 'zh_CN', showdel: 1 },
98
+ operation: 'yimiaoban.session.list.sysgroups',
99
+ });
100
+ const sg = unwrapInner(sysRes)?.groups || [];
101
+ for (const g of sg)
102
+ if (g?.groupName)
103
+ sysNameMap.set(Number(g.groupId), g.groupName);
104
+ }
105
+ const rows = [];
106
+ for (const s of sessions) {
107
+ const type = Number(s?.session_type ?? -1);
108
+ const typeName = sessionTypeName(type);
109
+ let name = '';
110
+ if ([1, 6, 9].includes(type)) {
111
+ const target = singleTargets.get(str(s?.fuser?.uid));
112
+ name = target ? (personMap[target.uid]?.name || target.uid) : str(s?.name || s?.title || '');
113
+ }
114
+ else if ([2, 3, 7, 11].includes(type)) {
115
+ name = groupInfoMap.get(str(s?.group_id)) || str(s?.group_id);
116
+ }
117
+ else if ([4, 10].includes(type)) {
118
+ name = sysNameMap.get(Number(s?.group)) || str(s?.group);
119
+ }
120
+ else {
121
+ name = str(s?.name || s?.title || '');
122
+ }
123
+ // 未读数取 unread_count;免打扰取 reminder=1(消息接收但不提醒);时间取会话更新时间 update_tm
124
+ const unread = s?.unread_count ?? s?.unread ?? 0;
125
+ const dontDisturb = Number(s?.reminder ?? s?.reminder_type ?? 0) === 1;
126
+ // 副标题 = 发送者:内容(从 title 解析)
127
+ const titleRaw = s?.title;
128
+ const titleObj = typeof titleRaw === 'string' ? parseMsg(titleRaw) : (titleRaw && typeof titleRaw === 'object' ? titleRaw : null);
129
+ let subtitleSender = '';
130
+ let subtitleContent = '';
131
+ let subtitleMedia = '';
132
+ if (titleObj) {
133
+ const parsed = parseContent(titleObj, { i18nMap: {}, nameMap: {} });
134
+ const sname = str(titleObj.sname);
135
+ if (sname)
136
+ subtitleSender = sname;
137
+ else if (titleObj.scid || titleObj.suid) {
138
+ const hit = await host.resolveUsersByIds([str(titleObj.suid)]);
139
+ subtitleSender = hit[str(titleObj.suid)]?.name || str(titleObj.suid);
140
+ }
141
+ const imgs = extractImgs(titleObj);
142
+ const videos = extractVideos(titleObj);
143
+ const files = extractFiles(titleObj);
144
+ if (imgs.length)
145
+ subtitleMedia = `[图片]${imgs[0].name}`;
146
+ else if (videos.length)
147
+ subtitleMedia = `[视频]${videos[0].name}`;
148
+ else if (files.length)
149
+ subtitleMedia = `[文件]${files[0].name}`;
150
+ const mustFlag = Number(titleObj.tf ?? 0) & 0x01;
151
+ const prefix = mustFlag ? '[必达]' : '';
152
+ subtitleContent = subtitleMedia ? `${prefix}${subtitleMedia}` : `${prefix}${collapseNewlines(parsed.content)}`;
153
+ }
154
+ else {
155
+ subtitleContent = collapseNewlines(String(titleRaw ?? ''));
156
+ }
157
+ const subtitle = subtitleSender ? `${subtitleSender}:${subtitleContent}` : subtitleContent;
158
+ rows.push({
159
+ sessionId: str(s?.session_id ?? s?.id ?? ''),
160
+ sessionType: type,
161
+ sessionTypeName: typeName,
162
+ name,
163
+ unread: Number(unread),
164
+ dontDisturb,
165
+ unreadLabel: Number(unread) > 0 ? (dontDisturb ? `${unread}(免打扰)` : String(unread)) : '',
166
+ time: formatFullTime(s?.update_tm ?? s?.update_time ?? s?.last_time ?? s?.create),
167
+ subtitle,
168
+ lastMsgid: str(s?.last_msgid ?? ''),
169
+ });
170
+ }
171
+ rows.sort((a, b) => (BigInt(a.lastMsgid || '0') < BigInt(b.lastMsgid || '0') ? 1 : -1));
172
+ const filterType = args.type !== undefined ? Number(args.type) : undefined;
173
+ const filtered = filterType !== undefined ? rows.filter((r) => r.sessionType === filterType) : rows;
174
+ const minLast = filtered.length ? filtered[filtered.length - 1].lastMsgid : '';
175
+ return ymbSuccess('yimiaoban.session.list', {
176
+ total: filtered.length,
177
+ sessions: filtered,
178
+ nextMsgid: minLast && BigInt(minLast) > 0n ? minLast : undefined,
179
+ hasMore: filtered.length > 0,
180
+ pageSize: num,
181
+ });
182
+ },
183
+ };
184
+ /** 系统消息分组配置搜索。 */
185
+ const sysmsgGroupSearch = {
186
+ name: 'yimiaoban.sysmsg.groupSearch',
187
+ resource: 'sysmsg',
188
+ method: 'sysmsg.groupSearch',
189
+ action: 'yimiaoban.sysmsg.groupSearch',
190
+ summary: '按名称搜索系统消息分组/类型配置(供 querySysMsgInfo 使用)',
191
+ capability: 'sysmsg',
192
+ risk: READ,
193
+ inputSchema: schemaOf({
194
+ name: { type: 'string', minLength: 1, description: '分组/类型名称(模糊)' },
195
+ type: { type: 'integer', enum: [0, 1], description: '0 搜 group(默认)/1 搜 type' },
196
+ }, { required: ['name'], description: '搜索系统消息分组配置' }),
197
+ handler: async (args, { host }) => {
198
+ const body = {
199
+ data: {
200
+ cond: { mask: 1, groupName: String(args.name) },
201
+ lang: 'zh_CN',
202
+ page: { current: 1, pageSize: 30 },
203
+ type: Number(args.type ?? 0),
204
+ order: 0,
205
+ },
206
+ };
207
+ const res = await host.request({
208
+ method: 'POST',
209
+ path: '/api/em/msg/executeIm/system-msg/searchSysMsgGroup',
210
+ body,
211
+ operation: 'yimiaoban.sysmsg.groupSearch',
212
+ });
213
+ assertImOk(res, '搜索系统消息分组');
214
+ const inner = unwrapInner(res);
215
+ const groups = (inner?.groups || []).map((g) => ({
216
+ groupId: g.groupId,
217
+ groupName: g.groupName,
218
+ typesIds: g.typesIds || [],
219
+ i18nName: g.i18nName,
220
+ enable: g.enable,
221
+ state: g.state,
222
+ }));
223
+ const types = (inner?.types || []).map((t) => ({
224
+ typeId: t.typeId,
225
+ typeName: t.typeName,
226
+ i18nName: t.i18nName,
227
+ state: t.state,
228
+ }));
229
+ return ymbSuccess('yimiaoban.sysmsg.groupSearch', { groups, types, total: Math.max(groups.length, types.length) });
230
+ },
231
+ };
232
+ /** 系统消息分组/类型配置拉取。 */
233
+ const sysmsgTypeSync = {
234
+ name: 'yimiaoban.sysmsg.typeSync',
235
+ resource: 'sysmsg',
236
+ method: 'sysmsg.typeSync',
237
+ action: 'yimiaoban.sysmsg.typeSync',
238
+ summary: '按 gids/tids 拉取系统消息分组/类型配置',
239
+ capability: 'sysmsg',
240
+ risk: READ,
241
+ inputSchema: schemaOf({
242
+ gids: { type: 'array', items: { type: 'integer' }, description: '系统分组 id(与 tids 至少其一)' },
243
+ tids: { type: 'array', items: { type: 'integer' }, description: '消息类型 id' },
244
+ }, { description: 'gids / tids 至少其一' }),
245
+ handler: async (args, { host }) => {
246
+ const gids = Array.isArray(args.gids) ? args.gids.map((x) => Number(x)).filter((n) => Number.isInteger(n)) : [];
247
+ const tids = Array.isArray(args.tids) ? args.tids.map((x) => Number(x)).filter((n) => Number.isInteger(n)) : [];
248
+ if (!gids.length && !tids.length)
249
+ throw ymbValidationError('target_required', 'gids 与 tids 至少其一');
250
+ const body = { gids, tids, lang: 'zh_CN', showdel: 1 };
251
+ const res = await host.request({
252
+ method: 'POST',
253
+ path: '/api/em/msg/executeIm/system-msg/syncGroupType',
254
+ body,
255
+ operation: 'yimiaoban.sysmsg.typeSync',
256
+ });
257
+ assertImOk(res, '同步系统消息配置');
258
+ const inner = unwrapInner(res);
259
+ const groups = (inner?.groups || []).map((g) => ({
260
+ groupId: g.groupId,
261
+ groupName: g.groupName,
262
+ typesIds: g.typesIds || [],
263
+ i18nName: g.i18nName,
264
+ enable: g.enable,
265
+ state: g.state,
266
+ sunread: g.sunread,
267
+ }));
268
+ const types = (inner?.types || []).map((t) => ({
269
+ typeId: t.typeId,
270
+ typeName: t.typeName,
271
+ i18nName: t.i18nName,
272
+ state: t.state,
273
+ }));
274
+ return ymbSuccess('yimiaoban.sysmsg.typeSync', { groups, types });
275
+ },
276
+ };
277
+ /** 系统消息内容拉取。 */
278
+ const sysmsgQuery = {
279
+ name: 'yimiaoban.sysmsg.query',
280
+ resource: 'sysmsg',
281
+ method: 'sysmsg.query',
282
+ action: 'yimiaoban.sysmsg.query',
283
+ summary: '拉取系统消息(流程/任务/公文等),支持阅读维度/处理状态/时间范围/单页倒序',
284
+ capability: 'sysmsg',
285
+ risk: READ,
286
+ inputSchema: schemaOf({
287
+ group: { type: 'integer', minimum: 1, description: '系统分组 id' },
288
+ type: { type: 'integer', description: '消息类型 id' },
289
+ num: { type: 'integer', minimum: 1, maximum: 50, description: '单页条数(默认 20)' },
290
+ flag: { type: 'integer', enum: [0, 1, 2], description: '0 不分(默认)/1 已读/2 未读' },
291
+ deal: { type: 'integer', enum: [0, 1, 2], description: '0 全部(默认)/1 未处理/2 已处理' },
292
+ from: { type: 'string', description: '起始时间' },
293
+ to: { type: 'string', description: '结束时间' },
294
+ latest: { type: 'boolean', description: '拉最新不限日期' },
295
+ start: { type: 'string', description: '手动起始消息 id(最高优先)' },
296
+ end: { type: 'string', description: '手动结束消息 id' },
297
+ }, { required: ['group'], description: '拉取系统消息' }),
298
+ handler: async (args, { host }) => {
299
+ const group = toUint(args.group, 'group');
300
+ if (group === undefined || group <= 0) {
301
+ throw ymbValidationError('group_required', 'group(系统消息分组 id,来自 sysmsg.groupSearch 或会话列表)必填且为正整数');
302
+ }
303
+ const hasType = args.type !== undefined && args.type !== null && args.type !== '';
304
+ const msgType = { group };
305
+ if (hasType)
306
+ msgType.type = toUint(args.type, 'type');
307
+ // start/end 计算
308
+ let start = MAX_MSG_ID;
309
+ let end = '0';
310
+ if (args.start !== undefined && args.start !== null && args.start !== '') {
311
+ start = String(args.start);
312
+ end = args.end !== undefined && args.end !== '' ? String(args.end) : '0';
313
+ }
314
+ else if (args.latest !== true && (args.from || args.to)) {
315
+ const fromSec = args.from ? parseTs(args.from, false) : 0;
316
+ const toSec = args.to ? parseTs(args.to, true) : 0;
317
+ if (toSec > 0)
318
+ start = idRange(toSec).max;
319
+ if (fromSec > 0)
320
+ end = idRange(fromSec).min;
321
+ }
322
+ else if (args.latest !== true) {
323
+ // 默认当天
324
+ const now = new Date();
325
+ const from = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0);
326
+ const to = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59);
327
+ start = idRange(Math.floor(to.getTime() / 1000)).max;
328
+ end = idRange(Math.floor(from.getTime() / 1000)).min;
329
+ }
330
+ const num = Math.min(toUint(args.num, 'num') ?? 20, MAX_PAGE_SIZE);
331
+ const body = {
332
+ trans_id: 0,
333
+ dev: 4,
334
+ enc_type: 0,
335
+ flag: Number(args.flag ?? 0),
336
+ deal_status: Number(args.deal ?? 0),
337
+ datas: [{ msg_type: msgType, max_num: num, start, end }],
338
+ };
339
+ const res = await host.request({
340
+ method: 'POST',
341
+ path: '/api/em/msg/executeIm/system-msg/querySysMsgInfo',
342
+ body,
343
+ operation: 'yimiaoban.sysmsg.query',
344
+ });
345
+ assertImOk(res, '拉取系统消息');
346
+ const inner = unwrapInner(res);
347
+ const rawRows = inner?.datas || [];
348
+ // 状态模式:查 group 配置的 sunread(1=处理状态 / 0=阅读状态)
349
+ let dealMode = false;
350
+ try {
351
+ const cfgRes = await host.request({
352
+ method: 'POST',
353
+ path: '/api/em/msg/executeIm/system-msg/syncGroupType',
354
+ body: { gids: [group], tids: [], lang: 'zh_CN', showdel: 1 },
355
+ operation: 'yimiaoban.sysmsg.query.cfg',
356
+ });
357
+ const cfg = unwrapInner(cfgRes)?.groups?.[0];
358
+ dealMode = Number(cfg?.sunread) === 1;
359
+ }
360
+ catch { /* 配置获取失败按阅读模式处理 */ }
361
+ const msgRows = rawRows.map((r) => ({
362
+ msg: r?.msg,
363
+ ser_msgid: r?.ser_msgid,
364
+ from_uid: r?.from_uid,
365
+ msgtime: r?.msgtime,
366
+ read_status: r?.read_status,
367
+ deal_status: r?.deal_status,
368
+ }));
369
+ // 富化
370
+ const { collectI18nIds, collectPersonIds } = await import('./msg-parse.js');
371
+ const i18nIds = collectI18nIds(msgRows);
372
+ const personIds = collectPersonIds(msgRows);
373
+ for (const r of msgRows)
374
+ if (r.from_uid)
375
+ personIds.push(String(r.from_uid));
376
+ const [i18nMap, personMap] = await Promise.all([
377
+ host.fetchI18nLabels(i18nIds),
378
+ host.resolveUsersByIds([...new Set(personIds)]),
379
+ ]);
380
+ const nameMap = {};
381
+ for (const [uid, p] of Object.entries(personMap))
382
+ nameMap[uid] = p.name;
383
+ const authUid = await resolveAuthUid(host);
384
+ const messages = msgRows.map((row) => {
385
+ const msgObj = parseMsg(row.msg);
386
+ const parsed = parseContent(msgObj, { i18nMap, nameMap });
387
+ const sender = senderName(msgObj || {}, row.from_uid, authUid, nameMap);
388
+ const statusLabel = dealMode
389
+ ? (Number(row.deal_status) === 1 ? '已处理' : '未处理')
390
+ : (row.read_status === true || row.read_status === 1 ? '已读' : '未读');
391
+ return {
392
+ msgid: str(row.ser_msgid),
393
+ sender,
394
+ time: formatFullTime(row.msgtime),
395
+ title: parsed.title,
396
+ content: escapePipe(collapseNewlines(parsed.content)),
397
+ typeName: parsed.typeName,
398
+ must: parsed.must,
399
+ statusLabel,
400
+ };
401
+ });
402
+ return ymbSuccess('yimiaoban.sysmsg.query', {
403
+ group,
404
+ type: hasType ? Number(args.type) : undefined,
405
+ dealMode,
406
+ total: messages.length,
407
+ messages,
408
+ start,
409
+ end,
410
+ hasMore: messages.length >= num,
411
+ });
412
+ },
413
+ };
414
+ function parseTs(value, isEnd) {
415
+ const s = String(value ?? '').trim();
416
+ if (/^\d{10}$/.test(s))
417
+ return Number(s);
418
+ const m = s.match(/^(\d{4})-(\d{1,2})-(\d{1,2})(?:[ T](\d{1,2}):(\d{1,2})(?::(\d{1,2}))?)?$/);
419
+ if (!m)
420
+ throw ymbValidationError('time_invalid', `无法解析时间参数: ${s}`);
421
+ const hh = m[4] !== undefined ? Number(m[4]) : (isEnd ? 23 : 0);
422
+ const mm = m[5] !== undefined ? Number(m[5]) : (isEnd ? 59 : 0);
423
+ const ss = m[6] !== undefined ? Number(m[6]) : (isEnd ? 59 : 0);
424
+ return Math.floor(new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]), hh, mm, ss).getTime() / 1000);
425
+ }
426
+ function idRange(tmSec) {
427
+ if (!tmSec || tmSec <= 0)
428
+ return { min: '0', max: '0' };
429
+ const base = BigInt(Math.floor(tmSec)) * 1000000000n;
430
+ return { min: base.toString(), max: (base + 999999999n).toString() };
431
+ }
432
+ export const sessionOperations = [
433
+ sessionList,
434
+ sysmsgGroupSearch,
435
+ sysmsgTypeSync,
436
+ sysmsgQuery,
437
+ ];