weaver-work-cli 0.1.1 → 0.1.4

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 (351) hide show
  1. package/README.md +187 -76
  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 +160 -55
  7. package/dist/internal/e10/auth/crypto.js +7 -22
  8. package/dist/internal/e10/auth/session.js +1 -1
  9. package/dist/internal/e10/auth/xiaoe.js +268 -0
  10. package/dist/internal/e10/context.js +16 -2
  11. package/dist/internal/e10/index.js +1 -0
  12. package/dist/internal/e10/request-runtime.js +344 -0
  13. package/dist/internal/skills/install.js +48 -6
  14. package/dist/internal/skills/reader.js +27 -0
  15. package/dist/shortcuts/archive/continuation.js +70 -0
  16. package/dist/shortcuts/archive/errors.js +53 -0
  17. package/dist/shortcuts/archive/host.js +197 -0
  18. package/dist/shortcuts/archive/index.js +363 -0
  19. package/dist/shortcuts/archive/manifest.js +45 -0
  20. package/dist/shortcuts/archive/operations/archive-info.js +55 -0
  21. package/dist/shortcuts/archive/operations/borrow-car.js +146 -0
  22. package/dist/shortcuts/archive/operations/borrow-list.js +200 -0
  23. package/dist/shortcuts/archive/operations/confirm.js +46 -0
  24. package/dist/shortcuts/archive/operations/download.js +238 -0
  25. package/dist/shortcuts/archive/operations/flow-url.js +240 -0
  26. package/dist/shortcuts/archive/operations/fonds.js +95 -0
  27. package/dist/shortcuts/archive/operations/getPageUrl.js +137 -0
  28. package/dist/shortcuts/archive/operations/registry.js +43 -0
  29. package/dist/shortcuts/archive/operations/search.js +88 -0
  30. package/dist/shortcuts/archive/operations/shared.js +120 -0
  31. package/dist/shortcuts/archive/operations/types.js +23 -0
  32. package/dist/shortcuts/archive/operations/upload.js +182 -0
  33. package/dist/shortcuts/archive/operations.js +13 -0
  34. package/dist/shortcuts/archive/render/search-format.js +276 -0
  35. package/dist/shortcuts/archive/render/search-view.js +125 -0
  36. package/dist/shortcuts/asset/continuation.js +70 -0
  37. package/dist/shortcuts/asset/errors.js +67 -0
  38. package/dist/shortcuts/asset/host.js +438 -0
  39. package/dist/shortcuts/asset/index.js +255 -0
  40. package/dist/shortcuts/asset/manifest.js +471 -0
  41. package/dist/shortcuts/asset/operations/query.js +249 -0
  42. package/dist/shortcuts/asset/operations/registry.js +85 -0
  43. package/dist/shortcuts/asset/operations/shared.js +100 -0
  44. package/dist/shortcuts/asset/operations/type-cache.js +49 -0
  45. package/dist/shortcuts/asset/operations/types.js +1 -0
  46. package/dist/shortcuts/asset/operations/viewlink.js +117 -0
  47. package/dist/shortcuts/asset/operations/write.js +435 -0
  48. package/dist/shortcuts/asset/operations.js +9 -0
  49. package/dist/shortcuts/calendar/continuation.js +70 -0
  50. package/dist/shortcuts/calendar/errors.js +53 -0
  51. package/dist/shortcuts/calendar/host.js +148 -0
  52. package/dist/shortcuts/calendar/index.js +125 -0
  53. package/dist/shortcuts/calendar/manifest.js +26 -0
  54. package/dist/shortcuts/calendar/operations/read.js +259 -0
  55. package/dist/shortcuts/calendar/operations/registry.js +31 -0
  56. package/dist/shortcuts/calendar/operations/shared.js +132 -0
  57. package/dist/shortcuts/calendar/operations/types.js +25 -0
  58. package/dist/shortcuts/calendar/operations/write.js +439 -0
  59. package/dist/shortcuts/calendar/operations.js +8 -0
  60. package/dist/shortcuts/ehr/continuation.js +70 -0
  61. package/dist/shortcuts/ehr/errors.js +53 -0
  62. package/dist/shortcuts/ehr/host.js +213 -0
  63. package/dist/shortcuts/ehr/index.js +205 -0
  64. package/dist/shortcuts/ehr/manifest.js +47 -0
  65. package/dist/shortcuts/ehr/operations/attend-read.js +373 -0
  66. package/dist/shortcuts/ehr/operations/attend-write.js +514 -0
  67. package/dist/shortcuts/ehr/operations/hr-contact.js +363 -0
  68. package/dist/shortcuts/ehr/operations/hr-ds.js +298 -0
  69. package/dist/shortcuts/ehr/operations/hr-report.js +386 -0
  70. package/dist/shortcuts/ehr/operations/recruit-write.js +1629 -0
  71. package/dist/shortcuts/ehr/operations/recruit.js +803 -0
  72. package/dist/shortcuts/ehr/operations/registry.js +43 -0
  73. package/dist/shortcuts/ehr/operations/salary.js +319 -0
  74. package/dist/shortcuts/ehr/operations/shared.js +246 -0
  75. package/dist/shortcuts/ehr/operations/types.js +25 -0
  76. package/dist/shortcuts/ehr/operations.js +25 -0
  77. package/dist/shortcuts/esb/continuation.js +70 -0
  78. package/dist/shortcuts/esb/errors.js +65 -0
  79. package/dist/shortcuts/esb/host.js +187 -0
  80. package/dist/shortcuts/esb/index.js +112 -0
  81. package/dist/shortcuts/esb/manifest.js +91 -0
  82. package/dist/shortcuts/esb/operations/input-format.js +31 -0
  83. package/dist/shortcuts/esb/operations/registry.js +48 -0
  84. package/dist/shortcuts/esb/operations/shared.js +152 -0
  85. package/dist/shortcuts/esb/operations/trigger.js +76 -0
  86. package/dist/shortcuts/esb/operations/types.js +21 -0
  87. package/dist/shortcuts/esb/operations.js +15 -0
  88. package/dist/shortcuts/fna/continuation.js +70 -0
  89. package/dist/shortcuts/fna/errors.js +59 -0
  90. package/dist/shortcuts/fna/host.js +146 -0
  91. package/dist/shortcuts/fna/index.js +111 -0
  92. package/dist/shortcuts/fna/manifest.js +41 -0
  93. package/dist/shortcuts/fna/operations/budget.js +124 -0
  94. package/dist/shortcuts/fna/operations/expense-center.js +148 -0
  95. package/dist/shortcuts/fna/operations/invoice-writeoff.js +212 -0
  96. package/dist/shortcuts/fna/operations/loan.js +195 -0
  97. package/dist/shortcuts/fna/operations/registry.js +35 -0
  98. package/dist/shortcuts/fna/operations/shared.js +210 -0
  99. package/dist/shortcuts/fna/operations/types.js +25 -0
  100. package/dist/shortcuts/fna/operations.js +19 -0
  101. package/dist/shortcuts/hrm/errors.js +38 -0
  102. package/dist/shortcuts/hrm/host.js +156 -0
  103. package/dist/shortcuts/hrm/index.js +111 -0
  104. package/dist/shortcuts/hrm/manifest.js +32 -0
  105. package/dist/shortcuts/hrm/operations/employee.js +338 -0
  106. package/dist/shortcuts/hrm/operations/org.js +110 -0
  107. package/dist/shortcuts/hrm/operations/position.js +176 -0
  108. package/dist/shortcuts/hrm/operations/registry.js +33 -0
  109. package/dist/shortcuts/hrm/operations/shared.js +143 -0
  110. package/dist/shortcuts/hrm/operations/types.js +23 -0
  111. package/dist/shortcuts/hrm/operations.js +19 -0
  112. package/dist/shortcuts/index.js +20 -0
  113. package/dist/shortcuts/invoice/host.js +99 -94
  114. package/dist/shortcuts/invoice/index.js +65 -61
  115. package/dist/shortcuts/invoice/manifest.js +222 -14
  116. package/dist/shortcuts/invoice/operations/browse-field.js +17 -0
  117. package/dist/shortcuts/invoice/operations/issuing.js +198 -0
  118. package/dist/shortcuts/invoice/operations/ocr-preview.js +6 -3
  119. package/dist/shortcuts/invoice/operations/registry.js +17 -0
  120. package/dist/shortcuts/invoice/operations/reim.js +401 -0
  121. package/dist/shortcuts/invoice/operations/shared.js +271 -6
  122. package/dist/shortcuts/invoice/operations/validate-preview.js +1 -1
  123. package/dist/shortcuts/jiuchuanhui/cache.js +441 -0
  124. package/dist/shortcuts/jiuchuanhui/continuation.js +70 -0
  125. package/dist/shortcuts/jiuchuanhui/errors.js +59 -0
  126. package/dist/shortcuts/jiuchuanhui/host.js +159 -0
  127. package/dist/shortcuts/jiuchuanhui/index.js +109 -0
  128. package/dist/shortcuts/jiuchuanhui/manifest.js +469 -0
  129. package/dist/shortcuts/jiuchuanhui/operations/datajson.js +214 -0
  130. package/dist/shortcuts/jiuchuanhui/operations/esb.js +157 -0
  131. package/dist/shortcuts/jiuchuanhui/operations/generic.js +146 -0
  132. package/dist/shortcuts/jiuchuanhui/operations/registry.js +133 -0
  133. package/dist/shortcuts/jiuchuanhui/operations/shared.js +158 -0
  134. package/dist/shortcuts/jiuchuanhui/operations/types.js +1 -0
  135. package/dist/shortcuts/jiuchuanhui/operations.js +8 -0
  136. package/dist/shortcuts/mail/continuation.js +70 -0
  137. package/dist/shortcuts/mail/errors.js +53 -0
  138. package/dist/shortcuts/mail/host.js +182 -0
  139. package/dist/shortcuts/mail/index.js +519 -0
  140. package/dist/shortcuts/mail/manifest.js +38 -0
  141. package/dist/shortcuts/mail/operations/mail-blacklist.js +79 -0
  142. package/dist/shortcuts/mail/operations/mail-contacts.js +195 -0
  143. package/dist/shortcuts/mail/operations/mail-manage.js +335 -0
  144. package/dist/shortcuts/mail/operations/mail-read.js +508 -0
  145. package/dist/shortcuts/mail/operations/mail-send.js +474 -0
  146. package/dist/shortcuts/mail/operations/mail-sign.js +203 -0
  147. package/dist/shortcuts/mail/operations/mail-template.js +170 -0
  148. package/dist/shortcuts/mail/operations/registry.js +41 -0
  149. package/dist/shortcuts/mail/operations/shared.js +64 -0
  150. package/dist/shortcuts/mail/operations/types.js +27 -0
  151. package/dist/shortcuts/mail/operations.js +19 -0
  152. package/dist/shortcuts/plan/continuation.js +70 -0
  153. package/dist/shortcuts/plan/errors.js +70 -0
  154. package/dist/shortcuts/plan/host.js +180 -0
  155. package/dist/shortcuts/plan/index.js +150 -0
  156. package/dist/shortcuts/plan/manifest.js +53 -0
  157. package/dist/shortcuts/plan/operations/link.js +256 -0
  158. package/dist/shortcuts/plan/operations/read.js +259 -0
  159. package/dist/shortcuts/plan/operations/registry.js +33 -0
  160. package/dist/shortcuts/plan/operations/shared.js +246 -0
  161. package/dist/shortcuts/plan/operations/types.js +49 -0
  162. package/dist/shortcuts/plan/operations/version.js +49 -0
  163. package/dist/shortcuts/plan/operations/write.js +710 -0
  164. package/dist/shortcuts/plan/operations.js +8 -0
  165. package/docs/SKILL.md +11 -7
  166. package/docs/_catalog.md +23 -5
  167. package/docs/agent-invoice.md +31 -10
  168. package/docs/agent-skill-install.md +211 -0
  169. package/docs/calendar.md +87 -0
  170. package/docs/e10-auth.md +28 -9
  171. package/docs/ehr.md +186 -0
  172. package/docs/esb.md +64 -0
  173. package/docs/fna.md +72 -0
  174. package/docs/hrm.md +89 -0
  175. package/docs/invoice.md +66 -20
  176. package/docs/jiuchuanhui.md +131 -0
  177. package/docs/operation-manual.md +443 -0
  178. package/docs/plan.md +82 -0
  179. package/docs/wenshuding.md +129 -0
  180. package/docs/ziguanjia.md +89 -0
  181. package/package.json +4 -4
  182. package/scripts/package-skill.mjs +127 -34
  183. package/scripts/postbuild.mjs +13 -0
  184. package/skill-template/business-info.json +13 -2
  185. package/skill-template/domains/calendar.md +15 -0
  186. package/skill-template/domains/esb.md +13 -0
  187. package/skill-template/domains/hrm.md +16 -0
  188. package/skill-template/domains/jiuchuanhui.md +23 -0
  189. package/skill-template/domains/jucailin.md +22 -0
  190. package/skill-template/domains/mail.md +21 -0
  191. package/skill-template/domains/plan.md +17 -0
  192. package/skill-template/domains/qiyecheng.md +17 -0
  193. package/skill-template/domains/shared.md +9 -3
  194. package/skill-template/domains/skill-maker.md +10 -0
  195. package/skill-template/domains/wenshuding.md +22 -0
  196. package/skill-template/domains/{invoice.md → yepiaotong.md} +4 -0
  197. package/skill-template/domains/ziguanjia.md +21 -0
  198. package/skill-template/master-skill-template.md +12 -6
  199. package/skill-template/skill-template.md +40 -9
  200. package/skills/weaver-e10-calendar/SKILL.md +101 -0
  201. package/skills/weaver-e10-calendar/product.json +8 -0
  202. package/skills/weaver-e10-calendar/references/calendar-app-check.md +65 -0
  203. package/skills/weaver-e10-calendar/references/calendar-dict.md +55 -0
  204. package/skills/weaver-e10-calendar/references/calendar-query.md +70 -0
  205. package/skills/weaver-e10-calendar/references/calendar-write.md +97 -0
  206. package/skills/weaver-e10-calendar/references/source-manifest.json +54 -0
  207. package/skills/weaver-e10-esb/SKILL.md +102 -0
  208. package/skills/weaver-e10-esb/product.json +8 -0
  209. package/skills/weaver-e10-esb/references/input-format.md +52 -0
  210. package/skills/weaver-e10-esb/references/source-manifest.json +242 -0
  211. package/skills/weaver-e10-esb/references/trigger.md +99 -0
  212. package/skills/weaver-e10-hrm/SKILL.md +87 -0
  213. package/skills/weaver-e10-hrm/product.json +8 -0
  214. package/skills/weaver-e10-hrm/references/employee.md +109 -0
  215. package/skills/weaver-e10-hrm/references/org.md +95 -0
  216. package/skills/weaver-e10-hrm/references/position.md +95 -0
  217. package/skills/weaver-e10-hrm/references/source-manifest.json +121 -0
  218. package/skills/weaver-e10-jiuchuanhui/SKILL.md +174 -0
  219. package/skills/weaver-e10-jiuchuanhui/product.json +8 -0
  220. package/skills/weaver-e10-jiuchuanhui/references/cache.md +110 -0
  221. package/skills/weaver-e10-jiuchuanhui/references/clue.md +61 -0
  222. package/skills/weaver-e10-jiuchuanhui/references/contact-plan.md +56 -0
  223. package/skills/weaver-e10-jiuchuanhui/references/contact-records.md +48 -0
  224. package/skills/weaver-e10-jiuchuanhui/references/contact.md +56 -0
  225. package/skills/weaver-e10-jiuchuanhui/references/customer.md +69 -0
  226. package/skills/weaver-e10-jiuchuanhui/references/disabled-capabilities.md +24 -0
  227. package/skills/weaver-e10-jiuchuanhui/references/discovery-config.md +60 -0
  228. package/skills/weaver-e10-jiuchuanhui/references/general-helpers.md +59 -0
  229. package/skills/weaver-e10-jiuchuanhui/references/jiuchuanhui-entry.md +60 -0
  230. package/skills/weaver-e10-jiuchuanhui/references/sale.md +72 -0
  231. package/skills/weaver-e10-jiuchuanhui/references/source-manifest.json +2632 -0
  232. package/skills/weaver-e10-jucailin/SKILL.md +101 -0
  233. package/skills/weaver-e10-jucailin/product.json +8 -0
  234. package/skills/weaver-e10-jucailin/references/attend-read.md +73 -0
  235. package/skills/weaver-e10-jucailin/references/attend-write.md +82 -0
  236. package/skills/weaver-e10-jucailin/references/hr-contact.md +92 -0
  237. package/skills/weaver-e10-jucailin/references/hr-datasource.md +104 -0
  238. package/skills/weaver-e10-jucailin/references/hr-report.md +76 -0
  239. package/skills/weaver-e10-jucailin/references/recruit-read.md +76 -0
  240. package/skills/weaver-e10-jucailin/references/recruit-write.md +70 -0
  241. package/skills/weaver-e10-jucailin/references/safety-boundaries.md +35 -0
  242. package/skills/weaver-e10-jucailin/references/salary.md +110 -0
  243. package/skills/weaver-e10-jucailin/references/source-manifest.json +152 -0
  244. package/skills/weaver-e10-mail/SKILL.md +151 -0
  245. package/skills/weaver-e10-mail/product.json +8 -0
  246. package/skills/weaver-e10-mail/references/mail-agent-entry.md +47 -0
  247. package/skills/weaver-e10-mail/references/mail-attachment.md +30 -0
  248. package/skills/weaver-e10-mail/references/mail-blacklist.md +27 -0
  249. package/skills/weaver-e10-mail/references/mail-contacts.md +33 -0
  250. package/skills/weaver-e10-mail/references/mail-manage.md +44 -0
  251. package/skills/weaver-e10-mail/references/mail-read.md +76 -0
  252. package/skills/weaver-e10-mail/references/mail-send.md +43 -0
  253. package/skills/weaver-e10-mail/references/mail-sign.md +33 -0
  254. package/skills/weaver-e10-mail/references/mail-template.md +31 -0
  255. package/skills/weaver-e10-mail/references/safety-boundaries.md +32 -0
  256. package/skills/weaver-e10-plan/SKILL.md +139 -0
  257. package/skills/weaver-e10-plan/product.json +8 -0
  258. package/skills/weaver-e10-plan/references/plan-collect-and-compose.md +123 -0
  259. package/skills/weaver-e10-plan/references/plan-overview-and-routing.md +138 -0
  260. package/skills/weaver-e10-plan/references/plan-report-query.md +154 -0
  261. package/skills/weaver-e10-plan/references/plan-report-remind.md +104 -0
  262. package/skills/weaver-e10-plan/references/plan-report-write.md +162 -0
  263. package/skills/weaver-e10-plan/references/source-manifest.json +858 -0
  264. package/skills/weaver-e10-qiyecheng/SKILL.md +118 -0
  265. package/skills/weaver-e10-qiyecheng/product.json +8 -0
  266. package/skills/weaver-e10-qiyecheng/references/budget.md +65 -0
  267. package/skills/weaver-e10-qiyecheng/references/catalog.md +56 -0
  268. package/skills/weaver-e10-qiyecheng/references/expense-center.md +51 -0
  269. package/skills/weaver-e10-qiyecheng/references/invoice-writeoff.md +57 -0
  270. package/skills/weaver-e10-qiyecheng/references/loan-management.md +59 -0
  271. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +698 -0
  272. package/skills/weaver-e10-shared/SKILL.md +86 -0
  273. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +127 -0
  274. package/skills/weaver-e10-shared/references/json-output-contract.md +120 -0
  275. package/skills/weaver-e10-shared/references/weaver-e10-installation.md +110 -0
  276. package/skills/weaver-e10-skill-maker/SKILL.md +77 -0
  277. package/skills/weaver-e10-skill-maker/product.json +8 -0
  278. package/skills/weaver-e10-skill-maker/references/business-skill-generation.md +124 -0
  279. package/skills/weaver-e10-skill-maker/references/detector-validation.md +101 -0
  280. package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +230 -0
  281. package/skills/weaver-e10-skill-maker/references/post-generation-install.md +105 -0
  282. package/skills/weaver-e10-skill-maker/references/source-update-detection.md +261 -0
  283. package/skills/weaver-e10-skill-maker/references/weaver-skill-style.md +141 -0
  284. package/skills/weaver-e10-wenshuding/SKILL.md +157 -0
  285. package/skills/weaver-e10-wenshuding/product.json +8 -0
  286. package/skills/weaver-e10-wenshuding/references/archive-agent-entry.md +63 -0
  287. package/skills/weaver-e10-wenshuding/references/archive-borrow-car.md +52 -0
  288. package/skills/weaver-e10-wenshuding/references/archive-borrow-list.md +52 -0
  289. package/skills/weaver-e10-wenshuding/references/archive-disabled-capabilities.md +22 -0
  290. package/skills/weaver-e10-wenshuding/references/archive-download.md +48 -0
  291. package/skills/weaver-e10-wenshuding/references/archive-flow.md +46 -0
  292. package/skills/weaver-e10-wenshuding/references/archive-fonds.md +34 -0
  293. package/skills/weaver-e10-wenshuding/references/archive-info.md +33 -0
  294. package/skills/weaver-e10-wenshuding/references/archive-search.md +52 -0
  295. package/skills/weaver-e10-wenshuding/references/archive-upload.md +41 -0
  296. package/skills/weaver-e10-wenshuding/references/source-manifest.json +517 -0
  297. package/skills/weaver-e10-yepiaotong/SKILL.md +184 -0
  298. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-add.md +1 -1
  299. package/skills/weaver-e10-yepiaotong/references/invoice-agent-entry.md +47 -0
  300. package/skills/weaver-e10-yepiaotong/references/invoice-browse-field-data.md +204 -0
  301. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-delete.md +1 -1
  302. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-detail.md +13 -5
  303. package/skills/weaver-e10-yepiaotong/references/invoice-disabled-capabilities.md +28 -0
  304. package/skills/weaver-e10-yepiaotong/references/invoice-download.md +31 -0
  305. package/skills/weaver-e10-yepiaotong/references/invoice-enterprise-list.md +45 -0
  306. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-file-upload.md +15 -4
  307. package/skills/weaver-e10-yepiaotong/references/invoice-import.md +45 -0
  308. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +120 -0
  309. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-field-rules.md +161 -0
  310. package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +99 -0
  311. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-ocr-preview.md +14 -4
  312. package/skills/weaver-e10-yepiaotong/references/invoice-personal-list.md +58 -0
  313. package/skills/weaver-e10-yepiaotong/references/invoice-red.md +261 -0
  314. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +97 -0
  315. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-update.md +1 -1
  316. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-validation-preview.md +10 -3
  317. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +1340 -0
  318. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +845 -0
  319. package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +94 -0
  320. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +449 -0
  321. package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +266 -0
  322. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +494 -0
  323. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +1103 -0
  324. package/skills/weaver-e10-ziguanjia/SKILL.md +162 -0
  325. package/skills/weaver-e10-ziguanjia/product.json +8 -0
  326. package/skills/weaver-e10-ziguanjia/references/source-manifest.json +147 -0
  327. package/skills/weaver-e10-ziguanjia/references/ziguanjia-agent-entry.md +65 -0
  328. package/skills/weaver-e10-ziguanjia/references/ziguanjia-create.md +45 -0
  329. package/skills/weaver-e10-ziguanjia/references/ziguanjia-depre.md +48 -0
  330. package/skills/weaver-e10-ziguanjia/references/ziguanjia-disabled-capabilities.md +22 -0
  331. package/skills/weaver-e10-ziguanjia/references/ziguanjia-purch.md +57 -0
  332. package/skills/weaver-e10-ziguanjia/references/ziguanjia-query.md +62 -0
  333. package/skills/weaver-e10-ziguanjia/references/ziguanjia-repair.md +83 -0
  334. package/skills/weaver-e10-ziguanjia/references/ziguanjia-resolve.md +49 -0
  335. package/skills/weaver-e10-ziguanjia/references/ziguanjia-return.md +70 -0
  336. package/skills/weaver-e10-ziguanjia/references/ziguanjia-update.md +45 -0
  337. package/skills/weaver-e10-ziguanjia/references/ziguanjia-use.md +60 -0
  338. package/skills/weaver-e10-ziguanjia/references/ziguanjia-viewlink.md +81 -0
  339. package/skills/weaver-work-cli-invoice/SKILL.md +0 -103
  340. package/skills/weaver-work-cli-invoice/references/invoice-agent-entry.md +0 -38
  341. package/skills/weaver-work-cli-invoice/references/invoice-disabled-capabilities.md +0 -26
  342. package/skills/weaver-work-cli-invoice/references/invoice-download.md +0 -22
  343. package/skills/weaver-work-cli-invoice/references/invoice-enterprise-list.md +0 -35
  344. package/skills/weaver-work-cli-invoice/references/invoice-import.md +0 -28
  345. package/skills/weaver-work-cli-invoice/references/invoice-personal-list.md +0 -47
  346. package/skills/weaver-work-cli-shared/SKILL.md +0 -53
  347. package/skills/weaver-work-cli-shared/references/e10-auth-and-session.md +0 -83
  348. package/skills/weaver-work-cli-shared/references/json-output-contract.md +0 -61
  349. package/skills/weaver-work-cli-shared/references/weaver-work-cli-installation.md +0 -61
  350. /package/skills/{weaver-work-cli-shared → weaver-e10-shared}/references/high-risk-write.md +0 -0
  351. /package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/product.json +0 -0
@@ -0,0 +1,259 @@
1
+ import { planValidationError } from '../errors.js';
2
+ import { SCHEMA_ID, SCHEMA_REPORT_TYPE, planSuccess, schemaOf, } from './types.js';
3
+ import { assertLinkSupported, assertReportType, ebMainTables, normalizeEbReport, normalizeStandardReport, resolveSerialNumber, resolveYear, toIdString, } from './shared.js';
4
+ import { buildDetailUrl, lookupReport, resolveLink, } from './link.js';
5
+ const COMMENT_MODULE = 'workreport';
6
+ // ---------------------------------------------------------------------------
7
+ // 单份报告详情(按 id 或按周期),并按规则附加评论总条数
8
+ // ---------------------------------------------------------------------------
9
+ async function commentTotalCount(host, reportId) {
10
+ const response = await host.request({
11
+ method: 'POST',
12
+ path: '/api/plan/common/comment/commentPage',
13
+ operation: 'plan.report.get',
14
+ body: {
15
+ pageNo: 1,
16
+ pageSize: 1,
17
+ targetId: reportId,
18
+ module: COMMENT_MODULE,
19
+ foldCommentList: false,
20
+ },
21
+ });
22
+ const total = response?.data?.page?.totalCount;
23
+ const numeric = Number(total);
24
+ return Number.isFinite(numeric) ? numeric : null;
25
+ }
26
+ const planReportGet = {
27
+ name: 'plan.report.get',
28
+ resource: 'plan',
29
+ method: 'report.get',
30
+ action: 'plan.report.get',
31
+ summary: '按报告 id 或按周期(年份+类型+周期+创建人)查询单个报告详情,并按规则附带评论总条数',
32
+ capability: 'plan',
33
+ risk: 'read',
34
+ inputSchema: schemaOf({
35
+ id: { ...SCHEMA_ID, description: '报告 id;与周期参数二选一,给 id 时忽略周期参数' },
36
+ year: { type: 'integer', description: '报告年份;缺省取本年' },
37
+ type: { ...SCHEMA_REPORT_TYPE, description: '报告类型' },
38
+ serialNumber: { type: 'integer', minimum: 1, description: '报告周期' },
39
+ creatorUserId: { ...SCHEMA_ID, description: '报告创建人 id;缺省为当前登录人' },
40
+ withComments: { type: 'boolean', default: true, description: '标准版链路下是否同时查询评论总条数' },
41
+ }, {
42
+ oneOf: [{ required: ['id'] }, { required: ['type', 'serialNumber'] }],
43
+ }),
44
+ handler: async (args, { host }) => {
45
+ const warnings = [];
46
+ const query = args.id !== undefined && args.id !== ''
47
+ ? { id: toIdString(args.id, 'id') }
48
+ : {
49
+ year: resolveYear(args.year),
50
+ type: assertReportType(args.type),
51
+ serialNumber: resolveSerialNumber(args.serialNumber),
52
+ ...(args.creatorUserId !== undefined && args.creatorUserId !== ''
53
+ ? { creatorUserId: toIdString(args.creatorUserId, 'creatorUserId') }
54
+ : {}),
55
+ };
56
+ const linkInfo = await resolveLink(host);
57
+ const result = await lookupReport(host, linkInfo.link, query);
58
+ warnings.push(...result.warnings);
59
+ const data = {
60
+ link: result.link,
61
+ exists: result.exists,
62
+ report: result.report,
63
+ detailUrl: result.report?.detailUrl ?? null,
64
+ warnings,
65
+ };
66
+ if (result.link === 'eb') {
67
+ data.commentsSupported = false;
68
+ warnings.push('eb 链路未提供报告评论接口,评论总条数不可用');
69
+ }
70
+ else if (result.exists && result.report?.reportId && args.withComments !== false) {
71
+ try {
72
+ const total = await commentTotalCount(host, result.report.reportId);
73
+ if (total !== null && total > 0) {
74
+ data.commentCount = total;
75
+ data.commentHint = `该报告下共有${total}条评论,是否需要查看评论内容?`;
76
+ }
77
+ }
78
+ catch {
79
+ warnings.push('评论总条数查询失败,报告详情已返回');
80
+ }
81
+ }
82
+ return planSuccess('plan.report.get', data);
83
+ },
84
+ };
85
+ // ---------------------------------------------------------------------------
86
+ // 分页查询报告列表
87
+ // ---------------------------------------------------------------------------
88
+ function pageArgs(args) {
89
+ const pageNo = args.pageNo === undefined || args.pageNo === '' ? 1 : Number(args.pageNo);
90
+ const pageSize = args.pageSize === undefined || args.pageSize === '' ? 10 : Number(args.pageSize);
91
+ if (!Number.isInteger(pageNo) || pageNo < 1) {
92
+ throw planValidationError('page_invalid', 'pageNo 必须是不小于 1 的整数');
93
+ }
94
+ if (!Number.isInteger(pageSize) || pageSize < 1 || pageSize > 100) {
95
+ throw planValidationError('page_invalid', 'pageSize 必须是 1~100 的整数');
96
+ }
97
+ return { pageNo, pageSize };
98
+ }
99
+ const planReportPage = {
100
+ name: 'plan.report.page',
101
+ resource: 'plan',
102
+ method: 'report.page',
103
+ action: 'plan.report.page',
104
+ summary: '分页查询报告列表(共享给我的报告 / 我自己与他人共享的报告),返回可直接跳转详情的行数据',
105
+ capability: 'plan',
106
+ risk: 'read',
107
+ inputSchema: schemaOf({
108
+ scope: { type: 'string', enum: ['share', 'mine'], default: 'share', description: 'share-共享给我的;mine-我自己及他人共享给我的(eb 链路按创建人筛选)' },
109
+ unreadOnly: { type: 'boolean', default: false, description: '仅看未读(标准版专属)' },
110
+ year: { type: 'integer', description: '报告年份筛选' },
111
+ type: { ...SCHEMA_REPORT_TYPE, description: '报告类型筛选' },
112
+ serialNumber: { type: 'integer', minimum: 1, description: '报告周期筛选' },
113
+ creatorUserId: { ...SCHEMA_ID, description: '报告创建人 id 筛选(eb 链路支持)' },
114
+ onlyIncludeSubs: { type: 'boolean', description: '是否只包含下属(标准版专属)' },
115
+ pageNo: { type: 'integer', minimum: 1, default: 1, description: '页码' },
116
+ pageSize: { type: 'integer', minimum: 1, maximum: 100, default: 10, description: '每页条数' },
117
+ }),
118
+ handler: async (args, { host }) => {
119
+ const { pageNo, pageSize } = pageArgs(args);
120
+ const warnings = [];
121
+ const linkInfo = await resolveLink(host);
122
+ const session = await host.getSession();
123
+ const rows = [];
124
+ if (linkInfo.link === 'standard') {
125
+ if (args.scope === 'mine') {
126
+ warnings.push('标准版分页接口只返回「共享给我的报告」,scope=mine 不能作为创建人过滤条件');
127
+ }
128
+ if (args.creatorUserId !== undefined && args.creatorUserId !== '') {
129
+ warnings.push('标准版分页接口不支持按创建人筛选,creatorUserId 已忽略');
130
+ }
131
+ const query = {
132
+ type: args.unreadOnly === true ? 'unreadPage' : 'sharePage',
133
+ pageNo,
134
+ pageSize,
135
+ };
136
+ if (args.type !== undefined)
137
+ query.workReportType = assertReportType(args.type);
138
+ if (args.onlyIncludeSubs !== undefined)
139
+ query.onlyIncludeSubs = args.onlyIncludeSubs === true;
140
+ const response = await host.request({
141
+ method: 'GET',
142
+ path: '/api/workrelate/plan/workreport/indexGet',
143
+ query,
144
+ operation: 'plan.report.page',
145
+ });
146
+ const result = response?.page?.result;
147
+ if (Array.isArray(result)) {
148
+ for (const row of result) {
149
+ const reportId = row?.id === undefined || row?.id === null || row?.id === '' ? null : String(row.id);
150
+ rows.push(normalizeStandardReport(row, await buildDetailUrl(host, 'standard', reportId)));
151
+ }
152
+ }
153
+ return planSuccess('plan.report.page', {
154
+ link: 'standard',
155
+ pageNo,
156
+ pageSize,
157
+ count: rows.length,
158
+ rows,
159
+ warnings,
160
+ });
161
+ }
162
+ if (args.unreadOnly === true)
163
+ warnings.push('eb 链路分页接口不支持「仅看未读」,unreadOnly 已忽略');
164
+ if (args.onlyIncludeSubs !== undefined)
165
+ warnings.push('eb 链路分页接口不支持 onlyIncludeSubs,已忽略');
166
+ const creator = args.creatorUserId !== undefined && args.creatorUserId !== ''
167
+ ? toIdString(args.creatorUserId, 'creatorUserId')
168
+ : session.userId;
169
+ const mainTable = { creator };
170
+ if (args.year !== undefined)
171
+ mainTable.f_year = resolveYear(args.year);
172
+ if (args.type !== undefined)
173
+ mainTable.f_type = assertReportType(args.type);
174
+ if (args.serialNumber !== undefined)
175
+ mainTable.f_serial_number = resolveSerialNumber(args.serialNumber);
176
+ const response = await host.request({
177
+ method: 'POST',
178
+ path: '/api/ebuilder/form/formdata/v2/getFormDataList/plan_pageQueryPlan',
179
+ operation: 'plan.report.page',
180
+ body: {
181
+ datajson: {
182
+ mainTable,
183
+ pageInfo: { pageNo: String(pageNo), pageSize: String(pageSize) },
184
+ header: { operator: session.userId },
185
+ },
186
+ },
187
+ });
188
+ for (const item of ebMainTables(response)) {
189
+ const reportId = item?.id === undefined || item?.id === null || item?.id === '' ? null : String(item.id);
190
+ rows.push(normalizeEbReport(item, await buildDetailUrl(host, 'eb', reportId)));
191
+ }
192
+ return planSuccess('plan.report.page', {
193
+ link: 'eb',
194
+ pageNo,
195
+ pageSize,
196
+ count: rows.length,
197
+ rows,
198
+ warnings,
199
+ });
200
+ },
201
+ };
202
+ // ---------------------------------------------------------------------------
203
+ // 报告评论列表
204
+ // ---------------------------------------------------------------------------
205
+ const planCommentList = {
206
+ name: 'plan.comment.list',
207
+ resource: 'plan',
208
+ method: 'comment.list',
209
+ action: 'plan.comment.list',
210
+ summary: '分页查询某份报告的评论内容(标准版链路);仅在用户明确要求查看评论内容时调用',
211
+ capability: 'plan',
212
+ risk: 'read',
213
+ inputSchema: schemaOf({
214
+ reportId: { ...SCHEMA_ID, description: '报告 id' },
215
+ pageNo: { type: 'integer', minimum: 1, default: 1, description: '页码' },
216
+ pageSize: { type: 'integer', minimum: 1, maximum: 100, default: 10, description: '每页条数' },
217
+ }, { required: ['reportId'] }),
218
+ handler: async (args, { host }) => {
219
+ const { pageNo, pageSize } = pageArgs(args);
220
+ const reportId = toIdString(args.reportId, 'reportId');
221
+ const linkInfo = await resolveLink(host);
222
+ assertLinkSupported(linkInfo.link, 'standard', 'plan.comment.list', 'eb 链路未提供报告评论接口,无法查询评论内容;当前租户走 e10-ebuilder 链路');
223
+ const response = await host.request({
224
+ method: 'POST',
225
+ path: '/api/plan/common/comment/commentPage',
226
+ operation: 'plan.comment.list',
227
+ body: {
228
+ pageNo,
229
+ pageSize,
230
+ targetId: reportId,
231
+ module: COMMENT_MODULE,
232
+ foldCommentList: false,
233
+ },
234
+ });
235
+ const page = response?.data?.page ?? {};
236
+ const result = Array.isArray(page.result) ? page.result : [];
237
+ const totalCount = Number(page.totalCount);
238
+ return planSuccess('plan.comment.list', {
239
+ link: 'standard',
240
+ reportId,
241
+ pageNo,
242
+ pageSize,
243
+ totalCount: Number.isFinite(totalCount) ? totalCount : result.length,
244
+ comments: result.map((item) => ({
245
+ commentId: item?.id ?? null,
246
+ commentorId: item?.commentor?.id ?? null,
247
+ commentorName: item?.commentor?.username ?? item?.commentor?.name ?? null,
248
+ content: item?.content ?? item?.originContent ?? null,
249
+ addTime: item?.addTime ?? null,
250
+ parentCommentId: item?.parent?.id ?? null,
251
+ })),
252
+ });
253
+ },
254
+ };
255
+ export const planReadOperations = [
256
+ planReportGet,
257
+ planReportPage,
258
+ planCommentList,
259
+ ];
@@ -0,0 +1,33 @@
1
+ import { planValidationError } from '../errors.js';
2
+ import { planReadOperations } from './read.js';
3
+ import { planVersionOperations } from './version.js';
4
+ import { planWriteOperations } from './write.js';
5
+ function buildRegistry() {
6
+ const registry = new Map();
7
+ const definitions = [
8
+ ...planVersionOperations,
9
+ ...planReadOperations,
10
+ ...planWriteOperations,
11
+ ];
12
+ for (const definition of definitions) {
13
+ if (registry.has(definition.name)) {
14
+ throw new Error(`duplicate plan operation: ${definition.name}`);
15
+ }
16
+ registry.set(definition.name, definition);
17
+ }
18
+ return registry;
19
+ }
20
+ const planOperationRegistry = buildRegistry();
21
+ export function planOperationDefinitions() {
22
+ return [...planOperationRegistry.values()];
23
+ }
24
+ export function getPlanOperation(operation) {
25
+ const definition = planOperationRegistry.get(operation);
26
+ if (!definition) {
27
+ throw planValidationError('operation_unknown', `计划报告模块不支持操作:${operation}`);
28
+ }
29
+ return definition;
30
+ }
31
+ export function hasPlanOperation(operation) {
32
+ return planOperationRegistry.has(operation);
33
+ }
@@ -0,0 +1,246 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { planConfirmationError, planUnsupportedError, planValidationError } from '../errors.js';
3
+ import { POST_STATUS_LABELS, POST_TIME_STATUS_LABELS, REPORT_TYPE_LABELS, REPORT_TYPE_VALUES, } from './types.js';
4
+ /** 原型污染防护:禁止出现在输入对象中的键。 */
5
+ const FORBIDDEN_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
6
+ export function asObject(value) {
7
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
8
+ throw planValidationError('input_not_object', '输入必须是 JSON 对象');
9
+ }
10
+ return value;
11
+ }
12
+ export function assertNoForbiddenKeys(input) {
13
+ for (const key of Object.keys(input)) {
14
+ if (FORBIDDEN_KEYS.has(key)) {
15
+ throw planValidationError('forbidden_key', `输入包含非法字段:${key}`);
16
+ }
17
+ }
18
+ }
19
+ export function toIdString(value, field) {
20
+ if (value === undefined || value === null || value === '') {
21
+ throw planValidationError('id_invalid', `${field} 必须是数字 ID(雪花 ID 请用字符串传递)`);
22
+ }
23
+ const text = String(value);
24
+ if (!/^\d+$/.test(text)) {
25
+ throw planValidationError('id_invalid', `${field} 必须是数字 ID`);
26
+ }
27
+ return text;
28
+ }
29
+ /**
30
+ * 人员 ID 列表归一化:接受 `"1001,1002"` 或 `["1001","1002"]`,输出英文逗号拼接字符串。
31
+ * 源资料:ids 为「英文逗号拼接」的人员 id。
32
+ */
33
+ export function toIdListText(value, field) {
34
+ const list = [];
35
+ if (Array.isArray(value)) {
36
+ for (const item of value) {
37
+ if (item === undefined || item === null || item === '')
38
+ continue;
39
+ list.push(String(item));
40
+ }
41
+ }
42
+ else if (typeof value === 'string' || typeof value === 'number') {
43
+ for (const part of String(value).split(',')) {
44
+ const trimmed = part.trim();
45
+ if (trimmed)
46
+ list.push(trimmed);
47
+ }
48
+ }
49
+ if (list.length === 0) {
50
+ throw planValidationError('ids_required', `${field} 至少需要一个人员 ID`);
51
+ }
52
+ for (const id of list) {
53
+ if (!/^\d+$/.test(id)) {
54
+ throw planValidationError('ids_invalid', `${field} 必须是人员 ID(数字字符串)`);
55
+ }
56
+ }
57
+ return list.join(',');
58
+ }
59
+ export function assertReportType(value) {
60
+ const text = typeof value === 'string' ? value : String(value);
61
+ if (!REPORT_TYPE_VALUES.includes(text)) {
62
+ throw planValidationError('type_invalid', `type 取值必须是 ${REPORT_TYPE_VALUES.join(' / ')} 之一`);
63
+ }
64
+ return text;
65
+ }
66
+ /** 报告年份:未提供时默认本年(源资料:若未提取到 year 参数,则默认取本年)。 */
67
+ export function resolveYear(value) {
68
+ if (value === undefined || value === null || value === '')
69
+ return new Date().getFullYear();
70
+ const numeric = Number(value);
71
+ if (!Number.isInteger(numeric) || numeric < 1970 || numeric > 9999) {
72
+ throw planValidationError('year_invalid', 'year 必须是四位整数年份');
73
+ }
74
+ return numeric;
75
+ }
76
+ /** 报告周期:正整数。 */
77
+ export function resolveSerialNumber(value) {
78
+ if (value === undefined || value === null || value === '') {
79
+ throw planValidationError('serial_number_required', 'serialNumber(报告周期)必填');
80
+ }
81
+ const numeric = Number(value);
82
+ if (!Number.isInteger(numeric) || numeric <= 0) {
83
+ throw planValidationError('serial_number_invalid', 'serialNumber(报告周期)必须是正整数');
84
+ }
85
+ return numeric;
86
+ }
87
+ export function requireConfirm(args, action) {
88
+ if (args.confirm !== true) {
89
+ throw planConfirmationError(action, {
90
+ hint: '重新调用时传入 confirm=true 与 prepare 返回的 continuation',
91
+ });
92
+ }
93
+ }
94
+ export function fingerprint(value) {
95
+ return createHash('sha256').update(JSON.stringify(value ?? null)).digest('hex').slice(0, 32);
96
+ }
97
+ /** 移除值为 undefined / null / '' 的键(eb 自定义接口要求空字符串字段不传)。 */
98
+ export function compact(mainTable) {
99
+ for (const key of Object.keys(mainTable)) {
100
+ const value = mainTable[key];
101
+ if (value === undefined || value === null || value === '')
102
+ delete mainTable[key];
103
+ }
104
+ return mainTable;
105
+ }
106
+ /**
107
+ * eb Select 字段归一化:可能是 `[{name,id}]`、`["week"]`、`"week"` 或数字。
108
+ * 统一返回标量字符串,便于和标准版输出对齐。
109
+ */
110
+ export function optionValue(value) {
111
+ if (value === undefined || value === null || value === '')
112
+ return undefined;
113
+ if (Array.isArray(value)) {
114
+ const first = value[0];
115
+ if (first === undefined || first === null)
116
+ return undefined;
117
+ if (typeof first === 'string' || typeof first === 'number')
118
+ return String(first);
119
+ if (typeof first === 'object') {
120
+ const record = first;
121
+ const candidate = record.id ?? record.value ?? record.name;
122
+ if (candidate === undefined || candidate === null || candidate === '')
123
+ return undefined;
124
+ return String(candidate);
125
+ }
126
+ return undefined;
127
+ }
128
+ if (typeof value === 'string' || typeof value === 'number')
129
+ return String(value);
130
+ return undefined;
131
+ }
132
+ function asNumber(value) {
133
+ if (value === undefined || value === null || value === '')
134
+ return null;
135
+ const numeric = Number(value);
136
+ return Number.isFinite(numeric) ? numeric : null;
137
+ }
138
+ function asText(value) {
139
+ if (value === undefined || value === null)
140
+ return null;
141
+ const text = String(value);
142
+ return text === '' ? null : text;
143
+ }
144
+ function typeLabelOf(type) {
145
+ return type ? (REPORT_TYPE_LABELS[type] ?? null) : null;
146
+ }
147
+ /** 标准版 workReport 结构 → 统一业务报告结构。 */
148
+ export function normalizeStandardReport(workReport, detailUrl) {
149
+ const postStatus = optionValue(workReport?.postStatus) ?? null;
150
+ const type = optionValue(workReport?.type) ?? null;
151
+ const postTimeStatus = optionValue(workReport?.postTimeStatus) ?? null;
152
+ return {
153
+ reportId: asText(workReport?.id),
154
+ title: asText(workReport?.title),
155
+ content: asText(workReport?.content),
156
+ summary: asText(workReport?.summary),
157
+ plans: asText(workReport?.plans),
158
+ year: asNumber(workReport?.year),
159
+ type,
160
+ typeLabel: typeLabelOf(type),
161
+ serialNumber: asNumber(workReport?.serialNumber),
162
+ postStatus,
163
+ postStatusLabel: postStatus ? (POST_STATUS_LABELS[postStatus] ?? null) : null,
164
+ postTime: asNumber(workReport?.postTime),
165
+ postTimeStatus,
166
+ postTimeStatusLabel: postTimeStatus ? (POST_TIME_STATUS_LABELS[postTimeStatus] ?? null) : null,
167
+ creator: {
168
+ id: asText(workReport?.creator?.id ?? workReport?.creator?.employeeId),
169
+ name: asText(workReport?.creator?.name ?? workReport?.creator?.employeeId),
170
+ },
171
+ detailUrl,
172
+ };
173
+ }
174
+ /** ebuilder mainTable(f_* 字段)→ 统一业务报告结构,避免向 Agent 暴露数据库字段名。 */
175
+ export function normalizeEbReport(mainTable, detailUrl) {
176
+ const postStatus = optionValue(mainTable?.f_post_status) ?? null;
177
+ const type = optionValue(mainTable?.f_type) ?? null;
178
+ const postTimeStatus = optionValue(mainTable?.f_post_time_status) ?? null;
179
+ return {
180
+ reportId: asText(mainTable?.id),
181
+ title: asText(mainTable?.f_title ?? mainTable?.name),
182
+ content: asText(mainTable?.f_content),
183
+ summary: asText(mainTable?.f_summary),
184
+ plans: asText(mainTable?.f_plans),
185
+ year: asNumber(mainTable?.f_year),
186
+ type,
187
+ typeLabel: typeLabelOf(type),
188
+ serialNumber: asNumber(mainTable?.f_serial_number),
189
+ postStatus,
190
+ postStatusLabel: postStatus ? (POST_STATUS_LABELS[postStatus] ?? null) : null,
191
+ postTime: asNumber(mainTable?.f_post_time),
192
+ postTimeStatus,
193
+ postTimeStatusLabel: postTimeStatus ? (POST_TIME_STATUS_LABELS[postTimeStatus] ?? null) : null,
194
+ creator: {
195
+ id: asText(mainTable?.creator),
196
+ name: null,
197
+ },
198
+ detailUrl,
199
+ };
200
+ }
201
+ /** 从 eb datajson 响应中取出 datas[].mainTable 列表。 */
202
+ export function ebMainTables(value) {
203
+ const datas = value?.datajson?.datas;
204
+ if (!Array.isArray(datas))
205
+ return [];
206
+ const list = [];
207
+ for (const item of datas) {
208
+ if (item && typeof item === 'object' && item.mainTable && typeof item.mainTable === 'object') {
209
+ list.push(item.mainTable);
210
+ }
211
+ }
212
+ return list;
213
+ }
214
+ /** 断言当前链路支持该能力,否则抛 policy 错误(源资料未提供该链路的实现依据)。 */
215
+ export function assertLinkSupported(link, supported, capability, message, details) {
216
+ if (link !== supported) {
217
+ throw planUnsupportedError('link_unsupported', message, { capability, link, expectedLink: supported, ...(details || {}) });
218
+ }
219
+ }
220
+ /** 校验 confirm + continuation,并确认登录上下文未变化。 */
221
+ export async function ensureConfirmLease(args, action, env) {
222
+ requireConfirm(args, action);
223
+ const lease = await env.continuation.verify(args.continuation, action);
224
+ const session = await env.host.getSession();
225
+ if (lease.baseUrl !== session.baseUrl || lease.profile !== session.profile || lease.userId !== session.userId) {
226
+ throw planValidationError('context_mismatch', '确认上下文已变化(租户或登录账号不同),请重新执行 prepare');
227
+ }
228
+ return lease;
229
+ }
230
+ /** 默认提醒文案(源资料:年份、周期随实际条件替换)。 */
231
+ export function defaultRemindContent(type, year, serialNumber) {
232
+ switch (type) {
233
+ case 'week':
234
+ return `请提交${year}年第${serialNumber}周的报告`;
235
+ case 'month':
236
+ return `请提交${year}年${serialNumber}月的报告`;
237
+ case 'season':
238
+ return `请提交${year}年第${serialNumber}季度的报告`;
239
+ case 'halfYear':
240
+ return `请提交${year}年年中报告`;
241
+ case 'year':
242
+ return `请提交${year}年年度报告`;
243
+ default:
244
+ return `请提交${year}年的报告`;
245
+ }
246
+ }
@@ -0,0 +1,49 @@
1
+ export function planSuccess(action, data, meta) {
2
+ const payload = { ok: true, action, data };
3
+ if (meta && Object.keys(meta).length > 0)
4
+ payload.meta = meta;
5
+ return payload;
6
+ }
7
+ /** 构造「对象类型 + 严格禁止额外字段」的 JSON Schema。 */
8
+ export function schemaOf(properties, options = {}) {
9
+ return {
10
+ type: 'object',
11
+ additionalProperties: false,
12
+ properties,
13
+ ...(options.required?.length ? { required: options.required } : {}),
14
+ ...(options.oneOf?.length ? { oneOf: options.oneOf } : {}),
15
+ ...(options.anyOf?.length ? { anyOf: options.anyOf } : {}),
16
+ ...(options.description ? { description: options.description } : {}),
17
+ };
18
+ }
19
+ /** 报告 ID / 人员 ID:雪花 ID 语义,接受数字或数字字符串。 */
20
+ export const SCHEMA_ID = {
21
+ oneOf: [{ type: 'integer' }, { type: 'string', pattern: '^\\d+$' }],
22
+ };
23
+ /** 需要保持字符串形态的雪花 ID(人员 ID 等)。 */
24
+ export const SCHEMA_ID_STRING = { type: 'string', minLength: 1, pattern: '^\\d+$' };
25
+ /** 多个人员 ID(英文字逗号拼接)。 */
26
+ export const SCHEMA_ID_LIST_TEXT = { type: 'string', pattern: '^\\d+(,\\d+)*$' };
27
+ export const REPORT_TYPE_VALUES = ['week', 'month', 'season', 'halfYear', 'year'];
28
+ export const SCHEMA_REPORT_TYPE = { type: 'string', enum: [...REPORT_TYPE_VALUES] };
29
+ export const SHARE_TYPE_VALUES = ['sharePage', 'unreadPage'];
30
+ /** 发布状态:0-草稿 1-已发布 2-已撤回 3-审批中 4-被退回。 */
31
+ export const POST_STATUS_LABELS = {
32
+ '0': '草稿',
33
+ '1': '已发布',
34
+ '2': '已撤回',
35
+ '3': '审批中',
36
+ '4': '被退回',
37
+ };
38
+ /** 发布时效状态:1-正常提交 2-补交。 */
39
+ export const POST_TIME_STATUS_LABELS = {
40
+ '1': '正常提交',
41
+ '2': '补交',
42
+ };
43
+ export const REPORT_TYPE_LABELS = {
44
+ week: '周报',
45
+ month: '月报',
46
+ season: '季报',
47
+ halfYear: '年中报告',
48
+ year: '年报',
49
+ };
@@ -0,0 +1,49 @@
1
+ import { planSuccess, schemaOf } from './types.js';
2
+ import { resolveEbFormId, resolveLink, PLAN_EB_FORM_TAG } from './link.js';
3
+ // ---------------------------------------------------------------------------
4
+ // 版本判定与链路路由(租户级缓存 1 天)
5
+ // ---------------------------------------------------------------------------
6
+ const planVersionCheck = {
7
+ name: 'plan.version.check',
8
+ resource: 'plan',
9
+ method: 'version.check',
10
+ action: 'plan.version.check',
11
+ summary: '判定当前租户的计划报告接口链路(standard / eb),命中 1 天租户缓存时跳过接口调用',
12
+ capability: 'plan',
13
+ risk: 'read',
14
+ inputSchema: schemaOf({
15
+ refresh: { type: 'boolean', default: false, description: 'true 时忽略缓存重新调用版本接口' },
16
+ }),
17
+ handler: async (args, { host }) => {
18
+ const info = await resolveLink(host, { refresh: args.refresh === true });
19
+ return planSuccess('plan.version.check', {
20
+ ...info,
21
+ versionInterface: 'plan_searchAppver',
22
+ });
23
+ },
24
+ };
25
+ // ---------------------------------------------------------------------------
26
+ // ebuilder 报告详情页表单 id(idobjId)解析与长期缓存
27
+ // ---------------------------------------------------------------------------
28
+ const planEbFormResolve = {
29
+ name: 'plan.eb.form.resolve',
30
+ resource: 'plan',
31
+ method: 'eb.form.resolve',
32
+ action: 'plan.eb.form.resolve',
33
+ summary: '解析 ebuilder 报告详情表单 id(idobjId),用于生成报告详情页链接;解析结果按租户长期缓存',
34
+ capability: 'plan',
35
+ risk: 'read',
36
+ inputSchema: schemaOf({}),
37
+ handler: async (_args, { host }) => {
38
+ const info = await resolveEbFormId(host);
39
+ return planSuccess('plan.eb.form.resolve', {
40
+ ...info,
41
+ appTag: info.appTag,
42
+ formTag: PLAN_EB_FORM_TAG,
43
+ });
44
+ },
45
+ };
46
+ export const planVersionOperations = [
47
+ planVersionCheck,
48
+ planEbFormResolve,
49
+ ];