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,249 @@
1
+ import { buildCardLink, pickPersonField } from '../host.js';
2
+ import { ziguanjiaValidationError } from '../errors.js';
3
+ import { ziguanjiaFixed } from '../manifest.js';
4
+ import { loadTypeCache, matchTypeName, saveTypeCache } from './type-cache.js';
5
+ import { asObject, buildPageInfo, evaluateVersionGate, getDatas, mainTableOf, ok, } from './shared.js';
6
+ const SCENE_TAGS = ziguanjiaFixed.VIEW_LINK_SCENE_TAGS;
7
+ export class ZiguanjiaQueryOperation {
8
+ name;
9
+ config;
10
+ constructor(name, config) {
11
+ this.name = name;
12
+ this.config = config;
13
+ }
14
+ async execute(input, context) {
15
+ const { host } = context;
16
+ const body = asObject(input, this.name);
17
+ for (const key of Object.keys(body)) {
18
+ if (!this.config.bodyFields.includes(key)
19
+ && key !== 'page_no'
20
+ && key !== 'page_size'
21
+ && key !== 'person_id'
22
+ && key !== 'with_view_link') {
23
+ throw ziguanjiaValidationError('input_field_unsupported', `查询不支持字段:${key}`);
24
+ }
25
+ }
26
+ if (this.config.requireAtLeastOne && !this.config.requireAtLeastOne.some((f) => body[f] !== undefined && body[f] !== '')) {
27
+ throw ziguanjiaValidationError('input_required', `至少需要提供一个字段:${this.config.requireAtLeastOne.join(' / ')}`);
28
+ }
29
+ const session = await host.getSession();
30
+ const mainTable = {};
31
+ const query = {};
32
+ for (const field of this.config.bodyFields) {
33
+ // person_id 是"人员值"输入,由下方 person 块按契约落到 URL / 运行时字段 / 固定字段,禁止直写 mainTable。
34
+ if (field === 'person_id')
35
+ continue;
36
+ if (body[field] !== undefined && body[field] !== '')
37
+ mainTable[field] = body[field];
38
+ }
39
+ // 人员过滤三态:URL 查询参数 / 运行时字段定义 / 固定 body 字段;person_id 缺省时按 defaultPersonIdFromSession 回落当前登录人。
40
+ const providedPersonId = body.person_id !== undefined && body.person_id !== '' ? body.person_id : undefined;
41
+ const hasPurchaser = body.purchaser !== undefined && body.purchaser !== '';
42
+ const personValue = providedPersonId !== undefined
43
+ ? providedPersonId
44
+ : this.config.defaultPersonIdFromSession && !hasPurchaser
45
+ ? session.userId
46
+ : undefined;
47
+ if (personValue !== undefined) {
48
+ if (this.config.personQueryParam) {
49
+ query[this.config.personQueryParam] = personValue;
50
+ }
51
+ else if (this.config.personField) {
52
+ const fields = await host.getFormFields(this.config.personField.formTag);
53
+ const field = pickPersonField(fields, this.config.personField.candidates);
54
+ if (!field || !field.name) {
55
+ throw ziguanjiaValidationError('person_field_unresolved', `无法从表单 ${this.config.personField.formTag} 的字段定义中确定领用人字段(候选:${this.config.personField.candidates.join(' / ')});请明确提供具体的领用人字段名或人员 ID`);
56
+ }
57
+ mainTable[field.name] = personValue;
58
+ }
59
+ else if (this.config.writePersonIdTo) {
60
+ mainTable[this.config.writePersonIdTo] = personValue;
61
+ }
62
+ else {
63
+ mainTable.person_id = personValue;
64
+ }
65
+ }
66
+ const pageInfo = buildPageInfo(body.page_no, body.page_size, this.config.pageSizeDefault);
67
+ const request = {
68
+ endpoint: 'getFormDataList',
69
+ interfacePk: this.config.interfacePk,
70
+ operation: this.name,
71
+ body: { mainTable, pageInfo },
72
+ };
73
+ // 仅在确有人员过滤时才带 URL query,保持无过滤时请求形状干净。
74
+ if (Object.keys(query).length > 0)
75
+ request.query = query;
76
+ const result = await host.ebuilderRequest(request);
77
+ const datas = getDatas(result).map(mainTableOf);
78
+ let viewLinkWarning;
79
+ if (this.config.viewLinkScene && body.with_view_link !== false) {
80
+ const formTag = SCENE_TAGS[this.config.viewLinkScene];
81
+ try {
82
+ const objId = await host.resolveFormId({ formTag, operation: this.name });
83
+ for (const item of datas) {
84
+ const dataId = item.id ?? item.mainTable?.id;
85
+ const link = dataId !== undefined && dataId !== null ? buildCardLink(session.baseUrl, objId, String(dataId)) : null;
86
+ if (link)
87
+ item.view_link = link;
88
+ }
89
+ }
90
+ catch (error) {
91
+ // 红线:链接是附加信息,解析失败只说明「链接暂不可用」,绝不因此重试主查询。
92
+ viewLinkWarning = `查看链接暂不可用:${error instanceof Error ? error.message : String(error)};主查询已成功,不要因此重试查询。`;
93
+ }
94
+ }
95
+ return ok('COMPLETE', {
96
+ items: datas,
97
+ count: datas.length,
98
+ ...(viewLinkWarning ? { view_link_warning: viewLinkWarning } : {}),
99
+ });
100
+ }
101
+ }
102
+ export class ZiguanjiaResolveOperation {
103
+ name;
104
+ interfacePk;
105
+ nameField;
106
+ enableTypeCache;
107
+ constructor(name, interfacePk, nameField, enableTypeCache = false) {
108
+ this.name = name;
109
+ this.interfacePk = interfacePk;
110
+ this.nameField = nameField;
111
+ this.enableTypeCache = enableTypeCache;
112
+ }
113
+ async execute(input, context) {
114
+ const { host } = context;
115
+ const body = asObject(input, this.name);
116
+ const nameValue = typeof body[this.nameField] === 'string' ? body[this.nameField].trim() : '';
117
+ if (nameValue === '')
118
+ throw ziguanjiaValidationError('input_required', `必须提供 ${this.nameField}`);
119
+ // 资产类型:优先用运行时缓存(24h),减少反复打接口(_dict.md「资产类型解析」)。
120
+ if (this.enableTypeCache) {
121
+ const session = await host.getSession();
122
+ const cache = await loadTypeCache(session.baseUrl);
123
+ if (cache) {
124
+ const m = matchTypeName(cache.items, nameValue);
125
+ if (m) {
126
+ return this.resolved(nameValue, m.id, m.matched, cache.items.length);
127
+ }
128
+ // 缓存命中但名称未匹配:回退实时全量枚举并刷新缓存(可能字典新增了类型)。
129
+ }
130
+ const all = await this.enumerateAll(host);
131
+ if (!cache)
132
+ await saveTypeCache(session.baseUrl, all);
133
+ const m2 = matchTypeName(all, nameValue);
134
+ if (m2)
135
+ return this.resolved(nameValue, m2.id, m2.matched, all.length);
136
+ const contains = all.filter((i) => i.type_name.includes(nameValue) || nameValue.includes(i.type_name));
137
+ if (contains.length > 1) {
138
+ throw ziguanjiaValidationError('resolve_ambiguous', `按 ${this.nameField}=${nameValue} 模糊解析到多条候选,请改用 ID 或提供更精确名称`, {
139
+ candidates: contains.slice(0, 10).map((i) => ({ id: i.id, name: i.type_name })),
140
+ });
141
+ }
142
+ throw ziguanjiaValidationError('resolve_not_found', `未解析到 ${this.nameField}=${nameValue} 的资产类型(本环境正式名如「便携式计算机」而非「笔记本电脑」)`);
143
+ }
144
+ // 地点 / 状态:实时查询 + 精确匹配;0 命中回退全量枚举再比对;contains 命中单条采用。
145
+ const filtered = await host.ebuilderRequest({
146
+ endpoint: 'getFormDataList',
147
+ interfacePk: this.interfacePk,
148
+ operation: this.name,
149
+ body: { mainTable: { [this.nameField]: nameValue }, pageInfo: buildPageInfo(undefined, undefined, 50) },
150
+ });
151
+ const exact = getDatas(filtered).map(mainTableOf).filter((item) => String(item[this.nameField] ?? '') === nameValue);
152
+ if (exact.length >= 1) {
153
+ if (exact.length > 1) {
154
+ throw ziguanjiaValidationError('resolve_ambiguous', `按 ${this.nameField}=${nameValue} 解析到多条记录,请改用 ID 明确指定`, {
155
+ candidates: exact.slice(0, 10).map((item) => item.id ?? item.mainTable?.id),
156
+ });
157
+ }
158
+ return this.resolved(nameValue, String(exact[0].id ?? exact[0].mainTable?.id), 'exact', exact.length);
159
+ }
160
+ const full = await host.ebuilderRequest({
161
+ endpoint: 'getFormDataList',
162
+ interfacePk: this.interfacePk,
163
+ operation: this.name,
164
+ body: { mainTable: {}, pageInfo: buildPageInfo(undefined, undefined, 50) },
165
+ });
166
+ const allItems = getDatas(full).map(mainTableOf);
167
+ const exactAll = allItems.filter((item) => String(item[this.nameField] ?? '') === nameValue);
168
+ if (exactAll.length >= 1) {
169
+ if (exactAll.length > 1) {
170
+ throw ziguanjiaValidationError('resolve_ambiguous', `按 ${this.nameField}=${nameValue} 解析到多条记录,请改用 ID 明确指定`, {
171
+ candidates: exactAll.slice(0, 10).map((item) => item.id ?? item.mainTable?.id),
172
+ });
173
+ }
174
+ return this.resolved(nameValue, String(exactAll[0].id ?? exactAll[0].mainTable?.id), 'exact', allItems.length);
175
+ }
176
+ const contains = allItems.filter((item) => {
177
+ const v = String(item[this.nameField] ?? '');
178
+ return v !== '' && (v.includes(nameValue) || nameValue.includes(v));
179
+ });
180
+ if (contains.length === 1) {
181
+ return this.resolved(nameValue, String(contains[0].id ?? contains[0].mainTable?.id), 'contains', allItems.length);
182
+ }
183
+ if (contains.length > 1) {
184
+ throw ziguanjiaValidationError('resolve_ambiguous', `按 ${this.nameField}=${nameValue} 模糊解析到多条候选,请改用 ID 或提供更精确名称`, {
185
+ candidates: contains.slice(0, 10).map((item) => ({ id: item.id ?? item.mainTable?.id, name: item[this.nameField] })),
186
+ });
187
+ }
188
+ throw ziguanjiaValidationError('resolve_not_found', `未解析到 ${this.nameField}=${nameValue} 的引用记录`);
189
+ }
190
+ resolved(nameValue, id, matched, total) {
191
+ const items = [{ id, name: nameValue }];
192
+ return ok(matched === 'contains' ? 'RESOLVED_FUZZY' : 'COMPLETE', {
193
+ items,
194
+ count: items.length,
195
+ nameField: this.nameField,
196
+ resolved_id: id,
197
+ matched,
198
+ ...(matched === 'contains' ? { note: `名称「${nameValue}」映射到正式名,已采用对应 ID` } : {}),
199
+ total_scanned: total,
200
+ });
201
+ }
202
+ /** 资产类型全量枚举(pageSize 50,封顶 40 页 = 2000 条),用于缓存与兜底匹配。 */
203
+ async enumerateAll(host) {
204
+ const out = [];
205
+ for (let page = 1; page <= 40; page++) {
206
+ const result = await host.ebuilderRequest({
207
+ endpoint: 'getFormDataList',
208
+ interfacePk: this.interfacePk,
209
+ operation: this.name,
210
+ body: { mainTable: {}, pageInfo: { pageNo: String(page), pageSize: '50' } },
211
+ });
212
+ const datas = getDatas(result).map(mainTableOf);
213
+ if (datas.length === 0)
214
+ break;
215
+ for (const item of datas) {
216
+ const id = item.id ?? item.mainTable?.id;
217
+ const typeName = item[this.nameField];
218
+ if (id !== undefined && id !== null && typeName !== undefined && typeName !== null) {
219
+ out.push({ id: String(id), type_name: String(typeName) });
220
+ }
221
+ }
222
+ if (datas.length < 50)
223
+ break;
224
+ }
225
+ return out;
226
+ }
227
+ }
228
+ export class ZiguanjiaGateCheckOperation {
229
+ name = 'asset.gate.check';
230
+ async execute(_input, context) {
231
+ const { host } = context;
232
+ const result = await host.ebuilderRequest({
233
+ endpoint: 'getFormDataList',
234
+ interfacePk: 'zgjasset_search_appver',
235
+ operation: this.name,
236
+ body: { mainTable: {}, pageInfo: { pageNo: '1', pageSize: '10' } },
237
+ });
238
+ const gate = evaluateVersionGate(result);
239
+ if (!gate.passed) {
240
+ return ok('VERSION_GATE_FAILED', {
241
+ passed: false,
242
+ raw: gate.raw ?? null,
243
+ version: gate.version ?? null,
244
+ message: '版本门禁未通过,需要 zgjasset_search_appver 存在 ver_name ≥ V14 的记录',
245
+ });
246
+ }
247
+ return ok('VERSION_GATE_PASSED', { passed: true, raw: gate.raw ?? null, version: gate.version ?? null });
248
+ }
249
+ }
@@ -0,0 +1,85 @@
1
+ import { ziguanjiaValidationError } from '../errors.js';
2
+ import { ziguanjiaFixed, ziguanjiaOperations } from '../manifest.js';
3
+ import { ZiguanjiaGateCheckOperation, ZiguanjiaQueryOperation, ZiguanjiaResolveOperation, } from './query.js';
4
+ import { ZiguanjiaViewLinkOperation } from './viewlink.js';
5
+ import { ZiguanjiaCreateOperation, ZiguanjiaDepreOperation, ZiguanjiaPurchOperation, ZiguanjiaRepairCreateOperation, ZiguanjiaRepairQueryOperation, ZiguanjiaReturnCreateOperation, ZiguanjiaReturnQueryOperation, ZiguanjiaUpdateOperation, ZiguanjiaUseOperation, } from './write.js';
6
+ const EB = ziguanjiaFixed.EB_INTERFACE_PK;
7
+ function buildRegistry() {
8
+ const registry = new Map();
9
+ const handlers = [
10
+ new ZiguanjiaGateCheckOperation(),
11
+ new ZiguanjiaQueryOperation('asset.list', {
12
+ interfacePk: EB.baseList,
13
+ bodyFields: ['id', 'asset_name', 'asset_number', 'stateid', 'asset_type_browse', 'location_browse', 'admin_istrator', 'resourceid'],
14
+ pageSizeDefault: 10,
15
+ // 资产列表:给了人员才拼 ?person_id=,未给人员不拼(不设置 defaultPersonIdFromSession)。
16
+ personQueryParam: 'person_id',
17
+ viewLinkScene: 'asset_info',
18
+ }),
19
+ new ZiguanjiaQueryOperation('asset.detail', {
20
+ interfacePk: EB.baseDetail,
21
+ bodyFields: ['id', 'asset_number', 'asset_name'],
22
+ pageSizeDefault: 10,
23
+ requireAtLeastOne: ['id', 'asset_number', 'asset_name'],
24
+ viewLinkScene: 'asset_info',
25
+ }),
26
+ new ZiguanjiaQueryOperation('asset.uselist', {
27
+ interfacePk: EB.useList,
28
+ bodyFields: [],
29
+ pageSizeDefault: 5,
30
+ // 领用人字段以运行时字段定义为准(候选 resourceid/apply_person/use_person),不硬编码 person_id。
31
+ defaultPersonIdFromSession: true,
32
+ personField: { formTag: 'uf_asset_use', candidates: ['resourceid', 'apply_person', 'use_person'] },
33
+ viewLinkScene: 'asset_use',
34
+ }),
35
+ new ZiguanjiaQueryOperation('asset.repaillist', {
36
+ interfacePk: EB.repairList,
37
+ bodyFields: [],
38
+ pageSizeDefault: 5,
39
+ // 报修记录:人员写入主表 repair_user(来源 _person.md 契约)。
40
+ defaultPersonIdFromSession: true,
41
+ writePersonIdTo: 'repair_user',
42
+ viewLinkScene: 'asset_repail',
43
+ }),
44
+ new ZiguanjiaQueryOperation('asset.purchaselist', {
45
+ interfacePk: EB.purchList,
46
+ bodyFields: ['purchaser'],
47
+ pageSizeDefault: 5,
48
+ // 采购申请:人员拼 ?person_id=(默认当前登录人);purchaser 走 body,二者同一请求只用其一。
49
+ defaultPersonIdFromSession: true,
50
+ personQueryParam: 'person_id',
51
+ viewLinkScene: 'asset_purch_apply',
52
+ }),
53
+ new ZiguanjiaResolveOperation('asset.resolve.location', EB.location, 'house_name'),
54
+ new ZiguanjiaResolveOperation('asset.resolve.status', EB.status, 'status_name'),
55
+ new ZiguanjiaResolveOperation('asset.resolve.type', EB.type, 'type_name', true),
56
+ new ZiguanjiaCreateOperation(),
57
+ new ZiguanjiaUpdateOperation(),
58
+ new ZiguanjiaUseOperation(),
59
+ new ZiguanjiaReturnQueryOperation(),
60
+ new ZiguanjiaReturnCreateOperation(),
61
+ new ZiguanjiaRepairQueryOperation(),
62
+ new ZiguanjiaRepairCreateOperation(),
63
+ new ZiguanjiaPurchOperation(),
64
+ new ZiguanjiaDepreOperation(),
65
+ new ZiguanjiaViewLinkOperation(),
66
+ ];
67
+ for (const handler of handlers) {
68
+ if (registry.has(handler.name))
69
+ throw new Error(`duplicate ziguanjia operation handler: ${handler.name}`);
70
+ registry.set(handler.name, handler);
71
+ }
72
+ for (const contract of ziguanjiaOperations) {
73
+ if (!registry.has(contract.name))
74
+ throw new Error(`missing ziguanjia operation handler: ${contract.name}`);
75
+ }
76
+ return registry;
77
+ }
78
+ const ziguanjiaOperationRegistry = buildRegistry();
79
+ export function getZiguanjiaOperation(operation) {
80
+ const handler = ziguanjiaOperationRegistry.get(operation);
81
+ if (!handler) {
82
+ throw ziguanjiaValidationError('operation_unknown', `资管家不支持操作:${operation}`);
83
+ }
84
+ return handler;
85
+ }
@@ -0,0 +1,100 @@
1
+ import { ziguanjiaValidationError } from '../errors.js';
2
+ export function ok(status, data) {
3
+ return { status, data };
4
+ }
5
+ export function asObject(value, name = '业务输入') {
6
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
7
+ throw ziguanjiaValidationError('input_invalid', `${name}必须是 JSON 对象`);
8
+ }
9
+ return value;
10
+ }
11
+ export function getDatas(value) {
12
+ const root = value && typeof value === 'object' && 'datajson' in value ? value.datajson : value;
13
+ if (!root || !Array.isArray(root.datas))
14
+ return [];
15
+ return root.datas;
16
+ }
17
+ export function mainTableOf(item) {
18
+ if (!item || typeof item !== 'object')
19
+ return {};
20
+ if (item.mainTable && typeof item.mainTable === 'object')
21
+ return item.mainTable;
22
+ return item;
23
+ }
24
+ export function buildPageInfo(pageNo, pageSize, defaultPageSize = 10) {
25
+ // 源资料约定 pageInfo.pageNo/pageSize 为字符串("1"/"10"),E10 ebuilder 按字符串分页。
26
+ const norm = (value, fallback) => {
27
+ const num = typeof value === 'number' && Number.isFinite(value) ? value : Number(value);
28
+ return String(typeof num === 'number' && Number.isFinite(num) && num >= 1 ? Math.trunc(num) : fallback);
29
+ };
30
+ return {
31
+ pageNo: norm(pageNo, 1),
32
+ pageSize: norm(pageSize, defaultPageSize),
33
+ };
34
+ }
35
+ export function asPositiveString(value, name) {
36
+ if (typeof value !== 'string' || !/^\d+$/u.test(value) || value === '0') {
37
+ throw ziguanjiaValidationError('input_invalid', `${name} 必须是正整数文本`);
38
+ }
39
+ return value;
40
+ }
41
+ /**
42
+ * 动作流返回统一透传。
43
+ *
44
+ * 源资料约定:业务数据挂在 `actionData.responseData.customData.mainTable`
45
+ * (部分环境/接口可能只到 `actionData.customData.mainTable`)。
46
+ * 创建类动作流返回的 `lcID`(流程 ID)/ `ghbh`(归还编号)/ `lcbt`(流程标题)/
47
+ * `repail_no` 等关键标识都在 `mainTable` 里,是后续拼「查看详情」链接的唯一来源
48
+ * (见 `_viewlink.md`:asset_return / asset_repail / asset_use / asset_purch_apply 场景取 lcID 作 dataID)。
49
+ *
50
+ * 因此**必须整体透传**,并额外把 `mainTable` 提到顶层、再保留 customData / responseData,
51
+ * 避免调用方取不到流程 ID 而无法生成链接(历史缺陷:return.create 只回 resultCode/resultMsg,
52
+ * 把 actionData 整个丢掉,导致归还单拿不到 lcID)。
53
+ */
54
+ export function actionFlowResult(result) {
55
+ const actionData = result?.actionData ?? {};
56
+ const responseData = actionData?.responseData ?? {};
57
+ const customData = responseData?.customData ?? actionData?.customData ?? {};
58
+ return {
59
+ resultCode: result?.resultCode,
60
+ resultMsg: result?.resultMsg,
61
+ actionData,
62
+ responseData,
63
+ customData,
64
+ mainTable: customData?.mainTable ?? {},
65
+ };
66
+ }
67
+ function extractVersionField(mainTable) {
68
+ const raw = mainTable?.ver_name ?? mainTable?.current_ver;
69
+ if (raw === undefined || raw === null)
70
+ return undefined;
71
+ return String(raw).trim();
72
+ }
73
+ export function parseVersion(value) {
74
+ const cleaned = value.replace(/^v/iu, '').replace(/\s+/gu, '');
75
+ const match = cleaned.match(/\d+/u);
76
+ return match ? Number(match[0]) : undefined;
77
+ }
78
+ export function evaluateVersionGate(value) {
79
+ const datas = getDatas(value);
80
+ const first = datas[0] ? mainTableOf(datas[0]) : undefined;
81
+ const raw = first ? extractVersionField(first) : undefined;
82
+ if (!raw)
83
+ return { passed: false, raw };
84
+ const version = parseVersion(raw);
85
+ if (version === undefined)
86
+ return { passed: false, raw, versionField: raw };
87
+ return { passed: version >= 14, raw, version };
88
+ }
89
+ export async function ensureVersionGate(host, operation) {
90
+ const result = await host.ebuilderRequest({
91
+ endpoint: 'getFormDataList',
92
+ interfacePk: 'zgjasset_search_appver',
93
+ operation,
94
+ body: { mainTable: {}, pageInfo: { pageNo: '1', pageSize: '10' } },
95
+ });
96
+ const gate = evaluateVersionGate(result);
97
+ if (!gate.passed) {
98
+ throw ziguanjiaValidationError('version_gate_failed', `版本门禁未通过(zgjasset_search_appver 无 ver_name ≥ V14 记录,实际=${gate.raw ?? '空'}),已停止,不执行任何资产查询 / 写操作。待门禁真正通过后再处理。`, { gate });
99
+ }
100
+ }
@@ -0,0 +1,49 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ /**
5
+ * 资产类型解析运行时缓存(源资料 _dict.md「资产类型解析」)。
6
+ * 资产类型数据量可能很大,且「默认子集只返部分记录」是常见坑;首次解析某环境全量类型后
7
+ * 落到 skill 包之外的运行时数据目录,之后本地匹配、24h 过期重建。严禁写入 skill 包内(对外分发)。
8
+ */
9
+ const CACHE_DIR = path.join(os.homedir(), '.workbuddy', 'data', 'weaver-e10-ziguanjia');
10
+ const TTL_MS = 24 * 60 * 60 * 1000;
11
+ export async function loadTypeCache(env) {
12
+ try {
13
+ const raw = await fs.readFile(path.join(CACHE_DIR, `asset_type_cache_${env}.json`), 'utf8');
14
+ const data = JSON.parse(raw);
15
+ if (data.env !== env)
16
+ return null;
17
+ const age = Date.now() - new Date(data.updated_at).getTime();
18
+ if (!Number.isFinite(age) || age >= TTL_MS)
19
+ return null;
20
+ if (!Array.isArray(data.items))
21
+ return null;
22
+ return data;
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ export async function saveTypeCache(env, items) {
29
+ try {
30
+ await fs.mkdir(CACHE_DIR, { recursive: true });
31
+ await fs.writeFile(path.join(CACHE_DIR, `asset_type_cache_${env}.json`), JSON.stringify({ env, updated_at: new Date().toISOString(), count: items.length, items }, null, 2));
32
+ }
33
+ catch {
34
+ // 缓存写入失败仅影响下次加速,不阻断解析
35
+ }
36
+ }
37
+ /**
38
+ * 在已加载的类型集合中按名称匹配:精确命中单条直接采用;contains 命中单条采用(如「笔记本」命中「便携式计算机」),
39
+ * 并注明映射到正式名;0 命中或命中多条返回 null,由调用方决定兜底或报歧义。
40
+ */
41
+ export function matchTypeName(items, name) {
42
+ const exact = items.find((i) => i.type_name === name);
43
+ if (exact)
44
+ return { id: exact.id, matched: 'exact' };
45
+ const contains = items.filter((i) => i.type_name.includes(name) || name.includes(i.type_name));
46
+ if (contains.length === 1)
47
+ return { id: contains[0].id, matched: 'contains' };
48
+ return null;
49
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,117 @@
1
+ import { assertNoForbiddenKeys } from '../host.js';
2
+ import { ziguanjiaValidationError } from '../errors.js';
3
+ import { ziguanjiaFixed } from '../manifest.js';
4
+ import { asObject, ok } from './shared.js';
5
+ const SCENE_TAGS = ziguanjiaFixed.VIEW_LINK_SCENE_TAGS;
6
+ const DEPRE_VIEWPORT_PATH = ziguanjiaFixed.DEPRE_VIEWPORT_PATH;
7
+ const APP_TAG = 'weaver-asset-eb';
8
+ const DEFAULT_ANCHOR = '查看详情';
9
+ function isCardScene(scene) {
10
+ return Object.prototype.hasOwnProperty.call(SCENE_TAGS, scene);
11
+ }
12
+ function joinUrl(baseUrl, path) {
13
+ if (typeof baseUrl !== 'string' || baseUrl.trim() === '')
14
+ return null;
15
+ return `${baseUrl.replace(/\/+$/u, '')}${path}`;
16
+ }
17
+ /**
18
+ * 数据 ID 必须是可直接放进路径片段的裸 ID,不含空白与路径/查询分隔符,
19
+ * 避免拼接出越权或打不开的链接。
20
+ */
21
+ function assertSafeDataId(dataId) {
22
+ if (/[\s/\\?#]/u.test(dataId)) {
23
+ throw ziguanjiaValidationError('input_invalid', `数据 ID 含有不允许的字符:${dataId}`);
24
+ }
25
+ }
26
+ /**
27
+ * 构造卡片式查看链接 /sp/ebdfpage/card/0/{表单ID}/{数据ID},
28
+ * 表单 ID 经「应用标签 → 表单标签」两步接口实时解析,不写死、不臆造。
29
+ *
30
+ * 契约红线:链接是附加信息。主查询/新建/修改/动作流已经成功后,
31
+ * 链接解析失败只如实说明「链接暂不可用」,绝不因此重试主操作
32
+ * (重试会重复查询、重复建单、重复改动数据)。
33
+ */
34
+ export class ZiguanjiaViewLinkOperation {
35
+ name = 'asset.viewlink';
36
+ async execute(input, context) {
37
+ const body = asObject(input, this.name);
38
+ assertNoForbiddenKeys(body);
39
+ const scene = typeof body.scene === 'string' ? body.scene.trim() : '';
40
+ if (scene === '') {
41
+ throw ziguanjiaValidationError('input_required', 'scene 必填');
42
+ }
43
+ const anchor = typeof body.anchor === 'string' && body.anchor.trim() !== ''
44
+ ? body.anchor.trim()
45
+ : DEFAULT_ANCHOR;
46
+ const session = await context.host.getSession();
47
+ // 计提任务是固定 viewport 页面,路径内已含页面 ID,不需要表单 ID 标签解析。
48
+ if (scene === 'depre_task') {
49
+ const calcMonth = typeof body.calc_month === 'string' ? body.calc_month.trim() : '';
50
+ if (!/^\d{4}-\d{2}$/u.test(calcMonth)) {
51
+ throw ziguanjiaValidationError('input_invalid', 'depre_task 场景必须提供 calc_month,格式 YYYY-MM');
52
+ }
53
+ const path = `${DEPRE_VIEWPORT_PATH}?calc_month=${calcMonth}`;
54
+ return ok('COMPLETE', {
55
+ scene,
56
+ mode: 'viewport',
57
+ formTag: null,
58
+ objId: null,
59
+ anchor,
60
+ links: [{ dataId: null, calc_month: calcMonth, path, url: joinUrl(session.baseUrl, path), anchor }],
61
+ available: true,
62
+ warnings: [],
63
+ });
64
+ }
65
+ if (!isCardScene(scene)) {
66
+ throw ziguanjiaValidationError('input_invalid', `不支持的 scene:${scene}`);
67
+ }
68
+ const ids = body.ids;
69
+ if (!Array.isArray(ids) || ids.length === 0) {
70
+ throw ziguanjiaValidationError('input_required', 'ids 必填,至少提供一个数据 ID(字符串)');
71
+ }
72
+ const dataIds = ids
73
+ .map((item) => (item === undefined || item === null ? '' : String(item).trim()))
74
+ .filter((item) => item !== '');
75
+ if (dataIds.length === 0) {
76
+ throw ziguanjiaValidationError('input_invalid', 'ids 不能全为空值');
77
+ }
78
+ for (const dataId of dataIds)
79
+ assertSafeDataId(dataId);
80
+ const formTag = SCENE_TAGS[scene];
81
+ let objId = null;
82
+ let warnings = [];
83
+ try {
84
+ objId = await context.host.resolveFormId({ formTag, appTag: APP_TAG, operation: this.name });
85
+ }
86
+ catch (error) {
87
+ const reason = error instanceof Error ? error.message : String(error);
88
+ warnings = [`链接暂不可用:${reason};主操作已成功,不要因此重试查询 / 建单 / 改单。`];
89
+ }
90
+ if (!objId) {
91
+ return ok('VIEWLINK_UNAVAILABLE', {
92
+ scene,
93
+ mode: 'card',
94
+ formTag,
95
+ objId: null,
96
+ anchor,
97
+ links: [],
98
+ available: false,
99
+ warnings,
100
+ });
101
+ }
102
+ const links = dataIds.map((dataId) => {
103
+ const path = `/sp/ebdfpage/card/0/${objId}/${dataId}`;
104
+ return { dataId, path, url: joinUrl(session.baseUrl, path), anchor };
105
+ });
106
+ return ok('COMPLETE', {
107
+ scene,
108
+ mode: 'card',
109
+ formTag,
110
+ objId,
111
+ anchor,
112
+ links,
113
+ available: true,
114
+ warnings,
115
+ });
116
+ }
117
+ }