weaver-work-cli 0.1.2 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +176 -78
- package/dist/cmd/setup/index.js +5 -5
- package/dist/cmd/skills/index.js +1 -1
- package/dist/core/hooks.js +7 -0
- package/dist/index.js +0 -0
- package/dist/internal/e10/auth/commands.js +159 -54
- package/dist/internal/e10/auth/xiaoe.js +268 -0
- package/dist/internal/e10/context.js +16 -2
- package/dist/internal/e10/index.js +1 -0
- package/dist/internal/e10/request-runtime.js +345 -0
- package/dist/internal/skills/install.js +48 -6
- package/dist/internal/skills/reader.js +27 -0
- package/dist/shortcuts/archive/continuation.js +70 -0
- package/dist/shortcuts/archive/errors.js +53 -0
- package/dist/shortcuts/archive/host.js +197 -0
- package/dist/shortcuts/archive/index.js +363 -0
- package/dist/shortcuts/archive/manifest.js +45 -0
- package/dist/shortcuts/archive/operations/archive-info.js +55 -0
- package/dist/shortcuts/archive/operations/borrow-car.js +146 -0
- package/dist/shortcuts/archive/operations/borrow-list.js +200 -0
- package/dist/shortcuts/archive/operations/confirm.js +46 -0
- package/dist/shortcuts/archive/operations/download.js +238 -0
- package/dist/shortcuts/archive/operations/flow-url.js +240 -0
- package/dist/shortcuts/archive/operations/fonds.js +95 -0
- package/dist/shortcuts/archive/operations/getPageUrl.js +137 -0
- package/dist/shortcuts/archive/operations/registry.js +43 -0
- package/dist/shortcuts/archive/operations/search.js +88 -0
- package/dist/shortcuts/archive/operations/shared.js +120 -0
- package/dist/shortcuts/archive/operations/types.js +23 -0
- package/dist/shortcuts/archive/operations/upload.js +182 -0
- package/dist/shortcuts/archive/operations.js +13 -0
- package/dist/shortcuts/archive/render/search-format.js +276 -0
- package/dist/shortcuts/archive/render/search-view.js +125 -0
- package/dist/shortcuts/asset/continuation.js +70 -0
- package/dist/shortcuts/asset/errors.js +67 -0
- package/dist/shortcuts/asset/host.js +438 -0
- package/dist/shortcuts/asset/index.js +255 -0
- package/dist/shortcuts/asset/manifest.js +471 -0
- package/dist/shortcuts/asset/operations/query.js +249 -0
- package/dist/shortcuts/asset/operations/registry.js +85 -0
- package/dist/shortcuts/asset/operations/shared.js +100 -0
- package/dist/shortcuts/asset/operations/type-cache.js +49 -0
- package/dist/shortcuts/asset/operations/types.js +1 -0
- package/dist/shortcuts/asset/operations/viewlink.js +117 -0
- package/dist/shortcuts/asset/operations/write.js +435 -0
- package/dist/shortcuts/asset/operations.js +9 -0
- package/dist/shortcuts/calendar/continuation.js +70 -0
- package/dist/shortcuts/calendar/errors.js +53 -0
- package/dist/shortcuts/calendar/host.js +148 -0
- package/dist/shortcuts/calendar/index.js +125 -0
- package/dist/shortcuts/calendar/manifest.js +26 -0
- package/dist/shortcuts/calendar/operations/read.js +259 -0
- package/dist/shortcuts/calendar/operations/registry.js +31 -0
- package/dist/shortcuts/calendar/operations/shared.js +132 -0
- package/dist/shortcuts/calendar/operations/types.js +25 -0
- package/dist/shortcuts/calendar/operations/write.js +439 -0
- package/dist/shortcuts/calendar/operations.js +8 -0
- package/dist/shortcuts/ehr/continuation.js +70 -0
- package/dist/shortcuts/ehr/errors.js +53 -0
- package/dist/shortcuts/ehr/host.js +213 -0
- package/dist/shortcuts/ehr/index.js +205 -0
- package/dist/shortcuts/ehr/manifest.js +47 -0
- package/dist/shortcuts/ehr/operations/attend-read.js +373 -0
- package/dist/shortcuts/ehr/operations/attend-write.js +514 -0
- package/dist/shortcuts/ehr/operations/hr-contact.js +363 -0
- package/dist/shortcuts/ehr/operations/hr-ds.js +298 -0
- package/dist/shortcuts/ehr/operations/hr-report.js +386 -0
- package/dist/shortcuts/ehr/operations/recruit-write.js +1629 -0
- package/dist/shortcuts/ehr/operations/recruit.js +803 -0
- package/dist/shortcuts/ehr/operations/registry.js +43 -0
- package/dist/shortcuts/ehr/operations/salary.js +319 -0
- package/dist/shortcuts/ehr/operations/shared.js +246 -0
- package/dist/shortcuts/ehr/operations/types.js +25 -0
- package/dist/shortcuts/ehr/operations.js +25 -0
- package/dist/shortcuts/esb/continuation.js +70 -0
- package/dist/shortcuts/esb/errors.js +65 -0
- package/dist/shortcuts/esb/host.js +187 -0
- package/dist/shortcuts/esb/index.js +112 -0
- package/dist/shortcuts/esb/manifest.js +91 -0
- package/dist/shortcuts/esb/operations/input-format.js +31 -0
- package/dist/shortcuts/esb/operations/registry.js +48 -0
- package/dist/shortcuts/esb/operations/shared.js +152 -0
- package/dist/shortcuts/esb/operations/trigger.js +76 -0
- package/dist/shortcuts/esb/operations/types.js +21 -0
- package/dist/shortcuts/esb/operations.js +15 -0
- package/dist/shortcuts/fna/continuation.js +70 -0
- package/dist/shortcuts/fna/errors.js +59 -0
- package/dist/shortcuts/fna/host.js +146 -0
- package/dist/shortcuts/fna/index.js +111 -0
- package/dist/shortcuts/fna/manifest.js +41 -0
- package/dist/shortcuts/fna/operations/budget.js +124 -0
- package/dist/shortcuts/fna/operations/expense-center.js +148 -0
- package/dist/shortcuts/fna/operations/invoice-writeoff.js +212 -0
- package/dist/shortcuts/fna/operations/loan.js +195 -0
- package/dist/shortcuts/fna/operations/registry.js +35 -0
- package/dist/shortcuts/fna/operations/shared.js +210 -0
- package/dist/shortcuts/fna/operations/types.js +25 -0
- package/dist/shortcuts/fna/operations.js +19 -0
- package/dist/shortcuts/hrm/errors.js +38 -0
- package/dist/shortcuts/hrm/host.js +156 -0
- package/dist/shortcuts/hrm/index.js +111 -0
- package/dist/shortcuts/hrm/manifest.js +32 -0
- package/dist/shortcuts/hrm/operations/employee.js +338 -0
- package/dist/shortcuts/hrm/operations/org.js +110 -0
- package/dist/shortcuts/hrm/operations/position.js +176 -0
- package/dist/shortcuts/hrm/operations/registry.js +33 -0
- package/dist/shortcuts/hrm/operations/shared.js +143 -0
- package/dist/shortcuts/hrm/operations/types.js +23 -0
- package/dist/shortcuts/hrm/operations.js +19 -0
- package/dist/shortcuts/index.js +24 -0
- package/dist/shortcuts/invoice/host.js +99 -94
- package/dist/shortcuts/invoice/index.js +58 -59
- package/dist/shortcuts/invoice/manifest.js +200 -3
- package/dist/shortcuts/invoice/operations/browse-field.js +17 -0
- package/dist/shortcuts/invoice/operations/issuing.js +198 -0
- package/dist/shortcuts/invoice/operations/registry.js +17 -0
- package/dist/shortcuts/invoice/operations/reim.js +401 -0
- package/dist/shortcuts/invoice/operations/shared.js +247 -0
- package/dist/shortcuts/jiuchuanhui/cache.js +441 -0
- package/dist/shortcuts/jiuchuanhui/continuation.js +70 -0
- package/dist/shortcuts/jiuchuanhui/errors.js +59 -0
- package/dist/shortcuts/jiuchuanhui/host.js +159 -0
- package/dist/shortcuts/jiuchuanhui/index.js +109 -0
- package/dist/shortcuts/jiuchuanhui/manifest.js +469 -0
- package/dist/shortcuts/jiuchuanhui/operations/datajson.js +214 -0
- package/dist/shortcuts/jiuchuanhui/operations/esb.js +157 -0
- package/dist/shortcuts/jiuchuanhui/operations/generic.js +146 -0
- package/dist/shortcuts/jiuchuanhui/operations/registry.js +133 -0
- package/dist/shortcuts/jiuchuanhui/operations/shared.js +158 -0
- package/dist/shortcuts/jiuchuanhui/operations/types.js +1 -0
- package/dist/shortcuts/jiuchuanhui/operations.js +8 -0
- package/dist/shortcuts/mail/continuation.js +70 -0
- package/dist/shortcuts/mail/errors.js +53 -0
- package/dist/shortcuts/mail/host.js +182 -0
- package/dist/shortcuts/mail/index.js +519 -0
- package/dist/shortcuts/mail/manifest.js +38 -0
- package/dist/shortcuts/mail/operations/mail-blacklist.js +79 -0
- package/dist/shortcuts/mail/operations/mail-contacts.js +195 -0
- package/dist/shortcuts/mail/operations/mail-manage.js +335 -0
- package/dist/shortcuts/mail/operations/mail-read.js +508 -0
- package/dist/shortcuts/mail/operations/mail-send.js +474 -0
- package/dist/shortcuts/mail/operations/mail-sign.js +203 -0
- package/dist/shortcuts/mail/operations/mail-template.js +170 -0
- package/dist/shortcuts/mail/operations/registry.js +41 -0
- package/dist/shortcuts/mail/operations/shared.js +64 -0
- package/dist/shortcuts/mail/operations/types.js +27 -0
- package/dist/shortcuts/mail/operations.js +19 -0
- package/dist/shortcuts/meeting/continuation.js +70 -0
- package/dist/shortcuts/meeting/errors.js +63 -0
- package/dist/shortcuts/meeting/host.js +167 -0
- package/dist/shortcuts/meeting/index.js +123 -0
- package/dist/shortcuts/meeting/manifest.js +64 -0
- package/dist/shortcuts/meeting/operations/catalogs.js +58 -0
- package/dist/shortcuts/meeting/operations/change.js +242 -0
- package/dist/shortcuts/meeting/operations/conflicts.js +142 -0
- package/dist/shortcuts/meeting/operations/create.js +349 -0
- package/dist/shortcuts/meeting/operations/env.js +191 -0
- package/dist/shortcuts/meeting/operations/lifecycle.js +139 -0
- package/dist/shortcuts/meeting/operations/meetings.js +73 -0
- package/dist/shortcuts/meeting/operations/receipts.js +195 -0
- package/dist/shortcuts/meeting/operations/registry.js +47 -0
- package/dist/shortcuts/meeting/operations/rooms.js +132 -0
- package/dist/shortcuts/meeting/operations/shared.js +112 -0
- package/dist/shortcuts/meeting/operations/signs.js +41 -0
- package/dist/shortcuts/meeting/operations/types.js +25 -0
- package/dist/shortcuts/meeting/operations.js +19 -0
- package/dist/shortcuts/plan/continuation.js +70 -0
- package/dist/shortcuts/plan/errors.js +70 -0
- package/dist/shortcuts/plan/host.js +180 -0
- package/dist/shortcuts/plan/index.js +150 -0
- package/dist/shortcuts/plan/manifest.js +53 -0
- package/dist/shortcuts/plan/operations/link.js +256 -0
- package/dist/shortcuts/plan/operations/read.js +259 -0
- package/dist/shortcuts/plan/operations/registry.js +33 -0
- package/dist/shortcuts/plan/operations/shared.js +246 -0
- package/dist/shortcuts/plan/operations/types.js +49 -0
- package/dist/shortcuts/plan/operations/version.js +49 -0
- package/dist/shortcuts/plan/operations/write.js +710 -0
- package/dist/shortcuts/plan/operations.js +8 -0
- package/dist/shortcuts/yimiaoban/continuation.js +70 -0
- package/dist/shortcuts/yimiaoban/errors.js +61 -0
- package/dist/shortcuts/yimiaoban/host.js +469 -0
- package/dist/shortcuts/yimiaoban/index.js +271 -0
- package/dist/shortcuts/yimiaoban/manifest.js +28 -0
- package/dist/shortcuts/yimiaoban/operations/file-user.js +288 -0
- package/dist/shortcuts/yimiaoban/operations/group-read.js +477 -0
- package/dist/shortcuts/yimiaoban/operations/group-write.js +591 -0
- package/dist/shortcuts/yimiaoban/operations/msg-parse.js +429 -0
- package/dist/shortcuts/yimiaoban/operations/msg-sync.js +519 -0
- package/dist/shortcuts/yimiaoban/operations/msg-write.js +593 -0
- package/dist/shortcuts/yimiaoban/operations/person.js +102 -0
- package/dist/shortcuts/yimiaoban/operations/registry.js +38 -0
- package/dist/shortcuts/yimiaoban/operations/session.js +437 -0
- package/dist/shortcuts/yimiaoban/operations/shared.js +236 -0
- package/dist/shortcuts/yimiaoban/operations/types.js +27 -0
- package/dist/shortcuts/yimiaoban/operations/write-util.js +78 -0
- package/dist/shortcuts/yimiaoban/operations.js +8 -0
- package/docs/SKILL.md +11 -7
- package/docs/_catalog.md +28 -5
- package/docs/agent-invoice.md +19 -9
- package/docs/agent-skill-install.md +141 -22
- package/docs/calendar.md +87 -0
- package/docs/e10-auth.md +28 -9
- package/docs/ehr.md +186 -0
- package/docs/esb.md +64 -0
- package/docs/fna.md +72 -0
- package/docs/hrm.md +89 -0
- package/docs/invoice.md +61 -20
- package/docs/jiuchuanhui.md +131 -0
- package/docs/meeting.md +48 -0
- package/docs/operation-manual.md +443 -0
- package/docs/plan.md +82 -0
- package/docs/wenshuding.md +129 -0
- package/docs/yimiaoban.md +86 -0
- package/docs/ziguanjia.md +89 -0
- package/package.json +4 -4
- package/scripts/package-skill.mjs +127 -34
- package/scripts/postbuild.mjs +13 -0
- package/skill-template/business-info.json +16 -2
- package/skill-template/domains/calendar.md +15 -0
- package/skill-template/domains/esb.md +13 -0
- package/skill-template/domains/hrm.md +16 -0
- package/skill-template/domains/jiuchuanhui.md +23 -0
- package/skill-template/domains/jucailin.md +22 -0
- package/skill-template/domains/mail.md +21 -0
- package/skill-template/domains/meeting.md +3 -0
- package/skill-template/domains/plan.md +17 -0
- package/skill-template/domains/qiyecheng.md +17 -0
- package/skill-template/domains/shared.md +5 -3
- package/skill-template/domains/skill-maker.md +10 -0
- package/skill-template/domains/wenshuding.md +22 -0
- package/skill-template/domains/{invoice.md → yepiaotong.md} +4 -0
- package/skill-template/domains/yimiaoban.md +21 -0
- package/skill-template/domains/ziguanjia.md +21 -0
- package/skill-template/master-skill-template.md +12 -6
- package/skill-template/skill-template.md +26 -10
- package/skills/weaver-e10-calendar/SKILL.md +102 -0
- package/skills/weaver-e10-calendar/product.json +8 -0
- package/skills/weaver-e10-calendar/references/calendar-app-check.md +65 -0
- package/skills/weaver-e10-calendar/references/calendar-dict.md +55 -0
- package/skills/weaver-e10-calendar/references/calendar-query.md +70 -0
- package/skills/weaver-e10-calendar/references/calendar-write.md +97 -0
- package/skills/weaver-e10-calendar/references/source-manifest.json +54 -0
- package/skills/weaver-e10-esb/SKILL.md +103 -0
- package/skills/weaver-e10-esb/product.json +8 -0
- package/skills/weaver-e10-esb/references/input-format.md +52 -0
- package/skills/weaver-e10-esb/references/source-manifest.json +242 -0
- package/skills/weaver-e10-esb/references/trigger.md +99 -0
- package/skills/weaver-e10-hrm/SKILL.md +88 -0
- package/skills/weaver-e10-hrm/product.json +8 -0
- package/skills/weaver-e10-hrm/references/employee.md +109 -0
- package/skills/weaver-e10-hrm/references/org.md +95 -0
- package/skills/weaver-e10-hrm/references/position.md +95 -0
- package/skills/weaver-e10-hrm/references/source-manifest.json +121 -0
- package/skills/weaver-e10-jiuchuanhui/SKILL.md +175 -0
- package/skills/weaver-e10-jiuchuanhui/product.json +8 -0
- package/skills/weaver-e10-jiuchuanhui/references/cache.md +110 -0
- package/skills/weaver-e10-jiuchuanhui/references/clue.md +61 -0
- package/skills/weaver-e10-jiuchuanhui/references/contact-plan.md +56 -0
- package/skills/weaver-e10-jiuchuanhui/references/contact-records.md +48 -0
- package/skills/weaver-e10-jiuchuanhui/references/contact.md +56 -0
- package/skills/weaver-e10-jiuchuanhui/references/customer.md +69 -0
- package/skills/weaver-e10-jiuchuanhui/references/disabled-capabilities.md +24 -0
- package/skills/weaver-e10-jiuchuanhui/references/discovery-config.md +60 -0
- package/skills/weaver-e10-jiuchuanhui/references/general-helpers.md +59 -0
- package/skills/weaver-e10-jiuchuanhui/references/jiuchuanhui-entry.md +60 -0
- package/skills/weaver-e10-jiuchuanhui/references/sale.md +72 -0
- package/skills/weaver-e10-jiuchuanhui/references/source-manifest.json +2632 -0
- package/skills/weaver-e10-jucailin/SKILL.md +102 -0
- package/skills/weaver-e10-jucailin/product.json +8 -0
- package/skills/weaver-e10-jucailin/references/attend-read.md +73 -0
- package/skills/weaver-e10-jucailin/references/attend-write.md +82 -0
- package/skills/weaver-e10-jucailin/references/hr-contact.md +92 -0
- package/skills/weaver-e10-jucailin/references/hr-datasource.md +104 -0
- package/skills/weaver-e10-jucailin/references/hr-report.md +76 -0
- package/skills/weaver-e10-jucailin/references/recruit-read.md +76 -0
- package/skills/weaver-e10-jucailin/references/recruit-write.md +70 -0
- package/skills/weaver-e10-jucailin/references/safety-boundaries.md +35 -0
- package/skills/weaver-e10-jucailin/references/salary.md +110 -0
- package/skills/weaver-e10-jucailin/references/source-manifest.json +152 -0
- package/skills/weaver-e10-mail/SKILL.md +152 -0
- package/skills/weaver-e10-mail/product.json +8 -0
- package/skills/weaver-e10-mail/references/mail-agent-entry.md +47 -0
- package/skills/weaver-e10-mail/references/mail-attachment.md +30 -0
- package/skills/weaver-e10-mail/references/mail-blacklist.md +27 -0
- package/skills/weaver-e10-mail/references/mail-contacts.md +33 -0
- package/skills/weaver-e10-mail/references/mail-manage.md +44 -0
- package/skills/weaver-e10-mail/references/mail-read.md +76 -0
- package/skills/weaver-e10-mail/references/mail-send.md +43 -0
- package/skills/weaver-e10-mail/references/mail-sign.md +33 -0
- package/skills/weaver-e10-mail/references/mail-template.md +31 -0
- package/skills/weaver-e10-mail/references/safety-boundaries.md +32 -0
- package/skills/weaver-e10-meeting/SKILL.md +106 -0
- package/skills/weaver-e10-meeting/product.json +8 -0
- package/skills/weaver-e10-meeting/references/meeting-change.md +67 -0
- package/skills/weaver-e10-meeting/references/meeting-create.md +52 -0
- package/skills/weaver-e10-meeting/references/meeting-lifecycle.md +57 -0
- package/skills/weaver-e10-meeting/references/meeting-queries.md +61 -0
- package/skills/weaver-e10-meeting/references/meeting-receipts-signs.md +48 -0
- package/skills/weaver-e10-meeting/references/meeting-update.md +7 -0
- package/skills/weaver-e10-meeting/references/source-manifest.json +50 -0
- package/skills/weaver-e10-plan/SKILL.md +140 -0
- package/skills/weaver-e10-plan/product.json +8 -0
- package/skills/weaver-e10-plan/references/plan-collect-and-compose.md +123 -0
- package/skills/weaver-e10-plan/references/plan-overview-and-routing.md +138 -0
- package/skills/weaver-e10-plan/references/plan-report-query.md +154 -0
- package/skills/weaver-e10-plan/references/plan-report-remind.md +104 -0
- package/skills/weaver-e10-plan/references/plan-report-write.md +162 -0
- package/skills/weaver-e10-plan/references/source-manifest.json +858 -0
- package/skills/weaver-e10-qiyecheng/SKILL.md +119 -0
- package/skills/weaver-e10-qiyecheng/product.json +8 -0
- package/skills/weaver-e10-qiyecheng/references/budget.md +65 -0
- package/skills/weaver-e10-qiyecheng/references/catalog.md +56 -0
- package/skills/weaver-e10-qiyecheng/references/expense-center.md +51 -0
- package/skills/weaver-e10-qiyecheng/references/invoice-writeoff.md +57 -0
- package/skills/weaver-e10-qiyecheng/references/loan-management.md +59 -0
- package/skills/weaver-e10-qiyecheng/references/source-manifest.json +698 -0
- package/skills/weaver-e10-shared/SKILL.md +90 -0
- package/skills/weaver-e10-shared/references/e10-auth-and-session.md +127 -0
- package/skills/{weaver-work-cli-shared → weaver-e10-shared}/references/json-output-contract.md +34 -0
- package/skills/weaver-e10-shared/references/weaver-e10-installation.md +110 -0
- package/skills/weaver-e10-skill-maker/SKILL.md +78 -0
- package/skills/weaver-e10-skill-maker/product.json +8 -0
- package/skills/weaver-e10-skill-maker/references/business-skill-generation.md +124 -0
- package/skills/weaver-e10-skill-maker/references/detector-validation.md +101 -0
- package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +230 -0
- package/skills/weaver-e10-skill-maker/references/post-generation-install.md +105 -0
- package/skills/weaver-e10-skill-maker/references/source-update-detection.md +261 -0
- package/skills/weaver-e10-skill-maker/references/weaver-skill-style.md +141 -0
- package/skills/weaver-e10-wenshuding/SKILL.md +158 -0
- package/skills/weaver-e10-wenshuding/product.json +8 -0
- package/skills/weaver-e10-wenshuding/references/archive-agent-entry.md +63 -0
- package/skills/weaver-e10-wenshuding/references/archive-borrow-car.md +52 -0
- package/skills/weaver-e10-wenshuding/references/archive-borrow-list.md +52 -0
- package/skills/weaver-e10-wenshuding/references/archive-disabled-capabilities.md +22 -0
- package/skills/weaver-e10-wenshuding/references/archive-download.md +48 -0
- package/skills/weaver-e10-wenshuding/references/archive-flow.md +46 -0
- package/skills/weaver-e10-wenshuding/references/archive-fonds.md +34 -0
- package/skills/weaver-e10-wenshuding/references/archive-info.md +33 -0
- package/skills/weaver-e10-wenshuding/references/archive-search.md +52 -0
- package/skills/weaver-e10-wenshuding/references/archive-upload.md +41 -0
- package/skills/weaver-e10-wenshuding/references/source-manifest.json +517 -0
- package/skills/weaver-e10-yepiaotong/SKILL.md +184 -0
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-add.md +1 -1
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-agent-entry.md +16 -9
- package/skills/weaver-e10-yepiaotong/references/invoice-browse-field-data.md +204 -0
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-delete.md +1 -1
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-detail.md +13 -5
- package/skills/weaver-e10-yepiaotong/references/invoice-disabled-capabilities.md +28 -0
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-download.md +9 -2
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-enterprise-list.md +12 -4
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-file-upload.md +9 -2
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-import.md +16 -7
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +120 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-field-rules.md +161 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +99 -0
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-ocr-preview.md +12 -4
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-personal-list.md +12 -4
- package/skills/weaver-e10-yepiaotong/references/invoice-red.md +261 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +97 -0
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-update.md +1 -1
- package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-validation-preview.md +9 -2
- package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +1340 -0
- package/skills/weaver-e10-yepiaotong/references/reim-examples.md +845 -0
- package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +94 -0
- package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +449 -0
- package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +266 -0
- package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +494 -0
- package/skills/weaver-e10-yepiaotong/references/source-manifest.json +1103 -0
- package/skills/weaver-e10-yimiaoban/SKILL.md +104 -0
- package/skills/weaver-e10-yimiaoban/product.json +8 -0
- package/skills/weaver-e10-yimiaoban/references/ding-write.md +68 -0
- package/skills/weaver-e10-yimiaoban/references/error-codes.md +85 -0
- package/skills/weaver-e10-yimiaoban/references/field-resolution.md +46 -0
- package/skills/weaver-e10-yimiaoban/references/file-user-i18n.md +54 -0
- package/skills/weaver-e10-yimiaoban/references/group-read.md +55 -0
- package/skills/weaver-e10-yimiaoban/references/group-write.md +72 -0
- package/skills/weaver-e10-yimiaoban/references/msg-read.md +59 -0
- package/skills/weaver-e10-yimiaoban/references/msg-write.md +64 -0
- package/skills/weaver-e10-yimiaoban/references/person.md +44 -0
- package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +61 -0
- package/skills/weaver-e10-yimiaoban/references/session-sysmsg.md +47 -0
- package/skills/weaver-e10-yimiaoban/references/source-manifest.json +485 -0
- package/skills/weaver-e10-ziguanjia/SKILL.md +163 -0
- package/skills/weaver-e10-ziguanjia/product.json +8 -0
- package/skills/weaver-e10-ziguanjia/references/source-manifest.json +147 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-agent-entry.md +65 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-create.md +45 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-depre.md +48 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-disabled-capabilities.md +22 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-purch.md +57 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-query.md +62 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-repair.md +83 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-resolve.md +49 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-return.md +70 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-update.md +45 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-use.md +60 -0
- package/skills/weaver-e10-ziguanjia/references/ziguanjia-viewlink.md +81 -0
- package/skills/weaver-work-cli-invoice/SKILL.md +0 -122
- package/skills/weaver-work-cli-invoice/references/invoice-disabled-capabilities.md +0 -26
- package/skills/weaver-work-cli-shared/SKILL.md +0 -63
- package/skills/weaver-work-cli-shared/references/e10-auth-and-session.md +0 -90
- package/skills/weaver-work-cli-shared/references/weaver-work-cli-installation.md +0 -73
- /package/skills/{weaver-work-cli-shared → weaver-e10-shared}/references/high-risk-write.md +0 -0
- /package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/product.json +0 -0
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* jiuchuanhui.cache.init —— 九氚汇配置缓存初始化/刷新(CLI operation)。
|
|
3
|
+
*
|
|
4
|
+
* 说明:
|
|
5
|
+
* - 将 Skill 编排层的缓存初始化能力下沉为真正的 CLI operation(weaver-work-cli jiuchuanhui run jiuchuanhui.cache.init)。
|
|
6
|
+
* - 复用 host.request 直连 E10 接口(与其它 operation 同一认证链),直接写
|
|
7
|
+
* `~/.weaver-e10-jiuchuanhui/{tenantKey}/{userId}/` 下的缓存文件(主文件 + config/{pk}.json)。
|
|
8
|
+
* - risk: local-file-write —— 只写本地缓存文件,不写任何业务数据,无需 prepare/apply 确认链;
|
|
9
|
+
* 但写入前保留旧 region/options/spVersion,避免误刷新丢失旧值。
|
|
10
|
+
* - 7 步:应用发现+13 objId+版本校验 -> cfgId(12 pk) -> 配置详情+字段 data_key -> ebuilder(8 类)
|
|
11
|
+
* -> 字段选项(Select/RadioBox/CheckBox) -> 搜索参数(3 搜索 pk) -> 行政区划(按需/保留旧)。
|
|
12
|
+
* - 入参:{ dryRun?: boolean, verbose?: boolean }。dryRun 只拉取不写入;verbose 打印步骤明细。
|
|
13
|
+
*/
|
|
14
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
15
|
+
import { homedir } from 'node:os';
|
|
16
|
+
import { join } from 'node:path';
|
|
17
|
+
import { jiuchuanhuiValidationError } from './errors.js';
|
|
18
|
+
const APP_TAG = 'jch-crm-project';
|
|
19
|
+
const MIN_VERSION = '1.5.11';
|
|
20
|
+
const MODULE_TAGS = [
|
|
21
|
+
'uf_jch_customer', 'uf_jch_sale', 'uf_jch_clue', 'uf_jch_contact',
|
|
22
|
+
'uf_jch_customer_open_sea', 'uf_jch_remind', 'uf_jch_rival',
|
|
23
|
+
'uf_jch_sale_process', 'uf_jch_sale_stage', 'uf_jch_clue_pool',
|
|
24
|
+
'uf_jch_lose_reason', 'uf_jch_customer_cmt', 'uf_jch_sale_cmt',
|
|
25
|
+
];
|
|
26
|
+
const CREATE_PKS = ['customer_create_api', 'sale_create_api', 'ebclue_ai_create_api', 'contact_create_api', 'ebcontact_plan_create_api'];
|
|
27
|
+
const SEARCH_PKS = ['ebcustomer_search_api', 'ebsale_search_api', 'ebclue_ai_search_api'];
|
|
28
|
+
const UPDATE_PKS = ['customer_update_api', 'sale_update_api', 'ebclue_ai_update_api', 'contact_update_api'];
|
|
29
|
+
const ALL_PKS = [...CREATE_PKS, ...SEARCH_PKS, ...UPDATE_PKS];
|
|
30
|
+
const PK_TO_TAG = {
|
|
31
|
+
customer_create_api: 'uf_jch_customer',
|
|
32
|
+
sale_create_api: 'uf_jch_sale',
|
|
33
|
+
ebclue_ai_create_api: 'uf_jch_clue',
|
|
34
|
+
contact_create_api: 'uf_jch_contact',
|
|
35
|
+
ebcontact_plan_create_api: 'uf_jch_remind',
|
|
36
|
+
ebcustomer_search_api: 'uf_jch_customer',
|
|
37
|
+
ebsale_search_api: 'uf_jch_sale',
|
|
38
|
+
ebclue_ai_search_api: 'uf_jch_clue',
|
|
39
|
+
customer_update_api: 'uf_jch_customer',
|
|
40
|
+
sale_update_api: 'uf_jch_sale',
|
|
41
|
+
ebclue_ai_update_api: 'uf_jch_clue',
|
|
42
|
+
contact_update_api: 'uf_jch_contact',
|
|
43
|
+
};
|
|
44
|
+
// detail 顶层与字段仅保留运行必需键(对齐缓存规范 DETAIL_KEEP_KEYS / FIELD_KEEP_KEYS)
|
|
45
|
+
const DETAIL_KEEP_KEYS = ['id', 'interfacePk', 'interfaceName', 'datasNumber', 'datasSize', 'mainFields', 'detailFields', 'interfaceType', 'relevanceForm'];
|
|
46
|
+
const FIELD_KEEP_KEYS = ['fieldid', 'isRequired', 'isInput', 'data_key', 'title', 'component_type'];
|
|
47
|
+
const OPT_COMP = ['Select', 'RadioBox', 'CheckBox'];
|
|
48
|
+
// Ebuilder 关联数据 8 类(缓存 key -> 接口路径 -> 名称字段优先级)
|
|
49
|
+
const EBUILDER_QUERIES = [
|
|
50
|
+
{ key: 'customer_open_sea', path: '/api/ebuilder/form/formdata/v2/getFormDataList/customer_open_sea_search_api', nameFields: ['open_sea_name', 'name'] },
|
|
51
|
+
{ key: 'sale_stage', path: '/api/ebuilder/form/formdata/v2/getFormDataList/sale_stage_search_api', nameFields: ['stage_name', 'name'] },
|
|
52
|
+
{ key: 'sale_process', path: '/api/ebuilder/form/formdata/v2/getFormDataList/sale_process_sear_api', nameFields: ['process_name', 'name'] },
|
|
53
|
+
{ key: 'clue_pool', path: '/api/ebuilder/form/formdata/v2/getFormDataList/ebcluepool_ai_search_api', nameFields: ['clue_pool_name', 'name'] },
|
|
54
|
+
{ key: 'sale_lose_reason', path: '/api/ebuilder/form/formdata/v2/getFormDataList/sale_lose_reason', nameFields: ['reason_name', 'name'] },
|
|
55
|
+
{ key: 'customer_industry', path: '/api/ebuilder/form/formdata/v2/getFormDataList/ebcustomer_industry_search_api', nameFields: ['industry_name', 'name'] },
|
|
56
|
+
{ key: 'customer_type', path: '/api/ebuilder/form/formdata/v2/getFormDataList/ebcustomer_type_search_api', nameFields: ['type_name', 'name'] },
|
|
57
|
+
{ key: 'customer_status', path: '/api/ebuilder/form/formdata/v2/getFormDataList/ebcustomer_status_search_api', nameFields: ['state_name', 'name'] },
|
|
58
|
+
];
|
|
59
|
+
// 行政区划预取城市(22 个)
|
|
60
|
+
const REGION_CITIES = [
|
|
61
|
+
'北京市', '上海市', '天津市', '重庆市', '成都市', '广州市', '深圳市', '东莞市',
|
|
62
|
+
'杭州市', '南京市', '苏州市', '武汉市', '长沙市', '西安市', '郑州市', '济南市',
|
|
63
|
+
'青岛市', '厦门市', '福州市', '合肥市', '沈阳市', '大连市',
|
|
64
|
+
];
|
|
65
|
+
function pickKeys(obj, keys) {
|
|
66
|
+
const out = {};
|
|
67
|
+
for (const k of keys)
|
|
68
|
+
if (obj?.[k] !== undefined)
|
|
69
|
+
out[k] = obj[k];
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
72
|
+
const isInputOne = (f) => String(f?.isInput) === '1';
|
|
73
|
+
function semverGte(a, b) {
|
|
74
|
+
const pa = String(a || '').split('.').map((x) => parseInt(x, 10) || 0);
|
|
75
|
+
const pb = b.split('.').map((x) => parseInt(x, 10) || 0);
|
|
76
|
+
for (let i = 0; i < 3; i++) {
|
|
77
|
+
if ((pa[i] || 0) !== (pb[i] || 0))
|
|
78
|
+
return (pa[i] || 0) > (pb[i] || 0);
|
|
79
|
+
}
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
function successCheck(value) {
|
|
83
|
+
if (!value || typeof value !== 'object')
|
|
84
|
+
return false;
|
|
85
|
+
if (value.resultCode !== undefined && value.resultCode !== null)
|
|
86
|
+
return Number(value.resultCode) === 200;
|
|
87
|
+
if (value.datajson && typeof value.datajson === 'object') {
|
|
88
|
+
const status = value.datajson.status;
|
|
89
|
+
if (status === 'true' || status === true)
|
|
90
|
+
return true;
|
|
91
|
+
if (status === 'false' || status === false)
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
const code = value.code ?? value.res_base?.ret;
|
|
95
|
+
if (code !== undefined && code !== null)
|
|
96
|
+
return Number(code) === 0 || Number(code) === 200;
|
|
97
|
+
return typeof value.success === 'boolean' ? value.success : false;
|
|
98
|
+
}
|
|
99
|
+
export class CacheInitOperation {
|
|
100
|
+
name = 'jiuchuanhui.cache.init';
|
|
101
|
+
async execute(input, { host }) {
|
|
102
|
+
const dryRun = input.dryRun === true;
|
|
103
|
+
const verbose = input.verbose === true;
|
|
104
|
+
const session = await host.getSession();
|
|
105
|
+
const tenantKey = session.tenantKey || '';
|
|
106
|
+
const userId = session.userId || '';
|
|
107
|
+
if (!tenantKey || !userId) {
|
|
108
|
+
throw jiuchuanhuiValidationError('session_context_missing', '无法获取缓存隔离上下文:session 缺少 tenantKey/userId,请确认 E10 登录态');
|
|
109
|
+
}
|
|
110
|
+
const baseDir = join(process.env.WEAVER_E10_JIUCHUANHUI_HOME || join(homedir(), '.weaver-e10-jiuchuanhui'), tenantKey, String(userId));
|
|
111
|
+
const mainFile = join(baseDir, 'weaver-e10-jiuchuanhui.json');
|
|
112
|
+
const cfgDir = join(baseDir, 'config');
|
|
113
|
+
// 保留旧 region / options / spVersion
|
|
114
|
+
let old = {};
|
|
115
|
+
if (existsSync(mainFile)) {
|
|
116
|
+
try {
|
|
117
|
+
old = JSON.parse(readFileSync(mainFile, 'utf-8'));
|
|
118
|
+
}
|
|
119
|
+
catch { /* ignore */ }
|
|
120
|
+
}
|
|
121
|
+
// ── 步骤 1:应用发现 + 13 objId + 版本校验 ──────────────────────────
|
|
122
|
+
const discovery = {};
|
|
123
|
+
const appResp = await host.request({
|
|
124
|
+
method: 'GET',
|
|
125
|
+
path: '/api/bs/ebuilder/app/tags/getAppIds',
|
|
126
|
+
query: { tag: APP_TAG },
|
|
127
|
+
operation: this.name,
|
|
128
|
+
});
|
|
129
|
+
if (!successCheck(appResp))
|
|
130
|
+
throw jiuchuanhuiValidationError('init_failed', 'app.discovery 未成功,无法初始化缓存');
|
|
131
|
+
const rawApp = appResp?.data ?? appResp?.datajson?.datas;
|
|
132
|
+
const appId = Array.isArray(rawApp) && rawApp[0] ? String(rawApp[0]) : null;
|
|
133
|
+
if (!appId)
|
|
134
|
+
throw jiuchuanhuiValidationError('init_failed', '步骤 1 未取得 appId,请检查 E10 登录态');
|
|
135
|
+
discovery[`appId:${APP_TAG}`] = appId;
|
|
136
|
+
for (const tag of MODULE_TAGS) {
|
|
137
|
+
const resp = await host.request({
|
|
138
|
+
method: 'GET',
|
|
139
|
+
path: '/api/ebuilder/form/obj/getObjsByTag',
|
|
140
|
+
query: { tag, appId },
|
|
141
|
+
operation: this.name,
|
|
142
|
+
});
|
|
143
|
+
const list = Array.isArray(resp?.data) ? resp.data : resp?.datajson?.datas ?? [];
|
|
144
|
+
const hit = list.find((o) => o?.formId && String(o.formId) !== '0') ?? list?.[0];
|
|
145
|
+
if (hit?.id)
|
|
146
|
+
discovery[`objId:${tag}`] = String(hit.id);
|
|
147
|
+
}
|
|
148
|
+
// spVersion:querySpAppVersionInfo 接口(源包约束 3)
|
|
149
|
+
try {
|
|
150
|
+
const spResp = await host.request({
|
|
151
|
+
method: 'GET',
|
|
152
|
+
path: '/api/installer/public/querySpAppVersionInfo',
|
|
153
|
+
query: { appId },
|
|
154
|
+
operation: this.name,
|
|
155
|
+
});
|
|
156
|
+
const sp = spResp?.data;
|
|
157
|
+
const commitVersion = typeof sp === 'object' && sp !== null ? String(sp.commitVersion ?? sp.version ?? '') : '';
|
|
158
|
+
if (commitVersion) {
|
|
159
|
+
discovery[`spVersion:${APP_TAG}`] = { commitVersion, passed: semverGte(commitVersion, MIN_VERSION) };
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// 版本接口不可用时不阻塞(保留旧缓存 spVersion)
|
|
164
|
+
}
|
|
165
|
+
// ── 步骤 2:接口标识 → cfgId(12 个 pk)─────────────────────────────
|
|
166
|
+
const cfgMap = {};
|
|
167
|
+
for (const pk of ALL_PKS) {
|
|
168
|
+
const resp = await host.request({
|
|
169
|
+
path: '/api/esb/server/event/triggerActionFlow',
|
|
170
|
+
body: { customParams: { mainTable: { interface_pk: pk } }, uniqueIndent: '4F6E1A9702864666803CCA6B77B86227', employeeId: userId },
|
|
171
|
+
operation: this.name,
|
|
172
|
+
});
|
|
173
|
+
const cfgId = resp?.actionData?.responseData?.customData?.mainTable?.cfgId
|
|
174
|
+
?? resp?.customData?.mainTable?.cfgId
|
|
175
|
+
?? resp?.datajson?.mainTable?.cfgId
|
|
176
|
+
?? resp?.data?.mainTable?.cfgId
|
|
177
|
+
?? resp?.mainTable?.cfgId;
|
|
178
|
+
if (cfgId)
|
|
179
|
+
cfgMap[pk] = String(cfgId);
|
|
180
|
+
}
|
|
181
|
+
// ── 步骤 3:创建/更新接口配置 + 字段 data_key 映射 ───────────────────
|
|
182
|
+
const perPk = {};
|
|
183
|
+
for (const pk of Object.keys(cfgMap)) {
|
|
184
|
+
const cfgId = cfgMap[pk];
|
|
185
|
+
const resp = await host.request({
|
|
186
|
+
method: 'GET',
|
|
187
|
+
path: '/api/bs/ebuilder/form/formdata/getRestCfgById',
|
|
188
|
+
query: { apid: appId, id: cfgId },
|
|
189
|
+
operation: this.name,
|
|
190
|
+
});
|
|
191
|
+
const detail = resp?.data ?? {};
|
|
192
|
+
if (!detail?.id && !detail?.mainFields)
|
|
193
|
+
continue;
|
|
194
|
+
const allFields = [
|
|
195
|
+
...(detail.mainFields || []),
|
|
196
|
+
...(detail.detailFields || []).flatMap((df) => df.fields || []),
|
|
197
|
+
];
|
|
198
|
+
const fieldIds = [...new Set(allFields.filter(isInputOne).map((f) => String(f.fieldid)).filter(Boolean))];
|
|
199
|
+
const infoMap = new Map();
|
|
200
|
+
if (fieldIds.length > 0) {
|
|
201
|
+
try {
|
|
202
|
+
const infoResp = await host.request({
|
|
203
|
+
path: '/api/esb/server/event/triggerActionFlow',
|
|
204
|
+
body: { customParams: { mainTable: { fieldids: fieldIds.join(',') } }, uniqueIndent: '10351A4DC8D4454A9F1957FBE647CD9F', employeeId: userId },
|
|
205
|
+
operation: this.name,
|
|
206
|
+
});
|
|
207
|
+
const list = infoResp?.actionData?.responseData?.customData?.mainTable?.fieldInfoList
|
|
208
|
+
?? infoResp?.customData?.mainTable?.fieldInfoList
|
|
209
|
+
?? infoResp?.datajson?.mainTable?.fieldInfoList
|
|
210
|
+
?? infoResp?.fieldInfoList ?? [];
|
|
211
|
+
for (const it of list)
|
|
212
|
+
infoMap.set(String(it.id), it);
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
// data_key 缺失可接受(业务侧按缓存规范兜底)
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
const merge = (f) => {
|
|
219
|
+
const info = infoMap.get(String(f?.fieldid));
|
|
220
|
+
if (info) {
|
|
221
|
+
f.data_key = info.data_key ?? f.data_key;
|
|
222
|
+
f.title = info.title ?? f.title;
|
|
223
|
+
f.component_type = info.component_type ?? f.component_type;
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
detail.mainFields = (detail.mainFields || []).filter(isInputOne);
|
|
227
|
+
detail.detailFields = (detail.detailFields || [])
|
|
228
|
+
.map((df) => ({ ...df, fields: (df.fields || []).filter(isInputOne) }))
|
|
229
|
+
.filter((df) => Array.isArray(df.fields) && df.fields.length > 0);
|
|
230
|
+
for (const f of detail.mainFields)
|
|
231
|
+
merge(f);
|
|
232
|
+
for (const df of detail.detailFields)
|
|
233
|
+
for (const f of df.fields)
|
|
234
|
+
merge(f);
|
|
235
|
+
const kept = pickKeys(detail, DETAIL_KEEP_KEYS);
|
|
236
|
+
if (Array.isArray(kept.mainFields))
|
|
237
|
+
kept.mainFields = kept.mainFields.map((f) => pickKeys(f, FIELD_KEEP_KEYS));
|
|
238
|
+
if (Array.isArray(kept.detailFields)) {
|
|
239
|
+
kept.detailFields = kept.detailFields.map((df) => ({
|
|
240
|
+
...pickKeys(df, ['id', 'fieldName', 'title', 'fields']),
|
|
241
|
+
fields: Array.isArray(df.fields) ? df.fields.map((f) => pickKeys(f, FIELD_KEEP_KEYS)) : [],
|
|
242
|
+
}));
|
|
243
|
+
}
|
|
244
|
+
perPk[pk] = { cfgId, detail: kept };
|
|
245
|
+
}
|
|
246
|
+
// ── 步骤 4:Ebuilder 关联数据(8 类)───────────────────────────────
|
|
247
|
+
const ebuilder = {};
|
|
248
|
+
for (const { key, path, nameFields } of EBUILDER_QUERIES) {
|
|
249
|
+
const list = [];
|
|
250
|
+
let pageNo = 1;
|
|
251
|
+
for (;;) {
|
|
252
|
+
const resp = await host.request({
|
|
253
|
+
path,
|
|
254
|
+
body: { datajson: { mainTable: {}, pageInfo: { pageNo, pageSize: 100 }, header: { operator: userId } } },
|
|
255
|
+
operation: this.name,
|
|
256
|
+
});
|
|
257
|
+
const items = resp?.datajson?.datas ?? resp?.data ?? [];
|
|
258
|
+
list.push(...(Array.isArray(items) ? items : []));
|
|
259
|
+
const hasMore = resp?.hasMore ?? (Array.isArray(items) && items.length === 100);
|
|
260
|
+
if (!hasMore || list.length >= 500 || pageNo >= 5)
|
|
261
|
+
break;
|
|
262
|
+
pageNo += 1;
|
|
263
|
+
}
|
|
264
|
+
ebuilder[key] = list.map((it) => {
|
|
265
|
+
const mt = it?.mainTable ?? it ?? {};
|
|
266
|
+
let name = '';
|
|
267
|
+
for (const nf of nameFields) {
|
|
268
|
+
if (mt[nf] !== undefined && mt[nf] !== null && String(mt[nf]) !== '') {
|
|
269
|
+
name = String(mt[nf]);
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
const item = { id: String(mt.id ?? ''), name };
|
|
274
|
+
if (key === 'sale_stage' && mt.sale_process !== undefined) {
|
|
275
|
+
const sp = Array.isArray(mt.sale_process) ? mt.sale_process[0] : mt.sale_process;
|
|
276
|
+
if (sp && typeof sp === 'object')
|
|
277
|
+
item.sale_process = { id: String(sp.id ?? ''), name: String(sp.name ?? '') };
|
|
278
|
+
}
|
|
279
|
+
return item;
|
|
280
|
+
}).filter((x) => x.id);
|
|
281
|
+
}
|
|
282
|
+
// ── 步骤 5:字段选项(Select/RadioBox/CheckBox)────────────────────────
|
|
283
|
+
const options = {};
|
|
284
|
+
for (const pk of Object.keys(perPk)) {
|
|
285
|
+
const tag = PK_TO_TAG[pk];
|
|
286
|
+
const objId = discovery[`objId:${tag}`];
|
|
287
|
+
if (!objId)
|
|
288
|
+
continue;
|
|
289
|
+
const detail = perPk[pk].detail ?? {};
|
|
290
|
+
const fields = [
|
|
291
|
+
...(detail.mainFields || []),
|
|
292
|
+
...(detail.detailFields || []).flatMap((d) => d.fields || []),
|
|
293
|
+
];
|
|
294
|
+
for (const f of fields) {
|
|
295
|
+
if (!f?.fieldid)
|
|
296
|
+
continue;
|
|
297
|
+
if (!OPT_COMP.includes(f.component_type))
|
|
298
|
+
continue;
|
|
299
|
+
const key = `options:${f.fieldid}:*:1`;
|
|
300
|
+
if (options[key])
|
|
301
|
+
continue;
|
|
302
|
+
try {
|
|
303
|
+
const resp = await host.request({
|
|
304
|
+
method: 'GET',
|
|
305
|
+
path: '/api/ebuilder/common/ds/options',
|
|
306
|
+
query: { fieldName: String(f.fieldid), objId, groupId: appId, optionLevel: 1 },
|
|
307
|
+
operation: this.name,
|
|
308
|
+
});
|
|
309
|
+
const values = resp?.data ?? resp?.datajson?.datas ?? [];
|
|
310
|
+
options[key] = {
|
|
311
|
+
lable: `${pk}.${f.data_key ?? f.fieldid}`,
|
|
312
|
+
lableTitle: `${pk}.${f.title ?? f.data_key ?? f.fieldid}`,
|
|
313
|
+
value: (Array.isArray(values) ? values : []).map((v) => ({
|
|
314
|
+
label: String(v?.lable ?? v?.label ?? v?.text ?? v?.name ?? ''),
|
|
315
|
+
value: String(v?.value ?? v?.val ?? v?.id ?? ''),
|
|
316
|
+
})),
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
// 失败不阻塞:保留旧缓存 options,业务侧读字段 optionList / 主缓存 options 兜底
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
// ── 步骤 6:搜索接口 URL 可传参数(searchParams)──────────────────────
|
|
325
|
+
const searchPerPk = {};
|
|
326
|
+
for (const pk of SEARCH_PKS) {
|
|
327
|
+
const cfgId = cfgMap[pk];
|
|
328
|
+
if (!cfgId)
|
|
329
|
+
continue;
|
|
330
|
+
try {
|
|
331
|
+
const resp = await host.request({
|
|
332
|
+
method: 'GET',
|
|
333
|
+
path: '/api/bs/ebuilder/form/formdata/getRestCfgById',
|
|
334
|
+
query: { apid: appId, id: cfgId },
|
|
335
|
+
operation: this.name,
|
|
336
|
+
});
|
|
337
|
+
const cfgObj = resp?.data ?? {};
|
|
338
|
+
let conditions = cfgObj.conditions;
|
|
339
|
+
if (typeof conditions === 'string') {
|
|
340
|
+
try {
|
|
341
|
+
conditions = JSON.parse(conditions);
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
conditions = null;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
const params = [];
|
|
348
|
+
for (const d of conditions?.datas ?? []) {
|
|
349
|
+
const value = d?.conditions?.value;
|
|
350
|
+
if (typeof value === 'string') {
|
|
351
|
+
const m = value.match(/\{([^}]+)\}/);
|
|
352
|
+
if (m) {
|
|
353
|
+
params.push({
|
|
354
|
+
key: m[1],
|
|
355
|
+
text: d?.text ?? '',
|
|
356
|
+
fieldType: d?.fieldType ?? '',
|
|
357
|
+
compType: d?.compType ?? '',
|
|
358
|
+
func: d?.conditions?.func ?? '',
|
|
359
|
+
fieldid: d?.fieldName ?? '',
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
searchPerPk[pk] = { cfgId, searchParams: params };
|
|
365
|
+
}
|
|
366
|
+
catch {
|
|
367
|
+
// 搜索参数解析失败不阻塞
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
for (const [pk, entry] of Object.entries(searchPerPk)) {
|
|
371
|
+
if (perPk[pk])
|
|
372
|
+
perPk[pk] = { ...perPk[pk], ...entry };
|
|
373
|
+
else
|
|
374
|
+
perPk[pk] = entry;
|
|
375
|
+
}
|
|
376
|
+
// ── 步骤 7:行政区划(按需预取 22 城;失败跳过,保留旧缓存 region)───
|
|
377
|
+
const region = {};
|
|
378
|
+
for (const city of REGION_CITIES) {
|
|
379
|
+
try {
|
|
380
|
+
const resp = await host.request({
|
|
381
|
+
path: '/api/esb/server/event/triggerActionFlow',
|
|
382
|
+
body: {
|
|
383
|
+
customParams: { mainTable: { moduleType: 'administrativeDivision', name: city, fromType: 'agentSkill' } },
|
|
384
|
+
uniqueIndent: '7EC1639D5AC24B4DBCEE8D2CB85D4025',
|
|
385
|
+
employeeId: userId,
|
|
386
|
+
},
|
|
387
|
+
operation: this.name,
|
|
388
|
+
});
|
|
389
|
+
if (Number(resp?.resultCode ?? 0) === 200) {
|
|
390
|
+
region[`administrativeDivision:${city}`] = resp;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
catch {
|
|
394
|
+
// 单城市失败跳过
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
// ── 落盘 ───────────────────────────────────────────────────────────
|
|
398
|
+
const cache = { discovery, ebuilder, options, region };
|
|
399
|
+
cache.region = { ...(old.region || {}), ...(cache.region || {}) };
|
|
400
|
+
cache.options = { ...(old.options || {}), ...(cache.options || {}) };
|
|
401
|
+
if (!cache.discovery[`spVersion:${APP_TAG}`] && old.discovery?.[`spVersion:${APP_TAG}`]) {
|
|
402
|
+
cache.discovery[`spVersion:${APP_TAG}`] = old.discovery[`spVersion:${APP_TAG}`];
|
|
403
|
+
}
|
|
404
|
+
const summary = {
|
|
405
|
+
dryRun,
|
|
406
|
+
cacheDir: baseDir,
|
|
407
|
+
mainFile,
|
|
408
|
+
namespaces: {
|
|
409
|
+
discovery: Object.keys(cache.discovery).length,
|
|
410
|
+
ebuilder: Object.keys(cache.ebuilder).length,
|
|
411
|
+
options: Object.keys(cache.options).length,
|
|
412
|
+
region: Object.keys(cache.region).length,
|
|
413
|
+
},
|
|
414
|
+
configFiles: Object.keys(perPk).length,
|
|
415
|
+
objIdCount: Object.keys(discovery).filter((k) => k.startsWith('objId:')).length,
|
|
416
|
+
cfgIdCount: Object.keys(cfgMap).length,
|
|
417
|
+
version: cache.discovery[`spVersion:${APP_TAG}`] ?? null,
|
|
418
|
+
warnings: [],
|
|
419
|
+
};
|
|
420
|
+
// 版本基线检查:不达标时仍写入缓存,但提示业务侧应停止调用
|
|
421
|
+
if (cache.discovery[`spVersion:${APP_TAG}`] && cache.discovery[`spVersion:${APP_TAG}`].passed === false) {
|
|
422
|
+
summary.warnings.push(`九氚汇营销管理包版本(${cache.discovery[`spVersion:${APP_TAG}`].commitVersion})低于 ${MIN_VERSION},业务调用应停止`);
|
|
423
|
+
}
|
|
424
|
+
if (dryRun)
|
|
425
|
+
return { status: 'COMPLETE', data: { ...summary, written: false, note: 'dry-run:只拉取未写入' } };
|
|
426
|
+
mkdirSync(cfgDir, { recursive: true });
|
|
427
|
+
writeFileSync(mainFile, JSON.stringify(cache, null, 2), 'utf-8');
|
|
428
|
+
for (const [pk, entry] of Object.entries(perPk)) {
|
|
429
|
+
const tag = PK_TO_TAG[pk];
|
|
430
|
+
const objId = cache.discovery[`objId:${tag}`];
|
|
431
|
+
writeFileSync(join(cfgDir, `${pk}.json`), JSON.stringify({ ...entry, objId: objId ?? '' }, null, 2), 'utf-8');
|
|
432
|
+
}
|
|
433
|
+
if (verbose) {
|
|
434
|
+
summary.warnings.push(`${JSON.stringify({ step1: 'discovery', step2: 'cfgId', step3: 'cfg.detail', step4: 'ebuilder', step5: 'options', step6: 'searchParams', step7: 'region' })}`);
|
|
435
|
+
}
|
|
436
|
+
return {
|
|
437
|
+
status: 'COMPLETE',
|
|
438
|
+
data: { ...summary, written: true },
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { resolve } from 'node:path';
|
|
6
|
+
import { jiuchuanhuiValidationError } from './errors.js';
|
|
7
|
+
function stateRoot(ctx) {
|
|
8
|
+
const configured = ctx?.config?.path();
|
|
9
|
+
if (configured)
|
|
10
|
+
return resolve(configured, '..');
|
|
11
|
+
return process.env.WEAVER_WORK_CLI_HOME || process.env.WORK_CLI_HOME || resolve(homedir(), '.weaver-work-cli');
|
|
12
|
+
}
|
|
13
|
+
async function loadKey(ctx) {
|
|
14
|
+
const keysDir = resolve(stateRoot(ctx), 'keys');
|
|
15
|
+
const filename = resolve(keysDir, 'jiuchuanhui-continuation.key');
|
|
16
|
+
await mkdir(keysDir, { recursive: true, mode: 0o700 });
|
|
17
|
+
if (existsSync(filename))
|
|
18
|
+
return readFile(filename);
|
|
19
|
+
const key = randomBytes(32);
|
|
20
|
+
try {
|
|
21
|
+
await writeFile(filename, key, { flag: 'wx', mode: 0o600 });
|
|
22
|
+
if (process.platform !== 'win32')
|
|
23
|
+
await chmod(filename, 0o600).catch(() => undefined);
|
|
24
|
+
return key;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return readFile(filename);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function encode(value) {
|
|
31
|
+
return Buffer.from(JSON.stringify(value)).toString('base64url');
|
|
32
|
+
}
|
|
33
|
+
function signature(payload, key) {
|
|
34
|
+
return createHmac('sha256', key).update(payload).digest('base64url');
|
|
35
|
+
}
|
|
36
|
+
export function createJiuchuanhuiContinuationSigner(ctx) {
|
|
37
|
+
return {
|
|
38
|
+
async issue(payload, ttlMs = 10 * 60_000) {
|
|
39
|
+
const issuedAt = Date.now();
|
|
40
|
+
const body = encode({ ...payload, issuedAt, expiresAt: issuedAt + ttlMs });
|
|
41
|
+
const sig = signature(body, await loadKey(ctx));
|
|
42
|
+
return `${body}.${sig}`;
|
|
43
|
+
},
|
|
44
|
+
async verify(token, expectedOperation) {
|
|
45
|
+
if (typeof token !== 'string' || !token.includes('.')) {
|
|
46
|
+
throw jiuchuanhuiValidationError('continuation_invalid', 'continuation 无效');
|
|
47
|
+
}
|
|
48
|
+
const [body, provided] = token.split('.');
|
|
49
|
+
const expected = signature(body, await loadKey(ctx));
|
|
50
|
+
const valid = provided.length === expected.length
|
|
51
|
+
&& timingSafeEqual(Buffer.from(provided), Buffer.from(expected));
|
|
52
|
+
if (!valid)
|
|
53
|
+
throw jiuchuanhuiValidationError('continuation_invalid', 'continuation 签名校验失败');
|
|
54
|
+
let value;
|
|
55
|
+
try {
|
|
56
|
+
value = JSON.parse(Buffer.from(body, 'base64url').toString('utf8'));
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
throw jiuchuanhuiValidationError('continuation_invalid', 'continuation 内容无法解析');
|
|
60
|
+
}
|
|
61
|
+
if (value.operation !== expectedOperation) {
|
|
62
|
+
throw jiuchuanhuiValidationError('continuation_mismatch', 'continuation 不属于当前操作');
|
|
63
|
+
}
|
|
64
|
+
if (!Number.isSafeInteger(value.expiresAt) || value.expiresAt < Date.now()) {
|
|
65
|
+
throw jiuchuanhuiValidationError('continuation_expired', 'continuation 已过期');
|
|
66
|
+
}
|
|
67
|
+
return value;
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { CliError, ExitCode } from '../../core/errors.js';
|
|
2
|
+
export class JiuchuanhuiCliError extends CliError {
|
|
3
|
+
type;
|
|
4
|
+
subtype;
|
|
5
|
+
code;
|
|
6
|
+
retryable;
|
|
7
|
+
stage;
|
|
8
|
+
details;
|
|
9
|
+
partialData;
|
|
10
|
+
constructor(type, subtype, message, options = {}) {
|
|
11
|
+
super(message, options.exitCode ?? ExitCode.InternalError);
|
|
12
|
+
this.name = 'JiuchuanhuiCliError';
|
|
13
|
+
this.type = type;
|
|
14
|
+
this.subtype = subtype;
|
|
15
|
+
this.code = options.code;
|
|
16
|
+
this.retryable = options.retryable ?? false;
|
|
17
|
+
this.stage = options.stage;
|
|
18
|
+
this.details = options.details;
|
|
19
|
+
this.partialData = options.partialData;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function jiuchuanhuiValidationError(subtype, message, details) {
|
|
23
|
+
return new JiuchuanhuiCliError('validation', subtype, message, {
|
|
24
|
+
details,
|
|
25
|
+
exitCode: ExitCode.UsageError,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export function jiuchuanhuiAuthError(subtype, message, details) {
|
|
29
|
+
return new JiuchuanhuiCliError('authentication', subtype, message, {
|
|
30
|
+
details,
|
|
31
|
+
exitCode: ExitCode.AuthError,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export function jiuchuanhuiNetworkError(subtype, message, options = {}) {
|
|
35
|
+
return new JiuchuanhuiCliError('network', subtype, message, {
|
|
36
|
+
...options,
|
|
37
|
+
retryable: options.retryable ?? true,
|
|
38
|
+
exitCode: ExitCode.NetworkError,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export function jiuchuanhuiConfirmationError(action, details) {
|
|
42
|
+
return new JiuchuanhuiCliError('confirmation', 'required', '该操作需要明确确认', {
|
|
43
|
+
details: { action, ...details },
|
|
44
|
+
exitCode: ExitCode.ConfirmationRequired,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
export function jiuchuanhuiPartialError(message, partialData, details) {
|
|
48
|
+
return new JiuchuanhuiCliError('partial', 'write_uncertain', message, {
|
|
49
|
+
details,
|
|
50
|
+
partialData,
|
|
51
|
+
exitCode: ExitCode.Partial,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
export function isJiuchuanhuiNetworkError(error) {
|
|
55
|
+
return Boolean(error
|
|
56
|
+
&& typeof error === 'object'
|
|
57
|
+
&& 'type' in error
|
|
58
|
+
&& error.type === 'network');
|
|
59
|
+
}
|