@qingflow-tech/qingflow-cli 1.1.61-beta.4 → 1.1.61
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/README.md +3 -3
- package/package.json +1 -1
- package/pyproject.toml +1 -2
- package/skills/qingflow-cli/SKILL.md +2 -104
- package/skills/qingflow-cli/reference/builder/20-build-complete-system.md +2 -2
- package/skills/qingflow-cli/reference/builder/30-schema-fields.md +5 -9
- package/skills/qingflow-cli/reference/builder/reference/app-delivery-sop.md +3 -3
- package/src/qingflow_mcp/app_form_compat.py +0 -3
- package/src/qingflow_mcp/app_form_validator.py +17 -69
- package/src/qingflow_mcp/builder_facade/app_form.py +100 -497
- package/src/qingflow_mcp/builder_facade/schemas/app_form/manifest.json +0 -1
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/complete.json +30 -64
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/address.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/amount.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/attachment.json +10 -6
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/code_block.json +10 -6
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/data_relation.json +18 -11
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/date.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/datetime.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/department.json +10 -6
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/email.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/link.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/long_text.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/member.json +10 -6
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/multi_select.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/number.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/phone.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/q_linker.json +10 -6
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/relation.json +15 -46
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_choice.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_select.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/subtable.json +27 -61
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/text.json +8 -4
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/formula.json +0 -43
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/summary.json +12 -7
- package/src/qingflow_mcp/builder_facade/service.py +1 -39
- package/src/qingflow_mcp/cli/main.py +1 -34
- package/src/qingflow_mcp/cloud_context.py +1 -16
- package/src/qingflow_mcp/public_surface.py +8 -67
- package/src/qingflow_mcp/response_trim.py +1 -2
- package/src/qingflow_mcp/server.py +6 -12
- package/src/qingflow_mcp/server_app_builder.py +5 -9
- package/src/qingflow_mcp/server_app_user.py +5 -9
- package/src/qingflow_mcp/server_cloud.py +7 -43
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/rich_text.json +0 -146
- package/src/qingflow_mcp/tool_catalog.py +0 -387
- package/src/qingflow_mcp/tool_catalog_i18n.py +0 -185
- package/src/qingflow_mcp/tool_policy.py +0 -197
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$defs": {
|
|
3
|
-
"EmptyConfig": {
|
|
4
|
-
"additionalProperties": false,
|
|
5
|
-
"description": "该字段类型没有特殊配置。",
|
|
6
|
-
"type": "object"
|
|
7
|
-
},
|
|
8
|
-
"FieldCommon": {
|
|
9
|
-
"allOf": [
|
|
10
|
-
{
|
|
11
|
-
"if": {
|
|
12
|
-
"properties": {
|
|
13
|
-
"defaultType": {
|
|
14
|
-
"const": 2
|
|
15
|
-
}
|
|
16
|
-
},
|
|
17
|
-
"required": [
|
|
18
|
-
"defaultType"
|
|
19
|
-
]
|
|
20
|
-
},
|
|
21
|
-
"then": {
|
|
22
|
-
"properties": {
|
|
23
|
-
"defaultValue": {
|
|
24
|
-
"type": "null"
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
"if": {
|
|
31
|
-
"properties": {
|
|
32
|
-
"defaultType": {
|
|
33
|
-
"const": 3
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
"required": [
|
|
37
|
-
"defaultType"
|
|
38
|
-
]
|
|
39
|
-
},
|
|
40
|
-
"then": {
|
|
41
|
-
"properties": {
|
|
42
|
-
"defaultValue": {
|
|
43
|
-
"minLength": 1,
|
|
44
|
-
"type": [
|
|
45
|
-
"string",
|
|
46
|
-
"null"
|
|
47
|
-
]
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
],
|
|
53
|
-
"anyOf": [
|
|
54
|
-
{
|
|
55
|
-
"required": [
|
|
56
|
-
"queId"
|
|
57
|
-
]
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
"required": [
|
|
61
|
-
"name"
|
|
62
|
-
]
|
|
63
|
-
}
|
|
64
|
-
],
|
|
65
|
-
"description": "顶层业务字段的公共属性;字段类型由 TopField 的判别分支定义。",
|
|
66
|
-
"properties": {
|
|
67
|
-
"beingRequired": {
|
|
68
|
-
"description": "该字段是否必填;缺失时保留已有字段当前值。",
|
|
69
|
-
"type": "boolean"
|
|
70
|
-
},
|
|
71
|
-
"defaultType": {
|
|
72
|
-
"default": 1,
|
|
73
|
-
"description": "默认值类型,与 defaultValue 联动;1 表示静态值,2 表示关联/绑定值且 defaultValue 只能省略或为 null,3 表示公式值且提供 defaultValue 时必须为非空公式文本。省略 defaultType 但提供 defaultValue 时按 1 处理。",
|
|
74
|
-
"enum": [
|
|
75
|
-
1,
|
|
76
|
-
2,
|
|
77
|
-
3
|
|
78
|
-
],
|
|
79
|
-
"type": "integer"
|
|
80
|
-
},
|
|
81
|
-
"defaultValue": {
|
|
82
|
-
"$ref": "#/$defs/ScalarDefaultValue",
|
|
83
|
-
"description": "普通字段的默认值;后端 queDefaultValue 为字符串,因此数字等字面量也必须以字符串传入。defaultType 为 1 时表示静态文本,为 3 时表示公式文本,为 2 时不携带字面量默认值。表格、地址、附件、引用等结构化默认值必须放在具体字段 config.defaultValues。显式 null 表示清除默认值。"
|
|
84
|
-
},
|
|
85
|
-
"name": {
|
|
86
|
-
"description": "字段展示名称;新增字段必填,已有字段可在携带 queId 时省略;同父级允许同名(后端以 queId 为字段身份),配置引用建议携带 queId。",
|
|
87
|
-
"minLength": 1,
|
|
88
|
-
"type": "string"
|
|
89
|
-
},
|
|
90
|
-
"queId": {
|
|
91
|
-
"description": "已有字段的后端 ID;更新时用于精确定位并复用,新增字段通常省略。",
|
|
92
|
-
"minimum": 1,
|
|
93
|
-
"type": "integer"
|
|
94
|
-
},
|
|
95
|
-
"questionDescription": {
|
|
96
|
-
"description": "字段说明;null 或空字符串表示清空。",
|
|
97
|
-
"type": [
|
|
98
|
-
"string",
|
|
99
|
-
"null"
|
|
100
|
-
]
|
|
101
|
-
},
|
|
102
|
-
"questionType": {
|
|
103
|
-
"description": "字段类型;具体可用值由当前字段详情 Schema 的判别分支约束。",
|
|
104
|
-
"type": "string"
|
|
105
|
-
},
|
|
106
|
-
"width": {
|
|
107
|
-
"description": "字段在所在行的宽度百分比(1-100 整数);后端不校验总和与取值,存量数据存在 33/34 等三等分布值。",
|
|
108
|
-
"maximum": 100,
|
|
109
|
-
"minimum": 1,
|
|
110
|
-
"type": "integer"
|
|
111
|
-
}
|
|
112
|
-
},
|
|
113
|
-
"type": "object"
|
|
114
|
-
},
|
|
115
|
-
"ScalarDefaultValue": {
|
|
116
|
-
"description": "后端 queDefaultValue 支持的普通字段默认值;非空值必须是字符串,显式 null 表示清除默认值。数字和布尔值应先转换为字符串,对象和数组必须使用字段专用默认值配置。defaultType 为 3 时,通过 AppForm Schema 查询能力传入当前 schema_version 并设置 schema_kind=formula 获取公式语法、字段引用、运算符和全部函数说明;CLI 使用 builder app-form schema --schema-kind formula。需要配置结构化默认值时,传入当前 schema_version,并将字段的 questionType 作为 field_type 获取字段详细 Schema。",
|
|
117
|
-
"type": [
|
|
118
|
-
"null",
|
|
119
|
-
"string"
|
|
120
|
-
]
|
|
121
|
-
}
|
|
122
|
-
},
|
|
123
|
-
"$id": "https://builder.qingflow.com/schemas/app-form-apply/v1alpha1/fields/rich_text.json",
|
|
124
|
-
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
125
|
-
"allOf": [
|
|
126
|
-
{
|
|
127
|
-
"$ref": "#/$defs/FieldCommon"
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
"properties": {
|
|
131
|
-
"config": {
|
|
132
|
-
"$ref": "#/$defs/EmptyConfig"
|
|
133
|
-
},
|
|
134
|
-
"questionType": {
|
|
135
|
-
"const": "rich_text"
|
|
136
|
-
}
|
|
137
|
-
},
|
|
138
|
-
"required": [
|
|
139
|
-
"questionType"
|
|
140
|
-
]
|
|
141
|
-
}
|
|
142
|
-
],
|
|
143
|
-
"title": "Qingflow AppForm v1alpha1 rich_text field",
|
|
144
|
-
"type": "object",
|
|
145
|
-
"unevaluatedProperties": false
|
|
146
|
-
}
|
|
@@ -1,387 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import re
|
|
4
|
-
from typing import Iterable, Mapping
|
|
5
|
-
|
|
6
|
-
from . import __version__
|
|
7
|
-
from .public_surface import PUBLIC_TOOL_BY_KEY
|
|
8
|
-
from .tool_catalog_i18n import DEFAULT_LOCALE, SUPPORTED_LOCALES, TOOL_DISPLAY_TEXT
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
CATALOG_VERSION = 2
|
|
12
|
-
POLICY_VERSION = 1
|
|
13
|
-
TOOL_ID_PATTERN = re.compile(r"^[a-z][a-z0-9_]*:[a-z][a-z0-9_]*$")
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
# 基础恢复能力必须逐项登记,禁止按 auth_ / workspace_ 前缀推断。
|
|
17
|
-
EXEMPT_TOOL_IDS = frozenset(
|
|
18
|
-
{
|
|
19
|
-
"user:auth_login",
|
|
20
|
-
"user:auth_use_credential",
|
|
21
|
-
"user:auth_whoami",
|
|
22
|
-
"user:auth_logout",
|
|
23
|
-
"user:get_login_link",
|
|
24
|
-
"user:workspace_list",
|
|
25
|
-
"user:workspace_get",
|
|
26
|
-
"user:workspace_select",
|
|
27
|
-
"builder:auth_use_credential",
|
|
28
|
-
"builder:auth_whoami",
|
|
29
|
-
"builder:auth_logout",
|
|
30
|
-
"builder:get_login_link",
|
|
31
|
-
"builder:workspace_list",
|
|
32
|
-
"builder:workspace_get",
|
|
33
|
-
}
|
|
34
|
-
)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
# 历史统一 stdio 独有入口没有 App User/Builder 公共声明,必须逐项冻结;
|
|
38
|
-
# 与 public_surface 声明取并集后才是允许进入目录和闸门绑定的完整登记表。
|
|
39
|
-
LEGACY_STDIO_TOOL_IDS = frozenset(
|
|
40
|
-
{
|
|
41
|
-
"user:navigation_create",
|
|
42
|
-
"user:navigation_delete",
|
|
43
|
-
"user:navigation_get_detail",
|
|
44
|
-
"user:navigation_get_status",
|
|
45
|
-
"user:navigation_list_draft_all",
|
|
46
|
-
"user:navigation_list_draft_page",
|
|
47
|
-
"user:navigation_list_published",
|
|
48
|
-
"user:navigation_publish",
|
|
49
|
-
"user:navigation_reorder",
|
|
50
|
-
"user:navigation_set_visible",
|
|
51
|
-
"user:navigation_update",
|
|
52
|
-
"user:package_create",
|
|
53
|
-
"user:package_delete",
|
|
54
|
-
"user:package_get",
|
|
55
|
-
"user:package_get_base",
|
|
56
|
-
"user:package_list",
|
|
57
|
-
"user:package_update",
|
|
58
|
-
"user:portal_create",
|
|
59
|
-
"user:portal_delete",
|
|
60
|
-
"user:portal_get_base_info",
|
|
61
|
-
"user:portal_publish",
|
|
62
|
-
"user:portal_update",
|
|
63
|
-
"user:portal_update_base_info",
|
|
64
|
-
"user:qingbi_report_delete",
|
|
65
|
-
"user:qingbi_report_get_base",
|
|
66
|
-
"user:qingbi_report_get_config",
|
|
67
|
-
"user:qingbi_report_get_data",
|
|
68
|
-
"user:qingbi_report_list",
|
|
69
|
-
"user:qingbi_report_list_field_options",
|
|
70
|
-
"user:qingbi_report_list_fields",
|
|
71
|
-
"user:qingbi_report_reorder",
|
|
72
|
-
"user:role_create",
|
|
73
|
-
"user:role_delete",
|
|
74
|
-
"user:role_search",
|
|
75
|
-
"user:role_update",
|
|
76
|
-
"user:solution_build_all",
|
|
77
|
-
"user:solution_build_analytics_portal",
|
|
78
|
-
"user:solution_build_app",
|
|
79
|
-
"user:solution_build_app_flow",
|
|
80
|
-
"user:solution_build_app_from_requirements",
|
|
81
|
-
"user:solution_build_flow",
|
|
82
|
-
"user:solution_build_navigation",
|
|
83
|
-
"user:solution_build_status",
|
|
84
|
-
"user:solution_build_views",
|
|
85
|
-
"user:solution_design_session",
|
|
86
|
-
"user:solution_schema_example",
|
|
87
|
-
"user:view_board_get_lane_base_info",
|
|
88
|
-
"user:view_get_base_info",
|
|
89
|
-
"user:view_get_config",
|
|
90
|
-
"user:view_get_future_nodes",
|
|
91
|
-
"user:view_get_workflow_status",
|
|
92
|
-
"user:view_list",
|
|
93
|
-
"user:view_list_associations",
|
|
94
|
-
"user:view_list_flat",
|
|
95
|
-
"user:view_list_questions",
|
|
96
|
-
"user:workflow_get_future_nodes",
|
|
97
|
-
"user:workflow_get_future_nodes_app",
|
|
98
|
-
"user:workspace_set_plugin_status",
|
|
99
|
-
}
|
|
100
|
-
)
|
|
101
|
-
REGISTERED_TOOL_IDS = frozenset(PUBLIC_TOOL_BY_KEY).union(LEGACY_STDIO_TOOL_IDS)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
# 能力说明只描述实际工具行为;产品分类和分类映射由 Wingent-X 维护。
|
|
105
|
-
TOOL_DESCRIPTIONS: dict[str, str] = {
|
|
106
|
-
"builder:app_associated_resources_apply": "配置应用关联视图、关联报表及其按视图展示规则。",
|
|
107
|
-
"builder:app_charts_apply": "创建、更新、删除或重排轻流应用数据源的图表与报表配置。",
|
|
108
|
-
"builder:app_custom_buttons_apply": "维护独立按钮定义、样式以及跨视图绑定与排序。",
|
|
109
|
-
"builder:app_delete": "删除应用及其配置,执行前仍受原权限和确认限制。",
|
|
110
|
-
"builder:app_flow_apply": "替换工作流声明或修改节点;删除旧节点时沿用破坏性确认。",
|
|
111
|
-
"builder:app_flow_get": "读取当前草稿或指定历史版本的工作流声明。",
|
|
112
|
-
"builder:app_flow_get_schema": "读取工作流声明的版本化 Schema。",
|
|
113
|
-
"builder:app_flow_list_versions": "列出可用于恢复的工作流历史版本。",
|
|
114
|
-
"builder:app_flow_restore_version": "把指定历史工作流版本恢复到草稿,属于写操作。",
|
|
115
|
-
"builder:app_flow_validate": "校验工作流声明,执行原有维护和合同检查。",
|
|
116
|
-
"builder:app_form_apply": "根据完整表单声明创建或更新应用、字段、布局及相关配置。",
|
|
117
|
-
"builder:app_form_get": "读取应用的 canonical 表单声明。",
|
|
118
|
-
"builder:app_form_schema": "读取表单声明、字段或公式的版本化 Schema。",
|
|
119
|
-
"builder:app_form_validate": "本地校验表单声明,不访问业务后端。",
|
|
120
|
-
"builder:app_form_validate_code_block": "静态检查代码块并可在后端试运行代码。",
|
|
121
|
-
"builder:app_form_validate_formula": "校验公式语法并在后端求值验证。",
|
|
122
|
-
"builder:app_get": "读取应用配置概览及可继续定位的表单、视图和流程资源。",
|
|
123
|
-
"builder:app_get_associated_resources": "读取应用关联视图、关联报表及其展示配置。",
|
|
124
|
-
"builder:app_get_buttons": "读取应用按钮定义和绑定配置。",
|
|
125
|
-
"builder:app_get_charts": "读取应用图表与报表配置。",
|
|
126
|
-
"builder:app_get_fields": "读取应用字段及可用于图表配置的字段能力。",
|
|
127
|
-
"builder:app_get_flow": "读取应用工作流配置概览。",
|
|
128
|
-
"builder:app_get_layout": "读取应用表单布局配置。",
|
|
129
|
-
"builder:app_get_views": "读取应用视图配置概览。",
|
|
130
|
-
"builder:app_publish_verify": "按当前发布状态核验应用,必要时执行发布、结束编辑及发布后的读取核验。",
|
|
131
|
-
"builder:app_release_edit_lock_if_mine": "仅释放当前用户自己持有的应用编辑锁。",
|
|
132
|
-
"builder:app_repair_code_blocks": "检查并可修复输出绑定代码块;apply=false/true 共用一个完整工具许可。",
|
|
133
|
-
"builder:app_resolve": "按名称或引用定位目标应用。",
|
|
134
|
-
"builder:app_views_apply": "创建或修改视图、过滤与查询面板,并可创建和绑定视图按钮。",
|
|
135
|
-
"builder:app_views_get": "读取 canonical 视图声明及相关配置。",
|
|
136
|
-
"builder:app_views_schema": "读取视图声明的版本化 Schema。",
|
|
137
|
-
"builder:app_views_validate": "校验视图声明。",
|
|
138
|
-
"builder:auth_logout": "退出当前认证上下文,并可清理保存的凭据。",
|
|
139
|
-
"builder:auth_use_credential": "使用提供的凭据建立认证上下文,并按参数决定是否保存。",
|
|
140
|
-
"builder:auth_whoami": "查看当前认证身份。",
|
|
141
|
-
"builder:builder_tool_contract": "读取配置工具合同,包含表单、视图、流程、图表、应用包和成员相关配置能力。",
|
|
142
|
-
"builder:button_style_catalog_get": "读取可用按钮样式、颜色和图标。",
|
|
143
|
-
"builder:chart_get": "读取目标图表的配置。",
|
|
144
|
-
"builder:feedback_submit": "提交产品反馈,沿用原用户确认要求。",
|
|
145
|
-
"builder:file_upload_local": "把本地文件上传到轻流。",
|
|
146
|
-
"builder:get_login_link": "为指定轻流页面生成短时免登录链接。",
|
|
147
|
-
"builder:member_search": "搜索工作区成员。",
|
|
148
|
-
"builder:package_apply": "创建或更新应用包元数据、可见性、分组及排序。",
|
|
149
|
-
"builder:package_get": "读取应用包详情。",
|
|
150
|
-
"builder:package_list": "列出可访问的应用包。",
|
|
151
|
-
"builder:portal_apply": "创建或更新门户,并可创建其内嵌图表。",
|
|
152
|
-
"builder:portal_delete": "删除门户,沿用原破坏性确认要求。",
|
|
153
|
-
"builder:portal_get": "读取门户配置。",
|
|
154
|
-
"builder:portal_list": "列出可访问的门户。",
|
|
155
|
-
"builder:role_create": "创建工作区角色。",
|
|
156
|
-
"builder:role_search": "搜索工作区角色。",
|
|
157
|
-
"builder:solution_install": "安装完整方案,可创建应用包、应用、字段、视图、流程、图表、门户和角色,并按参数复制业务数据。",
|
|
158
|
-
"builder:view_get": "读取目标视图的配置。",
|
|
159
|
-
"builder:workspace_get": "读取工作区信息。",
|
|
160
|
-
"builder:workspace_icon_catalog_get": "读取应用配置可用的工作区图标和颜色。",
|
|
161
|
-
"builder:workspace_list": "列出可访问的工作区。",
|
|
162
|
-
"user:app_get": "读取应用信息、数据访问范围和可访问视图。",
|
|
163
|
-
"user:app_list": "列出或按名称搜索可访问的应用。",
|
|
164
|
-
"user:auth_login": "登录并建立轻流认证上下文。",
|
|
165
|
-
"user:auth_logout": "退出当前认证上下文,并可清理保存的凭据。",
|
|
166
|
-
"user:auth_use_credential": "使用提供的凭据建立认证上下文,并按参数决定是否保存。",
|
|
167
|
-
"user:auth_whoami": "查看当前认证身份。",
|
|
168
|
-
"user:chart_get": "读取目标图表。",
|
|
169
|
-
"user:data_delete": "在应用数据面批量删除记录,沿用原数据范围和权限检查。",
|
|
170
|
-
"user:data_get": "按记录 ID 读取应用数据及可选字段信息。",
|
|
171
|
-
"user:data_insert": "在应用数据面批量新增记录。",
|
|
172
|
-
"user:data_query": "按字段 ID 查询应用数据,支持过滤、排序、分页及完整 CSV 导出。",
|
|
173
|
-
"user:data_update": "在应用数据面批量局部更新记录。",
|
|
174
|
-
"user:directory_list_all_departments": "读取全部可访问部门。",
|
|
175
|
-
"user:directory_list_all_internal_users": "读取全部可访问内部成员。",
|
|
176
|
-
"user:directory_list_external_members": "列出外部成员。",
|
|
177
|
-
"user:directory_list_internal_departments": "列出内部部门。",
|
|
178
|
-
"user:directory_list_internal_users": "列出内部成员。",
|
|
179
|
-
"user:directory_list_sub_departments": "列出指定部门的子部门。",
|
|
180
|
-
"user:directory_search": "搜索通讯录成员或部门。",
|
|
181
|
-
"user:feedback_submit": "提交产品反馈,沿用原用户确认要求。",
|
|
182
|
-
"user:file_get_upload_info": "获取文件上传所需的信息。",
|
|
183
|
-
"user:file_upload_local": "把本地文件上传到轻流。",
|
|
184
|
-
"user:get_login_link": "为指定轻流页面生成短时免登录链接。",
|
|
185
|
-
"user:navigation_create": "创建导航配置。",
|
|
186
|
-
"user:navigation_delete": "删除导航配置。",
|
|
187
|
-
"user:navigation_get_detail": "读取导航详情。",
|
|
188
|
-
"user:navigation_get_status": "读取导航状态。",
|
|
189
|
-
"user:navigation_list_draft_all": "读取全部导航草稿。",
|
|
190
|
-
"user:navigation_list_draft_page": "分页读取导航草稿。",
|
|
191
|
-
"user:navigation_list_published": "读取已发布导航。",
|
|
192
|
-
"user:navigation_publish": "发布导航配置。",
|
|
193
|
-
"user:navigation_reorder": "调整导航排序。",
|
|
194
|
-
"user:navigation_set_visible": "调整导航可见性。",
|
|
195
|
-
"user:navigation_update": "更新导航配置。",
|
|
196
|
-
"user:package_create": "创建应用包。",
|
|
197
|
-
"user:package_delete": "删除应用包,并可按 deleted_all_data 删除业务数据及关联应用配置。",
|
|
198
|
-
"user:package_get": "读取应用包详情。",
|
|
199
|
-
"user:package_get_base": "读取应用包基础信息。",
|
|
200
|
-
"user:package_list": "列出应用包。",
|
|
201
|
-
"user:package_update": "更新应用包配置。",
|
|
202
|
-
"user:portal_create": "创建门户。",
|
|
203
|
-
"user:portal_delete": "删除门户。",
|
|
204
|
-
"user:portal_get": "读取门户详情。",
|
|
205
|
-
"user:portal_get_base_info": "读取门户基础信息。",
|
|
206
|
-
"user:portal_list": "列出门户。",
|
|
207
|
-
"user:portal_publish": "发布门户。",
|
|
208
|
-
"user:portal_update": "更新门户内容配置。",
|
|
209
|
-
"user:portal_update_base_info": "更新门户基础信息。",
|
|
210
|
-
"user:qingbi_report_delete": "删除轻析报表。",
|
|
211
|
-
"user:qingbi_report_get_base": "读取轻析报表基础信息。",
|
|
212
|
-
"user:qingbi_report_get_config": "读取轻析报表配置。",
|
|
213
|
-
"user:qingbi_report_get_data": "读取轻析报表数据。",
|
|
214
|
-
"user:qingbi_report_list": "列出轻析报表。",
|
|
215
|
-
"user:qingbi_report_list_field_options": "读取轻析报表字段的可选配置项。",
|
|
216
|
-
"user:qingbi_report_list_fields": "读取轻析报表字段。",
|
|
217
|
-
"user:qingbi_report_reorder": "调整轻析报表排序。",
|
|
218
|
-
"user:record_access": "解析应用和视图的数据访问入口及原有权限范围。",
|
|
219
|
-
"user:record_analyze": "分析指定应用或视图的记录数据。",
|
|
220
|
-
"user:record_browse_schema_get": "读取按视图浏览记录的字段合同。",
|
|
221
|
-
"user:record_code_block_run": "执行记录数据相关代码块。",
|
|
222
|
-
"user:record_code_block_schema_get": "读取记录代码块的输入输出合同。",
|
|
223
|
-
"user:record_delete": "通过原记录接口删除记录。",
|
|
224
|
-
"user:record_department_candidates": "读取记录字段可选部门。",
|
|
225
|
-
"user:record_export_direct": "直接导出记录数据。",
|
|
226
|
-
"user:record_export_get": "获取记录导出结果。",
|
|
227
|
-
"user:record_export_start": "启动记录导出任务。",
|
|
228
|
-
"user:record_export_status_get": "查询记录导出任务状态。",
|
|
229
|
-
"user:record_get": "读取单条记录。",
|
|
230
|
-
"user:record_import_repair_local": "修复本地记录导入文件。",
|
|
231
|
-
"user:record_import_schema_get": "读取记录导入字段合同。",
|
|
232
|
-
"user:record_import_start": "启动记录导入任务。",
|
|
233
|
-
"user:record_import_status_get": "查询记录导入任务状态。",
|
|
234
|
-
"user:record_import_template_get": "获取记录导入模板。",
|
|
235
|
-
"user:record_import_verify": "验证记录导入结果。",
|
|
236
|
-
"user:record_insert": "通过原记录接口新增记录。",
|
|
237
|
-
"user:record_insert_schema_get": "读取记录新增字段合同。",
|
|
238
|
-
"user:record_list": "按视图读取记录列表。",
|
|
239
|
-
"user:record_logs_get": "读取记录操作日志。",
|
|
240
|
-
"user:record_member_candidates": "读取记录字段可选成员。",
|
|
241
|
-
"user:record_schema_get": "读取申请表单字段合同。",
|
|
242
|
-
"user:record_update": "通过原记录接口更新记录。",
|
|
243
|
-
"user:record_update_schema_get": "读取记录更新字段合同。",
|
|
244
|
-
"user:role_create": "创建工作区角色。",
|
|
245
|
-
"user:role_delete": "删除工作区角色。",
|
|
246
|
-
"user:role_search": "搜索工作区角色。",
|
|
247
|
-
"user:role_update": "更新工作区角色。",
|
|
248
|
-
"user:solution_build_all": "规划、执行或修复完整方案,可创建应用包、角色、应用、字段、流程、视图、图表、门户、导航及初始业务数据。",
|
|
249
|
-
"user:solution_build_analytics_portal": "规划、执行或修复图表与门户搭建,并可启用相应工作区插件。",
|
|
250
|
-
"user:solution_build_app": "规划、执行或修复应用搭建,并可创建应用包、角色、字段及初始业务数据。",
|
|
251
|
-
"user:solution_build_app_flow": "规划、执行或修复应用及流程搭建,并可创建应用包、角色、字段及初始业务数据。",
|
|
252
|
-
"user:solution_build_app_from_requirements": "根据需求搭建应用,并可创建应用包、角色、字段及初始业务数据。",
|
|
253
|
-
"user:solution_build_flow": "规划、执行或修复流程搭建,并可为流程角色引用创建工作区角色。",
|
|
254
|
-
"user:solution_build_navigation": "规划、执行或修复导航搭建,并可启用相应工作区插件。",
|
|
255
|
-
"user:solution_build_status": "读取方案搭建任务的进度和结果。",
|
|
256
|
-
"user:solution_build_views": "规划、执行或修复方案中的视图配置。",
|
|
257
|
-
"user:solution_design_session": "创建、读取或更新本地方案设计会话。",
|
|
258
|
-
"user:solution_schema_example": "读取方案声明 Schema 和示例。",
|
|
259
|
-
"user:task_action_execute": "执行待办动作,沿用原审批权限和确认边界。",
|
|
260
|
-
"user:task_associated_report_detail_get": "读取待办关联报表详情。",
|
|
261
|
-
"user:task_get": "读取待办详情。",
|
|
262
|
-
"user:task_list": "列出待办。",
|
|
263
|
-
"user:task_workbench": "进入交互式待办工作台,可读取待办并执行其现有审批动作。",
|
|
264
|
-
"user:task_workflow_log_get": "读取待办工作流日志。",
|
|
265
|
-
"user:view_board_get_lane_base_info": "读取看板视图泳道信息。",
|
|
266
|
-
"user:view_get": "读取可访问视图的业务信息及导出能力。",
|
|
267
|
-
"user:view_get_base_info": "读取视图基础信息。",
|
|
268
|
-
"user:view_get_config": "读取视图配置。",
|
|
269
|
-
"user:view_get_future_nodes": "读取视图记录后续流程节点。",
|
|
270
|
-
"user:view_get_workflow_status": "读取视图记录流程状态。",
|
|
271
|
-
"user:view_list": "列出视图。",
|
|
272
|
-
"user:view_list_associations": "读取视图关联资源。",
|
|
273
|
-
"user:view_list_flat": "读取扁平视图列表。",
|
|
274
|
-
"user:view_list_questions": "读取视图字段。",
|
|
275
|
-
"user:workflow_get_future_nodes": "读取记录后续流程节点。",
|
|
276
|
-
"user:workflow_get_future_nodes_app": "读取应用流程的后续节点。",
|
|
277
|
-
"user:workspace_get": "读取工作区信息。",
|
|
278
|
-
"user:workspace_list": "列出可访问的工作区。",
|
|
279
|
-
"user:workspace_select": "切换当前工作区上下文。",
|
|
280
|
-
"user:workspace_set_plugin_status": "启用或停用工作区业务插件,属于受控业务写操作。",
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
def tool_id(domain: str, name: str) -> str:
|
|
285
|
-
value = f"{domain}:{name}"
|
|
286
|
-
if TOOL_ID_PATTERN.fullmatch(value) is None:
|
|
287
|
-
raise ValueError(f"非法工具 ID: {value}")
|
|
288
|
-
return value
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
def require_registered_tool_id(stable_id: str) -> None:
|
|
292
|
-
if TOOL_ID_PATTERN.fullmatch(stable_id) is None:
|
|
293
|
-
raise ValueError(f"非法工具 ID: {stable_id}")
|
|
294
|
-
if stable_id not in REGISTERED_TOOL_IDS:
|
|
295
|
-
raise ValueError(f"工具尚未登记: {stable_id}")
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
def tool_is_exempt(stable_id: str) -> bool:
|
|
299
|
-
return stable_id in EXEMPT_TOOL_IDS
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
def build_tool_catalog(
|
|
303
|
-
cli_bindings: Mapping[tuple[str, ...], str],
|
|
304
|
-
mcp_bindings: Mapping[str, Mapping[str, str]],
|
|
305
|
-
) -> dict[str, object]:
|
|
306
|
-
entrypoints: dict[str, list[dict[str, object]]] = {}
|
|
307
|
-
for route, stable_id in sorted(cli_bindings.items()):
|
|
308
|
-
require_registered_tool_id(stable_id)
|
|
309
|
-
entrypoints.setdefault(stable_id, []).append({"type": "cli", "route": list(route)})
|
|
310
|
-
for surface, bindings in sorted(mcp_bindings.items()):
|
|
311
|
-
for name, stable_id in sorted(bindings.items()):
|
|
312
|
-
require_registered_tool_id(stable_id)
|
|
313
|
-
entrypoints.setdefault(stable_id, []).append({"type": "mcp", "surface": surface, "name": name})
|
|
314
|
-
|
|
315
|
-
# 完整提供方目录必须覆盖所有登记工具,不能静默导出缺少历史入口的子集。
|
|
316
|
-
if set(entrypoints) != REGISTERED_TOOL_IDS:
|
|
317
|
-
missing = sorted(REGISTERED_TOOL_IDS - set(entrypoints))
|
|
318
|
-
raise ValueError(f"工具目录入口不完整: missing={missing}")
|
|
319
|
-
if set(TOOL_DESCRIPTIONS) != REGISTERED_TOOL_IDS:
|
|
320
|
-
raise ValueError("工具能力说明与完整登记表不一致")
|
|
321
|
-
if set(TOOL_DISPLAY_TEXT) != REGISTERED_TOOL_IDS:
|
|
322
|
-
raise ValueError("工具多语言文案与完整登记表不一致")
|
|
323
|
-
|
|
324
|
-
tools: list[dict[str, object]] = []
|
|
325
|
-
for stable_id in sorted(entrypoints):
|
|
326
|
-
description = TOOL_DESCRIPTIONS[stable_id]
|
|
327
|
-
if not isinstance(description, str) or not description.strip():
|
|
328
|
-
raise ValueError(f"工具缺少能力说明: {stable_id}")
|
|
329
|
-
zh_name, en_name, en_description = TOOL_DISPLAY_TEXT[stable_id]
|
|
330
|
-
if any(not isinstance(value, str) or not value.strip() for value in (zh_name, en_name, en_description)):
|
|
331
|
-
raise ValueError(f"工具缺少多语言文案: {stable_id}")
|
|
332
|
-
tools.append({
|
|
333
|
-
"id": stable_id,
|
|
334
|
-
"name": stable_id.split(":", 1)[1],
|
|
335
|
-
"description": description,
|
|
336
|
-
"displayName": zh_name,
|
|
337
|
-
"i18n": {
|
|
338
|
-
"zh-CN": {"displayName": zh_name, "description": description},
|
|
339
|
-
"en-US": {"displayName": en_name, "description": en_description},
|
|
340
|
-
},
|
|
341
|
-
"exempt": tool_is_exempt(stable_id),
|
|
342
|
-
"entrypoints": entrypoints[stable_id],
|
|
343
|
-
})
|
|
344
|
-
return {
|
|
345
|
-
"catalogVersion": CATALOG_VERSION,
|
|
346
|
-
"policyVersion": POLICY_VERSION,
|
|
347
|
-
"provider": {"name": "qingflow-mcp", "version": __version__},
|
|
348
|
-
"defaultLocale": DEFAULT_LOCALE,
|
|
349
|
-
"locales": list(SUPPORTED_LOCALES),
|
|
350
|
-
"tools": tools,
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
def user_server_bindings(tool_names: Iterable[str]) -> dict[str, str]:
|
|
355
|
-
return {name: tool_id("user", name) for name in tool_names}
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
def builder_server_bindings(tool_names: Iterable[str]) -> dict[str, str]:
|
|
359
|
-
return {name: tool_id("builder", name) for name in tool_names}
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
def stdio_server_bindings(
|
|
363
|
-
legacy_tool_names: Iterable[str],
|
|
364
|
-
final_tool_names: Iterable[str],
|
|
365
|
-
) -> dict[str, str]:
|
|
366
|
-
legacy = set(legacy_tool_names)
|
|
367
|
-
final = set(final_tool_names)
|
|
368
|
-
return {
|
|
369
|
-
name: tool_id("user" if name in legacy else "builder", name)
|
|
370
|
-
for name in final
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
def combined_server_bindings(
|
|
375
|
-
user_tool_names: Iterable[str],
|
|
376
|
-
builder_tool_names: Iterable[str],
|
|
377
|
-
*,
|
|
378
|
-
builder_prefix: str,
|
|
379
|
-
) -> dict[str, str]:
|
|
380
|
-
bindings = user_server_bindings(user_tool_names)
|
|
381
|
-
bindings.update(
|
|
382
|
-
{
|
|
383
|
-
f"{builder_prefix}{name}": tool_id("builder", name)
|
|
384
|
-
for name in builder_tool_names
|
|
385
|
-
}
|
|
386
|
-
)
|
|
387
|
-
return bindings
|