{"id":"cb1435e6-a239-475e-922f-60630ef0b292","entityType":"agent","slug":"crewai-cyberboy22-agenttrace","name":"Agenttrace","canonicalUrl":"https://www.xpersona.co/agent/crewai-cyberboy22-agenttrace","canonicalPath":"/agent/crewai-cyberboy22-agenttrace","generatedAt":"2026-10-10T05:39:17.635Z","source":"GITHUB_REPOS","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-09T14:52:36.724Z","emptyReason":null},"description":"Framework-agnostic tracer and replay UI for multi-agent LLM sessions — LangGraph, CrewAI, or custom. Traces survive crashes: a session that died mid-call still replays. agenttrace A framework-agnostic tracer and a single-file web UI for replaying multi-agent LLM sessions step by step — built for the moment something goes wrong three tool calls deep in a LangGraph/CrewAI chain and you need to reconstruct exactly what happened. - **Tracer**: a small Python package that records agent turns, tool calls, and LLM calls to a plain .jsonl file. Thread/async-safe, so concurrent agents don't","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. Last updated 10/9/2026.","installCommand":null,"sourceUrl":"https://github.com/Cyberboy22/Agenttrace","homepage":null,"primaryLinks":[{"label":"View Source","url":"https://github.com/Cyberboy22/Agenttrace","kind":"source"}],"safetyScore":66,"overallRank":22.2,"popularityScore":0,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Framework-agnostic tracer and replay UI for multi-agent LLM sessions — LangGraph, CrewAI, or custom. Traces survive crashes: a session that died mid-call still "},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T14:52:36.724Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[{"label":"crewai","status":"self-declared"},{"label":"multi-agent","status":"self-declared"}],"verifiedCount":0,"selfDeclaredCount":3,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"},{"key":"crewai","type":"capability","support":"supported","confidenceSource":"profile","notes":"Declared in agent profile metadata"},{"key":"multi-agent","type":"capability","support":"supported","confidenceSource":"profile","notes":"Declared in agent profile metadata"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile capability:crewai|supported|profile capability:multi-agent|supported|profile"}},"adoption":{"evidence":{"source":"no-adoption-signals","verified":false,"confidence":"low","updatedAt":"2026-10-09T14:52:36.724Z","emptyReason":"No source adoption metrics were available."},"stars":0,"forks":0,"downloads":null,"packageName":null,"latestVersion":null,"tractionLabel":null},"release":{"evidence":{"source":"agent-index","verified":false,"confidence":"medium","updatedAt":"2026-10-09T14:52:36.720Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T14:52:36.724Z","lastCrawledAt":"2026-10-09T14:52:36.720Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-16T14:52:36.720Z","lastVerifiedAt":null,"highlights":[]},"execution":{"evidence":{"source":"GITHUB REPOS","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":null,"setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/crewai-cyberboy22-agenttrace/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/crewai-cyberboy22-agenttrace/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/crewai-cyberboy22-agenttrace/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/crewai-cyberboy22-agenttrace/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/crewai-cyberboy22-agenttrace/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/crewai-cyberboy22-agenttrace/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"GITHUB_REPOS","generatedAt":"2026-10-10T05:39:17.634Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/crewai-cyberboy22-agenttrace/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/crewai-cyberboy22-agenttrace/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/crewai-cyberboy22-agenttrace/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/crewai-cyberboy22-agenttrace/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"GITHUB REPOS","verified":false,"confidence":"high","updatedAt":"2026-10-09T14:52:36.724Z","emptyReason":null},"readme":"# agenttrace\n\nA framework-agnostic tracer and a single-file web UI for replaying\nmulti-agent LLM sessions step by step — built for the moment something\ngoes wrong three tool calls deep in a LangGraph/CrewAI chain and you need\nto reconstruct exactly what happened.\n\n- **Tracer**: a small Python package that records agent turns, tool calls,\n  and LLM calls to a plain `.jsonl` file. Thread/async-safe, so concurrent\n  agents don't clobber each other's parent context.\n- **Adapters** for LangChain/LangGraph (a real `BaseCallbackHandler`) and\n  CrewAI (`step_callback`/`task_callback`), plus a manual API for anything\n  else.\n- **Viewer**: one dependency-free HTML file. Multi-agent timeline\n  (\"channels\", oscilloscope-style), step-through replay, an inspector\n  panel with input/output/errors, and — the actual point of the project —\n  a trace file left behind by a **crashed** process still replays, with\n  the call that never returned clearly marked.\n\nNo server, no account, no paid tier. Open `viewer/index.html` in a browser\nand drag a trace file onto it.\n\n## Why\n\nMulti-agent frameworks are opaque when something breaks mid-chain.\nSession replay tools exist, but the good ones are closed and paid. This\nis small enough to read in an afternoon and it works with whatever you're\nalready using.\n\n## Quickstart\n\n```bash\npip install -e .\npython examples/generic_example.py      # writes trace_generic.jsonl\nagenttrace-view trace_generic.jsonl      # opens the replay UI in your browser\n```\n\nNo Python at all? Open `viewer/index.html` directly (double-click it, or\n`open viewer/index.html`) and click **Samples** in the top right — it\nships with two built-in example traces, including one from a session that\ncrashed mid-call.\n\n## Instrumenting your own agents\n\n### Framework-agnostic (works with anything)\n\n```python\nfrom agenttrace import Tracer\n\ntracer = Tracer(session_name=\"my-run\", output=\"trace.jsonl\")\n\nwith tracer.agent(\"researcher\"):\n    with tracer.tool_call(\"search_web\", input={\"query\": \"...\"}) as s:\n        s.output = search(...)\n\n    with tracer.llm_call(\"summarize\", input={\"prompt\": \"...\"}) as s:\n        s.output = call_model(...)\n\ntracer.close()\n```\n\nSpans opened inside a `with tracer.agent(...)` block are automatically\nattributed to that agent — including from helper functions that don't\ntake a `tracer` argument — via `contextvars`, so it's safe across threads\nand asyncio tasks.\n\nA decorator form works too:\n\n```python\n@tracer.trace(type=\"tool_call\")\ndef search(query): ...\n\n@tracer.trace(type=\"llm_call\")\nasync def call_model(prompt): ...\n```\n\n### LangChain / LangGraph\n\nBoth share the same callback interface, so one handler covers a plain\nchain, an `AgentExecutor`, or a LangGraph graph:\n\n```python\nfrom agenttrace import Tracer\nfrom agenttrace.adapters.langchain import AgentTraceCallbackHandler\n\ntracer = Tracer(output=\"trace.jsonl\")\nhandler = AgentTraceCallbackHandler(\n    tracer,\n    # LangGraph puts the current node name in metadata — map it to an\n    # agent id so each node gets its own lane in the viewer:\n    agent_of=lambda tags, meta: meta.get(\"langgraph_node\"),\n)\n\ngraph.invoke(input, config={\"callbacks\": [handler]})\ntracer.close()\n```\n\nRequires `langchain-core` (`pip install agenttrace[langchain]`).\n\n### CrewAI\n\nCrewAI's `step_callback`/`task_callback` payload shape has shifted across\nversions, so this adapter reads it defensively rather than importing\nCrewAI's internal types:\n\n```python\nfrom agenttrace import Tracer\nfrom agenttrace.adapters.crewai import CrewAITracer\n\ntracer = Tracer(output=\"trace.jsonl\")\nct = CrewAITracer(tracer)\n\ncrew = Crew(\n    agents=[...],\n    tasks=[...],\n    step_callback=ct.on_step,\n    task_callback=ct.on_task,\n)\ncrew.kickoff()\ntracer.close()\n```\n\n## The trace format\n\nA trace is a `.jsonl` file — one JSON object per line, streamed as the\nrun happens rather than written once at the end. That's the whole design:\na span is emitted as a `span_start` event immediately, and a `span_end`\nevent when it finishes. If the process dies in between, the `span_start`\nline is still on disk, and the viewer renders it as an open, never-closed\ncall — which is usually the first clue to what went wrong.\n\n```jsonc\n{\"event\": \"session_start\", \"trace_id\": \"...\", \"session_name\": \"...\", \"start_time\": 1234.5}\n{\"event\": \"span_start\", \"span_id\": \"...\", \"trace_id\": \"...\", \"parent_id\": null,\n \"agent_id\": \"researcher\", \"agent_name\": \"researcher\", \"type\": \"tool_call\",\n \"name\": \"search_web\", \"start_time\": 1234.5, \"input\": {...}, \"metadata\": {}, \"tags\": []}\n{\"event\": \"span_end\", \"span_id\": \"...\", \"trace_id\": \"...\", \"end_time\": 1234.6,\n \"status\": \"success\", \"output\": {...}, \"error\": null, \"duration_ms\": 100}\n{\"event\": \"session_end\", \"trace_id\": \"...\", \"end_time\": 1234.7}\n```\n\n`type` is one of `agent`, `tool_call`, `llm_call`, `chain`, `retriever`,\n`message`, `custom`. `status` is `success`, `error`, or (implicitly, by\nhaving no matching `span_end`) `running`. This format has no framework\nassumptions baked in — writing a new adapter means translating your\nframework's own hooks into these two event shapes; see\n`agenttrace/adapters/langchain.py` for a fairly involved example and\n`agenttrace/adapters/crewai.py` for a minimal one.\n\n## The viewer\n\n- **Channels**: one lane per agent. Nested tool/LLM calls stack as\n  sub-rows within their agent's lane.\n- **Replay**: play/pause, step forward/back (steps land exactly on each\n  span's start or end and select it), a draggable scrubber, speed\n  control. Keyboard: `space` play/pause, `←`/`→` step, `/` search.\n- **Crash forensics**: if a trace has no `session_end`, or any span was\n  started and never closed, the header shows it plainly, the rail lists\n  which call(s) never returned, and those spans render with a pulsing\n  \"still open\" marker instead of quietly disappearing.\n- **Inspector**: name, agent, timing, full input/output (pretty-printed),\n  error + traceback, parent breadcrumb.\n- **Filter**: search by name/agent/type, filter by status, solo/mute\n  individual agent lanes, jump straight to any error via red tick marks\n  on the scrubber.\n- Loads a trace via drag-and-drop, a file picker, or `?trace=<url>` (used\n  by the CLI's local server). Everything runs client-side — a trace file\n  never leaves your machine.\n\n## `agenttrace-view` CLI\n\n```bash\nagenttrace-view path/to/trace.jsonl\n```\n\nSpins up a throwaway local server (so the browser's `fetch()` isn't\nblocked by `file://` CORS restrictions) and opens the viewer pointed at\nyour trace. `--no-open` prints the URL instead of launching a browser;\n`--port` picks a specific port.\n\n## Project layout\n\n```\nagenttrace/\n  agenttrace/\n    span.py, tracer.py, storage.py   # core: Span, Tracer, JSONL read/write\n    cli.py                            # `agenttrace-view`\n    adapters/\n      langchain.py                    # BaseCallbackHandler\n      crewai.py                       # step_callback / task_callback\n  viewer/\n    index.template.html               # markup + CSS (hand-edited)\n    engine.js                         # pure parsing/layout logic\n    app.js                            # DOM rendering + interaction\n    index.html                        # generated — see tools/build_viewer.py\n  examples/\n    generic_example.py, multi_agent_demo.py, crash_demo.py\n  tests/                              # pytest, core package\n  tools/build_viewer.py               # assembles viewer/index.html\n```\n\n`viewer/index.html` is generated output. If you edit `index.template.html`,\n`engine.js`, or `app.js`, re-run `python3 tools/build_viewer.py` (or\n`npm run build`) before shipping — it also drops a copy inside\n`agenttrace/_viewer_index.html` so the CLI works from an installed package,\nnot just a repo checkout.\n\n## Development\n\n```bash\npip install -e \".[dev]\"\npytest tests/                    # core package: 10 cases\n\nnpm install                      # jsdom, dev-only\nnode viewer/engine.test.js       # pure logic vs. the real demo trace files\nnode smoke_test.js               # jsdom: actually boots the viewer, clicks\n                                  # through load/select/filter/step/play/\n                                  # crash-forensics/error flows (17 cases)\nnode cli_e2e_test.js             # real HTTP server -> ?trace= -> fetch() ->\n                                  # rendered trace, exercising the CLI's\n                                  # actual serving path end to end\n```\n\n## Known limitations\n\n- The viewer re-renders the full SVG on every layout change rather than\n  diffing — fine for the hundreds-of-spans scale a debugging session\n  produces, not tuned for firehose-scale traces (thousands+ of spans).\n- The CrewAI adapter reads `step_callback`/`task_callback` payloads\n  defensively (`getattr` with fallbacks) because their shape has changed\n  across CrewAI releases; if you hit a shape it doesn't recognize, spans\n  still get recorded as a raw `repr()` rather than silently dropped —\n  please open an issue with the CrewAI version.\n- No AutoGen adapter yet — the generic `Tracer` API works fine as a\n  stopgap (wrap AutoGen's message-passing hooks by hand), but a dedicated\n  adapter would be a good contribution.\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n","readmeExcerpt":"agenttrace A framework-agnostic tracer and a single-file web UI for replaying multi-agent LLM sessions step by step — built for the moment something goes wrong three tool calls deep in a LangGraph/CrewAI chain and you need to reconstruct exactly what happened. - **Tracer**: a small Python package that records agent turns, tool calls, and LLM calls to a plain .jsonl file. Thread/async-safe, so concurrent agents don't ","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"pip install -e .\npython examples/generic_example.py      # writes trace_generic.jsonl\nagenttrace-view trace_generic.jsonl      # opens the replay UI in your browser"},{"language":"python","snippet":"from agenttrace import Tracer\n\ntracer = Tracer(session_name=\"my-run\", output=\"trace.jsonl\")\n\nwith tracer.agent(\"researcher\"):\n    with tracer.tool_call(\"search_web\", input={\"query\": \"...\"}) as s:\n        s.output = search(...)\n\n    with tracer.llm_call(\"summarize\", input={\"prompt\": \"...\"}) as s:\n        s.output = call_model(...)\n\ntracer.close()"},{"language":"python","snippet":"@tracer.trace(type=\"tool_call\")\ndef search(query): ...\n\n@tracer.trace(type=\"llm_call\")\nasync def call_model(prompt): ..."},{"language":"python","snippet":"from agenttrace import Tracer\nfrom agenttrace.adapters.langchain import AgentTraceCallbackHandler\n\ntracer = Tracer(output=\"trace.jsonl\")\nhandler = AgentTraceCallbackHandler(\n    tracer,\n    # LangGraph puts the current node name in metadata — map it to an\n    # agent id so each node gets its own lane in the viewer:\n    agent_of=lambda tags, meta: meta.get(\"langgraph_node\"),\n)\n\ngraph.invoke(input, config={\"callbacks\": [handler]})\ntracer.close()"},{"language":"python","snippet":"from agenttrace import Tracer\nfrom agenttrace.adapters.crewai import CrewAITracer\n\ntracer = Tracer(output=\"trace.jsonl\")\nct = CrewAITracer(tracer)\n\ncrew = Crew(\n    agents=[...],\n    tasks=[...],\n    step_callback=ct.on_step,\n    task_callback=ct.on_task,\n)\ncrew.kickoff()\ntracer.close()"},{"language":"jsonc","snippet":"{\"event\": \"session_start\", \"trace_id\": \"...\", \"session_name\": \"...\", \"start_time\": 1234.5}\n{\"event\": \"span_start\", \"span_id\": \"...\", \"trace_id\": \"...\", \"parent_id\": null,\n \"agent_id\": \"researcher\", \"agent_name\": \"researcher\", \"type\": \"tool_call\",\n \"name\": \"search_web\", \"start_time\": 1234.5, \"input\": {...}, \"metadata\": {}, \"tags\": []}\n{\"event\": \"span_end\", \"span_id\": \"...\", \"trace_id\": \"...\", \"end_time\": 1234.6,\n \"status\": \"success\", \"output\": {...}, \"error\": null, \"duration_ms\": 100}\n{\"event\": \"session_end\", \"trace_id\": \"...\", \"end_time\": 1234.7}"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[],"languages":["python"],"docsSourceLabel":"GITHUB REPOS","editorialOverview":"Framework-agnostic tracer and replay UI for multi-agent LLM sessions — LangGraph, CrewAI, or custom. Traces survive crashes: a session that died mid-call still replays. agenttrace A framework-agnostic tracer and a single-file web UI for replaying multi-agent LLM sessions step by step — built for the moment something goes wrong three tool calls deep in a LangGraph/CrewAI chain and you need to reconstruct exactly what happened. - **Tracer**: a small Python package that records agent turns, tool calls, and LLM calls to a plain .jsonl file. Thread/async-safe, so concurrent agents don't","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":382,"uniquenessScore":69,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T14:52:36.724Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T14:52:36.724Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:39:17.635Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/github_repos","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}