@josephyan/qingflow-cli 0.2.0-beta.984 → 0.2.0-beta.986

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 (43) hide show
  1. package/README.md +2 -2
  2. package/docs/local-agent-install.md +70 -11
  3. package/package.json +1 -1
  4. package/pyproject.toml +1 -1
  5. package/src/qingflow_mcp/__init__.py +1 -1
  6. package/src/qingflow_mcp/builder_facade/service.py +47 -21
  7. package/src/qingflow_mcp/cli/commands/auth.py +14 -43
  8. package/src/qingflow_mcp/cli/commands/task.py +4 -1
  9. package/src/qingflow_mcp/cli/commands/workspace.py +0 -8
  10. package/src/qingflow_mcp/cli/formatters.py +0 -21
  11. package/src/qingflow_mcp/config.py +39 -0
  12. package/src/qingflow_mcp/errors.py +2 -2
  13. package/src/qingflow_mcp/public_surface.py +2 -6
  14. package/src/qingflow_mcp/response_trim.py +1 -8
  15. package/src/qingflow_mcp/server.py +1 -1
  16. package/src/qingflow_mcp/server_app_builder.py +4 -28
  17. package/src/qingflow_mcp/server_app_user.py +4 -28
  18. package/src/qingflow_mcp/session_store.py +31 -5
  19. package/src/qingflow_mcp/tools/ai_builder_tools.py +117 -1
  20. package/src/qingflow_mcp/tools/app_tools.py +51 -1
  21. package/src/qingflow_mcp/tools/approval_tools.py +82 -1
  22. package/src/qingflow_mcp/tools/auth_tools.py +258 -288
  23. package/src/qingflow_mcp/tools/base.py +204 -4
  24. package/src/qingflow_mcp/tools/code_block_tools.py +21 -0
  25. package/src/qingflow_mcp/tools/custom_button_tools.py +24 -1
  26. package/src/qingflow_mcp/tools/directory_tools.py +28 -1
  27. package/src/qingflow_mcp/tools/feedback_tools.py +8 -0
  28. package/src/qingflow_mcp/tools/file_tools.py +25 -1
  29. package/src/qingflow_mcp/tools/import_tools.py +40 -1
  30. package/src/qingflow_mcp/tools/navigation_tools.py +34 -1
  31. package/src/qingflow_mcp/tools/package_tools.py +37 -1
  32. package/src/qingflow_mcp/tools/portal_tools.py +28 -1
  33. package/src/qingflow_mcp/tools/qingbi_report_tools.py +38 -1
  34. package/src/qingflow_mcp/tools/record_tools.py +255 -2
  35. package/src/qingflow_mcp/tools/repository_dev_tools.py +21 -2
  36. package/src/qingflow_mcp/tools/resource_read_tools.py +23 -1
  37. package/src/qingflow_mcp/tools/role_tools.py +19 -1
  38. package/src/qingflow_mcp/tools/solution_tools.py +56 -1
  39. package/src/qingflow_mcp/tools/task_context_tools.py +205 -6
  40. package/src/qingflow_mcp/tools/task_tools.py +49 -3
  41. package/src/qingflow_mcp/tools/view_tools.py +56 -1
  42. package/src/qingflow_mcp/tools/workflow_tools.py +65 -1
  43. package/src/qingflow_mcp/tools/workspace_tools.py +14 -225
@@ -40,7 +40,7 @@ from ..builder_facade.models import (
40
40
  )
41
41
  from ..builder_facade.service import AiBuilderFacade, INTEGRATION_OUTPUT_TARGET_FIELD_TYPES
42
42
  from .app_tools import AppTools
43
- from .base import ToolBase
43
+ from .base import ToolBase, tool_cn_name
44
44
  from .custom_button_tools import CustomButtonTools
45
45
  from .directory_tools import DirectoryTools
46
46
  from .package_tools import PackageTools
@@ -55,7 +55,17 @@ PUBLIC_STABLE_FLOW_NODE_TYPES = ["start", "approve", "fill", "copy", "webhook",
55
55
 
56
56
 
57
57
  class AiBuilderTools(ToolBase):
58
+ """AI Builder 工具(中文名:AI 搭建编排)。
59
+
60
+ 类型:应用搭建编排工具。
61
+ 主要职责:
62
+ 1. 编排 schema/layout/views/flow/charts 的计划与应用;
63
+ 2. 聚合 builder 侧读写与校验能力;
64
+ 3. 将复杂搭建流程收敛为可执行步骤。
65
+ """
66
+
58
67
  def __init__(self, sessions, backend) -> None:
68
+ """执行内部辅助逻辑。"""
59
69
  super().__init__(sessions, backend)
60
70
  self._facade = AiBuilderFacade(
61
71
  apps=AppTools(sessions, backend),
@@ -71,6 +81,7 @@ class AiBuilderTools(ToolBase):
71
81
  )
72
82
 
73
83
  def register(self, mcp) -> None:
84
+ """注册当前工具到 MCP 服务。"""
74
85
  @mcp.tool()
75
86
  def builder_tool_contract(tool_name: str = "") -> JSONObject:
76
87
  return self.builder_tool_contract(tool_name=tool_name)
@@ -451,7 +462,9 @@ class AiBuilderTools(ToolBase):
451
462
  expected_package_id=expected_package_id,
452
463
  )
453
464
 
465
+ @tool_cn_name("分组列表查询")
454
466
  def package_list(self, *, profile: str, trial_status: str = "all") -> JSONObject:
467
+ """执行分组与包相关逻辑。"""
455
468
  normalized_args = {"trial_status": trial_status}
456
469
  return _safe_tool_call(
457
470
  lambda: self._facade.package_list(profile=profile, trial_status=trial_status),
@@ -460,7 +473,9 @@ class AiBuilderTools(ToolBase):
460
473
  suggested_next_call={"tool_name": "package_list", "arguments": {"profile": profile, "trial_status": trial_status}},
461
474
  )
462
475
 
476
+ @tool_cn_name("分组解析")
463
477
  def package_resolve(self, *, profile: str, package_name: str) -> JSONObject:
478
+ """执行分组与包相关逻辑。"""
464
479
  normalized_args = {"package_name": package_name}
465
480
  return _safe_tool_call(
466
481
  lambda: self._facade.package_resolve(profile=profile, package_name=package_name),
@@ -469,7 +484,9 @@ class AiBuilderTools(ToolBase):
469
484
  suggested_next_call={"tool_name": "package_resolve", "arguments": {"profile": profile, "package_name": package_name}},
470
485
  )
471
486
 
487
+ @tool_cn_name("搭建工具契约查询")
472
488
  def builder_tool_contract(self, *, tool_name: str) -> JSONObject:
489
+ """执行工具方法逻辑。"""
473
490
  requested = str(tool_name or "").strip()
474
491
  public_tool_names = public_builder_contract_tool_names()
475
492
  if requested in _PRIVATE_BUILDER_TOOL_CONTRACTS:
@@ -519,6 +536,7 @@ class AiBuilderTools(ToolBase):
519
536
  "contract": contract,
520
537
  }
521
538
 
539
+ @tool_cn_name("分组创建")
522
540
  def package_create(
523
541
  self,
524
542
  *,
@@ -528,6 +546,7 @@ class AiBuilderTools(ToolBase):
528
546
  color: str | None = None,
529
547
  visibility: JSONObject | None = None,
530
548
  ) -> JSONObject:
549
+ """执行分组与包相关逻辑。"""
531
550
  visibility_patch = None
532
551
  if visibility is not None:
533
552
  try:
@@ -562,7 +581,9 @@ class AiBuilderTools(ToolBase):
562
581
  },
563
582
  )
564
583
 
584
+ @tool_cn_name("分组详情查询")
565
585
  def package_get(self, *, profile: str, package_id: int | None = None) -> JSONObject:
586
+ """执行分组与包相关逻辑。"""
566
587
  normalized_args = {"package_id": package_id}
567
588
  return _publicize_package_fields(_safe_tool_call(
568
589
  lambda: self._facade.package_get(profile=profile, package_id=package_id),
@@ -571,6 +592,7 @@ class AiBuilderTools(ToolBase):
571
592
  suggested_next_call={"tool_name": "package_get", "arguments": {"profile": profile, "package_id": package_id}},
572
593
  ))
573
594
 
595
+ @tool_cn_name("分组配置应用")
574
596
  def package_apply(
575
597
  self,
576
598
  *,
@@ -584,6 +606,7 @@ class AiBuilderTools(ToolBase):
584
606
  items: list[dict] | None = None,
585
607
  allow_detach: bool = False,
586
608
  ) -> JSONObject:
609
+ """执行分组与包相关逻辑。"""
587
610
  visibility_patch = None
588
611
  if visibility is not None:
589
612
  try:
@@ -617,6 +640,7 @@ class AiBuilderTools(ToolBase):
617
640
  suggested_next_call={"tool_name": "package_apply", "arguments": {"profile": profile, **normalized_args}},
618
641
  ))
619
642
 
643
+ @tool_cn_name("分组更新")
620
644
  def package_update(
621
645
  self,
622
646
  *,
@@ -627,6 +651,7 @@ class AiBuilderTools(ToolBase):
627
651
  color: str | None = None,
628
652
  visibility: JSONObject | None = None,
629
653
  ) -> JSONObject:
654
+ """执行分组与包相关逻辑。"""
630
655
  visibility_patch = None
631
656
  if visibility is not None:
632
657
  try:
@@ -654,6 +679,7 @@ class AiBuilderTools(ToolBase):
654
679
  suggested_next_call={"tool_name": "package_update", "arguments": {"profile": profile, **normalized_args}},
655
680
  )
656
681
 
682
+ @tool_cn_name("方案安装")
657
683
  def solution_install(
658
684
  self,
659
685
  *,
@@ -662,6 +688,7 @@ class AiBuilderTools(ToolBase):
662
688
  being_copy_data: bool = True,
663
689
  solution_source: str = "solutionDetail",
664
690
  ) -> JSONObject:
691
+ """执行方案相关逻辑。"""
665
692
  normalized_args = {
666
693
  "solution_key": solution_key,
667
694
  "being_copy_data": being_copy_data,
@@ -679,6 +706,7 @@ class AiBuilderTools(ToolBase):
679
706
  suggested_next_call={"tool_name": "solution_install", "arguments": {"profile": profile, **normalized_args}},
680
707
  )
681
708
 
709
+ @tool_cn_name("成员检索")
682
710
  def member_search(
683
711
  self,
684
712
  *,
@@ -688,6 +716,7 @@ class AiBuilderTools(ToolBase):
688
716
  page_size: int = 20,
689
717
  contain_disable: bool = False,
690
718
  ) -> JSONObject:
719
+ """执行工具方法逻辑。"""
691
720
  normalized_args = {
692
721
  "query": query,
693
722
  "page_num": page_num,
@@ -707,7 +736,9 @@ class AiBuilderTools(ToolBase):
707
736
  suggested_next_call={"tool_name": "member_search", "arguments": {"profile": profile, **normalized_args}},
708
737
  )
709
738
 
739
+ @tool_cn_name("角色检索")
710
740
  def role_search(self, *, profile: str, keyword: str, page_num: int = 1, page_size: int = 20) -> JSONObject:
741
+ """执行角色相关逻辑。"""
711
742
  normalized_args = {"keyword": keyword, "page_num": page_num, "page_size": page_size}
712
743
  return _safe_tool_call(
713
744
  lambda: self._facade.role_search(profile=profile, keyword=keyword, page_num=page_num, page_size=page_size),
@@ -716,6 +747,7 @@ class AiBuilderTools(ToolBase):
716
747
  suggested_next_call={"tool_name": "role_search", "arguments": {"profile": profile, **normalized_args}},
717
748
  )
718
749
 
750
+ @tool_cn_name("角色创建")
719
751
  def role_create(
720
752
  self,
721
753
  *,
@@ -726,6 +758,7 @@ class AiBuilderTools(ToolBase):
726
758
  member_names: list[str],
727
759
  role_icon: str = "ex-user-outlined",
728
760
  ) -> JSONObject:
761
+ """执行角色相关逻辑。"""
729
762
  normalized_args = {
730
763
  "role_name": role_name,
731
764
  "member_uids": member_uids,
@@ -747,7 +780,9 @@ class AiBuilderTools(ToolBase):
747
780
  suggested_next_call={"tool_name": "role_create", "arguments": {"profile": profile, **normalized_args}},
748
781
  )
749
782
 
783
+ @tool_cn_name("分组挂载应用")
750
784
  def package_attach_app(self, *, profile: str, tag_id: int, app_key: str, app_title: str = "") -> JSONObject:
785
+ """执行分组与包相关逻辑。"""
751
786
  normalized_args = {"tag_id": tag_id, "app_key": app_key, "app_title": app_title}
752
787
  result = _safe_tool_call(
753
788
  lambda: self._facade.package_attach_app(profile=profile, tag_id=tag_id, app_key=app_key, app_title=app_title),
@@ -766,6 +801,7 @@ class AiBuilderTools(ToolBase):
766
801
  ),
767
802
  )
768
803
 
804
+ @tool_cn_name("释放应用编辑锁")
769
805
  def app_release_edit_lock_if_mine(
770
806
  self,
771
807
  *,
@@ -774,6 +810,7 @@ class AiBuilderTools(ToolBase):
774
810
  lock_owner_email: str = "",
775
811
  lock_owner_name: str = "",
776
812
  ) -> JSONObject:
813
+ """执行应用相关逻辑。"""
777
814
  normalized_args = {
778
815
  "app_key": app_key,
779
816
  "lock_owner_email": lock_owner_email,
@@ -791,6 +828,7 @@ class AiBuilderTools(ToolBase):
791
828
  suggested_next_call={"tool_name": "app_release_edit_lock_if_mine", "arguments": {"profile": profile, **normalized_args}},
792
829
  )
793
830
 
831
+ @tool_cn_name("应用解析")
794
832
  def app_resolve(
795
833
  self,
796
834
  *,
@@ -799,6 +837,7 @@ class AiBuilderTools(ToolBase):
799
837
  app_name: str = "",
800
838
  package_id: int | None = None,
801
839
  ) -> JSONObject:
840
+ """执行应用相关逻辑。"""
802
841
  normalized_args = {"app_key": app_key, "app_name": app_name, "package_id": package_id}
803
842
  return _publicize_package_fields(_safe_tool_call(
804
843
  lambda: self._facade.app_resolve(profile=profile, app_key=app_key, app_name=app_name, package_tag_id=package_id),
@@ -807,7 +846,9 @@ class AiBuilderTools(ToolBase):
807
846
  suggested_next_call={"tool_name": "app_resolve", "arguments": {"profile": profile, **normalized_args}},
808
847
  ))
809
848
 
849
+ @tool_cn_name("应用按钮列表")
810
850
  def app_custom_button_list(self, *, profile: str, app_key: str) -> JSONObject:
851
+ """执行应用相关逻辑。"""
811
852
  normalized_args = {"app_key": app_key}
812
853
  return _safe_tool_call(
813
854
  lambda: self._facade.app_custom_button_list(profile=profile, app_key=app_key),
@@ -816,7 +857,9 @@ class AiBuilderTools(ToolBase):
816
857
  suggested_next_call={"tool_name": "app_custom_button_list", "arguments": {"profile": profile, **normalized_args}},
817
858
  )
818
859
 
860
+ @tool_cn_name("应用按钮详情")
819
861
  def app_custom_button_get(self, *, profile: str, app_key: str, button_id: int) -> JSONObject:
862
+ """执行应用相关逻辑。"""
820
863
  normalized_args = {"app_key": app_key, "button_id": button_id}
821
864
  return _safe_tool_call(
822
865
  lambda: self._facade.app_custom_button_get(profile=profile, app_key=app_key, button_id=button_id),
@@ -825,7 +868,9 @@ class AiBuilderTools(ToolBase):
825
868
  suggested_next_call={"tool_name": "app_custom_button_get", "arguments": {"profile": profile, **normalized_args}},
826
869
  )
827
870
 
871
+ @tool_cn_name("应用按钮创建")
828
872
  def app_custom_button_create(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
873
+ """执行应用相关逻辑。"""
829
874
  try:
830
875
  request = CustomButtonPatch.model_validate(payload)
831
876
  except ValidationError as exc:
@@ -857,7 +902,9 @@ class AiBuilderTools(ToolBase):
857
902
  suggested_next_call={"tool_name": "app_custom_button_create", "arguments": {"profile": profile, **normalized_args}},
858
903
  )
859
904
 
905
+ @tool_cn_name("应用按钮更新")
860
906
  def app_custom_button_update(self, *, profile: str, app_key: str, button_id: int, payload: JSONObject) -> JSONObject:
907
+ """执行应用相关逻辑。"""
861
908
  try:
862
909
  request = CustomButtonPatch.model_validate(payload)
863
910
  except ValidationError as exc:
@@ -890,7 +937,9 @@ class AiBuilderTools(ToolBase):
890
937
  suggested_next_call={"tool_name": "app_custom_button_update", "arguments": {"profile": profile, **normalized_args}},
891
938
  )
892
939
 
940
+ @tool_cn_name("应用按钮删除")
893
941
  def app_custom_button_delete(self, *, profile: str, app_key: str, button_id: int) -> JSONObject:
942
+ """执行应用相关逻辑。"""
894
943
  normalized_args = {"app_key": app_key, "button_id": button_id}
895
944
  return _safe_tool_call(
896
945
  lambda: self._facade.app_custom_button_delete(profile=profile, app_key=app_key, button_id=button_id),
@@ -899,7 +948,9 @@ class AiBuilderTools(ToolBase):
899
948
  suggested_next_call={"tool_name": "app_custom_button_delete", "arguments": {"profile": profile, **normalized_args}},
900
949
  )
901
950
 
951
+ @tool_cn_name("应用摘要读取")
902
952
  def app_read_summary(self, *, profile: str, app_key: str) -> JSONObject:
953
+ """执行应用相关逻辑。"""
903
954
  normalized_args = {"app_key": app_key}
904
955
  return _publicize_package_fields(_safe_tool_call(
905
956
  lambda: self._facade.app_read_summary(profile=profile, app_key=app_key),
@@ -908,7 +959,9 @@ class AiBuilderTools(ToolBase):
908
959
  suggested_next_call={"tool_name": "app_get", "arguments": {"profile": profile, "app_key": app_key}},
909
960
  ))
910
961
 
962
+ @tool_cn_name("应用详情查询")
911
963
  def app_get(self, *, profile: str, app_key: str) -> JSONObject:
964
+ """执行应用相关逻辑。"""
912
965
  normalized_args = {"app_key": app_key}
913
966
  return _publicize_package_fields(_safe_tool_call(
914
967
  lambda: self._facade.app_get(profile=profile, app_key=app_key),
@@ -917,7 +970,9 @@ class AiBuilderTools(ToolBase):
917
970
  suggested_next_call={"tool_name": "app_get", "arguments": {"profile": profile, "app_key": app_key}},
918
971
  ))
919
972
 
973
+ @tool_cn_name("应用字段摘要读取")
920
974
  def app_read_fields(self, *, profile: str, app_key: str) -> JSONObject:
975
+ """执行应用相关逻辑。"""
921
976
  normalized_args = {"app_key": app_key}
922
977
  return _safe_tool_call(
923
978
  lambda: self._facade.app_read_fields(profile=profile, app_key=app_key),
@@ -926,7 +981,9 @@ class AiBuilderTools(ToolBase):
926
981
  suggested_next_call={"tool_name": "app_get_fields", "arguments": {"profile": profile, "app_key": app_key}},
927
982
  )
928
983
 
984
+ @tool_cn_name("应用字段详情查询")
929
985
  def app_get_fields(self, *, profile: str, app_key: str) -> JSONObject:
986
+ """执行应用相关逻辑。"""
930
987
  normalized_args = {"app_key": app_key}
931
988
  return _safe_tool_call(
932
989
  lambda: self._facade.app_get_fields(profile=profile, app_key=app_key),
@@ -935,6 +992,7 @@ class AiBuilderTools(ToolBase):
935
992
  suggested_next_call={"tool_name": "app_get_fields", "arguments": {"profile": profile, "app_key": app_key}},
936
993
  )
937
994
 
995
+ @tool_cn_name("修复代码块字段")
938
996
  def app_repair_code_blocks(
939
997
  self,
940
998
  *,
@@ -943,6 +1001,7 @@ class AiBuilderTools(ToolBase):
943
1001
  field: str | None = None,
944
1002
  apply: bool = False,
945
1003
  ) -> JSONObject:
1004
+ """执行应用相关逻辑。"""
946
1005
  normalized_args = {"app_key": app_key, "field": field, "apply": apply}
947
1006
  return _safe_tool_call(
948
1007
  lambda: self._facade.app_repair_code_blocks(profile=profile, app_key=app_key, field=field, apply=apply),
@@ -951,7 +1010,9 @@ class AiBuilderTools(ToolBase):
951
1010
  suggested_next_call={"tool_name": "app_repair_code_blocks", "arguments": {"profile": profile, **normalized_args}},
952
1011
  )
953
1012
 
1013
+ @tool_cn_name("应用布局摘要读取")
954
1014
  def app_read_layout_summary(self, *, profile: str, app_key: str) -> JSONObject:
1015
+ """执行应用相关逻辑。"""
955
1016
  normalized_args = {"app_key": app_key}
956
1017
  return _safe_tool_call(
957
1018
  lambda: self._facade.app_read_layout_summary(profile=profile, app_key=app_key),
@@ -960,7 +1021,9 @@ class AiBuilderTools(ToolBase):
960
1021
  suggested_next_call={"tool_name": "app_get_layout", "arguments": {"profile": profile, "app_key": app_key}},
961
1022
  )
962
1023
 
1024
+ @tool_cn_name("应用布局详情查询")
963
1025
  def app_get_layout(self, *, profile: str, app_key: str) -> JSONObject:
1026
+ """执行应用相关逻辑。"""
964
1027
  normalized_args = {"app_key": app_key}
965
1028
  return _safe_tool_call(
966
1029
  lambda: self._facade.app_get_layout(profile=profile, app_key=app_key),
@@ -969,7 +1032,9 @@ class AiBuilderTools(ToolBase):
969
1032
  suggested_next_call={"tool_name": "app_get_layout", "arguments": {"profile": profile, "app_key": app_key}},
970
1033
  )
971
1034
 
1035
+ @tool_cn_name("应用视图摘要读取")
972
1036
  def app_read_views_summary(self, *, profile: str, app_key: str) -> JSONObject:
1037
+ """执行应用相关逻辑。"""
973
1038
  normalized_args = {"app_key": app_key}
974
1039
  return _safe_tool_call(
975
1040
  lambda: self._facade.app_read_views_summary(profile=profile, app_key=app_key),
@@ -978,7 +1043,9 @@ class AiBuilderTools(ToolBase):
978
1043
  suggested_next_call={"tool_name": "app_get_views", "arguments": {"profile": profile, "app_key": app_key}},
979
1044
  )
980
1045
 
1046
+ @tool_cn_name("应用视图详情查询")
981
1047
  def app_get_views(self, *, profile: str, app_key: str) -> JSONObject:
1048
+ """执行应用相关逻辑。"""
982
1049
  normalized_args = {"app_key": app_key}
983
1050
  return _safe_tool_call(
984
1051
  lambda: self._facade.app_get_views(profile=profile, app_key=app_key),
@@ -987,7 +1054,9 @@ class AiBuilderTools(ToolBase):
987
1054
  suggested_next_call={"tool_name": "app_get_views", "arguments": {"profile": profile, "app_key": app_key}},
988
1055
  )
989
1056
 
1057
+ @tool_cn_name("应用流程摘要读取")
990
1058
  def app_read_flow_summary(self, *, profile: str, app_key: str) -> JSONObject:
1059
+ """执行应用相关逻辑。"""
991
1060
  normalized_args = {"app_key": app_key}
992
1061
  return _safe_tool_call(
993
1062
  lambda: self._facade.app_read_flow_summary(profile=profile, app_key=app_key),
@@ -996,7 +1065,9 @@ class AiBuilderTools(ToolBase):
996
1065
  suggested_next_call={"tool_name": "app_get_flow", "arguments": {"profile": profile, "app_key": app_key}},
997
1066
  )
998
1067
 
1068
+ @tool_cn_name("应用流程详情查询")
999
1069
  def app_get_flow(self, *, profile: str, app_key: str) -> JSONObject:
1070
+ """执行应用相关逻辑。"""
1000
1071
  normalized_args = {"app_key": app_key}
1001
1072
  return _safe_tool_call(
1002
1073
  lambda: self._facade.app_get_flow(profile=profile, app_key=app_key),
@@ -1005,7 +1076,9 @@ class AiBuilderTools(ToolBase):
1005
1076
  suggested_next_call={"tool_name": "app_get_flow", "arguments": {"profile": profile, "app_key": app_key}},
1006
1077
  )
1007
1078
 
1079
+ @tool_cn_name("应用图表摘要读取")
1008
1080
  def app_read_charts_summary(self, *, profile: str, app_key: str) -> JSONObject:
1081
+ """执行应用相关逻辑。"""
1009
1082
  normalized_args = {"app_key": app_key}
1010
1083
  return _safe_tool_call(
1011
1084
  lambda: self._facade.app_read_charts_summary(profile=profile, app_key=app_key),
@@ -1014,7 +1087,9 @@ class AiBuilderTools(ToolBase):
1014
1087
  suggested_next_call={"tool_name": "app_get_charts", "arguments": {"profile": profile, "app_key": app_key}},
1015
1088
  )
1016
1089
 
1090
+ @tool_cn_name("应用图表详情查询")
1017
1091
  def app_get_charts(self, *, profile: str, app_key: str) -> JSONObject:
1092
+ """执行应用相关逻辑。"""
1018
1093
  normalized_args = {"app_key": app_key}
1019
1094
  return _safe_tool_call(
1020
1095
  lambda: self._facade.app_get_charts(profile=profile, app_key=app_key),
@@ -1023,7 +1098,9 @@ class AiBuilderTools(ToolBase):
1023
1098
  suggested_next_call={"tool_name": "app_get_charts", "arguments": {"profile": profile, "app_key": app_key}},
1024
1099
  )
1025
1100
 
1101
+ @tool_cn_name("门户列表查询")
1026
1102
  def portal_list(self, *, profile: str) -> JSONObject:
1103
+ """执行门户相关逻辑。"""
1027
1104
  return _publicize_package_fields(_safe_tool_call(
1028
1105
  lambda: self._facade.portal_list(profile=profile),
1029
1106
  error_code="PORTAL_LIST_FAILED",
@@ -1031,7 +1108,9 @@ class AiBuilderTools(ToolBase):
1031
1108
  suggested_next_call={"tool_name": "portal_list", "arguments": {"profile": profile}},
1032
1109
  ))
1033
1110
 
1111
+ @tool_cn_name("门户详情查询")
1034
1112
  def portal_get(self, *, profile: str, dash_key: str, being_draft: bool = True) -> JSONObject:
1113
+ """执行门户相关逻辑。"""
1035
1114
  normalized_args = {"dash_key": dash_key, "being_draft": being_draft}
1036
1115
  return _publicize_package_fields(_safe_tool_call(
1037
1116
  lambda: self._facade.portal_get(profile=profile, dash_key=dash_key, being_draft=being_draft),
@@ -1040,7 +1119,9 @@ class AiBuilderTools(ToolBase):
1040
1119
  suggested_next_call={"tool_name": "portal_get", "arguments": {"profile": profile, **normalized_args}},
1041
1120
  ))
1042
1121
 
1122
+ @tool_cn_name("门户摘要读取")
1043
1123
  def portal_read_summary(self, *, profile: str, dash_key: str, being_draft: bool = True) -> JSONObject:
1124
+ """执行门户相关逻辑。"""
1044
1125
  normalized_args = {"dash_key": dash_key, "being_draft": being_draft}
1045
1126
  return _publicize_package_fields(_safe_tool_call(
1046
1127
  lambda: self._facade.portal_read_summary(profile=profile, dash_key=dash_key, being_draft=being_draft),
@@ -1049,7 +1130,9 @@ class AiBuilderTools(ToolBase):
1049
1130
  suggested_next_call={"tool_name": "portal_get", "arguments": {"profile": profile, **normalized_args}},
1050
1131
  ))
1051
1132
 
1133
+ @tool_cn_name("视图详情查询")
1052
1134
  def view_get(self, *, profile: str, view_key: str = "", viewgraph_key: str = "") -> JSONObject:
1135
+ """执行视图相关逻辑。"""
1053
1136
  resolved_view_key = str(view_key or viewgraph_key or "").strip()
1054
1137
  normalized_args = {"view_key": resolved_view_key}
1055
1138
  return _safe_tool_call(
@@ -1059,12 +1142,14 @@ class AiBuilderTools(ToolBase):
1059
1142
  suggested_next_call={"tool_name": "view_get", "arguments": {"profile": profile, **normalized_args}},
1060
1143
  )
1061
1144
 
1145
+ @tool_cn_name("图表详情查询")
1062
1146
  def chart_get(
1063
1147
  self,
1064
1148
  *,
1065
1149
  profile: str,
1066
1150
  chart_id: str,
1067
1151
  ) -> JSONObject:
1152
+ """执行图表相关逻辑。"""
1068
1153
  normalized_args = {"chart_id": chart_id}
1069
1154
  return _safe_tool_call(
1070
1155
  lambda: self._facade.chart_get(profile=profile, chart_id=chart_id),
@@ -1073,6 +1158,7 @@ class AiBuilderTools(ToolBase):
1073
1158
  suggested_next_call={"tool_name": "chart_get", "arguments": {"profile": profile, "chart_id": chart_id}},
1074
1159
  )
1075
1160
 
1161
+ @tool_cn_name("应用结构规划")
1076
1162
  def app_schema_plan(
1077
1163
  self,
1078
1164
  *,
@@ -1088,6 +1174,7 @@ class AiBuilderTools(ToolBase):
1088
1174
  update_fields: list[JSONObject],
1089
1175
  remove_fields: list[JSONObject],
1090
1176
  ) -> JSONObject:
1177
+ """执行应用相关逻辑。"""
1091
1178
  try:
1092
1179
  request = SchemaPlanRequest.model_validate(
1093
1180
  {
@@ -1133,6 +1220,7 @@ class AiBuilderTools(ToolBase):
1133
1220
  suggested_next_call={"tool_name": "app_schema_plan", "arguments": {"profile": profile, **normalized_args}},
1134
1221
  ))
1135
1222
 
1223
+ @tool_cn_name("应用布局规划")
1136
1224
  def app_layout_plan(
1137
1225
  self,
1138
1226
  *,
@@ -1142,6 +1230,7 @@ class AiBuilderTools(ToolBase):
1142
1230
  sections: list[JSONObject] | None = None,
1143
1231
  preset: str | None = None,
1144
1232
  ) -> JSONObject:
1233
+ """执行应用相关逻辑。"""
1145
1234
  try:
1146
1235
  request = LayoutPlanRequest.model_validate(
1147
1236
  {
@@ -1179,6 +1268,7 @@ class AiBuilderTools(ToolBase):
1179
1268
  suggested_next_call={"tool_name": "app_layout_plan", "arguments": {"profile": profile, **normalized_request}},
1180
1269
  )
1181
1270
 
1271
+ @tool_cn_name("应用流程规划")
1182
1272
  def app_flow_plan(
1183
1273
  self,
1184
1274
  *,
@@ -1189,6 +1279,7 @@ class AiBuilderTools(ToolBase):
1189
1279
  transitions: list[JSONObject] | None = None,
1190
1280
  preset: str | None = None,
1191
1281
  ) -> JSONObject:
1282
+ """执行应用相关逻辑。"""
1192
1283
  try:
1193
1284
  request = FlowPlanRequest.model_validate(
1194
1285
  {
@@ -1223,6 +1314,7 @@ class AiBuilderTools(ToolBase):
1223
1314
  suggested_next_call={"tool_name": "app_flow_plan", "arguments": {"profile": profile, **request.model_dump(mode="json")}},
1224
1315
  )
1225
1316
 
1317
+ @tool_cn_name("应用视图规划")
1226
1318
  def app_views_plan(
1227
1319
  self,
1228
1320
  *,
@@ -1232,6 +1324,7 @@ class AiBuilderTools(ToolBase):
1232
1324
  remove_views: list[str] | None = None,
1233
1325
  preset: str | None = None,
1234
1326
  ) -> JSONObject:
1327
+ """执行应用相关逻辑。"""
1235
1328
  try:
1236
1329
  request = ViewsPlanRequest.model_validate(
1237
1330
  {
@@ -1264,6 +1357,7 @@ class AiBuilderTools(ToolBase):
1264
1357
  suggested_next_call={"tool_name": "app_views_plan", "arguments": {"profile": profile, **request.model_dump(mode="json")}},
1265
1358
  )
1266
1359
 
1360
+ @tool_cn_name("应用结构应用")
1267
1361
  def app_schema_apply(
1268
1362
  self,
1269
1363
  *,
@@ -1281,6 +1375,7 @@ class AiBuilderTools(ToolBase):
1281
1375
  update_fields: list[JSONObject],
1282
1376
  remove_fields: list[JSONObject],
1283
1377
  ) -> JSONObject:
1378
+ """执行应用相关逻辑。"""
1284
1379
  result = self._app_schema_apply_once(
1285
1380
  profile=profile,
1286
1381
  app_key=app_key,
@@ -1333,6 +1428,7 @@ class AiBuilderTools(ToolBase):
1333
1428
  update_fields: list[JSONObject],
1334
1429
  remove_fields: list[JSONObject],
1335
1430
  ) -> JSONObject:
1431
+ """执行内部辅助逻辑。"""
1336
1432
  effective_app_name = app_name or app_title
1337
1433
  plan_result = self._rewrite_plan_result_for_apply(
1338
1434
  result=self.app_schema_plan(
@@ -1419,7 +1515,9 @@ class AiBuilderTools(ToolBase):
1419
1515
  )
1420
1516
  return _publicize_package_fields(result)
1421
1517
 
1518
+ @tool_cn_name("应用布局应用")
1422
1519
  def app_layout_apply(self, *, profile: str, app_key: str, mode: str = "merge", publish: bool = True, sections: list[JSONObject]) -> JSONObject:
1520
+ """执行应用相关逻辑。"""
1423
1521
  result = self._app_layout_apply_once(
1424
1522
  profile=profile,
1425
1523
  app_key=app_key,
@@ -1440,6 +1538,7 @@ class AiBuilderTools(ToolBase):
1440
1538
  )
1441
1539
 
1442
1540
  def _app_layout_apply_once(self, *, profile: str, app_key: str, mode: str = "merge", publish: bool = True, sections: list[JSONObject]) -> JSONObject:
1541
+ """执行内部辅助逻辑。"""
1443
1542
  plan_result = self._rewrite_plan_result_for_apply(
1444
1543
  result=self.app_layout_plan(
1445
1544
  profile=profile,
@@ -1496,6 +1595,7 @@ class AiBuilderTools(ToolBase):
1496
1595
  suggested_next_call={"tool_name": "app_layout_apply", "arguments": {"profile": profile, **normalized_args}},
1497
1596
  )
1498
1597
 
1598
+ @tool_cn_name("应用流程应用")
1499
1599
  def app_flow_apply(
1500
1600
  self,
1501
1601
  *,
@@ -1506,6 +1606,7 @@ class AiBuilderTools(ToolBase):
1506
1606
  nodes: list[JSONObject],
1507
1607
  transitions: list[JSONObject],
1508
1608
  ) -> JSONObject:
1609
+ """执行应用相关逻辑。"""
1509
1610
  result = self._app_flow_apply_once(
1510
1611
  profile=profile,
1511
1612
  app_key=app_key,
@@ -1537,6 +1638,7 @@ class AiBuilderTools(ToolBase):
1537
1638
  nodes: list[JSONObject],
1538
1639
  transitions: list[JSONObject],
1539
1640
  ) -> JSONObject:
1641
+ """执行内部辅助逻辑。"""
1540
1642
  plan_result = self._rewrite_plan_result_for_apply(
1541
1643
  result=self.app_flow_plan(
1542
1644
  profile=profile,
@@ -1604,6 +1706,7 @@ class AiBuilderTools(ToolBase):
1604
1706
  suggested_next_call={"tool_name": "app_flow_apply", "arguments": {"profile": profile, **normalized_args}},
1605
1707
  )
1606
1708
 
1709
+ @tool_cn_name("应用视图应用")
1607
1710
  def app_views_apply(
1608
1711
  self,
1609
1712
  *,
@@ -1613,6 +1716,7 @@ class AiBuilderTools(ToolBase):
1613
1716
  upsert_views: list[JSONObject],
1614
1717
  remove_views: list[str],
1615
1718
  ) -> JSONObject:
1719
+ """执行应用相关逻辑。"""
1616
1720
  result = self._app_views_apply_once(
1617
1721
  profile=profile,
1618
1722
  app_key=app_key,
@@ -1641,6 +1745,7 @@ class AiBuilderTools(ToolBase):
1641
1745
  upsert_views: list[JSONObject],
1642
1746
  remove_views: list[str],
1643
1747
  ) -> JSONObject:
1748
+ """执行内部辅助逻辑。"""
1644
1749
  plan_result = self._rewrite_plan_result_for_apply(
1645
1750
  result=self.app_views_plan(
1646
1751
  profile=profile,
@@ -1696,6 +1801,7 @@ class AiBuilderTools(ToolBase):
1696
1801
  suggested_next_call={"tool_name": "app_views_apply", "arguments": {"profile": profile, **normalized_args}},
1697
1802
  )
1698
1803
 
1804
+ @tool_cn_name("图表配置应用")
1699
1805
  def chart_apply(
1700
1806
  self,
1701
1807
  *,
@@ -1705,6 +1811,7 @@ class AiBuilderTools(ToolBase):
1705
1811
  remove_chart_ids: list[str],
1706
1812
  reorder_chart_ids: list[str],
1707
1813
  ) -> JSONObject:
1814
+ """执行图表相关逻辑。"""
1708
1815
  return self.app_charts_apply(
1709
1816
  profile=profile,
1710
1817
  app_key=app_key,
@@ -1713,6 +1820,7 @@ class AiBuilderTools(ToolBase):
1713
1820
  reorder_chart_ids=reorder_chart_ids,
1714
1821
  )
1715
1822
 
1823
+ @tool_cn_name("应用图表应用")
1716
1824
  def app_charts_apply(
1717
1825
  self,
1718
1826
  *,
@@ -1722,6 +1830,7 @@ class AiBuilderTools(ToolBase):
1722
1830
  remove_chart_ids: list[str],
1723
1831
  reorder_chart_ids: list[str],
1724
1832
  ) -> JSONObject:
1833
+ """执行应用相关逻辑。"""
1725
1834
  try:
1726
1835
  request = ChartApplyRequest.model_validate(
1727
1836
  {
@@ -1755,6 +1864,7 @@ class AiBuilderTools(ToolBase):
1755
1864
  suggested_next_call={"tool_name": "app_charts_apply", "arguments": {"profile": profile, **normalized_args}},
1756
1865
  )
1757
1866
 
1867
+ @tool_cn_name("门户配置应用")
1758
1868
  def portal_apply(
1759
1869
  self,
1760
1870
  *,
@@ -1772,6 +1882,7 @@ class AiBuilderTools(ToolBase):
1772
1882
  dash_global_config: JSONObject | None = None,
1773
1883
  config: JSONObject | None = None,
1774
1884
  ) -> JSONObject:
1885
+ """执行门户相关逻辑。"""
1775
1886
  try:
1776
1887
  request = PortalApplyRequest.model_validate(
1777
1888
  {
@@ -1820,6 +1931,7 @@ class AiBuilderTools(ToolBase):
1820
1931
  suggested_next_call={"tool_name": "portal_apply", "arguments": {"profile": profile, **normalized_args}},
1821
1932
  ))
1822
1933
 
1934
+ @tool_cn_name("应用发布校验")
1823
1935
  def app_publish_verify(
1824
1936
  self,
1825
1937
  *,
@@ -1827,6 +1939,7 @@ class AiBuilderTools(ToolBase):
1827
1939
  app_key: str,
1828
1940
  expected_package_id: int | None = None,
1829
1941
  ) -> JSONObject:
1942
+ """执行应用相关逻辑。"""
1830
1943
  normalized_args = {"app_key": app_key, "expected_package_id": expected_package_id}
1831
1944
  result = _publicize_package_fields(_safe_tool_call(
1832
1945
  lambda: self._facade.app_publish_verify(profile=profile, app_key=app_key, expected_package_tag_id=expected_package_id),
@@ -1845,6 +1958,7 @@ class AiBuilderTools(ToolBase):
1845
1958
  ))
1846
1959
 
1847
1960
  def _retry_after_self_lock_release(self, *, profile: str, result: JSONObject, retry_call) -> JSONObject:
1961
+ """执行内部辅助逻辑。"""
1848
1962
  if not isinstance(result, dict) or result.get("status") != "failed" or result.get("error_code") != "APP_EDIT_LOCKED":
1849
1963
  return result
1850
1964
  suggested = result.get("suggested_next_call")
@@ -1910,6 +2024,7 @@ class AiBuilderTools(ToolBase):
1910
2024
  plan_tool_name: str,
1911
2025
  apply_tool_name: str,
1912
2026
  ) -> JSONObject:
2027
+ """执行内部辅助逻辑。"""
1913
2028
  if not isinstance(result, dict):
1914
2029
  return result
1915
2030
  rewritten = dict(result)
@@ -2616,6 +2731,7 @@ _BUILDER_TOOL_CONTRACTS: dict[str, JSONObject] = {
2616
2731
  "field.autoTrigger": "field.auto_trigger",
2617
2732
  "field.customBtnTextStatus": "field.custom_button_text_enabled",
2618
2733
  "field.customBtnText": "field.custom_button_text",
2734
+ "field.subfieldUpdates": "field.subfield_updates",
2619
2735
  },
2620
2736
  "allowed_values": {
2621
2737
  "field.type": [member.value for member in PublicFieldType],