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.
Files changed (358) hide show
  1. package/README.md +33 -3
  2. package/dist/core/output.js +53 -1
  3. package/dist/internal/e10/auth/commands.js +210 -17
  4. package/dist/internal/e10/auth/crypto.js +52 -12
  5. package/dist/internal/e10/auth/xiaoe.js +117 -35
  6. package/dist/internal/e10/context.js +3 -3
  7. package/dist/internal/e10/request-runtime.js +46 -4
  8. package/dist/shortcuts/caizhilian/file-upload/metadata.js +124 -0
  9. package/dist/shortcuts/caizhilian/file-upload/multipart.js +47 -0
  10. package/dist/shortcuts/caizhilian/file-upload/protocol.js +116 -0
  11. package/dist/shortcuts/caizhilian/file-upload/receipt.js +37 -0
  12. package/dist/shortcuts/caizhilian/host.js +13 -5
  13. package/dist/shortcuts/caizhilian/operations/handlers/file-upload.js +72 -179
  14. package/dist/shortcuts/caizhilian/operations/handlers/fileops.js +67 -1
  15. package/dist/shortcuts/caizhilian/operations/handlers/folder.js +701 -4
  16. package/dist/shortcuts/caizhilian/operations/handlers/setting-attach.js +198 -0
  17. package/dist/shortcuts/caizhilian/operations/registry.js +5 -1
  18. package/dist/shortcuts/caizhilian/operations/shared.js +32 -0
  19. package/dist/shortcuts/caizhilian/operations/specs.js +67 -0
  20. package/dist/shortcuts/workflow/continuation.js +14 -9
  21. package/dist/shortcuts/workflow/endpoints.js +11 -1
  22. package/dist/shortcuts/workflow/index.js +55 -1
  23. package/dist/shortcuts/workflow/operations/flow-status.js +63 -0
  24. package/dist/shortcuts/workflow/operations/form.js +1822 -547
  25. package/dist/shortcuts/workflow/operations/read.js +414 -13
  26. package/dist/shortcuts/workflow/operations/shared.js +28 -0
  27. package/dist/shortcuts/workflow/operations/write.js +5 -5
  28. package/dist/shortcuts/workflow/operations.js +8 -6
  29. package/dist/shortcuts/workflow/stdout-compact.js +33 -0
  30. package/docs/caizhilian.md +12 -5
  31. package/docs/e10-auth.md +25 -3
  32. package/node_modules/@napi-rs/keyring/LICENSE +21 -0
  33. package/node_modules/@napi-rs/keyring/README.md +19 -0
  34. package/node_modules/@napi-rs/keyring/index.d.ts +166 -0
  35. package/node_modules/@napi-rs/keyring/index.js +514 -0
  36. package/node_modules/@napi-rs/keyring/keytar.d.ts +53 -0
  37. package/node_modules/@napi-rs/keyring/keytar.js +26 -0
  38. package/node_modules/@napi-rs/keyring/package.json +125 -0
  39. package/node_modules/@napi-rs/keyring-darwin-arm64/README.md +3 -0
  40. package/node_modules/@napi-rs/keyring-darwin-arm64/keyring.darwin-arm64.node +0 -0
  41. package/node_modules/@napi-rs/keyring-darwin-arm64/package.json +32 -0
  42. package/node_modules/commander/LICENSE +22 -0
  43. package/node_modules/commander/Readme.md +1149 -0
  44. package/node_modules/commander/esm.mjs +16 -0
  45. package/node_modules/commander/index.js +24 -0
  46. package/node_modules/commander/lib/argument.js +149 -0
  47. package/node_modules/commander/lib/command.js +2662 -0
  48. package/node_modules/commander/lib/error.js +39 -0
  49. package/node_modules/commander/lib/help.js +709 -0
  50. package/node_modules/commander/lib/option.js +367 -0
  51. package/node_modules/commander/lib/suggestSimilar.js +101 -0
  52. package/node_modules/commander/package-support.json +16 -0
  53. package/node_modules/commander/package.json +82 -0
  54. package/node_modules/commander/typings/esm.d.mts +3 -0
  55. package/node_modules/commander/typings/index.d.ts +1045 -0
  56. package/package.json +5 -1
  57. package/skills/weaver-e10-builder/SKILL.md +281 -0
  58. package/skills/weaver-e10-builder/_catalog.md +94 -0
  59. package/skills/weaver-e10-builder/actionflows/CONTEXT.md +71 -0
  60. package/skills/weaver-e10-builder/actionflows/SKILL.md +176 -0
  61. package/skills/weaver-e10-builder/actionflows/docs/adr/0001-generated-actionflow-cleanup-identity.md +5 -0
  62. package/skills/weaver-e10-builder/actionflows/docs/adr/0002-preserve-existing-actionflow-on-update.md +36 -0
  63. package/skills/weaver-e10-builder/actionflows/references/components/calendar/MeetingCreate.md +19 -0
  64. package/skills/weaver-e10-builder/actionflows/references/components/calendar/ScheduleCreate.md +17 -0
  65. package/skills/weaver-e10-builder/actionflows/references/components/database/DMLExecute.md +38 -0
  66. package/skills/weaver-e10-builder/actionflows/references/components/document/AttachmentCopy.md +17 -0
  67. package/skills/weaver-e10-builder/actionflows/references/components/document/AttachmentMove.md +17 -0
  68. package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentCopy.md +17 -0
  69. package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentDelete.md +17 -0
  70. package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentEdit.md +17 -0
  71. package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentMove.md +17 -0
  72. package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentPermissionChange.md +17 -0
  73. package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentRenewal.md +17 -0
  74. package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentRevert.md +17 -0
  75. package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentSave.md +17 -0
  76. package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentSubscription.md +17 -0
  77. package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentSubscriptionApprove.md +17 -0
  78. package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentSubscriptionSendBack.md +17 -0
  79. package/skills/weaver-e10-builder/actionflows/references/components/document/DocumentSubscriptionWithdraw.md +17 -0
  80. package/skills/weaver-e10-builder/actionflows/references/components/document/FileFolderSave.md +17 -0
  81. package/skills/weaver-e10-builder/actionflows/references/components/document/GetAttachmentInfo.md +17 -0
  82. package/skills/weaver-e10-builder/actionflows/references/components/document/GetDocumentInfo.md +17 -0
  83. package/skills/weaver-e10-builder/actionflows/references/components/document/ModifyDocumentStatus.md +17 -0
  84. package/skills/weaver-e10-builder/actionflows/references/components/document/ReplaceAttachment.md +17 -0
  85. package/skills/weaver-e10-builder/actionflows/references/components/document/UpdatePrintNum.md +17 -0
  86. package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/ActionEbAdd.md +100 -0
  87. package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/ActionEbDelete.md +23 -0
  88. package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/ActionEbRecover.md +17 -0
  89. package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/ActionEbSaveVersion.md +17 -0
  90. package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/ActionEbUpdate.md +67 -0
  91. package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/DateTrigger.md +32 -0
  92. package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/EbGetDataById.md +17 -0
  93. package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/EnquiryForm.md +107 -0
  94. package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/EventButton.md +33 -0
  95. package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/EventFormData.md +19 -0
  96. package/skills/weaver-e10-builder/actionflows/references/components/ebuilder/TimeBatchTrigger.md +19 -0
  97. package/skills/weaver-e10-builder/actionflows/references/components/http/Http.md +77 -0
  98. package/skills/weaver-e10-builder/actionflows/references/components/logic/Condition.md +23 -0
  99. package/skills/weaver-e10-builder/actionflows/references/components/logic/LogicFlowSet.md +17 -0
  100. package/skills/weaver-e10-builder/actionflows/references/components/logic/MultipleExecution.md +38 -0
  101. package/skills/weaver-e10-builder/actionflows/references/components/logic/Output.md +37 -0
  102. package/skills/weaver-e10-builder/actionflows/references/components/message/InnerMQSend.md +50 -0
  103. package/skills/weaver-e10-builder/actionflows/references/components/message/SendMessage.md +30 -0
  104. package/skills/weaver-e10-builder/actionflows/references/components/personnel/AlterPersonStatus.md +30 -0
  105. package/skills/weaver-e10-builder/actionflows/references/components/personnel/HrmEmployeeUpdate.md +34 -0
  106. package/skills/weaver-e10-builder/actionflows/references/components/personnel/PersonnelAlterType.md +38 -0
  107. package/skills/weaver-e10-builder/actionflows/references/components/personnel/PersonnelOnboarding.md +36 -0
  108. package/skills/weaver-e10-builder/actionflows/references/components/serverless/ServerlessAction.md +42 -0
  109. package/skills/weaver-e10-builder/actionflows/references/components/trigger/CustomTrigger.md +82 -0
  110. package/skills/weaver-e10-builder/actionflows/references/components/trigger/InnerMQListener.md +41 -0
  111. package/skills/weaver-e10-builder/actionflows/references/components/trigger/SimpleScheduler.md +19 -0
  112. package/skills/weaver-e10-builder/actionflows/references/components/trigger/WebHookTrigger.md +91 -0
  113. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveAddSign.md +17 -0
  114. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveAgreeRejectApply.md +17 -0
  115. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveCommit.md +17 -0
  116. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveConsulTurnTodo.md +17 -0
  117. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveCreate.md +17 -0
  118. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveDelete.md +19 -0
  119. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveDoCirculate.md +17 -0
  120. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveDoForward.md +17 -0
  121. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveDoTurnTodo.md +17 -0
  122. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveEntrust.md +19 -0
  123. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveIntervention.md +17 -0
  124. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveMandatoryArchiving.md +17 -0
  125. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveManualCC.md +17 -0
  126. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveRefuseRejectApply.md +17 -0
  127. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveRejectApply.md +17 -0
  128. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveSave.md +17 -0
  129. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveSendBack.md +17 -0
  130. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveShareEntry.md +17 -0
  131. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveTrigger.md +99 -0
  132. package/skills/weaver-e10-builder/actionflows/references/components/workflow/ApproveWithdraw.md +17 -0
  133. package/skills/weaver-e10-builder/actionflows/references/components/workflow/WorkFlowDocEmpowerment.md +17 -0
  134. package/skills/weaver-e10-builder/actionflows/references/components/workflow/WorkflowToDoc.md +17 -0
  135. package/skills/weaver-e10-builder/actionflows/references/condition_rules.md +100 -0
  136. package/skills/weaver-e10-builder/actionflows/references/dynamic_capability_matrix.md +39 -0
  137. package/skills/weaver-e10-builder/actionflows/references/dynamic_resources.md +41 -0
  138. package/skills/weaver-e10-builder/actionflows/references/examples/enquiry-form-batch-insert-scene2.json +1043 -0
  139. package/skills/weaver-e10-builder/actionflows/references/function_rules.md +15 -0
  140. package/skills/weaver-e10-builder/actionflows/references/trigger_runtime_notes.md +53 -0
  141. package/skills/weaver-e10-builder/assets/dom-structure/Bar.json +341 -0
  142. package/skills/weaver-e10-builder/assets/dom-structure/BarStack.json +341 -0
  143. package/skills/weaver-e10-builder/assets/dom-structure/Bubble.json +323 -0
  144. package/skills/weaver-e10-builder/assets/dom-structure/Calendar.json +515 -0
  145. package/skills/weaver-e10-builder/assets/dom-structure/Circular.json +337 -0
  146. package/skills/weaver-e10-builder/assets/dom-structure/CollapsePanel.json +289 -0
  147. package/skills/weaver-e10-builder/assets/dom-structure/Comment.json +617 -0
  148. package/skills/weaver-e10-builder/assets/dom-structure/CountDown.json +755 -0
  149. package/skills/weaver-e10-builder/assets/dom-structure/DigitalPanel.json +191 -0
  150. package/skills/weaver-e10-builder/assets/dom-structure/EbButton.json +387 -0
  151. package/skills/weaver-e10-builder/assets/dom-structure/FastCreate.json +242 -0
  152. package/skills/weaver-e10-builder/assets/dom-structure/Gauge.json +282 -0
  153. package/skills/weaver-e10-builder/assets/dom-structure/HBar.json +336 -0
  154. package/skills/weaver-e10-builder/assets/dom-structure/HBarStack.json +337 -0
  155. package/skills/weaver-e10-builder/assets/dom-structure/Line.json +341 -0
  156. package/skills/weaver-e10-builder/assets/dom-structure/NList.json +712 -0
  157. package/skills/weaver-e10-builder/assets/dom-structure/NavBar.json +274 -0
  158. package/skills/weaver-e10-builder/assets/dom-structure/NavPanel.json +390 -0
  159. package/skills/weaver-e10-builder/assets/dom-structure/NewTab.json +606 -0
  160. package/skills/weaver-e10-builder/assets/dom-structure/Nightingale.json +336 -0
  161. package/skills/weaver-e10-builder/assets/dom-structure/PageHeader.json +205 -0
  162. package/skills/weaver-e10-builder/assets/dom-structure/Picture.json +209 -0
  163. package/skills/weaver-e10-builder/assets/dom-structure/Pie.json +338 -0
  164. package/skills/weaver-e10-builder/assets/dom-structure/ProgressChart.json +299 -0
  165. package/skills/weaver-e10-builder/assets/dom-structure/SearchGlobal.json +628 -0
  166. package/skills/weaver-e10-builder/assets/dom-structure/Slide.json +489 -0
  167. package/skills/weaver-e10-builder/assets/dom-structure/Treemap.json +324 -0
  168. package/skills/weaver-e10-builder/assets/factory/chart-dimensions.json +536 -0
  169. package/skills/weaver-e10-builder/assets/factory/example-btn-progress-collapse-configured.json +2515 -0
  170. package/skills/weaver-e10-builder/assets/factory/example-configured-2.json +13805 -0
  171. package/skills/weaver-e10-builder/assets/factory/example-configured.json +6735 -0
  172. package/skills/weaver-e10-builder/assets/factory/factory-bar-stack.json +326 -0
  173. package/skills/weaver-e10-builder/assets/factory/factory-bar.json +222 -0
  174. package/skills/weaver-e10-builder/assets/factory/factory-bubble.json +322 -0
  175. package/skills/weaver-e10-builder/assets/factory/factory-calendar.json +325 -0
  176. package/skills/weaver-e10-builder/assets/factory/factory-circular.json +320 -0
  177. package/skills/weaver-e10-builder/assets/factory/factory-collapse-panel.json +132 -0
  178. package/skills/weaver-e10-builder/assets/factory/factory-comment.json +388 -0
  179. package/skills/weaver-e10-builder/assets/factory/factory-count-down.json +198 -0
  180. package/skills/weaver-e10-builder/assets/factory/factory-digital-panel.json +108 -0
  181. package/skills/weaver-e10-builder/assets/factory/factory-eb-button.json +150 -0
  182. package/skills/weaver-e10-builder/assets/factory/factory-fast-create.json +62 -0
  183. package/skills/weaver-e10-builder/assets/factory/factory-gauge.json +312 -0
  184. package/skills/weaver-e10-builder/assets/factory/factory-h-bar-stack.json +328 -0
  185. package/skills/weaver-e10-builder/assets/factory/factory-h-bar.json +326 -0
  186. package/skills/weaver-e10-builder/assets/factory/factory-line.json +212 -0
  187. package/skills/weaver-e10-builder/assets/factory/factory-nav-bar.json +167 -0
  188. package/skills/weaver-e10-builder/assets/factory/factory-nav-menu.json +144 -0
  189. package/skills/weaver-e10-builder/assets/factory/factory-nav-panel.json +338 -0
  190. package/skills/weaver-e10-builder/assets/factory/factory-new-tab.json +163 -0
  191. package/skills/weaver-e10-builder/assets/factory/factory-nightingale.json +312 -0
  192. package/skills/weaver-e10-builder/assets/factory/factory-nlist.json +112 -0
  193. package/skills/weaver-e10-builder/assets/factory/factory-page-header.json +171 -0
  194. package/skills/weaver-e10-builder/assets/factory/factory-picture.json +169 -0
  195. package/skills/weaver-e10-builder/assets/factory/factory-pie.json +212 -0
  196. package/skills/weaver-e10-builder/assets/factory/factory-progress-chart.json +162 -0
  197. package/skills/weaver-e10-builder/assets/factory/factory-search-global.json +104 -0
  198. package/skills/weaver-e10-builder/assets/factory/factory-slide.json +164 -0
  199. package/skills/weaver-e10-builder/assets/factory/factory-treemap.json +322 -0
  200. package/skills/weaver-e10-builder/assets/icons.db +0 -0
  201. package/skills/weaver-e10-builder/assets/sample/.claude/settings.local.json +8 -0
  202. package/skills/weaver-e10-builder/assets/sample/api/formApi.js +510 -0
  203. package/skills/weaver-e10-builder/assets/sample/config/config.js +0 -0
  204. package/skills/weaver-e10-builder/assets/sample/config/configLoad.js +0 -0
  205. package/skills/weaver-e10-builder/assets/sample/config/configLoad_default.js +0 -0
  206. package/skills/weaver-e10-builder/assets/sample/config/config_default.js +0 -0
  207. package/skills/weaver-e10-builder/assets/sample/entry.js +22 -0
  208. package/skills/weaver-e10-builder/assets/sample/eslint.config.cjs +48 -0
  209. package/skills/weaver-e10-builder/assets/sample/memo.md +0 -0
  210. package/skills/weaver-e10-builder/assets/sample/readme.js +8 -0
  211. package/skills/weaver-e10-builder/references/app/guide-app-publish.md +92 -0
  212. package/skills/weaver-e10-builder/references/auth/guide-auth.md +88 -0
  213. package/skills/weaver-e10-builder/references/coding/guide-edit-backfill.md +189 -0
  214. package/skills/weaver-e10-builder/references/coding/guide-form-crud.md +262 -0
  215. package/skills/weaver-e10-builder/references/coding/guide-page-code.md +244 -0
  216. package/skills/weaver-e10-builder/references/coding/guide-page-export.md +119 -0
  217. package/skills/weaver-e10-builder/references/coding/ref-compile-rules.md +130 -0
  218. package/skills/weaver-e10-builder/references/common/guide-plan-template.md +164 -0
  219. package/skills/weaver-e10-builder/references/common/map.md +153 -0
  220. package/skills/weaver-e10-builder/references/common/ref-cli-commands.md +635 -0
  221. package/skills/weaver-e10-builder/references/components/@weapp-Button.md +104 -0
  222. package/skills/weaver-e10-builder/references/components/base-Badge.md +100 -0
  223. package/skills/weaver-e10-builder/references/components/base-Dialog.md +358 -0
  224. package/skills/weaver-e10-builder/references/components/base-Empty.md +58 -0
  225. package/skills/weaver-e10-builder/references/components/base-Tag.md +112 -0
  226. package/skills/weaver-e10-builder/references/components/display-Alert.md +64 -0
  227. package/skills/weaver-e10-builder/references/components/display-Avatar.md +150 -0
  228. package/skills/weaver-e10-builder/references/components/display-Calendar.md +263 -0
  229. package/skills/weaver-e10-builder/references/components/display-Carousel.md +115 -0
  230. package/skills/weaver-e10-builder/references/components/display-Collapse.md +299 -0
  231. package/skills/weaver-e10-builder/references/components/display-FilePreview.md +49 -0
  232. package/skills/weaver-e10-builder/references/components/display-Icon.md +66 -0
  233. package/skills/weaver-e10-builder/references/components/display-List.md +320 -0
  234. package/skills/weaver-e10-builder/references/components/display-Pagination.md +41 -0
  235. package/skills/weaver-e10-builder/references/components/display-Spin.md +34 -0
  236. package/skills/weaver-e10-builder/references/components/display-Steps.md +89 -0
  237. package/skills/weaver-e10-builder/references/components/display-Table.md +160 -0
  238. package/skills/weaver-e10-builder/references/components/display-Title.md +117 -0
  239. package/skills/weaver-e10-builder/references/components/form-Checkbox.md +161 -0
  240. package/skills/weaver-e10-builder/references/components/form-DepartmentBrowser-api.md +52 -0
  241. package/skills/weaver-e10-builder/references/components/form-EmployeeBrowser-api.md +51 -0
  242. package/skills/weaver-e10-builder/references/components/form-EmployeeBrowser.md +51 -0
  243. package/skills/weaver-e10-builder/references/components/form-Input.md +123 -0
  244. package/skills/weaver-e10-builder/references/components/form-Radio.md +145 -0
  245. package/skills/weaver-e10-builder/references/components/form-Select.md +191 -0
  246. package/skills/weaver-e10-builder/references/components/form-Switch.md +46 -0
  247. package/skills/weaver-e10-builder/references/components/form-Upload.md +53 -0
  248. package/skills/weaver-e10-builder/references/components/generic-Echarts.md +102 -0
  249. package/skills/weaver-e10-builder/references/ebuilder-designer/guide-designer-components.md +130 -0
  250. package/skills/weaver-e10-builder/references/ebuilder-designer/guide-designer-css.md +127 -0
  251. package/skills/weaver-e10-builder/references/ebuilder-designer/guide-designer-factory.md +460 -0
  252. package/skills/weaver-e10-builder/references/ebuilder-designer/guide-designer-version.md +111 -0
  253. package/skills/weaver-e10-builder/references/ebuilder-designer/guide-designer.md +288 -0
  254. package/skills/weaver-e10-builder/references/esb-interface/guide-import.md +34 -0
  255. package/skills/weaver-e10-builder/references/form/guide-create-form.md +248 -0
  256. package/skills/weaver-e10-builder/references/form/guide-ebuilder-filter.md +73 -0
  257. package/skills/weaver-e10-builder/references/form/guide-ebuilder-scope.md +82 -0
  258. package/skills/weaver-e10-builder/references/form/guide-field-linkage.md +123 -0
  259. package/skills/weaver-e10-builder/references/form/guide-form-archive-permission.md +175 -0
  260. package/skills/weaver-e10-builder/references/form/guide-form-association.md +124 -0
  261. package/skills/weaver-e10-builder/references/form/guide-form-button.md +169 -0
  262. package/skills/weaver-e10-builder/references/form/guide-form-data.md +78 -0
  263. package/skills/weaver-e10-builder/references/form/guide-form-formula-functions.md +343 -0
  264. package/skills/weaver-e10-builder/references/form/guide-form-layout-incremental.md +90 -0
  265. package/skills/weaver-e10-builder/references/form/guide-form-layout-planning.md +68 -0
  266. package/skills/weaver-e10-builder/references/form/guide-form-linkage.md +269 -0
  267. package/skills/weaver-e10-builder/references/form/guide-form-message.md +74 -0
  268. package/skills/weaver-e10-builder/references/form/guide-form-physical-table.md +146 -0
  269. package/skills/weaver-e10-builder/references/form/guide-form-serial-mark.md +47 -0
  270. package/skills/weaver-e10-builder/references/form/guide-form-sub-detail.md +82 -0
  271. package/skills/weaver-e10-builder/references/form/guide-form-view-permission.md +38 -0
  272. package/skills/weaver-e10-builder/references/form/guide-form-view.md +371 -0
  273. package/skills/weaver-e10-builder/references/form/guide-formula-linkage.md +281 -0
  274. package/skills/weaver-e10-builder/references/form/guide-list-columns.md +52 -0
  275. package/skills/weaver-e10-builder/references/form/guide-list-custom-text.md +52 -0
  276. package/skills/weaver-e10-builder/references/form/guide-list-stats.md +136 -0
  277. package/skills/weaver-e10-builder/references/form/guide-virtual-form.md +156 -0
  278. package/skills/weaver-e10-builder/references/form/ref-form-fields.md +293 -0
  279. package/skills/weaver-e10-builder/references/form/style-templates.md +97 -0
  280. package/skills/weaver-e10-builder/references/hrm/guide-matrix.md +245 -0
  281. package/skills/weaver-e10-builder/references/hrm/guide-org-employee.md +155 -0
  282. package/skills/weaver-e10-builder/references/menu/system-menus.md +75 -0
  283. package/skills/weaver-e10-builder/references/report/add-dataset-registration-guide.md +139 -0
  284. package/skills/weaver-e10-builder/references/report/ai-report-workflow.md +412 -0
  285. package/skills/weaver-e10-builder/references/report/api-report-build-fast-path.md +275 -0
  286. package/skills/weaver-e10-builder/references/report/app-datasource-lookup-guide.md +230 -0
  287. package/skills/weaver-e10-builder/references/report/cell-config-echo-guide.md +163 -0
  288. package/skills/weaver-e10-builder/references/report/cell-transform-guide.md +147 -0
  289. package/skills/weaver-e10-builder/references/report/condition-format-guide.md +140 -0
  290. package/skills/weaver-e10-builder/references/report/cross-dataset-filter-guide.md +304 -0
  291. package/skills/weaver-e10-builder/references/report/dataset-query-filter-guide.md +235 -0
  292. package/skills/weaver-e10-builder/references/report/dataset-sidebar-ops-guide.md +280 -0
  293. package/skills/weaver-e10-builder/references/report/dataset-table-field-contract-guide.md +339 -0
  294. package/skills/weaver-e10-builder/references/report/datasource-metadata-guide.md +365 -0
  295. package/skills/weaver-e10-builder/references/report/datasource-selection-and-parent-filter-guide.md +148 -0
  296. package/skills/weaver-e10-builder/references/report/date-range-query-reference.md +102 -0
  297. package/skills/weaver-e10-builder/references/report/default-header-style-guide.md +70 -0
  298. package/skills/weaver-e10-builder/references/report/designer-blank-prevention-guide.md +111 -0
  299. package/skills/weaver-e10-builder/references/report/event-hreflink-guide.md +184 -0
  300. package/skills/weaver-e10-builder/references/report/field-bind-exact-match-guide.md +208 -0
  301. package/skills/weaver-e10-builder/references/report/formula-cell-api-guide.md +258 -0
  302. package/skills/weaver-e10-builder/references/report/guide-report-build.md +131 -0
  303. package/skills/weaver-e10-builder/references/report/guide-report-modify.md +100 -0
  304. package/skills/weaver-e10-builder/references/report/guide-report-multisource.md +143 -0
  305. package/skills/weaver-e10-builder/references/report/guide-report-query.md +98 -0
  306. package/skills/weaver-e10-builder/references/report/hidden-row-and-header-merge-guide.md +100 -0
  307. package/skills/weaver-e10-builder/references/report/layout-showlocation-freeze-guide.md +167 -0
  308. package/skills/weaver-e10-builder/references/report/preaggregate-auto-disable-guide.md +107 -0
  309. package/skills/weaver-e10-builder/references/report/query-condition-api-guide.md +890 -0
  310. package/skills/weaver-e10-builder/references/report/ref-report-commands.md +122 -0
  311. package/skills/weaver-e10-builder/references/report/ref-report-pitfalls.md +226 -0
  312. package/skills/weaver-e10-builder/references/report/report-baseinfo-defaults-guide.md +117 -0
  313. package/skills/weaver-e10-builder/references/report/report-building-guide.md +511 -0
  314. package/skills/weaver-e10-builder/references/report/report-config-schema.md +445 -0
  315. package/skills/weaver-e10-builder/references/report/report-create-modes-guide.md +182 -0
  316. package/skills/weaver-e10-builder/references/report/report-data-model.md +447 -0
  317. package/skills/weaver-e10-builder/references/report/report-delivery-contract.md +101 -0
  318. package/skills/weaver-e10-builder/references/report/report-designer-feature-map.md +500 -0
  319. package/skills/weaver-e10-builder/references/report/report-internal-error-guide.md +78 -0
  320. package/skills/weaver-e10-builder/references/report/report-knowledge-base.md +389 -0
  321. package/skills/weaver-e10-builder/references/report/report-lifecycle-api-guide.md +392 -0
  322. package/skills/weaver-e10-builder/references/report/report-list-page-ops-guide.md +191 -0
  323. package/skills/weaver-e10-builder/references/report/report-permission-guide.md +365 -0
  324. package/skills/weaver-e10-builder/references/report/report-requirement-analysis-template.md +202 -0
  325. package/skills/weaver-e10-builder/references/report/report-self-check-guide.md +164 -0
  326. package/skills/weaver-e10-builder/references/report/safe-partial-save-guide.md +151 -0
  327. package/skills/weaver-e10-builder/references/report/snowflake-id-precision-guide.md +84 -0
  328. package/skills/weaver-e10-builder/references/report/spec-build-schema.md +294 -0
  329. package/skills/weaver-e10-builder/references/report/targeted-fix-guide.md +97 -0
  330. package/skills/weaver-e10-builder/references/report/user-request-scope-only-guide.md +82 -0
  331. package/skills/weaver-e10-builder/references/workflow/guide-function-management.md +154 -0
  332. package/skills/weaver-e10-builder/references/workflow/guide-opinion-settings.md +126 -0
  333. package/skills/weaver-e10-builder/references/workflow/guide-workflow-action.md +174 -0
  334. package/skills/weaver-e10-builder/references/workflow/guide-workflow-auth-resp.md +224 -0
  335. package/skills/weaver-e10-builder/references/workflow/guide-workflow-condition.md +447 -0
  336. package/skills/weaver-e10-builder/references/workflow/guide-workflow-node-layout.md +181 -0
  337. package/skills/weaver-e10-builder/references/workflow/guide-workflow-odoc-setting.md +248 -0
  338. package/skills/weaver-e10-builder/references/workflow/guide-workflow-odoc.md +68 -0
  339. package/skills/weaver-e10-builder/references/workflow/guide-workflow.md +527 -0
  340. package/skills/weaver-e10-builder/references/workflow/operator-matrix.md +76 -0
  341. package/skills/weaver-e10-caizhilian/SKILL.md +14 -4
  342. package/skills/weaver-e10-caizhilian/references/file-upload.md +100 -295
  343. package/skills/weaver-e10-caizhilian/references/files.md +15 -0
  344. package/skills/weaver-e10-caizhilian/references/folder.md +31 -3
  345. package/skills/weaver-e10-caizhilian/references/setting-attach.md +48 -3
  346. package/skills/weaver-e10-caizhilian/references/source-manifest.json +634 -25
  347. package/skills/weaver-e10-jiuchuanhui/SKILL.md +9 -1
  348. package/skills/weaver-e10-shared/SKILL.md +19 -5
  349. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +25 -5
  350. package/skills/weaver-e10-workflow/SKILL.md +28 -47
  351. package/skills/weaver-e10-workflow/references/source-manifest.json +46 -36
  352. package/skills/weaver-e10-workflow/references/workflow-batch.md +2 -4
  353. package/skills/weaver-e10-workflow/references/workflow-create.md +261 -86
  354. package/skills/weaver-e10-workflow/references/workflow-edit.md +2 -1
  355. package/skills/weaver-e10-workflow/references/workflow-memory.md +3 -6
  356. package/skills/weaver-e10-workflow/references/workflow-operate.md +2 -1
  357. package/skills/weaver-e10-workflow/references/workflow-query.md +11 -9
  358. package/skills/weaver-e10-workflow/references/workflow-share.md +2 -0
@@ -47,6 +47,17 @@ const XIAOE_TOKEN_SCRIPT_LEGACY_ENV_KEY = 'XIAOE_TOKEN_SCRIPT_PATH';
47
47
  const XIAOE_TOKEN_SCRIPT_PYTHON_LEGACY_ENV_KEY = 'XIAOE_TOKEN_SCRIPT_PYTHON';
48
48
  const XIAOE_TOKEN_SCRIPT_TIMEOUT_MS = 15_000;
49
49
  const XIAOE_CLIENT_TOKEN_TIMEOUT_MS = 15_000;
50
+ const XIAOE_USER_SETTINGS_PATH_ENV_KEY = 'XIAOE_USER_SETTINGS_PATH';
51
+ const XIAOE_CLIENT_SETTINGS_ROOT_ENV_KEYS = [
52
+ 'XIAOE_ROBOT_DATA_ROOT',
53
+ 'XIAOE_ROBOT_ROOT',
54
+ ];
55
+ const XIAOE_DESKTOP_HOST_ENV_KEYS = [
56
+ 'XIAOE_DATA_ROOT',
57
+ 'XIAOE_ROBOT_DATA_ROOT',
58
+ 'XIAOE_USER_SETTINGS_PATH',
59
+ 'XIAOE_ROBOT_ROOT',
60
+ ];
50
61
  export const XIAOE_SKILL_ETEAMID_API_PATH = '/spec-apps/api/app/rpachat/skill/extend/eteamId';
51
62
  export const XIAOE_CLIENT_SETTINGS_SOURCE = 'XiaoE/Robots/user_settings.json';
52
63
  export const XIAOE_USER_TOKEN_SOURCE = 'XIAOE_USER_TOKEN';
@@ -59,13 +70,36 @@ function envString(env, ...keys) {
59
70
  }
60
71
  return '';
61
72
  }
62
- function hasEnvPrefix(env, prefix) {
63
- return Object.keys(env).some((key) => key === prefix || key.startsWith(`${prefix}_`));
64
- }
65
73
  export function hasXiaoEEnv(env = process.env) {
66
- // `XIAOE_*` are the platform-injected variables; `WEAVER_XIAOE_*` are this
67
- // CLI's own host-integration variables. Either one marks a XiaoE host.
68
- return hasEnvPrefix(env, 'XIAOE') || hasEnvPrefix(env, 'WEAVER_XIAOE');
74
+ const isXiaoEAgentType = (value) => {
75
+ const normalized = value.toLowerCase().replace(/[^a-z0-9\p{Script=Han}]+/gu, '');
76
+ return ['xiaoe', 'xiaoeclient', '小e', '智能小e'].includes(normalized);
77
+ };
78
+ // A host-specific identity is authoritative. Generic WORKBUDDY_*/CODEX_*
79
+ // variables are only framework markers and can also be present when XiaoE
80
+ // launches the CLI through a shared agent runtime.
81
+ const explicitHostAgentType = envString(env, 'WORKBUDDY_AGENT_TYPE', 'CODEX_AGENT_TYPE');
82
+ if (explicitHostAgentType)
83
+ return isXiaoEAgentType(explicitHostAgentType);
84
+ // XiaoE injects this pair into the command process for the current run. A
85
+ // tokens.py path, client installation, XIAOE_SKILL_* variable, or
86
+ // WEAVER_XIAOE_* configuration alone is credential availability, not proof
87
+ // that the current agent is XiaoE.
88
+ if (hasXiaoEPlatformCredential(env))
89
+ return true;
90
+ // The desktop XiaoE client injects these exact runtime paths even when it
91
+ // does not inject the web/sandbox XIAOE_USER_TOKEN + XIAOE_DOMAIN pair.
92
+ // They identify the current command host; unrelated XIAOE_SKILL_* variables
93
+ // and merely discovering local XiaoE files still do not.
94
+ if (XIAOE_DESKTOP_HOST_ENV_KEYS.some((key) => Boolean(envString(env, key))))
95
+ return true;
96
+ // Current-host framework markers win over WEAVER_AGENT_TYPE, which can be
97
+ // inherited from a previously saved E10 profile by `weaver-work-cli run`.
98
+ if (Object.keys(env).some((key) => key.startsWith('WORKBUDDY_') || key.startsWith('CODEX_'))) {
99
+ return false;
100
+ }
101
+ const explicitAgentType = envString(env, 'WEAVER_AGENT_TYPE');
102
+ return explicitAgentType ? isXiaoEAgentType(explicitAgentType) : false;
69
103
  }
70
104
  export function describeXiaoECredentialSource(source) {
71
105
  // Step 1 is the platform-injected credential (XIAOE_USER_TOKEN + XIAOE_DOMAIN):
@@ -528,30 +562,78 @@ export function xiaoEClientRobotsRoot(env = process.env) {
528
562
  const home = envString(env, 'HOME') || homedir();
529
563
  return home ? join(home, 'Library', 'Application Support', 'XiaoE', 'Robots') : '';
530
564
  }
531
- export function findXiaoEClientSettingsFile(env = process.env) {
532
- const root = xiaoEClientRobotsRoot(env);
533
- if (!root || !existsSync(root))
534
- return '';
535
- let entries = [];
565
+ function isFile(path) {
566
+ if (!path || !existsSync(path))
567
+ return false;
536
568
  try {
537
- entries = readdirSync(root);
569
+ return statSync(path).isFile();
538
570
  }
539
571
  catch {
540
- return '';
572
+ return false;
573
+ }
574
+ }
575
+ function isDirectory(path) {
576
+ if (!path || !existsSync(path))
577
+ return false;
578
+ try {
579
+ return statSync(path).isDirectory();
541
580
  }
542
- const files = entries
543
- .map((name) => join(root, name, 'user_settings.json'))
544
- .filter((path) => {
581
+ catch {
582
+ return false;
583
+ }
584
+ }
585
+ function listXiaoEClientSettingsFiles(root) {
586
+ if (!root)
587
+ return [];
588
+ if (isFile(root))
589
+ return [root];
590
+ if (!isDirectory(root))
591
+ return [];
592
+ const candidates = [];
593
+ const addCandidate = (path) => {
594
+ if (isFile(path))
595
+ candidates.push(path);
596
+ };
597
+ const addChildSettings = (directory) => {
598
+ if (!isDirectory(directory))
599
+ return;
545
600
  try {
546
- return statSync(path).isFile();
601
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
602
+ if (entry.isDirectory())
603
+ addCandidate(join(directory, entry.name, 'user_settings.json'));
604
+ }
547
605
  }
548
606
  catch {
549
- return false;
607
+ // Treat an unreadable host directory as an unavailable credential source.
550
608
  }
551
- });
552
- if (files.length === 0)
553
- return '';
554
- return files.sort((left, right) => statSync(right).mtimeMs - statSync(left).mtimeMs)[0];
609
+ };
610
+ addCandidate(join(root, 'user_settings.json'));
611
+ addChildSettings(root);
612
+ // Some desktop hosts inject the XiaoE data root rather than the Robots
613
+ // directory itself. Keep discovery shallow and limited to the known layout.
614
+ const robotsRoot = join(root, 'Robots');
615
+ addCandidate(join(robotsRoot, 'user_settings.json'));
616
+ addChildSettings(robotsRoot);
617
+ return uniqueStrings(candidates);
618
+ }
619
+ function sortedXiaoEClientSettingsFiles(root) {
620
+ const files = listXiaoEClientSettingsFiles(root);
621
+ return files.sort((left, right) => statSync(right).mtimeMs - statSync(left).mtimeMs);
622
+ }
623
+ function xiaoEClientSettingsCandidateFiles(env) {
624
+ const candidates = [];
625
+ const explicitSettingsPath = envString(env, XIAOE_USER_SETTINGS_PATH_ENV_KEY);
626
+ if (isFile(explicitSettingsPath))
627
+ candidates.push(explicitSettingsPath);
628
+ for (const key of XIAOE_CLIENT_SETTINGS_ROOT_ENV_KEYS) {
629
+ const injectedRoot = envString(env, key);
630
+ candidates.push(...sortedXiaoEClientSettingsFiles(injectedRoot));
631
+ }
632
+ candidates.push(...sortedXiaoEClientSettingsFiles(xiaoEClientRobotsRoot(env)));
633
+ return uniqueStrings(candidates);
634
+ }
635
+ export function findXiaoEClientSettingsFile(env = process.env) {
636
+ return xiaoEClientSettingsCandidateFiles(env)[0] || '';
555
637
  }
556
638
  /**
557
639
  * Platform-injected credential: XIAOE_USER_TOKEN (+ the XiaoE service address).
@@ -578,20 +660,19 @@ export function hasXiaoEPlatformCredential(env = process.env) {
578
660
  * Kept for local desktop hosts only; sandboxes must rely on the platform credential.
579
661
  */
580
662
  export function readXiaoEClientCredential(env = process.env) {
581
- const settingsFile = findXiaoEClientSettingsFile(env);
582
- if (!settingsFile)
583
- return null;
584
- try {
585
- const parsed = JSON.parse(readFileSync(settingsFile, 'utf8'));
586
- const authToken = readString(parsed, 'session_id', 'sessionId');
587
- const erpaUrl = normalizeUrl(readString(parsed, 'erpa', 'erpa_url', 'erpaUrl'));
588
- if (!authToken || !erpaUrl)
589
- return null;
590
- return { authToken, erpaUrl, source: XIAOE_CLIENT_SETTINGS_SOURCE };
591
- }
592
- catch {
593
- return null;
663
+ for (const settingsFile of xiaoEClientSettingsCandidateFiles(env)) {
664
+ try {
665
+ const parsed = JSON.parse(readFileSync(settingsFile, 'utf8'));
666
+ const authToken = readString(parsed, 'session_id', 'sessionId');
667
+ const erpaUrl = normalizeUrl(readString(parsed, 'erpa', 'erpa_url', 'erpaUrl'));
668
+ if (authToken && erpaUrl)
669
+ return { authToken, erpaUrl, source: XIAOE_CLIENT_SETTINGS_SOURCE };
670
+ }
671
+ catch {
672
+ // Continue to the next injected or default client settings candidate.
673
+ }
594
674
  }
675
+ return null;
595
676
  }
596
677
  export function hasXiaoEClientCredential(env = process.env) {
597
678
  return Boolean(findXiaoEClientSettingsFile(env));
@@ -850,6 +931,7 @@ export async function tryXiaoEUnifiedLogin(options = {}) {
850
931
  // client session and exchanges it for an eteamId, so Python availability
851
932
  // no longer blocks unified login.
852
933
  if (!credential && hasXiaoEClientCredential(env)) {
934
+ options.logger?.info('Trying built-in XiaoE client session credential...');
853
935
  try {
854
936
  credential = await resolveXiaoEClientCredential(baseUrl || DEFAULT_E10_BASE_URL, env);
855
937
  }
@@ -1,9 +1,9 @@
1
1
  import { CliError, ExitCode } from '../../core/errors.js';
2
2
  import { E10AuthSession, getActiveProfile, readProfileConfig } from './auth/session.js';
3
- import { createXiaoEUnifiedLoginUnavailableError, hasXiaoEEnv, hasXiaoETokenScript, resolveXiaoEPreferredBaseUrl, shouldUseXiaoEBrowserFallback, tryXiaoEUnifiedLogin, } from './auth/xiaoe.js';
3
+ import { createXiaoEUnifiedLoginUnavailableError, hasXiaoEEnv, resolveXiaoEPreferredBaseUrl, shouldUseXiaoEBrowserFallback, tryXiaoEUnifiedLogin, } from './auth/xiaoe.js';
4
4
  import { E10ApiClient } from './client.js';
5
5
  function shouldPreferXiaoEUnifiedLogin(options, env) {
6
- return !options.auth && !options.profile && (hasXiaoEEnv(env) || hasXiaoETokenScript(env));
6
+ return !options.auth && !options.profile && hasXiaoEEnv(env);
7
7
  }
8
8
  export async function getE10Session(ctx, load = {}) {
9
9
  const options = ctx.getGlobalOptions();
@@ -27,7 +27,7 @@ export async function requireE10Session(ctx, load = {}) {
27
27
  const session = await getE10Session(ctx, load);
28
28
  if (!session) {
29
29
  const options = ctx.getGlobalOptions();
30
- if ((hasXiaoEEnv(ctx.env) || hasXiaoETokenScript(ctx.env)) && !shouldUseXiaoEBrowserFallback()) {
30
+ if (hasXiaoEEnv(ctx.env) && !shouldUseXiaoEBrowserFallback()) {
31
31
  const baseUrl = resolveXiaoEPreferredBaseUrl({
32
32
  explicitBaseUrl: options.baseUrl,
33
33
  profileBaseUrl: readProfileConfig(getActiveProfile()).baseUrl,
@@ -62,7 +62,7 @@ export class E10RequestRuntime {
62
62
  const headers = this.composeHeaders(mutable, request.trustedHeaders);
63
63
  const init = this.buildFetchInit(mutable, headers);
64
64
  const response = await this.fetchWithTimeout(url, init, mutable.timeoutMs);
65
- const parsed = await this.readResponse(response, mutable.responseType, mutable.bigIntStrings);
65
+ const parsed = await this.readResponse(response, mutable.responseType, mutable.bigIntStrings, mutable.maxResponseBytes, mutable.timeoutMs);
66
66
  await this.runAfterResponse(mutable, sessionContext, parsed);
67
67
  return parsed;
68
68
  }
@@ -82,6 +82,8 @@ export class E10RequestRuntime {
82
82
  body: request.body,
83
83
  form: request.form,
84
84
  formData: request.formData,
85
+ streamBody: request.streamBody,
86
+ maxResponseBytes: request.maxResponseBytes,
85
87
  timeoutMs: request.timeoutMs || DEFAULT_TIMEOUT_MS,
86
88
  responseType: request.responseType || 'json',
87
89
  bigIntStrings: request.bigIntStrings ?? DEFAULT_BIG_INT_STRINGS,
@@ -156,7 +158,11 @@ export class E10RequestRuntime {
156
158
  headers,
157
159
  redirect: 'manual',
158
160
  };
159
- if (request.formData) {
161
+ if (request.streamBody) {
162
+ init.body = request.streamBody;
163
+ init.duplex = 'half';
164
+ }
165
+ else if (request.formData) {
160
166
  init.body = request.formData;
161
167
  }
162
168
  else if (request.form !== undefined) {
@@ -192,7 +198,7 @@ export class E10RequestRuntime {
192
198
  clearTimeout(timer);
193
199
  }
194
200
  }
195
- async readResponse(response, responseType, bigIntStrings = DEFAULT_BIG_INT_STRINGS) {
201
+ async readResponse(response, responseType, bigIntStrings = DEFAULT_BIG_INT_STRINGS, maxResponseBytes, timeoutMs = DEFAULT_TIMEOUT_MS) {
196
202
  if (responseType === 'binary') {
197
203
  return {
198
204
  status: response.status,
@@ -201,7 +207,8 @@ export class E10RequestRuntime {
201
207
  contentType: response.headers.get('content-type') || 'application/octet-stream',
202
208
  };
203
209
  }
204
- const text = await response.text();
210
+ const text = maxResponseBytes === undefined ? await response.text()
211
+ : await readBoundedText(response, maxResponseBytes, timeoutMs);
205
212
  let value = {};
206
213
  let parseError;
207
214
  try {
@@ -304,6 +311,40 @@ function withQuery(baseUrl, requestPath, query = {}) {
304
311
  }
305
312
  return url;
306
313
  }
314
+ async function readBoundedText(response, limit, timeoutMs) {
315
+ if (!response.body)
316
+ return '';
317
+ const reader = response.body.getReader();
318
+ const chunks = [];
319
+ let size = 0;
320
+ let expired = false;
321
+ const timer = setTimeout(() => { expired = true; void reader.cancel().catch(() => undefined); }, timeoutMs);
322
+ try {
323
+ while (true) {
324
+ const next = await reader.read();
325
+ if (expired)
326
+ throw new E10ApiError('network', 'timeout', '文件服务响应读取超时', { retryable: false });
327
+ if (next.done)
328
+ break;
329
+ size += next.value.byteLength;
330
+ if (size > limit) {
331
+ await reader.cancel().catch(() => undefined);
332
+ throw new E10ApiError('network', 'response_too_large', '文件服务响应超过大小上限', { retryable: false });
333
+ }
334
+ chunks.push(next.value);
335
+ }
336
+ return Buffer.concat(chunks, size).toString('utf8');
337
+ }
338
+ catch (error) {
339
+ if (error instanceof E10ApiError)
340
+ throw error;
341
+ throw new E10ApiError('network', 'response_read_failed', '文件服务响应读取失败', { retryable: false });
342
+ }
343
+ finally {
344
+ clearTimeout(timer);
345
+ reader.releaseLock();
346
+ }
347
+ }
307
348
  function sanitizePublicHeaders(headers) {
308
349
  const next = { ...headers };
309
350
  stripReservedHeaders(next);
@@ -338,6 +379,7 @@ function requestForHook(request) {
338
379
  query: { ...request.query },
339
380
  headers: { ...request.headers },
340
381
  body: cloneForHook(request.body),
382
+ streamBody: undefined,
341
383
  };
342
384
  }
343
385
  function cloneForHook(value) {
@@ -0,0 +1,124 @@
1
+ /** Port of weaver-file-upload's local inspection/context contract. Never buffer a complete upload file. */
2
+ import { createHash } from 'node:crypto';
3
+ import { constants } from 'node:fs';
4
+ import { lstat, open, readFile } from 'node:fs/promises';
5
+ import { basename, extname, isAbsolute } from 'node:path';
6
+ import { caizhilianValidationError } from '../errors.js';
7
+ import { assertNoLossyIntegers } from '../operations/shared.js';
8
+ export const RESERVED_CONTEXT_FIELDS = ['sf_request_type', 'compressImg', 'module', 'name', 'size', 'MD5',
9
+ 'lastModified', 'lastModifiedDate', 'preUploadId', 'uploadType', 'uploadShardSize', 'chunk', 'chunks', 'file'];
10
+ const RESERVED = new Set(RESERVED_CONTEXT_FIELDS.map((key) => key.toLowerCase()));
11
+ const PRIVATE_KEYS = /^(cookie|eteamsid|eteams_id|authorization|token|access_token|password|ticket|__proto__|prototype|constructor)$/i;
12
+ const MIME = { txt: 'text/plain', pdf: 'application/pdf', png: 'image/png',
13
+ jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif', webp: 'image/webp',
14
+ docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
15
+ xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
16
+ pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation' };
17
+ export const READ_FLAGS = constants.O_RDONLY | (process.platform === 'win32' ? 0 : constants.O_NOFOLLOW);
18
+ async function regularFile(value, label) {
19
+ if (typeof value !== 'string' || !isAbsolute(value) || value.includes('\0')) {
20
+ throw caizhilianValidationError('file_path_invalid', `${label} 必须是本地文件绝对路径`);
21
+ }
22
+ const info = await lstat(value).catch(() => {
23
+ throw caizhilianValidationError('file_not_found', `${label} 不存在或不可访问`);
24
+ });
25
+ if (!info.isFile() || info.isSymbolicLink()) {
26
+ throw caizhilianValidationError('file_not_regular', `${label} 必须是非符号链接的普通文件`);
27
+ }
28
+ if (!Number.isSafeInteger(info.size))
29
+ throw caizhilianValidationError('file_size_invalid', '文件大小超出支持范围');
30
+ return { path: value, info };
31
+ }
32
+ export async function inspectUploadFile(value) {
33
+ const { path, info } = await regularFile(value, 'file_path');
34
+ const md5 = createHash('md5');
35
+ const sha256 = createHash('sha256');
36
+ try {
37
+ const handle = await open(path, READ_FLAGS);
38
+ try {
39
+ for await (const bytes of handle.createReadStream({ autoClose: false })) {
40
+ md5.update(bytes);
41
+ sha256.update(bytes);
42
+ }
43
+ }
44
+ finally {
45
+ await handle.close();
46
+ }
47
+ }
48
+ catch {
49
+ throw caizhilianValidationError('file_unreadable', '上传文件不可读取');
50
+ }
51
+ const after = await lstat(path);
52
+ if (info.size !== after.size || info.mtimeMs !== after.mtimeMs || info.ctimeMs !== after.ctimeMs
53
+ || info.ino !== after.ino || after.isSymbolicLink()) {
54
+ throw caizhilianValidationError('file_changed', '文件在校验过程中发生变化,请重新准备上传');
55
+ }
56
+ const extension = extname(path).slice(1).toLowerCase();
57
+ const mimeType = MIME[extension] ?? 'application/octet-stream';
58
+ return { path, name: basename(path), extension, mime_type: mimeType, is_image: mimeType.startsWith('image/'),
59
+ size: info.size, mtime_ms: info.mtimeMs, ctime_ms: info.ctimeMs, inode: info.ino,
60
+ md5: md5.digest('hex'), sha256: sha256.digest('hex') };
61
+ }
62
+ export function assertUploadSnapshot(file, info) {
63
+ if (!info.isFile() || info.size !== file.size || info.mtimeMs !== file.mtime_ms
64
+ || info.ctimeMs !== file.ctime_ms || info.ino !== file.inode) {
65
+ throw caizhilianValidationError('file_changed', '文件在上传过程中发生变化,请停止并重新准备上传');
66
+ }
67
+ }
68
+ function validateContext(value, depth = 0) {
69
+ if (depth > 12)
70
+ throw caizhilianValidationError('context_invalid', '业务上下文嵌套不能超过 12 层');
71
+ if (value === null || typeof value !== 'object')
72
+ return;
73
+ for (const [key, item] of Object.entries(value)) {
74
+ if (PRIVATE_KEYS.test(key) || /[\r\n\0]/.test(key) || (depth === 0 && RESERVED.has(key.toLowerCase()))) {
75
+ throw caizhilianValidationError('context_forbidden_field', '业务上下文包含凭证、危险字段或协议保留字段');
76
+ }
77
+ validateContext(item, depth + 1);
78
+ }
79
+ }
80
+ export async function readUploadContext(value) {
81
+ let fields = {};
82
+ if (value !== undefined && value !== '') {
83
+ const { path, info } = await regularFile(value, 'context_file');
84
+ if (info.size > 64 * 1024)
85
+ throw caizhilianValidationError('context_too_large', '业务上下文不能超过 64 KiB');
86
+ const content = await readFile(path, { flag: READ_FLAGS });
87
+ if (content.length > 64 * 1024)
88
+ throw caizhilianValidationError('context_too_large', '业务上下文不能超过 64 KiB');
89
+ try {
90
+ fields = JSON.parse(content.toString('utf8'));
91
+ }
92
+ catch {
93
+ throw caizhilianValidationError('context_invalid', 'context_file 必须是合法 JSON 对象');
94
+ }
95
+ if (!fields || typeof fields !== 'object' || Array.isArray(fields)) {
96
+ throw caizhilianValidationError('context_invalid', 'context_file 必须是 JSON 对象');
97
+ }
98
+ validateContext(fields);
99
+ assertNoLossyIntegers(fields, 'context_file');
100
+ }
101
+ const keys = Object.keys(fields).sort();
102
+ const ordered = Object.fromEntries(keys.map((key) => [key, fields[key]]));
103
+ return { fields: ordered, keys, sha256: createHash('sha256').update(JSON.stringify(ordered)).digest('hex') };
104
+ }
105
+ export function uploadModule(value) {
106
+ if (typeof value !== 'string' || !/^[A-Za-z0-9_.-]{1,64}$/.test(value)) {
107
+ throw caizhilianValidationError('module_invalid', 'module 必须来自真实业务上下文,且为 1–64 个字母、数字或 ._-');
108
+ }
109
+ return value;
110
+ }
111
+ export function uploadChatId(value) {
112
+ const id = value ?? 'cli';
113
+ if (typeof id !== 'string' || !/^[A-Za-z0-9_.-]{1,128}$/.test(id) || id === '.' || id === '..') {
114
+ throw caizhilianValidationError('chat_id_invalid', 'chat_id 必须为 1–128 个字母、数字或 ._-');
115
+ }
116
+ return id;
117
+ }
118
+ export function uploadTimeout(value) {
119
+ const seconds = value ?? 300;
120
+ if (typeof seconds !== 'number' || !Number.isInteger(seconds) || seconds < 1 || seconds > 3600) {
121
+ throw caizhilianValidationError('timeout_invalid', 'timeout_seconds 必须为 1–3600 的整数');
122
+ }
123
+ return seconds * 1000;
124
+ }
@@ -0,0 +1,47 @@
1
+ /** Exact-length multipart body with bounded file slices and RFC 5987 UTF-8 filenames. */
2
+ import { randomBytes } from 'node:crypto';
3
+ import { open } from 'node:fs/promises';
4
+ import { Readable } from 'node:stream';
5
+ import { assertUploadSnapshot, READ_FLAGS } from './metadata.js';
6
+ function quoted(value) { return value.replace(/[\r\n\0]/g, '_').replace(/\\/g, '\\\\').replace(/"/g, '\\"'); }
7
+ function encodedFilename(value) {
8
+ return encodeURIComponent(value).replace(/[!'()*]/g, (character) => `%${character.charCodeAt(0).toString(16).toUpperCase()}`);
9
+ }
10
+ export function uploadMultipart(fields, file) {
11
+ const boundary = `weaver-${randomBytes(16).toString('hex')}`;
12
+ const parts = [];
13
+ for (const [key, value] of Object.entries(fields)) {
14
+ const text = value === null || value === undefined ? '' : typeof value === 'string' ? value : JSON.stringify(value);
15
+ parts.push(Buffer.from(`--${boundary}\r\nContent-Disposition: form-data; name="${quoted(key)}"\r\n\r\n${text}\r\n`));
16
+ }
17
+ if (file) {
18
+ const fallback = quoted(file.meta.name.replace(/[^\x20-\x7e]/g, '_'));
19
+ parts.push(Buffer.from(`--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="${fallback}"; `
20
+ + `filename*=UTF-8''${encodedFilename(file.meta.name)}\r\nContent-Type: ${file.meta.mime_type}\r\n\r\n`));
21
+ }
22
+ const tail = Buffer.from(`${file ? '\r\n' : ''}--${boundary}--\r\n`);
23
+ const body = Readable.from((async function* () {
24
+ yield* parts;
25
+ if (file && file.size > 0) {
26
+ const handle = await open(file.meta.path, READ_FLAGS);
27
+ try {
28
+ assertUploadSnapshot(file.meta, await handle.stat());
29
+ const stream = handle.createReadStream({ start: file.start, end: file.start + file.size - 1, autoClose: false });
30
+ try {
31
+ for await (const bytes of stream)
32
+ yield bytes;
33
+ assertUploadSnapshot(file.meta, await handle.stat());
34
+ }
35
+ finally {
36
+ stream.destroy();
37
+ }
38
+ }
39
+ finally {
40
+ await handle.close();
41
+ }
42
+ }
43
+ yield tail;
44
+ })(), { objectMode: false });
45
+ return { body, contentType: `multipart/form-data; boundary=${boundary}`,
46
+ contentLength: parts.reduce((total, bytes) => total + bytes.length, tail.length + (file?.size ?? 0)) };
47
+ }
@@ -0,0 +1,116 @@
1
+ /** Upload strategy owner, adapted from weaver-file-upload to the CLI-owned authenticated host. */
2
+ import { CaizhilianCliError, caizhilianValidationError } from '../errors.js';
3
+ import { ExitCode } from '../../../core/errors.js';
4
+ import { uploadMultipart } from './multipart.js';
5
+ const object = (value) => value && typeof value === 'object' && !Array.isArray(value) ? value : {};
6
+ const invalid = (subtype, message) => { throw caizhilianValidationError(subtype, message); };
7
+ function checkedData(response) {
8
+ const envelope = object(response);
9
+ const data = object(envelope.data);
10
+ const code = envelope.code === undefined || envelope.code === null ? '' : String(envelope.code).toLowerCase();
11
+ if (code && !['0', '200', 'success'].includes(code))
12
+ invalid('upload_business_failed', '文件服务未确认操作成功');
13
+ for (const record of [envelope, data]) {
14
+ if (record.status === false || record.success === false || record.fail === true) {
15
+ invalid('upload_business_failed', '文件服务未确认操作成功');
16
+ }
17
+ }
18
+ if (!envelope.data || typeof envelope.data !== 'object' || Array.isArray(envelope.data)) {
19
+ invalid('upload_response_invalid', '文件服务响应缺少有效数据对象');
20
+ }
21
+ return data;
22
+ }
23
+ function fileRecord(data) {
24
+ const candidates = [[data], [object(data.fileObj)], [object(data.uploadModuleDto)],
25
+ [object(data.uploadModuleDto?.fileObj), object(data.uploadModuleDto)], [object(data.imUploadInfoDto)],
26
+ [object(data.imUploadInfoDto?.fileObj), object(data.imUploadInfoDto)]];
27
+ for (const [record, parent] of candidates) {
28
+ const id = record.fileId ?? record.fileid;
29
+ if (typeof id === 'number' && !Number.isSafeInteger(id))
30
+ invalid('file_id_invalid', '文件 ID 精度不可靠');
31
+ if ((typeof id === 'string' || typeof id === 'number') && String(id).trim()) {
32
+ return { id: String(id).trim(), sizes: [record.size, parent?.size, data.size] };
33
+ }
34
+ }
35
+ return undefined;
36
+ }
37
+ function terminal(data, file) {
38
+ const record = fileRecord(data);
39
+ if (!record || data.endChunk === false)
40
+ invalid('upload_not_terminal', '上传未返回已完成的非空文件 ID');
41
+ for (const reported of record.sizes) {
42
+ if (reported === undefined || reported === null || reported === '')
43
+ continue;
44
+ const size = Number(reported);
45
+ if (!Number.isSafeInteger(size) || size < 0 || (size !== 0 && size !== file.size)) {
46
+ invalid('upload_size_mismatch', '服务端文件大小与本地文件不一致');
47
+ }
48
+ }
49
+ return record.id;
50
+ }
51
+ async function send(host, path, fields, timeoutMs, file) {
52
+ const multipart = uploadMultipart(fields, file);
53
+ try {
54
+ return checkedData(await host.request({ method: 'POST', path, query: { sf_request_type: 'ajax' },
55
+ streamMultipart: multipart, timeoutMs, maxResponseBytes: 4 * 1024 * 1024, requireHttp200: true,
56
+ tolerateBusinessError: true,
57
+ operation: 'caizhilian.file-upload.upload.apply' }));
58
+ }
59
+ catch (error) {
60
+ const failure = error;
61
+ if (file && (failure?.type === 'network' || failure?.subtype === 'http_error')) {
62
+ throw new CaizhilianCliError('partial', 'write_uncertain', '上传请求已发出,但未确认结果;请勿自动重复上传', {
63
+ retryable: false, details: { execution_state: 'unknown', retry_safe: false }, exitCode: ExitCode.Partial,
64
+ });
65
+ }
66
+ throw error;
67
+ }
68
+ finally {
69
+ multipart.body.destroy();
70
+ }
71
+ }
72
+ export async function uploadToFileService(host, file, module, context, timeoutMs) {
73
+ // Node stat retains fractional milliseconds; E10 parses these fields as integer milliseconds.
74
+ const lastModified = String(Math.floor(file.mtime_ms));
75
+ const fields = { ...context.fields, compressImg: 'false', module, name: file.name, size: String(file.size),
76
+ MD5: file.md5, lastModified, lastModifiedDate: lastModified };
77
+ const pre = await send(host, '/api/file/preUploadCheck', fields, timeoutMs);
78
+ const type = pre.uploadType;
79
+ if (!['second', 'common', 'chunk'].includes(type))
80
+ invalid('upload_type_invalid', '文件服务返回未知上传策略');
81
+ if (type === 'second')
82
+ return { file_id: terminal(pre, file), upload_type: type };
83
+ if (typeof pre.preUploadId !== 'string' || !pre.preUploadId.trim()) {
84
+ // E10 may return preUploadId as a safe numeric ID.
85
+ if (typeof pre.preUploadId !== 'number' || !Number.isSafeInteger(pre.preUploadId) || pre.preUploadId <= 0) {
86
+ invalid('upload_precheck_invalid', '预上传检查未返回有效 preUploadId');
87
+ }
88
+ }
89
+ const uploadFields = { ...fields, preUploadId: String(pre.preUploadId), uploadType: type };
90
+ if (type === 'common') {
91
+ const data = await send(host, '/api/file/module/upload', uploadFields, timeoutMs, { meta: file, start: 0, size: file.size });
92
+ return { file_id: terminal(data, file), upload_type: type };
93
+ }
94
+ const chunkMiB = Number(pre.chunkDto?.chunkSize);
95
+ if (!Number.isSafeInteger(chunkMiB) || chunkMiB <= 0 || file.size <= 0) {
96
+ invalid('chunk_size_invalid', '分片上传需要非空文件和正整数 MiB 分片大小');
97
+ }
98
+ const chunkSize = chunkMiB * 1024 * 1024;
99
+ if (!Number.isSafeInteger(chunkSize) || chunkSize <= 0)
100
+ invalid('chunk_size_invalid', '分片大小必须是有效的正 MiB 值');
101
+ const count = Math.max(1, Math.ceil(file.size / chunkSize));
102
+ if (pre.chunkDto?.chunkCount !== undefined && Number(pre.chunkDto.chunkCount) !== count) {
103
+ invalid('chunk_count_mismatch', '服务端分片数量与本地计算不一致');
104
+ }
105
+ for (let index = 0; index < count; index++) {
106
+ const start = index * chunkSize;
107
+ const size = Math.min(chunkSize, file.size - start);
108
+ const data = await send(host, '/api/file/module/upload', { ...uploadFields, chunk: index, chunks: count,
109
+ uploadShardSize: String(size) }, timeoutMs, { meta: file, start, size });
110
+ if (index === count - 1)
111
+ return { file_id: terminal(data, file), upload_type: 'chunk' };
112
+ if (data.endChunk !== false || fileRecord(data))
113
+ invalid('chunk_terminal_early', '中间分片缺少明确未完成状态或提前返回文件 ID');
114
+ }
115
+ return invalid('upload_not_terminal', '分片上传未确认完成');
116
+ }
@@ -0,0 +1,37 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { chmod, mkdir, writeFile } from 'node:fs/promises';
3
+ import { homedir } from 'node:os';
4
+ import { dirname, resolve } from 'node:path';
5
+ import { CaizhilianCliError } from '../errors.js';
6
+ import { ExitCode } from '../../../core/errors.js';
7
+ export async function writeUploadReceipt(env, chatId, module, file, context, verified) {
8
+ const session = await env.host.getSession();
9
+ const identity = JSON.stringify({ baseUrl: session.baseUrl, userId: session.userId, tenantKey: session.tenantKey });
10
+ const result = { version: 'weaver_file_upload_result.v1', status: 'completed', business_verified: true,
11
+ upload_type: verified.upload_type, file: { file_id: verified.file_id, name: file.name, size: file.size,
12
+ mime_type: file.mime_type, extension: file.extension, is_image: file.is_image },
13
+ integrity: { md5: file.md5, sha256: file.sha256 },
14
+ request_evidence: { module, context_keys: context.keys, context_sha256: context.sha256,
15
+ environment_identity_sha256: createHash('sha256').update(identity).digest('hex'),
16
+ login_mode: 'weaver-work-cli', automatic_fallback: false } };
17
+ const configPath = env.ctx.config?.path();
18
+ const stateRoot = configPath ? dirname(configPath) : env.ctx.env?.WEAVER_WORK_CLI_HOME
19
+ || env.ctx.env?.WORK_CLI_HOME || resolve(homedir(), '.weaver-work-cli');
20
+ const directory = resolve(stateRoot, 'caizhilian', 'file-upload', 'runs', chatId, 'receipts');
21
+ const filename = resolve(directory, `upload-${randomUUID()}.json`);
22
+ const content = `${JSON.stringify(result, null, 2)}\n`;
23
+ try {
24
+ await mkdir(directory, { recursive: true, mode: 0o700 });
25
+ if (process.platform !== 'win32')
26
+ await chmod(directory, 0o700);
27
+ await writeFile(filename, content, { flag: 'wx', mode: 0o600 });
28
+ }
29
+ catch {
30
+ throw new CaizhilianCliError('partial', 'receipt_write_failed', '文件已上传,但本地回执保存失败;请勿重复上传', {
31
+ retryable: false, partialData: { file_id: verified.file_id, upload_type: verified.upload_type },
32
+ details: { execution_state: 'completed', retry_safe: false }, exitCode: ExitCode.Partial,
33
+ });
34
+ }
35
+ return { ...result, file_id: verified.file_id, file_name: file.name, size: file.size, ext: file.extension,
36
+ receipt_ref: filename, receipt_sha256: createHash('sha256').update(content).digest('hex') };
37
+ }