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,401 @@
1
+ import { InvoiceCliError, invoiceConfirmationError, invoicePartialError, invoiceValidationError, isInvoiceNetworkError } from '../errors.js';
2
+ import { asNonEmptyString, asObject, assertBusinessSuccess, normalizeIdList, objectFingerprint, sessionMatches, workflow, } from './shared.js';
3
+ function integerInput(value, name, options = {}) {
4
+ const min = options.min ?? 1;
5
+ const max = options.max ?? 200;
6
+ const defaultValue = options.defaultValue ?? min;
7
+ const parsed = value === undefined ? defaultValue : Number(value);
8
+ if (!Number.isInteger(parsed) || parsed < min || parsed > max) {
9
+ throw invoiceValidationError('input_invalid', `${name} 必须是 ${min}-${max} 的整数`);
10
+ }
11
+ return parsed;
12
+ }
13
+ function optionalString(value, name) {
14
+ if (value === undefined || value === null || value === '')
15
+ return undefined;
16
+ return asNonEmptyString(value, name);
17
+ }
18
+ function optionalDate(value, name) {
19
+ const text = optionalString(value, name);
20
+ if (text === undefined)
21
+ return undefined;
22
+ if (!/^\d{4}-\d{2}-\d{2}$/u.test(text)) {
23
+ throw invoiceValidationError('input_invalid', `${name} 必须是 YYYY-MM-DD`);
24
+ }
25
+ return text;
26
+ }
27
+ function responseData(value) {
28
+ return value && typeof value === 'object' && 'data' in value ? value.data : value;
29
+ }
30
+ function resultEnvelope(value, workflowName) {
31
+ assertBusinessSuccess(value, `${workflowName}_failed`, '接口返回业务失败');
32
+ return {
33
+ status: 'COMPLETE',
34
+ data: {
35
+ result: value,
36
+ data: responseData(value),
37
+ workflow: workflow(workflowName, 'COMPLETE'),
38
+ },
39
+ };
40
+ }
41
+ const UNSAFE_JSON_INTEGER_ID = /("id"\s*:\s*)(-?\d{16,})(?=\s*[,}\]])/g;
42
+ function quoteEmployeeIdsInJsonText(text) {
43
+ return text.replace(UNSAFE_JSON_INTEGER_ID, '$1"$2"');
44
+ }
45
+ function employeeIdString(value) {
46
+ if (typeof value === 'bigint')
47
+ return value.toString();
48
+ if (typeof value === 'number' && Number.isFinite(value))
49
+ return String(Math.trunc(value));
50
+ if (typeof value === 'string')
51
+ return value;
52
+ return value;
53
+ }
54
+ function stringifyEmployeeRecordId(employee) {
55
+ if (!employee || typeof employee !== 'object' || Array.isArray(employee))
56
+ return employee;
57
+ const record = employee;
58
+ if (!('id' in record))
59
+ return employee;
60
+ return { ...record, id: employeeIdString(record.id) };
61
+ }
62
+ function stringifyEmployeeSuperiorsPayload(payload) {
63
+ if ('currentEmployee' in payload) {
64
+ payload.currentEmployee = stringifyEmployeeRecordId(payload.currentEmployee);
65
+ }
66
+ if (Array.isArray(payload.allSuperiors)) {
67
+ payload.allSuperiors = payload.allSuperiors.map(stringifyEmployeeRecordId);
68
+ }
69
+ }
70
+ function stringifyEmployeeSuperiorsIds(value) {
71
+ if (!value || typeof value !== 'object')
72
+ return value;
73
+ const cloned = structuredClone(value);
74
+ stringifyEmployeeSuperiorsPayload(cloned);
75
+ if (cloned.data && typeof cloned.data === 'object' && !Array.isArray(cloned.data)) {
76
+ stringifyEmployeeSuperiorsPayload(cloned.data);
77
+ }
78
+ return cloned;
79
+ }
80
+ function employeeSuperiorsEnvelope(value) {
81
+ return resultEnvelope(stringifyEmployeeSuperiorsIds(value), 'invoice.reim.employee-superiors');
82
+ }
83
+ function ensureFlowCreatePayload(payload) {
84
+ const value = structuredClone(asObject(payload, 'payload'));
85
+ asNonEmptyString(value.work_flow_id, 'payload.work_flow_id');
86
+ asNonEmptyString(value.mainFormId, 'payload.mainFormId');
87
+ asNonEmptyString(value.request_name, 'payload.request_name');
88
+ if (!Array.isArray(value.main_fields))
89
+ throw invoiceValidationError('input_invalid', 'payload.main_fields 必须是数组');
90
+ if (!Array.isArray(value.detail_rows) || value.detail_rows.length === 0) {
91
+ throw invoiceValidationError('input_invalid', 'payload.detail_rows 必须是非空数组');
92
+ }
93
+ return value;
94
+ }
95
+ function ensureFlowUpdatePayload(payload) {
96
+ const value = structuredClone(asObject(payload, 'payload'));
97
+ asNonEmptyString(value.requestId, 'payload.requestId');
98
+ asNonEmptyString(value.mainFormId, 'payload.mainFormId');
99
+ const hasMain = Array.isArray(value.main_fields) && value.main_fields.length > 0;
100
+ const hasDetails = Array.isArray(value.detail_rows) && value.detail_rows.length > 0;
101
+ const hasDeletes = Array.isArray(value.deleteDetailRows) && value.deleteDetailRows.length > 0;
102
+ if (!hasMain && !hasDetails && !hasDeletes) {
103
+ throw invoiceValidationError('input_invalid', 'payload 必须包含 main_fields、detail_rows 或 deleteDetailRows 至少一类变更');
104
+ }
105
+ return value;
106
+ }
107
+ function flowPreview(payload) {
108
+ return {
109
+ requestName: payload.request_name || '',
110
+ workflowId: payload.work_flow_id || '',
111
+ mainFormId: payload.mainFormId || '',
112
+ mainFieldCount: Array.isArray(payload.main_fields) ? payload.main_fields.length : 0,
113
+ detailRowCount: Array.isArray(payload.detail_rows) ? payload.detail_rows.length : 0,
114
+ };
115
+ }
116
+ function updatePreview(payload) {
117
+ return {
118
+ requestId: String(payload.requestId),
119
+ mainFormId: payload.mainFormId,
120
+ mainFieldCount: Array.isArray(payload.main_fields) ? payload.main_fields.length : 0,
121
+ detailRowCount: Array.isArray(payload.detail_rows) ? payload.detail_rows.length : 0,
122
+ deleteDetailRowCount: Array.isArray(payload.deleteDetailRows) ? payload.deleteDetailRows.length : 0,
123
+ };
124
+ }
125
+ export class InvoiceReimFileOcrPreviewOperation {
126
+ name = 'invoice.reim.file-ocr.preview';
127
+ async execute(input, { host }) {
128
+ if (input.fileId !== undefined && input.fileIds !== undefined)
129
+ throw invoiceValidationError('input_ambiguous', 'fileId 与 fileIds 只能提供一个');
130
+ const fileIds = input.fileId === undefined
131
+ ? normalizeIdList(input.fileIds, 'fileIds')
132
+ : normalizeIdList(input.fileId, 'fileId', { allowCommaString: true });
133
+ const result = await host.invoiceMultipartRequest({
134
+ path: '/api/inc/book/fileIdToInvoicesAndOcr',
135
+ fields: { fileIds },
136
+ timeoutMs: 90_000,
137
+ operation: this.name,
138
+ });
139
+ assertBusinessSuccess(result, 'reim_file_ocr_failed', '文件 ID 转发票识别失败');
140
+ const items = Array.isArray(result.data) ? result.data : [];
141
+ const succeeded = items.filter((item) => item?.status === 'success');
142
+ const failed = items.filter((item) => item?.status !== 'success');
143
+ if (!succeeded.length && failed.length) {
144
+ throw new InvoiceCliError('api', 'reim_file_ocr_all_failed', failed[0]?.errorMsg || '文件 ID 识别没有成功发票', {
145
+ details: { failed, result },
146
+ exitCode: 1,
147
+ });
148
+ }
149
+ return {
150
+ status: failed.length ? 'PARTIAL' : 'COMPLETE',
151
+ data: { items: succeeded, failed, result, workflow: workflow('invoice.reim.file-ocr', failed.length ? 'PARTIAL' : 'COMPLETE') },
152
+ };
153
+ }
154
+ }
155
+ export class InvoiceReimRequestsListOperation {
156
+ name = 'invoice.reim.requests.list';
157
+ async execute(input, { host }) {
158
+ const body = {
159
+ pageNo: integerInput(input.pageNo, 'pageNo', { min: 1, max: 10000 }),
160
+ pageSize: integerInput(input.pageSize, 'pageSize', { min: 1, max: 200, defaultValue: 20 }),
161
+ };
162
+ for (const [key, value] of Object.entries({
163
+ requestname: optionalString(input.requestname, 'requestname'),
164
+ cusCreateDateStart: optionalDate(input.cusCreateDateStart, 'cusCreateDateStart'),
165
+ cusCreateDateEnd: optionalDate(input.cusCreateDateEnd, 'cusCreateDateEnd'),
166
+ })) {
167
+ if (value !== undefined)
168
+ body[key] = value;
169
+ }
170
+ const result = await host.invoiceRequest({ path: '/api/inc/book/getRequestListByTabId', method: 'POST', body, operation: this.name });
171
+ return resultEnvelope(result, 'invoice.reim.requests.list');
172
+ }
173
+ }
174
+ export class InvoiceReimWorkflowResolveOperation {
175
+ name = 'invoice.reim.workflow.resolve';
176
+ async execute(input, { host }) {
177
+ let requestIds = [];
178
+ if (input.requestIds !== undefined) {
179
+ if (!Array.isArray(input.requestIds))
180
+ throw invoiceValidationError('input_invalid', 'requestIds 必须是数组');
181
+ if (input.requestIds.length > 100)
182
+ throw invoiceValidationError('input_invalid', 'requestIds 最多支持 100 个 ID');
183
+ requestIds = input.requestIds.map((requestId, index) => asNonEmptyString(requestId, `requestIds[${index}]`));
184
+ }
185
+ const result = await host.invoiceRequest({
186
+ path: '/api/inc/book/getReimburseWorkflowByRequestIds',
187
+ method: 'POST',
188
+ body: { requestIds },
189
+ operation: this.name,
190
+ });
191
+ return resultEnvelope(result, 'invoice.reim.workflow.resolve');
192
+ }
193
+ }
194
+ export class InvoiceReimFormStructureOperation {
195
+ name = 'invoice.reim.form.structure';
196
+ async execute(input, { host }) {
197
+ const result = await host.invoiceRequest({
198
+ path: '/api/inc/book/getFormStructure',
199
+ method: 'GET',
200
+ query: {
201
+ workflowId: asNonEmptyString(input.workflowId, 'workflowId'),
202
+ nodeId: optionalString(input.nodeId, 'nodeId') || '1',
203
+ },
204
+ operation: this.name,
205
+ });
206
+ return resultEnvelope(result, 'invoice.reim.form.structure');
207
+ }
208
+ }
209
+ export class InvoiceReimRowInfoOperation {
210
+ name = 'invoice.reim.row-info';
211
+ async execute(input, { host }) {
212
+ const session = await host.getSession();
213
+ const result = await host.invoiceFormRequest({
214
+ path: '/api/secondev/fna/expense/dataInfo/getRowInfo',
215
+ method: 'POST',
216
+ query: { sf_request_type: 'fetch' },
217
+ fields: {
218
+ cdzt: optionalString(input.cdzt, 'cdzt') || session.userId,
219
+ requestid: input.requestid === undefined ? '' : String(input.requestid),
220
+ invoiceId: asNonEmptyString(input.invoiceId, 'invoiceId'),
221
+ },
222
+ operation: this.name,
223
+ });
224
+ return resultEnvelope(result, 'invoice.reim.row-info');
225
+ }
226
+ }
227
+ export class InvoiceReimEmployeeSuperiorsOperation {
228
+ name = 'invoice.reim.employee-superiors';
229
+ async execute(_input, { host }) {
230
+ const result = await host.invoiceRequest({
231
+ path: '/api/inc/book/getEmployeeSuperiors',
232
+ method: 'GET',
233
+ operation: this.name,
234
+ rewriteJsonText: quoteEmployeeIdsInJsonText,
235
+ });
236
+ return employeeSuperiorsEnvelope(result);
237
+ }
238
+ }
239
+ export class InvoiceReimFieldSearchOperation {
240
+ name = 'invoice.reim.field.search';
241
+ async execute(input, { host }) {
242
+ const result = await host.invoiceRequest({
243
+ path: '/api/government/formStructure/fieldRelateSearch',
244
+ method: 'GET',
245
+ query: {
246
+ keywords: asNonEmptyString(input.keywords, 'keywords'),
247
+ fieldId: asNonEmptyString(input.fieldId, 'fieldId'),
248
+ formModeType: 'wf',
249
+ workflowId: asNonEmptyString(input.workflowId, 'workflowId'),
250
+ nodeId: optionalString(input.nodeId, 'nodeId') || '100004140000000271',
251
+ },
252
+ operation: this.name,
253
+ });
254
+ return resultEnvelope(result, 'invoice.reim.field.search');
255
+ }
256
+ }
257
+ export class InvoiceReimFlowCreatePrepareOperation {
258
+ name = 'invoice.reim.flow.create.prepare';
259
+ async execute(input, { host, continuation }) {
260
+ const payload = ensureFlowCreatePayload(input.payload);
261
+ const session = await host.getSession();
262
+ const continuationToken = await continuation.issue({
263
+ operation: 'invoice.reim.flow.create.apply',
264
+ workflow: workflow('invoice.reim.flow.create', 'AWAITING_CONFIRMATION'),
265
+ baseUrl: session.baseUrl,
266
+ profile: session.profile,
267
+ userId: session.userId,
268
+ fingerprint: objectFingerprint(payload),
269
+ preview: flowPreview(payload),
270
+ });
271
+ return {
272
+ status: 'AWAITING_CONFIRMATION',
273
+ data: {
274
+ preview: flowPreview(payload),
275
+ continuation: continuationToken,
276
+ expiresInSeconds: 600,
277
+ workflow: workflow('invoice.reim.flow.create', 'AWAITING_CONFIRMATION'),
278
+ },
279
+ };
280
+ }
281
+ }
282
+ export class InvoiceReimFlowCreateApplyOperation {
283
+ name = 'invoice.reim.flow.create.apply';
284
+ async execute(input, { host, continuation }) {
285
+ if (input.confirm !== true)
286
+ throw invoiceConfirmationError('invoice.reim.flow.create.apply', { hint: '重新调用时传入 confirm=true' });
287
+ const lease = await continuation.verify(input.continuation, 'invoice.reim.flow.create.apply');
288
+ const payload = ensureFlowCreatePayload(input.payload);
289
+ if (typeof lease.fingerprint !== 'string')
290
+ throw invoiceValidationError('continuation_invalid', '报销单创建 continuation 缺少 payload 指纹');
291
+ if (objectFingerprint(payload) !== lease.fingerprint)
292
+ throw invoiceValidationError('target_changed', '报销单载荷与确认时不一致,请重新准备');
293
+ const session = await host.getSession();
294
+ if (!sessionMatches(lease, session))
295
+ throw invoiceValidationError('context_mismatch', '确认上下文已变化,请重新准备报销单创建');
296
+ let result;
297
+ try {
298
+ result = await host.invoiceRequest({ path: '/api/inc/book/createFlowNew', method: 'POST', body: payload, operation: this.name, timeoutMs: 90_000 });
299
+ }
300
+ catch (error) {
301
+ if (isInvoiceNetworkError(error)) {
302
+ throw invoicePartialError('报销单创建请求发送后连接中断,结果不确定,禁止自动重试', {
303
+ preview: lease.preview,
304
+ workflow: workflow('invoice.reim.flow.create', 'EXECUTING'),
305
+ }, { stage: 'reim-flow-create' });
306
+ }
307
+ throw error;
308
+ }
309
+ assertBusinessSuccess(result, 'reim_flow_create_failed', '报销单创建失败');
310
+ const requestId = result?.data?.requestId || result?.requestId;
311
+ if (!requestId) {
312
+ throw invoicePartialError('报销单创建接口返回成功但缺少 requestId,结果不确定', {
313
+ preview: lease.preview,
314
+ result,
315
+ workflow: workflow('invoice.reim.flow.create', 'VERIFYING'),
316
+ }, { stage: 'reim-flow-create-response' });
317
+ }
318
+ const sessionContext = await host.getSession();
319
+ return {
320
+ status: 'COMPLETE',
321
+ data: {
322
+ requestId: String(requestId),
323
+ requestName: payload.request_name,
324
+ viewUrl: `${sessionContext.baseUrl}/sp/workflow/flowpage/view/${requestId}`,
325
+ result,
326
+ workflow: workflow('invoice.reim.flow.create', 'COMPLETE'),
327
+ },
328
+ };
329
+ }
330
+ }
331
+ export class InvoiceReimFlowUpdatePrepareOperation {
332
+ name = 'invoice.reim.flow.update.prepare';
333
+ async execute(input, { host, continuation }) {
334
+ const payload = ensureFlowUpdatePayload(input.payload);
335
+ const session = await host.getSession();
336
+ const continuationToken = await continuation.issue({
337
+ operation: 'invoice.reim.flow.update.apply',
338
+ workflow: workflow('invoice.reim.flow.update', 'AWAITING_CONFIRMATION'),
339
+ baseUrl: session.baseUrl,
340
+ profile: session.profile,
341
+ userId: session.userId,
342
+ fingerprint: objectFingerprint(payload),
343
+ preview: updatePreview(payload),
344
+ });
345
+ return {
346
+ status: 'AWAITING_CONFIRMATION',
347
+ data: {
348
+ preview: updatePreview(payload),
349
+ continuation: continuationToken,
350
+ expiresInSeconds: 600,
351
+ workflow: workflow('invoice.reim.flow.update', 'AWAITING_CONFIRMATION'),
352
+ },
353
+ };
354
+ }
355
+ }
356
+ export class InvoiceReimFlowUpdateApplyOperation {
357
+ name = 'invoice.reim.flow.update.apply';
358
+ async execute(input, { host, continuation }) {
359
+ if (input.confirm !== true)
360
+ throw invoiceConfirmationError('invoice.reim.flow.update.apply', { hint: '重新调用时传入 confirm=true' });
361
+ const lease = await continuation.verify(input.continuation, 'invoice.reim.flow.update.apply');
362
+ const payload = ensureFlowUpdatePayload(input.payload);
363
+ if (typeof lease.fingerprint !== 'string')
364
+ throw invoiceValidationError('continuation_invalid', '报销单更新 continuation 缺少 payload 指纹');
365
+ if (objectFingerprint(payload) !== lease.fingerprint)
366
+ throw invoiceValidationError('target_changed', '报销单更新载荷与确认时不一致,请重新准备');
367
+ const session = await host.getSession();
368
+ if (!sessionMatches(lease, session))
369
+ throw invoiceValidationError('context_mismatch', '确认上下文已变化,请重新准备报销单更新');
370
+ let result;
371
+ try {
372
+ result = await host.invoiceRequest({ path: '/api/inc/book/updateFlow', method: 'POST', body: payload, operation: this.name, timeoutMs: 90_000 });
373
+ }
374
+ catch (error) {
375
+ if (isInvoiceNetworkError(error)) {
376
+ throw invoicePartialError('报销单更新请求发送后连接中断,结果不确定,禁止自动重试', {
377
+ preview: lease.preview,
378
+ workflow: workflow('invoice.reim.flow.update', 'EXECUTING'),
379
+ }, { stage: 'reim-flow-update' });
380
+ }
381
+ throw error;
382
+ }
383
+ assertBusinessSuccess(result, 'reim_flow_update_failed', '报销单更新失败');
384
+ const data = result?.data || {};
385
+ if (data.deleteDetailSuccess === false || data.updateFormSuccess === false) {
386
+ throw invoicePartialError('报销单更新返回部分失败,可能已有部分变更生效', {
387
+ preview: lease.preview,
388
+ result,
389
+ workflow: workflow('invoice.reim.flow.update', 'VERIFYING'),
390
+ }, { stage: 'reim-flow-update-response' });
391
+ }
392
+ return {
393
+ status: 'COMPLETE',
394
+ data: {
395
+ requestId: String(payload.requestId),
396
+ result,
397
+ workflow: workflow('invoice.reim.flow.update', 'COMPLETE'),
398
+ },
399
+ };
400
+ }
401
+ }
@@ -80,6 +80,58 @@ const UPDATE_FIELDS = new Map([
80
80
  ['currency', 'string'],
81
81
  ['currencyName', 'string'],
82
82
  ]);
83
+ const BROWSE_TYPE_NAMES = new Map([
84
+ [1, '增值税专用发票'],
85
+ [2, '增值税普通发票'],
86
+ [3, '增值税电子普通发票'],
87
+ [4, '卷式发票'],
88
+ [5, '通行费增值税电子普通发票'],
89
+ [6, '机动车销售统一发票'],
90
+ [7, '定额发票'],
91
+ [8, '客运汽车票'],
92
+ [9, '航空运输电子客票行程单'],
93
+ [10, '火车票'],
94
+ [11, '出租车票'],
95
+ [12, '其他'],
96
+ [13, '汽车通行费发票'],
97
+ [14, '船票'],
98
+ [22, '二手车销售统一发票'],
99
+ [28, '增值税电子专用发票'],
100
+ [32, '电子发票(增值税专用发票)'],
101
+ [33, '电子发票(普通发票)'],
102
+ [47, '医疗收费票据'],
103
+ [48, '财政非税收入统一票据'],
104
+ [49, '海关进口增值税专用缴款书'],
105
+ [50, '电子发票服务平台纸质普票'],
106
+ [52, '完税凭证'],
107
+ [53, '国际小票'],
108
+ [54, '银行回单'],
109
+ [56, '代扣代缴税收缴款凭证'],
110
+ ]);
111
+ const VALID_STATUS_NAMES = new Map([
112
+ [0, '未查验'],
113
+ [1, '有效已查验'],
114
+ [2, '有效未查验'],
115
+ [3, '查验失败'],
116
+ [4, '发票无效'],
117
+ [5, '票面校验不一致'],
118
+ ]);
119
+ const SOURCE_NAMES = new Map([
120
+ [1, '微信'],
121
+ [2, '支付宝'],
122
+ [4, '邮箱'],
123
+ [5, '拍照'],
124
+ [6, '扫码'],
125
+ [7, '手动'],
126
+ [9, '查验录入'],
127
+ [10, '企业微信'],
128
+ [11, '公众号'],
129
+ [12, '企业台账'],
130
+ [13, '文件'],
131
+ [14, 'Excel'],
132
+ [15, '短信'],
133
+ [16, '链接录入'],
134
+ ]);
83
135
  export function asObject(value, name = '业务输入') {
84
136
  if (!value || typeof value !== 'object' || Array.isArray(value)) {
85
137
  throw invoiceValidationError('input_invalid', `${name}必须是 JSON 对象`);
@@ -92,6 +144,33 @@ export function asPositiveString(value, name) {
92
144
  }
93
145
  return value;
94
146
  }
147
+ export function asNonEmptyString(value, name) {
148
+ if (typeof value !== 'string' || !value.trim()) {
149
+ throw invoiceValidationError('input_invalid', `${name} 必须是非空字符串`);
150
+ }
151
+ return value.trim();
152
+ }
153
+ export function normalizeIdList(value, name, { allowCommaString = false } = {}) {
154
+ const raw = allowCommaString && typeof value === 'string'
155
+ ? value.split(',').map((item) => item.trim()).filter(Boolean)
156
+ : value;
157
+ if (!Array.isArray(raw) || raw.length === 0) {
158
+ throw invoiceValidationError('input_invalid', `${name} 必须是非空数组`);
159
+ }
160
+ if (raw.length > 100)
161
+ throw invoiceValidationError('input_invalid', `${name} 单次最多支持 100 项`);
162
+ const ids = raw.map((item, index) => asPositiveString(String(item), `${name}[${index}]`));
163
+ if (new Set(ids).size !== ids.length)
164
+ throw invoiceValidationError('input_invalid', `${name} 不能包含重复 ID`);
165
+ return ids;
166
+ }
167
+ export function normalizeFids(input) {
168
+ if (input.fid !== undefined && input.fids !== undefined)
169
+ throw invoiceValidationError('input_ambiguous', 'fid 与 fids 只能提供一个');
170
+ if (input.fid !== undefined)
171
+ return [asPositiveString(String(input.fid), 'fid')];
172
+ return normalizeIdList(input.fids, 'fids');
173
+ }
95
174
  export function reqBase({ numericTrace = false } = {}) {
96
175
  const trace = Date.now();
97
176
  return { trace: numericTrace ? trace : String(trace), dev: 1 };
@@ -226,6 +305,13 @@ export async function getDetail(input, host) {
226
305
  body: { ...body, userFlag: '1', isDelFlag: '1', req_base: reqBase() },
227
306
  });
228
307
  }
308
+ export async function getDetailsByFids(fids, host) {
309
+ return host.invoiceRequest({
310
+ path: '/api/inc/get',
311
+ method: 'POST',
312
+ body: { ids: fids, mask: 0, userFlag: '1', isDelFlag: '1', req_base: reqBase() },
313
+ });
314
+ }
229
315
  export function preview(info) {
230
316
  const p = info.comm_info?.pro || {};
231
317
  const price = info.comm_info?.price || {};
@@ -260,6 +346,167 @@ export function validationPreview(info, scope, targetFid) {
260
346
  export function workflow(name, state) {
261
347
  return { workflow: name, version: 1, state };
262
348
  }
349
+ function stringOrEmpty(value) {
350
+ return value === undefined || value === null ? '' : String(value);
351
+ }
352
+ function numberOrZero(value) {
353
+ const parsed = Number(value);
354
+ return Number.isFinite(parsed) ? parsed : 0;
355
+ }
356
+ function enumName(names, value) {
357
+ if (value === undefined || value === null || value === '')
358
+ return '';
359
+ return names.get(numberOrZero(value)) || '';
360
+ }
361
+ function parseExt(extRaw) {
362
+ if (typeof extRaw !== 'string' || !extRaw.trim())
363
+ return {};
364
+ try {
365
+ const parsed = JSON.parse(extRaw);
366
+ return parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};
367
+ }
368
+ catch {
369
+ return {};
370
+ }
371
+ }
372
+ function dateToTimestampMs(date) {
373
+ if (typeof date !== 'string' || !/^\d{4}-\d{2}-\d{2}$/u.test(date))
374
+ return 0;
375
+ const timestamp = Date.parse(`${date}T00:00:00+08:00`);
376
+ return Number.isFinite(timestamp) ? timestamp : 0;
377
+ }
378
+ function contentFor(typeName, number) {
379
+ if (typeName && number)
380
+ return `${typeName}-${number}`;
381
+ return typeName || number || '';
382
+ }
383
+ function cents(value) {
384
+ if (value === undefined || value === null || value === '')
385
+ return 0;
386
+ const text = String(value);
387
+ const match = /^(-?\d+)(?:\.(\d{1,2}))?$/u.exec(text);
388
+ if (!match)
389
+ return null;
390
+ const whole = Number(match[1]);
391
+ const fraction = Number((match[2] || '').padEnd(2, '0'));
392
+ return whole * 100 + (whole < 0 ? -fraction : fraction);
393
+ }
394
+ function moneyMinus(total, reiming, reimed) {
395
+ if ((reiming === undefined || reiming === null || reiming === '') && (reimed === undefined || reimed === null || reimed === '')) {
396
+ return stringOrEmpty(total);
397
+ }
398
+ const totalCents = cents(total);
399
+ const reimingCents = cents(reiming);
400
+ const reimedCents = cents(reimed);
401
+ if (totalCents === null || reimingCents === null || reimedCents === null)
402
+ return stringOrEmpty(total);
403
+ const value = totalCents - reimingCents - reimedCents;
404
+ const sign = value < 0 ? '-' : '';
405
+ const absolute = Math.abs(value);
406
+ const whole = Math.floor(absolute / 100);
407
+ const fraction = absolute % 100;
408
+ return fraction === 0 ? `${sign}${whole}` : `${sign}${whole}.${String(fraction).padStart(2, '0')}`;
409
+ }
410
+ function extProductNames(products) {
411
+ if (!Array.isArray(products))
412
+ return '';
413
+ return products
414
+ .map((item) => item && typeof item === 'object' ? stringOrEmpty(item.productName || item.name) : '')
415
+ .filter(Boolean)
416
+ .join('、');
417
+ }
418
+ export function browseFieldItem(info) {
419
+ const comm = info.comm_info || {};
420
+ const pro = comm.pro || {};
421
+ const price = comm.price || {};
422
+ const buyer = comm.buyer || {};
423
+ const payer = comm.payer || {};
424
+ const modify = info.modify_info || {};
425
+ const ext = parseExt(info.ext);
426
+ const products = Array.isArray(ext.products) ? ext.products : [];
427
+ const fid = stringOrEmpty(info.fid || info.id);
428
+ const type = numberOrZero(pro.type);
429
+ const typeName = stringOrEmpty(pro.cname) || BROWSE_TYPE_NAMES.get(type) || '未知票种';
430
+ const number = stringOrEmpty(info.number);
431
+ const content = contentFor(typeName, number);
432
+ const total = stringOrEmpty(price.total);
433
+ const reimingMoney = typeof price.reimingMoney === 'string' ? price.reimingMoney : '';
434
+ const reimedMoney = typeof price.reimedMoney === 'string' ? price.reimedMoney : '';
435
+ const firstProduct = products.find((item) => item && typeof item === 'object');
436
+ return {
437
+ optionId: fid,
438
+ id: fid,
439
+ fid,
440
+ type,
441
+ typeName,
442
+ number,
443
+ code: stringOrEmpty(info.code),
444
+ content,
445
+ name: content,
446
+ total,
447
+ ttax: stringOrEmpty(ext.ttax),
448
+ seller: stringOrEmpty(payer.company),
449
+ sellerId: stringOrEmpty(payer.tcode),
450
+ buyer: stringOrEmpty(buyer.company),
451
+ buyerId: stringOrEmpty(buyer.tcode),
452
+ incDate: stringOrEmpty(pro.date),
453
+ incDateTimestamp: dateToTimestampMs(pro.date),
454
+ validStatus: enumName(VALID_STATUS_NAMES, pro.valid),
455
+ source: enumName(SOURCE_NAMES, modify.source),
456
+ invoiceStatus: numberOrZero(pro.status),
457
+ del: numberOrZero(modify.del),
458
+ currency: stringOrEmpty(info.currency) || 'CNY',
459
+ currencyName: stringOrEmpty(info.currencyName) || '人民币',
460
+ taxRate: stringOrEmpty(ext.taxRate || ext.trate || firstProduct?.taxRate || firstProduct?.trate),
461
+ consumeContent: stringOrEmpty(ext.content) || extProductNames(products),
462
+ fylx: stringOrEmpty(info.fylx) || '0',
463
+ inputDate: stringOrEmpty(modify.createDate || modify.modifyDate),
464
+ incTotal: 0,
465
+ reimingMoney,
466
+ reimedMoney,
467
+ notReimMoney: moneyMinus(total, reimingMoney, reimedMoney),
468
+ reimDate: '',
469
+ reimProcess: '',
470
+ };
471
+ }
472
+ export function browseFieldData(response) {
473
+ const ret = response.res_base?.ret;
474
+ if (ret !== undefined && ret !== 0) {
475
+ throw new InvoiceCliError('api', 'detail_failed', response.res_base?.message || '详情接口整体失败', {
476
+ code: ret,
477
+ details: { res_base: response.res_base },
478
+ exitCode: 1,
479
+ });
480
+ }
481
+ const items = [];
482
+ const errors = [];
483
+ for (const entry of Array.isArray(response.infos) ? response.infos : []) {
484
+ const itemRet = entry?.ret?.ret;
485
+ if (itemRet !== 0) {
486
+ errors.push({
487
+ fid: stringOrEmpty(entry?.info?.fid || entry?.info?.id),
488
+ ret: itemRet,
489
+ message: entry?.ret?.message || '查询失败',
490
+ });
491
+ continue;
492
+ }
493
+ if (entry?.info && typeof entry.info === 'object')
494
+ items.push(browseFieldItem(entry.info));
495
+ }
496
+ return { items, errors };
497
+ }
498
+ export function assertBusinessSuccess(value, subtype, fallbackMessage) {
499
+ const result = value && typeof value === 'object' ? value : {};
500
+ const code = result.code ?? result.res_base?.ret;
501
+ const failed = result.fail === true || result.status === false || (code !== undefined && code !== 0 && code !== 200);
502
+ if (!failed)
503
+ return;
504
+ throw new InvoiceCliError('api', subtype, result.message || result.msg || result.res_base?.message || fallbackMessage, {
505
+ code,
506
+ details: { result },
507
+ exitCode: 1,
508
+ });
509
+ }
263
510
  function uploadSource(input) {
264
511
  const { file, url } = input;
265
512
  if (file !== undefined && url !== undefined)