weaver-work-cli 0.1.42 → 0.1.44

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 (318) hide show
  1. package/README.md +17 -0
  2. package/dist/chunks/{archive-J4I6MCKF.js → archive-P6TBQGKL.js} +13 -5
  3. package/dist/chunks/{archive-oa-BRZKKTO4.js → archive-oa-7TQ2NXOH.js} +12 -5
  4. package/dist/chunks/{asset-L7D4FAOZ.js → asset-3ELRG37G.js} +11 -4
  5. package/dist/chunks/{asset-idle-DADLLV75.js → asset-idle-WIGMUFMD.js} +7 -3
  6. package/dist/chunks/{attachment-content-K4C7VLWQ.js → attachment-content-E3276UOV.js} +5 -4
  7. package/dist/chunks/{blog-BVGQ7NZL.js → blog-C5NMZAAC.js} +11 -4
  8. package/dist/chunks/{caizhilian-SAADNFD6.js → caizhilian-5XSM2DFP.js} +13 -6
  9. package/dist/chunks/{calendar-Q7NQY5Z2.js → calendar-FI2WNSBO.js} +12 -5
  10. package/dist/chunks/{chunk-YRSZQUD2.js → chunk-3YBDYOC4.js} +3 -3
  11. package/dist/chunks/{chunk-OOUTBLZ4.js → chunk-56EZERK4.js} +1 -1
  12. package/dist/chunks/chunk-6N4JPNFL.js +76 -0
  13. package/dist/chunks/{chunk-ZUX3P6BQ.js → chunk-727FH2NI.js} +1 -1
  14. package/dist/chunks/chunk-7BDPM5ST.js +11 -0
  15. package/dist/chunks/{chunk-EKWAQSLU.js → chunk-BCVYBYYT.js} +432 -2248
  16. package/dist/chunks/{chunk-W7BEHOSR.js → chunk-CWYGFU5B.js} +2 -2
  17. package/dist/chunks/{chunk-NOODWMCL.js → chunk-D4ADSZ7H.js} +1 -1
  18. package/dist/chunks/{chunk-SA6VBIHY.js → chunk-ETNJSKMM.js} +214 -16
  19. package/dist/chunks/{chunk-BBKDXQEC.js → chunk-F4E4EM35.js} +3 -3
  20. package/dist/chunks/{chunk-IZ7S7QUS.js → chunk-FAZTGX7S.js} +6 -6
  21. package/dist/chunks/{chunk-NKZRQXST.js → chunk-FRZKBMSW.js} +52 -36
  22. package/dist/chunks/{chunk-BYBSCN4X.js → chunk-G7PQWD4L.js} +6 -3
  23. package/dist/chunks/{chunk-GEWYMQME.js → chunk-GAMZLAG2.js} +1 -1
  24. package/dist/chunks/{chunk-R4CHUSKC.js → chunk-GM6J7Q4B.js} +4 -4
  25. package/dist/chunks/{chunk-APVFJUQH.js → chunk-GRDRG6HP.js} +3 -3
  26. package/dist/chunks/{chunk-LDZQPUIA.js → chunk-HIT4Y6OI.js} +1 -1
  27. package/dist/chunks/{chunk-EZALDOQH.js → chunk-HP7JIYMT.js} +5 -2
  28. package/dist/chunks/{chunk-LADPYOWC.js → chunk-IAZ3UPY6.js} +3 -3
  29. package/dist/chunks/{chunk-ZEDWSH32.js → chunk-IC62NFM5.js} +1 -1
  30. package/dist/chunks/{chunk-P26ZWSKU.js → chunk-KIHNAS25.js} +5 -2
  31. package/dist/chunks/{chunk-BIPYLLVS.js → chunk-N4M2DDFE.js} +15 -15
  32. package/dist/chunks/{chunk-QKNKR4RH.js → chunk-OF4S23UB.js} +4 -4
  33. package/dist/chunks/{chunk-JPRO6ER2.js → chunk-PC7VKEB5.js} +57 -60
  34. package/dist/chunks/{chunk-4PD5NWAX.js → chunk-PUQS5MWL.js} +2 -2
  35. package/dist/chunks/{chunk-2LV74IWP.js → chunk-Q4OYAQYH.js} +1 -1
  36. package/dist/chunks/{chunk-72CKAUAG.js → chunk-QVSWRLLU.js} +7 -5
  37. package/dist/chunks/{chunk-4RAE6JXP.js → chunk-TA7FXXJD.js} +6 -3
  38. package/dist/chunks/{chunk-GPMFD4RD.js → chunk-TXUG266F.js} +1 -1
  39. package/dist/chunks/{chunk-FOAA27U5.js → chunk-UFIT2UU3.js} +16 -4
  40. package/dist/chunks/{chunk-LUSPKZKY.js → chunk-UG5G54VL.js} +1 -0
  41. package/dist/chunks/{chunk-NIAJ5ZCG.js → chunk-UL5XUQ25.js} +5 -2
  42. package/dist/chunks/{chunk-FMPJJYYI.js → chunk-WRXSAVKO.js} +1 -1
  43. package/dist/chunks/{chunk-G4UR6NXN.js → chunk-WSF4NNMR.js} +3 -3
  44. package/dist/chunks/chunk-XHK4MDR5.js +2497 -0
  45. package/dist/chunks/{chunk-3KTFS4IA.js → chunk-XNIK66I4.js} +19 -9
  46. package/dist/chunks/{chunk-3SO6QL6U.js → chunk-YWX377BY.js} +5 -2
  47. package/dist/chunks/{chunk-BYATLLEF.js → chunk-Z3GDFVJR.js} +1 -1
  48. package/dist/chunks/{chunk-GHXCDPTM.js → chunk-Z7VYWPZV.js} +1 -1
  49. package/dist/chunks/{conflict-F2OMZRTO.js → conflict-ARLSZJ6V.js} +4 -3
  50. package/dist/chunks/{continuation-2CKSBLA6.js → continuation-3S37AUSH.js} +4 -3
  51. package/dist/chunks/{continuation-RN6PZN2M.js → continuation-3XLYYTKV.js} +4 -3
  52. package/dist/chunks/{continuation-HZIZRZBX.js → continuation-HFW2YT5S.js} +4 -3
  53. package/dist/chunks/{continuation-NLECEJPX.js → continuation-KI7DRRZN.js} +4 -3
  54. package/dist/chunks/{contract-5BETHRSG.js → contract-DNIIW5VJ.js} +13 -5
  55. package/dist/chunks/{cowork-3MN6EQQO.js → cowork-GMLRGVIW.js} +11 -4
  56. package/dist/chunks/{create-flow-5FQNNMVO.js → create-flow-J22BO65E.js} +8 -7
  57. package/dist/chunks/{ebuilder-form-SBHOYBUD.js → ebuilder-form-ANV2FHYV.js} +12 -7
  58. package/dist/chunks/{ehr-KMOJULKG.js → ehr-GSTGAIY3.js} +266 -24
  59. package/dist/chunks/{employee-SAK2QYXX.js → employee-22BGJ3QS.js} +3 -3
  60. package/dist/chunks/{env-LB7NBL2O.js → env-BX3VRFS7.js} +4 -3
  61. package/dist/chunks/{esb-W2PJCFCX.js → esb-ATAIASX2.js} +12 -7
  62. package/dist/chunks/{factory-6ZFQXQ46.js → factory-PETTFME6.js} +3 -2
  63. package/dist/chunks/{fna-ZQPCUV4R.js → fna-YEKBSFSX.js} +14 -8
  64. package/dist/chunks/{group-chat-2HHAJN46.js → group-chat-BFVXAYFX.js} +5 -4
  65. package/dist/chunks/{host-ATKVNZAT.js → host-HRBXEPDQ.js} +5 -5
  66. package/dist/chunks/{host-BQH22NTQ.js → host-LR55CTHP.js} +5 -5
  67. package/dist/chunks/{host-X2CSLFM6.js → host-SUOY6VYQ.js} +5 -5
  68. package/dist/chunks/{host-4CBHGOHT.js → host-SZGV4UNT.js} +5 -5
  69. package/dist/chunks/{host-YTODKMSL.js → host-WIKN2EJ5.js} +5 -5
  70. package/dist/chunks/{hrm-FFM4UJFS.js → hrm-NRDO4W5G.js} +11 -7
  71. package/dist/chunks/{im-VEHKDQPB.js → im-IQ2HN23S.js} +8 -7
  72. package/dist/chunks/{invoice-LVIKSIIF.js → invoice-MNRW76PP.js} +636 -1768
  73. package/dist/chunks/{jiuchuanhui-X6DINO5P.js → jiuchuanhui-DTRBAX4N.js} +14 -6
  74. package/dist/chunks/{lazy-dispatch-KSWTN5L6.js → lazy-dispatch-ZVWAI25B.js} +7 -6
  75. package/dist/chunks/{mail-VDKRGUD3.js → mail-ZVAUXOJA.js} +16 -14
  76. package/dist/chunks/{meeting-CLC6HP3Z.js → meeting-FEVPZ67S.js} +21 -14
  77. package/dist/chunks/{okr-CHG4OO3U.js → okr-SDH3E5RA.js} +12 -5
  78. package/dist/chunks/{operations-5QL3AECO.js → operations-62N6EP3C.js} +4 -3
  79. package/dist/chunks/{plan-XWR75667.js → plan-E35JFDI7.js} +12 -5
  80. package/dist/chunks/{project-5BXOOKMG.js → project-73QXBAB2.js} +11 -4
  81. package/dist/chunks/reception-UWZVACBN.js +1899 -0
  82. package/dist/chunks/{recruit-stage-DGMFNNDE.js → recruit-stage-4MAOCKFY.js} +320 -57
  83. package/dist/chunks/registry-IM5G23LS.js +24 -0
  84. package/dist/chunks/{registry-RHMW6ANW.js → registry-JDUS4E7D.js} +7 -6
  85. package/dist/chunks/{registry-7FFOXIAW.js → registry-KNKSCJNT.js} +7 -6
  86. package/dist/chunks/{registry-Z43434VG.js → registry-PO7SI256.js} +4 -4
  87. package/dist/chunks/{registry-OZSMDVPP.js → registry-PVUZQDDQ.js} +3 -3
  88. package/dist/chunks/{room-recommend-62H7ZQQ6.js → room-recommend-H7KLXA5R.js} +6 -5
  89. package/dist/chunks/{schedule-FNXKH3DQ.js → schedule-ESZIBAUO.js} +6 -5
  90. package/dist/chunks/{workflow-ADHKCAJK.js → workflow-CWJFJLQU.js} +13 -8
  91. package/dist/cmd/action.js +6 -0
  92. package/dist/cmd/identity/index.js +45 -0
  93. package/dist/cmd/index.js +2 -0
  94. package/dist/core/continuation-ttl.js +18 -0
  95. package/dist/core/error-codes.js +85 -0
  96. package/dist/core/logger.js +11 -0
  97. package/dist/index.js +37 -31
  98. package/dist/internal/e10/auth/commands.js +163 -8
  99. package/dist/internal/e10/auth/error-log.js +182 -0
  100. package/dist/internal/e10/auth/session.js +17 -3
  101. package/dist/internal/e10/auth-recovery.js +39 -12
  102. package/dist/internal/e10/context.js +17 -2
  103. package/dist/internal/skills/install.js +9 -1
  104. package/dist/shortcuts/archive/continuation.js +2 -1
  105. package/dist/shortcuts/archive/index.js +3 -0
  106. package/dist/shortcuts/archive/operations/confirm.js +2 -1
  107. package/dist/shortcuts/archive-oa/continuation.js +2 -1
  108. package/dist/shortcuts/archive-oa/index.js +2 -0
  109. package/dist/shortcuts/archive-oa/operations/confirm.js +2 -1
  110. package/dist/shortcuts/asset/continuation.js +2 -1
  111. package/dist/shortcuts/asset/index.js +2 -0
  112. package/dist/shortcuts/asset-idle/index.js +2 -0
  113. package/dist/shortcuts/blog/continuation.js +2 -1
  114. package/dist/shortcuts/blog/index.js +2 -0
  115. package/dist/shortcuts/caizhilian/continuation.js +2 -1
  116. package/dist/shortcuts/caizhilian/index.js +2 -0
  117. package/dist/shortcuts/caizhilian/operations/confirm.js +3 -2
  118. package/dist/shortcuts/calendar/continuation.js +2 -1
  119. package/dist/shortcuts/calendar/index.js +2 -0
  120. package/dist/shortcuts/calendar/operations/write.js +1 -1
  121. package/dist/shortcuts/contract/continuation.js +2 -1
  122. package/dist/shortcuts/contract/index.js +2 -0
  123. package/dist/shortcuts/contract/operations/write.js +2 -1
  124. package/dist/shortcuts/cowork/continuation.js +2 -1
  125. package/dist/shortcuts/cowork/index.js +2 -0
  126. package/dist/shortcuts/ebuilder-form/continuation.js +2 -1
  127. package/dist/shortcuts/ebuilder-form/index.js +2 -0
  128. package/dist/shortcuts/ebuilder-form/operations/write.js +3 -2
  129. package/dist/shortcuts/ehr/continuation.js +2 -1
  130. package/dist/shortcuts/ehr/index.js +2 -0
  131. package/dist/shortcuts/ehr/operations/attend-write.js +1 -1
  132. package/dist/shortcuts/ehr/operations/recruit-candidate-import.js +182 -3
  133. package/dist/shortcuts/ehr/operations/recruit-position.js +134 -2
  134. package/dist/shortcuts/ehr/operations/recruit-write.js +1 -1
  135. package/dist/shortcuts/esb/continuation.js +2 -1
  136. package/dist/shortcuts/esb/index.js +2 -0
  137. package/dist/shortcuts/esb/operations/trigger.js +2 -1
  138. package/dist/shortcuts/fna/continuation.js +2 -1
  139. package/dist/shortcuts/fna/index.js +2 -0
  140. package/dist/shortcuts/fna/operations/invoice-writeoff.js +1 -1
  141. package/dist/shortcuts/fna/operations/loan.js +1 -1
  142. package/dist/shortcuts/hrm/index.js +2 -0
  143. package/dist/shortcuts/im/continuation.js +2 -1
  144. package/dist/shortcuts/index.js +5 -0
  145. package/dist/shortcuts/invoice/continuation.js +2 -1
  146. package/dist/shortcuts/invoice/index.js +14 -15
  147. package/dist/shortcuts/invoice/invoice-record.js +93 -0
  148. package/dist/shortcuts/invoice/manifest.js +190 -393
  149. package/dist/shortcuts/invoice/operations/add.js +2 -1
  150. package/dist/shortcuts/invoice/operations/delete.js +2 -1
  151. package/dist/shortcuts/invoice/operations/import.js +2 -1
  152. package/dist/shortcuts/invoice/operations/issuing-contract-detail.js +86 -0
  153. package/dist/shortcuts/invoice/operations/issuing-contracts.js +210 -0
  154. package/dist/shortcuts/invoice/operations/registry.js +17 -17
  155. package/dist/shortcuts/invoice/operations/reim-auto.js +4 -569
  156. package/dist/shortcuts/invoice/operations/reim.js +52 -341
  157. package/dist/shortcuts/invoice/operations/shared.js +21 -4
  158. package/dist/shortcuts/invoice/operations/update.js +2 -1
  159. package/dist/shortcuts/invoice/projection.js +10 -62
  160. package/dist/shortcuts/jiuchuanhui/continuation.js +2 -1
  161. package/dist/shortcuts/jiuchuanhui/index.js +2 -0
  162. package/dist/shortcuts/jiuchuanhui/operations/datajson.js +2 -1
  163. package/dist/shortcuts/jiuchuanhui/operations/esb.js +2 -1
  164. package/dist/shortcuts/mail/continuation.js +2 -1
  165. package/dist/shortcuts/mail/index.js +2 -0
  166. package/dist/shortcuts/mail/operations/mail-blacklist.js +1 -1
  167. package/dist/shortcuts/mail/operations/mail-contacts.js +1 -1
  168. package/dist/shortcuts/mail/operations/mail-send.js +1 -1
  169. package/dist/shortcuts/mail/operations/mail-sign.js +1 -1
  170. package/dist/shortcuts/mail/operations/mail-template.js +1 -1
  171. package/dist/shortcuts/meeting/continuation.js +2 -1
  172. package/dist/shortcuts/meeting/index.js +2 -0
  173. package/dist/shortcuts/meeting/operations/change.js +1 -1
  174. package/dist/shortcuts/meeting/operations/create.js +1 -1
  175. package/dist/shortcuts/meeting/operations/eb/create-flow.js +16 -7
  176. package/dist/shortcuts/meeting/operations/eb/decision.js +1 -1
  177. package/dist/shortcuts/meeting/operations/eb/factory.js +1 -1
  178. package/dist/shortcuts/meeting/operations/lifecycle.js +1 -1
  179. package/dist/shortcuts/meeting/operations/receipts.js +1 -1
  180. package/dist/shortcuts/meeting/operations/signs.js +1 -1
  181. package/dist/shortcuts/okr/continuation.js +2 -1
  182. package/dist/shortcuts/okr/index.js +2 -0
  183. package/dist/shortcuts/okr/operations/write.js +1 -1
  184. package/dist/shortcuts/plan/continuation.js +2 -1
  185. package/dist/shortcuts/plan/index.js +2 -0
  186. package/dist/shortcuts/plan/operations/write.js +1 -1
  187. package/dist/shortcuts/project/continuation.js +2 -1
  188. package/dist/shortcuts/project/index.js +2 -0
  189. package/dist/shortcuts/reception/constants.js +53 -0
  190. package/dist/shortcuts/reception/errors.js +54 -0
  191. package/dist/shortcuts/reception/host.js +125 -0
  192. package/dist/shortcuts/reception/index.js +198 -0
  193. package/dist/shortcuts/reception/manifest.js +177 -0
  194. package/dist/shortcuts/reception/operations/ask.js +71 -0
  195. package/dist/shortcuts/reception/operations/browsertool.js +58 -0
  196. package/dist/shortcuts/reception/operations/compose.js +129 -0
  197. package/dist/shortcuts/reception/operations/customparams.js +74 -0
  198. package/dist/shortcuts/reception/operations/doc.js +238 -0
  199. package/dist/shortcuts/reception/operations/docrender.js +36 -0
  200. package/dist/shortcuts/reception/operations/panels.js +179 -0
  201. package/dist/shortcuts/reception/operations/registry.js +26 -0
  202. package/dist/shortcuts/reception/operations/render-assets.js +184 -0
  203. package/dist/shortcuts/reception/operations/render.js +123 -0
  204. package/dist/shortcuts/reception/operations/runs.js +38 -0
  205. package/dist/shortcuts/reception/operations/schedule.js +127 -0
  206. package/dist/shortcuts/reception/operations/shared.js +196 -0
  207. package/dist/shortcuts/reception/operations/snapshot.js +68 -0
  208. package/dist/shortcuts/reception/operations/types.js +1 -0
  209. package/dist/shortcuts/reception/operations.js +33 -0
  210. package/dist/shortcuts/reception/upload.js +218 -0
  211. package/dist/shortcuts/recruit-stage/context.js +145 -33
  212. package/dist/shortcuts/recruit-stage/continuation.js +2 -1
  213. package/dist/shortcuts/recruit-stage/operations/jd-create.js +106 -17
  214. package/dist/shortcuts/recruit-stage/operations/resume-import.js +166 -10
  215. package/dist/shortcuts/workflow/continuation.js +2 -1
  216. package/dist/shortcuts/workflow/index.js +2 -0
  217. package/dist/shortcuts/workflow/operations/form.js +32 -8
  218. package/dist/shortcuts/workflow/operations/write.js +1 -1
  219. package/docs/_catalog.md +3 -0
  220. package/docs/agent-invoice.md +1 -1
  221. package/docs/archive-oa.md +1 -1
  222. package/docs/caizhilian.md +1 -1
  223. package/docs/calendar.md +1 -1
  224. package/docs/contract.md +1 -1
  225. package/docs/e10-auth.md +16 -0
  226. package/docs/ehr.md +2 -2
  227. package/docs/esb.md +1 -1
  228. package/docs/im.md +1 -1
  229. package/docs/invoice.md +8 -12
  230. package/docs/okr.md +1 -1
  231. package/docs/reception.md +119 -0
  232. package/package.json +1 -1
  233. package/scripts/clean.mjs +43 -2
  234. package/skill-template/business-info.json +18 -2
  235. package/skill-template/domains/caizhilian.md +1 -1
  236. package/skill-template/domains/reception-flow.md +18 -0
  237. package/skill-template/domains/yepiaotong.md +4 -7
  238. package/skills/weaver-e10-archive-oa/references/source-manifest.json +14 -14
  239. package/skills/weaver-e10-blog/references/blog-publish.md +1 -1
  240. package/skills/weaver-e10-blog/references/source-manifest.json +7 -7
  241. package/skills/weaver-e10-caizhilian/references/source-manifest.json +21 -21
  242. package/skills/weaver-e10-caizhilian/references/write-protocol.md +2 -2
  243. package/skills/weaver-e10-calendar/references/calendar-write.md +1 -1
  244. package/skills/weaver-e10-cowork/SKILL.md +1 -1
  245. package/skills/weaver-e10-ebuilder-form/SKILL.md +1 -1
  246. package/skills/weaver-e10-ebuilder-form/references/custom-api.md +1 -1
  247. package/skills/weaver-e10-ebuilder-form/references/openapi-write.md +1 -1
  248. package/skills/weaver-e10-esb/SKILL.md +2 -2
  249. package/skills/weaver-e10-esb/references/source-manifest.json +22 -22
  250. package/skills/weaver-e10-esb/references/trigger.md +2 -2
  251. package/skills/weaver-e10-jinchengda/references/contract-clause-library-crud.md +1 -1
  252. package/skills/weaver-e10-jinchengda/references/contract-clause-reference-save.md +1 -1
  253. package/skills/weaver-e10-jinchengda/references/contract-request-write.md +1 -1
  254. package/skills/weaver-e10-jinchengda/references/source-manifest.json +29 -29
  255. package/skills/weaver-e10-jucailin/SKILL.md +1 -1
  256. package/skills/weaver-e10-jucailin/references/attend-write.md +2 -2
  257. package/skills/weaver-e10-jucailin/references/recruit-create.md +12 -3
  258. package/skills/weaver-e10-jucailin/references/recruit-write.md +1 -1
  259. package/skills/weaver-e10-meeting/SKILL.md +8 -6
  260. package/skills/weaver-e10-meeting/references/meeting-change.md +1 -1
  261. package/skills/weaver-e10-meeting/references/meeting-create.md +1 -1
  262. package/skills/weaver-e10-meeting/references/meeting-lifecycle.md +1 -1
  263. package/skills/weaver-e10-meeting/references/meeting-verification.md +1 -1
  264. package/skills/weaver-e10-okr/references/okr-align.md +1 -1
  265. package/skills/weaver-e10-okr/references/okr-keyresult.md +1 -1
  266. package/skills/weaver-e10-okr/references/okr-write.md +1 -1
  267. package/skills/weaver-e10-okr/references/source-manifest.json +8 -8
  268. package/skills/weaver-e10-plan/references/plan-report-write.md +1 -1
  269. package/skills/weaver-e10-plan/references/source-manifest.json +20 -20
  270. package/skills/weaver-e10-qiyecheng/references/loan-management.md +1 -1
  271. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +18 -18
  272. package/skills/weaver-e10-reception-flow/SKILL.md +173 -0
  273. package/skills/weaver-e10-reception-flow/assets//350/241/214/347/250/213/345/215/225/346/250/241/346/235/277-/346/263/233/345/276/256.docx +0 -0
  274. package/skills/weaver-e10-reception-flow/data/fields-snapshot.json +213 -0
  275. package/skills/weaver-e10-reception-flow/references/browsertool.md +68 -0
  276. package/skills/weaver-e10-reception-flow/references/env-pitfalls.md +51 -0
  277. package/skills/weaver-e10-reception-flow/references/fields-snapshot.md +227 -0
  278. package/skills/weaver-e10-reception-flow/references/guide.md +179 -0
  279. package/skills/weaver-e10-reception-flow/scripts/locate.sh +14 -0
  280. package/skills/weaver-e10-reception-flow/scripts/render.py +724 -0
  281. package/skills/weaver-e10-recruit-stage/SKILL.md +9 -5
  282. package/skills/weaver-e10-recruit-stage/lib/recruit-xiaoe-file.mjs +1 -1
  283. package/skills/weaver-e10-recruit-stage/lib/xiaoe-session.mjs +66 -0
  284. package/skills/weaver-e10-recruit-stage/references/position-templates.md +202 -0
  285. package/skills/weaver-e10-recruit-stage/references/recruit-jd-create.md +22 -0
  286. package/skills/weaver-e10-recruit-stage/references/recruit-resume-import.md +14 -1
  287. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +6 -0
  288. package/skills/weaver-e10-shijingran/SKILL.md +5 -5
  289. package/skills/weaver-e10-shijingran/references/source-manifest.json +37 -36
  290. package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +2 -0
  291. package/skills/weaver-e10-wenshuding/references/source-manifest.json +3 -3
  292. package/skills/weaver-e10-workflow/references/source-manifest.json +32 -32
  293. package/skills/weaver-e10-yepiaotong/SKILL.md +19 -26
  294. package/skills/weaver-e10-yepiaotong/references/invoice-detail.md +13 -10
  295. package/skills/weaver-e10-yepiaotong/references/invoice-enterprise-list.md +2 -0
  296. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-workflow.md +194 -155
  297. package/skills/weaver-e10-yepiaotong/references/invoice-output-view.md +28 -32
  298. package/skills/weaver-e10-yepiaotong/references/invoice-personal-list.md +5 -1
  299. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +8 -10
  300. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +211 -616
  301. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +149 -117
  302. package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +17 -20
  303. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +20 -39
  304. package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +55 -22
  305. package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +7 -17
  306. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +88 -92
  307. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +144 -354
  308. package/skills/weaver-e10-yimiaoban/SKILL.md +1 -1
  309. package/skills/weaver-e10-yimiaoban/references/msg-write.md +1 -1
  310. package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +1 -1
  311. package/skills/weaver-e10-yimiaoban/references/source-manifest.json +7 -7
  312. package/dist/chunks/chunk-TTPJJJC4.js +0 -465
  313. package/dist/chunks/registry-BKBZPBAJ.js +0 -23
  314. package/dist/shortcuts/invoice/markdown.js +0 -172
  315. package/dist/shortcuts/invoice/operations/issuing-qys.js +0 -424
  316. package/skills/weaver-e10-meeting.zip +0 -0
  317. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +0 -131
  318. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-form-fill-rules.md +0 -179
@@ -1,5 +1,6 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { ExitCode, isCliError, toErrorEnvelope } from '../../core/errors.js';
3
+ import { reportPlatformError } from '../../core/error-codes.js';
3
4
  import { createArchiveOaContinuationSigner } from './continuation.js';
4
5
  import { createArchiveOaHost } from './host.js';
5
6
  import { archiveOaManifest } from './manifest.js';
@@ -116,6 +117,7 @@ async function executeAndPrint(ctx, operation, input) {
116
117
  ctx.output.write(successEnvelope(result), { json: true });
117
118
  }
118
119
  catch (error) {
120
+ reportPlatformError(error);
119
121
  console.error(JSON.stringify(failureEnvelope(error), null, 2));
120
122
  process.exitCode = isCliError(error) ? error.exitCode : ExitCode.GeneralError;
121
123
  }
@@ -1,3 +1,4 @@
1
+ import { CONTINUATION_TTL_MS } from '../../../core/continuation-ttl.js';
1
2
  import { archiveOaConfirmationError, archiveOaValidationError } from '../errors.js';
2
3
  /** apply 类写操作必须显式确认。 */
3
4
  export function requireConfirm(args, action) {
@@ -11,7 +12,7 @@ export function requireConfirm(args, action) {
11
12
  * prepare 阶段签发 continuation。
12
13
  * 环境指纹(baseUrl + 登录账号)写进票据,apply 时校验,避免跨环境/跨账号复用。
13
14
  */
14
- export async function issueLease(env, action, payload, ttlMs = 10 * 60_000) {
15
+ export async function issueLease(env, action, payload, ttlMs = CONTINUATION_TTL_MS) {
15
16
  const session = await env.host.getSession();
16
17
  const continuation = await env.continuation.issue({
17
18
  operation: action,
@@ -1,3 +1,4 @@
1
+ import { CONTINUATION_TTL_MS } from '../../core/continuation-ttl.js';
1
2
  import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
2
3
  import { existsSync } from 'node:fs';
3
4
  import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
@@ -35,7 +36,7 @@ function signature(payload, key) {
35
36
  }
36
37
  export function createZiguanjiaContinuationSigner(ctx) {
37
38
  return {
38
- async issue(payload, ttlMs = 10 * 60_000) {
39
+ async issue(payload, ttlMs = CONTINUATION_TTL_MS) {
39
40
  const issuedAt = Date.now();
40
41
  const body = encode({ ...payload, issuedAt, expiresAt: issuedAt + ttlMs });
41
42
  const sig = signature(body, await loadKey(ctx));
@@ -1,5 +1,6 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { ExitCode, isCliError, toErrorEnvelope } from '../../core/errors.js';
3
+ import { reportPlatformError } from '../../core/error-codes.js';
3
4
  import { createZiguanjiaContinuationSigner } from './continuation.js';
4
5
  import { createZiguanjiaHost } from './host.js';
5
6
  import { ziguanjiaManifest } from './manifest.js';
@@ -85,6 +86,7 @@ async function executeAndPrint(ctx, operation, input) {
85
86
  ctx.output.write(successEnvelope(operation, result), { json: true });
86
87
  }
87
88
  catch (error) {
89
+ reportPlatformError(error);
88
90
  console.error(JSON.stringify(failureEnvelope(error), null, 2));
89
91
  process.exitCode = isCliError(error) ? error.exitCode : ExitCode.GeneralError;
90
92
  }
@@ -1,5 +1,6 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { ExitCode, isCliError, toErrorEnvelope } from '../../core/errors.js';
3
+ import { reportPlatformError } from '../../core/error-codes.js';
3
4
  import { createAssetIdleHost } from './host.js';
4
5
  import { assetIdleManifest } from './manifest.js';
5
6
  import { executeAssetIdleOperation } from './operations.js';
@@ -83,6 +84,7 @@ async function executeAndPrint(ctx, operation, input) {
83
84
  ctx.output.write(successEnvelope(operation, result), { json: true });
84
85
  }
85
86
  catch (error) {
87
+ reportPlatformError(error);
86
88
  console.error(JSON.stringify(failureEnvelope(error), null, 2));
87
89
  process.exitCode = isCliError(error) ? error.exitCode : ExitCode.GeneralError;
88
90
  }
@@ -1,3 +1,4 @@
1
+ import { CONTINUATION_TTL_MS } from '../../core/continuation-ttl.js';
1
2
  import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
2
3
  import { existsSync } from 'node:fs';
3
4
  import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
@@ -39,7 +40,7 @@ function signature(payload, key) {
39
40
  */
40
41
  export function createBlogContinuationSigner(ctx) {
41
42
  return {
42
- async issue(payload, ttlMs = 10 * 60_000) {
43
+ async issue(payload, ttlMs = CONTINUATION_TTL_MS) {
43
44
  const issuedAt = Date.now();
44
45
  const body = encode({ ...payload, issuedAt, expiresAt: issuedAt + ttlMs });
45
46
  const sig = signature(body, await loadKey(ctx));
@@ -1,5 +1,6 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { ExitCode, isCliError, toErrorEnvelope } from '../../core/errors.js';
3
+ import { reportPlatformError } from '../../core/error-codes.js';
3
4
  import { createBlogContinuationSigner } from './continuation.js';
4
5
  import { blogValidationError } from './errors.js';
5
6
  import { createBlogHost } from './host.js';
@@ -101,6 +102,7 @@ async function executeAndPrint(ctx, operation, input) {
101
102
  ctx.output.write(successEnvelope(operation, result), { json: true });
102
103
  }
103
104
  catch (error) {
105
+ reportPlatformError(error);
104
106
  console.error(JSON.stringify(failureEnvelope(error), null, 2));
105
107
  process.exitCode = isCliError(error) ? error.exitCode : ExitCode.GeneralError;
106
108
  }
@@ -1,3 +1,4 @@
1
+ import { CONTINUATION_TTL_MS } from '../../core/continuation-ttl.js';
1
2
  import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
2
3
  import { existsSync } from 'node:fs';
3
4
  import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
@@ -35,7 +36,7 @@ function signature(payload, key) {
35
36
  }
36
37
  export function createCaizhilianContinuationSigner(ctx) {
37
38
  return {
38
- async issue(payload, ttlMs = 10 * 60_000) {
39
+ async issue(payload, ttlMs = CONTINUATION_TTL_MS) {
39
40
  const issuedAt = Date.now();
40
41
  const body = encode({ ...payload, issuedAt, expiresAt: issuedAt + ttlMs });
41
42
  const sig = signature(body, await loadKey(ctx));
@@ -1,5 +1,6 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { ExitCode, isCliError, toErrorEnvelope } from '../../core/errors.js';
3
+ import { reportPlatformError } from '../../core/error-codes.js';
3
4
  import { createCaizhilianContinuationSigner } from './continuation.js';
4
5
  import { caizhilianValidationError } from './errors.js';
5
6
  import { createCaizhilianHost } from './host.js';
@@ -88,6 +89,7 @@ async function executeAndPrint(ctx, operation, input) {
88
89
  ctx.output.write(successEnvelope(operation, result), { json: true });
89
90
  }
90
91
  catch (error) {
92
+ reportPlatformError(error);
91
93
  console.error(JSON.stringify(failureEnvelope(error), null, 2));
92
94
  process.exitCode = isCliError(error) ? error.exitCode : ExitCode.GeneralError;
93
95
  }
@@ -1,3 +1,4 @@
1
+ import { CONTINUATION_TTL_MS } from '../../../core/continuation-ttl.js';
1
2
  import { caizhilianConfirmationError, caizhilianValidationError } from '../errors.js';
2
3
  import { fingerprint } from './shared.js';
3
4
  /** apply 类写操作必须显式确认。 */
@@ -12,7 +13,7 @@ export function requireConfirm(args, action) {
12
13
  * prepare 阶段签发 continuation。
13
14
  * 环境指纹(baseUrl + 登录账号)写进票据,apply 时校验,避免跨环境/跨账号复用。
14
15
  */
15
- export async function issueLease(env, action, payload, ttlMs = 10 * 60_000) {
16
+ export async function issueLease(env, action, payload, ttlMs = CONTINUATION_TTL_MS) {
16
17
  const session = await env.host.getSession();
17
18
  const continuation = await env.continuation.issue({
18
19
  operation: action,
@@ -61,7 +62,7 @@ export function leaseArgsFingerprint(args) {
61
62
  return fingerprint(picked);
62
63
  }
63
64
  /** prepare 签发票据:自动附带入参指纹(apply 时由 assertLeaseArgs 校验)。 */
64
- export async function issueWriteLease(env, action, args, payload, ttlMs = 10 * 60_000) {
65
+ export async function issueWriteLease(env, action, args, payload, ttlMs = CONTINUATION_TTL_MS) {
65
66
  return issueLease(env, action, { ...payload, argsFingerprint: leaseArgsFingerprint(args) }, ttlMs);
66
67
  }
67
68
  /** apply 校验整体入参与 prepare 时一致(比 assertLeaseTarget 更严格的全量防漂移)。 */
@@ -1,3 +1,4 @@
1
+ import { CONTINUATION_TTL_MS } from '../../core/continuation-ttl.js';
1
2
  import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
2
3
  import { existsSync } from 'node:fs';
3
4
  import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
@@ -35,7 +36,7 @@ function signature(payload, key) {
35
36
  }
36
37
  export function createCalendarContinuationSigner(ctx) {
37
38
  return {
38
- async issue(payload, ttlMs = 10 * 60_000) {
39
+ async issue(payload, ttlMs = CONTINUATION_TTL_MS) {
39
40
  const issuedAt = Date.now();
40
41
  const body = encode({ ...payload, issuedAt, expiresAt: issuedAt + ttlMs });
41
42
  const sig = signature(body, await loadKey(ctx));
@@ -1,5 +1,6 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { ExitCode, isCliError, toErrorEnvelope } from '../../core/errors.js';
3
+ import { reportPlatformError } from '../../core/error-codes.js';
3
4
  import { createCalendarContinuationSigner } from './continuation.js';
4
5
  import { createCalendarHost } from './host.js';
5
6
  import { calendarManifest } from './manifest.js';
@@ -83,6 +84,7 @@ async function executeAndPrint(ctx, operation, input) {
83
84
  ctx.output.write(successEnvelope(operation, result), { json: true });
84
85
  }
85
86
  catch (error) {
87
+ reportPlatformError(error);
86
88
  console.error(JSON.stringify(failureEnvelope(error), null, 2));
87
89
  process.exitCode = isCliError(error) ? error.exitCode : ExitCode.GeneralError;
88
90
  }
@@ -1,9 +1,9 @@
1
+ import { CONTINUATION_TTL_SECONDS } from '../../../core/continuation-ttl.js';
1
2
  import { createHash } from 'node:crypto';
2
3
  import { calendarConfirmationError, calendarPartialError, calendarValidationError, CalendarCliError } from '../errors.js';
3
4
  import { calendarSuccess, schemaOf, SCHEMA_ID, SCHEMA_DATETIME_MINUTE, SCHEMA_SWITCH, SCHEMA_DATE } from './types.js';
4
5
  import { assertDateTimeMinute, defaultEndTime, optionId, participantIds, pickDefined, } from './shared.js';
5
6
  import { fetchAgendaAppAndForm } from './read.js';
6
- const CONTINUATION_TTL_SECONDS = 600;
7
7
  // 日程 mainTable 可选业务字段(创建/更新共用)
8
8
  const OPTIONAL_FIELDS = [
9
9
  'next_start_remind',
@@ -1,3 +1,4 @@
1
+ import { CONTINUATION_TTL_MS } from '../../core/continuation-ttl.js';
1
2
  import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
2
3
  import { existsSync } from 'node:fs';
3
4
  import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
@@ -35,7 +36,7 @@ function signature(payload, key) {
35
36
  }
36
37
  export function createContractContinuationSigner(ctx) {
37
38
  return {
38
- async issue(payload, ttlMs = 10 * 60_000) {
39
+ async issue(payload, ttlMs = CONTINUATION_TTL_MS) {
39
40
  const issuedAt = Date.now();
40
41
  const body = encode({ ...payload, issuedAt, expiresAt: issuedAt + ttlMs });
41
42
  const sig = signature(body, await loadKey(ctx));
@@ -1,5 +1,6 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { ExitCode, isCliError, toErrorEnvelope } from '../../core/errors.js';
3
+ import { reportPlatformError } from '../../core/error-codes.js';
3
4
  import { createContractContinuationSigner } from './continuation.js';
4
5
  import { contractValidationError } from './errors.js';
5
6
  import { createContractHost } from './host.js';
@@ -109,6 +110,7 @@ async function executeAndPrint(ctx, operation, input) {
109
110
  ctx.output.write(successEnvelope(operation, result), { json: true });
110
111
  }
111
112
  catch (error) {
113
+ reportPlatformError(error);
112
114
  console.error(JSON.stringify(failureEnvelope(error), null, 2));
113
115
  process.exitCode = isCliError(error) ? error.exitCode : ExitCode.GeneralError;
114
116
  }
@@ -1,3 +1,4 @@
1
+ import { CONTINUATION_TTL_SECONDS } from '../../../core/continuation-ttl.js';
1
2
  import { ContractCliError, contractConfirmationError, contractPartialError, contractValidationError } from '../errors.js';
2
3
  import { objectFingerprint, sessionMatches } from './shared.js';
3
4
  import { CONTRACT_WORKFLOW } from './types.js';
@@ -37,7 +38,7 @@ export class ContractWritePrepareOperation {
37
38
  data: {
38
39
  preview,
39
40
  continuation: continuationToken,
40
- expiresInSeconds: 600,
41
+ expiresInSeconds: CONTINUATION_TTL_SECONDS,
41
42
  workflow: CONTRACT_WORKFLOW.awaitingConfirmation(baseName),
42
43
  ...(precheck ? { precheck } : {}),
43
44
  },
@@ -1,3 +1,4 @@
1
+ import { CONTINUATION_TTL_MS } from '../../core/continuation-ttl.js';
1
2
  import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
2
3
  import { existsSync } from 'node:fs';
3
4
  import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
@@ -35,7 +36,7 @@ function signature(payload, key) {
35
36
  }
36
37
  export function createCoworkContinuationSigner(ctx) {
37
38
  return {
38
- async issue(payload, ttlMs = 10 * 60_000) {
39
+ async issue(payload, ttlMs = CONTINUATION_TTL_MS) {
39
40
  const issuedAt = Date.now();
40
41
  const body = encode({ ...payload, issuedAt, expiresAt: issuedAt + ttlMs });
41
42
  const sig = signature(body, await loadKey(ctx));
@@ -1,5 +1,6 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { ExitCode, isCliError, toErrorEnvelope } from '../../core/errors.js';
3
+ import { reportPlatformError } from '../../core/error-codes.js';
3
4
  import { createCoworkContinuationSigner } from './continuation.js';
4
5
  import { createCoworkHost } from './host.js';
5
6
  import { coworkManifest } from './manifest.js';
@@ -84,6 +85,7 @@ async function executeAndPrint(ctx, operation, input) {
84
85
  ctx.output.write(successEnvelope(operation, result), { json: true });
85
86
  }
86
87
  catch (error) {
88
+ reportPlatformError(error);
87
89
  console.error(JSON.stringify(failureEnvelope(error), null, 2));
88
90
  process.exitCode = isCliError(error) ? error.exitCode : ExitCode.GeneralError;
89
91
  }
@@ -1,3 +1,4 @@
1
+ import { CONTINUATION_TTL_MS } from '../../core/continuation-ttl.js';
1
2
  import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
2
3
  import { existsSync } from 'node:fs';
3
4
  import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
@@ -35,7 +36,7 @@ function signature(payload, key) {
35
36
  }
36
37
  export function createEbuilderFormContinuationSigner(ctx) {
37
38
  return {
38
- async issue(payload, ttlMs = 10 * 60_000) {
39
+ async issue(payload, ttlMs = CONTINUATION_TTL_MS) {
39
40
  const issuedAt = Date.now();
40
41
  const body = encode({ ...payload, issuedAt, expiresAt: issuedAt + ttlMs });
41
42
  const sig = signature(body, await loadKey(ctx));
@@ -1,5 +1,6 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { ExitCode, isCliError, toErrorEnvelope } from '../../core/errors.js';
3
+ import { reportPlatformError } from '../../core/error-codes.js';
3
4
  import { createEbuilderFormContinuationSigner } from './continuation.js';
4
5
  import { ebuilderValidationError } from './errors.js';
5
6
  import { createEbuilderFormHost } from './host.js';
@@ -81,6 +82,7 @@ async function executeAndPrint(ctx, operation, input) {
81
82
  ctx.output.write(successEnvelope(operation, result), { json: true });
82
83
  }
83
84
  catch (error) {
85
+ reportPlatformError(error);
84
86
  console.error(JSON.stringify(failureEnvelope(error), null, 2));
85
87
  process.exitCode = isCliError(error) ? error.exitCode : ExitCode.GeneralError;
86
88
  }
@@ -1,3 +1,4 @@
1
+ import { CONTINUATION_TTL_SECONDS } from '../../../core/continuation-ttl.js';
1
2
  import { ebuilderConfirmationError, ebuilderValidationError } from '../errors.js';
2
3
  import { ebuilderSuccess } from './types.js';
3
4
  import { asObject, assertKnownKeys, assertNoForbiddenKeys, optionalArray, optionalObject, optionalString, requiredArray, requiredString, sha256VisibleFingerprint, } from './shared.js';
@@ -51,7 +52,7 @@ export class EbuilderOpenapiPrepareOperation {
51
52
  target: prepared.target,
52
53
  requestPreview: { datajson: prepared.datajson },
53
54
  continuation,
54
- expiresInSeconds: 600,
55
+ expiresInSeconds: CONTINUATION_TTL_SECONDS,
55
56
  }, { status: 'PREPARED' }, prepared.warnings);
56
57
  }
57
58
  }
@@ -110,7 +111,7 @@ export class EbuilderCustomPrepareOperation {
110
111
  target: prepared.target,
111
112
  requestPreview: { datajson: prepared.datajson },
112
113
  continuation,
113
- expiresInSeconds: 600,
114
+ expiresInSeconds: CONTINUATION_TTL_SECONDS,
114
115
  }, { status: 'PREPARED' }, prepared.warnings);
115
116
  }
116
117
  }
@@ -1,3 +1,4 @@
1
+ import { CONTINUATION_TTL_MS } from '../../core/continuation-ttl.js';
1
2
  import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
2
3
  import { existsSync } from 'node:fs';
3
4
  import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
@@ -35,7 +36,7 @@ function signature(payload, key) {
35
36
  }
36
37
  export function createEhrContinuationSigner(ctx) {
37
38
  return {
38
- async issue(payload, ttlMs = 10 * 60_000) {
39
+ async issue(payload, ttlMs = CONTINUATION_TTL_MS) {
39
40
  const issuedAt = Date.now();
40
41
  const body = encode({ ...payload, issuedAt, expiresAt: issuedAt + ttlMs });
41
42
  const sig = signature(body, await loadKey(ctx));
@@ -1,5 +1,6 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { ExitCode, isCliError, toErrorEnvelope } from '../../core/errors.js';
3
+ import { reportPlatformError } from '../../core/error-codes.js';
3
4
  import { createEhrContinuationSigner } from './continuation.js';
4
5
  import { createEhrHost } from './host.js';
5
6
  import { ehrManifest } from './manifest.js';
@@ -89,6 +90,7 @@ async function executeAndPrint(ctx, operation, input) {
89
90
  ctx.output.write(successEnvelope(operation, result), { json: true });
90
91
  }
91
92
  catch (error) {
93
+ reportPlatformError(error);
92
94
  console.error(JSON.stringify(failureEnvelope(error), null, 2));
93
95
  process.exitCode = isCliError(error) ? error.exitCode : ExitCode.GeneralError;
94
96
  }
@@ -1,8 +1,8 @@
1
+ import { CONTINUATION_TTL_SECONDS } from '../../../core/continuation-ttl.js';
1
2
  import { createHash } from 'node:crypto';
2
3
  import { ehrConfirmationError, ehrPartialError, ehrValidationError, EhrCliError } from '../errors.js';
3
4
  import { READ, SCHEMA_DATE, SCHEMA_ID, ehrSuccess, schemaOf, WRITE, } from './types.js';
4
5
  import { assertEnum, assertEnumArray, compact, pickDefined, toIdList, EHR_PAGES, ehrPageUrl, addDays } from './shared.js';
5
- const CONTINUATION_TTL_SECONDS = 600;
6
6
  const CARD_TYPES = ['CHECKIN', 'CHECKOUT', 'LEAVE', 'RETURN', 'CHECKIN_AND_RETURN', 'CHECKOUT_AND_LEAVE'];
7
7
  const APPEAL_TYPES = [
8
8
  'leave',
@@ -1,3 +1,4 @@
1
+ import { CONTINUATION_TTL_MS, CONTINUATION_TTL_SECONDS } from '../../../core/continuation-ttl.js';
1
2
  import { createHash } from 'node:crypto';
2
3
  import { readFile, stat } from 'node:fs/promises';
3
4
  import { basename } from 'node:path';
@@ -100,6 +101,133 @@ function joinRange(start, end) {
100
101
  return undefined;
101
102
  return `${s},${e}`;
102
103
  }
104
+ // ── 日期格式预检与归一(2026-11-05 与 recruit-stage 同步修复)──
105
+ // 人才表单接口只接受 yyyy-MM-dd。模型常给「2020.11」「2008-08」「2004.09-2008.07」,
106
+ // 会让 dataset 新增整批校验失败 → 回退建主表 → 补明细又被同一格式拦下 → 明细全丢。
107
+ // 规则同 recruit-stage:只有年月时开始补 -01、结束补当月最后一天;「至今」归一为空(不伪造结束日);
108
+ // 无法识别则跳过该字段并在 warnings 明示,绝不静默改写。
109
+ const DATE_ONLY_RE = /^\d{4}-\d{2}-\d{2}$/;
110
+ const ONGOING_RE = /至今|现在|今|now|present/i;
111
+ const RE_RANGE_FULL = /^\s*(\d{4}[.\-/年]\d{1,2}[.\-/月]\d{1,2}\s*日?)\s*[-–—~至,,]\s*(\d{4}[.\-/年]\d{1,2}[.\-/月]\d{1,2}\s*日?|至今|现在|今)\s*$/;
112
+ const RE_RANGE_YM = /^\s*(\d{4}[.\-/年]\d{1,2})\s*[-–—~至,,]\s*(\d{4}[.\-/年]\d{1,2}|至今|现在|今)\s*$/;
113
+ /** 单日期片段 → yyyy-MM-dd;isEnd=true 且缺日时补该月最后一天。无法解析返回 ''。 */
114
+ function normDatePart(raw, isEnd) {
115
+ const s = String(raw ?? '').trim();
116
+ if (!s)
117
+ return '';
118
+ if (ONGOING_RE.test(s))
119
+ return '';
120
+ if (DATE_ONLY_RE.test(s))
121
+ return s;
122
+ const m = s.match(/^(\d{4})\s*[.\-/年]?\s*(\d{1,2})?\s*[.\-/月]?\s*(\d{1,2})?\s*日?$/);
123
+ if (!m)
124
+ return '';
125
+ const y = Number(m[1]);
126
+ const mo = m[2] ? Number(m[2]) : 1;
127
+ if (!y || mo < 1 || mo > 12)
128
+ return '';
129
+ const lastDay = new Date(y, mo, 0).getDate();
130
+ let d;
131
+ if (m[3]) {
132
+ d = Number(m[3]);
133
+ if (d < 1 || d > lastDay)
134
+ return '';
135
+ }
136
+ else {
137
+ d = isEnd ? lastDay : 1;
138
+ }
139
+ return `${y}-${String(mo).padStart(2, '0')}-${String(d).padStart(2, '0')}`;
140
+ }
141
+ /** 日期区间 → "start,end";单值原样归一。 */
142
+ function normDateRange(raw) {
143
+ const s = Array.isArray(raw)
144
+ ? raw.map((x) => String(x ?? '').trim()).filter(Boolean).join(',')
145
+ : String(raw ?? '').trim();
146
+ if (!s)
147
+ return '';
148
+ const m = s.match(RE_RANGE_FULL) || s.match(RE_RANGE_YM);
149
+ if (m) {
150
+ const a = normDatePart(m[1], false);
151
+ if (!a)
152
+ return '';
153
+ const b = normDatePart(m[2], true);
154
+ return b ? `${a},${b}` : a;
155
+ }
156
+ return normDatePart(s, false);
157
+ }
158
+ /**
159
+ * 就地归一简历入参里的全部日期字段,把每处改动写入 warnings(不静默改写)。
160
+ * 覆盖:joinworkdate / graduate_date / birthday;academicInformations[].study_date;
161
+ * jobInformations|workExperiences|projectExperiences 的 start_date/end_date;
162
+ * internshipExperiences[].entry_time;awardExperiences[].award_date。
163
+ */
164
+ export function normalizeImportDates(input, warnings) {
165
+ if (!input || typeof input !== 'object')
166
+ return;
167
+ const one = (label, val, isEnd = false) => {
168
+ const before = String(val ?? '').trim();
169
+ if (!before)
170
+ return '';
171
+ if (ONGOING_RE.test(before))
172
+ return '';
173
+ const after = normDatePart(before, isEnd);
174
+ if (!after) {
175
+ warnings.push(`日期无法识别,已跳过该字段(避免接口整批校验失败):${label} = 「${before}」`);
176
+ return '';
177
+ }
178
+ if (after !== before)
179
+ warnings.push(`日期已规范化:${label} 「${before}」→「${after}」`);
180
+ return after;
181
+ };
182
+ for (const k of ['joinworkdate', 'graduate_date', 'birthday']) {
183
+ if (input[k] === undefined || input[k] === null)
184
+ continue;
185
+ input[k] = one(k, input[k], false);
186
+ }
187
+ if (Array.isArray(input.academicInformations)) {
188
+ input.academicInformations.forEach((r, i) => {
189
+ if (!r || typeof r !== 'object' || r.study_date === undefined)
190
+ return;
191
+ const before = String(r.study_date ?? '').trim();
192
+ if (!before)
193
+ return;
194
+ const after = normDateRange(before);
195
+ if (!after) {
196
+ warnings.push(`日期区间无法识别,已跳过:academicInformations[${i}].study_date = 「${before}」`);
197
+ r.study_date = '';
198
+ }
199
+ else {
200
+ if (after !== before)
201
+ warnings.push(`日期已规范化:academicInformations[${i}].study_date 「${before}」→「${after}」`);
202
+ r.study_date = after;
203
+ }
204
+ });
205
+ }
206
+ for (const key of ['jobInformations', 'workExperiences', 'projectExperiences']) {
207
+ const arr = input[key];
208
+ if (!Array.isArray(arr))
209
+ continue;
210
+ arr.forEach((r, i) => {
211
+ if (!r || typeof r !== 'object')
212
+ return;
213
+ if (r.start_date !== undefined && r.start_date !== null)
214
+ r.start_date = one(`${key}[${i}].start_date`, r.start_date, false);
215
+ if (r.end_date !== undefined && r.end_date !== null)
216
+ r.end_date = one(`${key}[${i}].end_date`, r.end_date, true);
217
+ });
218
+ }
219
+ for (const [key, field] of [['internshipExperiences', 'entry_time'], ['awardExperiences', 'award_date']]) {
220
+ const arr = input[key];
221
+ if (!Array.isArray(arr))
222
+ continue;
223
+ arr.forEach((r, i) => {
224
+ if (!r || typeof r !== 'object')
225
+ return;
226
+ if (r[field] !== undefined && r[field] !== null)
227
+ r[field] = one(`${key}[${i}].${field}`, r[field], false);
228
+ });
229
+ }
230
+ }
103
231
  async function resolveSubTableMeta(env, formId) {
104
232
  let data = null;
105
233
  try {
@@ -464,6 +592,9 @@ function str(value) {
464
592
  }
465
593
  async function buildImportPlan(env, cache, args) {
466
594
  const warnings = [];
595
+ // 日期格式预检与归一:必须在构建主表/明细之前执行。原实现直接把模型给的
596
+ // 「2020.11」「2004.09-2008.07」写进接口,导致 dataset 整批校验失败、明细全丢。
597
+ normalizeImportDates(args, warnings);
467
598
  const talent = cache.forms.talent_pool;
468
599
  const objId = talent?.objId;
469
600
  const formId = talent?.formId || objId;
@@ -691,7 +822,7 @@ const candidateImportPrepare = {
691
822
  candidateName: plan.talentName,
692
823
  telephone: plan.mobile,
693
824
  },
694
- }, 10 * 60 * 1000);
825
+ }, CONTINUATION_TTL_MS);
695
826
  return ehrSuccess('ehr.recruit.candidate.import.prepare', {
696
827
  status: 'AWAITING_CONFIRMATION',
697
828
  preview: {
@@ -709,7 +840,7 @@ const candidateImportPrepare = {
709
840
  },
710
841
  ...(tagCheck ? { tagCheck } : {}),
711
842
  continuation,
712
- expiresInSeconds: 600,
843
+ expiresInSeconds: CONTINUATION_TTL_SECONDS,
713
844
  });
714
845
  },
715
846
  };
@@ -809,13 +940,61 @@ const candidateImportApply = {
809
940
  const warnings = [...(payload.warnings || [])];
810
941
  if (batchNote)
811
942
  warnings.push(batchNote);
943
+ // 明细完整性判定(2026-11-05 与 recruit-stage 同步修复):
944
+ // 主表建成 ≠ 建档成功。原实现 result 硬编码 'success' 且从不回读明细,
945
+ // 一旦日期格式等原因导致明细整批被拒,会出现「人才已建、经历全空」却仍报成功的静默事故。
946
+ // 规则:期望行数 > 0 时读回行数必须 >= 期望,否则 result 只能报 partial;回读失败标 unverified。
947
+ let detailsState = 'complete';
948
+ const expectedDetailRows = Object.values(payload.subStats || {}).reduce((sum, n) => sum + Number(n || 0), 0);
949
+ if (expectedDetailRows > 0) {
950
+ try {
951
+ const snapshot = (await env.host.request({
952
+ path: '/api/ebuilder/form/form/core/getFormDataAndLayout',
953
+ method: 'POST',
954
+ body: {
955
+ terminalType: 'PC',
956
+ dataId: talentId,
957
+ formId,
958
+ module: 'ebuilderform',
959
+ newLayout: true,
960
+ dataCrossLayout: false,
961
+ permissionId: '',
962
+ allReadOnly: true,
963
+ initialDatas: [],
964
+ dynamicData: false,
965
+ cost: false,
966
+ customParam: { objId, dataId: talentId },
967
+ },
968
+ operation: 'ehr.recruit.candidate.import.apply',
969
+ }));
970
+ const detailData = snapshot?.data?.formData?.dataDetails || [];
971
+ const seenRows = {};
972
+ for (const d of detailData) {
973
+ if (!d?.subFormId)
974
+ continue;
975
+ const key = String(d.subFormId);
976
+ (seenRows[key] = seenRows[key] || new Set()).add(String(d.dataIndex));
977
+ }
978
+ const gotRows = Object.values(seenRows).reduce((sum, set) => sum + set.size, 0);
979
+ if (gotRows < expectedDetailRows) {
980
+ detailsState = 'missing';
981
+ warnings.push(`明细行未完整落库(期望 ${expectedDetailRows} 行,读回 ${gotRows} 行):主表已写入,请核对后补齐明细`);
982
+ }
983
+ }
984
+ catch (error) {
985
+ detailsState = 'unverified';
986
+ warnings.push(`明细读回校验失败(无法确认明细是否落库):${error?.message || '未知错误'}`);
987
+ }
988
+ }
812
989
  return ehrSuccess('ehr.recruit.candidate.import.apply', {
813
- result: 'success',
990
+ result: detailsState === 'complete' ? 'success' : 'partial',
991
+ detailsState,
814
992
  talentId,
815
993
  candidateName: payload.candidateName,
816
994
  telephone: payload.telephone,
817
995
  mainTableFields: Object.keys(mainTable).length,
818
996
  detailRows: payload.subStats || undefined,
997
+ detailRowsExpected: expectedDetailRows || undefined,
819
998
  attachment: uploaded ? { name: uploaded.name, size: uploaded.size } : null,
820
999
  batch: { ok: batchOk, note: batchNote },
821
1000
  labelMatch,