@qingflow-tech/qingflow-cli 1.1.42 → 1.1.43-beta.1

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 (42) hide show
  1. package/README.md +4 -4
  2. package/package.json +2 -1
  3. package/pyproject.toml +3 -2
  4. package/src/qingflow_mcp/app_form_compat.py +115 -0
  5. package/src/qingflow_mcp/app_form_validator.py +199 -0
  6. package/src/qingflow_mcp/builder_facade/app_form.py +2836 -0
  7. package/src/qingflow_mcp/builder_facade/app_form_schema.py +269 -0
  8. package/src/qingflow_mcp/builder_facade/schemas/app_form/manifest.json +37 -0
  9. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/complete.json +1766 -0
  10. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/address.json +76 -0
  11. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/amount.json +76 -0
  12. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/attachment.json +76 -0
  13. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/code_block.json +223 -0
  14. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/data_relation.json +538 -0
  15. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/date.json +76 -0
  16. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/datetime.json +76 -0
  17. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/department.json +149 -0
  18. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/email.json +76 -0
  19. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/link.json +76 -0
  20. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/long_text.json +76 -0
  21. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/member.json +76 -0
  22. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/multi_select.json +92 -0
  23. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/number.json +76 -0
  24. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/phone.json +76 -0
  25. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/q_linker.json +338 -0
  26. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/relation.json +137 -0
  27. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_choice.json +92 -0
  28. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_select.json +92 -0
  29. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/subtable.json +810 -0
  30. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/text.json +76 -0
  31. package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/summary.json +713 -0
  32. package/src/qingflow_mcp/builder_facade/service.py +5 -2
  33. package/src/qingflow_mcp/cli/commands/builder.py +91 -28
  34. package/src/qingflow_mcp/cli/json_io.py +21 -2
  35. package/src/qingflow_mcp/cli/main.py +3 -39
  36. package/src/qingflow_mcp/cloud_oauth_proxy.py +96 -3
  37. package/src/qingflow_mcp/public_surface.py +5 -2
  38. package/src/qingflow_mcp/response_trim.py +8 -0
  39. package/src/qingflow_mcp/server_app_builder.py +38 -86
  40. package/src/qingflow_mcp/server_cloud.py +66 -1
  41. package/src/qingflow_mcp/tools/ai_builder_tools.py +93 -100
  42. package/src/qingflow_mcp/tools/app_tools.py +46 -65
@@ -20,8 +20,11 @@ class AppTools(ToolBase):
20
20
  类型:应用元数据与配置工具。
21
21
  主要职责:
22
22
  1. 查询应用列表、读取应用详情;
23
- 2. 读取与更新应用基础配置、表单结构与发布状态;
24
- 3. 提供应用创建、删除、发布等管理能力。
23
+ 2. 为声明式 AppForm 和 Solution 编排保留底层应用适配器;
24
+ 3. 仅将应用列表与详情注册为本类的 MCP 入口。
25
+
26
+ TODO(deprecation): Remove the imperative app-form adapters after AppForm and Solution
27
+ no longer call them. They are implementation details and must not be registered as MCP tools.
25
28
  """
26
29
 
27
30
  def register(self, mcp: FastMCP) -> None:
@@ -34,58 +37,6 @@ class AppTools(ToolBase):
34
37
  def app_get(profile: str = DEFAULT_PROFILE, app_key: str = "") -> JSONObject:
35
38
  return self.app_get(profile=profile, app_key=app_key)
36
39
 
37
- @mcp.tool()
38
- def app_get_base(profile: str = DEFAULT_PROFILE, app_key: str = "", include_raw: bool = False) -> JSONObject:
39
- return self.app_get_base(profile=profile, app_key=app_key, include_raw=include_raw)
40
-
41
- @mcp.tool(description=self._high_risk_tool_description(operation="update", target="app base settings"))
42
- def app_update_base(profile: str = DEFAULT_PROFILE, app_key: str = "", payload: JSONObject | None = None) -> JSONObject:
43
- return self.app_update_base(profile=profile, app_key=app_key, payload=payload or {})
44
-
45
- @mcp.tool()
46
- def app_get_form_schema(
47
- profile: str = DEFAULT_PROFILE,
48
- app_key: str = "",
49
- form_type: int | str = 1,
50
- being_draft: bool | None = None,
51
- being_apply: bool | None = None,
52
- audit_node_id: int | None = None,
53
- include_raw: bool = False,
54
- ) -> JSONObject:
55
- return self.app_get_form_schema(
56
- profile=profile,
57
- app_key=app_key,
58
- form_type=form_type,
59
- being_draft=being_draft,
60
- being_apply=being_apply,
61
- audit_node_id=audit_node_id,
62
- include_raw=include_raw,
63
- )
64
-
65
- @mcp.tool()
66
- def app_get_edit_version_no(profile: str = DEFAULT_PROFILE, app_key: str = "") -> JSONObject:
67
- return self.app_get_edit_version_no(profile=profile, app_key=app_key)
68
-
69
- @mcp.tool()
70
- def app_edit_finished(profile: str = DEFAULT_PROFILE, app_key: str = "", payload: JSONObject | None = None) -> JSONObject:
71
- return self.app_edit_finished(profile=profile, app_key=app_key, payload=payload or {})
72
-
73
- @mcp.tool()
74
- def app_create(profile: str = DEFAULT_PROFILE, payload: JSONObject | None = None) -> JSONObject:
75
- return self.app_create(profile=profile, payload=payload or {})
76
-
77
- @mcp.tool(description=self._high_risk_tool_description(operation="delete", target="app configuration"))
78
- def app_delete(profile: str = DEFAULT_PROFILE, app_key: str = "") -> JSONObject:
79
- return self.app_delete(profile=profile, app_key=app_key)
80
-
81
- @mcp.tool()
82
- def app_publish(
83
- profile: str = DEFAULT_PROFILE,
84
- app_key: str = "",
85
- payload: JSONObject | None = None,
86
- ) -> JSONObject:
87
- return self.app_publish(profile=profile, app_key=app_key, payload=payload or {})
88
-
89
40
  def app_list(self, *, profile: str, query: str = "", keyword: str = "", ship_auth: bool = False) -> JSONObject:
90
41
  """List current-user visible apps in the selected workspace."""
91
42
  def runner(session_profile, context):
@@ -294,7 +245,7 @@ class AppTools(ToolBase):
294
245
  return self._run(profile, runner, tool_name='应用详情')
295
246
 
296
247
  def app_get_base(self, *, profile: str, app_key: str, include_raw: bool = False) -> JSONObject:
297
- """执行应用相关逻辑。"""
248
+ """Legacy low-level app-form adapter retained for internal callers pending deletion."""
298
249
  self._require_app_key(app_key)
299
250
 
300
251
  def runner(session_profile, context):
@@ -343,7 +294,7 @@ class AppTools(ToolBase):
343
294
  return self._run(profile, runner, tool_name='应用基础信息')
344
295
 
345
296
  def app_update_base(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
346
- """执行应用相关逻辑。"""
297
+ """Legacy low-level app-form adapter retained for internal callers pending deletion."""
347
298
  self._require_app_key(app_key)
348
299
  body = self._require_dict(payload)
349
300
 
@@ -368,7 +319,7 @@ class AppTools(ToolBase):
368
319
  audit_node_id: int | None,
369
320
  include_raw: bool = False,
370
321
  ) -> JSONObject:
371
- """执行应用相关逻辑。"""
322
+ """Legacy low-level app-form adapter retained for internal callers pending deletion."""
372
323
  self._require_app_key(app_key)
373
324
  resolved_form_type = _normalize_form_type(form_type)
374
325
 
@@ -398,7 +349,7 @@ class AppTools(ToolBase):
398
349
  return self._run(profile, runner, tool_name='应用表单结构')
399
350
 
400
351
  def app_get_edit_version_no(self, *, profile: str, app_key: str) -> JSONObject:
401
- """执行应用相关逻辑。"""
352
+ """Legacy low-level app-form adapter retained for internal callers pending deletion."""
402
353
  self._require_app_key(app_key)
403
354
 
404
355
  def runner(session_profile, context):
@@ -446,7 +397,7 @@ class AppTools(ToolBase):
446
397
  return self._run(profile, runner, tool_name='更新应用流程配置')
447
398
 
448
399
  def app_update_form_schema(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
449
- """执行应用相关逻辑。"""
400
+ """Legacy low-level app-form adapter retained for internal callers pending deletion."""
450
401
  self._require_app_key(app_key)
451
402
  body = self._require_dict(payload)
452
403
 
@@ -461,7 +412,7 @@ class AppTools(ToolBase):
461
412
  return self._run(profile, runner, tool_name='更新应用表单结构')
462
413
 
463
414
  def app_edit_finished(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
464
- """执行应用相关逻辑。"""
415
+ """Legacy low-level app-form adapter retained for internal callers pending deletion."""
465
416
  self._require_app_key(app_key)
466
417
  body = self._require_dict(payload)
467
418
 
@@ -471,13 +422,19 @@ class AppTools(ToolBase):
471
422
 
472
423
  return self._run(profile, runner, tool_name='应用编辑完成')
473
424
 
474
- def app_create(self, *, profile: str, payload: JSONObject) -> JSONObject:
475
- """执行应用相关逻辑。"""
425
+ def app_create(
426
+ self,
427
+ *,
428
+ profile: str,
429
+ payload: JSONObject,
430
+ retry_without_qf_version: bool = True,
431
+ ) -> JSONObject:
432
+ """Legacy low-level app-form adapter retained for internal callers pending deletion."""
476
433
  body = self._require_dict(payload)
477
434
 
478
435
  def runner(session_profile, context):
479
436
  attempted_contexts = [context]
480
- if context.qf_version is not None:
437
+ if retry_without_qf_version and context.qf_version is not None:
481
438
  attempted_contexts.append(
482
439
  BackendRequestContext(
483
440
  base_url=context.base_url,
@@ -519,7 +476,7 @@ class AppTools(ToolBase):
519
476
  return self._run(profile, runner, tool_name='创建应用')
520
477
 
521
478
  def app_delete(self, *, profile: str, app_key: str) -> JSONObject:
522
- """执行应用相关逻辑。"""
479
+ """Legacy low-level app-form adapter retained for the declarative delete path pending deletion."""
523
480
  self._require_app_key(app_key)
524
481
 
525
482
  def runner(session_profile, context):
@@ -533,7 +490,7 @@ class AppTools(ToolBase):
533
490
  return self._run(profile, runner, tool_name='删除应用')
534
491
 
535
492
  def app_publish(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
536
- """执行应用相关逻辑。"""
493
+ """Legacy low-level app-form adapter retained for internal callers pending deletion."""
537
494
  self._require_app_key(app_key)
538
495
  body = self._require_dict(payload)
539
496
 
@@ -543,6 +500,30 @@ class AppTools(ToolBase):
543
500
 
544
501
  return self._run(profile, runner, tool_name='发布应用')
545
502
 
503
+ def app_publish_raw(self, *, profile: str, app_key: str, payload: JSONObject) -> JSONObject:
504
+ """Legacy low-level publish adapter retained for internal callers pending deletion."""
505
+ self._require_app_key(app_key)
506
+ body = self._require_dict(payload)
507
+
508
+ def runner(session_profile, context):
509
+ response = self.backend.request_with_meta(
510
+ "POST",
511
+ context,
512
+ f"/app/{app_key}/publish",
513
+ json_body=body,
514
+ unwrap=False,
515
+ )
516
+ return {
517
+ "profile": profile,
518
+ "ws_id": session_profile.selected_ws_id,
519
+ "app_key": app_key,
520
+ "http_status": response.http_status,
521
+ "request_id": response.request_id,
522
+ "response": response.data,
523
+ }
524
+
525
+ return self._run(profile, runner, tool_name='发布应用')
526
+
546
527
  def _require_app_key(self, app_key: str) -> None:
547
528
  """执行内部辅助逻辑。"""
548
529
  if not app_key: