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.
- package/README.md +17 -0
- package/dist/chunks/{archive-JHTONRST.js → archive-P6TBQGKL.js} +13 -5
- package/dist/chunks/{archive-oa-FCHLCPHC.js → archive-oa-7TQ2NXOH.js} +12 -5
- package/dist/chunks/{asset-RLIHC7DB.js → asset-3ELRG37G.js} +11 -4
- package/dist/chunks/{asset-idle-KVOFTLCP.js → asset-idle-WIGMUFMD.js} +7 -3
- package/dist/chunks/{attachment-content-RZYDB3MB.js → attachment-content-E3276UOV.js} +5 -4
- package/dist/chunks/{blog-42OZTJNP.js → blog-C5NMZAAC.js} +11 -4
- package/dist/chunks/{caizhilian-KRK547K5.js → caizhilian-5XSM2DFP.js} +13 -6
- package/dist/chunks/{calendar-RTWAMKHD.js → calendar-FI2WNSBO.js} +71 -26
- package/dist/chunks/{chunk-CXRQWOZ5.js → chunk-3YBDYOC4.js} +3 -3
- package/dist/chunks/{chunk-OOUTBLZ4.js → chunk-56EZERK4.js} +1 -1
- package/dist/chunks/chunk-6N4JPNFL.js +76 -0
- package/dist/chunks/{chunk-ZUX3P6BQ.js → chunk-727FH2NI.js} +1 -1
- package/dist/chunks/chunk-7BDPM5ST.js +11 -0
- package/dist/chunks/{chunk-LN447PY2.js → chunk-BCVYBYYT.js} +432 -2247
- package/dist/chunks/{chunk-7E6MUOEK.js → chunk-CWYGFU5B.js} +2 -2
- package/dist/chunks/{chunk-NOODWMCL.js → chunk-D4ADSZ7H.js} +1 -1
- package/dist/chunks/{chunk-WFFNM65B.js → chunk-ETNJSKMM.js} +281 -29
- package/dist/chunks/{chunk-CAQNBBQA.js → chunk-F4E4EM35.js} +3 -3
- package/dist/chunks/{chunk-4CTESSKI.js → chunk-FAZTGX7S.js} +6 -6
- package/dist/chunks/chunk-FRZKBMSW.js +2562 -0
- package/dist/chunks/{chunk-BYBSCN4X.js → chunk-G7PQWD4L.js} +6 -3
- package/dist/chunks/{chunk-NJKREDA3.js → chunk-GAMZLAG2.js} +1 -1
- package/dist/chunks/{chunk-FLS4DPGP.js → chunk-GM6J7Q4B.js} +28 -15
- package/dist/chunks/{chunk-NETCCARD.js → chunk-GRDRG6HP.js} +3 -3
- package/dist/chunks/chunk-HIT4Y6OI.js +1238 -0
- package/dist/chunks/{chunk-EZALDOQH.js → chunk-HP7JIYMT.js} +5 -2
- package/dist/chunks/{chunk-IZSSVYAG.js → chunk-IAZ3UPY6.js} +3 -3
- package/dist/chunks/{chunk-ZEDWSH32.js → chunk-IC62NFM5.js} +1 -1
- package/dist/chunks/{chunk-P26ZWSKU.js → chunk-KIHNAS25.js} +5 -2
- package/dist/chunks/{chunk-57IECMWX.js → chunk-N4M2DDFE.js} +29 -15
- package/dist/chunks/{chunk-JWRZM2H2.js → chunk-OF4S23UB.js} +4 -4
- package/dist/chunks/{chunk-VNBU55SL.js → chunk-PC7VKEB5.js} +80 -2458
- package/dist/chunks/{chunk-G2JSIUWF.js → chunk-PUQS5MWL.js} +91 -2
- package/dist/chunks/{chunk-E7OK5WD5.js → chunk-Q4OYAQYH.js} +5 -5
- package/dist/chunks/{chunk-7BRU4EFH.js → chunk-QVSWRLLU.js} +35 -6
- package/dist/chunks/{chunk-T6EGVBKU.js → chunk-TA7FXXJD.js} +6 -3
- package/dist/chunks/{chunk-GPMFD4RD.js → chunk-TXUG266F.js} +1 -1
- package/dist/chunks/{chunk-4TEDNCON.js → chunk-UFIT2UU3.js} +354 -56
- package/dist/chunks/{chunk-LUSPKZKY.js → chunk-UG5G54VL.js} +1 -0
- package/dist/chunks/{chunk-NIAJ5ZCG.js → chunk-UL5XUQ25.js} +5 -2
- package/dist/chunks/{chunk-FMPJJYYI.js → chunk-WRXSAVKO.js} +1 -1
- package/dist/chunks/{chunk-7U577Q7U.js → chunk-WSF4NNMR.js} +3 -3
- package/dist/chunks/chunk-XHK4MDR5.js +2497 -0
- package/dist/chunks/{chunk-LFMSDBZN.js → chunk-XNIK66I4.js} +326 -161
- package/dist/chunks/{chunk-3SO6QL6U.js → chunk-YWX377BY.js} +5 -2
- package/dist/chunks/{chunk-BYATLLEF.js → chunk-Z3GDFVJR.js} +1 -1
- package/dist/chunks/{chunk-I566ZYNF.js → chunk-Z7VYWPZV.js} +1 -1
- package/dist/chunks/{conflict-VR55AOOO.js → conflict-ARLSZJ6V.js} +4 -3
- package/dist/chunks/{continuation-2CKSBLA6.js → continuation-3S37AUSH.js} +4 -3
- package/dist/chunks/{continuation-RN6PZN2M.js → continuation-3XLYYTKV.js} +4 -3
- package/dist/chunks/{continuation-HZIZRZBX.js → continuation-HFW2YT5S.js} +4 -3
- package/dist/chunks/{continuation-NLECEJPX.js → continuation-KI7DRRZN.js} +4 -3
- package/dist/chunks/{contract-HI4FNPYE.js → contract-DNIIW5VJ.js} +13 -5
- package/dist/chunks/{cowork-HJLI353D.js → cowork-GMLRGVIW.js} +31 -14
- package/dist/chunks/create-flow-J22BO65E.js +56 -0
- package/dist/chunks/{ebuilder-form-HTGI63UU.js → ebuilder-form-ANV2FHYV.js} +12 -7
- package/dist/chunks/{ehr-GYXIYH3A.js → ehr-GSTGAIY3.js} +695 -1255
- package/dist/chunks/{employee-SAK2QYXX.js → employee-22BGJ3QS.js} +3 -3
- package/dist/chunks/{env-DW3G4HUO.js → env-BX3VRFS7.js} +4 -3
- package/dist/chunks/{esb-I5INCEFE.js → esb-ATAIASX2.js} +12 -7
- package/dist/chunks/{factory-TKXGXS6L.js → factory-PETTFME6.js} +3 -2
- package/dist/chunks/{fna-K2MHTQ24.js → fna-YEKBSFSX.js} +14 -8
- package/dist/chunks/{group-chat-VYBNMJLG.js → group-chat-BFVXAYFX.js} +7 -4
- package/dist/chunks/{host-D5SERMAJ.js → host-HRBXEPDQ.js} +5 -5
- package/dist/chunks/{host-JM4YVHFM.js → host-LR55CTHP.js} +5 -5
- package/dist/chunks/{host-L3VLITMT.js → host-SUOY6VYQ.js} +5 -5
- package/dist/chunks/{host-ZUQTJYYK.js → host-SZGV4UNT.js} +5 -5
- package/dist/chunks/{host-256GVCAH.js → host-WIKN2EJ5.js} +5 -5
- package/dist/chunks/{hrm-VLRBKTZB.js → hrm-NRDO4W5G.js} +11 -7
- package/dist/chunks/{im-QK3VTLXK.js → im-IQ2HN23S.js} +11 -10
- package/dist/chunks/{invoice-T5JTA32H.js → invoice-MNRW76PP.js} +636 -1768
- package/dist/chunks/{jiuchuanhui-P2FNEQVZ.js → jiuchuanhui-DTRBAX4N.js} +14 -6
- package/dist/chunks/{lazy-dispatch-XRRI46M6.js → lazy-dispatch-ZVWAI25B.js} +7 -6
- package/dist/chunks/{mail-3Y7MJ6PS.js → mail-ZVAUXOJA.js} +16 -14
- package/dist/chunks/{meeting-M7LTXGJE.js → meeting-FEVPZ67S.js} +21 -13
- package/dist/chunks/{okr-OBC6S67L.js → okr-SDH3E5RA.js} +12 -5
- package/dist/chunks/{operations-5QL3AECO.js → operations-62N6EP3C.js} +4 -3
- package/dist/chunks/{plan-5H6I53SK.js → plan-E35JFDI7.js} +12 -5
- package/dist/chunks/{project-L75QZV4S.js → project-73QXBAB2.js} +49 -25
- package/dist/chunks/reception-UWZVACBN.js +1899 -0
- package/dist/chunks/recruit-stage-4MAOCKFY.js +4770 -0
- package/dist/chunks/registry-IM5G23LS.js +24 -0
- package/dist/chunks/{registry-UGRBCBHO.js → registry-JDUS4E7D.js} +7 -6
- package/dist/chunks/{registry-RXPN6BBT.js → registry-KNKSCJNT.js} +7 -6
- package/dist/chunks/{registry-NYPYMZXG.js → registry-PO7SI256.js} +4 -4
- package/dist/chunks/{registry-QGHFNUWS.js → registry-PVUZQDDQ.js} +3 -3
- package/dist/chunks/{room-recommend-A3UDC3CA.js → room-recommend-H7KLXA5R.js} +6 -5
- package/dist/chunks/{schedule-5GCACCK7.js → schedule-ESZIBAUO.js} +6 -5
- package/dist/chunks/{workflow-M5ZJ7DWF.js → workflow-CWJFJLQU.js} +15 -10
- package/dist/cmd/action.js +6 -0
- package/dist/cmd/identity/index.js +45 -0
- package/dist/cmd/index.js +2 -0
- package/dist/core/continuation-ttl.js +18 -0
- package/dist/core/error-codes.js +85 -0
- package/dist/core/logger.js +11 -0
- package/dist/index.js +41 -30
- package/dist/internal/e10/auth/commands.js +164 -8
- package/dist/internal/e10/auth/error-log.js +182 -0
- package/dist/internal/e10/auth/messages.js +6 -0
- package/dist/internal/e10/auth/session.js +34 -3
- package/dist/internal/e10/auth/xiaoe.js +286 -44
- package/dist/internal/e10/auth-recovery.js +72 -14
- package/dist/internal/e10/context.js +72 -13
- package/dist/internal/e10/index.js +1 -1
- package/dist/internal/e10/network-error.js +93 -0
- package/dist/internal/e10/request-runtime.js +6 -0
- package/dist/internal/skills/install.js +9 -1
- package/dist/shortcuts/archive/continuation.js +2 -1
- package/dist/shortcuts/archive/index.js +3 -0
- package/dist/shortcuts/archive/operations/confirm.js +2 -1
- package/dist/shortcuts/archive-oa/continuation.js +2 -1
- package/dist/shortcuts/archive-oa/index.js +2 -0
- package/dist/shortcuts/archive-oa/operations/confirm.js +2 -1
- package/dist/shortcuts/asset/continuation.js +2 -1
- package/dist/shortcuts/asset/index.js +2 -0
- package/dist/shortcuts/asset-idle/index.js +2 -0
- package/dist/shortcuts/blog/continuation.js +2 -1
- package/dist/shortcuts/blog/index.js +2 -0
- package/dist/shortcuts/caizhilian/continuation.js +2 -1
- package/dist/shortcuts/caizhilian/index.js +2 -0
- package/dist/shortcuts/caizhilian/operations/confirm.js +3 -2
- package/dist/shortcuts/calendar/continuation.js +2 -1
- package/dist/shortcuts/calendar/index.js +2 -0
- package/dist/shortcuts/calendar/operations/read.js +31 -22
- package/dist/shortcuts/calendar/operations/write.js +46 -2
- package/dist/shortcuts/contract/continuation.js +2 -1
- package/dist/shortcuts/contract/index.js +2 -0
- package/dist/shortcuts/contract/operations/write.js +2 -1
- package/dist/shortcuts/cowork/continuation.js +2 -1
- package/dist/shortcuts/cowork/index.js +2 -0
- package/dist/shortcuts/cowork/operations/discuss-write.js +5 -1
- package/dist/shortcuts/cowork/operations/item-write.js +1 -7
- package/dist/shortcuts/cowork/operations/member-write.js +3 -1
- package/dist/shortcuts/cowork/operations/permission-write.js +5 -1
- package/dist/shortcuts/cowork/operations/shared.js +7 -0
- package/dist/shortcuts/ebuilder-form/continuation.js +2 -1
- package/dist/shortcuts/ebuilder-form/index.js +2 -0
- package/dist/shortcuts/ebuilder-form/operations/write.js +3 -2
- package/dist/shortcuts/ehr/continuation.js +2 -1
- package/dist/shortcuts/ehr/index.js +2 -0
- package/dist/shortcuts/ehr/operations/attend-write.js +44 -2
- package/dist/shortcuts/ehr/operations/hr-contact.js +7 -4
- package/dist/shortcuts/ehr/operations/hr-report.js +13 -7
- package/dist/shortcuts/ehr/operations/recruit-candidate-import.js +317 -63
- package/dist/shortcuts/ehr/operations/recruit-position.js +134 -2
- package/dist/shortcuts/ehr/operations/recruit-write.js +263 -18
- package/dist/shortcuts/ehr/operations/recruit.js +10 -4
- package/dist/shortcuts/ehr/operations/shared.js +47 -0
- package/dist/shortcuts/esb/continuation.js +2 -1
- package/dist/shortcuts/esb/index.js +2 -0
- package/dist/shortcuts/esb/operations/trigger.js +2 -1
- package/dist/shortcuts/fna/continuation.js +2 -1
- package/dist/shortcuts/fna/index.js +2 -0
- package/dist/shortcuts/fna/operations/invoice-writeoff.js +1 -1
- package/dist/shortcuts/fna/operations/loan.js +1 -1
- package/dist/shortcuts/hrm/index.js +2 -0
- package/dist/shortcuts/hrm/operations/org.js +118 -0
- package/dist/shortcuts/im/continuation.js +2 -1
- package/dist/shortcuts/index.js +10 -0
- package/dist/shortcuts/invoice/continuation.js +2 -1
- package/dist/shortcuts/invoice/index.js +14 -15
- package/dist/shortcuts/invoice/invoice-record.js +93 -0
- package/dist/shortcuts/invoice/manifest.js +190 -393
- package/dist/shortcuts/invoice/operations/add.js +2 -1
- package/dist/shortcuts/invoice/operations/delete.js +2 -1
- package/dist/shortcuts/invoice/operations/import.js +2 -1
- package/dist/shortcuts/invoice/operations/issuing-contract-detail.js +86 -0
- package/dist/shortcuts/invoice/operations/issuing-contracts.js +210 -0
- package/dist/shortcuts/invoice/operations/registry.js +17 -17
- package/dist/shortcuts/invoice/operations/reim-auto.js +4 -569
- package/dist/shortcuts/invoice/operations/reim.js +52 -341
- package/dist/shortcuts/invoice/operations/shared.js +21 -4
- package/dist/shortcuts/invoice/operations/update.js +2 -1
- package/dist/shortcuts/invoice/projection.js +10 -62
- package/dist/shortcuts/jiuchuanhui/continuation.js +2 -1
- package/dist/shortcuts/jiuchuanhui/index.js +2 -0
- package/dist/shortcuts/jiuchuanhui/operations/datajson.js +2 -1
- package/dist/shortcuts/jiuchuanhui/operations/esb.js +2 -1
- package/dist/shortcuts/mail/continuation.js +2 -1
- package/dist/shortcuts/mail/index.js +2 -0
- package/dist/shortcuts/mail/operations/mail-blacklist.js +1 -1
- package/dist/shortcuts/mail/operations/mail-contacts.js +1 -1
- package/dist/shortcuts/mail/operations/mail-send.js +1 -1
- package/dist/shortcuts/mail/operations/mail-sign.js +1 -1
- package/dist/shortcuts/mail/operations/mail-template.js +1 -1
- package/dist/shortcuts/meeting/continuation.js +2 -1
- package/dist/shortcuts/meeting/index.js +2 -0
- package/dist/shortcuts/meeting/operations/change.js +1 -1
- package/dist/shortcuts/meeting/operations/create.js +1 -1
- package/dist/shortcuts/meeting/operations/eb/catalog.js +4 -1
- package/dist/shortcuts/meeting/operations/eb/create-flow.js +101 -35
- package/dist/shortcuts/meeting/operations/eb/decision.js +1 -1
- package/dist/shortcuts/meeting/operations/eb/factory.js +34 -1
- package/dist/shortcuts/meeting/operations/eb/group-chat.js +25 -3
- package/dist/shortcuts/meeting/operations/eb/person-cache.js +96 -0
- package/dist/shortcuts/meeting/operations/eb/room-recommend.js +33 -11
- package/dist/shortcuts/meeting/operations/lifecycle.js +1 -1
- package/dist/shortcuts/meeting/operations/receipts.js +1 -1
- package/dist/shortcuts/meeting/operations/signs.js +1 -1
- package/dist/shortcuts/okr/continuation.js +2 -1
- package/dist/shortcuts/okr/index.js +2 -0
- package/dist/shortcuts/okr/operations/write.js +1 -1
- package/dist/shortcuts/plan/continuation.js +2 -1
- package/dist/shortcuts/plan/index.js +2 -0
- package/dist/shortcuts/plan/operations/write.js +1 -1
- package/dist/shortcuts/project/continuation.js +2 -1
- package/dist/shortcuts/project/index.js +2 -0
- package/dist/shortcuts/project/operations/read.js +6 -25
- package/dist/shortcuts/project/operations/shared.js +22 -0
- package/dist/shortcuts/project/operations/write.js +28 -2
- package/dist/shortcuts/reception/constants.js +53 -0
- package/dist/shortcuts/reception/errors.js +54 -0
- package/dist/shortcuts/reception/host.js +125 -0
- package/dist/shortcuts/reception/index.js +198 -0
- package/dist/shortcuts/reception/manifest.js +177 -0
- package/dist/shortcuts/reception/operations/ask.js +71 -0
- package/dist/shortcuts/reception/operations/browsertool.js +58 -0
- package/dist/shortcuts/reception/operations/compose.js +129 -0
- package/dist/shortcuts/reception/operations/customparams.js +74 -0
- package/dist/shortcuts/reception/operations/doc.js +238 -0
- package/dist/shortcuts/reception/operations/docrender.js +36 -0
- package/dist/shortcuts/reception/operations/panels.js +179 -0
- package/dist/shortcuts/reception/operations/registry.js +26 -0
- package/dist/shortcuts/reception/operations/render-assets.js +184 -0
- package/dist/shortcuts/reception/operations/render.js +123 -0
- package/dist/shortcuts/reception/operations/runs.js +38 -0
- package/dist/shortcuts/reception/operations/schedule.js +127 -0
- package/dist/shortcuts/reception/operations/shared.js +196 -0
- package/dist/shortcuts/reception/operations/snapshot.js +68 -0
- package/dist/shortcuts/reception/operations/types.js +1 -0
- package/dist/shortcuts/reception/operations.js +33 -0
- package/dist/shortcuts/reception/upload.js +218 -0
- package/dist/shortcuts/recruit-stage/context.js +231 -0
- package/dist/shortcuts/recruit-stage/continuation.js +74 -0
- package/dist/shortcuts/recruit-stage/errors.js +65 -0
- package/dist/shortcuts/recruit-stage/host.js +109 -0
- package/dist/shortcuts/recruit-stage/index.js +115 -0
- package/dist/shortcuts/recruit-stage/manifest.js +29 -0
- package/dist/shortcuts/recruit-stage/operations/interview-arrange.js +722 -0
- package/dist/shortcuts/recruit-stage/operations/interview-feedback.js +269 -0
- package/dist/shortcuts/recruit-stage/operations/jd-create.js +719 -0
- package/dist/shortcuts/recruit-stage/operations/list.js +431 -0
- package/dist/shortcuts/recruit-stage/operations/registry.js +38 -0
- package/dist/shortcuts/recruit-stage/operations/resume-import.js +1354 -0
- package/dist/shortcuts/recruit-stage/operations/search.js +158 -0
- package/dist/shortcuts/recruit-stage/operations/types.js +25 -0
- package/dist/shortcuts/recruit-stage/school-tiers.json +318 -0
- package/dist/shortcuts/recruit-stage/shared.js +608 -0
- package/dist/shortcuts/workflow/continuation.js +2 -1
- package/dist/shortcuts/workflow/index.js +2 -0
- package/dist/shortcuts/workflow/operations/form.js +32 -8
- package/dist/shortcuts/workflow/operations/todoSmartConvert/detailFieldRules.js +4 -2
- package/dist/shortcuts/workflow/operations/todoSmartConvert/summaryCache.js +13 -6
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailCache.js +17 -24
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailFetcher.js +14 -9
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +50 -8
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +2 -1
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.detail.js +17 -11
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +7 -39
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +3 -2
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +51 -15
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.pipeline.js +16 -1
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +151 -63
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.subGroup.js +56 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +39 -14
- package/dist/shortcuts/workflow/operations/write.js +1 -1
- package/docs/_catalog.md +3 -0
- package/docs/agent-invoice.md +1 -1
- package/docs/archive-oa.md +1 -1
- package/docs/caizhilian.md +1 -1
- package/docs/calendar.md +1 -1
- package/docs/contract.md +1 -1
- package/docs/e10-auth.md +23 -1
- package/docs/ehr.md +2 -2
- package/docs/esb.md +1 -1
- package/docs/im.md +1 -1
- package/docs/invoice.md +8 -12
- package/docs/okr.md +1 -1
- package/docs/operation-manual.md +8 -0
- package/docs/reception.md +119 -0
- package/package.json +1 -1
- package/scripts/clean.mjs +43 -2
- package/scripts/install-skill-to-xiaoe.mjs +105 -0
- package/scripts/package-skill.mjs +4 -2
- package/skill-template/business-info.json +42 -2
- package/skill-template/domains/caizhilian.md +1 -1
- package/skill-template/domains/reception-flow.md +18 -0
- package/skill-template/domains/recruit-stage.md +29 -0
- package/skill-template/domains/yepiaotong.md +4 -7
- package/skills/weaver-e10-archive-oa/references/source-manifest.json +14 -14
- package/skills/weaver-e10-blog/references/blog-publish.md +1 -1
- package/skills/weaver-e10-blog/references/source-manifest.json +7 -7
- package/skills/weaver-e10-caizhilian/references/source-manifest.json +21 -21
- package/skills/weaver-e10-caizhilian/references/write-protocol.md +2 -2
- package/skills/weaver-e10-calendar/SKILL.md +2 -1
- package/skills/weaver-e10-calendar/references/calendar-write.md +55 -1
- package/skills/weaver-e10-cowork/SKILL.md +1 -1
- package/skills/weaver-e10-cowork/references/cowork-write.md +3 -1
- package/skills/weaver-e10-ebuilder-form/SKILL.md +1 -1
- package/skills/weaver-e10-ebuilder-form/references/custom-api.md +1 -1
- package/skills/weaver-e10-ebuilder-form/references/openapi-write.md +1 -1
- package/skills/weaver-e10-esb/SKILL.md +2 -2
- package/skills/weaver-e10-esb/references/source-manifest.json +22 -22
- package/skills/weaver-e10-esb/references/trigger.md +2 -2
- package/skills/weaver-e10-jinchengda/references/contract-clause-library-crud.md +1 -1
- package/skills/weaver-e10-jinchengda/references/contract-clause-reference-save.md +1 -1
- package/skills/weaver-e10-jinchengda/references/contract-request-write.md +1 -1
- package/skills/weaver-e10-jinchengda/references/source-manifest.json +29 -29
- package/skills/weaver-e10-jucailin/SKILL.md +1 -1
- package/skills/weaver-e10-jucailin/references/attend-write.md +10 -2
- package/skills/weaver-e10-jucailin/references/hr-contact.md +8 -0
- package/skills/weaver-e10-jucailin/references/hr-report.md +8 -0
- package/skills/weaver-e10-jucailin/references/recruit-create.md +14 -5
- package/skills/weaver-e10-jucailin/references/recruit-read.md +1 -1
- package/skills/weaver-e10-jucailin/references/recruit-write.md +5 -4
- package/skills/weaver-e10-mail/SKILL.md +1 -1
- package/skills/weaver-e10-meeting/SKILL.md +39 -7
- package/skills/weaver-e10-meeting/references/meeting-change.md +1 -1
- package/skills/weaver-e10-meeting/references/meeting-create.md +1 -1
- package/skills/weaver-e10-meeting/references/meeting-lifecycle.md +1 -1
- package/skills/weaver-e10-meeting/references/meeting-verification.md +1 -1
- package/skills/weaver-e10-okr/references/okr-align.md +1 -1
- package/skills/weaver-e10-okr/references/okr-keyresult.md +1 -1
- package/skills/weaver-e10-okr/references/okr-write.md +1 -1
- package/skills/weaver-e10-okr/references/source-manifest.json +8 -8
- package/skills/weaver-e10-plan/references/plan-report-write.md +1 -1
- package/skills/weaver-e10-plan/references/source-manifest.json +20 -20
- package/skills/weaver-e10-qiyecheng/references/loan-management.md +1 -1
- package/skills/weaver-e10-qiyecheng/references/source-manifest.json +18 -18
- package/skills/weaver-e10-reception-flow/SKILL.md +173 -0
- 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
- package/skills/weaver-e10-reception-flow/data/fields-snapshot.json +213 -0
- package/skills/weaver-e10-reception-flow/references/browsertool.md +68 -0
- package/skills/weaver-e10-reception-flow/references/env-pitfalls.md +51 -0
- package/skills/weaver-e10-reception-flow/references/fields-snapshot.md +227 -0
- package/skills/weaver-e10-reception-flow/references/guide.md +179 -0
- package/skills/weaver-e10-reception-flow/scripts/locate.sh +14 -0
- package/skills/weaver-e10-reception-flow/scripts/render.py +724 -0
- package/skills/weaver-e10-recruit-stage/SKILL.md +230 -0
- package/skills/weaver-e10-recruit-stage/agents/openai.yaml +119 -0
- package/skills/weaver-e10-recruit-stage/lib/recruit-xiaoe-file.mjs +188 -0
- package/skills/weaver-e10-recruit-stage/lib/xiaoe-session.mjs +66 -0
- package/skills/weaver-e10-recruit-stage/references/position-templates.md +202 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-arrange-interview.md +322 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-capability-check.md +127 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-check-install.md +65 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-detail-process.md +63 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-edit-interview-feedback.md +142 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-jd-create.md +95 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-jd-template.md +56 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-list-candidate.md +101 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-list-interview.md +148 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-match-candidates.md +77 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-output-links.md +59 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-resolve-creator.md +69 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-resolve-metadata.md +241 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-resume-import.md +451 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-resume-parse.md +128 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-search-candidate.md +146 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-urge-feedback.md +69 -0
- package/skills/weaver-e10-shared/SKILL.md +1 -1
- package/skills/weaver-e10-shared/references/e10-auth-and-session.md +10 -2
- package/skills/weaver-e10-shijingran/SKILL.md +7 -6
- package/skills/weaver-e10-shijingran/references/operations.md +3 -1
- package/skills/weaver-e10-shijingran/references/source-manifest.json +30 -28
- package/skills/weaver-e10-shijingran/references/write-operations.md +2 -0
- package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +2 -0
- package/skills/weaver-e10-wenshuding/references/source-manifest.json +3 -3
- package/skills/weaver-e10-workflow/SKILL.md +4 -2
- package/skills/weaver-e10-workflow/aigroup/default.json +11 -9
- package/skills/weaver-e10-workflow/references/source-manifest.json +32 -32
- package/skills/weaver-e10-workflow/references/todo-smart-convert.md +23 -13
- package/skills/weaver-e10-workflow/tools/todo-summary.cjs +62 -20
- package/skills/weaver-e10-yepiaotong/SKILL.md +28 -36
- package/skills/weaver-e10-yepiaotong/references/invoice-agent-entry.md +6 -3
- package/skills/weaver-e10-yepiaotong/references/invoice-detail.md +13 -10
- package/skills/weaver-e10-yepiaotong/references/invoice-enterprise-list.md +2 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-workflow.md +194 -155
- package/skills/weaver-e10-yepiaotong/references/invoice-output-view.md +28 -32
- package/skills/weaver-e10-yepiaotong/references/invoice-personal-list.md +5 -1
- package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +8 -10
- package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +211 -616
- package/skills/weaver-e10-yepiaotong/references/reim-examples.md +149 -117
- package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +17 -20
- package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +20 -39
- package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +55 -22
- package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +7 -17
- package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +88 -92
- package/skills/weaver-e10-yepiaotong/references/source-manifest.json +144 -354
- package/skills/weaver-e10-yimiaoban/SKILL.md +1 -1
- package/skills/weaver-e10-yimiaoban/references/msg-write.md +1 -1
- package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +1 -1
- package/skills/weaver-e10-yimiaoban/references/source-manifest.json +7 -7
- package/dist/chunks/chunk-SPRHHSVC.js +0 -465
- package/dist/chunks/registry-KMHCPAAD.js +0 -22
- package/dist/shortcuts/invoice/markdown.js +0 -172
- package/dist/shortcuts/invoice/operations/issuing-qys.js +0 -424
- package/skills/weaver-e10-meeting.zip +0 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +0 -131
- 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
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
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
|
-
|
|
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
|
-
|
|
586
|
-
|
|
587
|
-
|
|
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'
|
|
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 =
|
|
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:
|
|
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 =
|
|
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
|
}
|