weaver-work-cli 0.1.40 → 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 (401) hide show
  1. package/README.md +17 -0
  2. package/dist/chunks/{archive-JHTONRST.js → archive-P6TBQGKL.js} +13 -5
  3. package/dist/chunks/{archive-oa-FCHLCPHC.js → archive-oa-7TQ2NXOH.js} +12 -5
  4. package/dist/chunks/{asset-RLIHC7DB.js → asset-3ELRG37G.js} +11 -4
  5. package/dist/chunks/{asset-idle-KVOFTLCP.js → asset-idle-WIGMUFMD.js} +7 -3
  6. package/dist/chunks/{attachment-content-RZYDB3MB.js → attachment-content-E3276UOV.js} +5 -4
  7. package/dist/chunks/{blog-42OZTJNP.js → blog-C5NMZAAC.js} +11 -4
  8. package/dist/chunks/{caizhilian-KRK547K5.js → caizhilian-5XSM2DFP.js} +13 -6
  9. package/dist/chunks/{calendar-RTWAMKHD.js → calendar-FI2WNSBO.js} +71 -26
  10. package/dist/chunks/{chunk-CXRQWOZ5.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-LN447PY2.js → chunk-BCVYBYYT.js} +432 -2247
  16. package/dist/chunks/{chunk-7E6MUOEK.js → chunk-CWYGFU5B.js} +2 -2
  17. package/dist/chunks/{chunk-NOODWMCL.js → chunk-D4ADSZ7H.js} +1 -1
  18. package/dist/chunks/{chunk-WFFNM65B.js → chunk-ETNJSKMM.js} +281 -29
  19. package/dist/chunks/{chunk-CAQNBBQA.js → chunk-F4E4EM35.js} +3 -3
  20. package/dist/chunks/{chunk-4CTESSKI.js → chunk-FAZTGX7S.js} +6 -6
  21. package/dist/chunks/chunk-FRZKBMSW.js +2562 -0
  22. package/dist/chunks/{chunk-BYBSCN4X.js → chunk-G7PQWD4L.js} +6 -3
  23. package/dist/chunks/{chunk-NJKREDA3.js → chunk-GAMZLAG2.js} +1 -1
  24. package/dist/chunks/{chunk-FLS4DPGP.js → chunk-GM6J7Q4B.js} +28 -15
  25. package/dist/chunks/{chunk-NETCCARD.js → chunk-GRDRG6HP.js} +3 -3
  26. package/dist/chunks/chunk-HIT4Y6OI.js +1238 -0
  27. package/dist/chunks/{chunk-EZALDOQH.js → chunk-HP7JIYMT.js} +5 -2
  28. package/dist/chunks/{chunk-IZSSVYAG.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-57IECMWX.js → chunk-N4M2DDFE.js} +29 -15
  32. package/dist/chunks/{chunk-JWRZM2H2.js → chunk-OF4S23UB.js} +4 -4
  33. package/dist/chunks/{chunk-VNBU55SL.js → chunk-PC7VKEB5.js} +80 -2458
  34. package/dist/chunks/{chunk-G2JSIUWF.js → chunk-PUQS5MWL.js} +91 -2
  35. package/dist/chunks/{chunk-E7OK5WD5.js → chunk-Q4OYAQYH.js} +5 -5
  36. package/dist/chunks/{chunk-7BRU4EFH.js → chunk-QVSWRLLU.js} +35 -6
  37. package/dist/chunks/{chunk-T6EGVBKU.js → chunk-TA7FXXJD.js} +6 -3
  38. package/dist/chunks/{chunk-GPMFD4RD.js → chunk-TXUG266F.js} +1 -1
  39. package/dist/chunks/{chunk-4TEDNCON.js → chunk-UFIT2UU3.js} +354 -56
  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-7U577Q7U.js → chunk-WSF4NNMR.js} +3 -3
  44. package/dist/chunks/chunk-XHK4MDR5.js +2497 -0
  45. package/dist/chunks/{chunk-LFMSDBZN.js → chunk-XNIK66I4.js} +326 -161
  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-I566ZYNF.js → chunk-Z7VYWPZV.js} +1 -1
  49. package/dist/chunks/{conflict-VR55AOOO.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-HI4FNPYE.js → contract-DNIIW5VJ.js} +13 -5
  55. package/dist/chunks/{cowork-HJLI353D.js → cowork-GMLRGVIW.js} +31 -14
  56. package/dist/chunks/create-flow-J22BO65E.js +56 -0
  57. package/dist/chunks/{ebuilder-form-HTGI63UU.js → ebuilder-form-ANV2FHYV.js} +12 -7
  58. package/dist/chunks/{ehr-GYXIYH3A.js → ehr-GSTGAIY3.js} +695 -1255
  59. package/dist/chunks/{employee-SAK2QYXX.js → employee-22BGJ3QS.js} +3 -3
  60. package/dist/chunks/{env-DW3G4HUO.js → env-BX3VRFS7.js} +4 -3
  61. package/dist/chunks/{esb-I5INCEFE.js → esb-ATAIASX2.js} +12 -7
  62. package/dist/chunks/{factory-TKXGXS6L.js → factory-PETTFME6.js} +3 -2
  63. package/dist/chunks/{fna-K2MHTQ24.js → fna-YEKBSFSX.js} +14 -8
  64. package/dist/chunks/{group-chat-VYBNMJLG.js → group-chat-BFVXAYFX.js} +7 -4
  65. package/dist/chunks/{host-D5SERMAJ.js → host-HRBXEPDQ.js} +5 -5
  66. package/dist/chunks/{host-JM4YVHFM.js → host-LR55CTHP.js} +5 -5
  67. package/dist/chunks/{host-L3VLITMT.js → host-SUOY6VYQ.js} +5 -5
  68. package/dist/chunks/{host-ZUQTJYYK.js → host-SZGV4UNT.js} +5 -5
  69. package/dist/chunks/{host-256GVCAH.js → host-WIKN2EJ5.js} +5 -5
  70. package/dist/chunks/{hrm-VLRBKTZB.js → hrm-NRDO4W5G.js} +11 -7
  71. package/dist/chunks/{im-QK3VTLXK.js → im-IQ2HN23S.js} +11 -10
  72. package/dist/chunks/{invoice-T5JTA32H.js → invoice-MNRW76PP.js} +636 -1768
  73. package/dist/chunks/{jiuchuanhui-P2FNEQVZ.js → jiuchuanhui-DTRBAX4N.js} +14 -6
  74. package/dist/chunks/{lazy-dispatch-XRRI46M6.js → lazy-dispatch-ZVWAI25B.js} +7 -6
  75. package/dist/chunks/{mail-3Y7MJ6PS.js → mail-ZVAUXOJA.js} +16 -14
  76. package/dist/chunks/{meeting-M7LTXGJE.js → meeting-FEVPZ67S.js} +21 -13
  77. package/dist/chunks/{okr-OBC6S67L.js → okr-SDH3E5RA.js} +12 -5
  78. package/dist/chunks/{operations-5QL3AECO.js → operations-62N6EP3C.js} +4 -3
  79. package/dist/chunks/{plan-5H6I53SK.js → plan-E35JFDI7.js} +12 -5
  80. package/dist/chunks/{project-L75QZV4S.js → project-73QXBAB2.js} +49 -25
  81. package/dist/chunks/reception-UWZVACBN.js +1899 -0
  82. package/dist/chunks/recruit-stage-4MAOCKFY.js +4770 -0
  83. package/dist/chunks/registry-IM5G23LS.js +24 -0
  84. package/dist/chunks/{registry-UGRBCBHO.js → registry-JDUS4E7D.js} +7 -6
  85. package/dist/chunks/{registry-RXPN6BBT.js → registry-KNKSCJNT.js} +7 -6
  86. package/dist/chunks/{registry-NYPYMZXG.js → registry-PO7SI256.js} +4 -4
  87. package/dist/chunks/{registry-QGHFNUWS.js → registry-PVUZQDDQ.js} +3 -3
  88. package/dist/chunks/{room-recommend-A3UDC3CA.js → room-recommend-H7KLXA5R.js} +6 -5
  89. package/dist/chunks/{schedule-5GCACCK7.js → schedule-ESZIBAUO.js} +6 -5
  90. package/dist/chunks/{workflow-M5ZJ7DWF.js → workflow-CWJFJLQU.js} +15 -10
  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 +41 -30
  98. package/dist/internal/e10/auth/commands.js +164 -8
  99. package/dist/internal/e10/auth/error-log.js +182 -0
  100. package/dist/internal/e10/auth/messages.js +6 -0
  101. package/dist/internal/e10/auth/session.js +34 -3
  102. package/dist/internal/e10/auth/xiaoe.js +286 -44
  103. package/dist/internal/e10/auth-recovery.js +72 -14
  104. package/dist/internal/e10/context.js +72 -13
  105. package/dist/internal/e10/index.js +1 -1
  106. package/dist/internal/e10/network-error.js +93 -0
  107. package/dist/internal/e10/request-runtime.js +6 -0
  108. package/dist/internal/skills/install.js +9 -1
  109. package/dist/shortcuts/archive/continuation.js +2 -1
  110. package/dist/shortcuts/archive/index.js +3 -0
  111. package/dist/shortcuts/archive/operations/confirm.js +2 -1
  112. package/dist/shortcuts/archive-oa/continuation.js +2 -1
  113. package/dist/shortcuts/archive-oa/index.js +2 -0
  114. package/dist/shortcuts/archive-oa/operations/confirm.js +2 -1
  115. package/dist/shortcuts/asset/continuation.js +2 -1
  116. package/dist/shortcuts/asset/index.js +2 -0
  117. package/dist/shortcuts/asset-idle/index.js +2 -0
  118. package/dist/shortcuts/blog/continuation.js +2 -1
  119. package/dist/shortcuts/blog/index.js +2 -0
  120. package/dist/shortcuts/caizhilian/continuation.js +2 -1
  121. package/dist/shortcuts/caizhilian/index.js +2 -0
  122. package/dist/shortcuts/caizhilian/operations/confirm.js +3 -2
  123. package/dist/shortcuts/calendar/continuation.js +2 -1
  124. package/dist/shortcuts/calendar/index.js +2 -0
  125. package/dist/shortcuts/calendar/operations/read.js +31 -22
  126. package/dist/shortcuts/calendar/operations/write.js +46 -2
  127. package/dist/shortcuts/contract/continuation.js +2 -1
  128. package/dist/shortcuts/contract/index.js +2 -0
  129. package/dist/shortcuts/contract/operations/write.js +2 -1
  130. package/dist/shortcuts/cowork/continuation.js +2 -1
  131. package/dist/shortcuts/cowork/index.js +2 -0
  132. package/dist/shortcuts/cowork/operations/discuss-write.js +5 -1
  133. package/dist/shortcuts/cowork/operations/item-write.js +1 -7
  134. package/dist/shortcuts/cowork/operations/member-write.js +3 -1
  135. package/dist/shortcuts/cowork/operations/permission-write.js +5 -1
  136. package/dist/shortcuts/cowork/operations/shared.js +7 -0
  137. package/dist/shortcuts/ebuilder-form/continuation.js +2 -1
  138. package/dist/shortcuts/ebuilder-form/index.js +2 -0
  139. package/dist/shortcuts/ebuilder-form/operations/write.js +3 -2
  140. package/dist/shortcuts/ehr/continuation.js +2 -1
  141. package/dist/shortcuts/ehr/index.js +2 -0
  142. package/dist/shortcuts/ehr/operations/attend-write.js +44 -2
  143. package/dist/shortcuts/ehr/operations/hr-contact.js +7 -4
  144. package/dist/shortcuts/ehr/operations/hr-report.js +13 -7
  145. package/dist/shortcuts/ehr/operations/recruit-candidate-import.js +317 -63
  146. package/dist/shortcuts/ehr/operations/recruit-position.js +134 -2
  147. package/dist/shortcuts/ehr/operations/recruit-write.js +263 -18
  148. package/dist/shortcuts/ehr/operations/recruit.js +10 -4
  149. package/dist/shortcuts/ehr/operations/shared.js +47 -0
  150. package/dist/shortcuts/esb/continuation.js +2 -1
  151. package/dist/shortcuts/esb/index.js +2 -0
  152. package/dist/shortcuts/esb/operations/trigger.js +2 -1
  153. package/dist/shortcuts/fna/continuation.js +2 -1
  154. package/dist/shortcuts/fna/index.js +2 -0
  155. package/dist/shortcuts/fna/operations/invoice-writeoff.js +1 -1
  156. package/dist/shortcuts/fna/operations/loan.js +1 -1
  157. package/dist/shortcuts/hrm/index.js +2 -0
  158. package/dist/shortcuts/hrm/operations/org.js +118 -0
  159. package/dist/shortcuts/im/continuation.js +2 -1
  160. package/dist/shortcuts/index.js +10 -0
  161. package/dist/shortcuts/invoice/continuation.js +2 -1
  162. package/dist/shortcuts/invoice/index.js +14 -15
  163. package/dist/shortcuts/invoice/invoice-record.js +93 -0
  164. package/dist/shortcuts/invoice/manifest.js +190 -393
  165. package/dist/shortcuts/invoice/operations/add.js +2 -1
  166. package/dist/shortcuts/invoice/operations/delete.js +2 -1
  167. package/dist/shortcuts/invoice/operations/import.js +2 -1
  168. package/dist/shortcuts/invoice/operations/issuing-contract-detail.js +86 -0
  169. package/dist/shortcuts/invoice/operations/issuing-contracts.js +210 -0
  170. package/dist/shortcuts/invoice/operations/registry.js +17 -17
  171. package/dist/shortcuts/invoice/operations/reim-auto.js +4 -569
  172. package/dist/shortcuts/invoice/operations/reim.js +52 -341
  173. package/dist/shortcuts/invoice/operations/shared.js +21 -4
  174. package/dist/shortcuts/invoice/operations/update.js +2 -1
  175. package/dist/shortcuts/invoice/projection.js +10 -62
  176. package/dist/shortcuts/jiuchuanhui/continuation.js +2 -1
  177. package/dist/shortcuts/jiuchuanhui/index.js +2 -0
  178. package/dist/shortcuts/jiuchuanhui/operations/datajson.js +2 -1
  179. package/dist/shortcuts/jiuchuanhui/operations/esb.js +2 -1
  180. package/dist/shortcuts/mail/continuation.js +2 -1
  181. package/dist/shortcuts/mail/index.js +2 -0
  182. package/dist/shortcuts/mail/operations/mail-blacklist.js +1 -1
  183. package/dist/shortcuts/mail/operations/mail-contacts.js +1 -1
  184. package/dist/shortcuts/mail/operations/mail-send.js +1 -1
  185. package/dist/shortcuts/mail/operations/mail-sign.js +1 -1
  186. package/dist/shortcuts/mail/operations/mail-template.js +1 -1
  187. package/dist/shortcuts/meeting/continuation.js +2 -1
  188. package/dist/shortcuts/meeting/index.js +2 -0
  189. package/dist/shortcuts/meeting/operations/change.js +1 -1
  190. package/dist/shortcuts/meeting/operations/create.js +1 -1
  191. package/dist/shortcuts/meeting/operations/eb/catalog.js +4 -1
  192. package/dist/shortcuts/meeting/operations/eb/create-flow.js +101 -35
  193. package/dist/shortcuts/meeting/operations/eb/decision.js +1 -1
  194. package/dist/shortcuts/meeting/operations/eb/factory.js +34 -1
  195. package/dist/shortcuts/meeting/operations/eb/group-chat.js +25 -3
  196. package/dist/shortcuts/meeting/operations/eb/person-cache.js +96 -0
  197. package/dist/shortcuts/meeting/operations/eb/room-recommend.js +33 -11
  198. package/dist/shortcuts/meeting/operations/lifecycle.js +1 -1
  199. package/dist/shortcuts/meeting/operations/receipts.js +1 -1
  200. package/dist/shortcuts/meeting/operations/signs.js +1 -1
  201. package/dist/shortcuts/okr/continuation.js +2 -1
  202. package/dist/shortcuts/okr/index.js +2 -0
  203. package/dist/shortcuts/okr/operations/write.js +1 -1
  204. package/dist/shortcuts/plan/continuation.js +2 -1
  205. package/dist/shortcuts/plan/index.js +2 -0
  206. package/dist/shortcuts/plan/operations/write.js +1 -1
  207. package/dist/shortcuts/project/continuation.js +2 -1
  208. package/dist/shortcuts/project/index.js +2 -0
  209. package/dist/shortcuts/project/operations/read.js +6 -25
  210. package/dist/shortcuts/project/operations/shared.js +22 -0
  211. package/dist/shortcuts/project/operations/write.js +28 -2
  212. package/dist/shortcuts/reception/constants.js +53 -0
  213. package/dist/shortcuts/reception/errors.js +54 -0
  214. package/dist/shortcuts/reception/host.js +125 -0
  215. package/dist/shortcuts/reception/index.js +198 -0
  216. package/dist/shortcuts/reception/manifest.js +177 -0
  217. package/dist/shortcuts/reception/operations/ask.js +71 -0
  218. package/dist/shortcuts/reception/operations/browsertool.js +58 -0
  219. package/dist/shortcuts/reception/operations/compose.js +129 -0
  220. package/dist/shortcuts/reception/operations/customparams.js +74 -0
  221. package/dist/shortcuts/reception/operations/doc.js +238 -0
  222. package/dist/shortcuts/reception/operations/docrender.js +36 -0
  223. package/dist/shortcuts/reception/operations/panels.js +179 -0
  224. package/dist/shortcuts/reception/operations/registry.js +26 -0
  225. package/dist/shortcuts/reception/operations/render-assets.js +184 -0
  226. package/dist/shortcuts/reception/operations/render.js +123 -0
  227. package/dist/shortcuts/reception/operations/runs.js +38 -0
  228. package/dist/shortcuts/reception/operations/schedule.js +127 -0
  229. package/dist/shortcuts/reception/operations/shared.js +196 -0
  230. package/dist/shortcuts/reception/operations/snapshot.js +68 -0
  231. package/dist/shortcuts/reception/operations/types.js +1 -0
  232. package/dist/shortcuts/reception/operations.js +33 -0
  233. package/dist/shortcuts/reception/upload.js +218 -0
  234. package/dist/shortcuts/recruit-stage/context.js +231 -0
  235. package/dist/shortcuts/recruit-stage/continuation.js +74 -0
  236. package/dist/shortcuts/recruit-stage/errors.js +65 -0
  237. package/dist/shortcuts/recruit-stage/host.js +109 -0
  238. package/dist/shortcuts/recruit-stage/index.js +115 -0
  239. package/dist/shortcuts/recruit-stage/manifest.js +29 -0
  240. package/dist/shortcuts/recruit-stage/operations/interview-arrange.js +722 -0
  241. package/dist/shortcuts/recruit-stage/operations/interview-feedback.js +269 -0
  242. package/dist/shortcuts/recruit-stage/operations/jd-create.js +719 -0
  243. package/dist/shortcuts/recruit-stage/operations/list.js +431 -0
  244. package/dist/shortcuts/recruit-stage/operations/registry.js +38 -0
  245. package/dist/shortcuts/recruit-stage/operations/resume-import.js +1354 -0
  246. package/dist/shortcuts/recruit-stage/operations/search.js +158 -0
  247. package/dist/shortcuts/recruit-stage/operations/types.js +25 -0
  248. package/dist/shortcuts/recruit-stage/school-tiers.json +318 -0
  249. package/dist/shortcuts/recruit-stage/shared.js +608 -0
  250. package/dist/shortcuts/workflow/continuation.js +2 -1
  251. package/dist/shortcuts/workflow/index.js +2 -0
  252. package/dist/shortcuts/workflow/operations/form.js +32 -8
  253. package/dist/shortcuts/workflow/operations/todoSmartConvert/detailFieldRules.js +4 -2
  254. package/dist/shortcuts/workflow/operations/todoSmartConvert/summaryCache.js +13 -6
  255. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailCache.js +17 -24
  256. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailFetcher.js +14 -9
  257. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +50 -8
  258. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +2 -1
  259. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.detail.js +17 -11
  260. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +7 -39
  261. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +3 -2
  262. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +51 -15
  263. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.pipeline.js +16 -1
  264. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +151 -63
  265. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.subGroup.js +56 -0
  266. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +39 -14
  267. package/dist/shortcuts/workflow/operations/write.js +1 -1
  268. package/docs/_catalog.md +3 -0
  269. package/docs/agent-invoice.md +1 -1
  270. package/docs/archive-oa.md +1 -1
  271. package/docs/caizhilian.md +1 -1
  272. package/docs/calendar.md +1 -1
  273. package/docs/contract.md +1 -1
  274. package/docs/e10-auth.md +23 -1
  275. package/docs/ehr.md +2 -2
  276. package/docs/esb.md +1 -1
  277. package/docs/im.md +1 -1
  278. package/docs/invoice.md +8 -12
  279. package/docs/okr.md +1 -1
  280. package/docs/operation-manual.md +8 -0
  281. package/docs/reception.md +119 -0
  282. package/package.json +1 -1
  283. package/scripts/clean.mjs +43 -2
  284. package/scripts/install-skill-to-xiaoe.mjs +105 -0
  285. package/scripts/package-skill.mjs +4 -2
  286. package/skill-template/business-info.json +42 -2
  287. package/skill-template/domains/caizhilian.md +1 -1
  288. package/skill-template/domains/reception-flow.md +18 -0
  289. package/skill-template/domains/recruit-stage.md +29 -0
  290. package/skill-template/domains/yepiaotong.md +4 -7
  291. package/skills/weaver-e10-archive-oa/references/source-manifest.json +14 -14
  292. package/skills/weaver-e10-blog/references/blog-publish.md +1 -1
  293. package/skills/weaver-e10-blog/references/source-manifest.json +7 -7
  294. package/skills/weaver-e10-caizhilian/references/source-manifest.json +21 -21
  295. package/skills/weaver-e10-caizhilian/references/write-protocol.md +2 -2
  296. package/skills/weaver-e10-calendar/SKILL.md +2 -1
  297. package/skills/weaver-e10-calendar/references/calendar-write.md +55 -1
  298. package/skills/weaver-e10-cowork/SKILL.md +1 -1
  299. package/skills/weaver-e10-cowork/references/cowork-write.md +3 -1
  300. package/skills/weaver-e10-ebuilder-form/SKILL.md +1 -1
  301. package/skills/weaver-e10-ebuilder-form/references/custom-api.md +1 -1
  302. package/skills/weaver-e10-ebuilder-form/references/openapi-write.md +1 -1
  303. package/skills/weaver-e10-esb/SKILL.md +2 -2
  304. package/skills/weaver-e10-esb/references/source-manifest.json +22 -22
  305. package/skills/weaver-e10-esb/references/trigger.md +2 -2
  306. package/skills/weaver-e10-jinchengda/references/contract-clause-library-crud.md +1 -1
  307. package/skills/weaver-e10-jinchengda/references/contract-clause-reference-save.md +1 -1
  308. package/skills/weaver-e10-jinchengda/references/contract-request-write.md +1 -1
  309. package/skills/weaver-e10-jinchengda/references/source-manifest.json +29 -29
  310. package/skills/weaver-e10-jucailin/SKILL.md +1 -1
  311. package/skills/weaver-e10-jucailin/references/attend-write.md +10 -2
  312. package/skills/weaver-e10-jucailin/references/hr-contact.md +8 -0
  313. package/skills/weaver-e10-jucailin/references/hr-report.md +8 -0
  314. package/skills/weaver-e10-jucailin/references/recruit-create.md +14 -5
  315. package/skills/weaver-e10-jucailin/references/recruit-read.md +1 -1
  316. package/skills/weaver-e10-jucailin/references/recruit-write.md +5 -4
  317. package/skills/weaver-e10-mail/SKILL.md +1 -1
  318. package/skills/weaver-e10-meeting/SKILL.md +39 -7
  319. package/skills/weaver-e10-meeting/references/meeting-change.md +1 -1
  320. package/skills/weaver-e10-meeting/references/meeting-create.md +1 -1
  321. package/skills/weaver-e10-meeting/references/meeting-lifecycle.md +1 -1
  322. package/skills/weaver-e10-meeting/references/meeting-verification.md +1 -1
  323. package/skills/weaver-e10-okr/references/okr-align.md +1 -1
  324. package/skills/weaver-e10-okr/references/okr-keyresult.md +1 -1
  325. package/skills/weaver-e10-okr/references/okr-write.md +1 -1
  326. package/skills/weaver-e10-okr/references/source-manifest.json +8 -8
  327. package/skills/weaver-e10-plan/references/plan-report-write.md +1 -1
  328. package/skills/weaver-e10-plan/references/source-manifest.json +20 -20
  329. package/skills/weaver-e10-qiyecheng/references/loan-management.md +1 -1
  330. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +18 -18
  331. package/skills/weaver-e10-reception-flow/SKILL.md +173 -0
  332. 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
  333. package/skills/weaver-e10-reception-flow/data/fields-snapshot.json +213 -0
  334. package/skills/weaver-e10-reception-flow/references/browsertool.md +68 -0
  335. package/skills/weaver-e10-reception-flow/references/env-pitfalls.md +51 -0
  336. package/skills/weaver-e10-reception-flow/references/fields-snapshot.md +227 -0
  337. package/skills/weaver-e10-reception-flow/references/guide.md +179 -0
  338. package/skills/weaver-e10-reception-flow/scripts/locate.sh +14 -0
  339. package/skills/weaver-e10-reception-flow/scripts/render.py +724 -0
  340. package/skills/weaver-e10-recruit-stage/SKILL.md +230 -0
  341. package/skills/weaver-e10-recruit-stage/agents/openai.yaml +119 -0
  342. package/skills/weaver-e10-recruit-stage/lib/recruit-xiaoe-file.mjs +188 -0
  343. package/skills/weaver-e10-recruit-stage/lib/xiaoe-session.mjs +66 -0
  344. package/skills/weaver-e10-recruit-stage/references/position-templates.md +202 -0
  345. package/skills/weaver-e10-recruit-stage/references/recruit-arrange-interview.md +322 -0
  346. package/skills/weaver-e10-recruit-stage/references/recruit-capability-check.md +127 -0
  347. package/skills/weaver-e10-recruit-stage/references/recruit-check-install.md +65 -0
  348. package/skills/weaver-e10-recruit-stage/references/recruit-detail-process.md +63 -0
  349. package/skills/weaver-e10-recruit-stage/references/recruit-edit-interview-feedback.md +142 -0
  350. package/skills/weaver-e10-recruit-stage/references/recruit-jd-create.md +95 -0
  351. package/skills/weaver-e10-recruit-stage/references/recruit-jd-template.md +56 -0
  352. package/skills/weaver-e10-recruit-stage/references/recruit-list-candidate.md +101 -0
  353. package/skills/weaver-e10-recruit-stage/references/recruit-list-interview.md +148 -0
  354. package/skills/weaver-e10-recruit-stage/references/recruit-match-candidates.md +77 -0
  355. package/skills/weaver-e10-recruit-stage/references/recruit-output-links.md +59 -0
  356. package/skills/weaver-e10-recruit-stage/references/recruit-resolve-creator.md +69 -0
  357. package/skills/weaver-e10-recruit-stage/references/recruit-resolve-metadata.md +241 -0
  358. package/skills/weaver-e10-recruit-stage/references/recruit-resume-import.md +451 -0
  359. package/skills/weaver-e10-recruit-stage/references/recruit-resume-parse.md +128 -0
  360. package/skills/weaver-e10-recruit-stage/references/recruit-search-candidate.md +146 -0
  361. package/skills/weaver-e10-recruit-stage/references/recruit-urge-feedback.md +69 -0
  362. package/skills/weaver-e10-shared/SKILL.md +1 -1
  363. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +10 -2
  364. package/skills/weaver-e10-shijingran/SKILL.md +7 -6
  365. package/skills/weaver-e10-shijingran/references/operations.md +3 -1
  366. package/skills/weaver-e10-shijingran/references/source-manifest.json +30 -28
  367. package/skills/weaver-e10-shijingran/references/write-operations.md +2 -0
  368. package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +2 -0
  369. package/skills/weaver-e10-wenshuding/references/source-manifest.json +3 -3
  370. package/skills/weaver-e10-workflow/SKILL.md +4 -2
  371. package/skills/weaver-e10-workflow/aigroup/default.json +11 -9
  372. package/skills/weaver-e10-workflow/references/source-manifest.json +32 -32
  373. package/skills/weaver-e10-workflow/references/todo-smart-convert.md +23 -13
  374. package/skills/weaver-e10-workflow/tools/todo-summary.cjs +62 -20
  375. package/skills/weaver-e10-yepiaotong/SKILL.md +28 -36
  376. package/skills/weaver-e10-yepiaotong/references/invoice-agent-entry.md +6 -3
  377. package/skills/weaver-e10-yepiaotong/references/invoice-detail.md +13 -10
  378. package/skills/weaver-e10-yepiaotong/references/invoice-enterprise-list.md +2 -0
  379. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-workflow.md +194 -155
  380. package/skills/weaver-e10-yepiaotong/references/invoice-output-view.md +28 -32
  381. package/skills/weaver-e10-yepiaotong/references/invoice-personal-list.md +5 -1
  382. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +8 -10
  383. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +211 -616
  384. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +149 -117
  385. package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +17 -20
  386. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +20 -39
  387. package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +55 -22
  388. package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +7 -17
  389. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +88 -92
  390. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +144 -354
  391. package/skills/weaver-e10-yimiaoban/SKILL.md +1 -1
  392. package/skills/weaver-e10-yimiaoban/references/msg-write.md +1 -1
  393. package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +1 -1
  394. package/skills/weaver-e10-yimiaoban/references/source-manifest.json +7 -7
  395. package/dist/chunks/chunk-SPRHHSVC.js +0 -465
  396. package/dist/chunks/registry-KMHCPAAD.js +0 -22
  397. package/dist/shortcuts/invoice/markdown.js +0 -172
  398. package/dist/shortcuts/invoice/operations/issuing-qys.js +0 -424
  399. package/skills/weaver-e10-meeting.zip +0 -0
  400. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +0 -131
  401. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-form-fill-rules.md +0 -179
@@ -1,7 +1,7 @@
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 { WRITE, ehrSuccess, schemaOf, } from './types.js';
4
- const CONTINUATION_TTL_SECONDS = 600;
5
5
  function fingerprint(value) {
6
6
  return createHash('sha256').update(JSON.stringify(value ?? null)).digest('hex').slice(0, 32);
7
7
  }
@@ -301,21 +301,28 @@ async function resolveCandidateForWrite(host, cache, talentId) {
301
301
  throw ehrValidationError('recruit_batch_id_missing', '未取到 batchId(prepareQuery 返回异常),无法定位候选人应聘批次');
302
302
  }
303
303
  const v = randomHex6();
304
- const otherResponse = (await host.request({
305
- path: `/api/recruit/candidate/getCandidateCardOtherInfo?talentId=${talentId}&batchId=${batchId}&v=${v}&randomkey_ab=ab`,
306
- headers: extra,
307
- }));
308
- const batch = otherResponse?.data?.currentCandidateBatch || {};
309
- let name = batch?.talent?.name || '';
310
- if (!name) {
311
- const baseResponse = (await host.request({
304
+ // otherInfo 必成功(保持原语义);baseInfo 并行取(姓名兜底 + AI 面试条件必填的邮箱/手机),失败不阻断
305
+ const [otherResponse, baseResponse] = await Promise.all([
306
+ host.request({
307
+ path: `/api/recruit/candidate/getCandidateCardOtherInfo?talentId=${talentId}&batchId=${batchId}&v=${v}&randomkey_ab=ab`,
308
+ headers: extra,
309
+ }),
310
+ host
311
+ .request({
312
312
  path: `/api/recruit/candidate/getCandidateCardBaseInfo?talentId=${talentId}&batchId=${batchId}&v=${v}&randomkey_cd=cd`,
313
313
  headers: extra,
314
- }));
315
- name = baseResponse?.data?.talent?.hrm?.name || '';
316
- }
314
+ })
315
+ .catch(() => null),
316
+ ]);
317
+ const batch = otherResponse?.data?.currentCandidateBatch || {};
318
+ const talentBase = baseResponse?.data?.talent || {};
319
+ const name = batch?.talent?.name || talentBase?.hrm?.name || talentBase?.name || '';
320
+ const email = String(talentBase.email || talentBase.hrm?.email || '').trim();
321
+ const mobile = String(talentBase.telephone || talentBase.mobile || '').trim();
317
322
  return {
318
323
  name,
324
+ email,
325
+ mobile,
319
326
  candidateManageId: batch?.id || batch?.candidateManageId || null,
320
327
  positionId: batch?.position?.id || null,
321
328
  positionName: batch?.position?.name || null,
@@ -535,6 +542,8 @@ const candidateCreateApply = {
535
542
  // 安排面试 operation
536
543
  // ---------------------------------------------------------------------------
537
544
  const INTERVIEW_TYPES = ['现场面试', '视频面试', '电话面试', 'AI面试'];
545
+ /** AI 面试方案默认值(用户口径:默认「大模型面试」)。若环境无此方案,运行时列出候选让用户选,绝不自动取第一条。 */
546
+ const AI_DEFAULT_PLAN_NAME = '大模型面试';
538
547
  const INTERVIEW_DATAKEYS = ['subject', 'start_time', 'end_time', 'interview_type', 'interview_session', 'interviewer',
539
548
  'position_manage_id', 'talent_id', 'candidate_manage_id', 'mobile', 'email', 'interview_location', 'notice_mould'];
540
549
  function defaultInterviewWindow() {
@@ -544,16 +553,181 @@ function defaultInterviewWindow() {
544
553
  const end = new Date(now.getTime() + 60 * 60 * 1000);
545
554
  return { start: fmt(now), end: fmt(end) };
546
555
  }
556
+ /** 当前登录人(teamsCheck → currentUser.id/username):面试官未指定时的默认值。
557
+ * teamsCheck 响应无 status 字段、不被 isBusinessSuccess 认可,故直连 fetch 绕开业务判定(同 recruit.ts 口径)。 */
558
+ async function resolveCurrentUserForWrite(host) {
559
+ try {
560
+ const session = await host.getSession();
561
+ const baseUrl = String(session?.baseUrl || '');
562
+ if (!baseUrl)
563
+ return null;
564
+ const resp = await fetch(`${baseUrl}/api/baseserver/layout/teamsCheck?clientType=not_xinchuang&client=WEB&domainName=${encodeURIComponent(baseUrl)}`, {
565
+ method: 'POST',
566
+ headers: {
567
+ accept: 'application/json',
568
+ 'content-type': 'application/json',
569
+ eteamsid: String(session?.eteamsId || ''),
570
+ cookie: typeof session?.cookieHeader === 'function' ? session.cookieHeader() : '',
571
+ 'user-agent': typeof session?.uaHeader === 'function' ? session.uaHeader() : 'weaver-work-cli',
572
+ origin: baseUrl,
573
+ },
574
+ redirect: 'manual',
575
+ });
576
+ const data = await resp.json().catch(() => ({}));
577
+ const cu = data?.currentUser ?? data?.data?.currentUser ?? null;
578
+ if (!cu?.id)
579
+ return null;
580
+ return { id: String(cu.id), name: String(cu.username || cu.id) };
581
+ }
582
+ catch {
583
+ return null;
584
+ }
585
+ }
586
+ /** 取表单布局 id(GET 在低基线返 405 → 回退 POST),用于 AI 面试方案的关联字段候选 */
587
+ async function fetchLayoutIdForForm(host, formId) {
588
+ try {
589
+ const r = (await host.request({
590
+ path: `/api/ebuilder/form/form/core/getFormLayout?formId=${encodeURIComponent(formId)}`,
591
+ method: 'GET',
592
+ }));
593
+ const id = r?.data?.formLayout?.id;
594
+ if (id)
595
+ return String(id);
596
+ }
597
+ catch {
598
+ // 低基线 GET 405 → POST
599
+ }
600
+ try {
601
+ const r = (await host.request({
602
+ path: '/api/ebuilder/form/form/core/getFormLayout',
603
+ method: 'POST',
604
+ body: { module: 'ebuilderform', formId, terminalType: 'PC' },
605
+ }));
606
+ const id = r?.data?.formLayout?.id;
607
+ if (id)
608
+ return String(id);
609
+ }
610
+ catch {
611
+ // 布局取不到时回退 formId(页面保存本身也回退 formId)
612
+ }
613
+ return formId;
614
+ }
615
+ const DIGITAL_PLAN_NAME_KEYS = ['msfa_name', 'digital_name', 'plan_name', 'scheme_name'];
616
+ /** AI 面试方案(面试数字人)候选:① 关联字段候选接口 → ② 「面试数字人配置」列表兜底。
617
+ * 🔴 只返回候选,绝不自动取第一条(方案选错=面试由错误的数字人执行)。 */
618
+ async function listDigitalPlansForWrite(host, cache, formId, layoutId, fieldId) {
619
+ try {
620
+ const r = (await host.request({
621
+ path: '/api/ebuilder/form/common/browser/complete/ebuilder',
622
+ body: {
623
+ browserMultiple: false,
624
+ newly: 1,
625
+ searchValue: '',
626
+ formParam: JSON.stringify({ formId, layoutId, fieldId, filterItems: [], module: 'ebuilderform', dataDetails: [] }),
627
+ openScroll: true,
628
+ controlId: fieldId,
629
+ businessId: formId,
630
+ variableMap: {},
631
+ },
632
+ }));
633
+ if (r?.status !== false && r?.data) {
634
+ const list = r.data.data || [];
635
+ const items = list
636
+ .filter((x) => x && x.id)
637
+ .map((x) => ({ id: String(x.id), name: String(x.name || '').trim() }));
638
+ if (items.length)
639
+ return { available: true, items };
640
+ }
641
+ }
642
+ catch {
643
+ // 回退列表
644
+ }
645
+ const menus = (cache.lists?.all_search || []);
646
+ const menu = menus.find((m) => (m.menuName || '').includes('面试数字人'))
647
+ || menus.find((m) => (m.menuName || '').includes('数字人配置'));
648
+ if (!menu?.listId) {
649
+ return { available: false, items: [], reason: '关联字段候选接口不可用,且当前环境未配置「面试数字人配置」列表菜单' };
650
+ }
651
+ let objId = '';
652
+ try {
653
+ const r = (await host.request({
654
+ path: `/api/ebuilder/form/obj/getObjsByTag?appId=${encodeURIComponent(String(cache.appId || ''))}&tag=uf_rcrt_digital_human`,
655
+ method: 'GET',
656
+ }));
657
+ const d = r?.data;
658
+ if (Array.isArray(d) && d.length)
659
+ objId = String(d[0]?.id || '');
660
+ }
661
+ catch {
662
+ // 取不到对象 id
663
+ }
664
+ if (!objId)
665
+ return { available: false, items: [], reason: '未能解析「面试数字人配置」对象 id' };
666
+ const rows = [];
667
+ for (let cur = 1; cur <= 20; cur++) {
668
+ const r = (await host.request({
669
+ path: `/api/ebuilder/form/list/getListDatas?passid=${objId}&cid=${objId}`,
670
+ body: {
671
+ current: cur,
672
+ pageSize: 100,
673
+ tableuid: randomHex32(),
674
+ listId: menu.listId,
675
+ searchParamData: { searchType: '3', type: 'and' },
676
+ terminal: 'PC',
677
+ browser: 'Chrome',
678
+ requiredMatch: 1,
679
+ mapResult: 1,
680
+ recheckQuery: 1,
681
+ isFollow: 0,
682
+ isShareToMe: 0,
683
+ filterCondition: {},
684
+ cusMenuId: menu.cusMenuId,
685
+ urlPageTitle: menu.menuName,
686
+ menuName: menu.menuName,
687
+ },
688
+ headers: { ebBusinessId: String(menu.listId) },
689
+ }));
690
+ const page = r?.data?.data || [];
691
+ rows.push(...page);
692
+ if (page.length < 100)
693
+ break;
694
+ }
695
+ const items = rows
696
+ .map((x) => {
697
+ const nk = DIGITAL_PLAN_NAME_KEYS.find((k) => String(x[k] || '').trim());
698
+ return { id: String(x.form_data_id || x.id || ''), name: String(nk ? x[nk] : '').trim() };
699
+ })
700
+ .filter((x) => x.id);
701
+ if (!items.length)
702
+ return { available: false, items: [], reason: '「面试数字人配置」暂无可选方案' };
703
+ return { available: true, items };
704
+ }
705
+ /** 方案匹配:id 全等 → 名称全等 → 名称包含(唯一才算命中,否则回歧义列表) */
706
+ function pickDigitalPlanForWrite(items, key) {
707
+ const k = String(key || '').trim();
708
+ if (!k)
709
+ return { plan: null, ambiguous: [] };
710
+ const byId = items.filter((x) => x.id === k);
711
+ if (byId.length === 1)
712
+ return { plan: byId[0], ambiguous: [] };
713
+ const byExact = items.filter((x) => x.name === k);
714
+ if (byExact.length === 1)
715
+ return { plan: byExact[0], ambiguous: [] };
716
+ const byLike = items.filter((x) => x.name.includes(k));
717
+ if (byLike.length === 1)
718
+ return { plan: byLike[0], ambiguous: [] };
719
+ return { plan: null, ambiguous: byLike };
720
+ }
547
721
  async function buildInterviewPlan(env, cache, args) {
548
722
  const host = env.host;
549
723
  const talentId = requiredString(args, 'talentId', 'talent_id_required', '人才 ID');
550
724
  if (!/^\d+$/.test(talentId))
551
725
  throw ehrValidationError('talent_id_invalid', 'talentId 必须是数字 ID');
552
- const interviewer = requiredString(args, 'interviewer', 'interviewer_required', '面试官姓名');
553
726
  const type = typeof args.type === 'string' && args.type.trim() ? args.type.trim() : '现场面试';
554
727
  if (!INTERVIEW_TYPES.includes(type)) {
555
728
  throw ehrValidationError('enum_invalid', `type(面试方式)取值必须是 ${INTERVIEW_TYPES.join(' / ')} 之一`);
556
729
  }
730
+ const isAI = type === 'AI面试';
557
731
  const session = typeof args.session === 'string' && args.session.trim() ? args.session.trim() : '初试';
558
732
  const candidate = await resolveCandidateForWrite(host, cache, talentId);
559
733
  const positionId = args.positionId ? String(args.positionId) : candidate.positionId;
@@ -582,9 +756,63 @@ async function buildInterviewPlan(env, cache, args) {
582
756
  if (!sessionOptionId) {
583
757
  throw ehrValidationError('enum_invalid', `面试轮次「${session}」不在枚举中(${Object.keys(sessionMap).join(' / ')})`);
584
758
  }
585
- const interviewerId = await resolvePersonId(host, fieldIdOf('interviewer'), interviewer);
586
- if (!interviewerId) {
587
- throw ehrValidationError('interviewer_not_found', `面试官「${interviewer}」解析不到 userId(browser/complete/resource 无匹配)`);
759
+ // 面试官:显式指定 → 按名解析;未指定 → 默认当前登录人(少问一次,与页面待办默认口径一致)
760
+ const interviewerInput = typeof args.interviewer === 'string' ? args.interviewer.trim() : '';
761
+ let interviewerId = null;
762
+ let interviewer = interviewerInput;
763
+ if (interviewerInput) {
764
+ interviewerId = await resolvePersonId(host, fieldIdOf('interviewer'), interviewerInput);
765
+ if (!interviewerId) {
766
+ throw ehrValidationError('interviewer_not_found', `面试官「${interviewerInput}」解析不到 userId(browser/complete/resource 无匹配)`);
767
+ }
768
+ }
769
+ else {
770
+ const me = await resolveCurrentUserForWrite(host);
771
+ if (!me) {
772
+ throw ehrValidationError('interviewer_unresolved', '未指定面试官,且无法解析当前登录人(teamsCheck 失败);请用 interviewer 参数指定');
773
+ }
774
+ // 🔴 teamsCheck 的 currentUser.id 与人员字段 optionId 语义未必相同(实测两者 id 不同),
775
+ // 故用与显式指定完全相同的解析通道(browser/complete/resource)把姓名换成 userId。
776
+ interviewerId = await resolvePersonId(host, fieldIdOf('interviewer'), me.name);
777
+ if (!interviewerId) {
778
+ throw ehrValidationError('interviewer_unresolved', `未指定面试官,当前登录人「${me.name}」在人员字段中解析不到;请用 interviewer 参数指定`);
779
+ }
780
+ interviewer = me.name;
781
+ }
782
+ // AI 面试:方案(digital_id)与邮箱都是条件必填,不填保存必失败
783
+ let aiPlan = null;
784
+ let aiPlans = [];
785
+ let email = String(args.email || '').trim() || candidate.email;
786
+ const mobile = candidate.mobile;
787
+ if (isAI) {
788
+ const digitalFid = fieldIdOf('digital_id');
789
+ if (!digitalFid) {
790
+ throw ehrValidationError('recruit_field_missing', '面试计划表单缺少「AI面试方案」字段(digital_id),无法安排 AI 面试');
791
+ }
792
+ const layoutId = await fetchLayoutIdForForm(host, formId);
793
+ const plans = await listDigitalPlansForWrite(host, cache, formId, layoutId, digitalFid);
794
+ aiPlans = plans.items;
795
+ if (!plans.available) {
796
+ throw ehrValidationError('ai_plan_unavailable', `AI 面试必须选择「AI面试方案」,但${plans.reason || '暂无可选方案'};请先在该环境维护「面试数字人配置」`);
797
+ }
798
+ // 默认「大模型面试」(用户口径);环境无此方案时列出候选,绝不自动取第一条
799
+ const wanted = typeof args.aiPlan === 'string' && args.aiPlan.trim() ? args.aiPlan.trim() : AI_DEFAULT_PLAN_NAME;
800
+ const picked = pickDigitalPlanForWrite(aiPlans, wanted);
801
+ if (picked.plan) {
802
+ aiPlan = picked.plan;
803
+ }
804
+ else if (picked.ambiguous.length > 1) {
805
+ throw ehrValidationError('ai_plan_ambiguous', `AI面试方案「${wanted}」命中多个:${picked.ambiguous.map((x) => x.name).join('、')},请用 aiPlan 指明具体方案`, { candidates: picked.ambiguous });
806
+ }
807
+ else {
808
+ throw ehrValidationError('ai_plan_not_found', `未找到 AI面试方案「${wanted}」,请用 aiPlan 从候选中指定(候选:${aiPlans.map((x) => x.name).join('、')})`, { candidates: aiPlans });
809
+ }
810
+ if (!email) {
811
+ throw ehrValidationError('email_required', 'AI 面试要求填写候选人邮箱:人才资料里没有邮箱,请用 email 参数提供');
812
+ }
813
+ if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
814
+ throw ehrValidationError('email_invalid', `候选人邮箱格式不正确:${email}`);
815
+ }
588
816
  }
589
817
  const window = defaultInterviewWindow();
590
818
  const start = typeof args.startTime === 'string' && args.startTime.trim() ? args.startTime.trim() : window.start;
@@ -603,6 +831,9 @@ async function buildInterviewPlan(env, cache, args) {
603
831
  { formField: { id: fieldIdOf('position_manage_id') }, dataOptions: [{ optionId: positionId, content: candidate.positionName }] },
604
832
  { formField: { id: fieldIdOf('talent_id') }, dataOptions: [{ optionId: talentId, content: candidate.name }] },
605
833
  { formField: { id: fieldIdOf('candidate_manage_id') }, dataOptions: [{ optionId: candidate.candidateManageId, content: candidate.candidateManageId }] },
834
+ ...(mobile ? [{ formField: { id: fieldIdOf('mobile') }, content: mobile }] : []),
835
+ ...(email ? [{ formField: { id: fieldIdOf('email') }, content: email }] : []),
836
+ ...(aiPlan ? [{ formField: { id: fieldIdOf('digital_id') }, dataOptions: [{ optionId: aiPlan.id, content: aiPlan.name }] }] : []),
606
837
  ];
607
838
  return {
608
839
  formId, objId, dataDetails,
@@ -610,12 +841,19 @@ async function buildInterviewPlan(env, cache, args) {
610
841
  positionName: candidate.positionName,
611
842
  interviewTime: `${start} ~ ${end}`,
612
843
  interviewer,
844
+ email: email || undefined,
845
+ mobile: mobile || undefined,
846
+ isAIInterview: isAI,
847
+ aiPlan,
848
+ aiPlans: isAI ? aiPlans : undefined,
613
849
  };
614
850
  }
615
851
  const interviewArrangeSchema = {
616
852
  talentId: { type: 'string', pattern: '^\\d+$', description: '人才 ID(candidate.search 返回的 talentId)' },
617
- interviewer: { type: 'string', description: '面试官姓名(须可解析为系统人员)' },
853
+ interviewer: { type: 'string', description: '面试官姓名(可选;不填默认当前登录人)' },
618
854
  type: { type: 'string', enum: [...INTERVIEW_TYPES], description: '面试方式,默认现场面试' },
855
+ aiPlan: { type: 'string', description: 'AI 面试方案(方案名或 id;type=AI面试 时生效,默认「大模型面试」)' },
856
+ email: { type: 'string', description: '候选人邮箱(AI 面试必填;不填则取人才资料里的邮箱)' },
619
857
  session: { type: 'string', description: '面试轮次(如 初试/复试),默认初试;须在枚举内' },
620
858
  positionId: { type: 'string', description: '应聘职位 ID;不填时从人才当前应聘批次继承' },
621
859
  startTime: { type: 'string', pattern: '^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$', description: '开始时间 YYYY-MM-DD HH:mm,默认当前时间' },
@@ -631,7 +869,7 @@ const interviewArrangePrepare = {
631
869
  capability: 'recruit',
632
870
  risk: WRITE,
633
871
  requiresConfirmation: true,
634
- inputSchema: schemaOf({ ...interviewArrangeSchema }, { required: ['talentId', 'interviewer'] }),
872
+ inputSchema: schemaOf({ ...interviewArrangeSchema }, { required: ['talentId'] }),
635
873
  handler: async (args, env) => {
636
874
  const cache = await requireRecruitCache(env);
637
875
  const plan = await buildInterviewPlan(env, cache, args);
@@ -656,6 +894,13 @@ const interviewArrangePrepare = {
656
894
  session: args.session || '初试',
657
895
  time: plan.interviewTime,
658
896
  interviewer: plan.interviewer,
897
+ ...(plan.isAIInterview
898
+ ? {
899
+ aiPlan: plan.aiPlan ? `${plan.aiPlan.name}(id=${plan.aiPlan.id})` : '(未指定)',
900
+ email: plan.email || '(缺失)',
901
+ mobile: plan.mobile || '(人才资料无手机号)',
902
+ }
903
+ : {}),
659
904
  notify: notify ? '将触发「新建日程」面试通知动作流(外部通知)' : '面试通知默认不触发',
660
905
  },
661
906
  willSubmit: { formId: plan.formId, objId: plan.objId, dataDetails: plan.dataDetails },
@@ -15,6 +15,8 @@ import { compact, normalizePaged, toNumber, toPageQuery, toPositiveInt } from '.
15
15
  // ─────────────────────────────────────────────────────────────────────────────
16
16
  const RECRUIT_APP_TAG = 'weaver-recruit-service';
17
17
  /** 逻辑名 -> objTag(权威映射,与 _init_env_cache.mjs 一致) */
18
+ /** 环境缓存结构版本:新增/变更解析字段(如 2026-11-04 补 candidate 应聘者列表)时 +1,旧缓存自动失效重建。 */
19
+ const RECRUIT_CACHE_VERSION = 1;
18
20
  const RECRUIT_TAGS = {
19
21
  talent_pool: 'uf_rcrt_talent_pool',
20
22
  interview_plan: 'uf_rcrt_interview_plan',
@@ -38,7 +40,8 @@ const LIST_KEYWORDS = {
38
40
  position: ['招聘职位', '职位列表', '职位管理'],
39
41
  entry: ['入职管理'],
40
42
  offer: ['录用管理', 'offer管理', 'offer'],
41
- interview: ['面试管理'],
43
+ interview: ['面试管理', '面试安排列表', '面试安排'],
44
+ candidate: ['应聘者', '候选人', '应聘批次', '应聘管理'],
42
45
  biz_config: ['业务配置映射表'],
43
46
  };
44
47
  /** 列表类型 -> 缓存键 + 表单逻辑名(candidate.list 四列表映射,同 recruit-list.mjs TYPES) */
@@ -47,6 +50,8 @@ export const LIST_TYPES = {
47
50
  position: { listKey: 'position', formType: 'position_manage', title: '招聘职位' },
48
51
  entry: { listKey: 'entry', formType: 'entry_manage', title: '入职管理' },
49
52
  offer: { listKey: 'offer', formType: 'offer', title: '录用管理' },
53
+ interview: { listKey: 'interview', formType: 'interview_plan', title: '面试管理' },
54
+ candidate: { listKey: 'candidate', formType: 'candidate_manage', title: '应聘者' },
50
55
  };
51
56
  /** 剔除与展示无关的内部键(同 recruit-list.mjs) */
52
57
  const INTERNAL_KEYS = new Set([
@@ -336,7 +341,7 @@ async function resolveRecruitEnv(host, appId) {
336
341
  }
337
342
  const lists = {
338
343
  talent: null, demand: null, position: null, entry: null, offer: null,
339
- interview: null, dict: dictMenu, biz_config: bizConfigMenu,
344
+ interview: null, candidate: null, dict: dictMenu, biz_config: bizConfigMenu,
340
345
  all_search: searchMenus, pages,
341
346
  };
342
347
  for (const [biz, keywords] of Object.entries(LIST_KEYWORDS)) {
@@ -384,7 +389,7 @@ export function createRecruitContextLoader() {
384
389
  }
385
390
  }
386
391
  catch { /* 缓存读取失败回退闸门链路 */ }
387
- if (diskCache) {
392
+ if (diskCache && diskCache.cacheVersion === RECRUIT_CACHE_VERSION) {
388
393
  memo.set(memoKey, diskCache);
389
394
  return diskCache;
390
395
  }
@@ -409,6 +414,7 @@ export function createRecruitContextLoader() {
409
414
  note: 'recruit-ops 环境参数缓存(weaver-work-cli 运行时解析产物,不含认证字段)',
410
415
  },
411
416
  envKey: `${dir.split(/[\\/]/).pop()}|${appId}`,
417
+ cacheVersion: RECRUIT_CACHE_VERSION,
412
418
  ...resolved,
413
419
  }, null, 2), 'utf8');
414
420
  }
@@ -627,7 +633,7 @@ const candidateList = {
627
633
  capability: 'recruit',
628
634
  risk: READ,
629
635
  inputSchema: schemaOf({
630
- type: { type: 'string', enum: ['demand', 'position', 'entry', 'offer'], description: '列表类型' },
636
+ type: { type: 'string', enum: ['demand', 'position', 'entry', 'offer', 'interview', 'candidate'], description: '列表类型' },
631
637
  current: SCHEMA_ID,
632
638
  pageSize: SCHEMA_ID,
633
639
  }, { required: ['type'] }),
@@ -244,3 +244,50 @@ export function assertEnumArray(value, allowed, field) {
244
244
  throw ehrValidationError('enum_invalid', `${field} 必须是数组`);
245
245
  return value.map((item) => assertEnum(item, allowed, field));
246
246
  }
247
+ /**
248
+ * EHR 页面路由表(**集中一处,禁止各 operation 自行拼写**)。
249
+ * 来源:weaver-interface/business-apis/ehr/references/attend-appeal-save.md、
250
+ * hr-all-module.md(2026-11-04 真实环境取证)。
251
+ * 🔴 未取证的路由不在此表、不得臆造;某环境打不开时以实际地址为准并反馈维护者。
252
+ */
253
+ export const EHR_PAGES = {
254
+ /** 考勤异常/申诉页面(创建的申诉在此可查) */
255
+ attendAbnormal: '/sp/attend/abnormal',
256
+ /** 在职员工名册(原通讯录) */
257
+ hrEmployeeManager: '/sp/hrm/hr/employeeManager',
258
+ /** 生日名单 */
259
+ hrBirthdayList: '/sp/hrm/hr/birthday/list',
260
+ /** 人员状态变更记录 */
261
+ hrPersonalStateChange: '/sp/hrm/hr/personalStateChange/record',
262
+ /** 时点员工名册 */
263
+ hrTpReportTp: '/sp/hrm/hr/tpReport/tp',
264
+ /** 历史曾在职名册 */
265
+ hrTpReportHw: '/sp/hrm/hr/tpReport/hw',
266
+ /** 离职员工名册 */
267
+ hrTpReportDismiss: '/sp/hrm/hr/tpReport/dismiss',
268
+ /** 人员流动分析表 */
269
+ hrTpReportTurn: '/sp/hrm/hr/tpReport/turn',
270
+ /** 基本状况分析 */
271
+ hrReportBasePerson: '/sp/hrm/hr/reportForm/basePerson',
272
+ /** 部门人数统计 */
273
+ hrReportDeptPerson: '/sp/hrm/hr/reportForm/deptPerson',
274
+ /** 岗位人数统计 */
275
+ hrReportPosiPerson: '/sp/hrm/hr/reportForm/posiPerson',
276
+ /** 职务状况统计 */
277
+ hrReportJobPerson: '/sp/hrm/hr/reportForm/jobPerson',
278
+ };
279
+ /** 拼接 EHR 页面地址(去尾斜杠;path 必须来自 EHR_PAGES)。 */
280
+ export function ehrPageUrl(baseUrl, path) {
281
+ return String(baseUrl || '').replace(/\/+$/, '') + path;
282
+ }
283
+ /** 人员详情卡片地址模板:替换 {人员id} 即为可点击地址(该接口无独立文档,查询到人员 id 后即附)。 */
284
+ export function hrProfileUrl(baseUrl, employeeId) {
285
+ return String(baseUrl || '').replace(/\/+$/, '') + '/sp/hrm/profileInfo/' + encodeURIComponent(String(employeeId));
286
+ }
287
+ /** 日期加减(YYYY-MM-DD,UTC 语义,避免时区跨天)。 */
288
+ export function addDays(date, delta) {
289
+ const [y, m, d] = String(date).split('-').map(Number);
290
+ const t = new Date(Date.UTC(y, m - 1, d + delta));
291
+ const f = (n) => String(n).padStart(2, '0');
292
+ return `${t.getUTCFullYear()}-${f(t.getUTCMonth() + 1)}-${f(t.getUTCDate())}`;
293
+ }
@@ -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 createEsbContinuationSigner(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 { createEsbContinuationSigner } from './continuation.js';
4
5
  import { createEsbHost } from './host.js';
5
6
  import { esbManifest } 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,3 +1,4 @@
1
+ import { CONTINUATION_TTL_SECONDS } from '../../../core/continuation-ttl.js';
1
2
  import { esbSuccess } from './types.js';
2
3
  import { esbValidationError } from '../errors.js';
3
4
  import { isEsbFlowUnavailable } from '../host.js';
@@ -51,7 +52,7 @@ export const esbTriggerHandlers = {
51
52
  requestPreview: payload,
52
53
  templateFields,
53
54
  continuation: token,
54
- expiresInSeconds: 600,
55
+ expiresInSeconds: CONTINUATION_TTL_SECONDS,
55
56
  }, { status: 'PREPARED' }, warnings);
56
57
  },
57
58
  'esb.trigger.apply': async (input, { host, continuation }) => {
@@ -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 createFnaContinuationSigner(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 { createFnaContinuationSigner } from './continuation.js';
4
5
  import { createFnaHost } from './host.js';
5
6
  import { fnaManifest } 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,7 +1,7 @@
1
+ import { CONTINUATION_TTL_SECONDS } from '../../../core/continuation-ttl.js';
1
2
  import { fnaPartialError, fnaValidationError, isFnaNetworkError } from '../errors.js';
2
3
  import { fnaSuccess, READ, schemaOf, SCHEMA_INTEGER_POSITIVE, WRITE } from './types.js';
3
4
  import { compact, fingerprint, normalizeWeaTable, requireConfirm, requireRequestIds, toPositiveInt, unwrapData, verifyLease } from './shared.js';
4
- const CONTINUATION_TTL_SECONDS = 600;
5
5
  /** 发票核销公开字段(InvWriteOffSearchVo 非分页部分)。 */
6
6
  const WRITE_OFF_FILTER_FIELDS = {
7
7
  invoiceStatus: {
@@ -1,7 +1,7 @@
1
+ import { CONTINUATION_TTL_SECONDS } from '../../../core/continuation-ttl.js';
1
2
  import { fnaPartialError, fnaValidationError, isFnaNetworkError } from '../errors.js';
2
3
  import { fnaSuccess, READ, schemaOf, SCHEMA_INTEGER_POSITIVE, SCHEMA_STRING_NONEMPTY, WRITE } from './types.js';
3
4
  import { compact, fingerprint, normalizeWeaTable, requireConfirm, requireRemindRows, summarizeRemindRows, toPositiveInt, unwrapData, verifyLease } from './shared.js';
4
- const CONTINUATION_TTL_SECONDS = 600;
5
5
  const LOAN_MENU_FIELDS = {
6
6
  menuCode: { ...SCHEMA_STRING_NONEMPTY, description: '菜单编码,如 fesx_fna_borrowingManagement(与环境核对)' },
7
7
  permissionSetCode: { ...SCHEMA_STRING_NONEMPTY, description: '权限集编码,如 fesx_fna_borrowingManagement.default(与环境核对)' },
@@ -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 { createHrmHost } from './host.js';
4
5
  import { hrmManifest } from './manifest.js';
5
6
  import { executeHrmOperation } from './operations.js';
@@ -129,6 +130,7 @@ async function executeAndPrint(ctx, operation, input) {
129
130
  ctx.output.write(successEnvelope(operation, result), { json: true });
130
131
  }
131
132
  catch (error) {
133
+ reportPlatformError(error);
132
134
  console.error(JSON.stringify(failureEnvelope(error), null, 2));
133
135
  process.exitCode = isCliError(error) ? error.exitCode : ExitCode.GeneralError;
134
136
  }