@cicctencent/agent-server 0.2.82 → 0.2.84
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/dist/cjs/agent/agent-server.d.ts.map +1 -1
- package/dist/cjs/agent/agent-server.js +58 -2
- package/dist/cjs/agent/agent-server.js.map +1 -1
- package/dist/cjs/automation/index.d.ts +3 -0
- package/dist/cjs/automation/index.d.ts.map +1 -1
- package/dist/cjs/automation/index.js +6 -1
- package/dist/cjs/automation/index.js.map +1 -1
- package/dist/cjs/automation/node-task-runtime.d.ts +2 -0
- package/dist/cjs/automation/node-task-runtime.d.ts.map +1 -1
- package/dist/cjs/automation/node-task-runtime.js +42 -1
- package/dist/cjs/automation/node-task-runtime.js.map +1 -1
- package/dist/cjs/automation/node-task-validator.d.ts.map +1 -1
- package/dist/cjs/automation/node-task-validator.js +17 -2
- package/dist/cjs/automation/node-task-validator.js.map +1 -1
- package/dist/cjs/automation/python-prelude.d.ts +6 -0
- package/dist/cjs/automation/python-prelude.d.ts.map +1 -0
- package/dist/cjs/automation/python-prelude.js +290 -0
- package/dist/cjs/automation/python-prelude.js.map +1 -0
- package/dist/cjs/automation/python-task-runtime.d.ts +17 -0
- package/dist/cjs/automation/python-task-runtime.d.ts.map +1 -0
- package/dist/cjs/automation/python-task-runtime.js +244 -0
- package/dist/cjs/automation/python-task-runtime.js.map +1 -0
- package/dist/cjs/connectors/calendar-adapter.d.ts +1 -1
- package/dist/cjs/connectors/calendar-adapter.d.ts.map +1 -1
- package/dist/cjs/connectors/calendar-adapter.js +2 -10
- package/dist/cjs/connectors/calendar-adapter.js.map +1 -1
- package/dist/cjs/connectors/db-adapter.d.ts +1 -1
- package/dist/cjs/connectors/db-adapter.d.ts.map +1 -1
- package/dist/cjs/connectors/db-adapter.js +2 -19
- package/dist/cjs/connectors/db-adapter.js.map +1 -1
- package/dist/cjs/connectors/email-adapter.d.ts +1 -1
- package/dist/cjs/connectors/email-adapter.d.ts.map +1 -1
- package/dist/cjs/connectors/email-adapter.js +2 -10
- package/dist/cjs/connectors/email-adapter.js.map +1 -1
- package/dist/cjs/connectors/fs-adapter.d.ts +1 -1
- package/dist/cjs/connectors/fs-adapter.d.ts.map +1 -1
- package/dist/cjs/connectors/fs-adapter.js +4 -12
- package/dist/cjs/connectors/fs-adapter.js.map +1 -1
- package/dist/cjs/connectors/http-adapter.js +2 -4
- package/dist/cjs/connectors/http-adapter.js.map +1 -1
- package/dist/cjs/connectors/mq-adapter.d.ts +1 -1
- package/dist/cjs/connectors/mq-adapter.d.ts.map +1 -1
- package/dist/cjs/connectors/mq-adapter.js +2 -10
- package/dist/cjs/connectors/mq-adapter.js.map +1 -1
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +5 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/mcp/api-bridge-client.d.ts +1 -0
- package/dist/cjs/mcp/api-bridge-client.d.ts.map +1 -1
- package/dist/cjs/mcp/api-bridge-client.js +60 -2
- package/dist/cjs/mcp/api-bridge-client.js.map +1 -1
- package/dist/cjs/sandbox/local-sandbox.d.ts.map +1 -1
- package/dist/cjs/sandbox/local-sandbox.js +5 -8
- package/dist/cjs/sandbox/local-sandbox.js.map +1 -1
- package/dist/cjs/service/artifact.service.d.ts.map +1 -1
- package/dist/cjs/service/artifact.service.js +0 -26
- package/dist/cjs/service/artifact.service.js.map +1 -1
- package/dist/cjs/service/cache.service.d.ts +2 -0
- package/dist/cjs/service/cache.service.d.ts.map +1 -1
- package/dist/cjs/service/cache.service.js +8 -1
- package/dist/cjs/service/cache.service.js.map +1 -1
- package/dist/cjs/service/chat.service.d.ts.map +1 -1
- package/dist/cjs/service/chat.service.js +1 -3
- package/dist/cjs/service/chat.service.js.map +1 -1
- package/dist/cjs/service/safety-audit.middleware.d.ts.map +1 -1
- package/dist/cjs/service/safety-audit.middleware.js +12 -1
- package/dist/cjs/service/safety-audit.middleware.js.map +1 -1
- package/dist/cjs/service/settings.service.d.ts.map +1 -1
- package/dist/cjs/service/settings.service.js +2 -2
- package/dist/cjs/service/settings.service.js.map +1 -1
- package/dist/cjs/sse/sse-handler.d.ts.map +1 -1
- package/dist/cjs/sse/sse-handler.js +3 -1
- package/dist/cjs/sse/sse-handler.js.map +1 -1
- package/dist/cjs/tool/local-executors.d.ts +1 -0
- package/dist/cjs/tool/local-executors.d.ts.map +1 -1
- package/dist/cjs/tool/local-executors.js +8 -3
- package/dist/cjs/tool/local-executors.js.map +1 -1
- package/dist/cjs/tool/tools/git.d.ts.map +1 -1
- package/dist/cjs/tool/tools/git.js +34 -7
- package/dist/cjs/tool/tools/git.js.map +1 -1
- package/dist/cjs/tool/tools/sandbox.js.map +1 -1
- package/dist/cjs/types.d.ts +2 -0
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/agent/agent-server.d.ts.map +1 -1
- package/dist/esm/agent/agent-server.js +58 -2
- package/dist/esm/agent/agent-server.js.map +1 -1
- package/dist/esm/automation/index.d.ts +3 -0
- package/dist/esm/automation/index.d.ts.map +1 -1
- package/dist/esm/automation/index.js +2 -0
- package/dist/esm/automation/index.js.map +1 -1
- package/dist/esm/automation/node-task-runtime.d.ts +2 -0
- package/dist/esm/automation/node-task-runtime.d.ts.map +1 -1
- package/dist/esm/automation/node-task-runtime.js +42 -1
- package/dist/esm/automation/node-task-runtime.js.map +1 -1
- package/dist/esm/automation/node-task-validator.d.ts.map +1 -1
- package/dist/esm/automation/node-task-validator.js +17 -2
- package/dist/esm/automation/node-task-validator.js.map +1 -1
- package/dist/esm/automation/python-prelude.d.ts +6 -0
- package/dist/esm/automation/python-prelude.d.ts.map +1 -0
- package/dist/esm/automation/python-prelude.js +287 -0
- package/dist/esm/automation/python-prelude.js.map +1 -0
- package/dist/esm/automation/python-task-runtime.d.ts +17 -0
- package/dist/esm/automation/python-task-runtime.d.ts.map +1 -0
- package/dist/esm/automation/python-task-runtime.js +206 -0
- package/dist/esm/automation/python-task-runtime.js.map +1 -0
- package/dist/esm/connectors/calendar-adapter.d.ts +1 -1
- package/dist/esm/connectors/calendar-adapter.d.ts.map +1 -1
- package/dist/esm/connectors/calendar-adapter.js +2 -10
- package/dist/esm/connectors/calendar-adapter.js.map +1 -1
- package/dist/esm/connectors/db-adapter.d.ts +1 -1
- package/dist/esm/connectors/db-adapter.d.ts.map +1 -1
- package/dist/esm/connectors/db-adapter.js +2 -19
- package/dist/esm/connectors/db-adapter.js.map +1 -1
- package/dist/esm/connectors/email-adapter.d.ts +1 -1
- package/dist/esm/connectors/email-adapter.d.ts.map +1 -1
- package/dist/esm/connectors/email-adapter.js +2 -10
- package/dist/esm/connectors/email-adapter.js.map +1 -1
- package/dist/esm/connectors/fs-adapter.d.ts +1 -1
- package/dist/esm/connectors/fs-adapter.d.ts.map +1 -1
- package/dist/esm/connectors/fs-adapter.js +4 -12
- package/dist/esm/connectors/fs-adapter.js.map +1 -1
- package/dist/esm/connectors/http-adapter.js +2 -4
- package/dist/esm/connectors/http-adapter.js.map +1 -1
- package/dist/esm/connectors/mq-adapter.d.ts +1 -1
- package/dist/esm/connectors/mq-adapter.d.ts.map +1 -1
- package/dist/esm/connectors/mq-adapter.js +2 -10
- package/dist/esm/connectors/mq-adapter.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mcp/api-bridge-client.d.ts +1 -0
- package/dist/esm/mcp/api-bridge-client.d.ts.map +1 -1
- package/dist/esm/mcp/api-bridge-client.js +27 -2
- package/dist/esm/mcp/api-bridge-client.js.map +1 -1
- package/dist/esm/sandbox/local-sandbox.d.ts.map +1 -1
- package/dist/esm/sandbox/local-sandbox.js +5 -8
- package/dist/esm/sandbox/local-sandbox.js.map +1 -1
- package/dist/esm/service/artifact.service.d.ts.map +1 -1
- package/dist/esm/service/artifact.service.js +0 -26
- package/dist/esm/service/artifact.service.js.map +1 -1
- package/dist/esm/service/cache.service.d.ts +2 -0
- package/dist/esm/service/cache.service.d.ts.map +1 -1
- package/dist/esm/service/cache.service.js +8 -1
- package/dist/esm/service/cache.service.js.map +1 -1
- package/dist/esm/service/chat.service.d.ts.map +1 -1
- package/dist/esm/service/chat.service.js +1 -3
- package/dist/esm/service/chat.service.js.map +1 -1
- package/dist/esm/service/safety-audit.middleware.d.ts.map +1 -1
- package/dist/esm/service/safety-audit.middleware.js +12 -1
- package/dist/esm/service/safety-audit.middleware.js.map +1 -1
- package/dist/esm/service/settings.service.d.ts.map +1 -1
- package/dist/esm/service/settings.service.js +2 -2
- package/dist/esm/service/settings.service.js.map +1 -1
- package/dist/esm/sse/sse-handler.d.ts.map +1 -1
- package/dist/esm/sse/sse-handler.js +3 -1
- package/dist/esm/sse/sse-handler.js.map +1 -1
- package/dist/esm/tool/local-executors.d.ts +1 -0
- package/dist/esm/tool/local-executors.d.ts.map +1 -1
- package/dist/esm/tool/local-executors.js +8 -3
- package/dist/esm/tool/local-executors.js.map +1 -1
- package/dist/esm/tool/tools/git.d.ts.map +1 -1
- package/dist/esm/tool/tools/git.js +34 -7
- package/dist/esm/tool/tools/git.js.map +1 -1
- package/dist/esm/tool/tools/sandbox.js.map +1 -1
- package/dist/esm/types.d.ts +2 -0
- package/dist/esm/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-task-validator.js","sourceRoot":"","sources":["../../../src/automation/node-task-validator.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,sCAAsC;AACtC,+DAA+D;;
|
|
1
|
+
{"version":3,"file":"node-task-validator.js","sourceRoot":"","sources":["../../../src/automation/node-task-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Python 基础能力库源码。
|
|
3
|
+
* 运行时会将 __AGENT_ENDPOINT__ 替换为真实的 A2A JSON-RPC 端点 URL。
|
|
4
|
+
*/
|
|
5
|
+
export declare const PYTHON_PRELUDE_SOURCE = "# -*- coding: utf-8 -*-\n\"\"\"\nSandbox Prelude for Python automation tasks.\nAuto-imported as `sb` in every task script.\nMirrors the Node.js global.sb capabilities.\n\"\"\"\nimport os\nimport sys\nimport json\nimport csv\nimport io\nimport time\nimport datetime as _dt\nimport urllib.request\nimport urllib.error\nimport urllib.parse\nfrom typing import Any, Dict, List, Optional\n\n# Agent \u8C03\u7528\u7AEF\u70B9\uFF08\u7531\u8FD0\u884C\u65F6\u6CE8\u5165\uFF09\n_AGENT_ENDPOINT = \"__AGENT_ENDPOINT__\"\n_AGENT_CONFIGURED = _AGENT_ENDPOINT != \"__AGENT_ENDPOINT__\"\n\n\nclass _Logger:\n def __init__(self, sink):\n self._sink = sink\n\n def debug(self, message, meta=None):\n self._sink(\"debug\", message, meta)\n\n def info(self, message, meta=None):\n self._sink(\"info\", message, meta)\n\n def warn(self, message, meta=None):\n self._sink(\"warn\", message, meta)\n\n def error(self, message, meta=None):\n self._sink(\"error\", message, meta)\n\n\n# ===== HTTP =====\n\ndef fetch(url, options=None, timeout=30):\n \"\"\"HTTP \u8BF7\u6C42\uFF0C\u8FD4\u56DE {status, headers, data, text}\u3002\"\"\"\n options = options or {}\n method = options.get(\"method\", \"GET\").upper()\n headers = dict(options.get(\"headers\") or {})\n headers.setdefault(\"User-Agent\", \"workai-sandbox/1.0\")\n params = options.get(\"params\")\n if params:\n query = urllib.parse.urlencode(params)\n url = url + (\"&\" if \"?\" in url else \"?\") + query\n body = options.get(\"body\")\n json_body = options.get(\"json\")\n data = None\n if json_body is not None:\n data = json.dumps(json_body).encode(\"utf-8\")\n headers.setdefault(\"Content-Type\", \"application/json\")\n elif body is not None:\n if isinstance(body, str):\n data = body.encode(\"utf-8\")\n elif isinstance(body, (bytes, bytearray)):\n data = bytes(body)\n else:\n data = json.dumps(body).encode(\"utf-8\")\n headers.setdefault(\"Content-Type\", \"application/json\")\n req = urllib.request.Request(url, data=data, headers=headers, method=method)\n try:\n with urllib.request.urlopen(req, timeout=timeout) as resp:\n status = resp.status\n resp_headers = dict(resp.headers)\n text = resp.read().decode(\"utf-8\", errors=\"replace\")\n except urllib.error.HTTPError as e:\n status = e.code\n resp_headers = dict(e.headers) if e.headers else {}\n text = e.read().decode(\"utf-8\", errors=\"replace\") if e.fp else \"\"\n parsed = text\n ct = (resp_headers.get(\"Content-Type\") or \"\").lower()\n if \"application/json\" in ct or \"+json\" in ct:\n try:\n parsed = json.loads(text)\n except Exception:\n pass\n return {\"status\": status, \"headers\": resp_headers, \"data\": parsed, \"text\": text}\n\n\ndef get(url, options=None, timeout=30):\n return fetch(url, dict(options or {}, method=\"GET\"), timeout)\n\n\ndef post(url, body=None, options=None, timeout=30):\n opts = dict(options or {}, method=\"POST\")\n if isinstance(body, (dict, list)):\n opts[\"json\"] = body\n else:\n opts[\"body\"] = body\n return fetch(url, opts, timeout)\n\n\n# ===== File I/O =====\n\ndef read_text(file_path, encoding=\"utf-8\"):\n with open(file_path, \"r\", encoding=encoding) as f:\n return f.read()\n\n\ndef write_text(file_path, content, encoding=\"utf-8\"):\n _ensure_parent(file_path)\n with open(file_path, \"w\", encoding=encoding) as f:\n f.write(content)\n\n\ndef append_text(file_path, content, encoding=\"utf-8\"):\n _ensure_parent(file_path)\n with open(file_path, \"a\", encoding=encoding) as f:\n f.write(content)\n\n\ndef read_json(file_path):\n with open(file_path, \"r\", encoding=\"utf-8\") as f:\n return json.load(f)\n\n\ndef write_json(file_path, data, indent=2):\n _ensure_parent(file_path)\n with open(file_path, \"w\", encoding=\"utf-8\") as f:\n json.dump(data, f, ensure_ascii=False, indent=indent)\n\n\ndef read_csv(file_path):\n with open(file_path, \"r\", encoding=\"utf-8\", newline=\"\") as f:\n return list(csv.DictReader(f))\n\n\ndef write_csv(file_path, rows):\n _ensure_parent(file_path)\n if not rows:\n with open(file_path, \"w\", encoding=\"utf-8\", newline=\"\") as f:\n f.write(\"\")\n return\n with open(file_path, \"w\", encoding=\"utf-8\", newline=\"\") as f:\n writer = csv.DictWriter(f, fieldnames=list(rows[0].keys()))\n writer.writeheader()\n writer.writerows(rows)\n\n\ndef exists(file_path):\n return os.path.exists(file_path)\n\n\ndef list_dir(dir_path=\".\"):\n return os.listdir(dir_path)\n\n\ndef _ensure_parent(file_path):\n parent = os.path.dirname(os.path.abspath(file_path))\n os.makedirs(parent, exist_ok=True)\n\n\n# ===== Data helpers =====\n\ndef stats(values):\n values = [v for v in values if v is not None]\n n = len(values)\n if n == 0:\n return {\"count\": 0, \"sum\": 0, \"avg\": 0, \"min\": None, \"max\": None}\n s = sum(values)\n return {\"count\": n, \"sum\": s, \"avg\": s / n, \"min\": min(values), \"max\": max(values)}\n\n\ndef sum_of(values):\n return sum(v for v in values if v is not None)\n\n\ndef avg(values):\n vals = [v for v in values if v is not None]\n return sum(vals) / len(vals) if vals else 0\n\n\ndef group_by(rows, key):\n result = {}\n for row in rows:\n k = row.get(key) if isinstance(row, dict) else getattr(row, key, None)\n result.setdefault(k, []).append(row)\n return result\n\n\ndef sort_by(rows, key, reverse=False):\n return sorted(rows, key=lambda r: (r.get(key) if isinstance(r, dict) else getattr(r, key, None)), reverse=reverse)\n\n\ndef unique(values):\n seen = []\n for v in values:\n if v not in seen:\n seen.append(v)\n return seen\n\n\ndef chunk(values, size):\n return [values[i:i + size] for i in range(0, len(values), size)]\n\n\n# ===== Date helpers =====\n\ndef now():\n return _dt.datetime.now()\n\n\ndef format_date(dt, fmt=\"%Y-%m-%d %H:%M:%S\"):\n if isinstance(dt, (int, float)):\n dt = _dt.datetime.fromtimestamp(dt)\n if isinstance(dt, str):\n dt = _dt.datetime.fromisoformat(dt)\n return dt.strftime(fmt)\n\n\ndef parse_date(text, fmt=None):\n if fmt:\n return _dt.datetime.strptime(text, fmt)\n return _dt.datetime.fromisoformat(text)\n\n\ndef days_go(n):\n return _dt.datetime.now() - _dt.timedelta(days=n)\n\n\ndef days_later(n):\n return _dt.datetime.now() + _dt.timedelta(days=n)\n\n\n# ===== Agent =====\n\nclass _Agent:\n \"\"\"\u8C03\u7528\u5E73\u53F0 Agent \u80FD\u529B\uFF08\u57FA\u4E8E A2A JSON-RPC\uFF09\u3002\"\"\"\n\n def ask(self, prompt, options=None):\n \"\"\"\u5411 Agent \u53D1\u9001\u63D0\u793A\u8BCD\u5E76\u540C\u6B65\u7B49\u5F85\u6587\u672C\u56DE\u590D\u3002\"\"\"\n if not _AGENT_CONFIGURED:\n raise RuntimeError(\"Agent endpoint not configured\")\n options = options or {}\n payload = {\n \"jsonrpc\": \"2.0\",\n \"id\": options.get(\"id\", 1),\n \"method\": \"tasks/send\",\n \"params\": {\n \"message\": {\n \"role\": \"user\",\n \"parts\": [{\"type\": \"text\", \"text\": str(prompt)}],\n },\n \"contextId\": options.get(\"contextId\"),\n \"profile\": options.get(\"profile\"),\n },\n }\n resp = fetch(\n _AGENT_ENDPOINT,\n {\"method\": \"POST\", \"json\": payload, \"headers\": {\"Accept\": \"application/json\"}},\n timeout=options.get(\"timeout\", 120),\n )\n if resp[\"status\"] >= 400:\n raise RuntimeError(\"Agent call failed (HTTP %s): %s\" % (resp[\"status\"], resp[\"text\"][:200]))\n body = resp[\"data\"] if isinstance(resp[\"data\"], dict) else {}\n if \"error\" in body:\n raise RuntimeError(\"Agent error: %s\" % body[\"error\"])\n task = (body.get(\"result\") or {}).get(\"task\") or {}\n state = task.get(\"state\")\n if state == \"failed\":\n raise RuntimeError(\"Agent task failed: %s\" % task.get(\"error\", \"unknown\"))\n parts = (task.get(\"result\") or {}).get(\"parts\") or []\n texts = [p.get(\"text\", \"\") for p in parts if p.get(\"kind\") == \"text\" or p.get(\"type\") == \"text\"]\n return \"\".join(texts)\n\n\nagent = _Agent()\n";
|
|
6
|
+
//# sourceMappingURL=python-prelude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-prelude.d.ts","sourceRoot":"","sources":["../../../src/automation/python-prelude.ts"],"names":[],"mappings":"AAQA;;;GAGG;AACH,eAAO,MAAM,qBAAqB,mgRAkRjC,CAAC"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Python Automation Prelude - Python 自动化任务基础能力库
|
|
4
|
+
// ============================================================
|
|
5
|
+
// 在沙箱初始化时写入 _scripts/_sb.py,由 Python 引导脚本 import。
|
|
6
|
+
// 提供与 Node 端 global.sb 对等的能力:HTTP / 文件 / 数据 / 日期 / 日志 / Agent 调用。
|
|
7
|
+
// Agent 调用端点由运行时通过 __AGENT_ENDPOINT__ 占位符注入。
|
|
8
|
+
// ============================================================
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.PYTHON_PRELUDE_SOURCE = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* Python 基础能力库源码。
|
|
13
|
+
* 运行时会将 __AGENT_ENDPOINT__ 替换为真实的 A2A JSON-RPC 端点 URL。
|
|
14
|
+
*/
|
|
15
|
+
exports.PYTHON_PRELUDE_SOURCE = `# -*- coding: utf-8 -*-
|
|
16
|
+
"""
|
|
17
|
+
Sandbox Prelude for Python automation tasks.
|
|
18
|
+
Auto-imported as \`sb\` in every task script.
|
|
19
|
+
Mirrors the Node.js global.sb capabilities.
|
|
20
|
+
"""
|
|
21
|
+
import os
|
|
22
|
+
import sys
|
|
23
|
+
import json
|
|
24
|
+
import csv
|
|
25
|
+
import io
|
|
26
|
+
import time
|
|
27
|
+
import datetime as _dt
|
|
28
|
+
import urllib.request
|
|
29
|
+
import urllib.error
|
|
30
|
+
import urllib.parse
|
|
31
|
+
from typing import Any, Dict, List, Optional
|
|
32
|
+
|
|
33
|
+
# Agent 调用端点(由运行时注入)
|
|
34
|
+
_AGENT_ENDPOINT = "__AGENT_ENDPOINT__"
|
|
35
|
+
_AGENT_CONFIGURED = _AGENT_ENDPOINT != "__AGENT_ENDPOINT__"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class _Logger:
|
|
39
|
+
def __init__(self, sink):
|
|
40
|
+
self._sink = sink
|
|
41
|
+
|
|
42
|
+
def debug(self, message, meta=None):
|
|
43
|
+
self._sink("debug", message, meta)
|
|
44
|
+
|
|
45
|
+
def info(self, message, meta=None):
|
|
46
|
+
self._sink("info", message, meta)
|
|
47
|
+
|
|
48
|
+
def warn(self, message, meta=None):
|
|
49
|
+
self._sink("warn", message, meta)
|
|
50
|
+
|
|
51
|
+
def error(self, message, meta=None):
|
|
52
|
+
self._sink("error", message, meta)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# ===== HTTP =====
|
|
56
|
+
|
|
57
|
+
def fetch(url, options=None, timeout=30):
|
|
58
|
+
"""HTTP 请求,返回 {status, headers, data, text}。"""
|
|
59
|
+
options = options or {}
|
|
60
|
+
method = options.get("method", "GET").upper()
|
|
61
|
+
headers = dict(options.get("headers") or {})
|
|
62
|
+
headers.setdefault("User-Agent", "workai-sandbox/1.0")
|
|
63
|
+
params = options.get("params")
|
|
64
|
+
if params:
|
|
65
|
+
query = urllib.parse.urlencode(params)
|
|
66
|
+
url = url + ("&" if "?" in url else "?") + query
|
|
67
|
+
body = options.get("body")
|
|
68
|
+
json_body = options.get("json")
|
|
69
|
+
data = None
|
|
70
|
+
if json_body is not None:
|
|
71
|
+
data = json.dumps(json_body).encode("utf-8")
|
|
72
|
+
headers.setdefault("Content-Type", "application/json")
|
|
73
|
+
elif body is not None:
|
|
74
|
+
if isinstance(body, str):
|
|
75
|
+
data = body.encode("utf-8")
|
|
76
|
+
elif isinstance(body, (bytes, bytearray)):
|
|
77
|
+
data = bytes(body)
|
|
78
|
+
else:
|
|
79
|
+
data = json.dumps(body).encode("utf-8")
|
|
80
|
+
headers.setdefault("Content-Type", "application/json")
|
|
81
|
+
req = urllib.request.Request(url, data=data, headers=headers, method=method)
|
|
82
|
+
try:
|
|
83
|
+
with urllib.request.urlopen(req, timeout=timeout) as resp:
|
|
84
|
+
status = resp.status
|
|
85
|
+
resp_headers = dict(resp.headers)
|
|
86
|
+
text = resp.read().decode("utf-8", errors="replace")
|
|
87
|
+
except urllib.error.HTTPError as e:
|
|
88
|
+
status = e.code
|
|
89
|
+
resp_headers = dict(e.headers) if e.headers else {}
|
|
90
|
+
text = e.read().decode("utf-8", errors="replace") if e.fp else ""
|
|
91
|
+
parsed = text
|
|
92
|
+
ct = (resp_headers.get("Content-Type") or "").lower()
|
|
93
|
+
if "application/json" in ct or "+json" in ct:
|
|
94
|
+
try:
|
|
95
|
+
parsed = json.loads(text)
|
|
96
|
+
except Exception:
|
|
97
|
+
pass
|
|
98
|
+
return {"status": status, "headers": resp_headers, "data": parsed, "text": text}
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def get(url, options=None, timeout=30):
|
|
102
|
+
return fetch(url, dict(options or {}, method="GET"), timeout)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def post(url, body=None, options=None, timeout=30):
|
|
106
|
+
opts = dict(options or {}, method="POST")
|
|
107
|
+
if isinstance(body, (dict, list)):
|
|
108
|
+
opts["json"] = body
|
|
109
|
+
else:
|
|
110
|
+
opts["body"] = body
|
|
111
|
+
return fetch(url, opts, timeout)
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
# ===== File I/O =====
|
|
115
|
+
|
|
116
|
+
def read_text(file_path, encoding="utf-8"):
|
|
117
|
+
with open(file_path, "r", encoding=encoding) as f:
|
|
118
|
+
return f.read()
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def write_text(file_path, content, encoding="utf-8"):
|
|
122
|
+
_ensure_parent(file_path)
|
|
123
|
+
with open(file_path, "w", encoding=encoding) as f:
|
|
124
|
+
f.write(content)
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def append_text(file_path, content, encoding="utf-8"):
|
|
128
|
+
_ensure_parent(file_path)
|
|
129
|
+
with open(file_path, "a", encoding=encoding) as f:
|
|
130
|
+
f.write(content)
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def read_json(file_path):
|
|
134
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
|
135
|
+
return json.load(f)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def write_json(file_path, data, indent=2):
|
|
139
|
+
_ensure_parent(file_path)
|
|
140
|
+
with open(file_path, "w", encoding="utf-8") as f:
|
|
141
|
+
json.dump(data, f, ensure_ascii=False, indent=indent)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def read_csv(file_path):
|
|
145
|
+
with open(file_path, "r", encoding="utf-8", newline="") as f:
|
|
146
|
+
return list(csv.DictReader(f))
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def write_csv(file_path, rows):
|
|
150
|
+
_ensure_parent(file_path)
|
|
151
|
+
if not rows:
|
|
152
|
+
with open(file_path, "w", encoding="utf-8", newline="") as f:
|
|
153
|
+
f.write("")
|
|
154
|
+
return
|
|
155
|
+
with open(file_path, "w", encoding="utf-8", newline="") as f:
|
|
156
|
+
writer = csv.DictWriter(f, fieldnames=list(rows[0].keys()))
|
|
157
|
+
writer.writeheader()
|
|
158
|
+
writer.writerows(rows)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def exists(file_path):
|
|
162
|
+
return os.path.exists(file_path)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def list_dir(dir_path="."):
|
|
166
|
+
return os.listdir(dir_path)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _ensure_parent(file_path):
|
|
170
|
+
parent = os.path.dirname(os.path.abspath(file_path))
|
|
171
|
+
os.makedirs(parent, exist_ok=True)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
# ===== Data helpers =====
|
|
175
|
+
|
|
176
|
+
def stats(values):
|
|
177
|
+
values = [v for v in values if v is not None]
|
|
178
|
+
n = len(values)
|
|
179
|
+
if n == 0:
|
|
180
|
+
return {"count": 0, "sum": 0, "avg": 0, "min": None, "max": None}
|
|
181
|
+
s = sum(values)
|
|
182
|
+
return {"count": n, "sum": s, "avg": s / n, "min": min(values), "max": max(values)}
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def sum_of(values):
|
|
186
|
+
return sum(v for v in values if v is not None)
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def avg(values):
|
|
190
|
+
vals = [v for v in values if v is not None]
|
|
191
|
+
return sum(vals) / len(vals) if vals else 0
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def group_by(rows, key):
|
|
195
|
+
result = {}
|
|
196
|
+
for row in rows:
|
|
197
|
+
k = row.get(key) if isinstance(row, dict) else getattr(row, key, None)
|
|
198
|
+
result.setdefault(k, []).append(row)
|
|
199
|
+
return result
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def sort_by(rows, key, reverse=False):
|
|
203
|
+
return sorted(rows, key=lambda r: (r.get(key) if isinstance(r, dict) else getattr(r, key, None)), reverse=reverse)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def unique(values):
|
|
207
|
+
seen = []
|
|
208
|
+
for v in values:
|
|
209
|
+
if v not in seen:
|
|
210
|
+
seen.append(v)
|
|
211
|
+
return seen
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def chunk(values, size):
|
|
215
|
+
return [values[i:i + size] for i in range(0, len(values), size)]
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
# ===== Date helpers =====
|
|
219
|
+
|
|
220
|
+
def now():
|
|
221
|
+
return _dt.datetime.now()
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def format_date(dt, fmt="%Y-%m-%d %H:%M:%S"):
|
|
225
|
+
if isinstance(dt, (int, float)):
|
|
226
|
+
dt = _dt.datetime.fromtimestamp(dt)
|
|
227
|
+
if isinstance(dt, str):
|
|
228
|
+
dt = _dt.datetime.fromisoformat(dt)
|
|
229
|
+
return dt.strftime(fmt)
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def parse_date(text, fmt=None):
|
|
233
|
+
if fmt:
|
|
234
|
+
return _dt.datetime.strptime(text, fmt)
|
|
235
|
+
return _dt.datetime.fromisoformat(text)
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def days_go(n):
|
|
239
|
+
return _dt.datetime.now() - _dt.timedelta(days=n)
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def days_later(n):
|
|
243
|
+
return _dt.datetime.now() + _dt.timedelta(days=n)
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
# ===== Agent =====
|
|
247
|
+
|
|
248
|
+
class _Agent:
|
|
249
|
+
"""调用平台 Agent 能力(基于 A2A JSON-RPC)。"""
|
|
250
|
+
|
|
251
|
+
def ask(self, prompt, options=None):
|
|
252
|
+
"""向 Agent 发送提示词并同步等待文本回复。"""
|
|
253
|
+
if not _AGENT_CONFIGURED:
|
|
254
|
+
raise RuntimeError("Agent endpoint not configured")
|
|
255
|
+
options = options or {}
|
|
256
|
+
payload = {
|
|
257
|
+
"jsonrpc": "2.0",
|
|
258
|
+
"id": options.get("id", 1),
|
|
259
|
+
"method": "tasks/send",
|
|
260
|
+
"params": {
|
|
261
|
+
"message": {
|
|
262
|
+
"role": "user",
|
|
263
|
+
"parts": [{"type": "text", "text": str(prompt)}],
|
|
264
|
+
},
|
|
265
|
+
"contextId": options.get("contextId"),
|
|
266
|
+
"profile": options.get("profile"),
|
|
267
|
+
},
|
|
268
|
+
}
|
|
269
|
+
resp = fetch(
|
|
270
|
+
_AGENT_ENDPOINT,
|
|
271
|
+
{"method": "POST", "json": payload, "headers": {"Accept": "application/json"}},
|
|
272
|
+
timeout=options.get("timeout", 120),
|
|
273
|
+
)
|
|
274
|
+
if resp["status"] >= 400:
|
|
275
|
+
raise RuntimeError("Agent call failed (HTTP %s): %s" % (resp["status"], resp["text"][:200]))
|
|
276
|
+
body = resp["data"] if isinstance(resp["data"], dict) else {}
|
|
277
|
+
if "error" in body:
|
|
278
|
+
raise RuntimeError("Agent error: %s" % body["error"])
|
|
279
|
+
task = (body.get("result") or {}).get("task") or {}
|
|
280
|
+
state = task.get("state")
|
|
281
|
+
if state == "failed":
|
|
282
|
+
raise RuntimeError("Agent task failed: %s" % task.get("error", "unknown"))
|
|
283
|
+
parts = (task.get("result") or {}).get("parts") or []
|
|
284
|
+
texts = [p.get("text", "") for p in parts if p.get("kind") == "text" or p.get("type") == "text"]
|
|
285
|
+
return "".join(texts)
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
agent = _Agent()
|
|
289
|
+
`;
|
|
290
|
+
//# sourceMappingURL=python-prelude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-prelude.js","sourceRoot":"","sources":["../../../src/automation/python-prelude.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,gDAAgD;AAChD,+DAA+D;AAC/D,kDAAkD;AAClD,kEAAkE;AAClE,6CAA6C;AAC7C,+DAA+D;;;AAE/D;;;GAGG;AACU,QAAA,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkRpC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { NodeAutomationExecutionResult, NodeAutomationRunOptions, NodeAutomationTaskPackage } from '@cicctencent/agent-core';
|
|
2
|
+
export interface PythonAutomationRuntimeOptions {
|
|
3
|
+
baseDir?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare class PythonAutomationRuntimeRunner {
|
|
6
|
+
private readonly baseDir;
|
|
7
|
+
constructor(options?: PythonAutomationRuntimeOptions);
|
|
8
|
+
execute(taskPackage: NodeAutomationTaskPackage, options: NodeAutomationRunOptions): Promise<NodeAutomationExecutionResult>;
|
|
9
|
+
/** 剥离 stdout 中的内部结果/错误标记行,保留用户 print 输出 */
|
|
10
|
+
private stripMarkerLines;
|
|
11
|
+
private buildEnv;
|
|
12
|
+
private buildBootstrapScript;
|
|
13
|
+
private parseRuntimeResult;
|
|
14
|
+
private parseRuntimeError;
|
|
15
|
+
}
|
|
16
|
+
export declare function getPythonAutomationRuntimeRunner(): PythonAutomationRuntimeRunner;
|
|
17
|
+
//# sourceMappingURL=python-task-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-task-runtime.d.ts","sourceRoot":"","sources":["../../../src/automation/python-task-runtime.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,6BAA6B,EAE7B,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AAMjC,MAAM,WAAW,8BAA8B;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAYD,qBAAa,6BAA6B;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,GAAE,8BAAmC;IAIlD,OAAO,CACX,WAAW,EAAE,yBAAyB,EACtC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,6BAA6B,CAAC;IAmEzC,2CAA2C;IAC3C,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,QAAQ;IAahB,OAAO,CAAC,oBAAoB;IAoF5B,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,iBAAiB;CAU1B;AAID,wBAAgB,gCAAgC,IAAI,6BAA6B,CAGhF"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Python Automation Runtime - Python 自动化任务代码容器
|
|
4
|
+
// ============================================================
|
|
5
|
+
// 与 NodeAutomationRuntimeRunner 对等:构建 Python 引导脚本、注入 _sb.py
|
|
6
|
+
// 基础能力库(含 agent.ask)、执行并解析结果。
|
|
7
|
+
// ============================================================
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.PythonAutomationRuntimeRunner = void 0;
|
|
43
|
+
exports.getPythonAutomationRuntimeRunner = getPythonAutomationRuntimeRunner;
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const fs = __importStar(require("fs/promises"));
|
|
46
|
+
const process_code_sandbox_ts_1 = require("../sandbox/process-code-sandbox.js");
|
|
47
|
+
const data_dir_ts_1 = require("../utils/data-dir.js");
|
|
48
|
+
const python_prelude_ts_1 = require("./python-prelude.js");
|
|
49
|
+
const node_task_validator_ts_1 = require("./node-task-validator.js");
|
|
50
|
+
class PythonAutomationRuntimeRunner {
|
|
51
|
+
baseDir;
|
|
52
|
+
constructor(options = {}) {
|
|
53
|
+
this.baseDir = options.baseDir || (0, data_dir_ts_1.getProjectDataPath)('automation-code-runs');
|
|
54
|
+
}
|
|
55
|
+
async execute(taskPackage, options) {
|
|
56
|
+
const validation = (0, node_task_validator_ts_1.validateNodeAutomationTaskPackage)(taskPackage);
|
|
57
|
+
if (!validation.valid) {
|
|
58
|
+
return {
|
|
59
|
+
stdout: '',
|
|
60
|
+
stderr: validation.issues.map(issue => `[${issue.code}] ${issue.message}`).join('\n'),
|
|
61
|
+
exitCode: 1,
|
|
62
|
+
duration: 0,
|
|
63
|
+
files: [],
|
|
64
|
+
logs: [],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const runId = options.runId || Date.now();
|
|
68
|
+
const sandboxId = `automation_${options.taskId}_${runId}`;
|
|
69
|
+
const sandbox = new process_code_sandbox_ts_1.ProcessCodeSandbox(sandboxId, {
|
|
70
|
+
rootDir: path.join(this.baseDir, sandboxId),
|
|
71
|
+
commandRestriction: true,
|
|
72
|
+
});
|
|
73
|
+
await sandbox.init();
|
|
74
|
+
// 写入 Python 基础能力库 _sb.py(注入真实 agent 端点)
|
|
75
|
+
const agentEndpoint = options.agentEndpoint || process.env.A2A_BASE_URL || '';
|
|
76
|
+
const preludeSource = python_prelude_ts_1.PYTHON_PRELUDE_SOURCE.replace(/__AGENT_ENDPOINT__/g, agentEndpoint);
|
|
77
|
+
const scriptsDir = path.join(sandbox.rootDir, '_scripts');
|
|
78
|
+
await fs.writeFile(path.join(scriptsDir, '_sb.py'), preludeSource, 'utf-8');
|
|
79
|
+
const logs = [];
|
|
80
|
+
const payload = {
|
|
81
|
+
taskPackage,
|
|
82
|
+
inputs: options.inputs || {},
|
|
83
|
+
env: this.buildEnv(taskPackage, options.env || {}),
|
|
84
|
+
taskId: options.taskId,
|
|
85
|
+
runId,
|
|
86
|
+
workspace: options.workspace,
|
|
87
|
+
agentEndpoint,
|
|
88
|
+
};
|
|
89
|
+
const script = this.buildBootstrapScript(payload);
|
|
90
|
+
const result = await sandbox.execute(script, 'python', options.timeoutMs || taskPackage.runtimeConfig?.timeoutMs || 120000);
|
|
91
|
+
const parsed = this.parseRuntimeResult(result.stdout);
|
|
92
|
+
// 检测错误标记(脚本抛异常时会输出 __NODE_AUTOMATION_ERROR__)
|
|
93
|
+
const errorInfo = this.parseRuntimeError(result.stdout);
|
|
94
|
+
const exitCode = errorInfo ? 1 : result.exitCode;
|
|
95
|
+
const stderr = errorInfo
|
|
96
|
+
? errorInfo.message + (result.stderr ? '\n' + result.stderr : '')
|
|
97
|
+
: result.stderr;
|
|
98
|
+
// 剥离内部结果/错误标记行,避免展示给用户
|
|
99
|
+
const cleanStdout = this.stripMarkerLines(result.stdout);
|
|
100
|
+
return {
|
|
101
|
+
stdout: cleanStdout,
|
|
102
|
+
stderr,
|
|
103
|
+
exitCode,
|
|
104
|
+
duration: result.duration,
|
|
105
|
+
files: result.files,
|
|
106
|
+
logs: [...logs, ...parsed.logs, ...(errorInfo?.logs || [])],
|
|
107
|
+
result: parsed.result,
|
|
108
|
+
artifacts: result.files,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/** 剥离 stdout 中的内部结果/错误标记行,保留用户 print 输出 */
|
|
112
|
+
stripMarkerLines(stdout) {
|
|
113
|
+
return stdout
|
|
114
|
+
.split('\n')
|
|
115
|
+
.filter(line => !line.startsWith('__NODE_AUTOMATION_RESULT__') && !line.startsWith('__NODE_AUTOMATION_ERROR__'))
|
|
116
|
+
.join('\n')
|
|
117
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
118
|
+
.trim();
|
|
119
|
+
}
|
|
120
|
+
buildEnv(taskPackage, env) {
|
|
121
|
+
const allowed = new Set(taskPackage.runtimeConfig?.envKeys || []);
|
|
122
|
+
const safeEnv = {};
|
|
123
|
+
for (const key of allowed) {
|
|
124
|
+
if (env[key])
|
|
125
|
+
safeEnv[key] = env[key];
|
|
126
|
+
}
|
|
127
|
+
safeEnv.PYTHONUNBUFFERED = '1';
|
|
128
|
+
return safeEnv;
|
|
129
|
+
}
|
|
130
|
+
buildBootstrapScript(payload) {
|
|
131
|
+
// 将 payload 序列化为 JSON 字符串,在 Python 端用 json.loads 解析,
|
|
132
|
+
// 避免 JSON 的 null/true/false 与 Python 的 None/True/False 语法不兼容。
|
|
133
|
+
const payloadJson = JSON.stringify(JSON.stringify({
|
|
134
|
+
task: payload.taskPackage,
|
|
135
|
+
inputs: payload.inputs,
|
|
136
|
+
env: payload.env,
|
|
137
|
+
taskId: payload.taskId,
|
|
138
|
+
runId: payload.runId ?? null,
|
|
139
|
+
workspace: payload.workspace ?? null,
|
|
140
|
+
agentEndpoint: payload.agentEndpoint,
|
|
141
|
+
}));
|
|
142
|
+
return `# -*- coding: utf-8 -*-
|
|
143
|
+
import os
|
|
144
|
+
import sys
|
|
145
|
+
import json
|
|
146
|
+
import time
|
|
147
|
+
import traceback
|
|
148
|
+
import builtins
|
|
149
|
+
|
|
150
|
+
# 让入口模块(位于沙箱根目录)与 _scripts(_sb.py 所在)都可被 import
|
|
151
|
+
sys.path.insert(0, os.getcwd())
|
|
152
|
+
sys.path.insert(0, os.path.join(os.getcwd(), '_scripts'))
|
|
153
|
+
|
|
154
|
+
# 导入基础能力库(与引导脚本同在 _scripts/ 目录)
|
|
155
|
+
import _sb as sb
|
|
156
|
+
|
|
157
|
+
# 将 sb 注入 builtins,使所有用户模块均可直接使用 sb.xxx(与 Node 端 global.sb 一致)
|
|
158
|
+
builtins.sb = sb
|
|
159
|
+
|
|
160
|
+
# 解析运行时 payload(JSON 字符串 -> Python 字典)
|
|
161
|
+
__data = json.loads(${payloadJson})
|
|
162
|
+
__task = __data["task"]
|
|
163
|
+
|
|
164
|
+
__logs = []
|
|
165
|
+
def __log(level, message, meta=None):
|
|
166
|
+
__logs.append({"level": level, "message": str(message), "meta": meta, "timestamp": time.strftime("%Y-%m-%dT%H:%M:%S")})
|
|
167
|
+
|
|
168
|
+
# 把用户源码文件写入工作目录
|
|
169
|
+
for __file, __content in (__task.get("sourceFiles") or {}).items():
|
|
170
|
+
__target = os.path.join(os.getcwd(), __file)
|
|
171
|
+
__rel = os.path.relpath(__target, os.getcwd())
|
|
172
|
+
if __rel.startswith("..") or os.path.isabs(__rel):
|
|
173
|
+
raise RuntimeError("Unsafe source path: " + __file)
|
|
174
|
+
os.makedirs(os.path.dirname(__target) or ".", exist_ok=True)
|
|
175
|
+
with open(__target, "w", encoding="utf-8") as __f:
|
|
176
|
+
__f.write(__content)
|
|
177
|
+
|
|
178
|
+
# 构造 context(与 Node 端结构对齐)
|
|
179
|
+
__context = {
|
|
180
|
+
"taskId": __data["taskId"],
|
|
181
|
+
"runId": __data["runId"],
|
|
182
|
+
"inputs": __data["inputs"],
|
|
183
|
+
"env": __data["env"],
|
|
184
|
+
"workspace": __data["workspace"],
|
|
185
|
+
"logger": sb._Logger(__log),
|
|
186
|
+
"artifacts": type("A", (), {
|
|
187
|
+
"writeText": staticmethod(lambda f, c: sb.write_text(f, str(c))),
|
|
188
|
+
"writeJson": staticmethod(lambda f, d: sb.write_json(f, d)),
|
|
189
|
+
})(),
|
|
190
|
+
"agent": sb.agent,
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
def __run():
|
|
194
|
+
__entry = __task["entry"]
|
|
195
|
+
__mod_name = os.path.splitext(__entry)[0].replace(os.sep, ".")
|
|
196
|
+
import importlib
|
|
197
|
+
__mod = importlib.import_module(__mod_name)
|
|
198
|
+
if not hasattr(__mod, "run"):
|
|
199
|
+
raise RuntimeError("Python automation entry must define run(context)")
|
|
200
|
+
return __mod.run(__context)
|
|
201
|
+
|
|
202
|
+
try:
|
|
203
|
+
__result = __run()
|
|
204
|
+
print("__NODE_AUTOMATION_RESULT__" + json.dumps({"result": __result, "logs": __logs}, ensure_ascii=False, default=str))
|
|
205
|
+
except Exception as e:
|
|
206
|
+
__log("error", str(e))
|
|
207
|
+
traceback.print_exc()
|
|
208
|
+
print("__NODE_AUTOMATION_ERROR__" + json.dumps({"message": str(e), "logs": __logs}, ensure_ascii=False, default=str))
|
|
209
|
+
sys.exit(1)
|
|
210
|
+
`;
|
|
211
|
+
}
|
|
212
|
+
parseRuntimeResult(stdout) {
|
|
213
|
+
const resultLine = stdout.split('\n').find(line => line.startsWith('__NODE_AUTOMATION_RESULT__'));
|
|
214
|
+
if (!resultLine)
|
|
215
|
+
return { logs: [] };
|
|
216
|
+
try {
|
|
217
|
+
const parsed = JSON.parse(resultLine.replace('__NODE_AUTOMATION_RESULT__', ''));
|
|
218
|
+
return { result: parsed.result, logs: parsed.logs || [] };
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
return { logs: [] };
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
parseRuntimeError(stdout) {
|
|
225
|
+
const errorLine = stdout.split('\n').find(line => line.startsWith('__NODE_AUTOMATION_ERROR__'));
|
|
226
|
+
if (!errorLine)
|
|
227
|
+
return null;
|
|
228
|
+
try {
|
|
229
|
+
const parsed = JSON.parse(errorLine.replace('__NODE_AUTOMATION_ERROR__', ''));
|
|
230
|
+
return { message: parsed.message || 'Python automation execution failed', logs: parsed.logs || [] };
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
return { message: 'Python automation execution failed', logs: [] };
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
exports.PythonAutomationRuntimeRunner = PythonAutomationRuntimeRunner;
|
|
238
|
+
let defaultRunner = null;
|
|
239
|
+
function getPythonAutomationRuntimeRunner() {
|
|
240
|
+
if (!defaultRunner)
|
|
241
|
+
defaultRunner = new PythonAutomationRuntimeRunner();
|
|
242
|
+
return defaultRunner;
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=python-task-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python-task-runtime.js","sourceRoot":"","sources":["../../../src/automation/python-task-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ export declare class CalendarAdapter implements DataSourceAdapter {
|
|
|
6
6
|
testConnection(config: DataSourceConfig): Promise<ConnectionTestResult>;
|
|
7
7
|
discoverTools(config: DataSourceConfig): Promise<DiscoveredTool[]>;
|
|
8
8
|
generateManifest(config: DataSourceConfig, _tools?: DiscoveredTool[]): Record<string, unknown>;
|
|
9
|
-
generateMCPServerConfigs(_config: DataSourceConfig,
|
|
9
|
+
generateMCPServerConfigs(_config: DataSourceConfig, _tools?: DiscoveredTool[]): MCPServerConfig[];
|
|
10
10
|
private testLocal;
|
|
11
11
|
private testCalDAV;
|
|
12
12
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"calendar-adapter.d.ts","sourceRoot":"","sources":["../../../src/connectors/calendar-adapter.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB,qBAAa,eAAgB,YAAW,iBAAiB;IACvD,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IACpC,QAAQ,CAAC,KAAK,kBAAQ;IACtB,QAAQ,CAAC,OAAO,WAAuB;IAEjC,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAMvE,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA+ExE,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAmB9F,wBAAwB,CAAC,OAAO,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"calendar-adapter.d.ts","sourceRoot":"","sources":["../../../src/connectors/calendar-adapter.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EAChB,MAAM,aAAa,CAAC;AAErB,qBAAa,eAAgB,YAAW,iBAAiB;IACvD,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IACpC,QAAQ,CAAC,KAAK,kBAAQ;IACtB,QAAQ,CAAC,OAAO,WAAuB;IAEjC,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAMvE,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA+ExE,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,cAAc,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAmB9F,wBAAwB,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,cAAc,EAAE,GAAG,eAAe,EAAE;YAInF,SAAS;YAWT,UAAU;CA0BzB"}
|
|
@@ -150,16 +150,8 @@ class CalendarAdapter {
|
|
|
150
150
|
},
|
|
151
151
|
};
|
|
152
152
|
}
|
|
153
|
-
generateMCPServerConfigs(_config,
|
|
154
|
-
return [
|
|
155
|
-
{
|
|
156
|
-
name: 'calendar-tools',
|
|
157
|
-
transport: 'stdio',
|
|
158
|
-
command: 'node',
|
|
159
|
-
args: ['-e', '/* MCP server for calendar */'],
|
|
160
|
-
tools: tools || [],
|
|
161
|
-
},
|
|
162
|
-
];
|
|
153
|
+
generateMCPServerConfigs(_config, _tools) {
|
|
154
|
+
return [];
|
|
163
155
|
}
|
|
164
156
|
async testLocal(config) {
|
|
165
157
|
const start = Date.now();
|