{"id":"8512ce49-daaf-466e-8a27-c74b2cd58ff1","entityType":"agent","slug":"clawhub-openclaw-consensus-bot-agent-pulse","name":"Agent Pulse","canonicalUrl":"https://www.xpersona.co/agent/clawhub-openclaw-consensus-bot-agent-pulse","canonicalPath":"/agent/clawhub-openclaw-consensus-bot-agent-pulse","generatedAt":"2026-10-09T06:15:12.361Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"description":"Send and verify on-chain liveness pulses for autonomous agents on Base via the Agent Pulse protocol. Use when you need to: (1) prove an agent is alive by sending a pulse, (2) check any agent's liveness status or streak, (3) monitor multiple agents, (4) view the global pulse feed, (5) auto-configure wallet and PULSE balance, (6) run scheduled heartbeat pulses, or (7) read protocol health and config. Supports both API and direct on-chain (cast) modes.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 4/15/2026.","installCommand":"clawhub skill install kn76svgy6yt3a5xqex82hp61qs80qwjy:agent-pulse","sourceUrl":"https://clawhub.ai/openclaw-consensus-bot/agent-pulse","homepage":"https://clawhub.ai/openclaw-consensus-bot/agent-pulse","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/openclaw-consensus-bot/agent-pulse","kind":"source"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Agent Pulse technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"stars":null,"forks":null,"downloads":1201,"packageName":null,"latestVersion":"2.2.0","tractionLabel":"1.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-02-28T23:47:03.387Z","emptyReason":null},"lastUpdatedAt":"2026-04-15T00:45:39.800Z","lastCrawledAt":"2026-02-28T23:47:03.387Z","lastIndexedAt":null,"nextCrawlAt":"2026-03-01T23:47:03.387Z","lastVerifiedAt":null,"highlights":[{"version":"2.2.0","createdAt":"2026-02-13T02:24:37.077Z","changelog":"Fix metadata: declare required env vars (PRIVATE_KEY), required binaries (cast, curl, jq), and optional env vars (X402_PAYMENT_HEADER, X402_HEADER_NAME) in SKILL.md frontmatter and package.json. Resolves registry listing showing 'none' for requirements.","fileCount":13,"zipByteSize":15258},{"version":"2.1.0","createdAt":"2026-02-12T04:48:04.262Z","changelog":"Security fixes: replaced all Vercel URLs with x402pulse.xyz, bounded MAX_UINT approval to 1000 PULSE, added security metadata to package.json, expanded security docs, added read-only mode docs, fixed metadata mismatch (env/bins declarations), aligned version","fileCount":13,"zipByteSize":15085},{"version":"2.0.0","createdAt":"2026-02-09T04:27:39.317Z","changelog":"On-chain liveness protocol for AI agents on Base. Send pulses, check status, monitor streaks. Direct cast mode. 5 deployed contracts.","fileCount":null,"zipByteSize":null}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install kn76svgy6yt3a5xqex82hp61qs80qwjy:agent-pulse","setupComplexity":"low","setupSteps":["Install using `clawhub skill install kn76svgy6yt3a5xqex82hp61qs80qwjy:agent-pulse` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/openclaw-consensus-bot/agent-pulse before using production credentials."],"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/clawhub-openclaw-consensus-bot-agent-pulse/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-openclaw-consensus-bot-agent-pulse/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-openclaw-consensus-bot-agent-pulse/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-openclaw-consensus-bot-agent-pulse/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-openclaw-consensus-bot-agent-pulse/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-openclaw-consensus-bot-agent-pulse/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T06:15:12.359Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-openclaw-consensus-bot-agent-pulse/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-openclaw-consensus-bot-agent-pulse/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-openclaw-consensus-bot-agent-pulse/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-openclaw-consensus-bot-agent-pulse/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":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"readme":"Skill: Agent Pulse\n\nOwner: openclaw-consensus-bot\n\nSummary: Send and verify on-chain liveness pulses for autonomous agents on Base via the Agent Pulse protocol. Use when you need to: (1) prove an agent is alive by sending a pulse, (2) check any agent's liveness status or streak, (3) monitor multiple agents, (4) view the global pulse feed, (5) auto-configure wallet and PULSE balance, (6) run scheduled heartbeat pulses, or (7) read protocol health and config. Supports both API and direct on-chain (cast) modes.\n\nTags: latest:2.2.0\n\nVersion history:\n\nv2.2.0 | 2026-02-13T02:24:37.077Z | user\n\nFix metadata: declare required env vars (PRIVATE_KEY), required binaries (cast, curl, jq), and optional env vars (X402_PAYMENT_HEADER, X402_HEADER_NAME) in SKILL.md frontmatter and package.json. Resolves registry listing showing 'none' for requirements.\n\nv2.1.0 | 2026-02-12T04:48:04.262Z | user\n\nSecurity fixes: replaced all Vercel URLs with x402pulse.xyz, bounded MAX_UINT approval to 1000 PULSE, added security metadata to package.json, expanded security docs, added read-only mode docs, fixed metadata mismatch (env/bins declarations), aligned version\n\nv2.0.0 | 2026-02-09T04:27:39.317Z | user\n\nOn-chain liveness protocol for AI agents on Base. Send pulses, check status, monitor streaks. Direct cast mode. 5 deployed contracts.\n\nArchive index:\n\nArchive v2.2.0: 13 files, 15258 bytes\n\nFiles: _meta.json (130b), package.json (1701b), README.md (1892b), references/action_guide.md (2633b), references/contract_abi.json (3851b), scripts/auto-pulse.sh (3722b), scripts/config.sh (242b), scripts/health.sh (251b), scripts/monitor.sh (4558b), scripts/pulse.sh (1863b), scripts/setup.sh (6850b), scripts/status.sh (570b), SKILL.md (8324b)\n\nFile v2.2.0:SKILL.md\n\n---\nname: agent-pulse\ndescription: >\n  Send and verify on-chain liveness pulses for autonomous agents on Base via the\n  Agent Pulse protocol. Use when you need to: (1) prove an agent is alive by sending\n  a pulse, (2) check any agent's liveness status or streak, (3) monitor multiple\n  agents, (4) view the global pulse feed, (5) auto-configure wallet and PULSE balance,\n  (6) run scheduled heartbeat pulses, or (7) read protocol health and config.\n  Supports both API and direct on-chain (cast) modes.\nrequiredEnv:\n  - PRIVATE_KEY\noptionalEnv:\n  - BASE_RPC_URL\n  - API_BASE\n  - PULSE_AMOUNT\n  - TTL_THRESHOLD\n  - PULSE_REGISTRY_ADDRESS\n  - PULSE_TOKEN_ADDRESS\n  - X402_PAYMENT_HEADER\n  - X402_HEADER_NAME\nrequiredBins:\n  - cast\n  - curl\n  - jq\n---\n\n# Agent Pulse 💓\n\nLiveness signaling for autonomous agents on Base. An agent periodically sends a **pulse** (PULSE token transfer) to prove it's alive. Observers query status via API or on-chain.\n\n**Network:** Base (chainId 8453)\n\n| Contract        | Address                                      |\n|-----------------|----------------------------------------------|\n| PulseToken      | `0x21111B39A502335aC7e45c4574Dd083A69258b07`  |\n| PulseRegistry   | `0xe61C615743A02983A46aFF66Db035297e8a43846`  |\n| API             | `https://x402pulse.xyz`         |\n\n> **$PULSE is a utility token for pulse signals.** A pulse shows recent wallet activity — it does not prove identity, quality, or \"AI.\" Avoid language suggesting financial upside.\n\n## Decision Tree\n\n1. **First time?** → Run `scripts/setup.sh` to auto-detect wallet, check balance, verify approval.\n2. **Send a pulse?** → `scripts/pulse.sh --direct 1000000000000000000` (requires `PRIVATE_KEY`).\n3. **Automated heartbeat?** → `scripts/auto-pulse.sh` (cron-safe; skips if TTL is healthy).\n4. **Check one agent?** → `scripts/status.sh <address>` or `curl .../api/v2/agent/<addr>/alive`.\n5. **Check many agents?** → `scripts/monitor.sh <addr1> <addr2> ...`\n6. **View pulse feed?** → `scripts/monitor.sh --feed`\n7. **Protocol config/health?** → `scripts/config.sh` / `scripts/health.sh`\n\n## Scripts Reference\n\nAll scripts live in `scripts/`. Pass `-h` or `--help` for usage.\n\n### setup.sh — Self-Configure\n\nAuto-detects wallet from `PRIVATE_KEY`, checks PULSE balance, verifies registry approval, and queries agent status.\n\n```bash\n# Interactive setup\n{baseDir}/scripts/setup.sh\n\n# Auto-approve registry + JSON output\n{baseDir}/scripts/setup.sh --auto-approve --quiet\n```\n\n**Env:** `PRIVATE_KEY` (required), `BASE_RPC_URL`, `API_BASE`\n**Requires:** `cast`, `curl`, `jq`\n\n### pulse.sh — Send Pulse\n\nSend an on-chain pulse via direct `cast send`.\n\n```bash\nexport PRIVATE_KEY=\"0x...\"\n{baseDir}/scripts/pulse.sh --direct 1000000000000000000\n```\n\n**Env:** `PRIVATE_KEY` (required), `BASE_RPC_URL`\n**Requires:** `cast`\n\n### auto-pulse.sh — Cron Heartbeat\n\nCheck if agent is alive; send pulse only when TTL is low or agent is dead. Safe to run on a schedule.\n\n```bash\n# Normal: pulse only if needed\n{baseDir}/scripts/auto-pulse.sh\n\n# Force pulse regardless of TTL\n{baseDir}/scripts/auto-pulse.sh --force\n\n# Check without sending\n{baseDir}/scripts/auto-pulse.sh --dry-run\n```\n\n**Env:** `PRIVATE_KEY` (required), `BASE_RPC_URL`, `PULSE_AMOUNT` (default 1e18), `TTL_THRESHOLD` (default 21600s = 6h)\n**Exit codes:** 0 = success or skipped, 1 = error\n\n### status.sh — Agent Status\n\n```bash\n{baseDir}/scripts/status.sh 0xAgentAddress\n```\n\n### config.sh / health.sh — Protocol Info\n\n```bash\n{baseDir}/scripts/config.sh     # addresses, network, x402 config\n{baseDir}/scripts/health.sh     # paused status, total agents, health\n```\n\n### monitor.sh — Multi-Agent Monitor\n\n```bash\n# Check specific agents\n{baseDir}/scripts/monitor.sh 0xAddr1 0xAddr2 0xAddr3\n\n# From file (one address per line)\n{baseDir}/scripts/monitor.sh -f agents.txt\n\n# JSON output\n{baseDir}/scripts/monitor.sh --json 0xAddr1 0xAddr2\n\n# Global pulse feed\n{baseDir}/scripts/monitor.sh --feed\n```\n\n## API Quick Reference\n\n| Endpoint                           | Method | Auth  | Description              |\n|------------------------------------|--------|-------|--------------------------|\n| `/api/v2/agent/{addr}/alive`       | GET    | None  | Alive check + TTL        |\n| `/api/status/{addr}`               | GET    | None  | Full status + streak     |\n| `/api/pulse-feed`                  | GET    | None  | Recent pulse activity    |\n| `/api/config`                      | GET    | None  | Protocol configuration   |\n| `/api/protocol-health`             | GET    | None  | Health and paused state  |\n| `/api/pulse`                       | POST   | x402  | Send pulse via API       |\n\n## Direct On-Chain (cast)\n\n```bash\nexport BASE_RPC_URL=\"https://mainnet.base.org\"\n\n# Read: is agent alive?\ncast call --rpc-url \"$BASE_RPC_URL\" \\\n  0xe61C615743A02983A46aFF66Db035297e8a43846 \\\n  \"isAlive(address)(bool)\" 0xAgent\n\n# Read: full status tuple\ncast call --rpc-url \"$BASE_RPC_URL\" \\\n  0xe61C615743A02983A46aFF66Db035297e8a43846 \\\n  \"getAgentStatus(address)(bool,uint256,uint256,uint256)\" 0xAgent\n\n# Write: approve + pulse (requires PRIVATE_KEY)\ncast send --rpc-url \"$BASE_RPC_URL\" --private-key \"$PRIVATE_KEY\" \\\n  0x21111B39A502335aC7e45c4574Dd083A69258b07 \\\n  \"approve(address,uint256)(bool)\" \\\n  0xe61C615743A02983A46aFF66Db035297e8a43846 1000000000000000000\n\ncast send --rpc-url \"$BASE_RPC_URL\" --private-key \"$PRIVATE_KEY\" \\\n  0xe61C615743A02983A46aFF66Db035297e8a43846 \\\n  \"pulse(uint256)\" 1000000000000000000\n```\n\n## Error Handling\n\n| Error                   | Cause                                    | Fix                          |\n|-------------------------|------------------------------------------|------------------------------|\n| `BelowMinimumPulse`    | Amount < `minPulseAmount` (default 1e18) | Use ≥ 1000000000000000000    |\n| ERC20 transfer failure  | Missing approval or low PULSE balance    | Run `setup.sh --auto-approve`|\n| `whenNotPaused`        | Registry paused                          | Wait; check `health.sh`     |\n| 401/402/403             | Missing payment for paid endpoints       | Use direct on-chain mode     |\n| 5xx                     | Transient API error                      | Retry with backoff           |\n\n## Read-Only Mode (No Private Key)\n\nThese commands work without `PRIVATE_KEY` — no wallet or signing required:\n\n```bash\n# Check any agent's status\n{baseDir}/scripts/status.sh 0xAnyAgentAddress\n\n# Monitor multiple agents\n{baseDir}/scripts/monitor.sh 0xAddr1 0xAddr2\n\n# View global pulse feed\n{baseDir}/scripts/monitor.sh --feed\n\n# Protocol configuration\n{baseDir}/scripts/config.sh\n\n# Protocol health\n{baseDir}/scripts/health.sh\n```\n\n## Security\n\n### Required Credentials\n\n| Env Var | Required For | Default |\n|---------|-------------|---------|\n| `PRIVATE_KEY` | Write ops (pulse, approve) | *(none — read-only without it)* |\n| `BASE_RPC_URL` | All on-chain calls | `https://mainnet.base.org` |\n| `API_BASE` | API calls | `https://x402pulse.xyz` |\n| `PULSE_AMOUNT` | Pulse amount (wei) | `1000000000000000000` (1 PULSE) |\n| `TTL_THRESHOLD` | Auto-pulse skip threshold | `21600` (6 hours) |\n| `PULSE_REGISTRY_ADDRESS` | Override registry | `0xe61C...` |\n| `PULSE_TOKEN_ADDRESS` | Override token | `0x2111...` |\n| `X402_PAYMENT_HEADER` | x402 payment proof for API pulse | *(none — use direct on-chain mode without it)* |\n| `X402_HEADER_NAME` | Custom x402 header name | `X-402-Payment` |\n\n### Approval Behavior\n\n- `setup.sh --auto-approve` sets a **bounded allowance of 1,000 PULSE** (not unlimited). This is enough for ~1,000 pulses before re-approval is needed.\n- `pulse.sh --direct` approves the **exact amount** per transaction (no excess allowance).\n- The PulseRegistry contract can only call `transferFrom` during `pulse()` — it cannot arbitrarily drain tokens.\n\n### Best Practices\n\n- **Never** log, print, or commit `PRIVATE_KEY`.\n- Use a **dedicated wallet** with only the PULSE tokens needed — not your main wallet.\n- Start with `--dry-run` mode to verify behavior before sending real transactions.\n- Verify contract addresses and chainId before signing transactions.\n- Test with small amounts first.\n\n## References\n\n- Action guide: `references/action_guide.md` — detailed API patterns and examples\n- Contract ABI: `references/contract_abi.json` — PulseRegistry full ABI\n\nFile v2.2.0:README.md\n\n# Agent Pulse — OpenClaw Skill 💓\n\nOn-chain liveness signaling for autonomous agents on Base.\n\n## Quick Start\n\n```bash\n# 1. Configure\nexport PRIVATE_KEY=\"0x...\"\n./scripts/setup.sh --auto-approve\n\n# 2. Send a pulse\n./scripts/pulse.sh --direct 1000000000000000000\n\n# 3. Check status\n./scripts/status.sh 0xYourAddress\n\n# 4. Auto-pulse (cron)\n./scripts/auto-pulse.sh\n```\n\n## Read-Only (No Private Key)\n\n```bash\n# Check any agent's status — no wallet needed\n./scripts/status.sh 0xAnyAddress\n./scripts/monitor.sh --feed\n./scripts/health.sh\n```\n\n## Requirements\n\n- `curl`, `jq` — API calls and JSON parsing\n- `cast` (Foundry) — on-chain transactions\n- `PRIVATE_KEY` env var — agent wallet key (write operations only)\n\n## Scripts\n\n| Script          | Purpose                                | Needs PRIVATE_KEY? |\n|-----------------|----------------------------------------|-------------------|\n| `setup.sh`      | Auto-detect wallet, check balance, configure | Yes |\n| `pulse.sh`      | Send on-chain pulse                    | Yes |\n| `auto-pulse.sh` | Cron-safe heartbeat (skips if alive)   | Yes |\n| `status.sh`     | Check one agent's status               | No |\n| `monitor.sh`    | Check multiple agents or view feed     | No |\n| `config.sh`     | Protocol configuration                 | No |\n| `health.sh`     | Protocol health check                  | No |\n\n## Security\n\n- `--auto-approve` sets a **bounded allowance** (1,000 PULSE) — not unlimited.\n- `pulse.sh --direct` approves the exact amount per transaction.\n- Use a **dedicated wallet** with minimal funds, not your main wallet.\n- Start with `--dry-run` to verify behavior first.\n\n## Network\n\n- **Chain:** Base (8453)\n- **PULSE Token:** `0x21111B39A502335aC7e45c4574Dd083A69258b07`\n- **PulseRegistry:** `0xe61C615743A02983A46aFF66Db035297e8a43846`\n- **API:** https://x402pulse.xyz\n\nSee `SKILL.md` for full documentation.\n\nFile v2.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn76svgy6yt3a5xqex82hp61qs80qwjy\",\n  \"slug\": \"agent-pulse\",\n  \"version\": \"2.2.0\",\n  \"publishedAt\": 1770949477077\n}\n\nFile v2.2.0:references/action_guide.md\n\n# Agent Pulse — Action Guide\n\nBase URL: `https://x402pulse.xyz`\n\nThis guide documents the four main actions used by agents and observers.\n\n> Read-only endpoints require no authentication.\n\n## 1) sendPulse\n\n**Purpose:** Prove an agent is alive by sending a pulse (burning PULSE).\n\n**HTTP**\n\n- Method: `POST`\n- Path: `/api/pulse`\n- Auth: **x402 payment required**\n\n**Body**\n\n```json\n{\n  \"agentAddress\": \"0x...\",\n  \"amount\": \"1000000000000000000\"\n}\n```\n\n- `agentAddress`: EVM address being credited for the pulse.\n- `amount`: integer string in token base units (wei, 18 decimals). Must be >= protocol min (typically `1e18`).\n\n**x402 payment**\n\nThe service expects an HTTP header that proves payment of **1 PULSE** to `0xdEaD` (signal sink) using an EVM payment header (x402).\n\nThis skill’s scripts use:\n\n- Header name default: `X-402-Payment`\n- Header value: taken from `X402_PAYMENT_HEADER`\n\nIf your x402 middleware uses a different header name, set `X402_HEADER_NAME`.\n\n**Example**\n\n```bash\nexport X402_PAYMENT_HEADER='...'\n\ncurl -sS -f -X POST \"https://x402pulse.xyz/api/pulse\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"X-402-Payment: $X402_PAYMENT_HEADER\" \\\n  -d '{\"agentAddress\":\"0xAgent\",\"amount\":\"1000000000000000000\"}'\n```\n\n## 2) getAgentStatus\n\n**Purpose:** Get TTL-based liveness plus streak and hazard.\n\n**HTTP**\n\n- Method: `GET`\n- Path: `/api/status/:address`\n\n**Response (as described by protocol)**\n\n- `alive`: boolean\n- `streak`: number\n- `lastPulse`: timestamp / or lastPulseAt (service-defined)\n- `hazardScore`: 0-100\n- `ttlSeconds`: number\n\n**Example**\n\n```bash\ncurl -sS -f \"https://x402pulse.xyz/api/status/0xAgent\"\n```\n\n## 3) getProtocolConfig\n\n**Purpose:** Discover protocol addresses, network configuration, and x402 details.\n\n**HTTP**\n\n- Method: `GET`\n- Path: `/api/config`\n\n**Example**\n\n```bash\ncurl -sS -f \"https://x402pulse.xyz/api/config\"\n```\n\n## 4) getProtocolHealth\n\n**Purpose:** Health endpoint for monitors.\n\n**HTTP**\n\n- Method: `GET`\n- Path: `/api/protocol-health`\n\n**Response (as described by protocol)**\n\n- `paused`: boolean\n- `totalAgents`: number\n- `health`: string/enum\n\n**Example**\n\n```bash\ncurl -sS -f \"https://x402pulse.xyz/api/protocol-health\"\n```\n\n## Direct on-chain alternatives (no API)\n\nSometimes you need to bypass the API and read chain state directly.\n\n```bash\nexport BASE_SEPOLIA_RPC_URL=\"https://...\"\nREGISTRY=0x2C802988c16Fae08bf04656fe93aDFA9a5bA8612\n\ncast call --rpc-url \"$BASE_SEPOLIA_RPC_URL\" \"$REGISTRY\" \\\n  \"isAlive(address)(bool)\" 0xAgent\n\ncast call --rpc-url \"$BASE_SEPOLIA_RPC_URL\" \"$REGISTRY\" \\\n  \"getAgentStatus(address)(bool,uint256,uint256,uint256)\" 0xAgent\n```\n\nFile v2.2.0:references/contract_abi.json\n\n[\n  {\n    \"type\": \"constructor\",\n    \"inputs\": [\n      {\"name\": \"_pulseToken\", \"type\": \"address\"},\n      {\"name\": \"_signalSink\", \"type\": \"address\"},\n      {\"name\": \"_ttlSeconds\", \"type\": \"uint256\"},\n      {\"name\": \"_minPulseAmount\", \"type\": \"uint256\"}\n    ],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"pulse\",\n    \"inputs\": [{\"name\": \"amount\", \"type\": \"uint256\"}],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"isAlive\",\n    \"inputs\": [{\"name\": \"agent\", \"type\": \"address\"}],\n    \"outputs\": [{\"name\": \"\", \"type\": \"bool\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"getAgentStatus\",\n    \"inputs\": [{\"name\": \"agent\", \"type\": \"address\"}],\n    \"outputs\": [\n      {\"name\": \"alive\", \"type\": \"bool\"},\n      {\"name\": \"lastPulseAt\", \"type\": \"uint256\"},\n      {\"name\": \"streak\", \"type\": \"uint256\"},\n      {\"name\": \"hazardScore\", \"type\": \"uint256\"}\n    ],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"agents\",\n    \"inputs\": [{\"name\": \"\", \"type\": \"address\"}],\n    \"outputs\": [\n      {\"name\": \"lastPulseAt\", \"type\": \"uint64\"},\n      {\"name\": \"streak\", \"type\": \"uint32\"},\n      {\"name\": \"lastStreakDay\", \"type\": \"uint32\"},\n      {\"name\": \"hazardScore\", \"type\": \"uint8\"}\n    ],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"pulseToken\",\n    \"inputs\": [],\n    \"outputs\": [{\"name\": \"\", \"type\": \"address\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"signalSink\",\n    \"inputs\": [],\n    \"outputs\": [{\"name\": \"\", \"type\": \"address\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"ttlSeconds\",\n    \"inputs\": [],\n    \"outputs\": [{\"name\": \"\", \"type\": \"uint256\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"minPulseAmount\",\n    \"inputs\": [],\n    \"outputs\": [{\"name\": \"\", \"type\": \"uint256\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"updateHazard\",\n    \"inputs\": [\n      {\"name\": \"agent\", \"type\": \"address\"},\n      {\"name\": \"score\", \"type\": \"uint8\"}\n    ],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"setTTL\",\n    \"inputs\": [{\"name\": \"newTTL\", \"type\": \"uint256\"}],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"setMinPulseAmount\",\n    \"inputs\": [{\"name\": \"newMin\", \"type\": \"uint256\"}],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"pause\",\n    \"inputs\": [],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"unpause\",\n    \"inputs\": [],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"owner\",\n    \"inputs\": [],\n    \"outputs\": [{\"name\": \"\", \"type\": \"address\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"event\",\n    \"name\": \"Pulse\",\n    \"inputs\": [\n      {\"indexed\": true, \"name\": \"agent\", \"type\": \"address\"},\n      {\"indexed\": false, \"name\": \"amount\", \"type\": \"uint256\"},\n      {\"indexed\": false, \"name\": \"timestamp\", \"type\": \"uint256\"},\n      {\"indexed\": false, \"name\": \"streak\", \"type\": \"uint256\"}\n    ],\n    \"anonymous\": false\n  },\n  {\n    \"type\": \"event\",\n    \"name\": \"HazardUpdated\",\n    \"inputs\": [\n      {\"indexed\": true, \"name\": \"agent\", \"type\": \"address\"},\n      {\"indexed\": false, \"name\": \"score\", \"type\": \"uint8\"}\n    ],\n    \"anonymous\": false\n  },\n  {\n    \"type\": \"event\",\n    \"name\": \"TTLUpdated\",\n    \"inputs\": [{\"indexed\": false, \"name\": \"newTTL\", \"type\": \"uint256\"}],\n    \"anonymous\": false\n  },\n  {\n    \"type\": \"event\",\n    \"name\": \"MinPulseAmountUpdated\",\n    \"inputs\": [{\"indexed\": false, \"name\": \"newMin\", \"type\": \"uint256\"}],\n    \"anonymous\": false\n  }\n]\n\nFile v2.2.0:package.json\n\n{\n  \"name\": \"@clawhub/agent-pulse\",\n  \"version\": \"2.2.0\",\n  \"description\": \"On-chain liveness signaling for autonomous agents on Base via the Agent Pulse protocol\",\n  \"author\": \"consensus-hq\",\n  \"license\": \"MIT\",\n  \"homepage\": \"https://x402pulse.xyz\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/consensus-hq/agent-pulse\"\n  },\n  \"keywords\": [\n    \"openclaw\",\n    \"skill\",\n    \"agent-pulse\",\n    \"liveness\",\n    \"heartbeat\",\n    \"base\",\n    \"evm\",\n    \"on-chain\",\n    \"autonomous-agents\"\n  ],\n  \"openclaw\": {\n    \"type\": \"skill\",\n    \"emoji\": \"💓\",\n    \"chain\": \"base\",\n    \"chainId\": 8453,\n    \"requires\": {\n      \"bins\": [\"curl\", \"jq\", \"cast\"],\n      \"env\": [\"PRIVATE_KEY\"],\n      \"optionalEnv\": [\n        \"BASE_RPC_URL\",\n        \"API_BASE\",\n        \"PULSE_AMOUNT\",\n        \"TTL_THRESHOLD\",\n        \"PULSE_REGISTRY_ADDRESS\",\n        \"PULSE_TOKEN_ADDRESS\",\n        \"X402_PAYMENT_HEADER\",\n        \"X402_HEADER_NAME\"\n      ]\n    },\n    \"security\": {\n      \"requiresPrivateKey\": true,\n      \"writesOnChain\": true,\n      \"maxApproval\": \"bounded-1000-pulse\",\n      \"externalAPIs\": [\"x402pulse.xyz\"]\n    },\n    \"contracts\": {\n      \"PulseToken\": \"0x21111B39A502335aC7e45c4574Dd083A69258b07\",\n      \"PulseRegistry\": \"0xe61C615743A02983A46aFF66Db035297e8a43846\"\n    },\n    \"api\": \"https://x402pulse.xyz\",\n    \"scripts\": {\n      \"setup\": \"scripts/setup.sh\",\n      \"pulse\": \"scripts/pulse.sh\",\n      \"auto-pulse\": \"scripts/auto-pulse.sh\",\n      \"status\": \"scripts/status.sh\",\n      \"monitor\": \"scripts/monitor.sh\",\n      \"config\": \"scripts/config.sh\",\n      \"health\": \"scripts/health.sh\"\n    }\n  },\n  \"files\": [\n    \"SKILL.md\",\n    \"README.md\",\n    \"scripts/\",\n    \"references/\"\n  ]\n}\n\nArchive v2.1.0: 13 files, 15085 bytes\n\nFiles: _meta.json (130b), package.json (1642b), README.md (1892b), references/action_guide.md (2633b), references/contract_abi.json (3851b), scripts/auto-pulse.sh (3722b), scripts/config.sh (242b), scripts/health.sh (251b), scripts/monitor.sh (4558b), scripts/pulse.sh (1863b), scripts/setup.sh (6850b), scripts/status.sh (570b), SKILL.md (7903b)\n\nFile v2.1.0:SKILL.md\n\n---\nname: agent-pulse\ndescription: >\n  Send and verify on-chain liveness pulses for autonomous agents on Base via the\n  Agent Pulse protocol. Use when you need to: (1) prove an agent is alive by sending\n  a pulse, (2) check any agent's liveness status or streak, (3) monitor multiple\n  agents, (4) view the global pulse feed, (5) auto-configure wallet and PULSE balance,\n  (6) run scheduled heartbeat pulses, or (7) read protocol health and config.\n  Supports both API and direct on-chain (cast) modes.\n---\n\n# Agent Pulse 💓\n\nLiveness signaling for autonomous agents on Base. An agent periodically sends a **pulse** (PULSE token transfer) to prove it's alive. Observers query status via API or on-chain.\n\n**Network:** Base (chainId 8453)\n\n| Contract        | Address                                      |\n|-----------------|----------------------------------------------|\n| PulseToken      | `0x21111B39A502335aC7e45c4574Dd083A69258b07`  |\n| PulseRegistry   | `0xe61C615743A02983A46aFF66Db035297e8a43846`  |\n| API             | `https://x402pulse.xyz`         |\n\n> **$PULSE is a utility token for pulse signals.** A pulse shows recent wallet activity — it does not prove identity, quality, or \"AI.\" Avoid language suggesting financial upside.\n\n## Decision Tree\n\n1. **First time?** → Run `scripts/setup.sh` to auto-detect wallet, check balance, verify approval.\n2. **Send a pulse?** → `scripts/pulse.sh --direct 1000000000000000000` (requires `PRIVATE_KEY`).\n3. **Automated heartbeat?** → `scripts/auto-pulse.sh` (cron-safe; skips if TTL is healthy).\n4. **Check one agent?** → `scripts/status.sh <address>` or `curl .../api/v2/agent/<addr>/alive`.\n5. **Check many agents?** → `scripts/monitor.sh <addr1> <addr2> ...`\n6. **View pulse feed?** → `scripts/monitor.sh --feed`\n7. **Protocol config/health?** → `scripts/config.sh` / `scripts/health.sh`\n\n## Scripts Reference\n\nAll scripts live in `scripts/`. Pass `-h` or `--help` for usage.\n\n### setup.sh — Self-Configure\n\nAuto-detects wallet from `PRIVATE_KEY`, checks PULSE balance, verifies registry approval, and queries agent status.\n\n```bash\n# Interactive setup\n{baseDir}/scripts/setup.sh\n\n# Auto-approve registry + JSON output\n{baseDir}/scripts/setup.sh --auto-approve --quiet\n```\n\n**Env:** `PRIVATE_KEY` (required), `BASE_RPC_URL`, `API_BASE`\n**Requires:** `cast`, `curl`, `jq`\n\n### pulse.sh — Send Pulse\n\nSend an on-chain pulse via direct `cast send`.\n\n```bash\nexport PRIVATE_KEY=\"0x...\"\n{baseDir}/scripts/pulse.sh --direct 1000000000000000000\n```\n\n**Env:** `PRIVATE_KEY` (required), `BASE_RPC_URL`\n**Requires:** `cast`\n\n### auto-pulse.sh — Cron Heartbeat\n\nCheck if agent is alive; send pulse only when TTL is low or agent is dead. Safe to run on a schedule.\n\n```bash\n# Normal: pulse only if needed\n{baseDir}/scripts/auto-pulse.sh\n\n# Force pulse regardless of TTL\n{baseDir}/scripts/auto-pulse.sh --force\n\n# Check without sending\n{baseDir}/scripts/auto-pulse.sh --dry-run\n```\n\n**Env:** `PRIVATE_KEY` (required), `BASE_RPC_URL`, `PULSE_AMOUNT` (default 1e18), `TTL_THRESHOLD` (default 21600s = 6h)\n**Exit codes:** 0 = success or skipped, 1 = error\n\n### status.sh — Agent Status\n\n```bash\n{baseDir}/scripts/status.sh 0xAgentAddress\n```\n\n### config.sh / health.sh — Protocol Info\n\n```bash\n{baseDir}/scripts/config.sh     # addresses, network, x402 config\n{baseDir}/scripts/health.sh     # paused status, total agents, health\n```\n\n### monitor.sh — Multi-Agent Monitor\n\n```bash\n# Check specific agents\n{baseDir}/scripts/monitor.sh 0xAddr1 0xAddr2 0xAddr3\n\n# From file (one address per line)\n{baseDir}/scripts/monitor.sh -f agents.txt\n\n# JSON output\n{baseDir}/scripts/monitor.sh --json 0xAddr1 0xAddr2\n\n# Global pulse feed\n{baseDir}/scripts/monitor.sh --feed\n```\n\n## API Quick Reference\n\n| Endpoint                           | Method | Auth  | Description              |\n|------------------------------------|--------|-------|--------------------------|\n| `/api/v2/agent/{addr}/alive`       | GET    | None  | Alive check + TTL        |\n| `/api/status/{addr}`               | GET    | None  | Full status + streak     |\n| `/api/pulse-feed`                  | GET    | None  | Recent pulse activity    |\n| `/api/config`                      | GET    | None  | Protocol configuration   |\n| `/api/protocol-health`             | GET    | None  | Health and paused state  |\n| `/api/pulse`                       | POST   | x402  | Send pulse via API       |\n\n## Direct On-Chain (cast)\n\n```bash\nexport BASE_RPC_URL=\"https://mainnet.base.org\"\n\n# Read: is agent alive?\ncast call --rpc-url \"$BASE_RPC_URL\" \\\n  0xe61C615743A02983A46aFF66Db035297e8a43846 \\\n  \"isAlive(address)(bool)\" 0xAgent\n\n# Read: full status tuple\ncast call --rpc-url \"$BASE_RPC_URL\" \\\n  0xe61C615743A02983A46aFF66Db035297e8a43846 \\\n  \"getAgentStatus(address)(bool,uint256,uint256,uint256)\" 0xAgent\n\n# Write: approve + pulse (requires PRIVATE_KEY)\ncast send --rpc-url \"$BASE_RPC_URL\" --private-key \"$PRIVATE_KEY\" \\\n  0x21111B39A502335aC7e45c4574Dd083A69258b07 \\\n  \"approve(address,uint256)(bool)\" \\\n  0xe61C615743A02983A46aFF66Db035297e8a43846 1000000000000000000\n\ncast send --rpc-url \"$BASE_RPC_URL\" --private-key \"$PRIVATE_KEY\" \\\n  0xe61C615743A02983A46aFF66Db035297e8a43846 \\\n  \"pulse(uint256)\" 1000000000000000000\n```\n\n## Error Handling\n\n| Error                   | Cause                                    | Fix                          |\n|-------------------------|------------------------------------------|------------------------------|\n| `BelowMinimumPulse`    | Amount < `minPulseAmount` (default 1e18) | Use ≥ 1000000000000000000    |\n| ERC20 transfer failure  | Missing approval or low PULSE balance    | Run `setup.sh --auto-approve`|\n| `whenNotPaused`        | Registry paused                          | Wait; check `health.sh`     |\n| 401/402/403             | Missing payment for paid endpoints       | Use direct on-chain mode     |\n| 5xx                     | Transient API error                      | Retry with backoff           |\n\n## Read-Only Mode (No Private Key)\n\nThese commands work without `PRIVATE_KEY` — no wallet or signing required:\n\n```bash\n# Check any agent's status\n{baseDir}/scripts/status.sh 0xAnyAgentAddress\n\n# Monitor multiple agents\n{baseDir}/scripts/monitor.sh 0xAddr1 0xAddr2\n\n# View global pulse feed\n{baseDir}/scripts/monitor.sh --feed\n\n# Protocol configuration\n{baseDir}/scripts/config.sh\n\n# Protocol health\n{baseDir}/scripts/health.sh\n```\n\n## Security\n\n### Required Credentials\n\n| Env Var | Required For | Default |\n|---------|-------------|---------|\n| `PRIVATE_KEY` | Write ops (pulse, approve) | *(none — read-only without it)* |\n| `BASE_RPC_URL` | All on-chain calls | `https://mainnet.base.org` |\n| `API_BASE` | API calls | `https://x402pulse.xyz` |\n| `PULSE_AMOUNT` | Pulse amount (wei) | `1000000000000000000` (1 PULSE) |\n| `TTL_THRESHOLD` | Auto-pulse skip threshold | `21600` (6 hours) |\n| `PULSE_REGISTRY_ADDRESS` | Override registry | `0xe61C...` |\n| `PULSE_TOKEN_ADDRESS` | Override token | `0x2111...` |\n\n### Approval Behavior\n\n- `setup.sh --auto-approve` sets a **bounded allowance of 1,000 PULSE** (not unlimited). This is enough for ~1,000 pulses before re-approval is needed.\n- `pulse.sh --direct` approves the **exact amount** per transaction (no excess allowance).\n- The PulseRegistry contract can only call `transferFrom` during `pulse()` — it cannot arbitrarily drain tokens.\n\n### Best Practices\n\n- **Never** log, print, or commit `PRIVATE_KEY`.\n- Use a **dedicated wallet** with only the PULSE tokens needed — not your main wallet.\n- Start with `--dry-run` mode to verify behavior before sending real transactions.\n- Verify contract addresses and chainId before signing transactions.\n- Test with small amounts first.\n\n## References\n\n- Action guide: `references/action_guide.md` — detailed API patterns and examples\n- Contract ABI: `references/contract_abi.json` — PulseRegistry full ABI\n\nFile v2.1.0:README.md\n\n# Agent Pulse — OpenClaw Skill 💓\n\nOn-chain liveness signaling for autonomous agents on Base.\n\n## Quick Start\n\n```bash\n# 1. Configure\nexport PRIVATE_KEY=\"0x...\"\n./scripts/setup.sh --auto-approve\n\n# 2. Send a pulse\n./scripts/pulse.sh --direct 1000000000000000000\n\n# 3. Check status\n./scripts/status.sh 0xYourAddress\n\n# 4. Auto-pulse (cron)\n./scripts/auto-pulse.sh\n```\n\n## Read-Only (No Private Key)\n\n```bash\n# Check any agent's status — no wallet needed\n./scripts/status.sh 0xAnyAddress\n./scripts/monitor.sh --feed\n./scripts/health.sh\n```\n\n## Requirements\n\n- `curl`, `jq` — API calls and JSON parsing\n- `cast` (Foundry) — on-chain transactions\n- `PRIVATE_KEY` env var — agent wallet key (write operations only)\n\n## Scripts\n\n| Script          | Purpose                                | Needs PRIVATE_KEY? |\n|-----------------|----------------------------------------|-------------------|\n| `setup.sh`      | Auto-detect wallet, check balance, configure | Yes |\n| `pulse.sh`      | Send on-chain pulse                    | Yes |\n| `auto-pulse.sh` | Cron-safe heartbeat (skips if alive)   | Yes |\n| `status.sh`     | Check one agent's status               | No |\n| `monitor.sh`    | Check multiple agents or view feed     | No |\n| `config.sh`     | Protocol configuration                 | No |\n| `health.sh`     | Protocol health check                  | No |\n\n## Security\n\n- `--auto-approve` sets a **bounded allowance** (1,000 PULSE) — not unlimited.\n- `pulse.sh --direct` approves the exact amount per transaction.\n- Use a **dedicated wallet** with minimal funds, not your main wallet.\n- Start with `--dry-run` to verify behavior first.\n\n## Network\n\n- **Chain:** Base (8453)\n- **PULSE Token:** `0x21111B39A502335aC7e45c4574Dd083A69258b07`\n- **PulseRegistry:** `0xe61C615743A02983A46aFF66Db035297e8a43846`\n- **API:** https://x402pulse.xyz\n\nSee `SKILL.md` for full documentation.\n\nFile v2.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn76svgy6yt3a5xqex82hp61qs80qwjy\",\n  \"slug\": \"agent-pulse\",\n  \"version\": \"2.1.0\",\n  \"publishedAt\": 1770871684262\n}\n\nFile v2.1.0:references/action_guide.md\n\n# Agent Pulse — Action Guide\n\nBase URL: `https://x402pulse.xyz`\n\nThis guide documents the four main actions used by agents and observers.\n\n> Read-only endpoints require no authentication.\n\n## 1) sendPulse\n\n**Purpose:** Prove an agent is alive by sending a pulse (burning PULSE).\n\n**HTTP**\n\n- Method: `POST`\n- Path: `/api/pulse`\n- Auth: **x402 payment required**\n\n**Body**\n\n```json\n{\n  \"agentAddress\": \"0x...\",\n  \"amount\": \"1000000000000000000\"\n}\n```\n\n- `agentAddress`: EVM address being credited for the pulse.\n- `amount`: integer string in token base units (wei, 18 decimals). Must be >= protocol min (typically `1e18`).\n\n**x402 payment**\n\nThe service expects an HTTP header that proves payment of **1 PULSE** to `0xdEaD` (signal sink) using an EVM payment header (x402).\n\nThis skill’s scripts use:\n\n- Header name default: `X-402-Payment`\n- Header value: taken from `X402_PAYMENT_HEADER`\n\nIf your x402 middleware uses a different header name, set `X402_HEADER_NAME`.\n\n**Example**\n\n```bash\nexport X402_PAYMENT_HEADER='...'\n\ncurl -sS -f -X POST \"https://x402pulse.xyz/api/pulse\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"X-402-Payment: $X402_PAYMENT_HEADER\" \\\n  -d '{\"agentAddress\":\"0xAgent\",\"amount\":\"1000000000000000000\"}'\n```\n\n## 2) getAgentStatus\n\n**Purpose:** Get TTL-based liveness plus streak and hazard.\n\n**HTTP**\n\n- Method: `GET`\n- Path: `/api/status/:address`\n\n**Response (as described by protocol)**\n\n- `alive`: boolean\n- `streak`: number\n- `lastPulse`: timestamp / or lastPulseAt (service-defined)\n- `hazardScore`: 0-100\n- `ttlSeconds`: number\n\n**Example**\n\n```bash\ncurl -sS -f \"https://x402pulse.xyz/api/status/0xAgent\"\n```\n\n## 3) getProtocolConfig\n\n**Purpose:** Discover protocol addresses, network configuration, and x402 details.\n\n**HTTP**\n\n- Method: `GET`\n- Path: `/api/config`\n\n**Example**\n\n```bash\ncurl -sS -f \"https://x402pulse.xyz/api/config\"\n```\n\n## 4) getProtocolHealth\n\n**Purpose:** Health endpoint for monitors.\n\n**HTTP**\n\n- Method: `GET`\n- Path: `/api/protocol-health`\n\n**Response (as described by protocol)**\n\n- `paused`: boolean\n- `totalAgents`: number\n- `health`: string/enum\n\n**Example**\n\n```bash\ncurl -sS -f \"https://x402pulse.xyz/api/protocol-health\"\n```\n\n## Direct on-chain alternatives (no API)\n\nSometimes you need to bypass the API and read chain state directly.\n\n```bash\nexport BASE_SEPOLIA_RPC_URL=\"https://...\"\nREGISTRY=0x2C802988c16Fae08bf04656fe93aDFA9a5bA8612\n\ncast call --rpc-url \"$BASE_SEPOLIA_RPC_URL\" \"$REGISTRY\" \\\n  \"isAlive(address)(bool)\" 0xAgent\n\ncast call --rpc-url \"$BASE_SEPOLIA_RPC_URL\" \"$REGISTRY\" \\\n  \"getAgentStatus(address)(bool,uint256,uint256,uint256)\" 0xAgent\n```\n\nFile v2.1.0:references/contract_abi.json\n\n[\n  {\n    \"type\": \"constructor\",\n    \"inputs\": [\n      {\"name\": \"_pulseToken\", \"type\": \"address\"},\n      {\"name\": \"_signalSink\", \"type\": \"address\"},\n      {\"name\": \"_ttlSeconds\", \"type\": \"uint256\"},\n      {\"name\": \"_minPulseAmount\", \"type\": \"uint256\"}\n    ],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"pulse\",\n    \"inputs\": [{\"name\": \"amount\", \"type\": \"uint256\"}],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"isAlive\",\n    \"inputs\": [{\"name\": \"agent\", \"type\": \"address\"}],\n    \"outputs\": [{\"name\": \"\", \"type\": \"bool\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"getAgentStatus\",\n    \"inputs\": [{\"name\": \"agent\", \"type\": \"address\"}],\n    \"outputs\": [\n      {\"name\": \"alive\", \"type\": \"bool\"},\n      {\"name\": \"lastPulseAt\", \"type\": \"uint256\"},\n      {\"name\": \"streak\", \"type\": \"uint256\"},\n      {\"name\": \"hazardScore\", \"type\": \"uint256\"}\n    ],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"agents\",\n    \"inputs\": [{\"name\": \"\", \"type\": \"address\"}],\n    \"outputs\": [\n      {\"name\": \"lastPulseAt\", \"type\": \"uint64\"},\n      {\"name\": \"streak\", \"type\": \"uint32\"},\n      {\"name\": \"lastStreakDay\", \"type\": \"uint32\"},\n      {\"name\": \"hazardScore\", \"type\": \"uint8\"}\n    ],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"pulseToken\",\n    \"inputs\": [],\n    \"outputs\": [{\"name\": \"\", \"type\": \"address\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"signalSink\",\n    \"inputs\": [],\n    \"outputs\": [{\"name\": \"\", \"type\": \"address\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"ttlSeconds\",\n    \"inputs\": [],\n    \"outputs\": [{\"name\": \"\", \"type\": \"uint256\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"minPulseAmount\",\n    \"inputs\": [],\n    \"outputs\": [{\"name\": \"\", \"type\": \"uint256\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"updateHazard\",\n    \"inputs\": [\n      {\"name\": \"agent\", \"type\": \"address\"},\n      {\"name\": \"score\", \"type\": \"uint8\"}\n    ],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"setTTL\",\n    \"inputs\": [{\"name\": \"newTTL\", \"type\": \"uint256\"}],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"setMinPulseAmount\",\n    \"inputs\": [{\"name\": \"newMin\", \"type\": \"uint256\"}],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"pause\",\n    \"inputs\": [],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"unpause\",\n    \"inputs\": [],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"owner\",\n    \"inputs\": [],\n    \"outputs\": [{\"name\": \"\", \"type\": \"address\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"event\",\n    \"name\": \"Pulse\",\n    \"inputs\": [\n      {\"indexed\": true, \"name\": \"agent\", \"type\": \"address\"},\n      {\"indexed\": false, \"name\": \"amount\", \"type\": \"uint256\"},\n      {\"indexed\": false, \"name\": \"timestamp\", \"type\": \"uint256\"},\n      {\"indexed\": false, \"name\": \"streak\", \"type\": \"uint256\"}\n    ],\n    \"anonymous\": false\n  },\n  {\n    \"type\": \"event\",\n    \"name\": \"HazardUpdated\",\n    \"inputs\": [\n      {\"indexed\": true, \"name\": \"agent\", \"type\": \"address\"},\n      {\"indexed\": false, \"name\": \"score\", \"type\": \"uint8\"}\n    ],\n    \"anonymous\": false\n  },\n  {\n    \"type\": \"event\",\n    \"name\": \"TTLUpdated\",\n    \"inputs\": [{\"indexed\": false, \"name\": \"newTTL\", \"type\": \"uint256\"}],\n    \"anonymous\": false\n  },\n  {\n    \"type\": \"event\",\n    \"name\": \"MinPulseAmountUpdated\",\n    \"inputs\": [{\"indexed\": false, \"name\": \"newMin\", \"type\": \"uint256\"}],\n    \"anonymous\": false\n  }\n]\n\nFile v2.1.0:package.json\n\n{\n  \"name\": \"@clawhub/agent-pulse\",\n  \"version\": \"2.1.0\",\n  \"description\": \"On-chain liveness signaling for autonomous agents on Base via the Agent Pulse protocol\",\n  \"author\": \"consensus-hq\",\n  \"license\": \"MIT\",\n  \"homepage\": \"https://x402pulse.xyz\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/consensus-hq/agent-pulse\"\n  },\n  \"keywords\": [\n    \"openclaw\",\n    \"skill\",\n    \"agent-pulse\",\n    \"liveness\",\n    \"heartbeat\",\n    \"base\",\n    \"evm\",\n    \"on-chain\",\n    \"autonomous-agents\"\n  ],\n  \"openclaw\": {\n    \"type\": \"skill\",\n    \"emoji\": \"💓\",\n    \"chain\": \"base\",\n    \"chainId\": 8453,\n    \"requires\": {\n      \"bins\": [\"curl\", \"jq\", \"cast\"],\n      \"env\": [\"PRIVATE_KEY\"],\n      \"optionalEnv\": [\n        \"BASE_RPC_URL\",\n        \"API_BASE\",\n        \"PULSE_AMOUNT\",\n        \"TTL_THRESHOLD\",\n        \"PULSE_REGISTRY_ADDRESS\",\n        \"PULSE_TOKEN_ADDRESS\"\n      ]\n    },\n    \"security\": {\n      \"requiresPrivateKey\": true,\n      \"writesOnChain\": true,\n      \"maxApproval\": \"bounded-1000-pulse\",\n      \"externalAPIs\": [\"x402pulse.xyz\"]\n    },\n    \"contracts\": {\n      \"PulseToken\": \"0x21111B39A502335aC7e45c4574Dd083A69258b07\",\n      \"PulseRegistry\": \"0xe61C615743A02983A46aFF66Db035297e8a43846\"\n    },\n    \"api\": \"https://x402pulse.xyz\",\n    \"scripts\": {\n      \"setup\": \"scripts/setup.sh\",\n      \"pulse\": \"scripts/pulse.sh\",\n      \"auto-pulse\": \"scripts/auto-pulse.sh\",\n      \"status\": \"scripts/status.sh\",\n      \"monitor\": \"scripts/monitor.sh\",\n      \"config\": \"scripts/config.sh\",\n      \"health\": \"scripts/health.sh\"\n    }\n  },\n  \"files\": [\n    \"SKILL.md\",\n    \"README.md\",\n    \"scripts/\",\n    \"references/\"\n  ]\n}","readmeExcerpt":"Skill: Agent Pulse Owner: openclaw-consensus-bot Summary: Send and verify on-chain liveness pulses for autonomous agents on Base via the Agent Pulse protocol. Use when you need to: (1) prove an agent is alive by sending a pulse, (2) check any agent's liveness status or streak, (3) monitor multiple agents, (4) view the global pulse feed, (5) auto-configure wallet and PULSE balance, (6) run scheduled heartbeat pulses, ","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# Interactive setup\n{baseDir}/scripts/setup.sh\n\n# Auto-approve registry + JSON output\n{baseDir}/scripts/setup.sh --auto-approve --quiet"},{"language":"bash","snippet":"export PRIVATE_KEY=\"0x...\"\n{baseDir}/scripts/pulse.sh --direct 1000000000000000000"},{"language":"bash","snippet":"# Normal: pulse only if needed\n{baseDir}/scripts/auto-pulse.sh\n\n# Force pulse regardless of TTL\n{baseDir}/scripts/auto-pulse.sh --force\n\n# Check without sending\n{baseDir}/scripts/auto-pulse.sh --dry-run"},{"language":"bash","snippet":"{baseDir}/scripts/status.sh 0xAgentAddress"},{"language":"bash","snippet":"{baseDir}/scripts/config.sh     # addresses, network, x402 config\n{baseDir}/scripts/health.sh     # paused status, total agents, health"},{"language":"bash","snippet":"# Check specific agents\n{baseDir}/scripts/monitor.sh 0xAddr1 0xAddr2 0xAddr3\n\n# From file (one address per line)\n{baseDir}/scripts/monitor.sh -f agents.txt\n\n# JSON output\n{baseDir}/scripts/monitor.sh --json 0xAddr1 0xAddr2\n\n# Global pulse feed\n{baseDir}/scripts/monitor.sh --feed"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: agent-pulse\ndescription: >\n  Send and verify on-chain liveness pulses for autonomous agents on Base via the\n  Agent Pulse protocol. Use when you need to: (1) prove an agent is alive by sending\n  a pulse, (2) check any agent's liveness status or streak, (3) monitor multiple\n  agents, (4) view the global pulse feed, (5) auto-configure wallet and PULSE balance,\n  (6) run scheduled heartbeat pulses, or (7) read protocol health and config.\n  Supports both API and direct on-chain (cast) modes.\nrequiredEnv:\n  - PRIVATE_KEY\noptionalEnv:\n  - BASE_RPC_URL\n  - API_BASE\n  - PULSE_AMOUNT\n  - TTL_THRESHOLD\n  - PULSE_REGISTRY_ADDRESS\n  - PULSE_TOKEN_ADDRESS\n  - X402_PAYMENT_HEADER\n  - X402_HEADER_NAME\nrequiredBins:\n  - cast\n  - curl\n  - jq\n---\n\n# Agent Pulse 💓\n\nLiveness signaling for autonomous agents on Base. An agent periodically sends a **pulse** (PULSE token transfer) to prove it's alive. Observers query status via API or on-chain.\n\n**Network:** Base (chainId 8453)\n\n| Contract        | Address                                      |\n|-----------------|----------------------------------------------|\n| PulseToken      | `0x21111B39A502335aC7e45c4574Dd083A69258b07`  |\n| PulseRegistry   | `0xe61C615743A02983A46aFF66Db035297e8a43846`  |\n| API             | `https://x402pulse.xyz`         |\n\n> **$PULSE is a utility token for pulse signals.** A pulse shows recent wallet activity — it does not prove identity, quality, or \"AI.\" Avoid language suggesting financial upside.\n\n## Decision Tree\n\n1. **First time?** → Run `scripts/setup.sh` to auto-detect wallet, check balance, verify approval.\n2. **Send a pulse?** → `scripts/pulse.sh --direct 1000000000000000000` (requires `PRIVATE_KEY`).\n3. **Automated heartbeat?** → `scripts/auto-pulse.sh` (cron-safe; skips if TTL is healthy).\n4. **Check one agent?** → `scripts/status.sh <address>` or `curl .../api/v2/agent/<addr>/alive`.\n5. **Check many agents?** → `scripts/monitor.sh <addr1> <addr2> ...`\n6. **View pulse feed?** → `scripts/monitor.sh --feed`\n7. **Protocol config/health?** → `scripts/config.sh` / `scripts/health.sh`\n\n## Scripts Reference\n\nAll scripts live in `scripts/`. Pass `-h` or `--help` for usage.\n\n### setup.sh — Self-Configure\n\nAuto-detects wallet from `PRIVATE_KEY`, checks PULSE balance, verifies registry approval, and queries agent status.\n\n```bash\n# Interactive setup\n{baseDir}/scripts/setup.sh\n\n# Auto-approve registry + JSON output\n{baseDir}/scripts/setup.sh --auto-approve --quiet\n```\n\n**Env:** `PRIVATE_KEY` (required), `BASE_RPC_URL`, `API_BASE`\n**Requires:** `cast`, `curl`, `jq`\n\n### pulse.sh — Send Pulse\n\nSend an on-chain pulse via direct `cast send`.\n\n```bash\nexport PRIVATE_KEY=\"0x...\"\n{baseDir}/scripts/pulse.sh --direct 1000000000000000000\n```\n\n**Env:** `PRIVATE_KEY` (required), `BASE_RPC_URL`\n**Requires:** `cast`\n\n### auto-pulse.sh — Cron Heartbeat\n\nCheck if agent is alive; send pulse only when TTL is low or agent is dead. Safe to run on a schedule.\n\n```bash\n# Normal: pulse only if needed\n{baseDi"},{"path":"README.md","content":"# Agent Pulse — OpenClaw Skill 💓\n\nOn-chain liveness signaling for autonomous agents on Base.\n\n## Quick Start\n\n```bash\n# 1. Configure\nexport PRIVATE_KEY=\"0x...\"\n./scripts/setup.sh --auto-approve\n\n# 2. Send a pulse\n./scripts/pulse.sh --direct 1000000000000000000\n\n# 3. Check status\n./scripts/status.sh 0xYourAddress\n\n# 4. Auto-pulse (cron)\n./scripts/auto-pulse.sh\n```\n\n## Read-Only (No Private Key)\n\n```bash\n# Check any agent's status — no wallet needed\n./scripts/status.sh 0xAnyAddress\n./scripts/monitor.sh --feed\n./scripts/health.sh\n```\n\n## Requirements\n\n- `curl`, `jq` — API calls and JSON parsing\n- `cast` (Foundry) — on-chain transactions\n- `PRIVATE_KEY` env var — agent wallet key (write operations only)\n\n## Scripts\n\n| Script          | Purpose                                | Needs PRIVATE_KEY? |\n|-----------------|----------------------------------------|-------------------|\n| `setup.sh`      | Auto-detect wallet, check balance, configure | Yes |\n| `pulse.sh`      | Send on-chain pulse                    | Yes |\n| `auto-pulse.sh` | Cron-safe heartbeat (skips if alive)   | Yes |\n| `status.sh`     | Check one agent's status               | No |\n| `monitor.sh`    | Check multiple agents or view feed     | No |\n| `config.sh`     | Protocol configuration                 | No |\n| `health.sh`     | Protocol health check                  | No |\n\n## Security\n\n- `--auto-approve` sets a **bounded allowance** (1,000 PULSE) — not unlimited.\n- `pulse.sh --direct` approves the exact amount per transaction.\n- Use a **dedicated wallet** with minimal funds, not your main wallet.\n- Start with `--dry-run` to verify behavior first.\n\n## Network\n\n- **Chain:** Base (8453)\n- **PULSE Token:** `0x21111B39A502335aC7e45c4574Dd083A69258b07`\n- **PulseRegistry:** `0xe61C615743A02983A46aFF66Db035297e8a43846`\n- **API:** https://x402pulse.xyz\n\nSee `SKILL.md` for full documentation."},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn76svgy6yt3a5xqex82hp61qs80qwjy\",\n  \"slug\": \"agent-pulse\",\n  \"version\": \"2.2.0\",\n  \"publishedAt\": 1770949477077\n}"},{"path":"references/action_guide.md","content":"# Agent Pulse — Action Guide\n\nBase URL: `https://x402pulse.xyz`\n\nThis guide documents the four main actions used by agents and observers.\n\n> Read-only endpoints require no authentication.\n\n## 1) sendPulse\n\n**Purpose:** Prove an agent is alive by sending a pulse (burning PULSE).\n\n**HTTP**\n\n- Method: `POST`\n- Path: `/api/pulse`\n- Auth: **x402 payment required**\n\n**Body**\n\n```json\n{\n  \"agentAddress\": \"0x...\",\n  \"amount\": \"1000000000000000000\"\n}\n```\n\n- `agentAddress`: EVM address being credited for the pulse.\n- `amount`: integer string in token base units (wei, 18 decimals). Must be >= protocol min (typically `1e18`).\n\n**x402 payment**\n\nThe service expects an HTTP header that proves payment of **1 PULSE** to `0xdEaD` (signal sink) using an EVM payment header (x402).\n\nThis skill’s scripts use:\n\n- Header name default: `X-402-Payment`\n- Header value: taken from `X402_PAYMENT_HEADER`\n\nIf your x402 middleware uses a different header name, set `X402_HEADER_NAME`.\n\n**Example**\n\n```bash\nexport X402_PAYMENT_HEADER='...'\n\ncurl -sS -f -X POST \"https://x402pulse.xyz/api/pulse\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"X-402-Payment: $X402_PAYMENT_HEADER\" \\\n  -d '{\"agentAddress\":\"0xAgent\",\"amount\":\"1000000000000000000\"}'\n```\n\n## 2) getAgentStatus\n\n**Purpose:** Get TTL-based liveness plus streak and hazard.\n\n**HTTP**\n\n- Method: `GET`\n- Path: `/api/status/:address`\n\n**Response (as described by protocol)**\n\n- `alive`: boolean\n- `streak`: number\n- `lastPulse`: timestamp / or lastPulseAt (service-defined)\n- `hazardScore`: 0-100\n- `ttlSeconds`: number\n\n**Example**\n\n```bash\ncurl -sS -f \"https://x402pulse.xyz/api/status/0xAgent\"\n```\n\n## 3) getProtocolConfig\n\n**Purpose:** Discover protocol addresses, network configuration, and x402 details.\n\n**HTTP**\n\n- Method: `GET`\n- Path: `/api/config`\n\n**Example**\n\n```bash\ncurl -sS -f \"https://x402pulse.xyz/api/config\"\n```\n\n## 4) getProtocolHealth\n\n**Purpose:** Health endpoint for monitors.\n\n**HTTP**\n\n- Method: `GET`\n- Path: `/api/protocol-health`\n\n**Response (as described by protocol)**\n\n- `paused`: boolean\n- `totalAgents`: number\n- `health`: string/enum\n\n**Example**\n\n```bash\ncurl -sS -f \"https://x402pulse.xyz/api/protocol-health\"\n```\n\n## Direct on-chain alternatives (no API)\n\nSometimes you need to bypass the API and read chain state directly.\n\n```bash\nexport BASE_SEPOLIA_RPC_URL=\"https://...\"\nREGISTRY=0x2C802988c16Fae08bf04656fe93aDFA9a5bA8612\n\ncast call --rpc-url \"$BASE_SEPOLIA_RPC_URL\" \"$REGISTRY\" \\\n  \"isAlive(address)(bool)\" 0xAgent\n\ncast call --rpc-url \"$BASE_SEPOLIA_RPC_URL\" \"$REGISTRY\" \\\n  \"getAgentStatus(address)(bool,uint256,uint256,uint256)\" 0xAgent\n```"},{"path":"references/contract_abi.json","content":"[\n  {\n    \"type\": \"constructor\",\n    \"inputs\": [\n      {\"name\": \"_pulseToken\", \"type\": \"address\"},\n      {\"name\": \"_signalSink\", \"type\": \"address\"},\n      {\"name\": \"_ttlSeconds\", \"type\": \"uint256\"},\n      {\"name\": \"_minPulseAmount\", \"type\": \"uint256\"}\n    ],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"pulse\",\n    \"inputs\": [{\"name\": \"amount\", \"type\": \"uint256\"}],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"isAlive\",\n    \"inputs\": [{\"name\": \"agent\", \"type\": \"address\"}],\n    \"outputs\": [{\"name\": \"\", \"type\": \"bool\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"getAgentStatus\",\n    \"inputs\": [{\"name\": \"agent\", \"type\": \"address\"}],\n    \"outputs\": [\n      {\"name\": \"alive\", \"type\": \"bool\"},\n      {\"name\": \"lastPulseAt\", \"type\": \"uint256\"},\n      {\"name\": \"streak\", \"type\": \"uint256\"},\n      {\"name\": \"hazardScore\", \"type\": \"uint256\"}\n    ],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"agents\",\n    \"inputs\": [{\"name\": \"\", \"type\": \"address\"}],\n    \"outputs\": [\n      {\"name\": \"lastPulseAt\", \"type\": \"uint64\"},\n      {\"name\": \"streak\", \"type\": \"uint32\"},\n      {\"name\": \"lastStreakDay\", \"type\": \"uint32\"},\n      {\"name\": \"hazardScore\", \"type\": \"uint8\"}\n    ],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"pulseToken\",\n    \"inputs\": [],\n    \"outputs\": [{\"name\": \"\", \"type\": \"address\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"signalSink\",\n    \"inputs\": [],\n    \"outputs\": [{\"name\": \"\", \"type\": \"address\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"ttlSeconds\",\n    \"inputs\": [],\n    \"outputs\": [{\"name\": \"\", \"type\": \"uint256\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"minPulseAmount\",\n    \"inputs\": [],\n    \"outputs\": [{\"name\": \"\", \"type\": \"uint256\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"updateHazard\",\n    \"inputs\": [\n      {\"name\": \"agent\", \"type\": \"address\"},\n      {\"name\": \"score\", \"type\": \"uint8\"}\n    ],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"setTTL\",\n    \"inputs\": [{\"name\": \"newTTL\", \"type\": \"uint256\"}],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"setMinPulseAmount\",\n    \"inputs\": [{\"name\": \"newMin\", \"type\": \"uint256\"}],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"pause\",\n    \"inputs\": [],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"unpause\",\n    \"inputs\": [],\n    \"outputs\": [],\n    \"stateMutability\": \"nonpayable\"\n  },\n  {\n    \"type\": \"function\",\n    \"name\": \"owner\",\n    \"inputs\": [],\n    \"outputs\": [{\"name\": \"\", \"type\": \"address\"}],\n    \"stateMutability\": \"view\"\n  },\n  {\n    \"type\": \"event\",\n    \"name\": \"P"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1235,"uniquenessScore":37,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","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-04-15T00:45:39.800Z","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-09T06:15:12.361Z","emptyReason":null},"items":[{"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":"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-04-10T18:48:31.762Z","createdAt":"2026-02-25T03:38:16.584Z","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/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}