weaver-work-cli 0.1.25 → 0.1.28

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 (173) hide show
  1. package/README.md +35 -30
  2. package/dist/cmd/root.js +1 -0
  3. package/dist/cmd/setup/index.js +1 -1
  4. package/dist/core/runtime-agent.js +19 -0
  5. package/dist/internal/e10/auth/commands.js +48 -33
  6. package/dist/internal/e10/auth/messages.js +3 -0
  7. package/dist/internal/e10/auth/session.js +8 -0
  8. package/dist/internal/e10/auth/xiaoe.js +62 -43
  9. package/dist/internal/e10/auth-recovery.js +148 -0
  10. package/dist/internal/e10/client.js +47 -15
  11. package/dist/internal/e10/context.js +9 -31
  12. package/dist/internal/e10/index.js +1 -0
  13. package/dist/internal/e10/request-runtime.js +51 -9
  14. package/dist/shortcuts/archive/host.js +3 -2
  15. package/dist/shortcuts/archive/manifest.js +1 -1
  16. package/dist/shortcuts/archive-oa/constants.js +66 -0
  17. package/dist/shortcuts/archive-oa/continuation.js +70 -0
  18. package/dist/shortcuts/archive-oa/errors.js +53 -0
  19. package/dist/shortcuts/archive-oa/host.js +158 -0
  20. package/dist/shortcuts/archive-oa/index.js +225 -0
  21. package/dist/shortcuts/archive-oa/manifest.js +62 -0
  22. package/dist/shortcuts/archive-oa/operations/borrow-car.js +159 -0
  23. package/dist/shortcuts/archive-oa/operations/borrow-url.js +108 -0
  24. package/dist/shortcuts/archive-oa/operations/confirm.js +48 -0
  25. package/dist/shortcuts/archive-oa/operations/contract.js +120 -0
  26. package/dist/shortcuts/archive-oa/operations/locate.js +50 -0
  27. package/dist/shortcuts/archive-oa/operations/registry.js +40 -0
  28. package/dist/shortcuts/archive-oa/operations/shared.js +181 -0
  29. package/dist/shortcuts/archive-oa/operations/types.js +45 -0
  30. package/dist/shortcuts/archive-oa/operations.js +13 -0
  31. package/dist/shortcuts/asset/host.js +7 -6
  32. package/dist/shortcuts/blog/host.js +4 -3
  33. package/dist/shortcuts/caizhilian/host.js +3 -2
  34. package/dist/shortcuts/caizhilian/manifest.js +1 -1
  35. package/dist/shortcuts/calendar/host.js +2 -1
  36. package/dist/shortcuts/contract/host.js +34 -59
  37. package/dist/shortcuts/ehr/host.js +2 -1
  38. package/dist/shortcuts/esb/host.js +2 -1
  39. package/dist/shortcuts/fna/host.js +6 -3
  40. package/dist/shortcuts/fna/manifest.js +10 -5
  41. package/dist/shortcuts/fna/operations/expense-chart.js +162 -0
  42. package/dist/shortcuts/fna/operations/registry.js +2 -0
  43. package/dist/shortcuts/hrm/host.js +2 -1
  44. package/dist/shortcuts/im/host.js +3 -2
  45. package/dist/shortcuts/index.js +2 -0
  46. package/dist/shortcuts/invoice/host.js +9 -7
  47. package/dist/shortcuts/invoice/manifest.js +38 -47
  48. package/dist/shortcuts/invoice/operations/issuing-qys.js +328 -0
  49. package/dist/shortcuts/invoice/operations/registry.js +2 -3
  50. package/dist/shortcuts/jiuchuanhui/host.js +2 -1
  51. package/dist/shortcuts/mail/host.js +2 -1
  52. package/dist/shortcuts/meeting/host.js +2 -1
  53. package/dist/shortcuts/meeting/operations/eb/conflict.js +78 -12
  54. package/dist/shortcuts/okr/host.js +2 -1
  55. package/dist/shortcuts/plan/host.js +2 -1
  56. package/dist/shortcuts/project/host.js +2 -1
  57. package/dist/shortcuts/workflow/endpoints.js +11 -0
  58. package/dist/shortcuts/workflow/host.js +5 -7
  59. package/dist/shortcuts/workflow/index.js +6 -36
  60. package/dist/shortcuts/workflow/operations/chatscene.js +252 -0
  61. package/dist/shortcuts/workflow/operations/form.js +1047 -191
  62. package/dist/shortcuts/workflow/operations/read.js +137 -8
  63. package/dist/shortcuts/workflow/operations/sign-input.js +106 -0
  64. package/dist/shortcuts/workflow/operations/write.js +9 -1
  65. package/dist/shortcuts/workflow/stdout-compact.js +16 -1
  66. package/docs/SKILL.md +1 -1
  67. package/docs/_catalog.md +1 -1
  68. package/docs/agent-invoice.md +1 -1
  69. package/docs/archive-oa.md +79 -0
  70. package/docs/caizhilian.md +1 -1
  71. package/docs/e10-auth.md +7 -6
  72. package/docs/fna.md +7 -3
  73. package/docs/invoice.md +4 -6
  74. package/package.json +1 -1
  75. package/skill-template/business-info.json +20 -1
  76. package/skill-template/domains/archive-oa.md +19 -0
  77. package/skill-template/domains/caizhilian.md +2 -1
  78. package/skill-template/domains/qiyecheng.md +1 -0
  79. package/skill-template/domains/yepiaotong.md +8 -4
  80. package/skill-template/skill-template.md +1 -0
  81. package/skills/weaver-e10-archive-oa/SKILL.md +159 -0
  82. package/skills/weaver-e10-archive-oa/references/archive-locate.md +49 -0
  83. package/skills/weaver-e10-archive-oa/references/borrow-car.md +76 -0
  84. package/skills/weaver-e10-archive-oa/references/borrow-flow.md +53 -0
  85. package/skills/weaver-e10-archive-oa/references/contract-search.md +63 -0
  86. package/skills/weaver-e10-archive-oa/references/disabled-capabilities.md +29 -0
  87. package/skills/weaver-e10-archive-oa/references/qys-contract-search.md +47 -0
  88. package/skills/weaver-e10-archive-oa/references/source-manifest.json +400 -0
  89. package/skills/weaver-e10-blog/SKILL.md +6 -1
  90. package/skills/weaver-e10-blog/references/blog-query.md +3 -1
  91. package/skills/weaver-e10-builder/SKILL.md +22 -0
  92. package/skills/weaver-e10-caizhilian/SKILL.md +47 -16
  93. package/skills/weaver-e10-caizhilian/references/action-flow.md +70 -0
  94. package/skills/weaver-e10-caizhilian/references/agent-entry.md +12 -4
  95. package/skills/weaver-e10-caizhilian/references/auth-and-install.md +207 -0
  96. package/skills/weaver-e10-caizhilian/references/collaboration.md +5 -3
  97. package/skills/weaver-e10-caizhilian/references/document.md +33 -11
  98. package/skills/weaver-e10-caizhilian/references/file-collection.md +57 -54
  99. package/skills/weaver-e10-caizhilian/references/file-upload.md +5 -6
  100. package/skills/weaver-e10-caizhilian/references/files.md +9 -3
  101. package/skills/weaver-e10-caizhilian/references/folder.md +48 -16
  102. package/skills/weaver-e10-caizhilian/references/host-executor-prompt.md +32 -0
  103. package/skills/weaver-e10-caizhilian/references/host-platform-integration.md +46 -0
  104. package/skills/weaver-e10-caizhilian/references/rule-index.md +56 -0
  105. package/skills/weaver-e10-caizhilian/references/setting-attach.md +17 -54
  106. package/skills/weaver-e10-caizhilian/references/setting-backup.md +16 -63
  107. package/skills/weaver-e10-caizhilian/references/setting-encrypt.md +24 -64
  108. package/skills/weaver-e10-caizhilian/references/setting-storage-docs-summary.md +126 -0
  109. package/skills/weaver-e10-caizhilian/references/setting-storage-field-map.md +57 -0
  110. package/skills/weaver-e10-caizhilian/references/setting-storage.md +143 -548
  111. package/skills/weaver-e10-caizhilian/references/source-manifest.json +7 -7
  112. package/skills/weaver-e10-caizhilian/references/task-workflow.md +87 -0
  113. package/skills/weaver-e10-caizhilian/references/withheld.md +21 -45
  114. package/skills/weaver-e10-caizhilian/references/write-protocol.md +7 -0
  115. package/skills/weaver-e10-calendar/SKILL.md +6 -1
  116. package/skills/weaver-e10-esb/SKILL.md +8 -0
  117. package/skills/weaver-e10-esb/references/input-format.md +3 -1
  118. package/skills/weaver-e10-esb/references/source-manifest.json +5 -5
  119. package/skills/weaver-e10-hrm/SKILL.md +6 -1
  120. package/skills/weaver-e10-hrm/references/employee.md +1 -1
  121. package/skills/weaver-e10-hrm/references/org.md +1 -1
  122. package/skills/weaver-e10-hrm/references/position.md +1 -1
  123. package/skills/weaver-e10-jinchengda/SKILL.md +2 -1
  124. package/skills/weaver-e10-jinchengda/references/contract-agent-entry.md +1 -1
  125. package/skills/weaver-e10-jiuchuanhui/SKILL.md +6 -1
  126. package/skills/weaver-e10-jucailin/SKILL.md +6 -1
  127. package/skills/weaver-e10-jucailin/references/hr-contact.md +1 -1
  128. package/skills/weaver-e10-jucailin/references/salary.md +1 -1
  129. package/skills/weaver-e10-mail/SKILL.md +6 -1
  130. package/skills/weaver-e10-meeting/SKILL.md +11 -6
  131. package/skills/weaver-e10-meeting/references/meeting-eb.md +7 -3
  132. package/skills/weaver-e10-meeting/references/meeting-queries.md +3 -1
  133. package/skills/weaver-e10-meeting/references/meeting-verification.md +4 -2
  134. package/skills/weaver-e10-okr/SKILL.md +6 -1
  135. package/skills/weaver-e10-okr/references/source-manifest.json +5 -5
  136. package/skills/weaver-e10-plan/SKILL.md +6 -1
  137. package/skills/weaver-e10-plan/references/plan-overview-and-routing.md +3 -1
  138. package/skills/weaver-e10-plan/references/plan-report-query.md +3 -1
  139. package/skills/weaver-e10-plan/references/source-manifest.json +7 -7
  140. package/skills/weaver-e10-qiyecheng/SKILL.md +16 -6
  141. package/skills/weaver-e10-qiyecheng/references/catalog.md +6 -3
  142. package/skills/weaver-e10-qiyecheng/references/expense-center.md +2 -0
  143. package/skills/weaver-e10-qiyecheng/references/expense-chart.md +78 -0
  144. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +87 -33
  145. package/skills/weaver-e10-shared/SKILL.md +53 -28
  146. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +22 -20
  147. package/skills/weaver-e10-shared/references/non-interactive-environment.md +13 -13
  148. package/skills/weaver-e10-shared/references/weaver-e10-installation.md +3 -1
  149. package/skills/weaver-e10-wenshuding/SKILL.md +6 -1
  150. package/skills/weaver-e10-wenshuding/references/source-manifest.json +3 -3
  151. package/skills/weaver-e10-workflow/references/source-manifest.json +33 -24
  152. package/skills/weaver-e10-workflow/references/workflow-create.md +41 -26
  153. package/skills/weaver-e10-yepiaotong/SKILL.md +23 -18
  154. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +87 -45
  155. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-form-fill-rules.md +152 -0
  156. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-workflow.md +210 -0
  157. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +59 -36
  158. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +63 -512
  159. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +205 -346
  160. package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +4 -5
  161. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +231 -344
  162. package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +5 -5
  163. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +201 -162
  164. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +121 -145
  165. package/skills/weaver-e10-yimiaoban/SKILL.md +9 -2
  166. package/skills/weaver-e10-yimiaoban/references/file-user-i18n.md +1 -1
  167. package/skills/weaver-e10-yimiaoban/references/msg-read.md +1 -1
  168. package/skills/weaver-e10-yimiaoban/references/source-manifest.json +9 -9
  169. package/skills/weaver-e10-ziguanjia/SKILL.md +6 -1
  170. package/dist/shortcuts/invoice/operations/issuing.js +0 -198
  171. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-field-rules.md +0 -161
  172. package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +0 -107
  173. package/skills/weaver-e10-yepiaotong/references/reim-fast-path.md +0 -119
@@ -555,8 +555,7 @@
555
555
  "workflow.create"
556
556
  ],
557
557
  "schemaFields": [
558
- "workflow",
559
- "relatesTo"
558
+ "workflow"
560
559
  ],
561
560
  "references": [
562
561
  "references/workflow-create.md"
@@ -888,13 +887,8 @@
888
887
  }
889
888
  },
890
889
  "artifactBaseline": {
891
- "aggregateSha256": "bc74f476cd80c289881f195cb60385ba749698274bcd94cf286b76cf5523a947",
890
+ "aggregateSha256": "89ee9f67e64f8c6e7c94ddbacc98d4adf9accd37bc3c8fb871fe7734161d86df",
892
891
  "files": [
893
- {
894
- "path": "skills/weaver-e10-workflow/SKILL.md",
895
- "size": 41574,
896
- "sha256": "fe8860d92a5bf2f96f3a71e203bbd5993a82acb826a774cd98f371e8b80a2a1d"
897
- },
898
892
  {
899
893
  "path": "skills/weaver-e10-workflow/references/workflow-agent-entry.md",
900
894
  "size": 6090,
@@ -907,8 +901,8 @@
907
901
  },
908
902
  {
909
903
  "path": "skills/weaver-e10-workflow/references/workflow-create.md",
910
- "size": 62233,
911
- "sha256": "64abab1a077b27607a34d3c1d8774e8b375ff7bb6729818e1d821b5b8ad3e76b"
904
+ "size": 65844,
905
+ "sha256": "136ed885b0abb9908150e3d47e763ef5f1ed406d293702c656b6e3c6344bbd32"
912
906
  },
913
907
  {
914
908
  "path": "skills/weaver-e10-workflow/references/workflow-edit.md",
@@ -940,6 +934,11 @@
940
934
  "size": 10803,
941
935
  "sha256": "54e7ae5267f3b4b6ade3bd0458a51704f3804140b60c5dcc910eab31d1bd1368"
942
936
  },
937
+ {
938
+ "path": "skills/weaver-e10-workflow/SKILL.md",
939
+ "size": 41574,
940
+ "sha256": "fe8860d92a5bf2f96f3a71e203bbd5993a82acb826a774cd98f371e8b80a2a1d"
941
+ },
943
942
  {
944
943
  "path": "src/shortcuts/workflow/continuation.ts",
945
944
  "size": 30700,
@@ -947,8 +946,8 @@
947
946
  },
948
947
  {
949
948
  "path": "src/shortcuts/workflow/endpoints.ts",
950
- "size": 9589,
951
- "sha256": "2ef1ea72023bb4b7941aaa258159151999983ebac3c91c1034e5ca40e1c18e89"
949
+ "size": 10182,
950
+ "sha256": "42363eb685546d065a23363f96ef0e8fbd9d9eece1733a6401cd70596900c614"
952
951
  },
953
952
  {
954
953
  "path": "src/shortcuts/workflow/errors.ts",
@@ -957,13 +956,13 @@
957
956
  },
958
957
  {
959
958
  "path": "src/shortcuts/workflow/host.ts",
960
- "size": 11980,
961
- "sha256": "c1f0ae44fb2267be1888b80faa35fb0ce9ab596b9aa7ca6e0e5429933745b920"
959
+ "size": 12448,
960
+ "sha256": "ae66c65b2c99a300a88ff5ff11fd3c1cd6b594138d2d7779f1939c71e648f0fc"
962
961
  },
963
962
  {
964
963
  "path": "src/shortcuts/workflow/index.ts",
965
- "size": 7835,
966
- "sha256": "5e966b8214f42dc2cd6add7f9f9cb7f0ed0def962aeac1a6ac552af0218a4a18"
964
+ "size": 6275,
965
+ "sha256": "a626636dba15624b7216aead4d5e016ceffa975eae3b999ec9a7091409bed579"
967
966
  },
968
967
  {
969
968
  "path": "src/shortcuts/workflow/manifest.ts",
@@ -975,6 +974,11 @@
975
974
  "size": 9461,
976
975
  "sha256": "50f028b494fc572637c90afeade84c0f0cc36de92a5fa355b4813125a3c6eff0"
977
976
  },
977
+ {
978
+ "path": "src/shortcuts/workflow/operations/chatscene.ts",
979
+ "size": 13774,
980
+ "sha256": "64abb0654df387c33b8a380e051a0084d9f8efa40652b6d2516cb394912dba7e"
981
+ },
978
982
  {
979
983
  "path": "src/shortcuts/workflow/operations/flow-status.ts",
980
984
  "size": 3774,
@@ -982,13 +986,13 @@
982
986
  },
983
987
  {
984
988
  "path": "src/shortcuts/workflow/operations/form.ts",
985
- "size": 305481,
986
- "sha256": "e7503bdb9d55c66c6b7ae1ea37f9396c2767ce0d9ed67b6a71c2caff7a1dcd86"
989
+ "size": 351032,
990
+ "sha256": "3b2036ab629078ac50e0ff37de27d3e42de95e9e9e2cb80f32a31783fbe00cfa"
987
991
  },
988
992
  {
989
993
  "path": "src/shortcuts/workflow/operations/read.ts",
990
- "size": 276277,
991
- "sha256": "2b51b9ae56942d34ba3098581c3d0b33ed3199464dae36d8045dabe9a09a520c"
994
+ "size": 282043,
995
+ "sha256": "8606f1c0cd165c3ffafbba8d1fecc4c4d22d155de44f194bacd34fa88fa8c2ee"
992
996
  },
993
997
  {
994
998
  "path": "src/shortcuts/workflow/operations/registry.ts",
@@ -1000,6 +1004,11 @@
1000
1004
  "size": 10848,
1001
1005
  "sha256": "54a9b2626514461cb9c48a1ffd464cd50cb3c85bfe681ce464cebdc93702ef0f"
1002
1006
  },
1007
+ {
1008
+ "path": "src/shortcuts/workflow/operations/sign-input.ts",
1009
+ "size": 5577,
1010
+ "sha256": "ecee488053fcf280679b977d4d10c758d74e2539bd5be77f3b02c7f3c9249f5e"
1011
+ },
1003
1012
  {
1004
1013
  "path": "src/shortcuts/workflow/operations/types.ts",
1005
1014
  "size": 4238,
@@ -1007,8 +1016,8 @@
1007
1016
  },
1008
1017
  {
1009
1018
  "path": "src/shortcuts/workflow/operations/write.ts",
1010
- "size": 141978,
1011
- "sha256": "f8ca00a7096aef887bd4ed84391988589b128b8cdde2cbb043d78f0460342414"
1019
+ "size": 142628,
1020
+ "sha256": "5de4cbc724a4882aabc0d2ee796e2d72141c2c48e622a3499a89a5fc2b0de114"
1012
1021
  },
1013
1022
  {
1014
1023
  "path": "src/shortcuts/workflow/state.ts",
@@ -1017,8 +1026,8 @@
1017
1026
  },
1018
1027
  {
1019
1028
  "path": "src/shortcuts/workflow/stdout-compact.ts",
1020
- "size": 2629,
1021
- "sha256": "328a1e284cad24612541d7458aad968cd4133dca9071fe18410be0457a58632c"
1029
+ "size": 2958,
1030
+ "sha256": "1d72ac72a69c63655530f0c458f34733ebeb5645a9f1937f3ecdc07815adb40e"
1022
1031
  }
1023
1032
  ]
1024
1033
  },
@@ -15,15 +15,17 @@
15
15
 
16
16
  | 步 | 命令 | 做什么 |
17
17
  | --- | --- | --- |
18
- | 1 | `workflow.createForm` | 用用户说法解析可发起的工作流并**加载表单字段**:拿回 `fields`(**每个能填的字段一行**,有默认值的字段带 `initialValue`)、`historyRequestData`(历史参考值)、`continuation`(下一步的 `context`) |
19
- | 2 | `workflow.createRequest` | 按「填值纪律」把值拼进 `data`,`context` 传第 1 步的 `continuation`,`action` 取 `draft` / `submit`,**发起流程** |
20
- | 3 | —(无命令) | **把第 2 步的返回结果输出给用户**:有 `finalMarkdown` 就**原样粘贴**(一字不改)。**小e 环境例外:命令 stdout 整体就是一段 `<browsertool>` 标签块(没有 JSON 信封)**——见到输出以 `<browsertool>` 开头,就把**整段原样输出**(从 `<browsertool>` 到 `</browsertool>`):**不要用代码块(三反引号)包裹、不要加任何前后说明、不要解析它、也不要去找 `status` / `contextId`**(这一档不打信封);没有 `finalMarkdown`(如 `NEEDS_CONFIRMATION`)才按「主表(已填内容)展示规则」+「明细表(子表单)展示规则」自己拼。**不要重跑任何命令、不要自己再去查一遍流程。** |
18
+ | 1 | `workflow.createForm` | 用用户说法解析可发起的工作流并**加载表单字段**:拿回 `fields`(**每个能填的字段一行**,有默认值的字段带 `initialValue`)、`historyRequestData`(历史参考值)、`systemFields`(标题/紧急程度/密级的默认值与选项)、`continuation`(下一步的 `context`)。**它只取数、不填参**——字段值由你按「填值纪律」自己拼 |
19
+ | 2 | `workflow.createRequest` | 按「填值纪律」把第 1 步取到的字段拼成 `data`(附件/发票字段先上传,再把返回对象放进 `data`),连同 `context` 一起传 |
20
+ | 3 | —(无命令) | **把第 2 步的返回结果输出给用户**:返回结果里有 `finalMarkdown` 就把**它的内容整段原样输出**——**不要解释、不要改写、也不要补内容**。小e 环境(`BROWSER_FILL`)的 `finalMarkdown` 是一段 `<browsertool>` 标签块,同样**整段原样输出**(从 `<browsertool>` 到 `</browsertool>`:**不要用代码块(三反引号)包裹、不要加任何前后说明、不要解析它**);没有 `finalMarkdown`(如 `NEEDS_CONFIRMATION`)才按「主表(已填内容)展示规则」+「明细表(子表单)展示规则」自己拼。**不要重跑任何命令、不要自己再去查一遍流程。** |
21
21
 
22
22
  澄清、必填缺失、幂等重放等分支见下「发起链路」。
23
23
 
24
24
  ## 发起链路(两条命令的完整分支)
25
25
 
26
- 1. `workflow.createForm`:按用户说法解析可发起的工作流并载入表单,拿回 `continuation`(表单会话短句柄,载荷由 CLI 托管在本机)与 `fields`(**每个能填的字段一行**:`id` + 中文名 `name` + 所属明细 `subFormId`(主表字段省略该键)+ `componentKey`;**有默认值的字段直接带 `initialValue`**);**同时返回 `historyRequestData`**——本表单**要落值的字段**(口径同 `fields`)在历史流程里的取值参考(`null` = 没有可参考的)。
26
+ 1. `workflow.createForm`:按用户说法解析可发起的工作流并载入表单,拿回 `continuation`(表单会话短句柄,载荷由 CLI 托管在本机)与 `fields`(**每个能填的字段一行**:`id` + 中文名 `name` + 所属明细 `subFormId`(主表字段省略该键)+ `componentKey`;**有默认值的字段直接带 `initialValue`**),同时带回 `historyRequestData`(历史参考值)与 `systemFields`(系统字段的默认值与选项)。**它只取数、不填参**:
27
+ - 字段值由你按「填值纪律」自己拼:用户说了的照用户说的填;带 `initialValue` 的可以干脆不传(CLI 自动并入);其余字段按「历史流程数据参考规则」判断能不能落值;
28
+ - 拼之前先看 **`historyRequestData`**(本表单要落值的字段在历史流程里的取值参考,`null` = 没有可参考的)与 `systemFields`(标题/紧急程度/密级的默认值与选项);
27
29
  - 返回 `NEEDS_CLARIFICATION` 时按 `candidates` 向用户确认(只问完整名称或其它可用于检索的关键词,**不要向用户索取 ID**),确认后由你按 `名称(ID)` 拼好、重发**同一条命令**。
28
30
  2. 按用户意图把字段值填进 `data`(键用字段 id):**照「填值纪律」的优先级逐个字段一遍定案**——用户说了的照用户说的填;用户没说到、而该字段带 `initialValue` 的就用默认值(也可以干脆不传,CLI 会自动并入);其余字段按「历史流程数据参考规则」判断能不能落值。
29
31
  3. `workflow.createRequest`:`context` 传第 1 步返回的 `continuation`,`action` 按用户意图取 `draft`/`submit`。
@@ -43,6 +45,20 @@
43
45
 
44
46
  **输出纪律(与上面的省时纪律同理:多写的每一句都在拖长回复,并让用户看不懂)**:① 面向用户**只给三样**——"这次做了什么、结果如何" + "**已填内容预览**"(展示口径见下文「主表(已填内容)展示规则」)+ "需要用户提供什么",其余不说——**尤其不要交代"用了哪个流程 / 编号是多少 / 我是怎么判断的"这类内部依据**;② **不要复述自己的判断过程、取舍与推演**,也不要写自我批评或事后反省——用户要的是结果,不是你怎么想的;③ **不要把澄清分支的区别讲给用户**(如"不是有多个候选要挑,而是一条都没命中"):该报"系统里没有「XX」"就按下文浏览按钮口径直接说结论,**不要解释你是怎么判定出来的**;④ 需要用户给值时**只说清"要什么值"**,不要顺带解释"我为什么判断不出来"。
45
47
 
48
+ ## 附件 / 发票字段怎么填
49
+
50
+ `fields` 里 `isEinvoice=true` 的是发票字段、带 `fileUploadParams` 的是附件字段。给它们落值时**不要写字符串**,按类型走对应技能,把返回的对象直接放进 `data` 的该字段:
51
+
52
+ | 字段类型 | 怎么做 | 填什么 |
53
+ | --- | --- | --- |
54
+ | 附件 | 用 `weaver-e10-caizhilian` 技能上传用户给的文件(`caizhilian.file-upload.prepare` → `.upload.prepare` → `.upload.apply`),拿到 `file_id` | `[{ "optionId": "<file_id>", "content": "<文件名>", "type": "file" }]`(多个文件就多项) |
55
+ | 发票 | 用 `weaver-e10-yepiaotong` 技能:用户发了票就上传(`invoice.upload`);用户说"从票夹取"就查票夹拿 `fid`,再取完整发票对象 | `[{ "optionId": "<fid>", "type": "einvoice", "optionObj": { <完整发票对象> } }]` |
56
+
57
+ 两条纪律:
58
+
59
+ 1. **上传前必须先告诉用户「文件会先经过公网大模型」,并等用户确认**——不能默默上传。
60
+ 2. 用户**没提到**的附件 / 发票字段**不要自己去补**(空着就行)。
61
+
46
62
  ## 填值纪律(一遍定案,不许回头)
47
63
 
48
64
  拼 `data` 只走一遍:**按字段逐个落值,每个字段只做一次取舍、取完不再回头看**;落到值就离开这个字段,不在同一字段上比较第二轮。
@@ -68,7 +84,7 @@
68
84
  字段走完 → 拼 data → createRequest。
69
85
  ```
70
86
 
71
- - **判决只有三种**:`填 "<值>"` / `不传` / `留空`——一行里只出现一个,不并列两个候选、不写"或者 / 可能 / 我倾向"。**唯一例外是附件 / 发票这两类**:它们的判决取决于"用户本轮有没有给文件",按下面「附件 / 发票字段」写在**同一行**里(条件 + 各自一个结果),不拆成两行、不留到下一轮。
87
+ - **判决只有三种**:`填 "<值>"` / `不传` / `留空`——一行里只出现一个,不并列两个候选、不写"或者 / 可能 / 我倾向"。**唯一例外是附件 / 发票这两类**:它们的判决取决于"用户本轮有没有给文件",按上面「附件 / 发票字段怎么填」写在**同一行**里(条件 + 各自一个结果),不拆成两行、不留到下一轮。
72
88
  - **一行只看这个字段自己**:依据取用户本轮原话 / 它自己的 `initialValue` / 它自己的历史取值;这个字段的事在这一行里判完就离开,不顺手推演别的字段。
73
89
  - **要按历史推演的,就在它这一行里推**:推出式子直接代成值写进判决,推完即走。
74
90
  - **一个字段只出现一次判决**,后面不再回头改;字段过完就拼 `data`(判决为"填"的进 `data`,`不传` / `留空` 都不写),**紧接着 `createRequest`**。
@@ -113,12 +129,12 @@
113
129
 
114
130
  | 返回 | 处置 |
115
131
  | --- | --- |
116
- | `BROWSER_FILL`(小e 环境) | **这一档没有 JSON 返回**——命令 stdout 直接就是那段 `<browsertool>` 标签块本身(看不到 `status` / `finalMarkdown` 这些键名)。**把命令输出整段作为本轮回复正文**:从 `<browsertool>` 到 `</browsertool>` 原样输出,**不要用代码块(三反引号)包裹、不要加任何前后说明**。它交给宿主浏览器页面去打开新建页并带上字段值;本档**不写服务端、不判必填缺失**。 |
132
+ | `BROWSER_FILL`(小e 环境) | **本档不写服务端、不判必填缺失**(没有 `requestId`)。`finalMarkdown` 就是那段 `<browsertool>` 标签块——**把 `finalMarkdown` 的内容整段原样作为本轮回复正文**:从 `<browsertool>` 到 `</browsertool>`,**不要解释、不要改写、不要补内容、不要用代码块(三反引号)包裹**。它交给宿主浏览器页面去打开新建页并带上字段值。 |
117
133
  | `NEEDS_INPUT`(必填缺失) | **不做任何值推断**——不看历史值、不用记忆里的常用值、不逐字段推演、不解释"为什么判断不出来"。**原样粘贴返回的 `finalMarkdown`**(命令已渲染好:结论一句 + `**已填内容**` 两列表 + `**明细表**` Excel 列 + `**还需要你提供**` 待补清单)——**一字不改、不弹窗、不自己列待补清单**。清单里带 `历史推荐值:` 的行是**命令按历史值一致性算好的**(全部一致或最近三条一致才会出现)——**不要自己再算一遍、也不要回头去翻历史**;用户认可就直接采用,其余项等用户给值后带同一 `context` 重发。 |
118
134
  | `CREATED` / `CREATED_SUBMITTED`(成功) | **原样粘贴返回的 `finalMarkdown`**(命令已渲染好:结论一句 + 流程编号/链接 + `**已填内容**` 两列表 + `**明细表**` Excel 列)——**一字不改、不重排、不自己再拼一遍表格**;链接**只出现在回复文本里**,不要打开。 |
119
135
  | `CREATED_SUBMIT_FAILED`(失败) | 同样**原样粘贴 `finalMarkdown`**(流程信息照常完整给出,末尾带 `**提交失败原因**:…`);不要读成"什么都没做成",不要重发同一次提交。 |
120
136
 
121
- **`finalMarkdown` = 命令渲染好的最终回复文本**(与查询侧的 `finalMarkdown` 同口径):在**「流程已落地」三态**与 **`NEEDS_INPUT`(必填缺失)**返回,**本轮回复正文 = 它的值本身(从第一个字符到最后一个字符,不增不减)**;`BROWSER_FILL`(小e 环境)是**同一份渲染档、换了投递方式**——它不经 JSON 信封,命令 stdout 整体就是那段 `<browsertool>` 标签块,**原样输出、不要包在代码块里**(见处置表,那里看不到 `finalMarkdown` 这个键名);其余状态字段、表格、待补清单、缺项的类型提示都已渲染在里面,不需要你再组织任何内容。**`**已填内容**` 两列表列的是「用户在表单上看到的、有值的、可编辑的主表字段」**(流程标题在前,业务字段按**表单布局顺序**随后,**含表单默认值**;只读/禁用、联动隐藏、没值的字段不列)——所以**里面会出现你没传过的字段(默认值)**,那是命令按表单实际已填状态渲染的,**照贴、不要删、不要改写、也不要把某个字段挪进待补清单**。它已包含全部要交代的内容——**回复里不出现它之外的任何内容**。`NEEDS_INPUT` 那份的读法:末段「**还需要你提供**」就是要问用户的全部内容(每项已标出在主表还是明细第几行),照它问即可——**不要回去翻历史值、也不要自己再列一遍**;其中带 `历史推荐值:` 的行是命令算好的,照抄即可(不必自己核对、更不要自己另算一条)。`finalMarkdown` 随 CLI **0.1.24** 起返回(`NEEDS_INPUT` 那份从 **0.1.25** 起、其 `历史推荐值` 行从 **0.1.26** 起);老版本命令没有这个字段时,才按下文「主表(已填内容)展示规则」+「明细表(子表单)展示规则」自己拼。
137
+ **`finalMarkdown` = 命令渲染好的最终回复文本**(与查询侧的 `finalMarkdown` 同口径):在**「流程已落地」三态**、**`NEEDS_INPUT`(必填缺失)**与 **`BROWSER_FILL`(小e 环境)**返回,**本轮回复正文 = 它的值本身(从第一个字符到最后一个字符,不增不减)**;`BROWSER_FILL`(小e 环境)也是同一份渲染档:`finalMarkdown` 里就是那段 `<browsertool>` 标签块,同样**整段原样输出**(不要解释、改写或补内容,不要包在代码块里);其余状态字段、表格、待补清单、缺项的类型提示都已渲染在里面,不需要你再组织任何内容。**`**已填内容**` 两列表列的是「用户在表单上看到的、有值的、可编辑的主表字段」**(流程标题在前,业务字段按**表单布局顺序**随后,**含表单默认值**;只读/禁用、联动隐藏、没值的字段不列)——所以**里面会出现你没传过的字段(默认值)**,那是命令按表单实际已填状态渲染的,**照贴、不要删、不要改写、也不要把某个字段挪进待补清单**。它已包含全部要交代的内容——**回复里不出现它之外的任何内容**。`NEEDS_INPUT` 那份的读法:末段「**还需要你提供**」就是要问用户的全部内容(每项已标出在主表还是明细第几行),照它问即可——**不要回去翻历史值、也不要自己再列一遍**;其中带 `历史推荐值:` 的行是命令算好的,照抄即可(不必自己核对、更不要自己另算一条)。**返回里没有 `finalMarkdown` 时**,才按下文「主表(已填内容)展示规则」+「明细表(子表单)展示规则」自己拼。
122
138
 
123
139
  `NEEDS_CONFIRMATION` / `partial` / `write_uncertain` / `ALREADY_APPLIED` 等其余状态**不给** `finalMarkdown`,按「返回」与「发起链路」里的对应条目处置(`ALREADY_APPLIED` 是"上一次已成功"的幂等回报——按返回值里的 `requestId` / `previousResult` 汇报)。
124
140
 
@@ -129,12 +145,11 @@
129
145
  | 参数 | 类型 | 必填 | 说明 |
130
146
  | --- | --- | --- | --- |
131
147
  | `workflow` | `string[]` | 是 | 工作流条件——`"名称(ID)"` / 纯名称 / 纯数字 ID;**可一次给多个说法**:数组多元素,或一个元素内用英文逗号分隔(两者完全等价) |
132
- | `relatesTo` | `string` | 否 | 关联对象 id,**仅透传**,不影响表单初始化 |
133
148
 
134
149
  - **自带显式 ID(`"名称(ID)"` 或纯数字)时不查可发起列表**:流程名与"你能不能发起"都由表单载入接口直接给出,因此比"按名称解析"少一整次往返。该 ID 不可用时仍回澄清,但会带 `clarificationReason` 说明是**哪一种**(见下)。
135
150
  - **纯名称**按当前用户**可发起**的工作流做模糊匹配,**可一次给多个说法**:数组多个元素(`["<说法1>","<说法2>"]`)与一个元素内用英文逗号分隔(`["<说法1>,<说法2>"]`)**完全等价**,CLI 会把各说法拆成关键词、命中取并集去重。
136
151
  - **直接选定并载入表单**时,`selectionSource` 标明是如何选定的:`workflowId`(按 ID 命中)/ `single`(唯一命中)/ `exactName`(全名精确匹配)。`exactName` 表示 CLI 已替用户选定,**不要再反问“您指的是哪一个”**。
137
- - **0 命中**,或**多命中且没有与所写完全一致的** → **澄清**:返回 `status: "NEEDS_CLARIFICATION"` + `candidates`(每项含 `id`/`name`/`display`,`display` 是 `名称(ID)`),此时**不返回任何表单数据**。把候选**原样**列给用户(不加 "(Recommended)"/"推荐" 等后缀,由用户明确选择),选定后用 `display` 的 `名称(ID)` 重发同一条命令。
152
+ - **需要澄清时** → 返回 `status: "NEEDS_CLARIFICATION"` + `candidates`(每项含 `id`/`name`/`display`,`display` 是 `名称(ID)`),此时**不返回任何表单数据**。把候选**原样**列给用户(不加 "(Recommended)"/"推荐" 等后缀,由用户明确选择),选定后用 `display` 的 `名称(ID)` 重发同一条命令。
138
153
  - **自带显式 ID 但该 ID 不可用** → 同样回澄清(`candidates` 为空),并带 `clarificationReason` 标明是**哪一种**——这两句话**必须分开说、不许混**:
139
154
  - `clarificationReason = "workflow_not_exist"`:该目标不存在(可能已删除或被停用)。如实告知"这个目标不存在",请用户改用该流程的**完整名称**(或其它可用于检索的关键词)重发——**不要向用户索取 ID**;**不要**说成"没有可发起的工作流"这类模糊说法。
140
155
  - `clarificationReason = "no_create_right"`:流程**存在**,但当前账号**没有发起权限**。**必须明确说出「存在但没有发起权限」**,绝不能转述成"流程不存在";并给出下一步:改用其他可发起的流程,或联系管理员为该流程授予发起权限。
@@ -157,8 +172,8 @@
157
172
  | `data` | `object` | 是 | 表单字段值,结构 `{"main":{...},"details":{"<subFormId>":[{...}]}}`;键**必须是字段 id** |
158
173
  | `action` | `"draft"` \| `"submit"` | 是 | `submit`=提交审批(必填缺失阻断,返回 `NEEDS_INPUT`,**不创建流程**);`draft`=仅保存草稿(必填缺失不阻断、状态仍是 `CREATED`,但 `missingFields` 仍随结果返回) |
159
174
  | `requestName` | `string` | 否 | 流程标题。**通常不用传**——`createForm` 已给出标题、CLI 会自动并入;只有用户本次明确改写了标题时才传 |
160
- | `requestLevel` | `string` | 否 | 紧急程度,取 `systemFields.levelOptions` 的 code |
161
- | `secLevel` | `string` | 否 | 密级,取 `systemFields.secLevelOptions` 的 id |
175
+ | `requestLevel` | `string` | 否 | 紧急程度:用户原话即可(如「紧急」「普通」),CLI 按 `systemFields.levelOptions` 的选项名归一成 code;说不出就不传,走表单默认值 |
176
+ | `secLevel` | `string` | 否 | 密级:用户原话即可(如「机密」「公开」),CLI 按 `systemFields.secLevelOptions` 的选项名归一成 id;说不出就不传,走表单默认值 |
162
177
  | `remark` | `string` | 否 | 签字意见 |
163
178
  | `verificationConfirmed` | `boolean` | 否 | 节点字段校验需用户确认时显式确认继续提交 |
164
179
 
@@ -181,10 +196,10 @@
181
196
  | `systemFields` | `{permissions, defaults, levelOptions, secLevelOptions}`——系统字段的权限与默认值,见下 |
182
197
  | `systemFieldWarning` | 系统字段权限读取失败时的提示文本(正常为 `null`) |
183
198
  | `requiredInfoWarning` | OA 未下发静态字段权限时的告警文本(正常为 `null`),见「注意」 |
184
- | `launchPreferences` | 该工作流的发起偏好(`available` + `promptText`),见下 |
199
+ | `workflowMemory` | 这条工作流维度的记忆(一段 Markdown 文本);**读不到时没有这个键**,见下 |
185
200
  | `fileUploadParams` | 附件字段的上传限制,挂在对应字段的 `fields[].fileUploadParams` 上 |
186
201
 
187
- **stdout 紧凑形态**:`fields` / `historyRequestData` / `systemFields` 这三个键在 stdout 上是**压成单行的**——只去掉缩进空白,**内容、结构、键序一字不改**(`parse` 出来与多行版完全一致,可以直接读)。所以 `fields` 那一行字段多时可能上万字符:**这是正常的,不是被截断、也不是数据缺失**,照常按 JSON 解析即可。**不要**因为"这一行太长 / 看着不像完整 JSON"就去读 `resultFile` 或重跑命令;`contextId` / `workflow` 等其余键仍是正常的多行缩进。
202
+ **stdout 紧凑形态**:`fields` / `historyRequestData` / `systemFields` 这几个键在 stdout 上是**压成单行的**——只去掉缩进空白,**内容、结构、键序一字不改**(`parse` 出来与多行版完全一致,可以直接读)。所以 `fields` 那一行字段多时可能上万字符:**这是正常的,不是被截断、也不是数据缺失**,照常按 JSON 解析即可。**不要**因为"这一行太长 / 看着不像完整 JSON"就去读 `resultFile` 或重跑命令;`contextId` / `workflow` 等其余键仍是正常的多行缩进。
188
203
 
189
204
  **`fields[]` 每个字段的键**(**能出现在这里就是能填的字段**):
190
205
 
@@ -203,25 +218,23 @@
203
218
  | `folderDependsOnOption` | 附件目录联动(配合最近一次的 `attachmentFolderIds` 用) |
204
219
  | `format` | 日期 / 时间字段自带的形式标记——**不用你管**,CLI 会按它自动归一化 |
205
220
 
206
- **`fields` 为什么不区分必填**(2026-10-14 口径):它就是「可编辑 ∪ 必填且可见」的全集,**「哪些字段可以落值」= 本清单,「哪个必填还没值」= `createRequest` 的 `missingFields`**,只有这两句口径。用户看不到、改不了的字段(只读 / 禁止编辑 / 联动隐藏 / 落在布局隐藏行上 / 落在明细表隐藏列上 / 落在多内容单元格的隐藏格上 / 不在当前布局的展示配置里)**不下发**——所以**条数不多是正常的**,不要拿它当"页面上肉眼可见的字段数",也不要因为"表单上看着没这么多"就怀疑字段清单不对。
221
+ **`fields` 为什么不区分必填**:它就是「可编辑 ∪ 必填且可见」的全集,**「哪些字段可以落值」= 本清单,「哪个必填还没值」= `createRequest` 的 `missingFields`**,只有这两句口径。用户看不到、改不了的字段(只读 / 禁止编辑 / 联动隐藏 / 落在布局隐藏行上 / 落在明细表隐藏列上 / 落在多内容单元格的隐藏格上 / 不在当前布局的展示配置里)**不下发**——所以**条数不多是正常的**,不要拿它当"页面上肉眼可见的字段数",也不要因为"表单上看着没这么多"就怀疑字段清单不对。
207
222
 
208
223
  **`historyRequestData`(历史参考值)**:范围是**本工作流**、**近一年、非草稿、按发起时间倒序的前 5 条**「我发起的」流程——不是"所有流程混在一起",所以里面每条都是同一张表单的单据,字段可直接对照;形如 `[{requestName, requestId, createdatetime, fieldValues: {<字段id>: <值>}}]`——`fieldValues` 是**「字段id → 值」的映射**(字段名不随每条记录重复下发:同一个名字要在每条记录里打印一遍,要名字请用 `fields`);值已按字段类型给出**可直接复用**的写法——浏览按钮 / 选项类为 `名称(id)`(多值以 `、` 分隔);**附件类为对象**(形如 `{"formField":{"id":"<字段id>"},"dataOptions":[{"optionId":"<附件ID>","content":"<文件名>","type":"<文件类型>"}]}`,可整块放进 `data`,见「历史流程数据参考规则」第三条);其余为普通字符串。**`null` 表示没有可参考的历史数据**(不返回空数组);某条历史流程在这批字段上一个值都没命中时会被整条剔除(所以条数可能少于 5)。**你不需要自己再去查历史流程。** 它给的是**本表单要落值的字段**(口径同 `fields`)的取值——填 `data` 时用它把能补的字段补上,判断口径见「历史流程数据参考规则」。
209
- - **`createRequest` 一侧不再返回它**(V12.1.102 起撤出):`NEEDS_INPUT` / `NEEDS_CONFIRMATION` 时**手上没有任何历史值**,必填缺失直接**一次问齐用户**(`NEEDS_INPUT` 用命令给的 `finalMarkdown`,见「createRequest 返回后的处置」)——**不要**回头翻 `createForm` 阶段那份历史值、也不要凭印象补值。(命令**内部**仍会用这份缓存给缺失字段算 `历史推荐值`,但原始历史始终不回给模型——一致性判断不外包给你。)
224
+ - **`createRequest` 一侧没有它**:`NEEDS_INPUT` / `NEEDS_CONFIRMATION` 时**手上没有任何历史值**,必填缺失直接**一次问齐用户**(`NEEDS_INPUT` 用命令给的 `finalMarkdown`,见「createRequest 返回后的处置」)——**不要**回头翻 `createForm` 阶段那份历史值、也不要凭印象补值。
210
225
 
211
- **`systemFields`**:`permissions` 给各系统字段的 isview/isedit/ismandatory,`defaults` 是默认值,`levelOptions`/`secLevelOptions` 是紧急程度/密级选项。**只有 `isview=true` 且 `isedit=true` 的系统字段才需要填**;紧急程度/密级**只从这两个 options 取**(不得使用记忆、表单字段或其他来源);**`defaults` 已有非空值即视为已满足,不要询问用户、直接采用**;仅当 ismandatory=true 且默认值为空时才需要用户提供。
226
+ **`systemFields`**:`permissions` 给各系统字段的 isview/isedit/ismandatory,`defaults` 是默认值,`levelOptions`/`secLevelOptions` 是紧急程度/密级选项。**只有 `isview=true` 且 `isedit=true` 的系统字段才需要填**;紧急程度/密级**用户说了原话就直接传原话**(CLI 会按选项名归一成编码),CLI 归不出来时会原样透传;**不得用记忆里的常用值、其它字段内容或自行编造的编码代替用户原话**;**`defaults` 已有非空值即视为已满足,不要询问用户、直接采用**;仅当 ismandatory=true 且默认值为空时才需要用户提供。
212
227
 
213
- **`launchPreferences`**:该工作流的发起偏好(`available` + `promptText`)。`promptText` **只是「该工作流维度」那一段记忆**——全局画像 / 全局别名(`user.md` / `memory.md`)已由入口的 `workflow.memoryPrompt`(无参)给过,这里不再重复下发,所以**不要再调一次无参 `memoryPrompt` 来"补全"、也不要把两份拼接**(会重复)。`available: true` 时,**只能用它补用户没提到的非必填字段或口径类信息**(如签字意见口径、展示偏好);**必填字段一律不得用它里面的"常用值"补**——必填缺失只由 `missingFields` 告知、直接一次问齐用户(见「createRequest 返回后的处置」),不要为"能不能用记忆里的值"反复权衡;与用户本次明说的冲突时以用户本次为准。`available: false`(或带 `note`)说明该工作流还没有偏好或读取失败——**按新用户处理,不要重试读取**。
228
+ **`workflowMemory`**:这条工作流维度的记忆,一段 Markdown 文本。它**只含该工作流那一段**——全局画像 / 全局别名(`user.md` / `memory.md`)已由入口的 `workflow.memoryPrompt`(无参)给过,这里不再重复下发,所以**不要再调一次无参 `memoryPrompt` 来"补全"、也不要把两份拼接**(会重复)。**返回里没有这个键** ⇒ 该工作流还没有记忆(或没读到)——**按新用户处理,不要重试读取**。有这个键时,**只能用它补用户没提到的非必填字段或口径类信息**(如签字意见口径、展示偏好);**必填字段一律不得用它里面的"常用值"补**——必填缺失只由 `missingFields` 告知、直接一次问齐用户(见「createRequest 返回后的处置」),不要为"能不能用记忆里的值"反复权衡;与用户本次明说的冲突时以用户本次为准。
214
229
 
215
- **大表单超线形态**(`createForm` 输出**超过 20,000 字符**时才有):此时 stdout **只回一句话**——「当前表单内容较大,已临时写入文件 `resultFile路径`,请直接读取 `resultFile路径` 获取完整结果」。**`fields`、`contextId`、`historyRequestData` 一个都不在 stdout 里**,它们全都在那个文件里(**未裁剪的完整 pretty JSON**,与 stdout 同口径):`fields` / `historyRequestData` / `systemFields` / `contextId` / `continuation` 一样不少。所以:**先按 `resultFile` 把该文件一次读完**(整份读,不要只给个小的 `limit` 再分段;宿主若报单次读取超限,按报错提示调整),拿到字段清单与 `contextId` 之后再拼 `data`、走 `createRequest`。**不要重跑 `createForm`、不要分段读、不要用 `head`/`tail` 截断、也不要用脚本去挖文件。**
216
- - 结果里 `persistedResult: true` 表示走了落盘档;`outputChars` 是**本次输出那份最终文本的字符数**(判线量的就是它——口径 = 已压掉 `fields` / `historyRequestData` / `systemFields` 缩进空白后的整段 stdout,与小e 侧宿主那条 20,000 字符限制同源)。
230
+ **大表单超线形态**(`createForm` 输出**超过 20,000 字符**时才有):此时 stdout **只回一句话**——「当前表单内容较大,已临时写入文件 `resultFile路径`,请直接读取 `resultFile路径` 获取完整结果」。**`fields`、`historyRequestData`、`systemFields`、`contextId` 一个都不在 stdout 里**,它们全都在那个文件里(未裁剪的完整 pretty JSON,与 stdout 同口径):`fields` / `historyRequestData` / `systemFields` / `contextId` / `continuation` 一样不少。所以:**先按 `resultFile` 把该文件一次读完**(整份读,不要只给个小的 `limit` 再分段;宿主若报单次读取超限,按报错提示调整),拿到字段清单与 `contextId` 之后再拼 `data`、走 `createRequest`。**不要重跑 `createForm`、不要分段读、不要用 `head`/`tail` 截断、也不要用脚本去挖文件。**
231
+ - 结果里 `persistedResult: true` 表示走了落盘档;`outputChars` 是本次输出那份最终文本的字符数。
217
232
  - **输出被宿主截断时**(只看到一小段预览、出现「已截断…字符」字样):**不要去读宿主的工具结果目录**(`~/.workbuddy/projects/**/tool-results/**`:没有读权限,去了必白跑一轮),按同一份输出里的 `resultFile` 取完整结果。
218
233
 
219
234
  `status` 为 `NEEDS_CLARIFICATION` 时只给 `candidates` / `clarificationKeyword` / `clarificationReason`(存在时,见「输入」里的 `workflow_not_exist` / `no_create_right`)/ `candidateCount` / `clarificationQuestion` / `note`,**不含任何表单数据**——它不是失败(`ok:true`),也不代表查询已执行。
220
235
 
221
236
  ### workflow.createRequest
222
237
 
223
- **小e 环境(`BROWSER_FILL`)档不走 JSON 信封**:stdout 整体就是一段 `<browsertool>` 标签块(见「createRequest 返回后的处置」),所以下表这些键**这一档在 stdout 上都看不到**——见到 `<browsertool>` 开头就照处置表处理,不要去找 `status` / `contextId`。
224
-
225
238
  | 键 | 说明 |
226
239
  | --- | --- |
227
240
  | `status` | `CREATED` / `CREATED_SUBMITTED` / `CREATED_SUBMIT_FAILED` / `NEEDS_INPUT` / `NEEDS_CONFIRMATION` / `ALREADY_APPLIED` / `BROWSER_FILL` |
@@ -237,8 +250,8 @@
237
250
  | `submitResult` / `submitFailReason` | 提交结果(`success`/`failed`);**只在本命令真正发起过提交(`action:submit`)时出现**,`action:draft` 不带 |
238
251
  | `finalMarkdown` | 命令渲染好的最终回复文本,见「createRequest 返回后的处置」 |
239
252
 
240
- - **`finalMarkdown`(命令渲染好的最终回复文本,与查询侧同名同口径)**:在**流程已落地的三个状态**(`CREATED` / `CREATED_SUBMITTED` / `CREATED_SUBMIT_FAILED`)与 **`NEEDS_INPUT`(必填缺失)**出现——**有它就原样粘贴、一字不改**(见「createRequest 返回后的处置」),不要再自己挑字段、拼主表/明细表格,也不要自己拼待补清单。`BROWSER_FILL`(小e 环境)用的是**同一份渲染档**,但**不经信封、没有这个键名**:那段文本直接就是命令的 stdout。`NEEDS_INPUT` 那份的末段「**还需要你提供**」就是待补必填项清单,其中**历史取值一致**的字段会带一行 `历史推荐值:…(依据)`——**由命令算好,模型不参与判断**;该分支**不再返回** `resolvedValues`(渲染素材已在命令内部用过)。
241
- - **`BROWSER_FILL`(小e 环境)**:本次**一个写请求都没发**(也没做必填判定)。这一段 `<browsertool>`(`arguments` 里带工作流名称 `title`、新建页地址 `src` 与 `sdkOptions`——PC / 移动两套路由与参数,`params.customParams` 里是这次要填的**字段 id → 值**,另有 `fieldAssignKeys` 列出全部字段 id)**就是命令 stdout 的全部内容**(不套信封,所以 `status` / `contextId` 这一档在输出里看不到)。**处置:把命令输出整段作为本轮回复正文**(不要包在代码块里),宿主会拿这段标签去打开新建页并把字段值带进去;`contextId` 未被消费,需要时由用户再发起一次即可。
253
+ - **`finalMarkdown`(命令渲染好的最终回复文本,与查询侧同名同口径)**:在**流程已落地的三个状态**(`CREATED` / `CREATED_SUBMITTED` / `CREATED_SUBMIT_FAILED`)、**`NEEDS_INPUT`(必填缺失)**与 **`BROWSER_FILL`(小e 环境)**出现——**有它就原样粘贴、一字不改**(见「createRequest 返回后的处置」),不要再自己挑字段、拼主表/明细表格,也不要自己拼待补清单。`BROWSER_FILL`(小e 环境)用的是**同一份渲染档**,`finalMarkdown` 里就是那段 `<browsertool>` 标签块——同样**整段原样输出**(不要解释、改写或补内容)。`NEEDS_INPUT` 那份的末段「**还需要你提供**」就是待补必填项清单,其中**历史取值一致**的字段会带一行 `历史推荐值:…(依据)`——**由命令算好,模型不参与判断**;该分支**不返回** `resolvedValues`。
254
+ - **`BROWSER_FILL`(小e 环境)**:本次**一个写请求都没发**(也没做必填判定)。`finalMarkdown` 就是这一段 `<browsertool>`(`arguments` 里带工作流名称 `title`、新建页地址 `src` 与 `sdkOptions`——PC / 移动两套路由与参数,`params.customParams` 里是这次要填的**字段 id → 值**,另有 `fieldAssignKeys` 列出全部字段 id)。**处置:把 `finalMarkdown` 的内容整段原样作为本轮回复正文**(从 `<browsertool>` 到 `</browsertool>`,不要解释、改写、补内容,不要包在代码块里),宿主会拿这段标签去打开新建页并把字段值带进去;`contextId` 未被消费,需要时由用户再发起一次即可。
242
255
  - `NEEDS_CONFIRMATION`(`ambiguities` 非空)时同时给 `resolvedValues`("我传的值 → 服务端最终值"的回显)与 `missingFields`——先把 `ambiguities` 解决掉,再用同一 `context` 重发。
243
256
  - `needVerificationConfirm: true` 时流程**已创建但未提交**:向用户确认后,用本次返回的 `requestId` 走提交(`workflow operateApply action=submit`);**不要用同一个 `context` 重发**——该句柄已消费,重发只会拿到 `ALREADY_APPLIED`。
244
257
  - **`CREATED_SUBMIT_FAILED`(提交结果=失败)**:流程**已创建为草稿**,但提交被服务端拒绝、**未进入审批**——表单数据已经落库,`requestId` / `requestName` / `url` 与成功时一样都给了(可直接打开查看或编辑),差别只在提交结果。此时 `submitResult: "failed"`、`submitFailReason` 是接口给出的失败原因。**处置:把失败原因原样转述给用户,并给出 `url`**;**不要**读成"什么都没做成",也**不要**原样重发同一次提交(会再堆一份草稿)。
@@ -260,9 +273,9 @@
260
273
  - 不传凭据:业务输入禁止出现 Cookie/ETEAMSID/Token/`header.operator`(CLI 托管)。
261
274
  - **`data` 的键只能取 `fields` 里的字段 id**(那就是可写字段的全集)。**唯一例外:`missingFields` 点名的字段**——`missingFields` 是**按你本次实际填的值、结合显示属性(联动)规则实时算出来的"最新缺失必填项"**,而 `fields` 是 `createForm` 那一刻的**静态快照**:那时联动还没跑,联动命中后才变成必填的字段当时可能既不在 `fields` 里(若原被联动隐藏)、也不在你的视野里。所以补值**一律以 `missingFields` 为准**,不要因为"它不在 `fields` 里"就把用户给的这条值丢掉。`readOnly` / `disableEdit` / 不可见字段**一个都不要传**——传了整单会被拒(`notEditable`),得把只读字段全部摘掉重跑一轮。**看到 `notEditable` 不要重试、不要换字段 id 绕过**,移除这些字段后重跑。
262
275
  - 大表单超线时(stdout 只有一句话、没有 `fields`),**先按 `resultFile` 把那个文件一次读完**再拼 `data`(见「返回」的大表单超线形态);未超线时 `fields` 就在 stdout 里,不必读文件。
263
- - 附件/文件:附件字段需上传本地文件时,口径见「填值纪律」的「附件 / 发票字段」——先提醒用户"上传的附件会先经过公网大模型,请谨慎操作",用户确认后用 **`weaver-e10-caizhilian` 技能**(`caizhilian.file-upload.*`)上传取 `file_id`。**不要另走独立的文件上传技能**(那套双登录模式不属于本 CLI 上传接口)。
276
+ - 附件/文件:附件字段需上传本地文件时,口径见「附件 / 发票字段怎么填」——先提醒用户"上传的附件会先经过公网大模型,请谨慎操作",用户确认后用 **`weaver-e10-caizhilian` 技能**(`caizhilian.file-upload.*`)上传取 `file_id`。**不要另走独立的文件上传技能**(那套双登录模式不属于本 CLI 上传接口)。
264
277
  - 附件上传限制:上传前核对该字段的上传限制,不满足先告知用户、不执行上传。看该字段的 `fileUploadParams` 三项——`sizeLimit`(MB)、`formatLimit`(`mode` + `formats`;`formats` 为 `*.*` / `*` 表示不限制后缀)、`maxNum`(数量上限),在 `fields` 里该字段那一条上。
265
- - 发票字段(componentKey `EinvoiceComponent`):口径见「填值纪律」的「附件 / 发票字段」,支持两种赋值方式:① 从票夹选取:使用 `weaver-e10-yepiaotong` 技能查询票夹里已有的发票对象(拿 `fid` 后 `invoice.browse-field.data` 取对象);② 使用 `weaver-e10-yepiaotong` 技能上传本地发票文件(`invoice.upload`)并取上传后的发票对象。方式 ② 在真正上传前必须先提醒用户"上传的发票文件会先经过公网大模型,请谨慎操作",用户明确确认后才执行;方式 ① 无需这句提醒。用户未明确发票字段如何赋值时,先反问用户,不需要提前检测 `weaver-e10-yepiaotong` 技能是否可用,真正需要使用上述两种方式给发票赋值时,workbuddy环境下可直接到技能市场搜索【泛微E10业票通发票管理】并自动安装,搜索不到时反馈给用户,其余环境遇到技能缺失时直接反馈给用户。
278
+ - 发票字段(componentKey `EinvoiceComponent`):口径见「附件 / 发票字段怎么填」,支持两种赋值方式:① 从票夹选取:使用 `weaver-e10-yepiaotong` 技能查询票夹里已有的发票对象(拿 `fid` 后 `invoice.browse-field.data` 取对象);② 使用 `weaver-e10-yepiaotong` 技能上传本地发票文件(`invoice.upload`)并取上传后的发票对象。方式 ② 在真正上传前必须先提醒用户"上传的发票文件会先经过公网大模型,请谨慎操作",用户明确确认后才执行;方式 ① 无需这句提醒。用户未明确发票字段如何赋值时,先反问用户,不需要提前检测 `weaver-e10-yepiaotong` 技能是否可用,真正需要使用上述两种方式给发票赋值时,workbuddy环境下可直接到技能市场搜索【泛微E10业票通发票管理】并自动安装,搜索不到时反馈给用户,其余环境遇到技能缺失时直接反馈给用户。
266
279
  - 发票类字段的历史值不可照抄。
267
280
  - 发票值拿不到时直接问用户。
268
281
  - **日期 / 时间字段按用户说的填即可,不要管格式**:CLI 会按字段自带格式自动归一化(`2026-8-21` / `2026年8月21日 9:5` 都会规整成字段要求的写法;日期+时间控件只给到日期时补 `00:00`)。**不要为格式反复权衡,也不要手工补时间**。
@@ -302,7 +315,7 @@
302
315
 
303
316
  ## 示例
304
317
 
305
- ### ① 解析工作流并载入表单(拿到 fields / historyRequestData / continuation)
318
+ ### ① 解析工作流并载入表单(拿到 fields / historyRequestData / systemFields / continuation)
306
319
 
307
320
  Windows PowerShell:
308
321
 
@@ -316,6 +329,8 @@ macOS/Linux(bash/zsh):
316
329
  weaver-work-cli --json workflow run workflow.createForm --input-json '{"workflow":["<工作流名称>"]}'
317
330
  ```
318
331
 
332
+ 返回里是字段清单 + 历史参考值 + 系统字段;字段值按「填值纪律」自己拼成 `data` 再交给 `createRequest`。
333
+
319
334
  ### ② 填好字段后一次完成发起(action 必填)
320
335
 
321
336
  Windows PowerShell:
@@ -2,10 +2,10 @@
2
2
  name: weaver-e10-yepiaotong
3
3
  display_name: 泛微业票通发票
4
4
  display_name_en: Weaver Invoice
5
- description: "泛微 E10 业票通发票管理:查询票夹、OCR/查验、附件、流程发票字段、报销填单、智能开票确认链。"
6
- description_zh: "泛微 E10 业票通发票管理。支持查询个人/企业票夹、查看详情、上传、OCR/查验预览、下载附件、流程表单发票字段数据,通过 prepare/apply 确认链处理导入、新增、编辑、删除、报销单创建/更新、智能开票/存台账。"
7
- description_en: "Weaver E10 Yepiaotong invoice skill for folder queries, detail lookup, OCR and validation previews, attachment downloads, workflow invoice field data, reimbursement form submission, and confirmed invoice issuing."
8
- version: 1.0.3
5
+ description: "泛微 E10 业票通发票管理:查询票夹、OCR/查验、附件、流程发票字段、报销填单、按契约锁台账发起开票流程。"
6
+ description_zh: "泛微 E10 业票通发票管理。支持查询个人/企业票夹、查看详情、上传、OCR/查验预览、下载附件、流程表单发票字段数据,通过 prepare/apply 确认链处理导入、新增、编辑、删除;报销填单由本技能准备发票与预填数据,报销单创建/修改调用 weaver-e10-workflow 的发起/修改能力;AI 开票从契约锁合同台账取数,按合同号调用 weaver-e10-workflow 发起开票流程草稿,不支持绕过流程直接开票。"
7
+ description_en: "Weaver E10 Yepiaotong invoice skill for folder queries, detail lookup, OCR and validation previews, attachment downloads, workflow invoice field data, reimbursement data preparation (forms are created and edited via weaver-e10-workflow), and AI invoicing that drafts an invoice-application workflow from the Qiyuesuo contract ledger (direct issuing is not supported)."
8
+ version: 1.0.6
9
9
  author: 泛微网络科技股份有限公司
10
10
  agent_created: true
11
11
  requires:
@@ -17,7 +17,7 @@ cliHelp: "weaver-work-cli invoice --help"
17
17
  **`--is-connector` 判据**:用户明确使用连接器、或上下文要求用连接器完成任务 → 传 `true`;本次任务或上下文直接选择单独技能 → 不传;用户没有明确说明时,按**正在运行的这份 Skill 是哪一级**定——**用户级(条目标 `(user)`)不传,连接器级(标 `(connector)`)传**(同名 Skill 只会运行用户级那一份)。传 `true` 时不要再写 `--profile` / `--base-url`。完整规则见 `[../weaver-e10-shared/SKILL.md](../weaver-e10-shared/SKILL.md)`。
18
18
 
19
19
  认证和登录态只能按共享规则通过 `weaver-work-cli auth ...` 命令判断;禁止直接读取、列出、打印或解析用户主目录下的旧 `.e10-cli`、auth、config 或 Keychain 数据。
20
- 所有命令通过 `weaver-work-cli --json invoice run <operation>` 执行:简单 JSON 优先传 `--input-json '<json>'`,复杂或多行 JSON 先写入 UTF-8 文件再传 `--input <path>`,只有确认当前 shell 能稳定传管道时才使用 `--input -`。调用前先按需读取 references 下对应的文件,查参数结构,不要猜字段;**references 是第一信息源**,`weaver-work-cli invoice schema` 是 operation、字段和风险等级的合约来源。
20
+ 所有命令通过 `weaver-work-cli --json invoice run <operation>` 执行(唯一例外:报销单与开票流程的创建/修改调用 `weaver-e10-workflow` 技能的 `weaver-work-cli --json workflow run workflow.*`,见下方「报销填单」「AI 开票」):简单 JSON 优先传 `--input-json '<json>'`,复杂或多行 JSON 先写入 UTF-8 文件再传 `--input <path>`,只有确认当前 shell 能稳定传管道时才使用 `--input -`。调用前先按需读取 references 下对应的文件,查参数结构,不要猜字段;**references 是第一信息源**,`weaver-work-cli invoice schema` 是 operation、字段和风险等级的合约来源。
21
21
  命令示例、提示词和临时说明必须同时兼容 Windows 和 macOS/Linux;涉及 JSON 输入、用户目录、路径分隔符、Python 启动器、文件删除、目录查看或文件比对时,同时给 Windows PowerShell 与 macOS/Linux(bash/zsh)两套示例。Agent 先根据当前系统和 shell 选择对应示例,不确定时用 `node -p "process.platform"` 判断。Windows/PowerShell 下不要使用 `printf`、`$HOME/...`、`~/...`、bash 反斜杠续行、`rm/ls/diff/python3` 等 Unix-only 写法。
22
22
  涉及发票附件、图片、本地文件、远程 URL 文件或 OCR/文件解析的操作,执行前必须提醒用户:文件内容可能被上传到 E10 业票通、OCR/查验服务,并可能进入当前大模型上下文用于理解和处理;必须等待用户明确确认后才继续。
23
23
 
@@ -53,7 +53,7 @@ cliHelp: "weaver-work-cli invoice --help"
53
53
  - 发票上传 / OCR 识别 / 查验预览 / 附件下载
54
54
  - 导入发票 / 新增发票 / 编辑发票 / 删除发票
55
55
  - 发票报销 / 自动填单 / 事前申请报销 / 报销单创建或更新
56
- - 开票 / 开专票 / 开普票 / 存台账 / 智能开票
56
+ - 开票 / 开专票 / 开普票 / 存台账 / 智能开票 / 按合同开票 / 发起开票流程
57
57
  - `fid` / `fileId` / 发票号码 / 发票代码 / 查验状态 / 报销状态
58
58
 
59
59
  **判定规则:** 只要最终动作是对业票通发票做查询、查看、上传、OCR、查验预览、下载、导入、新增、编辑、删除、流程表单发票字段、发票报销填单或开票/存台账,就归 `weaver-e10-yepiaotong`。只有当用户处理的是非发票类 E10 业务、通用工作流或尚未封装的业票通能力时,才不使用本 Skill。
@@ -88,7 +88,8 @@ cliHelp: "weaver-work-cli invoice --help"
88
88
  | 准备/确认编辑发票 | `invoice run invoice.update.prepare/apply` | `[invoice-update.md](references/invoice-update.md)` |
89
89
  | 准备/确认删除发票 | `invoice run invoice.delete.prepare/apply` | `[invoice-delete.md](references/invoice-delete.md)` |
90
90
  | 生成流程表单发票浏览按钮 JSON | `invoice run invoice.browse-field.data` | `[invoice-browse-field-data.md](references/invoice-browse-field-data.md)` |
91
- | 报销自动填单、报销单创建/更新 | `invoice run invoice.reim.`* | `[invoice-reim.md](references/invoice-reim.md)` |
91
+ | 报销自动填单(发票、事前申请、工作流、预填数据) | `invoice run invoice.reim.`* | `[invoice-reim.md](references/invoice-reim.md)` |
92
+ | 报销单创建 / 修改 | `workflow run workflow.createForm/createRequest`、`workflow.editLoad/editPrepare/editApply`(`weaver-e10-workflow` 技能) | `[reim-workflow.md](references/reim-workflow.md)` Step 3~6;命令契约见 `[workflow-create.md](../weaver-e10-workflow/references/workflow-create.md)` |
92
93
  | 报销完整工作流编排、行为准则 | AI 内部 | `[reim-workflow.md](references/reim-workflow.md)` |
93
94
  | 批量获取多张发票预填信息 | `invoice run invoice.reim.row-info-batch` | `[reim-api-reference.md](references/reim-api-reference.md)` |
94
95
  | 报销 CLI operation 入参与返回值 | AI 内部 | `[reim-api-reference.md](references/reim-api-reference.md)` |
@@ -97,8 +98,8 @@ cliHelp: "weaver-work-cli invoice --help"
97
98
  | 报销表单字段填充与 JSON 组装规则 | AI 内部 | `[reim-form-fill-rules.md](references/reim-form-fill-rules.md)` |
98
99
  | 话费补贴 / 话费报销硬拦截规则 | AI 内部 | `[reim-phone-subsidy-rules.md](references/reim-phone-subsidy-rules.md)` |
99
100
  | 报销端到端示例 | 参考 | `[reim-examples.md](references/reim-examples.md)` |
100
- | 智能开票或存入待开台账 | `invoice run invoice.issuing.make.prepare/apply` | `[invoice-issuing.md](references/invoice-issuing.md)` |
101
- | 开票字段提取规则、税率推断、金额计算 | AI 内部 | `[invoice-issuing-field-rules.md](references/invoice-issuing-field-rules.md)` |
101
+ | **开票(默认,唯一链路):按契约锁台账发起开票流程草稿** | `invoice run invoice.issuing.qys.list` -> `workflow run workflow.createForm/createRequest`(`weaver-e10-workflow`) | `[invoice-issuing-workflow.md](references/invoice-issuing-workflow.md)` |
102
+ | 开票流程填单规则(默认值:本次开票金额 = 总金额等) | AI 内部 | `[invoice-issuing-form-fill-rules.md](references/invoice-issuing-form-fill-rules.md)` |
102
103
  | 开票端到端示例 | 参考 | `[invoice-issuing-examples.md](references/invoice-issuing-examples.md)` |
103
104
  | 共享、转让、标签或 schema 未列出的能力 | 无可用命令 | `[invoice-disabled-capabilities.md](references/invoice-disabled-capabilities.md)` |
104
105
 
@@ -116,10 +117,13 @@ cliHelp: "weaver-work-cli invoice --help"
116
117
  - 编辑发票:`invoice.update.prepare` -> 用户确认 -> `invoice.update.apply`
117
118
  - 删除发票:`invoice.delete.prepare` -> 用户确认 -> `invoice.delete.apply`
118
119
  - 流程发票字段:已有 `fid` 或详情时,用 `invoice.browse-field.data` 生成浏览按钮对象;不要运行旧源码脚本或直接调接口。
119
- - 报销快速路径(0.1.13 新增,流程为「总部费用报销」时优先用):查票分类 `invoice.reim.candidates.list` -> 用户确认范围 -> `invoice.reim.flow.create.auto-prepare`(或 `invoice.reim.template.build` + `flow.create.prepare`)-> 用户确认 -> `invoice.reim.flow.create.apply`,详见 `[reim-fast-path.md](references/reim-fast-path.md)`;明细字段与上级口径以该文档固化映射为准,其他流程仍走下面的手工路径。
120
- - **⚠️ 报销单「合同编号」固定填 `20260999`**(除非用户当次明确给出别的合同号):`template.build` / `auto-prepare` 必须显式传 `contractNo`,不传时 `合同号(100003720000001376)` 会**整条缺失且 `warnings` 不提示**,等于静默留空;手工组装路径同样不能留空或放进 `unable_to_fill`。口径见 `[reim-form-fill-rules.md](references/reim-form-fill-rules.md)` 主表字段映射。
121
- - 报销填单(完整工作流见 `[reim-workflow.md](references/reim-workflow.md)`):先用 `invoice.list`/`invoice.get`/`invoice.reim.file-ocr.preview` 获取发票 -> 展示汇总并确认 -> 用 `invoice.reim.requests.list`、`invoice.reim.workflow.resolve`、`invoice.reim.form.structure`、`invoice.reim.row-info`(单张)或 `invoice.reim.row-info-batch`(多张,推荐)、`invoice.reim.employee-superiors` 组装报销单 JSON(匹配规则见 `[reim-matching-rules.md](references/reim-matching-rules.md)`,填单规则见 `[reim-form-fill-rules.md](references/reim-form-fill-rules.md)`,科目匹配见 `[reim-expense-subject-rules.md](references/reim-expense-subject-rules.md)`;命中话费补贴/话费报销时先读 `[reim-phone-subsidy-rules.md](references/reim-phone-subsidy-rules.md)`)-> `invoice.reim.flow.create.prepare` -> 用户确认 -> `invoice.reim.flow.create.apply`。创建成功后修改只能用 `invoice.reim.flow.update.prepare/apply`。
122
- - 智能开票:Agent 读取 `invoice-issuing.md` 和 `invoice-issuing-field-rules.md`,从用户输入或附件中提取购方、税号、商品明细、金额和税率;资料不足时追问用户补齐,再执行 `invoice.issuing.make.prepare` -> 用户确认开票或存台账 -> `invoice.issuing.make.apply`。当前资料包没有客户档案查询 operation,不要调用 `invoice.customer.`*。
120
+ - 报销填单(完整工作流见 `[reim-workflow.md](references/reim-workflow.md)`):先用 `invoice.reim.candidates.list`(按日期批量)/`invoice.list`/`invoice.get`/`invoice.reim.file-ocr.preview` 获取发票 -> 展示汇总并确认 -> `invoice.reim.requests.list` 匹配事前申请 -> `invoice.reim.workflow.resolve` 得到报销工作流 -> 并行 `workflow.createForm`(`weaver-e10-workflow`,传 `{workFlowName}({workFlowId})`,**不传 `userQuestion`**,也不用 `workflow.createRequestDirect`)、`invoice.reim.row-info-batch`、`invoice.browse-field.data`(发票 + 配对凭证)-> 按规则组装 `data`(**`requestName` 与「报销事由」必传**,按 form-fill-rules 的标题/事由公式生成,禁止留用表单默认标题或留空;匹配规则见 `[reim-matching-rules.md](references/reim-matching-rules.md)`,填单规则见 `[reim-form-fill-rules.md](references/reim-form-fill-rules.md)`,科目匹配见 `[reim-expense-subject-rules.md](references/reim-expense-subject-rules.md)`;命中话费补贴/话费报销时先读 `[reim-phone-subsidy-rules.md](references/reim-phone-subsidy-rules.md)`)-> 直接 `workflow.createRequest` 存草稿(`action` 固定 `"draft"`,**不问用户「存草稿 / 提交审批」**,草稿由用户在 E10 核对后自己提交)-> 原样粘贴 `finalMarkdown`。创建成功后修改只能用 `workflow.editLoad` -> `workflow.editPrepare` -> 用户确认 -> `workflow.editApply`。
121
+ - 报销单创建/修改依赖同级的 `weaver-e10-workflow` 技能(`../weaver-e10-workflow/`);该技能不存在时停止并告知用户需要安装,不要改用其他方式创建报销单。
122
+ - **⚠️ 报销单「合同号」固定为 `20260999`**(除非用户当次明确给出别的合同号):`createForm` 已带出该默认值时不传;没带出或用户给了别的合同号时显式传。**用户给了合同号时,承担主体 / 相关客户 / 相关项目都不传,以合同联动带出的值为准(用户口头指定的承担主体也一样)**。口径见 `[reim-form-fill-rules.md](references/reim-form-fill-rules.md)` 主表字段规则。
123
+ - **⚠️ 明细「费用说明」写精简后的 `起点-终点`**(如 `重庆财经学院-鱼胡路站`):整串最多 1 个 `-`、不含 `|` 和空格;禁止原样填 `from` / `to` / 行程单 `fysm` 的原始地址(如 `大道|重庆财经学院-西门 - 鱼胡路-地铁站`)。精简规则见 `[reim-form-fill-rules.md](references/reim-form-fill-rules.md)`「行程 / 出差费用说明」。
124
+ - **AI 开票(默认主链路,所有开票意图先走这条)**:`invoice.issuing.qys.list`(合同号传 `contractNo`,公司名等传 `keyword`;没有线索只问一句合同号或客户名)-> 按返回的 `groups`(一组 = 合同号 + 购方 = 一张流程)让用户选组 -> **购方无税号却是专票(`specialInvoiceWithoutTaxNo=true`)时硬拦截:没有税号只能开普票,请用户先在台账改为普票,不发起流程** -> 展示确认卡片(明确"只建草稿,不会直接开票";必填的「预计收款时间」在卡片里请用户从本月底 / 下月底 / 30 天后候选里选或直接给日期,不自己定默认值,**用户没给日期就不建草稿**)-> 用户确认 -> `workflow.createForm`(`weaver-e10-workflow`,固定传 `契约锁合同收款发票开具及快递申请(100003460000001852)`,**不传 `userQuestion`**,**不要按宽词“开票”检索**——会误中红冲流程)-> 按 `[invoice-issuing-form-fill-rules.md](references/invoice-issuing-form-fill-rules.md)` 组装 `data`(用户说了就按用户的,没说就按默认值,例如本次开票金额默认 = 总金额、开票事由自动生成、所售产品版本号取明细规格类型(与下拉选项完全一致才填);明细每行只传「金额(含税)」,其余列(货物名称、明细行id、单价、规格类型、税率、总开票金额 / 已开票金额 / 未开票金额等)由合同号联动带出,多传会让总开票金额带不出来;主表「开票内容」、明细「数量」和主表「开户行名称」「开户行银行帐号」创建时不传(开票内容的联动会冲掉合同号带出的明细整行;数量会被联动写成税率选项 id;开户行会被写成名称账号混写串);其余购方信息由合同号联动带出,不传);`requestName` 按 `开票申请-{购方名称}-{合同号}` 必传 -> `workflow.createRequest`(`action` 固定 `"draft"`)-> 原样粘贴 `finalMarkdown`,再用 `linkageResult` 的「是否存在合同明细数据」「总开票金额」和「本次开票总金额」核对明细是否带出、本次填的开票金额是否一致(台账开票金额为含税金额)-> **创建后补正**:`workflow.editLoad` 读草稿。开户行名称 / 账号取分组里 CLI 拆好的 `purchaserBankName` / `purchaserBankAccount`(为空时按「,账号:」拆只读字段「开户行及帐号」),`workflow.editPrepare` **只传主表这两个字段**,用户确认后 `workflow.editApply`。开票内容和明细数量**不经编辑链改**(编辑开票内容会报错,编辑明细会多出一行):在回复末尾提醒用户在 E10 里选开票内容(给出建议选项),并把每行数量改成台账 `items[].quantity`(按「明细行id」对应)。创建成功后修改只走 `workflow.editLoad/editPrepare/editApply`,禁止重复创建。详见 `[invoice-issuing-workflow.md](references/invoice-issuing-workflow.md)`。
125
+ - **开票没有兜底链路(0.1.27 起)**:CLI 已移除 `invoice.issuing.make.prepare/apply`、`invoice.issuing.qys.prepare`、`invoice.issuing.result`,**不存在"直接开票/存待开台账"的接口**。用户说"直接开票""不走流程""存待开台账"时,一律走上面的主链路创建开票流程草稿,并向用户说明:开票必须经「契约锁合同收款发票开具及快递申请」流程审批后由流程侧完成;数据不在契约锁台账时,提示用户先在台账录入商品信息,再按主链路发起。
126
+ - 开票流程的创建/修改依赖同级 `weaver-e10-workflow` 技能;该技能不存在时停止并告知用户需要安装,**不要尝试用其他方式直接开票**。
123
127
 
124
128
  ## 执行原则(减少误路由、误重试和无效消耗)
125
129
 
@@ -154,9 +158,12 @@ cliHelp: "weaver-work-cli invoice --help"
154
158
  - **除非错误明确提示可恢复或需要补充参数,否则不要重复刷同一个 operation**
155
159
  - 写请求已经发出后,遇到结果不确定必须停止;不要把 `.apply` 当成可重试读操作
156
160
  - **错误为 `authentication`(未登录,如 `E10 auth not found`)或 `session_expired`(登录态失效)时:立即停止当前操作,不要用示例占位域名或自行猜域名登录,也不要盲目重试**。
157
- - 认证失败后**先判定当前环境是否可交互**(能否向用户提问并等待回答、CLI 与浏览器是否同机、外部浏览器能否回调 `127.0.0.1:19800`):
158
- - **不可交互**(容器 / 沙箱 / CI / 无 GUI / 无人值守):立即终止,不要调用宿主提问或弹框等待用户输入域名或选择 profile,直接读取并按共享规则 `[../weaver-e10-shared/references/non-interactive-environment.md](../weaver-e10-shared/references/non-interactive-environment.md)` 处置,把完整登录命令交给用户在其本地终端执行。
159
- - **可交互**:读取共享规则 `[../weaver-e10-shared/references/e10-auth-and-session.md](../weaver-e10-shared/references/e10-auth-and-session.md)`,用宿主提问/弹框让用户输入 E10 登录域名或选择已有 profile,完成登录后再继续原操作。
161
+ - 认证失败后先读取共享规则 `../weaver-e10-shared/references/e10-auth-and-session.md`:
162
+ - 登录失效的认证方式必须由 Agent 复用本任务开始时的宿主判定,禁止调用任何其他登录 Skill。
163
+ - 明确为 XiaoE 时,只执行 `weaver-work-cli auth xiaoe`,不得改用 `auth login`。
164
+ - 统一登录返回 `authentication/xiaoe_credential_unavailable` 时停止并反馈宿主凭据不可用,不自动回退浏览器登录。
165
+ - 非 XiaoE 时不得执行 `auth xiaoe`;取得用户确认的真实 E10 登录域名后,执行 `weaver-work-cli auth login --base-url "<用户确认的 E10 登录域名>" --agent_type "<当前智能体名称>"`。环境不能完成本机浏览器回调时停止并反馈,不得改调其他登录 Skill。
166
+ - 登录恢复后读操作可重新执行;写操作不得复用旧 continuation,必须重新 prepare 并重新确认。已返回 `partial/write_uncertain` 时先只读回查,禁止直接重放写入。
160
167
  - 登录类命令必须带 timeout 限时(上限 300 秒 / 5 分钟,后台运行 + 限时观察):输出一旦出现 `Open browser login`、`Waiting for E10 authorization callback` 或 `Could not open browser automatically`,即判定已降级到浏览器 OAuth,立即终止该命令并反馈,不得继续等待。登录失败不自动重试。
161
168
  - 需要浏览器登录时必须携带发起方标识 `--agent_type "<当前智能体名称>"`(授权确认页展示用;宿主无法确认名称时才可省略,交由 CLI 从环境变量推断)。
162
169
 
@@ -191,7 +198,6 @@ weaver-work-cli --json invoice run invoice.import.prepare --input-json '{"file":
191
198
  weaver-work-cli --json invoice run invoice.import.apply --input-json '{"file":"./invoice.pdf","continuation":"PREPARE_CONTINUATION","confirm":true}'
192
199
  weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fid":"12345"}'
193
200
  weaver-work-cli --json invoice run invoice.reim.requests.list --input-json '{"pageNo":1,"pageSize":20}'
194
- weaver-work-cli --json invoice run invoice.issuing.make.prepare --input-json '{"mode":"ledger","payload":{"invoiceType":"7","externalDocumentNo":"AI-EXAMPLE-001","purchaserName":"示例个人","totalAmount":100,"taxAmount":6,"totalAmountWithTax":106,"details":[{"goodsName":"信息技术咨询服务","taxRate":0.06,"amount":100,"amountWithTax":106,"taxAmount":6}]}}'
195
201
  ```
196
202
 
197
203
  macOS/Linux(bash/zsh):
@@ -205,7 +211,6 @@ weaver-work-cli --json invoice run invoice.import.prepare --input-json '{"file":
205
211
  weaver-work-cli --json invoice run invoice.import.apply --input-json '{"file":"./invoice.pdf","continuation":"PREPARE_CONTINUATION","confirm":true}'
206
212
  weaver-work-cli --json invoice run invoice.browse-field.data --input-json '{"fid":"12345"}'
207
213
  weaver-work-cli --json invoice run invoice.reim.requests.list --input-json '{"pageNo":1,"pageSize":20}'
208
- weaver-work-cli --json invoice run invoice.issuing.make.prepare --input-json '{"mode":"ledger","payload":{"invoiceType":"7","externalDocumentNo":"AI-EXAMPLE-001","purchaserName":"示例个人","totalAmount":100,"taxAmount":6,"totalAmountWithTax":106,"details":[{"goodsName":"信息技术咨询服务","taxRate":0.06,"amount":100,"amountWithTax":106,"taxAmount":6}]}}'
209
214
  ```
210
215
 
211
216
  ## 不在本 skill 范围