Self-monitor your agent's health and maintain persistent memory across sessions.
python3 {baseDir}/scripts/report.py --register \
--name "my-agent" \
--owner "you@email.com" \
--model "claude-opus-4-6" \
--provider "Anthropic"
This returns an agentId and apiKey. Store both.
After registering, run the setup script to auto-patch your AGENTS.md and HEARTBEAT.md:
python3 {baseDir}/scripts/setup.py \
--agent-id <your-agent-id> \
--api-key <your-api-key>
This adds:
/recover after compactionAdd to your HEARTBEAT.md:
## ContextClear Self-Report
Agent ID: <your-agent-id>
API Key: <your-api-key>
API URL: https://api.contextclear.com/api
When starting a new session, call both the recovery endpoint AND sticky notes poll.
The recovery endpoint does NOT include sticky notes — they are separate persistent reminders
from the user that must be checked independently.
Step 1: Recovery briefing (includes sticky notes)
curl -s {apiUrl}/agents/{agentId}/recover \
-H "X-API-Key: <api-key>"
Returns:
{
"lastSession": { "summary": "...", "repos": [...], "files": [...] },
"openThreads": ["..."],
"recentWork": { "sessionCount": 3, "totalTurns": 45, "errors": 1 },
"repeatedAsks": [{ "question": "...", "count": 3, "suggestedFix": "..." }],
"frequentResources": { "repos": {...}, "tools": {...} },
"stickyNotes": [
{ "id": "...", "content": "Remember: pro repo deploys to free URL", "pinned": true, "createdAt": "..." }
]
}
The stickyNotes field contains persistent user reminders/corrections (pinned first).
Treat these as ground truth — the user left them specifically so you don't forget.
Only present when active (non-archived) sticky notes exist.
Step 2: Check for pending memory curation
curl -s {apiUrl}/agents/{agentId}/memory/curate/latest \
-H "X-API-Key: <api-key>"
If a curation is pending, review and apply it to MEMORY.md.
Why this matters: Without recovery, you'll forget repos, decisions, and corrections
from prior sessions. The user should never have to re-teach you things that are in your
own memory system. Always recover before doing any work.
After any meaningful work (coding, research, decisions, memory updates), save a context snapshot.
This is how ContextClear tracks your context, detects gaps, and provides recovery briefings.
Post a snapshot every time you do real work, not just on heartbeats.
curl -X POST {apiUrl}/agents/{agentId}/context \
-H "Content-Type: application/json" \
-H "X-API-Key: <api-key>" \
-d '{
"sessionId": "main-session-2026-03-09",
"summary": "Built Best Of collections for FW, fixed dup check, removed keyword boost",
"repos": ["nebulent/fridayswatchlist"],
"files": ["AuctionService.java", "DiscoverController.java", "BestOfCollections.tsx"],
"tools": ["MongoDB Atlas (fridayswatchlist)", "Railway deploy", "Bitbucket"],
"decisions": ["Removed keyword boost regex - hybrid search covers it", "Cache collections for 48h"],
"openThreads": ["Delete stale Corvette dup", "Update contextclear skill"],
"environment": { "apiUrl": "api.fridayswatchlist.com", "frontendUrl": "app.fridayswatchlist.com" },
"tags": ["fridayswatchlist", "performance", "search"],
"contextTokens": 85000,
"contextCapacity": 200000,
"contextUtilizationPct": 42.5
}'
When you realize you're asking the user for info you should already know:
curl -X POST {apiUrl}/agents/{agentId}/context/ask \
-H "Content-Type: application/json" \
-H "X-API-Key: <api-key>" \
-d '{"question": "What is the MongoDB connection string?", "sessionId": "main-session-2026-03-09"}'
curl -s {apiUrl}/agents/{agentId}/what-i-know \
-H "X-API-Key: <api-key>"
Returns a structured knowledge base + AI-generated narrative summary of everything the agent knows, works on, and keeps forgetting. Cached for 4 hours; use ?refresh=true to regenerate.
curl -s {apiUrl}/agents/{agentId}/context/gaps \
-H "X-API-Key: <api-key>"
Returns unresolved repeated asks (count >= 2) — things the agent keeps forgetting.
# Session-start briefing
curl -s {apiUrl}/agents/{agentId}/briefing -H "X-API-Key: <api-key>"
# Daily briefing
curl -s {apiUrl}/agents/{agentId}/briefing/daily -H "X-API-Key: <api-key>"
# Weekly briefing
curl -s {apiUrl}/agents/{agentId}/briefing/weekly -H "X-API-Key: <api-key>"
## ContextClear (HEARTBEAT.md)
**Step 1: Check vacation**
curl -s {apiUrl}/agents/{agentId}/vacation -H "X-API-Key: <key>"
If onVacation: true → HEARTBEAT_OK immediately.
**Step 2: Poll sticky notes**
curl -s {apiUrl}/agents/{agentId}/sticky-notes/poll -H "X-API-Key: <key>"
**Step 3: Check context reload**
curl -s {apiUrl}/agents/{agentId}/context/reload/pending -H "X-API-Key: <key>"
**Step 4: Report metrics**
Use session_status to get tokens, then POST /api/metrics/{agentId}
**Step 5: Report context snapshot (MANDATORY after real work)**
POST /api/agents/{agentId}/context with summary of what was worked on.
Do NOT skip this — even a 1-line summary is better than nothing.
**Step 6: Vault backup (daily — first heartbeat after 8 AM)**
Read SOUL.md, MEMORY.md, AGENTS.md, USER.md, TOOLS.md, IDENTITY.md,
HEARTBEAT.md, and today's memory file → POST to vault/backup.
Check heartbeat-state.json to avoid duplicate backups.
**Step 7: Context recovery (first heartbeat of day or after compaction)**
GET /api/agents/{agentId}/recover — review and self-correct any gaps.
python3 {baseDir}/scripts/report.py \
--agent-id <id> --api-key <key> \
--tokens-in 50000 --tokens-out 2000 \
--cost 1.25 --context-util 65
python3 {baseDir}/scripts/report.py \
--agent-id <id> --api-key <key> \
--event-type HEARTBEAT \
--tokens-in 50000 --tokens-out 2000 \
--tool-calls 12 --tool-failures 1 \
--grounded-responses 8 --total-responses 10 \
--memory-searches 3
IMPORTANT — include sessionId to populate the Flight Recorder & Burnout Prediction:
curl -X POST {apiUrl}/metrics/{agentId} \
-H "Content-Type: application/json" \
-H "X-API-Key: <api-key>" \
-d '{
"eventType": "HEARTBEAT",
"sessionId": "main-2026-03-17",
"inputTokens": 5000,
"outputTokens": 500,
"contextUtilization": 65.0,
"toolCalls": 8,
"toolFailures": 1,
"memorySearches": 2
}'
The sessionId field is required for these features to work:
Use a date-based format like main-YYYY-MM-DD so turns group by day.
turnNumber auto-increments server-side if omitted.
Optional quality signals (also populate Flight Recorder):
correctionCycles — times user asked to fix/redo somethingcompilationErrors — code that didn't compiletaskSwitches — topic/file context switchestaskCategory — "coding", "email", "search", "chat", etc.| Metric | Your Input |
|---|---|
| -------- | ------------ |
| Hallucination Score | toolCalls, toolFailures, groundedResponses, totalResponses |
| Quality Decay Score | correctionCycles, compilationErrors, contextUtilization |
| Burnout Score | Automatic from event data |
| Context Gaps | Automatic from repeated asks |
| Method | Endpoint | Description |
|---|---|---|
| -------- | ---------- | ------------- |
POST | /api/metrics/register | Self-register agent |
POST | /api/metrics/{agentId} | Report metric event |
GET | /api/agents/{id} | Agent details |
POST | /api/agents/{id}/context | Save context snapshot |
GET | /api/agents/{id}/context | Latest context |
GET | /api/agents/{id}/recover | Recovery briefing |
POST | /api/agents/{id}/context/ask | Report repeated ask |
GET | /api/agents/{id}/context/gaps | Context gaps |
GET | /api/agents/{id}/what-i-know | AI-summarized knowledge |
GET | /api/agents/{id}/briefing | Latest briefing |
GET | /api/agents/{id}/briefing/daily | Daily briefing |
GET | /api/agents/{id}/briefing/weekly | Weekly briefing |
GET | /api/agents/{id}/vacation | Vacation status |
GET | /api/agents/{id}/sticky-notes | List active sticky notes (JSON) |
GET | /api/agents/{id}/sticky-notes/poll | Poll sticky notes (plain text, 204 if none) |
POST | /api/agents/{id}/sticky-notes | Create sticky note |
PUT | /api/agents/{id}/sticky-notes/{noteId} | Update sticky note |
DELETE | /api/agents/{id}/sticky-notes/{noteId} | Archive sticky note |
POST | /api/agents/{id}/sticky-notes/{noteId}/pin | Toggle pin |
POST | /api/agents/{id}/context/reload | Request context reload |
GET | /api/agents/{id}/context/reload/pending | Check for pending reload |
POST | /api/agents/{id}/context/reload/{reloadId}/ack | Acknowledge reload |
POST | /api/agents/{id}/memory/curate | Trigger memory curation |
GET | /api/agents/{id}/memory/curate/latest | Latest pending curation |
GET | /api/agents/{id}/memory/curate/history | Curation history |
POST | /api/agents/{id}/memory/curate/{curationId}/apply | Mark curation applied |
POST | /api/agents/{id}/memory/curate/{curationId}/dismiss | Dismiss curation |
POST | /api/agents/{id}/vault/backup | Push workspace backup |
GET | /api/agents/{id}/vault/backups | List backups |
GET | /api/agents/{id}/vault/backups/{backupId} | Get backup metadata |
GET | /api/agents/{id}/vault/backups/{backupId}/files | Get backup files |
GET | /api/agents/{id}/vault/latest | Latest backup summary |
GET | /api/agents/{id}/vault/latest/download | Download latest (restore) |
GET | /api/agents/{id}/vault/file-history | File version history |
GET | /api/agents/{id}/vault/diff | Diff two backups |
GET | /api/agents/{id}/vault/stats | Vault statistics |
DELETE | /api/agents/{id}/vault/backups/{backupId} | Delete backup |
Sticky notes are persistent notes left by the user for the agent. Always poll on every heartbeat/ping.
curl -s {apiUrl}/agents/{agentId}/sticky-notes/poll \
-H "X-API-Key: <api-key>"
Returns plain text (one note per line, pinned first):
📌 Remember: C&B pitch goes to Keenan, not Doug
📌 OAuth token for jcvd@netflexity.com needs re-auth
Don't forget to check Friday's Watchlist deployment after the search fix
If no notes, returns HTTP 204. Treat these as persistent reminders — they stay until the user archives them.
# List all active notes (JSON)
curl -s {apiUrl}/agents/{agentId}/sticky-notes -H "X-API-Key: <api-key>"
# Create a note
curl -X POST {apiUrl}/agents/{agentId}/sticky-notes \
-H "Content-Type: application/json" \
-H "X-API-Key: <api-key>" \
-d '{"content": "Check deployment status", "color": "yellow", "pinned": false}'
# Update a note
curl -X PUT {apiUrl}/agents/{agentId}/sticky-notes/{noteId} \
-H "Content-Type: application/json" \
-H "X-API-Key: <api-key>" \
-d '{"content": "Updated text", "pinned": true}'
# Archive (delete) a note
curl -X DELETE {apiUrl}/agents/{agentId}/sticky-notes/{noteId} \
-H "X-API-Key: <api-key>"
# Toggle pin
curl -X POST {apiUrl}/agents/{agentId}/sticky-notes/{noteId}/pin \
-H "X-API-Key: <api-key>"
Users can request you reload a specific context snapshot from the Memory UI.
Check for pending reloads on session start or heartbeat:
curl -s {apiUrl}/agents/{agentId}/context/reload/pending \
-H "X-API-Key: <api-key>"
If a reload is pending (HTTP 200), the response includes the snapshot data.
Apply it to restore context, then acknowledge:
curl -X POST {apiUrl}/agents/{agentId}/context/reload/{reloadId}/ack \
-H "X-API-Key: <api-key>"
If no reload is pending, the endpoint returns HTTP 204 (no content).
Back up your agent's workspace files (SOUL.md, MEMORY.md, AGENTS.md, etc.) to ContextClear's encrypted vault. Restore after crashes, compaction, or migration.
curl -X POST {apiUrl}/agents/{agentId}/vault/backup \
-H "Content-Type: application/json" \
-H "X-API-Key: <api-key>" \
-d '{
"files": [
{"fileName": "SOUL.md", "content": "# Who I Am\n...", "mimeType": "text/markdown"},
{"fileName": "MEMORY.md", "content": "# Long-Term Memory\n...", "mimeType": "text/markdown"},
{"fileName": "memory/2026-03-15.md", "content": "...", "mimeType": "text/markdown"}
],
"label": "post-deployment",
"source": "openclaw-heartbeat",
"metadata": {"trigger": "heartbeat", "model": "claude-opus-4-6"}
}'
Files are encrypted at rest with SHA-256 dedup (unchanged files aren't re-stored).
curl -s {apiUrl}/agents/{agentId}/vault/backups?limit=20 \
-H "X-API-Key: <api-key>"
curl -s {apiUrl}/agents/{agentId}/vault/latest/download \
-H "X-API-Key: <api-key>"
Returns backup metadata + all file contents (decrypted). Write files back to workspace.
# List files in a backup (metadata only)
curl -s {apiUrl}/agents/{agentId}/vault/backups/{backupId}/files \
-H "X-API-Key: <api-key>"
# Get a single file (decrypted content)
curl -s {apiUrl}/agents/{agentId}/vault/backups/{backupId}/files/SOUL.md \
-H "X-API-Key: <api-key>"
Track how a file evolved across backups:
curl -s "{apiUrl}/agents/{agentId}/vault/file-history?fileName=SOUL.md&limit=10" \
-H "X-API-Key: <api-key>"
curl -s "{apiUrl}/agents/{agentId}/vault/diff?from={backupId1}&to={backupId2}" \
-H "X-API-Key: <api-key>"
Returns added, removed, and modified files between two backups.
curl -s {apiUrl}/agents/{agentId}/vault/stats \
-H "X-API-Key: <api-key>"
Back up workspace files to ContextClear's encrypted vault once per day.
Do this on the first heartbeat after 8 AM if no backup was done today.
Files to always back up:
SOUL.md, MEMORY.md, AGENTS.md, USER.md, TOOLS.md, IDENTITY.md, HEARTBEAT.mdmemory/YYYY-MM-DD.mdTrack last backup in memory/heartbeat-state.json:
{"lastVaultBackup": 1710600000}
SHA-256 dedup means unchanged files aren't re-stored — safe to run daily.
Add to your HEARTBEAT.md:
## Identity Vault Backup (daily — first heartbeat after 8 AM)
Read core workspace files and POST to vault/backup.
Check heartbeat-state.json to avoid duplicate backups.
Auto-summarize daily notes into MEMORY.md updates. Agents write daily logs but rarely
consolidate them — the curator does it automatically.
# On-demand (analyze last 7 days, deliver via sticky note)
curl -X POST {apiUrl}/agents/{agentId}/memory/curate?days=7¬ify=true \
-H "X-API-Key: <api-key>"
Response:
{
"id": "...",
"status": "PENDING",
"changeSummary": "Added FW search fixes, NSX fair value improvements. Removed stale OAuth note.",
"suggestedAdditions": "## FW Search\n- Smart search routing...",
"suggestedRemovals": ["OAuth token expired note (resolved)"],
"suggestedMemory": "# MEMORY.md - Long-Term Memory\n...",
"dailyNotesAnalyzed": 5,
"snapshotsAnalyzed": 3,
"delivered": true
}
# Get latest pending curation
curl -s {apiUrl}/agents/{agentId}/memory/curate/latest -H "X-API-Key: <key>"
# Mark as applied (after updating MEMORY.md)
curl -X POST {apiUrl}/agents/{agentId}/memory/curate/{curationId}/apply -H "X-API-Key: <key>"
# Dismiss if not useful
curl -X POST {apiUrl}/agents/{agentId}/memory/curate/{curationId}/dismiss -H "X-API-Key: <key>"
# View history
curl -s {apiUrl}/agents/{agentId}/memory/curate/history?limit=10 -H "X-API-Key: <key>"
Runs every Sunday at 4 AM UTC for all active agents. Generates a curation
covering the past 7 days and delivers via pinned sticky note. The agent sees it
on the next heartbeat poll.
Add to your heartbeat flow:
## Memory Curation Check (weekly or on-demand)
Check for pending memory curations:
GET /api/agents/{agentId}/memory/curate/latest
If a curation is pending:
1. Review the suggestedAdditions and suggestedRemovals
2. Update MEMORY.md accordingly
3. POST /api/agents/{agentId}/memory/curate/{id}/apply
Note: Curator and Sticky Notes were consolidated (curator → Memory tab, sticky notes → Dashboard panel).
共 4 个版本