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
|
@@ -4,7 +4,14 @@ import { CliError, ExitCode } from '../../../core/errors.js';
|
|
|
4
4
|
import { clearInvoiceTokenForSession } from '../../../shortcuts/invoice/host.js';
|
|
5
5
|
import { buildE10CookieHeader, E10AuthSession, clearProfileAuthFile, extractRawSetCookie, findAuthFile, getActiveProfile, getProfileAuthPath, getProfileDir, listProfiles, profileNameFromUrl, readProfileConfig, readTeamsCheckUserInfo, saveAuthFile, saveProfileConfig, setActiveProfile, } from './session.js';
|
|
6
6
|
import { getE10AuthRoot } from './paths.js';
|
|
7
|
+
import { XIAOE_AGENT_TYPE, hasXiaoEEnv, resolveXiaoEPreferredBaseUrl, resolveXiaoEUnifiedLoginCredential, } from './xiaoe.js';
|
|
8
|
+
export { DEFAULT_E10_BASE_URL, XIAOE_AGENT_TYPE, hasXiaoEEnv, resolveXiaoEDefaultBaseUrl, resolveXiaoEPreferredBaseUrl, resolveXiaoEUnifiedLoginCredential, } from './xiaoe.js';
|
|
7
9
|
const DEFAULT_AGENT_TYPE = 'weaver-work-cli';
|
|
10
|
+
const EXPLICIT_AGENT_TYPE_ENV_KEYS = [
|
|
11
|
+
'WEAVER_AGENT_TYPE',
|
|
12
|
+
'WORKBUDDY_AGENT_TYPE',
|
|
13
|
+
'CODEX_AGENT_TYPE',
|
|
14
|
+
];
|
|
8
15
|
function asOptions(value) {
|
|
9
16
|
return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
10
17
|
}
|
|
@@ -16,6 +23,32 @@ function optionString(options, ...keys) {
|
|
|
16
23
|
}
|
|
17
24
|
return '';
|
|
18
25
|
}
|
|
26
|
+
function envString(env, ...keys) {
|
|
27
|
+
for (const key of keys) {
|
|
28
|
+
const value = env[key];
|
|
29
|
+
if (typeof value === 'string' && value.trim())
|
|
30
|
+
return value.trim();
|
|
31
|
+
}
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
function hasEnvPrefix(env, prefix) {
|
|
35
|
+
return Object.keys(env).some((key) => key === prefix || key.startsWith(`${prefix}_`));
|
|
36
|
+
}
|
|
37
|
+
function inferAgentTypeFromEnv(env) {
|
|
38
|
+
if (hasXiaoEEnv(env))
|
|
39
|
+
return XIAOE_AGENT_TYPE;
|
|
40
|
+
if (hasEnvPrefix(env, 'WORKBUDDY'))
|
|
41
|
+
return 'workbuddy';
|
|
42
|
+
if (hasEnvPrefix(env, 'CODEX'))
|
|
43
|
+
return 'codex';
|
|
44
|
+
return '';
|
|
45
|
+
}
|
|
46
|
+
export function resolveAgentType(options = {}, env = process.env) {
|
|
47
|
+
return optionString(options, 'agentType', 'agent_type')
|
|
48
|
+
|| envString(env, ...EXPLICIT_AGENT_TYPE_ENV_KEYS)
|
|
49
|
+
|| inferAgentTypeFromEnv(env)
|
|
50
|
+
|| DEFAULT_AGENT_TYPE;
|
|
51
|
+
}
|
|
19
52
|
function normalizeUrl(value) {
|
|
20
53
|
return value.replace(/\/+$/, '');
|
|
21
54
|
}
|
|
@@ -50,8 +83,8 @@ function formatAuthStatus(status) {
|
|
|
50
83
|
if (!status.loggedIn) {
|
|
51
84
|
return [
|
|
52
85
|
'Not logged in.',
|
|
53
|
-
'Run: weaver-work-cli auth login --base-url <url>',
|
|
54
|
-
'Or: weaver-work-cli auth set --eteamsid <id> --base-url <url>',
|
|
86
|
+
'Run: weaver-work-cli auth login --base-url <url> --agent_type <agent_type>',
|
|
87
|
+
'Or: weaver-work-cli auth set --eteamsid <id> --base-url <url> --agent_type <agent_type>',
|
|
55
88
|
].join('\n');
|
|
56
89
|
}
|
|
57
90
|
const lines = [
|
|
@@ -93,9 +126,27 @@ async function clearInvoiceTokenCache(profile, authData) {
|
|
|
93
126
|
userId: authData.userId,
|
|
94
127
|
}).catch(() => false);
|
|
95
128
|
}
|
|
96
|
-
function
|
|
129
|
+
function posixShellQuote(value) {
|
|
97
130
|
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
98
131
|
}
|
|
132
|
+
function powershellQuote(value) {
|
|
133
|
+
return `'${value.replace(/'/g, "''")}'`;
|
|
134
|
+
}
|
|
135
|
+
function resolveWeaverEnvShell(shell, platform = process.platform) {
|
|
136
|
+
if (shell === 'auto')
|
|
137
|
+
return platform === 'win32' ? 'powershell' : 'posix';
|
|
138
|
+
if (shell === 'posix' || shell === 'powershell')
|
|
139
|
+
return shell;
|
|
140
|
+
throw new CliError('Invalid --shell value. Use auto, posix, or powershell.', ExitCode.UsageError);
|
|
141
|
+
}
|
|
142
|
+
export function formatWeaverEnvExports(value, shell = 'auto', platform = process.platform) {
|
|
143
|
+
const resolved = resolveWeaverEnvShell(shell, platform);
|
|
144
|
+
return Object.entries(value)
|
|
145
|
+
.map(([name, envValue]) => resolved === 'powershell'
|
|
146
|
+
? `$env:${name} = ${powershellQuote(envValue)}`
|
|
147
|
+
: `export ${name}=${posixShellQuote(envValue)}`)
|
|
148
|
+
.join('\n');
|
|
149
|
+
}
|
|
99
150
|
function esc(value) {
|
|
100
151
|
return String(value ?? '')
|
|
101
152
|
.replace(/&/g, '&')
|
|
@@ -104,18 +155,32 @@ function esc(value) {
|
|
|
104
155
|
.replace(/"/g, '"')
|
|
105
156
|
.replace(/'/g, ''');
|
|
106
157
|
}
|
|
158
|
+
export function resolveBrowserOpenCommand(url, platform = process.platform) {
|
|
159
|
+
if (platform === 'win32') {
|
|
160
|
+
return { file: 'rundll32.exe', args: ['url.dll,FileProtocolHandler', url] };
|
|
161
|
+
}
|
|
162
|
+
if (platform === 'darwin')
|
|
163
|
+
return { file: 'open', args: [url] };
|
|
164
|
+
return { file: 'xdg-open', args: [url] };
|
|
165
|
+
}
|
|
107
166
|
function openUrlInBrowser(url, ctx) {
|
|
108
|
-
const command =
|
|
109
|
-
? { file: 'cmd', args: ['/c', 'start', '', url] }
|
|
110
|
-
: process.platform === 'darwin'
|
|
111
|
-
? { file: 'open', args: [url] }
|
|
112
|
-
: { file: 'xdg-open', args: [url] };
|
|
167
|
+
const command = resolveBrowserOpenCommand(url);
|
|
113
168
|
execFile(command.file, command.args, (error) => {
|
|
114
169
|
if (error) {
|
|
115
170
|
ctx.logger.warn('Could not open browser automatically. Copy the login URL manually.');
|
|
116
171
|
}
|
|
117
172
|
});
|
|
118
173
|
}
|
|
174
|
+
export function buildE10AuthorizeUrl(baseUrl, redirectUri, agentType) {
|
|
175
|
+
const authorizeParams = new URLSearchParams({
|
|
176
|
+
redirect_uri: redirectUri,
|
|
177
|
+
response_type: 'code',
|
|
178
|
+
access_type: 'agent',
|
|
179
|
+
agent_type: agentType,
|
|
180
|
+
from: agentType,
|
|
181
|
+
});
|
|
182
|
+
return `${baseUrl}/papi/sso/oauth2.0/authorize?${authorizeParams.toString()}`;
|
|
183
|
+
}
|
|
119
184
|
async function readJsonObject(resp) {
|
|
120
185
|
const data = await resp.json().catch(() => ({}));
|
|
121
186
|
return data && typeof data === 'object' && !Array.isArray(data) ? data : {};
|
|
@@ -136,6 +201,69 @@ async function resolveUserInfo(baseUrl, eteamsId, rawCookie = '', agentType = ''
|
|
|
136
201
|
const data = await resp.json().catch(() => ({}));
|
|
137
202
|
return readTeamsCheckUserInfo(resp, data);
|
|
138
203
|
}
|
|
204
|
+
async function saveEteamsIdLogin(input) {
|
|
205
|
+
const baseUrl = normalizeUrl(input.baseUrl);
|
|
206
|
+
const passportUrl = normalizeUrl(input.passportUrl || baseUrl);
|
|
207
|
+
const userInfo = await resolveUserInfo(baseUrl, input.eteamsId, input.rawCookie || '', input.agentType);
|
|
208
|
+
if (!userInfo.userId) {
|
|
209
|
+
throw new CliError('Could not resolve userId. Check whether ETEAMSID is valid for this E10 domain.', ExitCode.AuthError);
|
|
210
|
+
}
|
|
211
|
+
const tenantKey = userInfo.tenantKey || input.tenantKeyFallback;
|
|
212
|
+
const profile = input.profileHint || profileNameFromUrl(baseUrl);
|
|
213
|
+
setActiveProfile(profile);
|
|
214
|
+
const cookies = { ETEAMSID: input.eteamsId };
|
|
215
|
+
if (input.rawCookie)
|
|
216
|
+
cookies.raw = input.rawCookie;
|
|
217
|
+
const authData = {
|
|
218
|
+
cookies,
|
|
219
|
+
userId: userInfo.userId,
|
|
220
|
+
tenantKey,
|
|
221
|
+
tenantName: userInfo.tenantName,
|
|
222
|
+
department: userInfo.department,
|
|
223
|
+
subcompany: userInfo.subcompany,
|
|
224
|
+
position: userInfo.position,
|
|
225
|
+
agentType: input.agentType,
|
|
226
|
+
version: input.version || '',
|
|
227
|
+
baseUrl,
|
|
228
|
+
passportUrl,
|
|
229
|
+
cookieSavedAt: Date.now(),
|
|
230
|
+
};
|
|
231
|
+
await clearInvoiceTokenCache(profile, authData);
|
|
232
|
+
const authFile = saveAuthFile(authData, profile);
|
|
233
|
+
saveProfileConfig(baseUrl, passportUrl, profile, tenantKey);
|
|
234
|
+
return {
|
|
235
|
+
...userInfo,
|
|
236
|
+
tenantKey,
|
|
237
|
+
eteamsId: input.eteamsId,
|
|
238
|
+
baseUrl,
|
|
239
|
+
passportUrl,
|
|
240
|
+
profile,
|
|
241
|
+
authFile,
|
|
242
|
+
agentType: input.agentType,
|
|
243
|
+
version: input.version || '',
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
async function tryXiaoEUnifiedLogin(ctx, baseUrl, tenantKeyFallback, profileHint) {
|
|
247
|
+
const credential = resolveXiaoEUnifiedLoginCredential(baseUrl, ctx.env);
|
|
248
|
+
if (!credential)
|
|
249
|
+
return null;
|
|
250
|
+
ctx.logger.info('Detected XiaoE unified login for this E10 domain. Trying XiaoE auth...');
|
|
251
|
+
try {
|
|
252
|
+
return await saveEteamsIdLogin({
|
|
253
|
+
baseUrl,
|
|
254
|
+
passportUrl: baseUrl,
|
|
255
|
+
eteamsId: credential.eteamsId,
|
|
256
|
+
tenantKeyFallback,
|
|
257
|
+
agentType: XIAOE_AGENT_TYPE,
|
|
258
|
+
profileHint,
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
263
|
+
ctx.logger.warn('XiaoE unified login failed; falling back to browser OAuth. ' + message);
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
139
267
|
async function oidcExchange(code, redirectUri, baseUrl, tenantKeyFallback, agentTypeFallback, profileHint) {
|
|
140
268
|
const base = normalizeUrl(baseUrl);
|
|
141
269
|
const tokenParams = new URLSearchParams({
|
|
@@ -235,25 +363,27 @@ async function runBrowserLogin(ctx, options) {
|
|
|
235
363
|
const globalOptions = ctx.getGlobalOptions();
|
|
236
364
|
const profileFromGlobal = globalOptions.profile;
|
|
237
365
|
const cfg = readProfileConfig(profileFromGlobal || getActiveProfile());
|
|
238
|
-
const
|
|
366
|
+
const explicitBaseUrl = optionString(commandOpts, 'baseUrl') || globalOptions.baseUrl || '';
|
|
367
|
+
const baseUrl = resolveXiaoEPreferredBaseUrl({
|
|
368
|
+
explicitBaseUrl,
|
|
369
|
+
profileBaseUrl: cfg.baseUrl,
|
|
370
|
+
env: ctx.env,
|
|
371
|
+
});
|
|
239
372
|
const tenantKey = optionString(commandOpts, 'tenantKey');
|
|
240
373
|
const portText = optionString(commandOpts, 'port') || '19800';
|
|
241
374
|
const port = Number.parseInt(portText, 10);
|
|
242
375
|
const explicitAgentType = optionString(commandOpts, 'agentType', 'agent_type');
|
|
243
|
-
const agentType =
|
|
376
|
+
const agentType = resolveAgentType(commandOpts, ctx.env);
|
|
244
377
|
if (!baseUrl)
|
|
245
378
|
throw new CliError('Missing --base-url', ExitCode.UsageError);
|
|
246
379
|
if (!Number.isInteger(port) || port <= 0 || port > 65535) {
|
|
247
380
|
throw new CliError('Invalid --port value', ExitCode.UsageError);
|
|
248
381
|
}
|
|
382
|
+
const xiaoEResult = await tryXiaoEUnifiedLogin(ctx, baseUrl, tenantKey, profileFromGlobal);
|
|
383
|
+
if (xiaoEResult)
|
|
384
|
+
return xiaoEResult;
|
|
249
385
|
const redirectUri = `http://127.0.0.1:${port}/callback`;
|
|
250
|
-
const
|
|
251
|
-
redirect_uri: redirectUri,
|
|
252
|
-
response_type: 'code',
|
|
253
|
-
access_type: 'agent',
|
|
254
|
-
agent_type: agentType,
|
|
255
|
-
});
|
|
256
|
-
const loginUrl = `${baseUrl}/papi/sso/oauth2.0/authorize?${authorizeParams.toString()}`;
|
|
386
|
+
const loginUrl = buildE10AuthorizeUrl(baseUrl, redirectUri, agentType);
|
|
257
387
|
ctx.logger.info('Open browser login: ' + loginUrl);
|
|
258
388
|
ctx.logger.info('Waiting for E10 authorization callback...');
|
|
259
389
|
return await new Promise((resolve, reject) => {
|
|
@@ -290,6 +420,7 @@ async function runBrowserLogin(ctx, options) {
|
|
|
290
420
|
const redirectAgentType = explicitAgentType
|
|
291
421
|
|| callbackUrl.searchParams.get('agent_type')
|
|
292
422
|
|| callbackUrl.searchParams.get('agentType')
|
|
423
|
+
|| callbackUrl.searchParams.get('from')
|
|
293
424
|
|| agentType;
|
|
294
425
|
if (error) {
|
|
295
426
|
const message = callbackUrl.searchParams.get('error_description') || error;
|
|
@@ -439,51 +570,26 @@ export function registerE10AuthCommands(parent, action) {
|
|
|
439
570
|
const baseUrl = normalizeUrl(optionString(commandOpts, 'baseUrl') || globalOptions.baseUrl || cfg.baseUrl || '');
|
|
440
571
|
const passportUrl = normalizeUrl(optionString(commandOpts, 'passportUrl') || globalOptions.passportUrl || cfg.passportUrl || baseUrl);
|
|
441
572
|
const tenantKeyFallback = optionString(commandOpts, 'tenantKey');
|
|
442
|
-
const agentType =
|
|
573
|
+
const agentType = resolveAgentType(commandOpts, ctx.env);
|
|
443
574
|
const eteamsId = optionString(commandOpts, 'eteamsid');
|
|
444
575
|
if (!baseUrl)
|
|
445
576
|
throw new CliError('Missing --base-url', ExitCode.UsageError);
|
|
446
577
|
if (!eteamsId)
|
|
447
578
|
throw new CliError('Missing --eteamsid', ExitCode.UsageError);
|
|
448
579
|
ctx.logger.info('Resolving E10 user information...');
|
|
449
|
-
const
|
|
450
|
-
if (!userInfo.userId) {
|
|
451
|
-
throw new CliError('Could not resolve userId. Check whether ETEAMSID is valid.', ExitCode.AuthError);
|
|
452
|
-
}
|
|
453
|
-
const tenantKey = userInfo.tenantKey || tenantKeyFallback;
|
|
454
|
-
const profile = profileFromGlobal || profileNameFromUrl(baseUrl);
|
|
455
|
-
setActiveProfile(profile);
|
|
456
|
-
const authData = {
|
|
457
|
-
cookies: { ETEAMSID: eteamsId },
|
|
458
|
-
userId: userInfo.userId,
|
|
459
|
-
tenantKey,
|
|
460
|
-
tenantName: userInfo.tenantName,
|
|
461
|
-
department: userInfo.department,
|
|
462
|
-
subcompany: userInfo.subcompany,
|
|
463
|
-
position: userInfo.position,
|
|
464
|
-
agentType,
|
|
580
|
+
const result = await saveEteamsIdLogin({
|
|
465
581
|
baseUrl,
|
|
466
582
|
passportUrl,
|
|
467
|
-
cookieSavedAt: Date.now(),
|
|
468
|
-
};
|
|
469
|
-
await clearInvoiceTokenCache(profile, authData);
|
|
470
|
-
const authFile = saveAuthFile(authData, profile);
|
|
471
|
-
saveProfileConfig(baseUrl, passportUrl, profile, tenantKey);
|
|
472
|
-
const result = {
|
|
473
|
-
...userInfo,
|
|
474
|
-
tenantKey,
|
|
475
583
|
eteamsId,
|
|
476
|
-
|
|
477
|
-
passportUrl,
|
|
478
|
-
profile,
|
|
479
|
-
authFile,
|
|
584
|
+
tenantKeyFallback,
|
|
480
585
|
agentType,
|
|
481
|
-
|
|
482
|
-
};
|
|
586
|
+
profileHint: profileFromGlobal,
|
|
587
|
+
});
|
|
483
588
|
ctx.output.write(result, { text: formatLoginResult(result) });
|
|
484
589
|
}));
|
|
485
590
|
registerBrowserLoginCommand(auth, action, 'login', 'Open browser OAuth2.0 login and save E10 auth');
|
|
486
591
|
registerBrowserLoginCommand(auth, action, 'oidc', 'Alias of auth login for OAuth2.0 browser login');
|
|
592
|
+
registerBrowserLoginCommand(auth, action, 'xiaoe', 'Try XiaoE unified login before browser OAuth2.0 login');
|
|
487
593
|
auth.command('logout')
|
|
488
594
|
.alias('clear')
|
|
489
595
|
.description('Clear saved E10 auth for the current or selected profile')
|
|
@@ -558,7 +664,9 @@ export function registerE10AuthCommands(parent, action) {
|
|
|
558
664
|
}));
|
|
559
665
|
auth.command('export-weaver-env')
|
|
560
666
|
.description('Print WEAVER_* shell exports for the active E10 auth')
|
|
561
|
-
.
|
|
667
|
+
.option('--shell <shell>', 'Shell syntax: auto, posix, or powershell', 'auto')
|
|
668
|
+
.action(action(async (ctx, options) => {
|
|
669
|
+
const commandOpts = asOptions(options);
|
|
562
670
|
const session = await E10AuthSession.fromOptions(ctx.getGlobalOptions(), ctx.cwd);
|
|
563
671
|
if (!session)
|
|
564
672
|
throw new CliError('E10 auth not found.', ExitCode.AuthError);
|
|
@@ -573,11 +681,8 @@ export function registerE10AuthCommands(parent, action) {
|
|
|
573
681
|
ctx.output.write(value);
|
|
574
682
|
return;
|
|
575
683
|
}
|
|
576
|
-
|
|
577
|
-
ctx.output.raw(
|
|
578
|
-
ctx.output.raw(`export WEAVER_COOKIE=${shellQuote(value.WEAVER_COOKIE)}`);
|
|
579
|
-
ctx.output.raw(`export WEAVER_USER_AGENT=${shellQuote(value.WEAVER_USER_AGENT)}`);
|
|
580
|
-
ctx.output.raw(`export WEAVER_AGENT_TYPE=${shellQuote(value.WEAVER_AGENT_TYPE)}`);
|
|
684
|
+
const shell = optionString(commandOpts, 'shell') || 'auto';
|
|
685
|
+
ctx.output.raw(formatWeaverEnvExports(value, shell));
|
|
581
686
|
}));
|
|
582
687
|
const profile = auth.command('profile').description('Manage E10 profiles');
|
|
583
688
|
profile.command('list')
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { CliError, ExitCode } from '../../../core/errors.js';
|
|
2
|
+
import { buildE10CookieHeader, E10AuthSession, profileNameFromUrl, readTeamsCheckUserInfo, saveAuthFile, saveProfileConfig, setActiveProfile, } from './session.js';
|
|
3
|
+
export const DEFAULT_E10_BASE_URL = 'https://www.e-cology.com.cn';
|
|
4
|
+
export const XIAOE_AGENT_TYPE = 'Xiao.E';
|
|
5
|
+
const XIAOE_UNIFIED_LOGIN_MAP_ENV_KEYS = [
|
|
6
|
+
'XIAOE_E10_AUTH_MAP',
|
|
7
|
+
'XIAOE_E10_DOMAIN_ETEAMSID_MAP',
|
|
8
|
+
'XIAOE_DOMAIN_ETEAMSID_MAP',
|
|
9
|
+
'XIAOE_UNIFIED_LOGIN_MAP',
|
|
10
|
+
];
|
|
11
|
+
const XIAOE_SINGLE_DOMAIN_ENV_KEYS = [
|
|
12
|
+
'XIAOE_DOMAIN',
|
|
13
|
+
'XIAOE_E10_DOMAIN',
|
|
14
|
+
'XIAOE_BASE_URL',
|
|
15
|
+
'XIAOE_E10_BASE_URL',
|
|
16
|
+
];
|
|
17
|
+
const XIAOE_DEFAULT_DOMAIN_ENV_KEYS = [
|
|
18
|
+
'XIAOE_DEFAULT_DOMAIN',
|
|
19
|
+
'XIAOE_DEFAULT_BASE_URL',
|
|
20
|
+
'XIAOE_E10_DEFAULT_DOMAIN',
|
|
21
|
+
'XIAOE_E10_DEFAULT_BASE_URL',
|
|
22
|
+
];
|
|
23
|
+
const XIAOE_SINGLE_ETEAMSID_ENV_KEYS = [
|
|
24
|
+
'XIAOE_ETEAMSID',
|
|
25
|
+
'XIAOE_ETEAM_ID',
|
|
26
|
+
'XIAOE_ETEAMID',
|
|
27
|
+
'XIAOE_E10_ETEAMSID',
|
|
28
|
+
'XIAOE_E10_ETEAM_ID',
|
|
29
|
+
];
|
|
30
|
+
function envString(env, ...keys) {
|
|
31
|
+
for (const key of keys) {
|
|
32
|
+
const value = env[key];
|
|
33
|
+
if (typeof value === 'string' && value.trim())
|
|
34
|
+
return value.trim();
|
|
35
|
+
}
|
|
36
|
+
return '';
|
|
37
|
+
}
|
|
38
|
+
function hasEnvPrefix(env, prefix) {
|
|
39
|
+
return Object.keys(env).some((key) => key === prefix || key.startsWith(`${prefix}_`));
|
|
40
|
+
}
|
|
41
|
+
export function hasXiaoEEnv(env = process.env) {
|
|
42
|
+
return hasEnvPrefix(env, 'XIAOE');
|
|
43
|
+
}
|
|
44
|
+
function normalizeUrl(value) {
|
|
45
|
+
return value.replace(/\/+$/, '');
|
|
46
|
+
}
|
|
47
|
+
function readString(data, ...keys) {
|
|
48
|
+
for (const key of keys) {
|
|
49
|
+
const value = data[key];
|
|
50
|
+
if (typeof value === 'string' && value)
|
|
51
|
+
return value;
|
|
52
|
+
if (typeof value === 'number')
|
|
53
|
+
return String(value);
|
|
54
|
+
}
|
|
55
|
+
return '';
|
|
56
|
+
}
|
|
57
|
+
function normalizeDomainKey(value) {
|
|
58
|
+
const raw = normalizeUrl(value.trim());
|
|
59
|
+
if (!raw)
|
|
60
|
+
return null;
|
|
61
|
+
try {
|
|
62
|
+
const url = new URL(raw.includes('://') ? raw : `https://${raw}`);
|
|
63
|
+
return {
|
|
64
|
+
raw: raw.toLowerCase(),
|
|
65
|
+
origin: normalizeUrl(url.origin).toLowerCase(),
|
|
66
|
+
host: url.hostname.toLowerCase(),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return {
|
|
71
|
+
raw: raw.toLowerCase(),
|
|
72
|
+
origin: raw.toLowerCase(),
|
|
73
|
+
host: '',
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function domainMatches(baseUrl, candidate) {
|
|
78
|
+
const base = normalizeDomainKey(baseUrl);
|
|
79
|
+
const target = normalizeDomainKey(candidate);
|
|
80
|
+
if (!base || !target)
|
|
81
|
+
return false;
|
|
82
|
+
return base.origin === target.origin
|
|
83
|
+
|| base.raw === target.raw
|
|
84
|
+
|| Boolean(base.host && target.host && base.host === target.host);
|
|
85
|
+
}
|
|
86
|
+
function readXiaoECredentialRecord(value, source, fallbackBaseUrl = '') {
|
|
87
|
+
const baseUrl = readString(value, 'domain', 'baseUrl', 'base_url', 'url', 'host') || fallbackBaseUrl;
|
|
88
|
+
const eteamsId = readString(value, 'eteamsId', 'eteamsid', 'ETEAMSID', 'eteamId', 'eteam_id', 'eTeamId');
|
|
89
|
+
if (!baseUrl || !eteamsId)
|
|
90
|
+
return null;
|
|
91
|
+
return { baseUrl: normalizeUrl(baseUrl), eteamsId, source };
|
|
92
|
+
}
|
|
93
|
+
function parseXiaoEUnifiedLoginMap(raw, source) {
|
|
94
|
+
const value = raw.trim();
|
|
95
|
+
if (!value)
|
|
96
|
+
return [];
|
|
97
|
+
try {
|
|
98
|
+
const parsed = JSON.parse(value);
|
|
99
|
+
if (Array.isArray(parsed)) {
|
|
100
|
+
return parsed
|
|
101
|
+
.map((entry) => entry && typeof entry === 'object' && !Array.isArray(entry)
|
|
102
|
+
? readXiaoECredentialRecord(entry, source)
|
|
103
|
+
: null)
|
|
104
|
+
.filter((entry) => Boolean(entry));
|
|
105
|
+
}
|
|
106
|
+
if (parsed && typeof parsed === 'object') {
|
|
107
|
+
const record = parsed;
|
|
108
|
+
const direct = readXiaoECredentialRecord(record, source);
|
|
109
|
+
if (direct)
|
|
110
|
+
return [direct];
|
|
111
|
+
return Object.entries(record)
|
|
112
|
+
.map(([baseUrl, entry]) => {
|
|
113
|
+
if (typeof entry === 'string' || typeof entry === 'number') {
|
|
114
|
+
return { baseUrl: normalizeUrl(baseUrl), eteamsId: String(entry), source };
|
|
115
|
+
}
|
|
116
|
+
if (entry && typeof entry === 'object' && !Array.isArray(entry)) {
|
|
117
|
+
return readXiaoECredentialRecord(entry, source, baseUrl);
|
|
118
|
+
}
|
|
119
|
+
return null;
|
|
120
|
+
})
|
|
121
|
+
.filter((entry) => Boolean(entry));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Fall through to compact text formats.
|
|
126
|
+
}
|
|
127
|
+
return value
|
|
128
|
+
.split(/[;,\n]+/u)
|
|
129
|
+
.map((entry) => entry.trim())
|
|
130
|
+
.filter(Boolean)
|
|
131
|
+
.map((entry) => {
|
|
132
|
+
const delimiter = entry.includes('|') ? '|' : entry.includes('=') ? '=' : '';
|
|
133
|
+
if (delimiter) {
|
|
134
|
+
const index = entry.indexOf(delimiter);
|
|
135
|
+
const baseUrl = entry.slice(0, index).trim();
|
|
136
|
+
const eteamsId = entry.slice(index + delimiter.length).trim();
|
|
137
|
+
return baseUrl && eteamsId ? { baseUrl: normalizeUrl(baseUrl), eteamsId, source } : null;
|
|
138
|
+
}
|
|
139
|
+
const parts = entry.split(/\s+/u).filter(Boolean);
|
|
140
|
+
return parts.length === 2 ? { baseUrl: normalizeUrl(parts[0]), eteamsId: parts[1], source } : null;
|
|
141
|
+
})
|
|
142
|
+
.filter((entry) => Boolean(entry));
|
|
143
|
+
}
|
|
144
|
+
function listXiaoEUnifiedLoginCredentials(env = process.env) {
|
|
145
|
+
const candidates = [];
|
|
146
|
+
for (const key of XIAOE_UNIFIED_LOGIN_MAP_ENV_KEYS) {
|
|
147
|
+
const raw = envString(env, key);
|
|
148
|
+
if (raw)
|
|
149
|
+
candidates.push(...parseXiaoEUnifiedLoginMap(raw, key));
|
|
150
|
+
}
|
|
151
|
+
const singleDomain = envString(env, ...XIAOE_SINGLE_DOMAIN_ENV_KEYS);
|
|
152
|
+
const singleEteamsId = envString(env, ...XIAOE_SINGLE_ETEAMSID_ENV_KEYS);
|
|
153
|
+
if (singleDomain && singleEteamsId) {
|
|
154
|
+
candidates.push({
|
|
155
|
+
baseUrl: normalizeUrl(singleDomain),
|
|
156
|
+
eteamsId: singleEteamsId,
|
|
157
|
+
source: `${XIAOE_SINGLE_DOMAIN_ENV_KEYS[0]}+${XIAOE_SINGLE_ETEAMSID_ENV_KEYS[0]}`,
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
return candidates;
|
|
161
|
+
}
|
|
162
|
+
export function resolveXiaoEUnifiedLoginCredential(baseUrl, env = process.env) {
|
|
163
|
+
const candidates = listXiaoEUnifiedLoginCredentials(env);
|
|
164
|
+
return candidates.find((candidate) => domainMatches(baseUrl, candidate.baseUrl)) || null;
|
|
165
|
+
}
|
|
166
|
+
export function resolveXiaoEDefaultBaseUrl(env = process.env) {
|
|
167
|
+
const explicitDefault = envString(env, ...XIAOE_DEFAULT_DOMAIN_ENV_KEYS);
|
|
168
|
+
if (explicitDefault)
|
|
169
|
+
return normalizeUrl(explicitDefault);
|
|
170
|
+
const firstCredential = listXiaoEUnifiedLoginCredentials(env)[0];
|
|
171
|
+
if (firstCredential?.baseUrl)
|
|
172
|
+
return normalizeUrl(firstCredential.baseUrl);
|
|
173
|
+
return hasXiaoEEnv(env) ? DEFAULT_E10_BASE_URL : '';
|
|
174
|
+
}
|
|
175
|
+
export function resolveXiaoEPreferredBaseUrl(options) {
|
|
176
|
+
const env = options.env || process.env;
|
|
177
|
+
const explicit = normalizeUrl(options.explicitBaseUrl || '');
|
|
178
|
+
if (explicit)
|
|
179
|
+
return explicit;
|
|
180
|
+
const xiaoEDefault = resolveXiaoEDefaultBaseUrl(env);
|
|
181
|
+
if (hasXiaoEEnv(env))
|
|
182
|
+
return xiaoEDefault || normalizeUrl(options.profileBaseUrl || '');
|
|
183
|
+
return normalizeUrl(options.profileBaseUrl || '') || xiaoEDefault;
|
|
184
|
+
}
|
|
185
|
+
async function resolveUserInfo(baseUrl, eteamsId, rawCookie = '', agentType = '') {
|
|
186
|
+
const resp = await fetch(`${baseUrl}/api/baseserver/layout/teamsCheck?clientType=not_xinchuang&client=WEB&domainName=${encodeURIComponent(baseUrl)}`, {
|
|
187
|
+
method: 'POST',
|
|
188
|
+
headers: {
|
|
189
|
+
accept: 'application/json',
|
|
190
|
+
'content-type': 'application/json',
|
|
191
|
+
eteamsid: eteamsId,
|
|
192
|
+
cookie: buildE10CookieHeader(rawCookie, eteamsId, agentType),
|
|
193
|
+
'user-agent': agentType ? `AgentType=${agentType},IsAgent=true` : 'weaver-work-cli',
|
|
194
|
+
origin: baseUrl,
|
|
195
|
+
},
|
|
196
|
+
redirect: 'manual',
|
|
197
|
+
});
|
|
198
|
+
const data = await resp.json().catch(() => ({}));
|
|
199
|
+
return readTeamsCheckUserInfo(resp, data);
|
|
200
|
+
}
|
|
201
|
+
async function saveXiaoEUnifiedLogin(input) {
|
|
202
|
+
const baseUrl = normalizeUrl(input.baseUrl);
|
|
203
|
+
const userInfo = await resolveUserInfo(baseUrl, input.eteamsId, '', XIAOE_AGENT_TYPE);
|
|
204
|
+
if (!userInfo.userId) {
|
|
205
|
+
throw new CliError('Could not resolve userId. Check whether XiaoE unified login is valid for this E10 domain.', ExitCode.AuthError);
|
|
206
|
+
}
|
|
207
|
+
const tenantKey = userInfo.tenantKey || input.tenantKeyFallback || '';
|
|
208
|
+
const profile = input.profileHint || profileNameFromUrl(baseUrl);
|
|
209
|
+
setActiveProfile(profile);
|
|
210
|
+
const authData = {
|
|
211
|
+
cookies: { ETEAMSID: input.eteamsId },
|
|
212
|
+
userId: userInfo.userId,
|
|
213
|
+
tenantKey,
|
|
214
|
+
tenantName: userInfo.tenantName,
|
|
215
|
+
department: userInfo.department,
|
|
216
|
+
subcompany: userInfo.subcompany,
|
|
217
|
+
position: userInfo.position,
|
|
218
|
+
agentType: XIAOE_AGENT_TYPE,
|
|
219
|
+
version: '',
|
|
220
|
+
baseUrl,
|
|
221
|
+
passportUrl: baseUrl,
|
|
222
|
+
cookieSavedAt: Date.now(),
|
|
223
|
+
loginSource: 'xiaoe-unified',
|
|
224
|
+
};
|
|
225
|
+
const authFile = saveAuthFile(authData, profile);
|
|
226
|
+
saveProfileConfig(baseUrl, baseUrl, profile, tenantKey);
|
|
227
|
+
const session = new E10AuthSession(authData, authFile);
|
|
228
|
+
return {
|
|
229
|
+
session,
|
|
230
|
+
result: {
|
|
231
|
+
...userInfo,
|
|
232
|
+
tenantKey,
|
|
233
|
+
eteamsId: input.eteamsId,
|
|
234
|
+
baseUrl,
|
|
235
|
+
passportUrl: baseUrl,
|
|
236
|
+
profile,
|
|
237
|
+
authFile,
|
|
238
|
+
agentType: XIAOE_AGENT_TYPE,
|
|
239
|
+
version: '',
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
export async function tryXiaoEUnifiedLogin(options = {}) {
|
|
244
|
+
const env = options.env || process.env;
|
|
245
|
+
const baseUrl = resolveXiaoEPreferredBaseUrl({
|
|
246
|
+
explicitBaseUrl: options.baseUrl,
|
|
247
|
+
env,
|
|
248
|
+
});
|
|
249
|
+
if (!baseUrl)
|
|
250
|
+
return null;
|
|
251
|
+
const credential = resolveXiaoEUnifiedLoginCredential(baseUrl, env);
|
|
252
|
+
if (!credential)
|
|
253
|
+
return null;
|
|
254
|
+
options.logger?.info('Detected XiaoE unified login for this E10 domain. Trying XiaoE auth...');
|
|
255
|
+
try {
|
|
256
|
+
return await saveXiaoEUnifiedLogin({
|
|
257
|
+
baseUrl,
|
|
258
|
+
eteamsId: credential.eteamsId,
|
|
259
|
+
tenantKeyFallback: options.tenantKeyFallback,
|
|
260
|
+
profileHint: options.profileHint,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
catch (error) {
|
|
264
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
265
|
+
options.logger?.warn('XiaoE unified login failed; falling back to standard E10 auth. ' + message);
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
@@ -1,13 +1,27 @@
|
|
|
1
1
|
import { CliError, ExitCode } from '../../core/errors.js';
|
|
2
2
|
import { E10AuthSession } from './auth/session.js';
|
|
3
|
+
import { hasXiaoEEnv, tryXiaoEUnifiedLogin } from './auth/xiaoe.js';
|
|
3
4
|
import { E10ApiClient } from './client.js';
|
|
5
|
+
function shouldPreferXiaoEUnifiedLogin(options, env) {
|
|
6
|
+
return hasXiaoEEnv(env) && !options.auth && !options.profile;
|
|
7
|
+
}
|
|
4
8
|
export async function getE10Session(ctx) {
|
|
5
|
-
|
|
9
|
+
const options = ctx.getGlobalOptions();
|
|
10
|
+
if (shouldPreferXiaoEUnifiedLogin(options, ctx.env)) {
|
|
11
|
+
const xiaoELogin = await tryXiaoEUnifiedLogin({
|
|
12
|
+
env: ctx.env,
|
|
13
|
+
baseUrl: options.baseUrl,
|
|
14
|
+
logger: ctx.logger,
|
|
15
|
+
});
|
|
16
|
+
if (xiaoELogin)
|
|
17
|
+
return xiaoELogin.session;
|
|
18
|
+
}
|
|
19
|
+
return E10AuthSession.fromOptions(options, ctx.cwd);
|
|
6
20
|
}
|
|
7
21
|
export async function requireE10Session(ctx) {
|
|
8
22
|
const session = await getE10Session(ctx);
|
|
9
23
|
if (!session) {
|
|
10
|
-
throw new CliError('E10 auth not found.
|
|
24
|
+
throw new CliError('E10 auth not found. In XiaoE, run weaver-work-cli auth xiaoe first; if unified login is unavailable, ask the user for the E10 login domain (base URL), then run: weaver-work-cli auth login --base-url <url> --agent_type <agent_type>.', ExitCode.AuthError);
|
|
11
25
|
}
|
|
12
26
|
return session;
|
|
13
27
|
}
|