From 34a13ebf37dc6a7f07a97b2329df659d20309c5a Mon Sep 17 00:00:00 2001 From: yumoqing Date: Fri, 28 Aug 2026 16:34:02 +0800 Subject: [PATCH] =?UTF-8?q?refactor(pipeline=5Fcore):=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E4=BA=A7=E7=BA=BF=E7=AE=A1=E7=90=86=E4=B8=89=E5=8A=9F=E8=83=BD?= =?UTF-8?q?(=E4=BA=A7=E7=BA=BF=E5=AE=9A=E4=B9=89/=E4=BA=A7=E7=BA=BF?= =?UTF-8?q?=E6=AD=A5=E9=AA=A4/=E5=8F=91=E5=B8=83=E8=AE=B0=E5=BD=95)?= =?UTF-8?q?=E6=AD=BB=E5=BA=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 证据: pipeline_steps、pipeline_versions 表恒为0行, 三功能上线后从未使用 - 产线定义已收敛为代码能力包(PipelineAbility)+pipelines表元数据, 页面无法定义新能力(每种能力需先写代码注册handler), 在线开发属伪命题 - 删除: wwwroot 下 pipelines/pipeline_steps/pipeline_versions/pipeline_editor 页面目录与配套 API dspy、json/models CRUD 定义、init.py 死函数、 load_path.py 权限注册 - 保留: pipelines 表(agent 运行时读 name/default_model)、executor 引擎、 agent/llm/skill_proposals 等模块主体 --- json/pipeline_steps.json | 27 --- json/pipeline_versions.json | 27 --- json/pipelines.json | 21 -- models/pipeline_steps.json | 122 ---------- models/pipeline_versions.json | 94 -------- models/pipelines.json | 153 ------------- pipeline_core/__init__.py | 10 - pipeline_core/init.py | 264 +--------------------- scripts/load_path.py | 61 ++--- wwwroot/api/pipeline_publish.dspy | 5 - wwwroot/api/pipeline_steps_create.dspy | 5 - wwwroot/api/pipeline_steps_delete.dspy | 5 - wwwroot/api/pipeline_steps_update.dspy | 5 - wwwroot/api/pipeline_versions_create.dspy | 5 - wwwroot/api/pipeline_versions_delete.dspy | 5 - wwwroot/api/pipeline_versions_update.dspy | 5 - wwwroot/api/pipelines_create.dspy | 5 - wwwroot/api/pipelines_delete.dspy | 5 - wwwroot/api/pipelines_update.dspy | 5 - wwwroot/index.ui | 254 --------------------- wwwroot/pipeline_editor/index.ui | 85 ------- wwwroot/pipeline_editor/save_steps.dspy | 47 ---- 22 files changed, 19 insertions(+), 1196 deletions(-) delete mode 100644 json/pipeline_steps.json delete mode 100644 json/pipeline_versions.json delete mode 100644 json/pipelines.json delete mode 100644 models/pipeline_steps.json delete mode 100644 models/pipeline_versions.json delete mode 100644 models/pipelines.json delete mode 100644 wwwroot/api/pipeline_publish.dspy delete mode 100644 wwwroot/api/pipeline_steps_create.dspy delete mode 100644 wwwroot/api/pipeline_steps_delete.dspy delete mode 100644 wwwroot/api/pipeline_steps_update.dspy delete mode 100644 wwwroot/api/pipeline_versions_create.dspy delete mode 100644 wwwroot/api/pipeline_versions_delete.dspy delete mode 100644 wwwroot/api/pipeline_versions_update.dspy delete mode 100644 wwwroot/api/pipelines_create.dspy delete mode 100644 wwwroot/api/pipelines_delete.dspy delete mode 100644 wwwroot/api/pipelines_update.dspy delete mode 100644 wwwroot/index.ui delete mode 100644 wwwroot/pipeline_editor/index.ui delete mode 100644 wwwroot/pipeline_editor/save_steps.dspy diff --git a/json/pipeline_steps.json b/json/pipeline_steps.json deleted file mode 100644 index 253b6fa..0000000 --- a/json/pipeline_steps.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "tblname": "pipeline_steps", - "title": "产线步骤", - "params": { - "sortby": "step_order", - "browserfields": { - "exclouded": ["id", "step_config", "input_schema", "output_schema"], - "cwidth": {} - }, - "editexclouded": [ - "id", "created_at" - ], - "editable": { - "new_data_url": "{{entire_url('../api/pipeline_steps_create.dspy')}}", - "update_data_url": "{{entire_url('../api/pipeline_steps_update.dspy')}}", - "delete_data_url": "{{entire_url('../api/pipeline_steps_delete.dspy')}}" - }, - "confidential_fields": [], - "subtables": [ - { - "field": "pipeline_id", - "title": "所属产线", - "subtable": "pipelines" - } - ] - } -} diff --git a/json/pipeline_versions.json b/json/pipeline_versions.json deleted file mode 100644 index 965d81a..0000000 --- a/json/pipeline_versions.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "tblname": "pipeline_versions", - "title": "发布记录", - "params": { - "sortby": "created_at", - "browserfields": { - "exclouded": ["id", "config_snapshot"], - "cwidth": {} - }, - "editexclouded": [ - "id", "created_at" - ], - "editable": { - "new_data_url": "{{entire_url('../api/pipeline_versions_create.dspy')}}", - "update_data_url": "{{entire_url('../api/pipeline_versions_update.dspy')}}", - "delete_data_url": "{{entire_url('../api/pipeline_versions_delete.dspy')}}" - }, - "confidential_fields": [], - "subtables": [ - { - "field": "pipeline_id", - "title": "所属产线", - "subtable": "pipelines" - } - ] - } -} diff --git a/json/pipelines.json b/json/pipelines.json deleted file mode 100644 index 7bae2bd..0000000 --- a/json/pipelines.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "tblname": "pipelines", - "title": "产线定义", - "params": { - "sortby": "created_at", - "logined_userorgid": "org_id", - "browserfields": { - "exclouded": ["id", "model_api_key", "pipeline_config"], - "cwidth": {} - }, - "editexclouded": [ - "id", "created_at", "updated_at" - ], - "editable": { - "new_data_url": "{{entire_url('../api/pipelines_create.dspy')}}", - "update_data_url": "{{entire_url('../api/pipelines_update.dspy')}}", - "delete_data_url": "{{entire_url('../api/pipelines_delete.dspy')}}" - }, - "confidential_fields": ["model_api_key"] - } -} diff --git a/models/pipeline_steps.json b/models/pipeline_steps.json deleted file mode 100644 index 3763d8a..0000000 --- a/models/pipeline_steps.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "summary": [ - { - "name": "pipeline_steps", - "title": "产线步骤表", - "primary": [ - "id" - ] - } - ], - "fields": [ - { - "name": "id", - "title": "id", - "type": "str", - "length": 32, - "nullable": "no", - "uitype": "hidden" - }, - { - "name": "pipeline_id", - "title": "所属产线", - "type": "str", - "length": 32, - "nullable": "no", - "uitype": "select" - }, - { - "name": "step_order", - "title": "步骤序号", - "type": "int", - "nullable": "no", - "uitype": "number" - }, - { - "name": "step_name", - "title": "步骤名称", - "type": "str", - "length": 100, - "nullable": "no", - "uitype": "text" - }, - { - "name": "step_type", - "title": "步骤类型", - "type": "str", - "length": 50, - "nullable": "no", - "uitype": "select" - }, - { - "name": "model_name", - "title": "调用模型名称", - "type": "str", - "length": 100, - "uitype": "text" - }, - { - "name": "step_config", - "title": "步骤配置JSON", - "type": "text", - "uitype": "textarea" - }, - { - "name": "input_schema", - "title": "输入定义JSON", - "type": "text", - "uitype": "textarea" - }, - { - "name": "output_schema", - "title": "输出定义JSON", - "type": "text", - "uitype": "textarea" - }, - { - "name": "timeout_seconds", - "title": "超时秒数", - "type": "int", - "default": "300", - "uitype": "number" - }, - { - "name": "retry_count", - "title": "重试次数", - "type": "int", - "default": "0", - "uitype": "number" - }, - { - "name": "created_at", - "title": "创建时间", - "type": "timestamp", - "uitype": "timestamp" - } - ], - "indexes": [ - { - "name": "idx_steps_pipeline", - "idxtype": "index", - "idxfields": [ - "pipeline_id" - ] - }, - { - "name": "idx_steps_order", - "idxtype": "unique", - "idxfields": [ - "pipeline_id", - "step_order" - ] - } - ], - "codes": [ - { - "field": "pipeline_id", - "table": "pipelines", - "valuefield": "id", - "textfield": "name" - } - ] -} \ No newline at end of file diff --git a/models/pipeline_versions.json b/models/pipeline_versions.json deleted file mode 100644 index a1ed0cc..0000000 --- a/models/pipeline_versions.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "summary": [ - { - "name": "pipeline_versions", - "title": "产线发布记录表", - "primary": [ - "id" - ] - } - ], - "fields": [ - { - "name": "id", - "title": "id", - "type": "str", - "length": 32, - "nullable": "no", - "uitype": "hidden" - }, - { - "name": "pipeline_id", - "title": "产线ID", - "type": "str", - "length": 32, - "nullable": "no", - "uitype": "hidden" - }, - { - "name": "version", - "title": "版本号", - "type": "str", - "length": 20, - "nullable": "no", - "uitype": "text" - }, - { - "name": "publish_status", - "title": "发布状态", - "type": "str", - "length": 20, - "nullable": "no", - "default": "pending", - "uitype": "select" - }, - { - "name": "published_by", - "title": "发布人", - "type": "str", - "length": 32, - "uitype": "text" - }, - { - "name": "published_at", - "title": "发布时间", - "type": "timestamp", - "uitype": "timestamp" - }, - { - "name": "changelog", - "title": "变更说明", - "type": "text", - "uitype": "textarea" - }, - { - "name": "config_snapshot", - "title": "配置快照JSON", - "type": "text", - "uitype": "textarea" - }, - { - "name": "created_at", - "title": "创建时间", - "type": "timestamp", - "uitype": "timestamp" - } - ], - "indexes": [ - { - "name": "idx_versions_pipeline", - "idxtype": "index", - "idxfields": [ - "pipeline_id" - ] - } - ], - "codes": [ - { - "field": "pipeline_id", - "table": "pipelines", - "valuefield": "id", - "textfield": "name" - } - ] -} \ No newline at end of file diff --git a/models/pipelines.json b/models/pipelines.json deleted file mode 100644 index 572dd8e..0000000 --- a/models/pipelines.json +++ /dev/null @@ -1,153 +0,0 @@ -{ - "summary": [ - { - "name": "pipelines", - "title": "产线定义表", - "primary": [ - "id" - ] - } - ], - "fields": [ - { - "name": "id", - "title": "id", - "type": "str", - "length": 32, - "nullable": "no", - "uitype": "hidden" - }, - { - "name": "name", - "title": "产线名称", - "type": "str", - "length": 200, - "nullable": "no", - "uitype": "text" - }, - { - "name": "description", - "title": "产线描述", - "type": "text", - "uitype": "textarea" - }, - { - "name": "pipeline_type", - "title": "产线类型", - "type": "str", - "length": 50, - "nullable": "no", - "uitype": "select" - }, - { - "name": "version", - "title": "当前版本", - "type": "str", - "length": 20, - "default": "1.0.0", - "uitype": "text" - }, - { - "name": "status", - "title": "状态", - "type": "str", - "length": 20, - "nullable": "no", - "default": "draft", - "uitype": "select" - }, - { - "name": "pipeline_config", - "title": "产线配置JSON", - "type": "text", - "uitype": "textarea" - }, - { - "name": "model_api_url", - "title": "模型API地址", - "type": "str", - "length": 500, - "uitype": "text" - }, - { - "name": "model_api_key", - "title": "模型API密钥", - "type": "str", - "length": 500, - "uitype": "text" - }, - { - "name": "default_model", - "title": "缺省模型", - "type": "str", - "length": 100, - "uitype": "code" - }, - { - "name": "org_id", - "title": "所属机构ID", - "type": "str", - "length": 32, - "default": "0", - "uitype": "text" - }, - { - "name": "created_by", - "title": "创建人", - "type": "str", - "length": 32, - "uitype": "hidden" - }, - { - "name": "created_at", - "title": "创建时间", - "type": "timestamp", - "uitype": "timestamp" - }, - { - "name": "updated_at", - "title": "更新时间", - "type": "timestamp", - "uitype": "timestamp" - } - ], - "indexes": [ - { - "name": "idx_pipelines_name", - "idxtype": "index", - "idxfields": [ - "name" - ] - }, - { - "name": "idx_pipelines_status", - "idxtype": "index", - "idxfields": [ - "status" - ] - } - ], - "codes": [ - { - "field": "pipeline_type", - "table": "appcodes_kv", - "valuefield": "k", - "textfield": "v", - "cond": "parentid='pipeline_type'" - }, - { - "field": "status", - "table": "appcodes_kv", - "valuefield": "k", - "textfield": "v", - "cond": "parentid='pipeline_status'" - }, - { - "field": "default_model", - "table": "llm", - "valuefield": "name", - "textfield": "name", - "cond": "status='active'" - } - ] -} \ No newline at end of file diff --git a/pipeline_core/__init__.py b/pipeline_core/__init__.py index 8fd530d..3e5607a 100644 --- a/pipeline_core/__init__.py +++ b/pipeline_core/__init__.py @@ -1,15 +1,5 @@ # pipeline_core/__init__.py from .init import ( - create_pipeline, - update_pipeline, - delete_pipeline, - create_pipeline_step, - update_pipeline_step, - delete_pipeline_step, - create_pipeline_version, - update_pipeline_version, - delete_pipeline_version, - publish_pipeline, load_pipeline_core, ) diff --git a/pipeline_core/init.py b/pipeline_core/init.py index 74c9550..580eb04 100644 --- a/pipeline_core/init.py +++ b/pipeline_core/init.py @@ -1,4 +1,9 @@ -"""pipeline_core 模块 - 产线管理核心模块""" +"""pipeline_core 模块 - 产线平台核心模块 + +产线定义已收敛为代码能力包(PipelineAbility,见 ability.py)+ pipelines 表元数据 +(id/name/default_model,agent 运行时读取)。原「产线管理」在线定义/步骤/发布三功能 +已移除(2026-08-28,能力无法通过页面定义,属死库存)。 +""" import json from appPublic.uniqueID import getID from sqlor.dbpools import DBPools @@ -15,240 +20,6 @@ def _get_sor(): return DBPools(), DBNAME -async def create_pipeline(params_kw): - """创建产线记录""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - data = params_kw.copy() - data.pop('page', None) - data.pop('rows', None) - data.pop('data_filter', None) - data['id'] = getID() - await sor.C('pipelines', data) - result['success'] = True - result['message'] = '创建成功' - result['id'] = data['id'] - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def update_pipeline(params_kw): - """更新产线记录""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - data = params_kw.copy() - data.pop('page', None) - data.pop('rows', None) - data.pop('data_filter', None) - record_id = data.pop('id', None) - if not record_id: - result['message'] = '缺少id' - else: - await sor.U('pipelines', {**data, 'id': record_id}) - result['success'] = True - result['message'] = '更新成功' - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def delete_pipeline(params_kw): - """删除产线记录""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - record_id = params_kw.get('id') - if not record_id: - result['message'] = '缺少id' - else: - await sor.D('pipelines', {'id': record_id}) - result['success'] = True - result['message'] = '删除成功' - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def create_pipeline_step(params_kw): - """创建产线步骤""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - data = params_kw.copy() - data.pop('page', None) - data.pop('rows', None) - data.pop('data_filter', None) - data['id'] = getID() - await sor.C('pipeline_steps', data) - result['success'] = True - result['message'] = '创建成功' - result['id'] = data['id'] - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def update_pipeline_step(params_kw): - """更新产线步骤""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - data = params_kw.copy() - data.pop('page', None) - data.pop('rows', None) - data.pop('data_filter', None) - record_id = data.pop('id', None) - if not record_id: - result['message'] = '缺少id' - else: - await sor.U('pipeline_steps', {**data, 'id': record_id}) - result['success'] = True - result['message'] = '更新成功' - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def delete_pipeline_step(params_kw): - """删除产线步骤""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - record_id = params_kw.get('id') - if not record_id: - result['message'] = '缺少id' - else: - await sor.D('pipeline_steps', {'id': record_id}) - result['success'] = True - result['message'] = '删除成功' - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def create_pipeline_version(params_kw): - """创建产线发布记录""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - data = params_kw.copy() - data.pop('page', None) - data.pop('rows', None) - data.pop('data_filter', None) - data['id'] = getID() - await sor.C('pipeline_versions', data) - result['success'] = True - result['message'] = '创建成功' - result['id'] = data['id'] - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def update_pipeline_version(params_kw): - """更新产线发布记录""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - data = params_kw.copy() - data.pop('page', None) - data.pop('rows', None) - data.pop('data_filter', None) - record_id = data.pop('id', None) - if not record_id: - result['message'] = '缺少id' - else: - await sor.U('pipeline_versions', {**data, 'id': record_id}) - result['success'] = True - result['message'] = '更新成功' - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def delete_pipeline_version(params_kw): - """删除产线发布记录""" - result = {'success': False, 'message': ''} - try: - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - record_id = params_kw.get('id') - if not record_id: - result['message'] = '缺少id' - else: - await sor.D('pipeline_versions', {'id': record_id}) - result['success'] = True - result['message'] = '删除成功' - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - -async def publish_pipeline(params_kw): - """发布产线 - 创建发布记录并更新产线状态""" - result = {'success': False, 'message': ''} - try: - pipeline_id = params_kw.get('pipeline_id') - if not pipeline_id: - result['message'] = '缺少pipeline_id' - return json.dumps(result, ensure_ascii=False, default=str) - - changelog = params_kw.get('changelog', '') - published_by = params_kw.get('published_by', '') - - db, dbname = _get_sor() - async with db.sqlorContext(dbname) as sor: - # Get current pipeline - recs = await sor.R('pipelines', {'id': pipeline_id}) - if not recs: - result['message'] = f'产线不存在: {pipeline_id}' - return json.dumps(result, ensure_ascii=False, default=str) - - pipeline = recs[0] - current_version = pipeline.get('version', '1.0.0') if hasattr(pipeline, 'get') else getattr(pipeline, 'version', '1.0.0') - - # Build config snapshot from current pipeline data - config_snapshot = json.dumps({ - 'pipeline_config': getattr(pipeline, 'pipeline_config', None), - 'model_api_url': getattr(pipeline, 'model_api_url', None), - 'version': current_version, - }, ensure_ascii=False, default=str) - - # Create version record - version_id = getID() - version_data = { - 'id': version_id, - 'pipeline_id': pipeline_id, - 'version': current_version, - 'publish_status': 'published', - 'published_by': published_by, - 'changelog': changelog, - 'config_snapshot': config_snapshot, - } - await sor.C('pipeline_versions', version_data) - - # Update pipeline status to published - await sor.U('pipelines', {'id': pipeline_id, 'status': 'published'}) - - result['success'] = True - result['message'] = '发布成功' - result['version_id'] = version_id - except Exception as e: - result['message'] = str(e) - return json.dumps(result, ensure_ascii=False, default=str) - - async def create_llm(params_kw): result = {'success': False, 'message': ''} try: @@ -300,32 +71,9 @@ async def delete_llm(params_kw): def load_pipeline_core(): """注册函数到 ServerEnv""" env = ServerEnv() - # Pipelines - env.create_pipeline = create_pipeline - env.create_pipelines = create_pipeline - env.update_pipeline = update_pipeline - env.update_pipelines = update_pipeline - env.delete_pipeline = delete_pipeline - env.delete_pipelines = delete_pipeline # LLM env.create_llm = create_llm env.update_llm = update_llm env.delete_llm = delete_llm - # Pipeline Steps - env.create_pipeline_step = create_pipeline_step - env.create_pipeline_steps = create_pipeline_step - env.update_pipeline_step = update_pipeline_step - env.update_pipeline_steps = update_pipeline_step - env.delete_pipeline_step = delete_pipeline_step - env.delete_pipeline_steps = delete_pipeline_step - # Pipeline Versions - env.create_pipeline_version = create_pipeline_version - env.create_pipeline_versions = create_pipeline_version - env.update_pipeline_version = update_pipeline_version - env.update_pipeline_versions = update_pipeline_version - env.delete_pipeline_version = delete_pipeline_version - env.delete_pipeline_versions = delete_pipeline_version - # Publish - env.publish_pipeline = publish_pipeline debug(f'[{MODULE_NAME}] module loaded') return True diff --git a/scripts/load_path.py b/scripts/load_path.py index d2c4241..68ad7fe 100644 --- a/scripts/load_path.py +++ b/scripts/load_path.py @@ -1,50 +1,16 @@ #!/usr/bin/env python3 -"""RBAC path registration for pipeline_core module.""" +"""RBAC path registration for pipeline_core module. + +2026-08-28:产线管理三功能(产线定义/产线步骤/发布记录)已移除, +对应的 pipelines / pipeline_steps / pipeline_versions / pipeline_editor +CRUD 页面与 API 全部删除,注册清单同步清理。 +""" import os, sys, subprocess MOD = "pipeline_core" -PATHS_ANY = [ - f"/{MOD}/index.ui", -] - PATHS_LOGINED = [ f"/{MOD}", - # Pipelines CRUD - f"/{MOD}/pipelines/index.ui", - f"/{MOD}/pipelines/get_pipelines.dspy", - f"/{MOD}/pipelines/add_pipelines.dspy", - f"/{MOD}/pipelines/update_pipelines.dspy", - f"/{MOD}/pipelines/delete_pipelines.dspy", - # Pipeline Steps CRUD - f"/{MOD}/pipeline_steps/index.ui", - f"/{MOD}/pipeline_steps/get_pipeline_steps.dspy", - f"/{MOD}/pipeline_steps/add_pipeline_steps.dspy", - f"/{MOD}/pipeline_steps/update_pipeline_steps.dspy", - f"/{MOD}/pipeline_steps/delete_pipeline_steps.dspy", - # Pipeline Versions - f"/{MOD}/pipeline_versions/index.ui", - f"/{MOD}/pipeline_versions/get_pipeline_versions.dspy", - f"/{MOD}/pipeline_versions/add_pipeline_versions.dspy", - f"/{MOD}/pipeline_versions/update_pipeline_versions.dspy", - f"/{MOD}/pipeline_versions/delete_pipeline_versions.dspy", - # Pipeline Editor - f"/{MOD}/pipeline_editor/index.ui", - f"/{MOD}/pipeline_editor/save_steps.dspy", - # Data sources - f"/{MOD}/pipeline_steps/get_pipelines.dspy", - f"/{MOD}/pipeline_steps/get_step_types.dspy", - # API - f"/{MOD}/api/pipeline_publish.dspy", - f"/{MOD}/api/pipeline_steps_create.dspy", - f"/{MOD}/api/pipeline_steps_update.dspy", - f"/{MOD}/api/pipeline_steps_delete.dspy", - f"/{MOD}/api/pipeline_versions_create.dspy", - f"/{MOD}/api/pipeline_versions_update.dspy", - f"/{MOD}/api/pipeline_versions_delete.dspy", - f"/{MOD}/api/pipelines_create.dspy", - f"/{MOD}/api/pipelines_update.dspy", - f"/{MOD}/api/pipelines_delete.dspy", ] @@ -56,14 +22,13 @@ def main(): set_perm = os.path.join(root, "set_role_perm.py") py = sys.executable count = 0 - for role, paths in [("any", PATHS_ANY), ("logined", PATHS_LOGINED)]: - for path in paths: - r = subprocess.run([py, set_perm, role, path], capture_output=True, text=True, cwd=root) - if r.returncode == 0: - count += 1 - else: - print(f" WARN: {path} -> {r.stderr.strip()[-80:]}") - print(f"Registered {count}/{len(PATHS_ANY)+len(PATHS_LOGINED)} paths for {MOD}") + for path in PATHS_LOGINED: + r = subprocess.run([py, set_perm, "logined", path], capture_output=True, text=True, cwd=root) + if r.returncode == 0: + count += 1 + else: + print(f" WARN: {path} -> {r.stderr.strip()[-80:]}") + print(f"Registered {count}/{len(PATHS_LOGINED)} paths for {MOD}") if __name__ == "__main__": diff --git a/wwwroot/api/pipeline_publish.dspy b/wwwroot/api/pipeline_publish.dspy deleted file mode 100644 index 7e4afaa..0000000 --- a/wwwroot/api/pipeline_publish.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = publish_pipeline -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/wwwroot/api/pipeline_steps_create.dspy b/wwwroot/api/pipeline_steps_create.dspy deleted file mode 100644 index 851c278..0000000 --- a/wwwroot/api/pipeline_steps_create.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = create_pipeline_step -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/wwwroot/api/pipeline_steps_delete.dspy b/wwwroot/api/pipeline_steps_delete.dspy deleted file mode 100644 index d73053c..0000000 --- a/wwwroot/api/pipeline_steps_delete.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = delete_pipeline_step -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/wwwroot/api/pipeline_steps_update.dspy b/wwwroot/api/pipeline_steps_update.dspy deleted file mode 100644 index 998289d..0000000 --- a/wwwroot/api/pipeline_steps_update.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = update_pipeline_step -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/wwwroot/api/pipeline_versions_create.dspy b/wwwroot/api/pipeline_versions_create.dspy deleted file mode 100644 index 3567ff2..0000000 --- a/wwwroot/api/pipeline_versions_create.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = create_pipeline_version -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/wwwroot/api/pipeline_versions_delete.dspy b/wwwroot/api/pipeline_versions_delete.dspy deleted file mode 100644 index 31e496b..0000000 --- a/wwwroot/api/pipeline_versions_delete.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = delete_pipeline_version -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/wwwroot/api/pipeline_versions_update.dspy b/wwwroot/api/pipeline_versions_update.dspy deleted file mode 100644 index 6618b2e..0000000 --- a/wwwroot/api/pipeline_versions_update.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = update_pipeline_version -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/wwwroot/api/pipelines_create.dspy b/wwwroot/api/pipelines_create.dspy deleted file mode 100644 index ef6e24b..0000000 --- a/wwwroot/api/pipelines_create.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = create_pipeline -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/wwwroot/api/pipelines_delete.dspy b/wwwroot/api/pipelines_delete.dspy deleted file mode 100644 index 3a07d83..0000000 --- a/wwwroot/api/pipelines_delete.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = delete_pipeline -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/wwwroot/api/pipelines_update.dspy b/wwwroot/api/pipelines_update.dspy deleted file mode 100644 index ed3b6c0..0000000 --- a/wwwroot/api/pipelines_update.dspy +++ /dev/null @@ -1,5 +0,0 @@ -func = update_pipeline -if func is None: - return json.dumps({'status': 'error', 'message': 'function not found'}) -result = await func(params_kw) -return result diff --git a/wwwroot/index.ui b/wwwroot/index.ui deleted file mode 100644 index 7a49d8c..0000000 --- a/wwwroot/index.ui +++ /dev/null @@ -1,254 +0,0 @@ -{ - "widgettype": "VBox", - "options": { - "width": "100%", - "height": "100%", - "padding": "0" - }, - "subwidgets": [ - { - "widgettype": "HBox", - "options": { - "width": "100%", - "alignItems": "center", - "padding": "24px 24px 12px 24px", - "cheight": 6 - }, - "subwidgets": [ - { - "widgettype": "Title2", - "options": { - "text": "产线管理" - } - }, - { - "widgettype": "Filler" - }, - { - "widgettype": "Text", - "options": { - "text": "产线定义、步骤配置与发布管理", - "cfontsize": 1.2 - } - } - ] - }, - { - "widgettype": "HBox", - "options": { - "width": "100%", - "padding": "12px 24px 12px 24px", - "cheight": 18 - }, - "subwidgets": [ - { - "widgettype": "ResponsableBox", - "options": { - "gap": "24px", - "minWidth": "260px" - }, - "subwidgets": [ - { - "widgettype": "Text", - "options": { - "text": "EDITOR CARD HERE" - } - }, - { - "widgettype": "VBox", - "options": { - "css": "card", - "cwidth": 23, - "cheight": 12, - "padding": "24px", - "cursor": "pointer", - "bgcolor": "#fff" - }, - "binds": [ - { - "wid": "self", - "event": "click", - "actiontype": "urlwidget", - "target": "app.main_content", - "options": { - "url": "{{entire_url('/pipeline_core/pipelines/')}}" - }, - "mode": "replace" - } - ], - "subwidgets": [ - { - "widgettype": "VBox", - "options": { - "width": "44px", - "height": "44px", - "bgcolor": "#EFF6FF", - "borderRadius": "12px", - "alignItems": "center", - "justifyContent": "center", - "marginBottom": "12px" - }, - "subwidgets": [ - { - "widgettype": "Svg", - "options": { - "svg": "", - "width": "24px", - "height": "24px" - } - } - ] - }, - { - "widgettype": "Title3", - "options": { - "text": "产线定义", - "marginBottom": "4px" - } - }, - { - "widgettype": "Text", - "options": { - "text": "管理产线基本信息与配置", - "cfontsize": 1.2 - } - } - ] - }, - { - "widgettype": "VBox", - "options": { - "css": "card", - "cwidth": 23, - "cheight": 12, - "padding": "24px", - "cursor": "pointer", - "bgcolor": "#fff" - }, - "binds": [ - { - "wid": "self", - "event": "click", - "actiontype": "urlwidget", - "target": "app.main_content", - "options": { - "url": "{{entire_url('/pipeline_core/pipeline_steps/')}}" - }, - "mode": "replace" - } - ], - "subwidgets": [ - { - "widgettype": "VBox", - "options": { - "width": "44px", - "height": "44px", - "bgcolor": "#F0FDF4", - "borderRadius": "12px", - "alignItems": "center", - "justifyContent": "center", - "marginBottom": "12px" - }, - "subwidgets": [ - { - "widgettype": "Svg", - "options": { - "svg": "", - "width": "24px", - "height": "24px" - } - } - ] - }, - { - "widgettype": "Title3", - "options": { - "text": "产线步骤", - "marginBottom": "4px" - } - }, - { - "widgettype": "Text", - "options": { - "text": "配置产线执行步骤与参数", - "cfontsize": 1.2 - } - } - ] - }, - { - "widgettype": "VBox", - "options": { - "css": "card", - "cwidth": 23, - "cheight": 12, - "padding": "24px", - "cursor": "pointer", - "bgcolor": "#fff" - }, - "binds": [ - { - "wid": "self", - "event": "click", - "actiontype": "urlwidget", - "target": "app.main_content", - "options": { - "url": "{{entire_url('/pipeline_core/pipeline_versions/')}}" - }, - "mode": "replace" - } - ], - "subwidgets": [ - { - "widgettype": "VBox", - "options": { - "width": "44px", - "height": "44px", - "bgcolor": "#FFFBEB", - "borderRadius": "12px", - "alignItems": "center", - "justifyContent": "center", - "marginBottom": "12px" - }, - "subwidgets": [ - { - "widgettype": "Svg", - "options": { - "svg": "", - "width": "24px", - "height": "24px" - } - } - ] - }, - { - "widgettype": "Title3", - "options": { - "text": "发布记录", - "marginBottom": "4px" - } - }, - { - "widgettype": "Text", - "options": { - "text": "查看产线版本发布历史", - "cfontsize": 1.2 - } - } - ] - } - ] - } - ] - }, - { - "widgettype": "VScrollPanel", - "id": "pipeline_core_content", - "options": { - "css": "filler", - "width": "100%", - "height": "100%" - } - } - ] -} \ No newline at end of file diff --git a/wwwroot/pipeline_editor/index.ui b/wwwroot/pipeline_editor/index.ui deleted file mode 100644 index 6812015..0000000 --- a/wwwroot/pipeline_editor/index.ui +++ /dev/null @@ -1,85 +0,0 @@ -{ - "widgettype": "VBox", - "options": {"width": "100%", "height": "100%", "padding": "24px", "gap": "20px"}, - "subwidgets": [ - { - "widgettype": "HBox", - "options": {"alignItems": "center", "gap": "16px", "padding": "0 0 16px 0", "borderBottom": "1px solid #334155"}, - "subwidgets": [ - {"widgettype": "Title2", "options": {"text": "产线编排画布"}}, - {"widgettype": "Filler"}, - { - "widgettype": "Button", - "options": {"label": "发布版本", "bgcolor": "#6366f1", "color": "#fff"}, - "binds": [{"wid": "self", "event": "click", "actiontype": "method", "target": "app.pipeline_editor", "method": "publish"}] - } - ] - }, - { - "widgettype": "HBox", - "options": {"gap": "12px", "alignItems": "center"}, - "subwidgets": [ - {"widgettype": "Text", "options": {"text": "选择产线:", "cfontsize": 1, "color": "#e2e8f0"}}, - { - "widgettype": "DataSelector", - "id": "ds_pipelines", - "options": { - "data_url": "{{entire_url('/pipeline_core/pipeline_steps/get_pipelines.dspy')}}", - "valueField": "id", - "textField": "name", - "width": "300px", - "placeholder": "选择要编辑的产线..." - }, - "binds": [{"wid": "self", "event": "change", "actiontype": "method", "target": "app.pipeline_editor", "method": "load_steps"}] - }, - { - "widgettype": "DataSelector", - "id": "ds_step_types", - "options": { - "data_url": "{{entire_url('/pipeline_core/pipeline_steps/get_step_types.dspy')}}", - "valueField": "step_type", - "textField": "display_name", - "width": "240px", - "placeholder": "添加步骤类型..." - } - }, - { - "widgettype": "Button", - "options": {"label": "+ 添加步骤", "bgcolor": "#4ade80", "color": "#000"}, - "binds": [{"wid": "self", "event": "click", "actiontype": "method", "target": "app.pipeline_editor", "method": "add_step"}] - } - ] - }, - { - "widgettype": "DataViewer", - "id": "dv_steps", - "options": { - "data_url": "", - "width": "100%", - "columns": ["id", "step_order", "step_name", "step_type"] - } - }, - { - "widgettype": "VBox", - "id": "steps_canvas", - "options": {"width": "100%", "gap": "8px", "padding": "0", "minHeight": "300px"}, - "subwidgets": [ - { - "widgettype": "Text", - "options": {"text": "选择产线后,步骤将在此显示。可以拖拽排序、点击编辑。", "cfontsize": 1, "color": "#64748b", "padding": "40px", "alignItems": "center"} - } - ] - }, - { - "widgettype": "HBox", - "options": {"gap": "12px", "justifyContent": "flex-end", "padding": "16px 0 0 0", "borderTop": "1px solid #334155"}, - "subwidgets": [ - { - "widgettype": "Button", - "options": {"label": "保存排序", "bgcolor": "#3b82f6", "color": "#fff"}, - "binds": [{"wid": "self", "event": "click", "actiontype": "method", "target": "app.pipeline_editor", "method": "save_order"}] - } - ] - } - ] -} diff --git a/wwwroot/pipeline_editor/save_steps.dspy b/wwwroot/pipeline_editor/save_steps.dspy deleted file mode 100644 index c0cb516..0000000 --- a/wwwroot/pipeline_editor/save_steps.dspy +++ /dev/null @@ -1,47 +0,0 @@ -""" -Pipeline Editor: Save step order after reordering -POST params: pipeline_id, steps (JSON array of {id, step_order}) -""" -from sqlor.dbpools import DBPools - -async def main(): - userid = await get_user() - if not userid: - return {'error': 'unauthorized'} - - pipeline_id = params_kw.pipeline_id - steps = params_kw.steps # JSON array - - if not pipeline_id or not steps: - return {'error': 'missing pipeline_id or steps'} - - if isinstance(steps, str): - import json - steps = json.loads(steps) - - dbname = get_module_dbname('pipeline_core') - async with DBPools().sqlorContext(dbname) as sor: - for i, step in enumerate(steps): - await sor.U('pipeline_steps', { - 'id': step['id'], - 'step_order': i + 1, - 'step_name': step.get('step_name', ''), - 'step_type': step.get('step_type', ''), - 'step_config': step.get('step_config', '{}'), - 'timeout_seconds': step.get('timeout_seconds', 300), - 'retry_count': step.get('retry_count', 0) - }) - - # Create version record - from appPublic.uniqueID import getID - vid = getID() - await sor.C('pipeline_versions', { - 'id': vid, - 'pipeline_id': pipeline_id, - 'version': f"v{len(steps)}.0", - 'publish_status': 'draft', - 'changelog': 'Editor save', - 'config_snapshot': json.dumps(steps, ensure_ascii=False) if 'json' in dir() else str(steps) - }) - - return {'success': True, 'version_id': vid, 'step_count': len(steps)}