@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.
- package/README.md +4 -4
- package/package.json +2 -1
- package/pyproject.toml +3 -2
- package/src/qingflow_mcp/app_form_compat.py +115 -0
- package/src/qingflow_mcp/app_form_validator.py +199 -0
- package/src/qingflow_mcp/builder_facade/app_form.py +2836 -0
- package/src/qingflow_mcp/builder_facade/app_form_schema.py +269 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/manifest.json +37 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/complete.json +1766 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/address.json +76 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/amount.json +76 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/attachment.json +76 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/code_block.json +223 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/data_relation.json +538 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/date.json +76 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/datetime.json +76 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/department.json +149 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/email.json +76 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/link.json +76 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/long_text.json +76 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/member.json +76 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/multi_select.json +92 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/number.json +76 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/phone.json +76 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/q_linker.json +338 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/relation.json +137 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_choice.json +92 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/single_select.json +92 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/subtable.json +810 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/fields/text.json +76 -0
- package/src/qingflow_mcp/builder_facade/schemas/app_form/v1alpha1/summary.json +713 -0
- package/src/qingflow_mcp/builder_facade/service.py +5 -2
- package/src/qingflow_mcp/cli/commands/builder.py +91 -28
- package/src/qingflow_mcp/cli/json_io.py +21 -2
- package/src/qingflow_mcp/cli/main.py +3 -39
- package/src/qingflow_mcp/cloud_oauth_proxy.py +96 -3
- package/src/qingflow_mcp/public_surface.py +5 -2
- package/src/qingflow_mcp/response_trim.py +8 -0
- package/src/qingflow_mcp/server_app_builder.py +38 -86
- package/src/qingflow_mcp/server_cloud.py +66 -1
- package/src/qingflow_mcp/tools/ai_builder_tools.py +93 -100
- 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(
|
|
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:
|