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
@@ -0,0 +1,202 @@
1
+ # 岗位模板库(position-templates)
2
+
3
+ > **用途**:`recruit-stage.jd.create.*` 生成 JD 时,直接从本文件取岗位写法与字段范式,**不再运行时拉取「最近同类职位参考」**。
4
+ > **收益**:省掉 6 次接口请求(列表 1 次 + 详情 5 次),prepare 从约 10.7 秒降到 3 秒内;同时避免脏数据污染新职位字段。
5
+ > **数据来源**:2026-11-05 对当前环境 836 条职位抽样 100 条统计(分布见文末「环境观测」),岗位分类按实测出现频次归纳,非臆测。
6
+ > **维护约定**:公司招聘口径调整时直接改本文件;新增岗位类型追加模板段落即可,不改脚本。
7
+
8
+ ---
9
+
10
+ ## 一、通用字段范式(实测统计得出)
11
+
12
+ | 字段 | 推荐默认 | 实测依据 |
13
+ |---|---|---|
14
+ | 岗位性质 `position_nature` | **全职**(实习岗选「实习」) | 抽样 100 条中全职 79 条、实习 21 条 |
15
+ | 招聘人数 `recruit_count` | **1** | 抽样中 1 人占 67%、2 人占 19% |
16
+ | 状态 `status` | 招聘中 | 新发布岗位固定用此值 |
17
+ | 招聘类型 `recruit_type` | 社会招聘(实习岗可考虑校园/实习) | — |
18
+ | 薪酬类型 `salary_type` | 月薪 | — |
19
+ | 薪酬月数 `number_of_pay_months` | 12 | — |
20
+ | 招聘负责人 / 用人经理 | 当前登录人 | 由脚本自动填充,模板不指定 |
21
+
22
+ > **薪资区间按本文件 §1.1 的推荐表取值**(不再从历史职位继承——历史记录可能带脏数据,实测抓到过 300 元月薪)。
23
+ > 用户没说薪资时:按岗位类型 + 经验年限取推荐区间,填进 `sets` 的 `salary_min`/`salary_max`(单位**元/月**,如 15K 写 `15000`),
24
+ > 并在确认摘要里注明「薪资为推荐值」请用户确认;用户明确给了数字就以用户为准。
25
+
26
+ > ⚠️ **枚举类字段必须与环境字典对齐,否则会被静默跳过**(2026-11-05 实测:`work_years=1年以上` 字典无此选项 → 进 `setSkipped`):
27
+ > - `work_years`(经验年限):**优先用「不限」**(已实测可用);写具体年限前先确认本环境该字段的实际选项值。
28
+ > - `work_location`(工作地点):✅ **v1.0.20 起可通过 `sets` 指定**——原实现只读 `cache.menus`(该环境缓存无此字段)导致恒取不到,现改为 `lists.all_search` → `cache.menus` → `allMenus` 三级来源;实测传入完整地址后进入 `setApplied`。⚠️ 提交后必须检查 `setApplied`/`setSkipped`,`setSkipped` 非空即未写入;未指定时该字段仍会从历史职位继承,摘要里要核对。
29
+ > - `education`(学历):用裸名称(「本科」「硕士」),已实测可用。
30
+ >
31
+ > 提交 `sets` 时**务必检查返回的 `setApplied` / `setSkipped`**:`setSkipped` 非空说明该值没写进去,需换值或改用完整名称重试。
32
+
33
+ ---
34
+
35
+ ### 1.1 薪资推荐区间(`salary_min` / `salary_max`)
36
+
37
+ > **用途**:用户未提薪资时,按「岗位类型 + 经验年限」从本表取推荐区间,填入 `sets` 的 `salary_min`/`salary_max`,并在确认摘要写明「薪资为推荐值」让用户确认。
38
+ > **单位**:元/月(月薪 15K 写 `15000`)。环境字段是数值型,**不要写 "15K" 或 "15000-20000" 这类字符串**。
39
+ > **口径**:ToB 软件/信息化行业、国内一二线城市的常见区间初稿(2026-11)。**换城市/换行业需按当地行情校准**;本表由业务维护,改表即可、不改脚本。
40
+
41
+ | 岗位模板 | 经验档 | `salary_min` | `salary_max` | 说明 |
42
+ |---|---|---|---|---|
43
+ | Java / 后端开发 | 1-3 年 | 12000 | 18000 | 初级 |
44
+ | Java / 后端开发 | 3-5 年 | 18000 | 30000 | 中级(**默认档**)|
45
+ | Java / 后端开发 | 5 年以上 | 30000 | 45000 | 高级 / 技术负责人 |
46
+ | 实施工程师 | 1-3 年 | 8000 | 13000 | 初级 |
47
+ | 实施工程师 | 3-5 年 | 13000 | 20000 | 中级(**默认档**)|
48
+ | 实施工程师 | 5 年以上 | 20000 | 30000 | 高级 / 项目负责人 |
49
+ | 项目经理 | 3-5 年 | 15000 | 22000 | 中级 |
50
+ | 项目经理 | 5 年以上 | 22000 | 35000 | 高级(**默认档**)|
51
+ | 销售 / 客户经理 | 不限 | 8000 | 15000 | **底薪**,提成另议;摘要里必须注明「仅底薪」 |
52
+ | 实习生 | 在校 | 100 | 200 | **元/天**,`salary_type` 取「日薪」,摘要注明「日薪」 |
53
+
54
+ > ⚠️ **岗位归属不确定时用「中级(默认档)」并在摘要说明**——不要空着不填(空着会落到历史职位继承,可能带出脏数据),也不要擅自给高档。
55
+ > ⚠️ **销售岗只填底薪**:`salary_min/max` 是底薪区间,提成规则写进 JD 正文,不折算进数值。
56
+ > ⚠️ **`work_years`(经验年限)字段本身**按环境字典填(优先「不限」,已实测可用),本表的「经验档」只用于选薪资档,不直接写入该字段。
57
+
58
+
59
+ ## 二、岗位模板
60
+
61
+ ### 模板 1:Java / 后端开发工程师(技术类)
62
+
63
+ **适用**:Java 开发、后端开发、项目开发工程师、FDE 工程师
64
+
65
+ **职责要点**(4-6 条,按需裁剪)
66
+ 1. 负责核心业务系统的后端服务设计与开发,保障系统高可用与高性能运行
67
+ 2. 主导关键模块的技术方案设计、评审与落地,输出可维护的技术文档
68
+ 3. 负责核心接口与数据模型设计,保障数据一致性与安全性
69
+ 4. 参与系统性能优化与线上问题排查,降低故障率与响应时延
70
+ 5. 参与技术选型与框架演进,推动技术栈统一与升级
71
+ 6. 参与代码评审并指导中初级开发人员,提升团队交付质量
72
+
73
+ **要求要点**(4-6 条)
74
+ 1. 本科及以上学历,计算机、软件工程等相关专业
75
+ 2. 精通 Java,熟悉 JVM 原理、多线程与并发编程,具备扎实的数据结构与算法基础
76
+ 3. 熟练使用 Spring Boot、Spring Cloud 等主流框架,具备微服务架构实践经验
77
+ 4. 熟悉 MySQL、Redis、消息队列等常用中间件,具备数据库设计与性能调优能力
78
+ 5. 具备良好的系统设计能力与问题定位能力,能独立承担核心模块开发
79
+ 6. 具备良好的沟通协作能力与责任心,有带教经验者优先
80
+
81
+ **推荐字段**:岗位性质=全职|招聘人数=1|学历=本科及以上|经验=3年以上(高级岗可写 5 年以上)|职位类别=技术
82
+
83
+ ---
84
+
85
+ ### 模板 2:实施工程师(交付类)
86
+
87
+ **适用**:实施工程师、项目实施工程师、交付顾问
88
+
89
+ **职责要点**
90
+ 1. 负责客户现场 OA/协同办公系统的实施交付,包括环境搭建、配置调试与上线支持
91
+ 2. 对接客户业务部门,梳理业务流程并转化为系统配置方案
92
+ 3. 负责系统功能配置、表单与流程搭建,完成客户化需求落地
93
+ 4. 开展用户培训与操作指导,编写实施文档与操作手册
94
+ 5. 负责上线后的问题响应与运维支持,保障系统稳定运行
95
+ 6. 配合项目经理推进项目进度,反馈实施风险
96
+
97
+ **要求要点**
98
+ 1. 本科及以上学历,计算机、信息管理等相关专业
99
+ 2. 熟悉数据库基本操作(SQL 查询、数据维护),具备系统实施或运维经验
100
+ 3. 具备良好的沟通表达能力,能与客户业务部门有效对接
101
+ 4. 具备较强的问题分析与现场应变能力,能适应出差
102
+ 5. 有 OA、ERP 等企业管理软件实施经验者优先
103
+ 6. 具备良好的服务意识与责任心,能承受一定工作压力
104
+
105
+ **推荐字段**:岗位性质=全职|招聘人数=2|学历=本科及以上|经验=1年以上|职位类别=技术
106
+
107
+ ---
108
+
109
+ ### 模板 3:项目经理(管理类)
110
+
111
+ **适用**:项目经理、项目负责人、交付经理
112
+
113
+ **职责要点**
114
+ 1. 负责项目全生命周期管理,包括立项、计划制定、进度跟踪与验收交付
115
+ 2. 统筹项目资源,协调实施、开发、测试等角色,保障项目按期交付
116
+ 3. 对接客户关键干系人,管理需求边界与变更,控制项目风险
117
+ 4. 负责项目成本与质量的平衡管控,及时识别并上报重大风险
118
+ 5. 组织项目例会与阶段汇报,输出项目周报、阶段总结与验收文档
119
+ 6. 推动项目复盘与经验沉淀,持续优化交付流程
120
+
121
+ **要求要点**
122
+ 1. 本科及以上学历,计算机、项目管理等相关专业
123
+ 2. 具备 3 年以上软件项目实施或项目管理经验,独立负责过完整项目交付
124
+ 3. 熟悉项目管理方法论,具备进度、成本、质量、风险的统筹能力
125
+ 4. 具备优秀的客户沟通与干系人管理能力,能处理复杂现场情况
126
+ 5. 持有 PMP、信息系统项目管理师等证书者优先
127
+ 6. 具备较强的抗压能力与责任心,能适应短期出差
128
+
129
+ **推荐字段**:岗位性质=全职|招聘人数=1|学历=本科及以上|经验=3年以上|职位类别=技术
130
+
131
+ ---
132
+
133
+ ### 模板 4:销售 / 客户经理(销售类)
134
+
135
+ **适用**:软件销售、销售代表、客户经理、城市负责人、EBU 负责人
136
+
137
+ **职责要点**
138
+ 1. 负责所辖区域或行业客户的 OA/协同管理软件销售,完成销售业绩指标
139
+ 2. 开拓新客户资源,建立并维护客户关系,挖掘客户信息化需求
140
+ 3. 对接客户决策层,推动商机立项、方案汇报与商务谈判
141
+ 4. 协同售前、实施团队完成方案设计与投标响应
142
+ 5. 负责合同签订、回款跟进与客户满意度维护
143
+ 6. 收集市场与竞品信息,反馈市场动态支持产品与策略优化
144
+
145
+ **要求要点**
146
+ 1. 本科及以上学历,市场营销、计算机等相关专业
147
+ 2. 具备 2 年以上 B 端软件或解决方案销售经验,有独立成单能力
148
+ 3. 熟悉企业信息化产品,能快速理解客户业务场景
149
+ 4. 具备优秀的商务谈判与客户关系维护能力
150
+ 5. 具备较强的目标导向与自我驱动力,能承受业绩压力
151
+ 6. 有 OA、ERP、CRM 等行业客户资源者优先
152
+
153
+ **推荐字段**:岗位性质=全职|招聘人数=1|学历=本科及以上|经验=2年以上|职位类别=销售
154
+
155
+ ---
156
+
157
+ ### 模板 5:实习生岗(通用)
158
+
159
+ **适用**:各类实习岗(开发实习、实施实习、客服实习等)
160
+
161
+ **职责要点**(按方向裁剪)
162
+ 1. 协助团队完成日常业务工作,参与项目执行与文档整理
163
+ 2. 在指导下完成分配的具体任务,按时交付并主动反馈进展
164
+ 3. 参与团队会议与业务学习,快速熟悉公司产品与业务流程
165
+ 4. 完成上级交办的其他支持性工作
166
+
167
+ **要求要点**
168
+ 1. 本科及以上在读,每周可保证 4 天以上实习时间,实习期 3 个月以上
169
+ 2. 具备良好的学习能力与主动性,能快速上手新任务
170
+ 3. 具备良好的沟通协作能力与责任心
171
+ 4. 熟练使用 Office 等办公软件
172
+ 5. 有相关项目或实习经历者优先
173
+
174
+ **推荐字段**:岗位性质=**实习**|招聘人数=1|学历=本科及以上|经验=不限|职位类别=按方向选择
175
+
176
+ ---
177
+
178
+ ## 三、使用方式
179
+
180
+ 生成 JD 时:
181
+
182
+ 1. **先判断岗位归属**:技术 / 交付 / 管理 / 销售 / 实习
183
+ 2. **取对应模板的职责与要求**,按用户实际需求裁剪条数(职责 4-6 条、要求 4-6 条)
184
+ 3. **字段值直接采用模板「推荐字段」**,涉及薪资时向用户确认,不使用默认值
185
+ 4. 用户明确提出与本模板不同的要求时,**以用户为准**,模板只作起点
186
+
187
+ > 若岗位明显不属于以上五类(如财务、行政、法务),按 `recruit-jd-template.md` 的通用兜底结构生成,不必强行套用。
188
+
189
+ ---
190
+
191
+ ## 四、环境观测(2026-11-05 实测,供参考不复用为默认值)
192
+
193
+ 抽样 100 条 / 系统共 836 条职位:
194
+
195
+ | 维度 | 分布 |
196
+ |---|---|
197
+ | 岗位性质 | 全职 79、实习 21 |
198
+ | 状态 | 招聘中 49、待发布 49、招聘结束 2 |
199
+ | 招聘人数 | 1 人 67、2 人 19、10 人 8、3 人 3、5 人 1、6 人 1、30 人 1 |
200
+ | 名称重复度 | 100 条中仅 60 个不同名称;"舟山民宿管家" 30 条、"蓝堡舟山普陀区蓝堡" 35 条 |
201
+
202
+ > ⚠️ **该环境存在大量重复与疑似测试数据**。这正是取消「运行时拉取同类职位作参考」的直接原因——照此取默认值会把重复地点/名称带进新职位。模板库采用人工归纳口径,不依赖该数据分布。
@@ -0,0 +1,322 @@
1
+ ---
2
+ name: recruit-arrange-interview
3
+ description: 创建面试安排,支持现场、电话、视频、AI 面试方式(saveFormData + assignedInterview)
4
+ ---
5
+
6
+ # 安排面试
7
+
8
+ > **平台兼容**:本文命令示例在 macOS/Linux 与 Windows PowerShell 下均可执行——JSON 用单引号包裹、内部双引号不转义;PowerShell 下不使用反斜杠续行。
9
+ > 本文档中的 `${...}` 形参(表单 objId / 布局 formId / 列表 listId / EB 页面 viewId·pageId / 应用 appId / 动作流 id / 菜单 id cusMenuId)为**租户相关值**:表单 objId 与布局 formId 同由 `getObjsByTag` 一次返回;列表/页面/菜单 id 由部署参数提供(**可经 `allMenus` 菜单树自动发现**,见 `recruit-resolve-metadata.md` §3.1);**字段 id(`formField.id`)经 `ds/fields` 运行时解析,不写死**(见 `recruit-resolve-metadata.md` §5)。
10
+
11
+ ## 1. 基础信息
12
+ - 接口名称:安排面试(与页面「保存」按钮**等价的动作链**:系统保存 → 各 esb 动作流 → 分配面试 → AI 面试提醒)
13
+ - 请求方式:`POST`
14
+ - 去域名路径:
15
+ - ① `/api/ebuilder/form/form/core/saveFormData`(保存面试计划表单,formId 见 recruit-resolve-metadata.md)
16
+ - ② 表单「保存」按钮 actions[] 中的 `actionType=esb` 动作 → `/api/ebuilder/form/esb/runEsb`(按 `showOrder` 顺序逐条执行;**id 运行时解析,不写死**,见 §4.4)
17
+ - ③ 表单「保存」按钮 actions[] 中的 `actionType=jsCode` 动作(典型实现即调 `/api/recruit/candidate/assignedInterview`)→ 技能侧等价调用该接口(见 §4.5)
18
+ - 辅助(可选):`GET /api/ebuilder/form/obj/getObjsByTag?appId={appId}&tag=uf_rcrt_interview_plan`(一次取得面试计划 `objId` 与布局 `formId`;字段 id 经 `ds/fields` 解析)
19
+ - 辅助(动作链解析):`POST /api/ebuilder/form/data/getFormButtons`(body 带 `objId` + `layoutId`,取「保存」按钮的 `actions[]`)
20
+ - 所属模块:招聘管理(recruit)
21
+ - 所属分组:面试 / 写操作
22
+
23
+ ## 2. 业务用途
24
+ 用户说"给 X 安排一场面试""约个现场/电话/视频/AI 面试""安排面试官 Y 面试 Z"时调用。先保存面试计划(含主题、时间、方式、面试官、职位/应聘者),再按页面「保存」按钮配置的动作链逐条执行(新建日程、分配面试、AI 面试提醒等),使其与人工点保存的结果一致。属写操作,**必须先展示摘要并获明确确认后再提交**。
25
+
26
+ > **定位候选人**:`--prepare/--commit/--prefill` 均可不带 `--talent-id`,直接 `--mobile <手机号>` 或 `--name <姓名>`(人才库检索;唯一命中自动采用,多条输出 candidates 交用户选择,exit 3)。
27
+
28
+ ## 3. 前置条件
29
+ - 已安装招聘服务(第 0 步闸门通过)。
30
+ - **定位前置(必做)**:写操作前必须先按手机号(叠加姓名/渠道缩小范围)搜索定位候选人(`recruit-search-candidate`)拿到 `talentId` 与应聘批次;命中 0 条→提示未找到、不臆测;命中多条→列出候选清单(姓名/手机/渠道/状态/创建时间/`talentId`)请用户确认,**绝不自动取第一条**(写操作选错对象后果不可逆)。消歧规则见 SKILL.md「自然语言 → 参数映射」。
31
+ - 需目标应聘者 `talentId`(来自搜索/详情)与职位 `positionManageId`(来自职位列表/详情);面试官为人员门户字段,传其 `userId`(名称→ID 用 `browser/complete/resource` 解析)。
32
+ - 应聘管理记录 id(`candidate_manage_id`)通常与 `talentId` 的应聘批次对应(新建应聘者后即生成;见 §4.3 字段表)。
33
+ - 第①步保存面试计划后拿到 `formDataId`(= 面试计划记录 id),第②③步均依赖它。
34
+
35
+ ## 3.1 字段联动与显示属性联动(EB 能力,运行时获取,不写死)
36
+ 面试计划表单用 EB 搭建,字段联动/显示属性联动由表单设计声明,Agent **不写死、不臆造**,统一走运行时获取:
37
+ - `GET /api/ebuilder/form/form/core/getFormLayout?formId=<面试计划表单id>` 返回 `linkageActions`(字段联动)与 `viewLinkages`(显示属性联动:某字段值决定另一字段是否显示/必填/只读)。**部分环境上 GET 返回 405**,需用 POST 同路径(body 带 `module`);`write-op.mjs::getFormLayout/getFormLayoutMeta` 已做 GET→POST 回退,调用方直接用即可。
38
+ - 运行时联动计算:`POST /api/ebuilder/form/form/linkage/executeFdLinkage`(接口存在),传入联动 id 与上下文返回推导结果。
39
+ - **处理原则**:提交前若不确定某字段是否联动/必填依赖(如"选了某面试方式才要求填地点"),先调 `getFormLayout` 读取声明;选项类联动值用 `executeFdLinkage` 计算后填入;遇到"选 A 才显 B"时先向用户收集 A 再展示 B,不一次性把所有字段甩给用户、也不瞎编联动结果。
40
+
41
+ ## 4. 请求参数
42
+
43
+ ### 4.1 第①步 saveFormData(Query)
44
+ | 字段 | 位置 | 类型 | 必填 | 业务说明 |
45
+ |---|---|---|---|---|
46
+ | `formId` | query | string | 是 | 面试计划表单 id(运行时解析,见 recruit-resolve-metadata.md) |
47
+
48
+ ### 4.2 第①步 saveFormData(Body 结构,同新建应聘者)
49
+ | 字段 | 位置 | 类型 | 必填 | 说明 |
50
+ |---|---|---|---|---|
51
+ | `module` | body | string | 是 | `ebuilderform` |
52
+ | `appId` | body | string | 是 | 安装闸门 `data[0]` |
53
+ | `customParam.objId` | body | string | 是 | 面试计划对象 id(运行时解析,见 recruit-resolve-metadata.md) |
54
+ | `formData.module` | body | string | 是 | `ebuilderform` |
55
+ | `formData.client` | body | string | 是 | `pc` |
56
+ | `formData.dataStatus` | body | string | 是 | `submit` |
57
+ | `formData.form.id` | body | string | 是 | 面试计划表单 id(同 query `formId`) |
58
+ | `formData.formLayout.id` | body | string | 是 | 面试计划表单布局 id(运行时解析,见 recruit-resolve-metadata.md) |
59
+ | `formData.dataDetails` | body | array | 是 | 各业务字段(见 4.3) |
60
+
61
+ ### 4.3 面试计划表单字段(dataDetails,全字段)
62
+ | 字段 id(运行时解析) | 含义 | 必填 | 值形态(示例) |
63
+ |---|---|---|---|
64
+ | `<面试主题字段id>` | 面试主题 | 是 | `content`(如 `AI工程师-高刚的面试`);**无职位回退(script 版)**:候选人未挂应聘职位(`positionManageId` 解析不到)时,主题取 `姓名+的面试`,**不得拼出 `undefined-…`/`null-…` 前缀**(新建未挂职位的候选人生成主题时该情况常见) |
65
+ | `<开始时间字段id>` | 开始时间 | 是 | `content`(`2026-08-06 10:30`) |
66
+ | `<结束时间字段id>` | 结束时间 | 是 | `content`(`2026-08-06 11:30`) |
67
+ | `<面试方式字段id>` | 面试方式 | 是 | `dataOptions`(现场面试/视频面试/电话面试/AI面试) |
68
+ | `<面试类型字段id>` | 面试类型 | 是 | `dataOptions`(初试/复试…) |
69
+ | `<面试轮次字段id>` | 面试轮次 | 否 | `dataOptions`(第一轮…) |
70
+ | `<面试官字段id>` | 面试官 | 是 | `dataOptions[].optionObj{userId,name}` |
71
+ | `<应聘职位字段id>` | 应聘职位 | 是 | `dataOptions[].optionId` = `positionManageId` |
72
+ | `<面试地点字段id>` | 面试地点 | 否 | `dataText` |
73
+ | `<手机字段id>` | 手机 | **是(脚本强制)** | `content`:从人才基本信息 `telephone` 取值**显式写入**(页面按 talent_id 联动带出,直接 saveFormData 不会自动带) |
74
+ | `<邮箱字段id>` | 邮箱 | **AI面试必填** | `content`:从人才基本信息 `email` 取值**显式写入**;AI面试服务端按邮箱发通知/录屏链接,缺失则**阻断**(支持 `--email` 当场补录) |
75
+ | `<AI面试方案字段id>` | AI面试方案(`digital_id`) | **AI面试必填** | `dataOptions`:`optionId` = 面试数字人配置表记录的 `form_data_id`;来源见 §4.7(未指定时列出候选让用户选,**不自动取第一条**) |
76
+ | `<人才字段id>` | 人才(talent_id) | 是 | `dataOptions[].optionId` = `talentId` |
77
+ | `<应聘管理字段id>` | 应聘管理(candidate_manage_id) | 是 | `dataOptions[].optionId` = 应聘批次记录 id |
78
+ | `<邮件模板字段id>` | 邮件模板 | 否 | `dataOptions`(默认模板) |
79
+ | `<通知内容字段id>` | 通知内容 | 否 | `dataText`(支持 `{面试方式}` `{开始时间}` `{应聘岗位}` 等占位符) |
80
+ | `<状态字段id>` | 状态 | 否 | `dataOptions`(未开始) |
81
+ | `<反馈状态字段id>` | 反馈状态 | 否 | `dataOptions`(未反馈) |
82
+ | `<系统/开关字段id>`(多个) | 系统/开关字段 | 否 | 照抄表单默认值(默认/关闭/是/0/3 等) |
83
+
84
+ > 字段 id 不写死:经 `recruit-resolve-metadata.md` §5 的 `ds/fields` 按 `config.dataKey` 解析(结果已并入环境缓存 `fields[objId]` 的 `{dataKey: fieldId}`)。解析不到时停止,不得臆造 fieldId。
85
+
86
+ > 面试方式枚举:**一律经 `ds/options` 运行时解析,不写死**(实测示例:现场面试=`841052191228968963`、电话面试=`841052191228968961`、视频面试=`841052191228968962`、**AI面试=`841052191228968964`**;各环境/版本可能不同,以实际返回为准)。面试环节/轮次同理,不写死。
87
+
88
+ ### 4.4 动作链中的 esb 动作(runEsb)
89
+ | 字段 | 位置 | 类型 | 必填 | 说明 |
90
+ |---|---|---|---|---|
91
+ | `objId` | query | string | 是 | 面试计划对象 id(运行时解析,见 recruit-resolve-metadata.md) |
92
+ | `dataIds` | body | string | 是 | 第①步返回 `formDataId` |
93
+ | `esbActionIds` | body | string | 是 | **「保存」按钮 actions[] 里 `actionType=esb` 的动作 id**(按 `showOrder` 顺序逐条触发) |
94
+ | `objId` | body | string | 是 | 同 query |
95
+
96
+ > 注:**不写死**任何 `esbActionIds`。运行时 `getFormButtons(objId, layoutId)` 取 `buttonKey=save` 的按钮,读其 `actions[]`(见 §4.6)——动作数量与名称因环境/版本而异(如「面试管理-新建日程」「AI面试时发送提醒」),有多少条执行多少条。
97
+
98
+ ### 4.5 动作链中的 jsCode 动作 → assignedInterview(分配面试)
99
+ | 字段 | 位置 | 类型 | 必填 | 说明 |
100
+ |---|---|---|---|---|
101
+ | `formDataId` | query | string | 是 | 第①步返回 `data.id`(面试计划记录 id) |
102
+
103
+ > **无请求体**(POST 仅 Query 传 `formDataId`)。
104
+ > 页面「保存」按钮用一段 jsCode 动作(名称如「安排面试后续动作API」)调本接口;脚本**不执行页面脚本**,而是识别 `ecode` 中的 `/api/recruit/candidate/assignedInterview` 并**等价调用**,位置严格按该动作的 `showOrder`。
105
+
106
+ ### 4.6 「保存」按钮动作链(与页面点保存等价,核心契约)
107
+ 页面点「保存」不是只调一次 `saveFormData`,而是**依次执行按钮配置里的整串动作**。抓包实证(2026-08-17):
108
+ | showOrder | 动作名 | actionType | 实际请求 |
109
+ |---|---|---|---|
110
+ | 0 | 保存 | system | `saveFormData` |
111
+ | 1 | 面试管理-新建日程 | esb | `runEsb`(esbActionIds=动作 id) |
112
+ | 2 | 安排面试后续动作API | jsCode | `assignedInterview?formDataId=…`(脚本内 ecode 显式调用) |
113
+ | 3 | AI面试时发送提醒 | esb | `runEsb`(esbActionIds=动作 id) |
114
+
115
+ > 某环境实测(2026-10-21)动作链是 4 条,且多一条「**创建视频会议**」:新建日程 → 创建视频会议 → 面试安排后续动作API → AI面试时发送提醒。
116
+ > **另一环境实测(2026-10-21)也是 4 条,但第 4 条是「面试管理-新建EB日程」**(8 月抓包时只有 3 条,说明期间配置有更新)。
117
+ > 结论:**条数与名称随环境、随配置变更而变化**,一律以 `getFormButtons` 返回为准,不得按名称写死执行清单。
118
+
119
+ **技能执行规则**
120
+ 1. `getFormButtons` 取 `buttonKey=save` 的按钮 → `actions[]` 按 `showOrder` 升序(跨环境自适应,不写死 id / 名称 / 条数);
121
+ 2. **`enable=0` 的动作一律跳过**(页面上被禁用的动作不会执行,脚本也不能执行;实测人才表单 7 条动作里 3 条为禁用态);
122
+ 3. 跳过 `actionType=system`(已由第①步 `saveFormData` 完成);
123
+ 4. `actionType=esb` → `runEsb`,**逐条按序**;任一失败即中断并报错(与页面一致,后续动作不再执行);
124
+ 5. `actionType=jsCode` 且 `ecode` 含 `assignedInterview` → 等价调用;**其它自定义 jsCode 无法等价执行 → 跳过并写入 `warnings`**(不静默);
125
+ 6. 若整串动作里**没有** `assignedInterview`(部分环境未把它配成保存动作)→ 在动作链之后**兜底调用一次**并写入 `warnings`;
126
+ 7. `--skip-save-actions` 仅用于排查:只保存表单、不执行任何后续动作(记录不进入面试流程)。
127
+
128
+ > 说明:面试通知由**服务端动作流**发出(不是技能自己拼消息)。技能只要把 `esb` 动作按页面顺序触发,通知/日程/AI 面试提醒就与人工点保存完全一致。
129
+
130
+ ### 4.7 AI面试方案(面试数字人配置表):运行时定位 + 必填选择
131
+
132
+ **为什么必须动态**:`digital_id` 的候选来自「面试数字人配置」列表,该表在不同环境 **objId / listId / 记录 id 全不同**(某环境实测 listId=`1274931191811432873`、objId=`1274931183271831435`,不同环境完全不同)。
133
+
134
+ **定位链路(全部运行时解析,不写死)**
135
+ 1. **首选:关联字段候选接口**(不依赖菜单/列表,标准包未配菜单也能用)
136
+ `POST /api/ebuilder/form/common/browser/complete/ebuilder`
137
+ ```json
138
+ { "browserMultiple": false, "newly": 1, "searchValue": "",
139
+ "formParam": "{\"formId\":\"<面试计划formId>\",\"layoutId\":\"<layoutId>\",\"fieldId\":\"<digital_id字段id>\",\"filterItems\":[],\"module\":\"ebuilderform\",\"dataDetails\":[]}",
140
+ "openScroll": true, "controlId": "<digital_id字段id>", "businessId": "<formId>", "variableMap": {} }
141
+ ```
142
+ 响应 `data.data[] = { id, name, ebObjId }`,`id` 即提交用的 `optionId`,`name` 即方案名。
143
+ 2. **兜底:菜单列表**(`cache.lists.digital_human` → `listInit` 取 `objid` → `getListDatas?passid={objid}&cid={objid}`)。
144
+
145
+ > 跨环境实测:**部分环境**有「面试数字人配置表」菜单(listId `1274931191811432873`,2 个方案,默认「大模型面试」);**部分环境没有该菜单**(36 个 SEARCH 菜单里都没有),只能走接口 ①——实测返回唯一方案「大模型岗位」(`1324570620131057673`),且 部分环境 **没有** `digital_id` 默认值(`defaultDetails` 无此项)。所以不能把「默认方案」当成通用前提。
146
+
147
+ **选择规则**
148
+ - 传了 `--ai-plan <方案名或id>`:id 精确 → 名称全等 → 名称包含;**命中多条视为歧义**并列出,绝不自动取第一条。
149
+ - 没传:`--prepare` 输出 `aiPlans` 候选清单 + `needAiPlan=true`;`--commit` 直接**阻断**(不落库、不执行动作链),提示用户选定后重试。
150
+ - 候选里 `isDefault=true` 的那条是**页面默认方案**(来自 `defaultDetails.digital_id`,实测为「大模型面试」),同时单独输出 `defaultAiPlan`;用户说"用默认"时按该值传 `--ai-plan` 即可。
151
+
152
+ ### 4.8 联动必填核对(`getFormLayout` 元数据,只读)
153
+
154
+ `GET /api/ebuilder/form/form/core/getFormLayout?formId=<面试计划formId>` 返回:
155
+ - `viewRelateConfig[]`:字段级 `required/readOnly/display`(**静态必填**);
156
+ - `viewLinkages[]`:条件必填/显隐(`linkageProp` 含 `show`/`edit`/`required`/`readonly`/`hide`),条件形如 `interview_type EQUAL <枚举名>`;
157
+ - `defaultDetails[]`:页面默认值(有默认值的字段不写也会被带上)。
158
+
159
+ `--prepare` 会据此输出 `requiredHint`:当前面试方式下**必填、但本次未提供且无默认值**的字段(dataKey + 中文名)。
160
+
161
+ > 某环境实测(2026-08-17 抓包,`getFormLayout?formId=840751242946035714`):
162
+ > - 静态必填 10 个:应聘管理、应聘职位、人才、面试主题、面试方式、面试轮次、面试官、开始时间、关联日程、状态(后两个有默认值);
163
+ > - **`AI面试`(= 数字人面试)→ `digital_id`(AI面试方案)+ `email` 必填**,同时**隐藏**关联日程、发送渠道与两个开关字段;
164
+ > - `AI面试(小程序)` → `interview_paper_id`(面试试卷)+ `send_channel`(发送渠道)必填(与数字人版是两种形态,不要混);
165
+ > - `send_channel = 邮件` → `notice_mould`(通知模板)必填(有默认模板)。
166
+ >
167
+ > **枚举改名/换 id 的坑(已处理)**:联动条件绑的是 optionId。数字人面试原来的枚举项 `AI面试(数字人)`(optionId `841052191228968964`)已被删除,新增的 `AI面试`(optionId `1274947951008702504`)就是它。若按名称直接比对会判成"条件不命中"、得出"页面不要求方案"的错误结论。
168
+ > 判定规则见 `computeRequiredHint`:条件 optionId **仍在枚举** → 严格按当前名比较;**已不在枚举** → 仅当用户所选是「裸名」时按去括号比较(`AI面试(数字人)` ≈ `AI面试`,而 `AI面试(小程序)` 这类带括号取值不参与),从而既兼容改名又不会串到小程序版。
169
+ >
170
+ > 页面默认方案:`digital_id` 的 `defaultDetails` = **「大模型面试」**(记录 id `1274944914469281862`,在面试数字人配置表内)。`--prepare` 会把该默认方案标成 `isDefault=true` 并输出 `defaultAiPlan`。
171
+ >
172
+ > **某环境实测(2026-10-21,POST 取布局)**:
173
+ > - 静态必填 10 个:人才、应聘职位、面试主题、面试方式、面试轮次、**面试表格(`interview_table`,部分环境特有)**、面试官、开始时间、关联日程、状态;
174
+ > - `AI面试` → 联动 `required digital_id` + `required email`(与另一环境实测结论一致),并隐藏 `adjutant_interviewer`;
175
+ > - `AI面试(小程序)` → 面试试卷 + 发送渠道(同另一环境);
176
+ > - `defaultDetails` **没有** `digital_id` → 部分环境无页面默认方案,必须由用户选。
177
+ > - 部分环境的联动条件里 optionId 是旧值(`841052191228968964` / `841052191228968960`),枚举已换成 `937153879646070190…` / `1320966047218835460`,同样靠上述「optionId 在不在枚举 + 裸名去括号」规则识别。
178
+
179
+ ## 5. 响应数据结构
180
+ - 第①步:`data.id` = 面试计划记录 id(后续步骤入参)。
181
+ - 动作链中的 esb 动作:`data.successNum` / `data.failNum` / `data.successMsg` = 动作流触发结果(`status=false` 即失败)。
182
+ - 动作链中的分配面试:`data.msg`(操作成功)、`data.finalBatchId`(新应聘批次 id)、`data.needRefresh` / `data.refreshCard`(页面刷新标记)。
183
+
184
+ ## 6. 请求示例
185
+ ```json
186
+ // ① 保存面试计划
187
+ POST /api/ebuilder/form/form/core/saveFormData?formId=<面试计划 formId,getObjsByTag 同响应返回>
188
+ { "module": "ebuilderform",
189
+ "customParam": { "objId": "${INTERVIEW_PLAN_FORM_OBJID}", "name": "面试管理-<主题> <时间>", "firstDataName": "面试管理-<主题> <时间>",
190
+ "isFlowEnd": false, "otherOperator": "", "dataStatus": "submit", "rightType": "0", "appId": "<data[0]>" },
191
+ "appId": "<data[0]>",
192
+ "formData": { "module": "ebuilderform", "client": "pc", "dataStatus": "submit",
193
+ "form": { "id": "<面试计划 formId,getObjsByTag 同响应返回>" },
194
+ "formLayout": { "id": "<面试计划 formLayout.id,getFormLayout 响应>" },
195
+ "dataDetails": [
196
+ { "formField": { "id": "<面试主题字段id>" }, "content": "AI工程师-高刚的面试" },
197
+ { "formField": { "id": "<开始时间字段id>" }, "content": "2026-08-06 10:30" },
198
+ { "formField": { "id": "<结束时间字段id>" }, "content": "2026-08-06 11:30" },
199
+ { "formField": { "id": "<面试方式字段id>" }, "dataOptions": [{ "optionId": "841052191228968963", "content": "现场面试" }] },
200
+ { "formField": { "id": "<面试类型字段id>" }, "dataOptions": [{ "optionId": "841052191228968964", "content": "初试" }] },
201
+ { "formField": { "id": "<面试官字段id>" }, "dataOptions": [{ "optionId": "<面试官userId>", "content": "<面试官姓名>" }] },
202
+ { "formField": { "id": "<应聘职位字段id>" }, "dataOptions": [{ "optionId": "<positionManageId>", "content": "<职位名>" }] },
203
+ { "formField": { "id": "<人才字段id>" }, "dataOptions": [{ "optionId": "<talentId>", "content": "<姓名>" }] },
204
+ { "formField": { "id": "<应聘管理字段id>" }, "dataOptions": [{ "optionId": "<candidate_manage_id>", "content": "<id>" }] },
205
+ { "formField": { "id": "<状态字段id>" }, "dataOptions": [{ "optionId": "841052191228968972", "content": "未开始" }] },
206
+ { "formField": { "id": "<反馈状态字段id>" }, "dataOptions": [{ "optionId": "0", "content": "未反馈" }] }
207
+ ] } }
208
+
209
+ // ②③④ 动作链:从「保存」按钮 actions[] 按 showOrder 逐条执行(下方为 某环境实例,id 均为运行时解析结果)
210
+ POST /api/ebuilder/form/esb/runEsb?objId=${INTERVIEW_PLAN_FORM_OBJID}
211
+ { "dataIds": "<formDataId>", "esbActionIds": "<showOrder=1 的 esb 动作 id>", "objId": "${INTERVIEW_PLAN_FORM_OBJID}" }
212
+
213
+ // 分配面试(无 body)——对应 showOrder=2 的 jsCode 动作
214
+ POST /api/recruit/candidate/assignedInterview?formDataId=<formDataId>
215
+
216
+ POST /api/ebuilder/form/esb/runEsb?objId=${INTERVIEW_PLAN_FORM_OBJID}
217
+ { "dataIds": "<formDataId>", "esbActionIds": "<showOrder=3 的 esb 动作 id>", "objId": "${INTERVIEW_PLAN_FORM_OBJID}" }
218
+ ```
219
+
220
+ ## 7. 响应示例
221
+ ```json
222
+ // ①
223
+ { "code": 200, "status": true, "data": { "id": "1300448559071436804" } }
224
+ // ②
225
+ { "code": 200, "status": true, "data": { "successNum": 2, "failNum": 0, "successMsg": "1条数据执行esb接口完成", "needRefresh": true } }
226
+ // ③
227
+ { "code": 200, "status": true, "data": { "msg": "操作成功", "needRefresh": true, "finalBatchId": "1300447863211237411", "refreshCard": true, "fromPoolBatch": false } }
228
+ ```
229
+
230
+ 脚本 `--commit` 输出示例(含动作链执行结果与卡片单页链接):
231
+ ```json
232
+ { "mode": "commit", "result": "success",
233
+ "interviewFormId": "1328644967777771668",
234
+ "interviewCardUrl": "{baseUrl}/sp/ebdfpage/card/0/<面试计划 objId>/1328644967777771668",
235
+ "saveActions": [
236
+ { "order": 1, "name": "面试管理-新建日程", "type": "esb", "ok": true, "msg": "【面试管理-新建日程】执行成功!" },
237
+ { "order": 2, "name": "安排面试后续动作API", "type": "jsCode", "ok": true, "msg": "等价调用 assignedInterview(分配面试)" },
238
+ { "order": 3, "name": "AI面试时发送提醒", "type": "esb", "ok": true, "msg": "【招聘recruit-新建AI面试后按钮事件发送提醒】执行成功!" }
239
+ ],
240
+ "warnings": [],
241
+ "assigned": { "msg": "操作成功", "finalBatchId": "1318436783908855811" } }
242
+ ```
243
+
244
+ ## 8. 错误码
245
+ | 错误码 | 含义 | AI 处理建议 |
246
+ |---|---|---|
247
+ | 非 200 | 认证/参数错误 | 提示检查认证(`weaver-work-cli auth status`) / 参数;参数缺失先反问 |
248
+ | 分配面试 400 | `formDataId` 缺失或无效 | 确认第①步返回的 `data.id` 已正确透传 |
249
+ | 动作链 esb `status=false` | 日程/提醒等动作流执行失败 | 按动作名报错并**中断**(后续动作不执行,与页面一致);检查该动作流配置 |
250
+ | 本地阻断:AI面试缺邮箱 | `--email` 未提供且人才资料无邮箱 | **不创建**;提示用户提供邮箱(`--email`)或在人才资料补全后重试 |
251
+ | 本地阻断:邮箱格式错 / 缺手机 | 取值不合法 | 提示用户提供有效值后重试,不静默写空 |
252
+
253
+ ## 9. 调用参考
254
+ - 用户场景:"给 X 安排面试"。
255
+ - **流程**:收集(应聘者/职位/面试官/时间/方式)→ 展示摘要(含将执行的动作链清单)→ 用户确认 → ① 保存 → ②③④ 按「保存」按钮 actions[] 顺序执行 → 输出结果(动作链明细 + 新应聘批次 `finalBatchId`)。
256
+ - 面试官名称→ID:走 `browser/complete/resource`(fieldId 按门户字段规则);命中多个列出选项让用户确认。
257
+ - **确认摘要模板(提交前必展示,必须带出定位键)**:
258
+ > 即将为 **姓名(手机:XXX | `talentId=XXX`)** 安排面试:
259
+ > - 职位:XXX | 方式:现场/视频/电话/AI | 时间:XXX
260
+ > - 面试官:XXX
261
+ > 请确认对象与参数无误(确认后才会保存并分配)。
262
+
263
+ ## 10. 注意事项
264
+ - **写操作确认**:必须展示摘要并获用户明确确认后再提交。**提交时默认执行「保存」按钮的完整动作链**(含服务端发出的面试通知/日程/提醒),与人工点保存一致;`--prepare` 会先把动作清单列出来供确认。
265
+ - **不得"只保存表单"**:只调 `saveFormData` 会留下「有表单、无日程、无分配、无通知」的半成品(页面看不到、流程不生效)。必须走完动作链;`--skip-save-actions` 仅限排查。
266
+ - **定位前置**:提交前必须先按手机号/姓名搜索定位到唯一候选人(见 §3),命中多条先消歧,绝不自动取第一条。
267
+ - 面试官/职位/人才/应聘管理均为**门户字段**,`dataOptions[].optionObj` 内含 `userId`/`name`,展示取 `name`,提交传 `optionId`(= userId / positionManageId / talentId / candidate_manage_id)。
268
+ - 面试字段 id 经 `ds/fields` 按 `dataKey` 解析(`interviewer`/`position_manage_id`/`mobile`/`talent_id`/`candidate_manage_id`/`email`,已并入环境缓存 `fields[objId]`),如需动态确认字段 id 可查 `recruit-resolve-metadata.md` §5。
269
+ - **面试官默认 = 当前登录用户**:`--interviewer` 可省略;省略时经 `POST /api/baseserver/layout/teamsCheck` 取 `currentUser` 作为面试官(与页面「选 AI面试 后联动带出当前人」一致)。**不得**用"人员候选列表第一条"当默认(可能是任意人;2026-10-21 已修)。
270
+ - **手机号 / 邮箱必须显式写入**(2026-10-21 修):页面操作时表单按 `talent_id` **联动带出**手机/邮箱,但**直接调 `saveFormData` 不触发表单联动** → 不写就落空。脚本从 `getCandidateCardBaseInfo` 的 `talent.telephone` / `talent.email` 取值写入;也支持 `--mobile` / `--email` 当场补录(补录优先)。
271
+ - **AI 面试邮箱为必填**:`type` 含 `AI`(兼容「AI面试 / AI 面试」命名差异)时,若人才资料与 `--email` 都没有邮箱,**直接阻断创建**,提示用户提供邮箱后重试;邮箱格式不合法同样阻断。**不得静默写空、不得降级创建**。
272
+ - **AI面试方案(`digital_id`)为必填**:未传 `--ai-plan` 时 `--prepare` 输出 `aiPlans` 候选、`--commit` 直接阻断;候选来自「面试数字人配置」列表,**objId/listId/记录 id 全部运行时解析,不写死**。用户选定后带 `--ai-plan` 重试;多条命中先消歧,**绝不自动取第一条**。
273
+ - **联动必填以表单配置为准**:`--prepare` 的 `requiredHint` 会列出「当前面试方式下必填但未提供且无默认值」的字段。若出现 `interview_paper_id`(面试试卷)/`send_channel`(发送渠道),说明该环境页面还要求这两项,需先与用户确认后再补写(见文档末尾「未闭环」)。
274
+ - **记录卡片单页链接**:`--commit` 输出 `interviewCardUrl = {baseUrl}/sp/ebdfpage/card/0/{objId}/{formDataId}`(objId 运行时从环境缓存取,dataId 为 saveFormData 返回值);供 Agent 在回答里给出可点击链接。
275
+ - 时间格式:`YYYY-MM-DD HH:mm`(含空格)。
276
+ - **AI面试(数字人)**:当 面试方式 = `AI面试` 时,服务端按数字人配置(`uf_rcrt_zego_config` 即构云端录制 / `uf_rcrt_digital_human` 面试方案,管理员一次性配置,详见 `recruit-business-map/references/ai-interview-manual.md`)自动驱动数字人面试与通知(`uf_rcrt_dhi_notify_log`);技能侧只需正确选择「AI面试」方式并走 ①②③ 三步编排,**无需额外操作**。数字人自动约面(机器人自动约面)的 HR 操作与 admin 配置要点见 `recruit-business-map/references/ai-interview-manual.md` 操作手册备份;手动模式已验证 OK,视为功能支持。
277
+
278
+ ## 11. 预填模式(打开人才卡片 → 面试安排表单 → 选面试方式;人工保存,不落库)
279
+
280
+ **用途**:对齐"人工安排面试"的操作路径,支撑「AI面试邀约」演示链路(原始需求:**打开人才卡片 → 安排AI面试 → 打开面试管理页面**)。与 §1–§10 的 `--prepare/--commit`(**直接落库**)并列——本模式**不落库**,只"打开页面 + 在表单里选面试方式",由 HR 核对后保存。
281
+
282
+ **用法**
283
+ ```bash
284
+ node scripts/recruit-arrange-interview.mjs --prefill --talent-id <id> [--type AI面试]
285
+ ```
286
+ 输出:`talentCardUrl`(人才卡片)、`interviewListUrl`(面试管理列表)、`jsExpr`(在表单上选「面试方式=<type>」)、`steps`。
287
+
288
+ **执行步骤(Agent 编排,依赖浏览器自动化 browser-skill/bsk)**
289
+ 1. 打开 `talentCardUrl` → 进入该候选人卡片;
290
+ 2. 点卡片上的「**安排面试**」→ 打开面试安排表单(**主题 / 候选人 / 职位由表单默认值自动带入**,无需预填);
291
+ 3. 在页面执行 `jsExpr`(例:`bsk evaluate "<jsExpr>"`)→ 选中「面试方式=`<type>`」,**触发表单联动**;
292
+ 4. 由 HR 核对(可按需调整)后点「**保存**」完成面试安排;
293
+ 5. (可选)打开 `interviewListUrl` 查看面试管理列表。
294
+
295
+ **AI面试联动(2026-10-21 核对)**
296
+ - **「AI面试」= 数字人面试**:联动条件里的 `AI面试(数字人)`(旧 optionId `841052191228968964`)就是它,只是后来枚举项换了 id 与显示名(新 `1274947951008702504`「AI面试」)。
297
+ - 选中「面试方式=AI面试」后,页面联动带出:**AI面试方案(默认「大模型面试」)**、面试官=当前登录人、开始/结束时间;并**隐藏**关联日程、发送渠道。
298
+ - `--commit` 路径**不依赖联动**:方案由 `--ai-plan` 显式指定(未指定时 `--prepare` 给候选、`--commit` 阻断),避免"默认值静默生效"而用户不知情。
299
+
300
+ **字段与枚举(运行时解析,不写死)**
301
+ - 字段 id:环境缓存 `cache.fields[面试计划 objId]`(如 `interview_type`);
302
+ - 「面试方式」optionId:`getDsOptions(objId, interview_type, appId)` 按名称取(实测示例:现场=`841052191228968963`、视频=`…962`、电话=`…961`、**AI面试=`…964`**)。
303
+
304
+ **通知与后续动作(两条路径结果一致)**
305
+ - **页面点「保存」= 依次执行按钮配置的动作链**:系统保存 → esb(新建日程)→ jsCode(分配面试)→ esb(AI面试提醒)。`--commit` 已按**同一动作链**执行(见 §4.6),所以脚本落库与人工保存效果一致。
306
+ - 本 `--prefill` 模式把"填表 + 点保存"交给页面/人工,技能不落库;通知仍由服务端动作流发出,技能不自己拼消息。
307
+
308
+ **边界**
309
+ - 本模式依赖浏览器自动化(WorkBuddy 桌面端 `bsk`,或具备表单注入能力的客户端);小E 端若只能打开页面,可只打开 `talentCardUrl` / `interviewListUrl`,第③步由 HR 手点。
310
+ - **AI面试闭环不可全链自动化**:技能止于"面试安排",通知/候选人录制/视频归集均由服务端与候选人侧完成;HR 后续在面试管理里查台账、`recruit-detail-interview` 看面试与反馈、`recruit-edit-interview-feedback` 填反馈。
311
+
312
+ ## 12. 未闭环(2026-10-21 核对联动必填得出)
313
+
314
+ | # | 事项 | 现状 | 影响 |
315
+ |---|---|---|---|
316
+ | 1 | 面试试卷 `interview_paper_id` / 发送渠道 `send_channel` | 仅 **`AI面试(小程序)`** 形态必填(数字人版会隐藏这两项);脚本未写、也未提供候选查询 | 若在对话里选「AI面试(小程序)」,页面会要求这两项;当前建议统一走「AI面试」(数字人) |
317
+
318
+ > 结论:**「AI面试」= 数字人面试**,必填项是 **AI面试方案 + 邮箱**,不需要面试试卷/发送渠道(那两项属于「AI面试(小程序)」)。
319
+ >
320
+ > **部分环境已实测(2026-10-21)**:动作链解析出 4 个动作(各环境动作集不同,以运行时解析为准);AI 面试方案候选可用(「大模型岗位」);缺方案时 `--commit` 正确阻断;视频面试路径不受影响。
321
+
322
+ > **--commit 成功产物(2026-10-22 定稿)**:两个 Markdown 链接——① `viewLink`(面试安排详情页)② `listLocateLink`(面试管理列表并滑出本次安排,listId 取环境缓存动态组合)。