# work_env.dspy - 工作环境管理 API(沙箱本地/远程切换 + 目录迁移) # action: get / set / ensure_remote_bwrap user_id = await get_user() if not user_id: return json.dumps({'ok': False, 'error': '未登录'}, ensure_ascii=False) action = (params_kw or {}).get('action', 'get') from pipeline_service.work_env import ( get_work_env, set_work_env, ensure_remote_bwrap, ) from pipeline_service.deploy_account import account_name_for, sanitize_username # 查用户 username(账号名 ag_)和 org_id username = user_id org_id = '' try: async with get_sor_context(request._run_ns, 'pipeline') as _sor: _u = await _sor.sqlExe("SELECT username, orgid FROM users WHERE id=${u}$", {'u': user_id}) if _u: username = getattr(_u[0], 'username', user_id) or user_id org_id = getattr(_u[0], 'orgid', '') or '' except Exception: pass if action == 'get': try: async with get_sor_context(request._run_ns, 'pipeline') as sor: env = await get_work_env(sor, user_id, org_id) return json.dumps({'ok': True, 'env': env, 'account_name': account_name_for(username)}, ensure_ascii=False) except Exception as e: return json.dumps({'ok': False, 'error': str(e)}, ensure_ascii=False) elif action == 'set': owner_type = (params_kw or {}).get('owner_type', 'user') mode = (params_kw or {}).get('mode', 'local') account_name = (params_kw or {}).get('account_name', '') or account_name_for(username) # owner_id:user 级用 user_id,org 级用 org_id owner_id = (params_kw or {}).get('owner_id', '') if owner_type == 'user': owner_id = owner_id or user_id elif owner_type == 'org': owner_id = owner_id or org_id remote_config = { 'remote_host': (params_kw or {}).get('remote_host', ''), 'remote_port': (params_kw or {}).get('remote_port', 22), 'remote_user': (params_kw or {}).get('remote_user', ''), 'remote_key_path': (params_kw or {}).get('remote_key_path', ''), 'remote_dir': (params_kw or {}).get('remote_dir', ''), } try: async with get_sor_context(request._run_ns, 'pipeline') as sor: r = await set_work_env(sor, owner_type, owner_id, mode, remote_config, account_name) return json.dumps(r, ensure_ascii=False) except Exception as e: return json.dumps({'ok': False, 'error': str(e)}, ensure_ascii=False) elif action == 'ensure_remote_bwrap': remote_config = { 'remote_host': (params_kw or {}).get('remote_host', ''), 'remote_port': (params_kw or {}).get('remote_port', 22), 'remote_user': (params_kw or {}).get('remote_user', ''), 'remote_key_path': (params_kw or {}).get('remote_key_path', ''), } try: r = await ensure_remote_bwrap(remote_config) return json.dumps(r, ensure_ascii=False) except Exception as e: return json.dumps({'ok': False, 'error': str(e)}, ensure_ascii=False) else: return json.dumps({'ok': False, 'error': '未知 action: ' + str(action)}, ensure_ascii=False)