From ecc9765996546cfca9a9b1315f880fb7b3ae7bd7 Mon Sep 17 00:00:00 2001 From: Simbiot Harness Date: Fri, 16 Oct 2026 07:15:46 +0000 Subject: [PATCH] =?UTF-8?q?member=5Fcreate=20=D0=B2=20=D0=BE=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=B0=D0=BD=D0=B8=D1=8F=D1=85=20=D1=82=D1=83=D0=BB=D0=B0?= =?UTF-8?q?=20=D0=BF=D0=BE=D1=80=D1=82=D0=B0=D0=BB=D0=B0=20(t-261016064519?= =?UTF-8?q?):=20describe=5Ftools=20+=20=D0=BF=D1=80=D0=BE=D0=BC=D0=BF?= =?UTF-8?q?=D1=82=D1=8B=20min/hour?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- harness/levels.py | 8 ++++++-- harness/portal_mcp.py | 26 +++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/harness/levels.py b/harness/levels.py index 7a16e8c..2e40b3e 100644 --- a/harness/levels.py +++ b/harness/levels.py @@ -86,7 +86,9 @@ LEVELS = { "(MCP): booking_slots/booking_create — свободные слоты и создание " "звонка с Алексом (jitsi-ссылка, гостю письмо, запись и транскрипция " "автоматом), list_calls/get_call — прошедшие звонки и саммари, " - "list_members/projects_list/list_agents/treasury_status/list_events — " + "list_members/member_create(email[,name]) — реестр членов и " + "создание аккаунта с magic-link (только агентам председателя), " + "projects_list/list_agents/treasury_status/list_events — " "реестры, казна, лента. Когда Alex просит назначить/перенести звонок " "или «посмотреть расписание» — это portal_mcp (до 4 вызовов за тик): " "сначала booking_slots (arguments '{\"type\": \"call\"}'), потом " @@ -135,7 +137,9 @@ LEVELS = { "Инструмент portal_mcp — живой портал кооператива (MCP cil.by): " "booking_slots/booking_create (звонки с Алексом: слот → создание " "jitsi-звонка со ссылкой, гостю письмо), list_calls/get_call, " - "list_members/projects_list/list_agents, treasury_status, list_events. " + "list_members/member_create (создание аккаунта члена с magic-link, " + "только агентам председателя), projects_list/list_agents, " + "treasury_status, list_events. " "Просьбы про назначение/перенос звонков и «что по расписанию» — " "через него (до 4 вызовов за тик). НЕ создавай звонки без явной " "просьбы в чате; деньги-тулы (product_create/product_set_mode) " diff --git a/harness/portal_mcp.py b/harness/portal_mcp.py index 1cd8ad6..61607c8 100644 --- a/harness/portal_mcp.py +++ b/harness/portal_mcp.py @@ -120,6 +120,7 @@ def _known_tools() -> list: def _trace(level, trace_id, payload: dict): """Трейс MCP-вызова в стор — spend/observability едины с LLM-тиками.""" + _log_jsonl(level, trace_id, payload) if not (level and trace_id): return try: @@ -133,6 +134,20 @@ def _trace(level, trace_id, payload: dict): pass # трейс — best effort, не валить тик +# t-261015091108: журнал всех MCP-вызовов (кто/что/аргументы/время) — JSONL +def _log_jsonl(level, trace_id, payload: dict): + import datetime + try: + path = os.path.join(_paths.home(), "mcp_calls.log") + rec = {"ts": datetime.datetime.now(datetime.timezone.utc).isoformat(timespec="seconds"), + "level": level or "unknown", "trace_id": trace_id or "", + **payload} + with open(path, "a", encoding="utf-8") as f: + f.write(json.dumps(rec, ensure_ascii=False) + "\n") + except Exception: + pass # журнал — best effort, не валить тик + + _trace_log: list = [] @@ -159,11 +174,18 @@ def call_tool(name: str, arguments=None, level: str = None, """ started = time.time() ok, result = False, "" + _log_args = {"raw": str(arguments)[:500]} # t-261015091108: аргументы в лог + try: + args = _coerce_arguments(arguments) + _log_args = args + except Exception: + pass def _finish(res: str, _ok: bool) -> str: _trace(level, trace_id, { "tool": name, "ok": _ok, "ms": int((time.time() - started) * 1000), + "arguments": _log_args, "result_preview": res[:300], }) return res @@ -222,6 +244,8 @@ def describe_tools(max_names: int = 12) -> str: "kind='call'|'session') — создать jitsi-звонок со ссылкой (гостю " "письмо, Алексу — в TG, запись+транскрипция автоматом); booking_cancel" "(meeting_id); list_calls/get_call — прошедшие звонки и их саммари; " - "list_members/projects_list/list_agents/treasury_status/list_events — " + "list_members/member_create(email[,name]) — реестр членов и создание " + "аккаунта с magic-link письмом (member_create — только агентам " + "председателя); projects_list/list_agents/treasury_status/list_events — " "реестры и казна; whoami/report_task/report_event/read_context — " "идентичность и лента портала.")