@qingflow-tech/qingflow-cli 1.1.38 → 1.1.40

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 (31) hide show
  1. package/README.md +7 -3
  2. package/package.json +1 -1
  3. package/pyproject.toml +1 -1
  4. package/src/qingflow_mcp/builder_facade/service.py +8 -8
  5. package/src/qingflow_mcp/server_cloud.py +89 -3
  6. package/src/qingflow_mcp/tools/ai_builder_tools.py +1 -59
  7. package/src/qingflow_mcp/tools/app_tools.py +15 -29
  8. package/src/qingflow_mcp/tools/approval_tools.py +16 -40
  9. package/src/qingflow_mcp/tools/auth_tools.py +1 -4
  10. package/src/qingflow_mcp/tools/base.py +16 -34
  11. package/src/qingflow_mcp/tools/code_block_tools.py +2 -5
  12. package/src/qingflow_mcp/tools/custom_button_tools.py +6 -11
  13. package/src/qingflow_mcp/tools/directory_tools.py +9 -16
  14. package/src/qingflow_mcp/tools/export_tools.py +5 -9
  15. package/src/qingflow_mcp/tools/feedback_tools.py +0 -2
  16. package/src/qingflow_mcp/tools/file_tools.py +3 -5
  17. package/src/qingflow_mcp/tools/import_tools.py +7 -13
  18. package/src/qingflow_mcp/tools/navigation_tools.py +12 -23
  19. package/src/qingflow_mcp/tools/package_tools.py +11 -21
  20. package/src/qingflow_mcp/tools/portal_tools.py +9 -17
  21. package/src/qingflow_mcp/tools/qingbi_report_tools.py +18 -23
  22. package/src/qingflow_mcp/tools/record_tools.py +97 -53
  23. package/src/qingflow_mcp/tools/repository_dev_tools.py +4 -7
  24. package/src/qingflow_mcp/tools/resource_read_tools.py +6 -9
  25. package/src/qingflow_mcp/tools/role_tools.py +5 -9
  26. package/src/qingflow_mcp/tools/solution_tools.py +4 -16
  27. package/src/qingflow_mcp/tools/task_context_tools.py +6 -12
  28. package/src/qingflow_mcp/tools/task_tools.py +12 -29
  29. package/src/qingflow_mcp/tools/view_tools.py +23 -32
  30. package/src/qingflow_mcp/tools/workflow_tools.py +30 -47
  31. package/src/qingflow_mcp/tools/workspace_tools.py +5 -9
@@ -6,7 +6,7 @@ from ..config import DEFAULT_PROFILE
6
6
  from ..errors import QingflowApiError, backend_code_int, is_auth_like_error, raise_tool_error
7
7
  from ..json_types import JSONObject, JSONValue
8
8
  from ..list_type_labels import SYSTEM_VIEW_DEFINITIONS
9
- from .base import ToolBase, tool_cn_name
9
+ from .base import ToolBase
10
10
 
11
11
 
12
12
  class ViewTools(ToolBase):
@@ -57,7 +57,6 @@ class ViewTools(ToolBase):
57
57
  def view_get_workflow_status(profile: str = DEFAULT_PROFILE, viewgraph_key: str = "", row_record_id: int = 0) -> JSONObject:
58
58
  return self.view_get_workflow_status(profile=profile, viewgraph_key=viewgraph_key, row_record_id=row_record_id)
59
59
 
60
- @tool_cn_name("视图列表")
61
60
  def view_list(self, *, profile: str, app_key: str) -> JSONObject:
62
61
  """执行视图相关逻辑。"""
63
62
  self._require_app_key(app_key)
@@ -85,15 +84,13 @@ class ViewTools(ToolBase):
85
84
  "verification": verification,
86
85
  }
87
86
 
88
- return self._run(profile, runner)
87
+ return self._run(profile, runner, tool_name="视图列表")
89
88
 
90
- @tool_cn_name("视图列表(扁平)")
91
89
  def view_list_flat(self, *, profile: str, app_key: str) -> JSONObject:
92
90
  """执行视图相关逻辑。"""
93
91
  self._require_app_key(app_key)
94
- return self._request(profile, "GET", f"/app/{app_key}/view/views", app_key=app_key)
92
+ return self._request(profile, "GET", f"/app/{app_key}/view/views", app_key=app_key, tool_name="视图列表(扁平)")
95
93
 
96
- @tool_cn_name("视图排序")
97
94
  def view_reorder(self, *, profile: str, app_key: str, payload: list[JSONObject]) -> JSONObject:
98
95
  """执行视图相关逻辑。"""
99
96
  self._require_app_key(app_key)
@@ -104,30 +101,27 @@ class ViewTools(ToolBase):
104
101
  "POST",
105
102
  f"/app/{app_key}/view/ordinal",
106
103
  app_key=app_key,
104
+ tool_name="视图排序",
107
105
  json_body=self._normalize_reorder_payload(payload),
108
106
  )
109
107
 
110
- @tool_cn_name("设置视图列宽")
111
108
  def view_set_column_width(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
112
109
  """执行视图相关逻辑。"""
113
110
  self._require_app_key(app_key)
114
111
  body = self._require_dict(payload)
115
- return self._request(profile, "POST", f"/app/{app_key}/view/que/width", app_key=app_key, json_body=body)
112
+ return self._request(profile, "POST", f"/app/{app_key}/view/que/width", app_key=app_key, tool_name="设置视图列宽", json_body=body)
116
113
 
117
- @tool_cn_name("创建视图")
118
114
  def view_create(self, *, profile: str, payload: JSONObject) -> JSONObject:
119
115
  """执行视图相关逻辑。"""
120
116
  body = self._require_dict(payload)
121
117
  app_key = str(body.get("appKey") or "")
122
- return self._request(profile, "POST", "/view/viewConfig", app_key=app_key, json_body=body)
118
+ return self._request(profile, "POST", "/view/viewConfig", app_key=app_key, tool_name="创建视图", json_body=body)
123
119
 
124
- @tool_cn_name("视图配置")
125
120
  def view_get_config(self, *, profile: str, viewgraph_key: str) -> JSONObject:
126
121
  """执行视图相关逻辑。"""
127
122
  self._require_viewgraph_key(viewgraph_key)
128
- return self._request(profile, "GET", f"/view/{viewgraph_key}/viewConfig", viewgraph_key=viewgraph_key)
123
+ return self._request(profile, "GET", f"/view/{viewgraph_key}/viewConfig", viewgraph_key=viewgraph_key, tool_name="视图配置")
129
124
 
130
- @tool_cn_name("视图基础信息")
131
125
  def view_get_base_info(self, *, profile: str, viewgraph_key: str, passcode: str | None) -> JSONObject:
132
126
  """执行视图相关逻辑。"""
133
127
  self._require_viewgraph_key(viewgraph_key)
@@ -165,9 +159,8 @@ class ViewTools(ToolBase):
165
159
  "verification": verification,
166
160
  }
167
161
 
168
- return self._run(profile, runner)
162
+ return self._run(profile, runner, tool_name="视图基础信息")
169
163
 
170
- @tool_cn_name("更新视图配置")
171
164
  def view_update(self, *, profile: str, viewgraph_key: str, payload: JSONObject) -> JSONObject:
172
165
  """执行视图相关逻辑。"""
173
166
  self._require_viewgraph_key(viewgraph_key)
@@ -177,12 +170,12 @@ class ViewTools(ToolBase):
177
170
  "POST",
178
171
  f"/view/{viewgraph_key}/viewConfig",
179
172
  viewgraph_key=viewgraph_key,
173
+ tool_name="更新视图配置",
180
174
  json_body=body,
181
175
  risk_operation="update",
182
176
  risk_target="view configuration",
183
177
  )
184
178
 
185
- @tool_cn_name("删除视图")
186
179
  def view_delete(self, *, profile: str, viewgraph_key: str) -> JSONObject:
187
180
  """执行视图相关逻辑。"""
188
181
  self._require_viewgraph_key(viewgraph_key)
@@ -191,29 +184,26 @@ class ViewTools(ToolBase):
191
184
  "DELETE",
192
185
  f"/view/{viewgraph_key}",
193
186
  viewgraph_key=viewgraph_key,
187
+ tool_name="删除视图",
194
188
  risk_operation="delete",
195
189
  risk_target="view configuration",
196
190
  )
197
191
 
198
- @tool_cn_name("复制视图")
199
192
  def view_copy(self, *, profile: str, viewgraph_key: str) -> JSONObject:
200
193
  """执行视图相关逻辑。"""
201
194
  self._require_viewgraph_key(viewgraph_key)
202
- return self._request(profile, "POST", f"/view/{viewgraph_key}/copy", viewgraph_key=viewgraph_key)
195
+ return self._request(profile, "POST", f"/view/{viewgraph_key}/copy", viewgraph_key=viewgraph_key, tool_name="复制视图")
203
196
 
204
- @tool_cn_name("视图字段列表")
205
197
  def view_list_questions(self, *, profile: str, viewgraph_key: str) -> JSONObject:
206
198
  """执行视图相关逻辑。"""
207
199
  self._require_viewgraph_key(viewgraph_key)
208
- return self._request(profile, "GET", f"/view/{viewgraph_key}/question", viewgraph_key=viewgraph_key)
200
+ return self._request(profile, "GET", f"/view/{viewgraph_key}/question", viewgraph_key=viewgraph_key, tool_name="视图字段列表")
209
201
 
210
- @tool_cn_name("视图关联列表")
211
202
  def view_list_associations(self, *, profile: str, viewgraph_key: str) -> JSONObject:
212
203
  """执行视图相关逻辑。"""
213
204
  self._require_viewgraph_key(viewgraph_key)
214
- return self._request(profile, "GET", f"/view/{viewgraph_key}/association", viewgraph_key=viewgraph_key)
205
+ return self._request(profile, "GET", f"/view/{viewgraph_key}/association", viewgraph_key=viewgraph_key, tool_name="视图关联列表")
215
206
 
216
- @tool_cn_name("更新视图成员配置")
217
207
  def view_update_member_config(self, *, profile: str, viewgraph_key: str, payload: JSONObject) -> JSONObject:
218
208
  """执行视图相关逻辑。"""
219
209
  self._require_viewgraph_key(viewgraph_key)
@@ -223,12 +213,12 @@ class ViewTools(ToolBase):
223
213
  "POST",
224
214
  f"/view/{viewgraph_key}/member/config",
225
215
  viewgraph_key=viewgraph_key,
216
+ tool_name="更新视图成员配置",
226
217
  json_body=body,
227
218
  risk_operation="update",
228
219
  risk_target="view member visibility",
229
220
  )
230
221
 
231
- @tool_cn_name("更新视图数据配置")
232
222
  def view_update_apply_config(self, *, profile: str, viewgraph_key: str, payload: JSONObject) -> JSONObject:
233
223
  """执行视图相关逻辑。"""
234
224
  self._require_viewgraph_key(viewgraph_key)
@@ -238,12 +228,12 @@ class ViewTools(ToolBase):
238
228
  "POST",
239
229
  f"/view/{viewgraph_key}/apply/config",
240
230
  viewgraph_key=viewgraph_key,
231
+ tool_name="更新视图数据配置",
241
232
  json_body=body,
242
233
  risk_operation="update",
243
234
  risk_target="view apply visibility",
244
235
  )
245
236
 
246
- @tool_cn_name("看板泳道配置")
247
237
  def view_board_set_lane_config(self, *, profile: str, viewgraph_key: str, payload: JSONObject) -> JSONObject:
248
238
  """执行视图相关逻辑。"""
249
239
  self._require_viewgraph_key(viewgraph_key)
@@ -253,12 +243,12 @@ class ViewTools(ToolBase):
253
243
  "POST",
254
244
  f"/view/{viewgraph_key}/lane/config",
255
245
  viewgraph_key=viewgraph_key,
246
+ tool_name="看板泳道配置",
256
247
  json_body=body,
257
248
  risk_operation="update",
258
249
  risk_target="board lane configuration",
259
250
  )
260
251
 
261
- @tool_cn_name("看板泳道基础信息")
262
252
  def view_board_get_lane_base_info(self, *, profile: str, viewgraph_key: str, page_num: int, page_size: int) -> JSONObject:
263
253
  """执行视图相关逻辑。"""
264
254
  self._require_viewgraph_key(viewgraph_key)
@@ -267,10 +257,10 @@ class ViewTools(ToolBase):
267
257
  "GET",
268
258
  f"/view/{viewgraph_key}/lane/baseInfo",
269
259
  viewgraph_key=viewgraph_key,
260
+ tool_name="看板泳道基础信息",
270
261
  params={"pageNum": page_num, "pageSize": page_size},
271
262
  )
272
263
 
273
- @tool_cn_name("甘特图自动校准")
274
264
  def view_gantt_switch_auto_calibration(self, *, profile: str, viewgraph_key: str, payload: JSONObject) -> JSONObject:
275
265
  """执行视图相关逻辑。"""
276
266
  self._require_viewgraph_key(viewgraph_key)
@@ -280,12 +270,12 @@ class ViewTools(ToolBase):
280
270
  "PUT",
281
271
  f"/view/gantt/{viewgraph_key}/auto/calibration",
282
272
  viewgraph_key=viewgraph_key,
273
+ tool_name="甘特图自动校准",
283
274
  json_body=body,
284
275
  risk_operation="update",
285
276
  risk_target="gantt auto calibration settings",
286
277
  )
287
278
 
288
- @tool_cn_name("甘特图批量更新时间")
289
279
  def view_gantt_batch_update_time(self, *, profile: str, viewgraph_key: str, payload: JSONObject) -> JSONObject:
290
280
  """执行视图相关逻辑。"""
291
281
  self._require_viewgraph_key(viewgraph_key)
@@ -295,12 +285,12 @@ class ViewTools(ToolBase):
295
285
  "PUT",
296
286
  f"/view/gantt/{viewgraph_key}/batch/update",
297
287
  viewgraph_key=viewgraph_key,
288
+ tool_name="甘特图批量更新时间",
298
289
  json_body=body,
299
290
  risk_operation="update",
300
291
  risk_target="gantt task timing",
301
292
  )
302
293
 
303
- @tool_cn_name("视图后续节点")
304
294
  def view_get_future_nodes(self, *, profile: str, viewgraph_key: str, apply_id: int, app_key: str) -> JSONObject:
305
295
  """执行视图相关逻辑。"""
306
296
  self._require_viewgraph_key(viewgraph_key)
@@ -313,15 +303,15 @@ class ViewTools(ToolBase):
313
303
  viewgraph_key=viewgraph_key,
314
304
  app_key=app_key,
315
305
  apply_id=apply_id,
306
+ tool_name="视图后续节点",
316
307
  params={"appKey": app_key},
317
308
  )
318
309
 
319
- @tool_cn_name("视图流程状态")
320
310
  def view_get_workflow_status(self, *, profile: str, viewgraph_key: str, row_record_id: int) -> JSONObject:
321
311
  """执行视图相关逻辑。"""
322
312
  self._require_viewgraph_key(viewgraph_key)
323
313
  self._require_positive("row_record_id", row_record_id)
324
- return self._request(profile, "GET", f"/view/{viewgraph_key}/workflow/status/{row_record_id}", viewgraph_key=viewgraph_key, row_record_id=row_record_id)
314
+ return self._request(profile, "GET", f"/view/{viewgraph_key}/workflow/status/{row_record_id}", viewgraph_key=viewgraph_key, row_record_id=row_record_id, tool_name="视图流程状态")
325
315
 
326
316
  def _request(
327
317
  self,
@@ -333,6 +323,7 @@ class ViewTools(ToolBase):
333
323
  params: JSONObject | None = None,
334
324
  risk_operation: str | None = None,
335
325
  risk_target: str | None = None,
326
+ tool_name: str,
336
327
  **extra: JSONValue,
337
328
  ) -> JSONObject:
338
329
  """执行内部辅助逻辑。"""
@@ -344,7 +335,7 @@ class ViewTools(ToolBase):
344
335
  return self._attach_human_review_notice(response, operation=risk_operation, target=risk_target)
345
336
  return response
346
337
 
347
- return self._run(profile, runner)
338
+ return self._run(profile, runner, tool_name=tool_name)
348
339
 
349
340
  def _require_app_key(self, app_key: str) -> None:
350
341
  """执行内部辅助逻辑。"""
@@ -6,7 +6,7 @@ from ..backend_client import BackendRequestContext
6
6
  from ..config import DEFAULT_PROFILE
7
7
  from ..errors import QingflowApiError, raise_tool_error
8
8
  from ..json_types import JSONObject, JSONValue
9
- from .base import ToolBase, tool_cn_name
9
+ from .base import ToolBase
10
10
 
11
11
 
12
12
  class WorkflowTools(ToolBase):
@@ -41,20 +41,17 @@ class WorkflowTools(ToolBase):
41
41
  audit_node_id=audit_node_id,
42
42
  )
43
43
 
44
- @tool_cn_name("流程节点列表")
45
44
  def workflow_list_nodes(self, *, profile: str, app_key: str) -> JSONObject:
46
45
  """执行流程相关逻辑。"""
47
46
  self._require_app_key(app_key)
48
- return self._request(profile, "GET", f"/app/{app_key}/auditNodes", app_key=app_key)
47
+ return self._request(profile, "GET", f"/app/{app_key}/auditNodes", app_key=app_key, tool_name="流程节点列表")
49
48
 
50
- @tool_cn_name("流程节点详情")
51
49
  def workflow_get_node_detail(self, *, profile: str, app_key: str, audit_node_id: int) -> JSONObject:
52
50
  """执行流程相关逻辑。"""
53
51
  self._require_app_key(app_key)
54
52
  self._require_positive("audit_node_id", audit_node_id)
55
- return self._request(profile, "GET", f"/app/{app_key}/auditNodes/{audit_node_id}", app_key=app_key, audit_node_id=audit_node_id)
53
+ return self._request(profile, "GET", f"/app/{app_key}/auditNodes/{audit_node_id}", app_key=app_key, audit_node_id=audit_node_id, tool_name="流程节点详情")
56
54
 
57
- @tool_cn_name("新增流程节点")
58
55
  def workflow_add_node(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
59
56
  """执行流程相关逻辑。"""
60
57
  self._require_app_key(app_key)
@@ -65,9 +62,9 @@ class WorkflowTools(ToolBase):
65
62
  path=f"/app/{app_key}/auditNodes",
66
63
  json_body=body,
67
64
  alternate_paths=[f"/app/{app_key}/auditNode"],
65
+ tool_name="新增流程节点",
68
66
  )
69
67
 
70
- @tool_cn_name("更新流程节点")
71
68
  def workflow_update_node(self, *, profile: str, app_key: str, audit_node_id: int, payload: JSONObject) -> JSONObject:
72
69
  """执行流程相关逻辑。"""
73
70
  self._require_app_key(app_key)
@@ -82,50 +79,44 @@ class WorkflowTools(ToolBase):
82
79
  risk_operation="update",
83
80
  risk_target="workflow node configuration",
84
81
  audit_node_id=audit_node_id,
82
+ tool_name="更新流程节点",
85
83
  )
86
84
 
87
- @tool_cn_name("删除流程节点")
88
85
  def workflow_delete_node(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
89
86
  """执行流程相关逻辑。"""
90
87
  self._require_app_key(app_key)
91
88
  body = self._require_dict(payload)
92
- return self._request(profile, "DELETE", f"/app/{app_key}/auditNode", app_key=app_key, json_body=body, risk_operation="delete", risk_target="workflow node configuration")
89
+ return self._request(profile, "DELETE", f"/app/{app_key}/auditNode", app_key=app_key, json_body=body, risk_operation="delete", risk_target="workflow node configuration", tool_name="删除流程节点")
93
90
 
94
- @tool_cn_name("复制粘贴流程节点")
95
91
  def workflow_copy_paste_node(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
96
92
  """执行流程相关逻辑。"""
97
93
  self._require_app_key(app_key)
98
94
  body = self._require_dict(payload)
99
- return self._request(profile, "POST", f"/app/{app_key}/auditNode/copyAndPaste", app_key=app_key, json_body=body)
95
+ return self._request(profile, "POST", f"/app/{app_key}/auditNode/copyAndPaste", app_key=app_key, json_body=body, tool_name="复制粘贴流程节点")
100
96
 
101
- @tool_cn_name("剪切粘贴流程节点")
102
97
  def workflow_cut_paste_node(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
103
98
  """执行流程相关逻辑。"""
104
99
  self._require_app_key(app_key)
105
100
  body = self._require_dict(payload)
106
- return self._request(profile, "POST", f"/app/{app_key}/auditNode/cutAndPaste", app_key=app_key, json_body=body)
101
+ return self._request(profile, "POST", f"/app/{app_key}/auditNode/cutAndPaste", app_key=app_key, json_body=body, tool_name="剪切粘贴流程节点")
107
102
 
108
- @tool_cn_name("创建流程分支")
109
103
  def workflow_create_sub_branch(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
110
104
  """执行流程相关逻辑。"""
111
105
  self._require_app_key(app_key)
112
106
  body = self._require_dict(payload)
113
- return self._request(profile, "POST", f"/app/{app_key}/auditNode/subBranch", app_key=app_key, json_body=body)
107
+ return self._request(profile, "POST", f"/app/{app_key}/auditNode/subBranch", app_key=app_key, json_body=body, tool_name="创建流程分支")
114
108
 
115
- @tool_cn_name("删除流程分支")
116
109
  def workflow_delete_sub_branch(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
117
110
  """执行流程相关逻辑。"""
118
111
  self._require_app_key(app_key)
119
112
  body = self._require_dict(payload)
120
- return self._request(profile, "DELETE", f"/app/{app_key}/auditNode/subBranch", app_key=app_key, json_body=body, risk_operation="delete", risk_target="workflow branch configuration")
113
+ return self._request(profile, "DELETE", f"/app/{app_key}/auditNode/subBranch", app_key=app_key, json_body=body, risk_operation="delete", risk_target="workflow branch configuration", tool_name="删除流程分支")
121
114
 
122
- @tool_cn_name("流程全局设置")
123
115
  def workflow_get_global_settings(self, *, profile: str, app_key: str) -> JSONObject:
124
116
  """执行流程相关逻辑。"""
125
117
  self._require_app_key(app_key)
126
- return self._request(profile, "GET", f"/app/{app_key}/workflow/global/setting", app_key=app_key)
118
+ return self._request(profile, "GET", f"/app/{app_key}/workflow/global/setting", app_key=app_key, tool_name="流程全局设置")
127
119
 
128
- @tool_cn_name("更新流程全局设置")
129
120
  def workflow_update_global_settings(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
130
121
  """执行流程相关逻辑。"""
131
122
  self._require_app_key(app_key)
@@ -138,9 +129,9 @@ class WorkflowTools(ToolBase):
138
129
  alternate_paths=[],
139
130
  risk_operation="update",
140
131
  risk_target="workflow global settings",
132
+ tool_name="更新流程全局设置",
141
133
  )
142
134
 
143
- @tool_cn_name("发布流程")
144
135
  def workflow_publish(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
145
136
  """执行流程相关逻辑。"""
146
137
  self._require_app_key(app_key)
@@ -151,16 +142,15 @@ class WorkflowTools(ToolBase):
151
142
  path=f"/app/{app_key}/publish",
152
143
  json_body=body,
153
144
  alternate_paths=[],
145
+ tool_name="发布流程",
154
146
  )
155
147
 
156
- @tool_cn_name("流程后续节点")
157
148
  def workflow_get_future_nodes(self, *, profile: str, app_key: str, apply_id: int) -> JSONObject:
158
149
  """执行流程相关逻辑。"""
159
150
  self._require_app_key(app_key)
160
151
  self._require_positive("apply_id", apply_id)
161
- return self._request(profile, "GET", f"/app/{app_key}/auditNode/futureList/{apply_id}", app_key=app_key, apply_id=apply_id)
152
+ return self._request(profile, "GET", f"/app/{app_key}/auditNode/futureList/{apply_id}", app_key=app_key, apply_id=apply_id, tool_name="流程后续节点")
162
153
 
163
- @tool_cn_name("流程后续节点(应用)")
164
154
  def workflow_get_future_nodes_app(
165
155
  self,
166
156
  *,
@@ -184,72 +174,63 @@ class WorkflowTools(ToolBase):
184
174
  app_key=app_key,
185
175
  apply_id=apply_id,
186
176
  params=params,
177
+ tool_name="流程后续节点(应用)",
187
178
  )
188
179
 
189
- @tool_cn_name("流程 Webhook 测试")
190
180
  def workflow_webhook_test(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
191
181
  """执行流程相关逻辑。"""
192
182
  self._require_app_key(app_key)
193
183
  body = self._require_dict(payload)
194
- return self._request(profile, "POST", f"/app/{app_key}/auditNode/webhookTest", app_key=app_key, json_body=body)
184
+ return self._request(profile, "POST", f"/app/{app_key}/auditNode/webhookTest", app_key=app_key, json_body=body, tool_name="流程 Webhook 测试")
195
185
 
196
- @tool_cn_name("流程 QSource 查询")
197
186
  def workflow_qsource_query(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
198
187
  """执行流程相关逻辑。"""
199
188
  self._require_app_key(app_key)
200
189
  body = self._require_dict(payload)
201
- return self._request(profile, "POST", f"/app/{app_key}/auditNode/qSourceQuery", app_key=app_key, json_body=body)
190
+ return self._request(profile, "POST", f"/app/{app_key}/auditNode/qSourceQuery", app_key=app_key, json_body=body, tool_name="流程 QSource 查询")
202
191
 
203
- @tool_cn_name("流程 QSource 测试")
204
192
  def workflow_qsource_test(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
205
193
  """执行流程相关逻辑。"""
206
194
  self._require_app_key(app_key)
207
195
  body = self._require_dict(payload)
208
- return self._request(profile, "POST", f"/app/{app_key}/auditNode/qSourceQueryTest", app_key=app_key, json_body=body)
196
+ return self._request(profile, "POST", f"/app/{app_key}/auditNode/qSourceQueryTest", app_key=app_key, json_body=body, tool_name="流程 QSource 测试")
209
197
 
210
- @tool_cn_name("流程主动 QSource 配置")
211
198
  def workflow_get_qsource_active(self, *, profile: str, app_key: str, qsource_id: int) -> JSONObject:
212
199
  """执行流程相关逻辑。"""
213
200
  self._require_app_key(app_key)
214
201
  self._require_positive("qsource_id", qsource_id)
215
- return self._request(profile, "GET", f"/app/{app_key}/auditNode/active/qsource", app_key=app_key, params={"qSourceId": qsource_id})
202
+ return self._request(profile, "GET", f"/app/{app_key}/auditNode/active/qsource", app_key=app_key, params={"qSourceId": qsource_id}, tool_name="流程主动 QSource 配置")
216
203
 
217
- @tool_cn_name("更新主动 QSource 配置")
218
204
  def workflow_upsert_qsource_active(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
219
205
  """执行流程相关逻辑。"""
220
206
  self._require_app_key(app_key)
221
207
  body = self._require_dict(payload)
222
- return self._request(profile, "POST", f"/app/{app_key}/auditNode/active/qsource", app_key=app_key, json_body=body)
208
+ return self._request(profile, "POST", f"/app/{app_key}/auditNode/active/qsource", app_key=app_key, json_body=body, tool_name="更新主动 QSource 配置")
223
209
 
224
- @tool_cn_name("流程被动 QSource 配置")
225
210
  def workflow_get_qsource_passive(self, *, profile: str, app_key: str, qsource_id: int) -> JSONObject:
226
211
  """执行流程相关逻辑。"""
227
212
  self._require_app_key(app_key)
228
213
  self._require_positive("qsource_id", qsource_id)
229
- return self._request(profile, "GET", f"/app/{app_key}/auditNode/passive/qsource", app_key=app_key, params={"qSourceId": qsource_id})
214
+ return self._request(profile, "GET", f"/app/{app_key}/auditNode/passive/qsource", app_key=app_key, params={"qSourceId": qsource_id}, tool_name="流程被动 QSource 配置")
230
215
 
231
- @tool_cn_name("更新被动 QSource 配置")
232
216
  def workflow_upsert_qsource_passive(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
233
217
  """执行流程相关逻辑。"""
234
218
  self._require_app_key(app_key)
235
219
  body = self._require_dict(payload)
236
- return self._request(profile, "POST", f"/app/{app_key}/auditNode/passive/qsource", app_key=app_key, json_body=body)
220
+ return self._request(profile, "POST", f"/app/{app_key}/auditNode/passive/qsource", app_key=app_key, json_body=body, tool_name="更新被动 QSource 配置")
237
221
 
238
- @tool_cn_name("切换 QSource 状态")
239
222
  def workflow_switch_qsource_status(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
240
223
  """执行流程相关逻辑。"""
241
224
  self._require_app_key(app_key)
242
225
  body = self._require_dict(payload)
243
- return self._request(profile, "POST", f"/app/{app_key}/auditNode/source/status", app_key=app_key, json_body=body)
226
+ return self._request(profile, "POST", f"/app/{app_key}/auditNode/source/status", app_key=app_key, json_body=body, tool_name="切换 QSource 状态")
244
227
 
245
- @tool_cn_name("删除 QSource 配置")
246
228
  def workflow_delete_qsource(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
247
229
  """执行流程相关逻辑。"""
248
230
  self._require_app_key(app_key)
249
231
  body = self._require_dict(payload)
250
- return self._request(profile, "DELETE", f"/app/{app_key}/auditNode/qsource", app_key=app_key, json_body=body, risk_operation="delete", risk_target="workflow qsource configuration")
232
+ return self._request(profile, "DELETE", f"/app/{app_key}/auditNode/qsource", app_key=app_key, json_body=body, risk_operation="delete", risk_target="workflow qsource configuration", tool_name="删除 QSource 配置")
251
233
 
252
- @tool_cn_name("节点可编辑字段")
253
234
  def workflow_get_editable_question_ids(self, *, profile: str, app_key: str, audit_node_id: int) -> JSONObject:
254
235
  """执行流程相关逻辑。"""
255
236
  self._require_app_key(app_key)
@@ -260,13 +241,13 @@ class WorkflowTools(ToolBase):
260
241
  f"/app/{app_key}/auditNode/{audit_node_id}/editableQueIds",
261
242
  app_key=app_key,
262
243
  audit_node_id=audit_node_id,
244
+ tool_name="节点可编辑字段",
263
245
  )
264
246
 
265
- @tool_cn_name("流程打印节点")
266
247
  def workflow_get_print_nodes(self, *, profile: str, app_key: str) -> JSONObject:
267
248
  """执行流程相关逻辑。"""
268
249
  self._require_app_key(app_key)
269
- return self._request(profile, "GET", f"/app/{app_key}/auditNode/printNodes", app_key=app_key)
250
+ return self._request(profile, "GET", f"/app/{app_key}/auditNode/printNodes", app_key=app_key, tool_name="流程打印节点")
270
251
 
271
252
  def _request(
272
253
  self,
@@ -279,6 +260,7 @@ class WorkflowTools(ToolBase):
279
260
  params: JSONObject | None = None,
280
261
  risk_operation: str | None = None,
281
262
  risk_target: str | None = None,
263
+ tool_name: str,
282
264
  **extra: JSONValue,
283
265
  ) -> JSONObject:
284
266
  """执行内部辅助逻辑。"""
@@ -290,7 +272,7 @@ class WorkflowTools(ToolBase):
290
272
  return self._attach_human_review_notice(response, operation=risk_operation, target=risk_target)
291
273
  return response
292
274
 
293
- return self._run(profile, runner)
275
+ return self._run(profile, runner, tool_name=tool_name)
294
276
 
295
277
  def _request_with_post_fallbacks(
296
278
  self,
@@ -302,6 +284,7 @@ class WorkflowTools(ToolBase):
302
284
  alternate_paths: list[str],
303
285
  risk_operation: str | None = None,
304
286
  risk_target: str | None = None,
287
+ tool_name: str,
305
288
  **extra: JSONValue,
306
289
  ) -> JSONObject:
307
290
  """执行内部辅助逻辑。"""
@@ -351,7 +334,7 @@ class WorkflowTools(ToolBase):
351
334
  assert last_error is not None
352
335
  raise last_error
353
336
 
354
- return self._run(profile, runner)
337
+ return self._run(profile, runner, tool_name=tool_name)
355
338
 
356
339
  def _require_app_key(self, app_key: str) -> None:
357
340
  """执行内部辅助逻辑。"""
@@ -8,7 +8,7 @@ from ..backend_client import BackendRequestContext
8
8
  from ..cloud_context import current_cloud_context
9
9
  from ..config import DEFAULT_PROFILE
10
10
  from ..errors import QingflowApiError, backend_code_int, is_auth_like_error, raise_tool_error
11
- from .base import ToolBase, tool_cn_name
11
+ from .base import ToolBase
12
12
 
13
13
 
14
14
  _WORKSPACE_DETAIL_WARNING_KEY = "_qingflow_workspace_detail_warning"
@@ -71,7 +71,6 @@ class WorkspaceTools(ToolBase):
71
71
  being_installed=being_installed,
72
72
  )
73
73
 
74
- @tool_cn_name("工作区列表")
75
74
  def workspace_list(
76
75
  self,
77
76
  *,
@@ -127,9 +126,8 @@ class WorkspaceTools(ToolBase):
127
126
  },
128
127
  }
129
128
 
130
- return self._run(profile, runner, require_workspace=False)
129
+ return self._run(profile, runner, require_workspace=False, tool_name='工作区列表')
131
130
 
132
- @tool_cn_name("工作区详情")
133
131
  def workspace_get(
134
132
  self,
135
133
  *,
@@ -158,9 +156,8 @@ class WorkspaceTools(ToolBase):
158
156
  },
159
157
  }
160
158
 
161
- return self._run(profile, runner, require_workspace=False)
159
+ return self._run(profile, runner, require_workspace=False, tool_name='工作区详情')
162
160
 
163
- @tool_cn_name("切换工作区")
164
161
  def workspace_select(
165
162
  self,
166
163
  *,
@@ -227,9 +224,8 @@ class WorkspaceTools(ToolBase):
227
224
  },
228
225
  }
229
226
 
230
- return self._run(profile, runner, require_workspace=False)
227
+ return self._run(profile, runner, require_workspace=False, tool_name='切换工作区')
231
228
 
232
- @tool_cn_name("设置工作区插件状态")
233
229
  def workspace_set_plugin_status(
234
230
  self,
235
231
  *,
@@ -258,7 +254,7 @@ class WorkspaceTools(ToolBase):
258
254
  "result": result,
259
255
  }
260
256
 
261
- return self._run(profile, runner)
257
+ return self._run(profile, runner, tool_name='设置工作区插件状态')
262
258
 
263
259
  def _fetch_workspace_with_fallback(
264
260
  self,