[
  {
    "path": "src_agent/main.py",
    "name": "configure_logging",
    "line": 19,
    "end": 26,
    "lines": 8,
    "language": "python",
    "branches": 0,
    "calls": [
      "logging.basicConfig",
      "os.getenv",
      "os.getenv('LOG_LEVEL', 'INFO').upper"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/main.py",
    "name": "main",
    "line": 29,
    "end": 52,
    "lines": 24,
    "language": "python",
    "branches": 1,
    "calls": [
      "AgentServer",
      "asyncio.run",
      "bootstrap",
      "configure_logging",
      "logger.exception",
      "logger.info",
      "logging.getLogger",
      "server.run",
      "sys.exit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/model_capture.py",
    "name": "ModelCapture.__init__",
    "line": 10,
    "end": 12,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/model_capture.py",
    "name": "ModelCapture.start",
    "line": 14,
    "end": 16,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "self.nc.subscribe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/model_capture.py",
    "name": "ModelCapture.receive",
    "line": 18,
    "end": 36,
    "lines": 19,
    "language": "python",
    "branches": 4,
    "calls": [
      "UUID",
      "ValueError",
      "json.dumps",
      "json.dumps(result).encode",
      "json.loads",
      "len",
      "message.respond",
      "self.requests.model_input",
      "self.requests.owns_generation",
      "str",
      "value.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/model_capture.py",
    "name": "ModelCapture.close",
    "line": 38,
    "end": 40,
    "lines": 3,
    "language": "python",
    "branches": 1,
    "calls": [
      "self.subscription.unsubscribe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/nats_model.py",
    "name": "wire_messages",
    "line": 18,
    "end": 48,
    "lines": 31,
    "language": "python",
    "branches": 15,
    "calls": [
      "''.join",
      "'\\n\\n'.join",
      "RequestStopped",
      "dict.fromkeys",
      "instructions.append",
      "isinstance",
      "json.dumps",
      "len",
      "message.metadata.get",
      "p.args_as_json_str",
      "wire.append",
      "wire.insert"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/nats_model.py",
    "name": "NatsModel.__init__",
    "line": 52,
    "end": 54,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "super",
      "super().__init__"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/nats_model.py",
    "name": "NatsModel.model_name",
    "line": 57,
    "end": 58,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/nats_model.py",
    "name": "NatsModel.system",
    "line": 61,
    "end": 62,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/nats_model.py",
    "name": "NatsModel.request",
    "line": 64,
    "end": 115,
    "lines": 52,
    "language": "python",
    "branches": 13,
    "calls": [
      "AgentStepData.model_validate",
      "LlmRequest",
      "LlmResponse.model_validate_json",
      "ModelResponse",
      "RequestStopped",
      "RequestUsage",
      "TextPart",
      "ToolCallPart",
      "UUID",
      "any",
      "bool",
      "collector.get",
      "context.headers",
      "context.remaining",
      "data.usage.get",
      "execution.get",
      "generation_event",
      "getattr",
      "isinstance",
      "json.loads",
      "len",
      "now_ts_ms",
      "req.model_dump_json",
      "req.model_dump_json().encode",
      "self.nc.request",
      "stage",
      "str",
      "sum",
      "summary.merge_model",
      "uuid4",
      "wire_messages"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/service.py",
    "name": "AgentServer.__init__",
    "line": 25,
    "end": 34,
    "lines": 10,
    "language": "python",
    "branches": 0,
    "calls": [
      "FairPool",
      "asyncio.Event",
      "str",
      "uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/service.py",
    "name": "AgentServer.connect",
    "line": 36,
    "end": 42,
    "lines": 7,
    "language": "python",
    "branches": 0,
    "calls": [
      "Database",
      "nats.connect",
      "observe",
      "self.db.acquire_agent_owner",
      "self.db.connect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/service.py",
    "name": "AgentServer.subscribe",
    "line": 44,
    "end": 58,
    "lines": 15,
    "language": "python",
    "branches": 0,
    "calls": [
      "ModelCapture",
      "Observation",
      "WidgetRequests",
      "WidgetStore",
      "asyncio.create_task",
      "meter.create_observable_gauge",
      "os.getenv",
      "self.model_capture.start",
      "self.nc.subscribe",
      "self.watch_owner",
      "self.widget_requests.endpoint.start",
      "store.initialize",
      "store.interrupt"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/service.py",
    "name": "AgentServer.handle_health",
    "line": 60,
    "end": 74,
    "lines": 15,
    "language": "python",
    "branches": 4,
    "calls": [
      "asyncio.timeout",
      "bool",
      "json.dumps",
      "json.dumps(value).encode",
      "len",
      "msg.respond",
      "self.db.fetchval",
      "self.db.owns_agent_epoch",
      "self.stop_event.is_set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/service.py",
    "name": "AgentServer.watch_owner",
    "line": 76,
    "end": 88,
    "lines": 13,
    "language": "python",
    "branches": 4,
    "calls": [
      "asyncio.sleep",
      "asyncio.timeout",
      "self.db.owns_agent_epoch",
      "self.stop_event.is_set",
      "self.stop_event.set",
      "self.widget_requests.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/service.py",
    "name": "AgentServer.setup_signal_handlers",
    "line": 90,
    "end": 93,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "asyncio.get_running_loop",
      "loop.add_signal_handler"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/service.py",
    "name": "AgentServer.shutdown",
    "line": 95,
    "end": 120,
    "lines": 26,
    "language": "python",
    "branches": 9,
    "calls": [
      "asyncio.gather",
      "asyncio.timeout",
      "logger.warning",
      "operation",
      "operations.append",
      "operations.extend",
      "self.owner_task.cancel",
      "self.stop_event.set",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/service.py",
    "name": "AgentServer.run",
    "line": 122,
    "end": 129,
    "lines": 8,
    "language": "python",
    "branches": 1,
    "calls": [
      "self.connect",
      "self.setup_signal_handlers",
      "self.shutdown",
      "self.stop_event.wait",
      "self.subscribe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/utils/db.py",
    "name": "Database.connect",
    "line": 17,
    "end": 26,
    "lines": 10,
    "language": "python",
    "branches": 1,
    "calls": [
      "asyncpg.create_pool",
      "self._ensure_owner"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/utils/db.py",
    "name": "Database._ensure_owner",
    "line": 28,
    "end": 31,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "self.execute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/utils/db.py",
    "name": "Database.close",
    "line": 33,
    "end": 46,
    "lines": 14,
    "language": "python",
    "branches": 5,
    "calls": [
      "connection.execute",
      "connection.is_closed",
      "pool.close",
      "pool.release"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/utils/db.py",
    "name": "Database.execute",
    "line": 48,
    "end": 52,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "RuntimeError",
      "conn.execute",
      "self._pool.acquire"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/utils/db.py",
    "name": "Database.fetchval",
    "line": 54,
    "end": 58,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "RuntimeError",
      "conn.fetchval",
      "self._pool.acquire"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/utils/db.py",
    "name": "Database.acquire_agent_owner",
    "line": 60,
    "end": 73,
    "lines": 14,
    "language": "python",
    "branches": 3,
    "calls": [
      "RuntimeError",
      "connection.execute",
      "connection.fetchval",
      "self._pool.acquire",
      "self._pool.release"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/utils/db.py",
    "name": "Database.owns_agent_epoch",
    "line": 75,
    "end": 80,
    "lines": 6,
    "language": "python",
    "branches": 1,
    "calls": [
      "bool",
      "self._owner_connection.is_closed",
      "self.fetchval"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "diagnostic",
    "line": 97,
    "end": 100,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "int",
      "span.get_span_context",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests.__init__",
    "line": 104,
    "end": 112,
    "lines": 9,
    "language": "python",
    "branches": 0,
    "calls": [
      "Endpoint",
      "NatsModel",
      "set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests.owns_generation",
    "line": 114,
    "end": 116,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "bool",
      "self.records.get",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests.model_input",
    "line": 118,
    "end": 123,
    "lines": 6,
    "language": "python",
    "branches": 1,
    "calls": [
      "self.debug",
      "self.owns_generation",
      "self.records.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests.debug",
    "line": 125,
    "end": 130,
    "lines": 6,
    "language": "python",
    "branches": 1,
    "calls": [
      "debug_owner",
      "debug_publish"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests.dispatch",
    "line": 132,
    "end": 147,
    "lines": 16,
    "language": "python",
    "branches": 6,
    "calls": [
      "WidgetBinding.model_validate",
      "data.get",
      "data.get('message', {}).get",
      "debug_owner",
      "debug_publish",
      "self.command",
      "self.records.get",
      "str",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests.cancel_model",
    "line": 149,
    "end": 158,
    "lines": 10,
    "language": "python",
    "branches": 2,
    "calls": [
      "json.dumps",
      "json.dumps({'request_id': record.request_id, 'session_id': record.session_id, 'attempt_id': record.context.attempt_id}).encode",
      "logger.warning",
      "self.nc.request",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests.event",
    "line": 160,
    "end": 167,
    "lines": 8,
    "language": "python",
    "branches": 1,
    "calls": [
      "bounded_json",
      "max",
      "self.nc.publish",
      "str",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests.command",
    "line": 169,
    "end": 178,
    "lines": 10,
    "language": "python",
    "branches": 3,
    "calls": [
      "RequestStopped",
      "data.get",
      "self._command",
      "self.stopping"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests._command",
    "line": 180,
    "end": 284,
    "lines": 105,
    "language": "python",
    "branches": 27,
    "calls": [
      "(msg.headers or {}).get",
      "ExecutionContext.from_headers",
      "Message.model_validate",
      "Record",
      "RequestStopped",
      "UUID",
      "ValueError",
      "WidgetBinding.model_validate",
      "WidgetToolResult.model_validate",
      "asyncio.create_task",
      "asyncio.gather",
      "asyncio.timeout",
      "bool",
      "check_admission",
      "command_hash",
      "context.remaining",
      "cursor.get",
      "data.get",
      "diagnostic",
      "dict",
      "future.done",
      "future.set_result",
      "int",
      "json.loads",
      "len",
      "outcome.model_dump",
      "propagator.extract",
      "record.calls.get",
      "record.root.end",
      "record.signatures.get",
      "response",
      "self.finish",
      "self.pool.activate",
      "self.pool.cancel",
      "self.pool.reserve",
      "self.records.get",
      "self.records.pop",
      "self.run",
      "self.stopping",
      "self.store.admit",
      "self.store.diagnostic",
      "self.store.finish",
      "self.tasks.add",
      "str",
      "task.add_done_callback",
      "time.time",
      "tracer.start_span",
      "traffic_context.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests._command.check_admission",
    "line": 204,
    "end": 207,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "RequestStopped",
      "context.remaining",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests.run",
    "line": 286,
    "end": 407,
    "lines": 122,
    "language": "python",
    "branches": 23,
    "calls": [
      "Agent",
      "DeferredToolResults",
      "Draft202012Validator",
      "Draft202012Validator(tool.input_schema).iter_errors",
      "ExternalToolset",
      "RequestStopped",
      "RunUsage",
      "ToolDefinition",
      "UsageLimits",
      "activation.__enter__",
      "activation.__exit__",
      "agent.run",
      "asyncio.get_running_loop",
      "asyncio.get_running_loop().create_future",
      "asyncio.timeout",
      "asyncio.wait_for",
      "call.args_as_dict",
      "collector.reset",
      "collector.set",
      "cursor.get",
      "cursor.reset",
      "cursor.set",
      "data.items",
      "dict",
      "execution.reset",
      "execution.set",
      "generation_events.reset",
      "generation_events.set",
      "getattr",
      "isinstance",
      "json.dumps",
      "list",
      "max",
      "metadata.get",
      "min",
      "outcomes[call.tool_call_id].get",
      "record.calls.pop",
      "record.context.remaining",
      "record.generations.add",
      "record.tool_contexts.pop",
      "remember_diagnostics",
      "restore_diagnostics",
      "result.all_messages",
      "self.cancel_model",
      "self.debug",
      "self.event",
      "self.store.running",
      "span.set_attribute",
      "stage",
      "str",
      "time.monotonic",
      "tool_generations.get",
      "tools.get",
      "tools.values",
      "trace.use_span",
      "traffic_context.get",
      "traffic_context.reset",
      "traffic_context.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests.run.remember_diagnostics",
    "line": 297,
    "end": 299,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "cursor.get",
      "dict",
      "traffic_context.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests.run.restore_diagnostics",
    "line": 301,
    "end": 303,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "cursor.set",
      "traffic_context.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests.run.lifecycle",
    "line": 307,
    "end": 319,
    "lines": 13,
    "language": "python",
    "branches": 3,
    "calls": [
      "data.items",
      "record.generations.add",
      "remember_diagnostics",
      "self.debug",
      "self.event"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests.finish",
    "line": 409,
    "end": 445,
    "lines": 37,
    "language": "python",
    "branches": 6,
    "calls": [
      "asyncio.timeout",
      "cursor.reset",
      "cursor.set",
      "isinstance",
      "public_error",
      "record.calls.clear",
      "record.results.clear",
      "record.root.end",
      "record.root.set_attribute",
      "record.signatures.clear",
      "self.event",
      "self.records.pop",
      "self.store.finish",
      "self.terminal_diagnostics",
      "time.monotonic",
      "traffic_context.reset",
      "traffic_context.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests.terminal_diagnostics",
    "line": 447,
    "end": 450,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "max",
      "record.summary.snapshot",
      "record.summary.values.update",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_agent/widget_requests.py",
    "name": "WidgetRequests.close",
    "line": 452,
    "end": 459,
    "lines": 8,
    "language": "python",
    "branches": 2,
    "calls": [
      "asyncio.gather",
      "list",
      "self.endpoint.close",
      "self.pool.cancel",
      "self.records.clear",
      "self.records.values"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_messages.py",
    "name": "value",
    "line": 11,
    "end": 12,
    "lines": 2,
    "language": "python",
    "branches": 1,
    "calls": [
      "isinstance",
      "json.loads"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_messages.py",
    "name": "window_bounds",
    "line": 15,
    "end": 52,
    "lines": 38,
    "language": "python",
    "branches": 12,
    "calls": [
      "any",
      "c.get",
      "len",
      "list",
      "max",
      "range",
      "sorted",
      "type",
      "windows.values"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_messages.py",
    "name": "bounds",
    "line": 55,
    "end": 65,
    "lines": 11,
    "language": "python",
    "branches": 0,
    "calls": [
      "c.fetch",
      "str",
      "value",
      "window_bounds"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_messages.py",
    "name": "selected",
    "line": 68,
    "end": 72,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "RequestStopped",
      "c.fetchrow"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_messages.py",
    "name": "stored_bounds",
    "line": 75,
    "end": 90,
    "lines": 16,
    "language": "python",
    "branches": 3,
    "calls": [
      "phrase.get",
      "result.get",
      "source.get",
      "type",
      "value"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_messages.py",
    "name": "refresh_bounds",
    "line": 93,
    "end": 104,
    "lines": 12,
    "language": "python",
    "branches": 2,
    "calls": [
      "bounds",
      "c.execute",
      "c.fetchval",
      "span.get",
      "stored_bounds"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_messages.py",
    "name": "backfill_terminal_bounds",
    "line": 107,
    "end": 127,
    "lines": 21,
    "language": "python",
    "branches": 5,
    "calls": [
      "UUID",
      "ValueError",
      "c.execute",
      "c.fetch",
      "c.fetchval",
      "c.transaction",
      "dict",
      "pool.acquire",
      "refresh_bounds"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_messages.py",
    "name": "source_range",
    "line": 130,
    "end": 145,
    "lines": 16,
    "language": "python",
    "branches": 5,
    "calls": [
      "sample_count",
      "span.get",
      "stored_bounds"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_messages.py",
    "name": "query",
    "line": 148,
    "end": 190,
    "lines": 43,
    "language": "python",
    "branches": 10,
    "calls": [
      "RequestStopped",
      "c.fetch",
      "items.append",
      "len",
      "min",
      "read_chunk",
      "selected",
      "serialize",
      "source_range",
      "stored_bounds",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_messages.py",
    "name": "verify_chunk",
    "line": 193,
    "end": 217,
    "lines": 25,
    "language": "python",
    "branches": 7,
    "calls": [
      "RequestStopped",
      "ValueError",
      "any",
      "bytes",
      "dict",
      "dict(chunk_index=chunk['chunk_index'], first_seq=chunk['first_seq'], last_seq=chunk['last_seq'], bytes=len(raw), sha256=chunk['sha256']).items",
      "enumerate",
      "hashlib.sha256",
      "hashlib.sha256(raw).hexdigest",
      "len",
      "manifest.get",
      "opus_packet",
      "p.get",
      "sum",
      "value"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_messages.py",
    "name": "read_chunk",
    "line": 220,
    "end": 259,
    "lines": 40,
    "language": "python",
    "branches": 12,
    "calls": [
      "RequestStopped",
      "base64.b64encode",
      "base64.b64encode(raw).decode",
      "base64.b64encode(result).decode",
      "bytearray",
      "c.fetch",
      "decoded_opus",
      "hashlib.sha256",
      "hashlib.sha256(raw).hexdigest",
      "hashlib.sha256(result).hexdigest",
      "len",
      "max",
      "min",
      "packets.append",
      "raw.extend",
      "result.extend",
      "verify_chunk"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_messages.py",
    "name": "decoded_opus",
    "line": 262,
    "end": 283,
    "lines": 22,
    "language": "python",
    "branches": 8,
    "calls": [
      "OpusDecoder",
      "RequestStopped",
      "asyncio.sleep",
      "db.fetch",
      "decoder.close",
      "decoder.decode",
      "verify_chunk"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_messages.py",
    "name": "settings",
    "line": 286,
    "end": 315,
    "lines": 30,
    "language": "python",
    "branches": 8,
    "calls": [
      "c.fetch",
      "c.fetchrow",
      "len",
      "observed.get",
      "sample_count",
      "sequence",
      "serialize",
      "span.get",
      "value"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_messages.py",
    "name": "settings.sequence",
    "line": 297,
    "end": 303,
    "lines": 7,
    "language": "python",
    "branches": 3,
    "calls": [
      "value"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_messages.py",
    "name": "main",
    "line": 330,
    "end": 332,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "asyncpg.create_pool",
      "backfill_terminal_bounds",
      "json.dumps",
      "print"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_replay.py",
    "name": "ReplayManager.__init__",
    "line": 14,
    "end": 16,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_replay.py",
    "name": "ReplayManager.rpc",
    "line": 18,
    "end": 24,
    "lines": 7,
    "language": "python",
    "branches": 1,
    "calls": [
      "RequestStopped",
      "getattr",
      "json.dumps",
      "json.dumps(data).encode",
      "json.loads",
      "nc.request",
      "value['data'].get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_replay.py",
    "name": "ReplayManager.release",
    "line": 26,
    "end": 40,
    "lines": 15,
    "language": "python",
    "branches": 5,
    "calls": [
      "asyncio.current_task",
      "asyncio.gather",
      "cleanup.cancel",
      "current.get",
      "self.api.bindings.pop",
      "self.rpc",
      "task.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_replay.py",
    "name": "ReplayManager.expire",
    "line": 42,
    "end": 46,
    "lines": 5,
    "language": "python",
    "branches": 3,
    "calls": [
      "asyncio.sleep",
      "self.release",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_replay.py",
    "name": "ReplayManager.read_range",
    "line": 48,
    "end": 75,
    "lines": 28,
    "language": "python",
    "branches": 8,
    "calls": [
      "RequestStopped",
      "UUID",
      "asyncio.timeout",
      "b''.join",
      "c.fetchrow",
      "current.get",
      "decoded_opus",
      "len",
      "max",
      "min",
      "parts.append",
      "store.pool.acquire",
      "verify_chunk"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_replay.py",
    "name": "ReplayManager.ranges",
    "line": 77,
    "end": 102,
    "lines": 26,
    "language": "python",
    "branches": 10,
    "calls": [
      "UUID",
      "asyncio.timeout",
      "c.fetch",
      "len",
      "max",
      "min",
      "range",
      "source_range",
      "store.pool.acquire"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_replay.py",
    "name": "ReplayManager.prepare",
    "line": 104,
    "end": 144,
    "lines": 41,
    "language": "python",
    "branches": 12,
    "calls": [
      "(original or {}).get",
      "RequestStopped",
      "asyncio.sleep",
      "isinstance",
      "json.dumps",
      "json.dumps({'action': 'capabilities', 'backend': current['backend']}).encode",
      "json.loads",
      "json.loads(probe.data).get",
      "logging.getLogger",
      "logging.getLogger(__name__).exception",
      "nc.request",
      "os.getenv",
      "self.api.asr_connection",
      "self.ranges",
      "self.read_range",
      "self.rpc",
      "state.get",
      "str",
      "submit",
      "time.monotonic",
      "uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_replay.py",
    "name": "ReplayManager.command",
    "line": 146,
    "end": 203,
    "lines": 58,
    "language": "python",
    "branches": 20,
    "calls": [
      "RequestStopped",
      "UUID",
      "asyncio.create_task",
      "asyncio.gather",
      "asyncio.timeout",
      "c.fetchrow",
      "current.get",
      "current.update",
      "data.get",
      "dict",
      "max",
      "min",
      "os.getenv",
      "response",
      "samples",
      "self.capture",
      "self.expire",
      "self.prepare",
      "self.release",
      "self.rpc",
      "source_range",
      "store.pool.acquire",
      "str",
      "task.cancel",
      "task.done",
      "time.monotonic",
      "uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_replay.py",
    "name": "ReplayManager.capture",
    "line": 205,
    "end": 225,
    "lines": 21,
    "language": "python",
    "branches": 1,
    "calls": [
      "RequestStopped",
      "asyncio.create_task",
      "dict",
      "json.dumps",
      "json.dumps({'action': 'capabilities', 'backend': backend}).encode",
      "json.loads",
      "json.loads(probe.data).get",
      "nc.request",
      "response",
      "self.api.asr_connection",
      "self.api.grants.issue",
      "self.expire",
      "self.rpc",
      "str",
      "time.monotonic",
      "uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "DiskGuard.__init__",
    "line": 57,
    "end": 62,
    "lines": 6,
    "language": "python",
    "branches": 0,
    "calls": [
      "os.getenv"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "DiskGuard.update",
    "line": 64,
    "end": 68,
    "lines": 5,
    "language": "python",
    "branches": 2,
    "calls": [
      "abs",
      "all",
      "math.isfinite",
      "self.clock",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "DiskGuard.check",
    "line": 70,
    "end": 71,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "self.clock"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "DiskGuard.reason",
    "line": 73,
    "end": 74,
    "lines": 2,
    "language": "python",
    "branches": 1,
    "calls": [
      "self.clock"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "DiskGuard.refresh",
    "line": 76,
    "end": 87,
    "lines": 12,
    "language": "python",
    "branches": 2,
    "calls": [
      "ValueError",
      "client.get",
      "float",
      "len",
      "r.json",
      "r.raise_for_status",
      "self.clock",
      "self.update",
      "self.url.rstrip",
      "str",
      "values.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "DiskGuard.run",
    "line": 89,
    "end": 96,
    "lines": 8,
    "language": "python",
    "branches": 2,
    "calls": [
      "asyncio.sleep",
      "httpx.AsyncClient",
      "self.refresh"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "AudioStore.__init__",
    "line": 100,
    "end": 105,
    "lines": 6,
    "language": "python",
    "branches": 0,
    "calls": [
      "DiskGuard",
      "MonitorReads"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "AudioStore.initialize",
    "line": 107,
    "end": 121,
    "lines": 15,
    "language": "python",
    "branches": 2,
    "calls": [
      "asyncio.create_task",
      "c.cursor",
      "c.execute",
      "c.fetchval",
      "c.transaction",
      "refresh_bounds",
      "self.guard.run",
      "self.pool.acquire",
      "self.sweep"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "AudioStore.sweep",
    "line": 123,
    "end": 129,
    "lines": 7,
    "language": "python",
    "branches": 2,
    "calls": [
      "asyncio.sleep",
      "logging.getLogger",
      "logging.getLogger(__name__).exception",
      "self.reconcile"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "AudioStore.reconcile",
    "line": 131,
    "end": 152,
    "lines": 22,
    "language": "python",
    "branches": 5,
    "calls": [
      "asyncio.timeout",
      "c.execute",
      "c.fetch",
      "c.fetchrow",
      "c.transaction",
      "logging.getLogger",
      "logging.getLogger(__name__).warning",
      "row['updated_at'].timestamp",
      "self.changed",
      "self.pool.acquire",
      "self.verify",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "AudioStore.close",
    "line": 154,
    "end": 159,
    "lines": 6,
    "language": "python",
    "branches": 2,
    "calls": [
      "asyncio.gather",
      "self.guard.task.cancel",
      "self.sweeper.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "AudioStore.private",
    "line": 161,
    "end": 252,
    "lines": 92,
    "language": "python",
    "branches": 35,
    "calls": [
      "RequestStopped",
      "UUID",
      "any",
      "array",
      "asyncio.timeout",
      "base64.b64decode",
      "c.execute",
      "c.fetchrow",
      "c.fetchval",
      "c.transaction",
      "data.get",
      "data.get('text', '').strip",
      "enumerate",
      "hashlib.sha256",
      "hashlib.sha256(raw).hexdigest",
      "isinstance",
      "json.dumps",
      "json.loads",
      "len",
      "math.isfinite",
      "max",
      "min",
      "opus_packet",
      "os.getenv",
      "p.get",
      "pending.get",
      "pending.get('text', '').strip",
      "refresh_bounds",
      "request_id",
      "sample_count",
      "samples.byteswap",
      "samples.frombytes",
      "self.changed",
      "self.event",
      "self.fail",
      "self.guard.check",
      "self.guard.reason",
      "self.pool.acquire",
      "str",
      "sum",
      "type",
      "value.get",
      "value['data'].get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "AudioStore.fail",
    "line": 254,
    "end": 255,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "c.execute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "AudioStore.event",
    "line": 257,
    "end": 261,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "RequestStopped",
      "c.execute",
      "json.dumps",
      "json.dumps(data).encode",
      "len",
      "uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "AudioStore.browser",
    "line": 263,
    "end": 307,
    "lines": 45,
    "language": "python",
    "branches": 20,
    "calls": [
      "RequestStopped",
      "UUID",
      "any",
      "asyncio.timeout",
      "c.execute",
      "c.fetchrow",
      "c.fetchval",
      "c.transaction",
      "data.get",
      "data['text'].encode",
      "data['text'].strip",
      "hashlib.sha256",
      "hashlib.sha256(data['text'].encode()).hexdigest",
      "isinstance",
      "json.dumps",
      "json.dumps(data).lower",
      "json.loads",
      "meta.get",
      "request_id",
      "result.get",
      "result.get('text', '').strip",
      "self.changed",
      "self.event",
      "self.fail",
      "self.pool.acquire",
      "str",
      "uuid5"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "AudioStore.verify",
    "line": 309,
    "end": 338,
    "lines": 30,
    "language": "python",
    "branches": 11,
    "calls": [
      "RequestStopped",
      "c.cursor",
      "c.execute",
      "c.fetchrow",
      "finish.get",
      "isinstance",
      "json.loads",
      "len",
      "meta.get",
      "sample_count",
      "self.fail",
      "verify_chunk"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "AudioStore.query",
    "line": 340,
    "end": 392,
    "lines": 53,
    "language": "python",
    "branches": 21,
    "calls": [
      "RequestStopped",
      "base64.b64encode",
      "base64.b64encode(raw).decode",
      "bytes",
      "c.fetch",
      "c.fetchrow",
      "c.fetchval",
      "dict",
      "dict(row).items",
      "hashlib.sha256",
      "hashlib.sha256(raw).hexdigest",
      "len",
      "max",
      "min",
      "query",
      "read_chunk",
      "sample_count",
      "self.reads.connection",
      "self.record",
      "settings",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/audio_store.py",
    "name": "AudioStore.record",
    "line": 395,
    "end": 408,
    "lines": 14,
    "language": "python",
    "branches": 7,
    "calls": [
      "dict",
      "dict(row).items",
      "hasattr",
      "isinstance",
      "json.loads",
      "sample_count",
      "str",
      "v.isoformat"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "BrowserApi.__init__",
    "line": 40,
    "end": 46,
    "lines": 7,
    "language": "python",
    "branches": 0,
    "calls": [
      "BrowserGrants",
      "CalloutSigner"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "BrowserApi.redeem",
    "line": 48,
    "end": 51,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "UUID",
      "self.pool.fetchval"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "BrowserApi.start",
    "line": 53,
    "end": 68,
    "lines": 16,
    "language": "python",
    "branches": 1,
    "calls": [
      "AuthCallout",
      "Endpoint",
      "asyncio.create_task",
      "endpoint.start",
      "nats.NATS",
      "os.getenv",
      "self.auth_nc.connect",
      "self.callout.start",
      "self.endpoints.append",
      "self.maintain",
      "self.nc.subscribe",
      "self.restore"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "BrowserApi.restore",
    "line": 70,
    "end": 74,
    "lines": 5,
    "language": "python",
    "branches": 0,
    "calls": [
      "dict",
      "int",
      "self.pool.fetch",
      "str",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "BrowserApi.bootstrap",
    "line": 76,
    "end": 113,
    "lines": 38,
    "language": "python",
    "branches": 8,
    "calls": [
      "RequestStopped",
      "UUID",
      "binding.get",
      "binding.update",
      "getattr",
      "getattr(self.nc, 'raw', self.nc).request",
      "grant.get",
      "json.dumps",
      "json.dumps({'command': 'renew', 'data': {}, 'session_id': grant['session_id'], 'client_id': grant['client_id'], 'profile': 'replay', 'lease_exp': grant['capability_expires_at']}).encode",
      "json.dumps({**binding, 'command': 'renew', 'data': {}}).encode",
      "len",
      "previous.get",
      "self.bindings.get",
      "self.bindings.get(grant['client_id'], {}).get",
      "self.grants.issue",
      "self.grants.verify",
      "self.nc.request",
      "self.pool.execute",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "BrowserApi.valid_reply",
    "line": 116,
    "end": 124,
    "lines": 9,
    "language": "python",
    "branches": 2,
    "calls": [
      "UUID",
      "bool",
      "len",
      "message.subject.split",
      "re.escape",
      "re.fullmatch",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "BrowserApi.execute",
    "line": 126,
    "end": 199,
    "lines": 74,
    "language": "python",
    "branches": 19,
    "calls": [
      "PublicEnvelope.model_validate",
      "RequestStopped",
      "UUID",
      "ValueError",
      "allowed_commands",
      "binding.get",
      "business",
      "context.get",
      "context.get().get",
      "context.reset",
      "context.set",
      "data.get",
      "debug_owner",
      "debug_publish",
      "description",
      "details.update",
      "getattr",
      "grant.get",
      "int",
      "isinstance",
      "journal.emit",
      "json.dumps",
      "json.dumps(raw, ensure_ascii=False).encode",
      "json.dumps(result, ensure_ascii=False, default=str).encode",
      "len",
      "message.subject.split",
      "re.escape",
      "re.fullmatch",
      "request_id",
      "response",
      "result.get",
      "result['data'].get",
      "route.update",
      "self.bindings.get",
      "self.execute_command",
      "self.grants.verify",
      "str",
      "time.monotonic",
      "time.time",
      "transfer.reset",
      "transfer.set",
      "uuid4",
      "validate"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "BrowserApi.execute_command",
    "line": 201,
    "end": 292,
    "lines": 92,
    "language": "python",
    "branches": 34,
    "calls": [
      "MonitorQuery.model_validate",
      "ReplayManager",
      "RequestStopped",
      "ValueError",
      "WidgetHistoryQuery.model_validate",
      "binding.get",
      "carrier",
      "data.get",
      "data.items",
      "debug_publish",
      "getattr",
      "grant.get",
      "hasattr",
      "int",
      "json.dumps",
      "json.dumps(body, allow_nan=False).encode",
      "json.loads",
      "len",
      "min",
      "prefix",
      "proof.get",
      "query",
      "response",
      "self.app.state.audio_store.browser",
      "self.app.state.audio_store.query",
      "self.app.state.notes.read",
      "self.app.state.notes.save",
      "self.app.state.traffic_store.history",
      "self.app.state.traffic_store.query",
      "self.app.state.widget_store.client_receipt",
      "self.app.state.widget_store.read",
      "self.app.state.widget_store.register",
      "self.bindings.get",
      "self.catalog_updated",
      "self.grants.verify",
      "self.nc.request",
      "self.replay.command",
      "store.command",
      "store.command_state",
      "store.view",
      "time.monotonic",
      "time.time",
      "value.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "BrowserApi.catalog_updated",
    "line": 294,
    "end": 297,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "json.dumps",
      "json.dumps({'type': 'command', 'kind': 'demo_updated', 'service': 'src_api_gateway', 'data': result}).encode",
      "os.getenv",
      "self.nc.publish"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "BrowserApi.on_event",
    "line": 299,
    "end": 328,
    "lines": 30,
    "language": "python",
    "branches": 11,
    "calls": [
      "binding.get",
      "data.get",
      "event.get",
      "int",
      "isinstance",
      "json.loads",
      "len",
      "list",
      "prefix",
      "self.bindings.values",
      "self.nc.publish",
      "time.time",
      "trace.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "BrowserApi.maintain",
    "line": 330,
    "end": 339,
    "lines": 10,
    "language": "python",
    "branches": 2,
    "calls": [
      "asyncio.sleep",
      "int",
      "self.bindings.items",
      "self.pool.execute",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "BrowserApi.asr_connection",
    "line": 341,
    "end": 370,
    "lines": 30,
    "language": "python",
    "branches": 6,
    "calls": [
      "asyncio.create_task",
      "asyncio.shield",
      "connect",
      "nats.NATS",
      "nats_url",
      "nc.close",
      "nc.connect",
      "os.getenv",
      "self.sample_opening.done",
      "task.done"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "BrowserApi.asr_connection.connect",
    "line": 349,
    "end": 363,
    "lines": 15,
    "language": "python",
    "branches": 1,
    "calls": [
      "nats.NATS",
      "nats_url",
      "nc.close",
      "nc.connect",
      "os.getenv"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "BrowserApi.asr_connection.connect.quiet",
    "line": 352,
    "end": 353,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "BrowserApi.close",
    "line": 372,
    "end": 393,
    "lines": 22,
    "language": "python",
    "branches": 8,
    "calls": [
      "asyncio.gather",
      "errors.append",
      "getattr",
      "getattr(resource, method)",
      "replay.release",
      "self.maintenance.cancel",
      "self.sample_nc.close",
      "self.sample_opening.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "start",
    "line": 396,
    "end": 399,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "BrowserApi",
      "service.start"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "stop",
    "line": 402,
    "end": 406,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "getattr",
      "service.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/browser_api.py",
    "name": "bootstrap",
    "line": 410,
    "end": 445,
    "lines": 36,
    "language": "python",
    "branches": 8,
    "calls": [
      "Bootstrap.model_validate_json",
      "JSONResponse",
      "allowed.add",
      "body.extend",
      "bytearray",
      "getattr",
      "len",
      "os.getenv",
      "os.getenv('AUDIO_ALLOWED_ORIGINS', 'https://chat-agent.gis-master.ru').split",
      "request.cookies.get",
      "request.headers.get",
      "request.stream",
      "response.set_cookie",
      "router.post",
      "service.bootstrap",
      "set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/domain_api.py",
    "name": "append_traffic",
    "line": 19,
    "end": 21,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "app.state.traffic_store.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/domain_api.py",
    "name": "start",
    "line": 24,
    "end": 58,
    "lines": 35,
    "language": "python",
    "branches": 2,
    "calls": [
      "AudioStore",
      "AviationStore",
      "ChatNotes",
      "Endpoint",
      "MonitorReads",
      "TrafficStore",
      "WidgetStore",
      "app.state.archive_api.start",
      "app.state.audio_store.initialize",
      "app.state.audio_store.private",
      "app.state.domain.initialize",
      "app.state.notes.initialize",
      "app.state.traffic_api.start",
      "app.state.traffic_store.initialize",
      "app.state.widget_store.initialize",
      "append_traffic",
      "asyncio.timeout",
      "asyncpg.create_pool",
      "dict",
      "dict(session_id=session_id, request_id=request_id, recording_id=recording_id).items",
      "getattr",
      "getattr(app.state.nats, 'raw', app.state.nats).publish",
      "json.dumps",
      "json.dumps(dict(version=1, kind='monitor_audio', event='changed', data=data)).encode",
      "logging.getLogger",
      "logging.getLogger(__name__).warning",
      "response",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/domain_api.py",
    "name": "start.changed",
    "line": 34,
    "end": 43,
    "lines": 10,
    "language": "python",
    "branches": 1,
    "calls": [
      "asyncio.timeout",
      "dict",
      "dict(session_id=session_id, request_id=request_id, recording_id=recording_id).items",
      "getattr",
      "getattr(app.state.nats, 'raw', app.state.nats).publish",
      "json.dumps",
      "json.dumps(dict(version=1, kind='monitor_audio', event='changed', data=data)).encode",
      "logging.getLogger",
      "logging.getLogger(__name__).warning",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/domain_api.py",
    "name": "start.archive",
    "line": 46,
    "end": 47,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "app.state.audio_store.private",
      "response"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/domain_api.py",
    "name": "stop",
    "line": 62,
    "end": 75,
    "lines": 14,
    "language": "python",
    "branches": 5,
    "calls": [
      "app.state.archive_api.close",
      "app.state.audio_store.close",
      "app.state.traffic_api.close",
      "getattr",
      "pool.close",
      "recorder.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/main.py",
    "name": "lifespan",
    "line": 18,
    "end": 56,
    "lines": 39,
    "language": "python",
    "branches": 17,
    "calls": [
      "_app.state.weather.close",
      "_shutdown_nats",
      "_startup_nats",
      "browser_api.start",
      "browser_api.stop",
      "domain_api.start",
      "domain_api.stop",
      "errors.append",
      "getattr",
      "weather.start"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/main.py",
    "name": "_startup_nats",
    "line": 69,
    "end": 76,
    "lines": 8,
    "language": "python",
    "branches": 0,
    "calls": [
      "NATS",
      "bootstrap",
      "nc.connect",
      "observe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/main.py",
    "name": "_shutdown_nats",
    "line": 79,
    "end": 83,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "getattr",
      "nc.close",
      "nc.drain"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/main.py",
    "name": "health",
    "line": 87,
    "end": 91,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "JSONResponse",
      "app.get",
      "bool",
      "getattr"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor.py",
    "name": "quoted",
    "line": 46,
    "end": 47,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "name.replace"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor.py",
    "name": "query",
    "line": 50,
    "end": 126,
    "lines": 77,
    "language": "python",
    "branches": 19,
    "calls": [
      "' or '.join",
      "' union all '.join",
      "','.join",
      "(reads or MonitorReads()).connection",
      "DESCRIPTIONS.get",
      "MonitorReads",
      "POLICIES.get",
      "RequestStopped",
      "catalog.append",
      "cell",
      "columns_for",
      "conn.fetch",
      "conn.fetchval",
      "counts.get",
      "date_columns.get",
      "date_columns.setdefault",
      "date_columns.setdefault(column['table_name'], []).append",
      "dates",
      "dict",
      "duration",
      "enumerate",
      "fragment",
      "json.dumps",
      "json.dumps(item, ensure_ascii=False).encode",
      "json.loads",
      "json.loads(r['cells']).items",
      "len",
      "predicate",
      "quoted",
      "rows.append",
      "since.isoformat",
      "until.isoformat"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor.py",
    "name": "query.columns_for",
    "line": 60,
    "end": 63,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "conn.fetch",
      "dict"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor.py",
    "name": "query.dates",
    "line": 64,
    "end": 65,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor.py",
    "name": "query.predicate",
    "line": 66,
    "end": 67,
    "lines": 2,
    "language": "python",
    "branches": 1,
    "calls": [
      "' or '.join",
      "quoted"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor_audio.py",
    "name": "archive_sql",
    "line": 7,
    "end": 180,
    "lines": 174,
    "language": "python",
    "branches": 2,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor_audio.py",
    "name": "enrich",
    "line": 186,
    "end": 205,
    "lines": 20,
    "language": "python",
    "branches": 4,
    "calls": [
      "UUID",
      "conn.fetch",
      "e['metadata'].get",
      "event.update",
      "event['metadata'].update",
      "str",
      "totals.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor_audio.py",
    "name": "content",
    "line": 208,
    "end": 248,
    "lines": 41,
    "language": "python",
    "branches": 16,
    "calls": [
      "(manifest or {}).get",
      "UUID",
      "body",
      "conn.fetch",
      "conn.fetchrow",
      "conn.fetchval",
      "gaps.append",
      "isinstance",
      "json.dumps",
      "json.loads",
      "len",
      "metadata.get",
      "operation_id.removeprefix",
      "operation_id.removeprefix('archive:').split",
      "packet.get",
      "packets.append",
      "sent.get",
      "sum",
      "zip"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor_details.py",
    "name": "decode",
    "line": 7,
    "end": 8,
    "lines": 2,
    "language": "python",
    "branches": 1,
    "calls": [
      "isinstance",
      "json.loads"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor_details.py",
    "name": "serial",
    "line": 11,
    "end": 12,
    "lines": 2,
    "language": "python",
    "branches": 2,
    "calls": [
      "dict",
      "dict(row).items",
      "hasattr",
      "k.endswith",
      "str",
      "v.isoformat"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor_details.py",
    "name": "resolve",
    "line": 15,
    "end": 48,
    "lines": 34,
    "language": "python",
    "branches": 5,
    "calls": [
      "conn.fetch",
      "conn.fetchval",
      "item.get",
      "list",
      "matches.values",
      "max",
      "min",
      "serial",
      "str",
      "tuple"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor_details.py",
    "name": "summary",
    "line": 51,
    "end": 108,
    "lines": 58,
    "language": "python",
    "branches": 24,
    "calls": [
      "(data['audio']['result'] or {}).get",
      "RequestStopped",
      "any",
      "asr.get",
      "body",
      "conn.fetch",
      "conn.fetchrow",
      "conn.fetchval",
      "data.get",
      "data.update",
      "data['timings'].get",
      "decode",
      "dict",
      "fragment",
      "isinstance",
      "json.dumps",
      "metadata.get",
      "payload.get",
      "result.get",
      "saved.get",
      "serial",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor_details.py",
    "name": "streams",
    "line": 116,
    "end": 133,
    "lines": 18,
    "language": "python",
    "branches": 1,
    "calls": [
      "conn.fetch",
      "len",
      "serial"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor_details.py",
    "name": "stream_events",
    "line": 136,
    "end": 162,
    "lines": 27,
    "language": "python",
    "branches": 4,
    "calls": [
      "conn.fetch",
      "decode",
      "dict",
      "enrich",
      "event_row",
      "len",
      "ordered_events",
      "page.append",
      "raw.pop",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor_reads.py",
    "name": "MonitorReads.__init__",
    "line": 7,
    "end": 8,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "asyncio.Semaphore"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor_reads.py",
    "name": "MonitorReads.connection",
    "line": 11,
    "end": 16,
    "lines": 6,
    "language": "python",
    "branches": 0,
    "calls": [
      "asyncio.timeout",
      "conn.execute",
      "conn.transaction",
      "pool.acquire"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor_requests.py",
    "name": "decoded",
    "line": 158,
    "end": 159,
    "lines": 2,
    "language": "python",
    "branches": 1,
    "calls": [
      "isinstance",
      "json.loads"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor_requests.py",
    "name": "body",
    "line": 162,
    "end": 180,
    "lines": 19,
    "language": "python",
    "branches": 2,
    "calls": [
      "conn.fetchrow",
      "content",
      "operation_id.startswith"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor_requests.py",
    "name": "content",
    "line": 183,
    "end": 187,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "RequestStopped",
      "body",
      "fragment"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/monitor_requests.py",
    "name": "query",
    "line": 190,
    "end": 265,
    "lines": 76,
    "language": "python",
    "branches": 27,
    "calls": [
      "RequestStopped",
      "conn.fetch",
      "conn.fetchrow",
      "datetime.fromisoformat",
      "decoded",
      "dict",
      "enrich",
      "event_row",
      "events.append",
      "external.add",
      "float",
      "info.get",
      "item.get",
      "item.pop",
      "item['metadata'].get",
      "json.dumps",
      "json.dumps(value, ensure_ascii=False).encode",
      "len",
      "ordered_events",
      "page.append",
      "raw.pop",
      "set",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/nats_auth.py",
    "name": "public_key",
    "line": 14,
    "end": 18,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "ValueError",
      "base64.b32decode",
      "len",
      "nkeys.crc16_checksum"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/nats_auth.py",
    "name": "CalloutSigner.__init__",
    "line": 22,
    "end": 28,
    "lines": 7,
    "language": "python",
    "branches": 1,
    "calls": [
      "ValueError",
      "nkeys.decode_seed",
      "nkeys.from_seed",
      "seed.encode",
      "self.signer.public_key.decode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/nats_auth.py",
    "name": "CalloutSigner.sign",
    "line": 30,
    "end": 36,
    "lines": 7,
    "language": "python",
    "branches": 0,
    "calls": [
      "(header + '.' + body).encode",
      "base64.b32encode",
      "base64.b32encode(hashlib.sha256(json.dumps(claims, sort_keys=True).encode()).digest()).rstrip",
      "base64.b32encode(hashlib.sha256(json.dumps(claims, sort_keys=True).encode()).digest()).rstrip(b'=').decode",
      "encode",
      "hashlib.sha256",
      "hashlib.sha256(json.dumps(claims, sort_keys=True).encode()).digest",
      "int",
      "json.dumps",
      "json.dumps(claims, separators=(',', ':'), allow_nan=False).encode",
      "json.dumps(claims, sort_keys=True).encode",
      "message.decode",
      "self.clock",
      "self.signer.sign"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/nats_auth.py",
    "name": "CalloutSigner.request",
    "line": 38,
    "end": 57,
    "lines": 20,
    "language": "python",
    "branches": 3,
    "calls": [
      "(header + '.' + body).encode",
      "ValueError",
      "VerifyKey",
      "VerifyKey(public_key(issuer, nkeys.PREFIX_BYTE_SERVER)).verify",
      "claim.get",
      "data.get",
      "data.get('server_id', {}).get",
      "decode",
      "int",
      "isinstance",
      "json.loads",
      "json.loads(decode(header)).get",
      "len",
      "public_key",
      "raw.decode",
      "raw.decode('ascii').split",
      "self.clock",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/nats_auth.py",
    "name": "CalloutSigner.response",
    "line": 59,
    "end": 68,
    "lines": 10,
    "language": "python",
    "branches": 2,
    "calls": [
      "int",
      "permissions",
      "self.clock",
      "self.sign",
      "self.sign({'sub': request['user_nkey'], 'aud': request['server_id']['id'], 'exp': int(self.clock()) + 3, 'nats': {'type': 'authorization_response', 'version': 2, **({'jwt': user} if user else {'error': error or 'browser_access_denied'})}}).encode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/nats_auth.py",
    "name": "AuthCallout.__init__",
    "line": 72,
    "end": 74,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/nats_auth.py",
    "name": "AuthCallout.start",
    "line": 76,
    "end": 79,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "self.nc.flush",
      "self.nc.subscribe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/nats_auth.py",
    "name": "AuthCallout.authorize",
    "line": 81,
    "end": 101,
    "lines": 21,
    "language": "python",
    "branches": 5,
    "calls": [
      "ValueError",
      "message.reply.startswith",
      "message.respond",
      "opts.get",
      "request.get",
      "request.get('client_info', {}).get",
      "self.grants.verify",
      "self.redeem",
      "self.signer.request",
      "self.signer.response",
      "str",
      "str(request.get('client_info', {}).get('type', '')).upper"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/nats_auth.py",
    "name": "AuthCallout.close",
    "line": 103,
    "end": 106,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "self.subscription.unsubscribe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/traffic_store.py",
    "name": "TrafficStore.__init__",
    "line": 62,
    "end": 67,
    "lines": 6,
    "language": "python",
    "branches": 0,
    "calls": [
      "MonitorReads"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/traffic_store.py",
    "name": "TrafficStore.initialize",
    "line": 69,
    "end": 85,
    "lines": 17,
    "language": "python",
    "branches": 0,
    "calls": [
      "conn.execute",
      "conn.transaction",
      "self.pool.acquire"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/traffic_store.py",
    "name": "TrafficStore.append",
    "line": 87,
    "end": 113,
    "lines": 27,
    "language": "python",
    "branches": 6,
    "calls": [
      "Event.model_validate",
      "UUID",
      "ValueError",
      "asyncio.timeout",
      "event.model_dump",
      "identity",
      "identity(event.payload).get",
      "json.dumps",
      "self.changed",
      "self.pool.execute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/traffic_store.py",
    "name": "TrafficStore.query",
    "line": 115,
    "end": 161,
    "lines": 47,
    "language": "python",
    "branches": 12,
    "calls": [
      "conn.fetch",
      "conn.fetchval",
      "content",
      "dict",
      "duration",
      "item.pop",
      "item[key].isoformat",
      "len",
      "query",
      "resolve",
      "self.reads.connection",
      "sessions.append",
      "since.isoformat",
      "str",
      "stream_events",
      "streams",
      "summary",
      "until.isoformat"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/traffic_store.py",
    "name": "TrafficStore.event_row",
    "line": 164,
    "end": 171,
    "lines": 8,
    "language": "python",
    "branches": 5,
    "calls": [
      "cell",
      "dict",
      "isinstance",
      "json.loads",
      "str",
      "value.pop",
      "value[key].isoformat"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/traffic_store.py",
    "name": "TrafficStore.history",
    "line": 173,
    "end": 244,
    "lines": 72,
    "language": "python",
    "branches": 18,
    "calls": [
      "RequestStopped",
      "UUID",
      "cell",
      "conn.execute",
      "conn.fetch",
      "conn.fetchval",
      "conn.transaction",
      "fragment",
      "item.get",
      "item.update",
      "items.append",
      "json.dumps",
      "json.dumps(item, ensure_ascii=False).encode",
      "json.loads",
      "len",
      "page.append",
      "question.get",
      "row['created_at'].isoformat",
      "self.pool.acquire",
      "str",
      "until.isoformat",
      "value.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/weather.py",
    "name": "WeatherProvider.__init__",
    "line": 24,
    "end": 32,
    "lines": 9,
    "language": "python",
    "branches": 1,
    "calls": [
      "OrderedDict",
      "asyncio.Lock",
      "deque",
      "httpx.AsyncClient",
      "os.getenv"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/weather.py",
    "name": "WeatherProvider.permit",
    "line": 34,
    "end": 48,
    "lines": 15,
    "language": "python",
    "branches": 6,
    "calls": [
      "RequestStopped",
      "asyncio.sleep",
      "len",
      "max",
      "self.calls.append",
      "self.calls.popleft",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/weather.py",
    "name": "WeatherProvider.request",
    "line": 50,
    "end": 81,
    "lines": 32,
    "language": "python",
    "branches": 8,
    "calls": [
      "(parsedate_to_datetime(retry) - datetime.now(timezone.utc)).total_seconds",
      "RequestStopped",
      "bytearray",
      "bytes",
      "data.extend",
      "datetime.now",
      "float",
      "httpx.Response",
      "key.lower",
      "len",
      "max",
      "min",
      "parsedate_to_datetime",
      "response.aiter_bytes",
      "response.headers.get",
      "response.headers.items",
      "self.client.stream",
      "self.permit",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/weather.py",
    "name": "WeatherProvider.coalesce",
    "line": 83,
    "end": 94,
    "lines": 12,
    "language": "python",
    "branches": 3,
    "calls": [
      "RequestStopped",
      "asyncio.create_task",
      "asyncio.shield",
      "call",
      "done.cancelled",
      "done.exception",
      "len",
      "self.inflight.pop",
      "task.add_done_callback"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/weather.py",
    "name": "WeatherProvider.coalesce.finished",
    "line": 89,
    "end": 92,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "done.cancelled",
      "done.exception",
      "self.inflight.pop"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/weather.py",
    "name": "WeatherProvider.tile",
    "line": 96,
    "end": 117,
    "lines": 22,
    "language": "python",
    "branches": 4,
    "calls": [
      "RequestStopped",
      "len",
      "response.content.endswith",
      "response.content.startswith",
      "response.headers.get",
      "response.headers.get('content-type', '').split",
      "response.headers.get('content-type', '').split(';')[0].lower",
      "self.coalesce",
      "self.request",
      "self.tiles.get",
      "self.tiles.move_to_end",
      "self.tiles.pop",
      "self.tiles.popitem",
      "tile_coordinates",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/weather.py",
    "name": "WeatherProvider.tile.fetch",
    "line": 103,
    "end": 116,
    "lines": 14,
    "language": "python",
    "branches": 3,
    "calls": [
      "RequestStopped",
      "len",
      "response.content.endswith",
      "response.content.startswith",
      "response.headers.get",
      "response.headers.get('content-type', '').split",
      "response.headers.get('content-type', '').split(';')[0].lower",
      "self.request",
      "self.tiles.pop",
      "self.tiles.popitem",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/weather.py",
    "name": "WeatherProvider.close",
    "line": 119,
    "end": 124,
    "lines": 6,
    "language": "python",
    "branches": 1,
    "calls": [
      "asyncio.gather",
      "list",
      "self.client.aclose",
      "self.inflight.values",
      "task.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/weather.py",
    "name": "start",
    "line": 127,
    "end": 128,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "WeatherProvider"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_api_gateway/weather.py",
    "name": "tiles",
    "line": 132,
    "end": 141,
    "lines": 10,
    "language": "python",
    "branches": 2,
    "calls": [
      "JSONResponse",
      "Response",
      "asyncio.timeout",
      "getattr",
      "request.app.state.weather.tile",
      "router.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/archive.py",
    "name": "fingerprint",
    "line": 11,
    "end": 12,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "Path",
      "Path(__file__).parents[1].joinpath",
      "Path(__file__).parents[1].joinpath('src_shared/audio.py').read_bytes",
      "Path(__file__).read_bytes",
      "Path(__file__).with_name",
      "Path(__file__).with_name('browser_api.py').read_bytes",
      "hashlib.sha256",
      "hashlib.sha256(Path(__file__).read_bytes() + Path(__file__).with_name('browser_api.py').read_bytes() + Path(__file__).parents[1].joinpath('src_shared/audio.py').read_bytes()).hexdigest"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/archive.py",
    "name": "ArchiveTap.__init__",
    "line": 19,
    "end": 37,
    "lines": 19,
    "language": "python",
    "branches": 2,
    "calls": [
      "asyncio.Queue",
      "asyncio.create_task",
      "bytearray",
      "dict",
      "fingerprint",
      "getattr",
      "self.run"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/archive.py",
    "name": "ArchiveTap.enqueue",
    "line": 39,
    "end": 44,
    "lines": 6,
    "language": "python",
    "branches": 2,
    "calls": [
      "self.queue.put_nowait",
      "self.queue.qsize"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/archive.py",
    "name": "ArchiveTap.pcm",
    "line": 46,
    "end": 58,
    "lines": 13,
    "language": "python",
    "branches": 6,
    "calls": [
      "array",
      "datetime.now",
      "datetime.now(timezone.utc).isoformat",
      "dict",
      "len",
      "max",
      "min",
      "pcm.byteswap",
      "pcm.frombytes",
      "self.flush",
      "self.packets.append",
      "self.raw.extend",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/archive.py",
    "name": "ArchiveTap.flush",
    "line": 60,
    "end": 67,
    "lines": 8,
    "language": "python",
    "branches": 1,
    "calls": [
      "base64.b64encode",
      "base64.b64encode(raw).decode",
      "bytes",
      "dict",
      "hashlib.sha256",
      "hashlib.sha256(raw).hexdigest",
      "len",
      "self.enqueue",
      "self.raw.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/archive.py",
    "name": "ArchiveTap.send",
    "line": 69,
    "end": 74,
    "lines": 6,
    "language": "python",
    "branches": 1,
    "calls": [
      "ValueError",
      "data.get",
      "json.dumps",
      "json.dumps({'stream_id': self.stream, **value}).encode",
      "json.loads",
      "result.get",
      "self.nc.request"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/archive.py",
    "name": "ArchiveTap.run",
    "line": 76,
    "end": 102,
    "lines": 27,
    "language": "python",
    "branches": 12,
    "calls": [
      "ValueError",
      "asyncio.wait_for",
      "self.notify",
      "self.queue.empty",
      "self.queue.get",
      "self.queue.get_nowait",
      "self.queue.task_done",
      "self.send",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/archive.py",
    "name": "ArchiveTap.close",
    "line": 104,
    "end": 128,
    "lines": 25,
    "language": "python",
    "branches": 8,
    "calls": [
      "RuntimeError",
      "asyncio.gather",
      "asyncio.shield",
      "asyncio.sleep",
      "asyncio.wait_for",
      "logging.getLogger",
      "logging.getLogger(__name__).error",
      "range",
      "self.flush",
      "self.notify",
      "self.packets.clear",
      "self.queue.put_nowait",
      "self.raw.clear",
      "self.send",
      "self.task.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "NatsAudio.__init__",
    "line": 18,
    "end": 37,
    "lines": 20,
    "language": "python",
    "branches": 1,
    "calls": [
      "OpusDecoder",
      "asyncio.Event",
      "asyncio.Lock",
      "self.app[INGRESS].sessions.add",
      "self.browser_context.get",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "NatsAudio.start",
    "line": 39,
    "end": 66,
    "lines": 28,
    "language": "python",
    "branches": 11,
    "calls": [
      "ArchiveTap",
      "RequestStopped",
      "admit",
      "getattr",
      "self.api.live.attach",
      "self.api.nc.flush",
      "self.api.nc.subscribe",
      "self.app[INGRESS].sessions.discard",
      "self.audio.close",
      "self.audio.fields.get",
      "self.browser_context.get",
      "self.ready",
      "self.subscription.unsubscribe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "NatsAudio.ready",
    "line": 68,
    "end": 70,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "NatsAudio.emit",
    "line": 72,
    "end": 89,
    "lines": 18,
    "language": "python",
    "branches": 5,
    "calls": [
      "asyncio.timeout",
      "context.get",
      "context.reset",
      "context.set",
      "getattr",
      "json.dumps",
      "json.dumps(value).encode",
      "nc.publish",
      "self.browser_context.get",
      "value.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "NatsAudio.pcm",
    "line": 91,
    "end": 134,
    "lines": 44,
    "language": "python",
    "branches": 16,
    "calls": [
      "AudioFailure",
      "diagnostic.channel",
      "diagnostic.pcm",
      "getattr",
      "getattr(self.audio, 'fields', {}).get",
      "hashlib.sha256",
      "hashlib.sha256(raw).digest",
      "int.from_bytes",
      "len",
      "self.archive.pcm",
      "self.audio.feed_pcm",
      "self.changed.set",
      "self.decoder.decode",
      "self.failed",
      "self.live.pcm",
      "str",
      "str(exc).startswith",
      "time.monotonic",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "NatsAudio.diagnostic",
    "line": 136,
    "end": 157,
    "lines": 22,
    "language": "python",
    "branches": 8,
    "calls": [
      "AudioDiagnostics",
      "any",
      "isinstance",
      "self.audio.broker.nc.subscribe",
      "self.audio.fields.get",
      "self.diagnostic_subscription.unsubscribe",
      "self.diagnostics.close",
      "self.diagnostics.command",
      "str",
      "subject.endswith"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "NatsAudio.end",
    "line": 159,
    "end": 171,
    "lines": 13,
    "language": "python",
    "branches": 4,
    "calls": [
      "AudioFailure",
      "asyncio.shield",
      "asyncio.timeout",
      "self.changed.clear",
      "self.changed.wait",
      "self.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "NatsAudio.failed",
    "line": 173,
    "end": 177,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "self.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "NatsAudio.close",
    "line": 179,
    "end": 182,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "asyncio.create_task",
      "asyncio.shield",
      "self._close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "NatsAudio._close",
    "line": 184,
    "end": 221,
    "lines": 38,
    "language": "python",
    "branches": 16,
    "calls": [
      "asyncio.timeout",
      "asyncio.wait_for",
      "bool",
      "dict",
      "getattr",
      "getattr(self.audio, 'fields', {}).get",
      "len",
      "self.api.background",
      "self.api.ends.popitem",
      "self.api.owners.get",
      "self.api.owners.pop",
      "self.app[INGRESS].sessions.discard",
      "self.archive.close",
      "self.audio.close",
      "self.decoder.close",
      "self.diagnostic_subscription.unsubscribe",
      "self.diagnostics.close",
      "self.emit",
      "self.live.close",
      "self.subscription.unsubscribe",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "AudioApi.__init__",
    "line": 225,
    "end": 232,
    "lines": 8,
    "language": "python",
    "branches": 0,
    "calls": [
      "Endpoint",
      "OrderedDict",
      "set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "AudioApi.background",
    "line": 234,
    "end": 241,
    "lines": 8,
    "language": "python",
    "branches": 1,
    "calls": [
      "asyncio.create_task",
      "done.cancelled",
      "done.exception",
      "self.tasks.add",
      "self.tasks.discard",
      "task.add_done_callback"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "AudioApi.background.finished",
    "line": 237,
    "end": 240,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "done.cancelled",
      "done.exception",
      "self.tasks.discard"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "AudioApi.start",
    "line": 243,
    "end": 264,
    "lines": 22,
    "language": "python",
    "branches": 5,
    "calls": [
      "Endpoint",
      "LivePublisher",
      "asyncio.create_task",
      "asyncio.sleep",
      "asyncio.timeout",
      "data.get",
      "fingerprint",
      "getattr",
      "list",
      "owner.browser_context.get",
      "owner.close",
      "response",
      "self.archive_probe.start",
      "self.endpoint.start",
      "self.expire",
      "self.live.start",
      "self.owners.values"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "AudioApi.start.probe",
    "line": 246,
    "end": 258,
    "lines": 13,
    "language": "python",
    "branches": 5,
    "calls": [
      "asyncio.sleep",
      "asyncio.timeout",
      "data.get",
      "fingerprint",
      "list",
      "owner.browser_context.get",
      "owner.close",
      "response",
      "self.owners.values"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "AudioApi.execute",
    "line": 266,
    "end": 367,
    "lines": 102,
    "language": "python",
    "branches": 36,
    "calls": [
      "NatsAudio",
      "RequestStopped",
      "UUID",
      "ValueError",
      "asyncio.Lock",
      "asyncio.timeout",
      "context.get",
      "context.set",
      "data.get",
      "datetime.now",
      "datetime.now(timezone.utc).isoformat",
      "envelope.get",
      "getattr",
      "hasattr",
      "isinstance",
      "journal.emit",
      "len",
      "owner.archive.enqueue",
      "owner.audio.boundary",
      "owner.browser_context.get",
      "owner.changed.clear",
      "owner.changed.wait",
      "owner.close",
      "owner.diagnostic",
      "owner.end",
      "owner.failed",
      "owner.ready",
      "owner.start",
      "request_id",
      "response",
      "sample_at",
      "self.ends.get",
      "self.ends.popitem",
      "self.locks.setdefault",
      "self.owners.get",
      "str",
      "time.monotonic",
      "time.time",
      "type",
      "validate"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "AudioApi.expire",
    "line": 369,
    "end": 383,
    "lines": 15,
    "language": "python",
    "branches": 7,
    "calls": [
      "asyncio.sleep",
      "getattr",
      "list",
      "lock.locked",
      "owner.close",
      "owner.emit",
      "owner.failed",
      "self.background",
      "self.ends.items",
      "self.ends.pop",
      "self.locks.items",
      "self.owners.values",
      "time.monotonic",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "AudioApi.close",
    "line": 385,
    "end": 395,
    "lines": 11,
    "language": "python",
    "branches": 4,
    "calls": [
      "asyncio.gather",
      "getattr",
      "list",
      "owner.close",
      "self.archive_probe.close",
      "self.audio_monitor_sub.unsubscribe",
      "self.endpoint.close",
      "self.live.close",
      "self.monitor.cancel",
      "self.owners.values"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "start",
    "line": 398,
    "end": 406,
    "lines": 9,
    "language": "python",
    "branches": 1,
    "calls": [
      "AudioApi",
      "api.close",
      "api.start",
      "stop_ingress"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/browser_api.py",
    "name": "stop",
    "line": 409,
    "end": 411,
    "lines": 3,
    "language": "python",
    "branches": 1,
    "calls": [
      "app.get",
      "app['browser_audio'].close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "measure",
    "line": 19,
    "end": 41,
    "lines": 23,
    "language": "python",
    "branches": 7,
    "calls": [
      "amplitudes[g].max",
      "bool",
      "dict",
      "float",
      "len",
      "math.log10",
      "np.abs",
      "np.arange",
      "np.dot",
      "np.fft.rfft",
      "np.frombuffer",
      "np.frombuffer(raw, '<i2').astype",
      "np.hanning",
      "np.sqrt",
      "range",
      "round",
      "values.max",
      "values.min",
      "window.sum"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "Stage.__init__",
    "line": 45,
    "end": 54,
    "lines": 10,
    "language": "python",
    "branches": 0,
    "calls": [
      "deque"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "Stage.pcm",
    "line": 56,
    "end": 66,
    "lines": 11,
    "language": "python",
    "branches": 2,
    "calls": [
      "len",
      "self.blocks.append",
      "self.blocks.popleft",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "Stage.take",
    "line": 68,
    "end": 74,
    "lines": 7,
    "language": "python",
    "branches": 1,
    "calls": [
      "b''.join",
      "bool",
      "self.blocks.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "LiveStream.__init__",
    "line": 78,
    "end": 95,
    "lines": 18,
    "language": "python",
    "branches": 0,
    "calls": [
      "Stage",
      "asyncio.create_task",
      "deque",
      "dict",
      "events_subject",
      "self.listen",
      "str",
      "time.monotonic",
      "uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "LiveStream.pcm",
    "line": 97,
    "end": 100,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "self.stages[stage].pcm"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "LiveStream.listen",
    "line": 102,
    "end": 113,
    "lines": 12,
    "language": "python",
    "branches": 3,
    "calls": [
      "any",
      "asyncio.timeout",
      "isinstance",
      "self.owner.audio.broker.nc.subscribe",
      "self.owner.audio.fields.get",
      "self.sub.unsubscribe",
      "subject.endswith"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "LiveStream.remote",
    "line": 115,
    "end": 144,
    "lines": 30,
    "language": "python",
    "branches": 8,
    "calls": [
      "(data.get('timings') or {}).get",
      "(data.get('timings') or {}).get('asr', {}).get",
      "UUID",
      "data.get",
      "dict",
      "isinstance",
      "iter",
      "json.loads",
      "len",
      "math.isfinite",
      "next",
      "request_id",
      "self.events.append",
      "self.revisions.pop",
      "str",
      "time.time",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "LiveStream.state",
    "line": 146,
    "end": 152,
    "lines": 7,
    "language": "python",
    "branches": 5,
    "calls": [
      "dict",
      "getattr",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "LiveStream.emit",
    "line": 154,
    "end": 160,
    "lines": 7,
    "language": "python",
    "branches": 2,
    "calls": [
      "dict",
      "self.publisher.send",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "LiveStream.close",
    "line": 162,
    "end": 173,
    "lines": 12,
    "language": "python",
    "branches": 4,
    "calls": [
      "asyncio.gather",
      "self.emit",
      "self.events.clear",
      "self.revisions.clear",
      "self.stages.values",
      "self.state",
      "self.sub.unsubscribe",
      "self.subscribe_task.cancel",
      "stage.blocks.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "LivePublisher.__init__",
    "line": 177,
    "end": 182,
    "lines": 6,
    "language": "python",
    "branches": 0,
    "calls": [
      "getattr",
      "os.getenv"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "LivePublisher.start",
    "line": 184,
    "end": 185,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "asyncio.create_task",
      "self.run"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "LivePublisher.attach",
    "line": 187,
    "end": 193,
    "lines": 7,
    "language": "python",
    "branches": 1,
    "calls": [
      "LiveStream",
      "owner.browser_context.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "LivePublisher.send",
    "line": 195,
    "end": 210,
    "lines": 16,
    "language": "python",
    "branches": 5,
    "calls": [
      "asyncio.timeout",
      "getattr",
      "json.dumps",
      "json.dumps(value, separators=(',', ':'), ensure_ascii=False, allow_nan=False).encode",
      "len",
      "min",
      "self.nc.publish",
      "time.monotonic",
      "value.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "LivePublisher.tick",
    "line": 212,
    "end": 255,
    "lines": 44,
    "language": "python",
    "branches": 20,
    "calls": [
      "asyncio.to_thread",
      "dict",
      "frequencies.append",
      "frequency.pop",
      "list",
      "payload.update",
      "rows.append",
      "self.streams.items",
      "self.streams.pop",
      "stage.take",
      "stream.emit",
      "stream.events.popleft",
      "stream.stages.items",
      "stream.state",
      "time.monotonic",
      "time.time",
      "values.update"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "LivePublisher.run",
    "line": 257,
    "end": 268,
    "lines": 12,
    "language": "python",
    "branches": 5,
    "calls": [
      "asyncio.sleep",
      "dict",
      "s.state",
      "self.send",
      "self.streams.values",
      "self.tick"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/live.py",
    "name": "LivePublisher.close",
    "line": 270,
    "end": 274,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "asyncio.gather",
      "dict",
      "list",
      "s.close",
      "self.send",
      "self.streams.clear",
      "self.streams.values",
      "self.task.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/main.py",
    "name": "create_app",
    "line": 8,
    "end": 12,
    "lines": 5,
    "language": "python",
    "branches": 0,
    "calls": [
      "app.on_shutdown.insert",
      "app.on_startup.append",
      "application"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_audio_ws_ingress/main.py",
    "name": "main",
    "line": 15,
    "end": 16,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "create_app",
      "int",
      "os.environ.get",
      "web.run_app"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.__init__",
    "line": 38,
    "end": 58,
    "lines": 21,
    "language": "python",
    "branches": 1,
    "calls": [
      "ReplayAdmission",
      "app['services'].get",
      "asyncio.Queue",
      "set",
      "str",
      "uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.start",
    "line": 60,
    "end": 68,
    "lines": 9,
    "language": "python",
    "branches": 1,
    "calls": [
      "asyncio.create_task",
      "self._watchdog",
      "self.attach_asr",
      "self.nc.subscribe",
      "self.replay.endpoint.start",
      "self.retry_asr"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.attach_asr",
    "line": 70,
    "end": 88,
    "lines": 19,
    "language": "python",
    "branches": 4,
    "calls": [
      "asyncio.create_task",
      "asyncio.gather",
      "attached.append",
      "nc.subscribe",
      "range",
      "self._adapter_worker",
      "self.subscriptions.append",
      "sub.unsubscribe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.retry_asr",
    "line": 90,
    "end": 109,
    "lines": 20,
    "language": "python",
    "branches": 4,
    "calls": [
      "NatsClient",
      "asyncio.sleep",
      "asyncio.timeout",
      "client.connect",
      "client.nc.close",
      "isinstance",
      "self.attach_asr"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.diagnostic_adapter",
    "line": 111,
    "end": 119,
    "lines": 9,
    "language": "python",
    "branches": 3,
    "calls": [
      "len",
      "self.adapter_queue.put_nowait",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission._adapter_worker",
    "line": 121,
    "end": 127,
    "lines": 7,
    "language": "python",
    "branches": 2,
    "calls": [
      "self._forward_diagnostic",
      "self.adapter_queue.get",
      "self.adapter_queue.task_done"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission._forward_diagnostic",
    "line": 129,
    "end": 161,
    "lines": 33,
    "language": "python",
    "branches": 11,
    "calls": [
      "(msg.headers or {}).get",
      "LlmRequest.model_validate_json",
      "bool",
      "int",
      "isinstance",
      "json.dumps",
      "json.dumps({**state, 'draining': bool(self.app.get('chat_draining'))}).encode",
      "json.loads",
      "len",
      "max",
      "min",
      "request.input.get",
      "self.app.get",
      "self.asr_nc.publish",
      "self.nc.request",
      "time.monotonic",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.admit",
    "line": 163,
    "end": 204,
    "lines": 42,
    "language": "python",
    "branches": 11,
    "calls": [
      "Lease",
      "ValueError",
      "any",
      "data.get",
      "len",
      "self.app.get",
      "self.leases.values",
      "self.replay.claim",
      "tel.active.add",
      "tel.operations.add",
      "uuid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.owner",
    "line": 206,
    "end": 212,
    "lines": 7,
    "language": "python",
    "branches": 1,
    "calls": [
      "data.get",
      "isinstance",
      "len",
      "secrets.compare_digest",
      "self.leases.get",
      "uuid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.control",
    "line": 214,
    "end": 263,
    "lines": 50,
    "language": "python",
    "branches": 15,
    "calls": [
      "ValueError",
      "data.get",
      "isinstance",
      "json.dumps",
      "json.dumps(response).encode",
      "json.loads",
      "lease.pending.add",
      "lease.pending.discard",
      "len",
      "self.admit",
      "self.archive",
      "self.dispatch",
      "self.nc.publish",
      "self.owner",
      "self.replay.accept",
      "self.replay.owns",
      "self.replay.publish",
      "self.retire",
      "self.status",
      "str",
      "time.monotonic",
      "uuid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.status",
    "line": 265,
    "end": 275,
    "lines": 11,
    "language": "python",
    "branches": 3,
    "calls": [
      "event_log",
      "self.replay.current.update",
      "self.replay.owns",
      "self.replay.publish"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.retire",
    "line": 277,
    "end": 288,
    "lines": 12,
    "language": "python",
    "branches": 5,
    "calls": [
      "ledger.pop",
      "self.app.get",
      "self.leases.get",
      "self.leases.pop",
      "self.status",
      "tel.active.add",
      "tel.operations.add",
      "tuple"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.result",
    "line": 290,
    "end": 366,
    "lines": 77,
    "language": "python",
    "branches": 24,
    "calls": [
      "asyncio.create_task",
      "data.get",
      "datetime.fromisoformat",
      "event.get",
      "getattr",
      "headers.get",
      "isinstance",
      "journal.emit",
      "journal_uuid",
      "json.loads",
      "lease.pending.add",
      "lease.pending.discard",
      "len",
      "request_id",
      "self.app.get",
      "self.app.get('asr_results', {}).get",
      "self.archive",
      "self.archive_event",
      "self.dispatch",
      "self.leases.get",
      "self.replay.accept",
      "self.replay.current.get",
      "self.replay.owns",
      "self.replay.publish",
      "self.tasks.add",
      "str",
      "task.add_done_callback",
      "type",
      "uuid",
      "uuid5"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.archive_event",
    "line": 368,
    "end": 377,
    "lines": 10,
    "language": "python",
    "branches": 2,
    "calls": [
      "asyncio.create_task",
      "getattr",
      "json.dumps",
      "json.dumps({'action': 'event', 'stream_id': data['stream_id'], 'kind': 'model_call', 'data': data['data']}).encode",
      "len",
      "nc.request",
      "self.archive_tasks.add",
      "send",
      "task.add_done_callback"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.archive_event.send",
    "line": 370,
    "end": 376,
    "lines": 7,
    "language": "python",
    "branches": 1,
    "calls": [
      "getattr",
      "json.dumps",
      "json.dumps({'action': 'event', 'stream_id': data['stream_id'], 'kind': 'model_call', 'data': data['data']}).encode",
      "nc.request"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.archive",
    "line": 379,
    "end": 388,
    "lines": 10,
    "language": "python",
    "branches": 2,
    "calls": [
      "asyncio.create_task",
      "getattr",
      "json.dumps",
      "json.dumps({'action': 'phrase', 'stream_id': data['stream_id'], 'data': data}).encode",
      "len",
      "nc.request",
      "self.archive_tasks.add",
      "send",
      "task.add_done_callback"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.archive.send",
    "line": 381,
    "end": 386,
    "lines": 6,
    "language": "python",
    "branches": 1,
    "calls": [
      "getattr",
      "json.dumps",
      "json.dumps({'action': 'phrase', 'stream_id': data['stream_id'], 'data': data}).encode",
      "nc.request"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission._settled",
    "line": 390,
    "end": 393,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "self.tasks.discard",
      "task.cancelled",
      "task.exception"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.dispatch",
    "line": 395,
    "end": 399,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "data.get",
      "handle_transcription",
      "self.leases.get",
      "tel.stage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.final_claimed",
    "line": 401,
    "end": 404,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "lease.pending.discard",
      "self.leases.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission._watchdog",
    "line": 406,
    "end": 415,
    "lines": 10,
    "language": "python",
    "branches": 4,
    "calls": [
      "asyncio.sleep",
      "list",
      "self.leases.values",
      "self.replay.expire",
      "self.retire",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_admission.py",
    "name": "AudioAdmission.close",
    "line": 417,
    "end": 444,
    "lines": 28,
    "language": "python",
    "branches": 9,
    "calls": [
      "asyncio.gather",
      "list",
      "self.adapter_tasks.clear",
      "self.asr_retry_task.cancel",
      "self.leases.values",
      "self.replay.endpoint.close",
      "self.retire",
      "self.tasks.clear",
      "self.watchdog.cancel",
      "sub.unsubscribe",
      "task.cancel",
      "tuple"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_replay.py",
    "name": "ReplayAdmission.__init__",
    "line": 11,
    "end": 13,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "Endpoint",
      "getattr"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_replay.py",
    "name": "ReplayAdmission.command",
    "line": 15,
    "end": 60,
    "lines": 46,
    "language": "python",
    "branches": 20,
    "calls": [
      "current.get",
      "data.get",
      "dict",
      "events.append",
      "json.dumps",
      "json.dumps(item).encode",
      "lease.pending.add",
      "len",
      "response",
      "result.get",
      "secrets.token_urlsafe",
      "self.admission.admit",
      "self.admission.app.get",
      "self.admission.leases.get",
      "self.admission.retire",
      "self.cancel",
      "str",
      "time.monotonic",
      "uuid",
      "uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_replay.py",
    "name": "ReplayAdmission.claim",
    "line": 62,
    "end": 67,
    "lines": 6,
    "language": "python",
    "branches": 2,
    "calls": [
      "(data.get('replay') or {}).get",
      "data.get",
      "secrets.compare_digest"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_replay.py",
    "name": "ReplayAdmission.owns",
    "line": 69,
    "end": 71,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "bool"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_replay.py",
    "name": "ReplayAdmission.accept",
    "line": 73,
    "end": 80,
    "lines": 8,
    "language": "python",
    "branches": 3,
    "calls": [
      "c.get",
      "c['events'].append",
      "json.dumps",
      "json.dumps(data).encode",
      "len"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_replay.py",
    "name": "ReplayAdmission.publish",
    "line": 82,
    "end": 86,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "c.get",
      "getattr",
      "json.dumps",
      "json.dumps(data).encode",
      "nc.publish"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_replay.py",
    "name": "ReplayAdmission.cancel",
    "line": 88,
    "end": 120,
    "lines": 33,
    "language": "python",
    "branches": 10,
    "calls": [
      "c.get",
      "getattr",
      "json.dumps",
      "json.dumps({'action': 'idle', 'session_id': c['session_id'], 'stream_id': c['stream_id'], 'backend': c['backend']}).encode",
      "json.dumps({'action': 'stop_replay', 'session_id': c['session_id'], 'stream_id': c['stream_id']}).encode",
      "json.loads",
      "json.loads(reply.data).get",
      "json.loads(reply.data).get('data', {}).get",
      "nc.publish",
      "nc.request",
      "packet",
      "self.admission.leases.get",
      "self.admission.retire"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/audio_replay.py",
    "name": "ReplayAdmission.expire",
    "line": 122,
    "end": 125,
    "lines": 4,
    "language": "python",
    "branches": 2,
    "calls": [
      "self.cancel",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/browser_api.py",
    "name": "start",
    "line": 15,
    "end": 88,
    "lines": 74,
    "language": "python",
    "branches": 20,
    "calls": [
      "Endpoint",
      "UUID",
      "ValueError",
      "WidgetBinding.model_validate",
      "app.get",
      "app.setdefault",
      "app['browser_api'].start",
      "binding.model_dump",
      "client_timings_command",
      "data.items",
      "debug_owner",
      "debug_publish",
      "diagnostic_command",
      "envelope.get",
      "envelope.get('data', {}).get",
      "envelope['data'].get",
      "int",
      "json.dumps",
      "json.dumps(outgoing, ensure_ascii=False, allow_nan=False).encode",
      "json.loads",
      "max",
      "nc.request",
      "os.getenv",
      "response",
      "result.get",
      "str",
      "time.monotonic",
      "time.time",
      "validate"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/browser_api.py",
    "name": "start.execute",
    "line": 19,
    "end": 84,
    "lines": 66,
    "language": "python",
    "branches": 20,
    "calls": [
      "UUID",
      "ValueError",
      "WidgetBinding.model_validate",
      "app.get",
      "binding.model_dump",
      "client_timings_command",
      "data.items",
      "debug_owner",
      "debug_publish",
      "diagnostic_command",
      "envelope.get",
      "envelope.get('data', {}).get",
      "envelope['data'].get",
      "int",
      "json.dumps",
      "json.dumps(outgoing, ensure_ascii=False, allow_nan=False).encode",
      "json.loads",
      "max",
      "nc.request",
      "os.getenv",
      "response",
      "result.get",
      "str",
      "time.monotonic",
      "time.time",
      "validate"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/diagnostic_links.py",
    "name": "diagnostic_links",
    "line": 11,
    "end": 64,
    "lines": 54,
    "language": "python",
    "branches": 12,
    "calls": [
      "(saved.get('response') or {}).get",
      "UUID",
      "ValueError",
      "allowed.extend",
      "any",
      "app['http_client'].get",
      "app['services']['nats_client'].request",
      "asyncio.timeout",
      "bytearray",
      "cache.get",
      "context.get",
      "d.get",
      "data.get",
      "generation.get",
      "isinstance",
      "json.dumps",
      "json.dumps({'action': 'diagnostic', 'session_id': sid, 'request_id': rid, **({'client_id': payload['client_id']} if payload.get('client_id') else {})}).encode",
      "json.loads",
      "len",
      "payload.get",
      "quote",
      "raw.extend",
      "re.fullmatch",
      "reply.content.iter_chunked",
      "saved.get",
      "snapshot.get",
      "span.get",
      "str",
      "time.monotonic",
      "timings.get",
      "tool.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/diagnostic_links.py",
    "name": "diagnostic_command",
    "line": 67,
    "end": 74,
    "lines": 8,
    "language": "python",
    "branches": 1,
    "calls": [
      "diagnostic_links",
      "response"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/handlers/handle_client_timings.py",
    "name": "validate_timings",
    "line": 12,
    "end": 23,
    "lines": 12,
    "language": "python",
    "branches": 5,
    "calls": [
      "ValueError",
      "isinstance",
      "math.isfinite",
      "set",
      "type",
      "values.values"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/handlers/handle_client_timings.py",
    "name": "client_timings_command",
    "line": 26,
    "end": 46,
    "lines": 21,
    "language": "python",
    "branches": 5,
    "calls": [
      "OrderedDict",
      "app.setdefault",
      "client_duration.record",
      "ledger.get",
      "ledger.move_to_end",
      "ledger.popitem",
      "len",
      "response",
      "stage",
      "time.monotonic",
      "validate_timings",
      "values.items"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/handlers/handle_health.py",
    "name": "health_handler",
    "line": 6,
    "end": 25,
    "lines": 20,
    "language": "python",
    "branches": 7,
    "calls": [
      "bool",
      "getattr",
      "info.get",
      "isinstance",
      "len",
      "list",
      "owner.watchdog.done",
      "request.app.get",
      "server_id",
      "web.json_response"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/handlers/handle_health.py",
    "name": "health_handler.server_id",
    "line": 12,
    "end": 14,
    "lines": 3,
    "language": "python",
    "branches": 1,
    "calls": [
      "getattr",
      "info.get",
      "isinstance"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/handlers/handle_shutdown.py",
    "name": "_otel_shutdown",
    "line": 10,
    "end": 12,
    "lines": 3,
    "language": "python",
    "branches": 1,
    "calls": [
      "OTelBootstrap.span",
      "otel_obj.shutdown"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/handlers/handle_shutdown.py",
    "name": "handle_shutdown",
    "line": 19,
    "end": 55,
    "lines": 37,
    "language": "python",
    "branches": 12,
    "calls": [
      "OTelBootstrap.span",
      "_otel_shutdown",
      "app.get",
      "app.pop",
      "app['audio_admission'].close",
      "client.close",
      "client.nc.close",
      "errors.append",
      "services.get",
      "stop_lifecycle",
      "value.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/handlers/handle_startup.py",
    "name": "_nats_connect",
    "line": 21,
    "end": 27,
    "lines": 7,
    "language": "python",
    "branches": 0,
    "calls": [
      "(CHAT_NATS_URL or '').split",
      "NatsClient",
      "OTelBootstrap.span",
      "app.setdefault",
      "nats_client.connect",
      "observe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/handlers/handle_startup.py",
    "name": "_asr_nats_connect",
    "line": 30,
    "end": 52,
    "lines": 23,
    "language": "python",
    "branches": 3,
    "calls": [
      "NatsClient",
      "asyncio.timeout",
      "client.connect",
      "client.nc.close",
      "same_nats_url"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/handlers/handle_startup.py",
    "name": "_event_bus_register",
    "line": 63,
    "end": 70,
    "lines": 8,
    "language": "python",
    "branches": 0,
    "calls": [
      "OTelBootstrap.span",
      "app['vars'].get",
      "register_event_bus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/handlers/handle_startup.py",
    "name": "_event_log_started",
    "line": 77,
    "end": 84,
    "lines": 8,
    "language": "python",
    "branches": 0,
    "calls": [
      "OTelBootstrap.span",
      "event_log"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/handlers/handle_startup.py",
    "name": "_event_log_startup_failed",
    "line": 95,
    "end": 102,
    "lines": 8,
    "language": "python",
    "branches": 0,
    "calls": [
      "OTelBootstrap.span",
      "event_log",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/handlers/handle_startup.py",
    "name": "handle_startup",
    "line": 113,
    "end": 169,
    "lines": 57,
    "language": "python",
    "branches": 10,
    "calls": [
      "AudioAdmission",
      "OTelBootstrap.span",
      "_asr_nats_connect",
      "_event_bus_register",
      "_event_log_started",
      "_event_log_startup_failed",
      "_nats_connect",
      "aiohttp.ClientSession",
      "aiohttp.ClientTimeout",
      "aiohttp.TCPConnector",
      "app.get",
      "app.get('services', {}).get",
      "app.setdefault",
      "app['audio_admission'].close",
      "app['audio_admission'].start",
      "app['browser_api'].close",
      "app['event_bus'].close",
      "bool",
      "client.close",
      "client.nc.close",
      "dict",
      "logger.exception",
      "logger.info",
      "os.getenv",
      "start_browser_api",
      "start_lifecycle",
      "stop_lifecycle"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/handlers/handle_transcription.py",
    "name": "_normalize_turn_id",
    "line": 10,
    "end": 17,
    "lines": 8,
    "language": "python",
    "branches": 3,
    "calls": [
      "UUID",
      "isinstance",
      "str",
      "uuid4",
      "uuid5",
      "value.strip"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/handlers/handle_transcription.py",
    "name": "_clean_text",
    "line": 20,
    "end": 21,
    "lines": 2,
    "language": "python",
    "branches": 1,
    "calls": [
      "isinstance",
      "value.strip"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/handlers/handle_transcription.py",
    "name": "handle_transcription",
    "line": 24,
    "end": 72,
    "lines": 49,
    "language": "python",
    "branches": 12,
    "calls": [
      "OrderedDict",
      "Timings.model_validate",
      "_clean_text",
      "_normalize_turn_id",
      "admission.final_claimed",
      "admission.leases.get",
      "app.get",
      "app.setdefault",
      "data.update",
      "event_log",
      "ledger.move_to_end",
      "ledger.popitem",
      "len",
      "payload.get",
      "str",
      "timings.asr.model_dump",
      "type",
      "uuid5"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/lifecycle.py",
    "name": "state",
    "line": 10,
    "end": 15,
    "lines": 6,
    "language": "python",
    "branches": 1,
    "calls": [
      "app.get",
      "bool",
      "int",
      "len",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/lifecycle.py",
    "name": "start",
    "line": 18,
    "end": 38,
    "lines": 21,
    "language": "python",
    "branches": 4,
    "calls": [
      "LifecycleRequest.model_validate_json",
      "ValueError",
      "json.dumps",
      "json.dumps(result).encode",
      "len",
      "message.respond",
      "nc.flush",
      "nc.subscribe",
      "stage",
      "state"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/lifecycle.py",
    "name": "start.receive",
    "line": 21,
    "end": 34,
    "lines": 14,
    "language": "python",
    "branches": 4,
    "calls": [
      "LifecycleRequest.model_validate_json",
      "ValueError",
      "json.dumps",
      "json.dumps(result).encode",
      "len",
      "message.respond",
      "stage",
      "state"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/lifecycle.py",
    "name": "stop",
    "line": 41,
    "end": 44,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "app.pop",
      "nc_closed",
      "subscription.unsubscribe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/lifecycle.py",
    "name": "nc_closed",
    "line": 47,
    "end": 49,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "app.get",
      "app.get('services', {}).get",
      "bool",
      "getattr"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/main.py",
    "name": "setup_routes",
    "line": 39,
    "end": 43,
    "lines": 5,
    "language": "python",
    "branches": 0,
    "calls": [
      "app.on_shutdown.append",
      "app.on_startup.append",
      "app.router.add_get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/main.py",
    "name": "_ensure_bindable",
    "line": 45,
    "end": 61,
    "lines": 17,
    "language": "python",
    "branches": 3,
    "calls": [
      "RuntimeError",
      "sock.bind",
      "sock.close",
      "sock.setsockopt",
      "socket.socket"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/audio_telemetry.py",
    "name": "span",
    "line": 11,
    "end": 23,
    "lines": 13,
    "language": "python",
    "branches": 3,
    "calls": [
      "UUID",
      "fields.get",
      "propagator.extract",
      "str",
      "tracer.start_as_current_span"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/event_bus.py",
    "name": "EventBus.__init__",
    "line": 14,
    "end": 18,
    "lines": 5,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/event_bus.py",
    "name": "EventBus.configure",
    "line": 20,
    "end": 25,
    "lines": 6,
    "language": "python",
    "branches": 0,
    "calls": [
      "NatsLogger",
      "logger.info"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/event_bus.py",
    "name": "EventBus.close",
    "line": 27,
    "end": 29,
    "lines": 3,
    "language": "python",
    "branches": 1,
    "calls": [
      "self._logger.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/event_bus.py",
    "name": "EventBus.log",
    "line": 31,
    "end": 42,
    "lines": 12,
    "language": "python",
    "branches": 1,
    "calls": [
      "RuntimeError",
      "self._logger.log"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/event_bus.py",
    "name": "register_event_bus",
    "line": 44,
    "end": 54,
    "lines": 11,
    "language": "python",
    "branches": 0,
    "calls": [
      "EventBus",
      "bus.configure"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/event_bus.py",
    "name": "get_event_bus",
    "line": 57,
    "end": 63,
    "lines": 7,
    "language": "python",
    "branches": 2,
    "calls": [
      "RuntimeError",
      "app.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/event_bus.py",
    "name": "event_log",
    "line": 66,
    "end": 76,
    "lines": 11,
    "language": "python",
    "branches": 0,
    "calls": [
      "bus.log",
      "get_event_bus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/nats_client.py",
    "name": "NatsClient.__init__",
    "line": 12,
    "end": 14,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/nats_client.py",
    "name": "NatsClient.connect",
    "line": 16,
    "end": 26,
    "lines": 11,
    "language": "python",
    "branches": 0,
    "calls": [
      "Client",
      "logger.info",
      "self.nc.connect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/nats_client.py",
    "name": "NatsClient.subscribe",
    "line": 28,
    "end": 32,
    "lines": 5,
    "language": "python",
    "branches": 0,
    "calls": [
      "logger.info",
      "self.nc.subscribe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/nats_client.py",
    "name": "NatsClient.request",
    "line": 35,
    "end": 37,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "carrier",
      "len",
      "logger.info",
      "self.nc.request"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/nats_client.py",
    "name": "NatsClient.publish",
    "line": 39,
    "end": 41,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "len",
      "logger.info",
      "self.nc.publish"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/nats_logger.py",
    "name": "NatsPublisher.publish",
    "line": 12,
    "end": 12,
    "lines": 1,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/nats_logger.py",
    "name": "NatsLogger.__init__",
    "line": 16,
    "end": 20,
    "lines": 5,
    "language": "python",
    "branches": 0,
    "calls": [
      "UiQueue"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/nats_logger.py",
    "name": "NatsLogger.log",
    "line": 22,
    "end": 41,
    "lines": 20,
    "language": "python",
    "branches": 0,
    "calls": [
      "datetime.now",
      "datetime.now(tz=timezone.utc).isoformat",
      "json.dumps",
      "json.dumps(payload, ensure_ascii=False).encode",
      "self.queue.put",
      "str",
      "uuid.uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/nats_logger.py",
    "name": "NatsLogger.close",
    "line": 43,
    "end": 44,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "self.queue.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/nats_logger.py",
    "name": "NatsLogger.info",
    "line": 46,
    "end": 53,
    "lines": 8,
    "language": "python",
    "branches": 0,
    "calls": [
      "self.log"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_core/utils/nats_logger.py",
    "name": "NatsLogger.error",
    "line": 55,
    "end": 62,
    "lines": 8,
    "language": "python",
    "branches": 0,
    "calls": [
      "self.log"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/clients/openai_provider.py",
    "name": "measured",
    "line": 19,
    "end": 24,
    "lines": 6,
    "language": "python",
    "branches": 0,
    "calls": [
      "attributes.items",
      "capture",
      "math.isfinite",
      "trace.get_current_span",
      "trace.get_current_span().set_attributes",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/clients/openai_provider.py",
    "name": "generation_values",
    "line": 27,
    "end": 30,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "collector.get",
      "summary.generation_values"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/clients/openai_provider.py",
    "name": "provider_metrics",
    "line": 33,
    "end": 37,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "isinstance",
      "math.isfinite",
      "raw.get",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/clients/openai_provider.py",
    "name": "OpenAIProvider.__init__",
    "line": 41,
    "end": 44,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "endpoint.rstrip",
      "httpx.AsyncClient",
      "httpx.Limits"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/clients/openai_provider.py",
    "name": "OpenAIProvider.count",
    "line": 46,
    "end": 64,
    "lines": 19,
    "language": "python",
    "branches": 3,
    "calls": [
      "ProviderFailure",
      "context.remaining",
      "m.items",
      "min",
      "r.json",
      "r.raise_for_status",
      "self.client.post",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/clients/openai_provider.py",
    "name": "OpenAIProvider.fit",
    "line": 66,
    "end": 95,
    "lines": 30,
    "language": "python",
    "branches": 6,
    "calls": [
      "Draft202012Validator.check_schema",
      "ProviderFailure",
      "ValueError",
      "capture",
      "dict",
      "enumerate",
      "isinstance",
      "len",
      "m.get",
      "m.items",
      "measured",
      "messages.pop",
      "next",
      "removed.append",
      "self.count"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/clients/openai_provider.py",
    "name": "OpenAIProvider.chat",
    "line": 97,
    "end": 100,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "self._chat",
      "stage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/clients/openai_provider.py",
    "name": "OpenAIProvider._chat",
    "line": 102,
    "end": 282,
    "lines": 181,
    "language": "python",
    "branches": 38,
    "calls": [
      "(_ for _ in ()).throw",
      "(c.get('function') or {}).get",
      "Draft202012Validator",
      "Draft202012Validator(catalog[call['name']]).validate",
      "ProviderFailure",
      "ValueError",
      "VisibleText",
      "any",
      "archive",
      "asyncio.timeout",
      "bool",
      "c.get",
      "calls.setdefault",
      "calls.values",
      "capture",
      "choice.get",
      "context.remaining",
      "delta.get",
      "diagnostic",
      "enumerate",
      "generation_values",
      "generations.add",
      "isinstance",
      "item.get",
      "iter",
      "json.dumps",
      "json.dumps(payload, ensure_ascii=False).encode",
      "json.loads",
      "len",
      "line.encode",
      "line.startswith",
      "line[5:].strip",
      "list",
      "max",
      "measured",
      "metrics.items",
      "model_diagnostic",
      "next",
      "on_fragment",
      "output.append",
      "part.decode",
      "payload.items",
      "payload.update",
      "provider_metrics",
      "r.aiter_bytes",
      "r.aiter_lines",
      "r.raise_for_status",
      "received.append",
      "received.clear",
      "self.client.base_url.join",
      "self.client.stream",
      "sorted",
      "str",
      "t.get",
      "t.get('function', {}).get",
      "text.feed",
      "text.finish",
      "time.monotonic",
      "tokens.add",
      "type",
      "usage.get",
      "{'id': call['id'], 'function.name': call['name'], 'function.arguments': json.dumps(call['arguments'], ensure_ascii=False)}.items"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/clients/openai_provider.py",
    "name": "OpenAIProvider.close",
    "line": 284,
    "end": 285,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "self.client.aclose"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/clients/provider.py",
    "name": "ProviderFailure.__init__",
    "line": 3,
    "end": 6,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "super",
      "super().__init__"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/clients/provider.py",
    "name": "VisibleText.__init__",
    "line": 15,
    "end": 21,
    "lines": 7,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/clients/provider.py",
    "name": "VisibleText.feed",
    "line": 23,
    "end": 49,
    "lines": 27,
    "language": "python",
    "branches": 6,
    "calls": [
      "'<think>'.startswith",
      "ProviderFailure",
      "bool",
      "len",
      "prefix.startswith",
      "self.buffer.find",
      "self.buffer.lstrip",
      "self.buffer[end + 8:].lstrip"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/clients/provider.py",
    "name": "VisibleText.finish",
    "line": 51,
    "end": 57,
    "lines": 7,
    "language": "python",
    "branches": 2,
    "calls": [
      "ProviderFailure",
      "self.text.strip"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/main.py",
    "name": "configure_logging",
    "line": 13,
    "end": 17,
    "lines": 5,
    "language": "python",
    "branches": 0,
    "calls": [
      "logging.basicConfig"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/main.py",
    "name": "_run_service",
    "line": 20,
    "end": 27,
    "lines": 8,
    "language": "python",
    "branches": 0,
    "calls": [
      "LLMService",
      "service.run"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/main.py",
    "name": "main",
    "line": 30,
    "end": 38,
    "lines": 9,
    "language": "python",
    "branches": 1,
    "calls": [
      "SystemExit",
      "_run_service",
      "asyncio.run",
      "configure_logging",
      "logging.getLogger",
      "logging.getLogger('main').exception"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/service.py",
    "name": "LLMService.__init__",
    "line": 17,
    "end": 20,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "super",
      "super().__init__"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/service.py",
    "name": "LLMService.on_run",
    "line": 22,
    "end": 25,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "NatsLogger",
      "NatsLogger(self._nc, self._events_subject, self._service_name).log",
      "OpenAIProvider",
      "os.getenv"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/service.py",
    "name": "LLMService.on_shutdown",
    "line": 27,
    "end": 29,
    "lines": 3,
    "language": "python",
    "branches": 1,
    "calls": [
      "self.agent_provider.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/service.py",
    "name": "LLMService.on_message",
    "line": 31,
    "end": 33,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "context.remaining",
      "self.agent_step"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/service.py",
    "name": "LLMService.publish_model_diagnostic",
    "line": 35,
    "end": 58,
    "lines": 24,
    "language": "python",
    "branches": 4,
    "calls": [
      "carrier",
      "context.remaining",
      "json.dumps",
      "json.dumps(data, ensure_ascii=False).encode",
      "json.dumps(data, ensure_ascii=False, allow_nan=False).encode",
      "json.loads",
      "len",
      "min",
      "self._nc.request",
      "trace.get_current_span",
      "trace.get_current_span().get_span_context"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/service.py",
    "name": "LLMService.agent_step",
    "line": 60,
    "end": 105,
    "lines": 46,
    "language": "python",
    "branches": 17,
    "calls": [
      "(metadata or {}).get",
      "AgentStepConstraints.model_validate",
      "AgentStepData.model_validate",
      "AgentStepInput.model_validate",
      "LlmResponse.from_validated_data",
      "any",
      "archive",
      "bool",
      "enabled",
      "getattr",
      "isinstance",
      "item.get",
      "m.get",
      "payload.get",
      "recorder.emit",
      "response.model_dump",
      "self.agent_provider.chat",
      "self.agent_provider.fit",
      "self.publish_model_diagnostic",
      "stage",
      "str",
      "sum",
      "trace.get_current_span",
      "trace.get_current_span().set_attribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/service.py",
    "name": "LLMService.agent_step.exchange",
    "line": 68,
    "end": 81,
    "lines": 14,
    "language": "python",
    "branches": 10,
    "calls": [
      "(metadata or {}).get",
      "archive",
      "isinstance",
      "payload.get",
      "recorder.emit",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/token_budget.py",
    "name": "ollama_prompt",
    "line": 14,
    "end": 49,
    "lines": 36,
    "language": "python",
    "branches": 7,
    "calls": [
      "'\\n\\n'.join",
      "encoded",
      "json.dumps",
      "json.dumps(value, ensure_ascii=False, separators=(',', ':'), allow_nan=False).replace",
      "json.dumps(value, ensure_ascii=False, separators=(',', ':'), allow_nan=False).replace('<', '\\\\u003c').replace",
      "json.dumps(value, ensure_ascii=False, separators=(',', ':'), allow_nan=False).replace('<', '\\\\u003c').replace('>', '\\\\u003e').replace",
      "message.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/token_budget.py",
    "name": "ollama_prompt.encoded",
    "line": 20,
    "end": 22,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "json.dumps",
      "json.dumps(value, ensure_ascii=False, separators=(',', ':'), allow_nan=False).replace",
      "json.dumps(value, ensure_ascii=False, separators=(',', ':'), allow_nan=False).replace('<', '\\\\u003c').replace",
      "json.dumps(value, ensure_ascii=False, separators=(',', ':'), allow_nan=False).replace('<', '\\\\u003c').replace('>', '\\\\u003e').replace"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/token_budget.py",
    "name": "TokenBudget.__init__",
    "line": 53,
    "end": 62,
    "lines": 10,
    "language": "python",
    "branches": 2,
    "calls": [
      "(directory / 'tokenizer_config.json').read_text",
      "(directory / name).read_bytes",
      "FILES.items",
      "ImmutableSandboxedEnvironment",
      "Path",
      "RuntimeError",
      "Tokenizer.from_file",
      "environment.from_string",
      "json.dumps",
      "json.loads",
      "sha256",
      "sha256((directory / name).read_bytes()).hexdigest",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/token_budget.py",
    "name": "TokenBudget.count",
    "line": 64,
    "end": 72,
    "lines": 9,
    "language": "python",
    "branches": 1,
    "calls": [
      "len",
      "max",
      "ollama_prompt",
      "self.template.render",
      "self.tokenizer.encode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/token_budget.py",
    "name": "TokenBudget.fit",
    "line": 74,
    "end": 86,
    "lines": 13,
    "language": "python",
    "branches": 3,
    "calls": [
      "RequestStopped",
      "clean",
      "dict",
      "enumerate",
      "len",
      "message.get",
      "message.items",
      "messages.pop",
      "messages[index].get",
      "next",
      "self.count"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/token_budget.py",
    "name": "TokenBudget.fit.clean",
    "line": 76,
    "end": 77,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "message.items"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/tokenizer_assets.py",
    "name": "fetch",
    "line": 15,
    "end": 26,
    "lines": 12,
    "language": "python",
    "branches": 3,
    "calls": [
      "FILES.items",
      "Path",
      "RuntimeError",
      "directory.mkdir",
      "path.exists",
      "path.read_bytes",
      "path.write_bytes",
      "response.read",
      "sha256",
      "sha256(data).hexdigest",
      "sha256(path.read_bytes()).hexdigest",
      "urlopen"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/base_service.py",
    "name": "BaseService.__init__",
    "line": 21,
    "end": 33,
    "lines": 13,
    "language": "python",
    "branches": 1,
    "calls": [
      "CancellationLedger",
      "FairPool",
      "ValueError",
      "asyncio.Event",
      "set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/base_service.py",
    "name": "BaseService.run",
    "line": 35,
    "end": 57,
    "lines": 23,
    "language": "python",
    "branches": 2,
    "calls": [
      "asyncio.gather",
      "asyncio.get_running_loop",
      "asyncio.get_running_loop().add_signal_handler",
      "bootstrap",
      "list",
      "logger.info",
      "nats.connect",
      "observe",
      "self._nc.close",
      "self._nc.subscribe",
      "self._pool.close",
      "self._stop_event.wait",
      "self.on_run",
      "self.on_shutdown"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/base_service.py",
    "name": "BaseService._health",
    "line": 59,
    "end": 60,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "json.dumps",
      "json.dumps({'ok': True, 'active': self._pool.running, 'waiting': self._pool.pending}).encode",
      "msg.respond"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/base_service.py",
    "name": "BaseService._handle_message",
    "line": 62,
    "end": 79,
    "lines": 18,
    "language": "python",
    "branches": 4,
    "calls": [
      "ExecutionContext.from_headers",
      "LlmRequest.model_validate_json",
      "RequestStopped",
      "context.remaining",
      "getattr",
      "job.future.add_done_callback",
      "len",
      "self._cancelled.contains",
      "self._execute",
      "self._pool.submit",
      "self._reply",
      "self._schedule_reply",
      "self.error_response",
      "str",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/base_service.py",
    "name": "BaseService._execute",
    "line": 81,
    "end": 109,
    "lines": 29,
    "language": "python",
    "branches": 5,
    "calls": [
      "TimingCollector",
      "Timings.model_validate",
      "bind_identity",
      "collector.reset",
      "collector.set",
      "context.remaining",
      "current.set_attribute",
      "current_diagnostic",
      "execution.reset",
      "execution.set",
      "getattr",
      "identity.reset",
      "isinstance",
      "max",
      "self.on_message",
      "stage",
      "str",
      "summary.begin_generation",
      "summary.generation_values",
      "summary.snapshot",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/base_service.py",
    "name": "BaseService._schedule_reply",
    "line": 111,
    "end": 116,
    "lines": 6,
    "language": "python",
    "branches": 1,
    "calls": [
      "asyncio.create_task",
      "job[2].task_context.copy",
      "self._finish",
      "self._jobs.get",
      "self._replies.add",
      "str",
      "task.add_done_callback"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/base_service.py",
    "name": "BaseService._finish",
    "line": 118,
    "end": 127,
    "lines": 10,
    "language": "python",
    "branches": 2,
    "calls": [
      "Timings.model_validate",
      "future.result",
      "getattr",
      "logger.warning",
      "self._jobs.pop",
      "self._reply",
      "self.error_response",
      "str",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/base_service.py",
    "name": "BaseService.error_response",
    "line": 130,
    "end": 133,
    "lines": 4,
    "language": "python",
    "branches": 3,
    "calls": [
      "ErrorInfo",
      "LlmResponse",
      "now_ts_ms",
      "uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/base_service.py",
    "name": "BaseService._reply",
    "line": 135,
    "end": 140,
    "lines": 6,
    "language": "python",
    "branches": 2,
    "calls": [
      "logger.warning",
      "msg.respond",
      "response.model_dump_json",
      "response.model_dump_json().encode",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/base_service.py",
    "name": "BaseService._handle_cancel",
    "line": 142,
    "end": 153,
    "lines": 12,
    "language": "python",
    "branches": 4,
    "calls": [
      "ValueError",
      "json.loads",
      "len",
      "list",
      "msg.respond",
      "self._cancelled.cancel",
      "self._jobs.values",
      "self._pool.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/base_service.py",
    "name": "BaseService.on_message",
    "line": 155,
    "end": 156,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/base_service.py",
    "name": "BaseService.on_run",
    "line": 158,
    "end": 159,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/base_service.py",
    "name": "BaseService.on_shutdown",
    "line": 161,
    "end": 162,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/nats_logger.py",
    "name": "NatsLogger.__init__",
    "line": 12,
    "end": 15,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/nats_logger.py",
    "name": "NatsLogger.log",
    "line": 17,
    "end": 38,
    "lines": 22,
    "language": "python",
    "branches": 0,
    "calls": [
      "datetime.now",
      "datetime.now(tz=timezone.utc).isoformat",
      "json.dumps",
      "json.dumps(payload, ensure_ascii=False).encode",
      "self._nc.publish",
      "str",
      "to_json_safe",
      "uuid.uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/nats_logger.py",
    "name": "NatsLogger.info",
    "line": 40,
    "end": 43,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "isinstance",
      "self.log",
      "to_json_safe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/nats_logger.py",
    "name": "NatsLogger.error",
    "line": 45,
    "end": 48,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "isinstance",
      "self.log",
      "to_json_safe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_llm/utils/to_json_safe.py",
    "name": "to_json_safe",
    "line": 4,
    "end": 29,
    "lines": 26,
    "language": "python",
    "branches": 7,
    "calls": [
      "hasattr",
      "isinstance",
      "str",
      "to_json_safe",
      "value.isoformat",
      "value.items",
      "vars"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio.py",
    "name": "AudioFailure.__init__",
    "line": 17,
    "end": 19,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "super",
      "super().__init__"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio.py",
    "name": "AudioBroker.__init__",
    "line": 23,
    "end": 33,
    "lines": 11,
    "language": "python",
    "branches": 0,
    "calls": [
      "asyncio.Lock",
      "set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio.py",
    "name": "AudioBroker.connect",
    "line": 35,
    "end": 44,
    "lines": 10,
    "language": "python",
    "branches": 2,
    "calls": [
      "AudioFailure",
      "asyncio.create_task",
      "nats.connect",
      "self._periodic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio.py",
    "name": "AudioBroker.disconnected",
    "line": 46,
    "end": 50,
    "lines": 5,
    "language": "python",
    "branches": 2,
    "calls": [
      "stream.fail",
      "tuple"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio.py",
    "name": "AudioBroker.publish",
    "line": 52,
    "end": 62,
    "lines": 11,
    "language": "python",
    "branches": 3,
    "calls": [
      "AudioFailure",
      "asyncio.wait_for",
      "hasattr",
      "nc.publish",
      "self.disconnected"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio.py",
    "name": "AudioBroker.flush",
    "line": 64,
    "end": 90,
    "lines": 27,
    "language": "python",
    "branches": 6,
    "calls": [
      "AudioFailure",
      "asyncio.create_task",
      "asyncio.gather",
      "asyncio.shield",
      "asyncio.wait_for",
      "self.disconnected",
      "self.nc.close",
      "self.nc.flush",
      "task.cancel",
      "tel.flushes.add"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio.py",
    "name": "AudioBroker._periodic",
    "line": 92,
    "end": 99,
    "lines": 8,
    "language": "python",
    "branches": 3,
    "calls": [
      "asyncio.sleep",
      "self.disconnected",
      "self.flush"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio.py",
    "name": "AudioBroker.close",
    "line": 101,
    "end": 107,
    "lines": 7,
    "language": "python",
    "branches": 2,
    "calls": [
      "asyncio.gather",
      "self.nc.close",
      "self.timer.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_archive.py",
    "name": "ArchiveInput.finite",
    "line": 23,
    "end": 69,
    "lines": 47,
    "language": "python",
    "branches": 31,
    "calls": [
      "UUID",
      "ValueError",
      "any",
      "data.get",
      "data.keys",
      "data[name].values",
      "datetime.fromisoformat",
      "enumerate",
      "integer",
      "isinstance",
      "len",
      "math.isfinite",
      "model_validator",
      "p.keys",
      "p['sent_at'].replace",
      "re.fullmatch",
      "set",
      "str",
      "sum",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_archive.py",
    "name": "ArchiveInput.finite.integer",
    "line": 33,
    "end": 34,
    "lines": 2,
    "language": "python",
    "branches": 1,
    "calls": [
      "ValueError",
      "data.get",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_archive.py",
    "name": "ReplayInput.selected",
    "line": 85,
    "end": 92,
    "lines": 8,
    "language": "python",
    "branches": 4,
    "calls": [
      "ValueError",
      "model_validator"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_archive.py",
    "name": "request_id",
    "line": 95,
    "end": 97,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "str",
      "uuid5"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_batch.py",
    "name": "packet",
    "line": 11,
    "end": 15,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "ValueError",
      "json.dumps",
      "json.dumps(meta, separators=(',', ':'), allow_nan=False).encode",
      "len",
      "len(raw).to_bytes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_batch.py",
    "name": "normalize",
    "line": 18,
    "end": 30,
    "lines": 13,
    "language": "python",
    "branches": 2,
    "calls": [
      "AudioFrame.from_ndarray",
      "AudioResampler",
      "Fraction",
      "ValueError",
      "b''.join",
      "bytes",
      "converter.resample",
      "f.to_ndarray",
      "f.to_ndarray().astype",
      "f.to_ndarray().astype('<i2', copy=False).tobytes",
      "len",
      "np.frombuffer",
      "np.frombuffer(pcm, '<i2').reshape"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_batch.py",
    "name": "submit",
    "line": 33,
    "end": 76,
    "lines": 44,
    "language": "python",
    "branches": 6,
    "calls": [
      "ValueError",
      "asyncio.timeout",
      "enumerate",
      "getattr",
      "hashlib.sha256",
      "hashlib.sha256(pcm).hexdigest",
      "hashlib.sha256(source_pcm).hexdigest",
      "headers.get",
      "journal.emit",
      "json.loads",
      "len",
      "meta.get",
      "normalize",
      "on_pcm",
      "packet",
      "range",
      "receipt.get",
      "time.monotonic",
      "wire.publish",
      "wire.request"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_control.py",
    "name": "uuid",
    "line": 14,
    "end": 15,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "UUID",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_control.py",
    "name": "audio_control",
    "line": 18,
    "end": 24,
    "lines": 7,
    "language": "python",
    "branches": 1,
    "calls": [
      "ValueError",
      "carrier",
      "isinstance",
      "json.dumps",
      "json.dumps({'action': action, **fields}).encode",
      "json.loads",
      "nc.request"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_diagnostics.py",
    "name": "AudioDiagnostics.__init__",
    "line": 16,
    "end": 35,
    "lines": 20,
    "language": "python",
    "branches": 0,
    "calls": [
      "asyncio.Queue",
      "asyncio.create_task",
      "np.empty",
      "self.run"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_diagnostics.py",
    "name": "AudioDiagnostics.active",
    "line": 37,
    "end": 38,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "self.recording",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_diagnostics.py",
    "name": "AudioDiagnostics.recording",
    "line": 40,
    "end": 41,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "bool",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_diagnostics.py",
    "name": "AudioDiagnostics.metadata",
    "line": 43,
    "end": 50,
    "lines": 8,
    "language": "python",
    "branches": 2,
    "calls": [
      "data.update",
      "max",
      "self.active",
      "self.recording",
      "time.monotonic",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_diagnostics.py",
    "name": "AudioDiagnostics.channel",
    "line": 52,
    "end": 64,
    "lines": 13,
    "language": "python",
    "branches": 3,
    "calls": [
      "(source + '\\x00' + target + '\\x00' + subject + '\\x00' + direction).encode",
      "dict",
      "hashlib.sha256",
      "hashlib.sha256((source + '\\x00' + target + '\\x00' + subject + '\\x00' + direction).encode()).hexdigest",
      "len",
      "row.update",
      "self.active",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_diagnostics.py",
    "name": "AudioDiagnostics.pcm",
    "line": 66,
    "end": 86,
    "lines": 21,
    "language": "python",
    "branches": 7,
    "calls": [
      "f.max",
      "f.min",
      "float",
      "len",
      "max",
      "min",
      "np.concatenate",
      "np.dot",
      "np.frombuffer",
      "self.active",
      "self.put",
      "self.recording",
      "values.astype"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_diagnostics.py",
    "name": "AudioDiagnostics.put",
    "line": 88,
    "end": 92,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "self.queue.put_nowait"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_diagnostics.py",
    "name": "AudioDiagnostics.remote",
    "line": 94,
    "end": 111,
    "lines": 18,
    "language": "python",
    "branches": 7,
    "calls": [
      "data.get",
      "json.loads",
      "len",
      "self.active",
      "self.put",
      "self.send",
      "time.monotonic",
      "value.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_diagnostics.py",
    "name": "AudioDiagnostics.command",
    "line": 113,
    "end": 154,
    "lines": 42,
    "language": "python",
    "branches": 15,
    "calls": [
      "bool",
      "data.get",
      "len",
      "row.get",
      "rows.append",
      "self.active",
      "self.queue.empty",
      "self.records.clear",
      "self.release",
      "str",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_diagnostics.py",
    "name": "AudioDiagnostics.release",
    "line": 156,
    "end": 159,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "self.queue.empty",
      "self.queue.get_nowait",
      "self.records.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_diagnostics.py",
    "name": "AudioDiagnostics.store",
    "line": 161,
    "end": 178,
    "lines": 18,
    "language": "python",
    "branches": 5,
    "calls": [
      "base64.b64decode",
      "base64.b64encode",
      "base64.b64encode(raw[chunk * CHUNK:(chunk + 1) * CHUNK]).decode",
      "data.get",
      "hashlib.sha256",
      "hashlib.sha256(raw).hexdigest",
      "len",
      "math.ceil",
      "max",
      "range",
      "self.records.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_diagnostics.py",
    "name": "AudioDiagnostics.run",
    "line": 180,
    "end": 216,
    "lines": 37,
    "language": "python",
    "branches": 11,
    "calls": [
      "asyncio.sleep",
      "b.max",
      "data.update",
      "float",
      "len",
      "list",
      "math.log10",
      "math.sqrt",
      "max",
      "min",
      "np.abs",
      "np.array_split",
      "np.fft.rfft",
      "np.hanning",
      "range",
      "self.active",
      "self.channels.values",
      "self.queue.get_nowait",
      "self.queue.qsize",
      "self.release",
      "self.send",
      "self.store",
      "self.tail.astype",
      "time.monotonic",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_diagnostics.py",
    "name": "AudioDiagnostics.close",
    "line": 218,
    "end": 220,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "asyncio.gather",
      "np.empty",
      "self.channels.clear",
      "self.release",
      "self.task.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_ingress.py",
    "name": "health",
    "line": 35,
    "end": 38,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "len",
      "web.json_response"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_ingress.py",
    "name": "start",
    "line": 41,
    "end": 57,
    "lines": 17,
    "language": "python",
    "branches": 4,
    "calls": [
      "api.background",
      "api.owners.values",
      "app.get",
      "bootstrap",
      "isinstance",
      "list",
      "logger.error",
      "nats.connect",
      "observe",
      "owner.failed",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_ingress.py",
    "name": "start.transport_error",
    "line": 44,
    "end": 52,
    "lines": 9,
    "language": "python",
    "branches": 3,
    "calls": [
      "api.background",
      "api.owners.values",
      "app.get",
      "isinstance",
      "list",
      "logger.error",
      "owner.failed",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_ingress.py",
    "name": "stop",
    "line": 60,
    "end": 67,
    "lines": 8,
    "language": "python",
    "branches": 2,
    "calls": [
      "asyncio.gather",
      "list",
      "s.close",
      "state.broker.close",
      "state.control_nc.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_ingress.py",
    "name": "application",
    "line": 70,
    "end": 80,
    "lines": 11,
    "language": "python",
    "branches": 0,
    "calls": [
      "IngressState",
      "app.on_shutdown.append",
      "app.on_startup.append",
      "app.router.add_get",
      "nats_url",
      "os.environ.get",
      "web.Application"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_ingress.py",
    "name": "admit",
    "line": 83,
    "end": 123,
    "lines": 41,
    "language": "python",
    "branches": 10,
    "calls": [
      "(browser_context or {}).get",
      "AudioBroker",
      "BatchCapture",
      "RequestStopped",
      "audio_control",
      "broker.close",
      "broker.connect",
      "fields.get",
      "len",
      "same_nats_url",
      "session.start",
      "str",
      "uuid",
      "uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/audio_live.py",
    "name": "events_subject",
    "line": 8,
    "end": 9,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "UUID",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/aviation.py",
    "name": "decode",
    "line": 17,
    "end": 18,
    "lines": 2,
    "language": "python",
    "branches": 1,
    "calls": [
      "isinstance",
      "json.loads"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/aviation.py",
    "name": "encode",
    "line": 21,
    "end": 22,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "json.dumps"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/aviation.py",
    "name": "consistent_read",
    "line": 25,
    "end": 36,
    "lines": 12,
    "language": "python",
    "branches": 2,
    "calls": [
      "RequestStopped",
      "method",
      "range",
      "wraps"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/aviation.py",
    "name": "consistent_read.retry",
    "line": 27,
    "end": 35,
    "lines": 9,
    "language": "python",
    "branches": 2,
    "calls": [
      "RequestStopped",
      "method",
      "range",
      "wraps"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/aviation.py",
    "name": "seed",
    "line": 39,
    "end": 43,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "SEED_PATH.read_text",
      "airport.pop",
      "json.loads"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/aviation.py",
    "name": "AviationStore.__init__",
    "line": 56,
    "end": 57,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/aviation.py",
    "name": "AviationStore.initialize",
    "line": 59,
    "end": 63,
    "lines": 5,
    "language": "python",
    "branches": 0,
    "calls": [
      "Path",
      "Path(__file__).with_name",
      "Path(__file__).with_name('aviation_schema.sql').read_text",
      "conn.execute",
      "conn.transaction",
      "encode",
      "seed",
      "self.pool.acquire"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/aviation.py",
    "name": "AviationStore._position",
    "line": 65,
    "end": 68,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "UUID",
      "conn.execute",
      "conn.fetchrow",
      "dict",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/aviation.py",
    "name": "AviationStore.view",
    "line": 71,
    "end": 77,
    "lines": 7,
    "language": "python",
    "branches": 0,
    "calls": [
      "UUID",
      "conn.fetch",
      "conn.fetchrow",
      "conn.transaction",
      "decode",
      "self._position",
      "self.pool.acquire",
      "str",
      "with_weather"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/aviation.py",
    "name": "AviationStore.move",
    "line": 79,
    "end": 81,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "conn.transaction",
      "self._move",
      "self.pool.acquire"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/aviation.py",
    "name": "AviationStore._move",
    "line": 83,
    "end": 89,
    "lines": 7,
    "language": "python",
    "branches": 1,
    "calls": [
      "PositionUpdate.model_validate",
      "RequestStopped",
      "UUID",
      "conn.fetchrow",
      "dict",
      "self._position",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/aviation.py",
    "name": "AviationStore.command",
    "line": 91,
    "end": 109,
    "lines": 19,
    "language": "python",
    "branches": 4,
    "calls": [
      "RequestStopped",
      "UUID",
      "conn.execute",
      "conn.fetchrow",
      "conn.transaction",
      "decode",
      "encode",
      "hashlib.sha256",
      "hashlib.sha256(json.dumps({'operation': operation, 'value': value}, sort_keys=True, ensure_ascii=False, allow_nan=False).encode()).hexdigest",
      "json.dumps",
      "json.dumps({'operation': operation, 'value': value}, sort_keys=True, ensure_ascii=False, allow_nan=False).encode",
      "self._edit_demo",
      "self._move",
      "self.pool.acquire",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/aviation.py",
    "name": "AviationStore.command_state",
    "line": 111,
    "end": 115,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "RequestStopped",
      "UUID",
      "decode",
      "self.pool.fetchrow",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/aviation.py",
    "name": "AviationStore.edit_demo",
    "line": 117,
    "end": 119,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "conn.transaction",
      "self._edit_demo",
      "self.pool.acquire"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/aviation.py",
    "name": "AviationStore._edit_demo",
    "line": 121,
    "end": 175,
    "lines": 55,
    "language": "python",
    "branches": 21,
    "calls": [
      "AirportUpdate.model_validate",
      "FlightUpdate.model_validate",
      "RequestStopped",
      "any",
      "conn.fetchrow",
      "conn.fetchval",
      "data['flight'].update",
      "decode",
      "deepcopy",
      "encode",
      "len",
      "next",
      "seed",
      "set",
      "type",
      "update.model_dump"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/batch_capture.py",
    "name": "BatchCapture.__init__",
    "line": 12,
    "end": 26,
    "lines": 15,
    "language": "python",
    "branches": 0,
    "calls": [
      "OrderedDict",
      "asyncio.Lock",
      "deque",
      "set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/batch_capture.py",
    "name": "BatchCapture.start",
    "line": 28,
    "end": 31,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "asyncio.create_task",
      "self._heartbeat",
      "self.broker.streams.add",
      "tel.active.add"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/batch_capture.py",
    "name": "BatchCapture.feed_pcm",
    "line": 33,
    "end": 44,
    "lines": 12,
    "language": "python",
    "branches": 3,
    "calls": [
      "AudioFailure",
      "bytes",
      "len",
      "max",
      "self.parts.append",
      "self.parts.popleft"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/batch_capture.py",
    "name": "BatchCapture.source",
    "line": 46,
    "end": 53,
    "lines": 8,
    "language": "python",
    "branches": 2,
    "calls": [
      "AudioFailure",
      "b''.join",
      "len",
      "max",
      "min"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/batch_capture.py",
    "name": "BatchCapture.boundary",
    "line": 55,
    "end": 96,
    "lines": 42,
    "language": "python",
    "branches": 10,
    "calls": [
      "AudioFailure",
      "admitted.get",
      "asyncio.create_task",
      "audio_control",
      "bool",
      "context.get",
      "context.set",
      "data.get",
      "dict",
      "len",
      "metadata.update",
      "request_id",
      "self._submit",
      "self.active.get",
      "self.fields.get",
      "self.receipts.get",
      "self.receipts.popitem",
      "self.source",
      "self.submissions.add",
      "task.add_done_callback"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/batch_capture.py",
    "name": "BatchCapture._submit",
    "line": 98,
    "end": 108,
    "lines": 11,
    "language": "python",
    "branches": 3,
    "calls": [
      "audio_control",
      "getattr",
      "metadata.get",
      "self.fail",
      "self.live.pcm",
      "str",
      "submit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/batch_capture.py",
    "name": "BatchCapture._heartbeat",
    "line": 110,
    "end": 120,
    "lines": 11,
    "language": "python",
    "branches": 4,
    "calls": [
      "AudioFailure",
      "asyncio.sleep",
      "audio_control",
      "isinstance",
      "result.get",
      "self.fail"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/batch_capture.py",
    "name": "BatchCapture.fail",
    "line": 122,
    "end": 128,
    "lines": 7,
    "language": "python",
    "branches": 2,
    "calls": [
      "asyncio.create_task",
      "failed",
      "self.close",
      "self.on_failure"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/batch_capture.py",
    "name": "BatchCapture.fail.failed",
    "line": 125,
    "end": 127,
    "lines": 3,
    "language": "python",
    "branches": 1,
    "calls": [
      "self.close",
      "self.on_failure"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/batch_capture.py",
    "name": "BatchCapture.close",
    "line": 130,
    "end": 178,
    "lines": 49,
    "language": "python",
    "branches": 18,
    "calls": [
      "AudioFailure",
      "asyncio.gather",
      "asyncio.sleep",
      "asyncio.timeout",
      "audio_control",
      "getattr",
      "isinstance",
      "journal.emit",
      "packet",
      "result.get",
      "self.broker.streams.discard",
      "self.fields.get",
      "self.heartbeat.cancel",
      "self.parts.clear",
      "self.receipts.clear",
      "task.cancel",
      "tel.active.add",
      "tuple",
      "wire.publish"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_api.py",
    "name": "NoteSave.valid_text",
    "line": 47,
    "end": 53,
    "lines": 7,
    "language": "python",
    "branches": 2,
    "calls": [
      "ValueError",
      "field_validator",
      "len",
      "value.encode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_api.py",
    "name": "AudioStart.codec_protocol",
    "line": 97,
    "end": 100,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "ValueError",
      "model_validator"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_api.py",
    "name": "BrowserVad.parameters_match",
    "line": 118,
    "end": 124,
    "lines": 7,
    "language": "python",
    "branches": 2,
    "calls": [
      "ValueError",
      "field_validator",
      "set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_api.py",
    "name": "AudioPhrase.complete_boundary",
    "line": 141,
    "end": 146,
    "lines": 6,
    "language": "python",
    "branches": 1,
    "calls": [
      "ValueError",
      "model_validator"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_api.py",
    "name": "AudioDiagnosticsQuery.capture_required",
    "line": 158,
    "end": 161,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "ValueError",
      "model_validator",
      "self.action.startswith"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_api.py",
    "name": "validate",
    "line": 177,
    "end": 200,
    "lines": 24,
    "language": "python",
    "branches": 9,
    "calls": [
      "RequestStopped",
      "UUID",
      "ValueError",
      "data.get",
      "data.items",
      "isinstance",
      "payload.get",
      "payload.items",
      "schema.model_validate",
      "schema.model_validate(payload).model_dump",
      "str",
      "{'browser_context': WidgetRegisterContext, 'browser_tool_result': WidgetToolResult}.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_api.py",
    "name": "response",
    "line": 203,
    "end": 204,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_api.py",
    "name": "Endpoint.__init__",
    "line": 208,
    "end": 214,
    "lines": 7,
    "language": "python",
    "branches": 0,
    "calls": [
      "set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_api.py",
    "name": "Endpoint.start",
    "line": 216,
    "end": 219,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "self.nc.flush",
      "self.nc.subscribe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_api.py",
    "name": "Endpoint.receive",
    "line": 221,
    "end": 231,
    "lines": 11,
    "language": "python",
    "branches": 3,
    "calls": [
      "asyncio.create_task",
      "len",
      "msg.respond",
      "self.reply_filter",
      "self.run",
      "self.tasks.add",
      "task.add_done_callback"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_api.py",
    "name": "Endpoint.run",
    "line": 233,
    "end": 263,
    "lines": 31,
    "language": "python",
    "branches": 11,
    "calls": [
      "ValueError",
      "asyncio.timeout",
      "data.get",
      "isinstance",
      "json.dumps",
      "json.dumps(result, ensure_ascii=False, default=str, allow_nan=False).encode",
      "json.loads",
      "len",
      "msg.respond",
      "msg.subject.rsplit",
      "response",
      "self.handler",
      "stage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_api.py",
    "name": "Endpoint.close",
    "line": 265,
    "end": 270,
    "lines": 6,
    "language": "python",
    "branches": 2,
    "calls": [
      "asyncio.gather",
      "getattr",
      "list",
      "self.subscription.unsubscribe",
      "task.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_nats.py",
    "name": "encode",
    "line": 23,
    "end": 24,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "base64.urlsafe_b64encode",
      "base64.urlsafe_b64encode(raw).rstrip",
      "base64.urlsafe_b64encode(raw).rstrip(b'=').decode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_nats.py",
    "name": "decode",
    "line": 27,
    "end": 28,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "base64.urlsafe_b64decode",
      "len"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_nats.py",
    "name": "prefix",
    "line": 31,
    "end": 35,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "UUID",
      "ValueError"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_nats.py",
    "name": "permissions",
    "line": 38,
    "end": 50,
    "lines": 13,
    "language": "python",
    "branches": 3,
    "calls": [
      "allowed_commands",
      "claims.get",
      "prefix",
      "publish.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_nats.py",
    "name": "allowed_commands",
    "line": 53,
    "end": 62,
    "lines": 10,
    "language": "python",
    "branches": 6,
    "calls": [
      "ValueError",
      "claims.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_nats.py",
    "name": "BrowserGrants.__init__",
    "line": 66,
    "end": 70,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "ValueError",
      "hashlib.sha256",
      "hashlib.sha256(b'chat-agent.browser.grant.v1\\x00' + seed.encode()).digest",
      "seed.encode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_nats.py",
    "name": "BrowserGrants.sign",
    "line": 72,
    "end": 74,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "body.encode",
      "encode",
      "hmac.digest",
      "json.dumps",
      "json.dumps(claims, sort_keys=True, separators=(',', ':'), allow_nan=False).encode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_nats.py",
    "name": "BrowserGrants.verify",
    "line": 76,
    "end": 98,
    "lines": 23,
    "language": "python",
    "branches": 7,
    "calls": [
      "UUID",
      "ValueError",
      "allowed_commands",
      "body.encode",
      "claims.get",
      "decode",
      "hmac.compare_digest",
      "hmac.digest",
      "int",
      "isinstance",
      "json.loads",
      "len",
      "prefix",
      "self.clock",
      "token.split",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_nats.py",
    "name": "BrowserGrants.issue",
    "line": 100,
    "end": 120,
    "lines": 21,
    "language": "python",
    "branches": 4,
    "calls": [
      "UUID",
      "ValueError",
      "base.update",
      "binding.get",
      "int",
      "min",
      "prefix",
      "self.clock",
      "self.sign",
      "self.verify",
      "str",
      "uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_tools.py",
    "name": "Tool.safe_schema",
    "line": 22,
    "end": 42,
    "lines": 21,
    "language": "python",
    "branches": 8,
    "calls": [
      "Draft202012Validator.check_schema",
      "ValueError",
      "bounded_json",
      "isinstance",
      "item.startswith",
      "model_validator",
      "pending.append",
      "pending.extend",
      "pending.pop",
      "self.input_schema.get",
      "value.items"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_tools.py",
    "name": "bounded_json",
    "line": 45,
    "end": 49,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "ValueError",
      "json.dumps",
      "json.dumps(value, ensure_ascii=False, allow_nan=False).encode",
      "len"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_tools.py",
    "name": "WidgetManifest.finite_catalog",
    "line": 63,
    "end": 70,
    "lines": 8,
    "language": "python",
    "branches": 2,
    "calls": [
      "ValueError",
      "bounded_json",
      "model_validator",
      "self.model_dump"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/browser_tools.py",
    "name": "WidgetToolResult.bounded_result",
    "line": 90,
    "end": 105,
    "lines": 16,
    "language": "python",
    "branches": 5,
    "calls": [
      "ValueError",
      "bounded_json",
      "isinstance",
      "model_validator",
      "self.model_dump",
      "set",
      "value.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/causal_order.py",
    "name": "ordered_events",
    "line": 5,
    "end": 41,
    "lines": 37,
    "language": "python",
    "branches": 9,
    "calls": [
      "by_id.items",
      "by_id.keys",
      "children.get",
      "children.setdefault",
      "children.setdefault(value, []).append",
      "heapq.heapify",
      "heapq.heappop",
      "heapq.heappush",
      "item.get",
      "key",
      "len",
      "metadata.get",
      "ordered.append",
      "ordered.extend",
      "set",
      "sorted",
      "str",
      "warnings.add"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/causal_order.py",
    "name": "ordered_events.key",
    "line": 8,
    "end": 9,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/chat_notes.py",
    "name": "NoteConflict.__init__",
    "line": 11,
    "end": 13,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "super",
      "super().__init__"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/chat_notes.py",
    "name": "note_value",
    "line": 16,
    "end": 19,
    "lines": 4,
    "language": "python",
    "branches": 3,
    "calls": [
      "row['updated_at'].isoformat",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/chat_notes.py",
    "name": "ChatNotes.__init__",
    "line": 23,
    "end": 24,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/chat_notes.py",
    "name": "ChatNotes.initialize",
    "line": 26,
    "end": 29,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "Path",
      "Path(__file__).with_suffix",
      "Path(__file__).with_suffix('.sql').read_text",
      "conn.execute",
      "conn.transaction",
      "self.pool.acquire"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/chat_notes.py",
    "name": "ChatNotes.read",
    "line": 31,
    "end": 34,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "UUID",
      "note_value",
      "self.pool.fetchrow",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/chat_notes.py",
    "name": "ChatNotes.save",
    "line": 36,
    "end": 63,
    "lines": 28,
    "language": "python",
    "branches": 5,
    "calls": [
      "NoteConflict",
      "RequestStopped",
      "UUID",
      "conn.execute",
      "conn.fetchrow",
      "conn.transaction",
      "hashlib.sha256",
      "hashlib.sha256(json.dumps(value, sort_keys=True, ensure_ascii=False).encode()).hexdigest",
      "isinstance",
      "json.dumps",
      "json.dumps(value, sort_keys=True, ensure_ascii=False).encode",
      "json.loads",
      "note_value",
      "self.pool.acquire",
      "str",
      "updated['updated_at'].isoformat"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/contracts/common.py",
    "name": "now_ts_ms",
    "line": 10,
    "end": 11,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "int",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/contracts/common.py",
    "name": "TraceEnvelope._validate_ts_ms",
    "line": 40,
    "end": 43,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "ValueError",
      "field_validator"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/contracts/common.py",
    "name": "TraceEnvelope._default_correlation_id",
    "line": 46,
    "end": 49,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "model_validator"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/contracts/llm.py",
    "name": "AgentStepInput.validate_wire",
    "line": 20,
    "end": 41,
    "lines": 22,
    "language": "python",
    "branches": 10,
    "calls": [
      "ValueError",
      "ids.add",
      "ids.remove",
      "isinstance",
      "json.dumps",
      "message.get",
      "model_validator",
      "self.model_dump",
      "set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/contracts/llm.py",
    "name": "AgentStepData._not_empty",
    "line": 71,
    "end": 74,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "ValueError",
      "model_validator",
      "self.response_text.strip"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/contracts/llm.py",
    "name": "LlmResponse.from_validated_data",
    "line": 86,
    "end": 101,
    "lines": 16,
    "language": "python",
    "branches": 0,
    "calls": [
      "cls",
      "data.model_dump_json",
      "json.loads"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/debug/pycharm_bootstrap.py",
    "name": "_to_bool",
    "line": 20,
    "end": 23,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "value.strip",
      "value.strip().lower"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/debug/pycharm_bootstrap.py",
    "name": "_resolve_path_mappings",
    "line": 26,
    "end": 52,
    "lines": 27,
    "language": "python",
    "branches": 4,
    "calls": [
      "mappings.append",
      "os.getenv",
      "os.getenv('PYCHARM_LOCAL_ROOT', '').strip",
      "os.getenv('PYCHARM_LOCAL_SHARED_ROOT', '').strip",
      "os.getenv('PYCHARM_PROJECT_ROOT', '').strip",
      "os.getenv('PYCHARM_REMOTE_ROOT', '').strip",
      "os.getenv('PYCHARM_REMOTE_SHARED_ROOT', '').strip",
      "os.getenv('PYCHARM_SOURCE_SUBDIR', '').strip",
      "os.path.join",
      "os.path.normpath"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/debug/pycharm_bootstrap.py",
    "name": "_apply_path_mappings",
    "line": 55,
    "end": 74,
    "lines": 20,
    "language": "python",
    "branches": 2,
    "calls": [
      "_resolve_path_mappings",
      "print",
      "setup_client_server_paths"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/debug/pycharm_bootstrap.py",
    "name": "_wait_attach",
    "line": 77,
    "end": 99,
    "lines": 23,
    "language": "python",
    "branches": 2,
    "calls": [
      "_attach",
      "time.sleep",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/debug/pycharm_bootstrap.py",
    "name": "_attach",
    "line": 102,
    "end": 127,
    "lines": 26,
    "language": "python",
    "branches": 0,
    "calls": [
      "_apply_path_mappings",
      "_normalize_attach_state",
      "print",
      "pydevd_pycharm.settrace"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/debug/pycharm_bootstrap.py",
    "name": "_normalize_attach_state",
    "line": 130,
    "end": 142,
    "lines": 13,
    "language": "python",
    "branches": 2,
    "calls": [
      "bool",
      "getattr",
      "print",
      "pydevd.get_global_debugger"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/debug/pycharm_bootstrap.py",
    "name": "_is_attached",
    "line": 145,
    "end": 151,
    "lines": 7,
    "language": "python",
    "branches": 1,
    "calls": [
      "bool",
      "getattr"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/debug/pycharm_bootstrap.py",
    "name": "_background_attach",
    "line": 154,
    "end": 181,
    "lines": 28,
    "language": "python",
    "branches": 3,
    "calls": [
      "_attach",
      "_is_attached",
      "print",
      "time.sleep"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/debug/pycharm_bootstrap.py",
    "name": "_run_target",
    "line": 184,
    "end": 191,
    "lines": 8,
    "language": "python",
    "branches": 2,
    "calls": [
      "RuntimeError",
      "runpy.run_module",
      "runpy.run_path"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/debug/pycharm_bootstrap.py",
    "name": "main",
    "line": 194,
    "end": 249,
    "lines": 56,
    "language": "python",
    "branches": 2,
    "calls": [
      "_run_target",
      "_to_bool",
      "_wait_attach",
      "argparse.ArgumentParser",
      "float",
      "os.getenv",
      "parser.add_argument",
      "parser.parse_args",
      "print",
      "thread.start",
      "threading.Thread"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/diagnostics.py",
    "name": "public_error",
    "line": 80,
    "end": 87,
    "lines": 8,
    "language": "python",
    "branches": 2,
    "calls": [
      "ErrorInfo",
      "REASONS.get",
      "details.update",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "RequestStopped.__init__",
    "line": 20,
    "end": 22,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "super",
      "super().__init__"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "ExecutionContext.from_headers",
    "line": 39,
    "end": 56,
    "lines": 18,
    "language": "python",
    "branches": 2,
    "calls": [
      "RequestStopped",
      "UUID",
      "ValueError",
      "cls",
      "headers.get",
      "int",
      "max",
      "min",
      "str",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "ExecutionContext.remaining",
    "line": 58,
    "end": 64,
    "lines": 7,
    "language": "python",
    "branches": 2,
    "calls": [
      "RequestStopped",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "ExecutionContext.headers",
    "line": 66,
    "end": 75,
    "lines": 10,
    "language": "python",
    "branches": 1,
    "calls": [
      "carrier",
      "int",
      "self.remaining",
      "str",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "CancellationLedger.__init__",
    "line": 82,
    "end": 83,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "OrderedDict"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "CancellationLedger.cancel",
    "line": 85,
    "end": 91,
    "lines": 7,
    "language": "python",
    "branches": 1,
    "calls": [
      "UUID",
      "len",
      "self.entries.move_to_end",
      "self.entries.popitem",
      "str",
      "time.monotonic",
      "tuple"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "CancellationLedger.contains",
    "line": 93,
    "end": 98,
    "lines": 6,
    "language": "python",
    "branches": 2,
    "calls": [
      "list",
      "self.entries.items",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "FairPool.__init__",
    "line": 122,
    "end": 130,
    "lines": 9,
    "language": "python",
    "branches": 0,
    "calls": [
      "OrderedDict"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "FairPool.pending",
    "line": 133,
    "end": 134,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "len",
      "self._queues.values",
      "sum"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "FairPool.running",
    "line": 137,
    "end": 138,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "len"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "FairPool.submit",
    "line": 140,
    "end": 143,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "self.activate",
      "self.reserve"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "FairPool.reserve",
    "line": 145,
    "end": 165,
    "lines": 21,
    "language": "python",
    "branches": 3,
    "calls": [
      "PoolJob",
      "RequestStopped",
      "asyncio.get_running_loop",
      "id",
      "len",
      "loop.call_later",
      "loop.create_future",
      "math.isfinite",
      "operations.add",
      "self._queues.get",
      "self._reserved.values",
      "sum",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "FairPool.activate",
    "line": 167,
    "end": 175,
    "lines": 9,
    "language": "python",
    "branches": 1,
    "calls": [
      "deque",
      "id",
      "job.future.done",
      "queued.add",
      "self._dispatch",
      "self._queues.setdefault",
      "self._queues.setdefault(job.session, deque()).append",
      "self._reserved.pop"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "FairPool.cancel",
    "line": 177,
    "end": 199,
    "lines": 23,
    "language": "python",
    "branches": 6,
    "calls": [
      "RequestStopped",
      "id",
      "job.cancel_guard",
      "job.future.done",
      "job.task.cancel",
      "jobs.remove",
      "queued.add",
      "self._dispatch",
      "self._finish",
      "self._queues.get",
      "self._reserved.pop"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "FairPool._dispatch",
    "line": 201,
    "end": 214,
    "lines": 14,
    "language": "python",
    "branches": 4,
    "calls": [
      "asyncio.create_task",
      "job.task.add_done_callback",
      "jobs.popleft",
      "len",
      "list",
      "queued.add",
      "self._queues.pop",
      "self._run",
      "self._task_done"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "FairPool._task_done",
    "line": 216,
    "end": 222,
    "lines": 7,
    "language": "python",
    "branches": 3,
    "calls": [
      "RequestStopped",
      "job.future.done",
      "self._active.get",
      "self._active.pop",
      "self._dispatch",
      "self._finish",
      "task.cancelled"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "FairPool._run",
    "line": 224,
    "end": 236,
    "lines": 13,
    "language": "python",
    "branches": 2,
    "calls": [
      "RequestStopped",
      "job.work",
      "self._active.pop",
      "self._dispatch",
      "self._finish",
      "str",
      "time.monotonic",
      "wait.record"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "FairPool._finish",
    "line": 239,
    "end": 246,
    "lines": 8,
    "language": "python",
    "branches": 3,
    "calls": [
      "job.future.done",
      "job.future.set_exception",
      "job.future.set_result",
      "job.timer.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/execution.py",
    "name": "FairPool.close",
    "line": 248,
    "end": 253,
    "lines": 6,
    "language": "python",
    "branches": 1,
    "calls": [
      "asyncio.gather",
      "list",
      "self._active.values",
      "self._queues.values",
      "self._reserved.values",
      "self.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/geodesy.py",
    "name": "distance_km",
    "line": 7,
    "end": 10,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "map",
      "math.asin",
      "math.cos",
      "math.sin",
      "math.sqrt",
      "max",
      "min"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/geodesy.py",
    "name": "great_circle_geometry",
    "line": 13,
    "end": 39,
    "lines": 27,
    "language": "python",
    "branches": 4,
    "calls": [
      "abs",
      "int",
      "math.atan2",
      "math.ceil",
      "math.cos",
      "math.degrees",
      "math.hypot",
      "math.radians",
      "math.sin",
      "math.sqrt",
      "max",
      "min",
      "range",
      "result.append",
      "sum",
      "tuple",
      "vector",
      "zip"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/geodesy.py",
    "name": "great_circle_geometry.vector",
    "line": 14,
    "end": 16,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "math.cos",
      "math.radians",
      "math.sin"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/model_diagnostics.py",
    "name": "scrub",
    "line": 9,
    "end": 21,
    "lines": 13,
    "language": "python",
    "branches": 4,
    "calls": [
      "SECRET.search",
      "isinstance",
      "list",
      "re.sub",
      "scrub",
      "str",
      "value.items"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/model_diagnostics.py",
    "name": "model_diagnostic",
    "line": 24,
    "end": 46,
    "lines": 23,
    "language": "python",
    "branches": 8,
    "calls": [
      "call.get",
      "isinstance",
      "json.dumps",
      "json.loads",
      "len",
      "min",
      "raw[:cap].decode",
      "result[key].encode",
      "scrub",
      "scrub(result[key]).encode",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/monitor.py",
    "name": "MonitorQuery.cell_owner",
    "line": 48,
    "end": 77,
    "lines": 30,
    "language": "python",
    "branches": 18,
    "calls": [
      "ValueError",
      "duration",
      "model_validator"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/monitor.py",
    "name": "duration",
    "line": 80,
    "end": 90,
    "lines": 11,
    "language": "python",
    "branches": 3,
    "calls": [
      "''.join",
      "ValueError",
      "int",
      "re.findall",
      "sum",
      "timedelta"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/monitor.py",
    "name": "cell",
    "line": 93,
    "end": 96,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "len"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/monitor.py",
    "name": "fragment",
    "line": 99,
    "end": 102,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "len",
      "min"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/monitor_schema.py",
    "name": "initialize",
    "line": 9,
    "end": 33,
    "lines": 25,
    "language": "python",
    "branches": 3,
    "calls": [
      "conn.execute",
      "conn.fetchval"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/nats_urls.py",
    "name": "_validate",
    "line": 12,
    "end": 25,
    "lines": 14,
    "language": "python",
    "branches": 3,
    "calls": [
      "ValueError",
      "candidate.strip",
      "isinstance",
      "urlparse"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/nats_urls.py",
    "name": "nats_url",
    "line": 28,
    "end": 35,
    "lines": 8,
    "language": "python",
    "branches": 1,
    "calls": [
      "_validate"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/nats_urls.py",
    "name": "same_nats_url",
    "line": 38,
    "end": 45,
    "lines": 8,
    "language": "python",
    "branches": 0,
    "calls": [
      "endpoint",
      "parsed.path.rstrip",
      "urlparse"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/nats_urls.py",
    "name": "same_nats_url.endpoint",
    "line": 40,
    "end": 43,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "parsed.path.rstrip",
      "urlparse"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/observability.py",
    "name": "carrier",
    "line": 34,
    "end": 37,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "propagator.inject"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/observability.py",
    "name": "current_diagnostic",
    "line": 40,
    "end": 45,
    "lines": 6,
    "language": "python",
    "branches": 1,
    "calls": [
      "int",
      "time.time",
      "trace.get_current_span",
      "trace.get_current_span().get_span_context"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/observability.py",
    "name": "provider_usage",
    "line": 48,
    "end": 61,
    "lines": 14,
    "language": "python",
    "branches": 4,
    "calls": [
      "current.set_attribute",
      "duration.record",
      "isinstance",
      "math.isfinite",
      "response.get",
      "tokens.add",
      "trace.get_current_span"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/observability.py",
    "name": "stage",
    "line": 65,
    "end": 109,
    "lines": 45,
    "language": "python",
    "branches": 9,
    "calls": [
      "Status",
      "active.add",
      "collector.get",
      "common.update",
      "current.set_attribute",
      "current.set_status",
      "current_diagnostic",
      "duration.record",
      "execution.get",
      "getattr",
      "max",
      "operations.add",
      "propagator.extract",
      "summary.record",
      "time.monotonic",
      "tracer.start_as_current_span",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/observability.py",
    "name": "bootstrap",
    "line": 112,
    "end": 141,
    "lines": 30,
    "language": "python",
    "branches": 2,
    "calls": [
      "BatchSpanProcessor",
      "MeterProvider",
      "OTLPMetricExporter",
      "OTLPSpanExporter",
      "OpenInferenceSpanProcessor",
      "PeriodicExportingMetricReader",
      "Resource.create",
      "SafeExporter",
      "TracerProvider",
      "add_phoenix",
      "atexit.register",
      "metrics.set_meter_provider",
      "os.getenv",
      "provider.add_span_processor",
      "register_process_metrics",
      "trace.set_tracer_provider"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/observability.py",
    "name": "register_process_metrics",
    "line": 144,
    "end": 155,
    "lines": 12,
    "language": "python",
    "branches": 1,
    "calls": [
      "int",
      "meter.create_observable_counter",
      "meter.create_observable_gauge",
      "metrics.Observation",
      "open",
      "os.sysconf",
      "stats.read",
      "stats.read().split",
      "time.process_time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/observability.py",
    "name": "register_process_metrics.rss",
    "line": 145,
    "end": 151,
    "lines": 7,
    "language": "python",
    "branches": 1,
    "calls": [
      "int",
      "metrics.Observation",
      "open",
      "os.sysconf",
      "stats.read",
      "stats.read().split"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/opus.py",
    "name": "sample_at",
    "line": 16,
    "end": 17,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/opus.py",
    "name": "packet",
    "line": 20,
    "end": 26,
    "lines": 7,
    "language": "python",
    "branches": 2,
    "calls": [
      "ValueError",
      "len",
      "struct.unpack_from"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/opus.py",
    "name": "OpusDecoder.__init__",
    "line": 30,
    "end": 35,
    "lines": 6,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/opus.py",
    "name": "OpusDecoder.decode",
    "line": 37,
    "end": 72,
    "lines": 36,
    "language": "python",
    "branches": 7,
    "calls": [
      "ValueError",
      "av.AudioResampler",
      "av.CodecContext.create",
      "av.Packet",
      "b''.join",
      "bytearray",
      "bytes",
      "int.from_bytes",
      "len",
      "min",
      "packet",
      "sample_at",
      "self.codec.decode",
      "self.resampler.resample",
      "struct.unpack_from"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/opus.py",
    "name": "OpusDecoder.close",
    "line": 74,
    "end": 75,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/opus.py",
    "name": "samples",
    "line": 78,
    "end": 86,
    "lines": 9,
    "language": "python",
    "branches": 2,
    "calls": [
      "int",
      "isinstance",
      "json.loads",
      "metadata.get",
      "record.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/phoenix.py",
    "name": "enabled",
    "line": 40,
    "end": 41,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "os.getenv",
      "os.getenv('PHOENIX_CONTENT_CAPTURE', 'false').lower"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/phoenix.py",
    "name": "configure_secrets",
    "line": 44,
    "end": 58,
    "lines": 15,
    "language": "python",
    "branches": 4,
    "calls": [
      "_secret_key.search",
      "key.endswith",
      "len",
      "os.environ.items",
      "set",
      "sorted",
      "tuple",
      "urlsplit",
      "values.add"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/phoenix.py",
    "name": "_clean_url",
    "line": 61,
    "end": 68,
    "lines": 8,
    "language": "python",
    "branches": 2,
    "calls": [
      "_secret_key.search",
      "match.group",
      "parse_qsl",
      "urlencode",
      "urlsplit",
      "urlunsplit",
      "value.netloc.rsplit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/phoenix.py",
    "name": "sanitize",
    "line": 71,
    "end": 100,
    "lines": 30,
    "language": "python",
    "branches": 12,
    "calls": [
      "_assignment.sub",
      "_bearer.sub",
      "_encode",
      "_excluded_key.match",
      "_secret_key.search",
      "_url.sub",
      "isinstance",
      "json.loads",
      "len",
      "math.isfinite",
      "sanitize",
      "str",
      "type",
      "value.items",
      "value.lstrip",
      "value.lstrip().startswith",
      "value.replace"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/phoenix.py",
    "name": "_encode",
    "line": 103,
    "end": 104,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "json.dumps"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/phoenix.py",
    "name": "capture",
    "line": 107,
    "end": 161,
    "lines": 55,
    "language": "python",
    "branches": 15,
    "calls": [
      "_contents.move_to_end",
      "_contents.popitem",
      "_contents.setdefault",
      "_encode",
      "_encode({'attributes': attrs, 'events': record['events']}).encode",
      "attrs.clear",
      "attrs.update",
      "attrs[field].encode",
      "current.get_span_context",
      "current.is_recording",
      "dropped.add",
      "enabled",
      "execution.get",
      "field.replace",
      "isinstance",
      "len",
      "max",
      "original[:max(0, len(original) - excess)].decode",
      "record.get",
      "record['events'].append",
      "record['events'].clear",
      "retired.get",
      "sanitize",
      "sanitize(attributes or {}).items",
      "time.monotonic",
      "trace.get_current_span"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/phoenix.py",
    "name": "bind_identity",
    "line": 164,
    "end": 166,
    "lines": 3,
    "language": "python",
    "branches": 1,
    "calls": [
      "identity.get",
      "identity.set",
      "isinstance",
      "str",
      "values.items"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/phoenix.py",
    "name": "span_identity",
    "line": 169,
    "end": 171,
    "lines": 3,
    "language": "python",
    "branches": 1,
    "calls": [
      "(identity.get() or {}).items",
      "identity.get",
      "span.set_attribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/phoenix.py",
    "name": "phoenix_span",
    "line": 174,
    "end": 195,
    "lines": 22,
    "language": "python",
    "branches": 6,
    "calls": [
      "(content or {}).get",
      "Event",
      "ReadableSpan",
      "_encode",
      "attrs.get",
      "attrs.pop",
      "attrs.update",
      "dict",
      "event.get",
      "key.startswith",
      "list",
      "safe_span",
      "span.name.startswith",
      "str",
      "trace.Link",
      "tuple"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/phoenix.py",
    "name": "PhoenixProcessor.__init__",
    "line": 200,
    "end": 207,
    "lines": 8,
    "language": "python",
    "branches": 0,
    "calls": [
      "configure_secrets",
      "deque",
      "self.worker.start",
      "threading.Condition",
      "threading.Thread"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/phoenix.py",
    "name": "PhoenixProcessor.on_start",
    "line": 209,
    "end": 210,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "span_identity"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/phoenix.py",
    "name": "PhoenixProcessor.on_end",
    "line": 212,
    "end": 235,
    "lines": 24,
    "language": "python",
    "branches": 4,
    "calls": [
      "_contents.items",
      "_contents.pop",
      "content.get",
      "dropped.add",
      "encode_spans",
      "encode_spans([clone]).ByteSize",
      "len",
      "phoenix_span",
      "retired.get",
      "self.condition.notify",
      "self.queue.append",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/phoenix.py",
    "name": "PhoenixProcessor._work",
    "line": 237,
    "end": 268,
    "lines": 32,
    "language": "python",
    "branches": 8,
    "calls": [
      "attach",
      "batch.append",
      "bool",
      "detach",
      "export_errors.add",
      "exported.add",
      "len",
      "self.condition.notify_all",
      "self.condition.wait",
      "self.delegate.export",
      "self.queue.popleft",
      "set_value"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/phoenix.py",
    "name": "PhoenixProcessor.force_flush",
    "line": 270,
    "end": 279,
    "lines": 10,
    "language": "python",
    "branches": 2,
    "calls": [
      "self.condition.notify",
      "self.condition.wait",
      "time.monotonic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/phoenix.py",
    "name": "PhoenixProcessor.shutdown",
    "line": 281,
    "end": 289,
    "lines": 9,
    "language": "python",
    "branches": 0,
    "calls": [
      "self.condition.notify_all",
      "self.delegate.shutdown",
      "self.force_flush",
      "self.queue.clear",
      "self.worker.join"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/timings.py",
    "name": "generation_event",
    "line": 76,
    "end": 87,
    "lines": 12,
    "language": "python",
    "branches": 5,
    "calls": [
      "collector.get",
      "data.get",
      "generation_events.get",
      "handler",
      "summary.begin_generation",
      "summary.generation_values"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/timings.py",
    "name": "TimingCollector.__post_init__",
    "line": 93,
    "end": 94,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "self.merged_generations.update",
      "self.values.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/timings.py",
    "name": "TimingCollector.begin_generation",
    "line": 95,
    "end": 100,
    "lines": 6,
    "language": "python",
    "branches": 1,
    "calls": [
      "GenerationTiming",
      "GenerationTiming(generation_id=generation_id, generation_index=generation_index, attempt_id=attempt_id).model_dump",
      "any",
      "entries.append",
      "len",
      "self.values.setdefault"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/timings.py",
    "name": "TimingCollector.generation_values",
    "line": 101,
    "end": 104,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "GenerationTiming.model_validate",
      "GenerationTiming.model_validate({**entries[-1], **values}).model_dump",
      "entries[-1].update",
      "self.values.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/timings.py",
    "name": "TimingCollector.record",
    "line": 105,
    "end": 120,
    "lines": 16,
    "language": "python",
    "branches": 5,
    "calls": [
      "attributes.get",
      "len",
      "max",
      "min",
      "name.startswith",
      "self.generation_values",
      "self.values.get",
      "self.values.setdefault",
      "str",
      "tools.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/timings.py",
    "name": "TimingCollector.merge_model",
    "line": 121,
    "end": 135,
    "lines": 15,
    "language": "python",
    "branches": 6,
    "calls": [
      "dict",
      "entries.append",
      "isinstance",
      "len",
      "next",
      "previous.update",
      "raw.get",
      "self.merged_generations.add",
      "self.values.get",
      "self.values.setdefault",
      "timings.model_dump"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/timings.py",
    "name": "TimingCollector.snapshot",
    "line": 136,
    "end": 137,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "Timings.model_validate",
      "Timings.model_validate(self.values).model_dump"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/trace_export.py",
    "name": "safe_span",
    "line": 26,
    "end": 30,
    "lines": 5,
    "language": "python",
    "branches": 0,
    "calls": [
      "(span.attributes or {}).items",
      "ReadableSpan",
      "Status"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/trace_export.py",
    "name": "SafeExporter.__init__",
    "line": 34,
    "end": 35,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/trace_export.py",
    "name": "SafeExporter.export",
    "line": 37,
    "end": 38,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "safe_span",
      "self.delegate.export"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/trace_export.py",
    "name": "SafeExporter.shutdown",
    "line": 40,
    "end": 41,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "self.delegate.shutdown"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/trace_export.py",
    "name": "SafeExporter.force_flush",
    "line": 43,
    "end": 44,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "self.delegate.force_flush"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/trace_export.py",
    "name": "add_phoenix",
    "line": 47,
    "end": 54,
    "lines": 8,
    "language": "python",
    "branches": 1,
    "calls": [
      "OTLPSpanExporter",
      "PhoenixProcessor",
      "getattr",
      "os.getenv",
      "provider.add_span_processor"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "uuid",
    "line": 26,
    "end": 30,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "UUID",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "decode",
    "line": 33,
    "end": 37,
    "lines": 5,
    "language": "python",
    "branches": 1,
    "calls": [
      "json.loads"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "arguments",
    "line": 40,
    "end": 43,
    "lines": 4,
    "language": "python",
    "branches": 2,
    "calls": [
      "isinstance",
      "value.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "identity",
    "line": 46,
    "end": 60,
    "lines": 15,
    "language": "python",
    "branches": 4,
    "calls": [
      "arguments",
      "headers.get",
      "inner.get",
      "isinstance",
      "message.get",
      "outcome.get",
      "outer.get",
      "trace.get",
      "uuid",
      "{'session_id': uuid(headers.get('X-Session-Id') or outer.get('session_id') or inner.get('session_id') or trace.get('session_id')), 'request_id': uuid(headers.get('X-Request-Id') or outer.get('correlation_id') or message.get('request_id') or outer.get('request_id') or inner.get('request_id') or trace.get('request_id')), 'stream_id': uuid(outer.get('stream_id') or inner.get('stream_id')), 'phrase_id': uuid(outer.get('phrase_id') or inner.get('phrase_id')), 'generation_id': uuid(inner.get('generation_id') or outer.get('generation_id')), 'tool_call_id': inner.get('tool_call_id') or outer.get('tool_call_id') or outcome.get('tool_call_id'), 'client_id': uuid(outer.get('client_id') or inner.get('client_id'))}.items"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "excluded",
    "line": 63,
    "end": 97,
    "lines": 35,
    "language": "python",
    "branches": 13,
    "calls": [
      "isinstance",
      "subject.endswith",
      "subject.startswith",
      "value.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "peer",
    "line": 100,
    "end": 119,
    "lines": 20,
    "language": "python",
    "branches": 10,
    "calls": [
      "arguments",
      "arguments(value).get",
      "context.get",
      "context.get().get",
      "subject.split",
      "subject.startswith",
      "uuid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "business",
    "line": 122,
    "end": 136,
    "lines": 15,
    "language": "python",
    "branches": 4,
    "calls": [
      "isinstance",
      "type",
      "value.get",
      "value.items",
      "value['data'].items"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "forwarded_reference",
    "line": 139,
    "end": 143,
    "lines": 5,
    "language": "python",
    "branches": 2,
    "calls": [
      "transfer.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "message_kind",
    "line": 146,
    "end": 173,
    "lines": 28,
    "language": "python",
    "branches": 14,
    "calls": [
      "arguments",
      "data.get",
      "isinstance",
      "outer.get",
      "subject.endswith",
      "subject.startswith",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "description",
    "line": 176,
    "end": 293,
    "lines": 118,
    "language": "python",
    "branches": 45,
    "calls": [
      "arguments",
      "context.get",
      "context.get().get",
      "data.get",
      "dict",
      "identity",
      "identity(value).get",
      "isinstance",
      "message.get",
      "message_kind",
      "outer.get",
      "purposes.get",
      "subject.endswith",
      "subject.rsplit",
      "subject.startswith",
      "tool_data.get",
      "trace.get",
      "{'history': 'Чтение истории чата', 'open_chat': 'Открытие чата', 'request_state': 'Чтение состояния запроса', 'cancel': 'Отмена запроса', 'confirm': 'Подтверждение действия', 'diagnostic_links': 'Получение ссылок диагностики', 'client_timings': 'Передача клиентских измерений'}.get",
      "{'queued': 'Агент подтверждает приём команды в очередь выполнения.', 'model_started': 'Агент сообщает о начале обращения к LLM; это уведомление о ходе выполнения.', 'model_finished': 'Агент сообщает о получении результата генерации LLM.', 'tool_result': 'Агент сообщает о получении результата вызванного инструмента.', 'done': 'Передаётся окончательный результат выполнения команды.', 'failed': 'Передаётся ошибка выполнения команды.', 'cancelled': 'Подтверждается отмена выполнения команды.'}.get",
      "{'queued': 'Запрос принят в очередь', 'cache_used': 'Использованы сохранённые данные страницы', 'model_started': 'Начался вызов модели', 'model_finished': 'Модель завершила действие', 'tool_result': 'Получен результат инструмента', 'done': 'Окончательный ответ', 'failed': 'Ошибка запроса', 'cancelled': 'Запрос отменён'}.get",
      "{'recording_status': ('Состояние сохранения записи', 'Клиенту сообщается, доступно ли сохранение записи для распознавания.'), 'ready': ('Аудиопоток готов', 'Клиенту сообщается о готовности аудиопотока принимать звук.'), 'stopped': ('Аудиопоток остановлен', 'Клиенту сообщается об остановке аудиопотока.'), 'error': ('Ошибка аудиопотока', 'Клиенту сообщается об ошибке аудиопотока.')}.get",
      "{'weather_updated': 'Обновление погоды', 'demo_updated': 'Обновление каталога карты', 'domain_updated': 'Обновление данных карты'}.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "Recorder.__init__",
    "line": 297,
    "end": 304,
    "lines": 8,
    "language": "python",
    "branches": 0,
    "calls": [
      "asyncio.Queue",
      "asyncio.create_task",
      "self._run"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "Recorder.lost_event",
    "line": 306,
    "end": 308,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "datetime.now",
      "datetime.now(timezone.utc).isoformat"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "Recorder.emit",
    "line": 310,
    "end": 342,
    "lines": 33,
    "language": "python",
    "branches": 8,
    "calls": [
      "context.get",
      "context.set",
      "datetime.now",
      "datetime.now(timezone.utc).isoformat",
      "endpoint.netloc.rsplit",
      "event.get",
      "event.setdefault",
      "event.update",
      "isinstance",
      "json.dumps",
      "json.dumps(event, ensure_ascii=False, allow_nan=False).encode",
      "json.dumps(event, ensure_ascii=False, allow_nan=False, separators=(',', ':')).encode",
      "len",
      "message_kind",
      "payload.get",
      "self.lost_event",
      "self.queue.put_nowait",
      "str",
      "urlsplit",
      "urlunsplit",
      "uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "Recorder._write",
    "line": 344,
    "end": 350,
    "lines": 7,
    "language": "python",
    "branches": 2,
    "calls": [
      "ValueError",
      "decode",
      "json.loads",
      "self.nc.request",
      "self.writer"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "Recorder._run",
    "line": 352,
    "end": 373,
    "lines": 22,
    "language": "python",
    "branches": 4,
    "calls": [
      "datetime.now",
      "datetime.now(timezone.utc).isoformat",
      "dict",
      "json.dumps",
      "json.dumps(gap).encode",
      "len",
      "self._write",
      "self.lost_event",
      "self.queue.get",
      "self.queue.task_done",
      "str",
      "uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "Recorder.close",
    "line": 375,
    "end": 388,
    "lines": 14,
    "language": "python",
    "branches": 3,
    "calls": [
      "asyncio.gather",
      "asyncio.timeout",
      "self.queue.empty",
      "self.queue.get_nowait",
      "self.queue.join",
      "self.queue.task_done",
      "self.task.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "ObservedMessage.__init__",
    "line": 392,
    "end": 395,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "ObservedMessage.__getattr__",
    "line": 397,
    "end": 398,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "getattr"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "ObservedMessage.respond",
    "line": 400,
    "end": 407,
    "lines": 8,
    "language": "python",
    "branches": 3,
    "calls": [
      "debug_cursor.get",
      "self.connection._send",
      "self.connection.raw.publish",
      "self.message.respond",
      "self.received.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "ObservedNats.__init__",
    "line": 411,
    "end": 412,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "ObservedNats.__getattr__",
    "line": 414,
    "end": 415,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "getattr"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "ObservedNats.subscribe",
    "line": 417,
    "end": 446,
    "lines": 30,
    "language": "python",
    "branches": 7,
    "calls": [
      "ObservedMessage",
      "business",
      "cb",
      "context.reset",
      "context.set",
      "debug_cursor.reset",
      "debug_cursor.set",
      "decode",
      "description",
      "excluded",
      "headers.get",
      "identity",
      "inherited.get",
      "isinstance",
      "len",
      "peer",
      "self.raw.subscribe",
      "self.recorder.emit",
      "str",
      "transfer.reset",
      "transfer.set",
      "uuid",
      "uuid4",
      "value.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "ObservedNats.subscribe.receive",
    "line": 420,
    "end": 445,
    "lines": 26,
    "language": "python",
    "branches": 6,
    "calls": [
      "ObservedMessage",
      "business",
      "cb",
      "context.reset",
      "context.set",
      "debug_cursor.reset",
      "debug_cursor.set",
      "decode",
      "description",
      "excluded",
      "headers.get",
      "identity",
      "inherited.get",
      "isinstance",
      "len",
      "peer",
      "self.recorder.emit",
      "str",
      "transfer.reset",
      "transfer.set",
      "uuid",
      "uuid4",
      "value.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "ObservedNats._send",
    "line": 448,
    "end": 472,
    "lines": 25,
    "language": "python",
    "branches": 4,
    "calls": [
      "business",
      "context.get",
      "debug_cursor.get",
      "decode",
      "description",
      "details.get",
      "details.setdefault",
      "excluded",
      "forwarded_reference",
      "identity",
      "len",
      "peer",
      "self.raw.publish",
      "self.recorder.emit",
      "str",
      "time.monotonic",
      "uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "ObservedNats.publish",
    "line": 474,
    "end": 475,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "self._send"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "ObservedNats.request",
    "line": 477,
    "end": 517,
    "lines": 41,
    "language": "python",
    "branches": 9,
    "calls": [
      "(getattr(result, 'headers', None) or {}).get",
      "business",
      "context.get",
      "debug_cursor.get",
      "debug_cursor.set",
      "decode",
      "description",
      "details.get",
      "details.pop",
      "excluded",
      "forwarded_reference",
      "getattr",
      "identity",
      "isinstance",
      "len",
      "peer",
      "self.raw.request",
      "self.recorder.emit",
      "str",
      "time.monotonic",
      "uuid",
      "uuid4",
      "value.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "ObservedNats.close",
    "line": 519,
    "end": 521,
    "lines": 3,
    "language": "python",
    "branches": 0,
    "calls": [
      "self.raw.close",
      "self.recorder.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/traffic.py",
    "name": "observe",
    "line": 524,
    "end": 525,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "ObservedNats",
      "Recorder"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/ui_queue.py",
    "name": "UiQueue.__init__",
    "line": 19,
    "end": 26,
    "lines": 8,
    "language": "python",
    "branches": 0,
    "calls": [
      "asyncio.Event",
      "deque"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/ui_queue.py",
    "name": "UiQueue.put",
    "line": 28,
    "end": 53,
    "lines": 26,
    "language": "python",
    "branches": 9,
    "calls": [
      "Event",
      "asyncio.create_task",
      "data.get",
      "len",
      "list",
      "next",
      "self.pending.append",
      "self.pending.remove",
      "self.ready.set",
      "self.run"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/ui_queue.py",
    "name": "UiQueue.run",
    "line": 55,
    "end": 71,
    "lines": 17,
    "language": "python",
    "branches": 4,
    "calls": [
      "asyncio.wait_for",
      "len",
      "logger.warning",
      "next",
      "self.nc.publish",
      "self.pending.remove",
      "self.ready.clear",
      "self.ready.set",
      "self.ready.wait",
      "type"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/ui_queue.py",
    "name": "UiQueue.close",
    "line": 73,
    "end": 79,
    "lines": 7,
    "language": "python",
    "branches": 1,
    "calls": [
      "asyncio.gather",
      "self.pending.clear",
      "self.task.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/weather.py",
    "name": "tile_coordinates",
    "line": 14,
    "end": 16,
    "lines": 3,
    "language": "python",
    "branches": 1,
    "calls": [
      "RequestStopped"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/weather.py",
    "name": "_number",
    "line": 19,
    "end": 22,
    "lines": 4,
    "language": "python",
    "branches": 1,
    "calls": [
      "RequestStopped",
      "isinstance",
      "math.isfinite"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/weather.py",
    "name": "normalize_weather",
    "line": 25,
    "end": 37,
    "lines": 13,
    "language": "python",
    "branches": 2,
    "calls": [
      "RequestStopped",
      "_number",
      "time.time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/weather.py",
    "name": "weather_view",
    "line": 40,
    "end": 48,
    "lines": 9,
    "language": "python",
    "branches": 5,
    "calls": [
      "data.get",
      "deepcopy",
      "isinstance",
      "max",
      "min",
      "time.time",
      "value.get",
      "value.update"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/weather.py",
    "name": "usable_weather",
    "line": 51,
    "end": 55,
    "lines": 5,
    "language": "python",
    "branches": 2,
    "calls": [
      "(value or {}).get",
      "RequestStopped",
      "result.get",
      "weather_view"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/weather.py",
    "name": "weather_fingerprint",
    "line": 58,
    "end": 63,
    "lines": 6,
    "language": "python",
    "branches": 1,
    "calls": [
      "hashlib.sha256",
      "hashlib.sha256(json.dumps(observations, sort_keys=True, allow_nan=False).encode()).hexdigest",
      "isinstance",
      "json.dumps",
      "json.dumps(observations, sort_keys=True, allow_nan=False).encode",
      "value.get",
      "value.items"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/weather.py",
    "name": "cached_weather",
    "line": 66,
    "end": 68,
    "lines": 3,
    "language": "python",
    "branches": 1,
    "calls": [
      "conn.fetch",
      "isinstance",
      "json.loads",
      "weather_view"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/weather.py",
    "name": "with_weather",
    "line": 71,
    "end": 77,
    "lines": 7,
    "language": "python",
    "branches": 1,
    "calls": [
      "cached_weather",
      "deepcopy",
      "weather.get",
      "weather_view"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/widget_debug.py",
    "name": "publish",
    "line": 20,
    "end": 66,
    "lines": 47,
    "language": "python",
    "branches": 12,
    "calls": [
      "UUID",
      "args.get",
      "asyncio.timeout",
      "base.update",
      "base64.b64encode",
      "base64.b64encode(chunk).decode",
      "cursor.get",
      "cursor.set",
      "enumerate",
      "identity.get",
      "int",
      "isinstance",
      "json.dumps",
      "json.dumps(event, ensure_ascii=False, allow_nan=False).encode",
      "json.dumps(payload, ensure_ascii=False, allow_nan=False).encode",
      "json.dumps({'type': 'command', 'kind': 'widget_debug', 'data': base}).encode",
      "json.dumps({'type': 'command', 'kind': 'widget_debug', 'data': {**base, 'error': error, 'bytes': len(raw)}}).encode",
      "len",
      "message_kind",
      "metadata.get",
      "nc.publish",
      "payload.get",
      "range",
      "str",
      "time.time",
      "type",
      "uuid4"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/widget_debug.py",
    "name": "owner",
    "line": 69,
    "end": 71,
    "lines": 3,
    "language": "python",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/widget_history.py",
    "name": "WidgetHistoryQuery.valid_content",
    "line": 19,
    "end": 24,
    "lines": 6,
    "language": "python",
    "branches": 2,
    "calls": [
      "ValueError",
      "model_validator"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/widget_store.py",
    "name": "encode",
    "line": 13,
    "end": 14,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "json.dumps"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/widget_store.py",
    "name": "owner_hash",
    "line": 17,
    "end": 18,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "UUID",
      "hashlib.sha256",
      "hashlib.sha256(str(UUID(str(client))).encode()).hexdigest",
      "str",
      "str(UUID(str(client))).encode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/widget_store.py",
    "name": "command_hash",
    "line": 21,
    "end": 22,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [
      "encode",
      "encode({'operation': OPERATION, 'text': text}).encode",
      "hashlib.sha256",
      "hashlib.sha256(encode({'operation': OPERATION, 'text': text}).encode()).hexdigest"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/widget_store.py",
    "name": "WidgetStore.__init__",
    "line": 26,
    "end": 27,
    "lines": 2,
    "language": "python",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/widget_store.py",
    "name": "WidgetStore.initialize",
    "line": 29,
    "end": 50,
    "lines": 22,
    "language": "python",
    "branches": 0,
    "calls": [
      "conn.execute",
      "conn.transaction",
      "monitor_schema.initialize",
      "self.pool.acquire"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/widget_store.py",
    "name": "WidgetStore.register",
    "line": 52,
    "end": 55,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "UUID",
      "encode",
      "self.pool.execute",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/widget_store.py",
    "name": "WidgetStore.read",
    "line": 57,
    "end": 62,
    "lines": 6,
    "language": "python",
    "branches": 1,
    "calls": [
      "RequestStopped",
      "UUID",
      "json.loads",
      "self.pool.fetchval",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/widget_store.py",
    "name": "WidgetStore.admit",
    "line": 64,
    "end": 77,
    "lines": 14,
    "language": "python",
    "branches": 2,
    "calls": [
      "RequestStopped",
      "UUID",
      "conn.fetchrow",
      "conn.fetchval",
      "conn.transaction",
      "encode",
      "json.loads",
      "owner_hash",
      "self.pool.acquire",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/widget_store.py",
    "name": "WidgetStore.running",
    "line": 79,
    "end": 83,
    "lines": 5,
    "language": "python",
    "branches": 0,
    "calls": [
      "UUID",
      "self.pool.execute",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/widget_store.py",
    "name": "WidgetStore.finish",
    "line": 85,
    "end": 92,
    "lines": 8,
    "language": "python",
    "branches": 1,
    "calls": [
      "RequestStopped",
      "UUID",
      "encode",
      "self.pool.fetchval",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/widget_store.py",
    "name": "WidgetStore.client_receipt",
    "line": 94,
    "end": 102,
    "lines": 9,
    "language": "python",
    "branches": 0,
    "calls": [
      "UUID",
      "encode",
      "owner_hash",
      "self.pool.fetchval",
      "str"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/widget_store.py",
    "name": "WidgetStore.diagnostic",
    "line": 104,
    "end": 111,
    "lines": 8,
    "language": "python",
    "branches": 2,
    "calls": [
      "UUID",
      "json.loads",
      "owner_hash",
      "self.pool.fetchval",
      "str",
      "value.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_shared/widget_store.py",
    "name": "WidgetStore.interrupt",
    "line": 113,
    "end": 116,
    "lines": 4,
    "language": "python",
    "branches": 0,
    "calls": [
      "list",
      "self.pool.execute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "walkElements",
    "line": 13,
    "end": 34,
    "lines": 22,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "doc.createTreeWalker",
      "el.matches",
      "getShadowRoot",
      "root.closest",
      "walkElements",
      "walker.nextNode",
      "window.chrome?.dom?.openOrClosedShadowRoot"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "walkElements.acceptNode",
    "line": 17,
    "end": 17,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "el.matches"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "attachedElement",
    "line": 36,
    "end": 47,
    "lines": 12,
    "language": "typescript",
    "branches": 4,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector",
    "line": 49,
    "end": 367,
    "lines": 319,
    "language": "typescript",
    "branches": 109,
    "calls": [
      "(el.getAttribute(attr) || '').split",
      "(el.getAttribute(attr) || '').split(/\\s+/).filter",
      "(el.getAttribute(attr) || '').split(/\\s+/).filter(Boolean).map",
      "(el.getAttribute(attr) || '').split(/\\s+/).filter(Boolean).map(id => {\n        const target = root.getElementById?.(id) || (root === el.ownerDocument ? el.ownerDocument.getElementById(id) : null);\n        return text(target, config.maxLabelLength);\n      }).filter",
      "(el.getAttribute(attr) || '').split(/\\s+/).filter(Boolean).map(id => {\n        const target = root.getElementById?.(id) || (root === el.ownerDocument ? el.ownerDocument.getElementById(id) : null);\n        return text(target, config.maxLabelLength);\n      }).filter(Boolean).join",
      "/[\\p{L}\\p{N}]/u.test",
      "Date.now",
      "Date.now().toString",
      "Math.abs",
      "Math.hypot",
      "Math.max",
      "Math.min",
      "Math.random",
      "Math.random().toString",
      "Math.random().toString(36).slice",
      "Math.round",
      "Object.fromEntries",
      "ROLES.includes",
      "ROLES.map",
      "ROLES.map(r => '[role=\"' + r + '\"]').join",
      "SAFE_ATTR.test",
      "String",
      "String(value || '').replace",
      "String(value || '').replace(/\\s+/g, ' ').trim",
      "['checkbox', 'radio', 'switch'].includes",
      "['combobox', 'listbox'].includes",
      "['radio', 'checkbox', 'switch'].includes",
      "['radio', 'checkbox'].includes",
      "['submit', 'button', 'reset', 'image'].includes",
      "[...(current.childNodes || [])].reverse",
      "[...el.attributes].filter",
      "[...el.attributes].filter(a => SAFE_ATTR.test(a.name)).map",
      "[...el.options].map",
      "[...node.querySelectorAll(FIELDS)].some",
      "[...p.querySelectorAll(':scope > h1,:scope > h2,:scope > h3,:scope > h4,:scope > legend')].find",
      "[proxy, el.closest('label'), ...el.labels || []].filter",
      "[proxy].filter",
      "[references(el, 'aria-describedby'), el.getAttribute('aria-description') || ''].filter",
      "[references(el, 'aria-describedby'), el.getAttribute('aria-description') || ''].filter(Boolean).join",
      "above.querySelector",
      "addCandidate",
      "attachedElement",
      "boundary.contains",
      "candidate.node.contains",
      "candidates.some",
      "candidates.sort",
      "choices.map",
      "chunks.join",
      "chunks.push",
      "clean",
      "clean(chunks.join(' ')).slice",
      "config.getShadowRoot",
      "contextNode.matches",
      "cssHidden",
      "current.getAttribute",
      "current.matches",
      "current.querySelector",
      "el.closest",
      "el.contains",
      "el.getAttribute",
      "el.getBoundingClientRect",
      "el.getRootNode",
      "el.getRootNode().getElementById",
      "el.matches",
      "el.ownerDocument.createRange",
      "el.ownerDocument.defaultView?.getComputedStyle",
      "el.ownerDocument.getElementById",
      "el.parentElement?.closest",
      "el.querySelector",
      "el.tagName.toLowerCase",
      "excluded",
      "excludedRoots.some",
      "field.contains",
      "form.getAttribute",
      "full.slice",
      "geometryCandidate",
      "geometryPool",
      "group.getAttribute",
      "group.querySelector",
      "groupInfo",
      "h.compareDocumentPosition",
      "identity",
      "ids.get",
      "ids.has",
      "ids.set",
      "inline.test",
      "isControl",
      "knownForms.has",
      "knownForms.set",
      "knownForms.values",
      "labelCandidates",
      "left.matches",
      "left.querySelector",
      "list.push",
      "list.some",
      "node.matches",
      "node.querySelector",
      "node.querySelectorAll",
      "node?.getRootNode",
      "optionsList.push",
      "ownsOtherFields",
      "p.matches",
      "p.querySelectorAll",
      "parent.matches",
      "parent.querySelectorAll",
      "parentOf",
      "pending.pop",
      "pending.push",
      "performance.now",
      "pieces.join",
      "pieces.push",
      "pieces.unshift",
      "pool.push",
      "proxy.getAttribute",
      "proxyLabels.some",
      "range.getBoundingClientRect",
      "range.selectNodeContents",
      "rect",
      "rectCache.get",
      "rectCache.has",
      "rectCache.set",
      "reference",
      "references",
      "result.fields.filter",
      "result.fields.push",
      "result.frames.push",
      "result.warnings.push",
      "root.contains",
      "root.getElementById",
      "safeURL",
      "scanRoot",
      "seen.add",
      "seen.has",
      "siblingCaption",
      "style",
      "styleCache.get",
      "styleCache.has",
      "styleCache.set",
      "targets.clear",
      "targets.delete",
      "targets.get",
      "targets.has",
      "targets.set",
      "text",
      "visitedRoots.add",
      "visitedRoots.has",
      "walkElements",
      "window.chrome?.dom?.openOrClosedShadowRoot",
      "window.crypto?.randomUUID"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.<callback>",
    "line": 55,
    "end": 55,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.identity",
    "line": 61,
    "end": 64,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "ids.get",
      "ids.has",
      "ids.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.reference",
    "line": 65,
    "end": 73,
    "lines": 9,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "attachedElement",
      "identity",
      "targets.delete",
      "targets.has",
      "targets.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.clean",
    "line": 74,
    "end": 74,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "String(value || '').replace",
      "String(value || '').replace(/\\s+/g, ' ').trim"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.parentOf",
    "line": 75,
    "end": 75,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "node?.getRootNode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.safeURL",
    "line": 76,
    "end": 79,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields",
    "line": 81,
    "end": 364,
    "lines": 284,
    "language": "typescript",
    "branches": 102,
    "calls": [
      "(el.getAttribute(attr) || '').split",
      "(el.getAttribute(attr) || '').split(/\\s+/).filter",
      "(el.getAttribute(attr) || '').split(/\\s+/).filter(Boolean).map",
      "(el.getAttribute(attr) || '').split(/\\s+/).filter(Boolean).map(id => {\n        const target = root.getElementById?.(id) || (root === el.ownerDocument ? el.ownerDocument.getElementById(id) : null);\n        return text(target, config.maxLabelLength);\n      }).filter",
      "(el.getAttribute(attr) || '').split(/\\s+/).filter(Boolean).map(id => {\n        const target = root.getElementById?.(id) || (root === el.ownerDocument ? el.ownerDocument.getElementById(id) : null);\n        return text(target, config.maxLabelLength);\n      }).filter(Boolean).join",
      "/[\\p{L}\\p{N}]/u.test",
      "Math.abs",
      "Math.hypot",
      "Math.max",
      "Math.min",
      "Math.round",
      "Object.fromEntries",
      "ROLES.includes",
      "SAFE_ATTR.test",
      "['checkbox', 'radio', 'switch'].includes",
      "['combobox', 'listbox'].includes",
      "['radio', 'checkbox', 'switch'].includes",
      "['radio', 'checkbox'].includes",
      "['submit', 'button', 'reset', 'image'].includes",
      "[...(current.childNodes || [])].reverse",
      "[...el.attributes].filter",
      "[...el.attributes].filter(a => SAFE_ATTR.test(a.name)).map",
      "[...el.options].map",
      "[...node.querySelectorAll(FIELDS)].some",
      "[...p.querySelectorAll(':scope > h1,:scope > h2,:scope > h3,:scope > h4,:scope > legend')].find",
      "[proxy, el.closest('label'), ...el.labels || []].filter",
      "[proxy].filter",
      "[references(el, 'aria-describedby'), el.getAttribute('aria-description') || ''].filter",
      "[references(el, 'aria-describedby'), el.getAttribute('aria-description') || ''].filter(Boolean).join",
      "above.querySelector",
      "addCandidate",
      "boundary.contains",
      "candidate.node.contains",
      "candidates.some",
      "candidates.sort",
      "choices.map",
      "chunks.join",
      "chunks.push",
      "clean",
      "clean(chunks.join(' ')).slice",
      "config.getShadowRoot",
      "contextNode.matches",
      "cssHidden",
      "current.getAttribute",
      "current.matches",
      "current.querySelector",
      "el.closest",
      "el.contains",
      "el.getAttribute",
      "el.getBoundingClientRect",
      "el.getRootNode",
      "el.getRootNode().getElementById",
      "el.matches",
      "el.ownerDocument.createRange",
      "el.ownerDocument.defaultView?.getComputedStyle",
      "el.ownerDocument.getElementById",
      "el.parentElement?.closest",
      "el.querySelector",
      "el.tagName.toLowerCase",
      "excluded",
      "excludedRoots.some",
      "field.contains",
      "form.getAttribute",
      "full.slice",
      "geometryCandidate",
      "geometryPool",
      "group.getAttribute",
      "group.querySelector",
      "groupInfo",
      "h.compareDocumentPosition",
      "identity",
      "inline.test",
      "isControl",
      "knownForms.has",
      "knownForms.set",
      "knownForms.values",
      "labelCandidates",
      "left.matches",
      "left.querySelector",
      "list.push",
      "list.some",
      "node.matches",
      "node.querySelector",
      "node.querySelectorAll",
      "optionsList.push",
      "ownsOtherFields",
      "p.matches",
      "p.querySelectorAll",
      "parent.matches",
      "parent.querySelectorAll",
      "parentOf",
      "pending.pop",
      "pending.push",
      "performance.now",
      "pieces.join",
      "pieces.push",
      "pieces.unshift",
      "pool.push",
      "proxy.getAttribute",
      "proxyLabels.some",
      "range.getBoundingClientRect",
      "range.selectNodeContents",
      "rect",
      "rectCache.get",
      "rectCache.has",
      "rectCache.set",
      "reference",
      "references",
      "result.fields.filter",
      "result.fields.push",
      "result.frames.push",
      "result.warnings.push",
      "root.contains",
      "root.getElementById",
      "safeURL",
      "scanRoot",
      "seen.add",
      "seen.has",
      "siblingCaption",
      "style",
      "styleCache.get",
      "styleCache.has",
      "styleCache.set",
      "targets.get",
      "text",
      "visitedRoots.add",
      "visitedRoots.has",
      "walkElements",
      "window.chrome?.dom?.openOrClosedShadowRoot"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.style",
    "line": 88,
    "end": 94,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "el.ownerDocument.defaultView?.getComputedStyle",
      "styleCache.get",
      "styleCache.has",
      "styleCache.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.rect",
    "line": 95,
    "end": 101,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "el.getBoundingClientRect",
      "rectCache.get",
      "rectCache.has",
      "rectCache.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.visibleCaption",
    "line": 102,
    "end": 112,
    "lines": 11,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "cssHidden",
      "el.ownerDocument.createRange",
      "range.getBoundingClientRect",
      "range.selectNodeContents",
      "rect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.excluded",
    "line": 113,
    "end": 113,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "el.closest",
      "excludedRoots.some",
      "root.contains"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.excluded.<callback>",
    "line": 113,
    "end": 113,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "root.contains"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.cssHidden",
    "line": 114,
    "end": 120,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "parentOf",
      "style"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.text",
    "line": 121,
    "end": 135,
    "lines": 15,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "[...(current.childNodes || [])].reverse",
      "chunks.join",
      "chunks.push",
      "clean",
      "clean(chunks.join(' ')).slice",
      "current.getAttribute",
      "current.matches",
      "pending.pop",
      "pending.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.references",
    "line": 136,
    "end": 142,
    "lines": 7,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "(el.getAttribute(attr) || '').split",
      "(el.getAttribute(attr) || '').split(/\\s+/).filter",
      "(el.getAttribute(attr) || '').split(/\\s+/).filter(Boolean).map",
      "(el.getAttribute(attr) || '').split(/\\s+/).filter(Boolean).map(id => {\n        const target = root.getElementById?.(id) || (root === el.ownerDocument ? el.ownerDocument.getElementById(id) : null);\n        return text(target, config.maxLabelLength);\n      }).filter",
      "(el.getAttribute(attr) || '').split(/\\s+/).filter(Boolean).map(id => {\n        const target = root.getElementById?.(id) || (root === el.ownerDocument ? el.ownerDocument.getElementById(id) : null);\n        return text(target, config.maxLabelLength);\n      }).filter(Boolean).join",
      "el.getAttribute",
      "el.getRootNode",
      "el.ownerDocument.getElementById",
      "root.getElementById",
      "text"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.references.<callback>",
    "line": 138,
    "end": 141,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "el.ownerDocument.getElementById",
      "root.getElementById",
      "text"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.ownsOtherFields",
    "line": 143,
    "end": 143,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "[...node.querySelectorAll(FIELDS)].some",
      "el.contains",
      "el.matches",
      "field.contains",
      "node.querySelectorAll"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.ownsOtherFields.<callback>",
    "line": 143,
    "end": 143,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "el.contains",
      "el.matches",
      "field.contains"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.isControl",
    "line": 144,
    "end": 144,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "node.matches"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.addCandidate",
    "line": 145,
    "end": 150,
    "lines": 6,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "/[\\p{L}\\p{N}]/u.test",
      "clean",
      "full.slice",
      "list.push",
      "list.some"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.addCandidate.<callback>",
    "line": 149,
    "end": 149,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.siblingCaption",
    "line": 152,
    "end": 169,
    "lines": 18,
    "language": "typescript",
    "branches": 10,
    "calls": [
      "clean",
      "current.querySelector",
      "inline.test",
      "isControl",
      "pieces.join",
      "pieces.push",
      "pieces.unshift",
      "text"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.labelCandidates",
    "line": 171,
    "end": 220,
    "lines": 50,
    "language": "typescript",
    "branches": 21,
    "calls": [
      "['checkbox', 'radio', 'switch'].includes",
      "above.querySelector",
      "addCandidate",
      "el.closest",
      "el.getAttribute",
      "left.matches",
      "left.querySelector",
      "ownsOtherFields",
      "p.matches",
      "p.querySelectorAll",
      "parentOf",
      "proxy.getAttribute",
      "references",
      "siblingCaption",
      "text"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.geometryCandidate",
    "line": 222,
    "end": 239,
    "lines": 18,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Math.abs",
      "Math.hypot",
      "Math.max",
      "Math.min",
      "boundary.contains",
      "candidate.node.contains",
      "cssHidden",
      "el.closest",
      "el.contains",
      "el.getRootNode",
      "rect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.geometryPool",
    "line": 241,
    "end": 250,
    "lines": 10,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "cssHidden",
      "excluded",
      "node.matches",
      "node.querySelector",
      "pool.push",
      "rect",
      "text",
      "walkElements"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.groupInfo",
    "line": 252,
    "end": 261,
    "lines": 10,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "[...p.querySelectorAll(':scope > h1,:scope > h2,:scope > h3,:scope > h4,:scope > legend')].find",
      "el.closest",
      "group.getAttribute",
      "group.querySelector",
      "h.compareDocumentPosition",
      "identity",
      "p.matches",
      "p.querySelectorAll",
      "parentOf",
      "references",
      "text"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.groupInfo.<callback>",
    "line": 257,
    "end": 257,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "h.compareDocumentPosition"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.scanRoot",
    "line": 263,
    "end": 349,
    "lines": 87,
    "language": "typescript",
    "branches": 36,
    "calls": [
      "Math.round",
      "Object.fromEntries",
      "ROLES.includes",
      "SAFE_ATTR.test",
      "['combobox', 'listbox'].includes",
      "['radio', 'checkbox', 'switch'].includes",
      "['radio', 'checkbox'].includes",
      "['submit', 'button', 'reset', 'image'].includes",
      "[...el.attributes].filter",
      "[...el.attributes].filter(a => SAFE_ATTR.test(a.name)).map",
      "[...el.options].map",
      "[proxy, el.closest('label'), ...el.labels || []].filter",
      "[proxy].filter",
      "[references(el, 'aria-describedby'), el.getAttribute('aria-description') || ''].filter",
      "[references(el, 'aria-describedby'), el.getAttribute('aria-description') || ''].filter(Boolean).join",
      "addCandidate",
      "candidates.some",
      "candidates.sort",
      "clean",
      "config.getShadowRoot",
      "contextNode.matches",
      "cssHidden",
      "el.closest",
      "el.getAttribute",
      "el.getRootNode",
      "el.getRootNode().getElementById",
      "el.matches",
      "el.parentElement?.closest",
      "el.querySelector",
      "el.tagName.toLowerCase",
      "excluded",
      "form.getAttribute",
      "geometryCandidate",
      "geometryPool",
      "groupInfo",
      "identity",
      "knownForms.has",
      "knownForms.set",
      "labelCandidates",
      "optionsList.push",
      "parent.matches",
      "parent.querySelectorAll",
      "parentOf",
      "proxyLabels.some",
      "rect",
      "reference",
      "references",
      "result.fields.push",
      "result.frames.push",
      "result.warnings.push",
      "safeURL",
      "scanRoot",
      "seen.add",
      "seen.has",
      "style",
      "text",
      "visitedRoots.add",
      "visitedRoots.has",
      "walkElements",
      "window.chrome?.dom?.openOrClosedShadowRoot"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.scanRoot.<callback>",
    "line": 286,
    "end": 286,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.scanRoot.<callback>",
    "line": 291,
    "end": 291,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.scanRoot.<callback>",
    "line": 293,
    "end": 293,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.scanRoot.<callback>",
    "line": 305,
    "end": 305,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "SAFE_ATTR.test"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.scanRoot.<callback>",
    "line": 305,
    "end": 305,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.scanRoot.<callback>",
    "line": 315,
    "end": 315,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "clean",
      "identity"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.<callback>",
    "line": 356,
    "end": 357,
    "lines": 2,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.<callback>",
    "line": 358,
    "end": 359,
    "lines": 2,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "targets.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.<callback>",
    "line": 362,
    "end": 362,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.<callback>",
    "line": 362,
    "end": 362,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.<callback>",
    "line": 362,
    "end": 362,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.<callback>",
    "line": 362,
    "end": 362,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.<callback>",
    "line": 362,
    "end": 362,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.collectFormFields.<callback>",
    "line": 362,
    "end": 362,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.targets",
    "line": 366,
    "end": 366,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/form-collector.js",
    "name": "createFormCollector.clear",
    "line": 366,
    "end": 366,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "targets.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioAnalysis.ts",
    "name": "AudioAnalysis.push",
    "line": 6,
    "end": 12,
    "lines": 7,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Math.max",
      "Math.min",
      "data.getInt16"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioAnalysis.ts",
    "name": "AudioAnalysis.frame",
    "line": 13,
    "end": 21,
    "lines": 9,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Date.now",
      "Math.log10",
      "Math.max",
      "Math.sqrt",
      "performance.now",
      "spectrum"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioAnalysis.ts",
    "name": "spectrum",
    "line": 23,
    "end": 33,
    "lines": 11,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "Array.from",
      "Math.cos",
      "Math.floor",
      "Math.hypot",
      "Math.log10",
      "Math.max",
      "Math.sin"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioAnalysis.ts",
    "name": "spectrum.<callback>",
    "line": 30,
    "end": 32,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Math.floor",
      "Math.hypot",
      "Math.log10",
      "Math.max"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioAnalysis.ts",
    "name": "encodePcm",
    "line": 34,
    "end": 34,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String.fromCharCode",
      "btoa"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioAnalysis.ts",
    "name": "safeAudioBody",
    "line": 35,
    "end": 39,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "/(?:token|capability|password|authorization|secret)/i.test",
      "Array.isArray",
      "Object.entries",
      "Object.entries(value).filter",
      "Object.entries(value).filter(([key])=>!/(?:token|capability|password|authorization|secret)/i.test(key)).map",
      "Object.fromEntries",
      "safeAudioBody",
      "value.map"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioAnalysis.ts",
    "name": "safeAudioBody.<callback>",
    "line": 37,
    "end": 37,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "/(?:token|capability|password|authorization|secret)/i.test"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioAnalysis.ts",
    "name": "safeAudioBody.<callback>",
    "line": 37,
    "end": 37,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "safeAudioBody"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "q",
    "line": 24,
    "end": 24,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "document.getElementById"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "recognitionControls",
    "line": 76,
    "end": 81,
    "lines": 6,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "q",
      "q('sample-list').querySelectorAll"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "warning",
    "line": 82,
    "end": 82,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "q"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "request",
    "line": 83,
    "end": 87,
    "lines": 5,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Promise.reject",
      "['devices','device','microphone','disconnect','processing','capture_start'].includes",
      "pending.delete",
      "pending.set",
      "port.postMessage",
      "reject",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "request.<callback>",
    "line": 85,
    "end": 86,
    "lines": 2,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "['devices','device','microphone','disconnect','processing','capture_start'].includes",
      "pending.delete",
      "pending.set",
      "port.postMessage",
      "reject",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "request.<callback>.<callback>",
    "line": 85,
    "end": 85,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "pending.delete",
      "reject"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "command",
    "line": 88,
    "end": 88,
    "lines": 1,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "String",
      "request",
      "warning"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "bind",
    "line": 89,
    "end": 89,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Promise.resolve",
      "Promise.resolve().then",
      "Promise.resolve().then(fn).catch",
      "String",
      "q",
      "q(id).addEventListener",
      "warning"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "bind.<callback>",
    "line": 89,
    "end": 89,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Promise.resolve",
      "Promise.resolve().then",
      "Promise.resolve().then(fn).catch",
      "String",
      "warning"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "bind.<callback>.<callback>",
    "line": 89,
    "end": 89,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String",
      "warning"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "directionLabel",
    "line": 90,
    "end": 90,
    "lines": 1,
    "language": "typescript",
    "branches": 3,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "modal",
    "line": 91,
    "end": 100,
    "lines": 10,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Date.now",
      "JSON.stringify",
      "[channel.observer,channel.source,channel.target].includes",
      "directionLabel",
      "element",
      "help.hide",
      "jsonView",
      "links.append",
      "links.replaceChildren",
      "new Date(channel.last_at??channel.t??Date.now()).toLocaleString",
      "q",
      "q('json-body').replaceChildren",
      "q<HTMLDialogElement>('json-dialog').showModal"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "closeModal",
    "line": 101,
    "end": 101,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "q",
      "q('json-body').replaceChildren",
      "q<HTMLDialogElement>('json-dialog').close",
      "returnFocus?.focus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 102,
    "end": 102,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "q",
      "q('json-body').replaceChildren",
      "returnFocus?.focus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 102,
    "end": 102,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "closeModal",
      "q",
      "q('json-dialog').getBoundingClientRect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 103,
    "end": 103,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "navigator.clipboard.writeText"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "updateStreams",
    "line": 104,
    "end": 123,
    "lines": 20,
    "language": "typescript",
    "branches": 17,
    "calls": [
      "Array.from",
      "Array.from(processingPending).some",
      "String",
      "String(r.streamId).slice",
      "['noiseSuppression','echoCancellation','autoGainControl'].map",
      "['noiseSuppression','echoCancellation','autoGainControl'].map((key,i)=>`${['NS','EC','AGC'][i]} ${typeof current.track[key]==='boolean'?(current.track[key]?'вкл':'выкл'):'нет данных'}`).join",
      "captureControls",
      "clearCharts",
      "element",
      "key.startsWith",
      "options.replaceChildren",
      "processingPending.has",
      "q",
      "recognitionControls",
      "root.querySelectorAll",
      "rows.find",
      "rows.map",
      "rows.map(r=>r.mountId+':'+r.mic).join",
      "selectStream",
      "selectStream(rows[0].mountId).catch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "updateStreams.<callback>",
    "line": 105,
    "end": 105,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "updateStreams.<callback>",
    "line": 106,
    "end": 106,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "String",
      "String(r.streamId).slice",
      "element"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "updateStreams.<callback>",
    "line": 107,
    "end": 107,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "updateStreams.<callback>",
    "line": 113,
    "end": 113,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "key.startsWith"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "updateStreams.<callback>",
    "line": 113,
    "end": 113,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "updateStreams.<callback>",
    "line": 120,
    "end": 120,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "captureControls",
    "line": 124,
    "end": 133,
    "lines": 10,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "q"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "discardCapture",
    "line": 134,
    "end": 138,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "renderSamples",
      "store.remove",
      "updateStreams"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "selectStream",
    "line": 139,
    "end": 144,
    "lines": 6,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "String",
      "channels.clear",
      "clearCharts",
      "q",
      "renderChannels",
      "request",
      "setDevices",
      "updateStreams",
      "warning"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "setDevices",
    "line": 145,
    "end": 146,
    "lines": 2,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "element",
      "q",
      "select.append",
      "select.replaceChildren"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 147,
    "end": 147,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "selectStream",
      "selectStream((event.target as HTMLSelectElement).value).catch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>.<callback>",
    "line": 147,
    "end": 147,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 148,
    "end": 148,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "command",
      "command('device',{deviceId:q<HTMLSelectElement>('device').value}).then",
      "command('device',{deviceId:q<HTMLSelectElement>('device').value}).then(value=>{if(selected===owner)setDevices(value.devices);}).catch",
      "q",
      "setDevices"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>.<callback>",
    "line": 148,
    "end": 148,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "setDevices"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>.<callback>",
    "line": 148,
    "end": 148,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 150,
    "end": 150,
    "lines": 1,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "button.classList.toggle",
      "q",
      "renderChannels",
      "renderSamples",
      "root.querySelectorAll",
      "schedulePaint"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 151,
    "end": 151,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "command",
      "q",
      "schedulePaint"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 152,
    "end": 152,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "command",
      "streams.find",
      "warning"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>.<callback>",
    "line": 152,
    "end": 152,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 153,
    "end": 153,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "command",
      "command('devices').then",
      "setDevices"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>.<callback>",
    "line": 153,
    "end": 153,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "setDevices"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 154,
    "end": 154,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "command"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 155,
    "end": 155,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "modal",
      "streams.find"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>.<callback>",
    "line": 155,
    "end": 155,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 156,
    "end": 161,
    "lines": 6,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "command",
      "command('processing',{values}).then",
      "command('processing',{values}).then(value=>{const current=streams.find(row=>row.mountId===owner);if(current&&value.track)current.track=value.track;})\n    .catch",
      "command('processing',{values}).then(value=>{const current=streams.find(row=>row.mountId===owner);if(current&&value.track)current.track=value.track;})\n    .catch(()=>undefined).finally",
      "processingPending.add",
      "processingPending.delete",
      "streams.find",
      "updateStreams"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>.<callback>",
    "line": 159,
    "end": 159,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "streams.find"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>.<callback>.<callback>",
    "line": 159,
    "end": 159,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>.<callback>",
    "line": 160,
    "end": 160,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>.<callback>",
    "line": 160,
    "end": 160,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "processingPending.delete",
      "updateStreams"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 162,
    "end": 162,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "q",
      "q('channels-table').classList.add",
      "q('channels-time').classList.remove"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 163,
    "end": 163,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "q",
      "q('channels-table').classList.remove",
      "q('channels-time').classList.add"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 164,
    "end": 168,
    "lines": 5,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "command",
      "crypto.randomUUID",
      "discardCapture",
      "updateStreams"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 169,
    "end": 169,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "command"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 170,
    "end": 172,
    "lines": 3,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "captureControls",
      "command",
      "discardCapture",
      "updateStreams"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "download",
    "line": 173,
    "end": 173,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "URL.createObjectURL",
      "URL.revokeObjectURL",
      "document.body.append",
      "element",
      "link.click",
      "link.remove",
      "urls.add",
      "urls.delete",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "download.<callback>",
    "line": 173,
    "end": 173,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "URL.revokeObjectURL",
      "urls.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples",
    "line": 174,
    "end": 222,
    "lines": 49,
    "language": "typescript",
    "branches": 35,
    "calls": [
      "(result.elapsed_ms/1000).toFixed",
      "(result.transformations??[]).map",
      "(result.transformations??[]).map((v:string)=>conversions[v]??v).join",
      "(store.bytes/1024/1024).toFixed",
      "Object.entries",
      "String",
      "URL.createObjectURL",
      "URL.revokeObjectURL",
      "[...store.samples.values()].reverse",
      "area.append",
      "box.append",
      "box.replaceChildren",
      "button.addEventListener",
      "cancel.addEventListener",
      "card.append",
      "controls.append",
      "current.files.find",
      "download",
      "element",
      "file.name.endsWith",
      "file.name.startsWith",
      "head.append",
      "help.describe",
      "help.hide",
      "item.append",
      "json.addEventListener",
      "modal",
      "new Date().toISOString",
      "new Date(sample.started_at).toLocaleTimeString",
      "player.pause",
      "preview.addEventListener",
      "q",
      "q('sample-list').querySelectorAll",
      "recognitionControls",
      "recognizer.cancel",
      "recognizer.recognize",
      "recognizing.cancel",
      "remove.addEventListener",
      "renderSamples",
      "request",
      "request('sample_ready').then",
      "request('sample_ready').then(()=>{if(!valid())throw new Error('Распознавание отменено.');return recognizer.recognize(file.blob,job.backend,text=>{if(valid())status.textContent=text;});})\n            .then",
      "request('sample_ready').then(()=>{if(!valid())throw new Error('Распознавание отменено.');return recognizer.recognize(file.blob,job.backend,text=>{if(valid())status.textContent=text;});})\n            .then(result=>{if(valid()){if(!store.recognized(sample.id,file.name,job.backend,{...result,recognized_at:new Date().toISOString()}))throw new Error('Достигнут предел памяти страницы. Освободите образцы и повторите вручную.');status.textContent='Распознавание завершено.';show();}})\n            .catch",
      "request('sample_ready').then(()=>{if(!valid())throw new Error('Распознавание отменено.');return recognizer.recognize(file.blob,job.backend,text=>{if(valid())status.textContent=text;});})\n            .then(result=>{if(valid()){if(!store.recognized(sample.id,file.name,job.backend,{...result,recognized_at:new Date().toISOString()}))throw new Error('Достигнут предел памяти страницы. Освободите образцы и повторите вручную.');status.textContent='Распознавание завершено.';show();}})\n            .catch(error=>{if(valid()){status.textContent=sampleError(error);store.recognized(sample.id,file.name,job.backend,{...error?.details,error:error instanceof Error?error.message:String(error),backend:job.backend,recognized_at:new Date().toISOString()});show();}})\n            .finally",
      "result.decode_ms.toFixed",
      "results.append",
      "results.replaceChildren",
      "row.append",
      "run.addEventListener",
      "sample.records.some",
      "sampleError",
      "save.addEventListener",
      "show",
      "store.files",
      "store.files(sample.id).then",
      "store.files(sample.id).then(current=>{const fresh=current.files.find(f=>f.name===file.name);if(fresh)download(fresh.name,fresh.blob);}).catch",
      "store.files(sample.id).then(result=>zip(result.files)).then",
      "store.files(sample.id).then(result=>zip(result.files)).then(blob=>download(`audio-${sample.id}.zip`,blob)).catch",
      "store.files(sample.id).then(result=>zip(result.files)).then(blob=>download(`audio-${sample.id}.zip`,blob)).catch(error=>warning(String(error))).finally",
      "store.files(sample.id).then(result=>{if(closed||!card.isConnected||!store.samples.has(sample.id))return;const area=element('div');for(const file of result.files){const item=element('section','','sample-file'),row=element('div','','toolbar');if(file.name.startsWith('ingress_input'))row.append(element('strong','Запись для распознавания'));else if(file.name.startsWith('browser_output'))row.append(element('strong','Микрофон до Opus'));row.append(element('code',file.name));const button=element('button','Скачать');button.addEventListener('click',()=>{if(file.name.endsWith('.wav'))download(file.name,file.blob);else void store.files(sample.id).then(current=>{const fresh=current.files.find(f=>f.name===file.name);if(fresh)download(fresh.name,fresh.blob);}).catch(error=>warning(String(error)));});row.append(button);\n      help.describe(button,'Скачать файл '+file.name+'.');\n      item.append(row);\n      if(file.name.endsWith('.wav')){const player=element('audio');player.controls=true;player.preload='none';const url=URL.createObjectURL(file.blob);urls.add(url);player.src=url;row.append(player);\n        const run=element('button','Распознать'),cancel=element('button','Отмена'),status=element('p','','muted'),results=element('div');\n        run.dataset.recognize='';cancel.hidden=true;row.append(run,cancel);item.append(status,results);\n        help.describe(run,'Передать этот WAV выбранной модели целиком, без нашего VAD, потоковых окон и обработки микрофона. Живые подключения можно оставить включёнными.');\n        help.describe(cancel,'Прекратить передачу и ожидание результата. Уже начатый вызов модели может завершиться самостоятельно.');\n        const show=()=>{results.replaceChildren();for(const [backend,result] of Object.entries(sample.recognitions?.[file.name]??{})){\n          const box=element('div','','recognition-result');box.append(element('strong',sampleBackends[backend as SampleBackend]??backend));\n          if(result.error)box.append(element('p',sampleError(result.error),'error'));\n          else{box.append(element('p',result.text||'Пустой результат','recognition-text'));\n            const conversions:Record<string,string>={pcm16_to_float32:'PCM16 → float32',resample_to_16000_float32:'ресемплинг до 16 kHz float32',linto_internal_preparation_not_observed:'внутренняя подготовка LinTO не наблюдается'};\n            box.append(element('p',`Модель: ${result.model??'имя не сообщено'} · ${typeof result.elapsed_ms==='number'?(result.elapsed_ms/1000).toFixed(2)+' с':'время не сообщено'} · ${(result.transformations??[]).map((v:string)=>conversions[v]??v).join('; ')||'без преобразования float32/16 kHz'}`,'muted'));\n            box.append(element('p',`Чистое распознавание: ${typeof result.decode_ms==='number'?result.decode_ms.toFixed(1)+' мс':'не измерено'}`));\n            box.append(element('code','SHA-256 WAV: '+(result.source?.wav_sha256??'не сообщён')));}\n          if(!result.error)box.append(element('p',result.scores?'Оценки уверенности и параметры — в JSON.':'Backend не предоставил оценки уверенности.','muted'));\n          const json=element('button','JSON');help.describe(json,'Полный ответ, доступные оценки уверенности, параметры декодирования и хеш исходного WAV.');json.addEventListener('click',()=>modal(file.name+' · '+(sampleBackends[backend as SampleBackend]??backend),result,undefined,true));box.append(json);results.append(box);\n        }};show();\n        run.addEventListener('click',()=>{if(recognizing||!connected||recording||captureStarting||cancelling||collecting)return;\n          const job={sample:sample.id,file:file.name,backend:q<HTMLSelectElement>('sample-backend').value as SampleBackend,cancel:()=>{recognizer.cancel();if(recognizing===job)recognizing=undefined;status.textContent='Распознавание отменено.';cancel.hidden=true;recognitionControls();}};recognizing=job;cancel.hidden=false;recognitionControls();\n          const valid=()=>!closed&&store.samples.get(sample.id)===sample&&recognizing===job;\n          void request('sample_ready').then(()=>{if(!valid())throw new Error('Распознавание отменено.');return recognizer.recognize(file.blob,job.backend,text=>{if(valid())status.textContent=text;});})\n            .then(result=>{if(valid()){if(!store.recognized(sample.id,file.name,job.backend,{...result,recognized_at:new Date().toISOString()}))throw new Error('Достигнут предел памяти страницы. Освободите образцы и повторите вручную.');status.textContent='Распознавание завершено.';show();}})\n            .catch(error=>{if(valid()){status.textContent=sampleError(error);store.recognized(sample.id,file.name,job.backend,{...error?.details,error:error instanceof Error?error.message:String(error),backend:job.backend,recognized_at:new Date().toISOString()});show();}})\n            .finally(()=>{if(recognizing===job){recognizing=undefined;cancel.hidden=true;}if(!closed)recognitionControls();});\n        });\n        cancel.addEventListener('click',()=>{if(recognizing?.sample===sample.id&&recognizing.file===file.name)recognizing.cancel();});\n      }area.append(item);}card.append(area);recognitionControls();}).catch",
      "store.recognized",
      "store.remove",
      "store.samples.get",
      "store.samples.has",
      "store.samples.values",
      "urls.add",
      "urls.delete",
      "valid",
      "warning",
      "zip"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>",
    "line": 183,
    "end": 183,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>",
    "line": 189,
    "end": 217,
    "lines": 29,
    "language": "typescript",
    "branches": 24,
    "calls": [
      "(result.elapsed_ms/1000).toFixed",
      "(result.transformations??[]).map",
      "(result.transformations??[]).map((v:string)=>conversions[v]??v).join",
      "Object.entries",
      "String",
      "URL.createObjectURL",
      "area.append",
      "box.append",
      "button.addEventListener",
      "cancel.addEventListener",
      "card.append",
      "current.files.find",
      "download",
      "element",
      "file.name.endsWith",
      "file.name.startsWith",
      "help.describe",
      "item.append",
      "json.addEventListener",
      "modal",
      "new Date().toISOString",
      "q",
      "recognitionControls",
      "recognizer.cancel",
      "recognizer.recognize",
      "recognizing.cancel",
      "request",
      "request('sample_ready').then",
      "request('sample_ready').then(()=>{if(!valid())throw new Error('Распознавание отменено.');return recognizer.recognize(file.blob,job.backend,text=>{if(valid())status.textContent=text;});})\n            .then",
      "request('sample_ready').then(()=>{if(!valid())throw new Error('Распознавание отменено.');return recognizer.recognize(file.blob,job.backend,text=>{if(valid())status.textContent=text;});})\n            .then(result=>{if(valid()){if(!store.recognized(sample.id,file.name,job.backend,{...result,recognized_at:new Date().toISOString()}))throw new Error('Достигнут предел памяти страницы. Освободите образцы и повторите вручную.');status.textContent='Распознавание завершено.';show();}})\n            .catch",
      "request('sample_ready').then(()=>{if(!valid())throw new Error('Распознавание отменено.');return recognizer.recognize(file.blob,job.backend,text=>{if(valid())status.textContent=text;});})\n            .then(result=>{if(valid()){if(!store.recognized(sample.id,file.name,job.backend,{...result,recognized_at:new Date().toISOString()}))throw new Error('Достигнут предел памяти страницы. Освободите образцы и повторите вручную.');status.textContent='Распознавание завершено.';show();}})\n            .catch(error=>{if(valid()){status.textContent=sampleError(error);store.recognized(sample.id,file.name,job.backend,{...error?.details,error:error instanceof Error?error.message:String(error),backend:job.backend,recognized_at:new Date().toISOString()});show();}})\n            .finally",
      "result.decode_ms.toFixed",
      "results.append",
      "results.replaceChildren",
      "row.append",
      "run.addEventListener",
      "sampleError",
      "show",
      "store.files",
      "store.files(sample.id).then",
      "store.files(sample.id).then(current=>{const fresh=current.files.find(f=>f.name===file.name);if(fresh)download(fresh.name,fresh.blob);}).catch",
      "store.files(sample.id).then(result=>{if(closed||!card.isConnected||!store.samples.has(sample.id))return;const area=element('div');for(const file of result.files){const item=element('section','','sample-file'),row=element('div','','toolbar');if(file.name.startsWith('ingress_input'))row.append(element('strong','Запись для распознавания'));else if(file.name.startsWith('browser_output'))row.append(element('strong','Микрофон до Opus'));row.append(element('code',file.name));const button=element('button','Скачать');button.addEventListener('click',()=>{if(file.name.endsWith('.wav'))download(file.name,file.blob);else void store.files(sample.id).then(current=>{const fresh=current.files.find(f=>f.name===file.name);if(fresh)download(fresh.name,fresh.blob);}).catch(error=>warning(String(error)));});row.append(button);\n      help.describe(button,'Скачать файл '+file.name+'.');\n      item.append(row);\n      if(file.name.endsWith('.wav')){const player=element('audio');player.controls=true;player.preload='none';const url=URL.createObjectURL(file.blob);urls.add(url);player.src=url;row.append(player);\n        const run=element('button','Распознать'),cancel=element('button','Отмена'),status=element('p','','muted'),results=element('div');\n        run.dataset.recognize='';cancel.hidden=true;row.append(run,cancel);item.append(status,results);\n        help.describe(run,'Передать этот WAV выбранной модели целиком, без нашего VAD, потоковых окон и обработки микрофона. Живые подключения можно оставить включёнными.');\n        help.describe(cancel,'Прекратить передачу и ожидание результата. Уже начатый вызов модели может завершиться самостоятельно.');\n        const show=()=>{results.replaceChildren();for(const [backend,result] of Object.entries(sample.recognitions?.[file.name]??{})){\n          const box=element('div','','recognition-result');box.append(element('strong',sampleBackends[backend as SampleBackend]??backend));\n          if(result.error)box.append(element('p',sampleError(result.error),'error'));\n          else{box.append(element('p',result.text||'Пустой результат','recognition-text'));\n            const conversions:Record<string,string>={pcm16_to_float32:'PCM16 → float32',resample_to_16000_float32:'ресемплинг до 16 kHz float32',linto_internal_preparation_not_observed:'внутренняя подготовка LinTO не наблюдается'};\n            box.append(element('p',`Модель: ${result.model??'имя не сообщено'} · ${typeof result.elapsed_ms==='number'?(result.elapsed_ms/1000).toFixed(2)+' с':'время не сообщено'} · ${(result.transformations??[]).map((v:string)=>conversions[v]??v).join('; ')||'без преобразования float32/16 kHz'}`,'muted'));\n            box.append(element('p',`Чистое распознавание: ${typeof result.decode_ms==='number'?result.decode_ms.toFixed(1)+' мс':'не измерено'}`));\n            box.append(element('code','SHA-256 WAV: '+(result.source?.wav_sha256??'не сообщён')));}\n          if(!result.error)box.append(element('p',result.scores?'Оценки уверенности и параметры — в JSON.':'Backend не предоставил оценки уверенности.','muted'));\n          const json=element('button','JSON');help.describe(json,'Полный ответ, доступные оценки уверенности, параметры декодирования и хеш исходного WAV.');json.addEventListener('click',()=>modal(file.name+' · '+(sampleBackends[backend as SampleBackend]??backend),result,undefined,true));box.append(json);results.append(box);\n        }};show();\n        run.addEventListener('click',()=>{if(recognizing||!connected||recording||captureStarting||cancelling||collecting)return;\n          const job={sample:sample.id,file:file.name,backend:q<HTMLSelectElement>('sample-backend').value as SampleBackend,cancel:()=>{recognizer.cancel();if(recognizing===job)recognizing=undefined;status.textContent='Распознавание отменено.';cancel.hidden=true;recognitionControls();}};recognizing=job;cancel.hidden=false;recognitionControls();\n          const valid=()=>!closed&&store.samples.get(sample.id)===sample&&recognizing===job;\n          void request('sample_ready').then(()=>{if(!valid())throw new Error('Распознавание отменено.');return recognizer.recognize(file.blob,job.backend,text=>{if(valid())status.textContent=text;});})\n            .then(result=>{if(valid()){if(!store.recognized(sample.id,file.name,job.backend,{...result,recognized_at:new Date().toISOString()}))throw new Error('Достигнут предел памяти страницы. Освободите образцы и повторите вручную.');status.textContent='Распознавание завершено.';show();}})\n            .catch(error=>{if(valid()){status.textContent=sampleError(error);store.recognized(sample.id,file.name,job.backend,{...error?.details,error:error instanceof Error?error.message:String(error),backend:job.backend,recognized_at:new Date().toISOString()});show();}})\n            .finally(()=>{if(recognizing===job){recognizing=undefined;cancel.hidden=true;}if(!closed)recognitionControls();});\n        });\n        cancel.addEventListener('click',()=>{if(recognizing?.sample===sample.id&&recognizing.file===file.name)recognizing.cancel();});\n      }area.append(item);}card.append(area);recognitionControls();}).catch",
      "store.recognized",
      "store.samples.get",
      "store.samples.has",
      "urls.add",
      "valid",
      "warning"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>",
    "line": 189,
    "end": 217,
    "lines": 29,
    "language": "typescript",
    "branches": 24,
    "calls": [
      "(result.elapsed_ms/1000).toFixed",
      "(result.transformations??[]).map",
      "(result.transformations??[]).map((v:string)=>conversions[v]??v).join",
      "Object.entries",
      "String",
      "URL.createObjectURL",
      "area.append",
      "box.append",
      "button.addEventListener",
      "cancel.addEventListener",
      "card.append",
      "current.files.find",
      "download",
      "element",
      "file.name.endsWith",
      "file.name.startsWith",
      "help.describe",
      "item.append",
      "json.addEventListener",
      "modal",
      "new Date().toISOString",
      "q",
      "recognitionControls",
      "recognizer.cancel",
      "recognizer.recognize",
      "recognizing.cancel",
      "request",
      "request('sample_ready').then",
      "request('sample_ready').then(()=>{if(!valid())throw new Error('Распознавание отменено.');return recognizer.recognize(file.blob,job.backend,text=>{if(valid())status.textContent=text;});})\n            .then",
      "request('sample_ready').then(()=>{if(!valid())throw new Error('Распознавание отменено.');return recognizer.recognize(file.blob,job.backend,text=>{if(valid())status.textContent=text;});})\n            .then(result=>{if(valid()){if(!store.recognized(sample.id,file.name,job.backend,{...result,recognized_at:new Date().toISOString()}))throw new Error('Достигнут предел памяти страницы. Освободите образцы и повторите вручную.');status.textContent='Распознавание завершено.';show();}})\n            .catch",
      "request('sample_ready').then(()=>{if(!valid())throw new Error('Распознавание отменено.');return recognizer.recognize(file.blob,job.backend,text=>{if(valid())status.textContent=text;});})\n            .then(result=>{if(valid()){if(!store.recognized(sample.id,file.name,job.backend,{...result,recognized_at:new Date().toISOString()}))throw new Error('Достигнут предел памяти страницы. Освободите образцы и повторите вручную.');status.textContent='Распознавание завершено.';show();}})\n            .catch(error=>{if(valid()){status.textContent=sampleError(error);store.recognized(sample.id,file.name,job.backend,{...error?.details,error:error instanceof Error?error.message:String(error),backend:job.backend,recognized_at:new Date().toISOString()});show();}})\n            .finally",
      "result.decode_ms.toFixed",
      "results.append",
      "results.replaceChildren",
      "row.append",
      "run.addEventListener",
      "sampleError",
      "show",
      "store.files",
      "store.files(sample.id).then",
      "store.files(sample.id).then(current=>{const fresh=current.files.find(f=>f.name===file.name);if(fresh)download(fresh.name,fresh.blob);}).catch",
      "store.recognized",
      "store.samples.get",
      "store.samples.has",
      "urls.add",
      "valid",
      "warning"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>.<callback>",
    "line": 189,
    "end": 189,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "String",
      "current.files.find",
      "download",
      "file.name.endsWith",
      "store.files",
      "store.files(sample.id).then",
      "store.files(sample.id).then(current=>{const fresh=current.files.find(f=>f.name===file.name);if(fresh)download(fresh.name,fresh.blob);}).catch",
      "warning"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>.<callback>.<callback>",
    "line": 189,
    "end": 189,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "current.files.find",
      "download"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>.<callback>.<callback>.<callback>",
    "line": 189,
    "end": 189,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>.<callback>.<callback>",
    "line": 189,
    "end": 189,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "warning"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>.show",
    "line": 197,
    "end": 207,
    "lines": 11,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "(result.elapsed_ms/1000).toFixed",
      "(result.transformations??[]).map",
      "(result.transformations??[]).map((v:string)=>conversions[v]??v).join",
      "Object.entries",
      "box.append",
      "element",
      "help.describe",
      "json.addEventListener",
      "modal",
      "result.decode_ms.toFixed",
      "results.append",
      "results.replaceChildren",
      "sampleError"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>.show.<callback>",
    "line": 202,
    "end": 202,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>.show.<callback>",
    "line": 206,
    "end": 206,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "modal"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>.<callback>",
    "line": 208,
    "end": 215,
    "lines": 8,
    "language": "typescript",
    "branches": 10,
    "calls": [
      "String",
      "new Date().toISOString",
      "q",
      "recognitionControls",
      "recognizer.cancel",
      "recognizer.recognize",
      "request",
      "request('sample_ready').then",
      "request('sample_ready').then(()=>{if(!valid())throw new Error('Распознавание отменено.');return recognizer.recognize(file.blob,job.backend,text=>{if(valid())status.textContent=text;});})\n            .then",
      "request('sample_ready').then(()=>{if(!valid())throw new Error('Распознавание отменено.');return recognizer.recognize(file.blob,job.backend,text=>{if(valid())status.textContent=text;});})\n            .then(result=>{if(valid()){if(!store.recognized(sample.id,file.name,job.backend,{...result,recognized_at:new Date().toISOString()}))throw new Error('Достигнут предел памяти страницы. Освободите образцы и повторите вручную.');status.textContent='Распознавание завершено.';show();}})\n            .catch",
      "request('sample_ready').then(()=>{if(!valid())throw new Error('Распознавание отменено.');return recognizer.recognize(file.blob,job.backend,text=>{if(valid())status.textContent=text;});})\n            .then(result=>{if(valid()){if(!store.recognized(sample.id,file.name,job.backend,{...result,recognized_at:new Date().toISOString()}))throw new Error('Достигнут предел памяти страницы. Освободите образцы и повторите вручную.');status.textContent='Распознавание завершено.';show();}})\n            .catch(error=>{if(valid()){status.textContent=sampleError(error);store.recognized(sample.id,file.name,job.backend,{...error?.details,error:error instanceof Error?error.message:String(error),backend:job.backend,recognized_at:new Date().toISOString()});show();}})\n            .finally",
      "sampleError",
      "show",
      "store.recognized",
      "store.samples.get",
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>.<callback>.cancel",
    "line": 209,
    "end": 209,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "recognitionControls",
      "recognizer.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>.<callback>.valid",
    "line": 210,
    "end": 210,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "store.samples.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>.<callback>.<callback>",
    "line": 211,
    "end": 211,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "recognizer.recognize",
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>.<callback>.<callback>.<callback>",
    "line": 211,
    "end": 211,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>.<callback>.<callback>",
    "line": 212,
    "end": 212,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "new Date().toISOString",
      "show",
      "store.recognized",
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>.<callback>.<callback>",
    "line": 213,
    "end": 213,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "String",
      "new Date().toISOString",
      "sampleError",
      "show",
      "store.recognized",
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>.<callback>.<callback>",
    "line": 214,
    "end": 214,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "recognitionControls"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>.<callback>",
    "line": 216,
    "end": 216,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "recognizing.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>",
    "line": 217,
    "end": 217,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "warning"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>",
    "line": 218,
    "end": 218,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "download",
      "store.files",
      "store.files(sample.id).then",
      "store.files(sample.id).then(result=>zip(result.files)).then",
      "store.files(sample.id).then(result=>zip(result.files)).then(blob=>download(`audio-${sample.id}.zip`,blob)).catch",
      "store.files(sample.id).then(result=>zip(result.files)).then(blob=>download(`audio-${sample.id}.zip`,blob)).catch(error=>warning(String(error))).finally",
      "warning",
      "zip"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>",
    "line": 218,
    "end": 218,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "zip"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>",
    "line": 218,
    "end": 218,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "download"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>",
    "line": 218,
    "end": 218,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "warning"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>.<callback>",
    "line": 218,
    "end": 218,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderSamples.<callback>",
    "line": 219,
    "end": 219,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "recognizer.cancel",
      "renderSamples",
      "store.remove"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderChannels",
    "line": 223,
    "end": 254,
    "lines": 32,
    "language": "typescript",
    "branches": 19,
    "calls": [
      "(row.bytes/1024).toFixed",
      "body.append",
      "button.addEventListener",
      "channelNodes.delete",
      "channelNodes.get",
      "channelNodes.set",
      "channels.get",
      "channels.has",
      "directionLabel",
      "element",
      "events.map",
      "head.append",
      "help.describe",
      "item.append",
      "list.contains",
      "list.replaceChildren",
      "modal",
      "new Date(row.last_at).toLocaleTimeString",
      "new Date(row.last_at??row.t).toLocaleTimeString",
      "node.remove",
      "q",
      "q('channel-table').querySelector",
      "q('channel-table').replaceChildren",
      "row.kbps.toFixed",
      "table.append",
      "tr.append",
      "tr.children[0].append",
      "tr.children[4].append",
      "tr.children[4].querySelector"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderChannels.<callback>",
    "line": 236,
    "end": 236,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "channels.get",
      "modal"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderChannels.<callback>",
    "line": 248,
    "end": 253,
    "lines": 6,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "button.addEventListener",
      "directionLabel",
      "element",
      "help.describe",
      "item.append",
      "modal",
      "new Date(row.last_at??row.t).toLocaleTimeString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "renderChannels.<callback>.<callback>",
    "line": 252,
    "end": 252,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "modal"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "measure",
    "line": 255,
    "end": 272,
    "lines": 18,
    "language": "typescript",
    "branches": 14,
    "calls": [
      "Date.now",
      "channels.get",
      "channels.set",
      "events.push",
      "events.shift",
      "instances.delete",
      "instances.set",
      "instances.values",
      "renderChannels",
      "rows.push",
      "rows.shift",
      "schedulePaint",
      "warning"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "clearCharts",
    "line": 273,
    "end": 273,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "q",
      "schedulePaint"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "canvas",
    "line": 274,
    "end": 275,
    "lines": 2,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "context.clearRect",
      "context.setTransform",
      "el.getContext",
      "q"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "schedulePaint",
    "line": 276,
    "end": 276,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "paint",
      "requestAnimationFrame"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "schedulePaint.<callback>",
    "line": 276,
    "end": 276,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "paint"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "paint",
    "line": 277,
    "end": 297,
    "lines": 21,
    "language": "typescript",
    "branches": 28,
    "calls": [
      "(max-(max-min)*i/4).toFixed",
      "Array.isArray",
      "Date.now",
      "Math.floor",
      "Math.max",
      "Math.min",
      "Math.round",
      "Number",
      "String",
      "['local','server'].entries",
      "[...history.server].reverse",
      "[...history.server].reverse().find",
      "c.beginPath",
      "c.fillRect",
      "c.fillText",
      "c.lineTo",
      "c.moveTo",
      "c.setLineDash",
      "c.stroke",
      "canvas",
      "color",
      "element",
      "fresh",
      "getComputedStyle",
      "lastQueue.queue_ms.toFixed",
      "lastRate.input_kbps.toFixed",
      "lastRate.output_kbps.toFixed",
      "local.rms_dbfs?.toFixed",
      "new Date(since+windowMs*i/4).toLocaleTimeString",
      "pixels.set",
      "pixels.values",
      "probe.remove",
      "q",
      "root.append",
      "root.querySelector",
      "y"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "paint.color",
    "line": 278,
    "end": 278,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "element",
      "getComputedStyle",
      "probe.remove",
      "root.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "paint.y",
    "line": 284,
    "end": 284,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Math.max",
      "Math.min"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "paint.fresh",
    "line": 291,
    "end": 291,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Date.now"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "paint.<callback>",
    "line": 293,
    "end": 293,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "paint.<callback>",
    "line": 293,
    "end": 293,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "visibilityChanged",
    "line": 299,
    "end": 299,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "command",
      "command('visibility',{visible:!document.hidden&&!paused}).catch",
      "schedulePaint"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "visibilityChanged.<callback>",
    "line": 299,
    "end": 299,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 301,
    "end": 323,
    "lines": 23,
    "language": "typescript",
    "branches": 31,
    "calls": [
      "String",
      "captureControls",
      "clearCharts",
      "clearTimeout",
      "command",
      "command('capture_stop').catch",
      "discardCapture",
      "events.push",
      "events.shift",
      "item.reject",
      "item.resolve",
      "markers.push",
      "markers.shift",
      "measure",
      "pending.delete",
      "pending.get",
      "performance.now",
      "renderChannels",
      "renderSamples",
      "required.some",
      "sample.groups.get",
      "sample.records.some",
      "schedulePaint",
      "selectStream",
      "selectStream(message.initial).catch",
      "store.add",
      "store.samples.get",
      "store.start",
      "streams.some",
      "updateStreams",
      "warning"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>.<callback>",
    "line": 305,
    "end": 305,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>.<callback>",
    "line": 306,
    "end": 306,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>.<callback>",
    "line": 306,
    "end": 306,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>.<callback>",
    "line": 317,
    "end": 317,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>.<callback>",
    "line": 321,
    "end": 321,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "sample.groups.get",
      "sample.records.some"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>.<callback>.<callback>",
    "line": 321,
    "end": 321,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "sample.groups.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 324,
    "end": 329,
    "lines": 6,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "clearTimeout",
      "item.reject",
      "pending.clear",
      "pending.values",
      "q",
      "renderSamples",
      "store.samples.get",
      "updateStreams",
      "warning"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 330,
    "end": 330,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Math.floor",
      "Math.min",
      "performance.now",
      "q",
      "schedulePaint",
      "store.samples.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnostics.ts",
    "name": "<callback>",
    "line": 331,
    "end": 331,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "URL.revokeObjectURL",
      "cancelAnimationFrame",
      "clearInterval",
      "clearTimeout",
      "document.removeEventListener",
      "help.close",
      "item.reject",
      "pending.clear",
      "pending.values",
      "port.disconnect",
      "recognizer.close",
      "resize.disconnect",
      "store.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "errorText",
    "line": 7,
    "end": 7,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.constructor",
    "line": 16,
    "end": 17,
    "lines": 2,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.entry",
    "line": 18,
    "end": 18,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.entries",
      "this.entries().find"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.entry.<callback>",
    "line": 18,
    "end": 18,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.emit",
    "line": 19,
    "end": 28,
    "lines": 10,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Promise.resolve",
      "Promise.resolve(delivery).catch",
      "Promise.resolve(delivery).catch(failed).finally",
      "failed",
      "this.send"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.emit.failed",
    "line": 24,
    "end": 24,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.emit.<callback>",
    "line": 27,
    "end": 27,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.streams",
    "line": 29,
    "end": 31,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "e.voice.connection.isDraining",
      "e.voice.connection.snapshot",
      "this.entries",
      "this.entries().filter",
      "this.entries().filter(e=>e.voice.connection.snapshot().streamId&&(e.voice.active||e.voice.connection.isDraining())).map"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.streams.<callback>",
    "line": 29,
    "end": 29,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "e.voice.connection.isDraining",
      "e.voice.connection.snapshot"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.streams.<callback>",
    "line": 29,
    "end": 31,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "e.voice.connection.snapshot"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.status",
    "line": 32,
    "end": 32,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.changed",
    "line": 33,
    "end": 33,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.emit",
      "this.streams"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.request",
    "line": 34,
    "end": 98,
    "lines": 65,
    "language": "typescript",
    "branches": 40,
    "calls": [
      "Date.now",
      "UUID.test",
      "crypto.randomUUID",
      "current.voice.connection.diagnostics",
      "current.voice.connection.diagnostics({action:'capture_release',diagnostic_id:pending.viewer,capture_id:pending.id}).catch",
      "current.voice.connection.getMicState",
      "current.voice.connection.processing",
      "current.voice.connection.snapshot",
      "current.voice.devices.refresh",
      "finished",
      "next.voice.devices.refresh",
      "performance.now",
      "previous.voice.connection.diagnostics",
      "previous.voice.connection.diagnostics({action:'detach',diagnostic_id:this.id}).catch",
      "this.analysis.frame",
      "this.attach",
      "this.cancelCapture",
      "this.changed",
      "this.channels.clear",
      "this.close",
      "this.control",
      "this.emit",
      "this.entry",
      "this.stopCapture",
      "this.streams",
      "this.streams().find",
      "this.tick",
      "window.setInterval"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.request.<callback>",
    "line": 38,
    "end": 38,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.tick"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.request.<callback>",
    "line": 39,
    "end": 39,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.analysis.frame",
      "this.emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.request.<callback>",
    "line": 48,
    "end": 48,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.request.<callback>",
    "line": 53,
    "end": 53,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.request.<callback>",
    "line": 83,
    "end": 83,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.request.<callback>",
    "line": 91,
    "end": 91,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.cancelCapture",
    "line": 99,
    "end": 117,
    "lines": 19,
    "language": "typescript",
    "branches": 10,
    "calls": [
      "UUID.test",
      "this.emit",
      "this.entry",
      "this.entry(owner)?.voice.connection.diagnostics"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.attach",
    "line": 118,
    "end": 118,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "entry.voice.connection.diagnostics"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.tick",
    "line": 119,
    "end": 130,
    "lines": 12,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "Date.now",
      "errorText",
      "performance.now",
      "this.attach",
      "this.changed",
      "this.channels.values",
      "this.emit",
      "this.entry",
      "this.readCapture",
      "this.stopCapture"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.pcm",
    "line": 131,
    "end": 148,
    "lines": 18,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Date.now",
      "encodePcm",
      "entry?.voice.connection.snapshot",
      "this.analysis.push",
      "this.channels.get",
      "this.channels.set",
      "this.emit",
      "this.entry"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.server",
    "line": 149,
    "end": 152,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.transport",
    "line": 153,
    "end": 160,
    "lines": 8,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Date.now",
      "safeAudioBody",
      "this.channels.get",
      "this.channels.set",
      "this.emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.stopCapture",
    "line": 161,
    "end": 172,
    "lines": 12,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "entry.voice.connection.diagnostics",
      "entry?.voice.connection.diagnostics",
      "entry?.voice.connection.diagnostics({action:'capture_release',diagnostic_id:viewer,capture_id:current.id}).catch",
      "errorText",
      "this.emit",
      "this.entry"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.stopCapture.<callback>",
    "line": 170,
    "end": 170,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.readCapture",
    "line": 173,
    "end": 196,
    "lines": 24,
    "language": "typescript",
    "branches": 16,
    "calls": [
      "Array.isArray",
      "Number.isSafeInteger",
      "entry.voice.connection.diagnostics",
      "entry.voice.connection.diagnostics({action:'capture_release',diagnostic_id:viewer,capture_id:current.id}).catch",
      "errorText",
      "this.emit",
      "this.entry",
      "this.stopCapture"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.readCapture.<callback>",
    "line": 194,
    "end": 194,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.ownerClosed",
    "line": 197,
    "end": 203,
    "lines": 7,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "this.emit",
      "this.stopCapture"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.close",
    "line": 204,
    "end": 208,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "entry.voice.connection.diagnostics",
      "entry.voice.connection.diagnostics({action:'detach',diagnostic_id:id}).catch",
      "this.channels.clear",
      "this.entry",
      "window.clearInterval"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioDiagnosticsHost.ts",
    "name": "AudioDiagnosticsHost.close.<callback>",
    "line": 207,
    "end": 207,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "decodePcm",
    "line": 6,
    "end": 6,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Uint8Array.from",
      "atob",
      "c.charCodeAt"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "decodePcm.<callback>",
    "line": 6,
    "end": 6,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "c.charCodeAt"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "wav",
    "line": 7,
    "end": 14,
    "lines": 8,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "s.charCodeAt",
      "str",
      "v.setUint16",
      "v.setUint32",
      "v.setUint8"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "wav.str",
    "line": 9,
    "end": 9,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "s.charCodeAt",
      "v.setUint8"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "hex",
    "line": 15,
    "end": 15,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "[...new Uint8Array(raw)].map",
      "[...new Uint8Array(raw)].map(v=>v.toString(16).padStart(2,'0')).join",
      "v.toString",
      "v.toString(16).padStart"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "hex.<callback>",
    "line": 15,
    "end": 15,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "v.toString",
      "v.toString(16).padStart"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.start",
    "line": 18,
    "end": 18,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "new Date().toISOString",
      "this.samples.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.add",
    "line": 19,
    "end": 33,
    "lines": 15,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "Number.isSafeInteger",
      "decodePcm",
      "fail",
      "group.has",
      "group.set",
      "sample.groups.get",
      "sample.groups.set",
      "sample.records.push",
      "this.samples.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.add.fail",
    "line": 21,
    "end": 21,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.remove",
    "line": 34,
    "end": 34,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "sample.groups.clear",
      "this.samples.delete",
      "this.samples.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.clear",
    "line": 35,
    "end": 35,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.remove",
      "this.samples.keys"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.recognized",
    "line": 36,
    "end": 40,
    "lines": 5,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "JSON.stringify",
      "new TextEncoder().encode",
      "size",
      "this.samples.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.recognized.size",
    "line": 37,
    "end": 37,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "JSON.stringify",
      "new TextEncoder().encode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.files",
    "line": 41,
    "end": 82,
    "lines": 42,
    "language": "typescript",
    "branches": 20,
    "calls": [
      "JSON.stringify",
      "Number",
      "[...parts.values()].reduce",
      "a.name.startsWith",
      "b.name.startsWith",
      "crypto.subtle.digest",
      "escaped",
      "f.name.endsWith",
      "files.filter",
      "files.filter(f=>f.name.endsWith('.wav')).map",
      "files.filter(f=>f.name.endsWith('.wav')).map(f=>`<h2>${escaped(f.name)}</h2><audio controls preload=\"none\" src=\"${escaped(f.name)}\"></audio>`).join",
      "files.push",
      "files.sort",
      "hex",
      "manifest.stages.push",
      "manifest.stages.some",
      "parts.get",
      "parts.values",
      "raw.set",
      "rows.push",
      "rows.reduce",
      "rows.sort",
      "s.replace",
      "sample.records.filter",
      "sample.records.find",
      "segments.push",
      "segments[segments.length-1].push",
      "stages.get",
      "stages.set",
      "this.samples.get",
      "wav"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.files.<callback>",
    "line": 45,
    "end": 45,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.files.<callback>",
    "line": 48,
    "end": 48,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.files.<callback>",
    "line": 50,
    "end": 50,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.files.<callback>",
    "line": 61,
    "end": 61,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.files.<callback>",
    "line": 64,
    "end": 64,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.files.<callback>",
    "line": 73,
    "end": 73,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.files.<callback>",
    "line": 76,
    "end": 76,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Number",
      "a.name.startsWith",
      "b.name.startsWith"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.files.escaped",
    "line": 77,
    "end": 77,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "s.replace"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.files.escaped.<callback>",
    "line": 77,
    "end": 77,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.files.<callback>",
    "line": 80,
    "end": 80,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "f.name.endsWith"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "SampleStore.files.<callback>",
    "line": 80,
    "end": 80,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "escaped"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "<callback>",
    "line": 84,
    "end": 84,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "crc32",
    "line": 85,
    "end": 85,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSamples.ts",
    "name": "zip",
    "line": 86,
    "end": 95,
    "lines": 10,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "c.set",
      "central.push",
      "crc32",
      "file.blob.arrayBuffer",
      "local.set",
      "new TextEncoder().encode",
      "parts.push",
      "v.setUint16",
      "v.setUint32",
      "w.setUint16",
      "w.setUint32"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSettings.ts",
    "name": "audioSettings",
    "line": 3,
    "end": 42,
    "lines": 40,
    "language": "typescript",
    "branches": 23,
    "calls": [
      "String",
      "actions.append",
      "apply",
      "back.focus",
      "box.addEventListener",
      "box.getRootNode",
      "box.querySelector",
      "box.querySelector('header')?.append",
      "box.removeEventListener",
      "collect.addEventListener",
      "command",
      "command('audio_processing',{values:{}}).catch",
      "command('audio_processing',{values:{}}).then",
      "command('audio_processing',{values:{}}).then(r=>{apply(r.track);if(alive)state.textContent=r.ok?'Изменения действуют в текущем аудиосеансе':r.error;}).catch",
      "controlTooltip",
      "diagnostics.addEventListener",
      "document.addEventListener",
      "document.createElement",
      "document.removeEventListener",
      "e.composedPath",
      "e.composedPath().includes",
      "e.preventDefault",
      "fields.set",
      "fields.values",
      "gear.focus",
      "gear.setAttribute",
      "help",
      "menu.addEventListener",
      "menu.append",
      "menu.contains",
      "menu.remove",
      "menu.removeEventListener",
      "microphone.focus",
      "panel.append",
      "panel.setAttribute",
      "popup.append",
      "processing.append",
      "state.setAttribute",
      "text.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSettings.ts",
    "name": "audioSettings.apply",
    "line": 19,
    "end": 19,
    "lines": 1,
    "language": "typescript",
    "branches": 5,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSettings.ts",
    "name": "audioSettings.<callback>",
    "line": 26,
    "end": 26,
    "lines": 1,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "String",
      "apply",
      "command",
      "command('audio_processing',{values:{}}).catch",
      "fields.values"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSettings.ts",
    "name": "audioSettings.<callback>.<callback>",
    "line": 26,
    "end": 26,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSettings.ts",
    "name": "audioSettings.<callback>",
    "line": 29,
    "end": 29,
    "lines": 1,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "String",
      "apply",
      "back.focus",
      "command",
      "command('audio_processing',{values:{}}).then",
      "command('audio_processing',{values:{}}).then(r=>{apply(r.track);if(alive)state.textContent=r.ok?'Изменения действуют в текущем аудиосеансе':r.error;}).catch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSettings.ts",
    "name": "audioSettings.<callback>.<callback>",
    "line": 29,
    "end": 29,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "apply"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSettings.ts",
    "name": "audioSettings.<callback>.<callback>",
    "line": 29,
    "end": 29,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSettings.ts",
    "name": "audioSettings.<callback>",
    "line": 30,
    "end": 30,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "microphone.focus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSettings.ts",
    "name": "audioSettings.<callback>",
    "line": 31,
    "end": 31,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSettings.ts",
    "name": "audioSettings.<callback>",
    "line": 32,
    "end": 32,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSettings.ts",
    "name": "audioSettings.<callback>",
    "line": 33,
    "end": 33,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSettings.ts",
    "name": "audioSettings.key",
    "line": 34,
    "end": 34,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "e.preventDefault",
      "gear.focus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSettings.ts",
    "name": "audioSettings.inside",
    "line": 35,
    "end": 35,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "menu.contains"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSettings.ts",
    "name": "audioSettings.outside",
    "line": 37,
    "end": 37,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "e.composedPath",
      "e.composedPath().includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSettings.ts",
    "name": "audioSettings.blur",
    "line": 38,
    "end": 38,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "menu.contains"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/audioSettings.ts",
    "name": "audioSettings.<callback>",
    "line": 41,
    "end": 41,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "box.removeEventListener",
      "document.removeEventListener",
      "help",
      "menu.remove",
      "menu.removeEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "row",
    "line": 7,
    "end": 7,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "saved",
    "line": 8,
    "end": 8,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "chrome.storage.session.get",
      "row"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "ensureOffscreen",
    "line": 10,
    "end": 13,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "chrome.offscreen.createDocument",
      "chrome.runtime.getContexts"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "readSession",
    "line": 18,
    "end": 29,
    "lines": 12,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Object.entries",
      "chrome.scripting.executeScript",
      "chrome.storage.session.get",
      "expirePanel",
      "key.startsWith",
      "next.catch",
      "sessionRead.then",
      "siteOrigin"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "readSession.<callback>",
    "line": 19,
    "end": 27,
    "lines": 9,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Object.entries",
      "chrome.scripting.executeScript",
      "chrome.storage.session.get",
      "expirePanel",
      "key.startsWith",
      "siteOrigin"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "readSession.<callback>",
    "line": 28,
    "end": 28,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "expirePanel",
    "line": 30,
    "end": 33,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "chrome.tabs.sendMessage",
      "chrome.tabs.sendMessage(binding.tabId,{target:'panel',mountId:binding.mountId,action:'storage_reset'},{documentId:binding.documentId}).catch",
      "release"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "expirePanel.<callback>",
    "line": 31,
    "end": 31,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "offscreen",
    "line": 34,
    "end": 38,
    "lines": 5,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "chrome.runtime.sendMessage",
      "ensureOffscreen",
      "ensureOffscreen().finally"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "offscreen.<callback>",
    "line": 36,
    "end": 36,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "release",
    "line": 39,
    "end": 50,
    "lines": 12,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "chrome.runtime.getContexts",
      "chrome.runtime.getURL",
      "chrome.runtime.sendMessage",
      "chrome.runtime.sendMessage({target:'offscreen',type:'detach',binding}).catch",
      "chrome.storage.session.get",
      "chrome.storage.session.remove",
      "chrome.tabs.get",
      "chrome.tabs.get(permissionTab).catch",
      "chrome.tabs.remove",
      "chrome.tabs.remove(permissionTab).catch",
      "row",
      "saved",
      "scripts.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "release.<callback>",
    "line": 45,
    "end": 45,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "release.<callback>",
    "line": 45,
    "end": 45,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "release.<callback>",
    "line": 48,
    "end": 48,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>",
    "line": 51,
    "end": 85,
    "lines": 35,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "Number.isInteger",
      "String",
      "String(error).includes",
      "chrome.action.setBadgeText",
      "chrome.action.setTitle",
      "chrome.scripting.executeScript",
      "chrome.storage.session.set",
      "chrome.tabs.sendMessage",
      "chrome.tabs.sendMessage(tab.id,{target:'panel',mountId:binding.mountId,action:'toggle'},{documentId:binding.documentId}).catch",
      "crypto.randomUUID",
      "expirePanel",
      "injecting.add",
      "injecting.delete",
      "injecting.has",
      "readSession",
      "release",
      "row",
      "saved",
      "scripts.forgetTab",
      "siteOrigin"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>.<callback>",
    "line": 71,
    "end": 71,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "permissionEntry",
    "line": 86,
    "end": 93,
    "lines": 8,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Object.entries",
      "Object.values",
      "Object.values(rows).find",
      "chrome.storage.session.get",
      "key.slice",
      "key.startsWith"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "permissionEntry.<callback>",
    "line": 90,
    "end": 90,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "key.slice"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "openDiagnostics",
    "line": 95,
    "end": 102,
    "lines": 8,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "(await chrome.runtime.getContexts({contextTypes:['TAB'],documentUrls:[url]})).find",
      "chrome.runtime.getContexts",
      "chrome.runtime.getURL",
      "chrome.storage.session.set",
      "chrome.tabs.create",
      "chrome.tabs.update",
      "diagnosticOwner?.port.postMessage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "openDiagnostics.<callback>",
    "line": 98,
    "end": 98,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "openMicrophonePermission",
    "line": 103,
    "end": 114,
    "lines": 12,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "chrome.runtime.getURL",
      "chrome.storage.session.get",
      "chrome.storage.session.remove",
      "chrome.storage.session.set",
      "chrome.tabs.create",
      "chrome.tabs.get",
      "chrome.tabs.get(stored[key].tabId).catch",
      "chrome.tabs.remove",
      "chrome.tabs.update",
      "offscreen"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "openMicrophonePermission.<callback>",
    "line": 106,
    "end": 106,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>",
    "line": 115,
    "end": 141,
    "lines": 27,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "Number.isSafeInteger",
      "Object.values",
      "Object.values(rows).find",
      "chrome.runtime.getURL",
      "chrome.storage.session.get",
      "offscreen",
      "offscreen({type:'audio_diagnostics',data:message.data}).then",
      "offscreen({type:'audio_diagnostics',data:{action:'close',viewer_id:owner.viewer}}).catch",
      "offscreen({type:'audio_diagnostics',data:{action:'open'}}).then",
      "offscreen({type:'audio_diagnostics',data:{action:'open'}}).then(async value=>{\n    owner.viewer=value.viewer_id;\n    if(diagnosticOwner!==owner){await offscreen({type:'audio_diagnostics',data:{action:'close',viewer_id:value.viewer_id}});return;}\n    const initial=(await chrome.storage.session.get('audioDiagnosticInitial')).audioDiagnosticInitial;\n    port.postMessage({ready:true,...value,initial});\n  }).catch",
      "openMicrophonePermission",
      "port.disconnect",
      "port.onDisconnect.addListener",
      "port.onMessage.addListener",
      "port.postMessage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>.<callback>",
    "line": 120,
    "end": 125,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "chrome.storage.session.get",
      "offscreen",
      "port.postMessage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>.<callback>",
    "line": 125,
    "end": 125,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "port.postMessage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>.<callback>",
    "line": 126,
    "end": 136,
    "lines": 11,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "Number.isSafeInteger",
      "Object.values",
      "Object.values(rows).find",
      "chrome.storage.session.get",
      "offscreen",
      "offscreen({type:'audio_diagnostics',data:message.data}).then",
      "openMicrophonePermission",
      "port.postMessage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>.<callback>.<callback>",
    "line": 128,
    "end": 135,
    "lines": 8,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Object.values",
      "Object.values(rows).find",
      "chrome.storage.session.get",
      "openMicrophonePermission",
      "port.postMessage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>.<callback>.<callback>.<callback>",
    "line": 131,
    "end": 131,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>.<callback>.<callback>",
    "line": 135,
    "end": 135,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "port.postMessage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>.<callback>",
    "line": 137,
    "end": 140,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "offscreen",
      "offscreen({type:'audio_diagnostics',data:{action:'close',viewer_id:owner.viewer}}).catch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>.<callback>.<callback>",
    "line": 139,
    "end": 139,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>",
    "line": 142,
    "end": 209,
    "lines": 68,
    "language": "typescript",
    "branches": 31,
    "calls": [
      "Number.isInteger",
      "Object.keys",
      "Object.keys(rows).some",
      "['message','reconnect','audio_connect'].includes",
      "['permission_context','permission_ready','permission_cancelled'].includes",
      "boundSender",
      "chrome.offscreen.closeDocument",
      "chrome.offscreen.closeDocument().finally",
      "chrome.runtime.getURL",
      "chrome.storage.local.get",
      "chrome.storage.local.set",
      "chrome.storage.session.get",
      "chrome.storage.session.remove",
      "chrome.storage.session.set",
      "chrome.tabs.create",
      "chrome.tabs.remove",
      "chrome.tabs.sendMessage",
      "chrome.tabs.sendMessage(binding.tabId,{target:'panel',mountId:binding.mountId,event:message.event},{documentId:binding.documentId}).catch",
      "diagnosticOwner!.port.postMessage",
      "expirePanel",
      "handle",
      "handle().then",
      "key.startsWith",
      "offscreen",
      "openDiagnostics",
      "openMicrophonePermission",
      "permissionEntry",
      "readSession",
      "release",
      "respond",
      "row",
      "saved",
      "scripts.cancel",
      "scripts.run",
      "siteOrigin",
      "validDeviceId",
      "validOperation"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>.handle",
    "line": 144,
    "end": 207,
    "lines": 64,
    "language": "typescript",
    "branches": 30,
    "calls": [
      "Number.isInteger",
      "Object.keys",
      "Object.keys(rows).some",
      "['message','reconnect','audio_connect'].includes",
      "['permission_context','permission_ready','permission_cancelled'].includes",
      "boundSender",
      "chrome.offscreen.closeDocument",
      "chrome.offscreen.closeDocument().finally",
      "chrome.runtime.getURL",
      "chrome.storage.local.get",
      "chrome.storage.local.set",
      "chrome.storage.session.get",
      "chrome.storage.session.remove",
      "chrome.storage.session.set",
      "chrome.tabs.create",
      "chrome.tabs.remove",
      "chrome.tabs.sendMessage",
      "chrome.tabs.sendMessage(binding.tabId,{target:'panel',mountId:binding.mountId,event:message.event},{documentId:binding.documentId}).catch",
      "diagnosticOwner!.port.postMessage",
      "expirePanel",
      "key.startsWith",
      "offscreen",
      "openDiagnostics",
      "openMicrophonePermission",
      "permissionEntry",
      "readSession",
      "release",
      "row",
      "saved",
      "scripts.cancel",
      "scripts.run",
      "siteOrigin",
      "validDeviceId",
      "validOperation"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>.handle.<callback>",
    "line": 157,
    "end": 157,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>.handle.<callback>",
    "line": 163,
    "end": 163,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "key.startsWith"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>.handle.<callback>",
    "line": 164,
    "end": 164,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>.<callback>",
    "line": 208,
    "end": 208,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "respond"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>",
    "line": 210,
    "end": 216,
    "lines": 7,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "chrome.runtime.sendMessage",
      "chrome.runtime.sendMessage({target:'offscreen',type:'permission_cancelled',binding:entry.binding,permissionId:entry.value.permissionId}).catch",
      "chrome.storage.session.remove",
      "permissionEntry",
      "permissionEntry(id).then",
      "release",
      "scripts.forgetTab"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>.<callback>",
    "line": 212,
    "end": 214,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "chrome.runtime.sendMessage",
      "chrome.runtime.sendMessage({target:'offscreen',type:'permission_cancelled',binding:entry.binding,permissionId:entry.value.permissionId}).catch",
      "chrome.storage.session.remove"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>.<callback>.<callback>",
    "line": 213,
    "end": 213,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/background.ts",
    "name": "<callback>",
    "line": 217,
    "end": 219,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "release"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/consoleLog.ts",
    "name": "routeLabel",
    "line": 5,
    "end": 5,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/consoleLog.ts",
    "name": "mcpLog",
    "line": 8,
    "end": 18,
    "lines": 11,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "/^(?:authorization|cookie|set-cookie|capability|signature|password|credentials?|(?:access_?|refresh_?|api_?)?token|api_?key)$/i.test",
      "Date.now",
      "JSON.parse",
      "JSON.stringify",
      "console.log"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/consoleLog.ts",
    "name": "mcpLog.<callback>",
    "line": 11,
    "end": 13,
    "lines": 3,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "/^(?:authorization|cookie|set-cookie|capability|signature|password|credentials?|(?:access_?|refresh_?|api_?)?token|api_?key)$/i.test"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/consoleLog.ts",
    "name": "packetRoute",
    "line": 21,
    "end": 43,
    "lines": 23,
    "language": "typescript",
    "branches": 18,
    "calls": [
      "/^chat\\.(ui|audio)\\.[^.]+\\.(cmd|reply|events)\\./.test",
      "data.source.toLowerCase"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/consoleLog.ts",
    "name": "mcpDiagnostic",
    "line": 46,
    "end": 61,
    "lines": 16,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Date.now",
      "['message','submit','browser_tool_result','tool_result','cancel','widget_cache'].includes",
      "data.subject?.match",
      "mcpLog",
      "ownsRequest",
      "packetRoute",
      "route.includes",
      "routeLabel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "element",
    "line": 21,
    "end": 24,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Object.entries",
      "document.createElement",
      "node.append",
      "node.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "button",
    "line": 25,
    "end": 27,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "element"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "panelLayout",
    "line": 28,
    "end": 45,
    "lines": 18,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "button",
      "element",
      "voice.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.<callback>",
    "line": 68,
    "end": 68,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.checkSession",
      "this.waveVisibility"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.<callback>",
    "line": 81,
    "end": 81,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.dispose"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.<callback>",
    "line": 82,
    "end": 82,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.runtime",
      "this.runtime({type:'session_check'}).catch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.<callback>.<callback>",
    "line": 82,
    "end": 82,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.<callback>",
    "line": 83,
    "end": 83,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "['chat-agent.session_epoch','chat-agent.session_id'].includes",
      "this.checkSession"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor",
    "line": 84,
    "end": 179,
    "lines": 96,
    "language": "typescript",
    "branches": 23,
    "calls": [
      "(this.binding?this.command('reconnect'):this.mount()).catch",
      "['light','dark'].includes",
      "audioSettings",
      "box.querySelector",
      "box.querySelector('.allow-microphone')!.addEventListener",
      "box.querySelector('.audio-diagnostics')!.addEventListener",
      "box.querySelector('.audio-login')!.addEventListener",
      "box.querySelector('.close')!.addEventListener",
      "box.querySelector('.collapse')!.addEventListener",
      "box.querySelector('.collect-forms')!.addEventListener",
      "box.querySelector('.login')!.addEventListener",
      "box.querySelector('.refresh-microphones')!.addEventListener",
      "box.querySelector('.retry')!.addEventListener",
      "box.querySelector('form')!.addEventListener",
      "box.querySelector('header')!.insertBefore",
      "button",
      "checkScript.addEventListener",
      "chrome.runtime.onMessage.addListener",
      "crypto.randomUUID",
      "document.addEventListener",
      "document.documentElement.append",
      "event.preventDefault",
      "globalThis.matchMedia",
      "localStorage.getItem",
      "localStorage.setItem",
      "mcpLog",
      "panelLayout",
      "setSpanLookup",
      "signal.addEventListener",
      "signal.removeEventListener",
      "style.replaceSync",
      "theme.addEventListener",
      "this.audioProblem",
      "this.cancel",
      "this.chat.setCancelHandler",
      "this.collect",
      "this.command",
      "this.command('audio_diagnostics_open').catch",
      "this.command('microphone_permission').then",
      "this.command('microphone_permission').then(result=>this.openPermission(result)).catch",
      "this.command('microphone_permission').then(result=>this.openPermission(result)).catch(e=>this.audioProblem(e))\n        .finally",
      "this.command('microphone_select',{deviceId}).then",
      "this.command('microphone_select',{deviceId}).then(result=>{if(result.devices)this.setDevices(result.devices);})\n        .catch",
      "this.command('microphone_select',{deviceId}).then(result=>{if(result.devices)this.setDevices(result.devices);})\n        .catch(e=>{if(this.deviceState)this.setDevices(this.deviceState);this.audioProblem(e);})\n        .finally",
      "this.deviceControls",
      "this.dispose",
      "this.enable",
      "this.host.setAttribute",
      "this.input.value.trim",
      "this.mcp!.api.callTool",
      "this.mcpPacket",
      "this.microphoneSelect.addEventListener",
      "this.mount",
      "this.observer.observe",
      "this.openPermission",
      "this.problem",
      "this.refreshDevices",
      "this.requests.get",
      "this.requests.has",
      "this.runtime",
      "this.runtime({type:'script_cancel',request_id,tool_call_id}).catch",
      "this.sendText",
      "this.setDevices",
      "this.shadow.append",
      "this.shadow.querySelector",
      "this.shadow.querySelector('.settings-actions')?.append",
      "this.streamIds.has",
      "this.toggle",
      "this.toggleVoice",
      "this.voice.addEventListener",
      "this.voiceText",
      "valid",
      "widgetMcp",
      "window.addEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 98,
    "end": 98,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "localStorage.setItem"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 99,
    "end": 103,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.command",
      "this.requests.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 104,
    "end": 104,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 104,
    "end": 104,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 105,
    "end": 105,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.streamIds.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 105,
    "end": 105,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.voiceText"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 106,
    "end": 106,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 107,
    "end": 107,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.command"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 108,
    "end": 108,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "event.preventDefault",
      "this.input.value.trim",
      "this.sendText"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 109,
    "end": 109,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.collect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 110,
    "end": 110,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.dispose"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 110,
    "end": 110,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.toggle"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 111,
    "end": 111,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "(this.binding?this.command('reconnect'):this.mount()).catch",
      "this.command",
      "this.mount",
      "this.problem"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>.<callback>",
    "line": 111,
    "end": 111,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.problem"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 112,
    "end": 112,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.runtime"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 113,
    "end": 113,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.runtime"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 114,
    "end": 114,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.audioProblem",
      "this.command",
      "this.command('audio_diagnostics_open').catch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>.<callback>",
    "line": 114,
    "end": 114,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.audioProblem"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 115,
    "end": 115,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.toggleVoice"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 116,
    "end": 116,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.refreshDevices"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 117,
    "end": 121,
    "lines": 5,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.audioProblem",
      "this.command",
      "this.command('microphone_permission').then",
      "this.command('microphone_permission').then(result=>this.openPermission(result)).catch",
      "this.command('microphone_permission').then(result=>this.openPermission(result)).catch(e=>this.audioProblem(e))\n        .finally",
      "this.deviceControls",
      "this.openPermission"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>.<callback>",
    "line": 119,
    "end": 119,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.openPermission"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>.<callback>",
    "line": 119,
    "end": 119,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.audioProblem"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>.<callback>",
    "line": 120,
    "end": 120,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.deviceControls"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 122,
    "end": 128,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.audioProblem",
      "this.command",
      "this.command('microphone_select',{deviceId}).then",
      "this.command('microphone_select',{deviceId}).then(result=>{if(result.devices)this.setDevices(result.devices);})\n        .catch",
      "this.command('microphone_select',{deviceId}).then(result=>{if(result.devices)this.setDevices(result.devices);})\n        .catch(e=>{if(this.deviceState)this.setDevices(this.deviceState);this.audioProblem(e);})\n        .finally",
      "this.deviceControls",
      "this.setDevices"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>.<callback>",
    "line": 125,
    "end": 125,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.setDevices"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>.<callback>",
    "line": 126,
    "end": 126,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.audioProblem",
      "this.setDevices"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>.<callback>",
    "line": 127,
    "end": 127,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.deviceControls"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 132,
    "end": 132,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.dispose"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.script",
    "line": 134,
    "end": 148,
    "lines": 15,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "crypto.randomUUID",
      "mcpLog",
      "signal.addEventListener",
      "signal.removeEventListener",
      "this.runtime",
      "this.runtime({type:'script_cancel',request_id,tool_call_id}).catch",
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.script.cancel",
    "line": 139,
    "end": 139,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "mcpLog",
      "this.runtime",
      "this.runtime({type:'script_cancel',request_id,tool_call_id}).catch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.script.cancel.<callback>",
    "line": 139,
    "end": 139,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.message",
    "line": 149,
    "end": 159,
    "lines": 11,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "crypto.randomUUID",
      "signal.addEventListener",
      "signal.removeEventListener",
      "this.cancel",
      "this.requests.get",
      "this.sendText",
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.message.abort",
    "line": 151,
    "end": 151,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.cancel",
    "line": 160,
    "end": 163,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.cancel",
      "this.requests.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 164,
    "end": 164,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.mcpPacket"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.constructor.<callback>",
    "line": 168,
    "end": 176,
    "lines": 9,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.mcp!.api.callTool",
      "this.problem"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.mcpPacket",
    "line": 180,
    "end": 191,
    "lines": 12,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "String",
      "mcpLog",
      "this.mcpPackets.delete",
      "this.mcpPackets.get",
      "this.mcpPackets.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.runtime",
    "line": 192,
    "end": 206,
    "lines": 15,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "/extension context invalidated/i.test",
      "String",
      "chrome.runtime.sendMessage",
      "this.deviceControls",
      "this.enable",
      "this.finish",
      "this.problem",
      "this.shadow.querySelector",
      "this.voiceProblem",
      "this.waveVisibility",
      "this.waveform.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.enable",
    "line": 207,
    "end": 210,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.shadow.querySelector",
      "this.voiceControls"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.mount",
    "line": 211,
    "end": 219,
    "lines": 9,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "Object.assign",
      "this.enable",
      "this.problem",
      "this.refreshDevices",
      "this.restoreHistory",
      "this.runtime",
      "this.shadow.querySelector"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.restoreHistory",
    "line": 220,
    "end": 234,
    "lines": 15,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "(async()=>{\n      try{\n        await restoreTranscript(this.chat,async data=>{\n          const result=await this.command('widget_history',data);\n          if(result.reply?.status>=400)throw new Error(String(result.reply.data?.error??'widget_history_unavailable'));\n          return result.reply.data;\n        },()=>!this.closed,(id,sequence,terminal)=>this.rememberHistory(id,{sequence,terminal}));\n      }catch{if(!this.closed)this.problem(new Error('Не удалось полностью восстановить переписку из журнала. Новые вопросы доступны.'));}\n      finally{this.restoring=false;if(!this.closed)this.enable(this.connected);}\n    })",
      "String",
      "restoreTranscript",
      "this.command",
      "this.enable",
      "this.problem",
      "this.rememberHistory"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.restoreHistory.<callback>",
    "line": 223,
    "end": 232,
    "lines": 10,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "String",
      "restoreTranscript",
      "this.command",
      "this.enable",
      "this.problem",
      "this.rememberHistory"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.restoreHistory.<callback>.<callback>",
    "line": 225,
    "end": 229,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String",
      "this.command"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.restoreHistory.<callback>.<callback>",
    "line": 229,
    "end": 229,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.restoreHistory.<callback>.<callback>",
    "line": 229,
    "end": 229,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.rememberHistory"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.rememberHistory",
    "line": 235,
    "end": 238,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.restored.delete",
      "this.restored.keys",
      "this.restored.keys().next",
      "this.restored.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.queueHistory",
    "line": 239,
    "end": 248,
    "lines": 10,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "this.sharedHistory",
      "this.sharedUpdates.delete",
      "this.sharedUpdates.entries",
      "this.sharedUpdates.entries().next",
      "this.sharedUpdates.get",
      "this.sharedUpdates.keys",
      "this.sharedUpdates.keys().next",
      "this.sharedUpdates.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.sharedHistory",
    "line": 249,
    "end": 290,
    "lines": 42,
    "language": "typescript",
    "branches": 23,
    "calls": [
      "JSON.parse",
      "Number.isInteger",
      "String",
      "UUID.test",
      "['done','failed','cancelled'].includes",
      "readTimings",
      "this.chat.addMessage",
      "this.chat.finishResponseDraft",
      "this.chat.setRequestSource",
      "this.chat.setRequestStatus",
      "this.chat.showAsrOutcome",
      "this.chat.toolActivity",
      "this.command",
      "this.rememberHistory",
      "this.requests.has",
      "this.restoreHistory",
      "this.restored.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.command",
    "line": 291,
    "end": 294,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Object.assign",
      "this.runtime"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.openPermission",
    "line": 295,
    "end": 299,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.runtime"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.toggleVoice",
    "line": 300,
    "end": 315,
    "lines": 16,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "['idle','failed'].includes",
      "this.audioProblem",
      "this.command",
      "this.command('audio_disconnect').catch",
      "this.deviceControls",
      "this.openPermission",
      "this.voiceControls"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.toggleVoice.<callback>",
    "line": 312,
    "end": 312,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.voiceControls",
    "line": 316,
    "end": 323,
    "lines": 8,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "String",
      "['idle','failed'].includes",
      "this.shadow.querySelector",
      "this.voice.removeAttribute",
      "this.voice.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.audioProblem",
    "line": 324,
    "end": 327,
    "lines": 4,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "this.shadow.querySelector",
      "this.voiceProblem"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.voiceProblem",
    "line": 328,
    "end": 333,
    "lines": 6,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "box.querySelector",
      "this.shadow.querySelector"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.refreshDevices",
    "line": 334,
    "end": 337,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.audioProblem",
      "this.command",
      "this.setDevices"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.setDevices",
    "line": 338,
    "end": 345,
    "lines": 8,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Array.isArray",
      "element",
      "options.push",
      "state.devices.map",
      "state.devices.some",
      "this.deviceControls",
      "this.microphoneSelect.replaceChildren",
      "this.shadow.querySelector"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.setDevices.<callback>",
    "line": 340,
    "end": 340,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "element"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.setDevices.<callback>",
    "line": 341,
    "end": 341,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.deviceControls",
    "line": 346,
    "end": 356,
    "lines": 11,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "this.shadow.querySelector"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.waveVisibility",
    "line": 357,
    "end": 360,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.shadow.querySelector",
      "this.shadow.querySelector('.panel')!.classList.contains",
      "this.waveform.setVisible"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.problem",
    "line": 361,
    "end": 366,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.shadow.querySelector"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.log",
    "line": 367,
    "end": 370,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Math.round",
      "mcpLog",
      "performance.now",
      "routeLabel",
      "this.requests.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.requestStatus",
    "line": 371,
    "end": 376,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.chat.setRequestStatus",
      "this.shadow.querySelector"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.collect",
    "line": 377,
    "end": 384,
    "lines": 8,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "full.warnings.some",
      "mcpLog",
      "this.problem",
      "this.shadow.querySelector",
      "this.tools.collect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.collect.<callback>",
    "line": 382,
    "end": 382,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.voiceText",
    "line": 385,
    "end": 398,
    "lines": 14,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Array.from",
      "Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',bytes))).map",
      "Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',bytes))).map(x=>x.toString(16).padStart(2,'0')).join",
      "Date.now",
      "String",
      "crypto.subtle.digest",
      "new TextEncoder().encode",
      "readTimings",
      "this.command",
      "this.command('audio_archive',{action:'receipt',stream_id:String(data.stream_id),data:{phrase_id:String(data.phrase_id),request_id:id,text,text_sha256:hash,displayed_at:displayedAt,\n        ...(monitor?.id&&monitor.received_at&&monitor.subject?{parent_event_id:monitor.id,received_at:monitor.received_at,subject:monitor.subject}:{})}}).catch",
      "this.requests.has",
      "this.restored.has",
      "this.sendText",
      "x.toString",
      "x.toString(16).padStart"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.voiceText.<callback>",
    "line": 391,
    "end": 391,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "x.toString",
      "x.toString(16).padStart"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.voiceText.<callback>",
    "line": 394,
    "end": 394,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.sendText",
    "line": 399,
    "end": 421,
    "lines": 23,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "Date.now",
      "String",
      "UUID.test",
      "crypto.randomUUID",
      "performance.now",
      "text.trim",
      "this.chat.addMessage",
      "this.chat.setRequestSource",
      "this.command",
      "this.command('cancel',{request_id:id}).catch",
      "this.finish",
      "this.interaction.identify",
      "this.log",
      "this.requestStatus",
      "this.requests.has",
      "this.requests.set",
      "this.restored.has",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.sendText.<callback>",
    "line": 402,
    "end": 406,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.command",
      "this.command('cancel',{request_id:id}).catch",
      "this.finish"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.sendText.<callback>.<callback>",
    "line": 405,
    "end": 405,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.finish",
    "line": 422,
    "end": 436,
    "lines": 15,
    "language": "typescript",
    "branches": 12,
    "calls": [
      "Math.max",
      "Number.isInteger",
      "[...this.requests].find",
      "oldest[1].input.clear",
      "performance.now",
      "readDiagnostic",
      "readTimings",
      "record.abort.abort",
      "record.calls.clear",
      "this.chat.finishResponseDraft",
      "this.chat.updateTimings",
      "this.command",
      "this.command('widget_client_receipt',{request_id:id,client_ms:timings.client_ms}).catch",
      "this.interaction.finish",
      "this.interaction.missing",
      "this.log",
      "this.requests.delete",
      "this.requests.get",
      "window.clearTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.finish.<callback>",
    "line": 431,
    "end": 431,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.finish.<callback>",
    "line": 435,
    "end": 435,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.cancel",
    "line": 437,
    "end": 441,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.command",
      "this.finish",
      "this.problem",
      "this.requests.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.tool",
    "line": 442,
    "end": 477,
    "lines": 36,
    "language": "typescript",
    "branches": 15,
    "calls": [
      "(async()=>{\n        try{\n          const started=performance.now();this.log(id,'Проверка аргументов и элементов',{tool_call_id:data.tool_call_id},'client',['widget','page']);\n          if(!inBudget())throw new Error('browser_tool_timeout');\n          const reply=await this.mcp!.api.callTool(data.name,data.arguments,{signal:record.abort.signal,meta:{request_id:id,tool_call_id:data.tool_call_id}});\n          const value=reply.structuredContent as any;\n          if(!value||typeof value.ok!=='boolean')throw new Error(String(value?.error??'browser_tool_failed'));\n          if(!record.active||this.closed)return null;\n          this.log(id,'Инструмент выполнен',{tool_call_id:data.tool_call_id,tool_ms:performance.now()-started},'client',['widget','page','receive']);\n          this.log(id,'Результат JavaScript',{name:data.name,tool_call_id:data.tool_call_id,result:value},'client',['widget','page','receive']);\n          const success=value.ok&&value.value?.ok!==false&&!value.value?.errors?.length;\n          this.chat.toolActivity(id,data.tool_call_id,data.name,success?'ok':'error',value);\n          this.log(id,'Результат подготовлен для модели',{name:data.name,tool_call_id:data.tool_call_id,model_result:value,result_bytes:new TextEncoder().encode(JSON.stringify(value)).byteLength},'model');\n          return {request_id:id,name:data.name,tool_call_id:data.tool_call_id,result:value};\n        }catch(error){const code=error instanceof Error&&/^[a-z][a-z0-9_]{0,63}$/.test(error.message)?error.message:'browser_tool_failed';if(record.active&&!this.closed)this.chat.toolActivity(id,data.tool_call_id,data.name,'error');this.log(id,'Ошибка клиентского инструмента',{error:code,tool_call_id:data.tool_call_id},'error');return {request_id:id,name:data.name,tool_call_id:data.tool_call_id,error:code};}\n      })",
      "/^[a-z][a-z0-9_]{0,63}$/.test",
      "JSON.stringify",
      "Number.isFinite",
      "String",
      "inBudget",
      "new TextEncoder().encode",
      "pageCatalog.some",
      "performance.now",
      "record.calls.get",
      "record.calls.set",
      "this.chat.toolActivity",
      "this.command",
      "this.finish",
      "this.interaction.toolActivity",
      "this.log",
      "this.mcp!.api.callTool",
      "this.requests.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.tool.<callback>",
    "line": 445,
    "end": 445,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.tool.inBudget",
    "line": 449,
    "end": 449,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Number.isFinite",
      "performance.now"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.tool.<callback>",
    "line": 457,
    "end": 472,
    "lines": 16,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "/^[a-z][a-z0-9_]{0,63}$/.test",
      "JSON.stringify",
      "String",
      "inBudget",
      "new TextEncoder().encode",
      "performance.now",
      "this.chat.toolActivity",
      "this.log",
      "this.mcp!.api.callTool"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.server",
    "line": 478,
    "end": 506,
    "lines": 29,
    "language": "typescript",
    "branches": 21,
    "calls": [
      "Date.now",
      "Number.isInteger",
      "String",
      "['done','failed','cancelled'].includes",
      "data.stage.startsWith",
      "request.input.push",
      "this.chat.toolActivity",
      "this.finish",
      "this.interaction.missing",
      "this.interaction.stage",
      "this.log",
      "this.packet",
      "this.requestStatus",
      "this.requests.get",
      "this.tool",
      "this.transcript.accept"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.<callback>",
    "line": 507,
    "end": 552,
    "lines": 46,
    "language": "typescript",
    "branches": 28,
    "calls": [
      "Object.assign",
      "['capturing','requesting'].includes",
      "['connecting','connected'].includes",
      "['ending','idle','failed'].includes",
      "['failed','idle'].includes",
      "mcpLog",
      "performance.now",
      "respond",
      "this.deviceControls",
      "this.dispose",
      "this.enable",
      "this.finish",
      "this.packet",
      "this.problem",
      "this.queueHistory",
      "this.restoreHistory",
      "this.server",
      "this.setDevices",
      "this.shadow.querySelector",
      "this.streamIds.add",
      "this.streamIds.delete",
      "this.streamIds.values",
      "this.streamIds.values().next",
      "this.toggle",
      "this.toggleVoice",
      "this.tools.run",
      "this.voiceControls",
      "this.voiceProblem",
      "this.waveVisibility",
      "this.waveform.clear",
      "this.waveform.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.<callback>.<callback>",
    "line": 515,
    "end": 515,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.packet",
    "line": 553,
    "end": 555,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "mcpDiagnostic",
      "this.interaction.packet",
      "this.requests.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.packet.<callback>",
    "line": 554,
    "end": 554,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.requests.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.toggle",
    "line": 556,
    "end": 556,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "box.classList.contains",
      "box.classList.toggle",
      "box.querySelector",
      "button.setAttribute",
      "this.shadow.querySelector",
      "this.waveVisibility"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.dispose",
    "line": 557,
    "end": 568,
    "lines": 12,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Promise.allSettled",
      "Promise.allSettled(active.map(([id])=>this.runtime({type:'operation',op:'cancel',data:{request_id:id}}))).then",
      "Promise.allSettled(active.map(([id])=>this.runtime({type:'operation',op:'cancel',data:{request_id:id}}))).then(()=>this.runtime({type:'operation',op:'close',data:{}})).catch",
      "[...this.requests].filter",
      "active.map",
      "chrome.runtime.onMessage.removeListener",
      "document.removeEventListener",
      "record.abort.abort",
      "record.calls.clear",
      "record.input.clear",
      "this.closeSettings",
      "this.host.remove",
      "this.interaction.dispose",
      "this.log",
      "this.mcp?.close",
      "this.mcpPackets.clear",
      "this.observer?.disconnect",
      "this.requests.clear",
      "this.restored.clear",
      "this.runtime",
      "this.sharedUpdates.clear",
      "this.tools.close",
      "this.waveform.close",
      "window.clearTimeout",
      "window.removeEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.dispose.<callback>",
    "line": 564,
    "end": 564,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.dispose.<callback>",
    "line": 566,
    "end": 566,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.runtime"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.dispose.<callback>",
    "line": 566,
    "end": 566,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.runtime"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/content.ts",
    "name": "Panel.dispose.<callback>",
    "line": 566,
    "end": 566,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/controlHelp.ts",
    "name": "controlHelp",
    "line": 2,
    "end": 21,
    "lines": 20,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "Math.max",
      "Math.min",
      "current.contains",
      "document.addEventListener",
      "document.body.append",
      "document.createElement",
      "document.removeEventListener",
      "event.target.closest",
      "hide",
      "node.closest",
      "node.getBoundingClientRect",
      "node.matches",
      "node.setAttribute",
      "root.addEventListener",
      "root.contains",
      "root.removeEventListener",
      "surface.append",
      "target",
      "tip.getBoundingClientRect",
      "tip.remove",
      "tip.setAttribute",
      "window.addEventListener",
      "window.removeEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/controlHelp.ts",
    "name": "controlHelp.hide",
    "line": 5,
    "end": 5,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/controlHelp.ts",
    "name": "controlHelp.target",
    "line": 6,
    "end": 6,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "event.target.closest"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/controlHelp.ts",
    "name": "controlHelp.show",
    "line": 7,
    "end": 13,
    "lines": 7,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Math.max",
      "Math.min",
      "node.closest",
      "node.getBoundingClientRect",
      "root.contains",
      "surface.append",
      "target",
      "tip.getBoundingClientRect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/controlHelp.ts",
    "name": "controlHelp.leave",
    "line": 14,
    "end": 14,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "current.contains",
      "hide"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/controlHelp.ts",
    "name": "controlHelp.escape",
    "line": 15,
    "end": 15,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "hide"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/controlHelp.ts",
    "name": "controlHelp.describe",
    "line": 18,
    "end": 20,
    "lines": 3,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "node.closest",
      "node.matches",
      "node.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/controlHelp.ts",
    "name": "controlHelp.close",
    "line": 20,
    "end": 20,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "document.removeEventListener",
      "hide",
      "root.removeEventListener",
      "tip.remove",
      "window.removeEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/diagnosticPackets.ts",
    "name": "DiagnosticPackets.incomplete",
    "line": 7,
    "end": 7,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/diagnosticPackets.ts",
    "name": "DiagnosticPackets.clear",
    "line": 8,
    "end": 8,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.completed.clear",
      "this.pending.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/diagnosticPackets.ts",
    "name": "DiagnosticPackets.push",
    "line": 9,
    "end": 32,
    "lines": 24,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "/^[A-Za-z0-9+/]*={0,2}$/.test",
      "Array.isArray",
      "JSON.parse",
      "Math.ceil",
      "Math.min",
      "Number.isInteger",
      "String",
      "UUID.test",
      "Uint8Array.from",
      "atob",
      "char.charCodeAt",
      "new TextDecoder('utf-8',{fatal:true}).decode",
      "previous.some",
      "raw.set",
      "this.completed.add",
      "this.completed.delete",
      "this.completed.has",
      "this.completed.values",
      "this.completed.values().next",
      "this.pending.delete",
      "this.pending.get",
      "this.pending.set",
      "value.chunks.get",
      "value.chunks.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/diagnosticPackets.ts",
    "name": "DiagnosticPackets.push.<callback>",
    "line": 19,
    "end": 19,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "char.charCodeAt"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/diagnosticPackets.ts",
    "name": "DiagnosticPackets.push.<callback>",
    "line": 22,
    "end": 22,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "formField",
    "line": 5,
    "end": 5,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "['INPUT','TEXTAREA','SELECT'].includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "clean",
    "line": 6,
    "end": 6,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "String(value??'').replace",
      "String(value??'').replace(/\\s+/g,' ').trim"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "fail",
    "line": 8,
    "end": 8,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "errorCode",
    "line": 9,
    "end": 9,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "page",
    "line": 10,
    "end": 10,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "integer"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "integer",
    "line": 11,
    "end": 11,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Number.isInteger",
      "fail"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "object",
    "line": 12,
    "end": 12,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Array.isArray",
      "Object.keys",
      "Object.keys(value).some",
      "fail",
      "keys.includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "object.<callback>",
    "line": 12,
    "end": 12,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "keys.includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "parent",
    "line": 13,
    "end": 13,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "el.getRootNode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "visible",
    "line": 14,
    "end": 21,
    "lines": 8,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "['hidden','collapse'].includes",
      "el.getBoundingClientRect",
      "node.matches",
      "node.ownerDocument.defaultView.getComputedStyle",
      "parent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "role",
    "line": 22,
    "end": 25,
    "lines": 4,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "['button','submit','reset'].includes",
      "['checkbox','radio'].includes",
      "el.getAttribute",
      "el.hasAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "nativeSet",
    "line": 26,
    "end": 30,
    "lines": 5,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Object.getOwnPropertyDescriptor",
      "Object.getOwnPropertyDescriptor(proto,property)!.set!.call"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.close",
    "line": 35,
    "end": 35,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.collector.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.collect",
    "line": 36,
    "end": 39,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Array.from",
      "dialogs.reverse",
      "dialogs.reverse().find",
      "document.querySelectorAll",
      "this.collector.collect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.target",
    "line": 40,
    "end": 49,
    "lines": 10,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "attachedElement",
      "fail",
      "p.matches",
      "parent",
      "this.collector.targets",
      "this.collector.targets().get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.field",
    "line": 50,
    "end": 52,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.collector.collect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.name",
    "line": 53,
    "end": 53,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "clean",
      "clean(field?.label||el.getAttribute('aria-label')||el.textContent||el.getAttribute('placeholder')||el.getAttribute('title')).slice",
      "el.getAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.find",
    "line": 54,
    "end": 81,
    "lines": 28,
    "language": "typescript",
    "branches": 20,
    "calls": [
      "JSON.stringify",
      "clean",
      "document.documentElement.matches",
      "el.getAttribute",
      "el.getAttribute('src')?.slice",
      "el.matches",
      "el.ownerDocument.URL.slice",
      "el.ownerDocument.defaultView?.frameElement?.id?.slice",
      "el.tagName.toLowerCase",
      "fail",
      "items.push",
      "name.includes",
      "new TextEncoder().encode",
      "object",
      "page",
      "result",
      "role",
      "this.collector.reference",
      "this.field",
      "this.name",
      "this.target",
      "visible",
      "walkElements",
      "warnings.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.find.result",
    "line": 62,
    "end": 62,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.options",
    "line": 82,
    "end": 100,
    "lines": 19,
    "language": "typescript",
    "branches": 13,
    "calls": [
      "(function*(root:any){\n      for(const node of walkElements(root))if(node.tagName==='INPUT'&&node.type===el.type&&node.name===el.name&&node.form===el.form&&node.getRootNode()===el.getRootNode())yield node;\n    })",
      "['radio','checkbox'].includes",
      "clean",
      "el.getAttribute",
      "el.getRootNode",
      "el.getRootNode().getElementById",
      "items.push",
      "node.getRootNode",
      "page",
      "this.collector.reference",
      "this.field",
      "this.name",
      "walkElements"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.options.<callback>",
    "line": 85,
    "end": 87,
    "lines": 3,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "el.getRootNode",
      "node.getRootNode",
      "walkElements"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.read",
    "line": 101,
    "end": 127,
    "lines": 27,
    "language": "typescript",
    "branches": 25,
    "calls": [
      "/^(style|computed):/.test",
      "Array.from",
      "Object.entries",
      "Object.entries(field.state).filter",
      "Object.fromEntries",
      "['attr:name','attr:property','attr:content','attr:rel'].includes",
      "['checkbox','radio'].includes",
      "cssName.test",
      "el.closest",
      "el.getAttribute",
      "el.getBoundingClientRect",
      "el.matches",
      "el.ownerDocument.defaultView.getComputedStyle",
      "el.tagName.toLowerCase",
      "fail",
      "form.getAttribute",
      "formField",
      "property.slice",
      "property.split",
      "role",
      "style.getPropertyPriority",
      "style.getPropertyValue",
      "this.collector.reference",
      "this.name",
      "this.options",
      "visible"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.read.<callback>",
    "line": 107,
    "end": 107,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.read.<callback>",
    "line": 117,
    "end": 117,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.get",
    "line": 128,
    "end": 140,
    "lines": 13,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "Array.isArray",
      "errorCode",
      "errors.push",
      "fail",
      "items.push",
      "object",
      "page",
      "properties.some",
      "this.field",
      "this.read",
      "this.target"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.get.<callback>",
    "line": 129,
    "end": 129,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.validate",
    "line": 141,
    "end": 167,
    "lines": 27,
    "language": "typescript",
    "branches": 26,
    "calls": [
      "/(?:var|env)\\s*\\(/i.test",
      "/^(inherit|initial|unset|revert(?:-layer)?)$/i.test",
      "Array.isArray",
      "CSS.supports",
      "['','important'].includes",
      "['checkbox','radio'].includes",
      "['file','hidden','button','submit','reset','image'].includes",
      "['value','checked','selected_values'].includes",
      "cssName.test",
      "el.getAttribute",
      "el.matches",
      "fail",
      "formField",
      "object",
      "property.slice",
      "property.startsWith",
      "this.field",
      "value.some",
      "value.value.trim"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.validate.<callback>",
    "line": 150,
    "end": 150,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.set",
    "line": 168,
    "end": 211,
    "lines": 44,
    "language": "typescript",
    "branches": 22,
    "calls": [
      "Array.isArray",
      "JSON.stringify",
      "['value','checked','selected_values'].includes",
      "[...actual].sort",
      "[...p.value].sort",
      "applied.push",
      "completed.push",
      "errorCode",
      "errors.push",
      "fail",
      "formField",
      "keys.add",
      "keys.has",
      "nativeSet",
      "object",
      "p.el.dispatchEvent",
      "p.el.getRootNode",
      "p.el.style.setProperty",
      "p.property.slice",
      "p.property.startsWith",
      "p.value.includes",
      "plans.push",
      "plans.some",
      "q.el.getRootNode",
      "this.read",
      "this.target",
      "this.validate",
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.set.<callback>",
    "line": 180,
    "end": 180,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "p.el.getRootNode",
      "q.el.getRootNode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.act",
    "line": 212,
    "end": 227,
    "lines": 16,
    "language": "typescript",
    "branches": 10,
    "calls": [
      "(root.elementFromPoint?.bind(root)||el.ownerDocument.elementFromPoint.bind(el.ownerDocument))",
      "['click','scroll'].includes",
      "['submit','image','reset','file'].includes",
      "anchor.getAttribute",
      "el.click",
      "el.closest",
      "el.contains",
      "el.getBoundingClientRect",
      "el.getRootNode",
      "el.matches",
      "el.ownerDocument.elementFromPoint.bind",
      "el.scrollIntoView",
      "fail",
      "root.elementFromPoint?.bind",
      "this.read",
      "this.target",
      "valid",
      "visible"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.run",
    "line": 228,
    "end": 236,
    "lines": 9,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "Array.isArray",
      "fail",
      "this.act",
      "this.find",
      "this.get",
      "this.set",
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/domRuntime.ts",
    "name": "DomRuntime.run.<callback>",
    "line": 228,
    "end": 228,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/failure.ts",
    "name": "audioProcessingFailure",
    "line": 7,
    "end": 34,
    "lines": 28,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "Object.prototype.hasOwnProperty.call",
      "['audio_stream_finished','audio_diagnostic_viewer_closed'].includes",
      "mediaFailure",
      "own.includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/failure.ts",
    "name": "channelRecovery",
    "line": 36,
    "end": 41,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "['Доступ к чату истёк. Войдите через штатную форму.','Доступ истёк. Новые команды остановлены.'].includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/failure.ts",
    "name": "channelFailure",
    "line": 44,
    "end": 54,
    "lines": 11,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "['ConnectionError','WebSocketError','SecurityError'].includes",
      "['Доступ к чату истёк. Войдите через штатную форму.','Доступ истёк. Новые команды остановлены.'].includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/history.ts",
    "name": "restoreTranscript",
    "line": 9,
    "end": 58,
    "lines": 50,
    "language": "typescript",
    "branches": 26,
    "calls": [
      "Array.isArray",
      "JSON.parse",
      "Number.isInteger",
      "chat.addMessage",
      "chat.finishResponseDraft",
      "chat.setRequestSource",
      "chat.setRequestStatus",
      "chat.showAsrOutcome",
      "chat.toolActivity",
      "read",
      "readDiagnostic",
      "readTimings",
      "remember",
      "seen.add",
      "seen.has",
      "text",
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/history.ts",
    "name": "restoreTranscript.text",
    "line": 12,
    "end": 25,
    "lines": 14,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "JSON.parse",
      "Number.isInteger",
      "read",
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "node",
    "line": 9,
    "end": 9,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "document.createElement"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "ms",
    "line": 10,
    "end": 10,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "(value/1000).toFixed",
      "Number.isFinite"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.constructor",
    "line": 27,
    "end": 45,
    "lines": 19,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "Array.from",
      "Array.from(this.dialog.querySelectorAll<HTMLElement>('button:not([disabled]),select:not([disabled]),a[href],summary')).filter",
      "e.preventDefault",
      "first?.focus",
      "header.append",
      "last?.focus",
      "node",
      "root.parentElement!.append",
      "this.close",
      "this.dialog.addEventListener",
      "this.dialog.append",
      "this.dialog.getRootNode",
      "this.dialog.querySelectorAll",
      "this.dialog.setAttribute",
      "this.renderModal",
      "this.select.setAttribute",
      "this.tabs.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.constructor.<callback>",
    "line": 30,
    "end": 30,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.constructor.<callback>",
    "line": 31,
    "end": 31,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.renderModal"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.constructor.<callback>",
    "line": 33,
    "end": 33,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.renderModal"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.constructor.<callback>",
    "line": 35,
    "end": 35,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.renderModal"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.constructor.<callback>",
    "line": 37,
    "end": 37,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "e.preventDefault",
      "this.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.constructor.<callback>",
    "line": 38,
    "end": 44,
    "lines": 7,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Array.from",
      "Array.from(this.dialog.querySelectorAll<HTMLElement>('button:not([disabled]),select:not([disabled]),a[href],summary')).filter",
      "e.preventDefault",
      "first?.focus",
      "last?.focus",
      "this.close",
      "this.dialog.getRootNode",
      "this.dialog.querySelectorAll"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.constructor.<callback>.<callback>",
    "line": 41,
    "end": 41,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.attach",
    "line": 46,
    "end": 51,
    "lines": 6,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "answer.before",
      "block.append",
      "block.querySelector",
      "details.append",
      "node",
      "this.requests.has",
      "this.requests.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.generationFor",
    "line": 52,
    "end": 54,
    "lines": 3,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "r.generations.get",
      "r.generations.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.stage",
    "line": 55,
    "end": 62,
    "lines": 8,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Number.isInteger",
      "this.generationFor",
      "this.render",
      "this.requests.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.packet",
    "line": 63,
    "end": 80,
    "lines": 18,
    "language": "typescript",
    "branches": 18,
    "calls": [
      "/^(reasoning|reasoning_content|thinking)$/i.test",
      "JSON.parse",
      "JSON.stringify",
      "String",
      "['model_input','provider_output','model_output','model_finished'].includes",
      "[...this.requests.values()].find",
      "g.packets.has",
      "g.packets.set",
      "new TextEncoder().encode",
      "r.missing.add",
      "r.seen.add",
      "r.seen.delete",
      "r.seen.has",
      "r.seen.values",
      "r.seen.values().next",
      "secret.test",
      "this.evict",
      "this.generationFor",
      "this.render",
      "this.requests.get",
      "this.requests.values",
      "value.replace"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.packet.<callback>",
    "line": 75,
    "end": 75,
    "lines": 1,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "/^(reasoning|reasoning_content|thinking)$/i.test",
      "secret.test",
      "value.replace"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.packet.<callback>",
    "line": 77,
    "end": 77,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.toolActivity",
    "line": 81,
    "end": 95,
    "lines": 15,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "JSON.parse",
      "JSON.stringify",
      "new TextEncoder().encode",
      "r.missing.add",
      "r.tools.get",
      "r.tools.set",
      "secret.test",
      "this.render",
      "this.requests.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.toolActivity.<callback>",
    "line": 88,
    "end": 88,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "secret.test"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.finish",
    "line": 96,
    "end": 104,
    "lines": 9,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "[...this.requests.values()].filter",
      "completed.shift",
      "r.generations.values",
      "r.missing.add",
      "r.tools.values",
      "this.evict",
      "this.generationFor",
      "this.render",
      "this.requests.get",
      "this.requests.values"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.finish.<callback>",
    "line": 102,
    "end": 102,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.identify",
    "line": 105,
    "end": 105,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.requests.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.evict",
    "line": 106,
    "end": 108,
    "lines": 3,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "g.packets.clear",
      "r.generations.values",
      "r.missing.add",
      "r.tools.values",
      "this.render",
      "this.renderModal"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.missing",
    "line": 109,
    "end": 109,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "r.missing.add",
      "this.render",
      "this.requests.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.remove",
    "line": 110,
    "end": 110,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.close",
      "this.requests.delete",
      "this.requests.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.dispose",
    "line": 111,
    "end": 111,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.close",
      "this.dialog.remove",
      "this.requests.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.render",
    "line": 112,
    "end": 132,
    "lines": 21,
    "language": "typescript",
    "branches": 12,
    "calls": [
      "Array.from",
      "Array.from(r.steps.children).find",
      "[...r.generations.values()].sort",
      "[...r.missing].join",
      "ms",
      "node",
      "ordered.forEach",
      "ordered.push",
      "put",
      "r.details.append",
      "r.details.querySelector",
      "r.generations.has",
      "r.generations.values",
      "r.steps.append",
      "r.steps.insertBefore",
      "r.tools.get",
      "r.tools.values",
      "row.focus",
      "row.getRootNode",
      "this.open"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.render.put",
    "line": 115,
    "end": 121,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Array.from",
      "Array.from(r.steps.children).find",
      "node",
      "ordered.push",
      "r.steps.append",
      "r.tools.get",
      "this.open"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.render.put.<callback>",
    "line": 116,
    "end": 116,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.render.put.<callback>",
    "line": 118,
    "end": 118,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.open"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.render.<callback>",
    "line": 122,
    "end": 122,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.render.<callback>",
    "line": 129,
    "end": 129,
    "lines": 1,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "r.steps.insertBefore",
      "row.focus",
      "row.getRootNode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.open",
    "line": 133,
    "end": 137,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.dialog.querySelector",
      "this.dialog.querySelector<HTMLButtonElement>('button')?.focus",
      "this.dialog.setAttribute",
      "this.dialog.showModal",
      "this.renderModal"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.close",
    "line": 138,
    "end": 138,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.dialog.close",
      "this.dialog.removeAttribute",
      "this.returnFocus?.focus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.json",
    "line": 139,
    "end": 142,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "JSON.stringify",
      "details.append",
      "details.querySelector",
      "node"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.json.<callback>",
    "line": 141,
    "end": 141,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "JSON.stringify",
      "details.append",
      "details.querySelector",
      "node"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.renderModal",
    "line": 143,
    "end": 183,
    "lines": 41,
    "language": "typescript",
    "branches": 22,
    "calls": [
      "Object.entries",
      "String",
      "[...r.generations.values()].sort",
      "[...r.missing].join",
      "add",
      "button.setAttribute",
      "data.response_text.trim",
      "g?.packets.get",
      "item.append",
      "item.packets.get",
      "ms",
      "node",
      "r.block.querySelector",
      "r.generations.get",
      "r.generations.has",
      "r.generations.keys",
      "r.generations.keys().next",
      "r.generations.values",
      "r.timings?.generations?.find",
      "r.tools.values",
      "this.body.append",
      "this.body.querySelector",
      "this.body.replaceChildren",
      "this.json",
      "this.requests.get",
      "this.select.append",
      "this.select.replaceChildren",
      "this.tabs.querySelectorAll",
      "traceLinks"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.renderModal.<callback>",
    "line": 146,
    "end": 146,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.renderModal.add",
    "line": 150,
    "end": 150,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "node",
      "this.body.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/interaction.ts",
    "name": "Interaction.renderModal.<callback>",
    "line": 151,
    "end": 151,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "validDeviceId",
    "line": 2,
    "end": 2,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "/[\\u0000-\\u001f\\u007f]/.test"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "MicrophoneDevices.constructor",
    "line": 18,
    "end": 19,
    "lines": 2,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "MicrophoneDevices.load",
    "line": 20,
    "end": 25,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.read",
      "this.read().then",
      "this.read().then(value=>{this.selectedId=validDeviceId(value)?value:'';}).catch",
      "validDeviceId"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "MicrophoneDevices.load.<callback>",
    "line": 21,
    "end": 21,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "validDeviceId"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "MicrophoneDevices.load.<callback>",
    "line": 21,
    "end": 23,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "MicrophoneDevices.snapshot",
    "line": 26,
    "end": 29,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.devices.some",
      "this.locked"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "MicrophoneDevices.snapshot.<callback>",
    "line": 28,
    "end": 28,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "MicrophoneDevices.notify",
    "line": 30,
    "end": 30,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.changed",
      "this.snapshot"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "MicrophoneDevices.deviceId",
    "line": 31,
    "end": 31,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "MicrophoneDevices.selecting",
    "line": 32,
    "end": 32,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "MicrophoneDevices.refresh",
    "line": 33,
    "end": 52,
    "lines": 20,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Promise.race",
      "clearTimeout",
      "devices.filter",
      "devices.filter(d=>d.kind==='audioinput'&&d.deviceId&&validDeviceId(d.deviceId)&&d.deviceId!=='default')\n        .map",
      "navigator.mediaDevices.enumerateDevices",
      "navigator.permissions.query",
      "reject",
      "setTimeout",
      "this.load",
      "this.notify",
      "this.snapshot",
      "validDeviceId"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "MicrophoneDevices.refresh.<callback>",
    "line": 42,
    "end": 42,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "reject",
      "setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "MicrophoneDevices.refresh.<callback>.<callback>",
    "line": 42,
    "end": 42,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "reject"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "MicrophoneDevices.refresh.<callback>",
    "line": 46,
    "end": 46,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "validDeviceId"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "MicrophoneDevices.refresh.<callback>",
    "line": 47,
    "end": 47,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "MicrophoneDevices.select",
    "line": 53,
    "end": 62,
    "lines": 10,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "this.devices.some",
      "this.load",
      "this.locked",
      "this.notify",
      "this.snapshot",
      "this.write",
      "validDeviceId"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneDevices.ts",
    "name": "MicrophoneDevices.select.<callback>",
    "line": 56,
    "end": 56,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneInput.ts",
    "name": "createMicrophoneInput",
    "line": 7,
    "end": 35,
    "lines": 29,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "Promise.race",
      "abort",
      "chrome.runtime.getURL",
      "document.body.append",
      "document.createElement",
      "finish",
      "old.cancel",
      "old.frame.remove",
      "reject",
      "release",
      "resolve",
      "startMic",
      "startMic(state,deviceId,exactProcessing,devices).then",
      "stopMic",
      "window.clearTimeout",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneInput.ts",
    "name": "createMicrophoneInput.release",
    "line": 9,
    "end": 9,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "old.cancel",
      "old.frame.remove"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneInput.ts",
    "name": "createMicrophoneInput.acquire",
    "line": 10,
    "end": 34,
    "lines": 25,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "Promise.race",
      "abort",
      "chrome.runtime.getURL",
      "document.body.append",
      "document.createElement",
      "finish",
      "reject",
      "release",
      "resolve",
      "startMic",
      "startMic(state,deviceId,exactProcessing,devices).then",
      "stopMic",
      "window.clearTimeout",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneInput.ts",
    "name": "createMicrophoneInput.acquire.cancel",
    "line": 14,
    "end": 14,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneInput.ts",
    "name": "createMicrophoneInput.acquire.<callback>",
    "line": 16,
    "end": 16,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneInput.ts",
    "name": "createMicrophoneInput.acquire.<callback>",
    "line": 17,
    "end": 22,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "abort",
      "finish",
      "reject",
      "resolve",
      "window.clearTimeout",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneInput.ts",
    "name": "createMicrophoneInput.acquire.<callback>.finish",
    "line": 18,
    "end": 18,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "reject",
      "resolve",
      "window.clearTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneInput.ts",
    "name": "createMicrophoneInput.acquire.<callback>.<callback>",
    "line": 19,
    "end": 19,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "finish"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneInput.ts",
    "name": "createMicrophoneInput.acquire.<callback>.<callback>",
    "line": 20,
    "end": 20,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "abort",
      "finish"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneInput.ts",
    "name": "createMicrophoneInput.acquire.<callback>.<callback>",
    "line": 21,
    "end": 21,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "finish"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneInput.ts",
    "name": "createMicrophoneInput.acquire.<callback>.<callback>",
    "line": 21,
    "end": 21,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "finish"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/microphoneInput.ts",
    "name": "createMicrophoneInput.acquire.<callback>",
    "line": 29,
    "end": 32,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "stopMic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "permissionCheck",
    "line": 22,
    "end": 22,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "navigator.permissions.query"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "normalAudioBusy",
    "line": 23,
    "end": 23,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "[...contexts.values()].some",
      "contexts.values",
      "ctx.voice.connection.isDraining"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "normalAudioBusy.<callback>",
    "line": 23,
    "end": 23,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "ctx.voice.connection.isDraining"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "createVoice",
    "line": 24,
    "end": 34,
    "lines": 11,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "chrome.runtime.sendMessage",
      "createAudioState",
      "createMicrophoneInput",
      "createNatsAudio",
      "emit",
      "v.connection.getMicState"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "createVoice.<callback>",
    "line": 26,
    "end": 29,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "chrome.runtime.sendMessage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "createVoice.<callback>",
    "line": 29,
    "end": 32,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "chrome.runtime.sendMessage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "createVoice.<callback>",
    "line": 32,
    "end": 32,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "v.connection.getMicState"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "createVoice.<callback>",
    "line": 32,
    "end": 32,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "permissionRequest",
    "line": 35,
    "end": 38,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "contexts.get",
      "crypto.randomUUID",
      "v.devices.notify"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "cancelPermission",
    "line": 39,
    "end": 43,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "contexts.get",
      "emit",
      "v.devices.notify"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "<callback>",
    "line": 44,
    "end": 52,
    "lines": 9,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "contexts.values",
      "ctx.voice.devices.refresh",
      "ctx.voice.devices.refresh().then",
      "ctx.voice.devices.refresh().then(async state=>{\n    const v=ctx.voice;\n    if(state.missing&&(v.pending||v.connection.getMicState()!=='muted')){\n      v.waiting=undefined;v.pending=false;++v.intent;v.connection.abortSession('microphone_capture_lost');\n      emit(ctx.binding,{type:'audio',mic:'muted',captureId:v.intent,level:'error',message:'Выбранный микрофон отключён. Выберите другое устройство.'});v.devices.notify();\n    }\n  }).catch",
      "emit",
      "v.connection.abortSession",
      "v.connection.getMicState",
      "v.devices.notify"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "<callback>.<callback>",
    "line": 45,
    "end": 51,
    "lines": 7,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "emit",
      "v.connection.abortSession",
      "v.connection.getMicState",
      "v.devices.notify"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "<callback>.<callback>",
    "line": 51,
    "end": 51,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "<callback>",
    "line": 53,
    "end": 53,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "[...contexts.values()].map",
      "contexts.values"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "<callback>.<callback>",
    "line": 53,
    "end": 53,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "<callback>",
    "line": 53,
    "end": 55,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "chrome.runtime.sendMessage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "<callback>",
    "line": 55,
    "end": 55,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "contexts.get",
      "operation"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "emit",
    "line": 56,
    "end": 58,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "chrome.runtime.sendMessage",
      "chrome.runtime.sendMessage({target:'background',type:'event',binding,event}).catch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "emit.<callback>",
    "line": 57,
    "end": 57,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "broadcast",
    "line": 59,
    "end": 59,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "shareHistory",
    "line": 60,
    "end": 65,
    "lines": 6,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "contexts.values",
      "emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "serverEvent",
    "line": 66,
    "end": 80,
    "lines": 15,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "['rejected','error'].includes",
      "broadcast",
      "ctx.client.monitorReceipt",
      "shareHistory"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "audioRecovery",
    "line": 81,
    "end": 83,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "['browser_access_expired','audio_access_unavailable'].includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "ready",
    "line": 84,
    "end": 97,
    "lines": 14,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "(async()=>{\n    await ctx.client.connect({url:settings.nats.url,sessionId:ctx.sessionId,name:'Chrome Agent',serviceOrigin:config.origin,onConnectStage:stage=>{ctx.stage=stage;},\n      onTransport:record=>emit(ctx.binding,{type:'transport',record})});\n    ctx.stage='events';\n    // browser_context follows both SUBs on this connection and confirms readiness.\n    await ctx.client.listen('ui',raw=>{try{const event=JSON.parse(raw);if(event.type==='command'&&event.data)serverEvent(ctx,event);}catch{/* Invalid events are never rendered. */}},false);\n    await ctx.client.listen('tools',raw=>{try{const event=JSON.parse(raw);if(event.kind==='widget_tool')serverEvent(ctx,event);}catch{/* No untyped dispatch. */}},false);\n    await registerPage(ctx,true);\n    broadcast(ctx,{type:'status',text:'NATS подключён',connected:true});\n  })",
      "(async()=>{\n    await ctx.client.connect({url:settings.nats.url,sessionId:ctx.sessionId,name:'Chrome Agent',serviceOrigin:config.origin,onConnectStage:stage=>{ctx.stage=stage;},\n      onTransport:record=>emit(ctx.binding,{type:'transport',record})});\n    ctx.stage='events';\n    // browser_context follows both SUBs on this connection and confirms readiness.\n    await ctx.client.listen('ui',raw=>{try{const event=JSON.parse(raw);if(event.type==='command'&&event.data)serverEvent(ctx,event);}catch{/* Invalid events are never rendered. */}},false);\n    await ctx.client.listen('tools',raw=>{try{const event=JSON.parse(raw);if(event.kind==='widget_tool')serverEvent(ctx,event);}catch{/* No untyped dispatch. */}},false);\n    await registerPage(ctx,true);\n    broadcast(ctx,{type:'status',text:'NATS подключён',connected:true});\n  })().finally",
      "JSON.parse",
      "broadcast",
      "ctx.client.connect",
      "ctx.client.isConnected",
      "ctx.client.listen",
      "emit",
      "registerPage",
      "serverEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "ready.<callback>",
    "line": 87,
    "end": 96,
    "lines": 10,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "JSON.parse",
      "broadcast",
      "ctx.client.connect",
      "ctx.client.listen",
      "emit",
      "registerPage",
      "serverEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "ready.<callback>.onConnectStage",
    "line": 88,
    "end": 88,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "ready.<callback>.onTransport",
    "line": 89,
    "end": 89,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "ready.<callback>.<callback>",
    "line": 92,
    "end": 92,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "JSON.parse",
      "serverEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "ready.<callback>.<callback>",
    "line": 93,
    "end": 93,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "JSON.parse",
      "serverEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "ready.<callback>",
    "line": 96,
    "end": 96,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "registerPage",
    "line": 98,
    "end": 107,
    "lines": 10,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "(async()=>{\n    const reply=await ctx.client.request('browser_context',{session_id:ctx.sessionId,kind:'widget',protocol:2,\n      context_id:ctx.binding.contextId,tools:pageCatalog},5000);\n    if(reply.status>=400)throw new Error(reply.data?.error??'widget_context_failed');\n    ctx.registered=true;\n  })",
      "(async()=>{\n    const reply=await ctx.client.request('browser_context',{session_id:ctx.sessionId,kind:'widget',protocol:2,\n      context_id:ctx.binding.contextId,tools:pageCatalog},5000);\n    if(reply.status>=400)throw new Error(reply.data?.error??'widget_context_failed');\n    ctx.registered=true;\n  })().finally",
      "ctx.client.request"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "registerPage.<callback>",
    "line": 101,
    "end": 106,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "ctx.client.request"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "registerPage.<callback>",
    "line": 106,
    "end": 106,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "context",
    "line": 108,
    "end": 125,
    "lines": 18,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "broadcast",
      "channelFailure",
      "channelRecovery",
      "contexts.get",
      "contexts.has",
      "contexts.set",
      "createVoice",
      "ctx.client.onStatus",
      "ready",
      "ready(current).catch",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "context.<callback>",
    "line": 113,
    "end": 122,
    "lines": 10,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "broadcast",
      "channelFailure",
      "channelRecovery",
      "contexts.has",
      "ready",
      "ready(current).catch",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "context.<callback>.<callback>",
    "line": 120,
    "end": 120,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "broadcast",
      "channelFailure",
      "channelRecovery",
      "ready",
      "ready(current).catch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "context.<callback>.<callback>.<callback>",
    "line": 120,
    "end": 120,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "broadcast",
      "channelFailure",
      "channelRecovery"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "endAudio",
    "line": 126,
    "end": 137,
    "lines": 12,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "(async()=>{\n    await diagnosticsHost.ownerClosed(binding.mountId);\n    v.connection.disconnectSession();const until=Date.now()+32000;\n    while((v.connection.hasSession()||v.connection.isDraining())&&Date.now()<until)await new Promise(r=>window.setTimeout(r,50));\n    if(v.connection.hasSession()||v.connection.isDraining())throw new Error('audio_cleanup_timeout');\n    v.active=false;\n  })",
      "(async()=>{\n    await diagnosticsHost.ownerClosed(binding.mountId);\n    v.connection.disconnectSession();const until=Date.now()+32000;\n    while((v.connection.hasSession()||v.connection.isDraining())&&Date.now()<until)await new Promise(r=>window.setTimeout(r,50));\n    if(v.connection.hasSession()||v.connection.isDraining())throw new Error('audio_cleanup_timeout');\n    v.active=false;\n  })().finally",
      "Date.now",
      "contexts.get",
      "diagnosticsHost.ownerClosed",
      "v.connection.disconnectSession",
      "v.connection.hasSession",
      "v.connection.isDraining",
      "v.devices.notify",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "endAudio.<callback>",
    "line": 130,
    "end": 136,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Date.now",
      "diagnosticsHost.ownerClosed",
      "v.connection.disconnectSession",
      "v.connection.hasSession",
      "v.connection.isDraining",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "endAudio.<callback>.<callback>",
    "line": 133,
    "end": 133,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "endAudio.<callback>",
    "line": 136,
    "end": 136,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "detach",
    "line": 138,
    "end": 143,
    "lines": 6,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "cancelPermission",
      "chrome.runtime.sendMessage",
      "chrome.runtime.sendMessage({target:'background',type:'idle'}).catch",
      "contexts.delete",
      "contexts.get",
      "ctx.client.disconnect",
      "endAudio",
      "normalAudioBusy",
      "window.clearTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "detach.<callback>",
    "line": 142,
    "end": 142,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "operation",
    "line": 144,
    "end": 231,
    "lines": 88,
    "language": "typescript",
    "branches": 45,
    "calls": [
      "Object.keys",
      "['failed','idle'].includes",
      "allowed.includes",
      "audioProcessingFailure",
      "audioRecovery",
      "broadcast",
      "chrome.runtime.getURL",
      "chrome.runtime.sendMessage",
      "chrome.runtime.sendMessage({target:'background',type:'event',binding,event:{type:'waveform',captureId:v.intent,...frame}})\n            .catch",
      "chrome.runtime.sendMessage({target:'background',type:'event',binding,event:{type:'waveform',captureId:v.intent,...frame}})\n            .catch(()=>undefined).finally",
      "contexts.get",
      "createAudioState",
      "ctx.client.isConnected",
      "ctx.client.request",
      "ctx.client.request('client_timings',{session_id:ctx.sessionId,context_id:binding.contextId,transport:'nats',timings},3000).catch",
      "ctx.client.uiCapability",
      "devices.load",
      "devices.notify",
      "devices.refresh",
      "devices.select",
      "devices.snapshot",
      "diagnosticsHost.changed",
      "diagnosticsHost.pcm",
      "diagnosticsHost.server",
      "diagnosticsHost.status",
      "diagnosticsHost.transport",
      "emit",
      "endAudio",
      "permissionCheck",
      "permissionRequest",
      "ready",
      "registerPage",
      "shareHistory",
      "v.connection.connectSession",
      "v.connection.disconnectSession",
      "v.connection.getAsrStreamId",
      "v.connection.getMicState",
      "v.connection.isDraining",
      "v.connection.processing",
      "v.connection.setMicEnabled",
      "v.connection.snapshot"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "operation.<callback>",
    "line": 186,
    "end": 186,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "operation.prepareContext",
    "line": 187,
    "end": 187,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "ctx.client.uiCapability",
      "ready",
      "registerPage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "operation.microphoneDevice",
    "line": 188,
    "end": 188,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "operation.onPcm",
    "line": 189,
    "end": 189,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "diagnosticsHost.pcm"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "operation.onAudioEvent",
    "line": 190,
    "end": 190,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "diagnosticsHost.server"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "operation.onTransport",
    "line": 191,
    "end": 191,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "diagnosticsHost.transport"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "operation.onWaveform",
    "line": 192,
    "end": 197,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "chrome.runtime.sendMessage",
      "chrome.runtime.sendMessage({target:'background',type:'event',binding,event:{type:'waveform',captureId:v.intent,...frame}})\n            .catch",
      "chrome.runtime.sendMessage({target:'background',type:'event',binding,event:{type:'waveform',captureId:v.intent,...frame}})\n            .catch(()=>undefined).finally",
      "v.connection.getMicState"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "operation.onWaveform.<callback>",
    "line": 196,
    "end": 196,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "operation.onWaveform.<callback>",
    "line": 196,
    "end": 196,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "operation.onTimings",
    "line": 198,
    "end": 198,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "ctx.client.request",
      "ctx.client.request('client_timings',{session_id:ctx.sessionId,context_id:binding.contextId,transport:'nats',timings},3000).catch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "operation.onTimings.<callback>",
    "line": 198,
    "end": 198,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "operation.onDiagnostic",
    "line": 199,
    "end": 204,
    "lines": 6,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "['failed','idle'].includes",
      "audioRecovery",
      "devices.notify",
      "diagnosticsHost.changed",
      "diagnosticsHost.status",
      "emit",
      "v.connection.getAsrStreamId",
      "v.connection.getMicState"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "<callback>",
    "line": 232,
    "end": 261,
    "lines": 30,
    "language": "typescript",
    "branches": 15,
    "calls": [
      "['permission_context','permission_ready','permission_cancelled'].includes",
      "audioProcessingFailure",
      "cancelPermission",
      "channelFailure",
      "channelRecovery",
      "chrome.runtime.getURL",
      "chrome.runtime.sendMessage",
      "chrome.runtime.sendMessage({target:'background',type:'idle'}).catch",
      "context",
      "contexts.get",
      "contexts.has",
      "ctx.voice.devices.refresh",
      "detach",
      "diagnosticsHost.changed",
      "diagnosticsHost.request",
      "handle",
      "handle().then",
      "normalAudioBusy",
      "operation",
      "ready",
      "respond",
      "v.connection.setMicEnabled",
      "v.devices.load",
      "v.devices.notify",
      "v.devices.refresh"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "<callback>.handle",
    "line": 234,
    "end": 256,
    "lines": 23,
    "language": "typescript",
    "branches": 14,
    "calls": [
      "['permission_context','permission_ready','permission_cancelled'].includes",
      "audioProcessingFailure",
      "cancelPermission",
      "chrome.runtime.sendMessage",
      "chrome.runtime.sendMessage({target:'background',type:'idle'}).catch",
      "context",
      "contexts.get",
      "contexts.has",
      "ctx.voice.devices.refresh",
      "detach",
      "diagnosticsHost.changed",
      "diagnosticsHost.request",
      "normalAudioBusy",
      "operation",
      "ready",
      "v.connection.setMicEnabled",
      "v.devices.load",
      "v.devices.notify",
      "v.devices.refresh"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "<callback>.handle.<callback>",
    "line": 239,
    "end": 239,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/offscreen.ts",
    "name": "<callback>.<callback>",
    "line": 257,
    "end": 260,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "channelFailure",
      "channelRecovery",
      "contexts.get",
      "respond"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/pageSession.ts",
    "name": "pageSession",
    "line": 2,
    "end": 22,
    "lines": 21,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "(window.location.origin+window.location.pathname).slice",
      "String",
      "crypto.randomUUID",
      "uuid.test",
      "window.localStorage.getItem",
      "window.localStorage.setItem",
      "window.sessionStorage.getItem",
      "window.sessionStorage.getItem(contextKey)?.split",
      "window.sessionStorage.removeItem",
      "window.sessionStorage.setItem"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/pageTools.ts",
    "name": "pageToolOperation",
    "line": 2,
    "end": 34,
    "lines": 33,
    "language": "typescript",
    "branches": 22,
    "calls": [
      "/(?:Chrome|Chromium)\\/(\\d+)/.exec",
      "Array.isArray",
      "Date.now",
      "JSON.parse",
      "JSON.stringify",
      "Number",
      "['list','call'].includes",
      "api.call",
      "api.executeTool",
      "api.getTools",
      "api.list",
      "catalog.filter",
      "json",
      "ready",
      "tools.find",
      "tools.map",
      "validate"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/pageTools.ts",
    "name": "pageToolOperation.json",
    "line": 4,
    "end": 4,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "validate"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/pageTools.ts",
    "name": "pageToolOperation.<callback>",
    "line": 14,
    "end": 14,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/pageTools.ts",
    "name": "pageToolOperation.<callback>",
    "line": 16,
    "end": 17,
    "lines": 2,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "JSON.parse"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/pageTools.ts",
    "name": "pageToolOperation.<callback>",
    "line": 18,
    "end": 18,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/permission.ts",
    "name": "<callback>",
    "line": 3,
    "end": 17,
    "lines": 15,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "chrome.runtime.sendMessage",
      "chrome.runtime.sendMessage({target:'background',type:'permission_cancelled',permissionId:context.permissionId}).catch",
      "navigator.mediaDevices.getUserMedia",
      "stream.getTracks",
      "stream.getTracks().forEach",
      "track.stop"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/permission.ts",
    "name": "<callback>.<callback>",
    "line": 10,
    "end": 10,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "track.stop"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/permission.ts",
    "name": "<callback>.<callback>",
    "line": 14,
    "end": 14,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/protocol.ts",
    "name": "siteOrigin",
    "line": 6,
    "end": 8,
    "lines": 3,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "String",
      "['chromewebstore.google.com','chrome.google.com'].includes",
      "['http:','https:'].includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/protocol.ts",
    "name": "boundSender",
    "line": 9,
    "end": 12,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Boolean",
      "siteOrigin"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/protocol.ts",
    "name": "validOperation",
    "line": 13,
    "end": 28,
    "lines": 16,
    "language": "typescript",
    "branches": 12,
    "calls": [
      "/^[a-f0-9]{16}$/.test",
      "/^[a-f0-9]{32}$/.test",
      "Array.isArray",
      "JSON.stringify",
      "Number.isFinite",
      "Object.entries",
      "Object.entries(d.values as Record<string,unknown>).every",
      "Object.keys",
      "Object.keys(d).every",
      "String",
      "UUID.test",
      "['noiseSuppression','echoCancellation','autoGainControl'].includes",
      "['request_id','client_ms'].includes",
      "['text','request_id'].includes",
      "d.text.trim",
      "new TextEncoder().encode",
      "operations.has",
      "validDeviceId"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/protocol.ts",
    "name": "validOperation.<callback>",
    "line": 17,
    "end": 17,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "['noiseSuppression','echoCancellation','autoGainControl'].includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/protocol.ts",
    "name": "validOperation.<callback>",
    "line": 19,
    "end": 19,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "['text','request_id'].includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/protocol.ts",
    "name": "validOperation.<callback>",
    "line": 20,
    "end": 20,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "['request_id','client_ms'].includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "failed",
    "line": 6,
    "end": 6,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "marker",
    "line": 7,
    "end": 7,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "bytes",
    "line": 8,
    "end": 8,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "JSON.stringify",
      "new TextEncoder().encode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "scriptResult",
    "line": 11,
    "end": 56,
    "lines": 46,
    "language": "typescript",
    "branches": 22,
    "calls": [
      "/[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/u.test",
      "/^(0|[1-9]\\d*)$/.test",
      "Array.isArray",
      "JSON.stringify",
      "Number",
      "Number.isFinite",
      "Object.create",
      "Object.getOwnPropertyDescriptor",
      "Object.getPrototypeOf",
      "Reflect.ownKeys",
      "`${path}.${key}`.slice",
      "ancestors.add",
      "ancestors.delete",
      "ancestors.has",
      "copy",
      "error.message.slice",
      "new TextEncoder().encode",
      "unicode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "scriptResult.unicode",
    "line": 14,
    "end": 14,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "/[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/u.test"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "scriptResult.copy",
    "line": 16,
    "end": 46,
    "lines": 31,
    "language": "typescript",
    "branches": 17,
    "calls": [
      "/^(0|[1-9]\\d*)$/.test",
      "Array.isArray",
      "Number",
      "Number.isFinite",
      "Object.create",
      "Object.getOwnPropertyDescriptor",
      "Object.getPrototypeOf",
      "Reflect.ownKeys",
      "`${path}.${key}`.slice",
      "ancestors.add",
      "ancestors.delete",
      "ancestors.has",
      "copy",
      "new TextEncoder().encode",
      "unicode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "scriptSource",
    "line": 59,
    "end": 89,
    "lines": 31,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "JSON.stringify",
      "pageToolOperation.toString",
      "scriptResult.toString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.constructor",
    "line": 97,
    "end": 97,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.status",
    "line": 98,
    "end": 120,
    "lines": 23,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "chrome.permissions.contains",
      "chrome.runtime.onUserScriptMessage.addListener",
      "chrome.tabs.get",
      "chrome.userScripts.getScripts",
      "failed",
      "respond",
      "this.dispatch",
      "this.dispatch(message,sender).then"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.status.<callback>",
    "line": 114,
    "end": 117,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "respond",
      "this.dispatch",
      "this.dispatch(message,sender).then"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.status.<callback>.<callback>",
    "line": 116,
    "end": 116,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "respond"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.live",
    "line": 121,
    "end": 124,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.current"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.run",
    "line": 125,
    "end": 151,
    "lines": 27,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "(async()=>{\n      let timer:ReturnType<typeof setTimeout>;\n      const stopped=new Promise<ScriptResult>(resolve=>{\n        running.stop=(error,message)=>{\n          running.uncertain=running.started;running.until=0;\n          resolve(failed(error,message,running.started?'unknown':'not_started'));\n        };\n        timer=setTimeout(()=>running.stop?.('browser_tool_timeout',running.started?'Время ожидания истекло. Код мог изменить страницу; перезагрузите её перед новым запуском.':'Время подготовки истекло. Код не запускался.'),4500);\n      });\n      const execution=this.execute(running).finally(()=>{running.pending=false;});\n      try{return await Promise.race([execution,stopped]);}\n      catch{running.uncertain=running.started;return failed('browser_script_unavailable','Не удалось подтвердить выполнение JS.',running.started?'unknown':'not_started');}\n      finally{clearTimeout(timer!);running.stop=undefined;}\n    })",
      "Date.now",
      "Object.keys",
      "Object.keys(call).some",
      "Promise.race",
      "Promise.resolve",
      "UUID.test",
      "['request_id','tool_call_id','code'].includes",
      "[...calls.values()].some",
      "bytes",
      "call.code.trim",
      "calls.delete",
      "calls.get",
      "calls.keys",
      "calls.keys().next",
      "calls.set",
      "calls.values",
      "clearTimeout",
      "failed",
      "marker",
      "resolve",
      "running.stop",
      "setTimeout",
      "this.calls.get",
      "this.calls.set",
      "this.execute",
      "this.execute(running).finally"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.run.<callback>",
    "line": 126,
    "end": 126,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "['request_id','tool_call_id','code'].includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.run.<callback>",
    "line": 131,
    "end": 131,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.run.<callback>",
    "line": 136,
    "end": 149,
    "lines": 14,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Promise.race",
      "clearTimeout",
      "failed",
      "resolve",
      "running.stop",
      "setTimeout",
      "this.execute",
      "this.execute(running).finally"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.run.<callback>.<callback>",
    "line": 138,
    "end": 144,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "failed",
      "resolve",
      "running.stop",
      "setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.run.<callback>.<callback>.<callback>",
    "line": 139,
    "end": 142,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "failed",
      "resolve"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.run.<callback>.<callback>.<callback>",
    "line": 143,
    "end": 143,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "running.stop"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.run.<callback>.<callback>",
    "line": 145,
    "end": 145,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.execute",
    "line": 152,
    "end": 179,
    "lines": 28,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "Date.now",
      "chrome.storage.session.get",
      "chrome.storage.session.remove",
      "chrome.storage.session.set",
      "chrome.userScripts.configureWorld",
      "chrome.userScripts.execute",
      "failed",
      "marker",
      "rows.find",
      "scriptResult",
      "scriptSource",
      "this.live",
      "this.status"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.execute.<callback>",
    "line": 167,
    "end": 167,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.cancel",
    "line": 180,
    "end": 183,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "marker",
      "run.stop",
      "this.calls.get",
      "this.calls.get(marker(binding))?.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.close",
    "line": 184,
    "end": 188,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "marker",
      "this.calls.get",
      "this.calls.get(marker(binding))?.values",
      "this.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.dispatch",
    "line": 189,
    "end": 221,
    "lines": 33,
    "language": "typescript",
    "branches": 17,
    "calls": [
      "Array.isArray",
      "Date.now",
      "JSON.stringify",
      "Object.keys",
      "Object.prototype.hasOwnProperty.call",
      "['find','get','set','act'].includes",
      "['list','call'].includes",
      "boundSender",
      "bytes",
      "chrome.tabs.sendMessage",
      "chrome.userScripts.execute",
      "marker",
      "pageToolOperation.toString",
      "rows.find",
      "scriptResult",
      "scriptResult.toString",
      "this.calls.get",
      "this.calls.get(marker(binding!))?.get",
      "this.current",
      "this.live"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.dispatch.<callback>",
    "line": 208,
    "end": 208,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/runJs.ts",
    "name": "RunJsExecutor.forgetTab",
    "line": 222,
    "end": 227,
    "lines": 6,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Object.keys",
      "chrome.storage.session.get",
      "chrome.storage.session.remove",
      "key.startsWith",
      "this.calls.delete",
      "this.calls.keys"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/sampleRecognition.ts",
    "name": "sampleError",
    "line": 18,
    "end": 18,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/sampleRecognition.ts",
    "name": "hex",
    "line": 19,
    "end": 19,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "[...new Uint8Array(data)].map",
      "[...new Uint8Array(data)].map(n=>n.toString(16).padStart(2,'0')).join",
      "n.toString",
      "n.toString(16).padStart"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/sampleRecognition.ts",
    "name": "hex.<callback>",
    "line": 19,
    "end": 19,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "n.toString",
      "n.toString(16).padStart"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/sampleRecognition.ts",
    "name": "SampleRecognition.busy",
    "line": 23,
    "end": 23,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/sampleRecognition.ts",
    "name": "SampleRecognition.recognize",
    "line": 24,
    "end": 45,
    "lines": 22,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "Number.isFinite",
      "Object.assign",
      "['final','rejected','error'].includes",
      "blob.arrayBuffer",
      "check",
      "crypto.subtle.digest",
      "hex",
      "input.pcm.slice",
      "parseWav",
      "performance.now",
      "results.every",
      "results.find",
      "results.map",
      "results.map(r=>r.text).filter",
      "results.map(r=>r.text).filter(Boolean).join",
      "results.push",
      "results.reduce",
      "session.open",
      "session.replay",
      "session?.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/sampleRecognition.ts",
    "name": "SampleRecognition.recognize.check",
    "line": 28,
    "end": 28,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/sampleRecognition.ts",
    "name": "SampleRecognition.recognize.<callback>",
    "line": 32,
    "end": 32,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "['final','rejected','error'].includes",
      "results.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/sampleRecognition.ts",
    "name": "SampleRecognition.recognize.<callback>",
    "line": 32,
    "end": 32,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/sampleRecognition.ts",
    "name": "SampleRecognition.recognize.<callback>",
    "line": 37,
    "end": 37,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/sampleRecognition.ts",
    "name": "SampleRecognition.recognize.<callback>",
    "line": 40,
    "end": 40,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/sampleRecognition.ts",
    "name": "SampleRecognition.recognize.<callback>",
    "line": 41,
    "end": 41,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Number.isFinite"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/sampleRecognition.ts",
    "name": "SampleRecognition.recognize.<callback>",
    "line": 41,
    "end": 41,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/sampleRecognition.ts",
    "name": "SampleRecognition.cancel",
    "line": 46,
    "end": 46,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.session?.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/sampleRecognition.ts",
    "name": "SampleRecognition.close",
    "line": 47,
    "end": 47,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/sampleRecognition.ts",
    "name": "parseWav",
    "line": 50,
    "end": 67,
    "lines": 18,
    "language": "typescript",
    "branches": 10,
    "calls": [
      "Math.max",
      "Math.min",
      "Math.round",
      "Number.isFinite",
      "String.fromCharCode",
      "data.getUint16",
      "data.getUint32",
      "raw.slice",
      "source.getFloat32",
      "tag"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/sampleRecognition.ts",
    "name": "parseWav.tag",
    "line": 51,
    "end": 51,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String.fromCharCode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/waveform.ts",
    "name": "PanelWaveform.constructor",
    "line": 8,
    "end": 8,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/waveform.ts",
    "name": "PanelWaveform.setVisible",
    "line": 9,
    "end": 11,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/waveform.ts",
    "name": "PanelWaveform.push",
    "line": 12,
    "end": 19,
    "lines": 8,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Array.isArray",
      "Math.abs",
      "Number.isFinite",
      "frame.peaks.every",
      "performance.now",
      "requestAnimationFrame",
      "this.draw",
      "this.frames.filter",
      "this.frames.filter(row=>now-row.at<=3000).slice",
      "this.frames.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/waveform.ts",
    "name": "PanelWaveform.push.<callback>",
    "line": 14,
    "end": 14,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Math.abs",
      "Number.isFinite"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/waveform.ts",
    "name": "PanelWaveform.push.<callback>",
    "line": 16,
    "end": 16,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/waveform.ts",
    "name": "PanelWaveform.push.<callback>",
    "line": 18,
    "end": 18,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.draw"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/waveform.ts",
    "name": "PanelWaveform.draw",
    "line": 20,
    "end": 37,
    "lines": 18,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Math.round",
      "ctx.beginPath",
      "ctx.clearRect",
      "ctx.lineTo",
      "ctx.moveTo",
      "ctx.setTransform",
      "ctx.stroke",
      "performance.now",
      "this.canvas.getBoundingClientRect",
      "this.canvas.getContext"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/waveform.ts",
    "name": "PanelWaveform.clear",
    "line": 38,
    "end": 41,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "cancelAnimationFrame"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/waveform.ts",
    "name": "PanelWaveform.close",
    "line": 42,
    "end": 42,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/widgetMcp.ts",
    "name": "widgetMcp",
    "line": 9,
    "end": 25,
    "lines": 17,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Object.freeze",
      "chat.cancel",
      "chat.message",
      "chat.script",
      "mcp.callTool",
      "mcp.close",
      "mcp.listTools"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/widgetMcp.ts",
    "name": "widgetMcp.run",
    "line": 11,
    "end": 11,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "chat.script"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/widgetMcp.ts",
    "name": "widgetMcp.run",
    "line": 14,
    "end": 14,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "chat.message"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/widgetMcp.ts",
    "name": "widgetMcp.run",
    "line": 17,
    "end": 17,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "chat.cancel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/widgetMcp.ts",
    "name": "widgetMcp.listTools",
    "line": 21,
    "end": 21,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "mcp.listTools"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/widgetMcp.ts",
    "name": "widgetMcp.callTool",
    "line": 22,
    "end": 22,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "mcp.callTool"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "extensions/chrome/src/widgetMcp.ts",
    "name": "widgetMcp.close",
    "line": 24,
    "end": 24,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "mcp.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/public/audio/pcm-worklet.js",
    "name": "PcmCapture.constructor",
    "line": 3,
    "end": 24,
    "lines": 22,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "Math.max",
      "super",
      "this.port.postMessage",
      "this.send"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/public/audio/pcm-worklet.js",
    "name": "PcmCapture.constructor.<callback>",
    "line": 10,
    "end": 23,
    "lines": 14,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "Math.max",
      "this.port.postMessage",
      "this.send"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/public/audio/pcm-worklet.js",
    "name": "PcmCapture.send",
    "line": 25,
    "end": 31,
    "lines": 7,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.port.postMessage",
      "view.setInt16"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/public/audio/pcm-worklet.js",
    "name": "PcmCapture.process",
    "line": 32,
    "end": 50,
    "lines": 19,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "Math.max",
      "Math.min",
      "Math.round",
      "this.port.postMessage",
      "this.send"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/help.ts",
    "name": "explain",
    "line": 36,
    "end": 36,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/help.ts",
    "name": "installTooltips",
    "line": 37,
    "end": 50,
    "lines": 14,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "(event.target as Element)?.closest",
      "Math.max",
      "Math.min",
      "box.remove",
      "current.contains",
      "current?.removeAttribute",
      "document.addEventListener",
      "document.body.append",
      "document.createElement",
      "document.removeEventListener",
      "hide",
      "target.getBoundingClientRect",
      "target.setAttribute",
      "window.addEventListener",
      "window.removeEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/help.ts",
    "name": "installTooltips.hide",
    "line": 40,
    "end": 40,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "current?.removeAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/help.ts",
    "name": "installTooltips.show",
    "line": 41,
    "end": 44,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "(event.target as Element)?.closest",
      "Math.max",
      "Math.min",
      "hide",
      "target.getBoundingClientRect",
      "target.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/help.ts",
    "name": "installTooltips.leave",
    "line": 45,
    "end": 45,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "current.contains",
      "hide"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/help.ts",
    "name": "installTooltips.key",
    "line": 46,
    "end": 46,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "hide"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/help.ts",
    "name": "installTooltips.<callback>",
    "line": 49,
    "end": 49,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "box.remove",
      "document.removeEventListener",
      "hide",
      "window.removeEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "el",
    "line": 9,
    "end": 9,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "document.getElementById"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "button",
    "line": 10,
    "end": 10,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "el"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "node",
    "line": 11,
    "end": 11,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "document.createElement"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "status",
    "line": 20,
    "end": 20,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "el"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "reason",
    "line": 21,
    "end": 29,
    "lines": 9,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 30,
    "end": 34,
    "lines": 5,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "el",
      "lanes[active]?.add",
      "schedule",
      "showSource"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 34,
    "end": 34,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "finishCapture",
      "operation.finally",
      "operations.add",
      "operations.delete",
      "status"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>.<callback>",
    "line": 34,
    "end": 34,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "operations.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "controls",
    "line": 35,
    "end": 42,
    "lines": 8,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "button",
      "el"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "schedule",
    "line": 43,
    "end": 47,
    "lines": 5,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Math.max",
      "clearTimeout",
      "performance.now",
      "render",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "schedule.<callback>",
    "line": 46,
    "end": 46,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "performance.now",
      "render"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "render",
    "line": 48,
    "end": 88,
    "lines": 41,
    "language": "typescript",
    "branches": 20,
    "calls": [
      "(event.ui_ms/1000).toFixed",
      "(range.end_16k/16000).toFixed",
      "(range.start_16k/16000).toFixed",
      "JSON.stringify",
      "Math.max",
      "String",
      "[...log.querySelectorAll('details[open]')].map",
      "[0,1].forEach",
      "controls",
      "document.createElement",
      "el",
      "evaluation.append",
      "evaluation.replaceChildren",
      "explain",
      "lane.events.filter",
      "lane.events.filter(e=>e.diagnostic||e.comparison||e.type==='audio_archive_event').slice",
      "lane.events.slice",
      "lane.events.slice(offset).forEach",
      "lane.phrases.values",
      "lane.shown",
      "line.append",
      "log.append",
      "log.querySelectorAll",
      "log.replaceChildren",
      "node",
      "opened.has",
      "p.append",
      "reason",
      "renderEvaluation",
      "renderReadiness",
      "renderTimeline",
      "renderTimings",
      "root.querySelector",
      "root.querySelector(selector)!.replaceChildren",
      "scores.querySelectorAll",
      "section.append",
      "showSource",
      "transcript.append",
      "transcript.replaceChildren"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "render.<callback>",
    "line": 49,
    "end": 85,
    "lines": 37,
    "language": "typescript",
    "branches": 19,
    "calls": [
      "(event.ui_ms/1000).toFixed",
      "(range.end_16k/16000).toFixed",
      "(range.start_16k/16000).toFixed",
      "JSON.stringify",
      "Math.max",
      "String",
      "[...log.querySelectorAll('details[open]')].map",
      "document.createElement",
      "el",
      "evaluation.append",
      "evaluation.replaceChildren",
      "explain",
      "lane.events.filter",
      "lane.events.filter(e=>e.diagnostic||e.comparison||e.type==='audio_archive_event').slice",
      "lane.events.slice",
      "lane.events.slice(offset).forEach",
      "lane.phrases.values",
      "lane.shown",
      "line.append",
      "log.append",
      "log.querySelectorAll",
      "log.replaceChildren",
      "node",
      "opened.has",
      "p.append",
      "reason",
      "renderEvaluation",
      "renderReadiness",
      "renderTimeline",
      "renderTimings",
      "root.querySelector",
      "root.querySelector(selector)!.replaceChildren",
      "scores.querySelectorAll",
      "section.append",
      "transcript.append",
      "transcript.replaceChildren"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "render.<callback>.<callback>",
    "line": 70,
    "end": 70,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "render.<callback>.<callback>",
    "line": 79,
    "end": 79,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "render.<callback>.<callback>",
    "line": 81,
    "end": 82,
    "lines": 2,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "(event.ui_ms/1000).toFixed",
      "JSON.stringify",
      "String",
      "document.createElement",
      "line.append",
      "log.append",
      "node",
      "opened.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "showAccuracy",
    "line": 89,
    "end": 96,
    "lines": 8,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "(result.cer*100).toFixed",
      "(result.wer*100).toFixed",
      "accuracy",
      "el",
      "explain",
      "lanes.forEach",
      "node",
      "p.append",
      "reference.trim",
      "root.append",
      "root.replaceChildren",
      "wordDiff"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "showAccuracy.<callback>",
    "line": 92,
    "end": 95,
    "lines": 4,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "(result.cer*100).toFixed",
      "(result.wer*100).toFixed",
      "accuracy",
      "explain",
      "node",
      "p.append",
      "root.append",
      "wordDiff"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "clearPlayback",
    "line": 97,
    "end": 97,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "URL.revokeObjectURL",
      "el",
      "player.load",
      "player.pause",
      "player.removeAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "showSource",
    "line": 98,
    "end": 105,
    "lines": 8,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "(sample.pcm.length/2/sample.rate).toFixed",
      "JSON.stringify",
      "URL.createObjectURL",
      "[...lane.phrases.values()].map",
      "[...lane.phrases.values()].map(p=>p.model_input?.sha256).filter",
      "clearPlayback",
      "controls",
      "el",
      "hashes",
      "lane.phrases.values",
      "wav"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "showSource.hashes",
    "line": 101,
    "end": 101,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "[...lane.phrases.values()].map",
      "[...lane.phrases.values()].map(p=>p.model_input?.sha256).filter",
      "lane.phrases.values"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "showSource.hashes.<callback>",
    "line": 101,
    "end": 101,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "beginLane",
    "line": 106,
    "end": 107,
    "lines": 2,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "el",
      "schedule"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "complete",
    "line": 108,
    "end": 108,
    "lines": 1,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "[...lane.phrases.values()].some",
      "lane.phrases.values",
      "performance.now",
      "reason",
      "schedule",
      "showAccuracy"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "complete.<callback>",
    "line": 108,
    "end": 108,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "remember",
    "line": 109,
    "end": 109,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "JSON.stringify",
      "el",
      "l?.summary",
      "lanes.map"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "remember.<callback>",
    "line": 109,
    "end": 109,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "l?.summary"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "recognize",
    "line": 110,
    "end": 116,
    "lines": 7,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "beginLane",
      "complete",
      "controls",
      "reason",
      "remember",
      "session.replay",
      "showAccuracy",
      "status"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "finishCapture",
    "line": 117,
    "end": 121,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "controls",
      "reason",
      "session.cancel",
      "session.cancel().catch",
      "session.stop",
      "showSource",
      "status"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "finishCapture.<callback>",
    "line": 119,
    "end": 119,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "reason",
      "status"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 122,
    "end": 130,
    "lines": 9,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "clearPlayback",
      "controls",
      "devices",
      "el",
      "reason",
      "remember",
      "schedule",
      "session.start",
      "showAccuracy",
      "status"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 131,
    "end": 131,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "finishCapture"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 132,
    "end": 132,
    "lines": 1,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Promise.allSettled",
      "complete",
      "controls",
      "reason",
      "session.cancel",
      "status"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 133,
    "end": 133,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "recognize"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 134,
    "end": 134,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "recognize"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 138,
    "end": 138,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Promise.resolve",
      "handler.call",
      "operation.finally",
      "operations.add",
      "operations.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>.<callback>",
    "line": 138,
    "end": 138,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "operations.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "download",
    "line": 140,
    "end": 140,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "URL.createObjectURL",
      "URL.revokeObjectURL",
      "a.click",
      "document.createElement",
      "setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "download.<callback>",
    "line": 140,
    "end": 140,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "URL.revokeObjectURL"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 141,
    "end": 141,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "download",
      "sample.sha256.slice",
      "wav"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 142,
    "end": 143,
    "lines": 2,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "JSON.stringify",
      "download",
      "el",
      "l.summary",
      "lanes.map",
      "new Date().toISOString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>.<callback>",
    "line": 143,
    "end": 143,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "l.summary"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "devices",
    "line": 144,
    "end": 144,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "(await navigator.mediaDevices.enumerateDevices()).filter",
      "el",
      "inputs.forEach",
      "navigator.mediaDevices.enumerateDevices",
      "reason",
      "select.add",
      "select.replaceChildren",
      "status"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "devices.<callback>",
    "line": 144,
    "end": 144,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "devices.<callback>",
    "line": 144,
    "end": 144,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "select.add"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 145,
    "end": 145,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "devices"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 146,
    "end": 148,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "status"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 149,
    "end": 149,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "clearTimeout",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 150,
    "end": 150,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "schedule"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 151,
    "end": 151,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "button",
      "button('cancel').click",
      "clearTimeout",
      "schedule"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 152,
    "end": 152,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "clearPlayback",
      "clearTimeout",
      "disposeTooltips",
      "session.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 153,
    "end": 153,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "controls",
      "devices",
      "status"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/main.ts",
    "name": "<callback>",
    "line": 153,
    "end": 153,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "reason",
      "status"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "normalize",
    "line": 3,
    "end": 3,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "text.normalize",
      "text.normalize('NFC').toLocaleLowerCase",
      "text.normalize('NFC').toLocaleLowerCase('ru').replace",
      "text.normalize('NFC').toLocaleLowerCase('ru').replace(/[\\p{P}\\p{S}]/gu,' ').replace",
      "text.normalize('NFC').toLocaleLowerCase('ru').replace(/[\\p{P}\\p{S}]/gu,' ').replace(/\\s+/g,' ').trim"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "distance",
    "line": 4,
    "end": 8,
    "lines": 5,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Array.from",
      "Math.min",
      "next.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "distance.<callback>",
    "line": 5,
    "end": 5,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "accuracy",
    "line": 9,
    "end": 13,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Array.from",
      "actual.replace",
      "actual.split",
      "distance",
      "expected.replace",
      "expected.split",
      "normalize"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "wordDiff",
    "line": 14,
    "end": 24,
    "lines": 11,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "Array.from",
      "Math.max",
      "changes.push",
      "changes.reverse",
      "normalize",
      "normalize(reference).split",
      "normalize(reference).split(' ').filter",
      "normalize(text).split",
      "normalize(text).split(' ').filter"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "wordDiff.<callback>",
    "line": 17,
    "end": 17,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.constructor",
    "line": 31,
    "end": 31,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.add",
    "line": 32,
    "end": 57,
    "lines": 26,
    "language": "typescript",
    "branches": 17,
    "calls": [
      "JSON.stringify",
      "new TextEncoder().encode",
      "performance.now",
      "this.events.push",
      "this.phrases.get",
      "this.phrases.set",
      "value.text?.trim"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.text",
    "line": 58,
    "end": 58,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "[...this.phrases.values()].filter",
      "[...this.phrases.values()].filter(p=>p.result_type==='final').map",
      "[...this.phrases.values()].filter(p=>p.result_type==='final').map(p=>p.text).join",
      "[...this.phrases.values()].filter(p=>p.result_type==='final').map(p=>p.text).join(' ').slice",
      "this.phrases.values"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.text.<callback>",
    "line": 58,
    "end": 58,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.text.<callback>",
    "line": 58,
    "end": 58,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.input",
    "line": 59,
    "end": 59,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.events.find"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.input.<callback>",
    "line": 59,
    "end": 59,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.encoding",
    "line": 60,
    "end": 60,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.events.find"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.encoding.<callback>",
    "line": 60,
    "end": 60,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.ingress",
    "line": 61,
    "end": 61,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.events.find"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.ingress.<callback>",
    "line": 61,
    "end": 61,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.nativeMs",
    "line": 62,
    "end": 62,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "recognitionMilliseconds"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.calls",
    "line": 63,
    "end": 63,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "[...this.phrases.values()].filter",
      "terminals.every",
      "terminals.reduce",
      "this.phrases.values"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.calls.<callback>",
    "line": 63,
    "end": 63,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.calls.<callback>",
    "line": 63,
    "end": 63,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.calls.<callback>",
    "line": 63,
    "end": 63,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.readiness",
    "line": 64,
    "end": 64,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.events.filter",
      "this.events.filter(e=>e.type==='audio_compare'&&e.stage==='phrase_ready').slice"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.readiness.<callback>",
    "line": 64,
    "end": 64,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.firstWindowMs",
    "line": 65,
    "end": 65,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Number.isFinite",
      "this.events.find"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.firstWindowMs.<callback>",
    "line": 65,
    "end": 65,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Number.isFinite"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.shown",
    "line": 66,
    "end": 71,
    "lines": 6,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "performance.now",
      "this.phrases.values"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.phraseTimings",
    "line": 72,
    "end": 77,
    "lines": 6,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.events.filter",
      "this.events.filter(e=>e.type==='compare_client'&&e.stage==='phrase_submitted').map",
      "this.events.find",
      "this.phrases.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.phraseTimings.<callback>",
    "line": 72,
    "end": 72,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.phraseTimings.<callback>",
    "line": 72,
    "end": 77,
    "lines": 6,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.events.find",
      "this.phrases.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.phraseTimings.<callback>.<callback>",
    "line": 74,
    "end": 74,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "LaneResult.summary",
    "line": 78,
    "end": 83,
    "lines": 6,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "new Date(this.beganWall).toISOString",
      "new Date(this.beganWall+this.finished-this.began).toISOString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "wav",
    "line": 85,
    "end": 89,
    "lines": 5,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "[...s].forEach",
      "c.charCodeAt",
      "pcm.slice",
      "put",
      "v.setUint16",
      "v.setUint32",
      "v.setUint8"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "wav.put",
    "line": 86,
    "end": 86,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "[...s].forEach",
      "c.charCodeAt",
      "v.setUint8"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/results.ts",
    "name": "wav.put.<callback>",
    "line": 86,
    "end": 86,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "c.charCodeAt",
      "v.setUint8"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "wait",
    "line": 14,
    "end": 14,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "wait.<callback>",
    "line": 14,
    "end": 14,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "check",
    "line": 15,
    "end": 15,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.constructor",
    "line": 43,
    "end": 43,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.<callback>",
    "line": 44,
    "end": 48,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.event"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.open",
    "line": 49,
    "end": 49,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "crypto.randomUUID",
      "this.origin.replace",
      "this.origin.replace('https:','wss:').replace",
      "this.ui.connect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.assertCurrent",
    "line": 50,
    "end": 50,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.receive",
    "line": 51,
    "end": 63,
    "lines": 13,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "['final','rejected','error'].includes",
      "this.event",
      "this.seen.add",
      "this.seen.has",
      "this.state"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.lane",
    "line": 64,
    "end": 86,
    "lines": 23,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "JSON.parse",
      "check",
      "client.configureAudio",
      "client.connect",
      "client.listen",
      "client.onStatus",
      "client.request",
      "performance.now",
      "this.assertCurrent",
      "this.cancel",
      "this.event",
      "this.origin.replace",
      "this.origin.replace('https:','wss:').replace",
      "this.receive",
      "this.seen.clear",
      "this.state",
      "this.ui.request",
      "this.ui.request('audio_replay',{action:'status',replay_id:this.replayId,offset:10000},4000)\n        .then",
      "this.ui.request('audio_replay',{action:'status',replay_id:this.replayId,offset:10000},4000)\n        .then(reply=>{check(reply);}).catch",
      "this.ui.request('audio_replay',{action:'status',replay_id:this.replayId,offset:10000},4000)\n        .then(reply=>{check(reply);}).catch(()=>{this.state('Доступ к диагностике потерян');void this.cancel();}).finally",
      "window.setInterval"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.lane.<callback>",
    "line": 75,
    "end": 75,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.cancel",
      "this.state"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.lane.<callback>",
    "line": 77,
    "end": 77,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "JSON.parse",
      "this.receive",
      "this.state"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.lane.<callback>",
    "line": 83,
    "end": 85,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "check",
      "this.cancel",
      "this.state",
      "this.ui.request",
      "this.ui.request('audio_replay',{action:'status',replay_id:this.replayId,offset:10000},4000)\n        .then",
      "this.ui.request('audio_replay',{action:'status',replay_id:this.replayId,offset:10000},4000)\n        .then(reply=>{check(reply);}).catch",
      "this.ui.request('audio_replay',{action:'status',replay_id:this.replayId,offset:10000},4000)\n        .then(reply=>{check(reply);}).catch(()=>{this.state('Доступ к диагностике потерян');void this.cancel();}).finally"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.lane.<callback>.<callback>",
    "line": 85,
    "end": 85,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "check"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.lane.<callback>.<callback>",
    "line": 85,
    "end": 85,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.cancel",
      "this.state"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.lane.<callback>.<callback>",
    "line": 85,
    "end": 85,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.start",
    "line": 87,
    "end": 120,
    "lines": 34,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "Math.max",
      "Math.min",
      "String",
      "capture.context.audioWorklet.addModule",
      "capture.inputTrack?.getSettings",
      "capture.output.connect",
      "capture.setEnabled",
      "capture.start",
      "message.data.slice",
      "processor.connect",
      "processor.port.postMessage",
      "startMic",
      "this.assertCurrent",
      "this.cancel",
      "this.chunks.push",
      "this.event",
      "this.limit",
      "this.state",
      "this.stopped"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.start.<callback>",
    "line": 91,
    "end": 91,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.start.<callback>",
    "line": 92,
    "end": 92,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String",
      "this.state"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.start.<callback>",
    "line": 92,
    "end": 92,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "startMic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.start.<callback>",
    "line": 102,
    "end": 115,
    "lines": 14,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Math.max",
      "Math.min",
      "message.data.slice",
      "processor.port.postMessage",
      "this.cancel",
      "this.chunks.push",
      "this.event",
      "this.limit",
      "this.state",
      "this.stopped"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.stop",
    "line": 121,
    "end": 138,
    "lines": 18,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "(async()=>{\n      if(!this.capture||!this.processor)throw new Error('Захват не запущен');\n      const generation=this.generation;\n      this.state('Сохранение записи');\n      await new Promise<void>((resolve,reject)=>{const timer=setTimeout(()=>reject(new Error('capture_stop_timeout')),2000);\n        this.stopped=()=>{clearTimeout(timer);resolve();};this.processor!.port.postMessage('stop');});\n      this.assertCurrent(generation);\n      this.closeCapture();\n      const pcm=new Uint8Array(this.samples*2);let at=0;for(const chunk of this.chunks){pcm.set(chunk,at);at+=chunk.length;}this.chunks=[];\n      const sha256=Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',pcm))).map(b=>b.toString(16).padStart(2,'0')).join('');\n      this.assertCurrent(generation);\n      const sample={pcm,rate:this.rate,sha256,packets:this.sequence,limited:this.limited,requested:this.requested,actual:this.actual};\n      this.event({type:'sample_ready',sample});\n      return sample;\n    })",
      "Array.from",
      "Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',pcm))).map",
      "Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',pcm))).map(b=>b.toString(16).padStart(2,'0')).join",
      "b.toString",
      "b.toString(16).padStart",
      "clearTimeout",
      "crypto.subtle.digest",
      "pcm.set",
      "reject",
      "resolve",
      "setTimeout",
      "this.assertCurrent",
      "this.closeCapture",
      "this.event",
      "this.processor!.port.postMessage",
      "this.state"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.stop.<callback>",
    "line": 123,
    "end": 137,
    "lines": 15,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Array.from",
      "Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',pcm))).map",
      "Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',pcm))).map(b=>b.toString(16).padStart(2,'0')).join",
      "b.toString",
      "b.toString(16).padStart",
      "clearTimeout",
      "crypto.subtle.digest",
      "pcm.set",
      "reject",
      "resolve",
      "setTimeout",
      "this.assertCurrent",
      "this.closeCapture",
      "this.event",
      "this.processor!.port.postMessage",
      "this.state"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.stop.<callback>.<callback>",
    "line": 127,
    "end": 128,
    "lines": 2,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "clearTimeout",
      "reject",
      "resolve",
      "setTimeout",
      "this.processor!.port.postMessage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.stop.<callback>.<callback>.<callback>",
    "line": 127,
    "end": 127,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "reject"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.stop.<callback>.<callback>.<callback>",
    "line": 128,
    "end": 128,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "clearTimeout",
      "resolve"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.stop.<callback>.<callback>",
    "line": 132,
    "end": 132,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "b.toString",
      "b.toString(16).padStart"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.replay",
    "line": 139,
    "end": 225,
    "lines": 87,
    "language": "typescript",
    "branches": 25,
    "calls": [
      "Math.min",
      "OpusCapture.create",
      "String",
      "boundaries.push",
      "check",
      "crypto.randomUUID",
      "encoder.close",
      "encoder.drain",
      "encoder.finish",
      "encoder.push",
      "opusEnd",
      "opusSample",
      "packets.push",
      "performance.now",
      "sample.pcm.slice",
      "segmentation.boundaries.filter",
      "send",
      "this.assertCurrent",
      "this.audio!.drainAudioBuffer",
      "this.audio!.publishAudio",
      "this.audio!.request",
      "this.audio!.request('phrase',\n            {...common,type:'phrase_start',last_seq:this.sequence},5000).then",
      "this.audio!.request('phrase',\n            {...common,type:'phrase_start',last_seq:this.sequence},5000).then(check).then",
      "this.audio!.request('phrase',{...common,type:'phrase_start',last_seq:this.sequence},5000).then",
      "this.audio!.request('phrase',{...common,type:'phrase_start',last_seq:this.sequence},5000).then(check).then",
      "this.cancel",
      "this.event",
      "this.finish",
      "this.lane",
      "this.state",
      "vad.close",
      "vad.end",
      "vad.feed"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.replay.<callback>",
    "line": 157,
    "end": 157,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "boundaries.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.replay.<callback>",
    "line": 157,
    "end": 157,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.replay.<callback>",
    "line": 170,
    "end": 170,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.replay.<callback>",
    "line": 176,
    "end": 176,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "packets.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.replay.<callback>",
    "line": 176,
    "end": 176,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.replay.send",
    "line": 189,
    "end": 196,
    "lines": 8,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "opusEnd",
      "performance.now",
      "this.assertCurrent",
      "this.audio!.drainAudioBuffer",
      "this.audio!.publishAudio"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.replay.<callback>",
    "line": 207,
    "end": 207,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.replay.<callback>",
    "line": 207,
    "end": 209,
    "lines": 3,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.replay.<callback>",
    "line": 211,
    "end": 211,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.finish",
    "line": 226,
    "end": 242,
    "lines": 17,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "check",
      "performance.now",
      "this.audio.request",
      "this.event",
      "this.receive",
      "this.release",
      "this.ui.request"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.closeCapture",
    "line": 243,
    "end": 243,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.capture?.close",
      "this.processor?.disconnect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.release",
    "line": 244,
    "end": 256,
    "lines": 13,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "clearInterval",
      "performance.now",
      "this.audio?.disconnect",
      "this.doneUnsubscribe",
      "this.state",
      "this.ui.request",
      "this.unsubscribe",
      "wait"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.cancel",
    "line": 257,
    "end": 260,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "clearInterval",
      "this.analyzing?.close",
      "this.audio?.disconnect",
      "this.closeCapture",
      "this.encoder?.close",
      "this.release"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/session.ts",
    "name": "CompareSession.close",
    "line": 261,
    "end": 261,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.cancel",
      "this.ui.disconnect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/timeline.ts",
    "name": "text",
    "line": 4,
    "end": 4,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "document.createElement"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/timeline.ts",
    "name": "valid",
    "line": 5,
    "end": 5,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Number.isFinite"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/timeline.ts",
    "name": "seconds",
    "line": 6,
    "end": 6,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "(ms/1000).toFixed"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/timeline.ts",
    "name": "clock",
    "line": 7,
    "end": 7,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "new Date(ms).toLocaleTimeString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/timeline.ts",
    "name": "difference",
    "line": 8,
    "end": 8,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/timeline.ts",
    "name": "rows",
    "line": 9,
    "end": 11,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "explain",
      "root.append",
      "text"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/timeline.ts",
    "name": "renderTimeline",
    "line": 12,
    "end": 38,
    "lines": 27,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "clock",
      "details.append",
      "document.createElement",
      "explain",
      "list.append",
      "marks.append",
      "root.append",
      "root.querySelector",
      "root.replaceChildren",
      "seconds",
      "steps.sort",
      "text"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/timeline.ts",
    "name": "renderTimeline.<callback>",
    "line": 35,
    "end": 35,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/timeline.ts",
    "name": "renderTimings",
    "line": 40,
    "end": 89,
    "lines": 50,
    "language": "typescript",
    "branches": 15,
    "calls": [
      "String",
      "details.append",
      "details.replaceChildren",
      "difference",
      "document.createElement",
      "elapsed",
      "explain",
      "group",
      "lane.phrases.get",
      "ms",
      "phrases.entries",
      "rows",
      "seconds",
      "summary.replaceChildren",
      "text",
      "valid",
      "value.toFixed"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/timeline.ts",
    "name": "renderTimings.ms",
    "line": 43,
    "end": 43,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "valid",
      "value.toFixed"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/timeline.ts",
    "name": "renderTimings.elapsed",
    "line": 44,
    "end": 44,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "seconds",
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/timeline.ts",
    "name": "renderTimings.group",
    "line": 52,
    "end": 54,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "details.append",
      "document.createElement",
      "rows",
      "text"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/timeline.ts",
    "name": "renderReadiness",
    "line": 91,
    "end": 107,
    "lines": 17,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "(end/rate).toFixed",
      "(start/rate).toFixed",
      "document.createElement",
      "event.vad_ms.toFixed",
      "explain",
      "item.append",
      "lane.readiness.entries",
      "root.append",
      "root.replaceChildren",
      "rows",
      "seconds",
      "text",
      "valid",
      "values.map"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/asrCompare/timeline.ts",
    "name": "renderReadiness.<callback>",
    "line": 103,
    "end": 103,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "seconds",
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/archiveManifest.ts",
    "name": "ArchiveManifest.constructor",
    "line": 8,
    "end": 8,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/archiveManifest.ts",
    "name": "ArchiveManifest.pcm",
    "line": 9,
    "end": 15,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "new Date().toISOString",
      "pcm.slice",
      "performance.now",
      "this.chunks.push",
      "this.flush",
      "this.packets.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/archiveManifest.ts",
    "name": "ArchiveManifest.enqueue",
    "line": 16,
    "end": 24,
    "lines": 9,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "JSON.stringify",
      "new TextEncoder().encode",
      "this.chain.then",
      "this.chain.then(async()=>{\n      if(this.error)return;\n      await this.send({action,stream_id:this.stream,sequence,data});\n    }).catch",
      "this.chain.then(async()=>{\n      if(this.error)return;\n      await this.send({action,stream_id:this.stream,sequence,data});\n    }).catch(()=>this.failed()).finally",
      "this.failed",
      "this.send"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/archiveManifest.ts",
    "name": "ArchiveManifest.enqueue.<callback>",
    "line": 20,
    "end": 23,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.send"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/archiveManifest.ts",
    "name": "ArchiveManifest.enqueue.<callback>",
    "line": 23,
    "end": 23,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.failed"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/archiveManifest.ts",
    "name": "ArchiveManifest.enqueue.<callback>",
    "line": 23,
    "end": 23,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/archiveManifest.ts",
    "name": "ArchiveManifest.failed",
    "line": 25,
    "end": 25,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "performance.now",
      "this.send",
      "this.send({action:'finish',stream_id:this.stream,sequence:this.count,data:{packets:this.count,bytes:this.total,started_mono_ms:this.started,finished_mono_ms:performance.now(),error:this.error}}).catch",
      "this.warning"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/archiveManifest.ts",
    "name": "ArchiveManifest.failed.<callback>",
    "line": 25,
    "end": 25,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/archiveManifest.ts",
    "name": "ArchiveManifest.flush",
    "line": 26,
    "end": 40,
    "lines": 15,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Array.from",
      "Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',raw))).map",
      "Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',raw))).map(x=>x.toString(16).padStart(2,'0')).join",
      "crypto.subtle.digest",
      "raw.set",
      "this.chain.then",
      "this.chain.then(async()=>{\n      if(this.error)return;\n      const sha256=Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',raw))).map(x=>x.toString(16).padStart(2,'0')).join('');\n      await this.send({action:'manifest',stream_id:this.stream,sequence:packets[packets.length-1].sequence,\n        data:{chunk_index:index,bytes:size,first_seq:packets[0].sequence,last_seq:packets[packets.length-1].sequence,sha256,packets}});\n    }).catch",
      "this.chain.then(async()=>{\n      if(this.error)return;\n      const sha256=Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',raw))).map(x=>x.toString(16).padStart(2,'0')).join('');\n      await this.send({action:'manifest',stream_id:this.stream,sequence:packets[packets.length-1].sequence,\n        data:{chunk_index:index,bytes:size,first_seq:packets[0].sequence,last_seq:packets[packets.length-1].sequence,sha256,packets}});\n    }).catch(()=>this.failed()).finally",
      "this.failed",
      "this.send",
      "x.toString",
      "x.toString(16).padStart"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/archiveManifest.ts",
    "name": "ArchiveManifest.flush.<callback>",
    "line": 34,
    "end": 39,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Array.from",
      "Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',raw))).map",
      "Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',raw))).map(x=>x.toString(16).padStart(2,'0')).join",
      "crypto.subtle.digest",
      "this.send",
      "x.toString",
      "x.toString(16).padStart"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/archiveManifest.ts",
    "name": "ArchiveManifest.flush.<callback>.<callback>",
    "line": 36,
    "end": 36,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "x.toString",
      "x.toString(16).padStart"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/archiveManifest.ts",
    "name": "ArchiveManifest.flush.<callback>",
    "line": 39,
    "end": 39,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.failed"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/archiveManifest.ts",
    "name": "ArchiveManifest.flush.<callback>",
    "line": 39,
    "end": 39,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/archiveManifest.ts",
    "name": "ArchiveManifest.disable",
    "line": 41,
    "end": 41,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.failed"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/archiveManifest.ts",
    "name": "ArchiveManifest.mark",
    "line": 42,
    "end": 42,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.enqueue"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/archiveManifest.ts",
    "name": "ArchiveManifest.finish",
    "line": 43,
    "end": 47,
    "lines": 5,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "performance.now",
      "this.failed",
      "this.flush",
      "this.send"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/asrBackend.ts",
    "name": "asrOutcomeTitle",
    "line": 26,
    "end": 26,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/asrBackend.ts",
    "name": "asrOutcomeText",
    "line": 27,
    "end": 27,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/audioState.ts",
    "name": "createAudioState",
    "line": 10,
    "end": 23,
    "lines": 14,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "el.ecEnable?.addEventListener",
      "el.nsEnable?.addEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/audioState.ts",
    "name": "createAudioState.<callback>",
    "line": 19,
    "end": 19,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/audioState.ts",
    "name": "createAudioState.<callback>",
    "line": 20,
    "end": 20,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/captureController.ts",
    "name": "microphoneErrorMessage",
    "line": 9,
    "end": 23,
    "lines": 15,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "Object.prototype.hasOwnProperty.call",
      "mediaFailure"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/captureController.ts",
    "name": "CaptureController.constructor",
    "line": 38,
    "end": 46,
    "lines": 9,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "startMic",
      "this.silence.connect",
      "this.silence.start"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/captureController.ts",
    "name": "CaptureController.constructor.<callback>",
    "line": 41,
    "end": 41,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "startMic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/captureController.ts",
    "name": "CaptureController.constructor.<callback>",
    "line": 42,
    "end": 42,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/captureController.ts",
    "name": "CaptureController.start",
    "line": 48,
    "end": 48,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.context.resume"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/captureController.ts",
    "name": "CaptureController.inputTrack",
    "line": 49,
    "end": 49,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.stream?.getAudioTracks"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/captureController.ts",
    "name": "CaptureController.restartInput",
    "line": 52,
    "end": 61,
    "lines": 10,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "this.mute",
      "this.setEnabled"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/captureController.ts",
    "name": "CaptureController.setEnabled",
    "line": 63,
    "end": 87,
    "lines": 25,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "acquired.getAudioTracks",
      "startWaveforms",
      "stopMic",
      "this.acquire",
      "this.changed",
      "this.context.createMediaStreamSource",
      "this.context.resume",
      "this.mute",
      "this.source.connect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/captureController.ts",
    "name": "CaptureController.setEnabled.<callback>",
    "line": 76,
    "end": 76,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.changed",
      "this.mute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/captureController.ts",
    "name": "CaptureController.mute",
    "line": 89,
    "end": 101,
    "lines": 13,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "stopMic",
      "this.changed",
      "this.onSpeech",
      "this.releaseInput",
      "this.source?.disconnect",
      "this.stream?.getTracks",
      "this.stream?.getTracks().forEach",
      "this.wavesStop"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/captureController.ts",
    "name": "CaptureController.mute.<callback>",
    "line": 95,
    "end": 95,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/captureController.ts",
    "name": "CaptureController.close",
    "line": 103,
    "end": 108,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.context.close",
      "this.context.close().catch",
      "this.mute",
      "this.output.disconnect",
      "this.silence.disconnect",
      "this.silence.stop"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/captureController.ts",
    "name": "CaptureController.close.<callback>",
    "line": 107,
    "end": 107,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/clientTimings.ts",
    "name": "reportClientTimings",
    "line": 2,
    "end": 5,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "commandRequest",
      "commandRequest('client_timings',{transport,timings},3000).catch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/clientTimings.ts",
    "name": "reportClientTimings.<callback>",
    "line": 4,
    "end": 4,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/diagnostics.ts",
    "name": "connectionLabel",
    "line": 8,
    "end": 8,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/diagnostics.ts",
    "name": "safeDiagnosticText",
    "line": 11,
    "end": 19,
    "lines": 9,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "(value instanceof Error ? `${value.name}: ${value.message}` : String(value ?? \"\"))\n    .replace",
      "(value instanceof Error ? `${value.name}: ${value.message}` : String(value ?? \"\"))\n    .replace(/((?:https?|wss?|nats):\\/\\/)[^\\s/@]+@/gi, \"$1[redacted]@\")\n    .replace",
      "(value instanceof Error ? `${value.name}: ${value.message}` : String(value ?? \"\"))\n    .replace(/((?:https?|wss?|nats):\\/\\/)[^\\s/@]+@/gi, \"$1[redacted]@\")\n    .replace(/([?&](?:token|access_token|password|key|secret|auth)=)[^&\\s]+/gi, \"$1[redacted]\")\n    .replace",
      "(value instanceof Error ? `${value.name}: ${value.message}` : String(value ?? \"\"))\n    .replace(/((?:https?|wss?|nats):\\/\\/)[^\\s/@]+@/gi, \"$1[redacted]@\")\n    .replace(/([?&](?:token|access_token|password|key|secret|auth)=)[^&\\s]+/gi, \"$1[redacted]\")\n    .replace(/\\b(?:Bearer\\s+\\S+|eyJ[\\w-]+\\.[\\w-]+\\.[\\w-]+|(?:sk-|glpat-|gldt-)[\\w-]+)/g, \"[redacted]\")\n    .replace",
      "(value instanceof Error ? `${value.name}: ${value.message}` : String(value ?? \"\"))\n    .replace(/((?:https?|wss?|nats):\\/\\/)[^\\s/@]+@/gi, \"$1[redacted]@\")\n    .replace(/([?&](?:token|access_token|password|key|secret|auth)=)[^&\\s]+/gi, \"$1[redacted]\")\n    .replace(/\\b(?:Bearer\\s+\\S+|eyJ[\\w-]+\\.[\\w-]+\\.[\\w-]+|(?:sk-|glpat-|gldt-)[\\w-]+)/g, \"[redacted]\")\n    .replace(/((?:authorization|cookie)\\s*:)[^\\r\\n]+/gi, \"$1[redacted]\")\n    .replace",
      "(value instanceof Error ? `${value.name}: ${value.message}` : String(value ?? \"\"))\n    .replace(/((?:https?|wss?|nats):\\/\\/)[^\\s/@]+@/gi, \"$1[redacted]@\")\n    .replace(/([?&](?:token|access_token|password|key|secret|auth)=)[^&\\s]+/gi, \"$1[redacted]\")\n    .replace(/\\b(?:Bearer\\s+\\S+|eyJ[\\w-]+\\.[\\w-]+\\.[\\w-]+|(?:sk-|glpat-|gldt-)[\\w-]+)/g, \"[redacted]\")\n    .replace(/((?:authorization|cookie)\\s*:)[^\\r\\n]+/gi, \"$1[redacted]\")\n    .replace(/([\"']?(?:access_token|refresh_token|authorization|cookie|password|token|secret)[\"']?\\s*[=:]\\s*[\"']?)[^\\r\\n,;\"']+/gi, \"$1[redacted]\")\n    .slice",
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/diagnostics.ts",
    "name": "safeEndpoint",
    "line": 20,
    "end": 26,
    "lines": 7,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "safeDiagnosticText",
      "value.split"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/mic.ts",
    "name": "mediaFailure",
    "line": 6,
    "end": 10,
    "lines": 5,
    "language": "typescript",
    "branches": 3,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/mic.ts",
    "name": "startMic",
    "line": 12,
    "end": 24,
    "lines": 13,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "constraint",
      "devices.getUserMedia"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/mic.ts",
    "name": "startMic.constraint",
    "line": 14,
    "end": 14,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/mic.ts",
    "name": "stopMic",
    "line": 26,
    "end": 28,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "stream?.getTracks",
      "stream?.getTracks().forEach",
      "t.stop"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/mic.ts",
    "name": "stopMic.<callback>",
    "line": 27,
    "end": 27,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "t.stop"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio",
    "line": 22,
    "end": 303,
    "lines": 282,
    "language": "typescript",
    "branches": 120,
    "calls": [
      "(['noiseSuppression','echoCancellation','autoGainControl'] as const).every",
      "(async()=>{\n      await new Promise<void>((resolve,reject)=>{\n        const timer=window.setTimeout(()=>reject(new Error('audio_capture_end_timeout')),2000);\n        s.resolveCaptureEnd=()=>{window.clearTimeout(timer);resolve();};\n        s.processor?.port.postMessage('capture-end');\n      });\n      await finishVad(s);\n    })",
      "(async()=>{\n      await new Promise<void>((resolve,reject)=>{\n        const timer=window.setTimeout(()=>reject(new Error('audio_capture_end_timeout')),2000);\n        s.resolveCaptureEnd=()=>{window.clearTimeout(timer);resolve();};\n        s.processor?.port.postMessage('capture-end');\n      });\n      await finishVad(s);\n    })().catch",
      "(async()=>{\n      await new Promise<void>((resolve,reject)=>{\n        const timer=window.setTimeout(()=>reject(new Error('audio_capture_end_timeout')),2000);\n        s.resolveCaptureEnd=()=>{window.clearTimeout(timer);resolve();};\n        s.processor?.port.postMessage('capture-end');\n      });\n      await finishVad(s);\n    })().catch(error=>{fail(s,error instanceof Error?error.message:'vad_end_failed');throw error;}).finally",
      "(async()=>{\n    try {\n      if(s.opus||s.vad||s.phrasePending)await finishVad(s);\n      s.archivalDrain=s.archive?.finish();\n      // END itself waits for last_seq at ingress, including PCM still in transit.\n      const reply=await s.client.request('end',{last_seq:s.sequence},30000);\n      if(reply.status!==200||reply.data.ok!==true||reply.data.type!=='stopped')throw new Error(String(reply.data.error??'audio_end_unavailable'));\n      if(s.streamId)markAsrStreamEnded(s.streamId);\n      dispose(s);\n      s.emit({source:'nats-audio',state:'idle',message:'Последняя фраза обработана; аудио отключено'});\n    } catch(error){fail(s,error instanceof Error?error.message:'audio_end_unavailable');}\n  })",
      "(input?.acquire??startMic)",
      "/^[a-z_]{1,64}$/.test",
      "Date.now",
      "JSON.parse",
      "Math.min",
      "Object.assign",
      "Object.entries",
      "Object.entries(desired).every",
      "Object.fromEntries",
      "Object.keys",
      "Object.keys(values).some",
      "Object.prototype.hasOwnProperty.call",
      "OpusCapture.create",
      "Promise.resolve",
      "String",
      "['noiseSuppression','echoCancellation','autoGainControl'].includes",
      "['Доступ к чату истёк. Войдите через штатную форму.','Доступ истёк. Новые команды остановлены.','browser_access_expired'].includes",
      "boundary",
      "capture.mute",
      "capture.restartInput",
      "clearAsrStream",
      "codec?.wait",
      "context.audioWorklet.addModule",
      "createStreamOwner",
      "current.archive?.mark",
      "current.client.request",
      "dispose",
      "event.data.slice",
      "fail",
      "finish",
      "finishVad",
      "getMicState",
      "hasSession",
      "input?.release",
      "isDraining",
      "keys.map",
      "markAsrStreamEnded",
      "matches",
      "mediaFailure",
      "microphoneErrorMessage",
      "navigator.mediaDevices.getSupportedConstraints",
      "navigator.mediaDevices?.getSupportedConstraints",
      "next.getSettings",
      "opts.onAudioEvent",
      "opts.onTimings",
      "opts.prepareContext",
      "opts?.microphoneDevice",
      "opts?.onPcm",
      "opts?.onWaveform",
      "owner.getAsrStreamId",
      "pending.catch",
      "pending.catch(()=>({})).then",
      "performance.now",
      "reject",
      "releaseCapture",
      "reportClientTimings",
      "resolve",
      "retainEndingStream",
      "s.archivalDrain.finally",
      "s.archive?.disable",
      "s.archive?.finish",
      "s.archive?.mark",
      "s.archive?.pcm",
      "s.capture.output.connect",
      "s.capture.setEnabled",
      "s.capture.start",
      "s.capture?.close",
      "s.capture?.mute",
      "s.client.configureAudio",
      "s.client.connect",
      "s.client.disconnect",
      "s.client.listen",
      "s.client.onStatus",
      "s.client.publishAudio",
      "s.client.request",
      "s.client.request('abort',data,2000).catch",
      "s.client.request('abort',data,2000).catch(()=>undefined).finally",
      "s.emit",
      "s.opus.close",
      "s.opus.push",
      "s.opus?.close",
      "s.opus?.finish",
      "s.phraseDrain.then",
      "s.phraseDrain.then(async()=>{\n    if(s.disposed)return;\n    await codec?.wait(event.end_sample??event.start_sample);\n    const data={...event,last_seq:s.sequence,vad:s.vadMetadata};\n    const reply=await s.client.request('phrase',data,5000);\n    if(reply.status!==200||reply.data.ok!==true)throw new Error(String(reply.data.error??'audio_phrase_unavailable'));\n  }).catch",
      "s.phraseDrain.then(async()=>{\n    if(s.disposed)return;\n    await codec?.wait(event.end_sample??event.start_sample);\n    const data={...event,last_seq:s.sequence,vad:s.vadMetadata};\n    const reply=await s.client.request('phrase',data,5000);\n    if(reply.status!==200||reply.data.ok!==true)throw new Error(String(reply.data.error??'audio_phrase_unavailable'));\n  }).catch(error=>fail(s,error instanceof Error?error.message:'audio_phrase_unavailable')).finally",
      "s.processor.connect",
      "s.processor?.disconnect",
      "s.processor?.port.postMessage",
      "s.resolveCaptureEnd",
      "s.unsubscribe",
      "s.vad?.close",
      "s.vad?.push",
      "safe",
      "session?.capture?.inputTrack?.getSettings",
      "setAsrStreamId",
      "setTimeout",
      "track.getSettings",
      "track?.getSettings",
      "vad.close",
      "vad.end",
      "waveform.frame",
      "waveform?.reset",
      "window.clearTimeout",
      "window.setTimeout",
      "wireProcessor"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.releaseCapture",
    "line": 26,
    "end": 26,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "s.capture?.close",
      "s.opus?.close",
      "s.processor?.disconnect",
      "s.vad?.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.dispose",
    "line": 27,
    "end": 36,
    "lines": 10,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "/^[a-z_]{1,64}$/.test",
      "releaseCapture",
      "s.archivalDrain.finally",
      "s.client.disconnect",
      "s.client.request",
      "s.client.request('abort',data,2000).catch",
      "s.client.request('abort',data,2000).catch(()=>undefined).finally",
      "s.unsubscribe",
      "window.clearTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.dispose.<callback>",
    "line": 33,
    "end": 33,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.dispose.<callback>",
    "line": 33,
    "end": 33,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "s.client.disconnect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.dispose.<callback>",
    "line": 34,
    "end": 34,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "s.client.disconnect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.fail",
    "line": 37,
    "end": 52,
    "lines": 16,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Object.prototype.hasOwnProperty.call",
      "clearAsrStream",
      "dispose",
      "s.emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.finish",
    "line": 53,
    "end": 67,
    "lines": 15,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "(async()=>{\n    try {\n      if(s.opus||s.vad||s.phrasePending)await finishVad(s);\n      s.archivalDrain=s.archive?.finish();\n      // END itself waits for last_seq at ingress, including PCM still in transit.\n      const reply=await s.client.request('end',{last_seq:s.sequence},30000);\n      if(reply.status!==200||reply.data.ok!==true||reply.data.type!=='stopped')throw new Error(String(reply.data.error??'audio_end_unavailable'));\n      if(s.streamId)markAsrStreamEnded(s.streamId);\n      dispose(s);\n      s.emit({source:'nats-audio',state:'idle',message:'Последняя фраза обработана; аудио отключено'});\n    } catch(error){fail(s,error instanceof Error?error.message:'audio_end_unavailable');}\n  })",
      "String",
      "dispose",
      "fail",
      "finishVad",
      "markAsrStreamEnded",
      "s.archive?.finish",
      "s.client.request",
      "s.emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.finish.<callback>",
    "line": 55,
    "end": 66,
    "lines": 12,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "String",
      "dispose",
      "fail",
      "finishVad",
      "markAsrStreamEnded",
      "s.archive?.finish",
      "s.client.request",
      "s.emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.connectSession",
    "line": 68,
    "end": 189,
    "lines": 122,
    "language": "typescript",
    "branches": 63,
    "calls": [
      "(['noiseSuppression','echoCancellation','autoGainControl'] as const).every",
      "(input?.acquire??startMic)",
      "Date.now",
      "JSON.parse",
      "Math.min",
      "Promise.resolve",
      "String",
      "['Доступ к чату истёк. Войдите через штатную форму.','Доступ истёк. Новые команды остановлены.','browser_access_expired'].includes",
      "context.audioWorklet.addModule",
      "dispose",
      "event.data.slice",
      "fail",
      "finish",
      "input?.release",
      "markAsrStreamEnded",
      "mediaFailure",
      "microphoneErrorMessage",
      "opts.onAudioEvent",
      "opts.onTimings",
      "opts.prepareContext",
      "opts?.microphoneDevice",
      "opts?.onPcm",
      "opts?.onWaveform",
      "performance.now",
      "reportClientTimings",
      "s.archive?.disable",
      "s.archive?.mark",
      "s.capture.output.connect",
      "s.capture.start",
      "s.client.configureAudio",
      "s.client.connect",
      "s.client.disconnect",
      "s.client.listen",
      "s.client.onStatus",
      "s.client.request",
      "s.emit",
      "s.opus.push",
      "s.processor.connect",
      "s.processor?.port.postMessage",
      "s.resolveCaptureEnd",
      "s.vad?.push",
      "setAsrStreamId",
      "setTimeout",
      "track?.getSettings",
      "waveform.frame",
      "waveform?.reset",
      "window.clearTimeout",
      "wireProcessor"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.connectSession.<callback>",
    "line": 73,
    "end": 73,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.connectSession.<callback>",
    "line": 75,
    "end": 82,
    "lines": 8,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "fail"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.connectSession.acquire",
    "line": 86,
    "end": 86,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "(input?.acquire??startMic)",
      "opts?.microphoneDevice"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.connectSession.<callback>",
    "line": 87,
    "end": 103,
    "lines": 17,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "(['noiseSuppression','echoCancellation','autoGainControl'] as const).every",
      "Date.now",
      "fail",
      "mediaFailure",
      "microphoneErrorMessage",
      "s.archive?.mark",
      "s.emit",
      "track?.getSettings",
      "waveform?.reset"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.connectSession.<callback>.<callback>",
    "line": 94,
    "end": 94,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.connectSession.<callback>",
    "line": 103,
    "end": 103,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "input?.release"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.connectSession.wireProcessor",
    "line": 107,
    "end": 132,
    "lines": 26,
    "language": "typescript",
    "branches": 16,
    "calls": [
      "Math.min",
      "event.data.slice",
      "fail",
      "finish",
      "opts.onTimings",
      "opts?.onPcm",
      "opts?.onWaveform",
      "performance.now",
      "reportClientTimings",
      "s.emit",
      "s.opus.push",
      "s.processor?.port.postMessage",
      "s.resolveCaptureEnd",
      "s.vad?.push",
      "waveform.frame",
      "window.clearTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.connectSession.wireProcessor.<callback>",
    "line": 109,
    "end": 131,
    "lines": 23,
    "language": "typescript",
    "branches": 15,
    "calls": [
      "Math.min",
      "event.data.slice",
      "fail",
      "finish",
      "opts.onTimings",
      "opts?.onPcm",
      "opts?.onWaveform",
      "performance.now",
      "reportClientTimings",
      "s.emit",
      "s.opus.push",
      "s.processor?.port.postMessage",
      "s.resolveCaptureEnd",
      "s.vad?.push",
      "waveform.frame",
      "window.clearTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.connectSession.onConnectStage",
    "line": 138,
    "end": 138,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.connectSession.<callback>",
    "line": 140,
    "end": 159,
    "lines": 20,
    "language": "typescript",
    "branches": 10,
    "calls": [
      "JSON.parse",
      "String",
      "dispose",
      "fail",
      "markAsrStreamEnded",
      "opts.onAudioEvent",
      "s.archive?.disable",
      "s.emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.connectSession.<callback>",
    "line": 167,
    "end": 174,
    "lines": 8,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "String",
      "s.client.request",
      "setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.connectSession.<callback>.<callback>",
    "line": 172,
    "end": 172,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.connectSession.<callback>",
    "line": 174,
    "end": 174,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "s.emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.disconnectSession",
    "line": 190,
    "end": 196,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "dispose",
      "fail",
      "retainEndingStream",
      "s.capture?.mute",
      "s.emit",
      "s.processor?.port.postMessage",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.disconnectSession.<callback>",
    "line": 194,
    "end": 194,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "fail"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.hasSession",
    "line": 197,
    "end": 197,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.abortSession",
    "line": 198,
    "end": 198,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "fail"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.isDraining",
    "line": 199,
    "end": 199,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.getMicState",
    "line": 200,
    "end": 200,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.boundary",
    "line": 201,
    "end": 212,
    "lines": 12,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "String",
      "codec?.wait",
      "fail",
      "s.client.request",
      "s.phraseDrain.then",
      "s.phraseDrain.then(async()=>{\n    if(s.disposed)return;\n    await codec?.wait(event.end_sample??event.start_sample);\n    const data={...event,last_seq:s.sequence,vad:s.vadMetadata};\n    const reply=await s.client.request('phrase',data,5000);\n    if(reply.status!==200||reply.data.ok!==true)throw new Error(String(reply.data.error??'audio_phrase_unavailable'));\n  }).catch",
      "s.phraseDrain.then(async()=>{\n    if(s.disposed)return;\n    await codec?.wait(event.end_sample??event.start_sample);\n    const data={...event,last_seq:s.sequence,vad:s.vadMetadata};\n    const reply=await s.client.request('phrase',data,5000);\n    if(reply.status!==200||reply.data.ok!==true)throw new Error(String(reply.data.error??'audio_phrase_unavailable'));\n  }).catch(error=>fail(s,error instanceof Error?error.message:'audio_phrase_unavailable')).finally"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.boundary.<callback>",
    "line": 205,
    "end": 211,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "String",
      "codec?.wait",
      "s.client.request"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.boundary.<callback>",
    "line": 211,
    "end": 211,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "fail"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.boundary.<callback>",
    "line": 211,
    "end": 211,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.finishVad",
    "line": 213,
    "end": 220,
    "lines": 8,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "s.opus?.finish",
      "vad.end"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.setMicEnabled",
    "line": 221,
    "end": 258,
    "lines": 38,
    "language": "typescript",
    "branches": 13,
    "calls": [
      "(async()=>{\n      await new Promise<void>((resolve,reject)=>{\n        const timer=window.setTimeout(()=>reject(new Error('audio_capture_end_timeout')),2000);\n        s.resolveCaptureEnd=()=>{window.clearTimeout(timer);resolve();};\n        s.processor?.port.postMessage('capture-end');\n      });\n      await finishVad(s);\n    })",
      "(async()=>{\n      await new Promise<void>((resolve,reject)=>{\n        const timer=window.setTimeout(()=>reject(new Error('audio_capture_end_timeout')),2000);\n        s.resolveCaptureEnd=()=>{window.clearTimeout(timer);resolve();};\n        s.processor?.port.postMessage('capture-end');\n      });\n      await finishVad(s);\n    })().catch",
      "(async()=>{\n      await new Promise<void>((resolve,reject)=>{\n        const timer=window.setTimeout(()=>reject(new Error('audio_capture_end_timeout')),2000);\n        s.resolveCaptureEnd=()=>{window.clearTimeout(timer);resolve();};\n        s.processor?.port.postMessage('capture-end');\n      });\n      await finishVad(s);\n    })().catch(error=>{fail(s,error instanceof Error?error.message:'vad_end_failed');throw error;}).finally",
      "OpusCapture.create",
      "boundary",
      "fail",
      "finishVad",
      "reject",
      "resolve",
      "s.archive?.pcm",
      "s.capture.setEnabled",
      "s.capture?.mute",
      "s.client.publishAudio",
      "s.emit",
      "s.opus.close",
      "s.processor?.port.postMessage",
      "s.vad?.close",
      "vad.close",
      "window.clearTimeout",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.setMicEnabled.<callback>",
    "line": 228,
    "end": 235,
    "lines": 8,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "finishVad",
      "reject",
      "resolve",
      "s.processor?.port.postMessage",
      "window.clearTimeout",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.setMicEnabled.<callback>.<callback>",
    "line": 229,
    "end": 233,
    "lines": 5,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "reject",
      "resolve",
      "s.processor?.port.postMessage",
      "window.clearTimeout",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.setMicEnabled.<callback>.<callback>.<callback>",
    "line": 230,
    "end": 230,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "reject"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.setMicEnabled.<callback>.<callback>.<callback>",
    "line": 231,
    "end": 231,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "resolve",
      "window.clearTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.setMicEnabled.<callback>",
    "line": 235,
    "end": 235,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "fail"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.setMicEnabled.<callback>",
    "line": 235,
    "end": 235,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.setMicEnabled.<callback>",
    "line": 242,
    "end": 242,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "boundary"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.setMicEnabled.<callback>",
    "line": 242,
    "end": 242,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "fail"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.setMicEnabled.<callback>",
    "line": 247,
    "end": 250,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "s.archive?.pcm",
      "s.client.publishAudio"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.setMicEnabled.<callback>",
    "line": 250,
    "end": 250,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "fail"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.diagnostics",
    "line": 261,
    "end": 266,
    "lines": 6,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "String",
      "current.client.request"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.processing",
    "line": 267,
    "end": 298,
    "lines": 32,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "Object.assign",
      "Object.entries",
      "Object.entries(desired).every",
      "Object.fromEntries",
      "Object.keys",
      "Object.keys(values).some",
      "Promise.resolve",
      "['noiseSuppression','echoCancellation','autoGainControl'].includes",
      "capture.mute",
      "capture.restartInput",
      "current.archive?.mark",
      "keys.map",
      "matches",
      "navigator.mediaDevices.getSupportedConstraints",
      "next.getSettings",
      "pending.catch",
      "pending.catch(()=>({})).then",
      "safe",
      "track.getSettings"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.processing.<callback>",
    "line": 269,
    "end": 269,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "['noiseSuppression','echoCancellation','autoGainControl'].includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.processing.<callback>",
    "line": 271,
    "end": 271,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.processing.<callback>",
    "line": 271,
    "end": 297,
    "lines": 27,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "Object.assign",
      "Object.entries",
      "Object.entries(desired).every",
      "Object.fromEntries",
      "Object.keys",
      "Object.keys(values).some",
      "capture.mute",
      "capture.restartInput",
      "current.archive?.mark",
      "keys.map",
      "matches",
      "navigator.mediaDevices.getSupportedConstraints",
      "next.getSettings",
      "safe",
      "track.getSettings"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.processing.<callback>.<callback>",
    "line": 274,
    "end": 274,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.processing.<callback>.matches",
    "line": 278,
    "end": 278,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Object.entries",
      "Object.entries(desired).every"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.processing.<callback>.matches.<callback>",
    "line": 278,
    "end": 278,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.processing.<callback>.safe",
    "line": 279,
    "end": 279,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Object.fromEntries",
      "keys.map"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.processing.<callback>.safe.<callback>",
    "line": 279,
    "end": 279,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.processing.<callback>.<callback>",
    "line": 280,
    "end": 280,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/natsSession.ts",
    "name": "createNatsAudio.snapshot",
    "line": 299,
    "end": 301,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "getMicState",
      "hasSession",
      "isDraining",
      "navigator.mediaDevices?.getSupportedConstraints",
      "owner.getAsrStreamId",
      "session?.capture?.inputTrack?.getSettings"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "opusSample",
    "line": 2,
    "end": 2,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Math.round"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "opusEnd",
    "line": 3,
    "end": 3,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Number",
      "new DataView(packet).getBigUint64"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.constructor",
    "line": 9,
    "end": 31,
    "lines": 23,
    "language": "typescript",
    "branches": 10,
    "calls": [
      "ArrayBuffer.isView",
      "BigInt",
      "Math.max",
      "Math.min",
      "chunk.copyTo",
      "description.buffer.slice",
      "description.slice",
      "new DataView(this.header.buffer).getUint16",
      "new TextDecoder().decode",
      "new Uint8Array(packet,14,19).set",
      "opusSample",
      "this.fail",
      "this.header.slice",
      "this.notify",
      "this.output",
      "view.setBigUint64",
      "view.setUint16",
      "view.setUint32"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.constructor.output",
    "line": 11,
    "end": 30,
    "lines": 20,
    "language": "typescript",
    "branches": 10,
    "calls": [
      "ArrayBuffer.isView",
      "BigInt",
      "Math.max",
      "Math.min",
      "chunk.copyTo",
      "description.buffer.slice",
      "description.slice",
      "new DataView(this.header.buffer).getUint16",
      "new TextDecoder().decode",
      "new Uint8Array(packet,14,19).set",
      "opusSample",
      "this.fail",
      "this.header.slice",
      "this.notify",
      "this.output",
      "view.setBigUint64",
      "view.setUint16",
      "view.setUint32"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.constructor.error",
    "line": 30,
    "end": 30,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.fail"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.create",
    "line": 32,
    "end": 38,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "AudioEncoder.isConfigSupported",
      "capture.encoder.configure"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.push",
    "line": 39,
    "end": 47,
    "lines": 9,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Math.round",
      "data.close",
      "this.encoder.encode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.drain",
    "line": 48,
    "end": 55,
    "lines": 8,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "reject",
      "resolve",
      "this.encoder.addEventListener",
      "this.encoder.removeEventListener",
      "this.waiters.filter",
      "this.waiters.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.drain.<callback>",
    "line": 49,
    "end": 53,
    "lines": 5,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "reject",
      "resolve",
      "this.encoder.addEventListener",
      "this.encoder.removeEventListener",
      "this.waiters.filter",
      "this.waiters.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.drain.<callback>.done",
    "line": 50,
    "end": 50,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "resolve",
      "this.waiters.filter"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.drain.<callback>.done.<callback>",
    "line": 50,
    "end": 50,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.drain.<callback>.reject",
    "line": 51,
    "end": 51,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "reject",
      "this.encoder.removeEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.wait",
    "line": 56,
    "end": 62,
    "lines": 7,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Promise.reject",
      "Promise.resolve",
      "opusSample",
      "this.waiters.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.wait.<callback>",
    "line": 61,
    "end": 61,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.waiters.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.notify",
    "line": 63,
    "end": 63,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.waiters.filter",
      "w.resolve"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.notify.<callback>",
    "line": 63,
    "end": 63,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "w.resolve"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.fail",
    "line": 64,
    "end": 64,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.error",
      "w.reject"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.finish",
    "line": 65,
    "end": 79,
    "lines": 15,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "Math.ceil",
      "Math.round",
      "opusSample",
      "padding.close",
      "this.encoder.close",
      "this.encoder.encode",
      "this.encoder.flush",
      "this.fail",
      "this.notify",
      "w.reject"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/opus.ts",
    "name": "OpusCapture.close",
    "line": 80,
    "end": 80,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.encoder.close",
      "w.reject"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/pcmWaveform.ts",
    "name": "PcmWaveform.reset",
    "line": 5,
    "end": 5,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/pcmWaveform.ts",
    "name": "PcmWaveform.frame",
    "line": 6,
    "end": 20,
    "lines": 15,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Math.floor",
      "Math.max",
      "Math.min",
      "Math.sqrt",
      "peaks.push",
      "performance.now",
      "view.getInt16"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/streamOwner.ts",
    "name": "createStreamOwner",
    "line": 1,
    "end": 32,
    "lines": 32,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "Date.now",
      "[...ending.keys()].reverse",
      "ending.clear",
      "ending.delete",
      "ending.get",
      "ending.has",
      "ending.keys",
      "ending.keys().next",
      "ending.set",
      "prune",
      "retainEndingStream"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/streamOwner.ts",
    "name": "createStreamOwner.prune",
    "line": 6,
    "end": 8,
    "lines": 3,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Date.now",
      "ending.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/streamOwner.ts",
    "name": "createStreamOwner.setAsrStreamId",
    "line": 9,
    "end": 9,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "prune"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/streamOwner.ts",
    "name": "createStreamOwner.getAsrStreamId",
    "line": 10,
    "end": 12,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "[...ending.keys()].reverse",
      "ending.keys",
      "prune"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/streamOwner.ts",
    "name": "createStreamOwner.ownsAsrStream",
    "line": 13,
    "end": 15,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "ending.has",
      "prune"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/streamOwner.ts",
    "name": "createStreamOwner.retainEndingStream",
    "line": 16,
    "end": 20,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Date.now",
      "ending.delete",
      "ending.keys",
      "ending.keys().next",
      "ending.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/streamOwner.ts",
    "name": "createStreamOwner.markAsrStreamEnded",
    "line": 21,
    "end": 24,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "ending.get",
      "retainEndingStream"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/streamOwner.ts",
    "name": "createStreamOwner.asrStreamEnded",
    "line": 25,
    "end": 25,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "ending.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/streamOwner.ts",
    "name": "createStreamOwner.clearAsrStream",
    "line": 26,
    "end": 29,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "ending.clear",
      "ending.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/client.ts",
    "name": "BrowserVad.constructor",
    "line": 17,
    "end": 33,
    "lines": 17,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "clearTimeout",
      "event.preventDefault",
      "onBoundary",
      "setTimeout",
      "this.close",
      "this.consumed?.resolve",
      "this.endResolve",
      "this.fail",
      "this.readyResolve",
      "this.worker.postMessage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/client.ts",
    "name": "BrowserVad.constructor.<callback>",
    "line": 19,
    "end": 19,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/client.ts",
    "name": "BrowserVad.constructor.<callback>",
    "line": 21,
    "end": 28,
    "lines": 8,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "clearTimeout",
      "onBoundary",
      "this.close",
      "this.consumed?.resolve",
      "this.endResolve",
      "this.fail",
      "this.readyResolve"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/client.ts",
    "name": "BrowserVad.constructor.<callback>",
    "line": 29,
    "end": 29,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "event.preventDefault",
      "this.fail"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/client.ts",
    "name": "BrowserVad.constructor.<callback>",
    "line": 31,
    "end": 31,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.fail"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/client.ts",
    "name": "BrowserVad.push",
    "line": 34,
    "end": 40,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "pcm.slice",
      "this.fail",
      "this.worker.postMessage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/client.ts",
    "name": "BrowserVad.feed",
    "line": 42,
    "end": 48,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "rejectFeed",
      "this.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/client.ts",
    "name": "BrowserVad.feed.<callback>",
    "line": 45,
    "end": 45,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/client.ts",
    "name": "BrowserVad.end",
    "line": 49,
    "end": 55,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Promise.reject",
      "setTimeout",
      "this.fail",
      "this.worker.postMessage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/client.ts",
    "name": "BrowserVad.end.<callback>",
    "line": 52,
    "end": 52,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/client.ts",
    "name": "BrowserVad.end.<callback>",
    "line": 53,
    "end": 53,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.fail"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/client.ts",
    "name": "BrowserVad.close",
    "line": 56,
    "end": 60,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "clearTimeout",
      "this.consumed?.reject",
      "this.endReject",
      "this.readyReject",
      "this.worker.terminate"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/client.ts",
    "name": "BrowserVad.fail",
    "line": 61,
    "end": 63,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.close",
      "this.endReject",
      "this.onError",
      "this.readyReject"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/phrase.ts",
    "name": "PhraseDetector.constructor",
    "line": 14,
    "end": 17,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "crypto.randomUUID"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/phrase.ts",
    "name": "PhraseDetector.constructor.<callback>",
    "line": 15,
    "end": 15,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "crypto.randomUUID"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/phrase.ts",
    "name": "PhraseDetector.frame",
    "line": 18,
    "end": 42,
    "lines": 25,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "Math.max",
      "Math.round",
      "Number.isFinite",
      "Number.isSafeInteger",
      "this.finish",
      "this.open"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/phrase.ts",
    "name": "PhraseDetector.end",
    "line": 43,
    "end": 48,
    "lines": 6,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Number.isSafeInteger",
      "this.finish"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/phrase.ts",
    "name": "PhraseDetector.open",
    "line": 49,
    "end": 52,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.emit",
      "this.id"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/phrase.ts",
    "name": "PhraseDetector.finish",
    "line": 53,
    "end": 59,
    "lines": 7,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Math.min",
      "this.emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/resampler.ts",
    "name": "resampler",
    "line": 4,
    "end": 26,
    "lines": 23,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Float32Array.from",
      "Math.ceil",
      "Math.floor",
      "Math.max",
      "create",
      "src.full",
      "src?.destroy",
      "tail.slice"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/resampler.ts",
    "name": "resampler.push",
    "line": 8,
    "end": 14,
    "lines": 7,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Float32Array.from",
      "src.full"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/resampler.ts",
    "name": "resampler.push.<callback>",
    "line": 10,
    "end": 10,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/resampler.ts",
    "name": "resampler.finish",
    "line": 15,
    "end": 23,
    "lines": 9,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Math.ceil",
      "Math.floor",
      "Math.max",
      "src.full",
      "tail.slice"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/resampler.ts",
    "name": "resampler.close",
    "line": 24,
    "end": 24,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "src?.destroy"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/silero.ts",
    "name": "silero",
    "line": 6,
    "end": 27,
    "lines": 22,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "BigInt64Array.of",
      "Number",
      "Object.values",
      "input.copyWithin",
      "input.set",
      "ort.InferenceSession.create",
      "session.release",
      "session.run",
      "state.set",
      "tensor.dispose"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/silero.ts",
    "name": "silero.probability",
    "line": 14,
    "end": 23,
    "lines": 10,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Number",
      "Object.values",
      "input.copyWithin",
      "input.set",
      "session.run",
      "state.set",
      "tensor.dispose"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/silero.ts",
    "name": "silero.close",
    "line": 23,
    "end": 26,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Object.values",
      "session.release",
      "tensor.dispose"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/worker.ts",
    "name": "send",
    "line": 10,
    "end": 10,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "self.postMessage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/worker.ts",
    "name": "release",
    "line": 11,
    "end": 11,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "convert?.close",
      "model?.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/worker.ts",
    "name": "analyse",
    "line": 12,
    "end": 20,
    "lines": 9,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Math.min",
      "data.subarray",
      "frame.fill",
      "frame.set",
      "runFrame"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/worker.ts",
    "name": "runFrame",
    "line": 21,
    "end": 29,
    "lines": 9,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Math.floor",
      "Math.min",
      "costs.push",
      "costs.shift",
      "detector.frame",
      "model!.probability",
      "performance.now"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/worker.ts",
    "name": "<callback>",
    "line": 30,
    "end": 65,
    "lines": 36,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "Number.isInteger",
      "String",
      "analyse",
      "chain.finally",
      "chain.then",
      "chain.then(async () => {\n    if (stopped) return;\n    if (message.type === 'init') {\n      if (!Number.isInteger(message.rate) || message.rate < 8000 || message.rate > 96000)\n        throw new Error('vad_invalid_configuration');\n      rate = message.rate; offset = message.offset;\n      model = await silero();\n      convert = await resampler(rate); frame = new Float32Array(model.frameSize);\n      costs.push({sample: offset, ms: 0});\n      detector = new PhraseDetector(rate, offset, boundary => {\n        let before = 0;\n        for (const cost of costs) { if (cost.sample > boundary.start_sample) break; before = cost.ms; }\n        send({...boundary, vad_ms: computeMs - before});\n      });\n      send({type: 'ready', vad: {provider: 'silero', revision: manifest.silero_revision,\n        parameters: vadParameters, analysis_rate: 16000, resampler: 'libsamplerate-js@2.1.2/SRC_SINC_FASTEST'}});\n    } else if (message.type === 'pcm') {\n      const pcm = new Int16Array(message.pcm);\n      if (!convert || !pcm.length || pcm.length > 65536) throw new Error('vad_invalid_pcm');\n      sourceSamples += pcm.length;\n      await analyse(convert.push(pcm)); queuedSamples -= pcm.length;\n      send({type: 'ack', samples: pcm.length});\n    } else if (message.type === 'end') {\n      await analyse(convert!.finish(), true); detector.end(offset + sourceSamples);\n      await release(); stopped = true; send({type: 'ended', samples: sourceSamples, vad_ms: computeMs});\n    }\n  }).catch",
      "convert!.finish",
      "convert.push",
      "costs.push",
      "detector.end",
      "release",
      "resampler",
      "send",
      "silero"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/worker.ts",
    "name": "<callback>.<callback>",
    "line": 38,
    "end": 64,
    "lines": 27,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "Number.isInteger",
      "analyse",
      "convert!.finish",
      "convert.push",
      "costs.push",
      "detector.end",
      "release",
      "resampler",
      "send",
      "silero"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/worker.ts",
    "name": "<callback>.<callback>.<callback>",
    "line": 47,
    "end": 51,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "send"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/audio/vad/worker.ts",
    "name": "<callback>.<callback>",
    "line": 64,
    "end": 64,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "release",
      "send"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "initial",
    "line": 12,
    "end": 14,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.constructor",
    "line": 31,
    "end": 32,
    "lines": 2,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "crypto.randomUUID"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.constructor.<callback>",
    "line": 32,
    "end": 32,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "crypto.randomUUID"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.state",
    "line": 33,
    "end": 33,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.revision",
    "line": 34,
    "end": 34,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.onChange",
    "line": 35,
    "end": 35,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "listener",
      "this.listeners.add",
      "this.listeners.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.onChange.<callback>",
    "line": 35,
    "end": 35,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.listeners.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.emit",
    "line": 36,
    "end": 43,
    "lines": 8,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "listener",
      "this.commandBytes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.setSession",
    "line": 44,
    "end": 47,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "initial",
      "this.emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.setConnected",
    "line": 48,
    "end": 48,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.edit",
    "line": 49,
    "end": 49,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.isCurrent",
    "line": 50,
    "end": 50,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.stored",
    "line": 51,
    "end": 55,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Number.isSafeInteger"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.restore",
    "line": 56,
    "end": 77,
    "lines": 22,
    "language": "typescript",
    "branches": 12,
    "calls": [
      "Boolean",
      "this.emit",
      "this.isCurrent",
      "this.request",
      "this.stored"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.committed",
    "line": 78,
    "end": 89,
    "lines": 12,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Number.isSafeInteger"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.receipt",
    "line": 90,
    "end": 99,
    "lines": 10,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "this.committed",
      "this.isCurrent",
      "this.request"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.save",
    "line": 100,
    "end": 129,
    "lines": 30,
    "language": "typescript",
    "branches": 12,
    "calls": [
      "this.committed",
      "this.emit",
      "this.isCurrent",
      "this.newId",
      "this.receipt",
      "this.request",
      "this.stored"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/chatNote.ts",
    "name": "ChatNoteController.dispose",
    "line": 130,
    "end": 130,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.listeners.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/eventOwner.ts",
    "name": "eventOwner",
    "line": 2,
    "end": 5,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Array.isArray"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/core/eventOwner.ts",
    "name": "eventBelongsToSession",
    "line": 6,
    "end": 9,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Boolean",
      "eventOwner",
      "globals.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/main.ts",
    "name": "boot",
    "line": 9,
    "end": 11,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "new WorkspaceApp(appConfig).start"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "airportLabels",
    "line": 27,
    "end": 31,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "(a.runways??[]).filter",
      "(a.runways??[]).map",
      "(a.runways??[]).map(r=>`${r.name}: ${r.length_m} м, ${r.available?'доступна':'недоступна'}`).join"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "airportLabels.<callback>",
    "line": 28,
    "end": 28,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "airportLabels.<callback>",
    "line": 30,
    "end": 30,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "unwrapRoute",
    "line": 42,
    "end": 51,
    "lines": 10,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Math.abs",
      "Math.max",
      "Math.min",
      "Math.round",
      "Number.isFinite",
      "result.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.isDragging",
    "line": 68,
    "end": 68,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.onPositionDrop",
    "line": 71,
    "end": 71,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.onAirportClick",
    "line": 72,
    "end": 72,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.onWeatherError",
    "line": 73,
    "end": 73,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.init",
    "line": 75,
    "end": 160,
    "lines": 86,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "event.error?.message.includes",
      "map.addControl",
      "map.addLayer",
      "map.addSource",
      "map.getCanvas",
      "map.on",
      "observeMapSize",
      "this.airportClick",
      "this.drawRoute",
      "this.setAirports",
      "this.setCatalog",
      "this.setCurrentPosition",
      "this.setWeather",
      "this.weatherError"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.init.<callback>",
    "line": 89,
    "end": 158,
    "lines": 70,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "map.addLayer",
      "map.addSource",
      "map.getCanvas",
      "map.on",
      "this.airportClick",
      "this.drawRoute",
      "this.setAirports",
      "this.setCatalog",
      "this.setCurrentPosition",
      "this.setWeather"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.init.<callback>.<callback>",
    "line": 115,
    "end": 118,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.airportClick"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.init.<callback>.<callback>",
    "line": 119,
    "end": 119,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "map.getCanvas"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.init.<callback>.<callback>",
    "line": 120,
    "end": 120,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "map.getCanvas"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.init.<callback>",
    "line": 159,
    "end": 159,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "event.error?.message.includes",
      "this.weatherError"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.setAirports",
    "line": 163,
    "end": 167,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "airports.map",
      "this.map.setFilter"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.setAirports.<callback>",
    "line": 165,
    "end": 165,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.setCatalog",
    "line": 169,
    "end": 189,
    "lines": 21,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "airportLabels",
      "airports.map",
      "source.setData",
      "this.map.getSource"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.setCatalog.<callback>",
    "line": 177,
    "end": 187,
    "lines": 11,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "airportLabels"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.allAirports",
    "line": 191,
    "end": 194,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.boundsForCoords",
      "this.catalog.map",
      "this.map.fitBounds"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.allAirports.<callback>",
    "line": 192,
    "end": 192,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.toPlane",
    "line": 195,
    "end": 198,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.map?.flyTo",
      "this.marker?.getLngLat"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.setWeather",
    "line": 199,
    "end": 213,
    "lines": 15,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "Math.max",
      "Math.min",
      "layers.includes",
      "this.map.addLayer",
      "this.map.addSource",
      "this.map.getLayer",
      "this.map.getSource",
      "this.map.removeLayer",
      "this.map.removeSource",
      "this.styleWeatherBase"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.styleWeatherBase",
    "line": 214,
    "end": 224,
    "lines": 11,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "map.getLayer",
      "map.getPaintProperty",
      "map.setPaintProperty",
      "this.basePaint.get",
      "this.basePaint.has",
      "this.basePaint.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.setWeatherOpacity",
    "line": 225,
    "end": 228,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Math.max",
      "Math.min",
      "this.map.setPaintProperty",
      "this.map?.getLayer"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.setCurrentPosition",
    "line": 230,
    "end": 254,
    "lines": 25,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "document.createElement",
      "new Marker({element:plane,draggable:true}).setLngLat",
      "new Marker({element:plane,draggable:true}).setLngLat([lon,lat]).addTo",
      "plane.setAttribute",
      "source.setData",
      "this.map.getSource",
      "this.marker!.getLngLat",
      "this.marker.on",
      "this.marker.setLngLat",
      "this.positionDrop"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.setCurrentPosition.<callback>",
    "line": 241,
    "end": 241,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.setCurrentPosition.<callback>",
    "line": 242,
    "end": 242,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.marker!.getLngLat",
      "this.positionDrop"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.drawRoute",
    "line": 256,
    "end": 279,
    "lines": 24,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "source.setData",
      "this.boundsForCoords",
      "this.map.fitBounds",
      "this.map.getSource",
      "unwrapRoute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.clearRoute",
    "line": 280,
    "end": 284,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "(this.map.getSource(\"route\") as GeoJSONSource | undefined)?.setData",
      "this.map.getSource"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.clearSelection",
    "line": 285,
    "end": 285,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.setAirports"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapController.ts",
    "name": "MapController.boundsForCoords",
    "line": 287,
    "end": 303,
    "lines": 17,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Math.max",
      "Math.min"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapResize.ts",
    "name": "observeMapSize",
    "line": 3,
    "end": 17,
    "lines": 15,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "cancelAnimationFrame",
      "map.getContainer",
      "map.on",
      "map.resize",
      "observer.disconnect",
      "observer.observe",
      "requestAnimationFrame"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapResize.ts",
    "name": "observeMapSize.<callback>",
    "line": 5,
    "end": 8,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "map.resize",
      "requestAnimationFrame"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapResize.ts",
    "name": "observeMapSize.<callback>.<callback>",
    "line": 7,
    "end": 7,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "map.resize"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/map/mapResize.ts",
    "name": "observeMapSize.dispose",
    "line": 10,
    "end": 14,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "cancelAnimationFrame",
      "observer.disconnect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/access.ts",
    "name": "monitorRead",
    "line": 5,
    "end": 13,
    "lines": 9,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "String",
      "client.connect",
      "client.request"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/access.ts",
    "name": "monitorRead.<callback>",
    "line": 6,
    "end": 12,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "String",
      "client.connect",
      "client.request"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "milliseconds",
    "line": 6,
    "end": 6,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Number.isFinite",
      "value.toFixed"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "score",
    "line": 7,
    "end": 12,
    "lines": 6,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Number.isFinite",
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderComparison",
    "line": 14,
    "end": 59,
    "lines": 46,
    "language": "typescript",
    "branches": 27,
    "calls": [
      "Array.isArray",
      "JSON.stringify",
      "Number.isFinite",
      "Number.isSafeInteger",
      "String",
      "[...root.querySelectorAll<HTMLDetailsElement>('details[open]')].map",
      "[original,replay].entries",
      "backendName",
      "body.insertRow",
      "boolean",
      "cell.append",
      "count",
      "disclosure.append",
      "document.createElement",
      "durationLabel",
      "head.append",
      "input",
      "milliseconds",
      "opened.has",
      "parent.insertRow",
      "rangeLabel",
      "ranges.every",
      "ranges.map",
      "ranges.map(rangeLabel).join",
      "ranges.reduce",
      "ranges.reduce((seconds,r)=>seconds+(r.end_sample!-r.start_sample!)/r.sample_rate!,0).toLocaleString",
      "recognitionMilliseconds",
      "replay.phrases.map",
      "right",
      "root.append",
      "root.querySelector",
      "root.querySelector('[aria-expanded]')?.getAttribute",
      "root.querySelectorAll",
      "root.replaceChildren",
      "row",
      "score",
      "sourceRange",
      "table.createTBody",
      "table.createTHead",
      "table.createTHead().insertRow",
      "table.setAttribute",
      "text",
      "timing",
      "toggle.setAttribute",
      "toggleRow.insertCell",
      "tr.append",
      "tr.insertCell"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderComparison.<callback>",
    "line": 16,
    "end": 16,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderComparison.right",
    "line": 22,
    "end": 22,
    "lines": 1,
    "language": "typescript",
    "branches": 3,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderComparison.row",
    "line": 23,
    "end": 26,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "document.createElement",
      "parent.insertRow",
      "tr.append",
      "tr.insertCell"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderComparison.timing",
    "line": 27,
    "end": 27,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "milliseconds"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderComparison.sourceRange",
    "line": 28,
    "end": 28,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Number.isFinite",
      "Number.isSafeInteger"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderComparison.count",
    "line": 29,
    "end": 29,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Number.isSafeInteger",
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderComparison.text",
    "line": 30,
    "end": 30,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderComparison.input",
    "line": 31,
    "end": 31,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderComparison.<callback>",
    "line": 38,
    "end": 38,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderComparison.<callback>",
    "line": 38,
    "end": 38,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderComparison.boolean",
    "line": 50,
    "end": 50,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderComparison.<callback>",
    "line": 57,
    "end": 57,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "toggle.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderEvaluation",
    "line": 61,
    "end": 72,
    "lines": 12,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "Boolean",
      "Number.isFinite",
      "String",
      "data.text.trim",
      "document.createElement",
      "list.append",
      "number",
      "root.append",
      "root.replaceChildren",
      "scores.every",
      "scores.map"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderEvaluation.number",
    "line": 65,
    "end": 65,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Number.isFinite",
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderEvaluation.<callback>",
    "line": 67,
    "end": 67,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderEvaluation.<callback>",
    "line": 67,
    "end": 67,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Number.isFinite"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "renderEvaluation.<callback>",
    "line": 69,
    "end": 69,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "number"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "recognitionMilliseconds",
    "line": 74,
    "end": 89,
    "lines": 16,
    "language": "typescript",
    "branches": 10,
    "calls": [
      "Number.isFinite",
      "['final','rejected','error'].includes",
      "[...required].some",
      "[...totals.values()].reduce",
      "required.add",
      "seen.add",
      "seen.has",
      "totals.has",
      "totals.set",
      "totals.values",
      "windows.get",
      "windows.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "recognitionMilliseconds.<callback>",
    "line": 87,
    "end": 87,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "totals.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/asrEvaluation.ts",
    "name": "recognitionMilliseconds.<callback>",
    "line": 88,
    "end": 88,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "recordSamples",
    "line": 12,
    "end": 12,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "replayError",
    "line": 14,
    "end": 14,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "node",
    "line": 15,
    "end": 15,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "document.createElement"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "button",
    "line": 16,
    "end": 16,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "node"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "explained",
    "line": 17,
    "end": 17,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "decode",
    "line": 29,
    "end": 29,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Uint8Array.from",
      "atob",
      "c.charCodeAt"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "decode.<callback>",
    "line": 29,
    "end": 29,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "c.charCodeAt"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "digest",
    "line": 30,
    "end": 30,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Array.from",
      "Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',raw as Uint8Array<ArrayBuffer>))).map",
      "Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256',raw as Uint8Array<ArrayBuffer>))).map(n=>n.toString(16).padStart(2,'0')).join",
      "crypto.subtle.digest",
      "n.toString",
      "n.toString(16).padStart"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "digest.<callback>",
    "line": 30,
    "end": 30,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "n.toString",
      "n.toString(16).padStart"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "wav",
    "line": 31,
    "end": 36,
    "lines": 6,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "[...s].forEach",
      "c.charCodeAt",
      "parts.reduce",
      "str",
      "v.setUint16",
      "v.setUint32",
      "v.setUint8"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "wav.<callback>",
    "line": 32,
    "end": 32,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "wav.str",
    "line": 33,
    "end": 33,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "[...s].forEach",
      "c.charCodeAt",
      "v.setUint8"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "wav.str.<callback>",
    "line": 33,
    "end": 33,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "c.charCodeAt",
      "v.setUint8"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.constructor",
    "line": 51,
    "end": 51,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "document.addEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.query",
    "line": 52,
    "end": 52,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.read"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.control",
    "line": 53,
    "end": 53,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.read"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.active",
    "line": 54,
    "end": 54,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.start",
    "line": 55,
    "end": 72,
    "lines": 18,
    "language": "typescript",
    "branches": 12,
    "calls": [
      "String",
      "controlTooltip",
      "params.get",
      "player.pause",
      "revealSection",
      "this.active",
      "this.body.replaceChildren",
      "this.cancel",
      "this.closeWindow",
      "this.diagnosticsRoot?.replaceChildren",
      "this.help",
      "this.query",
      "this.root.classList.add",
      "this.root.querySelectorAll",
      "this.root.querySelectorAll('audio').forEach",
      "this.root.replaceChildren",
      "this.show",
      "this.showRecording",
      "this.stopPlayers",
      "this.urls.forEach"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.start.<callback>",
    "line": 57,
    "end": 57,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "player.pause"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.showRecording",
    "line": 73,
    "end": 78,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "controlTooltip",
      "this.body.replaceChildren",
      "this.help",
      "this.original",
      "this.root.classList.add",
      "this.root.replaceChildren"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.showMessages",
    "line": 79,
    "end": 81,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "controlTooltip",
      "this.body.replaceChildren",
      "this.help",
      "this.list",
      "this.root.classList.add",
      "this.root.replaceChildren"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.refresh",
    "line": 82,
    "end": 91,
    "lines": 10,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "Object.assign",
      "this.active",
      "this.body.querySelector",
      "this.metadataChanged",
      "this.query",
      "this.recordSummary",
      "this.refreshList"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.list",
    "line": 92,
    "end": 114,
    "lines": 23,
    "language": "typescript",
    "branches": 20,
    "calls": [
      "Math.max",
      "Number.isInteger",
      "String",
      "['rejected','error'].includes",
      "[...tbody.children].map",
      "asrOutcomeText",
      "backendName",
      "button",
      "durationLabel",
      "head.append",
      "load",
      "new Date(item.created_at).toLocaleString",
      "node",
      "objectUrl",
      "row.append",
      "seen.has",
      "table.append",
      "target.searchParams.set",
      "tbody.append",
      "tbody.replaceChildren",
      "text.append",
      "thead.append",
      "this.active",
      "this.body.append",
      "this.query",
      "tr.append",
      "url.searchParams.delete",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.list.<callback>",
    "line": 99,
    "end": 99,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "load"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.list.load",
    "line": 100,
    "end": 111,
    "lines": 12,
    "language": "typescript",
    "branches": 12,
    "calls": [
      "Number.isInteger",
      "String",
      "['rejected','error'].includes",
      "asrOutcomeText",
      "backendName",
      "durationLabel",
      "new Date(item.created_at).toLocaleString",
      "node",
      "objectUrl",
      "row.append",
      "target.searchParams.set",
      "tbody.append",
      "text.append",
      "this.active",
      "this.query"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.list.<callback>",
    "line": 112,
    "end": 112,
    "lines": 1,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Math.max",
      "[...tbody.children].map",
      "load",
      "seen.has",
      "tbody.append",
      "tbody.replaceChildren",
      "this.active"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.list.<callback>.<callback>",
    "line": 112,
    "end": 112,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.section",
    "line": 115,
    "end": 115,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "details.append",
      "document.createElement",
      "node",
      "parent.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.lazy",
    "line": 116,
    "end": 116,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "details.addEventListener",
      "load"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.lazy.<callback>",
    "line": 116,
    "end": 116,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "load"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.show",
    "line": 117,
    "end": 161,
    "lines": 45,
    "language": "typescript",
    "branches": 31,
    "calls": [
      "(async()=>{const g=this.generation;try{const page=await this.callPage();if(!this.active(g,calls))return;const values=page.items.filter((i:any)=>i.kind==='model_call'&&!i.data.cache_reused).map((i:any)=>({type:'audio_archive_event',data:i.data}));\n        const last=values[values.length-1]?.data;if(last){this.originalResult={...this.originalResult,evaluation:this.originalResult.evaluation??(page.next===null?last:undefined),recognition_ms:page.next===null?recognitionMilliseconds(values):undefined,decode_count:page.next===null?values.length:undefined};this.compare();}\n      }catch(error){if(this.active(g,calls))calls.append(node('p',String(error)));}})",
      "String",
      "['diagnostics','evaluation'].includes",
      "['rejected','error'].includes",
      "asrOutcomeText",
      "asrOutcomeTitle",
      "backendName",
      "button",
      "calls.append",
      "diagnosticBody.parentElement!.classList.add",
      "durationLabel",
      "explained",
      "meta.append",
      "ms.toFixed",
      "new Date(m.created_at).toLocaleString",
      "node",
      "objectUrl",
      "page.items.filter",
      "page.items.filter((i:any)=>i.kind==='model_call'&&!i.data.cache_reused).map",
      "params.get",
      "rangeLabel",
      "recognitionMilliseconds",
      "result.append",
      "result.querySelector",
      "row.append",
      "savedResult.append",
      "settings.append",
      "settings.replaceChildren",
      "this.active",
      "this.audio",
      "this.body.append",
      "this.body.replaceChildren",
      "this.callPage",
      "this.compare",
      "this.diagnostics",
      "this.dsp",
      "this.json",
      "this.lazy",
      "this.record.id.slice",
      "this.rows",
      "this.section",
      "updateSettings"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.show.<callback>",
    "line": 128,
    "end": 128,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.json"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.show.updateSettings",
    "line": 133,
    "end": 144,
    "lines": 12,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "button",
      "explained",
      "node",
      "row.append",
      "settings.append",
      "settings.replaceChildren",
      "this.dsp",
      "this.json"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.show.updateSettings.<callback>",
    "line": 143,
    "end": 143,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.json"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.show.<callback>",
    "line": 145,
    "end": 145,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.audio",
      "updateSettings"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.show.<callback>",
    "line": 149,
    "end": 149,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.json"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.show.<callback>",
    "line": 150,
    "end": 150,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.rows"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.show.<callback>",
    "line": 156,
    "end": 158,
    "lines": 3,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "String",
      "calls.append",
      "node",
      "page.items.filter",
      "page.items.filter((i:any)=>i.kind==='model_call'&&!i.data.cache_reused).map",
      "recognitionMilliseconds",
      "this.active",
      "this.callPage",
      "this.compare"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.show.<callback>.<callback>",
    "line": 156,
    "end": 156,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.show.<callback>.<callback>",
    "line": 156,
    "end": 156,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.dsp",
    "line": 163,
    "end": 163,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "[['NS','noiseSuppression'],['EC','echoCancellation'],['AGC','autoGainControl']].map",
      "[['NS','noiseSuppression'],['EC','echoCancellation'],['AGC','autoGainControl']].map(([label,key])=>`${label}: requested ${state(requested[key],'По умолчанию браузера')} / actual ${state(actual[key],'Браузер не сообщил')}`).join",
      "state"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.dsp.state",
    "line": 163,
    "end": 163,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.dsp.<callback>",
    "line": 163,
    "end": 163,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "state"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.recordSummary",
    "line": 164,
    "end": 164,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "(recordSamples(record)/record.sample_rate).toFixed",
      "recordSamples"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.original",
    "line": 165,
    "end": 169,
    "lines": 5,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "button",
      "node",
      "root.append",
      "this.audio",
      "this.json",
      "this.lazy",
      "this.recordSummary",
      "this.rows",
      "this.section"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.original.<callback>",
    "line": 166,
    "end": 166,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.json"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.original.<callback>",
    "line": 167,
    "end": 167,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.audio"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.original.<callback>",
    "line": 168,
    "end": 168,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.rows"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.callPage",
    "line": 170,
    "end": 170,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.query"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.rows",
    "line": 171,
    "end": 181,
    "lines": 11,
    "language": "typescript",
    "branches": 15,
    "calls": [
      "Number.isInteger",
      "String",
      "button",
      "load",
      "node",
      "root.append",
      "root.insertBefore",
      "root.querySelector",
      "row.append",
      "this.active",
      "this.callHeader",
      "this.callPage",
      "this.callRow",
      "this.json",
      "this.query",
      "windows.get",
      "windows.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.rows.<callback>",
    "line": 172,
    "end": 172,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "load"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.rows.load",
    "line": 173,
    "end": 180,
    "lines": 8,
    "language": "typescript",
    "branches": 15,
    "calls": [
      "Number.isInteger",
      "String",
      "button",
      "node",
      "root.append",
      "root.insertBefore",
      "root.querySelector",
      "row.append",
      "this.active",
      "this.callHeader",
      "this.callPage",
      "this.callRow",
      "this.json",
      "this.query",
      "windows.get",
      "windows.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.rows.load.<callback>",
    "line": 177,
    "end": 177,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.json"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.json",
    "line": 182,
    "end": 189,
    "lines": 8,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "JSON.stringify",
      "button",
      "detailDialog",
      "document.body.append",
      "jsonView",
      "modal.append",
      "modal.remove",
      "modal.showModal",
      "navigator.clipboard.writeText",
      "node",
      "origin?.focus",
      "sourceUrl",
      "sources.append",
      "this.dialogs.add",
      "this.dialogs.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.json.<callback>",
    "line": 187,
    "end": 187,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "navigator.clipboard.writeText"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.json.<callback>",
    "line": 188,
    "end": 188,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "modal.remove",
      "origin?.focus",
      "this.dialogs.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.callHeader",
    "line": 190,
    "end": 190,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "header.append",
      "node",
      "root.prepend"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.callRow",
    "line": 191,
    "end": 207,
    "lines": 17,
    "language": "typescript",
    "branches": 13,
    "calls": [
      "(start!+duration!).toFixed",
      "(start+duration!).toFixed",
      "String",
      "button",
      "cell.append",
      "cell.classList.add",
      "cells.entries",
      "data.decode_ms.toFixed",
      "duration.toFixed",
      "explained",
      "node",
      "panel.append",
      "recordSamples",
      "row.append",
      "row.classList.add",
      "start!.toFixed",
      "start.toFixed",
      "this.audio",
      "this.closeWindow",
      "windowRange"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.callRow.<callback>",
    "line": 200,
    "end": 204,
    "lines": 5,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "(start!+duration!).toFixed",
      "button",
      "node",
      "panel.append",
      "row.append",
      "start!.toFixed",
      "this.audio",
      "this.closeWindow"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.callRow.<callback>.<callback>",
    "line": 202,
    "end": 202,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.closeWindow"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.closeWindow",
    "line": 208,
    "end": 214,
    "lines": 7,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "URL.revokeObjectURL",
      "this.audioUrls.delete",
      "this.audioUrls.get",
      "this.stopPlayers",
      "this.urls.filter",
      "this.windowPlayer.querySelector",
      "this.windowPlayer.querySelector('audio')?.pause",
      "this.windowPlayer.remove"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.closeWindow.<callback>",
    "line": 212,
    "end": 212,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.audio",
    "line": 215,
    "end": 240,
    "lines": 26,
    "language": "typescript",
    "branches": 33,
    "calls": [
      "(loaded/2/record.sample_rate).toFixed",
      "Math.ceil",
      "Math.floor",
      "Math.max",
      "Math.min",
      "Number.isInteger",
      "String",
      "URL.createObjectURL",
      "URL.revokeObjectURL",
      "active",
      "button",
      "decode",
      "digest",
      "document.createElement",
      "loading.update",
      "node",
      "parts.push",
      "peaks.push",
      "recordSamples",
      "root.append",
      "root.querySelector",
      "root.querySelector('audio')?.pause",
      "root.replaceChildren",
      "this.active",
      "this.audio",
      "this.audioLoads.get",
      "this.audioLoads.set",
      "this.audioUrls.delete",
      "this.audioUrls.get",
      "this.audioUrls.set",
      "this.loader",
      "this.players.set",
      "this.query",
      "this.stopPlayers",
      "this.streamAudio",
      "this.urls.filter",
      "this.urls.push",
      "view.getInt16",
      "wav",
      "wave.setAttribute",
      "waveformSelection"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.audio.active",
    "line": 218,
    "end": 218,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.active",
      "this.audioLoads.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.audio.<callback>",
    "line": 220,
    "end": 220,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.audio.<callback>",
    "line": 221,
    "end": 221,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "button",
      "node",
      "root.replaceChildren",
      "this.audio",
      "this.audioLoads.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.audio.<callback>.<callback>",
    "line": 221,
    "end": 221,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.audio"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.audio.<callback>",
    "line": 237,
    "end": 237,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.audio.<callback>",
    "line": 237,
    "end": 237,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.audio.<callback>",
    "line": 238,
    "end": 238,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.audio"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.audio.<callback>",
    "line": 239,
    "end": 239,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.audio"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.loader",
    "line": 241,
    "end": 245,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "(bytes/1024).toFixed",
      "(total/1024).toFixed",
      "Math.min",
      "Math.round",
      "box.append",
      "box.remove",
      "box.setAttribute",
      "button",
      "document.createElement",
      "node",
      "progress.removeAttribute",
      "progress.setAttribute",
      "root.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.loader.update",
    "line": 244,
    "end": 244,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "(bytes/1024).toFixed",
      "(total/1024).toFixed",
      "Math.min",
      "Math.round",
      "progress.removeAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.loader.done",
    "line": 244,
    "end": 244,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "box.remove"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.streamAudio",
    "line": 246,
    "end": 279,
    "lines": 34,
    "language": "typescript",
    "branches": 19,
    "calls": [
      "Math.ceil",
      "Math.floor",
      "Math.min",
      "Number.isSafeInteger",
      "String",
      "URL.createObjectURL",
      "URL.revokeObjectURL",
      "active",
      "button",
      "currentSeek",
      "decode",
      "digest",
      "document.createElement",
      "end.toFixed",
      "load",
      "load(0).catch",
      "load(position).catch",
      "loading.done",
      "node",
      "part.end.toFixed",
      "part.start.toFixed",
      "parts.push",
      "pending.done",
      "pending.update",
      "player.pause",
      "player.removeAttribute",
      "progress.append",
      "progress.querySelector",
      "progress.replaceChildren",
      "recordSamples",
      "release",
      "root.querySelector",
      "root.querySelector('audio')?.pause",
      "root.replaceChildren",
      "this.active",
      "this.audio",
      "this.audioLoads.get",
      "this.audioLoads.set",
      "this.audioUrls.delete",
      "this.audioUrls.get",
      "this.audioUrls.set",
      "this.loader",
      "this.players.set",
      "this.query",
      "this.stopPlayers",
      "this.streamAudio",
      "this.urls.filter",
      "this.urls.push",
      "this.waveforms.map",
      "wav",
      "waveformSelection"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.streamAudio.active",
    "line": 248,
    "end": 248,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.active",
      "this.audioLoads.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.streamAudio.release",
    "line": 250,
    "end": 250,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "URL.revokeObjectURL",
      "this.audioUrls.delete",
      "this.audioUrls.get",
      "this.urls.filter"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.streamAudio.release.<callback>",
    "line": 250,
    "end": 250,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.streamAudio.cancel",
    "line": 254,
    "end": 254,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "button",
      "node",
      "player.pause",
      "player.removeAttribute",
      "release",
      "root.replaceChildren",
      "this.audio",
      "this.audioLoads.set",
      "this.stopPlayers"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.streamAudio.cancel.<callback>",
    "line": 254,
    "end": 254,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.audio"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.streamAudio.load",
    "line": 256,
    "end": 272,
    "lines": 17,
    "language": "typescript",
    "branches": 13,
    "calls": [
      "Math.ceil",
      "Math.floor",
      "Math.min",
      "Number.isSafeInteger",
      "String",
      "URL.createObjectURL",
      "active",
      "button",
      "currentSeek",
      "decode",
      "digest",
      "end.toFixed",
      "load",
      "load(position).catch",
      "part.end.toFixed",
      "part.start.toFixed",
      "parts.push",
      "pending.done",
      "pending.update",
      "progress.append",
      "progress.replaceChildren",
      "recordSamples",
      "release",
      "this.audioUrls.set",
      "this.loader",
      "this.query",
      "this.urls.push",
      "wav"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.streamAudio.load.<callback>",
    "line": 256,
    "end": 256,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.streamAudio.load.<callback>",
    "line": 271,
    "end": 271,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "load",
      "load(position).catch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.streamAudio.load.<callback>.<callback>",
    "line": 271,
    "end": 271,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.streamAudio.<callback>",
    "line": 276,
    "end": 276,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.streamAudio.<callback>",
    "line": 276,
    "end": 276,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.streamAudio.<callback>",
    "line": 277,
    "end": 277,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.streamAudio.<callback>",
    "line": 278,
    "end": 278,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.streamAudio"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.diagnostics",
    "line": 280,
    "end": 298,
    "lines": 19,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "(this.span.end_16k!/16000).toFixed",
      "(this.span.start_16k!/16000).toFixed",
      "Boolean",
      "actions.append",
      "backend.append",
      "backend.setAttribute",
      "backendName",
      "button",
      "node",
      "previousUpdate",
      "results.replaceChildren",
      "root.append",
      "state.setAttribute",
      "this.cancel",
      "this.cancel().then",
      "this.closeWindow",
      "this.compare",
      "this.replayLog?.closest",
      "this.replayLog?.closest('details')?.remove",
      "this.replayProgress?.remove",
      "this.run",
      "this.run(backend.value,results,state,run,'phrase').finally",
      "updateScope"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.diagnostics.<callback>",
    "line": 286,
    "end": 289,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.closeWindow",
      "this.compare",
      "this.run",
      "this.run(backend.value,results,state,run,'phrase').finally",
      "updateScope"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.diagnostics.<callback>.<callback>",
    "line": 288,
    "end": 288,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "updateScope"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.diagnostics.updateScope",
    "line": 290,
    "end": 293,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "(this.span.end_16k!/16000).toFixed",
      "(this.span.start_16k!/16000).toFixed",
      "Boolean"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.diagnostics.<callback>",
    "line": 293,
    "end": 293,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "previousUpdate",
      "updateScope"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.diagnostics.<callback>",
    "line": 294,
    "end": 294,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.cancel",
      "this.cancel().then",
      "this.compare"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.diagnostics.<callback>.<callback>",
    "line": 294,
    "end": 294,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.diagnostics.<callback>",
    "line": 295,
    "end": 295,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "results.replaceChildren",
      "this.cancel",
      "this.closeWindow",
      "this.compare",
      "this.replayLog?.closest",
      "this.replayLog?.closest('details')?.remove",
      "this.replayProgress?.remove"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.compare",
    "line": 299,
    "end": 299,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "renderComparison"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.renderReplay",
    "line": 300,
    "end": 319,
    "lines": 20,
    "language": "typescript",
    "branches": 20,
    "calls": [
      "(this.span.available&&(span.end<=this.span.start_16k!||span.start>=this.span.end_16k!)?outside:inside).add",
      "Number.isSafeInteger",
      "['final','rejected','error'].includes",
      "[...mapped].reverse",
      "[...mapped].reverse().find",
      "counts.every",
      "counts.reduce",
      "failures.join",
      "inside.has",
      "mapped.filter",
      "matchReplay",
      "outside.has",
      "recognitionMilliseconds",
      "terminals.has",
      "terminals.set",
      "terminals.values",
      "texts.join",
      "this.compare",
      "this.replayEvents.map",
      "values.filter",
      "values.filter(d=>typeof d.text==='string').map",
      "values.filter(v=>v.result_type==='error').map",
      "values.filter(v=>v.result_type==='error').map(v=>v.code).filter",
      "values.map",
      "values.some",
      "windowRange"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.renderReplay.<callback>",
    "line": 302,
    "end": 302,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Number.isSafeInteger"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.renderReplay.<callback>",
    "line": 310,
    "end": 310,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "terminals.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.renderReplay.<callback>",
    "line": 311,
    "end": 311,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.renderReplay.<callback>",
    "line": 311,
    "end": 311,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.renderReplay.<callback>",
    "line": 312,
    "end": 312,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "terminals.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.renderReplay.<callback>",
    "line": 314,
    "end": 314,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.renderReplay.<callback>",
    "line": 314,
    "end": 314,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Number.isSafeInteger"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.renderReplay.<callback>",
    "line": 314,
    "end": 314,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.renderReplay.<callback>",
    "line": 316,
    "end": 316,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.renderReplay.<callback>",
    "line": 317,
    "end": 317,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.renderReplay.<callback>",
    "line": 317,
    "end": 317,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.log",
    "line": 320,
    "end": 326,
    "lines": 7,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "((performance.now()-this.replayStarted)/1000).toFixed",
      "button",
      "node",
      "performance.now",
      "row.append",
      "this.json",
      "this.replayLog.append",
      "this.replayLog.firstElementChild?.remove"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.log.<callback>",
    "line": 323,
    "end": 323,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.json"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.progress",
    "line": 327,
    "end": 327,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "((performance.now()-this.replayStarted)/1000).toFixed",
      "performance.now",
      "this.sentSeconds.toFixed",
      "this.totalSeconds.toFixed"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.run",
    "line": 328,
    "end": 354,
    "lines": 27,
    "language": "typescript",
    "branches": 10,
    "calls": [
      "(this.replayRoot??this.body).querySelectorAll",
      "backendName",
      "controls.forEach",
      "log.append",
      "node",
      "performance.now",
      "replayError",
      "results.replaceChildren",
      "state.after",
      "this.cancel",
      "this.compare",
      "this.control",
      "this.log",
      "this.poll",
      "this.progress",
      "this.renderReplay",
      "this.replayProgress.after",
      "this.replayRoot?.querySelector",
      "this.replayRoot?.querySelector('.audio-replay-log')?.remove",
      "this.replayRoot?.querySelector('.audio-replay-progress')?.remove",
      "this.wait"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.run.<callback>",
    "line": 331,
    "end": 331,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.run.<callback>",
    "line": 353,
    "end": 353,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.poll",
    "line": 355,
    "end": 363,
    "lines": 9,
    "language": "typescript",
    "branches": 14,
    "calls": [
      "JSON.stringify",
      "['expired','buffer_overflow','cancelled','error','failed'].includes",
      "d.decode_ms.toFixed",
      "d.queue_ms.toFixed",
      "replayError",
      "this.cancel",
      "this.compare",
      "this.control",
      "this.log",
      "this.progress",
      "this.renderReplay",
      "this.replayEvents.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.<callback>",
    "line": 364,
    "end": 364,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.cancel",
      "this.compare"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.wait",
    "line": 365,
    "end": 365,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "resolve",
      "window.clearTimeout",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.wait.<callback>",
    "line": 365,
    "end": 365,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "resolve",
      "window.clearTimeout",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.wait.<callback>.<callback>",
    "line": 365,
    "end": 365,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "resolve"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.wait.<callback>.<callback>",
    "line": 365,
    "end": 365,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "resolve",
      "window.clearTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.cancel",
    "line": 366,
    "end": 366,
    "lines": 1,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "r.wake",
      "this.control",
      "this.control('release',{replay_id:r.id}).catch",
      "this.log",
      "window.clearInterval"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.cancel.<callback>",
    "line": 366,
    "end": 366,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.stopPlayers",
    "line": 367,
    "end": 367,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "dispose",
      "root.contains",
      "this.players.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.close",
    "line": 368,
    "end": 368,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "URL.revokeObjectURL",
      "dialog.close",
      "dialog.remove",
      "document.removeEventListener",
      "player.pause",
      "this.cancel",
      "this.closeWindow",
      "this.dialogs.clear",
      "this.help",
      "this.root.querySelectorAll",
      "this.root.querySelectorAll('audio').forEach",
      "this.stopPlayers"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioArchive.ts",
    "name": "AudioArchive.close.<callback>",
    "line": 368,
    "end": 368,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "player.pause"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioMessage.ts",
    "name": "backendName",
    "line": 4,
    "end": 4,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioMessage.ts",
    "name": "seconds",
    "line": 5,
    "end": 5,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "value.toLocaleString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioMessage.ts",
    "name": "rangeSeconds",
    "line": 6,
    "end": 6,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioMessage.ts",
    "name": "rangeLabel",
    "line": 7,
    "end": 7,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "rangeSeconds",
      "seconds"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioMessage.ts",
    "name": "durationLabel",
    "line": 8,
    "end": 8,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "rangeSeconds",
      "seconds"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioMessage.ts",
    "name": "windowRange",
    "line": 9,
    "end": 12,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Number.isSafeInteger",
      "['source_start_samples','offset_samples','samples'].every"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioMessage.ts",
    "name": "windowRange.<callback>",
    "line": 10,
    "end": 10,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Number.isSafeInteger"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioMessage.ts",
    "name": "matchReplay",
    "line": 15,
    "end": 45,
    "lines": 31,
    "language": "typescript",
    "branches": 25,
    "calls": [
      "Math.max",
      "Math.min",
      "['final','rejected','error'].includes",
      "[...g.windows.keys()].sort",
      "[...g.windows.keys()].sort((a,b)=>a-b).some",
      "[...g.windows.values()].sort",
      "[...groups].filter",
      "batch.find",
      "events.filter",
      "events.some",
      "g.windows.has",
      "g.windows.keys",
      "g.windows.set",
      "g.windows.values",
      "groups.get",
      "groups.set",
      "rangeSeconds",
      "windowRange"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioMessage.ts",
    "name": "matchReplay.<callback>",
    "line": 17,
    "end": 17,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioMessage.ts",
    "name": "matchReplay.<callback>",
    "line": 20,
    "end": 20,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioMessage.ts",
    "name": "matchReplay.<callback>",
    "line": 30,
    "end": 30,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioMessage.ts",
    "name": "matchReplay.<callback>",
    "line": 34,
    "end": 34,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioMessage.ts",
    "name": "matchReplay.<callback>",
    "line": 35,
    "end": 35,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioMessage.ts",
    "name": "matchReplay.<callback>",
    "line": 35,
    "end": 35,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioMessage.ts",
    "name": "matchReplay.<callback>",
    "line": 43,
    "end": 43,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "['final','rejected','error'].includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.constructor",
    "line": 16,
    "end": 16,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.update",
    "line": 17,
    "end": 24,
    "lines": 8,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "backendName",
      "items.filter",
      "this.items.find",
      "this.items.some",
      "this.live?.select",
      "this.records.find",
      "this.renderList",
      "this.root.querySelector",
      "this.updateDurations",
      "this.view?.ended",
      "this.watch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.update.<callback>",
    "line": 18,
    "end": 18,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.update.<callback>",
    "line": 18,
    "end": 18,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.update.<callback>",
    "line": 19,
    "end": 19,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.update.<callback>",
    "line": 22,
    "end": 22,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.update.<callback>",
    "line": 22,
    "end": 22,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.setStatus",
    "line": 25,
    "end": 25,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.view?.setStatus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.refresh",
    "line": 26,
    "end": 32,
    "lines": 7,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Date.parse",
      "Math.max",
      "Math.min",
      "this.archive?.refresh",
      "this.more",
      "this.phrases?.refresh",
      "this.records.sort",
      "this.refreshSequence",
      "this.renderList",
      "this.root.querySelector"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.refresh.<callback>",
    "line": 31,
    "end": 31,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Date.parse"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.close",
    "line": 33,
    "end": 33,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.archive?.close",
      "this.live?.select",
      "this.phrases?.close",
      "this.sequence?.close",
      "this.view?.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.active",
    "line": 34,
    "end": 34,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.url",
    "line": 35,
    "end": 37,
    "lines": 3,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "objectUrl"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.link",
    "line": 38,
    "end": 38,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "element"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.watch",
    "line": 39,
    "end": 42,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.active",
      "this.live?.select",
      "this.view?.receive"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.watch.<callback>",
    "line": 41,
    "end": 41,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.active",
      "this.view?.receive"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.more",
    "line": 43,
    "end": 58,
    "lines": 16,
    "language": "typescript",
    "branches": 17,
    "calls": [
      "Number.isSafeInteger",
      "Promise.allSettled",
      "Promise.resolve",
      "String",
      "this.active",
      "this.errors.push",
      "this.read",
      "this.records.findIndex",
      "this.records.push",
      "this.renderList"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.more.<callback>",
    "line": 52,
    "end": 52,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.start",
    "line": 59,
    "end": 77,
    "lines": 19,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "String",
      "element",
      "history.replaceState",
      "new URLSearchParams(location.search).get",
      "normalizeLocation",
      "objectUrl",
      "this.active",
      "this.archive?.close",
      "this.detail",
      "this.list?.append",
      "this.live?.select",
      "this.more",
      "this.phrases?.close",
      "this.read",
      "this.renderList",
      "this.root.replaceChildren",
      "this.sequence?.close",
      "this.view?.close",
      "updateBreadcrumbs"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.record",
    "line": 78,
    "end": 84,
    "lines": 7,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "this.read",
      "this.records.find",
      "this.records.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.record.<callback>",
    "line": 79,
    "end": 79,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail",
    "line": 85,
    "end": 125,
    "lines": 41,
    "language": "typescript",
    "branches": 31,
    "calls": [
      "((r.samples??(r.format==='opus'?r.metadata?.samples??0:r.bytes/2))/r.sample_rate).toFixed",
      "Boolean",
      "Math.max",
      "Number.isSafeInteger",
      "Promise.reject",
      "String",
      "['noiseSuppression','echoCancellation','autoGainControl'].map",
      "['noiseSuppression','echoCancellation','autoGainControl'].map(k=>`${k}: ${requested[k]??'По умолчанию браузера'} / ${actual[k]??'Браузер не сообщил'}`).join",
      "backendName",
      "details.addEventListener",
      "details.append",
      "element",
      "entries.push",
      "entries.some",
      "events.body.replaceChildren",
      "id.slice",
      "identity.append",
      "incoming.push",
      "lazy",
      "live.body.append",
      "load",
      "load().then",
      "load().then(()=>{if(details.id===new URLSearchParams(location.search).get('section')&&this.active(g))revealSection(this.root);}).catch",
      "navigator.clipboard?.writeText",
      "new Date(item.created_at).toLocaleString",
      "new URLSearchParams(location.search).get",
      "record.catch",
      "revealSection",
      "section",
      "settings.append",
      "settingsBody.append",
      "settingsBody.replaceChildren",
      "source.body.replaceChildren",
      "this.active",
      "this.archive.showRecording",
      "this.items.find",
      "this.items.some",
      "this.live?.reconnect",
      "this.live?.select",
      "this.phrases.showMessages",
      "this.read",
      "this.record",
      "this.root.append",
      "this.root.replaceChildren",
      "this.sequence?.update",
      "this.view.ended",
      "this.view.setStatus",
      "this.view.setVisible",
      "this.view?.setVisible",
      "this.watch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.<callback>",
    "line": 86,
    "end": 86,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.<callback>",
    "line": 87,
    "end": 87,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "navigator.clipboard?.writeText"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.section",
    "line": 89,
    "end": 89,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "details.append",
      "element",
      "this.root.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.<callback>",
    "line": 91,
    "end": 91,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Promise.reject",
      "this.live?.reconnect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.<callback>",
    "line": 94,
    "end": 94,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.items.some",
      "this.live?.select",
      "this.view?.setVisible",
      "this.watch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.<callback>.<callback>",
    "line": 94,
    "end": 94,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.<callback>",
    "line": 95,
    "end": 95,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.lazy",
    "line": 97,
    "end": 97,
    "lines": 1,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "String",
      "details.addEventListener",
      "details.append",
      "element",
      "load",
      "load().then",
      "load().then(()=>{if(details.id===new URLSearchParams(location.search).get('section')&&this.active(g))revealSection(this.root);}).catch",
      "new URLSearchParams(location.search).get",
      "revealSection",
      "this.active"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.lazy.<callback>",
    "line": 97,
    "end": 97,
    "lines": 1,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "String",
      "details.append",
      "element",
      "load",
      "load().then",
      "load().then(()=>{if(details.id===new URLSearchParams(location.search).get('section')&&this.active(g))revealSection(this.root);}).catch",
      "new URLSearchParams(location.search).get",
      "revealSection",
      "this.active"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.lazy.<callback>.<callback>",
    "line": 97,
    "end": 97,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "new URLSearchParams(location.search).get",
      "revealSection",
      "this.active"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.lazy.<callback>.<callback>",
    "line": 97,
    "end": 97,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String",
      "details.append",
      "element",
      "this.active"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.<callback>",
    "line": 98,
    "end": 101,
    "lines": 4,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "['noiseSuppression','echoCancellation','autoGainControl'].map",
      "['noiseSuppression','echoCancellation','autoGainControl'].map(k=>`${k}: ${requested[k]??'По умолчанию браузера'} / ${actual[k]??'Браузер не сообщил'}`).join",
      "element",
      "new Date(item.created_at).toLocaleString",
      "settingsBody.append",
      "settingsBody.replaceChildren",
      "this.active",
      "this.read"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.<callback>.<callback>",
    "line": 99,
    "end": 99,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.<callback>",
    "line": 102,
    "end": 102,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.active",
      "this.phrases.showMessages"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.<callback>",
    "line": 103,
    "end": 117,
    "lines": 15,
    "language": "typescript",
    "branches": 12,
    "calls": [
      "Math.max",
      "Number.isSafeInteger",
      "String",
      "element",
      "entries.push",
      "entries.some",
      "events.body.replaceChildren",
      "incoming.push",
      "load",
      "new URLSearchParams(location.search).get",
      "this.active",
      "this.read",
      "this.sequence?.update"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.<callback>.<callback>",
    "line": 105,
    "end": 105,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.active"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.<callback>.load",
    "line": 107,
    "end": 116,
    "lines": 10,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "Math.max",
      "Number.isSafeInteger",
      "String",
      "entries.push",
      "entries.some",
      "incoming.push",
      "load",
      "new URLSearchParams(location.search).get",
      "this.active",
      "this.read",
      "this.sequence?.update"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.<callback>.load.<callback>",
    "line": 115,
    "end": 115,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.<callback>.<callback>",
    "line": 116,
    "end": 116,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "load"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.detail.<callback>.<callback>",
    "line": 116,
    "end": 116,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "load"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.renderList",
    "line": 126,
    "end": 162,
    "lines": 37,
    "language": "typescript",
    "branches": 31,
    "calls": [
      "Boolean",
      "Date.parse",
      "JSON.stringify",
      "Number",
      "Number.isFinite",
      "Number.isSafeInteger",
      "String",
      "[...all].filter",
      "[...all].map",
      "[...row.cells].forEach",
      "actions.append",
      "all.get",
      "all.set",
      "archived.append",
      "backendName",
      "body.append",
      "cell.append",
      "element",
      "grid",
      "head.append",
      "heading.append",
      "history.replaceState",
      "id.slice",
      "n.toFixed",
      "new URLSearchParams(location.search).get",
      "row.append",
      "seconds",
      "state.append",
      "table.append",
      "table.setAttribute",
      "thead.append",
      "this.items.map",
      "this.link",
      "this.list.append",
      "this.list.replaceChildren",
      "this.list?.append",
      "this.more",
      "this.more(this.generation).catch",
      "this.onStreams",
      "this.updateDurations",
      "this.url",
      "url.searchParams.delete",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.renderList.<callback>",
    "line": 127,
    "end": 127,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.renderList.<callback>",
    "line": 129,
    "end": 129,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "backendName",
      "id.slice"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.renderList.<callback>",
    "line": 130,
    "end": 130,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.renderList.<callback>",
    "line": 130,
    "end": 130,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.renderList.<callback>",
    "line": 135,
    "end": 135,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "history.replaceState",
      "url.searchParams.delete",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.renderList.grid",
    "line": 136,
    "end": 155,
    "lines": 20,
    "language": "typescript",
    "branches": 17,
    "calls": [
      "Boolean",
      "Date.parse",
      "Number",
      "Number.isFinite",
      "Number.isSafeInteger",
      "String",
      "[...row.cells].forEach",
      "actions.append",
      "backendName",
      "body.append",
      "cell.append",
      "element",
      "head.append",
      "id.slice",
      "n.toFixed",
      "row.append",
      "seconds",
      "state.append",
      "table.append",
      "table.setAttribute",
      "thead.append",
      "this.link",
      "this.url"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.renderList.grid.seconds",
    "line": 142,
    "end": 142,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Number.isFinite",
      "n.toFixed"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.renderList.grid.<callback>",
    "line": 153,
    "end": 153,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.renderList.<callback>",
    "line": 158,
    "end": 158,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String",
      "element",
      "this.list?.append",
      "this.more",
      "this.more(this.generation).catch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.renderList.<callback>.<callback>",
    "line": 158,
    "end": 158,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String",
      "element",
      "this.list?.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/audioStreams.ts",
    "name": "AudioStreams.updateDurations",
    "line": 163,
    "end": 166,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Date.now",
      "Math.max",
      "Math.max(0,(Date.now()-Number(cell.dataset.connectedAt))/1000).toFixed",
      "Number",
      "this.list?.querySelectorAll"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/detailDialog.ts",
    "name": "detailDialog",
    "line": 4,
    "end": 12,
    "lines": 9,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "dialog.addEventListener",
      "dialog.append",
      "dialog.close",
      "dialog.getBoundingClientRect",
      "dialog.setAttribute",
      "element",
      "origin.focus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/detailDialog.ts",
    "name": "detailDialog.<callback>",
    "line": 6,
    "end": 6,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "dialog.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/detailDialog.ts",
    "name": "detailDialog.<callback>",
    "line": 8,
    "end": 8,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/detailDialog.ts",
    "name": "detailDialog.<callback>",
    "line": 9,
    "end": 9,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "origin.focus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/detailDialog.ts",
    "name": "detailDialog.<callback>",
    "line": 10,
    "end": 10,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "dialog.close",
      "dialog.getBoundingClientRect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "messageKind",
    "line": 23,
    "end": 31,
    "lines": 9,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "String",
      "String(event.metadata.subject).endsWith",
      "String(event.metadata.subject||'').endsWith",
      "String(event.metadata.subject||'').startsWith",
      "['queued','ending','ended','admit','abort','job_error'].includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "protocol",
    "line": 32,
    "end": 32,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "isHttp",
    "line": 33,
    "end": 33,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "/^HTTP(?:\\/|$)/i.test",
      "protocol"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "protocolLabel",
    "line": 34,
    "end": 40,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "browser.includes",
      "gateway.includes",
      "isHttp",
      "protocol"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "address",
    "line": 41,
    "end": 44,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "String",
      "isHttp",
      "protocolLabel"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "participant",
    "line": 45,
    "end": 57,
    "lines": 13,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "Object.prototype.hasOwnProperty.call",
      "Object.values",
      "Object.values(services).find",
      "isHttp"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "participant.<callback>",
    "line": 47,
    "end": 47,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "browserToolResult",
    "line": 60,
    "end": 67,
    "lines": 8,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Array.isArray",
      "JSON.parse"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "savedCommand",
    "line": 69,
    "end": 72,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "/^chat\\.(?:ui|audio)\\.[^.]+\\.cmd\\.([^.]+)$/.exec",
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "explanation",
    "line": 74,
    "end": 129,
    "lines": 56,
    "language": "typescript",
    "branches": 29,
    "calls": [
      "/^chat\\.audio\\.[^.]+\\.cmd\\.phrase$/.test",
      "Array.isArray",
      "JSON.parse",
      "Object.prototype.hasOwnProperty.call",
      "String",
      "String(event.metadata.subject??'').startsWith",
      "browserToolResult",
      "messageKind",
      "savedCommand",
      "subject.endsWith",
      "subject.startsWith"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "messageLabel",
    "line": 130,
    "end": 154,
    "lines": 25,
    "language": "typescript",
    "branches": 14,
    "calls": [
      "/^chat\\.audio\\.[^.]+\\.cmd\\.phrase$/.test",
      "JSON.parse",
      "String",
      "['chat.internal.agent.widget','chat.browser.core'].includes",
      "event.label.startsWith",
      "messageKind",
      "savedCommand",
      "subject.endsWith",
      "subject.startsWith"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "participants",
    "line": 155,
    "end": 159,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "[...peers.values()].sort",
      "a.name.localeCompare",
      "participant",
      "peers.set",
      "peers.values"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "participants.<callback>",
    "line": 158,
    "end": 158,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "a.name.localeCompare"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "transitions",
    "line": 161,
    "end": 172,
    "lines": 12,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "String",
      "['send','response'].includes",
      "byId.get",
      "entries.filter",
      "entries.filter(event=>!receives.has(event.event_id)).map",
      "entries.map",
      "messageKind",
      "paired.get",
      "paired.has",
      "paired.set",
      "participant",
      "protocol",
      "receives.add",
      "receives.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "transitions.<callback>",
    "line": 162,
    "end": 162,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "transitions.<callback>",
    "line": 171,
    "end": 171,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "receives.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "transitions.<callback>",
    "line": 171,
    "end": 171,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "paired.get",
      "paired.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "sequencePositions",
    "line": 176,
    "end": 244,
    "lines": 69,
    "language": "typescript",
    "branches": 28,
    "calls": [
      "Array.isArray",
      "Date.parse",
      "Math.min",
      "Number.isFinite",
      "String",
      "['response','error'].includes",
      "['response','send'].includes",
      "['send','response','local','error'].includes",
      "ancestors",
      "ancestors(a.event_id).includes",
      "ancestors(b.event_id).includes",
      "ancestors(e.event_id).filter",
      "ancestors(r.event_id).map",
      "ancestors(r.event_id).map(id=>byId.get(id)!).find",
      "byId.get",
      "clock",
      "handlers.get",
      "handlers.has",
      "handlers.set",
      "histories.get",
      "histories.set",
      "items.filter",
      "items.map",
      "messageKind",
      "owners.get",
      "owners.set",
      "pa.parallel.push",
      "pa.parents.some",
      "parents.add",
      "participant",
      "pb.parallel.push",
      "pb.parents.includes",
      "pending.push",
      "positions.get",
      "request.observations.find",
      "response.observations.find",
      "result.push",
      "seen.add",
      "seen.has",
      "spans.get",
      "spans.has",
      "spans.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "sequencePositions.<callback>",
    "line": 179,
    "end": 179,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "sequencePositions.<callback>",
    "line": 188,
    "end": 188,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "sequencePositions.ancestors",
    "line": 190,
    "end": 195,
    "lines": 6,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "histories.get",
      "histories.set",
      "pending.push",
      "positions.get",
      "result.push",
      "seen.add",
      "seen.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "sequencePositions.<callback>",
    "line": 196,
    "end": 196,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "messageKind"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "sequencePositions.clock",
    "line": 199,
    "end": 201,
    "lines": 3,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "String",
      "['send','response','local','error'].includes",
      "participant"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "sequencePositions.<callback>",
    "line": 202,
    "end": 202,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "['response','error'].includes",
      "messageKind"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "sequencePositions.<callback>",
    "line": 204,
    "end": 204,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "byId.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "sequencePositions.<callback>",
    "line": 204,
    "end": 205,
    "lines": 2,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "messageKind",
      "participant"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "sequencePositions.<callback>",
    "line": 209,
    "end": 209,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "clock"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "sequencePositions.<callback>",
    "line": 210,
    "end": 210,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "clock"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "sequencePositions.<callback>",
    "line": 214,
    "end": 214,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "clock"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "sequencePositions.<callback>",
    "line": 215,
    "end": 215,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "['response','send'].includes",
      "clock"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "sequencePositions.<callback>",
    "line": 221,
    "end": 221,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "clock",
      "handlers.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "sequencePositions.<callback>",
    "line": 229,
    "end": 229,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "pb.parents.includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "sequencePositions.<callback>",
    "line": 240,
    "end": 240,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "clock",
      "handlers.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchangeModel.ts",
    "name": "originalEvent",
    "line": 245,
    "end": 252,
    "lines": 8,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "byId.get",
      "seen.add",
      "seen.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "node",
    "line": 12,
    "end": 14,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "document.createElement"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "selection",
    "line": 15,
    "end": 19,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Object.entries",
      "node",
      "select.append",
      "select.setAttribute",
      "text.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.<callback>",
    "line": 24,
    "end": 24,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.<callback>",
    "line": 25,
    "end": 25,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "clearTimeout",
      "this.changed"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor",
    "line": 49,
    "end": 111,
    "lines": 63,
    "language": "typescript",
    "branches": 27,
    "calls": [
      "/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test",
      "Boolean",
      "Date.now",
      "Math.max",
      "Number",
      "Number.isSafeInteger",
      "Object.entries",
      "String",
      "[...this.exchanges.querySelectorAll<HTMLButtonElement>('.exchange-open')].find",
      "advanced.append",
      "audioFilter.append",
      "audioFilter.setAttribute",
      "b.setAttribute",
      "back.setAttribute",
      "controls.addEventListener",
      "controls.append",
      "controls.replaceChildren",
      "crumbs.setAttribute",
      "document.addEventListener",
      "e.preventDefault",
      "encodeURIComponent",
      "event.preventDefault",
      "exchangeList.append",
      "exchangeList.insertBefore",
      "exchangeList.querySelector",
      "exchangeList.querySelector('.workbench-heading')!.append",
      "filters.forEach",
      "filtersPanel.append",
      "head.append",
      "header.append",
      "history.pushState",
      "history.replaceState",
      "interval.append",
      "list",
      "liveButton.setAttribute",
      "lookup.setAttribute",
      "lookup.value.trim",
      "lookupForm.append",
      "lookupForm.requestSubmit",
      "lookupStatus.append",
      "lookupStatus.replaceChildren",
      "mode.append",
      "mode.setAttribute",
      "new Date(Math.max(Date.now(),new Date(item.last_at).getTime()+1)).toISOString",
      "new Date(item.first_at).getTime",
      "new Date(item.first_at).toLocaleString",
      "new Date(item.last_at).getTime",
      "new Date(new Date(item.first_at).getTime()-1).toISOString",
      "new Date(since).toLocaleString",
      "new Date(until).toLocaleString",
      "node",
      "normalizeLocation",
      "objectUrl",
      "open",
      "params.get",
      "params.has",
      "pauseButton.setAttribute",
      "root.classList.add",
      "root.replaceChildren",
      "section.append",
      "section.setAttribute",
      "sidebar.append",
      "sidebar.setAttribute",
      "themeControl",
      "this.changed",
      "this.choose",
      "this.clearSelection",
      "this.details",
      "this.error",
      "this.exchanges.querySelectorAll",
      "this.inspector.append",
      "this.inspector.setAttribute",
      "this.interval.setAttribute",
      "this.live?.pause",
      "this.live?.reconnect",
      "this.live?.reconnect().catch",
      "this.liveStatus.append",
      "this.liveStatus.replaceChildren",
      "this.pages.setAttribute",
      "this.read",
      "this.read({action:'resolve_id',lookup_id:lookup.value.trim()}).then",
      "this.read({action:'resolve_id',lookup_id:lookup.value.trim()}).then(result=>{\n        if(this.closed)return;const matches=result.matches??[];lookupStatus.replaceChildren();\n        if(!matches.length){lookupStatus.textContent='ID не найден. Поиск выполнен по всей истории.';return;}\n        const open=(item:any)=>{const url=objectUrl(item.kind==='stream'?'stream':item.request_id?'request':'session',item.session_id,item.kind==='stream'?item.stream_id??lookup.value.trim():item.request_id,item.event_id?'execution':undefined);\n          if(item.operation_id&&!item.request_id&&item.kind==='event')url.searchParams.set('operation_id',item.operation_id);\n          if(item.event_id)url.searchParams.set('event_id',item.event_id);\n          const since=new Date(new Date(item.first_at).getTime()-1).toISOString(),until=new Date(Math.max(Date.now(),new Date(item.last_at).getTime()+1)).toISOString();\n          this.window={since,until,interval:this.interval.value};for(const [k,v]of Object.entries(this.window))url.searchParams.set(k,v);history.pushState(null,'',url);\n          this.view=item.kind==='stream'?'streams':'events';const existing=[...this.exchanges.querySelectorAll<HTMLButtonElement>('.exchange-open')].find(b=>b.dataset.sessionId===item.session_id),known=this.sessionPage?.sessions.find((s:Session)=>s.session_id===item.session_id);const selected=this.choose(existing??node('button'));this.renderNavigation();this.status.textContent='Поиск по ID · '+new Date(since).toLocaleString('ru-RU')+' — '+new Date(until).toLocaleString('ru-RU');\n          this.status.textContent='';void this.details({session_id:item.session_id,user_agent:known?.user_agent??null,profiles:[],events:0,incomplete:false,first_at:since,last_at:until},this.detail,this.generation,this.window,selected);\n        };\n        if(matches.length===1)open(matches[0]);else{lookupStatus.append(node('p','Найдено несколько связей. Выберите сессию:'));for(const item of matches){const button=node('button',`${item.kind} · ${item.session_id} · ${new Date(item.first_at).toLocaleString('ru-RU')}`);button.type='button';button.onclick=()=>open(item);lookupStatus.append(button);}}\n      }).catch",
      "this.read({action:'resolve_id',lookup_id:lookup.value.trim()}).then(result=>{\n        if(this.closed)return;const matches=result.matches??[];lookupStatus.replaceChildren();\n        if(!matches.length){lookupStatus.textContent='ID не найден. Поиск выполнен по всей истории.';return;}\n        const open=(item:any)=>{const url=objectUrl(item.kind==='stream'?'stream':item.request_id?'request':'session',item.session_id,item.kind==='stream'?item.stream_id??lookup.value.trim():item.request_id,item.event_id?'execution':undefined);\n          if(item.operation_id&&!item.request_id&&item.kind==='event')url.searchParams.set('operation_id',item.operation_id);\n          if(item.event_id)url.searchParams.set('event_id',item.event_id);\n          const since=new Date(new Date(item.first_at).getTime()-1).toISOString(),until=new Date(Math.max(Date.now(),new Date(item.last_at).getTime()+1)).toISOString();\n          this.window={since,until,interval:this.interval.value};for(const [k,v]of Object.entries(this.window))url.searchParams.set(k,v);history.pushState(null,'',url);\n          this.view=item.kind==='stream'?'streams':'events';const existing=[...this.exchanges.querySelectorAll<HTMLButtonElement>('.exchange-open')].find(b=>b.dataset.sessionId===item.session_id),known=this.sessionPage?.sessions.find((s:Session)=>s.session_id===item.session_id);const selected=this.choose(existing??node('button'));this.renderNavigation();this.status.textContent='Поиск по ID · '+new Date(since).toLocaleString('ru-RU')+' — '+new Date(until).toLocaleString('ru-RU');\n          this.status.textContent='';void this.details({session_id:item.session_id,user_agent:known?.user_agent??null,profiles:[],events:0,incomplete:false,first_at:since,last_at:until},this.detail,this.generation,this.window,selected);\n        };\n        if(matches.length===1)open(matches[0]);else{lookupStatus.append(node('p','Найдено несколько связей. Выберите сессию:'));for(const item of matches){const button=node('button',`${item.kind} · ${item.session_id} · ${new Date(item.first_at).toLocaleString('ru-RU')}`);button.type='button';button.onclick=()=>open(item);lookupStatus.append(button);}}\n      }).catch(e=>{if(!this.closed)lookupStatus.textContent=String(e);}).finally",
      "this.refresh.addEventListener",
      "this.reload",
      "this.renderNavigation",
      "this.resize",
      "this.root.classList.toggle",
      "this.sessionPage?.sessions.find",
      "this.streams?.setStatus",
      "this.streams?.update",
      "this.updateLiveSessions",
      "updateBreadcrumbs",
      "updateFilter",
      "updateMode",
      "url.searchParams.delete",
      "url.searchParams.set",
      "workspace.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>",
    "line": 64,
    "end": 64,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "lookupForm.requestSubmit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>",
    "line": 66,
    "end": 80,
    "lines": 15,
    "language": "typescript",
    "branches": 14,
    "calls": [
      "/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test",
      "Date.now",
      "Math.max",
      "Object.entries",
      "String",
      "[...this.exchanges.querySelectorAll<HTMLButtonElement>('.exchange-open')].find",
      "event.preventDefault",
      "history.pushState",
      "lookup.value.trim",
      "lookupStatus.append",
      "lookupStatus.replaceChildren",
      "new Date(Math.max(Date.now(),new Date(item.last_at).getTime()+1)).toISOString",
      "new Date(item.first_at).getTime",
      "new Date(item.first_at).toLocaleString",
      "new Date(item.last_at).getTime",
      "new Date(new Date(item.first_at).getTime()-1).toISOString",
      "new Date(since).toLocaleString",
      "new Date(until).toLocaleString",
      "node",
      "objectUrl",
      "open",
      "this.choose",
      "this.details",
      "this.exchanges.querySelectorAll",
      "this.read",
      "this.read({action:'resolve_id',lookup_id:lookup.value.trim()}).then",
      "this.read({action:'resolve_id',lookup_id:lookup.value.trim()}).then(result=>{\n        if(this.closed)return;const matches=result.matches??[];lookupStatus.replaceChildren();\n        if(!matches.length){lookupStatus.textContent='ID не найден. Поиск выполнен по всей истории.';return;}\n        const open=(item:any)=>{const url=objectUrl(item.kind==='stream'?'stream':item.request_id?'request':'session',item.session_id,item.kind==='stream'?item.stream_id??lookup.value.trim():item.request_id,item.event_id?'execution':undefined);\n          if(item.operation_id&&!item.request_id&&item.kind==='event')url.searchParams.set('operation_id',item.operation_id);\n          if(item.event_id)url.searchParams.set('event_id',item.event_id);\n          const since=new Date(new Date(item.first_at).getTime()-1).toISOString(),until=new Date(Math.max(Date.now(),new Date(item.last_at).getTime()+1)).toISOString();\n          this.window={since,until,interval:this.interval.value};for(const [k,v]of Object.entries(this.window))url.searchParams.set(k,v);history.pushState(null,'',url);\n          this.view=item.kind==='stream'?'streams':'events';const existing=[...this.exchanges.querySelectorAll<HTMLButtonElement>('.exchange-open')].find(b=>b.dataset.sessionId===item.session_id),known=this.sessionPage?.sessions.find((s:Session)=>s.session_id===item.session_id);const selected=this.choose(existing??node('button'));this.renderNavigation();this.status.textContent='Поиск по ID · '+new Date(since).toLocaleString('ru-RU')+' — '+new Date(until).toLocaleString('ru-RU');\n          this.status.textContent='';void this.details({session_id:item.session_id,user_agent:known?.user_agent??null,profiles:[],events:0,incomplete:false,first_at:since,last_at:until},this.detail,this.generation,this.window,selected);\n        };\n        if(matches.length===1)open(matches[0]);else{lookupStatus.append(node('p','Найдено несколько связей. Выберите сессию:'));for(const item of matches){const button=node('button',`${item.kind} · ${item.session_id} · ${new Date(item.first_at).toLocaleString('ru-RU')}`);button.type='button';button.onclick=()=>open(item);lookupStatus.append(button);}}\n      }).catch",
      "this.read({action:'resolve_id',lookup_id:lookup.value.trim()}).then(result=>{\n        if(this.closed)return;const matches=result.matches??[];lookupStatus.replaceChildren();\n        if(!matches.length){lookupStatus.textContent='ID не найден. Поиск выполнен по всей истории.';return;}\n        const open=(item:any)=>{const url=objectUrl(item.kind==='stream'?'stream':item.request_id?'request':'session',item.session_id,item.kind==='stream'?item.stream_id??lookup.value.trim():item.request_id,item.event_id?'execution':undefined);\n          if(item.operation_id&&!item.request_id&&item.kind==='event')url.searchParams.set('operation_id',item.operation_id);\n          if(item.event_id)url.searchParams.set('event_id',item.event_id);\n          const since=new Date(new Date(item.first_at).getTime()-1).toISOString(),until=new Date(Math.max(Date.now(),new Date(item.last_at).getTime()+1)).toISOString();\n          this.window={since,until,interval:this.interval.value};for(const [k,v]of Object.entries(this.window))url.searchParams.set(k,v);history.pushState(null,'',url);\n          this.view=item.kind==='stream'?'streams':'events';const existing=[...this.exchanges.querySelectorAll<HTMLButtonElement>('.exchange-open')].find(b=>b.dataset.sessionId===item.session_id),known=this.sessionPage?.sessions.find((s:Session)=>s.session_id===item.session_id);const selected=this.choose(existing??node('button'));this.renderNavigation();this.status.textContent='Поиск по ID · '+new Date(since).toLocaleString('ru-RU')+' — '+new Date(until).toLocaleString('ru-RU');\n          this.status.textContent='';void this.details({session_id:item.session_id,user_agent:known?.user_agent??null,profiles:[],events:0,incomplete:false,first_at:since,last_at:until},this.detail,this.generation,this.window,selected);\n        };\n        if(matches.length===1)open(matches[0]);else{lookupStatus.append(node('p','Найдено несколько связей. Выберите сессию:'));for(const item of matches){const button=node('button',`${item.kind} · ${item.session_id} · ${new Date(item.first_at).toLocaleString('ru-RU')}`);button.type='button';button.onclick=()=>open(item);lookupStatus.append(button);}}\n      }).catch(e=>{if(!this.closed)lookupStatus.textContent=String(e);}).finally",
      "this.renderNavigation",
      "this.sessionPage?.sessions.find",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>.<callback>",
    "line": 67,
    "end": 79,
    "lines": 13,
    "language": "typescript",
    "branches": 12,
    "calls": [
      "Date.now",
      "Math.max",
      "Object.entries",
      "[...this.exchanges.querySelectorAll<HTMLButtonElement>('.exchange-open')].find",
      "history.pushState",
      "lookup.value.trim",
      "lookupStatus.append",
      "lookupStatus.replaceChildren",
      "new Date(Math.max(Date.now(),new Date(item.last_at).getTime()+1)).toISOString",
      "new Date(item.first_at).getTime",
      "new Date(item.first_at).toLocaleString",
      "new Date(item.last_at).getTime",
      "new Date(new Date(item.first_at).getTime()-1).toISOString",
      "new Date(since).toLocaleString",
      "new Date(until).toLocaleString",
      "node",
      "objectUrl",
      "open",
      "this.choose",
      "this.details",
      "this.exchanges.querySelectorAll",
      "this.renderNavigation",
      "this.sessionPage?.sessions.find",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>.<callback>.open",
    "line": 70,
    "end": 77,
    "lines": 8,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "Date.now",
      "Math.max",
      "Object.entries",
      "[...this.exchanges.querySelectorAll<HTMLButtonElement>('.exchange-open')].find",
      "history.pushState",
      "lookup.value.trim",
      "new Date(Math.max(Date.now(),new Date(item.last_at).getTime()+1)).toISOString",
      "new Date(item.first_at).getTime",
      "new Date(item.last_at).getTime",
      "new Date(new Date(item.first_at).getTime()-1).toISOString",
      "new Date(since).toLocaleString",
      "new Date(until).toLocaleString",
      "node",
      "objectUrl",
      "this.choose",
      "this.details",
      "this.exchanges.querySelectorAll",
      "this.renderNavigation",
      "this.sessionPage?.sessions.find",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>.<callback>.open.<callback>",
    "line": 75,
    "end": 75,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>.<callback>.open.<callback>",
    "line": 75,
    "end": 75,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>.<callback>.<callback>",
    "line": 78,
    "end": 78,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "open"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>.<callback>",
    "line": 79,
    "end": 79,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>.<callback>",
    "line": 79,
    "end": 79,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>",
    "line": 81,
    "end": 81,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "e.preventDefault",
      "this.reload"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>",
    "line": 82,
    "end": 82,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.reload"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.list",
    "line": 83,
    "end": 87,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "head.append",
      "node",
      "section.append",
      "section.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.updateFilter",
    "line": 91,
    "end": 91,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Boolean",
      "String",
      "b.setAttribute",
      "filters.forEach"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.updateFilter.<callback>",
    "line": 91,
    "end": 91,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Boolean",
      "String",
      "b.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>",
    "line": 92,
    "end": 92,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Boolean",
      "history.replaceState",
      "this.updateLiveSessions",
      "updateFilter",
      "url.searchParams.delete",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>.<callback>",
    "line": 92,
    "end": 92,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Boolean",
      "history.replaceState",
      "this.updateLiveSessions",
      "updateFilter",
      "url.searchParams.delete",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.updateMode",
    "line": 99,
    "end": 99,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "liveButton.setAttribute",
      "pauseButton.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>",
    "line": 100,
    "end": 100,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "history.replaceState",
      "this.changed",
      "this.live?.pause",
      "updateMode",
      "url.searchParams.delete",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>",
    "line": 102,
    "end": 102,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "back.setAttribute",
      "this.root.classList.toggle"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>",
    "line": 109,
    "end": 109,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.streams?.update",
      "this.updateLiveSessions"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>",
    "line": 109,
    "end": 109,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "String",
      "node",
      "this.error",
      "this.live?.reconnect",
      "this.live?.reconnect().catch",
      "this.liveStatus.append",
      "this.liveStatus.replaceChildren",
      "this.streams?.setStatus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>.<callback>",
    "line": 109,
    "end": 109,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "this.error",
      "this.live?.reconnect",
      "this.live?.reconnect().catch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>.<callback>.<callback>",
    "line": 109,
    "end": 109,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "this.error"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.constructor.<callback>",
    "line": 109,
    "end": 109,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.changed"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.changed",
    "line": 113,
    "end": 123,
    "lines": 11,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "new URLSearchParams(location.search).get",
      "setTimeout",
      "this.reconcile"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.changed.<callback>",
    "line": 122,
    "end": 122,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.reconcile"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.reconcile",
    "line": 124,
    "end": 137,
    "lines": 14,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "Object.assign",
      "Object.entries",
      "Promise.all",
      "String",
      "history.replaceState",
      "new URLSearchParams(location.search).get",
      "setTimeout",
      "this.error",
      "this.filteredSessions",
      "this.interval.value.trim",
      "this.read",
      "this.reconcile",
      "this.renderSessions",
      "this.requests?.refresh",
      "this.streams?.refresh",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.reconcile.<callback>",
    "line": 136,
    "end": 136,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.reconcile"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.resize",
    "line": 138,
    "end": 150,
    "lines": 13,
    "language": "typescript",
    "branches": 10,
    "calls": [
      "Math.max",
      "Math.min",
      "Math.round",
      "Number",
      "String",
      "apply",
      "e.preventDefault",
      "handle.setAttribute",
      "handle.setPointerCapture",
      "localStorage.getItem",
      "localStorage.setItem",
      "window.addEventListener",
      "window.removeEventListener",
      "workspace.getBoundingClientRect",
      "workspace.style.setProperty"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.resize.apply",
    "line": 142,
    "end": 142,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Math.max",
      "Math.min",
      "Math.round",
      "String",
      "handle.setAttribute",
      "localStorage.setItem",
      "workspace.style.setProperty"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.resize.resized",
    "line": 143,
    "end": 143,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "apply"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.resize.<callback>",
    "line": 144,
    "end": 144,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "e.preventDefault",
      "handle.setPointerCapture"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.resize.<callback>",
    "line": 145,
    "end": 145,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "apply",
      "workspace.getBoundingClientRect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.resize.<callback>",
    "line": 146,
    "end": 146,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "apply"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.resize.<callback>",
    "line": 147,
    "end": 147,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "apply"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.resize.<callback>",
    "line": 148,
    "end": 148,
    "lines": 1,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "apply",
      "e.preventDefault"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.resize.<callback>",
    "line": 149,
    "end": 149,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "window.removeEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.reload",
    "line": 151,
    "end": 151,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.start"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.error",
    "line": 152,
    "end": 152,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.close",
    "line": 153,
    "end": 153,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "clearTimeout",
      "document.removeEventListener",
      "this.clearSelection",
      "this.disposeResize",
      "this.live?.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.clearSelection",
    "line": 154,
    "end": 160,
    "lines": 7,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "node",
      "this.detail.replaceChildren",
      "this.requests?.close",
      "this.root.classList.remove",
      "this.selected?.setAttribute",
      "this.services?.close",
      "this.streams?.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.choose",
    "line": 161,
    "end": 163,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "button.setAttribute",
      "this.clearSelection",
      "this.inspector.focus",
      "this.root.classList.add"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.active",
    "line": 164,
    "end": 164,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.renderNavigation",
    "line": 165,
    "end": 168,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "navigation",
      "this.navigation.replaceWith",
      "this.root.querySelector"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.start",
    "line": 169,
    "end": 194,
    "lines": 26,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "Object.entries",
      "String",
      "[...this.exchanges.querySelectorAll<HTMLButtonElement>('.exchange-open')].find",
      "data.sessions.find",
      "history.replaceState",
      "new URLSearchParams(location.search).get",
      "node",
      "resolveLink",
      "selectionParams.get",
      "selectionParams.has",
      "this.changed",
      "this.choose",
      "this.clearSelection",
      "this.details",
      "this.error",
      "this.exchanges.querySelectorAll",
      "this.exchanges.replaceChildren",
      "this.filteredSessions",
      "this.interval.value.trim",
      "this.pages.replaceChildren",
      "this.read",
      "this.renderNavigation",
      "this.renderSessions",
      "updateBreadcrumbs",
      "url.searchParams.delete",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.start.<callback>",
    "line": 188,
    "end": 188,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.start.<callback>",
    "line": 189,
    "end": 189,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.renderSessions",
    "line": 195,
    "end": 224,
    "lines": 30,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "Math.max",
      "String",
      "date.append",
      "dot.setAttribute",
      "history.pushState",
      "history.replaceState",
      "info.append",
      "meta.append",
      "new Date(session.first_at).toLocaleString",
      "new Date(session.last_at).toLocaleString",
      "new Date(session.last_at).toLocaleTimeString",
      "new URLSearchParams(location.search).get",
      "new URLSearchParams(location.search).has",
      "next.addEventListener",
      "next.setAttribute",
      "node",
      "objectUrl",
      "open.addEventListener",
      "open.append",
      "open.setAttribute",
      "previous.addEventListener",
      "previous.setAttribute",
      "this.choose",
      "this.details",
      "this.exchanges.append",
      "this.exchanges.replaceChildren",
      "this.liveStreams.some",
      "this.pages.append",
      "this.pages.replaceChildren",
      "this.root.classList.remove",
      "this.start"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.renderSessions.<callback>",
    "line": 204,
    "end": 204,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.renderSessions.<callback>",
    "line": 210,
    "end": 210,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "history.pushState",
      "history.replaceState",
      "objectUrl",
      "this.choose",
      "this.details",
      "this.root.classList.remove"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.renderSessions.<callback>",
    "line": 222,
    "end": 222,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Math.max",
      "this.start"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.renderSessions.<callback>",
    "line": 223,
    "end": 223,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.start"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.filteredSessions",
    "line": 225,
    "end": 230,
    "lines": 6,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "[...ids].map",
      "data.sessions.find",
      "ids.set",
      "new Date().toISOString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.filteredSessions.<callback>",
    "line": 228,
    "end": 228,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "data.sessions.find",
      "new Date().toISOString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.filteredSessions.<callback>.<callback>",
    "line": 228,
    "end": 228,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.updateLiveSessions",
    "line": 231,
    "end": 231,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "JSON.stringify",
      "this.filteredSessions",
      "this.liveStreams.map",
      "this.renderSessions"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.updateLiveSessions.<callback>",
    "line": 231,
    "end": 231,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.details",
    "line": 233,
    "end": 258,
    "lines": 26,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "info.append",
      "navigator.clipboard?.writeText",
      "node",
      "params.get",
      "params.has",
      "revealSection",
      "root.append",
      "root.replaceChildren",
      "session.session_id?.slice",
      "this.active",
      "this.filteredSessions",
      "this.renderSessions",
      "this.requests.start",
      "this.requests?.setStreams",
      "this.streams.start",
      "this.streams.update",
      "timeline.append",
      "updateBreadcrumbs"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.details.<callback>",
    "line": 242,
    "end": 242,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "navigator.clipboard?.writeText"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.details.<callback>",
    "line": 251,
    "end": 251,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.requests?.setStreams"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.details.<callback>",
    "line": 256,
    "end": 256,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.active"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/exchanges.ts",
    "name": "Exchanges.details.<callback>",
    "line": 256,
    "end": 256,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveSource.ts",
    "name": "MonitorLive.constructor",
    "line": 12,
    "end": 15,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "client.onStatus",
      "document.addEventListener",
      "this.schedule",
      "this.status"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveSource.ts",
    "name": "MonitorLive.constructor.<callback>",
    "line": 13,
    "end": 13,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.schedule",
      "this.status"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveSource.ts",
    "name": "MonitorLive.<callback>",
    "line": 16,
    "end": 16,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.schedule"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveSource.ts",
    "name": "MonitorLive.pause",
    "line": 17,
    "end": 17,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.schedule"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveSource.ts",
    "name": "MonitorLive.select",
    "line": 18,
    "end": 18,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.schedule"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveSource.ts",
    "name": "MonitorLive.schedule",
    "line": 19,
    "end": 46,
    "lines": 28,
    "language": "typescript",
    "branches": 17,
    "calls": [
      "Array.isArray",
      "JSON.parse",
      "frame.data.streams.filter",
      "handler",
      "listen",
      "stop",
      "this.chain.catch",
      "this.chain.catch(()=>undefined).then",
      "this.changed",
      "this.client.isConnected",
      "this.client.listenAudioLive",
      "this.disposers.push",
      "this.disposers.splice",
      "this.frame",
      "this.status",
      "this.streams"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveSource.ts",
    "name": "MonitorLive.schedule.<callback>",
    "line": 21,
    "end": 21,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveSource.ts",
    "name": "MonitorLive.schedule.<callback>",
    "line": 21,
    "end": 45,
    "lines": 25,
    "language": "typescript",
    "branches": 17,
    "calls": [
      "Array.isArray",
      "JSON.parse",
      "frame.data.streams.filter",
      "handler",
      "listen",
      "stop",
      "this.changed",
      "this.client.isConnected",
      "this.client.listenAudioLive",
      "this.disposers.push",
      "this.disposers.splice",
      "this.frame",
      "this.status",
      "this.streams"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveSource.ts",
    "name": "MonitorLive.schedule.<callback>.listen",
    "line": 27,
    "end": 36,
    "lines": 10,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "JSON.parse",
      "handler",
      "stop",
      "this.client.listenAudioLive",
      "this.disposers.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveSource.ts",
    "name": "MonitorLive.schedule.<callback>.listen.<callback>",
    "line": 28,
    "end": 34,
    "lines": 7,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "JSON.parse",
      "handler"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveSource.ts",
    "name": "MonitorLive.schedule.<callback>.<callback>",
    "line": 38,
    "end": 41,
    "lines": 4,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Array.isArray",
      "frame.data.streams.filter",
      "this.changed",
      "this.status",
      "this.streams"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveSource.ts",
    "name": "MonitorLive.schedule.<callback>.<callback>.<callback>",
    "line": 39,
    "end": 39,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveSource.ts",
    "name": "MonitorLive.schedule.<callback>.<callback>",
    "line": 42,
    "end": 42,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.frame"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveSource.ts",
    "name": "MonitorLive.reconnect",
    "line": 47,
    "end": 47,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.client.connect",
      "this.schedule"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveSource.ts",
    "name": "MonitorLive.close",
    "line": 48,
    "end": 48,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "document.removeEventListener",
      "stop",
      "this.disposers.splice",
      "this.removeStatus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveHistory.push",
    "line": 10,
    "end": 27,
    "lines": 18,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "Array.isArray",
      "Date.now",
      "Number.isSafeInteger",
      "Object.keys",
      "m.min_max.slice",
      "m.min_max.slice(0,32).flat",
      "this.points.push",
      "this.points.shift",
      "this.retired.add",
      "this.retired.delete",
      "this.retired.has",
      "this.retired.values",
      "this.retired.values().next"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.<callback>",
    "line": 36,
    "end": 36,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.setVisible"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.constructor",
    "line": 37,
    "end": 49,
    "lines": 13,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Number",
      "Object.values",
      "String",
      "canvas.setAttribute",
      "controls.append",
      "document.addEventListener",
      "element",
      "figure.append",
      "plots.append",
      "root.replaceChildren",
      "spectrum.append",
      "splots.append",
      "this.charts.push",
      "this.reconnect",
      "this.reconnect().catch",
      "this.reconnect().catch(e=>{this.status.textContent=String(e);}).finally",
      "this.spectra.clear",
      "this.spectrumCanvas.push",
      "this.tick",
      "window.append",
      "window.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.constructor.<callback>",
    "line": 39,
    "end": 39,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Number"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.constructor.<callback>",
    "line": 40,
    "end": 40,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.spectra.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.constructor.<callback>",
    "line": 41,
    "end": 41,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "this.reconnect",
      "this.reconnect().catch",
      "this.reconnect().catch(e=>{this.status.textContent=String(e);}).finally"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.constructor.<callback>.<callback>",
    "line": 41,
    "end": 41,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.constructor.<callback>.<callback>",
    "line": 41,
    "end": 41,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.setVisible",
    "line": 50,
    "end": 50,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "cancelAnimationFrame",
      "this.tick"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.setStatus",
    "line": 51,
    "end": 51,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.updateStatus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.updateStatus",
    "line": 52,
    "end": 61,
    "lines": 10,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "Date.now",
      "Object.entries",
      "Object.entries(stageNames).map",
      "Object.entries(stageNames).map(([key,name])=>`${name}: ${!current?.[key]?.observed?'нет PCM':current[key].silent?'цифровая тишина':typeof current[key].rms_dbfs==='number'?current[key].rms_dbfs.toFixed(1)+' dBFS':'нет данных'}`).join",
      "current[key].rms_dbfs.toFixed",
      "new Date(this.lastFrame).toLocaleTimeString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.updateStatus.<callback>",
    "line": 59,
    "end": 59,
    "lines": 1,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "current[key].rms_dbfs.toFixed"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.receive",
    "line": 62,
    "end": 73,
    "lines": 12,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "Date.now",
      "this.events.delete",
      "this.events.get",
      "this.events.keys",
      "this.events.keys().next",
      "this.events.set",
      "this.history.push",
      "this.showChannels",
      "this.showRecognition",
      "this.spectra.clear",
      "this.spectra.set",
      "this.updateStatus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.ended",
    "line": 74,
    "end": 74,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.spectra.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.json",
    "line": 75,
    "end": 79,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "JSON.stringify",
      "[row?.source,row?.target].includes",
      "audioSources.filter",
      "dialog.append",
      "dialog.close",
      "dialog.remove",
      "dialog.showModal",
      "document.body.append",
      "element",
      "jsonView",
      "navigator.clipboard.writeText",
      "this.dialogs.add",
      "this.dialogs.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.json.<callback>",
    "line": 77,
    "end": 77,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "navigator.clipboard.writeText"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.json.<callback>",
    "line": 77,
    "end": 77,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "dialog.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.json.<callback>",
    "line": 78,
    "end": 78,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "[row?.source,row?.target].includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.json.<callback>",
    "line": 78,
    "end": 78,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "dialog.remove",
      "this.dialogs.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.showRecognition",
    "line": 80,
    "end": 88,
    "lines": 9,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "[...this.events.values()].reverse",
      "element",
      "row.append",
      "this.events.values",
      "this.json",
      "this.recognition.append",
      "this.recognition.replaceChildren",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.showRecognition.<callback>",
    "line": 86,
    "end": 86,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.json"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.showChannels",
    "line": 89,
    "end": 95,
    "lines": 7,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "String",
      "data.append",
      "element",
      "head.append",
      "item.pcm_kbps.toFixed",
      "new Date(item.last_at_ms).toLocaleTimeString",
      "route.append",
      "row.append",
      "table.append",
      "thead.append",
      "this.channels.replaceChildren",
      "this.json"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.showChannels.<callback>",
    "line": 92,
    "end": 92,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.json"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.canvas",
    "line": 96,
    "end": 100,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Math.min",
      "Math.round",
      "canvas.getContext",
      "ctx.clearRect",
      "ctx.setTransform",
      "palette.getPropertyValue"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.draw",
    "line": 101,
    "end": 124,
    "lines": 24,
    "language": "typescript",
    "branches": 28,
    "calls": [
      "Math.max",
      "Math.min",
      "Number.isFinite",
      "Object.keys",
      "['--server','--client'].map",
      "canvas.closest",
      "ctx.beginPath",
      "ctx.fillRect",
      "ctx.fillText",
      "ctx.lineTo",
      "ctx.moveTo",
      "ctx.stroke",
      "getComputedStyle",
      "levels.forEach",
      "palette.getPropertyValue",
      "palette.getPropertyValue(name).trim",
      "points.map",
      "points.some",
      "this.canvas",
      "this.charts.forEach",
      "this.history.points.filter",
      "this.spectra.get",
      "this.spectrumCanvas.forEach",
      "v.toFixed",
      "x",
      "y"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.draw.<callback>",
    "line": 102,
    "end": 102,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "palette.getPropertyValue",
      "palette.getPropertyValue(name).trim"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.draw.<callback>",
    "line": 103,
    "end": 103,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.draw.<callback>",
    "line": 104,
    "end": 118,
    "lines": 15,
    "language": "typescript",
    "branches": 24,
    "calls": [
      "Math.max",
      "Math.min",
      "Number.isFinite",
      "Object.keys",
      "ctx.beginPath",
      "ctx.fillText",
      "ctx.lineTo",
      "ctx.moveTo",
      "ctx.stroke",
      "palette.getPropertyValue",
      "points.map",
      "points.some",
      "this.canvas",
      "v.toFixed",
      "x",
      "y"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.draw.<callback>.<callback>",
    "line": 106,
    "end": 106,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.draw.<callback>.<callback>",
    "line": 106,
    "end": 106,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.draw.<callback>.y",
    "line": 107,
    "end": 107,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.draw.<callback>.x",
    "line": 107,
    "end": 107,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.draw.<callback>.<callback>",
    "line": 117,
    "end": 117,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.draw.<callback>",
    "line": 119,
    "end": 123,
    "lines": 5,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Math.max",
      "Math.min",
      "Object.keys",
      "canvas.closest",
      "ctx.fillRect",
      "ctx.fillText",
      "levels.forEach",
      "palette.getPropertyValue",
      "this.canvas",
      "this.spectra.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.draw.<callback>.<callback>",
    "line": 122,
    "end": 122,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Math.max",
      "Math.min",
      "ctx.fillRect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.<callback>",
    "line": 125,
    "end": 125,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Date.now",
      "performance.now",
      "requestAnimationFrame",
      "this.draw",
      "this.updateStatus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/liveView.ts",
    "name": "LiveView.close",
    "line": 126,
    "end": 126,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "cancelAnimationFrame",
      "d.close",
      "document.removeEventListener",
      "this.dialogs.clear",
      "this.events.clear",
      "this.spectra.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/main.ts",
    "name": "remember",
    "line": 15,
    "end": 15,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "[...root.querySelectorAll<HTMLDetailsElement>('details[id][open]')].map",
      "history.replaceState",
      "root.querySelector",
      "root.querySelectorAll"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/main.ts",
    "name": "remember.<callback>",
    "line": 15,
    "end": 15,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/main.ts",
    "name": "route",
    "line": 16,
    "end": 22,
    "lines": 7,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "['/monitor','/monitor/changes'].includes",
      "active.start",
      "active.start().then",
      "history.state?.monitorSections?.includes",
      "location.pathname.replace",
      "monitorRead",
      "revealSection",
      "root.querySelector",
      "root.querySelectorAll",
      "view?.close",
      "window.scrollTo"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/main.ts",
    "name": "route.<callback>",
    "line": 21,
    "end": 21,
    "lines": 1,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "history.state?.monitorSections?.includes",
      "revealSection",
      "root.querySelector",
      "root.querySelectorAll",
      "window.scrollTo"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/main.ts",
    "name": "<callback>",
    "line": 23,
    "end": 31,
    "lines": 9,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "(event.target as HTMLElement).closest",
      "/^\\/monitor(?:\\/|$)/.test",
      "current.searchParams.delete",
      "current.searchParams.has",
      "event.preventDefault",
      "history.pushState",
      "history.replaceState",
      "remember",
      "revealSection",
      "route",
      "same.searchParams.delete",
      "updateBreadcrumbs",
      "url.searchParams.get",
      "url.searchParams.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/main.ts",
    "name": "<callback>",
    "line": 33,
    "end": 33,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "client.disconnect",
      "view?.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/main.ts",
    "name": "<callback>",
    "line": 34,
    "end": 34,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/message.ts",
    "name": "element",
    "line": 3,
    "end": 5,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "document.createElement"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/message.ts",
    "name": "parseJson",
    "line": 6,
    "end": 29,
    "lines": 24,
    "language": "typescript",
    "branches": 17,
    "calls": [
      "/\\s/.test",
      "JSON.parse",
      "fields.set",
      "items.push",
      "raw.slice",
      "raw.slice(start).match",
      "value",
      "whitespace"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/message.ts",
    "name": "parseJson.whitespace",
    "line": 8,
    "end": 8,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "/\\s/.test"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/message.ts",
    "name": "parseJson.value",
    "line": 9,
    "end": 27,
    "lines": 19,
    "language": "typescript",
    "branches": 15,
    "calls": [
      "JSON.parse",
      "fields.set",
      "items.push",
      "raw.slice",
      "raw.slice(start).match",
      "value",
      "whitespace"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/message.ts",
    "name": "jsonTokens",
    "line": 30,
    "end": 38,
    "lines": 9,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "/:\\s*$/.test",
      "/^(true|false|null)$/.test",
      "/^-?\\d/.test",
      "document.createTextNode",
      "element",
      "pre.append",
      "raw.match",
      "token.startsWith"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/message.ts",
    "name": "formatted",
    "line": 39,
    "end": 46,
    "lines": 8,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "'  '.repeat",
      "JSON.stringify",
      "entries.map",
      "entries.map(([key,entry])=>child+JSON.stringify(key)+': '+formatted(entry,depth+1)).join",
      "formatted",
      "value.items!.map",
      "value.items!.map(entry=>child+formatted(entry,depth+1)).join"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/message.ts",
    "name": "formatted.<callback>",
    "line": 42,
    "end": 42,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "JSON.stringify",
      "formatted"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/message.ts",
    "name": "formatted.<callback>",
    "line": 44,
    "end": 44,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "formatted"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/message.ts",
    "name": "jsonView",
    "line": 47,
    "end": 49,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "element",
      "formatted",
      "jsonTokens",
      "parseJson"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "element",
    "line": 9,
    "end": 11,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "document.createElement"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "reason",
    "line": 12,
    "end": 15,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "link",
    "line": 16,
    "end": 19,
    "lines": 4,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Object.entries",
      "element",
      "params.delete",
      "params.set",
      "params.toString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "TableView.constructor",
    "line": 32,
    "end": 48,
    "lines": 17,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "element",
      "info.append",
      "input.addEventListener",
      "input.setAttribute",
      "label.append",
      "link",
      "pages.append",
      "pages.setAttribute",
      "root.append",
      "root.insertBefore",
      "this.load",
      "this.more.addEventListener",
      "this.prev.addEventListener",
      "this.previous.pop",
      "this.previous.push",
      "title.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "TableView.constructor.<callback>",
    "line": 39,
    "end": 39,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.load"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "TableView.constructor.<callback>",
    "line": 45,
    "end": 45,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.load",
      "this.previous.pop"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "TableView.constructor.<callback>",
    "line": 46,
    "end": 46,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.load",
      "this.previous.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "TableView.close",
    "line": 49,
    "end": 49,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "TableView.load",
    "line": 50,
    "end": 85,
    "lines": 36,
    "language": "typescript",
    "branches": 23,
    "calls": [
      "/^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$/i.test",
      "JSON.parse",
      "body.append",
      "button.addEventListener",
      "button.setAttribute",
      "element",
      "grid.append",
      "head.append",
      "new URLSearchParams({...this.window,view:'audio',recording_id:audio.recording_id,session_id:audio.session_id}).toString",
      "objectUrl",
      "reason",
      "scalar",
      "td.append",
      "this.full",
      "this.grid.replaceChildren",
      "this.read",
      "titles.append",
      "tr.append",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "TableView.load.scalar",
    "line": 65,
    "end": 65,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "/^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$/i.test",
      "JSON.parse"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "TableView.load.<callback>",
    "line": 77,
    "end": 77,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.full"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "CellDialog.constructor",
    "line": 92,
    "end": 96,
    "lines": 5,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "element",
      "head.append",
      "this.root.addEventListener",
      "this.root.append",
      "this.root.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "CellDialog.constructor.<callback>",
    "line": 95,
    "end": 95,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "CellDialog.close",
    "line": 97,
    "end": 97,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.root.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "CellDialog.show",
    "line": 98,
    "end": 106,
    "lines": 9,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "Number.isInteger",
      "reason",
      "this.read",
      "this.root.querySelector",
      "this.root.showModal"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "Monitor.constructor",
    "line": 122,
    "end": 132,
    "lines": 11,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "controls.addEventListener",
      "controls.append",
      "element",
      "encodeURIComponent",
      "event.preventDefault",
      "header.append",
      "label.append",
      "params.get",
      "themeControl",
      "this.interval.setAttribute",
      "this.refresh.addEventListener",
      "this.root.replaceChildren",
      "this.start"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "Monitor.constructor.<callback>",
    "line": 129,
    "end": 129,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "event.preventDefault",
      "this.start"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "Monitor.constructor.<callback>",
    "line": 130,
    "end": 130,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.start"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "Monitor.start",
    "line": 133,
    "end": 157,
    "lines": 25,
    "language": "typescript",
    "branches": 15,
    "calls": [
      "Object.entries",
      "Promise.all",
      "a.setAttribute",
      "element",
      "history.replaceState",
      "navigation",
      "new Date(window.since).toLocaleString",
      "new Date(window.until).toLocaleString",
      "new URL(a.href).searchParams.has",
      "new URLSearchParams(location.search).get",
      "page.close",
      "page.load",
      "queue.shift",
      "reason",
      "tables.filter",
      "this.catalog",
      "this.cells.close",
      "this.cells.show",
      "this.content.append",
      "this.content.replaceChildren",
      "this.error",
      "this.interval.value.trim",
      "this.navigation.querySelectorAll",
      "this.navigation.replaceWith",
      "this.pages.forEach",
      "this.pages.push",
      "this.read",
      "this.root.querySelector",
      "url.searchParams.get",
      "url.searchParams.set",
      "worker"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "Monitor.start.<callback>",
    "line": 135,
    "end": 135,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "page.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "Monitor.start.<callback>",
    "line": 143,
    "end": 143,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "Monitor.start.<callback>",
    "line": 148,
    "end": 148,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "url.searchParams.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "Monitor.start.<callback>",
    "line": 152,
    "end": 152,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.cells.show"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "Monitor.start.worker",
    "line": 153,
    "end": 153,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "page.load",
      "queue.shift"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "Monitor.catalog",
    "line": 158,
    "end": 165,
    "lines": 8,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "String",
      "body.append",
      "element",
      "grid.append",
      "head.append",
      "link",
      "name.append",
      "this.content.append",
      "titles.append",
      "tr.append",
      "wrap.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "Monitor.error",
    "line": 166,
    "end": 166,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "Monitor.close",
    "line": 167,
    "end": 167,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "page.close",
      "this.cells.close",
      "this.pages.forEach"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/monitor.ts",
    "name": "Monitor.close.<callback>",
    "line": 167,
    "end": 167,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "page.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/navigation.ts",
    "name": "objectUrl",
    "line": 7,
    "end": 16,
    "lines": 10,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "url.searchParams.delete",
      "url.searchParams.get",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/navigation.ts",
    "name": "normalizeLocation",
    "line": 18,
    "end": 29,
    "lines": 12,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "['lanes','events'].includes",
      "history.replaceState",
      "p.delete",
      "p.get",
      "p.has",
      "p.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/navigation.ts",
    "name": "navigation",
    "line": 30,
    "end": 36,
    "lines": 7,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "base.searchParams.get",
      "base.searchParams.has",
      "element",
      "link.setAttribute",
      "nav.append",
      "nav.setAttribute",
      "objectUrl"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/navigation.ts",
    "name": "updateBreadcrumbs",
    "line": 37,
    "end": 47,
    "lines": 11,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "add",
      "element",
      "item.setAttribute",
      "nav.append",
      "nav.replaceChildren",
      "objectUrl",
      "p.get",
      "p.get('request_id')!.slice",
      "p.get('stream_id')!.slice",
      "p.has",
      "root.closest",
      "root.closest('.monitor-workbench')?.querySelector",
      "session.slice"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/navigation.ts",
    "name": "updateBreadcrumbs.add",
    "line": 40,
    "end": 40,
    "lines": 1,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "element",
      "item.setAttribute",
      "nav.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/navigation.ts",
    "name": "revealSection",
    "line": 48,
    "end": 55,
    "lines": 8,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "[...root.querySelectorAll<HTMLElement>('[id]')].find",
      "new URLSearchParams(location.search).get",
      "root.querySelectorAll",
      "target.querySelector",
      "target.scrollIntoView"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/navigation.ts",
    "name": "revealSection.<callback>",
    "line": 50,
    "end": 50,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requestOverview.ts",
    "name": "requestOverview",
    "line": 12,
    "end": 79,
    "lines": 68,
    "language": "typescript",
    "branches": 30,
    "calls": [
      "(header===root?root:header.parentElement??root).append",
      "(value/1000).toLocaleString",
      "JSON.parse",
      "JSON.stringify",
      "Number.isFinite",
      "Number.isSafeInteger",
      "['rejected','error'].includes",
      "action",
      "active",
      "appendRequestError",
      "appendRequestTrace",
      "appendTimings",
      "asrOutcomeText",
      "asrOutcomeTitle",
      "card.append",
      "content.append",
      "detailActions.append",
      "detailDialog",
      "element",
      "errors.map",
      "head.append",
      "header.append",
      "header.replaceChildren",
      "jsonView",
      "measurements.append",
      "open",
      "panel.addEventListener",
      "panel.append",
      "panel.querySelector",
      "panel.remove",
      "panel.showModal",
      "raw.append",
      "read",
      "readDiagnostic",
      "readError",
      "readTimings",
      "render",
      "rendered.get",
      "rendered.set",
      "result.append",
      "root.append",
      "root.replaceChildren",
      "row.append",
      "table.append",
      "tools.some",
      "tools?.filter",
      "tools?.filter(t=>!t.parent_id||!tools.some(p=>p.id===t.parent_id)).reduce",
      "url.searchParams.set",
      "value.toFixed",
      "values.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requestOverview.ts",
    "name": "requestOverview.<callback>",
    "line": 23,
    "end": 23,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requestOverview.ts",
    "name": "requestOverview.open",
    "line": 26,
    "end": 29,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "(header===root?root:header.parentElement??root).append",
      "active",
      "detailDialog",
      "element",
      "panel.addEventListener",
      "panel.append",
      "panel.remove",
      "panel.showModal",
      "render"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requestOverview.ts",
    "name": "requestOverview.open.<callback>",
    "line": 28,
    "end": 28,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "panel.remove"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requestOverview.ts",
    "name": "requestOverview.action",
    "line": 30,
    "end": 32,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "element",
      "open"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requestOverview.ts",
    "name": "requestOverview.action.<callback>",
    "line": 31,
    "end": 31,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "open"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requestOverview.ts",
    "name": "requestOverview.<callback>",
    "line": 34,
    "end": 34,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "jsonView",
      "panel.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requestOverview.ts",
    "name": "requestOverview.<callback>",
    "line": 38,
    "end": 38,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requestOverview.ts",
    "name": "requestOverview.<callback>",
    "line": 46,
    "end": 46,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "tools.some"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requestOverview.ts",
    "name": "requestOverview.<callback>.<callback>",
    "line": 46,
    "end": 46,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requestOverview.ts",
    "name": "requestOverview.<callback>",
    "line": 46,
    "end": 46,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requestOverview.ts",
    "name": "requestOverview.<callback>",
    "line": 53,
    "end": 70,
    "lines": 18,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "JSON.stringify",
      "Number.isFinite",
      "appendTimings",
      "element",
      "head.append",
      "jsonView",
      "panel.append",
      "panel.querySelector",
      "raw.append",
      "row.append",
      "table.append",
      "value.toFixed"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requestOverview.ts",
    "name": "requestOverview.<callback>",
    "line": 71,
    "end": 76,
    "lines": 6,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "JSON.stringify",
      "appendRequestError",
      "appendRequestTrace",
      "jsonView",
      "panel.append",
      "panel.querySelector",
      "readDiagnostic",
      "readError"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requestOverview.ts",
    "name": "requestOverview.<callback>",
    "line": 77,
    "end": 77,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "JSON.stringify",
      "jsonView",
      "panel.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "duration",
    "line": 19,
    "end": 19,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "(ms/1000).toLocaleString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "offset",
    "line": 20,
    "end": 20,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Number",
      "Number.isSafeInteger"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.setStreams",
    "line": 33,
    "end": 33,
    "lines": 1,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "element",
      "items.some",
      "new URLSearchParams(location.search).get",
      "option",
      "select.append",
      "select.replaceChildren",
      "selected.slice",
      "this.root.querySelector"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.setStreams.option",
    "line": 33,
    "end": 33,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "element",
      "select.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.setStreams.<callback>",
    "line": 33,
    "end": 33,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.constructor",
    "line": 36,
    "end": 36,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.close",
    "line": 37,
    "end": 37,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "d.close",
      "this.archive?.close",
      "this.disposeHelp",
      "this.root.querySelectorAll",
      "this.root.querySelectorAll<HTMLDialogElement>('dialog').forEach",
      "this.sequence?.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.close.<callback>",
    "line": 37,
    "end": 37,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "d.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.active",
    "line": 38,
    "end": 38,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.query",
    "line": 39,
    "end": 41,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.read"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.url",
    "line": 42,
    "end": 42,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "objectUrl"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.remember",
    "line": 43,
    "end": 48,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "history.replaceState",
      "new URL(location.href).searchParams.has",
      "this.root.closest"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.navigate",
    "line": 49,
    "end": 53,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "history.pushState",
      "history.replaceState",
      "this.remember",
      "this.root.closest",
      "this.start",
      "url.searchParams.get",
      "url.searchParams.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.link",
    "line": 54,
    "end": 57,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "element"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.button",
    "line": 58,
    "end": 60,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "b.addEventListener",
      "element"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.copy",
    "line": 61,
    "end": 65,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "navigator.clipboard?.writeText",
      "navigator.clipboard?.writeText(value()).then",
      "this.button",
      "value"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.copy.<callback>",
    "line": 62,
    "end": 64,
    "lines": 3,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "navigator.clipboard?.writeText",
      "navigator.clipboard?.writeText(value()).then",
      "value"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.copy.<callback>.<callback>",
    "line": 62,
    "end": 64,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.copy.<callback>.<callback>",
    "line": 64,
    "end": 64,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.start",
    "line": 66,
    "end": 88,
    "lines": 23,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "(params.get('request_search')??'').slice",
      "Object.prototype.hasOwnProperty.call",
      "String",
      "['','transcription','command'].includes",
      "['newest','oldest','duration'].includes",
      "controlTooltip",
      "d.close",
      "offset",
      "params.get",
      "this.active",
      "this.archive?.close",
      "this.body.append",
      "this.body.replaceChildren",
      "this.button",
      "this.detail",
      "this.disposeHelp",
      "this.list",
      "this.root.classList.add",
      "this.root.querySelectorAll",
      "this.root.querySelectorAll<HTMLDialogElement>('dialog').forEach",
      "this.root.replaceChildren",
      "this.sequence?.close",
      "this.showList",
      "this.start",
      "updateBreadcrumbs"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.start.<callback>",
    "line": 67,
    "end": 67,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "d.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.start.<callback>",
    "line": 86,
    "end": 86,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.start"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.stateLabel",
    "line": 89,
    "end": 92,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "['rejected','error'].includes",
      "asrOutcomeTitle",
      "element"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.title",
    "line": 93,
    "end": 96,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String",
      "element",
      "head.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.filters",
    "line": 97,
    "end": 115,
    "lines": 19,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Object.entries",
      "Object.fromEntries",
      "control.append",
      "control.setAttribute",
      "e.preventDefault",
      "element",
      "form.addEventListener",
      "form.append",
      "label.append",
      "new URLSearchParams(location.search).get",
      "search.setAttribute",
      "search.value.trim",
      "select",
      "selected.slice",
      "stream.append",
      "this.navigate",
      "this.streams.map",
      "this.streams.some",
      "this.url",
      "url.searchParams.delete",
      "url.searchParams.set",
      "wrap.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.filters.select",
    "line": 101,
    "end": 104,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Object.entries",
      "control.append",
      "control.setAttribute",
      "element",
      "form.append",
      "wrap.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.filters.<callback>",
    "line": 106,
    "end": 106,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.filters.<callback>",
    "line": 107,
    "end": 107,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.filters.<callback>",
    "line": 109,
    "end": 114,
    "lines": 6,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "e.preventDefault",
      "search.value.trim",
      "this.navigate",
      "this.url",
      "url.searchParams.delete",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.grid",
    "line": 116,
    "end": 137,
    "lines": 22,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "Number.isFinite",
      "String",
      "String(d.getMilliseconds()).padStart",
      "['rejected','error'].includes",
      "asrOutcomeText",
      "audio.searchParams.set",
      "card.append",
      "clock",
      "command.searchParams.set",
      "d.getMilliseconds",
      "d.getTime",
      "d.toLocaleTimeString",
      "diagram.searchParams.set",
      "duration",
      "element",
      "head.append",
      "links.append",
      "list.append",
      "list.setAttribute",
      "objectUrl",
      "this.link",
      "this.stateLabel",
      "this.url",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.grid.clock",
    "line": 122,
    "end": 122,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Number.isFinite",
      "String",
      "String(d.getMilliseconds()).padStart",
      "d.getMilliseconds",
      "d.getTime",
      "d.toLocaleTimeString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.pagination",
    "line": 138,
    "end": 143,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Math.max",
      "element",
      "move",
      "nav.append",
      "nav.setAttribute",
      "parent.append",
      "this.button"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.pagination.<callback>",
    "line": 141,
    "end": 141,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Math.max",
      "move"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.pagination.<callback>",
    "line": 141,
    "end": 141,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "move"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.list",
    "line": 144,
    "end": 153,
    "lines": 10,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "JSON.stringify",
      "clear.searchParams.delete",
      "element",
      "filter.append",
      "new URLSearchParams(location.search).get",
      "stream.slice",
      "this.active",
      "this.body.append",
      "this.filters",
      "this.link",
      "this.query",
      "this.renderPage",
      "this.root.closest",
      "this.title",
      "this.url"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.renderPage",
    "line": 154,
    "end": 162,
    "lines": 9,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Array.from",
      "Array.from(this.listRows.querySelectorAll<HTMLElement>('[data-request-id]')).find",
      "String",
      "anchor?.getBoundingClientRect",
      "el.getBoundingClientRect",
      "element",
      "next.getBoundingClientRect",
      "scroller?.getBoundingClientRect",
      "this.grid",
      "this.listHead?.querySelector",
      "this.listRows.querySelectorAll",
      "this.listRows.replaceChildren",
      "this.navigate",
      "this.pagination",
      "this.root.closest",
      "this.url",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.renderPage.<callback>",
    "line": 156,
    "end": 156,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "el.getBoundingClientRect",
      "scroller?.getBoundingClientRect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.renderPage.<callback>",
    "line": 160,
    "end": 160,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "this.navigate",
      "this.url",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.renderPage.<callback>",
    "line": 161,
    "end": 161,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.refresh",
    "line": 163,
    "end": 171,
    "lines": 9,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "JSON.stringify",
      "new URLSearchParams(location.search).get",
      "new URLSearchParams(location.search).has",
      "this.active",
      "this.archive?.refresh",
      "this.query",
      "this.refreshResult",
      "this.refreshSequence",
      "this.renderPage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.showOperation",
    "line": 172,
    "end": 172,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.execution",
      "this.root.replaceChildren"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.detail",
    "line": 173,
    "end": 204,
    "lines": 32,
    "language": "typescript",
    "branches": 20,
    "calls": [
      "(e.target as HTMLElement).closest",
      "Boolean",
      "String",
      "['ArrowLeft','ArrowRight','Home','End'].includes",
      "['phrase','evaluation'].includes",
      "actions.append",
      "b.setAttribute",
      "button.setAttribute",
      "choices.findIndex",
      "choices.some",
      "dataPanel.append",
      "diagnostics.append",
      "e.preventDefault",
      "element",
      "history.replaceState",
      "new URLSearchParams(location.search).get",
      "panel.setAttribute",
      "panels.append",
      "params.get",
      "params.has",
      "phrase.append",
      "positions.get",
      "positions.set",
      "readTimings",
      "requestOverview",
      "revealSection",
      "select",
      "tabs.append",
      "tabs.querySelector",
      "tabs.querySelector<HTMLButtonElement>('[data-section=\"'+choices[next][0]+'\"]')!.focus",
      "tabs.querySelectorAll",
      "tabs.setAttribute",
      "this.active",
      "this.archive.start",
      "this.body.append",
      "this.button",
      "this.context",
      "this.copy",
      "this.execution",
      "this.link",
      "this.root.closest",
      "this.sequence?.setTools",
      "this.url",
      "updateBreadcrumbs",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.detail.<callback>",
    "line": 178,
    "end": 178,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "select"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.detail.<callback>",
    "line": 179,
    "end": 179,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.detail.<callback>",
    "line": 179,
    "end": 179,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.detail.<callback>",
    "line": 181,
    "end": 181,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.active"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.detail.<callback>",
    "line": 182,
    "end": 182,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "new URLSearchParams(location.search).get",
      "readTimings",
      "requestOverview",
      "this.active",
      "this.sequence?.setTools"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.detail.<callback>.<callback>",
    "line": 182,
    "end": 182,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.active"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.detail.select",
    "line": 192,
    "end": 198,
    "lines": 7,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "String",
      "button.setAttribute",
      "history.replaceState",
      "positions.get",
      "positions.set",
      "readTimings",
      "tabs.querySelector",
      "this.execution",
      "updateBreadcrumbs",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.detail.<callback>",
    "line": 199,
    "end": 199,
    "lines": 1,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "(e.target as HTMLElement).closest",
      "['ArrowLeft','ArrowRight','Home','End'].includes",
      "choices.findIndex",
      "e.preventDefault",
      "select",
      "tabs.querySelector",
      "tabs.querySelector<HTMLButtonElement>('[data-section=\"'+choices[next][0]+'\"]')!.focus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.detail.<callback>.<callback>",
    "line": 199,
    "end": 199,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.detail.<callback>",
    "line": 201,
    "end": 201,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.execution",
    "line": 205,
    "end": 222,
    "lines": 18,
    "language": "typescript",
    "branches": 15,
    "calls": [
      "Math.max",
      "Number.isSafeInteger",
      "String",
      "[...warnings].join",
      "element",
      "entries.push",
      "entries.some",
      "incoming.push",
      "load",
      "new URLSearchParams(location.search).get",
      "revealSection",
      "root.append",
      "this.active",
      "this.button",
      "this.query",
      "this.sequence?.update",
      "warnings.add"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.execution.<callback>",
    "line": 207,
    "end": 207,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "load"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.execution.<callback>",
    "line": 208,
    "end": 208,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.active"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.execution.load",
    "line": 209,
    "end": 221,
    "lines": 13,
    "language": "typescript",
    "branches": 12,
    "calls": [
      "Math.max",
      "Number.isSafeInteger",
      "String",
      "[...warnings].join",
      "entries.push",
      "entries.some",
      "incoming.push",
      "load",
      "new URLSearchParams(location.search).get",
      "revealSection",
      "this.active",
      "this.query",
      "this.sequence?.update",
      "warnings.add"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.execution.load.<callback>",
    "line": 219,
    "end": 219,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/requests.ts",
    "name": "SessionRequests.execution.<callback>",
    "line": 221,
    "end": 221,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "load"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionOperations.ts",
    "name": "SessionOperations.constructor",
    "line": 10,
    "end": 31,
    "lines": 22,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "Math.max",
      "Number",
      "Number.isSafeInteger",
      "String",
      "body.append",
      "body.replaceChildren",
      "details.addEventListener",
      "details.append",
      "e.preventDefault",
      "element",
      "history.pushState",
      "history.replaceState",
      "load",
      "locationUrl.searchParams.delete",
      "locationUrl.searchParams.set",
      "nav.append",
      "new Date(item.started_at).toLocaleTimeString",
      "new URLSearchParams(location.search).get",
      "objectUrl",
      "read",
      "root.append",
      "row.append",
      "this.open",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionOperations.ts",
    "name": "SessionOperations.constructor.load",
    "line": 13,
    "end": 28,
    "lines": 16,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "Math.max",
      "String",
      "body.append",
      "body.replaceChildren",
      "e.preventDefault",
      "element",
      "history.pushState",
      "history.replaceState",
      "load",
      "locationUrl.searchParams.delete",
      "locationUrl.searchParams.set",
      "nav.append",
      "new Date(item.started_at).toLocaleTimeString",
      "objectUrl",
      "read",
      "row.append",
      "this.open",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionOperations.ts",
    "name": "SessionOperations.constructor.load.<callback>",
    "line": 20,
    "end": 20,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "e.preventDefault",
      "history.pushState",
      "this.open"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionOperations.ts",
    "name": "SessionOperations.constructor.load.<callback>",
    "line": 26,
    "end": 26,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Math.max",
      "load"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionOperations.ts",
    "name": "SessionOperations.constructor.load.<callback>",
    "line": 26,
    "end": 26,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "load"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionOperations.ts",
    "name": "SessionOperations.constructor.load.<callback>",
    "line": 27,
    "end": 27,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "load"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionOperations.ts",
    "name": "SessionOperations.constructor.<callback>",
    "line": 29,
    "end": 29,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "load"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionOperations.ts",
    "name": "SessionOperations.open",
    "line": 32,
    "end": 36,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "detailDialog",
      "element",
      "history.replaceState",
      "panel.addEventListener",
      "panel.append",
      "panel.remove",
      "panel.showModal",
      "this.panel?.remove",
      "this.root.append",
      "this.view.showOperation",
      "this.view?.close",
      "url.searchParams.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionOperations.ts",
    "name": "SessionOperations.open.<callback>",
    "line": 34,
    "end": 34,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "history.replaceState",
      "panel.remove",
      "this.view?.close",
      "url.searchParams.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionOperations.ts",
    "name": "SessionOperations.close",
    "line": 37,
    "end": 37,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.panel?.remove",
      "this.view?.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "time",
    "line": 10,
    "end": 11,
    "lines": 2,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Date.parse",
      "Number.isFinite",
      "String",
      "String(new Date(value).getMilliseconds()).padStart",
      "new Date(value).getMilliseconds",
      "new Date(value).toLocaleTimeString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "Bodies.constructor",
    "line": 19,
    "end": 19,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "Bodies.close",
    "line": 20,
    "end": 20,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "start",
      "this.cache.clear",
      "this.waiting.splice"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "Bodies.load",
    "line": 21,
    "end": 33,
    "lines": 13,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Promise.resolve",
      "pending.catch",
      "reject",
      "start",
      "this.active",
      "this.cache.delete",
      "this.cache.get",
      "this.cache.set",
      "this.readBody",
      "this.readBody(event).then",
      "this.readBody(event).then(resolve,reject).finally",
      "this.waiting.push",
      "this.waiting.shift",
      "this.waiting.shift()"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "Bodies.load.<callback>",
    "line": 24,
    "end": 31,
    "lines": 8,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "reject",
      "start",
      "this.active",
      "this.readBody",
      "this.readBody(event).then",
      "this.readBody(event).then(resolve,reject).finally",
      "this.waiting.push",
      "this.waiting.shift",
      "this.waiting.shift()"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "Bodies.load.<callback>.start",
    "line": 25,
    "end": 29,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "reject",
      "this.active",
      "this.readBody",
      "this.readBody(event).then",
      "this.readBody(event).then(resolve,reject).finally",
      "this.waiting.shift",
      "this.waiting.shift()"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "Bodies.load.<callback>.start.<callback>",
    "line": 28,
    "end": 28,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.waiting.shift",
      "this.waiting.shift()"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "Bodies.load.<callback>",
    "line": 32,
    "end": 32,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.cache.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "Bodies.readBody",
    "line": 34,
    "end": 44,
    "lines": 11,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Number.isInteger",
      "this.active",
      "this.read"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.constructor",
    "line": 69,
    "end": 88,
    "lines": 20,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "(root.closest('.request-panels')??root).querySelector",
      "Object.assign",
      "Object.entries",
      "Object.fromEntries",
      "[...node.options].some",
      "active",
      "controlTooltip",
      "e.preventDefault",
      "element",
      "entries.map",
      "node.append",
      "node.setAttribute",
      "params.get",
      "participants",
      "root.append",
      "root.classList.add",
      "root.closest",
      "select",
      "sequencePositions",
      "this.clearDetail",
      "this.closeDetail",
      "this.controls.append",
      "this.detail.setAttribute",
      "this.filtered",
      "this.filtered().some",
      "this.peers.map",
      "this.render",
      "this.restorePeer",
      "this.revealEvent",
      "this.save",
      "this.search.setAttribute",
      "this.setView",
      "transitions",
      "workspace.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.constructor.<callback>",
    "line": 70,
    "end": 70,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.constructor.<callback>",
    "line": 71,
    "end": 71,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "active"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.constructor.select",
    "line": 74,
    "end": 76,
    "lines": 3,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Object.assign",
      "Object.entries",
      "[...node.options].some",
      "element",
      "node.append",
      "node.setAttribute",
      "params.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.constructor.select.<callback>",
    "line": 75,
    "end": 75,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.constructor.<callback>",
    "line": 77,
    "end": 77,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.constructor.<callback>",
    "line": 81,
    "end": 81,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.setView"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.constructor.<callback>",
    "line": 81,
    "end": 81,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.setView"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.constructor.<callback>",
    "line": 83,
    "end": 83,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "e.preventDefault",
      "this.clearDetail",
      "this.filtered",
      "this.filtered().some",
      "this.render",
      "this.save"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.constructor.<callback>.<callback>",
    "line": 83,
    "end": 83,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.constructor.<callback>",
    "line": 85,
    "end": 85,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "(root.closest('.request-panels')??root).querySelector",
      "e.preventDefault",
      "root.closest",
      "this.closeDetail"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.close",
    "line": 89,
    "end": 89,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.bodies.close",
      "this.detail.replaceChildren",
      "this.disposeHelp"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.setTools",
    "line": 90,
    "end": 90,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.render"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.update",
    "line": 91,
    "end": 100,
    "lines": 10,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "entries.map",
      "new URLSearchParams(location.search).get",
      "participants",
      "sequencePositions",
      "this.clearDetail",
      "this.render",
      "this.restorePeer",
      "this.revealEvent",
      "this.selectedFacts",
      "this.show",
      "this.transfers.find",
      "this.transfers.some",
      "transitions"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.update.<callback>",
    "line": 94,
    "end": 94,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.update.<callback>",
    "line": 95,
    "end": 95,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.update.<callback>",
    "line": 98,
    "end": 98,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.selectedFacts",
    "line": 101,
    "end": 104,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "JSON.stringify",
      "originalEvent",
      "this.positions.get",
      "this.transfers.find"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.selectedFacts.<callback>",
    "line": 102,
    "end": 102,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.restorePeer",
    "line": 105,
    "end": 111,
    "lines": 7,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Object.assign",
      "element",
      "entries.find",
      "participant",
      "this.peer.append",
      "this.peer.replaceChildren",
      "this.peers.some"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.restorePeer.<callback>",
    "line": 106,
    "end": 106,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.restorePeer.<callback>",
    "line": 110,
    "end": 110,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.save",
    "line": 112,
    "end": 117,
    "lines": 6,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "history.replaceState",
      "this.search.value.trim",
      "url.searchParams.delete",
      "url.searchParams.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.filtered",
    "line": 118,
    "end": 122,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "[...t.observations.map(o=>o.event_id),e.request_id,e.label,messageLabel(e),participant(e,'source').name,participant(e,'source').label,participant(e,'target').name,participant(e,'target').label,address(e),e.content?.json,e.content?.preview].filter",
      "[...t.observations.map(o=>o.event_id),e.request_id,e.label,messageLabel(e),participant(e,'source').name,participant(e,'source').label,participant(e,'target').name,participant(e,'target').label,address(e),e.content?.json,e.content?.preview].filter(Boolean).join",
      "[...t.observations.map(o=>o.event_id),e.request_id,e.label,messageLabel(e),participant(e,'source').name,participant(e,'source').label,participant(e,'target').name,participant(e,'target').label,address(e),e.content?.json,e.content?.preview].filter(Boolean).join(' ').toLocaleLowerCase",
      "[...t.observations.map(o=>o.event_id),e.request_id,e.label,messageLabel(e),participant(e,'source').name,participant(e,'source').label,participant(e,'target').name,participant(e,'target').label,address(e),e.content?.json,e.content?.preview].filter(Boolean).join(' ').toLocaleLowerCase().includes",
      "[participant(e,'source').id,participant(e,'target').id].includes",
      "address",
      "items.reverse",
      "messageKind",
      "messageLabel",
      "participant",
      "t.observations.map",
      "this.search.value.trim",
      "this.search.value.trim().toLocaleLowerCase",
      "this.tools?.some",
      "this.transfers.filter"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.filtered.<callback>",
    "line": 120,
    "end": 120,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "[...t.observations.map(o=>o.event_id),e.request_id,e.label,messageLabel(e),participant(e,'source').name,participant(e,'source').label,participant(e,'target').name,participant(e,'target').label,address(e),e.content?.json,e.content?.preview].filter",
      "[...t.observations.map(o=>o.event_id),e.request_id,e.label,messageLabel(e),participant(e,'source').name,participant(e,'source').label,participant(e,'target').name,participant(e,'target').label,address(e),e.content?.json,e.content?.preview].filter(Boolean).join",
      "[...t.observations.map(o=>o.event_id),e.request_id,e.label,messageLabel(e),participant(e,'source').name,participant(e,'source').label,participant(e,'target').name,participant(e,'target').label,address(e),e.content?.json,e.content?.preview].filter(Boolean).join(' ').toLocaleLowerCase",
      "[...t.observations.map(o=>o.event_id),e.request_id,e.label,messageLabel(e),participant(e,'source').name,participant(e,'source').label,participant(e,'target').name,participant(e,'target').label,address(e),e.content?.json,e.content?.preview].filter(Boolean).join(' ').toLocaleLowerCase().includes",
      "[participant(e,'source').id,participant(e,'target').id].includes",
      "address",
      "messageKind",
      "messageLabel",
      "participant",
      "t.observations.map",
      "this.tools?.some"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.filtered.<callback>.<callback>",
    "line": 120,
    "end": 120,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.filtered.<callback>.<callback>",
    "line": 120,
    "end": 120,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.setView",
    "line": 123,
    "end": 123,
    "lines": 1,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "this.detail.querySelector",
      "this.render",
      "this.save",
      "this.scrollSelection"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.revealEvent",
    "line": 124,
    "end": 129,
    "lines": 6,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "t.observations.some",
      "this.content.querySelector",
      "this.content.querySelector<HTMLElement>('[data-event-id].is-target-event')?.focus",
      "this.detail.contains",
      "this.render",
      "this.save",
      "this.scrollSelection",
      "this.show",
      "this.transfers.find"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.revealEvent.<callback>",
    "line": 125,
    "end": 125,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "t.observations.some"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.revealEvent.<callback>.<callback>",
    "line": 125,
    "end": 125,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.scrollSelection",
    "line": 130,
    "end": 137,
    "lines": 8,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "row.getBoundingClientRect",
      "row.querySelector",
      "row.querySelector('.lane-arrow')?.getBoundingClientRect",
      "this.content.getBoundingClientRect",
      "this.content.querySelector"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.clearDetail",
    "line": 138,
    "end": 138,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.detail.replaceChildren",
      "this.save"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.closeDetail",
    "line": 139,
    "end": 142,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "(this.view==='lanes'?row:row?.querySelector<HTMLElement>('button'))?.focus",
      "[...this.content.querySelectorAll<HTMLElement>('[data-event-id]')].find",
      "row?.querySelector",
      "this.clearDetail",
      "this.content.querySelectorAll",
      "this.render"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.closeDetail.<callback>",
    "line": 140,
    "end": 140,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.render",
    "line": 143,
    "end": 155,
    "lines": 13,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "(focusIndex>=0?row?.querySelectorAll<HTMLElement>('button,[tabindex]')[focusIndex]:row)?.focus",
      "String",
      "[...owner.querySelectorAll<HTMLElement>('button,[tabindex]')].indexOf",
      "[...this.content.querySelectorAll<HTMLElement>('[data-event-id]')].find",
      "element",
      "focused?.closest",
      "items.filter",
      "messageKind",
      "owner.querySelectorAll",
      "row?.querySelectorAll",
      "t.observations.some",
      "this.content.append",
      "this.content.contains",
      "this.content.querySelectorAll",
      "this.content.replaceChildren",
      "this.diagram.setAttribute",
      "this.filtered",
      "this.journal.setAttribute",
      "this.lanes",
      "this.row",
      "this.tools.filter",
      "this.tools.filter(t=>t.outcome==='error').map"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.render.<callback>",
    "line": 149,
    "end": 149,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "t.observations.some"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.render.<callback>.<callback>",
    "line": 149,
    "end": 149,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.render.<callback>",
    "line": 150,
    "end": 150,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.render.<callback>",
    "line": 150,
    "end": 150,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.render.<callback>",
    "line": 154,
    "end": 154,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.endpoint",
    "line": 156,
    "end": 165,
    "lines": 10,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "Date.parse",
      "Number.isFinite",
      "Object.assign",
      "String",
      "['send','response'].includes",
      "element",
      "explanation",
      "participant",
      "protocolLabel",
      "result.append",
      "t.observations.find",
      "time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.endpoint.<callback>",
    "line": 157,
    "end": 157,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String",
      "['send','response'].includes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.route",
    "line": 166,
    "end": 173,
    "lines": 8,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "element",
      "participant",
      "route.append",
      "route.classList.add",
      "this.endpoint",
      "this.peers.findIndex"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.route.<callback>",
    "line": 167,
    "end": 167,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "participant"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.route.<callback>",
    "line": 167,
    "end": 167,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "participant"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.number",
    "line": 174,
    "end": 174,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "element",
      "this.positions.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.relation",
    "line": 175,
    "end": 179,
    "lines": 5,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "p.parallel.map",
      "p.parallel.map(id=>this.positions.get(id)!.number).join",
      "this.positions.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.relation.<callback>",
    "line": 178,
    "end": 178,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.positions.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.row",
    "line": 180,
    "end": 194,
    "lines": 15,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "(event.target as Element).closest",
      "Math.max",
      "String",
      "['Enter',' '].includes",
      "actions.append",
      "address",
      "details.setAttribute",
      "element",
      "event.preventDefault",
      "messageKind",
      "messageLabel",
      "meta.append",
      "protocolLabel",
      "row.append",
      "row.classList.toggle",
      "row.setAttribute",
      "row.style.setProperty",
      "seen.add",
      "seen.has",
      "this.number",
      "this.positions.get",
      "this.relation",
      "this.revealEvent",
      "this.route",
      "this.tools?.find",
      "title.append",
      "window.getSelection",
      "window.getSelection()?.toString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.row.<callback>",
    "line": 182,
    "end": 182,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "['Enter',' '].includes",
      "event.preventDefault",
      "this.revealEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.row.<callback>",
    "line": 183,
    "end": 183,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.row.<callback>",
    "line": 185,
    "end": 185,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.row.<callback>",
    "line": 187,
    "end": 187,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "(event.target as Element).closest",
      "this.revealEvent",
      "window.getSelection",
      "window.getSelection()?.toString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.row.<callback>",
    "line": 188,
    "end": 188,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.revealEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.row.<callback>",
    "line": 191,
    "end": 191,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.revealEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.row.<callback>",
    "line": 192,
    "end": 192,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.revealEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.lanes",
    "line": 195,
    "end": 206,
    "lines": 12,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Boolean",
      "Math.abs",
      "Math.min",
      "String",
      "[participant(selected,'source').id,participant(selected,'target').id].includes",
      "actors.append",
      "b.append",
      "b.classList.add",
      "b.classList.toggle",
      "b.setAttribute",
      "b.style.setProperty",
      "chart.append",
      "chart.style.setProperty",
      "element",
      "lines.append",
      "messageKind",
      "messageLabel",
      "participant",
      "this.content.append",
      "this.number",
      "this.peers.findIndex",
      "this.revealEvent",
      "this.showPeer",
      "this.transfers.find"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.lanes.<callback>",
    "line": 197,
    "end": 197,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.lanes.<callback>",
    "line": 198,
    "end": 198,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.showPeer"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.lanes.<callback>",
    "line": 200,
    "end": 200,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.lanes.<callback>",
    "line": 200,
    "end": 200,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.lanes.<callback>",
    "line": 204,
    "end": 204,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.revealEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.detailHead",
    "line": 207,
    "end": 211,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "element",
      "head.append",
      "this.closeDetail",
      "this.detail.replaceChildren"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.detailHead.<callback>",
    "line": 209,
    "end": 209,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.closeDetail"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.showPeer",
    "line": 212,
    "end": 216,
    "lines": 5,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "element",
      "messageLabel",
      "participant",
      "this.detail.append",
      "this.detailHead",
      "this.filtered",
      "this.filtered().filter",
      "this.revealEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.showPeer.<callback>",
    "line": 215,
    "end": 215,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "participant"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.showPeer.<callback>",
    "line": 215,
    "end": 215,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.revealEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.show",
    "line": 217,
    "end": 268,
    "lines": 52,
    "language": "typescript",
    "branches": 36,
    "calls": [
      "Array.isArray",
      "Date.parse",
      "JSON.parse",
      "String",
      "[...this.detail.querySelectorAll<HTMLDetailsElement>('details[data-section]')].filter",
      "[...this.detail.querySelectorAll<HTMLDetailsElement>('details[data-section]')].filter(d=>d.open).map",
      "[...this.detail.querySelectorAll<HTMLTimeElement>('.transfer-endpoint time')].map",
      "address",
      "body.prepend",
      "body.replaceChildren",
      "details.append",
      "element",
      "expanded.includes",
      "explanation",
      "info.append",
      "jsonView",
      "links.append",
      "listing.append",
      "messageKind",
      "messageLabel",
      "navigator.clipboard?.writeText",
      "navigator.clipboard?.writeText(raw).then",
      "navigator.clipboard?.writeText(raw).then(()=>{if(version===this.version)copy.textContent='Скопировано';}).catch",
      "next.parents.includes",
      "originalEvent",
      "p.received.received_mono_ms.toFixed",
      "p.sent.sent_mono_ms.toFixed",
      "protocolLabel",
      "related",
      "restore",
      "row.append",
      "t.observations.every",
      "table.append",
      "thead.append",
      "this.active",
      "this.bodies.load",
      "this.byId.get",
      "this.detail.append",
      "this.detail.querySelector",
      "this.detail.querySelectorAll",
      "this.detailHead",
      "this.endpoint",
      "this.endpoint(t,'source').querySelector",
      "this.endpoint(t,'target').querySelector",
      "this.filtered",
      "this.filtered().some",
      "this.positions.get",
      "this.relation",
      "this.revealEvent",
      "this.route",
      "this.show"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.show.<callback>",
    "line": 219,
    "end": 219,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.show.<callback>",
    "line": 219,
    "end": 219,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.show.restore",
    "line": 220,
    "end": 220,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "expanded.includes",
      "this.detail.querySelectorAll"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.show.<callback>",
    "line": 222,
    "end": 222,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.revealEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.show.related",
    "line": 226,
    "end": 226,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "element",
      "links.append",
      "this.revealEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.show.related.<callback>",
    "line": 226,
    "end": 226,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.revealEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.show.<callback>",
    "line": 234,
    "end": 234,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.show.<callback>",
    "line": 235,
    "end": 235,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.revealEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.show.<callback>",
    "line": 238,
    "end": 238,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.show.<callback>",
    "line": 248,
    "end": 248,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.show.<callback>",
    "line": 255,
    "end": 255,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "navigator.clipboard?.writeText",
      "navigator.clipboard?.writeText(raw).then",
      "navigator.clipboard?.writeText(raw).then(()=>{if(version===this.version)copy.textContent='Скопировано';}).catch"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.show.<callback>.<callback>",
    "line": 255,
    "end": 255,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.show.<callback>.<callback>",
    "line": 255,
    "end": 255,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sessionSequence.ts",
    "name": "SessionSequence.show.<callback>",
    "line": 267,
    "end": 267,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.show"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sourceLinks.ts",
    "name": "sourceUrl",
    "line": 29,
    "end": 31,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "ref.path.split",
      "ref.path.split('/').map",
      "ref.path.split('/').map(encodeURIComponent).join"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sourceLinks.ts",
    "name": "sourceLinks",
    "line": 32,
    "end": 60,
    "lines": 29,
    "language": "typescript",
    "branches": 20,
    "calls": [
      "String",
      "['chat.browser.core','chat.internal.agent.widget'].includes",
      "['widget','web'].includes",
      "add",
      "isHttp",
      "links.push",
      "subject.includes",
      "subject.startsWith"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/sourceLinks.ts",
    "name": "sourceLinks.add",
    "line": 33,
    "end": 33,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "links.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/theme.ts",
    "name": "themeControl",
    "line": 2,
    "end": 13,
    "lines": 12,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "String",
      "button.setAttribute",
      "document.createElement",
      "localStorage.setItem",
      "sync",
      "window.dispatchEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/theme.ts",
    "name": "themeControl.sync",
    "line": 5,
    "end": 5,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "String",
      "button.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/theme.ts",
    "name": "themeControl.<callback>",
    "line": 6,
    "end": 11,
    "lines": 6,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "localStorage.setItem",
      "sync",
      "window.dispatchEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection",
    "line": 2,
    "end": 85,
    "lines": 84,
    "language": "typescript",
    "branches": 44,
    "calls": [
      "(right-left).toFixed",
      "Math.abs",
      "Math.max",
      "Math.min",
      "Number.isFinite",
      "Promise.resolve",
      "String",
      "['ArrowLeft','ArrowRight','Home','End'].includes",
      "active",
      "cancelled",
      "clamp",
      "clearBoundary",
      "clearTimeout",
      "color",
      "controls.append",
      "controls.remove",
      "ctx.beginPath",
      "ctx.clearRect",
      "ctx.fillRect",
      "ctx.lineTo",
      "ctx.moveTo",
      "ctx.stroke",
      "current",
      "document.createElement",
      "draw",
      "e.preventDefault",
      "finish",
      "getComputedStyle",
      "lifetime.abort",
      "load",
      "loaded",
      "metadata",
      "on",
      "palette.getPropertyValue",
      "palette.getPropertyValue(name).trim",
      "player.addEventListener",
      "player.pause",
      "player.play",
      "player.removeEventListener",
      "reject",
      "resolve",
      "scheduleBoundary",
      "seek",
      "seeking?.abort",
      "setTimeout",
      "signal.addEventListener",
      "signal.removeEventListener",
      "status.setAttribute",
      "stopAtBoundary",
      "time",
      "valid",
      "wave.after",
      "wave.focus",
      "wave.getBoundingClientRect",
      "wave.getContext",
      "wave.releasePointerCapture",
      "wave.setAttribute",
      "wave.setPointerCapture",
      "window.addEventListener",
      "x"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.active",
    "line": 7,
    "end": 7,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.clearBoundary",
    "line": 9,
    "end": 9,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "clearTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.stopAtBoundary",
    "line": 10,
    "end": 19,
    "lines": 10,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Math.abs",
      "Math.max",
      "active",
      "clearBoundary",
      "draw",
      "loaded",
      "player.pause"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.scheduleBoundary",
    "line": 20,
    "end": 23,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Math.max",
      "active",
      "clearBoundary",
      "loaded",
      "setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.clamp",
    "line": 29,
    "end": 29,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Math.max",
      "Math.min"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.draw",
    "line": 30,
    "end": 37,
    "lines": 8,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "(right-left).toFixed",
      "String",
      "color",
      "ctx.beginPath",
      "ctx.clearRect",
      "ctx.fillRect",
      "ctx.lineTo",
      "ctx.moveTo",
      "ctx.stroke",
      "getComputedStyle",
      "palette.getPropertyValue",
      "palette.getPropertyValue(name).trim",
      "wave.getContext",
      "wave.setAttribute",
      "x"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.draw.x",
    "line": 32,
    "end": 32,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.draw.color",
    "line": 33,
    "end": 33,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "palette.getPropertyValue",
      "palette.getPropertyValue(name).trim"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.metadata",
    "line": 38,
    "end": 46,
    "lines": 9,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Promise.resolve",
      "cancelled",
      "finish",
      "player.addEventListener",
      "player.removeEventListener",
      "reject",
      "resolve",
      "signal.addEventListener",
      "signal.removeEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.metadata.<callback>",
    "line": 40,
    "end": 45,
    "lines": 6,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "cancelled",
      "finish",
      "player.addEventListener",
      "player.removeEventListener",
      "reject",
      "resolve",
      "signal.addEventListener",
      "signal.removeEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.metadata.<callback>.finish",
    "line": 41,
    "end": 41,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "player.removeEventListener",
      "reject",
      "resolve",
      "signal.removeEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.metadata.<callback>.ready",
    "line": 42,
    "end": 42,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "finish"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.metadata.<callback>.failed",
    "line": 42,
    "end": 42,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "finish"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.metadata.<callback>.cancelled",
    "line": 42,
    "end": 42,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "finish"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.seek",
    "line": 47,
    "end": 60,
    "lines": 14,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "Math.abs",
      "Math.max",
      "Number.isFinite",
      "String",
      "active",
      "clamp",
      "clearBoundary",
      "current",
      "draw",
      "load",
      "loaded",
      "metadata",
      "player.pause",
      "player.play",
      "seeking?.abort"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.seek.current",
    "line": 50,
    "end": 50,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "active"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.<callback>",
    "line": 62,
    "end": 62,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "draw",
      "scheduleBoundary"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.time",
    "line": 63,
    "end": 63,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "clamp",
      "wave.getBoundingClientRect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.<callback>",
    "line": 65,
    "end": 65,
    "lines": 1,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Math.abs",
      "clearBoundary",
      "player.pause",
      "time",
      "wave.focus",
      "wave.getBoundingClientRect",
      "wave.setPointerCapture"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.<callback>",
    "line": 66,
    "end": 68,
    "lines": 3,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Math.abs",
      "Math.max",
      "Math.min",
      "draw",
      "time"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.<callback>",
    "line": 69,
    "end": 69,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Math.abs",
      "seek",
      "time",
      "wave.releasePointerCapture"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.<callback>",
    "line": 70,
    "end": 70,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.<callback>",
    "line": 71,
    "end": 74,
    "lines": 4,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "Math.max",
      "Math.min",
      "['ArrowLeft','ArrowRight','Home','End'].includes",
      "clamp",
      "e.preventDefault",
      "seek"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.<callback>",
    "line": 75,
    "end": 75,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.<callback>",
    "line": 76,
    "end": 76,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.on",
    "line": 77,
    "end": 77,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "player.addEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.<callback>",
    "line": 78,
    "end": 78,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "seek"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.<callback>",
    "line": 81,
    "end": 81,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "active",
      "clamp",
      "draw",
      "loaded",
      "stopAtBoundary"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.<callback>",
    "line": 82,
    "end": 82,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "active",
      "loaded",
      "seek",
      "stopAtBoundary"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.<callback>",
    "line": 83,
    "end": 83,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "active",
      "draw"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/monitor/waveformSelection.ts",
    "name": "waveformSelection.dispose",
    "line": 84,
    "end": 84,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "clearBoundary",
      "controls.remove",
      "lifetime.abort",
      "player.pause",
      "seeking?.abort"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/localMcp.ts",
    "name": "LocalMcp.constructor",
    "line": 21,
    "end": 54,
    "lines": 34,
    "language": "typescript",
    "branches": 11,
    "calls": [
      "InMemoryTransport.createLinkedPair",
      "JSON.stringify",
      "command.run",
      "fromJsonSchema",
      "new TextEncoder().encode",
      "send",
      "structuredClone",
      "this.client.connect",
      "this.ready.catch",
      "this.server.connect",
      "this.server.connect(serverEnd).then",
      "this.server.registerTool",
      "trace",
      "transport.send.bind",
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/localMcp.ts",
    "name": "LocalMcp.constructor.<callback>",
    "line": 21,
    "end": 21,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/localMcp.ts",
    "name": "LocalMcp.constructor.<callback>",
    "line": 25,
    "end": 38,
    "lines": 14,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "JSON.stringify",
      "command.run",
      "new TextEncoder().encode",
      "valid"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/localMcp.ts",
    "name": "LocalMcp.constructor.<callback>.valid",
    "line": 26,
    "end": 26,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/localMcp.ts",
    "name": "LocalMcp.constructor.<callback>",
    "line": 43,
    "end": 47,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "send",
      "structuredClone",
      "trace"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/localMcp.ts",
    "name": "LocalMcp.constructor.<callback>",
    "line": 49,
    "end": 52,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.client.connect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/localMcp.ts",
    "name": "LocalMcp.constructor.<callback>",
    "line": 53,
    "end": 53,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/localMcp.ts",
    "name": "LocalMcp.listTools",
    "line": 55,
    "end": 58,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.client.listTools"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/localMcp.ts",
    "name": "LocalMcp.callTool",
    "line": 59,
    "end": 62,
    "lines": 4,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "this.client.callTool"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/localMcp.ts",
    "name": "LocalMcp.close",
    "line": 63,
    "end": 66,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Promise.allSettled",
      "this.client.close",
      "this.server.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "encodeCommand",
    "line": 12,
    "end": 14,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "JSON.stringify",
      "encoder.encode"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.rememberDiagnostic",
    "line": 31,
    "end": 34,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.diagnosticParents.delete",
      "this.diagnosticParents.keys",
      "this.diagnosticParents.keys().next",
      "this.diagnosticParents.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.rememberMonitor",
    "line": 35,
    "end": 38,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.monitorParents.delete",
      "this.monitorParents.keys",
      "this.monitorParents.keys().next",
      "this.monitorParents.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.monitorReceipt",
    "line": 39,
    "end": 39,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.monitorParents.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.observePacket",
    "line": 41,
    "end": 43,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.transportObserver"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.eventsSubject",
    "line": 45,
    "end": 45,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.clientId",
    "line": 46,
    "end": 46,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.isConnected",
    "line": 47,
    "end": 48,
    "lines": 2,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Boolean",
      "Date.now",
      "Math.min",
      "this.connection.isClosed"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.commandBytes",
    "line": 49,
    "end": 49,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "'x'.repeat",
      "encodeCommand"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.onStatus",
    "line": 50,
    "end": 50,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.handlers.add",
      "this.handlers.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.onStatus.<callback>",
    "line": 50,
    "end": 50,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.handlers.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.emit",
    "line": 51,
    "end": 51,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "handler"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.connect",
    "line": 53,
    "end": 67,
    "lines": 15,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "(async()=>{\n      if(this.connection){\n        await Promise.allSettled([...this.endRequests]);\n        const previous=this.connection;\n        if(previous)await previous.close();\n        this.connection=null;window.clearInterval(this.renewal);\n      }\n      return this.open(options,epoch);\n    })",
      "Promise.allSettled",
      "previous.close",
      "this.emit",
      "this.isConnected",
      "this.open",
      "window.clearInterval"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.connect.<callback>",
    "line": 57,
    "end": 65,
    "lines": 9,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Promise.allSettled",
      "previous.close",
      "this.open",
      "window.clearInterval"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.bootstrap",
    "line": 68,
    "end": 79,
    "lines": 12,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "AbortSignal.timeout",
      "JSON.stringify",
      "Number.isFinite",
      "fetch",
      "response.json"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.open",
    "line": 80,
    "end": 99,
    "lines": 20,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "Date.now",
      "conn.close",
      "options.onConnectStage",
      "this.bootstrap",
      "this.emit",
      "this.observe",
      "this.renew",
      "this.subscriptions.clear",
      "u.startsWith",
      "window.setInterval",
      "wsconnect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.open.wsFactory",
    "line": 92,
    "end": 93,
    "lines": 2,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "u.startsWith"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.open.<callback>",
    "line": 97,
    "end": 97,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.renew"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.renew",
    "line": 100,
    "end": 114,
    "lines": 15,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "this.bootstrap",
      "this.emit",
      "window.clearInterval"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.observe",
    "line": 115,
    "end": 125,
    "lines": 11,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "(async()=>{for await(const status of conn.status()){\n      if(epoch!==this.epoch)return;\n      if(status.type==='error')this.emit({type:'error',error:new Error('Канал NATS отклонил операцию.')});\n    }})",
      "conn.closed",
      "conn.status",
      "this.emit",
      "window.clearInterval"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.observe.<callback>",
    "line": 116,
    "end": 119,
    "lines": 4,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "conn.status",
      "this.emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.subscribe",
    "line": 126,
    "end": 153,
    "lines": 28,
    "language": "typescript",
    "branches": 12,
    "calls": [
      "Date.now",
      "JSON.parse",
      "['done','failed','cancelled'].includes",
      "crypto.randomUUID",
      "handler",
      "msg.headers?.get",
      "new TextDecoder().decode",
      "this.connection.flush",
      "this.connection.subscribe",
      "this.emit",
      "this.observePacket",
      "this.rememberDiagnostic",
      "this.rememberMonitor",
      "this.subscriptions.has",
      "this.subscriptions.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.subscribe.callback",
    "line": 129,
    "end": 151,
    "lines": 23,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "Date.now",
      "JSON.parse",
      "['done','failed','cancelled'].includes",
      "crypto.randomUUID",
      "handler",
      "msg.headers?.get",
      "new TextDecoder().decode",
      "this.emit",
      "this.observePacket",
      "this.rememberDiagnostic",
      "this.rememberMonitor"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.listen",
    "line": 154,
    "end": 159,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.subscribe",
      "this.subscriptions.delete",
      "this.subscriptions.get",
      "this.subscriptions.get(subject)?.unsubscribe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.listen.<callback>",
    "line": 158,
    "end": 158,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.subscriptions.delete",
      "this.subscriptions.get",
      "this.subscriptions.get(subject)?.unsubscribe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.listenAudioLive",
    "line": 160,
    "end": 173,
    "lines": 14,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test",
      "conn.subscribe",
      "handler",
      "new TextDecoder().decode",
      "sub.unsubscribe",
      "this.emit",
      "this.isConnected"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.listenAudioLive.callback",
    "line": 166,
    "end": 169,
    "lines": 4,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "handler",
      "new TextDecoder().decode",
      "this.emit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.listenAudioLive.<callback>",
    "line": 172,
    "end": 172,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "sub.unsubscribe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.request",
    "line": 174,
    "end": 199,
    "lines": 26,
    "language": "typescript",
    "branches": 17,
    "calls": [
      "Date.now",
      "JSON.parse",
      "Number.isInteger",
      "String",
      "['end','abort'].includes",
      "conn.isClosed",
      "conn.request",
      "crypto.randomUUID",
      "encodeCommand",
      "h.set",
      "headers",
      "msg.headers?.get",
      "new TextDecoder().decode",
      "performance.now",
      "this.diagnosticParents.get",
      "this.endRequests.add",
      "this.endRequests.delete",
      "this.monitorParents.get",
      "this.observePacket",
      "this.rememberDiagnostic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.uiCapability",
    "line": 200,
    "end": 204,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Date.now",
      "this.isConnected"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.configureAudio",
    "line": 205,
    "end": 207,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.publishAudio",
    "line": 208,
    "end": 217,
    "lines": 10,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "BigInt",
      "conn.isClosed",
      "conn.publish",
      "new DataView(packet.buffer).setBigUint64",
      "packet.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.drainAudioBuffer",
    "line": 218,
    "end": 231,
    "lines": 14,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Promise.resolve",
      "conn.isClosed",
      "performance.now",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.drainAudioBuffer.<callback>",
    "line": 229,
    "end": 229,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "FrontendNatsClient.disconnect",
    "line": 232,
    "end": 238,
    "lines": 7,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "conn.close",
      "this.socket?.close",
      "this.subscriptions.clear",
      "window.clearInterval"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/net/natsClient.ts",
    "name": "commandRequest",
    "line": 242,
    "end": 244,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "browserApi.request"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "weatherText",
    "line": 26,
    "end": 32,
    "lines": 7,
    "language": "typescript",
    "branches": 8,
    "calls": [
      "format",
      "new Date(value*1000).toLocaleString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "weatherText.format",
    "line": 30,
    "end": 30,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "new Date(value*1000).toLocaleString"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "element",
    "line": 34,
    "end": 36,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "document.createElement"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.constructor",
    "line": 57,
    "end": 64,
    "lines": 8,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "map.onAirportClick",
      "map.onPositionDrop",
      "map.onWeatherError",
      "this.createWeatherControl",
      "this.move",
      "this.openAirport",
      "this.root?.append",
      "this.status.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.constructor.<callback>",
    "line": 60,
    "end": 60,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.move"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.constructor.<callback>",
    "line": 61,
    "end": 61,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.openAirport"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.constructor.<callback>",
    "line": 62,
    "end": 62,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.flushPosition",
    "line": 65,
    "end": 68,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.positionState",
    "line": 69,
    "end": 71,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.confirmedPosition",
    "line": 72,
    "end": 78,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.flushPosition",
      "this.refresh",
      "this.session"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.refresh",
    "line": 79,
    "end": 82,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.load",
      "this.load().finally"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.refresh.<callback>",
    "line": 81,
    "end": 81,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.api",
    "line": 83,
    "end": 100,
    "lines": 18,
    "language": "typescript",
    "branches": 10,
    "calls": [
      "commandRequest",
      "crypto.randomUUID",
      "this.session"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.load",
    "line": 101,
    "end": 114,
    "lines": 14,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "String",
      "this.api",
      "this.map.setCatalog",
      "this.map.setCurrentPosition",
      "this.render",
      "this.session",
      "this.updateModal"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.move",
    "line": 115,
    "end": 128,
    "lines": 14,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "this.api",
      "this.pendingMove.then",
      "this.pendingMove.then(async()=>{\n      if (!this.view || session!==this.loadedSession || session!==this.session()) throw new Error('Сначала дождитесь загрузки положения самолёта.');\n      this.status.textContent='Сохраняю положение самолёта…';\n      const position=await this.api('position','PUT',{lat,lon,revision:this.view.position.revision});\n      if (session!==this.session()) return;\n      this.view.position=position;this.positionError=null;this.status.textContent='Положение сохранено.';\n    }).catch",
      "this.pendingMove.then(async()=>{\n      if (!this.view || session!==this.loadedSession || session!==this.session()) throw new Error('Сначала дождитесь загрузки положения самолёта.');\n      this.status.textContent='Сохраняю положение самолёта…';\n      const position=await this.api('position','PUT',{lat,lon,revision:this.view.position.revision});\n      if (session!==this.session()) return;\n      this.view.position=position;this.positionError=null;this.status.textContent='Положение сохранено.';\n    }).catch(error=>{\n      this.positionError=error instanceof Error ? error : new Error('Не удалось сохранить положение.');\n      this.status.textContent=this.positionError.message;\n    }).finally",
      "this.session"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.move.<callback>",
    "line": 118,
    "end": 124,
    "lines": 7,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.api",
      "this.session"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.move.<callback>",
    "line": 124,
    "end": 127,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.move.<callback>",
    "line": 127,
    "end": 127,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.button",
    "line": 129,
    "end": 136,
    "lines": 8,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String",
      "action",
      "action().catch",
      "action().catch(error=>{this.status.textContent=String(error instanceof Error ? error.message : error);})\n        .finally",
      "button.addEventListener",
      "element"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.button.<callback>",
    "line": 131,
    "end": 135,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String",
      "action",
      "action().catch",
      "action().catch(error=>{this.status.textContent=String(error instanceof Error ? error.message : error);})\n        .finally"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.button.<callback>.<callback>",
    "line": 133,
    "end": 133,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.button.<callback>.<callback>",
    "line": 134,
    "end": 134,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.input",
    "line": 137,
    "end": 140,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "String",
      "element",
      "field.append",
      "form.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.render",
    "line": 141,
    "end": 164,
    "lines": 24,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Number",
      "actions.append",
      "element",
      "lat.checkValidity",
      "lon.checkValidity",
      "plan.airport_codes.join",
      "plans.append",
      "position.append",
      "select.append",
      "select.setAttribute",
      "this.api",
      "this.body.append",
      "this.body.replaceChildren",
      "this.button",
      "this.flushPosition",
      "this.input",
      "this.map.allAirports",
      "this.map.setCurrentPosition",
      "this.map.toPlane",
      "this.move",
      "this.openAirport",
      "this.refresh"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.render.<callback>",
    "line": 146,
    "end": 146,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.map.allAirports"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.render.<callback>",
    "line": 146,
    "end": 146,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.map.toPlane"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.render.<callback>",
    "line": 150,
    "end": 150,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.openAirport"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.render.<callback>",
    "line": 155,
    "end": 158,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Number",
      "lat.checkValidity",
      "lon.checkValidity",
      "this.flushPosition",
      "this.map.setCurrentPosition",
      "this.move"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.render.<callback>",
    "line": 162,
    "end": 162,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.refresh"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.render.<callback>",
    "line": 163,
    "end": 163,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.api",
      "this.refresh"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.createWeatherControl",
    "line": 165,
    "end": 191,
    "lines": 27,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "AbortSignal.timeout",
      "Number",
      "String",
      "apply",
      "element",
      "fetch",
      "opacity.addEventListener",
      "opacity.setAttribute",
      "response.json",
      "select.addEventListener",
      "select.append",
      "select.setAttribute",
      "this.map.setWeather",
      "this.map.setWeatherOpacity",
      "this.weatherControl.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.createWeatherControl.apply",
    "line": 174,
    "end": 187,
    "lines": 14,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "AbortSignal.timeout",
      "Number",
      "fetch",
      "response.json",
      "this.map.setWeather"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.createWeatherControl.<callback>",
    "line": 188,
    "end": 188,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "apply"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.createWeatherControl.<callback>",
    "line": 188,
    "end": 188,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Number",
      "this.map.setWeatherOpacity"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.openAirport",
    "line": 192,
    "end": 201,
    "lines": 10,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "document.body.append",
      "element",
      "this.fillModal",
      "this.modal.addEventListener",
      "this.modal.showModal",
      "this.view?.airports.find"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.openAirport.<callback>",
    "line": 193,
    "end": 193,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.openAirport.<callback>",
    "line": 196,
    "end": 196,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.updateModal",
    "line": 202,
    "end": 209,
    "lines": 8,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "airport.runways.map",
      "airport.runways.map(r=>`${r.name} — ${r.available?'доступна':'недоступна'}`).join",
      "this.fillModal",
      "this.view?.airports.find",
      "weatherText"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.updateModal.<callback>",
    "line": 203,
    "end": 203,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.updateModal.<callback>",
    "line": 207,
    "end": 207,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.fillModal",
    "line": 210,
    "end": 235,
    "lines": 26,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "airport.runways.map",
      "element",
      "event.preventDefault",
      "form.addEventListener",
      "form.append",
      "label.prepend",
      "modal.append",
      "modal.close",
      "modal.replaceChildren",
      "modal.setAttribute",
      "openLabel.prepend",
      "save.click",
      "states.map",
      "this.api",
      "this.button",
      "this.fillModal",
      "this.modalConflict.setAttribute",
      "this.refresh",
      "this.view?.airports.find",
      "weatherText"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.fillModal.<callback>",
    "line": 217,
    "end": 220,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "element",
      "form.append",
      "label.prepend"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.fillModal.<callback>",
    "line": 222,
    "end": 222,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.fillModal.<callback>",
    "line": 225,
    "end": 225,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "modal.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.fillModal.<callback>",
    "line": 226,
    "end": 226,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.fillModal",
      "this.refresh",
      "this.view?.airports.find"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.fillModal.<callback>.<callback>",
    "line": 226,
    "end": 226,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.fillModal.<callback>",
    "line": 227,
    "end": 232,
    "lines": 6,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "states.map",
      "this.api",
      "this.refresh"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.fillModal.<callback>.<callback>",
    "line": 229,
    "end": 229,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/aviationPanel.ts",
    "name": "AviationPanel.fillModal.<callback>",
    "line": 233,
    "end": 233,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "event.preventDefault",
      "save.click"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatNoteUi.ts",
    "name": "ChatNoteUI.constructor",
    "line": 7,
    "end": 30,
    "lines": 24,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "(state.bytes/1024).toFixed",
      "controller.edit",
      "controller.onChange",
      "controller.restore",
      "controller.save",
      "document.getElementById",
      "reload.addEventListener",
      "reload.removeEventListener",
      "save.addEventListener",
      "save.removeEventListener",
      "text.addEventListener",
      "text.removeEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatNoteUi.ts",
    "name": "ChatNoteUI.constructor.input",
    "line": 15,
    "end": 15,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "controller.edit"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatNoteUi.ts",
    "name": "ChatNoteUI.constructor.saving",
    "line": 15,
    "end": 15,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "controller.save"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatNoteUi.ts",
    "name": "ChatNoteUI.constructor.reading",
    "line": 15,
    "end": 15,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "controller.restore"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatNoteUi.ts",
    "name": "ChatNoteUI.constructor.<callback>",
    "line": 17,
    "end": 17,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "reload.removeEventListener",
      "save.removeEventListener",
      "text.removeEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatNoteUi.ts",
    "name": "ChatNoteUI.constructor.<callback>",
    "line": 18,
    "end": 29,
    "lines": 12,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "(state.bytes/1024).toFixed"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatNoteUi.ts",
    "name": "ChatNoteUI.dispose",
    "line": 31,
    "end": 31,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.unbind",
      "this.unsubscribe"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.constructor",
    "line": 19,
    "end": 19,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.showAsrOutcome",
    "line": 21,
    "end": 39,
    "lines": 19,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "String",
      "['rejected','error'].includes",
      "asrOutcomeText",
      "asrOutcomeTitle",
      "block.append",
      "block.querySelector",
      "copy.append",
      "copy.querySelector",
      "document.createElement",
      "new URLSearchParams({session_id:data.session_id,request_id:id,view:'events',section:'phrase'}).toString",
      "this.addMessage",
      "this.block",
      "this.messageActions",
      "this.options.interaction?.finish",
      "this.setRequestStatus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.setCancelHandler",
    "line": 41,
    "end": 41,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.setRequestSource",
    "line": 42,
    "end": 46,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "block.prepend",
      "block.querySelector",
      "document.createElement",
      "this.block"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.toolActivity",
    "line": 47,
    "end": 76,
    "lines": 30,
    "language": "typescript",
    "branches": 15,
    "calls": [
      "Array.from",
      "Array.from(block.querySelectorAll<HTMLDetailsElement>('.tool-result')).find",
      "Array.isArray",
      "Object.entries",
      "String",
      "String(item).slice",
      "String(value??'—').slice",
      "answer.before",
      "block.append",
      "block.querySelector",
      "block.querySelectorAll",
      "code.slice",
      "document.createElement",
      "list.append",
      "output.append",
      "parent.append",
      "render",
      "row.append",
      "row.querySelector",
      "row.querySelector('.tool-output')?.remove",
      "this.block",
      "this.options.interaction.toolActivity"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.toolActivity.<callback>",
    "line": 50,
    "end": 50,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.toolActivity.render",
    "line": 64,
    "end": 73,
    "lines": 10,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "Array.isArray",
      "Object.entries",
      "String",
      "String(item).slice",
      "String(value??'—').slice",
      "document.createElement",
      "list.append",
      "parent.append",
      "render"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.restoreTools",
    "line": 77,
    "end": 82,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.toolActivity"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.block",
    "line": 83,
    "end": 94,
    "lines": 12,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "block.append",
      "block.querySelector",
      "copy.addEventListener",
      "copy.append",
      "copy.setAttribute",
      "document.createElement",
      "navigator.clipboard.writeText",
      "navigator.clipboard.writeText(requestId).then",
      "status.setAttribute",
      "this.messageByTurn.get",
      "this.messageByTurn.get(linkedUserTurnId)?.closest",
      "this.options.interaction?.attach",
      "this.requestBlocks.get",
      "this.requestBlocks.set",
      "this.root.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.block.<callback>",
    "line": 91,
    "end": 91,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "navigator.clipboard.writeText",
      "navigator.clipboard.writeText(requestId).then"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.block.<callback>.<callback>",
    "line": 91,
    "end": 91,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.block.<callback>.<callback>",
    "line": 91,
    "end": 91,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.setRequestStatus",
    "line": 95,
    "end": 100,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "block.append",
      "block.querySelector",
      "cancel.addEventListener",
      "document.createElement",
      "row.append",
      "row.querySelector",
      "this.block",
      "this.cancelHandler"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.setRequestStatus.<callback>",
    "line": 97,
    "end": 97,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.cancelHandler"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.discardResponseDraft",
    "line": 101,
    "end": 105,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "draft.remove",
      "this.forgetSubtree",
      "this.responseDrafts.delete",
      "this.responseDrafts.get"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.updateTimings",
    "line": 106,
    "end": 110,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "appendTimings",
      "response.classList.contains",
      "this.requestBlocks.get",
      "this.requestBlocks.get(requestId)?.querySelector",
      "this.restoreTools"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.removeRequest",
    "line": 111,
    "end": 114,
    "lines": 4,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "block.contains",
      "block.remove",
      "this.messageByTurn.delete",
      "this.options.interaction?.remove",
      "this.requestBlocks.delete",
      "this.requestBlocks.get",
      "this.responseDrafts.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.forgetSubtree",
    "line": 115,
    "end": 119,
    "lines": 5,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "node.contains",
      "this.messageByTurn.delete",
      "this.requestBlocks.delete",
      "this.responseDrafts.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.updateTranscriptDraft",
    "line": 120,
    "end": 130,
    "lines": 11,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "document.createElement",
      "this.root.append",
      "this.transcriptDraft.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.finishTranscriptDraft",
    "line": 132,
    "end": 147,
    "lines": 16,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "block.prepend",
      "block.querySelector",
      "copy.after",
      "document.createElement",
      "el.classList.remove",
      "el.replaceChildren",
      "this.block",
      "this.clearTranscriptDraft",
      "this.hideTranscriptionFlash",
      "this.messageByTurn.has",
      "this.messageByTurn.set",
      "this.updateTranscriptDraft"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.clearTranscriptDraft",
    "line": 149,
    "end": 149,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.transcriptDraft?.remove"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.updateResponseDraft",
    "line": 151,
    "end": 166,
    "lines": 16,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "document.createElement",
      "element.classList.add",
      "element.replaceChildren",
      "element.setAttribute",
      "renderMarkdown",
      "this.block",
      "this.block(requestId).append",
      "this.requestBlocks.get",
      "this.requestBlocks.get(requestId)?.querySelector",
      "this.responseDrafts.get",
      "this.responseDrafts.set"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.finishResponseDraft",
    "line": 168,
    "end": 178,
    "lines": 11,
    "language": "typescript",
    "branches": 9,
    "calls": [
      "[\"awaiting_confirmation\",\"awaiting_input\"].includes",
      "block?.querySelectorAll",
      "row.querySelector",
      "row.querySelector('summary')!.textContent!.replace",
      "this.addMessage",
      "this.options.interaction?.finish",
      "this.requestBlocks.get",
      "this.responseDrafts.delete",
      "this.setRequestStatus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.addConnectionError",
    "line": 180,
    "end": 198,
    "lines": 19,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "details.append",
      "div.append",
      "div.setAttribute",
      "document.createElement",
      "new Date().toLocaleTimeString",
      "this.root.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.addMessage",
    "line": 200,
    "end": 240,
    "lines": 41,
    "language": "typescript",
    "branches": 20,
    "calls": [
      "[cause,options.error.message,options.error.code,'Не удалось выполнить запрос.'].includes",
      "appendRequestError",
      "appendRequestTrace",
      "appendTimings",
      "block.append",
      "block.contains",
      "block.prepend",
      "block.querySelector",
      "copy.after",
      "div.append",
      "div.appendChild",
      "div.classList.add",
      "div.replaceChildren",
      "document.createElement",
      "renderMarkdown",
      "text.trim",
      "this.block",
      "this.messageActions",
      "this.messageByTurn.has",
      "this.messageByTurn.set",
      "this.requestBlocks.get",
      "this.requestBlocks.get(options.requestId)?.querySelector",
      "this.responseDrafts.get",
      "this.restoreTools",
      "this.root.appendChild"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.messageActions",
    "line": 242,
    "end": 255,
    "lines": 14,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Intl.DateTimeFormat",
      "Intl.DateTimeFormat().resolvedOptions",
      "Number.isFinite",
      "button.setAttribute",
      "date.toLocaleString",
      "date.toLocaleTimeString",
      "document.createElement",
      "el.append",
      "el.setAttribute",
      "hint",
      "message.append",
      "navigator.clipboard.writeText",
      "navigator.clipboard.writeText(value).then",
      "status.setAttribute",
      "tip.setAttribute",
      "toolbar.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.messageActions.hint",
    "line": 244,
    "end": 244,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "document.createElement",
      "el.append",
      "el.setAttribute",
      "tip.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.messageActions.<callback>",
    "line": 247,
    "end": 247,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "navigator.clipboard.writeText",
      "navigator.clipboard.writeText(value).then"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.messageActions.<callback>.<callback>",
    "line": 247,
    "end": 247,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.messageActions.<callback>.<callback>",
    "line": 247,
    "end": 247,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.showTranscriptionFlash",
    "line": 257,
    "end": 275,
    "lines": 19,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "document.createElement",
      "flash.classList.add",
      "requestAnimationFrame",
      "this.root.appendChild",
      "this.transcriptionFlashEl.classList.add"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.showTranscriptionFlash.<callback>",
    "line": 270,
    "end": 274,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "flash.classList.add"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.hideTranscriptionFlash",
    "line": 277,
    "end": 286,
    "lines": 10,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "flash.classList.remove",
      "flash.remove",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/chatUi.ts",
    "name": "ChatUI.hideTranscriptionFlash.<callback>",
    "line": 281,
    "end": 285,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "flash.remove"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/controlTooltip.ts",
    "name": "controlTooltip",
    "line": 2,
    "end": 11,
    "lines": 10,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "(event.target as HTMLElement).closest",
      "Math.max",
      "Math.min",
      "[description,tip.id].filter",
      "[description,tip.id].filter(Boolean).join",
      "crypto.randomUUID",
      "current.removeAttribute",
      "current.setAttribute",
      "document.createElement",
      "hide",
      "root.addEventListener",
      "root.append",
      "root.contains",
      "root.removeEventListener",
      "target.getAttribute",
      "target.getBoundingClientRect",
      "target.removeAttribute",
      "target.setAttribute",
      "tip.remove",
      "tip.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/controlTooltip.ts",
    "name": "controlTooltip.hide",
    "line": 6,
    "end": 6,
    "lines": 1,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "current.removeAttribute",
      "current.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/controlTooltip.ts",
    "name": "controlTooltip.show",
    "line": 7,
    "end": 7,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "(event.target as HTMLElement).closest",
      "Math.max",
      "Math.min",
      "[description,tip.id].filter",
      "[description,tip.id].filter(Boolean).join",
      "hide",
      "root.contains",
      "target.getAttribute",
      "target.getBoundingClientRect",
      "target.removeAttribute",
      "target.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/controlTooltip.ts",
    "name": "controlTooltip.key",
    "line": 8,
    "end": 8,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "hide"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/controlTooltip.ts",
    "name": "controlTooltip.<callback>",
    "line": 10,
    "end": 10,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "hide",
      "root.removeEventListener",
      "tip.remove"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/elements.ts",
    "name": "getAssistantElements",
    "line": 18,
    "end": 35,
    "lines": 18,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "document.getElementById",
      "document.querySelector"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/experimentForm.ts",
    "name": "ExperimentForm.<callback>",
    "line": 6,
    "end": 6,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "event.preventDefault"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/experimentForm.ts",
    "name": "ExperimentForm.<callback>",
    "line": 9,
    "end": 9,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "listener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/experimentForm.ts",
    "name": "ExperimentForm.constructor",
    "line": 10,
    "end": 16,
    "lines": 7,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Object.values",
      "document.getElementById",
      "input.addEventListener",
      "this.form?.addEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/experimentForm.ts",
    "name": "ExperimentForm.revision",
    "line": 17,
    "end": 17,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/experimentForm.ts",
    "name": "ExperimentForm.onChange",
    "line": 18,
    "end": 18,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.listeners.add",
      "this.listeners.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/experimentForm.ts",
    "name": "ExperimentForm.onChange.<callback>",
    "line": 18,
    "end": 18,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.listeners.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/experimentForm.ts",
    "name": "ExperimentForm.read",
    "line": 19,
    "end": 19,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/experimentForm.ts",
    "name": "ExperimentForm.update",
    "line": 20,
    "end": 28,
    "lines": 9,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.inputs[name].dispatchEvent"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/experimentForm.ts",
    "name": "ExperimentForm.dispose",
    "line": 29,
    "end": 29,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Object.values",
      "input.removeEventListener",
      "this.form?.removeEventListener",
      "this.listeners.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.info",
    "line": 16,
    "end": 16,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.onChange",
    "line": 17,
    "end": 17,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.listeners.add",
      "this.listeners.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.onChange.<callback>",
    "line": 17,
    "end": 17,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.listeners.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.emit",
    "line": 18,
    "end": 18,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "listener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.<callback>",
    "line": 19,
    "end": 19,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.frame.contentWindow?.postMessage"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.<callback>",
    "line": 20,
    "end": 20,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.check",
      "this.waiting"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.<callback>",
    "line": 21,
    "end": 21,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.waiting"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.<callback>",
    "line": 22,
    "end": 45,
    "lines": 24,
    "language": "typescript",
    "branches": 12,
    "calls": [
      "/^[a-z][a-z0-9_]{0,63}$/.test",
      "Array.isArray",
      "JSON.stringify",
      "Number.isSafeInteger",
      "String",
      "call.cleanup",
      "call.reject",
      "call.resolve",
      "data.tools.filter",
      "this.emit",
      "this.pending.delete",
      "this.pending.get",
      "this.rejectPending",
      "uuid.test",
      "window.clearTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.<callback>.<callback>",
    "line": 30,
    "end": 30,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.rejectPending",
    "line": 46,
    "end": 49,
    "lines": 4,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "call.cleanup",
      "call.reject",
      "this.frame.contentWindow?.postMessage",
      "this.pending.clear"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.<callback>",
    "line": 50,
    "end": 54,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.emit",
      "this.rejectPending",
      "window.clearTimeout",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.<callback>.<callback>",
    "line": 53,
    "end": 53,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.constructor",
    "line": 55,
    "end": 58,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "document.getElementById",
      "document.getElementById('reloadForms')?.addEventListener",
      "this.check",
      "this.frame.addEventListener",
      "this.waiting",
      "window.addEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.execute",
    "line": 59,
    "end": 77,
    "lines": 19,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Promise.reject",
      "cleanup",
      "crypto.randomUUID",
      "expected.tools.some",
      "reject",
      "signal.addEventListener",
      "signal.removeEventListener",
      "this.frame.contentWindow?.postMessage",
      "this.pending.delete",
      "this.pending.set",
      "window.clearTimeout",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.execute.<callback>",
    "line": 60,
    "end": 60,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.execute.<callback>",
    "line": 65,
    "end": 76,
    "lines": 12,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "cleanup",
      "reject",
      "signal.addEventListener",
      "signal.removeEventListener",
      "this.frame.contentWindow?.postMessage",
      "this.pending.delete",
      "this.pending.set",
      "window.clearTimeout",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.execute.<callback>.abort",
    "line": 66,
    "end": 70,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "cleanup",
      "reject",
      "this.frame.contentWindow?.postMessage",
      "this.pending.delete"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.execute.<callback>.cleanup",
    "line": 71,
    "end": 71,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "signal.removeEventListener",
      "window.clearTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/formsFrame.ts",
    "name": "FormsFrame.dispose",
    "line": 78,
    "end": 78,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "document.getElementById",
      "document.getElementById('reloadForms')?.removeEventListener",
      "this.frame.removeEventListener",
      "this.listeners.clear",
      "this.rejectPending",
      "window.clearTimeout",
      "window.removeEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/markdown.ts",
    "name": "<callback>",
    "line": 5,
    "end": 5,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "/^https?:\\/\\//i.test"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/markdown.ts",
    "name": "<callback>",
    "line": 7,
    "end": 11,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "link",
      "self.renderToken",
      "tokens[index].attrSet"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/markdown.ts",
    "name": "<callback>",
    "line": 12,
    "end": 17,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String",
      "markdown.utils.escapeHtml",
      "markdown.validateLink",
      "token.attrGet"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/markdown.ts",
    "name": "renderMarkdown",
    "line": 19,
    "end": 22,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "element.classList.add",
      "markdown.render"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestError.ts",
    "name": "readError",
    "line": 13,
    "end": 19,
    "lines": 7,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "/^[a-z_]{1,80}$/.test",
      "Array.isArray"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestError.ts",
    "name": "traceLinks",
    "line": 20,
    "end": 33,
    "lines": 14,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "/^0+$/.test",
      "JSON.stringify",
      "Number.isFinite",
      "String",
      "id.toLowerCase",
      "new URLSearchParams({schemaVersion:'1',orgId:'1',panes:JSON.stringify(panes)}).toString",
      "selectedSpan.toLowerCase",
      "span.test",
      "trace.test",
      "uuid.test"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestError.ts",
    "name": "readDiagnostic",
    "line": 34,
    "end": 41,
    "lines": 8,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "/^0+$/.test",
      "Array.isArray",
      "Number.isFinite",
      "span.test",
      "trace.test"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestError.ts",
    "name": "appendRequestTrace",
    "line": 42,
    "end": 57,
    "lines": 16,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "Object.entries",
      "String",
      "document.createElement",
      "expanded.append",
      "parent.append",
      "readDiagnostic",
      "traceLinks"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestError.ts",
    "name": "appendRequestError",
    "line": 58,
    "end": 87,
    "lines": 30,
    "language": "typescript",
    "branches": 16,
    "calls": [
      "/^0+$/.test",
      "Object.entries",
      "String",
      "String(details[key]).slice",
      "details.attempted_tool.slice",
      "document.createElement",
      "expanded.append",
      "parent.append",
      "span.test",
      "text",
      "trace.test",
      "traceLinks",
      "uuid.test"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestError.ts",
    "name": "appendRequestError.text",
    "line": 60,
    "end": 60,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String",
      "String(details[key]).slice"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "numeric",
    "line": 12,
    "end": 12,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "Number.isFinite"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "readTimings",
    "line": 14,
    "end": 38,
    "lines": 25,
    "language": "typescript",
    "branches": 20,
    "calls": [
      "Array.isArray",
      "Number",
      "Number.isFinite",
      "Number.isInteger",
      "Number.isSafeInteger",
      "Object.prototype.hasOwnProperty.call",
      "String",
      "String(t.outcome).slice",
      "['pending','ok','error','cancelled','rejected'].includes",
      "g.attempt_id.slice",
      "numeric",
      "readDiagnostic",
      "t.name.slice",
      "value.generations.slice",
      "value.generations.slice(0,128).flatMap",
      "value.tools.slice",
      "value.tools.slice(0,64).filter",
      "value.tools.slice(0,64).filter(t=>t && typeof t.id==='string' && t.id.length<=128 && typeof t.name==='string' && numeric(t.duration_ms)).map"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "readTimings.<callback>",
    "line": 21,
    "end": 21,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "numeric"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "readTimings.<callback>",
    "line": 21,
    "end": 21,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String",
      "String(t.outcome).slice",
      "readDiagnostic",
      "t.name.slice"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "readTimings.<callback>",
    "line": 22,
    "end": 30,
    "lines": 9,
    "language": "typescript",
    "branches": 7,
    "calls": [
      "Number.isInteger",
      "Number.isSafeInteger",
      "['pending','ok','error','cancelled','rejected'].includes",
      "g.attempt_id.slice",
      "numeric",
      "readDiagnostic"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "mergeTimings",
    "line": 39,
    "end": 43,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "readTimings"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "duration",
    "line": 44,
    "end": 44,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "(n/1000).toFixed",
      "Number.isFinite"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "outcome",
    "line": 45,
    "end": 45,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "setSpanLookup",
    "line": 47,
    "end": 47,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "explain",
    "line": 49,
    "end": 53,
    "lines": 5,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "document.createElement",
      "name.append",
      "name.setAttribute",
      "tooltip.setAttribute"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "row",
    "line": 54,
    "end": 57,
    "lines": 4,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "container.append",
      "document.createElement",
      "explain",
      "formatter",
      "p.append"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "lazyLink",
    "line": 58,
    "end": 69,
    "lines": 12,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "/^https:\\/\\/phoenix\\.gis-master\\.ru\\//.test",
      "Promise.race",
      "Promise.race([spanLookup(requestId,diag.otel_trace_id,diag.otel_span_id),timeout]).then",
      "Promise.race([spanLookup(requestId,diag.otel_trace_id,diag.otel_span_id),timeout]).then(result=>{\n      if(result.phoenix && /^https:\\/\\/phoenix\\.gis-master\\.ru\\//.test(result.phoenix))anchor.href=result.phoenix;\n    }).catch",
      "Promise.race([spanLookup(requestId,diag.otel_trace_id,diag.otel_span_id),timeout]).then(result=>{\n      if(result.phoenix && /^https:\\/\\/phoenix\\.gis-master\\.ru\\//.test(result.phoenix))anchor.href=result.phoenix;\n    }).catch(()=>{}).finally",
      "clearTimeout",
      "expanded.addEventListener",
      "resolve",
      "setTimeout",
      "spanLookup"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "lazyLink.<callback>",
    "line": 60,
    "end": 68,
    "lines": 9,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "/^https:\\/\\/phoenix\\.gis-master\\.ru\\//.test",
      "Promise.race",
      "Promise.race([spanLookup(requestId,diag.otel_trace_id,diag.otel_span_id),timeout]).then",
      "Promise.race([spanLookup(requestId,diag.otel_trace_id,diag.otel_span_id),timeout]).then(result=>{\n      if(result.phoenix && /^https:\\/\\/phoenix\\.gis-master\\.ru\\//.test(result.phoenix))anchor.href=result.phoenix;\n    }).catch",
      "Promise.race([spanLookup(requestId,diag.otel_trace_id,diag.otel_span_id),timeout]).then(result=>{\n      if(result.phoenix && /^https:\\/\\/phoenix\\.gis-master\\.ru\\//.test(result.phoenix))anchor.href=result.phoenix;\n    }).catch(()=>{}).finally",
      "clearTimeout",
      "resolve",
      "setTimeout",
      "spanLookup"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "lazyLink.<callback>.<callback>",
    "line": 64,
    "end": 64,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "resolve",
      "setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "lazyLink.<callback>.<callback>.<callback>",
    "line": 64,
    "end": 64,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "resolve"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "lazyLink.<callback>.<callback>",
    "line": 65,
    "end": 67,
    "lines": 3,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "/^https:\\/\\/phoenix\\.gis-master\\.ru\\//.test"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "lazyLink.<callback>.<callback>",
    "line": 67,
    "end": 67,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "lazyLink.<callback>.<callback>",
    "line": 67,
    "end": 67,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "clearTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "spanLinks",
    "line": 70,
    "end": 76,
    "lines": 7,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Object.entries",
      "container.append",
      "document.createElement",
      "lazyLink",
      "traceLinks"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "appendTimings",
    "line": 77,
    "end": 125,
    "lines": 49,
    "language": "typescript",
    "branches": 18,
    "calls": [
      "Object.prototype.hasOwnProperty.call",
      "String",
      "box.append",
      "container.append",
      "document.createElement",
      "duration",
      "expanded.append",
      "expanded.querySelector",
      "item.append",
      "lazyLink",
      "outcome",
      "parent.append",
      "parent.querySelector",
      "parent.querySelector('.request-timings')?.remove",
      "render",
      "roots.forEach",
      "roots.reduce",
      "row",
      "spanLinks",
      "stage.append",
      "tools.filter",
      "tools.some",
      "visited.add",
      "visited.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "appendTimings.<callback>",
    "line": 89,
    "end": 89,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "appendTimings.<callback>",
    "line": 93,
    "end": 93,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Object.prototype.hasOwnProperty.call"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "appendTimings.<callback>",
    "line": 101,
    "end": 101,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "appendTimings.<callback>",
    "line": 102,
    "end": 102,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "String"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "appendTimings.<callback>",
    "line": 116,
    "end": 116,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "tools.some"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "appendTimings.<callback>.<callback>",
    "line": 116,
    "end": 116,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "appendTimings.<callback>",
    "line": 117,
    "end": 117,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "appendTimings.render",
    "line": 119,
    "end": 123,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "container.append",
      "document.createElement",
      "duration",
      "item.append",
      "outcome",
      "render",
      "spanLinks",
      "tools.filter",
      "visited.add",
      "visited.has"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "appendTimings.render.<callback>",
    "line": 122,
    "end": 122,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/requestTimings.ts",
    "name": "appendTimings.<callback>",
    "line": 124,
    "end": 124,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "render"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/streamingTranscript.ts",
    "name": "StreamingTranscript.constructor",
    "line": 8,
    "end": 10,
    "lines": 3,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/streamingTranscript.ts",
    "name": "StreamingTranscript.pending",
    "line": 12,
    "end": 12,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/streamingTranscript.ts",
    "name": "StreamingTranscript.accept",
    "line": 14,
    "end": 50,
    "lines": 37,
    "language": "typescript",
    "branches": 12,
    "calls": [
      "Number.isInteger",
      "String",
      "[\"partial\", \"final\", \"rejected\", \"error\"].includes",
      "[\"sequence_gap\", \"audio_queue_overflow\", \"core_audio_queue_overflow\",\n        \"audio_transport_failed\", \"stream_disconnected\", \"worker_unavailable\", \"invalid_packet\",\n        \"bridge_failure\"].includes",
      "data.text.trim",
      "this.chat.addMessage",
      "this.chat.clearTranscriptDraft",
      "this.chat.hideTranscriptionFlash",
      "this.chat.setRequestStatus",
      "this.chat.showAsrOutcome",
      "this.onFinal",
      "this.ownsStream",
      "this.revisions.delete",
      "this.revisions.get",
      "this.revisions.keys",
      "this.revisions.keys().next",
      "this.revisions.set",
      "this.session",
      "this.stream"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/streamingTranscript.ts",
    "name": "StreamingTranscript.reset",
    "line": 52,
    "end": 52,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.chat.clearTranscriptDraft"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/waves.ts",
    "name": "drawWave",
    "line": 6,
    "end": 43,
    "lines": 38,
    "language": "typescript",
    "branches": 5,
    "calls": [
      "Math.floor",
      "Math.max",
      "Math.min",
      "Math.round",
      "ctx.beginPath",
      "ctx.clearRect",
      "ctx.lineTo",
      "ctx.moveTo",
      "ctx.setTransform",
      "ctx.stroke"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/waves.ts",
    "name": "startAnalyserLoop",
    "line": 45,
    "end": 95,
    "lines": 51,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Math.floor",
      "Math.max",
      "Math.min",
      "analyser.disconnect",
      "analyser.getFloatTimeDomainData",
      "audioContext.createAnalyser",
      "audioContext.createMediaStreamSource",
      "cancelAnimationFrame",
      "history.subarray",
      "next.set",
      "onDraw",
      "requestAnimationFrame",
      "source.connect",
      "source.disconnect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/waves.ts",
    "name": "startAnalyserLoop.tick",
    "line": 65,
    "end": 85,
    "lines": 21,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "Math.max",
      "Math.min",
      "analyser.getFloatTimeDomainData",
      "history.subarray",
      "next.set",
      "onDraw",
      "requestAnimationFrame"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/waves.ts",
    "name": "startAnalyserLoop.<callback>",
    "line": 89,
    "end": 94,
    "lines": 6,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "analyser.disconnect",
      "cancelAnimationFrame",
      "source.disconnect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/waves.ts",
    "name": "startWaveforms",
    "line": 97,
    "end": 137,
    "lines": 41,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "ac.close",
      "drawWave",
      "el.micWaveform?.getContext",
      "el.waveBackground?.getContext",
      "s",
      "startAnalyserLoop",
      "stoppers.forEach",
      "stoppers.push"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/waves.ts",
    "name": "startWaveforms.<callback>",
    "line": 114,
    "end": 114,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "drawWave"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/waves.ts",
    "name": "startWaveforms.<callback>",
    "line": 117,
    "end": 117,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "ac.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/waves.ts",
    "name": "startWaveforms.<callback>",
    "line": 128,
    "end": 128,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "drawWave"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/waves.ts",
    "name": "startWaveforms.<callback>",
    "line": 131,
    "end": 131,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "ac.close"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/waves.ts",
    "name": "startWaveforms.stop",
    "line": 135,
    "end": 135,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "s",
      "stoppers.forEach"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/ui/waves.ts",
    "name": "startWaveforms.stop.<callback>",
    "line": 135,
    "end": 135,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "s"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "record",
    "line": 12,
    "end": 13,
    "lines": 2,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Array.isArray"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.<callback>",
    "line": 19,
    "end": 19,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.<callback>",
    "line": 20,
    "end": 20,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "browserApi.commandBytes"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.<callback>",
    "line": 31,
    "end": 31,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.dispose"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.<callback>",
    "line": 32,
    "end": 32,
    "lines": 1,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "this.readRouteSession",
      "window.location.reload"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.constructor",
    "line": 34,
    "end": 34,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.map.init"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.start",
    "line": 36,
    "end": 44,
    "lines": 9,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "browserApi.onStatus",
      "crypto.randomUUID",
      "this.connect",
      "this.note.setSession",
      "this.onStatus",
      "this.readRouteSession",
      "window.addEventListener",
      "window.history.replaceState"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.start.<callback>",
    "line": 40,
    "end": 40,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.onStatus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.readRouteSession",
    "line": 46,
    "end": 50,
    "lines": 5,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "decodeURIComponent",
      "uuid.test",
      "window.location.pathname.match"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.setStatus",
    "line": 52,
    "end": 54,
    "lines": 3,
    "language": "typescript",
    "branches": 2,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.onStatus",
    "line": 56,
    "end": 67,
    "lines": 12,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "Promise.all",
      "this.note.restore",
      "this.note.setConnected",
      "this.refreshMap",
      "this.scheduleReconnect",
      "this.setStatus",
      "window.clearTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.scheduleReconnect",
    "line": 69,
    "end": 73,
    "lines": 5,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "Math.min",
      "this.connect",
      "window.setTimeout"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.scheduleReconnect.<callback>",
    "line": 72,
    "end": 72,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.connect"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.connect",
    "line": 75,
    "end": 91,
    "lines": 17,
    "language": "typescript",
    "branches": 6,
    "calls": [
      "(async()=>{\n      try {\n        await browserApi.connect({url:this.config.nats.url,name:this.config.nats.clientName,sessionId:this.sessionId});\n        if(this.closed)return;\n        await browserApi.subscribe(browserApi.eventsSubject,payload=>this.onPayload(payload));\n        if(this.closed)return;\n        await Promise.all([this.note.restore(),this.refreshMap()]);\n        this.restored=true;\n      } catch {\n        if(!this.closed){this.note.setConnected(false);this.setStatus('Не удалось загрузить данные карты через NATS. Повторяю подключение…',true);this.scheduleReconnect();}\n      }\n    })",
      "(async()=>{\n      try {\n        await browserApi.connect({url:this.config.nats.url,name:this.config.nats.clientName,sessionId:this.sessionId});\n        if(this.closed)return;\n        await browserApi.subscribe(browserApi.eventsSubject,payload=>this.onPayload(payload));\n        if(this.closed)return;\n        await Promise.all([this.note.restore(),this.refreshMap()]);\n        this.restored=true;\n      } catch {\n        if(!this.closed){this.note.setConnected(false);this.setStatus('Не удалось загрузить данные карты через NATS. Повторяю подключение…',true);this.scheduleReconnect();}\n      }\n    })().finally",
      "Promise.all",
      "Promise.resolve",
      "browserApi.connect",
      "browserApi.subscribe",
      "this.note.restore",
      "this.note.setConnected",
      "this.onPayload",
      "this.refreshMap",
      "this.scheduleReconnect",
      "this.setStatus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.connect.<callback>",
    "line": 78,
    "end": 89,
    "lines": 12,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "Promise.all",
      "browserApi.connect",
      "browserApi.subscribe",
      "this.note.restore",
      "this.note.setConnected",
      "this.onPayload",
      "this.refreshMap",
      "this.scheduleReconnect",
      "this.setStatus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.connect.<callback>.<callback>",
    "line": 82,
    "end": 82,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [
      "this.onPayload"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.connect.<callback>",
    "line": 89,
    "end": 89,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.onPayload",
    "line": 93,
    "end": 100,
    "lines": 8,
    "language": "typescript",
    "branches": 4,
    "calls": [
      "JSON.parse",
      "['weather_updated','demo_updated','domain_updated'].includes",
      "eventBelongsToSession",
      "record",
      "this.refreshMap"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.refreshMap",
    "line": 102,
    "end": 110,
    "lines": 9,
    "language": "typescript",
    "branches": 3,
    "calls": [
      "(async()=>{\n      const loaded=await this.aviation.refresh();\n      if(this.closed)return;\n      if(!loaded)this.setStatus('Не удалось загрузить карту. Нажмите «Обновить» в панели аэропортов.',true);\n    })",
      "(async()=>{\n      const loaded=await this.aviation.refresh();\n      if(this.closed)return;\n      if(!loaded)this.setStatus('Не удалось загрузить карту. Нажмите «Обновить» в панели аэропортов.',true);\n    })().finally",
      "this.aviation.refresh",
      "this.setStatus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.refreshMap.<callback>",
    "line": 104,
    "end": 108,
    "lines": 5,
    "language": "typescript",
    "branches": 2,
    "calls": [
      "this.aviation.refresh",
      "this.setStatus"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.refreshMap.<callback>",
    "line": 108,
    "end": 108,
    "lines": 1,
    "language": "typescript",
    "branches": 0,
    "calls": [],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  },
  {
    "path": "src_front/src/workspace/workspaceApp.ts",
    "name": "WorkspaceApp.dispose",
    "line": 112,
    "end": 117,
    "lines": 6,
    "language": "typescript",
    "branches": 1,
    "calls": [
      "browserApi.disconnect",
      "this.form.dispose",
      "this.forms.dispose",
      "this.note.dispose",
      "this.noteUi.dispose",
      "window.clearTimeout",
      "window.removeEventListener"
    ],
    "review": "Статическая инвентаризация; смысловая проверка по владельцу модуля"
  }
]
