flycode-mcp 1.14.5 → 1.14.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -724,7 +724,7 @@ var init_gateway = __esm({
724
724
  });
725
725
 
726
726
  // src/tools/enum-reference.ts
727
- var COMMON_ENUM, LOGIC_ENUM, PROPERTY_TYPE_ENUM, ENTITY_ENUM, FORM_ENUM, FUNCTION_ENUM;
727
+ var COMMON_ENUM, LOGIC_ENUM, PROPERTY_TYPE_ENUM, ENTITY_ENUM, FORM_ENUM, FORM_ACTION_ENUM, FUNCTION_ENUM;
728
728
  var init_enum_reference = __esm({
729
729
  "src/tools/enum-reference.ts"() {
730
730
  "use strict";
@@ -733,6 +733,7 @@ var init_enum_reference = __esm({
733
733
  PROPERTY_TYPE_ENUM = `properties[].propertytypecode\uFF08\u5B57\u6BB5\u7C7B\u578B\uFF09\uFF1A1-\u4E3B\u952E(int8) / 2-\u540D\u79F0(200) / 3-\u6587\u672C(200) / 4-\u957F\u6587\u672C / 5-\u6574\u6570(int4) / 6-\u957F\u6574\u6570(int8) / 10-\u6570\u5B57(numeric) / 7-\u65E5\u671F\u65F6\u95F4(ts) / 29-\u5E74\u6708\u65E5(date) / 30-\u65F6\u95F4\u8303\u56F4 / 18-\u72B6\u6001(int4) / 16-\u56FE\u7247 / 26-\u9644\u4EF6 / 17-\u5B9A\u4F4D / 19-\u9009\u9879\u96C6 / 8-\u521B\u5EFA\u4EBA / 9-\u4FEE\u6539\u4EBA / 11-\u521B\u5EFA\u65F6\u95F4 / 12-\u4FEE\u6539\u65F6\u95F4 / 31-\u62FC\u97F3 / 100-\u662F\u5426\u9ED8\u8BA4 / 13-\u624B\u673A\u53F7 / 15-\u56FA\u5B9A\u7535\u8BDD / 14-\u90AE\u7BB1 / 27-\u90AE\u7F16 / 20-\u6392\u5E8F / 200000000000-\u5173\u8054\u5BF9\u8C61 / 100000000000-\u4E1A\u52A1\u5BF9\u8C61 / 10000000000-\u5B57\u5178\u5BF9\u8C61 / 300000000000-\u590D\u6742\u5173\u8054\u5BF9\u8C61 / 1000000000-\u672C\u5BF9\u8C61\u3002`;
734
734
  ENTITY_ENUM = `\u3010entity \u679A\u4E3E\u3011datapattern\uFF08\u5B9E\u4F53\u7C7B\u578B\uFF09\uFF1A1-\u539F\u751F / 2-\u884D\u751F / 3-\u89C6\u56FE / 4-\u8D85\u7EA7\u8868\u5355\u3002objecttypecode\uFF08\u5206\u7C7B\uFF09\uFF1A1-\u57FA\u672C / 2-\u6811\u5F62 / 3-\u6570\u636E\u5B57\u5178 / 4-\u5173\u8054\u3002objectcatgory\uFF1A1-\u6743\u9650\u5BF9\u8C61 / 2-\u5426\u3002publishstatus\uFF1A1-\u5DF2\u53D1\u5E03 / 2-\u672A\u53D1\u5E03\u3002hasoffline\uFF1A1-\u6709 / 0-\u65E0\u3002properties[].idxtype\uFF08\u7D22\u5F15\uFF09\uFF1A1-\u65E0 / 2-\u4E3B\u952E\u7D22\u5F15\u3002`;
735
735
  FORM_ENUM = `\u3010form \u679A\u4E3E\u3011type\uFF08\u9875\u9762\u7C7B\u578B\uFF09\uFF1A5-\u5217\u8868\u67E5\u8BE2 / 1-\u666E\u901A\u9875\u9762 / 99-\u4E8C\u5F00 / 10-switchpage / 11-\u6811\u5BFC\u822A\u5217\u8868 / 100-\u539F\u751F / 101-\u7A7A\u767D / 7-\u62A5\u8868 / 12-\u6392\u5E8F / 300-\u6B65\u9AA4\u7BA1\u7406 / 1000-\u5168\u5C40\u51FD\u6570\u3002clientcategorycode\uFF08\u7528\u6237\u7AEF\uFF09\uFF1A1-web / 2-app / 6-\u5C0F\u7A0B\u5E8F\u3002`;
736
+ FORM_ACTION_ENUM = `\u3010action \u7C7B\u578B\u3011flycode / datarequest(\u6570\u636E\u8BF7\u6C42) / datasubmit(\u6570\u636E\u63D0\u4EA4) / dataimport(\u5BFC\u5165\u884C\u4E3A) / dataexport(\u5BFC\u51FA\u884C\u4E3A) / datatransfer(\u6570\u636E\u8F6C\u79FB) / dataserialize(\u6570\u636E\u5E8F\u5217\u5316) / smartrequest(\u667A\u6167\u573A\u666F\u8BF7\u6C42) / link(\u94FE\u63A5) / call(\u4E8B\u4EF6\u547C\u53EB) / return(\u8FD4\u56DE) / af_preaddflow(\u6D41\u7A0B\u53D1\u8D77) / af_handleflow(\u5904\u7406\u5BA1\u6279) / af_flowdetail(\u6D41\u7A0B\u8282\u70B9\u8BE6\u60C5) / ctrlevent(\u8C03\u7528\u63A7\u4EF6\u4E8B\u4EF6) / receivelink(\u63A5\u6536\u53C2\u6570) / eventlink(\u4E8B\u4EF6\u76D1\u542C) / attributeevaluate(\u5C5E\u6027\u8868\u8FBE\u5F0F) / alert(\u63D0\u793A\u5F39\u7A97) / toast(\u8F7B\u63D0\u793A) / share(\u5206\u4EAB\u884C\u4E3A) / popsubview(\u6253\u5F00popview) / closesubview(\u5173\u95EDpopview) / print(\u6253\u5370\u4E8B\u4EF6) / urllink(URL\u94FE\u63A5) / runevent(\u6267\u884C\u4E8B\u4EF6)\u3002\u6CE8\u610F\uFF1Ainitial\uFF08\u9875\u9762\u521D\u59CB\u5316\uFF09\u4EC5\u652F\u6301 flycode / receivelink\uFF0C\u5176\u4F59\u7C7B\u578B\u53EA\u80FD\u52A0\u5230 handlers \u4E8B\u4EF6\uFF1B\u300C\u6570\u636E\u5B57\u5178\u7ED1\u5B9A\u300D\u65E0\u72EC\u7ACB type\uFF0C\u7528 datarequest + fields:{"_type_spe":"dictbind","logiccode":"100000000001100001"}\u3002`;
736
737
  FUNCTION_ENUM = `\u3010function \u679A\u4E3E\u3011dddlayer\uFF08\u51FD\u6570\u5C42\u7EA7\uFF09\uFF1A\u56FA\u5B9A\u4F20 "3"\uFF08\u51FD\u6570\u7C7B\uFF09\u3002\u6570\u636E\u5E93\u51FD\u6570 publishstatus\uFF1A1-\u672A\u53D1\u5E03 / 2-\u5DF2\u53D1\u5E03\u3002`;
737
738
  }
738
739
  });
@@ -2607,14 +2608,14 @@ var init_schemas2 = __esm({
2607
2608
  relationobjectcode: z6.string().optional().nullable().describe("\u5173\u8054\u7684\u5B9E\u4F53\u7F16\u7801\uFF0C\u6B64\u5C5E\u6027\u5173\u8054\u4E86\u5176\u4ED6\u5B9E\u4F53\uFF0C\u5219\u8BF4\u660E SQL \u67E5\u8BE2\u7684\u65F6\u5019\u53EF\u4EE5\u7528\u6B64\u5B57\u6BB5\u8FDE\u5176\u4ED6\u5B9E\u4F53\u5BF9\u5E94\u7684\u8868\u7684\u4E3B\u952E"),
2608
2609
  relationpropertycode: z6.string().optional().nullable().describe("\u4FDD\u7559\u5B57\u6BB5\uFF0C\u4E00\u822C\u4E3A\u7A7A\u5B57\u7B26\u4E32\u3002\u89C6\u56FE/\u6570\u636E\u5B57\u5178/\u8D85\u7EA7\u8868\u5355\u5B9E\u4F53\u7F3A\u7701"),
2609
2610
  status: z6.union([z6.string(), z6.number()]).optional().nullable().describe("\u5C5E\u6027\u7684\u72B6\u6001\uFF0C1-\u542F\u7528\uFF1B2-\u505C\u7528\u3002\u6570\u636E\u5B57\u5178/\u8D85\u7EA7\u8868\u5355\u4EE5\u6570\u5B57\u8FD4\u56DE"),
2610
- seq: z6.coerce.number().optional().nullable().describe("\u5C5E\u6027\u5E8F\u53F7\u3002\u89C6\u56FE/\u6570\u636E\u5B57\u5178/\u8D85\u7EA7\u8868\u5355\u5B9E\u4F53\u8FD4\u56DE"),
2611
+ seq: z6.union([z6.string(), z6.number()]).optional().nullable().describe("\u5C5E\u6027\u5E8F\u53F7\u3002\u89C6\u56FE/\u6570\u636E\u5B57\u5178/\u8D85\u7EA7\u8868\u5355\u5B9E\u4F53\u8FD4\u56DE"),
2611
2612
  columnnameError: z6.boolean().optional().nullable().describe("\u89C6\u56FE\u5B9E\u4F53\u5C5E\u6027\u5B57\u6BB5\uFF0C\u6807\u8BB0\u5217\u540D\u662F\u5426\u9519\u8BEF\uFF0C\u4EC5\u89C6\u56FE\u8FD4\u56DE"),
2612
2613
  candelete: z6.boolean().optional().nullable().describe("\u89C6\u56FE\u5B9E\u4F53\u5C5E\u6027\u5B57\u6BB5\uFF0C\u6807\u8BB0\u662F\u5426\u53EF\u5220\u9664\uFF0C\u4EC5\u89C6\u56FE\u8FD4\u56DE"),
2613
2614
  parentpropertycode: z6.string().optional().nullable().describe("\u6570\u636E\u5B57\u5178\u5C5E\u6027\u5B57\u6BB5\uFF0C\u7236\u5C5E\u6027\u7F16\u7801\uFF0C\u4EC5\u6570\u636E\u5B57\u5178\u8FD4\u56DE"),
2614
2615
  defaultvalue: z6.string().optional().nullable().describe("\u6570\u636E\u5B57\u5178\u5C5E\u6027\u5B57\u6BB5\uFF0C\u9ED8\u8BA4\u503C\uFF0C\u4EC5\u6570\u636E\u5B57\u5178\u8FD4\u56DE")
2615
2616
  }).catchall(z6.unknown()));
2616
2617
  entityResultShape = {
2617
- confsource: z6.coerce.number().optional().nullable().describe("\u914D\u7F6E\u6765\u6E90\uFF0C\u542B\u4E49\uFF1A1-IDE\u914D\u7F6E\uFF1B2-\u7528\u6237\u7EA7\u914D\u7F6E\u3002\u6570\u636E\u5B57\u5178\u5B9E\u4F53\u4E0D\u8FD4\u56DE"),
2618
+ confsource: z6.union([z6.string(), z6.number()]).optional().nullable().describe("\u914D\u7F6E\u6765\u6E90\uFF0C\u542B\u4E49\uFF1A1-IDE\u914D\u7F6E\uFF1B2-\u7528\u6237\u7EA7\u914D\u7F6E\u3002\u6570\u636E\u5B57\u5178\u5B9E\u4F53\u4E0D\u8FD4\u56DE"),
2618
2619
  datapattern: z6.union([z6.string(), z6.number()]).optional().nullable().describe("\u6570\u636E\u6A21\u5F0F\uFF0C\u542B\u4E49\uFF1A1-\u539F\u751F\u5B9E\u4F53\uFF1B2-\u884D\u751F\u5B9E\u4F53\uFF1B3-\u89C6\u56FE\uFF1B4-\u8D85\u7EA7\u8868\u5355\u5B9E\u4F53\u3002\u6CE8\u610F\uFF1A\u8BE6\u60C5\u63A5\u53E3(getBizObject)\u591A\u6570\u5B9E\u4F53\u7C7B\u578B\u4E0D\u8FD4\u56DE\u8BE5\u5B57\u6BB5\uFF08\u5B83\u662F\u5217\u8868\u63A5\u53E3\u5B57\u6BB5\uFF09\uFF0C\u6545\u58F0\u660E\u4E3A\u53EF\u9009\uFF1B\u8D85\u7EA7\u8868\u5355\u4EE5\u6570\u5B57\u8FD4\u56DE"),
2619
2620
  diclayer: z6.union([z6.string(), z6.number()]).optional().nullable().describe("\u5B57\u5178\u5C42\u7EA7\uFF0C\u539F\u751F/\u5173\u8054\u5B9E\u4F53/\u6570\u636E\u5B57\u5178\u4EE5\u5B57\u7B26\u4E32\u8FD4\u56DE\uFF0C\u89C6\u56FE/\u8D85\u7EA7\u8868\u5355\u4EE5\u6570\u5B57\u8FD4\u56DE"),
2620
2621
  directorytypecode: z6.string().optional().nullable().describe("\u5B9E\u4F53\u6240\u5C5E\u76EE\u5F55\u5206\u7C7B\u7684\u7F16\u7801"),
@@ -2629,11 +2630,11 @@ var init_schemas2 = __esm({
2629
2630
  objecttypecode: z6.union([z6.string(), z6.number()]).optional().nullable().describe("\u5B9E\u4F53\u5206\u7C7B\uFF0C\u6574\u6570\uFF0C\u542B\u4E49\uFF1A1-\u57FA\u672C\u5B9E\u4F53\uFF1B2-\u6811\u5F62\u5B9E\u4F53\uFF1B3-\u6570\u636E\u5B57\u5178\uFF1B4-\u5173\u8054\u5B9E\u4F53\u3002\u6570\u636E\u5B57\u5178\u4EE5\u6570\u5B57\u8FD4\u56DE"),
2630
2631
  parentobjectcode: z6.string().optional().nullable().describe("\u7236\u5B9E\u4F53\u7684 objectcode\u3002\u8D85\u7EA7\u8868\u5355\u5B9E\u4F53\u4E0D\u8FD4\u56DE"),
2631
2632
  properties: entityPropertySchema.optional().nullable().describe("\u5B9E\u4F53\u7684\u5C5E\u6027\u6570\u7EC4\uFF1A\u6BCF\u4E2A\u5C5E\u6027\u5B9A\u4E49\u5B9E\u4F53\u7684\u4E00\u4E2A\u5B57\u6BB5\uFF08\u5217\u540D\u3001\u7C7B\u578B\u3001\u5173\u8054\u5B9E\u4F53\u3001\u7D22\u5F15\u65B9\u5F0F\u7B49\uFF09"),
2632
- publishstatus: z6.coerce.number().optional().nullable().describe("\u5B9E\u4F53\u7684\u53D1\u5E03\u72B6\u6001\uFF0C1-\u5DF2\u53D1\u5E03\uFF1B2-\u672A\u53D1\u5E03"),
2633
+ publishstatus: z6.union([z6.string(), z6.number()]).optional().nullable().describe("\u5B9E\u4F53\u7684\u53D1\u5E03\u72B6\u6001\uFF0C1-\u5DF2\u53D1\u5E03\uFF1B2-\u672A\u53D1\u5E03"),
2633
2634
  script: z6.string().optional().nullable().describe("\u4FDD\u7559\u5B57\u6BB5/\u5B9A\u4E49\u811A\u672C\uFF0C\u539F\u751F/\u89C6\u56FE/\u5173\u8054\u5B9E\u4F53\u8FD4\u56DE\uFF0C\u4E00\u822C\u4E3A\u7A7A\u5B57\u7B26\u4E32"),
2634
2635
  status: z6.union([z6.string(), z6.number()]).optional().nullable().describe("\u5B9E\u4F53\u7684\u72B6\u6001\uFF0C1-\u542F\u7528\uFF1B2-\u505C\u7528\u3002\u6570\u636E\u5B57\u5178/\u89C6\u56FE/\u8D85\u7EA7\u8868\u5355\u4EE5\u6570\u5B57\u8FD4\u56DE\uFF1B\u8BE6\u60C5\u63A5\u53E3\u5BF9\u8BE5\u5B57\u6BB5\u8FD4\u56DE\u4E0D\u7A33\u5B9A\uFF08\u90E8\u5206\u8C03\u7528\u4E0D\u8FD4\u56DE\uFF09\uFF0C\u6545\u58F0\u660E\u4E3A\u53EF\u9009"),
2635
- storagelevel: z6.coerce.number().optional().nullable().describe("\u5B58\u50A8\u7B49\u7EA7\u3002\u89C6\u56FE/\u6570\u636E\u5B57\u5178/\u8D85\u7EA7\u8868\u5355\u5B9E\u4F53\u4E0D\u8FD4\u56DE"),
2636
- seq: z6.coerce.number().optional().nullable().describe("\u5B9E\u4F53\u5E8F\u53F7\u3002\u4EC5\u89C6\u56FE/\u8D85\u7EA7\u8868\u5355\u5B9E\u4F53\u8FD4\u56DE"),
2636
+ storagelevel: z6.union([z6.string(), z6.number()]).optional().nullable().describe("\u5B58\u50A8\u7B49\u7EA7\u3002\u89C6\u56FE/\u6570\u636E\u5B57\u5178/\u8D85\u7EA7\u8868\u5355\u5B9E\u4F53\u4E0D\u8FD4\u56DE"),
2637
+ seq: z6.union([z6.string(), z6.number()]).optional().nullable().describe("\u5B9E\u4F53\u5E8F\u53F7\u3002\u4EC5\u89C6\u56FE/\u8D85\u7EA7\u8868\u5355\u5B9E\u4F53\u8FD4\u56DE"),
2637
2638
  tablename: z6.string().optional().nullable().describe("\u6570\u636E\u5E93\u8868\u540D")
2638
2639
  };
2639
2640
  entityResultSchema = z6.looseObject(entityResultShape);
@@ -2672,28 +2673,28 @@ ${ENTITY_ENUM}`,
2672
2673
  },
2673
2674
  outputSchema: {
2674
2675
  data: z7.array(z7.object({
2675
- confsource: z7.coerce.number().optional().nullable().describe("\u914D\u7F6E\u6765\u6E90\uFF0C\u542B\u4E49\uFF1A1-IDE\u914D\u7F6E\uFF1B2-\u7528\u6237\u7EA7\u914D\u7F6E"),
2676
- createaccountcode: z7.coerce.number().optional().nullable().describe("\u521B\u5EFA\u4EBA\u7684\u8D26\u53F7 code"),
2676
+ confsource: z7.union([z7.string(), z7.number()]).optional().nullable().describe("\u914D\u7F6E\u6765\u6E90\uFF0C\u542B\u4E49\uFF1A1-IDE\u914D\u7F6E\uFF1B2-\u7528\u6237\u7EA7\u914D\u7F6E"),
2677
+ createaccountcode: z7.union([z7.string(), z7.number()]).optional().nullable().describe("\u521B\u5EFA\u4EBA\u7684\u8D26\u53F7 code"),
2677
2678
  createaccountname: z7.string().optional().nullable().describe("\u521B\u5EFA\u4EBA\u59D3\u540D"),
2678
2679
  createtime: z7.string().optional().nullable().describe("\u521B\u5EFA\u65F6\u95F4"),
2679
- datapattern: z7.coerce.number().optional().nullable().describe("\u6570\u636E\u6A21\u5F0F\uFF0C\u542B\u4E49\uFF1A1-\u539F\u751F\u5B9E\u4F53\uFF1B2-\u884D\u751F\u5B9E\u4F53\uFF1B3-\u89C6\u56FE\uFF1B4-\u8D85\u7EA7\u8868\u5355\u5B9E\u4F53\u3002\u539F\u751F\u5B9E\u4F53\uFF1A\u9700\u8981\u5728\u6570\u636E\u5E93\u771F\u6B63\u521B\u5EFA\u8868\uFF1B\u884D\u751F\u3001\u89C6\u56FE\uFF1A\u4E0D\u9700\u8981\u5728\u6570\u636E\u5E93\u771F\u6B63\u521B\u5EFA\u8868\uFF1B\u8D85\u7EA7\u8868\u5355\u5B9E\u4F53\uFF1A\u9700\u8981\u5728\u6570\u636E\u5E93\u771F\u6B63\u521B\u5EFA\u8868\uFF0C\u4F46\u662F\u662F\u5E73\u53F0\u6839\u636E\u7528\u6237\u7684\u914D\u7F6E\u81EA\u52A8\u521B\u5EFA\u7684\uFF0C\u8868\u540D\u65E0\u542B\u4E49"),
2680
+ datapattern: z7.union([z7.string(), z7.number()]).optional().nullable().describe("\u6570\u636E\u6A21\u5F0F\uFF0C\u542B\u4E49\uFF1A1-\u539F\u751F\u5B9E\u4F53\uFF1B2-\u884D\u751F\u5B9E\u4F53\uFF1B3-\u89C6\u56FE\uFF1B4-\u8D85\u7EA7\u8868\u5355\u5B9E\u4F53\u3002\u539F\u751F\u5B9E\u4F53\uFF1A\u9700\u8981\u5728\u6570\u636E\u5E93\u771F\u6B63\u521B\u5EFA\u8868\uFF1B\u884D\u751F\u3001\u89C6\u56FE\uFF1A\u4E0D\u9700\u8981\u5728\u6570\u636E\u5E93\u771F\u6B63\u521B\u5EFA\u8868\uFF1B\u8D85\u7EA7\u8868\u5355\u5B9E\u4F53\uFF1A\u9700\u8981\u5728\u6570\u636E\u5E93\u771F\u6B63\u521B\u5EFA\u8868\uFF0C\u4F46\u662F\u662F\u5E73\u53F0\u6839\u636E\u7528\u6237\u7684\u914D\u7F6E\u81EA\u52A8\u521B\u5EFA\u7684\uFF0C\u8868\u540D\u65E0\u542B\u4E49"),
2680
2681
  directorytypecode: z7.string().optional().nullable().describe("\u5B9E\u4F53\u6240\u5C5E\u76EE\u5F55\u5206\u7C7B\u7684\u7F16\u7801"),
2681
2682
  directorytypename: z7.string().optional().nullable().describe("\u5B9E\u4F53\u6240\u5C5E\u76EE\u5F55\u5206\u7C7B\u7684\u540D\u79F0"),
2682
2683
  hasoffline: z7.string().optional().nullable().describe("\u5B9E\u4F53\u662F\u5426\u6709\u79BB\u7EBF\u8BBE\u7F6E\uFF0C1-\u6709\uFF1B0-\u65E0"),
2683
- marktype: z7.coerce.number().optional().nullable().describe("\u521B\u5EFA\u6807\u8BB0\uFF1A0-\u5E73\u53F0\uFF1B1-\u4EA7\u54C1\uFF1B2-\u79DF\u6237"),
2684
+ marktype: z7.union([z7.string(), z7.number()]).optional().nullable().describe("\u521B\u5EFA\u6807\u8BB0\uFF1A0-\u5E73\u53F0\uFF1B1-\u4EA7\u54C1\uFF1B2-\u79DF\u6237"),
2684
2685
  metamodelcode: z7.string().optional().nullable().describe("\u9886\u57DF\u6A21\u578B\u7F16\u7801\uFF0C\u548C objectcode \u5171\u540C\u6784\u6210\u590D\u5408\u4E3B\u952E"),
2685
- objectcatgory: z7.coerce.number().optional().nullable().describe("\u5BF9\u8C61\u7C7B\u522B\uFF0C\u8868\u793A\u662F\u5426\u4E3A\u6743\u9650\u8BBE\u7F6E\u5BF9\u8C61\uFF0C1-\u662F\uFF1B2-\u5426"),
2686
+ objectcatgory: z7.union([z7.string(), z7.number()]).optional().nullable().describe("\u5BF9\u8C61\u7C7B\u522B\uFF0C\u8868\u793A\u662F\u5426\u4E3A\u6743\u9650\u8BBE\u7F6E\u5BF9\u8C61\uFF0C1-\u662F\uFF1B2-\u5426"),
2686
2687
  objectcode: z7.string().optional().nullable().describe("\u5B9E\u4F53\u7684\u7F16\u7801\uFF0C\u548C metamodelcode \u5171\u540C\u6784\u6210\u590D\u5408\u4E3B\u952E"),
2687
2688
  objectdescr: z7.string().optional().nullable().describe("\u5B9E\u4F53\u7684\u63CF\u8FF0"),
2688
2689
  objectmark: z7.string().optional().nullable().describe("\u5B9E\u4F53\u6807\u8BB0\uFF0C\u4E00\u822C\u548C\u6570\u636E\u5E93\u8868\u540D\u540C\u540D\uFF0C\u5B57\u5178\u7C7B\u578B\u7684\u5B9E\u4F53\u6709\u81EA\u5DF1\u7684\u6807\u8BB0"),
2689
2690
  objectname: z7.string().optional().nullable().describe("\u5B9E\u4F53\u7684\u4E2D\u6587\u540D\uFF0C\u4FBF\u4E8E\u9605\u8BFB"),
2690
2691
  objecttemplatecode: z7.string().optional().nullable().describe("\u5B9E\u4F53\u7684\u6A21\u677F\u7F16\u7801"),
2691
- objecttypecode: z7.string().optional().nullable().describe("\u5B9E\u4F53\u5206\u7C7B\uFF0C\u6574\u6570\uFF0C\u542B\u4E49\uFF1A1-\u57FA\u672C\u5B9E\u4F53\uFF1B2-\u6811\u5F62\u5B9E\u4F53\uFF1B3-\u6570\u636E\u5B57\u5178\uFF1B4-\u5173\u8054\u5B9E\u4F53"),
2692
+ objecttypecode: z7.union([z7.string(), z7.number()]).optional().nullable().describe("\u5B9E\u4F53\u5206\u7C7B\uFF0C\u6574\u6570\uFF0C\u542B\u4E49\uFF1A1-\u57FA\u672C\u5B9E\u4F53\uFF1B2-\u6811\u5F62\u5B9E\u4F53\uFF1B3-\u6570\u636E\u5B57\u5178\uFF1B4-\u5173\u8054\u5B9E\u4F53"),
2692
2693
  parentobjectcode: z7.string().optional().nullable().describe("\u7236\u5B9E\u4F53\u7684 objectcode"),
2693
- publishstatus: z7.coerce.number().optional().nullable().describe("\u5B9E\u4F53\u7684\u53D1\u5E03\u72B6\u6001\uFF0C1-\u5DF2\u53D1\u5E03\uFF1B2-\u672A\u53D1\u5E03"),
2694
- status: z7.coerce.number().optional().nullable().describe("\u5B9E\u4F53\u7684\u72B6\u6001\uFF0C1-\u542F\u7528\uFF1B2-\u505C\u7528"),
2694
+ publishstatus: z7.union([z7.string(), z7.number()]).optional().nullable().describe("\u5B9E\u4F53\u7684\u53D1\u5E03\u72B6\u6001\uFF0C1-\u5DF2\u53D1\u5E03\uFF1B2-\u672A\u53D1\u5E03"),
2695
+ status: z7.union([z7.string(), z7.number()]).optional().nullable().describe("\u5B9E\u4F53\u7684\u72B6\u6001\uFF0C1-\u542F\u7528\uFF1B2-\u505C\u7528"),
2695
2696
  tablename: z7.string().optional().nullable().describe("\u6570\u636E\u5E93\u8868\u540D"),
2696
- updateaccountcode: z7.coerce.number().optional().nullable().describe("\u6700\u8FD1\u66F4\u65B0\u4EBA\u7684\u8D26\u53F7\u7F16\u7801"),
2697
+ updateaccountcode: z7.union([z7.string(), z7.number()]).optional().nullable().describe("\u6700\u8FD1\u66F4\u65B0\u4EBA\u7684\u8D26\u53F7\u7F16\u7801"),
2697
2698
  updateaccountname: z7.string().optional().nullable().describe("\u6700\u8FD1\u66F4\u65B0\u4EBA\u7684\u59D3\u540D"),
2698
2699
  updatetime: z7.string().optional().nullable().describe("\u6700\u8FD1\u66F4\u65B0\u65F6\u95F4")
2699
2700
  }).catchall(z7.unknown())).describe("\u8FD9\u4E00\u9875\u7684\u4E1A\u52A1\u6570\u636E"),
@@ -3908,7 +3909,57 @@ async function getFormFragment(code, opts) {
3908
3909
  message: fragmentMessage
3909
3910
  };
3910
3911
  }
3911
- async function applyFormOp(form, op, index) {
3912
+ function buildAction(input) {
3913
+ const { type } = input;
3914
+ const base = structuredClone(ACTION_TEMPLATES[type] ?? {});
3915
+ const action = {
3916
+ code: input.code,
3917
+ type,
3918
+ desc: input.desc ?? ACTION_TYPE_LABELS[type],
3919
+ condition: input.condition ?? "",
3920
+ ...base
3921
+ };
3922
+ if (type === "flycode" && input.script != null) action.script = input.script;
3923
+ if (input.fields) Object.assign(action, input.fields);
3924
+ return action;
3925
+ }
3926
+ function nextActionCode(handlerCode, actions) {
3927
+ const suffix = handlerCode.replace(/[^0-9A-Za-z_]/g, "").slice(-8) || "action";
3928
+ const used = new Set(actions.map((a) => a?.code).filter((c) => Boolean(c)));
3929
+ const base = `action_${suffix}`;
3930
+ if (!used.has(base)) return base;
3931
+ let n = 2;
3932
+ while (used.has(`${base}_${n}`)) n++;
3933
+ return `${base}_${n}`;
3934
+ }
3935
+ function locateAction(actions, actionCode, actionIndex) {
3936
+ if (actionCode != null && actionCode !== "") {
3937
+ const found = actions.find((a) => a?.code === actionCode);
3938
+ if (!found) return { error: "NODE_NOT_FOUND", message: `\u672A\u627E\u5230 actionCode=${actionCode}\uFF08\u8BE5 handler \u4E0B\u73B0\u6709 code\uFF1A${actions.map((a) => a?.code ?? "(\u7A7A)").join(", ") || "\u65E0"}\uFF09` };
3939
+ return { action: found };
3940
+ }
3941
+ const ai = actionIndex ?? 0;
3942
+ if (!Number.isInteger(ai) || ai < 0 || ai >= actions.length) {
3943
+ return { error: "NO_TARGET", message: `actionIndex=${ai} \u8D8A\u754C\uFF0C\u8BE5 handler \u5171\u6709 ${actions.length} \u4E2A action` };
3944
+ }
3945
+ const target = actions[ai];
3946
+ if (!target) return { error: "NODE_NOT_FOUND", message: `actionIndex=${ai} \u5904\u4E3A\u7A7A` };
3947
+ return { action: target };
3948
+ }
3949
+ function locateActionForVerify(form2, baseline, op, resolvedCode) {
3950
+ const actions = findPresenterHandlers(form2, op.handlerCode, op.scope)[0]?.handler.actions ?? [];
3951
+ const code = resolvedCode || (op.actionCode != null && op.actionCode !== "" ? op.actionCode : "");
3952
+ if (code) {
3953
+ return actions.find((a) => a?.code === code) ?? void 0;
3954
+ }
3955
+ const idx = op.actionIndex ?? 0;
3956
+ if (baseline) {
3957
+ const baseAct = (findPresenterHandlers(baseline, op.handlerCode, op.scope)[0]?.handler.actions ?? [])[idx];
3958
+ if (baseAct?.code) return actions.find((a) => a?.code === baseAct.code) ?? void 0;
3959
+ }
3960
+ return actions[idx] ?? void 0;
3961
+ }
3962
+ async function applyFormOp(form, op, index, resolvedActionCodes) {
3912
3963
  const ok = (extra = {}) => ({
3913
3964
  index,
3914
3965
  op: op.op,
@@ -4097,6 +4148,113 @@ async function applyFormOp(form, op, index) {
4097
4148
  label: `action ${op.actionCode ?? op.actionIndex ?? 0}`
4098
4149
  });
4099
4150
  }
4151
+ case "add_action": {
4152
+ const found = findPresenterHandlers(form, op.handlerCode, op.scope);
4153
+ if (found.length === 0) {
4154
+ return fail("NODE_NOT_FOUND", `\u672A\u5728 presenter\uFF08handlers \u4E0E initial\uFF09\u4E2D\u627E\u5230 handlerCode=${op.handlerCode}`);
4155
+ }
4156
+ if (found.length > 1) {
4157
+ return fail("DUP_CODE", `handlerCode=${op.handlerCode} \u5728 handlers \u4E0E initial \u4E2D\u540C\u65F6\u51FA\u73B0\uFF0C\u8BF7\u7528 scope \u6307\u5B9A\u552F\u4E00\u5BB9\u5668`);
4158
+ }
4159
+ const { handler, scope } = found[0];
4160
+ const type = op.type ?? "flycode";
4161
+ if (!FORM_ACTION_TYPES.includes(type)) {
4162
+ return fail("INVALID_PARAMS", `\u672A\u77E5 action type=${String(type)}\uFF0C\u53EF\u9009\u503C\u89C1 FORM_ACTION_TYPES`);
4163
+ }
4164
+ if (scope === "initial" && !INITIAL_ACTION_TYPES.includes(type)) {
4165
+ return fail(
4166
+ "TYPE_NOT_ALLOWED",
4167
+ `\u521D\u59CB\u5316\u4E8B\u4EF6\uFF08initial\uFF09\u4E2D\u7684 action \u4EC5\u652F\u6301 flycode / receivelink\uFF08\u63A5\u6536\u53C2\u6570\uFF09\uFF0C\u4E0D\u652F\u6301 type=${type}\uFF1B\u8BE5\u7C7B\u52A8\u4F5C\u8BF7\u52A0\u5230 handlers \u4E8B\u4EF6\u4E2D`
4168
+ );
4169
+ }
4170
+ if (op.script != null && type !== "flycode") {
4171
+ return fail("INVALID_PARAMS", `script \u4EC5\u9002\u7528\u4E8E type="flycode"\uFF1Btype=${type} \u8BF7\u6539\u7528 fields \u4F20\u8BE5\u7C7B\u578B\u5B57\u6BB5\uFF08\u5982 urllink \u7684 url\u3001toast \u7684 message\uFF09`);
4172
+ }
4173
+ if (op.fields && Object.prototype.hasOwnProperty.call(op.fields, "type")) {
4174
+ return fail("INVALID_PARAMS", "fields \u4E0D\u80FD\u8986\u76D6 type\uFF0C\u8BF7\u7528 type \u53C2\u6570\u6307\u5B9A\u52A8\u4F5C\u7C7B\u578B");
4175
+ }
4176
+ const actions = handler.actions ?? (handler.actions = []);
4177
+ const code = op.code ?? nextActionCode(op.handlerCode, actions);
4178
+ if (!code) return fail("INVALID_PARAMS", "action code \u4E0D\u80FD\u4E3A\u7A7A");
4179
+ if (actions.some((a) => a?.code === code)) {
4180
+ return fail("DUP_CODE", `handler ${op.handlerCode} \u4E2D\u5DF2\u5B58\u5728 code=${code} \u7684 action\uFF0C\u8BF7\u6362\u4E00\u4E2A code`);
4181
+ }
4182
+ const action = buildAction({
4183
+ type,
4184
+ code,
4185
+ desc: op.desc,
4186
+ condition: op.condition,
4187
+ script: op.script,
4188
+ fields: op.fields
4189
+ });
4190
+ const pos = op.position ?? actions.length;
4191
+ actions.splice(pos, 0, action);
4192
+ return ok({
4193
+ message: `\u5DF2\u5728 ${scope} \u7684 handler ${op.handlerCode} \u7684 position=${pos} \u63D2\u5165 action code=${code}\uFF08type=${type}\uFF0Cdesc=${String(action.desc)}\uFF09`
4194
+ });
4195
+ }
4196
+ case "patch_action": {
4197
+ const found = findPresenterHandlers(form, op.handlerCode, op.scope);
4198
+ if (found.length === 0) {
4199
+ return fail("NODE_NOT_FOUND", `\u672A\u5728 presenter\uFF08handlers \u4E0E initial\uFF09\u4E2D\u627E\u5230 handlerCode=${op.handlerCode}`);
4200
+ }
4201
+ if (found.length > 1) {
4202
+ return fail("DUP_CODE", `handlerCode=${op.handlerCode} \u5728 handlers \u4E0E initial \u4E2D\u540C\u65F6\u51FA\u73B0\uFF0C\u8BF7\u7528 scope \u6307\u5B9A\u552F\u4E00\u5BB9\u5668`);
4203
+ }
4204
+ const { handler, scope } = found[0];
4205
+ const actions = handler.actions ?? [];
4206
+ const located = locateAction(actions, op.actionCode, op.actionIndex);
4207
+ if ("error" in located) return fail(located.error, located.message);
4208
+ const act = located.action;
4209
+ const patch = op.patch ?? {};
4210
+ const keys = Object.keys(patch);
4211
+ if (keys.length === 0) return fail("INVALID_PARAMS", "patch \u4E0D\u80FD\u4E3A\u7A7A\uFF0C\u8BF7\u7ED9\u51FA\u8981\u4FEE\u6539\u7684\u5B57\u6BB5");
4212
+ if (keys.includes("type")) {
4213
+ return fail(
4214
+ "INVALID_PARAMS",
4215
+ `patch \u4E0D\u80FD\u8986\u76D6 type\uFF08\u5F53\u524D ${String(act.type)}\uFF09\uFF1Atype \u51B3\u5B9A\u8BE5\u52A8\u4F5C\u7684\u5B57\u6BB5\u9AA8\u67B6\uFF0C\u76F4\u63A5\u6539\u4F1A\u6B8B\u7559\u65E7\u7C7B\u578B\u5B57\u6BB5\uFF1B\u6362\u7C7B\u578B\u8BF7 remove_action + add_action`
4216
+ );
4217
+ }
4218
+ if (keys.includes("code")) {
4219
+ return fail(
4220
+ "INVALID_PARAMS",
4221
+ "patch \u4E0D\u80FD\u8986\u76D6 code\uFF1Aaction code \u662F\u540E\u7EED\u5B9A\u4F4D\uFF08replace_script / patch_action_array_item\uFF09\u4E0E\u56DE\u8BFB\u6821\u9A8C\u7684\u952E\uFF0C\u91CD\u547D\u540D\u8BF7 remove_action + add_action"
4222
+ );
4223
+ }
4224
+ if (keys.includes("script")) {
4225
+ if (act.type !== "flycode") {
4226
+ return fail("INVALID_PARAMS", `script \u4EC5\u9002\u7528\u4E8E type="flycode"\uFF1B\u5F53\u524D action type=${String(act.type)}\uFF0C\u5176\u5B57\u6BB5\u8BF7\u76F4\u63A5\u5199\u8FDB patch`);
4227
+ }
4228
+ if (typeof patch.script !== "string") {
4229
+ return fail("INVALID_PARAMS", "patch.script \u5FC5\u987B\u662F\u5B57\u7B26\u4E32");
4230
+ }
4231
+ }
4232
+ Object.assign(act, patch);
4233
+ resolvedActionCodes?.set(index, act.code == null ? null : String(act.code));
4234
+ return ok({
4235
+ message: `\u5DF2\u66F4\u65B0 ${scope} \u7684 handler ${op.handlerCode} \u4E2D action code=${String(act.code)} \u7684 ${keys.join(", ")}`
4236
+ });
4237
+ }
4238
+ case "remove_action": {
4239
+ const found = findPresenterHandlers(form, op.handlerCode, op.scope);
4240
+ if (found.length === 0) {
4241
+ return fail("NODE_NOT_FOUND", `\u672A\u5728 presenter\uFF08handlers \u4E0E initial\uFF09\u4E2D\u627E\u5230 handlerCode=${op.handlerCode}`);
4242
+ }
4243
+ if (found.length > 1) {
4244
+ return fail("DUP_CODE", `handlerCode=${op.handlerCode} \u5728 handlers \u4E0E initial \u4E2D\u540C\u65F6\u51FA\u73B0\uFF0C\u8BF7\u7528 scope \u6307\u5B9A\u552F\u4E00\u5BB9\u5668`);
4245
+ }
4246
+ const { handler, scope } = found[0];
4247
+ const actions = handler.actions ?? [];
4248
+ const located = locateAction(actions, op.actionCode, op.actionIndex);
4249
+ if ("error" in located) return fail(located.error, located.message);
4250
+ const idx = actions.indexOf(located.action);
4251
+ const removedCode = located.action.code ?? "";
4252
+ actions.splice(idx, 1);
4253
+ resolvedActionCodes?.set(index, removedCode || null);
4254
+ return ok({
4255
+ message: `\u5DF2\u4ECE ${scope} \u7684 handler ${op.handlerCode} \u5220\u9664 action code=${removedCode || `#${idx}`}\uFF08type=${String(located.action.type)}\uFF09\uFF0C\u5269\u4F59 ${actions.length} \u4E2A`
4256
+ });
4257
+ }
4100
4258
  case "insert_node": {
4101
4259
  const parent = findViewNode(form.view?.body ?? null, op.parentCode);
4102
4260
  if (!parent) return fail("NODE_NOT_FOUND", `\u672A\u5728 view \u6811\u4E2D\u627E\u5230 parentCode=${op.parentCode} \u7684\u7236\u8282\u70B9`);
@@ -4244,7 +4402,7 @@ function drillToArray(base, arrayProp, elementArrayProp, itemKey, itemKeyValue,
4244
4402
  if (!Array.isArray(nested)) return { error: `${arrayProp}[${itemKey}=${String(itemKeyValue)}].${elementArrayProp} \u975E\u6570\u7EC4` };
4245
4403
  return { finalArr: nested, finalProp: `${arrayProp}[${itemKey}=${String(itemKeyValue)}].${elementArrayProp}` };
4246
4404
  }
4247
- function verifyPatch(form2, ops) {
4405
+ function verifyPatch(form2, ops, baseline, resolvedActionCodes) {
4248
4406
  const problems = [];
4249
4407
  const nodes = collectAllNodes(form2);
4250
4408
  const codeSet = new Set(nodes.map((n) => n.code).filter((c) => Boolean(c)));
@@ -4384,6 +4542,87 @@ function verifyPatch(form2, ops) {
4384
4542
  }
4385
4543
  break;
4386
4544
  }
4545
+ case "add_action": {
4546
+ const found = findPresenterHandlers(form2, op.handlerCode, op.scope);
4547
+ if (found.length !== 1) {
4548
+ problems.push(`ops[${i}] add_action handler \u672A\u627E\u5230\u6216\u5B58\u5728\u540C\u540D\u6B67\u4E49`);
4549
+ break;
4550
+ }
4551
+ const actions = found[0].handler.actions ?? [];
4552
+ const type = op.type ?? "flycode";
4553
+ let target;
4554
+ if (op.code) {
4555
+ target = actions.find((a) => a?.code === op.code);
4556
+ } else if (baseline) {
4557
+ const baseHandler = findPresenterHandlers(baseline, op.handlerCode, op.scope)[0]?.handler;
4558
+ const baseCodes = new Set(
4559
+ (baseHandler?.actions ?? []).map((a) => a?.code).filter((c) => Boolean(c))
4560
+ );
4561
+ target = actions.filter((a) => a?.code && !baseCodes.has(a.code)).find((a) => a.type === type);
4562
+ } else {
4563
+ const idx = op.position ?? actions.length - 1;
4564
+ const cand = actions[idx];
4565
+ if (cand && cand.type === type) target = cand;
4566
+ }
4567
+ if (!target) {
4568
+ problems.push(`ops[${i}] add_action \u65B0 action \u672A\u51FA\u73B0\uFF08handler ${op.handlerCode}\uFF09`);
4569
+ break;
4570
+ }
4571
+ if (target.type !== type) {
4572
+ problems.push(`ops[${i}] add_action.type \u672A\u751F\u6548\uFF08\u671F\u671B ${type}\uFF0C\u5B9E\u9645 ${String(target.type)}\uFF09`);
4573
+ }
4574
+ if (type === "flycode" && op.script != null) {
4575
+ if (normalizeText(String(target.script ?? "")) !== normalizeText(op.script)) {
4576
+ problems.push(`ops[${i}] add_action.script \u672A\u751F\u6548`);
4577
+ }
4578
+ }
4579
+ for (const [k, v] of Object.entries(op.fields ?? {})) {
4580
+ if (JSON.stringify(target[k]) !== JSON.stringify(v)) {
4581
+ problems.push(`ops[${i}] add_action.${k} \u672A\u751F\u6548`);
4582
+ }
4583
+ }
4584
+ break;
4585
+ }
4586
+ case "patch_action": {
4587
+ const found = findPresenterHandlers(form2, op.handlerCode, op.scope);
4588
+ if (found.length !== 1) {
4589
+ problems.push(`ops[${i}] patch_action handler \u672A\u627E\u5230\u6216\u5B58\u5728\u540C\u540D\u6B67\u4E49`);
4590
+ break;
4591
+ }
4592
+ const act = locateActionForVerify(form2, baseline, op, resolvedActionCodes?.get(i));
4593
+ if (!act) {
4594
+ problems.push(`ops[${i}] patch_action action \u672A\u627E\u5230\uFF08handler ${op.handlerCode}\uFF09`);
4595
+ break;
4596
+ }
4597
+ const rec = act;
4598
+ for (const [k, v] of Object.entries(op.patch ?? {})) {
4599
+ const same = k === "script" && typeof v === "string" ? normalizeText(String(rec.script ?? "")) === normalizeText(v) : JSON.stringify(rec[k]) === JSON.stringify(v);
4600
+ if (!same) problems.push(`ops[${i}] patch_action.${k} \u672A\u751F\u6548`);
4601
+ }
4602
+ break;
4603
+ }
4604
+ case "remove_action": {
4605
+ const found = findPresenterHandlers(form2, op.handlerCode, op.scope);
4606
+ if (found.length !== 1) {
4607
+ problems.push(`ops[${i}] remove_action handler \u672A\u627E\u5230\u6216\u5B58\u5728\u540C\u540D\u6B67\u4E49`);
4608
+ break;
4609
+ }
4610
+ const actions = found[0].handler.actions ?? [];
4611
+ let code = resolvedActionCodes?.get(i) ?? "";
4612
+ if (!code && op.actionCode != null && op.actionCode !== "") code = op.actionCode;
4613
+ if (!code && baseline) {
4614
+ const baseAct = (findPresenterHandlers(baseline, op.handlerCode, op.scope)[0]?.handler.actions ?? [])[op.actionIndex ?? 0];
4615
+ code = baseAct?.code ?? "";
4616
+ }
4617
+ if (!code) {
4618
+ problems.push(`ops[${i}] remove_action \u65E0\u6CD5\u786E\u5B9A\u88AB\u5220\u9664\u7684 action\uFF08\u672A\u7ED9 actionCode\uFF0C\u843D\u5E93\u524D\u57FA\u7EBF\u5BF9\u5E94\u4E0B\u6807\u4E5F\u6CA1\u6709 code\uFF09`);
4619
+ break;
4620
+ }
4621
+ if (actions.some((a) => a?.code === code)) {
4622
+ problems.push(`ops[${i}] remove_action \u52A8\u4F5C ${code} \u4ECD\u5B58\u5728`);
4623
+ }
4624
+ break;
4625
+ }
4387
4626
  case "insert_node":
4388
4627
  if (!codeSet.has(op.node.code)) problems.push(`ops[${i}] insert_node \u8282\u70B9\u672A\u51FA\u73B0`);
4389
4628
  break;
@@ -4448,6 +4687,28 @@ function verifyPatch(form2, ops) {
4448
4687
  }
4449
4688
  return { verified: problems.length === 0, problems };
4450
4689
  }
4690
+ function normalizeOpScope(ops) {
4691
+ const out = [];
4692
+ for (let i = 0; i < ops.length; i++) {
4693
+ const raw = ops[i];
4694
+ const alias = raw.handlerScope;
4695
+ if (alias !== "handlers" && alias !== "initial") {
4696
+ out.push(ops[i]);
4697
+ continue;
4698
+ }
4699
+ const explicit = raw.scope;
4700
+ if ((explicit === "handlers" || explicit === "initial") && explicit !== alias) {
4701
+ return {
4702
+ ops,
4703
+ error: `ops[${i}]\uFF08op=${String(raw.op)}\uFF09\u540C\u65F6\u7ED9\u4E86 scope="${explicit}" \u4E0E handlerScope="${alias}"\uFF0C\u4E24\u8005\u542B\u4E49\u76F8\u540C\u4F46\u53D6\u503C\u51B2\u7A81\uFF1B\u8BF7\u53EA\u4FDD\u7559\u4E00\u4E2A`
4704
+ };
4705
+ }
4706
+ const next = { ...raw, scope: alias };
4707
+ delete next.handlerScope;
4708
+ out.push(next);
4709
+ }
4710
+ return { ops: out };
4711
+ }
4451
4712
  async function patchForm(code, ops, commitMessage, options = {}) {
4452
4713
  const dryRun = options.dryRun ?? false;
4453
4714
  const verify = options.verify ?? true;
@@ -4463,6 +4724,11 @@ async function patchForm(code, ops, commitMessage, options = {}) {
4463
4724
  if (!Array.isArray(ops) || ops.length === 0) {
4464
4725
  return abort("EMPTY_OPS", "ops \u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u5143\u7D20");
4465
4726
  }
4727
+ const scopeNormalized = normalizeOpScope(ops);
4728
+ if (scopeNormalized.error) {
4729
+ return abort("INVALID_PARAMS", scopeNormalized.error);
4730
+ }
4731
+ ops = scopeNormalized.ops;
4466
4732
  let form;
4467
4733
  try {
4468
4734
  const res = await getForm({ code });
@@ -4475,10 +4741,11 @@ async function patchForm(code, ops, commitMessage, options = {}) {
4475
4741
  }
4476
4742
  const work = structuredClone(form);
4477
4743
  const opResults = [];
4744
+ const resolvedActionCodes = /* @__PURE__ */ new Map();
4478
4745
  let failed = false;
4479
4746
  for (let i = 0; i < ops.length; i++) {
4480
4747
  try {
4481
- const r = await applyFormOp(work, ops[i], i);
4748
+ const r = await applyFormOp(work, ops[i], i, resolvedActionCodes);
4482
4749
  opResults.push(r);
4483
4750
  if (r.status === "FAILED") failed = true;
4484
4751
  } catch (e) {
@@ -4545,7 +4812,7 @@ async function patchForm(code, ops, commitMessage, options = {}) {
4545
4812
  verified = false;
4546
4813
  message = `${savedText} | \u56DE\u8BFB\u6821\u9A8C\u5931\u8D25\uFF1A\u91CD\u65B0\u67E5\u8BE2\u4E3A\u7A7A`;
4547
4814
  } else {
4548
- const v = verifyPatch(form2, ops);
4815
+ const v = verifyPatch(form2, ops, form, resolvedActionCodes);
4549
4816
  verified = v.verified;
4550
4817
  if (!v.verified) message = `${savedText} | \u56DE\u8BFB\u6821\u9A8C\u672A\u901A\u8FC7\uFF1A${v.problems.join("\uFF1B")}`;
4551
4818
  }
@@ -4575,7 +4842,7 @@ async function saveForm2(form, commitMessage) {
4575
4842
  return { ok: false, code: form.pageinfo?.code ?? void 0, message: extractError(e) };
4576
4843
  }
4577
4844
  }
4578
- var MAX_DIFF_LINES2;
4845
+ var FORM_ACTION_TYPES, INITIAL_ACTION_TYPES, ACTION_TYPE_LABELS, ACTION_TEMPLATES, MAX_DIFF_LINES2;
4579
4846
  var init_form2 = __esm({
4580
4847
  "src/service/form.ts"() {
4581
4848
  "use strict";
@@ -4585,6 +4852,229 @@ var init_form2 = __esm({
4585
4852
  init_error();
4586
4853
  init_str_replace();
4587
4854
  init_directory2();
4855
+ FORM_ACTION_TYPES = [
4856
+ "flycode",
4857
+ "datarequest",
4858
+ "datasubmit",
4859
+ "dataimport",
4860
+ "dataexport",
4861
+ "datatransfer",
4862
+ "dataserialize",
4863
+ "smartrequest",
4864
+ "link",
4865
+ "call",
4866
+ "return",
4867
+ "af_preaddflow",
4868
+ "af_handleflow",
4869
+ "af_flowdetail",
4870
+ "ctrlevent",
4871
+ "receivelink",
4872
+ "eventlink",
4873
+ "attributeevaluate",
4874
+ "alert",
4875
+ "toast",
4876
+ "share",
4877
+ "popsubview",
4878
+ "closesubview",
4879
+ "print",
4880
+ "urllink",
4881
+ "runevent"
4882
+ ];
4883
+ INITIAL_ACTION_TYPES = ["flycode", "receivelink"];
4884
+ ACTION_TYPE_LABELS = {
4885
+ flycode: "flycode",
4886
+ datarequest: "\u6570\u636E\u8BF7\u6C42",
4887
+ datasubmit: "\u6570\u636E\u63D0\u4EA4",
4888
+ dataimport: "\u5BFC\u5165\u884C\u4E3A",
4889
+ dataexport: "\u5BFC\u51FA\u884C\u4E3A",
4890
+ datatransfer: "\u6570\u636E\u8F6C\u79FB",
4891
+ dataserialize: "\u6570\u636E\u5E8F\u5217\u5316",
4892
+ smartrequest: "\u667A\u6167\u573A\u666F\u8BF7\u6C42",
4893
+ link: "\u94FE\u63A5",
4894
+ call: "\u4E8B\u4EF6\u547C\u53EB",
4895
+ return: "\u8FD4\u56DE",
4896
+ af_preaddflow: "\u6D41\u7A0B\u53D1\u8D77",
4897
+ af_handleflow: "\u5904\u7406\u5BA1\u6279",
4898
+ af_flowdetail: "\u6D41\u7A0B\u8282\u70B9\u8BE6\u60C5",
4899
+ ctrlevent: "\u8C03\u7528\u63A7\u4EF6\u4E8B\u4EF6",
4900
+ receivelink: "\u63A5\u6536\u53C2\u6570",
4901
+ eventlink: "\u4E8B\u4EF6\u76D1\u542C",
4902
+ attributeevaluate: "\u5C5E\u6027\u8868\u8FBE\u5F0F\u884C\u4E3A",
4903
+ alert: "\u63D0\u793A\u5F39\u7A97",
4904
+ toast: "\u8F7B\u63D0\u793A",
4905
+ share: "\u5206\u4EAB\u884C\u4E3A",
4906
+ popsubview: "\u6253\u5F00popview",
4907
+ closesubview: "\u5173\u95EDpopview",
4908
+ print: "\u6253\u5370\u4E8B\u4EF6",
4909
+ urllink: "URL\u94FE\u63A5",
4910
+ runevent: "\u6267\u884C\u4E8B\u4EF6"
4911
+ };
4912
+ ACTION_TEMPLATES = {
4913
+ flycode: { script: "" },
4914
+ datarequest: {
4915
+ logiccode: "",
4916
+ mode: "1",
4917
+ queue: "0",
4918
+ pagesize: "",
4919
+ pagesource: "",
4920
+ hasextraparams: "",
4921
+ sorter: "",
4922
+ getter: [],
4923
+ setter: []
4924
+ },
4925
+ datasubmit: { logiccode: "", queue: "0", mode: "1", getter: [], setter: [] },
4926
+ dataimport: {
4927
+ logiccode: "",
4928
+ mode: "1",
4929
+ servicetype: "background",
4930
+ microclass: "",
4931
+ template: "",
4932
+ templatename: "",
4933
+ extraparam: [{
4934
+ title: "\u5F53\u6570\u636E\u91CD\u590D\u65F6\u5982\u4F55\u5904\u7406",
4935
+ paramkey: "_dataaddmode",
4936
+ requesturl: "",
4937
+ options: [
4938
+ { text: "\u8986\u76D6", key: "1", isselected: "" },
4939
+ { text: "\u8FFD\u52A0", key: "2", isselected: "" },
4940
+ { text: "\u653E\u5F03", key: "3", isselected: "" }
4941
+ ]
4942
+ }],
4943
+ getter: [],
4944
+ setter: [],
4945
+ onsuccess: ""
4946
+ },
4947
+ dataexport: {
4948
+ logiccode: "",
4949
+ servicetype: "",
4950
+ dynamicparmsource: "",
4951
+ microclass: "",
4952
+ colselectable: "",
4953
+ sheetname: "",
4954
+ filename: "",
4955
+ mode: "1",
4956
+ getter: [],
4957
+ setter: [],
4958
+ extraparam: [{ requesturl: "" }],
4959
+ extconfig: {
4960
+ filetype: ["1"],
4961
+ exportcontent: ["excel", "link", "photo"],
4962
+ iscompress: "1",
4963
+ imagetype: "origin",
4964
+ imagesizepercolumn: "5",
4965
+ imageheightcm: "2.0",
4966
+ filewatermark: "0",
4967
+ filewatermarkvalue: "1"
4968
+ },
4969
+ enableattachmentexport: "",
4970
+ attachmentexportsetting: {
4971
+ attachmentfields: [],
4972
+ foldernamefields: [],
4973
+ attachmentnamefields: [],
4974
+ separator: "_"
4975
+ }
4976
+ },
4977
+ datatransfer: { getter: [], setter: [] },
4978
+ dataserialize: { targetname: "", param: { datatype: "0", ctrl: { code: "", scope: "" }, properties: [] } },
4979
+ smartrequest: {
4980
+ agentcode: "",
4981
+ agent_id: "",
4982
+ agent_name: "",
4983
+ agent_version_name: "",
4984
+ agent_version_id: "",
4985
+ queue: "",
4986
+ streaming: "",
4987
+ smartctrl: "",
4988
+ getter: [{ name: "scene_param", datatype: "0", ctrl: { code: "", scope: "" }, properties: [] }],
4989
+ setter: [{ name: "scene_data", datatype: "0", ctrlcode: "", properties: [] }]
4990
+ },
4991
+ link: {
4992
+ title: "",
4993
+ pagecode: "",
4994
+ mode: "popup",
4995
+ closeicon: "1",
4996
+ closewindowicon: "1",
4997
+ onreturn: "",
4998
+ pagesize: { width: "", height: "" },
4999
+ pagesizeWidth: "",
5000
+ pagesizeHeight: "",
5001
+ param: { name: "__linkparam", datatype: "0", ctrl: { code: "", scope: "" }, properties: [] }
5002
+ },
5003
+ call: {
5004
+ pagecode: "",
5005
+ "event-key": "",
5006
+ key: "",
5007
+ isbroadcast: "0",
5008
+ param: { name: "__linkparam", datatype: "0", ctrl: { code: "", scope: "" }, properties: [] }
5009
+ },
5010
+ return: { pagecode: "", pagecount: "" },
5011
+ af_preaddflow: {
5012
+ af_processdefinekey: "",
5013
+ title: "",
5014
+ mode: "popup",
5015
+ pagesizeWidth: "",
5016
+ pagesizeHeight: "",
5017
+ pagesize: { width: "", height: "" },
5018
+ newversion: "1",
5019
+ param: { name: "__linkparam", datatype: "0", ctrl: { code: "", scope: "" }, properties: [] }
5020
+ },
5021
+ af_handleflow: {
5022
+ processinfo: [
5023
+ { name: "af_processdefineid", value: "", ctrl: { code: "", component: "" } },
5024
+ { name: "af_processinstanceid", value: "", ctrl: { code: "", component: "" } },
5025
+ { name: "af_taskid", value: "", ctrl: { code: "", component: "" } },
5026
+ { name: "af_taskkey", value: "", ctrl: { code: "", component: "" } },
5027
+ { name: "af_processinstancename", value: "", ctrl: { code: "", component: "" } }
5028
+ ],
5029
+ newversion: "1",
5030
+ param: { name: "__linkparam", datatype: "0", ctrl: { code: "", scope: "" }, properties: [] }
5031
+ },
5032
+ af_flowdetail: {
5033
+ param: {
5034
+ name: "__linkparam",
5035
+ datatype: "0",
5036
+ ctrl: { code: "", scope: "" },
5037
+ properties: [
5038
+ { name: "af_processinstanceid", value: "", ctrl: { code: "", component: "" } },
5039
+ { name: "af_processdefinekey", value: "", ctrl: { code: "", component: "" } },
5040
+ { name: "af_processinstancename", value: "", ctrl: { code: "", component: "" } }
5041
+ ]
5042
+ }
5043
+ },
5044
+ ctrlevent: { ctrlcode: "", trigger: "" },
5045
+ receivelink: {
5046
+ param: {
5047
+ name: "__linkparam",
5048
+ datatype: "0",
5049
+ ctrlcode: "",
5050
+ properties: [{ name: "__pagestatus", paramtype: "1", ctrl: { code: "", component: "" } }]
5051
+ }
5052
+ },
5053
+ eventlink: {
5054
+ key: "",
5055
+ handler: "",
5056
+ param: {
5057
+ name: "__linkparam",
5058
+ datatype: "0",
5059
+ ctrlcode: "",
5060
+ properties: [{ name: "__pagestatus", paramtype: "1", ctrl: { code: "", component: "" } }]
5061
+ }
5062
+ },
5063
+ attributeevaluate: { ctrlcode: "", attribute: "", expression: "" },
5064
+ alert: {
5065
+ noticestyle: "warning",
5066
+ message: "",
5067
+ buttons: "",
5068
+ choices: [{ title: "\u786E\u5B9A", handler: "" }, { title: "\u53D6\u6D88", handler: "" }]
5069
+ },
5070
+ toast: { message: "", title: "", noticestyle: "info", duration: "3", position: "top" },
5071
+ share: { provider: "", imagewidth: "" },
5072
+ popsubview: { viewcode: "", viewwidth: "", viewheight: "", viewtitle: "", popupmode: "center" },
5073
+ closesubview: {},
5074
+ print: { pagecode: "", ctrlcode: "", printmode: "image", printermodel: "custom", printerinfo: "" },
5075
+ urllink: { url: "", mode: "", targetctrl: "", queryparams: "", bodyparams: "" },
5076
+ runevent: { handler: "" }
5077
+ };
4588
5078
  MAX_DIFF_LINES2 = 150;
4589
5079
  }
4590
5080
  });
@@ -4985,6 +5475,7 @@ var init_write3 = __esm({
4985
5475
  actionIndex: z10.number().int().nonnegative().optional().describe("\u7B2C\u51E0\u4E2A action\uFF0C\u9ED8\u8BA4 0\uFF1B\u4E0E actionCode \u4E8C\u9009\u4E00"),
4986
5476
  actionCode: z10.string().optional().describe("\u4EE5 action code \u5B9A\u4F4D\uFF08\u4E0E actionIndex \u4E8C\u9009\u4E00\uFF09"),
4987
5477
  scope: z10.enum(["handlers", "initial"]).optional().describe("\u9650\u5B9A\u5904\u7406\u5668\u5BB9\u5668\uFF1B\u9ED8\u8BA4\u540C\u65F6\u68C0\u7D22 handlers \u4E0E initial\uFF0C\u540C\u540D\u8DE8\u5BB9\u5668\u65F6\u987B\u6307\u5B9A\u4EE5\u6D88\u6B67"),
5478
+ handlerScope: z10.enum(["handlers", "initial"]).optional().describe("scope \u7684\u7B49\u4EF7\u522B\u540D\uFF08\u4E0E get_form_fragment \u7684 handlerScope \u540C\u540D\uFF0C\u4E24\u8005\u4EFB\u4F20\u5176\u4E00\u5373\u53EF\uFF1B\u90FD\u4F20\u4E14\u53D6\u503C\u4E0D\u540C\u4F1A\u62A5 INVALID_PARAMS\uFF09"),
4988
5479
  parentProp: z10.string().optional().describe('\u6570\u7EC4\u6240\u5728\u7684\u5BB9\u5668\u5BF9\u8C61\u5C5E\u6027\u540D\uFF0C\u5982 "datarequest"\uFF08setter \u5728\u5176\u4E0B\uFF09\uFF1B\u7701\u7565\u8868\u793A\u6570\u7EC4\u76F4\u63A5\u6302\u5728 action \u4E0A'),
4989
5480
  arrayProp: z10.string().describe('\u8981\u6539\u7684\u6570\u7EC4\u5C5E\u6027\u540D\uFF0C\u5982 "setter"\uFF08datarequest.setter\uFF0C\u754C\u9762\u8F93\u51FA\u7ED1\u5B9A\u5230\u63A7\u4EF6\uFF09/ "properties"\uFF08receivelink \u7684 param.properties\uFF09'),
4990
5481
  mode: z10.enum(["merge", "append", "insert", "remove"]).describe("\u64CD\u4F5C\u6A21\u5F0F\uFF1Amerge=\u6D45\u5408\u5E76\u5230\u5DF2\u5B58\u5728\u5143\u7D20\uFF1Bappend=\u672B\u5C3E\u8FFD\u52A0 item\uFF1Binsert=\u6309 position \u63D2\u5165 item\uFF1Bremove=\u6309 itemKey \u5220\u9664\u5143\u7D20"),
@@ -4998,6 +5489,36 @@ var init_write3 = __esm({
4998
5489
  elementItemKeyValue: z10.unknown().optional().describe("\u4E24\u7EA7\u6A21\u5F0F\u4E0B\u5B9A\u4F4D\u5D4C\u5957\u6570\u7EC4\u5185\u67D0\u5B50\u5143\u7D20\u7684\u952E\u503C\uFF08merge/remove \u6A21\u5F0F\u7528\uFF09"),
4999
5490
  createIfMissing: z10.boolean().optional().describe("append/insert \u65F6\u82E5\u76EE\u6807\u5BB9\u5668/\u6570\u7EC4\uFF08\u542B\u4E24\u7EA7\u5D4C\u5957\u76EE\u6807\uFF09\u4E0D\u5B58\u5728\uFF0C\u662F\u5426\u5141\u8BB8\u81EA\u52A8\u65B0\u5EFA\uFF0C\u9ED8\u8BA4 false\u2014\u2014\u9ED8\u8BA4 fail-closed \u62A5 ARRAY_NOT_FOUND \u4EE5\u907F\u514D\u628A datarequest.setter \u8BEF\u5EFA\u5230\u9519\u8BEF\u5C42\u7EA7\uFF1B\u786E\u9700\u65B0\u5EFA\u624D\u7F6E true")
5000
5491
  }),
5492
+ z10.object({
5493
+ op: z10.literal("add_action"),
5494
+ handlerCode: z10.string().describe("presenter \u5904\u7406\u5668 code\uFF08handlers \u4E0E initial \u5747\u68C0\u7D22\uFF09"),
5495
+ scope: z10.enum(["handlers", "initial"]).optional().describe("\u9650\u5B9A\u5904\u7406\u5668\u5BB9\u5668\uFF1B\u9ED8\u8BA4\u540C\u65F6\u68C0\u7D22 handlers \u4E0E initial\uFF0C\u540C\u540D\u8DE8\u5BB9\u5668\u65F6\u987B\u6307\u5B9A\u4EE5\u6D88\u6B67"),
5496
+ handlerScope: z10.enum(["handlers", "initial"]).optional().describe("scope \u7684\u7B49\u4EF7\u522B\u540D\uFF08\u4E0E get_form_fragment \u7684 handlerScope \u540C\u540D\uFF0C\u4E24\u8005\u4EFB\u4F20\u5176\u4E00\u5373\u53EF\uFF1B\u90FD\u4F20\u4E14\u53D6\u503C\u4E0D\u540C\u4F1A\u62A5 INVALID_PARAMS\uFF09"),
5497
+ type: z10.enum(FORM_ACTION_TYPES).optional().describe("\u52A8\u4F5C\u7C7B\u578B\uFF0C\u9ED8\u8BA4 flycode\u3002initial\uFF08\u9875\u9762\u521D\u59CB\u5316\uFF09\u4EC5\u5141\u8BB8 flycode / receivelink\uFF1B\u5176\u4F59\u7C7B\u578B\u53EA\u80FD\u52A0\u5230 handlers \u4E8B\u4EF6\u91CC"),
5498
+ code: z10.string().optional().describe("\u52A8\u4F5C code\uFF0C\u9ED8\u8BA4 action_<handlerCode \u672B8\u4F4D>\uFF08\u540C handler \u5185\u91CD\u590D\u65F6\u81EA\u52A8\u8FFD\u52A0 _2/_3\uFF09\uFF1B\u540C\u4E00 handler \u5185\u5FC5\u987B\u552F\u4E00"),
5499
+ desc: z10.string().optional().describe("\u52A8\u4F5C\u663E\u793A\u540D\uFF0C\u9ED8\u8BA4\u53D6\u8BE5 type \u7684\u5E73\u53F0\u9ED8\u8BA4\u540D\uFF08\u5982 \u6570\u636E\u8BF7\u6C42 / \u8F7B\u63D0\u793A / \u63A5\u6536\u53C2\u6570\uFF09"),
5500
+ condition: z10.string().optional().describe("\u6267\u884C\u6761\u4EF6\uFF08flycode \u8868\u8FBE\u5F0F\uFF09\uFF0C\u9ED8\u8BA4\u7A7A\u4E32"),
5501
+ position: z10.number().int().nonnegative().optional().describe("\u63D2\u5165\u4F4D\u7F6E\u4E0B\u6807\uFF0C\u9ED8\u8BA4\u672B\u5C3E\u3002\u4E8B\u4EF6\u5185 action \u6309\u6570\u7EC4\u987A\u5E8F\u4E32\u884C\u6267\u884C"),
5502
+ script: z10.string().optional().describe('\u4EC5 type="flycode"\uFF1A\u811A\u672C\u5168\u6587\uFF1B\u5176\u5B83\u7C7B\u578B\u8BF7\u7528 fields'),
5503
+ fields: z10.record(z10.string(), z10.unknown()).optional().describe('\u5728\u7C7B\u578B\u6A21\u677F\u4E0A\u6D45\u5408\u5E76\u7684\u5B57\u6BB5\uFF0C\u5982 toast \u7684 { "message": "\u4FDD\u5B58\u6210\u529F" }\u3001urllink \u7684 { "url": "https://..." }\uFF1B\u4E0D\u80FD\u8986\u76D6 type')
5504
+ }),
5505
+ z10.object({
5506
+ op: z10.literal("patch_action"),
5507
+ handlerCode: z10.string().describe("presenter \u5904\u7406\u5668 code\uFF08handlers \u4E0E initial \u5747\u68C0\u7D22\uFF09"),
5508
+ actionCode: z10.string().optional().describe("\u8981\u6539\u7684 action code\uFF08\u4E0E actionIndex \u4E8C\u9009\u4E00\uFF0C\u4F18\u5148\uFF09\uFF1B\u6279\u91CF\u5220\u6539\u540E\u4E0B\u6807\u4F1A\u6F02\u79FB\uFF0C\u5EFA\u8BAE\u59CB\u7EC8\u7528 actionCode"),
5509
+ actionIndex: z10.number().int().nonnegative().optional().describe("\u8981\u6539\u7684 action \u4E0B\u6807\uFF0C\u9ED8\u8BA4 0\uFF1B\u4EC5\u5728\u65E0\u6CD5\u786E\u5B9A code \u65F6\u4F7F\u7528"),
5510
+ scope: z10.enum(["handlers", "initial"]).optional().describe("\u9650\u5B9A\u5904\u7406\u5668\u5BB9\u5668\uFF1B\u9ED8\u8BA4\u540C\u65F6\u68C0\u7D22 handlers \u4E0E initial\uFF0C\u540C\u540D\u8DE8\u5BB9\u5668\u65F6\u987B\u6307\u5B9A\u4EE5\u6D88\u6B67"),
5511
+ handlerScope: z10.enum(["handlers", "initial"]).optional().describe("scope \u7684\u7B49\u4EF7\u522B\u540D\uFF08\u4E0E get_form_fragment \u7684 handlerScope \u540C\u540D\uFF0C\u4E24\u8005\u4EFB\u4F20\u5176\u4E00\u5373\u53EF\uFF1B\u90FD\u4F20\u4E14\u53D6\u503C\u4E0D\u540C\u4F1A\u62A5 INVALID_PARAMS\uFF09"),
5512
+ patch: z10.record(z10.string(), z10.unknown()).describe('\u6D45\u5408\u5E76\u5230 action \u9876\u5C42\u7684\u5B57\u6BB5\uFF0C\u5982 { desc: "\u56FA\u5B9A\u5E95\u90E8" }\u3001{ message: "\u4FDD\u5B58\u6210\u529F" }\u3001{ logiccode: "L1", queue: "1" }\u3001{ condition: "a==1" }\u3002\u4E0D\u80FD\u542B type / code\uFF08\u6362\u7C7B\u578B\u6216\u6539\u540D\u8BF7 remove_action + add_action\uFF09\uFF1Bscript \u4EC5 type="flycode" \u53EF\u5199')
5513
+ }),
5514
+ z10.object({
5515
+ op: z10.literal("remove_action"),
5516
+ handlerCode: z10.string().describe("presenter \u5904\u7406\u5668 code\uFF08handlers \u4E0E initial \u5747\u68C0\u7D22\uFF09"),
5517
+ actionCode: z10.string().optional().describe("\u8981\u5220\u9664\u7684 action code\uFF08\u4E0E actionIndex \u4E8C\u9009\u4E00\uFF0C\u4F18\u5148\uFF09\uFF1B\u7F3A\u7701\u4E14\u53EA\u7ED9\u4E0B\u6807\u65F6\uFF0C\u56DE\u8BFB\u6821\u9A8C\u4F1A\u7528\u843D\u5E93\u524D\u57FA\u7EBF\u6309\u4E0B\u6807\u89E3\u6790 code"),
5518
+ actionIndex: z10.number().int().nonnegative().optional().describe("\u8981\u5220\u9664\u7684 action \u4E0B\u6807\uFF0C\u9ED8\u8BA4 0\uFF1B\u4EC5\u5728\u65E0\u6CD5\u786E\u5B9A code \u65F6\u4F7F\u7528"),
5519
+ scope: z10.enum(["handlers", "initial"]).optional().describe("\u9650\u5B9A\u5904\u7406\u5668\u5BB9\u5668\uFF1B\u9ED8\u8BA4\u540C\u65F6\u68C0\u7D22 handlers \u4E0E initial\uFF0C\u540C\u540D\u8DE8\u5BB9\u5668\u65F6\u987B\u6307\u5B9A\u4EE5\u6D88\u6B67"),
5520
+ handlerScope: z10.enum(["handlers", "initial"]).optional().describe("scope \u7684\u7B49\u4EF7\u522B\u540D\uFF08\u4E0E get_form_fragment \u7684 handlerScope \u540C\u540D\uFF0C\u4E24\u8005\u4EFB\u4F20\u5176\u4E00\u5373\u53EF\uFF1B\u90FD\u4F20\u4E14\u53D6\u503C\u4E0D\u540C\u4F1A\u62A5 INVALID_PARAMS\uFF09")
5521
+ }),
5001
5522
  z10.object({
5002
5523
  op: z10.literal("insert_node"),
5003
5524
  parentCode: z10.string().describe("\u7236\u8282\u70B9 code\uFF08view \u6811\u4E2D\uFF09"),
@@ -5027,6 +5548,7 @@ var init_write3 = __esm({
5027
5548
  actionCode: z10.string().optional().describe("\u4EE5 action code \u5B9A\u4F4D\uFF08\u4E0E actionIndex \u4E8C\u9009\u4E00\uFF09"),
5028
5549
  field: z10.enum(["script", "condition", "expression"]).optional().describe("\u76EE\u6807\u5B57\u7B26\u4E32\u5B57\u6BB5\uFF0C\u9ED8\u8BA4 script"),
5029
5550
  scope: z10.enum(["handlers", "initial"]).optional().describe("\u9650\u5B9A\u5904\u7406\u5668\u5BB9\u5668\uFF1B\u9ED8\u8BA4\u540C\u65F6\u68C0\u7D22 handlers \u4E0E initial\uFF0C\u540C\u540D\u8DE8\u5BB9\u5668\u65F6\u987B\u6307\u5B9A\u4EE5\u6D88\u6B67"),
5551
+ handlerScope: z10.enum(["handlers", "initial"]).optional().describe("scope \u7684\u7B49\u4EF7\u522B\u540D\uFF08\u4E0E get_form_fragment \u7684 handlerScope \u540C\u540D\uFF0C\u4E24\u8005\u4EFB\u4F20\u5176\u4E00\u5373\u53EF\uFF1B\u90FD\u4F20\u4E14\u53D6\u503C\u4E0D\u540C\u4F1A\u62A5 INVALID_PARAMS\uFF09"),
5030
5552
  replacement: z10.string().optional().describe("\u6574\u6BB5\u66FF\u6362\u6A21\u5F0F\uFF1A\u76F4\u63A5\u7ED9\u76EE\u6807\u5B57\u6BB5\u7684\u65B0\u5168\u6587\uFF0C\u4F18\u5148\u7EA7\u9AD8\u4E8E ops\uFF08\u9002\u5408\u6574\u6BB5\u91CD\u5199 action\uFF09"),
5031
5553
  ops: z10.array(z10.object({
5032
5554
  oldString: z10.string().describe("\u5F85\u66FF\u6362\u7684\u539F\u6587\u7247\u6BB5\uFF0C\u5FC5\u987B\u975E\u7A7A\u4E14\u552F\u4E00\u547D\u4E2D\uFF1B\u8BF7\u4ECE\u67E5\u8BE2\u5230\u7684\u811A\u672C\u539F\u6587\u539F\u6837\u590D\u5236\uFF08\u542B\u7F29\u8FDB\u4E0E\u6362\u884C\uFF09"),
@@ -5053,10 +5575,17 @@ var init_write3 = __esm({
5053
5575
  name: "patch_form",
5054
5576
  config: {
5055
5577
  title: "\u5C40\u90E8\u8865\u4E01\u4FEE\u6539\u8868\u5355/\u9875\u9762",
5056
- description: `\u4EE5 delta ops \u5C40\u90E8\u4FEE\u6539\u8868\u5355\uFF0C\u65E0\u9700\u56DE\u4F20\u5B8C\u6574 JSON\u300211 \u7C7B ops\uFF1Aset_pageinfo/set_attrs/patch_node_array_item/insert_node/remove_node/move_node/set_section/replace_script/add_businessmodel/remove_businessmodel/patch_action_array_item\u3002\u63A8\u8350\u6D41\u7A0B\uFF1Aget_form_outline \u62FF code \u2192 get_form_fragment \u786E\u8BA4\u771F\u5B9E\u5C5E\u6027\u540D/\u811A\u672C \u2192 patch_form\u3002ops \u4E8B\u52A1\u6027\u9884\u6F14\uFF0C\u5931\u8D25\u6574\u6279\u56DE\u6EDA\uFF1B\u6539\u521D\u59CB\u5316\u811A\u672C\uFF08presenter.initial\uFF09\u4E0E\u6539\u6309\u94AE\u4E8B\u4EF6\u7528\u6CD5\u4E00\u81F4\u3002
5578
+ description: `\u4EE5 delta ops \u5C40\u90E8\u4FEE\u6539\u8868\u5355\uFF0C\u65E0\u9700\u56DE\u4F20\u5B8C\u6574 JSON\u300214 \u7C7B ops\uFF1Aset_pageinfo/set_attrs/patch_node_array_item/patch_action_array_item/add_action/patch_action/remove_action/insert_node/remove_node/move_node/set_section/replace_script/add_businessmodel/remove_businessmodel\u3002\u63A8\u8350\u6D41\u7A0B\uFF1Aget_form_outline \u62FF code \u2192 get_form_fragment \u786E\u8BA4\u771F\u5B9E\u5C5E\u6027\u540D/\u811A\u672C \u2192 patch_form\u3002ops \u4E8B\u52A1\u6027\u9884\u6F14\uFF0C\u5931\u8D25\u6574\u6279\u56DE\u6EDA\uFF1B\u6539\u521D\u59CB\u5316\u811A\u672C\uFF08presenter.initial\uFF09\u4E0E\u6539\u6309\u94AE\u4E8B\u4EF6\u7528\u6CD5\u4E00\u81F4\u3002
5057
5579
 
5058
5580
  \u6570\u7EC4\u5143\u7D20\u7EA7\u6539\u52A8\uFF1Apatch_node_array_item \u652F\u6301 merge(\u9ED8\u8BA4)/append/insert/remove \u56DB\u79CD\u6A21\u5F0F\uFF0C\u4F5C\u7528\u4E8E view \u6811\u8282\u70B9\u7684 cols/options/content \u7B49\uFF1Bpatch_action_array_item \u7528\u4E8E presenter.handlers/initial \u4E2D\u67D0 action \u5185\u90E8\u6570\u7EC4\uFF08\u5982 datarequest.setter\u300C\u754C\u9762\u8F93\u51FA\u7ED1\u5B9A\u5230\u63A7\u4EF6\u300D\u3001param.properties\uFF09\uFF0C\u540C\u6837\u652F\u6301\u56DB\u79CD\u6A21\u5F0F\u3002\u4E24\u8005\u90FD\u652F\u6301\u300C\u4E24\u7EA7\u5D4C\u5957\u300D\uFF08elementArrayProp\uFF09\uFF1A\u5F53\u771F\u5B9E\u7ED1\u5B9A\u5728\u300C\u6570\u7EC4\u5185\u67D0\u5143\u7D20\u7684\u5D4C\u5957\u6570\u7EC4\u300D\uFF08\u5982 datarequest.setter[0].properties \u6A21\u578B\u7EA7\u5C5E\u6027\u6620\u5C04\uFF09\u65F6\uFF0C\u7528 itemKey/itemKeyValue \u5148\u5B9A\u4F4D\u5916\u5C42\u5143\u7D20\u3001\u518D\u586B elementArrayProp \u94BB\u5230\u5D4C\u5957\u6570\u7EC4\u64CD\u4F5C\uFF0C\u65E0\u9700\u56DE\u4F20\u6574\u6BB5\u6570\u7EC4\u3002append/insert \u76EE\u6807\u6570\u7EC4\u4E0D\u5B58\u5728\u65F6\u9ED8\u8BA4 fail-closed \u62A5 ARRAY_NOT_FOUND\uFF08\u987B\u663E\u5F0F createIfMissing:true \u624D\u65B0\u5EFA\uFF09\uFF0C\u907F\u514D\u8BEF\u9020\u5E73\u884C orphan \u7ED3\u6784\uFF1Bremove \u6E05\u7A7A\u8C03\u5219\u5220\u9664\u8BE5\u6570\u7EC4\u5C5E\u6027\u907F\u514D\u7A7A\u58F3\u3002set_attrs \u9ED8\u8BA4\u7981\u6B62\u6574\u6BB5\u8986\u76D6\u6570\u7EC4\uFF08\u542B\u6570\u7EC4\u5C5E\u6027\u987B\u663E\u5F0F overwriteArray:true\uFF0C\u5426\u5219\u6539\u7528\u4E0A\u8FF0\u4E24 op\uFF09\u3002
5059
5581
 
5582
+ **\u52A0\u4E00\u4E2A\u65B0\u52A8\u4F5C**\uFF08\u6B64\u524D\u53EA\u80FD\u6574\u6BB5 set_section \u6216\u5168\u91CF save_form\uFF09\uFF1A\u7528 add_action \u5F80\u67D0 handler \u7684 actions \u8FFD\u52A0\u4E00\u6761\uFF0C\u6309 type \u81EA\u52A8\u8865\u5E73\u53F0\u7A7A\u9AA8\u67B6\uFF0C\u53EA\u9700\u4F20\u5173\u952E\u5B57\u6BB5\u3002\u4F8B\uFF1A\u7ED9\u521D\u59CB\u5316\u4E8B\u4EF6\u8FFD\u52A0\u811A\u672C {handlerCode, script:"..."}\uFF1B\u7ED9\u4E8B\u4EF6\u52A0\u8F7B\u63D0\u793A {handlerCode, type:"toast", fields:{message:"\u4FDD\u5B58\u6210\u529F"}}\u3002initial \u4EC5\u652F\u6301 flycode / receivelink\u3002
5583
+
5584
+ **\u6539/\u5220\u5DF2\u6709\u52A8\u4F5C**\uFF1Apatch_action \u6D45\u5408\u5E76\u4EFB\u610F\u5B57\u6BB5\uFF08desc / condition / message / url / logiccode / queue \u7B49\uFF0Cscript \u4EC5 flycode\uFF09\uFF0C\u4E0D\u80FD\u6539 type \u4E0E code\uFF1B\u6362\u7C7B\u578B\u6216\u6539\u540D\u7528 remove_action + add_action\u3002replace_script \u53EA\u7BA1 script/condition/expression \u4E09\u4E2A\u5B57\u7B26\u4E32\u5B57\u6BB5\u7684\u6587\u672C\u66FF\u6362\uFF0C\u6539\u5176\u5B83\u5B57\u6BB5\u7528 patch_action\u3002\u5220\u9664\u540E\u4FDD\u7559 actions: []\u3002\u5B9A\u4F4D\u4E00\u5F8B\u7528 actionCode\uFF08\u4E0B\u6807\u4F1A\u968F\u540C\u6279\u6B21\u589E\u5220\u6F02\u79FB\uFF09\u3002
5585
+
5586
+ **\u5BB9\u5668\u6D88\u6B67\u53C2\u6570**\uFF1A\u9700\u8981\u9650\u5B9A handlers / initial \u7684 op\uFF08patch_action_array_item / replace_script / add_action / patch_action / remove_action\uFF09\u540C\u65F6\u63A5\u53D7 scope \u4E0E handlerScope\uFF0C\u4E24\u8005\u7B49\u4EF7\uFF08\u8BFB\u5DE5\u5177 get_form_fragment \u7528\u7684\u662F handlerScope\uFF09\uFF1B\u90FD\u4F20\u4E14\u53D6\u503C\u4E0D\u540C\u4F1A\u62A5 INVALID_PARAMS\u3002
5587
+
5588
+ ${FORM_ACTION_ENUM}
5060
5589
  ${FORM_ENUM}`,
5061
5590
  inputSchema: {
5062
5591
  code: z10.string().describe("\u76EE\u6807\u8868\u5355/\u9875\u9762\u7684\u552F\u4E00\u7F16\u7801"),
@@ -5070,7 +5599,7 @@ ${FORM_ENUM}`,
5070
5599
  ok: z10.boolean().describe("\u6574\u4F53\u662F\u5426\u6210\u529F\uFF08dryRun \u6210\u529F\u4E5F\u4E3A true\uFF0C\u4F46 applied=false\uFF09"),
5071
5600
  applied: z10.boolean().describe("\u662F\u5426\u5DF2\u843D\u5E93\uFF1BdryRun \u6216\u4EFB\u4E00 op \u9884\u6F14\u5931\u8D25\u65F6\u4E3A false"),
5072
5601
  verified: z10.boolean().nullable().describe("\u4FDD\u5B58\u540E\u56DE\u8BFB\u6821\u9A8C\u7ED3\u679C\uFF1Atrue \u5168\u90E8\u751F\u6548\u3001false \u5B58\u5728\u5F02\u5E38\u3001null \u672A\u843D\u5E93\u6216\u672A\u5F00\u542F\u6821\u9A8C"),
5073
- errorCode: z10.string().describe("\u9519\u8BEF\u7801\uFF1AOK / DRY_RUN / EMPTY_OPS / FETCH_FAILED / NODE_NOT_FOUND / DUP_CODE / REF_VIOLATION / OPS_FAILED / SAVE_FAILED / VERIFY_FAILED / ARRAY_OVERWRITE_BLOCKED / ARRAY_NOT_FOUND / NO_TARGET / INVALID_PARAMS"),
5602
+ errorCode: z10.string().describe("\u9519\u8BEF\u7801\uFF1AOK / DRY_RUN / EMPTY_OPS / FETCH_FAILED / NODE_NOT_FOUND / DUP_CODE / REF_VIOLATION / OPS_FAILED / SAVE_FAILED / VERIFY_FAILED / ARRAY_OVERWRITE_BLOCKED / ARRAY_NOT_FOUND / TYPE_NOT_ALLOWED / NO_TARGET / INVALID_PARAMS"),
5074
5603
  message: z10.string().describe("\u7ED3\u679C\u8BF4\u660E\uFF1B\u5931\u8D25\u65F6\u7ED9\u51FA\u53EF\u76F4\u63A5\u6267\u884C\u7684\u5904\u7406\u5EFA\u8BAE"),
5075
5604
  diff: z10.string().describe("\u5168\u90E8 op \u7684 diff \u7247\u6BB5\uFF0C\u8D85\u957F\u4F1A\u622A\u65AD\uFF1B\u53EA\u56DE\u6539\u52A8\u6458\u8981\uFF0C\u4E0D\u56DE\u6574\u4EFD\u8868\u5355"),
5076
5605
  ops: z10.array(z10.object({