weaver-work-cli 0.1.23 → 0.1.25
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 +33 -3
- package/dist/core/output.js +53 -1
- package/dist/internal/e10/auth/commands.js +210 -17
- package/dist/internal/e10/auth/crypto.js +52 -12
- package/dist/internal/e10/auth/xiaoe.js +117 -35
- package/dist/internal/e10/context.js +3 -3
- package/dist/internal/e10/request-runtime.js +46 -4
- package/dist/shortcuts/caizhilian/file-upload/metadata.js +124 -0
- package/dist/shortcuts/caizhilian/file-upload/multipart.js +47 -0
- package/dist/shortcuts/caizhilian/file-upload/protocol.js +116 -0
- package/dist/shortcuts/caizhilian/file-upload/receipt.js +37 -0
- package/dist/shortcuts/caizhilian/host.js +13 -5
- package/dist/shortcuts/caizhilian/operations/handlers/file-upload.js +72 -179
- package/dist/shortcuts/caizhilian/operations/handlers/fileops.js +67 -1
- package/dist/shortcuts/caizhilian/operations/handlers/folder.js +701 -4
- package/dist/shortcuts/caizhilian/operations/handlers/setting-attach.js +198 -0
- package/dist/shortcuts/caizhilian/operations/registry.js +5 -1
- package/dist/shortcuts/caizhilian/operations/shared.js +32 -0
- package/dist/shortcuts/caizhilian/operations/specs.js +67 -0
- package/dist/shortcuts/workflow/continuation.js +14 -9
- package/dist/shortcuts/workflow/endpoints.js +11 -1
- package/dist/shortcuts/workflow/index.js +55 -1
- package/dist/shortcuts/workflow/operations/flow-status.js +63 -0
- package/dist/shortcuts/workflow/operations/form.js +1822 -547
- package/dist/shortcuts/workflow/operations/read.js +414 -13
- package/dist/shortcuts/workflow/operations/shared.js +28 -0
- package/dist/shortcuts/workflow/operations/write.js +5 -5
- package/dist/shortcuts/workflow/operations.js +8 -6
- package/dist/shortcuts/workflow/stdout-compact.js +33 -0
- package/docs/caizhilian.md +12 -5
- package/docs/e10-auth.md +25 -3
- package/node_modules/@napi-rs/keyring/LICENSE +21 -0
- package/node_modules/@napi-rs/keyring/README.md +19 -0
- package/node_modules/@napi-rs/keyring/index.d.ts +166 -0
- package/node_modules/@napi-rs/keyring/index.js +514 -0
- package/node_modules/@napi-rs/keyring/keytar.d.ts +53 -0
- package/node_modules/@napi-rs/keyring/keytar.js +26 -0
- package/node_modules/@napi-rs/keyring/package.json +125 -0
- package/node_modules/@napi-rs/keyring-darwin-arm64/README.md +3 -0
- package/node_modules/@napi-rs/keyring-darwin-arm64/keyring.darwin-arm64.node +0 -0
- package/node_modules/@napi-rs/keyring-darwin-arm64/package.json +32 -0
- package/node_modules/commander/LICENSE +22 -0
- package/node_modules/commander/Readme.md +1149 -0
- package/node_modules/commander/esm.mjs +16 -0
- package/node_modules/commander/index.js +24 -0
- package/node_modules/commander/lib/argument.js +149 -0
- package/node_modules/commander/lib/command.js +2662 -0
- package/node_modules/commander/lib/error.js +39 -0
- package/node_modules/commander/lib/help.js +709 -0
- package/node_modules/commander/lib/option.js +367 -0
- package/node_modules/commander/lib/suggestSimilar.js +101 -0
- package/node_modules/commander/package-support.json +16 -0
- package/node_modules/commander/package.json +82 -0
- package/node_modules/commander/typings/esm.d.mts +3 -0
- package/node_modules/commander/typings/index.d.ts +1045 -0
- package/package.json +5 -1
- package/skills/weaver-e10-builder/SKILL.md +281 -0
- package/skills/weaver-e10-builder/_catalog.md +94 -0
- package/skills/weaver-e10-builder/actionflows/CONTEXT.md +71 -0
- package/skills/weaver-e10-builder/actionflows/SKILL.md +176 -0
- package/skills/weaver-e10-builder/actionflows/docs/adr/0001-generated-actionflow-cleanup-identity.md +5 -0
- package/skills/weaver-e10-builder/actionflows/docs/adr/0002-preserve-existing-actionflow-on-update.md +36 -0
- package/skills/weaver-e10-builder/actionflows/references/components/calendar/MeetingCreate.md +19 -0
- package/skills/weaver-e10-builder/actionflows/references/components/calendar/ScheduleCreate.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/database/DMLExecute.md +38 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/AttachmentCopy.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/AttachmentMove.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentCopy.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentDelete.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentEdit.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentMove.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentPermissionChange.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentRenewal.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentRevert.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentSave.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentSubscription.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentSubscriptionApprove.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentSubscriptionSendBack.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentSubscriptionWithdraw.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/FileFolderSave.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/GetAttachmentInfo.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/GetDocumentInfo.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/ModifyDocumentStatus.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/ReplaceAttachment.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/document/UpdatePrintNum.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/ActionEbAdd.md +100 -0
- package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/ActionEbDelete.md +23 -0
- package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/ActionEbRecover.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/ActionEbSaveVersion.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/ActionEbUpdate.md +67 -0
- package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/DateTrigger.md +32 -0
- package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/EbGetDataById.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/EnquiryForm.md +107 -0
- package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/EventButton.md +33 -0
- package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/EventFormData.md +19 -0
- package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/TimeBatchTrigger.md +19 -0
- package/skills/weaver-e10-builder/actionflows/references/components/http/Http.md +77 -0
- package/skills/weaver-e10-builder/actionflows/references/components/logic/Condition.md +23 -0
- package/skills/weaver-e10-builder/actionflows/references/components/logic/LogicFlowSet.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/logic/MultipleExecution.md +38 -0
- package/skills/weaver-e10-builder/actionflows/references/components/logic/Output.md +37 -0
- package/skills/weaver-e10-builder/actionflows/references/components/message/InnerMQSend.md +50 -0
- package/skills/weaver-e10-builder/actionflows/references/components/message/SendMessage.md +30 -0
- package/skills/weaver-e10-builder/actionflows/references/components/personnel/AlterPersonStatus.md +30 -0
- package/skills/weaver-e10-builder/actionflows/references/components/personnel/HrmEmployeeUpdate.md +34 -0
- package/skills/weaver-e10-builder/actionflows/references/components/personnel/PersonnelAlterType.md +38 -0
- package/skills/weaver-e10-builder/actionflows/references/components/personnel/PersonnelOnboarding.md +36 -0
- package/skills/weaver-e10-builder/actionflows/references/components/serverless/ServerlessAction.md +42 -0
- package/skills/weaver-e10-builder/actionflows/references/components/trigger/CustomTrigger.md +82 -0
- package/skills/weaver-e10-builder/actionflows/references/components/trigger/InnerMQListener.md +41 -0
- package/skills/weaver-e10-builder/actionflows/references/components/trigger/SimpleScheduler.md +19 -0
- package/skills/weaver-e10-builder/actionflows/references/components/trigger/WebHookTrigger.md +91 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveAddSign.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveAgreeRejectApply.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveCommit.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveConsulTurnTodo.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveCreate.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveDelete.md +19 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveDoCirculate.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveDoForward.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveDoTurnTodo.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveEntrust.md +19 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveIntervention.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveMandatoryArchiving.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveManualCC.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveRefuseRejectApply.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveRejectApply.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveSave.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveSendBack.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveShareEntry.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveTrigger.md +99 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveWithdraw.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/WorkFlowDocEmpowerment.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/components/workflow/WorkflowToDoc.md +17 -0
- package/skills/weaver-e10-builder/actionflows/references/condition_rules.md +100 -0
- package/skills/weaver-e10-builder/actionflows/references/dynamic_capability_matrix.md +39 -0
- package/skills/weaver-e10-builder/actionflows/references/dynamic_resources.md +41 -0
- package/skills/weaver-e10-builder/actionflows/references/examples/enquiry-form-batch-insert-scene2.json +1043 -0
- package/skills/weaver-e10-builder/actionflows/references/function_rules.md +15 -0
- package/skills/weaver-e10-builder/actionflows/references/trigger_runtime_notes.md +53 -0
- package/skills/weaver-e10-builder/assets/dom-structure/Bar.json +341 -0
- package/skills/weaver-e10-builder/assets/dom-structure/BarStack.json +341 -0
- package/skills/weaver-e10-builder/assets/dom-structure/Bubble.json +323 -0
- package/skills/weaver-e10-builder/assets/dom-structure/Calendar.json +515 -0
- package/skills/weaver-e10-builder/assets/dom-structure/Circular.json +337 -0
- package/skills/weaver-e10-builder/assets/dom-structure/CollapsePanel.json +289 -0
- package/skills/weaver-e10-builder/assets/dom-structure/Comment.json +617 -0
- package/skills/weaver-e10-builder/assets/dom-structure/CountDown.json +755 -0
- package/skills/weaver-e10-builder/assets/dom-structure/DigitalPanel.json +191 -0
- package/skills/weaver-e10-builder/assets/dom-structure/EbButton.json +387 -0
- package/skills/weaver-e10-builder/assets/dom-structure/FastCreate.json +242 -0
- package/skills/weaver-e10-builder/assets/dom-structure/Gauge.json +282 -0
- package/skills/weaver-e10-builder/assets/dom-structure/HBar.json +336 -0
- package/skills/weaver-e10-builder/assets/dom-structure/HBarStack.json +337 -0
- package/skills/weaver-e10-builder/assets/dom-structure/Line.json +341 -0
- package/skills/weaver-e10-builder/assets/dom-structure/NList.json +712 -0
- package/skills/weaver-e10-builder/assets/dom-structure/NavBar.json +274 -0
- package/skills/weaver-e10-builder/assets/dom-structure/NavPanel.json +390 -0
- package/skills/weaver-e10-builder/assets/dom-structure/NewTab.json +606 -0
- package/skills/weaver-e10-builder/assets/dom-structure/Nightingale.json +336 -0
- package/skills/weaver-e10-builder/assets/dom-structure/PageHeader.json +205 -0
- package/skills/weaver-e10-builder/assets/dom-structure/Picture.json +209 -0
- package/skills/weaver-e10-builder/assets/dom-structure/Pie.json +338 -0
- package/skills/weaver-e10-builder/assets/dom-structure/ProgressChart.json +299 -0
- package/skills/weaver-e10-builder/assets/dom-structure/SearchGlobal.json +628 -0
- package/skills/weaver-e10-builder/assets/dom-structure/Slide.json +489 -0
- package/skills/weaver-e10-builder/assets/dom-structure/Treemap.json +324 -0
- package/skills/weaver-e10-builder/assets/factory/chart-dimensions.json +536 -0
- package/skills/weaver-e10-builder/assets/factory/example-btn-progress-collapse-configured.json +2515 -0
- package/skills/weaver-e10-builder/assets/factory/example-configured-2.json +13805 -0
- package/skills/weaver-e10-builder/assets/factory/example-configured.json +6735 -0
- package/skills/weaver-e10-builder/assets/factory/factory-bar-stack.json +326 -0
- package/skills/weaver-e10-builder/assets/factory/factory-bar.json +222 -0
- package/skills/weaver-e10-builder/assets/factory/factory-bubble.json +322 -0
- package/skills/weaver-e10-builder/assets/factory/factory-calendar.json +325 -0
- package/skills/weaver-e10-builder/assets/factory/factory-circular.json +320 -0
- package/skills/weaver-e10-builder/assets/factory/factory-collapse-panel.json +132 -0
- package/skills/weaver-e10-builder/assets/factory/factory-comment.json +388 -0
- package/skills/weaver-e10-builder/assets/factory/factory-count-down.json +198 -0
- package/skills/weaver-e10-builder/assets/factory/factory-digital-panel.json +108 -0
- package/skills/weaver-e10-builder/assets/factory/factory-eb-button.json +150 -0
- package/skills/weaver-e10-builder/assets/factory/factory-fast-create.json +62 -0
- package/skills/weaver-e10-builder/assets/factory/factory-gauge.json +312 -0
- package/skills/weaver-e10-builder/assets/factory/factory-h-bar-stack.json +328 -0
- package/skills/weaver-e10-builder/assets/factory/factory-h-bar.json +326 -0
- package/skills/weaver-e10-builder/assets/factory/factory-line.json +212 -0
- package/skills/weaver-e10-builder/assets/factory/factory-nav-bar.json +167 -0
- package/skills/weaver-e10-builder/assets/factory/factory-nav-menu.json +144 -0
- package/skills/weaver-e10-builder/assets/factory/factory-nav-panel.json +338 -0
- package/skills/weaver-e10-builder/assets/factory/factory-new-tab.json +163 -0
- package/skills/weaver-e10-builder/assets/factory/factory-nightingale.json +312 -0
- package/skills/weaver-e10-builder/assets/factory/factory-nlist.json +112 -0
- package/skills/weaver-e10-builder/assets/factory/factory-page-header.json +171 -0
- package/skills/weaver-e10-builder/assets/factory/factory-picture.json +169 -0
- package/skills/weaver-e10-builder/assets/factory/factory-pie.json +212 -0
- package/skills/weaver-e10-builder/assets/factory/factory-progress-chart.json +162 -0
- package/skills/weaver-e10-builder/assets/factory/factory-search-global.json +104 -0
- package/skills/weaver-e10-builder/assets/factory/factory-slide.json +164 -0
- package/skills/weaver-e10-builder/assets/factory/factory-treemap.json +322 -0
- package/skills/weaver-e10-builder/assets/icons.db +0 -0
- package/skills/weaver-e10-builder/assets/sample/.claude/settings.local.json +8 -0
- package/skills/weaver-e10-builder/assets/sample/api/formApi.js +510 -0
- package/skills/weaver-e10-builder/assets/sample/config/config.js +0 -0
- package/skills/weaver-e10-builder/assets/sample/config/configLoad.js +0 -0
- package/skills/weaver-e10-builder/assets/sample/config/configLoad_default.js +0 -0
- package/skills/weaver-e10-builder/assets/sample/config/config_default.js +0 -0
- package/skills/weaver-e10-builder/assets/sample/entry.js +22 -0
- package/skills/weaver-e10-builder/assets/sample/eslint.config.cjs +48 -0
- package/skills/weaver-e10-builder/assets/sample/memo.md +0 -0
- package/skills/weaver-e10-builder/assets/sample/readme.js +8 -0
- package/skills/weaver-e10-builder/references/app/guide-app-publish.md +92 -0
- package/skills/weaver-e10-builder/references/auth/guide-auth.md +88 -0
- package/skills/weaver-e10-builder/references/coding/guide-edit-backfill.md +189 -0
- package/skills/weaver-e10-builder/references/coding/guide-form-crud.md +262 -0
- package/skills/weaver-e10-builder/references/coding/guide-page-code.md +244 -0
- package/skills/weaver-e10-builder/references/coding/guide-page-export.md +119 -0
- package/skills/weaver-e10-builder/references/coding/ref-compile-rules.md +130 -0
- package/skills/weaver-e10-builder/references/common/guide-plan-template.md +164 -0
- package/skills/weaver-e10-builder/references/common/map.md +153 -0
- package/skills/weaver-e10-builder/references/common/ref-cli-commands.md +635 -0
- package/skills/weaver-e10-builder/references/components/@weapp-Button.md +104 -0
- package/skills/weaver-e10-builder/references/components/base-Badge.md +100 -0
- package/skills/weaver-e10-builder/references/components/base-Dialog.md +358 -0
- package/skills/weaver-e10-builder/references/components/base-Empty.md +58 -0
- package/skills/weaver-e10-builder/references/components/base-Tag.md +112 -0
- package/skills/weaver-e10-builder/references/components/display-Alert.md +64 -0
- package/skills/weaver-e10-builder/references/components/display-Avatar.md +150 -0
- package/skills/weaver-e10-builder/references/components/display-Calendar.md +263 -0
- package/skills/weaver-e10-builder/references/components/display-Carousel.md +115 -0
- package/skills/weaver-e10-builder/references/components/display-Collapse.md +299 -0
- package/skills/weaver-e10-builder/references/components/display-FilePreview.md +49 -0
- package/skills/weaver-e10-builder/references/components/display-Icon.md +66 -0
- package/skills/weaver-e10-builder/references/components/display-List.md +320 -0
- package/skills/weaver-e10-builder/references/components/display-Pagination.md +41 -0
- package/skills/weaver-e10-builder/references/components/display-Spin.md +34 -0
- package/skills/weaver-e10-builder/references/components/display-Steps.md +89 -0
- package/skills/weaver-e10-builder/references/components/display-Table.md +160 -0
- package/skills/weaver-e10-builder/references/components/display-Title.md +117 -0
- package/skills/weaver-e10-builder/references/components/form-Checkbox.md +161 -0
- package/skills/weaver-e10-builder/references/components/form-DepartmentBrowser-api.md +52 -0
- package/skills/weaver-e10-builder/references/components/form-EmployeeBrowser-api.md +51 -0
- package/skills/weaver-e10-builder/references/components/form-EmployeeBrowser.md +51 -0
- package/skills/weaver-e10-builder/references/components/form-Input.md +123 -0
- package/skills/weaver-e10-builder/references/components/form-Radio.md +145 -0
- package/skills/weaver-e10-builder/references/components/form-Select.md +191 -0
- package/skills/weaver-e10-builder/references/components/form-Switch.md +46 -0
- package/skills/weaver-e10-builder/references/components/form-Upload.md +53 -0
- package/skills/weaver-e10-builder/references/components/generic-Echarts.md +102 -0
- package/skills/weaver-e10-builder/references/ebuilder-designer/guide-designer-components.md +130 -0
- package/skills/weaver-e10-builder/references/ebuilder-designer/guide-designer-css.md +127 -0
- package/skills/weaver-e10-builder/references/ebuilder-designer/guide-designer-factory.md +460 -0
- package/skills/weaver-e10-builder/references/ebuilder-designer/guide-designer-version.md +111 -0
- package/skills/weaver-e10-builder/references/ebuilder-designer/guide-designer.md +288 -0
- package/skills/weaver-e10-builder/references/esb-interface/guide-import.md +34 -0
- package/skills/weaver-e10-builder/references/form/guide-create-form.md +248 -0
- package/skills/weaver-e10-builder/references/form/guide-ebuilder-filter.md +73 -0
- package/skills/weaver-e10-builder/references/form/guide-ebuilder-scope.md +82 -0
- package/skills/weaver-e10-builder/references/form/guide-field-linkage.md +123 -0
- package/skills/weaver-e10-builder/references/form/guide-form-archive-permission.md +175 -0
- package/skills/weaver-e10-builder/references/form/guide-form-association.md +124 -0
- package/skills/weaver-e10-builder/references/form/guide-form-button.md +169 -0
- package/skills/weaver-e10-builder/references/form/guide-form-data.md +78 -0
- package/skills/weaver-e10-builder/references/form/guide-form-formula-functions.md +343 -0
- package/skills/weaver-e10-builder/references/form/guide-form-layout-incremental.md +90 -0
- package/skills/weaver-e10-builder/references/form/guide-form-layout-planning.md +68 -0
- package/skills/weaver-e10-builder/references/form/guide-form-linkage.md +269 -0
- package/skills/weaver-e10-builder/references/form/guide-form-message.md +74 -0
- package/skills/weaver-e10-builder/references/form/guide-form-physical-table.md +146 -0
- package/skills/weaver-e10-builder/references/form/guide-form-serial-mark.md +47 -0
- package/skills/weaver-e10-builder/references/form/guide-form-sub-detail.md +82 -0
- package/skills/weaver-e10-builder/references/form/guide-form-view-permission.md +38 -0
- package/skills/weaver-e10-builder/references/form/guide-form-view.md +371 -0
- package/skills/weaver-e10-builder/references/form/guide-formula-linkage.md +281 -0
- package/skills/weaver-e10-builder/references/form/guide-list-columns.md +52 -0
- package/skills/weaver-e10-builder/references/form/guide-list-custom-text.md +52 -0
- package/skills/weaver-e10-builder/references/form/guide-list-stats.md +136 -0
- package/skills/weaver-e10-builder/references/form/guide-virtual-form.md +156 -0
- package/skills/weaver-e10-builder/references/form/ref-form-fields.md +293 -0
- package/skills/weaver-e10-builder/references/form/style-templates.md +97 -0
- package/skills/weaver-e10-builder/references/hrm/guide-matrix.md +245 -0
- package/skills/weaver-e10-builder/references/hrm/guide-org-employee.md +155 -0
- package/skills/weaver-e10-builder/references/menu/system-menus.md +75 -0
- package/skills/weaver-e10-builder/references/report/add-dataset-registration-guide.md +139 -0
- package/skills/weaver-e10-builder/references/report/ai-report-workflow.md +412 -0
- package/skills/weaver-e10-builder/references/report/api-report-build-fast-path.md +275 -0
- package/skills/weaver-e10-builder/references/report/app-datasource-lookup-guide.md +230 -0
- package/skills/weaver-e10-builder/references/report/cell-config-echo-guide.md +163 -0
- package/skills/weaver-e10-builder/references/report/cell-transform-guide.md +147 -0
- package/skills/weaver-e10-builder/references/report/condition-format-guide.md +140 -0
- package/skills/weaver-e10-builder/references/report/cross-dataset-filter-guide.md +304 -0
- package/skills/weaver-e10-builder/references/report/dataset-query-filter-guide.md +235 -0
- package/skills/weaver-e10-builder/references/report/dataset-sidebar-ops-guide.md +280 -0
- package/skills/weaver-e10-builder/references/report/dataset-table-field-contract-guide.md +339 -0
- package/skills/weaver-e10-builder/references/report/datasource-metadata-guide.md +365 -0
- package/skills/weaver-e10-builder/references/report/datasource-selection-and-parent-filter-guide.md +148 -0
- package/skills/weaver-e10-builder/references/report/date-range-query-reference.md +102 -0
- package/skills/weaver-e10-builder/references/report/default-header-style-guide.md +70 -0
- package/skills/weaver-e10-builder/references/report/designer-blank-prevention-guide.md +111 -0
- package/skills/weaver-e10-builder/references/report/event-hreflink-guide.md +184 -0
- package/skills/weaver-e10-builder/references/report/field-bind-exact-match-guide.md +208 -0
- package/skills/weaver-e10-builder/references/report/formula-cell-api-guide.md +258 -0
- package/skills/weaver-e10-builder/references/report/guide-report-build.md +131 -0
- package/skills/weaver-e10-builder/references/report/guide-report-modify.md +100 -0
- package/skills/weaver-e10-builder/references/report/guide-report-multisource.md +143 -0
- package/skills/weaver-e10-builder/references/report/guide-report-query.md +98 -0
- package/skills/weaver-e10-builder/references/report/hidden-row-and-header-merge-guide.md +100 -0
- package/skills/weaver-e10-builder/references/report/layout-showlocation-freeze-guide.md +167 -0
- package/skills/weaver-e10-builder/references/report/preaggregate-auto-disable-guide.md +107 -0
- package/skills/weaver-e10-builder/references/report/query-condition-api-guide.md +890 -0
- package/skills/weaver-e10-builder/references/report/ref-report-commands.md +122 -0
- package/skills/weaver-e10-builder/references/report/ref-report-pitfalls.md +226 -0
- package/skills/weaver-e10-builder/references/report/report-baseinfo-defaults-guide.md +117 -0
- package/skills/weaver-e10-builder/references/report/report-building-guide.md +511 -0
- package/skills/weaver-e10-builder/references/report/report-config-schema.md +445 -0
- package/skills/weaver-e10-builder/references/report/report-create-modes-guide.md +182 -0
- package/skills/weaver-e10-builder/references/report/report-data-model.md +447 -0
- package/skills/weaver-e10-builder/references/report/report-delivery-contract.md +101 -0
- package/skills/weaver-e10-builder/references/report/report-designer-feature-map.md +500 -0
- package/skills/weaver-e10-builder/references/report/report-internal-error-guide.md +78 -0
- package/skills/weaver-e10-builder/references/report/report-knowledge-base.md +389 -0
- package/skills/weaver-e10-builder/references/report/report-lifecycle-api-guide.md +392 -0
- package/skills/weaver-e10-builder/references/report/report-list-page-ops-guide.md +191 -0
- package/skills/weaver-e10-builder/references/report/report-permission-guide.md +365 -0
- package/skills/weaver-e10-builder/references/report/report-requirement-analysis-template.md +202 -0
- package/skills/weaver-e10-builder/references/report/report-self-check-guide.md +164 -0
- package/skills/weaver-e10-builder/references/report/safe-partial-save-guide.md +151 -0
- package/skills/weaver-e10-builder/references/report/snowflake-id-precision-guide.md +84 -0
- package/skills/weaver-e10-builder/references/report/spec-build-schema.md +294 -0
- package/skills/weaver-e10-builder/references/report/targeted-fix-guide.md +97 -0
- package/skills/weaver-e10-builder/references/report/user-request-scope-only-guide.md +82 -0
- package/skills/weaver-e10-builder/references/workflow/guide-function-management.md +154 -0
- package/skills/weaver-e10-builder/references/workflow/guide-opinion-settings.md +126 -0
- package/skills/weaver-e10-builder/references/workflow/guide-workflow-action.md +174 -0
- package/skills/weaver-e10-builder/references/workflow/guide-workflow-auth-resp.md +224 -0
- package/skills/weaver-e10-builder/references/workflow/guide-workflow-condition.md +447 -0
- package/skills/weaver-e10-builder/references/workflow/guide-workflow-node-layout.md +181 -0
- package/skills/weaver-e10-builder/references/workflow/guide-workflow-odoc-setting.md +248 -0
- package/skills/weaver-e10-builder/references/workflow/guide-workflow-odoc.md +68 -0
- package/skills/weaver-e10-builder/references/workflow/guide-workflow.md +527 -0
- package/skills/weaver-e10-builder/references/workflow/operator-matrix.md +76 -0
- package/skills/weaver-e10-caizhilian/SKILL.md +14 -4
- package/skills/weaver-e10-caizhilian/references/file-upload.md +100 -295
- package/skills/weaver-e10-caizhilian/references/files.md +15 -0
- package/skills/weaver-e10-caizhilian/references/folder.md +31 -3
- package/skills/weaver-e10-caizhilian/references/setting-attach.md +48 -3
- package/skills/weaver-e10-caizhilian/references/source-manifest.json +634 -25
- package/skills/weaver-e10-jiuchuanhui/SKILL.md +9 -1
- package/skills/weaver-e10-shared/SKILL.md +19 -5
- package/skills/weaver-e10-shared/references/e10-auth-and-session.md +25 -5
- package/skills/weaver-e10-workflow/SKILL.md +28 -47
- package/skills/weaver-e10-workflow/references/source-manifest.json +46 -36
- package/skills/weaver-e10-workflow/references/workflow-batch.md +2 -4
- package/skills/weaver-e10-workflow/references/workflow-create.md +261 -86
- package/skills/weaver-e10-workflow/references/workflow-edit.md +2 -1
- package/skills/weaver-e10-workflow/references/workflow-memory.md +3 -6
- package/skills/weaver-e10-workflow/references/workflow-operate.md +2 -1
- package/skills/weaver-e10-workflow/references/workflow-query.md +11 -9
- package/skills/weaver-e10-workflow/references/workflow-share.md +2 -0
|
@@ -11,6 +11,7 @@ import { workflowSuccess, schemaOf, SCHEMA_REQUEST_ID, SCHEMA_CATEGORY, SCHEMA_I
|
|
|
11
11
|
import { asString, asInt, asStringArray, asBool, compact, responseData, detailDataOf, toArray, resolveMemoryAppId, withLeadingMeta, STDOUT_SAFE_BYTES, stdoutBytesOf, parseNameWithId, } from './shared.js';
|
|
12
12
|
import { workflowValidationError, WorkflowCliError, workflowClarificationError, CLARIFICATION_SUBTYPE, } from '../errors.js';
|
|
13
13
|
import { WORKFLOW_ENDPOINTS } from '../endpoints.js';
|
|
14
|
+
import { flowStatusCondition, FLOW_STATUS_HINT } from './flow-status.js';
|
|
14
15
|
import { loadSearchIndex, saveSearchIndex, findIndexedItem, readStateFile, writeStateFileBestEffort, } from '../state.js';
|
|
15
16
|
const ENDPOINT_PREFIX = {
|
|
16
17
|
todo: 'TODO',
|
|
@@ -407,10 +408,10 @@ async function resolveTerm(env, systemKey, rawValue, label) {
|
|
|
407
408
|
// 0 命中:只有 --workflow 澄清,其余系统字段一律失败(V11.3 口径)
|
|
408
409
|
if (systemKey === 'workflowid') {
|
|
409
410
|
throw workflowClarificationError(clarificationType, text, `${label}「${text}」未匹配到任何对象。请核对名称(是否写错字/少了字),`
|
|
410
|
-
+
|
|
411
|
+
+ `或提供该对象的完整名称(或其它可用于检索的关键词)后再查。`);
|
|
411
412
|
}
|
|
412
413
|
throw workflowValidationError(`${systemKey}_not_found`, `${label}「${text}」未匹配到任何对象(该筛选条件不会生效,继续执行会返回不含该条件的全量数据),`
|
|
413
|
-
+ '
|
|
414
|
+
+ '本次查询已停止。请核对名称,或提供该对象更完整的名称(或其它可用于检索的关键词)后重发。');
|
|
414
415
|
}
|
|
415
416
|
const exact = candidates.filter((item) => item.name.trim().toLowerCase() === text.trim().toLowerCase());
|
|
416
417
|
if (exact.length === 1)
|
|
@@ -496,7 +497,7 @@ async function resolveRequestLevel(env, rawValue) {
|
|
|
496
497
|
throw workflowClarificationError('system_relate_name2id_requestlevel', text, `紧急程度「${text}」匹配到 ${selected.length} 个等级,请确认要查询的具体等级。`, clarificationCandidates(selected, 10));
|
|
497
498
|
}
|
|
498
499
|
throw workflowValidationError('requestlevel_not_found', `紧急程度「${text}」未匹配到任何等级(该筛选条件不会生效),本次查询已停止。`
|
|
499
|
-
+ `当前环境可选等级:${listed}
|
|
500
|
+
+ `当前环境可选等级:${listed}。请从上面的等级名称中选一个后重发。`);
|
|
500
501
|
}
|
|
501
502
|
/** 时间条件 → formDatas 顶层键(来源:Python MEMORY_DATE_FORM_KEYS)。取值非法时按 V11.3 静默丢弃该条件。 */
|
|
502
503
|
function applyTimeCondition(formDatas, fieldKey, raw) {
|
|
@@ -1012,16 +1013,39 @@ async function buildSearchQuery(env, args, mode) {
|
|
|
1012
1013
|
if (requestLevel)
|
|
1013
1014
|
formDatas.requestlevel = [{ content: requestLevel }];
|
|
1014
1015
|
// 当前节点 ID
|
|
1016
|
+
// ★ 浏览按钮类条件:只认 `[{term, browserDatas:[{id, name}]}]`。
|
|
1017
|
+
// 旧实现写成 `[{content, term}]`(纯文本形态,那是 requestname/requestmark 的口径)
|
|
1018
|
+
// ⇒ 服务端**静默忽略**该条件、按节点筛选恒不生效——与 `flowstatus` 是同一类移植退化
|
|
1019
|
+
// (对照 `./flow-status.ts` 文件头)。节点是"浏览按钮"字段,不是文本字段。
|
|
1020
|
+
// 来源:V11.3 `e10_workflow.py:10927-10931`,逐字为
|
|
1021
|
+
// `{"term": _node_term, "browserDatas": [{"id": nid, "name": ""} for nid in _node_ids]}`;
|
|
1022
|
+
// 自动匹配路径 `:10637` 是 `[{"term": "in", "browserDatas": nodes}]`,nodes 形如 `{id, name}`。
|
|
1023
|
+
// **browserDatas 里真正起作用的只有 `id`**(用户 2026-09-28 澄清:真实抓包里的 content 等属性
|
|
1024
|
+
// 都非必需);本层拿不到节点名 ⇒ `name` 置空串,与 V11.3 的 `--node-id` 路径完全一致。
|
|
1025
|
+
// 多值合并为「单个条件项 + 多 browserDatas」(同 workflowid 的口径),逐值拆成多个条件项会被
|
|
1026
|
+
// 服务端按 AND 处理 → 恒 0 条。
|
|
1015
1027
|
const nodeId = asString(args.nodeId);
|
|
1016
1028
|
if (nodeId) {
|
|
1017
1029
|
const term = asString(args.nodeIdTerm) === 'notin' ? 'notin' : 'in';
|
|
1018
|
-
|
|
1030
|
+
const nodeIds = nodeId.split(',').map((id) => id.trim()).filter(Boolean);
|
|
1031
|
+
if (!nodeIds.length) {
|
|
1032
|
+
throw workflowValidationError('node_id_empty', 'nodeId 必须是节点 ID(可逗号分隔多个),当前只传了分隔符。');
|
|
1033
|
+
}
|
|
1034
|
+
formDatas.nodeid = [{ term, browserDatas: nodeIds.map((id) => ({ id, name: '' })) }];
|
|
1019
1035
|
}
|
|
1020
1036
|
// 流程状态
|
|
1037
|
+
// ★ 选项类条件:只认 `[{term, multiContent:[代码]}]`(见 `./flow-status.ts` 的文件头)。
|
|
1038
|
+
// 旧实现写成 `[{content, term}]` ⇒ 服务端静默忽略该条件、按状态筛选恒不生效。
|
|
1039
|
+
// 取值口径(方案 C)=**只认四个代码、不做中文识别**;出现任何非代码取值即报错停止。
|
|
1021
1040
|
const flowStatus = asString(args.flowStatus);
|
|
1022
1041
|
if (flowStatus) {
|
|
1023
|
-
const
|
|
1024
|
-
|
|
1042
|
+
const parsed = flowStatusCondition(flowStatus, args.flowStatusTerm);
|
|
1043
|
+
if (!parsed || parsed.invalid.length) {
|
|
1044
|
+
const offending = parsed?.invalid.length ? parsed.invalid.join('、') : flowStatus;
|
|
1045
|
+
throw workflowValidationError('flow_status_unrecognized', `流程状态「${offending}」不是有效选项代码,本次已停止返回——静默丢弃该条件会退化成全量查询。`
|
|
1046
|
+
+ `可选值:${FLOW_STATUS_HINT}。`, { allowedFlowStatus: FLOW_STATUS_HINT });
|
|
1047
|
+
}
|
|
1048
|
+
formDatas.flowstatus = parsed.condition;
|
|
1025
1049
|
}
|
|
1026
1050
|
// 时间条件(来源:Python build_system_date_conditions——待办分类下移除操作时间条件:
|
|
1027
1051
|
// 待办是"还未处理"的流程,操作时间(已操作过的时间)与待办状态语义矛盾)
|
|
@@ -1041,12 +1065,12 @@ async function buildSearchQuery(env, args, mode) {
|
|
|
1041
1065
|
if (filterFieldsRaw.length) {
|
|
1042
1066
|
if (!resolvedWorkflows.length) {
|
|
1043
1067
|
throw workflowValidationError('field_require_workflow', '使用表单字段筛选时必须同时指定工作流(服务端只在该工作流的表单字段内匹配)。'
|
|
1044
|
-
+ '
|
|
1068
|
+
+ '请先与用户确认要查哪个工作流——只问完整名称或其它可用于检索的关键词,不要向用户索取 ID——再由你按「名称(ID)」传入 workflow,并附上 filterFields。');
|
|
1045
1069
|
}
|
|
1046
1070
|
if (resolvedWorkflows.length > 1) {
|
|
1047
1071
|
throw workflowValidationError('field_require_single_workflow', `表单字段筛选一次只能用于**单个**工作流,当前指定了 ${resolvedWorkflows.length} 个:`
|
|
1048
1072
|
+ `${resolvedWorkflows.map((w) => `${w.name}(${w.id})`).join(';')}。`
|
|
1049
|
-
+ '
|
|
1073
|
+
+ '请先把候选工作流展示给用户确认(只问完整名称或其它可用于检索的关键词,不要向用户索取 ID),再由你按「名称(ID)」传入单个 workflow 与 filterFields。', { candidates: resolvedWorkflows.map((w, index) => ({ index: index + 1, id: w.id, name: w.name })) });
|
|
1050
1074
|
}
|
|
1051
1075
|
const targetWorkflow = resolvedWorkflows[0];
|
|
1052
1076
|
const workflowLabel = `${targetWorkflow.name || targetWorkflow.id}(${targetWorkflow.id})`;
|
|
@@ -1505,7 +1529,7 @@ const workflowSearch = {
|
|
|
1505
1529
|
creatorDept: { type: 'string', description: '发起人部门;纯名称多命中返回澄清候选,0 命中报错' },
|
|
1506
1530
|
creatorSubcom: { type: 'string', description: '发起人分部;纯名称多命中返回澄清候选,0 命中报错' },
|
|
1507
1531
|
workflowType: { type: 'string', description: '工作流类型;纯名称多命中返回澄清候选,0 命中报错' },
|
|
1508
|
-
workflow: { type: 'array', items: { type: 'string' }, description: '工作流条件,多个 or;支持 "名称(ID)";纯名称未匹配到/匹配到多个且无全名精确匹配时返回澄清(候选见 candidates
|
|
1532
|
+
workflow: { type: 'array', items: { type: 'string' }, description: '工作流条件,多个 or;支持 "名称(ID)";纯名称未匹配到/匹配到多个且无全名精确匹配时返回澄清(候选见 candidates),确认后由你按「名称(ID)」重发(只问用户完整名称,不要向用户索取 ID)' },
|
|
1509
1533
|
workflowTerm: { type: 'string', enum: ['in', 'notin'] },
|
|
1510
1534
|
requestName: { type: 'string', description: '流程标题 like 模糊' },
|
|
1511
1535
|
requestNameTerm: { type: 'string', enum: ['in', 'notin', 'eq', 'ne'] },
|
|
@@ -1514,9 +1538,9 @@ const workflowSearch = {
|
|
|
1514
1538
|
requestLevel: { type: 'string', description: '紧急程度名称(CLI 按当前环境等级列表转 ID);纯名称多命中返回澄清候选,0 命中报错并列出可选等级(对齐 V11.3)' },
|
|
1515
1539
|
requestId: { type: 'string', description: '按 requestId 精确过滤,逗号分隔' },
|
|
1516
1540
|
exRequestId: { type: 'string', description: '排除 requestId,逗号分隔' },
|
|
1517
|
-
nodeId: { type: 'string', description: '当前节点 ID' },
|
|
1541
|
+
nodeId: { type: 'string', description: '当前节点 ID,逗号分隔可多值(浏览按钮类条件,只能填节点 ID,不能填节点名称)' },
|
|
1518
1542
|
nodeIdTerm: { type: 'string', enum: ['in', 'notin'] },
|
|
1519
|
-
flowStatus: { type: 'string', description:
|
|
1543
|
+
flowStatus: { type: 'string', description: `流程状态(选项类,多选):${FLOW_STATUS_HINT}` },
|
|
1520
1544
|
flowStatusTerm: { type: 'string', enum: ['in', 'notin'] },
|
|
1521
1545
|
createTime: { type: 'string', description: TIME_DESCRIPTIONS.createTime },
|
|
1522
1546
|
operateTime: { type: 'string', description: TIME_DESCRIPTIONS.operateTime },
|
|
@@ -2406,7 +2430,7 @@ function planGroupError(groupName, error) {
|
|
|
2406
2430
|
// 与 V11.3 的组内文案同口径(`_plan_system_field_form_datas`:
|
|
2407
2431
|
// 「plan 内不做澄清,请改用 名称(ID) 形式」)——否则模型会把澄清问题当成"该组没有数据"。
|
|
2408
2432
|
error: clarification
|
|
2409
|
-
? `${error.message}(plan
|
|
2433
|
+
? `${error.message}(plan 内不做澄清:请把候选原样交给用户确认——只问完整名称或其它可用于检索的关键词,不要向用户索取 ID;确认后由你按「名称(ID)」拼好重跑该组)`
|
|
2410
2434
|
: error.message,
|
|
2411
2435
|
...(clarification
|
|
2412
2436
|
? {
|
|
@@ -2626,7 +2650,7 @@ async function executePlanSearch(env, plan, planPageSize = 10) {
|
|
|
2626
2650
|
'plan 返回为批量编排结果:特殊组/展开组各段 finalMarkdown 均为纯卡片列表(无顶部行),原样粘贴到对应分组标题与一行汇总摘要下',
|
|
2627
2651
|
'紧急/超时组标题计数:N=该组各槽 total 之和、M=urgent 槽 total、K=overtime 槽 total(0 项省略),如 ## 紧急/超时(2 条|紧急 1 条|超时 1 条)',
|
|
2628
2652
|
'折叠组(collapsed=true)只返回 total 与 byWorkflow 数量,不展开明细;status=error 的组未取数,按 error 提示修正后可单独作为单条 workflow.search 查询',
|
|
2629
|
-
'status=error 的组:原样把 error 交给用户。若该组同时带 clarificationType/candidates,说明是**名称没对上**(不是"该组没有数据"
|
|
2653
|
+
'status=error 的组:原样把 error 交给用户。若该组同时带 clarificationType/candidates,说明是**名称没对上**(不是"该组没有数据")——请把候选摆给用户确认(只问完整名称或其它可用于检索的关键词,不要向用户索取 ID),确认后由你按「名称(ID)」拼好、用该组条件单独发一次 workflow.search,禁止当作 0 条渲染或自行挑一个候选',
|
|
2630
2654
|
'任一流程只出现在一个分组:特殊组流程已注入 exRequestIds 从展开组排除',
|
|
2631
2655
|
'展开组 pureDraft=true:该组卡片全部为本人待提交草稿(draftCount=total),不要渲染其 finalMarkdown(为空),全部并入折叠组「待提交草稿(N 条)」(N=各 pureDraft 组 draftCount 之和)',
|
|
2632
2656
|
'展开组 pureDraft=false:其 finalMarkdown 已只渲染非草稿卡片(草稿卡片被剔除、数量见 draftCount),直接整段原样粘贴;组内草稿数量在标题/汇总注明即可,无需再逐条展示草稿',
|
|
@@ -4888,6 +4912,383 @@ export const workflowReadOperations = [
|
|
|
4888
4912
|
workflowPageOpen,
|
|
4889
4913
|
workflowMemoryPrompt,
|
|
4890
4914
|
];
|
|
4915
|
+
// ---------------------------------------------------------------------------
|
|
4916
|
+
// 「必填字段 → 历史可参考值」取数(`workflow.createForm` 内部调用,结果缓存进 continuation)
|
|
4917
|
+
//
|
|
4918
|
+
// 场景:发起流程时,先把**当前用户近一年内、非草稿(审批中+已结束)**的最近 5 条「我发起的」
|
|
4919
|
+
// 流程,连同这些流程里**本次这张表单的字段取值**一起取回来,交给模型判断"能不能直接参考历史值
|
|
4920
|
+
// 补上必填项"——能补就不必去打扰用户。
|
|
4921
|
+
//
|
|
4922
|
+
// V12.1.77 起**调用点从 createRequest 前移到 createForm**(用户 2026-09-29 裁定):
|
|
4923
|
+
// · createForm 阶段就把结果算好,一部分(本表单的**必填字段**)随返回值给模型,让模型**第一次**
|
|
4924
|
+
// `createRequest` 就能带上历史值;
|
|
4925
|
+
// · 完整结果(本表单**全部**字段)缓存进 continuation 载荷,`createRequest` 遇到"新出现的必填
|
|
4926
|
+
// 字段"(createForm 当时还不是必填、多为联动后才变必填)时,直接从缓存里筛,**不再联网**。
|
|
4927
|
+
// · 因此这里支持 `allFormFields`:保留**本表单**所有能取到值的字段,而不只是传入的 targets。
|
|
4928
|
+
//
|
|
4929
|
+
// 两次请求:
|
|
4930
|
+
// ① 列表 `MINE_LIST`(**不调 total**:只要 5 条数据,总数没有意义)
|
|
4931
|
+
// ② 明细 `REQUEST_DETAIL` ×N(**并行**)——`isGetRequestBaseInfo` / `isGetRequestLog` /
|
|
4932
|
+
// `isReadRequest` 全 false、`isGetFormData` true。**`isReadRequest:false` 是关键**:
|
|
4933
|
+
// 一次内部取数不能把用户的历史单标成已读(`workflow.detail` 传的是 true,故不可复用)。
|
|
4934
|
+
//
|
|
4935
|
+
// 稳定性:这是**辅助信息**,失败不能拖垮发起链路 ⇒ 只有认证/网络错误原样上抛,其余错误一律
|
|
4936
|
+
// 降级为 `null`(对模型的文档口径:`null` = 没有可参考的历史数据,请直接向用户澄清)。
|
|
4937
|
+
// ---------------------------------------------------------------------------
|
|
4938
|
+
/** 历史参考数据条数上限。 */
|
|
4939
|
+
export const HISTORY_REQUEST_LIMIT = 5;
|
|
4940
|
+
/** 历史参考数据回溯窗口(天):近一年。 */
|
|
4941
|
+
const HISTORY_LOOKBACK_DAYS = 365;
|
|
4942
|
+
/** 本地日期 → `YYYY-MM-DD`(不用 `toISOString`:那是 UTC,会跨日)。 */
|
|
4943
|
+
function formatLocalDate(date) {
|
|
4944
|
+
const pad = (value) => String(value).padStart(2, '0');
|
|
4945
|
+
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
|
|
4946
|
+
}
|
|
4947
|
+
/** 原始值是否"空"(空值不能作为参考值)。 */
|
|
4948
|
+
function isEmptyRawFieldValue(value) {
|
|
4949
|
+
if (value === null || value === undefined)
|
|
4950
|
+
return true;
|
|
4951
|
+
if (typeof value === 'string')
|
|
4952
|
+
return value.trim() === '';
|
|
4953
|
+
if (Array.isArray(value))
|
|
4954
|
+
return value.length === 0;
|
|
4955
|
+
if (typeof value === 'object')
|
|
4956
|
+
return Object.keys(value).length === 0;
|
|
4957
|
+
return false;
|
|
4958
|
+
}
|
|
4959
|
+
/**
|
|
4960
|
+
* 明细表单字段的**原始值**(保留对象形态,便于按字段类型格式化成可复用写法)。
|
|
4961
|
+
*
|
|
4962
|
+
* 与 `detailFormFieldValue` 同契约、同候选顺序,唯一区别是**不提前串化**——后者服务详情面板
|
|
4963
|
+
* (只需要可读文本),前者服务历史参考值(还需要 `id` 才能拼出 `名称(id)`)。两处必须同步修改。
|
|
4964
|
+
*
|
|
4965
|
+
* ★ 2026-10-14 补齐 `dataText` 候选(此前只存在于 `detailFormFieldValue`,两边口径**并不一致**):
|
|
4966
|
+
* `TextArea` 类字段(真机 `报销事由`)的值在 detail 响应里是 `dataText: {content/richContent/…}`,
|
|
4967
|
+
* 只有详情面板分支认得它 ⇒ 历史参考值恒缺这一类字段(真机实证:同一条历史流程,
|
|
4968
|
+
* 详情面板解出 50 个字段、历史取值只有 49 个,差的正好是唯一的必填 `TextArea` 字段
|
|
4969
|
+
* `报销事由`,其值 `2026-08…`)。这里返回**已抽出的展示文本**(与详情面板同口径),
|
|
4970
|
+
* 调用方的 `formatHistoryFieldValue` 仍会按字段类型二次格式化。
|
|
4971
|
+
*/
|
|
4972
|
+
function detailFormFieldRawValue(obj, formField) {
|
|
4973
|
+
const dataKey = pickText(formField, 'dataKey', 'fieldKey', 'key');
|
|
4974
|
+
const fieldId = pickText(formField, 'id', 'fieldId');
|
|
4975
|
+
const fieldName = pickText(formField, 'title', 'fieldName', 'name', 'label');
|
|
4976
|
+
const formData = obj?.formData;
|
|
4977
|
+
if (formData && typeof formData === 'object') {
|
|
4978
|
+
for (const key of [dataKey, fieldId, fieldName]) {
|
|
4979
|
+
if (key && key in formData) {
|
|
4980
|
+
const value = formData[key];
|
|
4981
|
+
if (!isEmptyRawFieldValue(value))
|
|
4982
|
+
return value;
|
|
4983
|
+
}
|
|
4984
|
+
}
|
|
4985
|
+
}
|
|
4986
|
+
if (Array.isArray(obj?.dataOptions) && obj.dataOptions.length)
|
|
4987
|
+
return obj.dataOptions;
|
|
4988
|
+
const dataText = obj?.dataText;
|
|
4989
|
+
if (dataText && typeof dataText === 'object') {
|
|
4990
|
+
const text = stringifyDetailDataText(dataText);
|
|
4991
|
+
if (text)
|
|
4992
|
+
return text;
|
|
4993
|
+
}
|
|
4994
|
+
for (const key of ['showValue', 'displayValue', 'fieldValue', 'value', 'content', 'text']) {
|
|
4995
|
+
if (obj && typeof obj === 'object' && key in obj) {
|
|
4996
|
+
const value = obj[key];
|
|
4997
|
+
if (!isEmptyRawFieldValue(value))
|
|
4998
|
+
return value;
|
|
4999
|
+
}
|
|
5000
|
+
}
|
|
5001
|
+
return null;
|
|
5002
|
+
}
|
|
5003
|
+
/** 递归收集明细里的 `fieldId → 原始值`(只记**第一个非空**值,避免日志域的同 id 空值遮蔽真值)。 */
|
|
5004
|
+
function collectHistoryFieldRawValues(node, out, depth = 0) {
|
|
5005
|
+
if (!node || typeof node !== 'object' || depth > 8)
|
|
5006
|
+
return;
|
|
5007
|
+
if (Array.isArray(node)) {
|
|
5008
|
+
for (const item of node)
|
|
5009
|
+
collectHistoryFieldRawValues(item, out, depth + 1);
|
|
5010
|
+
return;
|
|
5011
|
+
}
|
|
5012
|
+
const record = node;
|
|
5013
|
+
const formField = record.formField;
|
|
5014
|
+
if (formField && typeof formField === 'object') {
|
|
5015
|
+
const fieldId = pickText(formField, 'id', 'fieldId');
|
|
5016
|
+
if (fieldId && !out.has(fieldId)) {
|
|
5017
|
+
const raw = detailFormFieldRawValue(record, formField);
|
|
5018
|
+
if (raw !== null)
|
|
5019
|
+
out.set(fieldId, raw);
|
|
5020
|
+
}
|
|
5021
|
+
}
|
|
5022
|
+
for (const key of Object.keys(record)) {
|
|
5023
|
+
const child = record[key];
|
|
5024
|
+
if (child && typeof child === 'object')
|
|
5025
|
+
collectHistoryFieldRawValues(child, out, depth + 1);
|
|
5026
|
+
}
|
|
5027
|
+
}
|
|
5028
|
+
/** 从一个原始值里抽出 `名称 / ID` 对(浏览按钮、选项类字段的值都是这种形态)。 */
|
|
5029
|
+
function historyNameIdPairs(value) {
|
|
5030
|
+
const pairs = [];
|
|
5031
|
+
const visit = (item) => {
|
|
5032
|
+
if (item === null || item === undefined)
|
|
5033
|
+
return;
|
|
5034
|
+
if (Array.isArray(item)) {
|
|
5035
|
+
for (const child of item)
|
|
5036
|
+
visit(child);
|
|
5037
|
+
return;
|
|
5038
|
+
}
|
|
5039
|
+
if (typeof item === 'object') {
|
|
5040
|
+
const name = pickText(item, 'name', 'showName', 'displayValue', 'showValue', 'label', 'title', 'lastName', 'userName', 'content', 'value');
|
|
5041
|
+
const id = pickText(item, 'id', 'optionId', 'selectionId', 'valueKey', 'code', 'key', 'value');
|
|
5042
|
+
if (name || id)
|
|
5043
|
+
pairs.push({ name: name || id, id: id && id !== name ? id : '' });
|
|
5044
|
+
return;
|
|
5045
|
+
}
|
|
5046
|
+
const text = String(item).trim();
|
|
5047
|
+
if (text)
|
|
5048
|
+
pairs.push({ name: text, id: '' });
|
|
5049
|
+
};
|
|
5050
|
+
visit(value);
|
|
5051
|
+
return pairs;
|
|
5052
|
+
}
|
|
5053
|
+
/**
|
|
5054
|
+
* 附件类字段(`FileComponent`)的**可直接复用**历史值。
|
|
5055
|
+
*
|
|
5056
|
+
* 为什么必须保留结构化对象:detail 接口对附件字段返回的本就是
|
|
5057
|
+
* `{formField:{id}, dataOptions:[{optionId, content, type}]}`——`optionId` 是服务端的**附件 ID**、
|
|
5058
|
+
* `type` 是文件类型(图片是 `image`、普通文件是 `file`)、`content` 是文件名。早先这里没有专门分支,
|
|
5059
|
+
* 被 `stringifyDetailValue` 压成"只有文件名的字符串",模型手里没有真 ID,只能拿文件名去拼一个
|
|
5060
|
+
* ⇒ `saveFormData` 落库的附件对象指向不存在的文件(2026-09-30 真机会话实证:报错重试后命令
|
|
5061
|
+
* 不报错、提交成功,但对象是错的)。信息本来就在,必须在格式化这一步留住。
|
|
5062
|
+
*
|
|
5063
|
+
* 任一项缺 `optionId`/`content` 时**不猜**:返回 `null` 让调用方退回纯文本形态(旧口径)。
|
|
5064
|
+
*/
|
|
5065
|
+
function historyAttachmentValue(raw, field) {
|
|
5066
|
+
const fieldId = String(field?.id ?? '').trim();
|
|
5067
|
+
if (!fieldId)
|
|
5068
|
+
return null;
|
|
5069
|
+
const options = [];
|
|
5070
|
+
let incomplete = false;
|
|
5071
|
+
const visit = (item) => {
|
|
5072
|
+
if (item === null || item === undefined)
|
|
5073
|
+
return;
|
|
5074
|
+
if (Array.isArray(item)) {
|
|
5075
|
+
for (const child of item)
|
|
5076
|
+
visit(child);
|
|
5077
|
+
return;
|
|
5078
|
+
}
|
|
5079
|
+
if (typeof item !== 'object')
|
|
5080
|
+
return;
|
|
5081
|
+
const optionId = pickText(item, 'optionId', 'fileId', 'fid');
|
|
5082
|
+
const content = pickText(item, 'content', 'fileName', 'name', 'showName', 'label', 'title', 'value');
|
|
5083
|
+
if (!optionId || !content) {
|
|
5084
|
+
incomplete = true;
|
|
5085
|
+
return;
|
|
5086
|
+
}
|
|
5087
|
+
const type = pickText(item, 'type', 'fileType');
|
|
5088
|
+
options.push(type ? { optionId, content, type } : { optionId, content });
|
|
5089
|
+
};
|
|
5090
|
+
visit(raw);
|
|
5091
|
+
if (incomplete || !options.length)
|
|
5092
|
+
return null;
|
|
5093
|
+
return { formField: { id: fieldId }, dataOptions: options };
|
|
5094
|
+
}
|
|
5095
|
+
/** 按字段类型把原始值格式化成"可直接复用"的写法。 */
|
|
5096
|
+
function formatHistoryFieldValue(raw, field) {
|
|
5097
|
+
// 附件类:必须回到结构化对象,否则模型拿不到真 `optionId`/`type`(见 historyAttachmentValue)。
|
|
5098
|
+
if (String(field?.componentKey ?? '').toLowerCase() === 'filecomponent') {
|
|
5099
|
+
const attachment = historyAttachmentValue(raw, field);
|
|
5100
|
+
if (attachment)
|
|
5101
|
+
return attachment;
|
|
5102
|
+
}
|
|
5103
|
+
if (field?.isBrowser || field?.isSelect) {
|
|
5104
|
+
const pairs = historyNameIdPairs(raw);
|
|
5105
|
+
if (pairs.length) {
|
|
5106
|
+
return pairs.map((pair) => (pair.id ? `${pair.name}(${pair.id})` : pair.name)).join('、');
|
|
5107
|
+
}
|
|
5108
|
+
}
|
|
5109
|
+
return stringifyDetailValue(raw);
|
|
5110
|
+
}
|
|
5111
|
+
/**
|
|
5112
|
+
* 历史取数的**前半段**:只发那一次列表请求。
|
|
5113
|
+
*
|
|
5114
|
+
* 与 `buildHistoryRequestData` 拆开的原因(P2 提速,2026-10-13):这一步**只依赖 `workflowId`**,
|
|
5115
|
+
* 不需要任何表单字段 ⇒ 可以和 `loadBaseParam` / `loadFrameParam` / `loadMinorInfo` / `getFormLayout`
|
|
5116
|
+
* 一起**并发发起**,不再排在这些载入之后的串行尾巴上(真机该请求约 1–2 s,落在关键路径上纯亏)。
|
|
5117
|
+
*
|
|
5118
|
+
* 失败口径与整体一致:一律降级为 `null`(`rethrowAuthOrNetworkError` 仍会把认证/网络类错误抛出去,
|
|
5119
|
+
* 由调用方决定;调用方若走"预取 + 复用"的形态,必须在预取处 `.catch(() => null)` 兜住,
|
|
5120
|
+
* 避免出现无人 `await` 的未处理拒绝——真正需要暴露的认证错误由同批的载入请求抛出,不会因此被吞掉)。
|
|
5121
|
+
*/
|
|
5122
|
+
export async function fetchHistoryListSnapshot(env, options = {}) {
|
|
5123
|
+
try {
|
|
5124
|
+
const now = new Date();
|
|
5125
|
+
const start = new Date(now.getTime() - HISTORY_LOOKBACK_DAYS * 24 * 60 * 60 * 1000);
|
|
5126
|
+
const historyWorkflowId = String(options.workflowId ?? '').trim();
|
|
5127
|
+
const listResponse = await env.host.workflowRequest({
|
|
5128
|
+
method: 'POST',
|
|
5129
|
+
path: WORKFLOW_ENDPOINTS.MINE_LIST,
|
|
5130
|
+
operation: 'workflow.createRequest.history',
|
|
5131
|
+
body: {
|
|
5132
|
+
params: { tabid: DEFAULT_TABID.mine, dimension: 'mine', flowSpareType: 1, outType: 0 },
|
|
5133
|
+
searchParams: {
|
|
5134
|
+
formDatas: {
|
|
5135
|
+
// 非草稿 = 「未结束」+「已结束」(选项类系统条件必须是 multiContent,见 flow-status.ts;
|
|
5136
|
+
// 取值必须用**代码**——该模块只认四个选项代码,不吃中文)
|
|
5137
|
+
flowstatus: flowStatusCondition('notFinish,finish')?.condition ?? [],
|
|
5138
|
+
createdatetime: [{
|
|
5139
|
+
dateContent: [formatLocalDate(start), formatLocalDate(now)],
|
|
5140
|
+
term: 'like',
|
|
5141
|
+
}],
|
|
5142
|
+
// 只取**同一张表单**的历史(字段 id 是表单级的,跨表单必零交集,见 options.workflowId)。
|
|
5143
|
+
// 形态只认 `browserDatas`(workflowid 属"浏览按钮类"):传 `multiContent` 会被服务端
|
|
5144
|
+
// **静默忽略**(HTTP 200、无报错、结果不变)——2026-09-29 实测踩过。
|
|
5145
|
+
...(historyWorkflowId
|
|
5146
|
+
? { workflowid: [{ term: 'in', browserDatas: [{ id: historyWorkflowId, name: '' }] }] }
|
|
5147
|
+
: {}),
|
|
5148
|
+
},
|
|
5149
|
+
type: 'and',
|
|
5150
|
+
initSearch: false,
|
|
5151
|
+
},
|
|
5152
|
+
customDisplayPage: { current: 1, size: HISTORY_REQUEST_LIMIT },
|
|
5153
|
+
sortParams: [{ orderkey: SORT_OPTIONS['发起时间'], sortType: 'desc' }],
|
|
5154
|
+
},
|
|
5155
|
+
});
|
|
5156
|
+
const listed = normalizeListResponse(listResponse, 'mine', CATEGORY_NAMES.mine);
|
|
5157
|
+
const items = toArray(listed.items).slice(0, HISTORY_REQUEST_LIMIT);
|
|
5158
|
+
const requestIds = items.map((item) => String(item?.requestId ?? '').trim()).filter(Boolean);
|
|
5159
|
+
if (!requestIds.length)
|
|
5160
|
+
return null;
|
|
5161
|
+
return { items, requestIds };
|
|
5162
|
+
}
|
|
5163
|
+
catch (error) {
|
|
5164
|
+
rethrowAuthOrNetworkError(error);
|
|
5165
|
+
return null;
|
|
5166
|
+
}
|
|
5167
|
+
}
|
|
5168
|
+
export async function buildHistoryRequestData(env, fields, targets, options = {},
|
|
5169
|
+
/**
|
|
5170
|
+
* 已提前发起的列表请求(见 `fetchHistoryListSnapshot`)。传入即直接复用,不再重复发请求;
|
|
5171
|
+
* 传 `null` / 不传时退回"本函数内自己发列表"的老口径。
|
|
5172
|
+
*/
|
|
5173
|
+
prefetchedList) {
|
|
5174
|
+
const targetList = toArray(targets)
|
|
5175
|
+
.filter((item) => !item?.systemField && String(item?.id ?? '').trim())
|
|
5176
|
+
.map((item) => ({ id: String(item.id).trim(), name: String(item.name ?? item.id) }));
|
|
5177
|
+
// 普通档必须真的有字段要取;缓存档允许 targets 为空(表单本身没有静态必填时,
|
|
5178
|
+
// 缓存仍要建——条件必填是在 createRequest 阶段才现身的,那时已经没有联网取数的机会了)。
|
|
5179
|
+
if (!targetList.length && !options.allFormFields)
|
|
5180
|
+
return null;
|
|
5181
|
+
const fieldMeta = new Map();
|
|
5182
|
+
for (const field of toArray(fields))
|
|
5183
|
+
fieldMeta.set(String(field?.id ?? ''), field);
|
|
5184
|
+
// 取值顺序 = 「本表单布局顺序」(缓存档)或 targets 顺序(普通档)。
|
|
5185
|
+
// 缓存档用布局顺序是为了结果稳定可 diff;但只保留本表单的字段 id,避免把别张表单的字段带进来。
|
|
5186
|
+
const orderedIds = options.allFormFields
|
|
5187
|
+
? [...fieldMeta.keys()]
|
|
5188
|
+
: targetList.map((t) => t.id);
|
|
5189
|
+
try {
|
|
5190
|
+
const listed = prefetchedList
|
|
5191
|
+
? await prefetchedList
|
|
5192
|
+
: await fetchHistoryListSnapshot(env, options);
|
|
5193
|
+
if (!listed)
|
|
5194
|
+
return null;
|
|
5195
|
+
const items = listed.items;
|
|
5196
|
+
const requestIds = listed.requestIds;
|
|
5197
|
+
const session = await env.host.getSession();
|
|
5198
|
+
const details = await Promise.all(requestIds.map(async (requestId) => {
|
|
5199
|
+
const payload = {
|
|
5200
|
+
requestId,
|
|
5201
|
+
isGetRequestBaseInfo: false,
|
|
5202
|
+
isGetRequestLog: false,
|
|
5203
|
+
isGetFormData: true,
|
|
5204
|
+
isReadRequest: false,
|
|
5205
|
+
};
|
|
5206
|
+
if (session.userId)
|
|
5207
|
+
payload.userId = session.userId;
|
|
5208
|
+
const response = await env.host.workflowRequest({
|
|
5209
|
+
method: 'POST',
|
|
5210
|
+
path: WORKFLOW_ENDPOINTS.REQUEST_DETAIL,
|
|
5211
|
+
operation: 'workflow.createRequest.history.detail',
|
|
5212
|
+
body: payload,
|
|
5213
|
+
});
|
|
5214
|
+
return detailDataOf(response);
|
|
5215
|
+
}));
|
|
5216
|
+
const result = [];
|
|
5217
|
+
for (let index = 0; index < details.length; index += 1) {
|
|
5218
|
+
const data = details[index] || {};
|
|
5219
|
+
const rawById = new Map();
|
|
5220
|
+
collectHistoryFieldRawValues(data, rawById);
|
|
5221
|
+
// 键序 = `orderedIds`(本表单布局顺序)的插入顺序;同一字段只留**首个**取到值的结果。
|
|
5222
|
+
const fieldValues = {};
|
|
5223
|
+
for (const fieldId of orderedIds) {
|
|
5224
|
+
const raw = rawById.get(fieldId);
|
|
5225
|
+
if (raw === undefined || raw === null)
|
|
5226
|
+
continue;
|
|
5227
|
+
if (Object.prototype.hasOwnProperty.call(fieldValues, fieldId))
|
|
5228
|
+
continue;
|
|
5229
|
+
const value = formatHistoryFieldValue(raw, fieldMeta.get(fieldId));
|
|
5230
|
+
// 附件类返回的是对象 ⇒ 不能再用 `String(value).trim()` 判空(那会得到 "[object Object]")。
|
|
5231
|
+
if (isEmptyRawFieldValue(value))
|
|
5232
|
+
continue;
|
|
5233
|
+
fieldValues[fieldId] = value;
|
|
5234
|
+
}
|
|
5235
|
+
if (!Object.keys(fieldValues).length)
|
|
5236
|
+
continue;
|
|
5237
|
+
const base = data.workflowBaseInfo && typeof data.workflowBaseInfo === 'object' ? data.workflowBaseInfo : {};
|
|
5238
|
+
const listedItem = items[index] || {};
|
|
5239
|
+
result.push({
|
|
5240
|
+
requestName: pickText(base, 'requestName', 'requestNameTitle')
|
|
5241
|
+
|| String(listedItem.flowName ?? ''),
|
|
5242
|
+
requestId: requestIds[index],
|
|
5243
|
+
createdatetime: pickText(base, 'createDateTime', 'createTime')
|
|
5244
|
+
|| String(listedItem.createdAt ?? ''),
|
|
5245
|
+
fieldValues,
|
|
5246
|
+
});
|
|
5247
|
+
}
|
|
5248
|
+
return result.length ? result : null;
|
|
5249
|
+
}
|
|
5250
|
+
catch (error) {
|
|
5251
|
+
rethrowAuthOrNetworkError(error);
|
|
5252
|
+
return null;
|
|
5253
|
+
}
|
|
5254
|
+
}
|
|
5255
|
+
/**
|
|
5256
|
+
* 从历史取数结果里筛出**指定字段**的取值(不改动传入对象)。
|
|
5257
|
+
*
|
|
5258
|
+
* 用途:`createForm` 缓存的是一份"本表单全部字段"的宽结果,`createRequest` 按当时真实的
|
|
5259
|
+
* 缺失字段(或"新出现的必填字段")在这里做二次筛选。
|
|
5260
|
+
*
|
|
5261
|
+
* 语义与取数同源:**某个字段一个值都没命中的历史流程整条剔除**;一条都不剩 ⇒ 返回 `null`
|
|
5262
|
+
* (不塞空数组,避免模型误以为"有数据")。
|
|
5263
|
+
*/
|
|
5264
|
+
export function filterHistoryRequestData(records, fieldIds) {
|
|
5265
|
+
const wanted = new Set();
|
|
5266
|
+
for (const id of fieldIds) {
|
|
5267
|
+
const text = String(id ?? '').trim();
|
|
5268
|
+
if (text)
|
|
5269
|
+
wanted.add(text);
|
|
5270
|
+
}
|
|
5271
|
+
if (!wanted.size)
|
|
5272
|
+
return null;
|
|
5273
|
+
const result = [];
|
|
5274
|
+
for (const record of toArray(records)) {
|
|
5275
|
+
if (!record || typeof record !== 'object')
|
|
5276
|
+
continue;
|
|
5277
|
+
const source = record.fieldValues;
|
|
5278
|
+
if (!source || typeof source !== 'object' || Array.isArray(source))
|
|
5279
|
+
continue;
|
|
5280
|
+
// 保留原键序,只留下本次要看的字段(口径见函数注释)。
|
|
5281
|
+
const fieldValues = {};
|
|
5282
|
+
for (const fieldId of Object.keys(source)) {
|
|
5283
|
+
if (wanted.has(fieldId))
|
|
5284
|
+
fieldValues[fieldId] = source[fieldId];
|
|
5285
|
+
}
|
|
5286
|
+
if (!Object.keys(fieldValues).length)
|
|
5287
|
+
continue;
|
|
5288
|
+
result.push({ ...record, fieldValues });
|
|
5289
|
+
}
|
|
5290
|
+
return result.length ? result : null;
|
|
5291
|
+
}
|
|
4891
5292
|
/**
|
|
4892
5293
|
* 供**批量范围驱动**复用:该大分类的「全部」子分类 tabid(todo=0 / done=50 / mine=100 / all=300)。
|
|
4893
5294
|
*
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { WorkflowCliError, workflowValidationError } from '../errors.js';
|
|
2
|
+
import { stringifyForStdout } from '../../../core/output.js';
|
|
2
3
|
/**
|
|
3
4
|
* 模型输入中永远不允许出现的键。
|
|
4
5
|
*
|
|
@@ -181,6 +182,9 @@ export function withLeadingMeta(meta, body) {
|
|
|
181
182
|
* 白花好几轮工具往返(实测某次会话多花 4 轮、约 54 s)。与其让宿主事后截,不如 CLI 主动落盘。
|
|
182
183
|
*
|
|
183
184
|
* **量这个线必须用 `stdoutBytesOf()`(美化口径)**,不能用压缩口径 —— 见该函数注释。
|
|
185
|
+
*
|
|
186
|
+
* 2026-09-29 备注:本线曾按用户要求临时抬到 `Number.MAX_SAFE_INTEGER`(去掉本地输出限制),
|
|
187
|
+
* 用于实测"命令输出到底会不会被宿主截断";**实测已完成,本线已按原值恢复**(=24,000)。
|
|
184
188
|
*/
|
|
185
189
|
export const STDOUT_SAFE_BYTES = 24_000;
|
|
186
190
|
/** 结果序列化后的字节数(**压缩**口径,用作相对大小参考)。 */
|
|
@@ -209,3 +213,27 @@ export function stdoutBytesOf(value) {
|
|
|
209
213
|
return 0;
|
|
210
214
|
}
|
|
211
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* 宿主**实际看到**的 stdout 字符数 —— 与 `Output.write` 真正打出去的那份文本**同源**
|
|
218
|
+
* (同一条 `stringifyForStdout` + 同一套紧凑路径),而不是"美化 JSON 长度的近似值"。
|
|
219
|
+
*
|
|
220
|
+
* ★ 判线必须与最终输出同源。2026-10-15 之前量的是 `JSON.stringify(value, null, 2).length`(纯美化),
|
|
221
|
+
* 而紧凑路径会把 `fields` / `historyRequestData` / `systemFields` 的缩进空白整段压掉 —— 实测
|
|
222
|
+
* `createForm` 整份小约 **30%**(`hugeLayout(120)` 桩:23,522 → 16,613 字符),那份桩因此从
|
|
223
|
+
* 「超线落盘」翻成「内联返回」。两份数一旦脱钩,判线就**系统性高估**:本可内联的表单被判落盘。
|
|
224
|
+
* 而宿主侧的线(`terminal_tool.py` 的 `MAX_OUTPUT_LEN = 20000`)量的是**最终输出文本**的 `len()`,
|
|
225
|
+
* 它并不关心美化不美化。
|
|
226
|
+
*
|
|
227
|
+
* `compactPaths` 从**信封根**算起(如 `data.fields`);不传即按无紧凑路径量(等价于纯美化)。
|
|
228
|
+
* 其余命令仍用 `stdoutBytesOf()` 的**字节**口径 —— 两个口径对纯 ASCII 一致、对中文差 3 倍
|
|
229
|
+
* (1 字符 / 3 字节),**用哪个必须跟着阈值走**,不可混用。
|
|
230
|
+
*/
|
|
231
|
+
export function stdoutCharsOf(value, compactPaths) {
|
|
232
|
+
try {
|
|
233
|
+
const text = stringifyForStdout(value, compactPaths);
|
|
234
|
+
return typeof text === 'string' ? text.length : 0;
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return 0;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
@@ -126,12 +126,12 @@ async function resolveReceiverNames(env, receiverName) {
|
|
|
126
126
|
ids.push(candidates[0].id);
|
|
127
127
|
}
|
|
128
128
|
else if (candidates.length > 1) {
|
|
129
|
-
throw workflowValidationError('receiver_ambiguous', `接收人「${part}
|
|
129
|
+
throw workflowValidationError('receiver_ambiguous', `接收人「${part}」匹配到多个候选,请把 candidates 原样交给用户确认是哪一个——只问完整姓名或其它可用于检索的关键词,不要向用户索取 ID;用户确认后由你按 "姓名(ID)" 拼好并重发同一条命令`, {
|
|
130
130
|
candidates: candidates.map((c, i) => ({ index: i + 1, id: c.id, name: c.name })),
|
|
131
131
|
});
|
|
132
132
|
}
|
|
133
133
|
else {
|
|
134
|
-
throw workflowValidationError('receiver_not_found', `未匹配到接收人「${part}
|
|
134
|
+
throw workflowValidationError('receiver_not_found', `未匹配到接收人「${part}」,请提供该接收人的完整姓名(或其它可用于检索的关键词)`, {
|
|
135
135
|
receiverName: part,
|
|
136
136
|
});
|
|
137
137
|
}
|
|
@@ -557,7 +557,7 @@ async function resolveShareTarget(env, obj, minSec, maxSec) {
|
|
|
557
557
|
const exact = candidates.filter((c) => c.name.trim().toLowerCase() === name.toLowerCase());
|
|
558
558
|
const selected = exact.length === 1 ? exact : candidates;
|
|
559
559
|
if (!selected.length) {
|
|
560
|
-
throw workflowValidationError('share_target_not_found', `共享对象「${name}(${scope}
|
|
560
|
+
throw workflowValidationError('share_target_not_found', `共享对象「${name}(${scope})」未匹配到任何候选,请核对名称,或提供该对象更完整的名称(或其它可用于检索的关键词)`, { shareType: scope, name });
|
|
561
561
|
}
|
|
562
562
|
if (selected.length !== 1) {
|
|
563
563
|
// 多命中不是失败而是"需要澄清":按 V11.3 语义以成功态返回候选(模型展示给用户后按
|
|
@@ -639,7 +639,7 @@ async function resolveForwardReceiver(env, obj) {
|
|
|
639
639
|
const exact = candidates.filter((c) => c.name.trim().toLowerCase() === name.toLowerCase());
|
|
640
640
|
const selected = exact.length === 1 ? exact : candidates;
|
|
641
641
|
if (selected.length !== 1) {
|
|
642
|
-
throw workflowValidationError('forward_receiver_ambiguous', `转发接收人「${name}(${rtype})」匹配到 ${selected.length}
|
|
642
|
+
throw workflowValidationError('forward_receiver_ambiguous', `转发接收人「${name}(${rtype})」匹配到 ${selected.length} 个候选,请把 candidates 原样交给用户确认是哪一个——只问完整姓名或其它可用于检索的关键词,不要向用户索取 ID;用户确认后由你按 "姓名(ID)" 拼好并重发同一条命令`, { candidates: selected.map((c, i) => ({ index: i + 1, id: c.id, name: c.name })) });
|
|
643
643
|
}
|
|
644
644
|
return { _entityType: rtype, id: selected[0].id };
|
|
645
645
|
}
|
|
@@ -1216,7 +1216,7 @@ const workflowSharePrepare = {
|
|
|
1216
1216
|
clarificationQuestion: `共享对象「${err.payload.name}」匹配到多个候选,请确认要共享给哪一个。`,
|
|
1217
1217
|
candidates: err.payload.candidates,
|
|
1218
1218
|
displayRules: [
|
|
1219
|
-
'needClarification=true 时原样展示候选,等用户确认后用 "名称(ID)" 重新调用 workflow.sharePrepare',
|
|
1219
|
+
'needClarification=true 时原样展示候选,等用户确认后用 "名称(ID)" 重新调用 workflow.sharePrepare(只问用户完整名称或其它可用于检索的关键词,不要向用户索取 ID)',
|
|
1220
1220
|
'候选序号与显示名称保持原样,不要自行重建查询条件',
|
|
1221
1221
|
],
|
|
1222
1222
|
});
|
|
@@ -85,20 +85,22 @@ function clarificationEnvelope(error, operation) {
|
|
|
85
85
|
function clarificationNote(reason, candidateCount) {
|
|
86
86
|
const base = '这不是失败,也**不代表查询已执行**:本次查询已停止,没有返回任何流程数据。';
|
|
87
87
|
if (reason === 'workflow_not_exist') {
|
|
88
|
-
return base + '
|
|
89
|
-
+ '
|
|
90
|
-
+ '
|
|
88
|
+
return base + '请如实告知用户:该工作流不存在(可能已删除或被停用),'
|
|
89
|
+
+ '请用户改用该流程的完整名称(或其它可用于检索的关键词)重新指定——**不要向用户索取 ID**。'
|
|
90
|
+
+ '**不要**说成"没有可发起的工作流"这类模糊说法——'
|
|
91
|
+
+ '问题就出在这个目标上。';
|
|
91
92
|
}
|
|
92
93
|
if (reason === 'no_create_right') {
|
|
93
94
|
return base + '请如实告知用户:该流程**存在**,但当前账号**没有发起权限**。'
|
|
94
95
|
+ '**必须明确说出「存在但没有发起权限」**,绝不能转述成"流程不存在";'
|
|
95
96
|
+ '并给出下一步:改用其他可发起的流程,或联系管理员为该流程授予发起权限。';
|
|
96
97
|
}
|
|
97
|
-
return base + '
|
|
98
|
-
+ '
|
|
98
|
+
return base + '请把澄清问题与候选**原样**交给用户确认(逐条列出候选名称),'
|
|
99
|
+
+ '拿到确认后由你按「名称(ID)」把 ID 拼好、重发同一条命令——'
|
|
100
|
+
+ '**只问用户该对象的完整名称或其它可用于检索的关键词,不要向用户索取 ID**。'
|
|
99
101
|
+ '**不要**把本次结果转述成「没有匹配的流程」「查询结果为 0 条」或自行挑一个候选继续查。'
|
|
100
102
|
+ (candidateCount === 0
|
|
101
|
-
? '
|
|
103
|
+
? '当前没有任何候选——请让用户给出该对象的完整名称(或纠正名称里的错别字、换其它可用于检索的关键词)后重发。'
|
|
102
104
|
: '');
|
|
103
105
|
}
|
|
104
106
|
/**
|