weaver-work-cli 0.1.32 → 0.1.33

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 (185) hide show
  1. package/README.md +2 -2
  2. package/dist/chunks/{archive-UMGX72K6.js → archive-FVFY6GZN.js} +2 -2
  3. package/dist/chunks/{archive-oa-N2IYBLF3.js → archive-oa-NW3OD4UV.js} +2 -2
  4. package/dist/chunks/{asset-GLEGKFG5.js → asset-7QJKMIDV.js} +2 -2
  5. package/dist/chunks/{attachment-content-AQNX5N3S.js → attachment-content-OSAVA6K3.js} +3 -2
  6. package/dist/chunks/{blog-E44OTVDA.js → blog-I7SDPNW4.js} +2 -2
  7. package/dist/chunks/{caizhilian-DQUFZXZL.js → caizhilian-O37ZIQNY.js} +2 -2
  8. package/dist/chunks/{calendar-JKPIRKFD.js → calendar-7KXE4ED3.js} +2 -2
  9. package/dist/chunks/{chunk-4YC43QQ4.js → chunk-2FLWXFVS.js} +4 -4
  10. package/dist/chunks/{chunk-QWY6PGL6.js → chunk-2LV74IWP.js} +361 -56
  11. package/dist/chunks/chunk-3SO6QL6U.js +73 -0
  12. package/dist/chunks/{chunk-DW6AUUKS.js → chunk-6ATGWRZM.js} +6 -4
  13. package/dist/chunks/chunk-BYATLLEF.js +68 -0
  14. package/dist/chunks/chunk-BYBSCN4X.js +932 -0
  15. package/dist/chunks/{chunk-2GA5ZIQL.js → chunk-D223PTXU.js} +1 -0
  16. package/dist/chunks/{chunk-H7J4DC5R.js → chunk-EEWPQE3O.js} +2 -2
  17. package/dist/chunks/{chunk-6RKD4DRZ.js → chunk-GFPXQIY2.js} +2 -2
  18. package/dist/chunks/{chunk-C6R3B2ML.js → chunk-HEL5XTYI.js} +12 -6
  19. package/dist/chunks/{chunk-CVZ2JOSW.js → chunk-IHUYP6LO.js} +1 -1
  20. package/dist/chunks/{chunk-YRVDW4WN.js → chunk-ILMBNVSG.js} +2 -2
  21. package/dist/chunks/{chunk-G3QJULO2.js → chunk-KAS45KNR.js} +1 -1
  22. package/dist/chunks/{chunk-H6XSTSLM.js → chunk-MEEFGWTM.js} +54 -196
  23. package/dist/chunks/{chunk-GCG2NMWR.js → chunk-MQ2I5AA3.js} +4 -2
  24. package/dist/chunks/chunk-NHA62QD7.js +774 -0
  25. package/dist/chunks/{chunk-WKI2FBIQ.js → chunk-OCU4RLHC.js} +641 -309
  26. package/dist/chunks/{chunk-WSKBSQ2U.js → chunk-PRHJGPMA.js} +2 -2
  27. package/dist/chunks/{chunk-6EFWDL7Y.js → chunk-Q6LWB5HX.js} +2 -2
  28. package/dist/chunks/{chunk-IURUFGZK.js → chunk-RBGOMK4Y.js} +50 -33
  29. package/dist/chunks/chunk-VBCFFFGT.js +226 -0
  30. package/dist/chunks/{ebuilder-form-V5FG2EHC.js → chunk-WRRJ4GG2.js} +22 -1148
  31. package/dist/chunks/{chunk-E4Z23GHM.js → chunk-WY74UBJ6.js} +264 -750
  32. package/dist/chunks/conflict-SFNEVJY5.js +21 -0
  33. package/dist/chunks/continuation-RN6PZN2M.js +11 -0
  34. package/dist/chunks/cowork-CKWYHXYB.js +2508 -0
  35. package/dist/chunks/ebuilder-form-KOLJRVZD.js +121 -0
  36. package/dist/chunks/{ehr-HMFY6VIL.js → ehr-WFOC3B4D.js} +1174 -20
  37. package/dist/chunks/{esb-ZYSVB7SG.js → esb-LJZTN663.js} +4 -4
  38. package/dist/chunks/{fna-B7RKPAZD.js → fna-F7QRIIZC.js} +2 -2
  39. package/dist/chunks/{host-45WED2KK.js → host-BCGUVEWX.js} +3 -3
  40. package/dist/chunks/host-BQBRHVR3.js +23 -0
  41. package/dist/chunks/{host-I4Z6BFYX.js → host-DGE2TZD4.js} +3 -3
  42. package/dist/chunks/{host-KNZ52LJZ.js → host-KXPTEWFS.js} +3 -3
  43. package/dist/chunks/{host-OCH2BCCV.js → host-VQ6JJXGQ.js} +3 -3
  44. package/dist/chunks/{hrm-2KAZGUHI.js → hrm-NI6XAKW5.js} +3 -3
  45. package/dist/chunks/{im-ACJJWH4U.js → im-7TRTF3KT.js} +88 -12
  46. package/dist/chunks/{invoice-ZK3WCX2U.js → invoice-AOXWJKYT.js} +3 -3
  47. package/dist/chunks/{jiuchuanhui-5PQD3IL2.js → jiuchuanhui-7NQWEZAW.js} +2 -2
  48. package/dist/chunks/{lazy-dispatch-JQXBW3GM.js → lazy-dispatch-RNS4EE4S.js} +4 -4
  49. package/dist/chunks/{mail-S2HDDXO2.js → mail-VDHJAB4O.js} +3 -3
  50. package/dist/chunks/{meeting-QVN3I37L.js → meeting-GA7XCNNP.js} +214 -43
  51. package/dist/chunks/{okr-QNG4VC2Q.js → okr-TQIRERPQ.js} +2 -2
  52. package/dist/chunks/operations-5QL3AECO.js +11 -0
  53. package/dist/chunks/{plan-A25EMW6U.js → plan-4RY4LN2P.js} +2 -2
  54. package/dist/chunks/{project-G6XV66DZ.js → project-D6XT2OC5.js} +2 -2
  55. package/dist/chunks/{registry-DC6KR3NH.js → registry-JHRIDQ3A.js} +4 -4
  56. package/dist/chunks/{registry-2VLUAESA.js → registry-OZSMDVPP.js} +2 -2
  57. package/dist/chunks/{registry-TI3CIUXF.js → registry-QKMI43Q6.js} +8 -6
  58. package/dist/chunks/{registry-7C5UMIPL.js → registry-VOGKFFTR.js} +2 -2
  59. package/dist/chunks/{room-recommend-WRTHO6Y2.js → room-recommend-D4EUOOWY.js} +4 -3
  60. package/dist/chunks/{schedule-KFIITGSK.js → schedule-XPFBHPCV.js} +4 -3
  61. package/dist/chunks/{workflow-DJ7SYWAF.js → workflow-HLBZRWIY.js} +172 -6
  62. package/dist/index.js +30 -25
  63. package/dist/internal/e10/auth-recovery.js +14 -4
  64. package/dist/shortcuts/contract/host.js +34 -59
  65. package/dist/shortcuts/cowork/continuation.js +70 -0
  66. package/dist/shortcuts/cowork/errors.js +59 -0
  67. package/dist/shortcuts/cowork/host.js +172 -0
  68. package/dist/shortcuts/cowork/index.js +166 -0
  69. package/dist/shortcuts/cowork/manifest.js +65 -0
  70. package/dist/shortcuts/cowork/operations/discuss-write.js +277 -0
  71. package/dist/shortcuts/cowork/operations/item-write.js +380 -0
  72. package/dist/shortcuts/cowork/operations/member-write.js +283 -0
  73. package/dist/shortcuts/cowork/operations/permission-write.js +286 -0
  74. package/dist/shortcuts/cowork/operations/read.js +423 -0
  75. package/dist/shortcuts/cowork/operations/registry.js +39 -0
  76. package/dist/shortcuts/cowork/operations/review-write.js +157 -0
  77. package/dist/shortcuts/cowork/operations/shared.js +215 -0
  78. package/dist/shortcuts/cowork/operations/types.js +24 -0
  79. package/dist/shortcuts/cowork/operations.js +19 -0
  80. package/dist/shortcuts/ehr/host.js +4 -1
  81. package/dist/shortcuts/ehr/operations/recruit-candidate-import.js +757 -0
  82. package/dist/shortcuts/ehr/operations/recruit-position.js +367 -0
  83. package/dist/shortcuts/ehr/operations/recruit-stats.js +133 -0
  84. package/dist/shortcuts/ehr/operations/recruit-write.js +8 -16
  85. package/dist/shortcuts/ehr/operations/recruit.js +35 -10
  86. package/dist/shortcuts/ehr/operations/registry.js +6 -0
  87. package/dist/shortcuts/im/diagnostics.js +97 -0
  88. package/dist/shortcuts/im/host.js +58 -31
  89. package/dist/shortcuts/im/index.js +7 -2
  90. package/dist/shortcuts/im/operations/at-mention.js +127 -0
  91. package/dist/shortcuts/im/operations/file-user.js +10 -2
  92. package/dist/shortcuts/im/operations/group-read.js +26 -5
  93. package/dist/shortcuts/im/operations/group-write.js +35 -28
  94. package/dist/shortcuts/im/operations/msg-sync.js +7 -2
  95. package/dist/shortcuts/im/operations/msg-write.js +76 -10
  96. package/dist/shortcuts/im/operations/quote-mention.js +119 -0
  97. package/dist/shortcuts/im/operations/session.js +1 -1
  98. package/dist/shortcuts/im/operations/shared.js +10 -0
  99. package/dist/shortcuts/im/operations/types.js +13 -0
  100. package/dist/shortcuts/index.js +5 -0
  101. package/dist/shortcuts/mail/host.js +4 -1
  102. package/dist/shortcuts/meeting/host.js +27 -34
  103. package/dist/shortcuts/meeting/operations/create.js +4 -1
  104. package/dist/shortcuts/meeting/operations/eb/catalog.js +5 -0
  105. package/dist/shortcuts/meeting/operations/eb/conflict.js +78 -7
  106. package/dist/shortcuts/meeting/operations/eb/create-flow.js +168 -26
  107. package/dist/shortcuts/meeting/operations/eb/factory.js +69 -1
  108. package/dist/shortcuts/meeting/operations/eb/index.js +16 -3
  109. package/dist/shortcuts/meeting/operations/eb/room-recommend.js +14 -3
  110. package/dist/shortcuts/meeting/operations/eb-fallback.js +159 -0
  111. package/dist/shortcuts/meeting/operations/env.js +93 -46
  112. package/dist/shortcuts/meeting/operations/form-fields.js +110 -0
  113. package/dist/shortcuts/meeting/operations/registry.js +2 -0
  114. package/dist/shortcuts/meeting/operations/standard-guard.js +71 -0
  115. package/dist/shortcuts/meeting/operations.js +16 -0
  116. package/dist/shortcuts/workflow/index.js +110 -1
  117. package/dist/shortcuts/workflow/operations/form.js +24 -3
  118. package/dist/shortcuts/workflow/operations/read.js +104 -23
  119. package/dist/shortcuts/workflow/operations/todoSmartConvert/aigroupRules.js +448 -0
  120. package/dist/shortcuts/workflow/operations/todoSmartConvert/aigroupStore.js +106 -0
  121. package/dist/shortcuts/workflow/operations/todoSmartConvert/businessRules.js +47 -0
  122. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +30 -23
  123. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +1 -0
  124. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +1 -0
  125. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +2 -1
  126. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +2 -4
  127. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +138 -181
  128. package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +12 -7
  129. package/docs/e10-auth.md +1 -1
  130. package/docs/im.md +8 -1
  131. package/docs/todo-smart-convert/README.md +1 -1
  132. package/docs/todo-smart-convert/data-contract.md +2 -2
  133. package/docs/todo-smart-convert/subgroup-rules.md +6 -0
  134. package/package.json +1 -1
  135. package/skill-template/domains/yimiaoban.md +3 -3
  136. package/skill-template/skill-template.md +1 -1
  137. package/skills/weaver-e10-blog/SKILL.md +5 -5
  138. package/skills/weaver-e10-caizhilian/SKILL.md +5 -5
  139. package/skills/weaver-e10-calendar/SKILL.md +5 -5
  140. package/skills/weaver-e10-esb/SKILL.md +5 -5
  141. package/skills/weaver-e10-hrm/SKILL.md +5 -5
  142. package/skills/weaver-e10-jinchengda/SKILL.md +2 -2
  143. package/skills/weaver-e10-jiuchuanhui/SKILL.md +5 -5
  144. package/skills/weaver-e10-jucailin/SKILL.md +18 -12
  145. package/skills/weaver-e10-jucailin/references/recruit-create.md +104 -0
  146. package/skills/weaver-e10-mail/SKILL.md +5 -5
  147. package/skills/weaver-e10-meeting/SKILL.md +171 -25
  148. package/skills/weaver-e10-meeting/references/meeting-eb.md +4 -3
  149. package/skills/weaver-e10-meeting/references/meeting-queries.md +9 -6
  150. package/skills/weaver-e10-meeting/references/meeting-verification.md +8 -6
  151. package/skills/weaver-e10-meeting.zip +0 -0
  152. package/skills/weaver-e10-okr/SKILL.md +5 -5
  153. package/skills/weaver-e10-okr/references/source-manifest.json +3 -3
  154. package/skills/weaver-e10-plan/SKILL.md +5 -5
  155. package/skills/weaver-e10-shared/SKILL.md +12 -12
  156. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +4 -4
  157. package/skills/weaver-e10-wenshuding/SKILL.md +5 -5
  158. package/skills/weaver-e10-workflow/SKILL.md +29 -5
  159. package/skills/weaver-e10-workflow/aigroup/default.json +88 -0
  160. package/skills/weaver-e10-workflow/references/todo-smart-convert.md +66 -14
  161. package/skills/weaver-e10-workflow/references/workflow-agent-entry.md +1 -1
  162. package/skills/weaver-e10-workflow/references/workflow-memory.md +1 -1
  163. package/skills/weaver-e10-workflow/references/workflow-query.md +12 -10
  164. package/skills/weaver-e10-workflow/references/workflow-view.md +2 -2
  165. package/skills/weaver-e10-workflow/tools/todo-serve.cjs +239 -0
  166. package/skills/weaver-e10-workflow/{scripts → tools}/todo-summary.cjs +218 -28
  167. package/skills/weaver-e10-yepiaotong/SKILL.md +10 -8
  168. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +7 -7
  169. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +10 -10
  170. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +40 -37
  171. package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +4 -4
  172. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +27 -38
  173. package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +4 -4
  174. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +37 -29
  175. package/skills/weaver-e10-yimiaoban/SKILL.md +156 -33
  176. package/skills/weaver-e10-yimiaoban/references/ding-write.md +1 -1
  177. package/skills/weaver-e10-yimiaoban/references/error-codes.md +5 -1
  178. package/skills/weaver-e10-yimiaoban/references/group-read.md +5 -1
  179. package/skills/weaver-e10-yimiaoban/references/group-write.md +6 -4
  180. package/skills/weaver-e10-yimiaoban/references/msg-read.md +1 -0
  181. package/skills/weaver-e10-yimiaoban/references/msg-write.md +34 -2
  182. package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +5 -2
  183. package/skills/weaver-e10-yimiaoban/references/source-manifest.json +79 -58
  184. package/skills/weaver-e10-yimiaoban/references/user-remind.md +2 -2
  185. package/skills/weaver-e10-ziguanjia/SKILL.md +5 -5
@@ -1,18 +1,29 @@
1
1
  import { createRequire as __esbuildCreateRequire } from 'node:module';
2
2
  const require = __esbuildCreateRequire(import.meta.url);
3
- import {
4
- meetingEbScheduleOperations
5
- } from "./chunk-4YC43QQ4.js";
6
3
  import {
7
4
  ebRoomRecommendOperation,
8
5
  recommendRooms,
9
6
  rememberFrequentRoom
10
- } from "./chunk-C6R3B2ML.js";
7
+ } from "./chunk-HEL5XTYI.js";
8
+ import {
9
+ meetingEbScheduleOperations
10
+ } from "./chunk-2FLWXFVS.js";
11
+ import {
12
+ ebMeetingWritePreflight,
13
+ fetchEbAppSettings,
14
+ findCommonFreeSlots,
15
+ meetingEbConflictOperations
16
+ } from "./chunk-NHA62QD7.js";
11
17
  import {
12
18
  listMeetingAttachments,
13
19
  meetingAttachmentContentOperations,
14
20
  renderDocx
15
- } from "./chunk-GCG2NMWR.js";
21
+ } from "./chunk-MQ2I5AA3.js";
22
+ import {
23
+ meetingEnvOperations,
24
+ meetingStateDir,
25
+ resolveMeetingEnvMode
26
+ } from "./chunk-VBCFFFGT.js";
16
27
  import {
17
28
  EB_BASE,
18
29
  EB_ENDPOINTS,
@@ -31,9 +42,7 @@ import {
31
42
  fingerprint,
32
43
  meetingConfirmationError,
33
44
  meetingConflictError,
34
- meetingEnvOperations,
35
45
  meetingPartialError,
36
- meetingStateDir,
37
46
  meetingSuccess,
38
47
  meetingValidationError,
39
48
  mergeSnapshot,
@@ -41,13 +50,12 @@ import {
41
50
  pickBusinessInput,
42
51
  queryBody,
43
52
  requireConfirm,
44
- resolveMeetingEnvMode,
45
53
  schemaOf,
46
54
  toIdCsv,
47
55
  toIdString,
48
56
  verifyLease,
49
57
  writeBody
50
- } from "./chunk-H6XSTSLM.js";
58
+ } from "./chunk-MEEFGWTM.js";
51
59
 
52
60
  // src/shortcuts/meeting/operations/meetings.ts
53
61
  function overlapsDate(beginDatetime, endDatetime, date) {
@@ -776,7 +784,7 @@ async function assertCreatePathAllowed(args, env) {
776
784
  if (!isRepeat && Number(base.onlyFlowCreate) === 1) {
777
785
  throw meetingConflictError(
778
786
  "conflict_rejected",
779
- "\u8BE5\u79DF\u6237 onlyFlowCreate=1\uFF1A\u4F1A\u8BAE\u53EA\u80FD\u901A\u8FC7\u6D41\u7A0B\u521B\u5EFA\uFF1BCLI v1 \u672A\u96C6\u6210\u5DE5\u4F5C\u6D41\u53D1\u8D77\uFF0C\u8BF7\u901A\u8FC7\u5DE5\u4F5C\u6D41\u6D41\u7A0B\u521B\u5EFA",
787
+ "\u8BE5\u79DF\u6237 onlyFlowCreate=1\uFF1A\u4F1A\u8BAE\u53EA\u80FD\u901A\u8FC7\u6D41\u7A0B\u521B\u5EFA\uFF0C\u76F4\u8FDE\u5EFA\u4F1A\u5DF2\u88AB\u62D2\u7EDD\uFF08\u4E0D\u4F1A\u5199\u5165\u4EFB\u4F55\u6570\u636E\uFF09\u3002\u4E0D\u7528\u505C\u624B \u2014\u2014 \u6539\u8D70 **meeting.eb.meeting.create.flow**\uFF08prepare\u2192apply\uFF09\u5373\u53EF\uFF1A\u5B83\u4F1A\u8F7D\u5165\u5EFA\u4F1A\u6D41\u7A0B\u8868\u5355\u3001\u63D0\u4EA4\u5BA1\u6279\uFF0C\u5E76\u5728\u4F1A\u8BAE\u751F\u6210\u540E\u81EA\u52A8\u51FA\u9080\u8BF7\u51FD\u3002\u5982\u9700\u76F4\u8FDE\u5EFA\u4F1A\uFF0C\u8BF7\u7BA1\u7406\u5458\u5148\u5728\u4F1A\u8BAE\u5E94\u7528\u8BBE\u7F6E\u4E2D\u5173\u95ED\u8BE5\u5F00\u5173\u3002",
780
788
  { workFlowBaseIds: base.workFlowBaseIds ?? "" }
781
789
  );
782
790
  }
@@ -2213,7 +2221,7 @@ var meetingAttachmentAttach = {
2213
2221
  if (mode === "append" && existingIds.length === 0) {
2214
2222
  existingIds.push(...beforeIds);
2215
2223
  }
2216
- const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-TI3CIUXF.js");
2224
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
2217
2225
  const list = getMeetingOperation2("meeting.eb.meeting.list");
2218
2226
  let fileId = incomingFileId;
2219
2227
  let name = String(args.name ?? "").trim();
@@ -2301,7 +2309,7 @@ function textOf(value) {
2301
2309
  return value === void 0 || value === null ? "" : String(value);
2302
2310
  }
2303
2311
  async function readMinute(env, id) {
2304
- const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-TI3CIUXF.js");
2312
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
2305
2313
  const detail = getMeetingOperation2("meeting.eb.minute.detail");
2306
2314
  const result = await detail.handler({ id }, env);
2307
2315
  const row = result?.data?.data;
@@ -2380,7 +2388,7 @@ var meetingMinuteWriteContent = {
2380
2388
  } else {
2381
2389
  statusReason = "\u4EC5\u6E05\u7A7A\u5185\u5BB9\uFF0C\u672A\u6539\u72B6\u6001";
2382
2390
  }
2383
- const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-TI3CIUXF.js");
2391
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
2384
2392
  const prepare = getMeetingOperation2("meeting.eb.minute.update.prepare");
2385
2393
  const apply = getMeetingOperation2("meeting.eb.minute.update.apply");
2386
2394
  const prepared = await prepare.handler({ id, mt_id: mtId, ...patch }, env);
@@ -2738,7 +2746,7 @@ var meetingMinuteFromGroupChat = {
2738
2746
  const mtId = textOf2(args.mt_id).trim();
2739
2747
  if (!mtId) throw meetingValidationError("mt_id_required", "\u5FC5\u987B\u63D0\u4F9B\u4F1A\u8BAE id\uFF08mt_id\uFF09");
2740
2748
  const pipeline = ["text", "minutes", "document"].includes(args.pipeline) ? args.pipeline : "text";
2741
- const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-TI3CIUXF.js");
2749
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
2742
2750
  const ctx = env.ctx;
2743
2751
  let stepStart = Date.now();
2744
2752
  const listed = await getMeetingOperation2("meeting.eb.meeting.list").handler(
@@ -2762,9 +2770,9 @@ var meetingMinuteFromGroupChat = {
2762
2770
  }
2763
2771
  mark("readMeeting", stepStart);
2764
2772
  const pullStart = Date.now();
2765
- const { createImHost } = await import("./host-I4Z6BFYX.js");
2773
+ const { createImHost } = await import("./host-DGE2TZD4.js");
2766
2774
  const { createImContinuationSigner } = await import("./continuation-2CKSBLA6.js");
2767
- const { getImOperation } = await import("./registry-2VLUAESA.js");
2775
+ const { getImOperation } = await import("./registry-OZSMDVPP.js");
2768
2776
  const imEnv = { ctx, host: createImHost(ctx), continuation: createImContinuationSigner(ctx) };
2769
2777
  const syncOp = getImOperation("im.msg.sync.group");
2770
2778
  const chatWindow = computeChatWindow(meeting);
@@ -2832,7 +2840,7 @@ var meetingMinuteFromGroupChat = {
2832
2840
  try {
2833
2841
  const { readFile: readFile4 } = await import("node:fs/promises");
2834
2842
  const buffer = await readFile4(file);
2835
- const { extractText } = await import("./attachment-content-AQNX5N3S.js");
2843
+ const { extractText } = await import("./attachment-content-OSAVA6K3.js");
2836
2844
  const extracted = extractText(buffer, file, "");
2837
2845
  if (extracted.text.trim()) {
2838
2846
  extraSections.push(`\u3010\u6750\u6599\uFF1A${file.split(/[\\/]/).pop() ?? file}\u3011
@@ -2959,9 +2967,9 @@ ${groupTranscript}` : ""
2959
2967
  if (!employeeId) {
2960
2968
  warnings.push("\u672A\u53D6\u5230 ESB \u89E6\u53D1\u4EBA id\uFF08employeeId\uFF09\uFF0C\u5DF2\u8DF3\u8FC7\u540E\u7EED ESB \u8C03\u7528");
2961
2969
  } else {
2962
- const { createEsbHost } = await import("./host-45WED2KK.js");
2970
+ const { createEsbHost } = await import("./host-BCGUVEWX.js");
2963
2971
  const { createEsbContinuationSigner } = await import("./continuation-NLECEJPX.js");
2964
- const { getEsbOperation } = await import("./registry-DC6KR3NH.js");
2972
+ const { getEsbOperation } = await import("./registry-JHRIDQ3A.js");
2965
2973
  const esbEnv = { ctx, host: createEsbHost(ctx), continuation: createEsbContinuationSigner(ctx) };
2966
2974
  const prepareOp = getEsbOperation("esb.trigger.prepare");
2967
2975
  const applyOp = getEsbOperation("esb.trigger.apply");
@@ -3145,7 +3153,7 @@ var meetingDecisionNotifyGroup = {
3145
3153
  const warnings = [];
3146
3154
  const mtId = textOf3(args.mt_id).trim();
3147
3155
  if (!mtId) throw meetingValidationError("mt_id_required", "\u5FC5\u987B\u63D0\u4F9B\u4F1A\u8BAE id\uFF08mt_id\uFF09");
3148
- const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-TI3CIUXF.js");
3156
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
3149
3157
  const ctx = env.ctx;
3150
3158
  const listed = await getMeetingOperation2("meeting.eb.meeting.list").handler(
3151
3159
  { mt_id: mtId, pageNo: 1, pageSize: 1 },
@@ -3209,7 +3217,7 @@ var meetingDecisionNotifyGroup = {
3209
3217
  charCount: formatted.text.length,
3210
3218
  text: formatted.text
3211
3219
  };
3212
- const { createImHost } = await import("./host-I4Z6BFYX.js");
3220
+ const { createImHost } = await import("./host-DGE2TZD4.js");
3213
3221
  const imHost = createImHost(ctx);
3214
3222
  let displayText = formatted.text;
3215
3223
  let wireText = formatted.text;
@@ -3217,7 +3225,7 @@ var meetingDecisionNotifyGroup = {
3217
3225
  const mentioned = [];
3218
3226
  if (args.mention !== false) {
3219
3227
  try {
3220
- const { getImOperation } = await import("./registry-2VLUAESA.js");
3228
+ const { getImOperation } = await import("./registry-OZSMDVPP.js");
3221
3229
  const membersResult = await getImOperation("im.group.users").handler(
3222
3230
  { groupId },
3223
3231
  { ctx, host: imHost }
@@ -3447,7 +3455,7 @@ var meetingPipelineRun = {
3447
3455
  const needsConfirm = level === "tasks" || level === "notify";
3448
3456
  const confirmed = args.confirm === true;
3449
3457
  const executedLevel = needsConfirm && !confirmed ? "document" : level;
3450
- const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-TI3CIUXF.js");
3458
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
3451
3459
  const ctx = env.ctx;
3452
3460
  let stepStart = Date.now();
3453
3461
  const reuseMinuteId = textOf4(args.minuteId).trim();
@@ -3516,7 +3524,7 @@ var meetingPipelineRun = {
3516
3524
  ]);
3517
3525
  }
3518
3526
  stepStart = Date.now();
3519
- const { createHrmHost } = await import("./host-KNZ52LJZ.js");
3527
+ const { createHrmHost } = await import("./host-KXPTEWFS.js");
3520
3528
  const { getHrmOperation } = await import("./registry-NYPYMZXG.js");
3521
3529
  const hrmEnv = { ctx, host: createHrmHost(ctx) };
3522
3530
  const queryOp = getHrmOperation("hrm.employee.query");
@@ -3757,7 +3765,7 @@ function formatTimeRange(start, end) {
3757
3765
  }
3758
3766
  async function loadAgendaFromTopics(env, mtId) {
3759
3767
  try {
3760
- const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-TI3CIUXF.js");
3768
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
3761
3769
  const operation = getMeetingOperation2("meeting.eb.topic.list");
3762
3770
  const result = await operation.handler({ mt_id: mtId, pageNo: 1, pageSize: 200 }, env);
3763
3771
  const rows = result.data?.rows ?? [];
@@ -3968,7 +3976,7 @@ var meetingInvitationRender = {
3968
3976
  if (value !== void 0 && value !== null) extra[key] = String(value);
3969
3977
  }
3970
3978
  }
3971
- const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-TI3CIUXF.js");
3979
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
3972
3980
  const listOperation = getMeetingOperation2("meeting.eb.meeting.list");
3973
3981
  let row;
3974
3982
  try {
@@ -4698,7 +4706,7 @@ var meetingSummaryGet = {
4698
4706
  const mtId = textOf5(args.mt_id).trim();
4699
4707
  if (!mtId) throw meetingValidationError("mt_id_required", "\u5FC5\u987B\u63D0\u4F9B\u4F1A\u8BAE id\uFF08mt_id\uFF09");
4700
4708
  const ctx = env.ctx;
4701
- const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-TI3CIUXF.js");
4709
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
4702
4710
  const warnings = [];
4703
4711
  const timings = {};
4704
4712
  const include = Array.isArray(args.include) && args.include.length > 0 ? args.include.filter((item) => ALL_SECTIONS.includes(item)) : ALL_SECTIONS;
@@ -4834,9 +4842,9 @@ var meetingSummaryGet = {
4834
4842
  warnings.push("\u8BE5\u4F1A\u8BAE\u6CA1\u6709\u5173\u8054\u7FA4\u804A\uFF08imchat_groupid \u4E3A\u7A7A\uFF09\uFF0Cchat \u6BB5\u4E3A null");
4835
4843
  } else {
4836
4844
  try {
4837
- const { createImHost } = await import("./host-I4Z6BFYX.js");
4845
+ const { createImHost } = await import("./host-DGE2TZD4.js");
4838
4846
  const { createImContinuationSigner } = await import("./continuation-2CKSBLA6.js");
4839
- const { getImOperation } = await import("./registry-2VLUAESA.js");
4847
+ const { getImOperation } = await import("./registry-OZSMDVPP.js");
4840
4848
  const imEnv = {
4841
4849
  ctx,
4842
4850
  // 测试环境靠 env.imHost 注入假实现,否则会真的打到线上群聊
@@ -4917,704 +4925,95 @@ var meetingSummaryGet = {
4917
4925
  };
4918
4926
  var meetingSummaryOperations = [meetingSummaryGet];
4919
4927
 
4920
- // src/shortcuts/meeting/operations/eb/conflict.ts
4921
- var ACTIVE_MT_STATUS = "1,2,8,9";
4922
- var PAGE_SIZE = 200;
4923
- var MT_ID_BATCH = 50;
4924
- var MAX_PAGES = 50;
4925
- function errorText(error) {
4926
- return error instanceof Error ? error.message : String(error);
4927
- }
4928
- async function requestEbList(env, interfacePk, query, operation) {
4929
- const session = await env.host.getSession();
4930
- const pageNo = typeof query.pageNo === "number" ? query.pageNo : 1;
4931
- const pageSize = typeof query.pageSize === "number" ? query.pageSize : PAGE_SIZE;
4932
- const response = await env.host.request({
4933
- method: "POST",
4934
- path: `${EB_BASE}/getFormDataList/${interfacePk}`,
4935
- operation,
4936
- query,
4937
- body: queryBody(session.userId, { pageNo, pageSize }),
4938
- acceptBusiness: ebBusinessSuccess
4939
- });
4940
- return extractEbRows(response).rows.map((row) => row?.mainTable ? row.mainTable : row);
4941
- }
4942
- async function listAllEbRows(env, interfacePk, baseQuery, operation) {
4943
- const rows = [];
4944
- let requests = 0;
4945
- for (let pageNo = 1; pageNo <= MAX_PAGES; pageNo += 1) {
4946
- const page = await requestEbList(env, interfacePk, { ...baseQuery, pageNo, pageSize: PAGE_SIZE }, operation);
4947
- requests += 1;
4948
- rows.push(...page);
4949
- if (page.length < PAGE_SIZE) break;
4950
- }
4951
- return { rows, requests };
4952
- }
4953
- async function fetchEbAppSettings(env, operation) {
4954
- try {
4955
- const rows = await requestEbList(env, "query_meeting_baseset", { pageNo: 1, pageSize: 20 }, operation);
4956
- const valid = rows.filter((row) => String(row.data_status ?? "1") === "1");
4957
- const ordered = [...valid].sort((left, right) => String(right.update_time ?? "").localeCompare(String(left.update_time ?? "")));
4958
- const base = ordered[0] ?? {};
4959
- return {
4960
- roomChk: String(base.room_conflict_chk ?? ""),
4961
- roomAction: String(base.room_conflict ?? ""),
4962
- memberChk: String(base.member_conflict_chk ?? ""),
4963
- memberAction: String(base.member_conflict ?? ""),
4964
- onlyFlowCreate: String(base.only_flow_create ?? ""),
4965
- openMtApprove: String(base.open_mt_approve ?? ""),
4966
- mtNewWf: String(base.mt_new_wf ?? ""),
4967
- mtRepeatNewWf: String(base.mt_repeat_new_wf ?? ""),
4968
- settingsRows: valid.length,
4969
- settingsId: String(base.id ?? ""),
4970
- settingsUpdatedAt: String(base.update_time ?? "")
4971
- };
4972
- } catch (error) {
4973
- return {
4974
- roomChk: "",
4975
- roomAction: "",
4976
- memberChk: "",
4977
- memberAction: "",
4978
- onlyFlowCreate: "",
4979
- openMtApprove: "",
4980
- mtNewWf: "",
4981
- mtRepeatNewWf: "",
4982
- settingsRows: 0,
4983
- error: errorText(error)
4984
- };
4985
- }
4986
- }
4987
- function assertEbCreatePathAllowed(settings) {
4988
- if (settings.error) {
4989
- throw meetingConflictError(
4990
- "conflict_check_failed",
4991
- `\u65E0\u6CD5\u8BFB\u53D6\u4F1A\u8BAE\u5E94\u7528\u8BBE\u7F6E\uFF08query_meeting_baseset\uFF09\uFF0C\u65E0\u6CD5\u5224\u5B9A\u662F\u5426\u5141\u8BB8\u76F4\u63A5\u5EFA\u4F1A\uFF08only_flow_create / open_mt_approve\uFF09\uFF0C\u5DF2\u6309\u4FDD\u5B88\u7B56\u7565\u62D2\u7EDD\uFF1A${settings.error}`
4992
- );
4993
- }
4994
- const blocked = [];
4995
- if (settings.onlyFlowCreate === "1") {
4996
- blocked.push("only_flow_create=1\uFF08\u53EA\u5141\u8BB8\u901A\u8FC7\u6D41\u7A0B\u65B0\u5EFA\u4F1A\u8BAE\uFF09");
4997
- }
4998
- if (settings.openMtApprove === "1") {
4999
- blocked.push("open_mt_approve=1\uFF08\u4F1A\u8BAE\u63D0\u4EA4\u9700\u5BA1\u6279\uFF09");
5000
- }
5001
- if (blocked.length === 0) return;
5002
- throw meetingConflictError(
5003
- "conflict_rejected",
5004
- `\u5E94\u7528\u8BBE\u7F6E\u4E0D\u5141\u8BB8\u76F4\u63A5\u5EFA\u4F1A\uFF1A${blocked.join("\uFF1B")}\u3002\u8BE5\u5E94\u7528\u7684\u4F1A\u8BAE\u5FC5\u987B\u7ECF\u6D41\u7A0B\u521B\u5EFA\uFF08\u65B0\u5EFA\u4F1A\u8BAE\u5DE5\u4F5C\u6D41 mt_new_wf=${settings.mtNewWf || "\u672A\u914D\u7F6E"}\uFF0C\u5468\u671F\u4F1A\u8BAE\u5DE5\u4F5C\u6D41 mt_repeat_new_wf=${settings.mtRepeatNewWf || "\u672A\u914D\u7F6E"}\uFF09\u2014\u2014CLI \u4E0D\u76F4\u63A5\u5EFA\u4F1A\u3001\u4E5F\u4E0D\u4EE3\u66FF\u6D41\u7A0B\u5EFA\u4F1A\uFF08\u5426\u5219\u4F1A\u4EA7\u751F\u6D41\u7A0B\u4E4B\u5916\u3001request_id \u4E3A\u7A7A\u7684\u4F1A\u8BAE\uFF0C\u4E14\u4E0E\u6D41\u7A0B/ESB \u81EA\u52A8\u5EFA\u4F1A\u91CD\u590D\uFF09\u3002\u8FD9\u5C5E\u4E8E\u5E94\u7528\u7BA1\u63A7\uFF0CCLI \u4E0D\u4F1A\u7ED5\u8FC7 \u2014\u2014 \u4F46\u4E5F\u4E0D\u7528\u505C\u624B\uFF1A\u6539\u8D70 **meeting.eb.meeting.create.flow**\uFF08prepare\u2192apply\uFF09\u5373\u53EF\uFF0C\u5B83\u4F1A\u6309 mt_new_wf \u8F7D\u5165\u5EFA\u4F1A\u6D41\u7A0B\u8868\u5355\u3001\u63D0\u4EA4\u5BA1\u6279\uFF0C\u5E76\u5728\u4F1A\u8BAE\u751F\u6210\u540E\u81EA\u52A8\u51FA\u9080\u8BF7\u51FD\u3002\u5982\u9700\u76F4\u8FDE\u5EFA\u4F1A\uFF0C\u8BF7\u7BA1\u7406\u5458\u5148\u5728\u4F1A\u8BAE\u5E94\u7528\u8BBE\u7F6E\u4E2D\u5173\u95ED\u8BE5\u5F00\u5173\u3002`,
5005
- {
5006
- onlyFlowCreate: settings.onlyFlowCreate,
5007
- openMtApprove: settings.openMtApprove,
5008
- mtNewWf: settings.mtNewWf,
5009
- mtRepeatNewWf: settings.mtRepeatNewWf
5010
- }
5011
- );
5012
- }
5013
- async function checkRoomConflict(roomId, begin, end, excludeMtId, env, operation) {
5014
- const { rows, requests } = await listAllEbRows(
5015
- env,
5016
- "query_roomusage_list",
5017
- // 重叠判定:占用开始 < 我的结束(enddatetime 算子 lt)且 占用结束 > 我的开始(begindatetime 算子 gt)
5018
- { address: roomId, enddatetime: end, begindatetime: begin },
5019
- operation
5020
- );
5021
- const conflicts = rows.map((row) => ({
5022
- mtId: String(row.mt_id ?? ""),
5023
- begin: String(row.startdate ?? ""),
5024
- end: String(row.enddate ?? "")
5025
- })).filter((item) => item.mtId && item.mtId !== excludeMtId);
5026
- return { conflicts, requests };
5027
- }
5028
- async function collectMemberConflicts(members, begin, end, excludeMtId, env, operation) {
5029
- const wanted = new Set(members);
5030
- const candidate = await listAllEbRows(
5031
- env,
5032
- "query_mtDetail_list",
5033
- { begindatetime: begin, enddatetime: end, mt_status: ACTIVE_MT_STATUS },
5034
- operation
5035
- );
5036
- const candidates = candidate.rows.map((row) => ({
5037
- id: String(row.id ?? ""),
5038
- name: String(row.mt_name ?? row.name ?? ""),
5039
- begin: String(row.begin_datetime ?? ""),
5040
- end: String(row.end_datetime ?? "")
5041
- })).filter((item) => item.id && item.id !== excludeMtId);
5042
- const byId = new Map(candidates.map((item) => [item.id, item]));
5043
- const byMeeting = /* @__PURE__ */ new Map();
5044
- let receiptCalls = 0;
5045
- let receipts = 0;
5046
- for (let index = 0; index < candidates.length; index += MT_ID_BATCH) {
5047
- const csv = candidates.slice(index, index + MT_ID_BATCH).map((item) => item.id).join(",");
5048
- const page = await listAllEbRows(env, "query_meeting_receipt_list", { mt_id: csv }, operation);
5049
- receiptCalls += page.requests;
5050
- receipts += page.rows.length;
5051
- for (const row of page.rows) {
5052
- const meetingId = String(row.mt_id ?? "");
5053
- const memberId = String(row.member_id ?? "");
5054
- const memberType = String(row.member_type ?? "");
5055
- if (!meetingId || !memberId) continue;
5056
- if (memberType && memberType !== "1") continue;
5057
- if (!wanted.has(memberId)) continue;
5058
- if (!byMeeting.has(meetingId)) byMeeting.set(meetingId, /* @__PURE__ */ new Set());
5059
- byMeeting.get(meetingId).add(memberId);
5060
- }
5061
- }
5062
- const conflicts = [...byMeeting.entries()].map(([meetingId, ids]) => {
5063
- const meeting = byId.get(meetingId);
5064
- return {
5065
- meetingId,
5066
- name: meeting?.name ?? "",
5067
- begin: meeting?.begin ?? "",
5068
- end: meeting?.end ?? "",
5069
- conflictedMembers: [...ids]
5070
- };
5071
- });
5072
- conflicts.sort((left, right) => left.begin.localeCompare(right.begin));
5073
- return {
5074
- conflicts,
5075
- listCalls: candidate.requests,
5076
- receiptCalls,
5077
- candidates: candidates.length,
5078
- receipts
5079
- };
4928
+ // src/shortcuts/meeting/operations/form-fields.ts
4929
+ function textOf6(value) {
4930
+ return value === void 0 || value === null ? "" : String(value);
5080
4931
  }
5081
- async function runEbConflictCheck(input, env, operation, options = {}) {
5082
- const throwOnReject = options.throwOnReject !== false;
5083
- const begin = assertDateTimeMinute(input.beginDatetime, "begin_datetime");
5084
- const end = assertDateTimeMinute(input.endDatetime, "end_datetime");
5085
- const warnings = [];
5086
- const policy = options.settings ?? await fetchEbAppSettings(env, operation);
5087
- const outcome = { warnings, policy };
5088
- if (policy.error) {
5089
- warnings.push(
5090
- `\u5E94\u7528\u8BBE\u7F6E\uFF08query_meeting_baseset\uFF09\u8BFB\u53D6\u5931\u8D25\uFF0C\u51B2\u7A81\u7B56\u7565\u6309\u300C\u5F00\u542F\u68C0\u6D4B + \u4EC5\u63D0\u9192\u300D\u5904\u7406\uFF1A${policy.error}`
5091
- );
5092
- }
5093
- const handleHit = (action, message, details) => {
5094
- if (action === "1") {
5095
- const text = `${message}\uFF1B\u5E94\u7528\u8BBE\u7F6E\u7981\u6B62\u63D0\u4EA4\uFF08action=1\uFF09\uFF0C\u5DF2\u62D2\u7EDD\uFF0C\u8BF7\u66F4\u6362\u65F6\u95F4\u6216\u5730\u70B9\u540E\u91CD\u8BD5`;
5096
- if (throwOnReject) throw meetingConflictError("conflict_rejected", text, details);
5097
- warnings.push(text);
5098
- return;
5099
- }
5100
- warnings.push(
5101
- `${message}\uFF1B\u5E94\u7528\u8BBE\u7F6E\u4EC5\u63D0\u9192\uFF08action=0\uFF09\uFF1A\u672C\u6B21\u4E0D\u963B\u6B62\u63D0\u4EA4\uFF0C\u8BF7\u5982\u5B9E\u544A\u77E5\u7528\u6237\u8BE5\u51B2\u7A81\u5E76\u5EFA\u8BAE\u66F4\u6362\u65F6\u95F4\u6216\u5730\u70B9\uFF0C\u7531\u7528\u6237\u51B3\u5B9A\u662F\u5426\u7EE7\u7EED\uFF08\u4E0D\u8981\u4E3B\u52A8\u5EFA\u8BAE\u5FFD\u7565\u51B2\u7A81\uFF0C\u4E5F\u4E0D\u8981\u66FF\u7528\u6237\u505A\u51B3\u5B9A\uFF09`
5102
- );
5103
- };
5104
- if (input.address) {
5105
- if (policy.roomChk === "0") {
5106
- outcome.room = { skipped: true, hasConflict: false, conflicts: [], requests: 0 };
5107
- warnings.push("\u5E94\u7528\u8BBE\u7F6E room_conflict_chk=0\uFF08\u5173\u95ED\uFF09\uFF0C\u5DF2\u8DF3\u8FC7\u4F1A\u8BAE\u5BA4\u51B2\u7A81\u68C0\u6D4B");
5108
- } else {
5109
- let result;
5110
- try {
5111
- result = await checkRoomConflict(input.address, begin, end, input.excludeMtId, env, operation);
5112
- } catch (error) {
5113
- throw meetingConflictError(
5114
- "conflict_check_failed",
5115
- `\u4F1A\u8BAE\u5BA4\u51B2\u7A81\u68C0\u6D4B\u5931\u8D25\uFF08\u89C6\u4E3A\u51B2\u7A81\uFF0C\u62D2\u7EDD\u5EFA\u4F1A\uFF09\uFF1A${errorText(error)}`
5116
- );
5117
- }
5118
- const hasConflict = result.conflicts.length > 0;
5119
- outcome.room = { skipped: false, hasConflict, conflicts: result.conflicts, requests: result.requests };
5120
- if (hasConflict) {
5121
- const detail = result.conflicts.map((item) => `${item.mtId}${item.begin ? `(${item.begin}~${item.end})` : ""}`).join("\u3001");
5122
- handleHit(
5123
- policy.roomAction,
5124
- `\u4F1A\u8BAE\u5BA4\u51B2\u7A81\uFF1A\u4F1A\u8BAE\u5BA4 ${input.address} \u5728 ${begin} ~ ${end} \u5DF2\u88AB\u5360\u7528\uFF08\u5360\u7528\u4F1A\u8BAE ${detail}\uFF09`,
5125
- { address: input.address, conflicts: result.conflicts, policy: policy.roomAction }
5126
- );
5127
- }
5128
- }
5129
- }
5130
- const members = toIdCsv(input.hrmMembers, "hrm_members");
5131
- if (policy.memberChk === "0") {
5132
- outcome.member = {
5133
- skipped: true,
5134
- hasConflict: false,
5135
- conflicts: [],
5136
- listCalls: 0,
5137
- receiptCalls: 0,
5138
- candidates: 0,
5139
- receipts: 0
5140
- };
5141
- warnings.push("\u5E94\u7528\u8BBE\u7F6E member_conflict_chk=0\uFF08\u5173\u95ED\uFF09\uFF0C\u5DF2\u8DF3\u8FC7\u53C2\u4F1A\u4EBA\u5458\u51B2\u7A81\u68C0\u6D4B");
5142
- } else if (members) {
5143
- let result;
5144
- try {
5145
- result = await collectMemberConflicts(members.split(","), begin, end, input.excludeMtId, env, operation);
5146
- } catch (error) {
5147
- throw meetingConflictError(
5148
- "conflict_check_failed",
5149
- `\u53C2\u4F1A\u4EBA\u5458\u51B2\u7A81\u68C0\u6D4B\u5931\u8D25\uFF08\u89C6\u4E3A\u51B2\u7A81\uFF0C\u62D2\u7EDD\u5EFA\u4F1A\uFF09\uFF1A${errorText(error)}`
5150
- );
5151
- }
5152
- const hasConflict = result.conflicts.length > 0;
5153
- outcome.member = {
5154
- skipped: false,
5155
- hasConflict,
5156
- conflicts: result.conflicts,
5157
- listCalls: result.listCalls,
5158
- receiptCalls: result.receiptCalls,
5159
- candidates: result.candidates,
5160
- receipts: result.receipts
5161
- };
5162
- if (hasConflict) {
5163
- const detail = result.conflicts.map((item) => `${item.name || item.meetingId}(${item.begin}~${item.end}) \u51B2\u7A81\u4EBA ${item.conflictedMembers.join(",")}`).join("\uFF1B");
5164
- handleHit(
5165
- policy.memberAction,
5166
- `\u53C2\u4F1A\u4EBA\u5458\u51B2\u7A81\uFF1A${result.conflicts.length} \u573A\u4F1A\u8BAE\u4E0E\u672C\u6B21\u53C2\u4F1A\u4EBA\u65F6\u95F4\u91CD\u53E0 \u2014\u2014 ${detail}`,
5167
- { conflicts: result.conflicts, policy: policy.memberAction }
5168
- );
5169
- }
5170
- if (input.orgMembers) {
5171
- warnings.push(
5172
- "org_members\uFF08\u53C2\u4F1A\u90E8\u95E8\uFF09\u672A\u5C55\u5F00\u4E3A\u5458\u5DE5\u540D\u5355\uFF0C\u672C\u6B21\u4EBA\u5458\u51B2\u7A81\u68C0\u6D4B\u4EC5\u8986\u76D6 hrm_members \u663E\u5F0F\u6307\u5B9A\u7684\u4EBA\u5458"
5173
- );
5174
- }
5175
- } else if (input.orgMembers) {
5176
- warnings.push(
5177
- "\u4EC5\u63D0\u4F9B org_members\uFF08\u53C2\u4F1A\u90E8\u95E8\uFF09\u800C\u672A\u63D0\u4F9B hrm_members\uFF1ACLI \u4E0D\u5C55\u5F00\u90E8\u95E8\u6210\u5458\uFF0C\u5DF2\u8DF3\u8FC7\u53C2\u4F1A\u4EBA\u5458\u51B2\u7A81\u68C0\u6D4B"
5178
- );
5179
- }
5180
- return outcome;
5181
- }
5182
- var ebMeetingWritePreflight = async ({ endpoint, payload, args, env, extras }) => {
5183
- const isCreate = endpoint.interfacePk === "create_meeting";
5184
- const isChange = endpoint.interfacePk === "change_meeting";
5185
- if (!isCreate && !isChange) return [];
5186
- const operation = isChange ? "meeting.eb.meeting.change.prepare" : "meeting.eb.meeting.create.prepare";
5187
- const main = payload.mainTable;
5188
- const begin = typeof main.begin_datetime === "string" ? main.begin_datetime : "";
5189
- const end = typeof main.end_datetime === "string" ? main.end_datetime : "";
5190
- const address = typeof main.address === "string" && main.address ? main.address : void 0;
5191
- const hrmMembers = typeof main.hrm_members === "string" && main.hrm_members ? main.hrm_members : void 0;
5192
- const settings = isCreate || address || hrmMembers ? await fetchEbAppSettings(env, operation) : void 0;
5193
- const preflightWarnings = [];
5194
- if (settings && isCreate) {
5195
- assertEbCreatePathAllowed(settings);
5196
- if ((settings.settingsRows ?? 0) > 1) {
5197
- preflightWarnings.push(
5198
- `\u4F1A\u8BAE\u5E94\u7528\u8BBE\u7F6E\u5B58\u5728 ${settings.settingsRows} \u6761\u8BB0\u5F55\uFF0C\u672C\u6B21\u6309\u6700\u65B0\u4E00\u6761\uFF08id=${settings.settingsId ?? "\u672A\u77E5"}\uFF0C\u66F4\u65B0\u4E8E ${settings.settingsUpdatedAt || "\u672A\u77E5"}\uFF09\u5224\u65AD\u5EFA\u4F1A\u8DEF\u5F84\u4E0E\u51B2\u7A81\u7B56\u7565\uFF1B\u5982\u9700\u4EE5\u53E6\u4E00\u6761\u4E3A\u51C6\uFF0C\u8BF7\u5148\u5728\u7CFB\u7EDF\u9875\u9762\u6E05\u7406\u91CD\u590D\u7684\u8BBE\u7F6E\u8BB0\u5F55\u3002`
5199
- );
5200
- }
5201
- }
5202
- if (!begin || !end) return preflightWarnings;
5203
- if (!address && !hrmMembers) return preflightWarnings;
5204
- const outcome = await runEbConflictCheck(
5205
- {
5206
- beginDatetime: begin,
5207
- endDatetime: end,
5208
- ...address ? { address } : {},
5209
- ...hrmMembers ? { hrmMembers } : {},
5210
- ...typeof main.org_members === "string" && main.org_members ? { orgMembers: main.org_members } : {},
5211
- ...typeof args.id === "string" || typeof args.id === "number" ? { excludeMtId: String(args.id) } : {}
5212
- },
5213
- env,
5214
- operation,
5215
- settings ? { settings } : {}
5216
- );
5217
- const extraWarnings = [];
5218
- if (outcome.member && outcome.member.conflicts.length > 0) {
5219
- extras.memberConflicts = outcome.member.conflicts;
5220
- if (begin && end && hrmMembers) {
5221
- try {
5222
- const durationMinutes = Math.max(15, Math.round((Date.parse(end.replace(" ", "T")) - Date.parse(begin.replace(" ", "T"))) / 6e4) || 60);
5223
- const day = begin.slice(0, 10);
5224
- const free = await findCommonFreeSlots(env, {
5225
- rangeStart: `${day} 00:00`,
5226
- rangeEnd: `${day} 23:59`,
5227
- durationMinutes,
5228
- members: hrmMembers.split(/[,;,;\s]+/).map((item) => item.trim()).filter((item) => item !== ""),
5229
- ...typeof args.id === "string" || typeof args.id === "number" ? { excludeMtId: String(args.id) } : {},
5230
- maxSlots: 3,
5231
- maxDays: 1,
5232
- includeSchedule: true
5233
- });
5234
- if (free.slots.length > 0) {
5235
- extras.suggestedSlots = free.slots;
5236
- extras.slotOptions = free.slots.map((slot, index) => ({
5237
- key: `T${index + 1}`,
5238
- // 选项里必须写清"为什么推荐这个时段",否则用户看到的只是两个时间点(2026-10-28 用户反馈)
5239
- label: `${slot.begin.slice(11)}~${slot.end.slice(11)}\uFF08${day}\uFF09 \xB7 \u5168\u90E8\u53C2\u4F1A\u4EBA\u7A7A\u95F2`,
5240
- value: { begin: slot.begin, end: slot.end },
5241
- reason: "\u8BE5\u65F6\u6BB5\u6240\u6709\u53C2\u4F1A\u4EBA\u90FD\u6CA1\u6709\u4F1A\u8BAE\u4E0E\u65E5\u7A0B\u5360\u7528"
5242
- }));
5243
- extraWarnings.push(
5244
- `\u5F53\u5929\uFF08${day}\uFF09\u63A8\u8350\u6539\u671F\u5230\uFF1A${free.slots.map((slot, index) => `[T${index + 1}] ${slot.begin.slice(11)}~${slot.end.slice(11)}`).join("\uFF1B")}\uFF08\u5DF2\u540C\u65F6\u6838\u5BF9\u4F1A\u8BAE\u56DE\u6267\u4E0E\u65E5\u7A0B\uFF09\u2014\u2014\u8BF7\u7528\u9009\u9879\u65B9\u5F0F\u8BA9\u7528\u6237\u6311\u4E00\u4E2A\u3002`
5245
- );
5246
- } else if (free.blockingSummary) {
5247
- extraWarnings.push(free.blockingSummary);
5248
- extras.dayBlocked = { day, summary: free.blockingSummary };
5249
- }
5250
- extras.scheduleItems = free.scheduleItems;
5251
- extras.busyByMember = free.busyByMember;
5252
- extras.availabilityCost = free.cost;
5253
- } catch (error) {
5254
- extraWarnings.push(`\u5171\u540C\u7A7A\u95F2\u65F6\u6BB5\u8BA1\u7B97\u5931\u8D25\uFF08${String(error?.message ?? error).slice(0, 80)}\uFF09\uFF0C\u8BF7\u624B\u52A8\u6362\u65F6\u95F4`);
5255
- }
5256
- }
5257
- }
5258
- return [...preflightWarnings, ...outcome.warnings, ...extraWarnings];
5259
- };
5260
- var ebConflictRoom = {
5261
- name: "meeting.eb.conflict.room",
4932
+ var TYPES = Object.keys(MEETING_EB_TAGS);
4933
+ var meetingFormFields = {
4934
+ name: "meeting.form.fields",
5262
4935
  resource: "eb",
5263
- method: "meeting.eb.conflict.room",
5264
- action: "meeting.eb.conflict.room",
5265
- summary: "EB \u7248\u4F1A\u8BAE\u5BA4\u51B2\u7A81\u68C0\u6D4B\uFF08query_roomusage_list \u67E5\u8BE5\u4F1A\u8BAE\u5BA4\u65F6\u6BB5\u5185\u5360\u7528\uFF09\uFF1A\u6309\u5E94\u7528\u8BBE\u7F6E room_conflict_chk/room_conflict \u7ED9\u51FA verdict",
5266
- capability: "eb.conflict",
4936
+ method: "meeting.form.fields",
4937
+ action: "meeting.form.fields",
4938
+ summary: "\u8BFB\u53D6\u4F1A\u8BAE\u8868\u5355\u7684\u771F\u5B9E\u5B57\u6BB5\u6E05\u5355\uFF08\u4E2D\u6587\u540D / dataKey / \u5B57\u6BB5 id / \u7EC4\u4EF6\u7C7B\u578B / \u662F\u5426\u591A\u9009\uFF09\uFF0C\u4F9B extraFields \u6309\u771F\u5B9E\u5B57\u6BB5\u540D\u5199\u5165\u79DF\u6237\u81EA\u5B9A\u4E49\u5B57\u6BB5",
4939
+ capability: "eb.meta",
5267
4940
  risk: "read",
5268
4941
  inputSchema: {
5269
4942
  type: "object",
5270
4943
  additionalProperties: false,
5271
4944
  properties: {
5272
- beginDatetime: { ...SCHEMA_DATETIME_MINUTE, description: "\u5F00\u59CB\u65F6\u95F4\uFF08\u5FC5\u586B\uFF0Cyyyy-MM-dd HH:mm\uFF09" },
5273
- endDatetime: { ...SCHEMA_DATETIME_MINUTE, description: "\u7ED3\u675F\u65F6\u95F4\uFF08\u5FC5\u586B\uFF0Cyyyy-MM-dd HH:mm\uFF09" },
5274
- address: { ...SCHEMA_ID, description: "\u4F1A\u8BAE\u5BA4 id\uFF08\u5FC5\u586B\uFF09" },
5275
- mtId: { ...SCHEMA_ID, description: "\u53D8\u66F4\u4F1A\u8BAE\u65F6\u6392\u9664\u81EA\u8EAB" }
5276
- },
5277
- required: ["beginDatetime", "endDatetime", "address"]
5278
- },
5279
- handler: async (args, env) => {
5280
- const outcome = await runEbConflictCheck(
5281
- {
5282
- beginDatetime: args.beginDatetime,
5283
- endDatetime: args.endDatetime,
5284
- address: String(args.address),
5285
- ...args.mtId !== void 0 ? { excludeMtId: String(args.mtId) } : {}
5286
- },
5287
- env,
5288
- "meeting.eb.conflict.room",
5289
- { throwOnReject: false }
5290
- );
5291
- const room = outcome.room ?? { skipped: true, hasConflict: false, conflicts: [], requests: 0 };
5292
- const verdict = room.skipped ? "skipped" : !room.hasConflict ? "ok" : outcome.policy.roomAction === "1" ? "rejected" : "warn";
5293
- return meetingSuccess(
5294
- "meeting.eb.conflict.room",
5295
- {
5296
- verdict,
5297
- hasConflict: room.hasConflict,
5298
- skipped: room.skipped,
5299
- conflicts: room.conflicts,
5300
- policy: { chk: outcome.policy.roomChk, action: outcome.policy.roomAction },
5301
- requests: 1 + room.requests
4945
+ type: {
4946
+ type: "string",
4947
+ enum: TYPES,
4948
+ description: "\u8981\u67E5\u54EA\u5F20\u8868\uFF1Ameeting=\u4F1A\u8BAE\u3001topic=\u8BAE\u9898\u3001minutes=\u7EAA\u8981\u3001room=\u4F1A\u8BAE\u5BA4\u3001sign=\u7B7E\u5230\u3001receipt=\u56DE\u6267\u2026\uFF08\u9ED8\u8BA4 meeting\uFF09"
5302
4949
  },
5303
- outcome.warnings.length > 0 ? { warnings: outcome.warnings } : {}
5304
- );
5305
- }
5306
- };
5307
- var ebConflictMember = {
5308
- name: "meeting.eb.conflict.member",
5309
- resource: "eb",
5310
- method: "meeting.eb.conflict.member",
5311
- action: "meeting.eb.conflict.member",
5312
- summary: "EB \u7248\u53C2\u4F1A\u4EBA\u5458\u51B2\u7A81\u68C0\u6D4B\uFF08query_mtDetail_list \u5019\u9009 \u2192 query_meeting_receipt_list?mt_id=\u591A\u503C\u6279\u91CF \u2192 \u672C\u5730\u6BD4\u5BF9\uFF1B2 \u6B21\u8BF7\u6C42\uFF0C\u65E0 N+1\uFF09\uFF1A\u6309 member_conflict_chk/member_conflict \u7ED9\u51FA verdict",
5313
- capability: "eb.conflict",
5314
- risk: "read",
5315
- inputSchema: {
5316
- type: "object",
5317
- additionalProperties: false,
5318
- properties: {
5319
- beginDatetime: { ...SCHEMA_DATETIME_MINUTE, description: "\u5F00\u59CB\u65F6\u95F4\uFF08\u5FC5\u586B\uFF0Cyyyy-MM-dd HH:mm\uFF09" },
5320
- endDatetime: { ...SCHEMA_DATETIME_MINUTE, description: "\u7ED3\u675F\u65F6\u95F4\uFF08\u5FC5\u586B\uFF0Cyyyy-MM-dd HH:mm\uFF09" },
5321
- hrmMembers: { type: "string", description: "\u53C2\u4F1A\u4EBA\u5458 id\uFF0C\u9017\u53F7\u5206\u9694\u5B57\u7B26\u4E32\uFF08\u5FC5\u586B\uFF09" },
5322
- mtId: { ...SCHEMA_ID, description: "\u53D8\u66F4\u4F1A\u8BAE\u65F6\u6392\u9664\u81EA\u8EAB" }
5323
- },
5324
- required: ["beginDatetime", "endDatetime", "hrmMembers"]
4950
+ keyword: { type: "string", description: "\u53EA\u8FD4\u56DE\u4E2D\u6587\u540D/dataKey \u5305\u542B\u8BE5\u5173\u952E\u8BCD\u7684\u5B57\u6BB5\uFF08\u5982\u300C\u5BA2\u6237\u300D\u300C\u8054\u7CFB\u300D\uFF09" },
4951
+ refresh: { type: "boolean", description: "\u9ED8\u8BA4\u8BFB\u7F13\u5B58\uFF1B\u4F20 true \u5F3A\u5236\u91CD\u65B0\u89E3\u6790\u8868 id \u4E0E\u5B57\u6BB5\u5B9A\u4E49" }
4952
+ }
5325
4953
  },
5326
4954
  handler: async (args, env) => {
5327
- const outcome = await runEbConflictCheck(
5328
- {
5329
- beginDatetime: args.beginDatetime,
5330
- endDatetime: args.endDatetime,
5331
- hrmMembers: String(args.hrmMembers),
5332
- ...args.mtId !== void 0 ? { excludeMtId: String(args.mtId) } : {}
5333
- },
5334
- env,
5335
- "meeting.eb.conflict.member",
5336
- { throwOnReject: false }
5337
- );
5338
- const member = outcome.member ?? {
5339
- skipped: true,
5340
- hasConflict: false,
5341
- conflicts: [],
5342
- listCalls: 0,
5343
- receiptCalls: 0,
5344
- candidates: 0,
5345
- receipts: 0
4955
+ const type = TYPES.includes(args.type) ? args.type : "meeting";
4956
+ const tag = MEETING_EB_TAGS[type];
4957
+ const resolved = await resolveMeetingEbObjs(env.host, env.ctx, {
4958
+ tags: [tag],
4959
+ ...args.refresh === true ? { refresh: true } : {}
4960
+ });
4961
+ const obj = resolved.objs[tag];
4962
+ if (!obj?.objId) {
4963
+ return meetingSuccess("meeting.form.fields", {
4964
+ type,
4965
+ tag,
4966
+ objId: "",
4967
+ fields: [],
4968
+ hint: "\u6CA1\u89E3\u6790\u5230\u8BE5\u8868\u7684 objId\uFF08\u53EF\u80FD\u5F53\u524D\u73AF\u5883\u6CA1\u6709\u8FD9\u5F20\u8868\uFF0C\u6216\u8D26\u53F7\u65E0\u6743\u9650\uFF09"
4969
+ }, { warnings: resolved.warnings });
4970
+ }
4971
+ const { createEbuilderFormHost } = await import("./host-BQBRHVR3.js");
4972
+ const { createEbuilderFormContinuationSigner } = await import("./continuation-RN6PZN2M.js");
4973
+ const { executeEbuilderFormOperation } = await import("./operations-5QL3AECO.js");
4974
+ const formEnv = {
4975
+ ctx: env.ctx,
4976
+ host: createEbuilderFormHost(env.ctx),
4977
+ continuation: createEbuilderFormContinuationSigner(env.ctx)
5346
4978
  };
5347
- const verdict = member.skipped ? "skipped" : !member.hasConflict ? "ok" : outcome.policy.memberAction === "1" ? "rejected" : "warn";
5348
- return meetingSuccess(
5349
- "meeting.eb.conflict.member",
5350
- {
5351
- verdict,
5352
- hasConflict: member.hasConflict,
5353
- skipped: member.skipped,
5354
- conflicts: member.conflicts,
5355
- policy: { chk: outcome.policy.memberChk, action: outcome.policy.memberAction },
5356
- cost: {
5357
- baseSetCalls: 1,
5358
- listCalls: member.listCalls,
5359
- receiptCalls: member.receiptCalls,
5360
- candidates: member.candidates,
5361
- receipts: member.receipts
5362
- }
5363
- },
5364
- outcome.warnings.length > 0 ? { warnings: outcome.warnings } : {}
5365
- );
5366
- }
5367
- };
5368
- function parseMinute(text) {
5369
- const match = /^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2})/.exec(String(text ?? "").trim());
5370
- if (!match) return null;
5371
- return new Date(
5372
- Number(match[1]),
5373
- Number(match[2]) - 1,
5374
- Number(match[3]),
5375
- Number(match[4]),
5376
- Number(match[5]),
5377
- 0,
5378
- 0
5379
- );
5380
- }
5381
- function formatMinute(date) {
5382
- const pad2 = (n) => String(n).padStart(2, "0");
5383
- return `${date.getFullYear()}-${pad2(date.getMonth() + 1)}-${pad2(date.getDate())} ${pad2(date.getHours())}:${pad2(date.getMinutes())}`;
5384
- }
5385
- async function resolveMemberNames(env, ids) {
5386
- const map = /* @__PURE__ */ new Map();
5387
- const unique = [...new Set(ids.filter((id) => id !== ""))];
5388
- if (unique.length === 0) return map;
5389
- try {
5390
- const { hrmEmployeeOperations } = await import("./employee-SAK2QYXX.js");
5391
- const batch = hrmEmployeeOperations.find((operation) => operation.name === "hrm.employee.batch");
5392
- if (!batch) return map;
5393
- const result = await batch.handler({ ids: unique }, env);
5394
- const rows = result?.data?.rows ?? result?.data?.userList ?? [];
5395
- for (const row of rows) {
5396
- const id = String(row.id ?? "").trim();
5397
- const name = String(row.name ?? "").trim();
5398
- if (id && name) map.set(id, name);
5399
- }
5400
- } catch {
5401
- }
5402
- return map;
5403
- }
5404
- async function findCommonFreeSlots(env, input) {
5405
- const members = input.members.map((item) => String(item).trim()).filter((item) => item !== "");
5406
- const wanted = new Set(members);
5407
- const duration = Math.max(15, Math.min(24 * 60, Math.round(input.durationMinutes || 60)));
5408
- const step = Math.max(15, Math.min(120, Math.round(input.stepMinutes ?? 30)));
5409
- const workStart = Math.max(0, Math.min(23, input.workStartHour ?? 9));
5410
- const workEnd = Math.max(workStart + 1, Math.min(24, input.workEndHour ?? 18));
5411
- const maxSlots = Math.max(1, Math.min(20, input.maxSlots ?? 3));
5412
- const maxDays = Math.max(1, Math.min(14, input.maxDays ?? 1));
5413
- const includeSchedule = input.includeSchedule !== false;
5414
- const rangeStart = parseMinute(input.rangeStart);
5415
- const rangeEnd = parseMinute(input.rangeEnd);
5416
- const cost = { candidateCalls: 0, receiptCalls: 0, candidates: 0, busyIntervals: 0, scheduleCalls: 0 };
5417
- const empty = { slots: [], idle: false, cost, scheduleItems: [], busyByMember: [] };
5418
- if (!rangeStart || !rangeEnd) return empty;
5419
- const detail = /* @__PURE__ */ new Map();
5420
- const pushBusy = (memberId, item) => {
5421
- const list = detail.get(memberId) ?? [];
5422
- list.push(item);
5423
- detail.set(memberId, list);
5424
- cost.busyIntervals += 1;
5425
- };
5426
- const candidate = await listAllEbRows(
5427
- env,
5428
- "query_mtDetail_list",
5429
- { begindatetime: input.rangeStart, enddatetime: input.rangeEnd, mt_status: ACTIVE_MT_STATUS },
5430
- "meeting.eb.conflict.availability"
5431
- );
5432
- cost.candidateCalls += candidate.requests;
5433
- const meetings = candidate.rows.map((row) => ({
5434
- id: String(row.id ?? ""),
5435
- name: String(row.mt_name ?? row.name ?? row.mt_name ?? ""),
5436
- begin: parseMinute(String(row.begin_datetime ?? "")),
5437
- end: parseMinute(String(row.end_datetime ?? ""))
5438
- })).filter((item) => item.id && item.id !== (input.excludeMtId ?? "") && item.begin && item.end);
5439
- cost.candidates = meetings.length;
5440
- const byId = new Map(meetings.map((item) => [item.id, item]));
5441
- for (let index = 0; index < meetings.length; index += MT_ID_BATCH) {
5442
- const csv = meetings.slice(index, index + MT_ID_BATCH).map((item) => item.id).join(",");
5443
- const page = await listAllEbRows(env, "query_meeting_receipt_list", { mt_id: csv }, "meeting.eb.conflict.availability");
5444
- cost.receiptCalls += page.requests;
5445
- for (const row of page.rows) {
5446
- const meetingId = String(row.mt_id ?? "");
5447
- const memberId = String(row.member_id ?? "");
5448
- const memberType = String(row.member_type ?? "");
5449
- if (!meetingId || !memberId) continue;
5450
- if (memberType && memberType !== "1") continue;
5451
- if (!wanted.has(memberId)) continue;
5452
- const meeting = byId.get(meetingId);
5453
- if (!meeting?.begin || !meeting?.end) continue;
5454
- pushBusy(memberId, {
5455
- source: "meeting",
5456
- title: meeting.name || "\u4F1A\u8BAE",
5457
- begin: formatMinute(meeting.begin),
5458
- end: formatMinute(meeting.end)
5459
- });
5460
- }
5461
- }
5462
- const scheduleItems = [];
5463
- if (includeSchedule) {
5464
- try {
5465
- const { runScheduleConflictFlow, parseScheduleConflictMessage, resolveMemberIdsByName } = await import("./schedule-KFIITGSK.js");
5466
- const dayBegin = new Date(rangeStart.getFullYear(), rangeStart.getMonth(), rangeStart.getDate(), 0, 0, 0, 0);
5467
- const dayEnd = new Date(rangeStart.getFullYear(), rangeStart.getMonth(), rangeStart.getDate(), 23, 59, 0, 0);
5468
- const flow = await runScheduleConflictFlow(env, {
5469
- startDate: formatMinute(dayBegin),
5470
- endDate: formatMinute(dayEnd),
5471
- memberIds: members
5472
- });
5473
- cost.scheduleCalls += 1;
5474
- const rawItems = [];
5475
- for (const row of flow.rows) {
5476
- const main = row?.mainTable ?? row ?? {};
5477
- const type = main.agn_type;
5478
- const typeId = Array.isArray(type) ? String(type[0]?.id ?? "") : String(type?.id ?? type ?? "");
5479
- void typeId;
5480
- rawItems.push({
5481
- title: String(main.agn_name ?? main.name ?? "").trim() || "\u65E5\u7A0B",
5482
- begin: String(main.start_time ?? "").trim(),
5483
- end: String(main.end_time ?? "").trim(),
5484
- names: String(main.participants ?? "").split(/[,;,;\s]+/).map((item) => item.trim()).filter((item) => item !== "")
5485
- });
5486
- }
5487
- if (rawItems.length === 0) {
5488
- for (const item of parseScheduleConflictMessage(flow.message)) {
5489
- rawItems.push({ title: item.title, begin: item.startTime, end: item.endTime, names: item.memberNames });
5490
- }
5491
- }
5492
- const idsByName = await resolveMemberIdsByName(env, rawItems.flatMap((item) => item.names));
5493
- const datePrefix = `${rangeStart.getFullYear()}-${String(rangeStart.getMonth() + 1).padStart(2, "0")}-${String(rangeStart.getDate()).padStart(2, "0")}`;
5494
- for (const item of rawItems) {
5495
- const beginText = item.begin.includes("-") ? item.begin : `${datePrefix} ${item.begin}`;
5496
- const endText = item.end.includes("-") ? item.end : `${datePrefix} ${item.end}`;
5497
- const beginDate = parseMinute(beginText);
5498
- const endDate = parseMinute(endText);
5499
- if (!beginDate || !endDate) continue;
5500
- const memberIds = item.names.map((name) => idsByName.get(name) ?? "").filter((id) => id !== "");
5501
- scheduleItems.push({ title: item.title, begin: beginText, end: endText, members: memberIds.length > 0 ? memberIds : item.names });
5502
- for (const memberId of memberIds) {
5503
- if (!wanted.has(memberId)) continue;
5504
- pushBusy(memberId, { source: "schedule", title: item.title, begin: beginText, end: endText });
5505
- }
4979
+ const raw = await executeEbuilderFormOperation("ebuilder-form.fields.get", { objId: obj.objId }, formEnv);
4980
+ const nodes = Array.isArray(raw?.data?.result?.data) ? raw.data.result.data : [];
4981
+ const rows = [];
4982
+ const detailTables = [];
4983
+ for (const node of nodes) {
4984
+ const fields = Array.isArray(node?.fields) ? node.fields : [];
4985
+ if (fields.length === 0 && textOf6(node?.name)) {
4986
+ detailTables.push(textOf6(node.name));
4987
+ continue;
5506
4988
  }
5507
- } catch {
5508
- }
5509
- }
5510
- const names = await resolveMemberNames(env, [...detail.keys()]);
5511
- const busyByMember = [...detail.entries()].map(([memberId, items]) => ({
5512
- memberId,
5513
- ...names.get(memberId) ? { memberName: names.get(memberId) } : {},
5514
- items: items.sort((left, right) => left.begin.localeCompare(right.begin))
5515
- }));
5516
- const overlaps = (slotStart, slotEnd) => {
5517
- for (const entry of busyByMember) {
5518
- for (const item of entry.items) {
5519
- const begin = parseMinute(item.begin);
5520
- const end = parseMinute(item.end);
5521
- if (!begin || !end) continue;
5522
- if (slotStart < end && slotEnd > begin) return true;
4989
+ for (const field of fields) {
4990
+ const config = field?.config ?? {};
4991
+ const dataKey = textOf6(config.dataKey || config.columnName || field.physicalField);
4992
+ rows.push({
4993
+ dataKey,
4994
+ fieldId: textOf6(field.name || field.id),
4995
+ label: textOf6(field.text || config.title),
4996
+ compType: textOf6(field.compType || config.componentKey),
4997
+ type: textOf6(field.type || config.type),
4998
+ multiSelect: String(field.multiSelect ?? "false") === "true"
4999
+ });
5523
5000
  }
5524
5001
  }
5525
- return false;
5526
- };
5527
- const now = /* @__PURE__ */ new Date();
5528
- const slots = [];
5529
- const dayCount = Math.min(maxDays, Math.ceil((rangeEnd.getTime() - rangeStart.getTime()) / 864e5) + 1);
5530
- for (let day = 0; day < dayCount && slots.length < maxSlots; day += 1) {
5531
- const dayStart = new Date(rangeStart.getFullYear(), rangeStart.getMonth(), rangeStart.getDate() + day, workStart, 0, 0, 0);
5532
- const dayLimit = new Date(rangeStart.getFullYear(), rangeStart.getMonth(), rangeStart.getDate() + day, workEnd, 0, 0, 0);
5533
- for (let cursor = new Date(dayStart); cursor.getTime() + duration * 6e4 <= dayLimit.getTime(); cursor = new Date(cursor.getTime() + step * 6e4)) {
5534
- const slotStart = new Date(cursor);
5535
- const slotEnd = new Date(cursor.getTime() + duration * 6e4);
5536
- if (slotStart.getTime() < now.getTime() + 5 * 6e4) continue;
5537
- if (slotStart < rangeStart || slotEnd > rangeEnd) continue;
5538
- if (overlaps(slotStart, slotEnd)) continue;
5539
- slots.push({ begin: formatMinute(slotStart), end: formatMinute(slotEnd) });
5540
- if (slots.length >= maxSlots) break;
5541
- }
5542
- }
5543
- let blockingSummary;
5544
- if (slots.length === 0) {
5545
- const day = `${rangeStart.getFullYear()}-${String(rangeStart.getMonth() + 1).padStart(2, "0")}-${String(rangeStart.getDate()).padStart(2, "0")}`;
5546
- const perMember = busyByMember.map((entry) => {
5547
- const items = entry.items.slice(0, 3).map((item) => `${item.source === "meeting" ? "\u4F1A\u8BAE" : "\u65E5\u7A0B"}\u300A${item.title}\u300B${item.begin.slice(11)}~${item.end.slice(11)}`).join("\u3001");
5548
- const more = entry.items.length > 3 ? ` \u7B49 ${entry.items.length} \u9879` : "";
5549
- return `${entry.memberName ?? entry.memberId}\uFF1A${items}${more}`;
5550
- });
5551
- blockingSummary = perMember.length > 0 ? `${day} \u5F53\u5929 ${workStart}:00-${workEnd}:00 \u5185\u6CA1\u6709\u6240\u6709\u4EBA\u90FD\u7A7A\u95F2\u7684 ${duration} \u5206\u949F\u65F6\u6BB5\uFF08\u5DF2\u540C\u65F6\u6838\u5BF9\u4F1A\u8BAE\u56DE\u6267\u4E0E\u65E5\u7A0B\uFF09\u2014\u2014${perMember.join("\uFF1B")}` : `${day} \u5F53\u5929 ${workStart}:00-${workEnd}:00 \u5185\u6CA1\u6709\u627E\u5230\u7B26\u5408\u6761\u4EF6\u7684 ${duration} \u5206\u949F\u65F6\u6BB5\uFF0C\u5EFA\u8BAE\u6362\u4E2A\u65E5\u671F\u6216\u7F29\u77ED\u65F6\u957F`;
5552
- }
5553
- return {
5554
- slots,
5555
- idle: cost.busyIntervals === 0,
5556
- cost,
5557
- scheduleItems,
5558
- busyByMember,
5559
- ...blockingSummary ? { blockingSummary } : {}
5560
- };
5561
- }
5562
- var ebConflictAvailability = {
5563
- name: "meeting.eb.conflict.availability",
5564
- resource: "eb",
5565
- method: "meeting.eb.conflict.availability",
5566
- action: "meeting.eb.conflict.availability",
5567
- summary: "\u53C2\u4F1A\u4EBA\u5171\u540C\u7A7A\u95F2\u65F6\u6BB5\u63A8\u8350\uFF08\u4F1A\u8BAE\u7EF4\u5EA6\uFF09\uFF1A\u4E00\u6B21\u62C9\u5019\u9009\u4F1A\u8BAE + \u6279\u91CF\u56DE\u6267\uFF0C\u5185\u5B58\u5207 30 \u5206\u949F slot\uFF0C\u7ED9\u51FA\u6240\u6709\u4EBA\u90FD\u7A7A\u95F2\u7684\u65F6\u95F4\u6BB5\uFF08\u9ED8\u8BA4\u6700\u591A 3 \u4E2A\uFF0C\u5F80\u540E 7 \u5929\uFF09",
5568
- capability: "eb.conflict",
5569
- risk: "read",
5570
- inputSchema: {
5571
- type: "object",
5572
- additionalProperties: false,
5573
- properties: {
5574
- rangeStart: { ...SCHEMA_DATETIME_MINUTE, description: "\u641C\u7D22\u8303\u56F4\u5F00\u59CB\uFF08\u5FC5\u586B\uFF0Cyyyy-MM-dd HH:mm\uFF09" },
5575
- rangeEnd: { ...SCHEMA_DATETIME_MINUTE, description: "\u641C\u7D22\u8303\u56F4\u7ED3\u675F\uFF08\u5FC5\u586B\uFF0Cyyyy-MM-dd HH:mm\uFF09" },
5576
- durationMinutes: { type: "number", description: "\u4F1A\u8BAE\u65F6\u957F\uFF08\u5206\u949F\uFF0C\u9ED8\u8BA4 60\uFF09" },
5577
- hrmMembers: { type: "string", description: "\u53C2\u4F1A\u4EBA id\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u5FC5\u586B\uFF09" },
5578
- mtId: { ...SCHEMA_ID, description: "\u53D8\u66F4\u4F1A\u8BAE\u65F6\u6392\u9664\u81EA\u8EAB" },
5579
- workStartHour: { type: "number", description: "\u5DE5\u4F5C\u65F6\u6BB5\u8D77\u59CB\u5C0F\u65F6\uFF08\u9ED8\u8BA4 9\uFF09" },
5580
- workEndHour: { type: "number", description: "\u5DE5\u4F5C\u65F6\u6BB5\u7ED3\u675F\u5C0F\u65F6\uFF08\u9ED8\u8BA4 18\uFF09" },
5581
- stepMinutes: { type: "number", description: "\u5019\u9009\u6B65\u957F\uFF08\u5206\u949F\uFF0C\u9ED8\u8BA4 30\uFF09" },
5582
- maxSlots: { type: "number", description: "\u8FD4\u56DE\u51E0\u4E2A\u65F6\u6BB5\uFF08\u9ED8\u8BA4 3\uFF0C\u6700\u591A 20\uFF09" },
5583
- maxDays: { type: "number", description: '\u5F80\u540E\u627E\u51E0\u5929\uFF08\u9ED8\u8BA4 1 = \u53EA\u627E\u5F53\u5929\uFF0C\u7B26\u5408"\u7EA6\u7684\u662F\u54EA\u5929\u5C31\u63A8\u8350\u54EA\u5929"\uFF09' },
5584
- includeSchedule: { type: "boolean", description: "\u662F\u5426\u540C\u65F6\u6838\u5BF9\u65E5\u7A0B\uFF08ESB\uFF09\uFF0C\u9ED8\u8BA4 true" }
5585
- },
5586
- required: ["rangeStart", "rangeEnd", "hrmMembers"]
5587
- },
5588
- handler: async (args, env) => {
5589
- const members = String(args.hrmMembers ?? "").split(/[,;,;\s]+/).map((item) => item.trim()).filter((item) => item !== "");
5590
- if (members.length === 0) {
5591
- throw meetingValidationError("members_required", "hrmMembers \u4E0D\u80FD\u4E3A\u7A7A");
5592
- }
5593
- const result = await findCommonFreeSlots(env, {
5594
- rangeStart: String(args.rangeStart),
5595
- rangeEnd: String(args.rangeEnd),
5596
- durationMinutes: Number(args.durationMinutes ?? 60),
5597
- members,
5598
- ...args.mtId ? { excludeMtId: String(args.mtId) } : {},
5599
- ...args.workStartHour !== void 0 ? { workStartHour: Number(args.workStartHour) } : {},
5600
- ...args.workEndHour !== void 0 ? { workEndHour: Number(args.workEndHour) } : {},
5601
- ...args.stepMinutes !== void 0 ? { stepMinutes: Number(args.stepMinutes) } : {},
5602
- ...args.maxSlots !== void 0 ? { maxSlots: Number(args.maxSlots) } : {},
5603
- ...args.maxDays !== void 0 ? { maxDays: Number(args.maxDays) } : {},
5604
- ...args.includeSchedule !== void 0 ? { includeSchedule: args.includeSchedule !== false } : {}
5605
- });
5606
- return meetingSuccess("meeting.eb.conflict.availability", {
5607
- slots: result.slots,
5608
- idle: result.idle,
5609
- members,
5610
- scheduleItems: result.scheduleItems,
5611
- busyByMember: result.busyByMember,
5612
- ...result.blockingSummary ? { blockingSummary: result.blockingSummary } : {},
5613
- cost: result.cost
5614
- }, result.slots.length === 0 ? { warnings: [result.blockingSummary ?? "\u8303\u56F4\u5185\u6CA1\u6709\u627E\u5230\u6240\u6709\u4EBA\u90FD\u7A7A\u95F2\u7684\u65F6\u6BB5\uFF0C\u5EFA\u8BAE\u6362\u4E2A\u65E5\u671F\u6216\u7F29\u77ED\u65F6\u957F"] } : {});
5002
+ const keyword = textOf6(args.keyword).trim();
5003
+ const matched = keyword ? rows.filter((row) => row.label.includes(keyword) || row.dataKey.includes(keyword) || row.fieldId.includes(keyword)) : rows;
5004
+ return meetingSuccess("meeting.form.fields", {
5005
+ type,
5006
+ tag,
5007
+ objId: obj.objId,
5008
+ tableName: obj.tableName,
5009
+ total: matched.length,
5010
+ fields: matched,
5011
+ detailTables,
5012
+ hint: keyword && matched.length === 0 ? `\u6CA1\u6709\u5339\u914D\u300C${keyword}\u300D\u7684\u5B57\u6BB5 \u2014\u2014 \u8FD9\u5F20\u8868\u91CC\u786E\u5B9E\u6CA1\u6709\u8BE5\u5B57\u6BB5\uFF0C\u4E0D\u8981\u786C\u586B\uFF08\u786C\u586B\u4F1A\u88AB\u670D\u52A1\u7AEF\u9759\u9ED8\u4E22\u5F03\uFF09` : "\u5199\u4F1A\u8BAE\u5B57\u6BB5\u7528 dataKey\uFF08extraFields\uFF09\uFF1B\u5199\u5EFA\u4F1A\u6D41\u7A0B\u8868\u5355\u7528 label\uFF08\u4E2D\u6587\u540D\uFF09"
5013
+ }, { warnings: resolved.warnings });
5615
5014
  }
5616
5015
  };
5617
- var meetingEbConflictOperations = [ebConflictRoom, ebConflictMember, ebConflictAvailability];
5016
+ var meetingFormFieldOperations = [meetingFormFields];
5618
5017
 
5619
5018
  // src/shortcuts/meeting/operations/eb/decision.ts
5620
5019
  var CONTINUATION_TTL_SECONDS6 = 600;
@@ -5629,7 +5028,7 @@ var MT_STATUS_OVER = "8";
5629
5028
  var CANCELLED_MARK_DELAY_MS = 800;
5630
5029
  async function isCancelledMeeting(env, mtId) {
5631
5030
  try {
5632
- const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-TI3CIUXF.js");
5031
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
5633
5032
  const listed = await getMeetingOperation2("meeting.eb.meeting.list").handler(
5634
5033
  // withCount:false —— 这里只要一行状态,不必额外请求 count(少一次往返,也便于测试替身)
5635
5034
  { mt_id: mtId, pageNo: 1, pageSize: 1, withCount: false },
@@ -6055,7 +5454,7 @@ function splitIds(value) {
6055
5454
  }
6056
5455
  return [...seen];
6057
5456
  }
6058
- function errorText2(error) {
5457
+ function errorText(error) {
6059
5458
  return error instanceof Error ? error.message : String(error);
6060
5459
  }
6061
5460
  async function writeOne(env, interfacePk, args) {
@@ -6074,7 +5473,7 @@ async function writeOne(env, interfacePk, args) {
6074
5473
  }
6075
5474
  return { ok: true };
6076
5475
  } catch (error) {
6077
- return { ok: false, error: `${interfacePk}: ${errorText2(error)}` };
5476
+ return { ok: false, error: `${interfacePk}: ${errorText(error)}` };
6078
5477
  }
6079
5478
  }
6080
5479
  var ebMeetingAssociation = async (ctx) => {
@@ -6169,9 +5568,9 @@ function workflowEnv(env) {
6169
5568
  return env;
6170
5569
  }
6171
5570
  async function loadCreateForm(env, workflowId) {
6172
- const { createWorkflowHost } = await import("./host-OCH2BCCV.js");
5571
+ const { createWorkflowHost } = await import("./host-VQ6JJXGQ.js");
6173
5572
  const { createWorkflowContinuationSigner } = await import("./continuation-HZIZRZBX.js");
6174
- const { getWorkflowOperation } = await import("./registry-7C5UMIPL.js");
5573
+ const { getWorkflowOperation } = await import("./registry-VOGKFFTR.js");
6175
5574
  const wfEnv = {
6176
5575
  ...workflowEnv(env),
6177
5576
  host: createWorkflowHost(env.ctx),
@@ -6218,7 +5617,7 @@ async function resolveEmployeeNames(env, ids) {
6218
5617
  async function resolveRoomValue(env, input) {
6219
5618
  const text = String(input ?? "").trim();
6220
5619
  if (!text) return null;
6221
- const { loadRooms } = await import("./room-recommend-WRTHO6Y2.js");
5620
+ const { loadRooms } = await import("./room-recommend-D4EUOOWY.js");
6222
5621
  try {
6223
5622
  const { rooms } = await loadRooms(env, {});
6224
5623
  const byId = rooms.find((room) => room.id === text);
@@ -6229,7 +5628,7 @@ async function resolveRoomValue(env, input) {
6229
5628
  }
6230
5629
  if (/^\d+$/.test(text)) {
6231
5630
  try {
6232
- const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-TI3CIUXF.js");
5631
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
6233
5632
  const detail = await getMeetingOperation2("meeting.eb.room.detail").handler({ id: text }, env);
6234
5633
  const main = detail?.data?.mainTable ?? detail?.data?.data?.mainTable ?? {};
6235
5634
  const name = String(main.room_name ?? "").trim();
@@ -6284,7 +5683,7 @@ function mapFields(fields, values) {
6284
5683
  const unmapped = [];
6285
5684
  for (const [key, raw] of Object.entries(values)) {
6286
5685
  if (raw === void 0 || raw === null || raw === "") continue;
6287
- const aliases = FIELD_ALIASES[key] ?? [];
5686
+ const aliases = FIELD_ALIASES[key] ?? [key];
6288
5687
  const hit = aliases.map((name) => byName.get(name)).find((field) => field !== void 0);
6289
5688
  if (!hit) {
6290
5689
  unmapped.push(key);
@@ -6295,9 +5694,30 @@ function mapFields(fields, values) {
6295
5694
  }
6296
5695
  return { main, mapped, unmapped };
6297
5696
  }
5697
+ function normalizeWorkflowIds(raw) {
5698
+ if (raw === void 0 || raw === null) return [];
5699
+ const list = Array.isArray(raw) ? raw : [raw];
5700
+ const ids = [];
5701
+ for (const item of list) {
5702
+ for (const piece of String(item ?? "").split(/[,;,;\s]+/)) {
5703
+ const term = piece.trim();
5704
+ if (!term) continue;
5705
+ const matched = term.match(/[((](\d{6,})[))]$/);
5706
+ const id = matched ? matched[1] : term;
5707
+ if (!ids.includes(id)) ids.push(id);
5708
+ }
5709
+ }
5710
+ return ids;
5711
+ }
6298
5712
  async function resolveWorkflowId(env, args) {
6299
- const explicit = String(args.workflowId ?? "").trim();
6300
- if (explicit) return { workflowId: explicit, candidates: [explicit] };
5713
+ const explicitList = normalizeWorkflowIds(args.workflowId);
5714
+ if (explicitList.length > 0) {
5715
+ return {
5716
+ workflowId: explicitList.length === 1 ? explicitList[0] : "",
5717
+ candidates: explicitList,
5718
+ source: "argument"
5719
+ };
5720
+ }
6301
5721
  const settings = await fetchEbAppSettings(env, "meeting.eb.meeting.create.flow.prepare");
6302
5722
  const candidates = String(settings.mtNewWf ?? "").split(/[,;,;\s]+/).map((item) => item.trim()).filter((item) => item !== "");
6303
5723
  if (candidates.length === 0) {
@@ -6306,7 +5726,7 @@ async function resolveWorkflowId(env, args) {
6306
5726
  "\u5E94\u7528\u8BBE\u7F6E\u91CC\u6CA1\u6709\u914D\u7F6E\u300C\u65B0\u5EFA\u4F1A\u8BAE\u5DE5\u4F5C\u6D41\u300D\uFF08mt_new_wf \u4E3A\u7A7A\uFF09\uFF0C\u65E0\u6CD5\u8D70\u6D41\u7A0B\u5EFA\u4F1A\uFF1B\u8BF7\u7BA1\u7406\u5458\u5728\u4F1A\u8BAE\u5E94\u7528\u8BBE\u7F6E\u91CC\u914D\u7F6E\uFF0C\u6216\u5173\u95ED\u300C\u53EA\u5141\u8BB8\u901A\u8FC7\u6D41\u7A0B\u65B0\u5EFA\u4F1A\u8BAE\u300D"
6307
5727
  );
6308
5728
  }
6309
- return { workflowId: candidates.length === 1 ? candidates[0] : "", candidates };
5729
+ return { workflowId: candidates.length === 1 ? candidates[0] : "", candidates, source: "settings" };
6310
5730
  }
6311
5731
  var ebMeetingCreateFlowPrepare = {
6312
5732
  name: "meeting.eb.meeting.create.flow.prepare",
@@ -6330,9 +5750,16 @@ var ebMeetingCreateFlowPrepare = {
6330
5750
  caller: { type: "string", description: "\u53EC\u96C6\u4EBA" },
6331
5751
  contacter: { type: "string", description: "\u8054\u7CFB\u4EBA" },
6332
5752
  other_remark: { type: "string", description: "\u5907\u6CE8" },
6333
- workflowId: { type: "string", description: "\u6307\u5B9A\u5EFA\u4F1A\u6D41\u7A0B id\uFF08\u9ED8\u8BA4\u53D6\u5E94\u7528\u8BBE\u7F6E mt_new_wf \u7684\u7B2C\u4E00\u4E2A\uFF09" },
5753
+ workflowId: {
5754
+ oneOf: [{ type: "string" }, { type: "array", items: { type: "string" } }],
5755
+ description: "\u6307\u5B9A\u5EFA\u4F1A\u6D41\u7A0B id\uFF1A\u5355\u4E2A id\u3001id \u6570\u7EC4\u6216\u9017\u53F7\u5206\u9694\u90FD\u53EF\u4EE5\uFF0C\u4E5F\u63A5\u53D7\u300C\u6D41\u7A0B\u540D(123456)\u300D\u5199\u6CD5\u3002**\u4F20\u591A\u4E2A\u65F6 CLI \u540C\u6837\u4E0D\u4F1A\u66FF\u4F60\u9009**\u2014\u2014\u4F1A\u9010\u4E2A\u63A2\u6D4B\u53EF\u53D1\u8D77\u6027\uFF0C\u591A\u4E2A\u53EF\u7528\u5219\u8FD4\u56DE NEEDS_SELECTION \u8BA9\u7528\u6237\u6311\uFF1B\u4E0D\u4F20\u5219\u7528\u5E94\u7528\u8BBE\u7F6E mt_new_wf \u914D\u7F6E\u7684\u6D41\u7A0B\uFF08\u914D\u4E86\u591A\u4E2A\u65F6\u540C\u6837\u8BA9\u7528\u6237\u9009\uFF09"
5756
+ },
6334
5757
  autoRoom: { type: "boolean", description: "\u9ED8\u8BA4 false\uFF1A\u672A\u6307\u5B9A\u4F1A\u8BAE\u5BA4\u65F6\u8FD4\u56DE\u5019\u9009\u8BA9\u7528\u6237\u9009\uFF1B\u4F20 true \u624D\u81EA\u52A8\u91C7\u7528\u63A8\u8350" },
6335
- allowNoRoom: { type: "boolean", description: "\u786E\u5B9E\u4E0D\u9700\u8981\u4F1A\u8BAE\u5BA4\uFF08\u7EBF\u4E0A\u4F1A\u7B49\uFF09\u65F6\u4F20 true\uFF0C\u907F\u514D\u88AB\u201C\u8BF7\u9009\u62E9\u4F1A\u8BAE\u5BA4\u201D\u62E6\u4F4F" }
5758
+ allowNoRoom: { type: "boolean", description: "\u786E\u5B9E\u4E0D\u9700\u8981\u4F1A\u8BAE\u5BA4\uFF08\u7EBF\u4E0A\u4F1A\u7B49\uFF09\u65F6\u4F20 true\uFF0C\u907F\u514D\u88AB\u201C\u8BF7\u9009\u62E9\u4F1A\u8BAE\u5BA4\u201D\u62E6\u4F4F" },
5759
+ extraFields: {
5760
+ type: "object",
5761
+ description: '\u6309**\u6D41\u7A0B\u8868\u5355\u91CC\u7684\u5B57\u6BB5\u540D**\u586B\u989D\u5916\u5B57\u6BB5\uFF0C\u5F62\u5982 {"\u53C2\u4F1A\u5BA2\u6237": "xx\u516C\u53F8", "\u8054\u7CFB\u65B9\u5F0F": "138xxxx"}\uFF1A\u7528\u4E8E\u79DF\u6237\u5728\u6D41\u7A0B\u8868\u5355\u4E0A\u81EA\u5EFA\u3001CLI \u5185\u7F6E\u522B\u540D\u91CC\u6CA1\u6709\u7684\u5B57\u6BB5\u3002\u952E\u5FC5\u987B\u4E0E\u8BE5\u6D41\u7A0B\u8868\u5355\u7684\u5B57\u6BB5\u540D\u5B8C\u5168\u4E00\u81F4\uFF08prepare \u7684 warnings \u4F1A\u5217\u51FA\u8868\u5355\u73B0\u6709\u5168\u90E8\u5B57\u6BB5\u540D\uFF09\uFF1B\u5339\u914D\u4E0D\u5230\u7684\u4F1A\u8FDB unmapped \u63D0\u793A\uFF0C\u4E0D\u4F1A\u778E\u586B'
5762
+ }
6336
5763
  },
6337
5764
  { required: ["mt_name", "begin_datetime", "end_datetime"] }
6338
5765
  ),
@@ -6340,6 +5767,7 @@ var ebMeetingCreateFlowPrepare = {
6340
5767
  const resolved = await resolveWorkflowId(env, args);
6341
5768
  const candidates = resolved.candidates;
6342
5769
  let workflowId = resolved.workflowId;
5770
+ const sourceLabel = resolved.source === "argument" ? "\u8C03\u7528\u65B9\u4F20\u5165" : "\u5E94\u7528\u8BBE\u7F6E\u914D\u7F6E";
6343
5771
  const probes = [];
6344
5772
  const loadedForms = /* @__PURE__ */ new Map();
6345
5773
  if (!workflowId && candidates.length > 1) {
@@ -6375,24 +5803,27 @@ var ebMeetingCreateFlowPrepare = {
6375
5803
  if (launchable.length === 0) {
6376
5804
  throw meetingValidationError(
6377
5805
  "flow_not_launchable",
6378
- `\u5E94\u7528\u8BBE\u7F6E\u914D\u7F6E\u4E86 ${candidates.length} \u4E2A\u5EFA\u4F1A\u6D41\u7A0B\uFF0C\u4F46\u5F53\u524D\u8D26\u53F7\u4E00\u4E2A\u90FD\u53D1\u8D77\u4E0D\u4E86\uFF08\u65E0\u53D1\u8D77\u6743\u9650\u6216\u6D41\u7A0B\u5DF2\u505C\u7528\uFF09\uFF1A` + probes.map((probe) => `${probe.workflowId}\uFF08${probe.reason ?? "\u4E0D\u53EF\u53D1\u8D77"}\uFF09`).join("\uFF1B"),
5806
+ `${sourceLabel}\u4E86 ${candidates.length} \u4E2A\u5EFA\u4F1A\u6D41\u7A0B\uFF0C\u4F46\u5F53\u524D\u8D26\u53F7\u4E00\u4E2A\u90FD\u53D1\u8D77\u4E0D\u4E86\uFF08\u65E0\u53D1\u8D77\u6743\u9650\u6216\u6D41\u7A0B\u5DF2\u505C\u7528\uFF09\uFF1A` + probes.map((probe) => `${probe.workflowId}\uFF08${probe.reason ?? "\u4E0D\u53EF\u53D1\u8D77"}\uFF09`).join("\uFF1B"),
6379
5807
  { probes }
6380
5808
  );
6381
5809
  }
6382
5810
  if (launchable.length > 1) {
6383
5811
  return meetingSuccess("meeting.eb.meeting.create.flow.prepare", {
6384
5812
  status: "NEEDS_SELECTION",
6385
- message: `\u5F53\u524D\u8D26\u53F7\u53EF\u53D1\u8D77 ${launchable.length} \u4E2A\u5EFA\u4F1A\u6D41\u7A0B\uFF0C\u8BF7\u8BA9\u7528\u6237\u9009\u62E9\u8981\u89E6\u53D1\u54EA\u4E00\u4E2A`,
5813
+ message: `${sourceLabel}\u4E86 ${candidates.length} \u4E2A\u5EFA\u4F1A\u6D41\u7A0B\uFF0C\u5F53\u524D\u8D26\u53F7\u53EF\u53D1\u8D77\u5176\u4E2D ${launchable.length} \u4E2A\uFF0C\u8BF7\u8BA9\u7528\u6237\u9009\u62E9\u8981\u89E6\u53D1\u54EA\u4E00\u4E2A \u2014\u2014 **\u4E0D\u8981\u9ED8\u8BA4\u53D6\u7B2C\u4E00\u4E2A**\uFF08\u5404\u6D41\u7A0B\u8868\u5355\u5B57\u6BB5\u53EF\u80FD\u5B8C\u5168\u4E0D\u540C\uFF0C\u9009\u9519\u4F1A\u6F0F\u5B57\u6BB5\uFF1B2026-10-29 \u771F\u5B9E\u4E8B\u6545\uFF1A\u53D6\u7B2C\u4E00\u4E2A\u5BFC\u81F4\u5B57\u6BB5\u5168\u586B\u4E0D\u8FDB\u53E6\u4E00\u6761\u6D41\u7A0B\uFF0C\u7528\u6237\u4EE5\u4E3A"\u7CFB\u7EDF\u53EA\u652F\u6301\u4E00\u6761\u6D41\u7A0B"\uFF09`,
6386
5814
  options: launchable.map((probe, index) => ({
6387
5815
  key: `W${index + 1}`,
6388
5816
  label: probe.name ? `${probe.name}\uFF08${probe.workflowId}\uFF09` : probe.workflowId,
6389
5817
  value: { workflowId: probe.workflowId },
6390
- reason: "\u5F53\u524D\u8D26\u53F7\u6709\u53D1\u8D77\u6743\u9650"
5818
+ reason: "\u5F53\u524D\u8D26\u53F7\u6709\u53D1\u8D77\u6743\u9650",
5819
+ // 把该流程的字段名如实带出来:不同流程字段差异很大(有的有设备需求/涉密项目,有的没有),
5820
+ // 用户要靠这个才能选对(2026-10-29 用户反馈:选错方式后字段全填不进去)。
5821
+ fields: (loadedForms.get(probe.workflowId)?.fields ?? []).map((f) => f.name).filter(Boolean)
6391
5822
  })),
6392
5823
  probes
6393
5824
  }, {
6394
5825
  warnings: [
6395
- `\u68C0\u6D4B\u5230 ${candidates.length} \u4E2A\u5EFA\u4F1A\u6D41\u7A0B\uFF0C\u5176\u4E2D ${launchable.length} \u4E2A\u5F53\u524D\u8D26\u53F7\u53EF\u53D1\u8D77\uFF1B\u8BF7\u628A\u8FD9\u51E0\u4E2A\u6D41\u7A0B\u505A\u6210\u9009\u9879\u8BA9\u7528\u6237\u6311\u4E00\u4E2A\uFF0C\u9009\u5B9A\u540E\u5E26 workflowId \u91CD\u65B0 prepare\u3002`,
5826
+ `${sourceLabel}\u4E86 ${candidates.length} \u4E2A\u5EFA\u4F1A\u6D41\u7A0B\uFF0C\u5176\u4E2D ${launchable.length} \u4E2A\u5F53\u524D\u8D26\u53F7\u53EF\u53D1\u8D77\uFF1B**\u5FC5\u987B\u628A\u8FD9\u51E0\u4E2A\u6D41\u7A0B\u505A\u6210\u9009\u9879\u8BA9\u7528\u6237\u6311\u4E00\u4E2A\uFF0C\u7981\u6B62\u81EA\u5DF1\u66FF\u7528\u6237\u9009**\uFF1B\u9009\u5B9A\u540E\u5E26\u5355\u4E2A workflowId \u91CD\u65B0 prepare\u3002`,
6396
5827
  ...probes.filter((probe) => !probe.launchable).map((probe) => `\u6D41\u7A0B ${probe.workflowId} \u5F53\u524D\u8D26\u53F7\u65E0\u6CD5\u53D1\u8D77\uFF08${probe.reason ?? "\u65E0\u6743\u9650"}\uFF09\uFF0C\u5DF2\u6392\u9664`)
6397
5828
  ]
6398
5829
  });
@@ -6409,18 +5840,28 @@ var ebMeetingCreateFlowPrepare = {
6409
5840
  const endText = String(args.end_datetime ?? "").trim();
6410
5841
  const memberIds = String(args.hrm_members ?? "").split(/[,;,;\s]+/).map((item) => item.trim()).filter((item) => item !== "");
6411
5842
  let addressInput = args.address;
5843
+ const hadAddressInput = String(args.address ?? "").trim() !== "";
6412
5844
  const day = beginText.slice(0, 10);
6413
5845
  const durationMinutes = beginText && endText ? Math.max(15, Math.round((Date.parse(endText.replace(" ", "T")) - Date.parse(beginText.replace(" ", "T"))) / 6e4) || 60) : 60;
6414
5846
  const timings = {};
6415
5847
  const startedAt = Date.now();
6416
- const roomTask = enrich && !addressInput && beginText && endText ? recommendRooms(env, {
5848
+ const roomTask = enrich && beginText && endText ? recommendRooms(env, {
6417
5849
  beginDatetime: beginText,
6418
5850
  endDatetime: endText,
6419
5851
  ...memberIds.length > 0 ? { memberCount: memberIds.length } : {},
6420
5852
  topN: 3
6421
5853
  }).catch(() => null) : Promise.resolve(null);
5854
+ const addressId = String(addressInput ?? "").trim();
5855
+ const addressIsRoomId = /^\d+$/.test(addressId);
5856
+ const roomConflictTask = enrich && beginText && endText && addressIsRoomId ? (async () => {
5857
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
5858
+ return getMeetingOperation2("meeting.eb.conflict.room").handler(
5859
+ { beginDatetime: beginText, endDatetime: endText, address: addressId },
5860
+ env
5861
+ );
5862
+ })().catch(() => null) : Promise.resolve(null);
6422
5863
  const conflictTask = enrich && beginText && endText && memberIds.length > 0 ? (async () => {
6423
- const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-TI3CIUXF.js");
5864
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
6424
5865
  return getMeetingOperation2("meeting.eb.conflict.member").handler(
6425
5866
  { beginDatetime: beginText, endDatetime: endText, hrmMembers: memberIds.join(",") },
6426
5867
  env
@@ -6435,15 +5876,45 @@ var ebMeetingCreateFlowPrepare = {
6435
5876
  maxDays: 1,
6436
5877
  includeSchedule: true
6437
5878
  }).catch(() => null) : Promise.resolve(null);
6438
- const [roomRec, memberConflict, free] = await Promise.all([roomTask, conflictTask, availabilityTask]);
5879
+ const [roomRec, memberConflict, free, roomConflict] = await Promise.all([
5880
+ roomTask,
5881
+ conflictTask,
5882
+ availabilityTask,
5883
+ roomConflictTask
5884
+ ]);
6439
5885
  timings.parallelMs = Date.now() - startedAt;
5886
+ const roomOptions = (roomRec?.candidates ?? []).map((candidate, index) => ({
5887
+ key: `R${index + 1}`,
5888
+ label: `${candidate.name}${candidate.capacity.max > 0 ? `\uFF08\u53EF\u5BB9 ${candidate.capacity.max} \u4EBA\uFF09` : ""}${index === 0 ? " \xB7 \u63A8\u8350" : ""}`,
5889
+ value: { id: candidate.id, name: candidate.name },
5890
+ reason: candidate.reasons.join("\uFF1B")
5891
+ }));
5892
+ const roomConflictData = roomConflict?.data;
5893
+ if (addressInput && roomConflictData?.hasConflict === true) {
5894
+ const busy = Array.isArray(roomConflictData.conflicts) ? roomConflictData.conflicts : [];
5895
+ decisions.roomConflict = {
5896
+ address: addressId,
5897
+ hasConflict: true,
5898
+ conflicts: busy,
5899
+ verdict: roomConflictData.verdict ?? "conflict"
5900
+ };
5901
+ if (roomOptions.length > 0) decisions.roomOptions = roomOptions;
5902
+ return meetingSuccess("meeting.eb.meeting.create.flow.prepare", {
5903
+ status: "NEEDS_SELECTION",
5904
+ selectionType: "room_conflict",
5905
+ message: `\u4F60\u6307\u5B9A\u7684\u4F1A\u8BAE\u5BA4\u5728 ${beginText}~${endText} \u5DF2\u88AB\u5360\u7528\uFF08${busy.length} \u6761\u5360\u7528\u8BB0\u5F55\uFF09\uFF0C\u672C\u6B21**\u6CA1\u6709\u63D0\u4EA4**\u3002\u8BF7\u6539\u7528\u4E0B\u9762\u7A7A\u95F2\u7684\u4F1A\u8BAE\u5BA4\uFF0C\u6216\u8C03\u6574\u4F1A\u8BAE\u65F6\u95F4`,
5906
+ options: roomOptions,
5907
+ recommended: roomOptions[0]?.value ?? null,
5908
+ conflicts: busy,
5909
+ hint: "\u9009\u5B9A\u540E\u628A value.id \u4F5C\u4E3A address \u91CD\u65B0\u8C03\u7528\uFF1B\u8981\u6539\u65F6\u95F4\u5C31\u540C\u65F6\u4F20\u65B0\u7684 begin_datetime/end_datetime"
5910
+ }, {
5911
+ warnings: [
5912
+ `\u4F1A\u8BAE\u5BA4 ${addressId} \u5728\u8BE5\u65F6\u6BB5\u5DF2\u6709 ${busy.length} \u6761\u5360\u7528\uFF0C\u5DF2\u62E6\u4E0B\u672A\u63D0\u4EA4\u3002`,
5913
+ roomOptions.length > 0 ? `\u5DF2\u6309\u4EBA\u6570/\u5E38\u7528/\u7A7A\u95F2\u7ED9\u51FA ${roomOptions.length} \u4E2A\u66FF\u4EE3\u4F1A\u8BAE\u5BA4\uFF08R1 \u4E3A\u9996\u9009\uFF09\u3002` : "\u8BE5\u65F6\u6BB5\u6CA1\u6709\u53EF\u66FF\u4EE3\u7684\u7A7A\u95F2\u4F1A\u8BAE\u5BA4\uFF0C\u5EFA\u8BAE\u8C03\u6574\u4F1A\u8BAE\u65F6\u95F4\u6216\u6539\u7EBF\u4E0A\u4F1A\u8BAE\uFF08allowNoRoom: true\uFF09\u3002"
5914
+ ]
5915
+ });
5916
+ }
6440
5917
  if (roomRec) {
6441
- const roomOptions = roomRec.candidates.map((candidate, index) => ({
6442
- key: `R${index + 1}`,
6443
- label: `${candidate.name}${candidate.capacity.max > 0 ? `\uFF08\u53EF\u5BB9 ${candidate.capacity.max} \u4EBA\uFF09` : ""}${index === 0 ? " \xB7 \u63A8\u8350" : ""}`,
6444
- value: { id: candidate.id, name: candidate.name },
6445
- reason: candidate.reasons.join("\uFF1B")
6446
- }));
6447
5918
  decisions.roomOptions = roomOptions;
6448
5919
  decisions.autoRoom = {
6449
5920
  picked: roomRec.best ? { id: roomRec.best.id, name: roomRec.best.name, score: roomRec.best.score, reasons: roomRec.best.reasons } : null,
@@ -6471,6 +5942,28 @@ var ebMeetingCreateFlowPrepare = {
6471
5942
  addressInput = roomRec.best.id;
6472
5943
  }
6473
5944
  }
5945
+ if (enrich && !addressInput && args.allowNoRoom !== true) {
5946
+ decisions.roomUnavailable = {
5947
+ reason: roomRec ? `\u8BE5\u65F6\u6BB5\u6CA1\u6709\u6EE1\u8DB3\u6761\u4EF6\u7684\u7A7A\u95F2\u4F1A\u8BAE\u5BA4\uFF08\u5171 ${roomRec.meta?.roomsTotal ?? 0} \u95F4\uFF0C\u53EF\u7528 ${roomRec.meta?.roomsUsable ?? 0} \u95F4\uFF0C\u88AB\u5360\u7528 ${roomRec.meta?.roomsBusy ?? 0} \u95F4\uFF09` : "\u4F1A\u8BAE\u5BA4\u63A8\u8350\u6CA1\u6709\u8FD4\u56DE\u7ED3\u679C\uFF08\u4F1A\u8BAE\u5BA4\u5217\u8868\u63A5\u53E3\u8BFB\u4E0D\u5230\uFF0C\u6216\u63A8\u8350\u8FC7\u7A0B\u51FA\u9519\uFF09",
5948
+ meta: roomRec?.meta ?? null
5949
+ };
5950
+ return meetingSuccess("meeting.eb.meeting.create.flow.prepare", {
5951
+ status: "NEEDS_SELECTION",
5952
+ selectionType: "room_unavailable",
5953
+ message: "\u672A\u6307\u5B9A\u4F1A\u8BAE\u5BA4\uFF0C\u4E14\u6309\u4EBA\u6570/\u65F6\u6BB5\u6CA1\u80FD\u63A8\u8350\u51FA\u53EF\u7528\u7684\u7A7A\u95F2\u4F1A\u8BAE\u5BA4\u3002\u8BF7\u8BA9\u7528\u6237\u4ECE\u4E0B\u9762\u4E09\u6761\u91CC\u9009\u4E00\u6761\uFF0C**\u4E0D\u8981**\u76F4\u63A5\u63D0\u4EA4\u4E00\u4E2A\u6CA1\u6709\u5730\u70B9\u7684\u4F1A\u8BAE",
5954
+ options: [
5955
+ { key: "C1", label: "\u6211\u6307\u5B9A\u5177\u4F53\u4F1A\u8BAE\u5BA4\uFF08\u8868\u5355\u91CC\u70B9\u9009\uFF0C\u6216\u544A\u8BC9\u6211\u4F1A\u8BAE\u5BA4\u540D\u79F0/id\uFF09", value: { action: "specify" } },
5956
+ { key: "C2", label: "\u6539\u7528\u7EBF\u4E0A\u4F1A\u8BAE\uFF08\u817E\u8BAF\u4F1A\u8BAE/\u89C6\u9891\uFF09", value: { action: "no_room" } },
5957
+ { key: "C3", label: '\u5148\u6309"\u5730\u70B9\u5F85\u5B9A"\u63D0\u4EA4', value: { action: "allow_no_room" } }
5958
+ ],
5959
+ roomUnavailable: decisions.roomUnavailable
5960
+ }, {
5961
+ warnings: [
5962
+ `\u4F1A\u8BAE\u5BA4\u63A8\u8350\u65E0\u7ED3\u679C\uFF1A${String(decisions.roomUnavailable.reason)}\u3002\u672C\u6B21**\u6CA1\u6709\u63D0\u4EA4**\u3002`,
5963
+ "\u786E\u5B9E\u4E0D\u9700\u8981\u4F1A\u8BAE\u5BA4\uFF08\u7EBF\u4E0A\u4F1A\uFF09\u5C31\u5E26 allowNoRoom: true \u91CD\u65B0\u8C03\u7528\uFF1B\u8981\u6307\u5B9A\u623F\u95F4\u5C31\u5E26 address\u3002"
5964
+ ]
5965
+ });
5966
+ }
6474
5967
  const conflicts = memberConflict?.data?.conflicts ?? [];
6475
5968
  if (conflicts.length > 0) decisions.memberConflicts = conflicts;
6476
5969
  if (free) {
@@ -6501,13 +5994,14 @@ var ebMeetingCreateFlowPrepare = {
6501
5994
  caller: args.caller,
6502
5995
  contacter: args.contacter,
6503
5996
  other_remark: args.other_remark,
6504
- mt_type: args.mt_type
5997
+ mt_type: args.mt_type,
5998
+ ...args.extraFields && typeof args.extraFields === "object" && !Array.isArray(args.extraFields) ? args.extraFields : {}
6505
5999
  });
6506
6000
  const { main, mapped, unmapped } = mapFields(form.fields, shaped.values);
6507
6001
  const warnings = [];
6508
6002
  for (const note of shaped.notes) warnings.push(note);
6509
6003
  const picked = decisions.autoRoom?.picked;
6510
- if (picked) {
6004
+ if (picked && !hadAddressInput) {
6511
6005
  warnings.push(
6512
6006
  `\u672A\u6307\u5B9A\u4F1A\u8BAE\u5BA4 \u2192 \u5DF2\u81EA\u52A8\u9009\u62E9\u300C${picked.name}\u300D\uFF08${(picked.reasons ?? []).join("\uFF1B")}\uFF09\uFF1B\u53E6\u6709\u5019\u9009 ${(decisions.roomOptions ?? []).slice(1).map((item) => item.label).join(" / ") || "\u65E0"}`
6513
6007
  );
@@ -6597,9 +6091,9 @@ var ebMeetingCreateFlowApply = {
6597
6091
  throw meetingValidationError("context_mismatch", "\u786E\u8BA4\u4E0A\u4E0B\u6587\u5DF2\u53D8\u5316\uFF08\u79DF\u6237\u6216\u767B\u5F55\u8D26\u53F7\u4E0D\u540C\uFF09\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C prepare");
6598
6092
  }
6599
6093
  const payload = lease?.payload ?? {};
6600
- const { createWorkflowHost } = await import("./host-OCH2BCCV.js");
6094
+ const { createWorkflowHost } = await import("./host-VQ6JJXGQ.js");
6601
6095
  const { createWorkflowContinuationSigner } = await import("./continuation-HZIZRZBX.js");
6602
- const { getWorkflowOperation } = await import("./registry-7C5UMIPL.js");
6096
+ const { getWorkflowOperation } = await import("./registry-VOGKFFTR.js");
6603
6097
  const wfEnv = {
6604
6098
  ...workflowEnv(env),
6605
6099
  host: createWorkflowHost(env.ctx),
@@ -6652,7 +6146,7 @@ var ebMeetingCreateFlowApply = {
6652
6146
  let meetingId = "";
6653
6147
  const timings = { submitMs: Date.now() - submitStartedAt };
6654
6148
  if (waitSeconds > 0) {
6655
- const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-TI3CIUXF.js");
6149
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
6656
6150
  const list = getMeetingOperation2("meeting.eb.meeting.list");
6657
6151
  const deadline = Date.now() + Math.min(waitSeconds, 30) * 1e3;
6658
6152
  const pollStart = Date.now();
@@ -6678,7 +6172,7 @@ var ebMeetingCreateFlowApply = {
6678
6172
  if (meetingId) {
6679
6173
  const invitationStart = Date.now();
6680
6174
  try {
6681
- const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-TI3CIUXF.js");
6175
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
6682
6176
  const render = getMeetingOperation2("meeting.invitation.render");
6683
6177
  const rendered = await render.handler({ mtId: meetingId }, env);
6684
6178
  invitation = { pending: false, ...rendered?.data ?? {} };
@@ -6733,12 +6227,19 @@ var ebMeetingCreateFlowQuick = {
6733
6227
  caller: { type: "string", description: "\u53EC\u96C6\u4EBA" },
6734
6228
  contacter: { type: "string", description: "\u8054\u7CFB\u4EBA" },
6735
6229
  other_remark: { type: "string", description: "\u5907\u6CE8" },
6736
- workflowId: { type: "string", description: "\u6307\u5B9A\u5EFA\u4F1A\u6D41\u7A0B id\uFF08\u591A\u6D41\u7A0B\u65F6\u7528\u6765\u8DF3\u8FC7\u9009\u62E9\uFF09" },
6230
+ workflowId: {
6231
+ oneOf: [{ type: "string" }, { type: "array", items: { type: "string" } }],
6232
+ description: "\u6307\u5B9A\u5EFA\u4F1A\u6D41\u7A0B id\uFF08\u5355\u4E2A / \u6570\u7EC4 / \u9017\u53F7\u5206\u9694\uFF09\u3002\u4F20\u591A\u4E2A\u65F6\u4E0D\u4F1A\u66FF\u4F60\u9009\uFF1A\u4F1A\u8FD4\u56DE NEEDS_SELECTION \u8BA9\u7528\u6237\u6311"
6233
+ },
6737
6234
  autoRoom: { type: "boolean", description: "\u9ED8\u8BA4 false\uFF1A\u4E0D\u6307\u5B9A\u4F1A\u8BAE\u5BA4\u65F6\u8FD4\u56DE\u5019\u9009\u8BA9\u7528\u6237\u9009\uFF1B\u4F20 true \u624D\u81EA\u52A8\u91C7\u7528\u63A8\u8350\u4F1A\u8BAE\u5BA4" },
6738
6235
  allowNoRoom: { type: "boolean", description: "\u786E\u5B9E\u4E0D\u9700\u8981\u4F1A\u8BAE\u5BA4\uFF08\u7EBF\u4E0A\u4F1A\u7B49\uFF09\u65F6\u4F20 true" },
6739
6236
  confirm: { type: "boolean", description: "\u5FC5\u987B\u663E\u5F0F true \u624D\u4F1A\u771F\u6B63\u63D0\u4EA4" },
6740
6237
  waitSeconds: { type: "number", description: "\u63D0\u4EA4\u540E\u7B49\u5F85\u4F1A\u8BAE\u751F\u6210\u7684\u79D2\u6570\uFF08\u9ED8\u8BA4 20\uFF1B\u7B97\u6CD5\u662F\u7ACB\u5373\u67E5\u4E00\u6B21 + 5s \u518D\u67E5\u4E00\u6B21\uFF0C\u4ECD\u672A\u751F\u6210\u5C31\u8FD4\u56DE pending\uFF09" },
6741
- enrich: { type: "boolean", description: "\u662F\u5426\u987A\u5E26\u505A\u4F1A\u8BAE\u5BA4\u63A8\u8350/\u51B2\u7A81\u68C0\u6D4B/\u7A7A\u95F2\u65F6\u6BB5\uFF08\u9ED8\u8BA4 true\uFF1B\u4EBA\u3001\u65F6\u95F4\u3001\u623F\u95F4\u90FD\u5DF2\u786E\u5B9A\u65F6\u4F20 false \u53EF\u663E\u8457\u52A0\u5FEB\uFF09" }
6238
+ enrich: { type: "boolean", description: "\u662F\u5426\u987A\u5E26\u505A\u4F1A\u8BAE\u5BA4\u63A8\u8350/\u51B2\u7A81\u68C0\u6D4B/\u7A7A\u95F2\u65F6\u6BB5\uFF08\u9ED8\u8BA4 true\uFF1B\u4EBA\u3001\u65F6\u95F4\u3001\u623F\u95F4\u90FD\u5DF2\u786E\u5B9A\u65F6\u4F20 false \u53EF\u663E\u8457\u52A0\u5FEB\uFF09" },
6239
+ extraFields: {
6240
+ type: "object",
6241
+ description: '\u6309\u6D41\u7A0B\u8868\u5355\u5B57\u6BB5\u540D\u586B\u989D\u5916\u5B57\u6BB5\uFF08\u79DF\u6237\u81EA\u5EFA\u5B57\u6BB5\u7528\u8FD9\u4E2A\u53E3\u5B50\u5E26\u8FDB\u53BB\uFF09\uFF0C\u5F62\u5982 {"\u53C2\u4F1A\u5BA2\u6237": "xx\u516C\u53F8"}'
6242
+ }
6742
6243
  },
6743
6244
  { required: ["mt_name", "begin_datetime", "end_datetime", "confirm"] }
6744
6245
  ),
@@ -6749,7 +6250,7 @@ var ebMeetingCreateFlowQuick = {
6749
6250
  "\u4E00\u6B65\u5EFA\u4F1A\u4F1A\u76F4\u63A5\u63D0\u4EA4\u6D41\u7A0B\uFF0C\u5FC5\u987B\u663E\u5F0F\u4F20 confirm=true\uFF1B\u5982\u53EA\u60F3\u770B\u65B9\u6848\uFF0C\u8BF7\u7528 meeting.eb.meeting.create.flow.prepare"
6750
6251
  );
6751
6252
  }
6752
- const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-TI3CIUXF.js");
6253
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
6753
6254
  const prepareStartedAt = Date.now();
6754
6255
  const prepared = await getMeetingOperation2("meeting.eb.meeting.create.flow.prepare").handler(
6755
6256
  { ...args, confirm: void 0 },
@@ -6808,8 +6309,10 @@ var meetingEbCreateFlowOperations = [
6808
6309
  var ebAutoRoomPreflight = async (context) => {
6809
6310
  const { extras } = context;
6810
6311
  const warnings = [];
6811
- const enabled = String(process.env.WEAVER_MEETING_AUTO_ROOM ?? "1") !== "0";
6812
6312
  const isCreate = context.endpoint.kind === "create" && context.endpoint.interfacePk === "create_meeting";
6313
+ const markRoomUnavailable = (reason, meta) => {
6314
+ extras.roomUnavailable = { reason, ...meta ? { meta } : {} };
6315
+ };
6813
6316
  const mode = String(process.env.WEAVER_MEETING_AUTO_ROOM ?? "").trim();
6814
6317
  if (isCreate && !context.payload.mainTable.address && mode !== "0") {
6815
6318
  const begin = String(context.payload.mainTable.begin_datetime ?? "").trim();
@@ -6853,15 +6356,25 @@ var ebAutoRoomPreflight = async (context) => {
6853
6356
  );
6854
6357
  } else {
6855
6358
  warnings.push(...result.warnings);
6359
+ markRoomUnavailable(
6360
+ `\u6CA1\u6709\u53EF\u7528\u7684\u4F1A\u8BAE\u5BA4\u5019\u9009\uFF08\u5171 ${result.meta?.roomsTotal ?? 0} \u95F4\uFF0C\u53EF\u7528 ${result.meta?.roomsUsable ?? 0} \u95F4\uFF0C\u8BE5\u65F6\u6BB5\u88AB\u5360\u7528 ${result.meta?.roomsBusy ?? 0} \u95F4\uFF09`,
6361
+ result.meta
6362
+ );
6363
+ warnings.push(
6364
+ "\u26A0\uFE0F \u672C\u6B21\u5EFA\u4F1A**\u6CA1\u6709\u4F1A\u8BAE\u5BA4**\uFF1A\u63A8\u8350\u4E0D\u51FA\u5019\u9009\uFF08\u89C1 roomUnavailable.reason\uFF09\u3002\u5FC5\u987B\u7528\u9009\u9879\u65B9\u5F0F\u8BA9\u7528\u6237\u786E\u8BA4\u5730\u70B9 \u2014\u2014 \u6539\u6307\u5B9A\u5177\u4F53\u4F1A\u8BAE\u5BA4\uFF08\u4F20 address\uFF09\u3001\u6539\u4E3A\u7EBF\u4E0A\u4F1A\u8BAE\uFF0C\u6216\u660E\u786E\u63A5\u53D7\u300C\u5730\u70B9\u5F85\u5B9A\u300D\u3002\u4E0D\u8981\u9ED8\u9ED8\u5EFA\u6210\u4E00\u573A\u6CA1\u6709\u5730\u70B9\u7684\u4F1A\u3002"
6365
+ );
6856
6366
  }
6857
6367
  } catch (error) {
6858
6368
  if (error?.subtype === "room_selection_required") throw error;
6369
+ const reason = String(error?.message ?? error).slice(0, 200);
6370
+ markRoomUnavailable(`\u4F1A\u8BAE\u5BA4\u63A8\u8350\u5931\u8D25\uFF1A${reason}`);
6859
6371
  warnings.push(
6860
- `\u4F1A\u8BAE\u5BA4\u63A8\u8350\u5931\u8D25\uFF08${String(error?.message ?? error).slice(0, 80)}\uFF09\uFF1A\u672C\u6B21\u4E0D\u586B\u4F1A\u8BAE\u5BA4\u7EE7\u7EED\uFF0C\u8BF7\u4E0E\u7528\u6237\u786E\u8BA4\u5730\u70B9`
6372
+ `\u26A0\uFE0F \u4F1A\u8BAE\u5BA4\u63A8\u8350\u5931\u8D25\uFF08${reason}\uFF09\uFF1A\u672C\u6B21**\u4E0D\u586B\u4F1A\u8BAE\u5BA4\u7EE7\u7EED**\uFF0C\u8BF7\u4E0E\u7528\u6237\u786E\u8BA4\u5730\u70B9\uFF0C\u4E0D\u8981\u9ED8\u8BA4\u300C\u5730\u70B9\u5F85\u5B9A\u300D\u3002`
6861
6373
  );
6862
6374
  }
6863
6375
  } else {
6864
- warnings.push("\u4F1A\u8BAE\u5F00\u59CB/\u7ED3\u675F\u65F6\u95F4\u4E0D\u5B8C\u6574\uFF0C\u8DF3\u8FC7\u4F1A\u8BAE\u5BA4\u63A8\u8350");
6376
+ markRoomUnavailable("\u4F1A\u8BAE\u5F00\u59CB/\u7ED3\u675F\u65F6\u95F4\u4E0D\u5B8C\u6574\uFF0C\u65E0\u6CD5\u6309\u65F6\u6BB5\u63A8\u8350");
6377
+ warnings.push("\u4F1A\u8BAE\u5F00\u59CB/\u7ED3\u675F\u65F6\u95F4\u4E0D\u5B8C\u6574\uFF0C\u8DF3\u8FC7\u4F1A\u8BAE\u5BA4\u63A8\u8350\uFF08\u672C\u6B21\u4E0D\u4F1A\u586B\u4F1A\u8BAE\u5BA4\uFF0C\u8BF7\u4E0E\u7528\u6237\u786E\u8BA4\u5730\u70B9\uFF09");
6865
6378
  }
6866
6379
  }
6867
6380
  const conflictWarnings = await ebMeetingWritePreflight(context);
@@ -6879,7 +6392,7 @@ var ebAutoInvitationAfterWrite = async (context) => {
6879
6392
  const mtId = String(context.dataIds?.[0] ?? "").trim();
6880
6393
  if (!isCreate || !enabled || !mtId) return association;
6881
6394
  try {
6882
- const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-TI3CIUXF.js");
6395
+ const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
6883
6396
  const render = getMeetingOperation2("meeting.invitation.render");
6884
6397
  const result = await render.handler({ mtId }, context.env);
6885
6398
  return { ...association ?? {}, invitation: result?.data ?? null };
@@ -6930,6 +6443,7 @@ function buildRegistry() {
6930
6443
  ...meetingInvitationOperations,
6931
6444
  ...meetingQrOperations,
6932
6445
  ...meetingSummaryOperations,
6446
+ ...meetingFormFieldOperations,
6933
6447
  ...meetingEbOperations
6934
6448
  ];
6935
6449
  for (const definition of definitions) {