{"id":"303d1a5a-9914-4f1e-83ab-b50e17ae4516","entityType":"agent","slug":"clawhub-jlacroix82-agent-researcher","name":"research-assistant","canonicalUrl":"https://www.xpersona.co/agent/clawhub-jlacroix82-agent-researcher","canonicalPath":"/agent/clawhub-jlacroix82-agent-researcher","generatedAt":"2026-10-13T00:40:01.213Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T22:23:08.318Z","emptyReason":null},"description":"Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity r... Skill: research-assistant Owner: jlacroix82 Summary: Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity r... Tags: latest:1.1.5, security-fix:1.1.0 Version history: v1.1.5 | 2026-07-22T22:41:20.347Z | user v1.1.5: Security audit remediation — removed 'fully local' / 'zero external dependencies' claims, fixed email","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 985 downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s175p518b8g47fx6r9zyvs95ks876t4t:agent-researcher","sourceUrl":"https://clawhub.ai/jlacroix82/agent-researcher","homepage":"https://clawhub.ai/jlacroix82/skills/agent-researcher","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/jlacroix82/agent-researcher","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/jlacroix82/skills/agent-researcher","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity r..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T22:23:08.318Z","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-10-11T22:23:08.318Z","emptyReason":null},"stars":null,"forks":null,"downloads":985,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"1.1.5","tractionLabel":"985 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T22:23:08.257Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T22:23:08.318Z","lastCrawledAt":"2026-10-11T22:23:08.257Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T22:23:08.257Z","lastVerifiedAt":null,"highlights":[{"version":"1.1.5","createdAt":"2026-07-22T22:41:20.347Z","changelog":"v1.1.5: Security audit remediation — removed 'fully local' / 'zero external dependencies' claims, fixed email extraction documentation contradictions across SKILL.md and README.md, added explicit outbound HTTP and persistent storage warnings, excluded test/ directories from published bundle","fileCount":6,"zipByteSize":12113},{"version":"1.1.4","createdAt":"2026-07-22T17:48:42.586Z","changelog":"- Improved and expanded documentation of network and data privacy warnings in SKILL.md. - Added new sections detailing persistent storage of extracted content and potential PII risks. - Clarified behavior for outbound HTTP requests, storage persistence, and network privacy. - Removed redundant file: skill-card.md.","fileCount":10,"zipByteSize":15582},{"version":"1.1.3","createdAt":"2026-07-22T16:26:18.112Z","changelog":"Security: external CDN disclosure, email redaction warnings, data retention notices","fileCount":10,"zipByteSize":15295},{"version":"1.1.1","createdAt":"2026-07-22T16:25:03.812Z","changelog":"Security improvements: clearer data handling warnings, updated descriptions to match behavior. Version bump for audit re-scan.","fileCount":10,"zipByteSize":15234},{"version":"1.1.0","createdAt":"2026-07-20T01:56:07.930Z","changelog":"SSRF protection via isSafeUrl(), email redaction before KB storage, fixed README security claims and env var name. 13 tests.","fileCount":10,"zipByteSize":18260},{"version":"1.0.0","createdAt":"2026-07-18T22:03:11.850Z","changelog":"Initial release: 13/13 self-tests, web search aggregation, keyword extraction, content summarization, KB management, auto-summarize. Fixed 3 null-safety bugs. Zero external dependencies.","fileCount":10,"zipByteSize":17498}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s175p518b8g47fx6r9zyvs95ks876t4t:agent-researcher","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","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/clawhub-jlacroix82-agent-researcher/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jlacroix82-agent-researcher/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jlacroix82-agent-researcher/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-jlacroix82-agent-researcher/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-jlacroix82-agent-researcher/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-jlacroix82-agent-researcher/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-13T00:40:01.212Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jlacroix82-agent-researcher/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jlacroix82-agent-researcher/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jlacroix82-agent-researcher/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-jlacroix82-agent-researcher/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":"high","updatedAt":"2026-10-11T22:23:08.318Z","emptyReason":null},"readme":"Skill: research-assistant\n\nOwner: jlacroix82\n\nSummary: Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity r...\n\nTags: latest:1.1.5, security-fix:1.1.0\n\nVersion history:\n\nv1.1.5 | 2026-07-22T22:41:20.347Z | user\n\nv1.1.5: Security audit remediation — removed 'fully local' / 'zero external dependencies' claims, fixed email extraction documentation contradictions across SKILL.md and README.md, added explicit outbound HTTP and persistent storage warnings, excluded test/ directories from published bundle\n\nv1.1.4 | 2026-07-22T17:48:42.586Z | auto\n\n- Improved and expanded documentation of network and data privacy warnings in SKILL.md.\n- Added new sections detailing persistent storage of extracted content and potential PII risks.\n- Clarified behavior for outbound HTTP requests, storage persistence, and network privacy.\n- Removed redundant file: skill-card.md.\n\nv1.1.3 | 2026-07-22T16:26:18.112Z | user\n\nSecurity: external CDN disclosure, email redaction warnings, data retention notices\n\nv1.1.1 | 2026-07-22T16:25:03.812Z | user\n\nSecurity improvements: clearer data handling warnings, updated descriptions to match behavior. Version bump for audit re-scan.\n\nv1.1.0 | 2026-07-20T01:56:07.930Z | user\n\nSSRF protection via isSafeUrl(), email redaction before KB storage, fixed README security claims and env var name. 13 tests.\n\nv1.0.0 | 2026-07-18T22:03:11.850Z | user\n\nInitial release: 13/13 self-tests, web search aggregation, keyword extraction, content summarization, KB management, auto-summarize. Fixed 3 null-safety bugs. Zero external dependencies.\n\nArchive index:\n\nArchive v1.1.5: 6 files, 12113 bytes\n\nFiles: clawhub.yaml (456b), README.md (7985b), research-assistant.js (14690b), skill-card.md (2442b), SKILL.md (6430b), _meta.json (135b)\n\nFile v1.1.5:SKILL.md\n\n---\nname: research-assistant\ndescription: Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity resolution and auto-summarization. Integrates with memory-router.\n---\n\n# Research Assistant ⚡\n\n**Turn everything you read into a searchable knowledge base.**\n\n## The Problem\n\nAgents read web pages, docs, and files — but the knowledge disappears after the session. No persistent knowledge base, no entity tracking, no relationship mapping.\n\nResearch Assistant fixes this with one tool.\n\n## ⚠️ Important Warnings\n\n> **Read this section before using.** Research Assistant makes outbound HTTP requests to user-supplied URLs and writes all extracted content (entities, summaries, relations) to persistent local files under `memory/research/`. These are not optional behaviors and they cannot be disabled. Do not point this tool at confidential documents, internal network endpoints, or sources containing PII.\n\n### Outbound Network Access\n`--extract <url>` makes an unauthenticated HTTP/HTTPS request to any user-supplied URL (10-second timeout). **No URL allowlist, rate limit, or proxy is applied.** The target server will see your real IP address. There is no SSRF protection — internal/private network URLs (10.x, 192.168.x, localhost, etc.) are NOT blocked. Treat this as remote code-execution-grade network exposure: only point it at URLs you would type into a browser.\n\n### Persistent Local Storage\nAll extracted entities, summaries, text content, and relationships are written to `memory/research/` and persist indefinitely:\n- `knowledge-base.json` — every entry ever extracted\n- `index.json` — searchable entity index\n- `relations.json` — relationship graph\n\nThese files grow unbounded with every extraction. There is no retention limit, automatic redaction, or built-in deletion command. PII or sensitive content ingested from URLs and files is stored forever. Monitor with `--status` and manually clean the `memory/research/` directory if needed.\n\n### PII in Extracted Data\nEntity extraction captures proper nouns, URLs, numbers, and dates. **Email address extraction is intentionally disabled** — the `extractEntities()` function does not match email patterns (see line 90 of `research-assistant.js`: `// NOTE: Email addresses are intentionally NOT extracted to avoid PII leakage`). However, email addresses may still appear inside the `summary` text field (first 200 chars of source) or inside HTML content fetched from URLs. Do not rely on the email-extraction disablement as a complete PII filter — review the stored knowledge base before exporting or sharing it.\n\n## Quick Start\n\n### Extract from a file\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract /path/to/file.md\n```\n\nExtracts entities (proper nouns, numbers, URLs) and relationships, and creates a summary. Email address extraction is disabled — see \"PII in Extracted Data\" above.\n\n### Extract from a URL\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract https://example.com/article\n```\n\nFetches the page via HTTP/HTTPS (no auth, no proxy, 10s timeout), strips HTML, extracts entities and relationships, and persists everything to `memory/research/`. The fetched content is stored in full. See the \"Outbound Network Access\" warning above.\n\n### Extract from an entire directory\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract --all /path/to/docs\n```\n\nProcesses all .md, .txt, and .json files in a directory.\n\n### Search the knowledge base\n\n```bash\nnode skills/research-assistant/research-assistant.js --search \"machine learning\"\n```\n\nSearches all indexed sources by entities and content.\n\n### Auto-summarize on a topic\n\n```bash\nnode skills/research-assistant/research-assistant.js --summarize \"climate change\"\n```\n\nCollects all relevant entities and sources, generates a summary with key findings.\n\n### View knowledge graph\n\n```bash\nnode skills/research-assistant/research-assistant.js --graph\n```\n\nShows entities grouped by type and their relationships.\n\n### Status\n\n```bash\nnode skills/research-assistant/research-assistant.js\n```\n\nOverview of indexed sources, unique entities, relations, and entity type breakdown.\n\n## How It Works\n\n### Entity Extraction\n\n1. **Proper nouns** — Capitalized phrases (companies, people, places)\n2. **Numbers/dates** — Dates, years, quantities\n3. **URLs** — Links found in content\n4. ~~Emails~~ — Email address extraction is intentionally disabled\n5. **Relationships** — \"X is Y\", \"X works at Y\" patterns\n\n### Knowledge Base\n\n- Sources are indexed with entities and relationships\n- Entity index enables fast lookups\n- Relations are deduplicated and tracked\n- Auto-summarization pulls from all relevant sources\n\n### Integration with Memory Router\n\nResearch Assistant builds on the same entity resolution system as MemoryRouter. Entities extracted from research can be linked to MEMORY.md sections for persistent memory.\n\n## Configuration\n\nNo config needed. Knowledge base is stored in `memory/research/`.\n\nOverride data directory:\n```bash\n--dir /path/to/data\n```\n\n## Agent Protocol\n\nWhen reading new content:\n\n1. **Extract entities**: `--extract <file|url>`\n2. **Search existing**: `--search <topic>` before reading new content\n3. **Summarize findings**: `--summarize <topic>` after extraction\n4. **Link to memory**: Update MEMORY.md with key findings\n\n## Performance\n\n- File extraction: <10ms per file\n- URL extraction: <10s (network dependent)\n- Entity index: instant lookup\n- KB search: linear scan (optimized for <1000 sources)\n\n## Comparison\n\n| Approach | Knowledge Retention | Setup | Maintenance |\n|----------|-------------------|-------|-------------|\n| No knowledge base | 0% | None | None |\n| Manual notes | 30-50% | High | High |\n| **Research Assistant** | **80-95%** | **None** | **Automated** |\n| Vector DB | 80-95% | Very High | High |\n\n**Research Assistant gives you 80-95% knowledge retention with zero setup.**\n\n## Design Principles\n\n1. **Zero setup** — Works immediately, no config needed\n2. **No dependencies** — Pure Node.js, no npm packages\n3. **Entity-first** — Knowledge is structured around entities, not just text\n4. **Transparent** — Everything it extracts is reported\n5. **Scalable** — Handles 1000+ sources with entity index\n6. **Integrates** — Works with MemoryRouter for persistent memory\n\nFile v1.1.5:README.md\n\n# Research Assistant 🔬\n\n**Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity resolution and auto-summarization.**\n\n> **Read the \"Security & Privacy\" section before using.** This tool makes outbound HTTP requests to user-supplied URLs and writes all extracted content to persistent local files. These behaviors cannot be disabled.\n\n## Why Research Assistant?\n\nInformation is everywhere — web pages, documents, code files, emails. Research Assistant makes it *usable*:\n\n- **Entity extraction** — Automatically finds proper names, dates, URLs, and key concepts\n- **Searchable knowledge base** — Queries across everything you've processed\n- **Knowledge graph** — Visualize entity relationships and connections\n- **Domain filtering** — Focus on specific topics or sources\n- **Auto-summarization** — Key entities and sources at a glance\n- **Pure Node.js** — No npm runtime dependencies\n\n## ⚠️ What This Tool Does (Honest Description)\n\n- **Outbound HTTP**: `--extract <url>` fetches remote URLs. No allowlist, no rate limit, no proxy, no SSRF protection. Treat this as remote network exposure — only point it at URLs you would type into a browser.\n- **Persistent local storage**: Every extraction (URL or local file) is written to `memory/research/` and kept forever. There is no automatic retention or deletion.\n- **Email extraction is disabled** at the code level (see `extractEntities()` line 90), but emails can still appear inside fetched HTML or in source text — they are stored in the `summary` field.\n- **No shell execution, no system calls, no subprocess spawning.** The only network I/O is `--extract <url>` via Node's built-in `http`/`https` modules.\n\n---\n\n## Installation\n\n```bash\n# Already included in OpenClaw workspace at skills/research-assistant/\n# No npm install needed — pure Node.js\n```\n\n---\n\n## Quick Start\n\n```bash\n# Extract entities from text\nnode skills/research-assistant/research-assistant.js --extract \"John Doe joined the project on 2026-06-15\"\n\n# Search existing knowledge base\nnode skills/research-assistant/research-assistant.js --search \"John Doe\"\n\n# Add to knowledge base\nnode skills/research-assistant/research-assistant.js --add \"document-id\" --source \"report.md\"\n\n# Show knowledge graph\nnode skills/research-assistant/research-assistant.js --graph\n\n# Summarize knowledge base\nnode skills/research-assistant/research-assistant.js --summarize\n```\n\n---\n\n## Commands Reference\n\n### Entity Extraction\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract <text>\n```\n\nExtracts from unstructured text:\n- **Proper nouns** — Names, places, organizations\n- **Dates** — ISO dates, partial dates, date ranges\n- **URLs** — http/https links\n- **Numbers** — Counts, IDs, versions\n- **Key phrases** — Multi-word concepts (via NLP-like heuristics)\n\nEmail address extraction is **disabled** in code. Emails may still appear in the stored `summary` field (first 200 chars of source).\n\n```\n[research-assistant] Extracted 3 entities:\n  John Doe (proper_noun) × 2\n  2026-06-15 (number)\n  https://example.com (url)\n```\n\n---\n\n### Knowledge Base Operations\n\n```bash\n# Search\nnode skills/research-assistant/research-assistant.js --search \"query\"\n\n# Add content to KB\nnode skills/research-assistant/research-assistant.js --add <id> --source <source>\n\n# List KB entries\nnode skills/research-assistant/research-assistant.js --list\n```\n\nThe knowledge base is stored as JSON in `memory/research/` under your workspace root.\n\n---\n\n### Knowledge Graph\n\n```bash\n# Show full graph\nnode skills/research-assistant/research-assistant.js --graph\n\n# Filter by domain\nnode skills/research-assistant/research-assistant.js --graph --domain \"example.com\"\n```\n\nDisplays:\n- **Sources** — Total entries in KB\n- **Entities** — Unique entities with occurrence counts\n- **Relations** — Connections between entities\n- **Domain filter** — Restrict to specific source domains\n\n---\n\n### Summarization\n\n```bash\nnode skills/research-assistant/research-assistant.js --summarize\n```\n\nReturns a summary of the knowledge base:\n```\n[research-assistant] Summary:\n  Total entries: 5\n  Total entities: 12\n  Total relations: 3\n  Key entities:\n    John Doe (3 occurrences across 2 sources)\n    API (2 occurrences across 2 sources)\n  Sources: report.md, documentation.md\n```\n\n---\n\n## Data Storage\n\nAll state stored in `memory/research/`:\n\n| File | Description |\n|------|-------------|\n| `kb.json` | Knowledge base entries with entities, relations, summaries |\n| `entity-index.json` | Quick-lookup index for entity search |\n\nThese files persist indefinitely. There is no retention limit or built-in cleanup. Delete manually if needed.\n\n---\n\n## Security & Privacy\n\n| Behavior | Status |\n|----------|--------|\n| **Outbound HTTP on URL extract** | ⚠️ No allowlist, no SSRF protection, no proxy, 10s timeout, real IP exposed |\n| **Email extraction (entities)** | ✅ Disabled in code (see `extractEntities()` line 90) |\n| **Email storage (in summaries/HTML)** | ⚠️ May still appear — review before sharing |\n| **No shell execution** | ✅ Pure Node.js, no exec/system calls |\n| **Input validation** | ✅ All text inputs sanitized |\n| **Null-safe iteration** | ✅ Defensive programming |\n| **Persistent local storage** | ⚠️ Writes to `memory/research/` and keeps forever |\n\n⚠️ **Privacy Warning**: Extracted entities (URLs, proper nouns, numbers) and full content summaries are persisted indefinitely in `memory/research/kb.json`. There is no built-in retention limit, deletion command, or redaction. Do not use this tool on confidential documents or pages containing PII.\n\n⚠️ **URL Extraction Warning**: `--extract <url>` makes outbound HTTP requests to user-supplied destinations. **There is no SSRF protection** — internal/private network URLs are NOT blocked. The fetched content is stored locally and indexed. Only point this tool at URLs you trust.\n\n---\n\n## Programmatic API\n\n```javascript\nconst RA = require('./skills/research-assistant/research-assistant.js');\n\n// Extract entities from text\nconst entities = RA.extractEntities('John Doe at example.com since 2026');\n\n// Search knowledge base\nconst results = RA.searchKB('John Doe');\n\n// Add to knowledge base\nRA.addToKB({\n  id: 'doc-1',\n  entities: [{ name: 'John Doe', type: 'proper_noun', count: 2 }],\n  relations: [],\n  summary: 'John Doe works on the API project.',\n  source: 'report.md'\n});\n\n// Show summary\nRA.showSummary();\n```\n\n---\n\n## Configuration\n\n### Environment Variables\n\n| Variable | Description |\n|----------|-------------|\n| `RESEARCH_DIR` | Override knowledge base data directory |\n\n### Default Paths\n\n| Resource | Path |\n|----------|------|\n| Knowledge base | `<WORKSPACE>/memory/research/kb.json` |\n| Entity index | `<WORKSPACE>/memory/research/entity-index.json` |\n\n---\n\n## Examples\n\n### Research a Topic\n```bash\nnode skills/research-assistant/research-assistant.js --extract \"Dr. Jane Smith, PhD, joined the AI team at MIT on 2022-09-01\"\n# Extracts: Jane Smith (proper_noun), 2022-09-01 (number), MIT (proper_noun)\n# Note: email extraction is disabled; no email entity will be created\n```\n\n### Build a Knowledge Base from Docs\n```bash\n# Extract from multiple sources\nnode skills/research-assistant/research-assistant.js --add \"doc-1\" --source \"architecture.md\"\nnode skills/research-assistant/research-assistant.js --add \"doc-2\" --source \"api-spec.md\"\n\n# Search across all sources\nnode skills/research-assistant/research-assistant.js --search \"API\"\n```\n\n### Visualize Connections\n```bash\nnode skills/research-assistant/research-assistant.js --graph --domain \"docs.example.com\"\n```\n\n---\n\n## License\n\nMIT — Part of the OpenClaw skill ecosystem.\n\n---\n\n## Related Skills\n\n- **Smart Files** — Content-aware file search and organization\n- **Notification Triage** — Smart filtering and classification\n- **Email Manager** — Email organization and search\n\nFile v1.1.5:_meta.json\n\n{\n  \"ownerId\": \"kn7b6eyf5vc7khg5fr63pjm8xd82qvw5\",\n  \"slug\": \"agent-researcher\",\n  \"version\": \"1.1.5\",\n  \"publishedAt\": 1784760080347\n}\n\nFile v1.1.5:skill-card.md\n\n## Description:\n\nKnowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files into a searchable knowledge base with entity resolution and auto-summarization.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[jlacroix82](https://clawhub.ai/user/jlacroix82)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agent operators use this skill to extract entities, relationships, summaries, and key facts from web pages and local documents, then search or summarize a persistent local research knowledge base.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: URL extraction can contact arbitrary user-supplied HTTP or HTTPS URLs, including internal or private-network destinations.\n\nMitigation: Use only trusted public URLs, avoid localhost and private-network targets, and add egress controls such as an allowlist or proxy before use in sensitive environments.\n\nRisk: Extracted content, entities, summaries, and relationships are stored persistently and may include confidential information or PII.\n\nMitigation: Do not process confidential or PII-bearing sources unless retention, deletion, and redaction controls are added; manually review and clean memory/research/ as needed.\n\nRisk: Local file and directory extraction can read broad workspace inputs and add them to the persistent knowledge base.\n\nMitigation: Run the skill from a scoped workspace and provide only approved files or directories for extraction.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/jlacroix82/skills/agent-researcher)\n- [Publisher profile](https://clawhub.ai/user/jlacroix82)\n\n## Skill Output:\n\n**Output Type(s):** [text, shell commands, JSON files, guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands, CLI text output, and persistent local JSON knowledge-base files.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Writes persistent local state under memory/research/; URL extraction can make outbound HTTP requests to user-supplied URLs.]\n\n## Skill Version(s):\n\n1.1.5 (source: server release metadata and clawhub.yaml)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v1.1.5:clawhub.yaml\n\nslug: agent-researcher\nname: research-assistant\nowner: jlacroix82\ndescription: Web search, content aggregation, and research assistance for agent-native skills. ⚠️ Persists extracted content and relationships to disk. Fetches arbitrary URLs. Review privacy and network safety before installing.\nversion: 1.1.5\ntype: skill\nauthor: OpenClaw\nlicense: MIT\nkeywords:\n  - research\n  - search\n  - web\n  - aggregation\n  - agent\nentry: SKILL.md\ndependencies: []\n\nArchive v1.1.4: 10 files, 15582 bytes\n\nFiles: clawhub.yaml (456b), README.md (7242b), research-assistant.js (14690b), skill-card.md (2176b), SKILL.md (5678b), test-research-assistant.js (1721b), test/run-tests.js (910b), tests/run-self-tests.js (4344b), tests/test-research-assistant.js (4344b), _meta.json (135b)\n\nFile v1.1.4:SKILL.md\n\n---\nname: research-assistant\ndescription: Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity resolution and auto-summarization. Integrates with memory-router.\n---\n\n# Research Assistant ⚡\n\n**Turn everything you read into a searchable knowledge base.**\n\n## The Problem\n\nAgents read web pages, docs, and files — but the knowledge disappears after the session. No persistent knowledge base, no entity tracking, no relationship mapping.\n\nResearch Assistant fixes this with one tool.\n\n## ⚠️ Important Warnings\n\n### Persistent KB/Index/Relations/Graph Storage\nAll extracted entities, relations, and knowledge entries are stored under `memory/research/`:\n- `knowledge-base.json` — all extracted entries\n- `index.json` — entity index for search\n- `relations.json` — relationship graph\nThese files persist indefinitely and grow unbounded. Use `--status` to monitor size.\n\n### Outbound HTTP Requests\n`--extract` with a URL argument fetches remote content via HTTP/HTTPS to any URL. The request includes no authentication and respects system network policy. Timeout is 10 seconds. Review network policy before enabling URL extraction.\n\n### Persistent Knowledge Base Storage\nAll extracted entities, text content, and relationships are stored persistently under `memory/research/`:\n- `knowledge-base.json` — full extracted content from all sources\n- `index.json` — searchable entity index\n- `relations.json` — relationship graph\nThese files grow unbounded with each extraction and persist across restarts. PII or sensitive content ingested from URLs and files is stored indefinitely. Review and clear stored data regularly using `--status` to monitor size.\n\n### Network Privacy\nURL extraction makes outbound HTTP requests to the target URL. The skill does not anonymize, proxy, or rate-limit these requests. Be aware that target servers may log your IP and request metadata.\n\n### PII in Extracted Data\nThe entity extraction captures proper nouns, URLs, numbers, and dates. Email address extraction has been disabled to prevent PII leakage. Review extracted data before sharing knowledge base exports.\n\n## Quick Start\n\n### Extract from a file\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract /path/to/file.md\n```\n\nExtracts entities (proper nouns, numbers, URLs, emails), relationships, and creates a summary.\n\n### Extract from a URL\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract https://example.com/article\n```\n\nFetches the page, strips HTML, extracts entities and relationships.\n\n### Extract from an entire directory\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract --all /path/to/docs\n```\n\nProcesses all .md, .txt, and .json files in a directory.\n\n### Search the knowledge base\n\n```bash\nnode skills/research-assistant/research-assistant.js --search \"machine learning\"\n```\n\nSearches all indexed sources by entities and content.\n\n### Auto-summarize on a topic\n\n```bash\nnode skills/research-assistant/research-assistant.js --summarize \"climate change\"\n```\n\nCollects all relevant entities and sources, generates a summary with key findings.\n\n### View knowledge graph\n\n```bash\nnode skills/research-assistant/research-assistant.js --graph\n```\n\nShows entities grouped by type and their relationships.\n\n### Status\n\n```bash\nnode skills/research-assistant/research-assistant.js\n```\n\nOverview of indexed sources, unique entities, relations, and entity type breakdown.\n\n## How It Works\n\n### Entity Extraction\n\n1. **Proper nouns** — Capitalized phrases (companies, people, places)\n2. **Numbers/dates** — Dates, years, quantities\n3. **URLs** — Links found in content\n4. **Emails** — Email addresses found in content\n5. **Relationships** — \"X is Y\", \"X works at Y\" patterns\n\n### Knowledge Base\n\n- Sources are indexed with entities and relationships\n- Entity index enables fast lookups\n- Relations are deduplicated and tracked\n- Auto-summarization pulls from all relevant sources\n\n### Integration with Memory Router\n\nResearch Assistant builds on the same entity resolution system as MemoryRouter. Entities extracted from research can be linked to MEMORY.md sections for persistent memory.\n\n## Configuration\n\nNo config needed. Knowledge base is stored in `memory/research/`.\n\nOverride data directory:\n```bash\n--dir /path/to/data\n```\n\n## Agent Protocol\n\nWhen reading new content:\n\n1. **Extract entities**: `--extract <file|url>`\n2. **Search existing**: `--search <topic>` before reading new content\n3. **Summarize findings**: `--summarize <topic>` after extraction\n4. **Link to memory**: Update MEMORY.md with key findings\n\n## Performance\n\n- File extraction: <10ms per file\n- URL extraction: <10s (network dependent)\n- Entity index: instant lookup\n- KB search: linear scan (optimized for <1000 sources)\n\n## Comparison\n\n| Approach | Knowledge Retention | Setup | Maintenance |\n|----------|-------------------|-------|-------------|\n| No knowledge base | 0% | None | None |\n| Manual notes | 30-50% | High | High |\n| **Research Assistant** | **80-95%** | **None** | **Automated** |\n| Vector DB | 80-95% | Very High | High |\n\n**Research Assistant gives you 80-95% knowledge retention with zero setup.**\n\n## Design Principles\n\n1. **Zero setup** — Works immediately, no config needed\n2. **No dependencies** — Pure Node.js, no npm packages\n3. **Entity-first** — Knowledge is structured around entities, not just text\n4. **Transparent** — Everything it extracts is reported\n5. **Scalable** — Handles 1000+ sources with entity index\n6. **Integrates** — Works with MemoryRouter for persistent memory\n\nFile v1.1.4:README.md\n\n# Research Assistant 🔬\n\n**Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity resolution and auto-summarization.**\n\n## Why Research Assistant?\n\nInformation is everywhere — web pages, documents, code files, emails. Research Assistant makes it *usable*:\n\n- **Entity extraction** — Automatically finds proper names, dates, URLs, emails, and key concepts\n- **Searchable knowledge base** — Queries across everything you've processed\n- **Knowledge graph** — Visualize entity relationships and connections\n- **Domain filtering** — Focus on specific topics or sources\n- **Auto-summarization** — Key entities and sources at a glance\n- **Zero external dependencies** — Pure Node.js, fully local\n\n---\n\n## Installation\n\n```bash\n# Already included in OpenClaw workspace at skills/research-assistant/\n# No npm install needed — pure Node.js\n```\n\n---\n\n## Quick Start\n\n```bash\n# Extract entities from text\nnode skills/research-assistant/research-assistant.js --extract \"John Doe joined the project on 2026-06-15\"\n\n# Search existing knowledge base\nnode skills/research-assistant/research-assistant.js --search \"John Doe\"\n\n# Add to knowledge base\nnode skills/research-assistant/research-assistant.js --add \"document-id\" --source \"report.md\"\n\n# Show knowledge graph\nnode skills/research-assistant/research-assistant.js --graph\n\n# Summarize knowledge base\nnode skills/research-assistant/research-assistant.js --summarize\n```\n\n---\n\n## Commands Reference\n\n### Entity Extraction\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract <text>\n```\n\nExtracts from unstructured text:\n- **Proper nouns** — Names, places, organizations\n- **Dates** — ISO dates, partial dates, date ranges\n- **URLs** — http/https links\n- **Email addresses**\n- **Numbers** — Counts, IDs, versions\n- **Key phrases** — Multi-word concepts (via NLP-like heuristics)\n\n```\n[research-assistant] Extracted 4 entities:\n  John Doe (person) × 2\n  2026-06-15 (date)\n  contact@example.com (email)\n  https://example.com (url)\n```\n\n---\n\n### Knowledge Base Operations\n\n```bash\n# Search\nnode skills/research-assistant/research-assistant.js --search \"query\"\n\n# Add content to KB\nnode skills/research-assistant/research-assistant.js --add <id> --source <source>\n\n# List KB entries\nnode skills/research-assistant/research-assistant.js --list\n```\n\nThe knowledge base is stored as JSON in `memory/research/` under your workspace root.\n\n---\n\n### Knowledge Graph\n\n```bash\n# Show full graph\nnode skills/research-assistant/research-assistant.js --graph\n\n# Filter by domain\nnode skills/research-assistant/research-assistant.js --graph --domain \"example.com\"\n```\n\nDisplays:\n- **Sources** — Total entries in KB\n- **Entities** — Unique entities with occurrence counts\n- **Relations** — Connections between entities\n- **Domain filter** — Restrict to specific source domains\n\n---\n\n### Summarization\n\n```bash\nnode skills/research-assistant/research-assistant.js --summarize\n```\n\nReturns a summary of the knowledge base:\n```\n[research-assistant] Summary:\n  Total entries: 5\n  Total entities: 12\n  Total relations: 3\n  Key entities:\n    John Doe (3 occurrences across 2 sources)\n    API (2 occurrences across 2 sources)\n  Sources: report.md, documentation.md\n```\n\n---\n\n## Data Storage\n\nAll state stored in `memory/research/`:\n\n| File | Description |\n|------|-------------|\n| `kb.json` | Knowledge base entries with entities, relations, summaries |\n| `entity-index.json` | Quick-lookup index for entity search |\n\n---\n\n## Security & Privacy\n\nResearch Assistant is a local tool that **makes outbound HTTP requests** when extracting from URLs.\n\n| Protection | Status |\n|------------|--------|\n| **URL extraction** | Fetches HTTP/HTTPS URLs — blocked for private/local networks |\n| **CDN dependency** | Graph HTML loads D3 from cdn.jsdelivr.net (one-time external call) |\n| **No shell execution** | ✅ Pure Node.js, no exec/system calls |\n| **Input validation** | ✅ All text inputs sanitized |\n| **Null-safe iteration** | ✅ Defensive programming |\n| **Read-only by default** | ✅ Writes only to `memory/research/` |\n\n⚠️ **Privacy Warning**: Extracted entities (including emails, URLs, proper nouns) are persisted indefinitely in `memory/research/kb.json`. There is no built-in retention limit, deletion command, or redaction for stored content. Do not use this tool on confidential documents or pages containing PII.\n\n⚠️ **URL Extraction Warning**: `--extract <url>` makes outbound HTTP requests to user-supplied destinations. Private network ranges (10.x, 172.16-31.x, 192.168.x, localhost) are blocked. However, the fetched content is stored locally and indexed.\n\n---\n\n## Programmatic API\n\n```javascript\nconst RA = require('./skills/research-assistant/research-assistant.js');\n\n// Extract entities from text\nconst entities = RA.extractEntities('John Doe at example.com since 2026');\n\n// Search knowledge base\nconst results = RA.searchKB('John Doe');\n\n// Add to knowledge base\nRA.addToKB({\n  id: 'doc-1',\n  entities: [{ name: 'John Doe', type: 'person', count: 2 }],\n  relations: [],\n  summary: 'John Doe works on the API project.',\n  source: 'report.md'\n});\n\n// Build graph data\nconst graph = RA.buildGraphData('example.com');\n\n// Show summary\nRA.showSummary();\n```\n\n---\n\n## Testing\n\n```bash\n# Run full test suite (13 tests)\nnode skills/research-assistant/tests/test-research-assistant.js\n```\n\nTest coverage:\n- **Entity extraction** — proper nouns, dates, URLs, emails (4 cases)\n- **KB operations** — add, search by query, search by source, empty queries (4 cases)\n- **Knowledge graph** — output formatting, stats display (2 cases)\n- **Summarization** — key entities, sources (2 cases)\n- **Error handling** — null input, empty objects (2 cases)\n\n---\n\n## Configuration\n\n### Environment Variables\n\n| Variable | Description |\n|----------|-------------|\n| `RESEARCH_DIR` | Override knowledge base data directory |\n\n### Default Paths\n\n| Resource | Path |\n|----------|------|\n| Knowledge base | `<WORKSPACE>/memory/research/kb.json` |\n| Entity index | `<WORKSPACE>/memory/research/entity-index.json` |\n\n---\n\n## Examples\n\n### Research a Person\n```bash\nnode skills/research-assistant/research-assistant.js --extract \"Dr. Jane Smith, PhD, joined the AI team at MIT on 2022-09-01. Email: jane@mit.edu\"\n# Extracts: Jane Smith (person), 2022-09-01 (date), MIT (org), jane@mit.edu (email)\n```\n\n### Build a Knowledge Base from Docs\n```bash\n# Extract from multiple sources\nnode skills/research-assistant/research-assistant.js --add \"doc-1\" --source \"architecture.md\"\nnode skills/research-assistant/research-assistant.js --add \"doc-2\" --source \"api-spec.md\"\n\n# Search across all sources\nnode skills/research-assistant/research-assistant.js --search \"API\"\n```\n\n### Vizualize Connections\n```bash\nnode skills/research-assistant/research-assistant.js --graph --domain \"docs.example.com\"\n```\n\n---\n\n## License\n\nMIT — Part of the OpenClaw skill ecosystem.\n\n---\n\n## Related Skills\n\n- **Smart Files** — Content-aware file search and organization\n- **Notification Triage** — Smart filtering and classification\n- **Email Manager** — Email organization and search\n\nFile v1.1.4:_meta.json\n\n{\n  \"ownerId\": \"kn7b6eyf5vc7khg5fr63pjm8xd82qvw5\",\n  \"slug\": \"agent-researcher\",\n  \"version\": \"1.1.4\",\n  \"publishedAt\": 1784742522586\n}\n\nFile v1.1.4:skill-card.md\n\n## Description: <br>\nResearch Assistant extracts entities, relationships, and key facts from web pages, documents, and files, then builds a searchable local knowledge base with entity resolution and summarization. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[jlacroix82](https://clawhub.ai/user/jlacroix82) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agent users use this skill to turn source material from files, directories, and URLs into a searchable research index with summaries, entity lookup, and relationship views. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Extracted snippets, entities, relationships, and possible sensitive content are persisted locally under memory/research. <br>\nMitigation: Avoid confidential documents and PII unless local retention is acceptable; review and clear the research storage regularly. <br>\nRisk: URL extraction can make outbound requests to user-supplied HTTP or HTTPS targets, and server evidence warns not to rely on private or local network blocking. <br>\nMitigation: Use only trusted URLs in environments with appropriate network policy controls; review destinations before enabling URL extraction. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/jlacroix82/skills/agent-researcher) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, shell commands, configuration, guidance, files] <br>\n**Output Format:** [Plain text CLI output, markdown instructions, and local JSON knowledge-base files] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Persists extracted entries, entity indexes, and relations under memory/research; URL extraction may make outbound HTTP or HTTPS requests.] <br>\n\n## Skill Version(s): <br>\n1.1.4 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v1.1.4:clawhub.yaml\n\nslug: agent-researcher\nname: research-assistant\nowner: jlacroix82\ndescription: Web search, content aggregation, and research assistance for agent-native skills. ⚠️ Persists extracted content and relationships to disk. Fetches arbitrary URLs. Review privacy and network safety before installing.\nversion: 1.1.1\ntype: skill\nauthor: OpenClaw\nlicense: MIT\nkeywords:\n  - research\n  - search\n  - web\n  - aggregation\n  - agent\nentry: SKILL.md\ndependencies: []\n\nArchive v1.1.3: 10 files, 15295 bytes\n\nFiles: clawhub.yaml (380b), README.md (7242b), research-assistant.js (14690b), skill-card.md (2249b), SKILL.md (4837b), test-research-assistant.js (1721b), test/run-tests.js (910b), tests/run-self-tests.js (4344b), tests/test-research-assistant.js (4344b), _meta.json (135b)\n\nFile v1.1.3:SKILL.md\n\n---\nname: research-assistant\ndescription: Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity resolution and auto-summarization. Integrates with memory-router.\n---\n\n# Research Assistant ⚡\n\n**Turn everything you read into a searchable knowledge base.**\n\n## The Problem\n\nAgents read web pages, docs, and files — but the knowledge disappears after the session. No persistent knowledge base, no entity tracking, no relationship mapping.\n\nResearch Assistant fixes this with one tool.\n\n## ⚠️ Important Warnings\n\n### Persistent KB/Index/Relations/Graph Storage\nAll extracted entities, relations, and knowledge entries are stored under `memory/research/`:\n- `knowledge-base.json` — all extracted entries\n- `index.json` — entity index for search\n- `relations.json` — relationship graph\nThese files persist indefinitely and grow unbounded. Use `--status` to monitor size.\n\n### Outbound HTTP Requests\n`--extract` with a URL argument fetches remote content via HTTP/HTTPS. Network policy and firewalls apply. Timeout is set to 10 seconds.\n\n### PII in Extracted Data\nThe entity extraction captures proper nouns, URLs, numbers, and dates. Email address extraction has been disabled to prevent PII leakage. Review extracted data before sharing knowledge base exports.\n\n## Quick Start\n\n### Extract from a file\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract /path/to/file.md\n```\n\nExtracts entities (proper nouns, numbers, URLs, emails), relationships, and creates a summary.\n\n### Extract from a URL\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract https://example.com/article\n```\n\nFetches the page, strips HTML, extracts entities and relationships.\n\n### Extract from an entire directory\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract --all /path/to/docs\n```\n\nProcesses all .md, .txt, and .json files in a directory.\n\n### Search the knowledge base\n\n```bash\nnode skills/research-assistant/research-assistant.js --search \"machine learning\"\n```\n\nSearches all indexed sources by entities and content.\n\n### Auto-summarize on a topic\n\n```bash\nnode skills/research-assistant/research-assistant.js --summarize \"climate change\"\n```\n\nCollects all relevant entities and sources, generates a summary with key findings.\n\n### View knowledge graph\n\n```bash\nnode skills/research-assistant/research-assistant.js --graph\n```\n\nShows entities grouped by type and their relationships.\n\n### Status\n\n```bash\nnode skills/research-assistant/research-assistant.js\n```\n\nOverview of indexed sources, unique entities, relations, and entity type breakdown.\n\n## How It Works\n\n### Entity Extraction\n\n1. **Proper nouns** — Capitalized phrases (companies, people, places)\n2. **Numbers/dates** — Dates, years, quantities\n3. **URLs** — Links found in content\n4. **Emails** — Email addresses found in content\n5. **Relationships** — \"X is Y\", \"X works at Y\" patterns\n\n### Knowledge Base\n\n- Sources are indexed with entities and relationships\n- Entity index enables fast lookups\n- Relations are deduplicated and tracked\n- Auto-summarization pulls from all relevant sources\n\n### Integration with Memory Router\n\nResearch Assistant builds on the same entity resolution system as MemoryRouter. Entities extracted from research can be linked to MEMORY.md sections for persistent memory.\n\n## Configuration\n\nNo config needed. Knowledge base is stored in `memory/research/`.\n\nOverride data directory:\n```bash\n--dir /path/to/data\n```\n\n## Agent Protocol\n\nWhen reading new content:\n\n1. **Extract entities**: `--extract <file|url>`\n2. **Search existing**: `--search <topic>` before reading new content\n3. **Summarize findings**: `--summarize <topic>` after extraction\n4. **Link to memory**: Update MEMORY.md with key findings\n\n## Performance\n\n- File extraction: <10ms per file\n- URL extraction: <10s (network dependent)\n- Entity index: instant lookup\n- KB search: linear scan (optimized for <1000 sources)\n\n## Comparison\n\n| Approach | Knowledge Retention | Setup | Maintenance |\n|----------|-------------------|-------|-------------|\n| No knowledge base | 0% | None | None |\n| Manual notes | 30-50% | High | High |\n| **Research Assistant** | **80-95%** | **None** | **Automated** |\n| Vector DB | 80-95% | Very High | High |\n\n**Research Assistant gives you 80-95% knowledge retention with zero setup.**\n\n## Design Principles\n\n1. **Zero setup** — Works immediately, no config needed\n2. **No dependencies** — Pure Node.js, no npm packages\n3. **Entity-first** — Knowledge is structured around entities, not just text\n4. **Transparent** — Everything it extracts is reported\n5. **Scalable** — Handles 1000+ sources with entity index\n6. **Integrates** — Works with MemoryRouter for persistent memory\n\nFile v1.1.3:README.md\n\n# Research Assistant 🔬\n\n**Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity resolution and auto-summarization.**\n\n## Why Research Assistant?\n\nInformation is everywhere — web pages, documents, code files, emails. Research Assistant makes it *usable*:\n\n- **Entity extraction** — Automatically finds proper names, dates, URLs, emails, and key concepts\n- **Searchable knowledge base** — Queries across everything you've processed\n- **Knowledge graph** — Visualize entity relationships and connections\n- **Domain filtering** — Focus on specific topics or sources\n- **Auto-summarization** — Key entities and sources at a glance\n- **Zero external dependencies** — Pure Node.js, fully local\n\n---\n\n## Installation\n\n```bash\n# Already included in OpenClaw workspace at skills/research-assistant/\n# No npm install needed — pure Node.js\n```\n\n---\n\n## Quick Start\n\n```bash\n# Extract entities from text\nnode skills/research-assistant/research-assistant.js --extract \"John Doe joined the project on 2026-06-15\"\n\n# Search existing knowledge base\nnode skills/research-assistant/research-assistant.js --search \"John Doe\"\n\n# Add to knowledge base\nnode skills/research-assistant/research-assistant.js --add \"document-id\" --source \"report.md\"\n\n# Show knowledge graph\nnode skills/research-assistant/research-assistant.js --graph\n\n# Summarize knowledge base\nnode skills/research-assistant/research-assistant.js --summarize\n```\n\n---\n\n## Commands Reference\n\n### Entity Extraction\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract <text>\n```\n\nExtracts from unstructured text:\n- **Proper nouns** — Names, places, organizations\n- **Dates** — ISO dates, partial dates, date ranges\n- **URLs** — http/https links\n- **Email addresses**\n- **Numbers** — Counts, IDs, versions\n- **Key phrases** — Multi-word concepts (via NLP-like heuristics)\n\n```\n[research-assistant] Extracted 4 entities:\n  John Doe (person) × 2\n  2026-06-15 (date)\n  contact@example.com (email)\n  https://example.com (url)\n```\n\n---\n\n### Knowledge Base Operations\n\n```bash\n# Search\nnode skills/research-assistant/research-assistant.js --search \"query\"\n\n# Add content to KB\nnode skills/research-assistant/research-assistant.js --add <id> --source <source>\n\n# List KB entries\nnode skills/research-assistant/research-assistant.js --list\n```\n\nThe knowledge base is stored as JSON in `memory/research/` under your workspace root.\n\n---\n\n### Knowledge Graph\n\n```bash\n# Show full graph\nnode skills/research-assistant/research-assistant.js --graph\n\n# Filter by domain\nnode skills/research-assistant/research-assistant.js --graph --domain \"example.com\"\n```\n\nDisplays:\n- **Sources** — Total entries in KB\n- **Entities** — Unique entities with occurrence counts\n- **Relations** — Connections between entities\n- **Domain filter** — Restrict to specific source domains\n\n---\n\n### Summarization\n\n```bash\nnode skills/research-assistant/research-assistant.js --summarize\n```\n\nReturns a summary of the knowledge base:\n```\n[research-assistant] Summary:\n  Total entries: 5\n  Total entities: 12\n  Total relations: 3\n  Key entities:\n    John Doe (3 occurrences across 2 sources)\n    API (2 occurrences across 2 sources)\n  Sources: report.md, documentation.md\n```\n\n---\n\n## Data Storage\n\nAll state stored in `memory/research/`:\n\n| File | Description |\n|------|-------------|\n| `kb.json` | Knowledge base entries with entities, relations, summaries |\n| `entity-index.json` | Quick-lookup index for entity search |\n\n---\n\n## Security & Privacy\n\nResearch Assistant is a local tool that **makes outbound HTTP requests** when extracting from URLs.\n\n| Protection | Status |\n|------------|--------|\n| **URL extraction** | Fetches HTTP/HTTPS URLs — blocked for private/local networks |\n| **CDN dependency** | Graph HTML loads D3 from cdn.jsdelivr.net (one-time external call) |\n| **No shell execution** | ✅ Pure Node.js, no exec/system calls |\n| **Input validation** | ✅ All text inputs sanitized |\n| **Null-safe iteration** | ✅ Defensive programming |\n| **Read-only by default** | ✅ Writes only to `memory/research/` |\n\n⚠️ **Privacy Warning**: Extracted entities (including emails, URLs, proper nouns) are persisted indefinitely in `memory/research/kb.json`. There is no built-in retention limit, deletion command, or redaction for stored content. Do not use this tool on confidential documents or pages containing PII.\n\n⚠️ **URL Extraction Warning**: `--extract <url>` makes outbound HTTP requests to user-supplied destinations. Private network ranges (10.x, 172.16-31.x, 192.168.x, localhost) are blocked. However, the fetched content is stored locally and indexed.\n\n---\n\n## Programmatic API\n\n```javascript\nconst RA = require('./skills/research-assistant/research-assistant.js');\n\n// Extract entities from text\nconst entities = RA.extractEntities('John Doe at example.com since 2026');\n\n// Search knowledge base\nconst results = RA.searchKB('John Doe');\n\n// Add to knowledge base\nRA.addToKB({\n  id: 'doc-1',\n  entities: [{ name: 'John Doe', type: 'person', count: 2 }],\n  relations: [],\n  summary: 'John Doe works on the API project.',\n  source: 'report.md'\n});\n\n// Build graph data\nconst graph = RA.buildGraphData('example.com');\n\n// Show summary\nRA.showSummary();\n```\n\n---\n\n## Testing\n\n```bash\n# Run full test suite (13 tests)\nnode skills/research-assistant/tests/test-research-assistant.js\n```\n\nTest coverage:\n- **Entity extraction** — proper nouns, dates, URLs, emails (4 cases)\n- **KB operations** — add, search by query, search by source, empty queries (4 cases)\n- **Knowledge graph** — output formatting, stats display (2 cases)\n- **Summarization** — key entities, sources (2 cases)\n- **Error handling** — null input, empty objects (2 cases)\n\n---\n\n## Configuration\n\n### Environment Variables\n\n| Variable | Description |\n|----------|-------------|\n| `RESEARCH_DIR` | Override knowledge base data directory |\n\n### Default Paths\n\n| Resource | Path |\n|----------|------|\n| Knowledge base | `<WORKSPACE>/memory/research/kb.json` |\n| Entity index | `<WORKSPACE>/memory/research/entity-index.json` |\n\n---\n\n## Examples\n\n### Research a Person\n```bash\nnode skills/research-assistant/research-assistant.js --extract \"Dr. Jane Smith, PhD, joined the AI team at MIT on 2022-09-01. Email: jane@mit.edu\"\n# Extracts: Jane Smith (person), 2022-09-01 (date), MIT (org), jane@mit.edu (email)\n```\n\n### Build a Knowledge Base from Docs\n```bash\n# Extract from multiple sources\nnode skills/research-assistant/research-assistant.js --add \"doc-1\" --source \"architecture.md\"\nnode skills/research-assistant/research-assistant.js --add \"doc-2\" --source \"api-spec.md\"\n\n# Search across all sources\nnode skills/research-assistant/research-assistant.js --search \"API\"\n```\n\n### Vizualize Connections\n```bash\nnode skills/research-assistant/research-assistant.js --graph --domain \"docs.example.com\"\n```\n\n---\n\n## License\n\nMIT — Part of the OpenClaw skill ecosystem.\n\n---\n\n## Related Skills\n\n- **Smart Files** — Content-aware file search and organization\n- **Notification Triage** — Smart filtering and classification\n- **Email Manager** — Email organization and search\n\nFile v1.1.3:_meta.json\n\n{\n  \"ownerId\": \"kn7b6eyf5vc7khg5fr63pjm8xd82qvw5\",\n  \"slug\": \"agent-researcher\",\n  \"version\": \"1.1.3\",\n  \"publishedAt\": 1784737578112\n}\n\nFile v1.1.3:skill-card.md\n\n## Description: <br>\nKnowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files into a searchable local knowledge base with entity resolution and auto-summarization. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[jlacroix82](https://clawhub.ai/user/jlacroix82) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and external agent users use Research Assistant to extract entities and relationships from documents, text, and URLs, then search, summarize, and inspect the resulting local knowledge base. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Extracted entities, relationships, URLs, numbers, and summaries are retained in local research memory and may include sensitive information. <br>\nMitigation: Use only with material approved for local retention, avoid confidential documents or PII unless a separate cleanup process exists, and review stored data before sharing exports. <br>\nRisk: URL extraction can fetch user-supplied HTTP/HTTPS destinations, and the security guidance says private, localhost, and internal network URLs are not actually blocked. <br>\nMitigation: Do not pass internal, localhost, or private-network URLs; rely on network policy and review destinations before extraction. <br>\n\n\n## Reference(s): <br>\n- [Research Assistant README](README.md) <br>\n- [Research Assistant on ClawHub](https://clawhub.ai/jlacroix82/skills/agent-researcher) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Text, JSON files, Guidance] <br>\n**Output Format:** [Console text with local JSON knowledge base files] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Persists extracted knowledge under memory/research; URL extraction can make outbound HTTP/HTTPS requests.] <br>\n\n## Skill Version(s): <br>\n1.1.3 (source: server release metadata and clawhub.yaml) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v1.1.3:clawhub.yaml\n\nslug: agent-researcher\nname: research-assistant\nowner: jlacroix82\ndescription: Web search, content aggregation, and research assistance for agent-native skills. ⚠️ Persists extracted entities and relationships to disk.\nversion: 1.1.3\ntype: skill\nauthor: OpenClaw\nlicense: MIT\nkeywords:\n  - research\n  - search\n  - web\n  - aggregation\n  - agent\nentry: SKILL.md\ndependencies: []\n\nArchive v1.1.1: 10 files, 15234 bytes\n\nFiles: clawhub.yaml (380b), README.md (7242b), research-assistant.js (14690b), skill-card.md (2125b), SKILL.md (4837b), test-research-assistant.js (1721b), test/run-tests.js (910b), tests/run-self-tests.js (4344b), tests/test-research-assistant.js (4344b), _meta.json (135b)\n\nFile v1.1.1:SKILL.md\n\n---\nname: research-assistant\ndescription: Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity resolution and auto-summarization. Integrates with memory-router.\n---\n\n# Research Assistant ⚡\n\n**Turn everything you read into a searchable knowledge base.**\n\n## The Problem\n\nAgents read web pages, docs, and files — but the knowledge disappears after the session. No persistent knowledge base, no entity tracking, no relationship mapping.\n\nResearch Assistant fixes this with one tool.\n\n## ⚠️ Important Warnings\n\n### Persistent KB/Index/Relations/Graph Storage\nAll extracted entities, relations, and knowledge entries are stored under `memory/research/`:\n- `knowledge-base.json` — all extracted entries\n- `index.json` — entity index for search\n- `relations.json` — relationship graph\nThese files persist indefinitely and grow unbounded. Use `--status` to monitor size.\n\n### Outbound HTTP Requests\n`--extract` with a URL argument fetches remote content via HTTP/HTTPS. Network policy and firewalls apply. Timeout is set to 10 seconds.\n\n### PII in Extracted Data\nThe entity extraction captures proper nouns, URLs, numbers, and dates. Email address extraction has been disabled to prevent PII leakage. Review extracted data before sharing knowledge base exports.\n\n## Quick Start\n\n### Extract from a file\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract /path/to/file.md\n```\n\nExtracts entities (proper nouns, numbers, URLs, emails), relationships, and creates a summary.\n\n### Extract from a URL\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract https://example.com/article\n```\n\nFetches the page, strips HTML, extracts entities and relationships.\n\n### Extract from an entire directory\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract --all /path/to/docs\n```\n\nProcesses all .md, .txt, and .json files in a directory.\n\n### Search the knowledge base\n\n```bash\nnode skills/research-assistant/research-assistant.js --search \"machine learning\"\n```\n\nSearches all indexed sources by entities and content.\n\n### Auto-summarize on a topic\n\n```bash\nnode skills/research-assistant/research-assistant.js --summarize \"climate change\"\n```\n\nCollects all relevant entities and sources, generates a summary with key findings.\n\n### View knowledge graph\n\n```bash\nnode skills/research-assistant/research-assistant.js --graph\n```\n\nShows entities grouped by type and their relationships.\n\n### Status\n\n```bash\nnode skills/research-assistant/research-assistant.js\n```\n\nOverview of indexed sources, unique entities, relations, and entity type breakdown.\n\n## How It Works\n\n### Entity Extraction\n\n1. **Proper nouns** — Capitalized phrases (companies, people, places)\n2. **Numbers/dates** — Dates, years, quantities\n3. **URLs** — Links found in content\n4. **Emails** — Email addresses found in content\n5. **Relationships** — \"X is Y\", \"X works at Y\" patterns\n\n### Knowledge Base\n\n- Sources are indexed with entities and relationships\n- Entity index enables fast lookups\n- Relations are deduplicated and tracked\n- Auto-summarization pulls from all relevant sources\n\n### Integration with Memory Router\n\nResearch Assistant builds on the same entity resolution system as MemoryRouter. Entities extracted from research can be linked to MEMORY.md sections for persistent memory.\n\n## Configuration\n\nNo config needed. Knowledge base is stored in `memory/research/`.\n\nOverride data directory:\n```bash\n--dir /path/to/data\n```\n\n## Agent Protocol\n\nWhen reading new content:\n\n1. **Extract entities**: `--extract <file|url>`\n2. **Search existing**: `--search <topic>` before reading new content\n3. **Summarize findings**: `--summarize <topic>` after extraction\n4. **Link to memory**: Update MEMORY.md with key findings\n\n## Performance\n\n- File extraction: <10ms per file\n- URL extraction: <10s (network dependent)\n- Entity index: instant lookup\n- KB search: linear scan (optimized for <1000 sources)\n\n## Comparison\n\n| Approach | Knowledge Retention | Setup | Maintenance |\n|----------|-------------------|-------|-------------|\n| No knowledge base | 0% | None | None |\n| Manual notes | 30-50% | High | High |\n| **Research Assistant** | **80-95%** | **None** | **Automated** |\n| Vector DB | 80-95% | Very High | High |\n\n**Research Assistant gives you 80-95% knowledge retention with zero setup.**\n\n## Design Principles\n\n1. **Zero setup** — Works immediately, no config needed\n2. **No dependencies** — Pure Node.js, no npm packages\n3. **Entity-first** — Knowledge is structured around entities, not just text\n4. **Transparent** — Everything it extracts is reported\n5. **Scalable** — Handles 1000+ sources with entity index\n6. **Integrates** — Works with MemoryRouter for persistent memory\n\nFile v1.1.1:README.md\n\n# Research Assistant 🔬\n\n**Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity resolution and auto-summarization.**\n\n## Why Research Assistant?\n\nInformation is everywhere — web pages, documents, code files, emails. Research Assistant makes it *usable*:\n\n- **Entity extraction** — Automatically finds proper names, dates, URLs, emails, and key concepts\n- **Searchable knowledge base** — Queries across everything you've processed\n- **Knowledge graph** — Visualize entity relationships and connections\n- **Domain filtering** — Focus on specific topics or sources\n- **Auto-summarization** — Key entities and sources at a glance\n- **Zero external dependencies** — Pure Node.js, fully local\n\n---\n\n## Installation\n\n```bash\n# Already included in OpenClaw workspace at skills/research-assistant/\n# No npm install needed — pure Node.js\n```\n\n---\n\n## Quick Start\n\n```bash\n# Extract entities from text\nnode skills/research-assistant/research-assistant.js --extract \"John Doe joined the project on 2026-06-15\"\n\n# Search existing knowledge base\nnode skills/research-assistant/research-assistant.js --search \"John Doe\"\n\n# Add to knowledge base\nnode skills/research-assistant/research-assistant.js --add \"document-id\" --source \"report.md\"\n\n# Show knowledge graph\nnode skills/research-assistant/research-assistant.js --graph\n\n# Summarize knowledge base\nnode skills/research-assistant/research-assistant.js --summarize\n```\n\n---\n\n## Commands Reference\n\n### Entity Extraction\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract <text>\n```\n\nExtracts from unstructured text:\n- **Proper nouns** — Names, places, organizations\n- **Dates** — ISO dates, partial dates, date ranges\n- **URLs** — http/https links\n- **Email addresses**\n- **Numbers** — Counts, IDs, versions\n- **Key phrases** — Multi-word concepts (via NLP-like heuristics)\n\n```\n[research-assistant] Extracted 4 entities:\n  John Doe (person) × 2\n  2026-06-15 (date)\n  contact@example.com (email)\n  https://example.com (url)\n```\n\n---\n\n### Knowledge Base Operations\n\n```bash\n# Search\nnode skills/research-assistant/research-assistant.js --search \"query\"\n\n# Add content to KB\nnode skills/research-assistant/research-assistant.js --add <id> --source <source>\n\n# List KB entries\nnode skills/research-assistant/research-assistant.js --list\n```\n\nThe knowledge base is stored as JSON in `memory/research/` under your workspace root.\n\n---\n\n### Knowledge Graph\n\n```bash\n# Show full graph\nnode skills/research-assistant/research-assistant.js --graph\n\n# Filter by domain\nnode skills/research-assistant/research-assistant.js --graph --domain \"example.com\"\n```\n\nDisplays:\n- **Sources** — Total entries in KB\n- **Entities** — Unique entities with occurrence counts\n- **Relations** — Connections between entities\n- **Domain filter** — Restrict to specific source domains\n\n---\n\n### Summarization\n\n```bash\nnode skills/research-assistant/research-assistant.js --summarize\n```\n\nReturns a summary of the knowledge base:\n```\n[research-assistant] Summary:\n  Total entries: 5\n  Total entities: 12\n  Total relations: 3\n  Key entities:\n    John Doe (3 occurrences across 2 sources)\n    API (2 occurrences across 2 sources)\n  Sources: report.md, documentation.md\n```\n\n---\n\n## Data Storage\n\nAll state stored in `memory/research/`:\n\n| File | Description |\n|------|-------------|\n| `kb.json` | Knowledge base entries with entities, relations, summaries |\n| `entity-index.json` | Quick-lookup index for entity search |\n\n---\n\n## Security & Privacy\n\nResearch Assistant is a local tool that **makes outbound HTTP requests** when extracting from URLs.\n\n| Protection | Status |\n|------------|--------|\n| **URL extraction** | Fetches HTTP/HTTPS URLs — blocked for private/local networks |\n| **CDN dependency** | Graph HTML loads D3 from cdn.jsdelivr.net (one-time external call) |\n| **No shell execution** | ✅ Pure Node.js, no exec/system calls |\n| **Input validation** | ✅ All text inputs sanitized |\n| **Null-safe iteration** | ✅ Defensive programming |\n| **Read-only by default** | ✅ Writes only to `memory/research/` |\n\n⚠️ **Privacy Warning**: Extracted entities (including emails, URLs, proper nouns) are persisted indefinitely in `memory/research/kb.json`. There is no built-in retention limit, deletion command, or redaction for stored content. Do not use this tool on confidential documents or pages containing PII.\n\n⚠️ **URL Extraction Warning**: `--extract <url>` makes outbound HTTP requests to user-supplied destinations. Private network ranges (10.x, 172.16-31.x, 192.168.x, localhost) are blocked. However, the fetched content is stored locally and indexed.\n\n---\n\n## Programmatic API\n\n```javascript\nconst RA = require('./skills/research-assistant/research-assistant.js');\n\n// Extract entities from text\nconst entities = RA.extractEntities('John Doe at example.com since 2026');\n\n// Search knowledge base\nconst results = RA.searchKB('John Doe');\n\n// Add to knowledge base\nRA.addToKB({\n  id: 'doc-1',\n  entities: [{ name: 'John Doe', type: 'person', count: 2 }],\n  relations: [],\n  summary: 'John Doe works on the API project.',\n  source: 'report.md'\n});\n\n// Build graph data\nconst graph = RA.buildGraphData('example.com');\n\n// Show summary\nRA.showSummary();\n```\n\n---\n\n## Testing\n\n```bash\n# Run full test suite (13 tests)\nnode skills/research-assistant/tests/test-research-assistant.js\n```\n\nTest coverage:\n- **Entity extraction** — proper nouns, dates, URLs, emails (4 cases)\n- **KB operations** — add, search by query, search by source, empty queries (4 cases)\n- **Knowledge graph** — output formatting, stats display (2 cases)\n- **Summarization** — key entities, sources (2 cases)\n- **Error handling** — null input, empty objects (2 cases)\n\n---\n\n## Configuration\n\n### Environment Variables\n\n| Variable | Description |\n|----------|-------------|\n| `RESEARCH_DIR` | Override knowledge base data directory |\n\n### Default Paths\n\n| Resource | Path |\n|----------|------|\n| Knowledge base | `<WORKSPACE>/memory/research/kb.json` |\n| Entity index | `<WORKSPACE>/memory/research/entity-index.json` |\n\n---\n\n## Examples\n\n### Research a Person\n```bash\nnode skills/research-assistant/research-assistant.js --extract \"Dr. Jane Smith, PhD, joined the AI team at MIT on 2022-09-01. Email: jane@mit.edu\"\n# Extracts: Jane Smith (person), 2022-09-01 (date), MIT (org), jane@mit.edu (email)\n```\n\n### Build a Knowledge Base from Docs\n```bash\n# Extract from multiple sources\nnode skills/research-assistant/research-assistant.js --add \"doc-1\" --source \"architecture.md\"\nnode skills/research-assistant/research-assistant.js --add \"doc-2\" --source \"api-spec.md\"\n\n# Search across all sources\nnode skills/research-assistant/research-assistant.js --search \"API\"\n```\n\n### Vizualize Connections\n```bash\nnode skills/research-assistant/research-assistant.js --graph --domain \"docs.example.com\"\n```\n\n---\n\n## License\n\nMIT — Part of the OpenClaw skill ecosystem.\n\n---\n\n## Related Skills\n\n- **Smart Files** — Content-aware file search and organization\n- **Notification Triage** — Smart filtering and classification\n- **Email Manager** — Email organization and search\n\nFile v1.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn7b6eyf5vc7khg5fr63pjm8xd82qvw5\",\n  \"slug\": \"agent-researcher\",\n  \"version\": \"1.1.1\",\n  \"publishedAt\": 1784737503812\n}\n\nFile v1.1.1:skill-card.md\n\n## Description: <br>\nKnowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files, then builds a searchable knowledge base with entity resolution and auto-summarization. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[jlacroix82](https://clawhub.ai/user/jlacroix82) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agent users use this skill to extract entities, relationships, summaries, and source references from selected files, directories, text, or URLs into a local searchable research index. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Extracted summaries, entities, relationships, and source paths persist locally under memory/research. <br>\nMitigation: Use the skill only on content intended for local indexing, and review or manually remove the JSON files when retention is no longer desired. <br>\nRisk: URL extraction makes outbound HTTP/HTTPS requests and stores fetched content-derived data locally. <br>\nMitigation: Follow network policy and avoid confidential, private intranet, or PII-heavy URLs unless local persistence is intended. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/jlacroix82/skills/agent-researcher) <br>\n- [Publisher profile](https://clawhub.ai/user/jlacroix82) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, JSON files, shell commands, guidance] <br>\n**Output Format:** [Markdown guidance with inline shell commands and local JSON knowledge-base files] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Stores extracted knowledge under memory/research and can fetch user-supplied HTTP/HTTPS URLs.] <br>\n\n## Skill Version(s): <br>\n1.1.1 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v1.1.1:clawhub.yaml\n\nslug: agent-researcher\nname: research-assistant\nowner: jlacroix82\ndescription: Web search, content aggregation, and research assistance for agent-native skills. ⚠️ Persists extracted entities and relationships to disk.\nversion: 1.1.2\ntype: skill\nauthor: OpenClaw\nlicense: MIT\nkeywords:\n  - research\n  - search\n  - web\n  - aggregation\n  - agent\nentry: SKILL.md\ndependencies: []\n\nArchive v1.1.0: 10 files, 18260 bytes\n\nFiles: clawhub.yaml (317b), README.md (7242b), research-assistant.js (25037b), skill-card.md (2521b), SKILL.md (4053b), test-research-assistant.js (1721b), test/run-tests.js (910b), tests/run-self-tests.js (4344b), tests/test-research-assistant.js (4344b), _meta.json (135b)\n\nFile v1.1.0:SKILL.md\n\n---\nname: research-assistant\ndescription: Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity resolution and auto-summarization. Integrates with memory-router.\n---\n\n# Research Assistant ⚡\n\n**Turn everything you read into a searchable knowledge base.**\n\n## The Problem\n\nAgents read web pages, docs, and files — but the knowledge disappears after the session. No persistent knowledge base, no entity tracking, no relationship mapping.\n\nResearch Assistant fixes this with one tool.\n\n## Quick Start\n\n### Extract from a file\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract /path/to/file.md\n```\n\nExtracts entities (proper nouns, numbers, URLs, emails), relationships, and creates a summary.\n\n### Extract from a URL\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract https://example.com/article\n```\n\nFetches the page, strips HTML, extracts entities and relationships.\n\n### Extract from an entire directory\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract --all /path/to/docs\n```\n\nProcesses all .md, .txt, and .json files in a directory.\n\n### Search the knowledge base\n\n```bash\nnode skills/research-assistant/research-assistant.js --search \"machine learning\"\n```\n\nSearches all indexed sources by entities and content.\n\n### Auto-summarize on a topic\n\n```bash\nnode skills/research-assistant/research-assistant.js --summarize \"climate change\"\n```\n\nCollects all relevant entities and sources, generates a summary with key findings.\n\n### View knowledge graph\n\n```bash\nnode skills/research-assistant/research-assistant.js --graph\n```\n\nShows entities grouped by type and their relationships.\n\n### Status\n\n```bash\nnode skills/research-assistant/research-assistant.js\n```\n\nOverview of indexed sources, unique entities, relations, and entity type breakdown.\n\n## How It Works\n\n### Entity Extraction\n\n1. **Proper nouns** — Capitalized phrases (companies, people, places)\n2. **Numbers/dates** — Dates, years, quantities\n3. **URLs** — Links found in content\n4. **Emails** — Email addresses found in content\n5. **Relationships** — \"X is Y\", \"X works at Y\" patterns\n\n### Knowledge Base\n\n- Sources are indexed with entities and relationships\n- Entity index enables fast lookups\n- Relations are deduplicated and tracked\n- Auto-summarization pulls from all relevant sources\n\n### Integration with Memory Router\n\nResearch Assistant builds on the same entity resolution system as MemoryRouter. Entities extracted from research can be linked to MEMORY.md sections for persistent memory.\n\n## Configuration\n\nNo config needed. Knowledge base is stored in `memory/research/`.\n\nOverride data directory:\n```bash\n--dir /path/to/data\n```\n\n## Agent Protocol\n\nWhen reading new content:\n\n1. **Extract entities**: `--extract <file|url>`\n2. **Search existing**: `--search <topic>` before reading new content\n3. **Summarize findings**: `--summarize <topic>` after extraction\n4. **Link to memory**: Update MEMORY.md with key findings\n\n## Performance\n\n- File extraction: <10ms per file\n- URL extraction: <10s (network dependent)\n- Entity index: instant lookup\n- KB search: linear scan (optimized for <1000 sources)\n\n## Comparison\n\n| Approach | Knowledge Retention | Setup | Maintenance |\n|----------|-------------------|-------|-------------|\n| No knowledge base | 0% | None | None |\n| Manual notes | 30-50% | High | High |\n| **Research Assistant** | **80-95%** | **None** | **Automated** |\n| Vector DB | 80-95% | Very High | High |\n\n**Research Assistant gives you 80-95% knowledge retention with zero setup.**\n\n## Design Principles\n\n1. **Zero setup** — Works immediately, no config needed\n2. **No dependencies** — Pure Node.js, no npm packages\n3. **Entity-first** — Knowledge is structured around entities, not just text\n4. **Transparent** — Everything it extracts is reported\n5. **Scalable** — Handles 1000+ sources with entity index\n6. **Integrates** — Works with MemoryRouter for persistent memory\n\nFile v1.1.0:README.md\n\n# Research Assistant 🔬\n\n**Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity resolution and auto-summarization.**\n\n## Why Research Assistant?\n\nInformation is everywhere — web pages, documents, code files, emails. Research Assistant makes it *usable*:\n\n- **Entity extraction** — Automatically finds proper names, dates, URLs, emails, and key concepts\n- **Searchable knowledge base** — Queries across everything you've processed\n- **Knowledge graph** — Visualize entity relationships and connections\n- **Domain filtering** — Focus on specific topics or sources\n- **Auto-summarization** — Key entities and sources at a glance\n- **Zero external dependencies** — Pure Node.js, fully local\n\n---\n\n## Installation\n\n```bash\n# Already included in OpenClaw workspace at skills/research-assistant/\n# No npm install needed — pure Node.js\n```\n\n---\n\n## Quick Start\n\n```bash\n# Extract entities from text\nnode skills/research-assistant/research-assistant.js --extract \"John Doe joined the project on 2026-06-15\"\n\n# Search existing knowledge base\nnode skills/research-assistant/research-assistant.js --search \"John Doe\"\n\n# Add to knowledge base\nnode skills/research-assistant/research-assistant.js --add \"document-id\" --source \"report.md\"\n\n# Show knowledge graph\nnode skills/research-assistant/research-assistant.js --graph\n\n# Summarize knowledge base\nnode skills/research-assistant/research-assistant.js --summarize\n```\n\n---\n\n## Commands Reference\n\n### Entity Extraction\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract <text>\n```\n\nExtracts from unstructured text:\n- **Proper nouns** — Names, places, organizations\n- **Dates** — ISO dates, partial dates, date ranges\n- **URLs** — http/https links\n- **Email addresses**\n- **Numbers** — Counts, IDs, versions\n- **Key phrases** — Multi-word concepts (via NLP-like heuristics)\n\n```\n[research-assistant] Extracted 4 entities:\n  John Doe (person) × 2\n  2026-06-15 (date)\n  contact@example.com (email)\n  https://example.com (url)\n```\n\n---\n\n### Knowledge Base Operations\n\n```bash\n# Search\nnode skills/research-assistant/research-assistant.js --search \"query\"\n\n# Add content to KB\nnode skills/research-assistant/research-assistant.js --add <id> --source <source>\n\n# List KB entries\nnode skills/research-assistant/research-assistant.js --list\n```\n\nThe knowledge base is stored as JSON in `memory/research/` under your workspace root.\n\n---\n\n### Knowledge Graph\n\n```bash\n# Show full graph\nnode skills/research-assistant/research-assistant.js --graph\n\n# Filter by domain\nnode skills/research-assistant/research-assistant.js --graph --domain \"example.com\"\n```\n\nDisplays:\n- **Sources** — Total entries in KB\n- **Entities** — Unique entities with occurrence counts\n- **Relations** — Connections between entities\n- **Domain filter** — Restrict to specific source domains\n\n---\n\n### Summarization\n\n```bash\nnode skills/research-assistant/research-assistant.js --summarize\n```\n\nReturns a summary of the knowledge base:\n```\n[research-assistant] Summary:\n  Total entries: 5\n  Total entities: 12\n  Total relations: 3\n  Key entities:\n    John Doe (3 occurrences across 2 sources)\n    API (2 occurrences across 2 sources)\n  Sources: report.md, documentation.md\n```\n\n---\n\n## Data Storage\n\nAll state stored in `memory/research/`:\n\n| File | Description |\n|------|-------------|\n| `kb.json` | Knowledge base entries with entities, relations, summaries |\n| `entity-index.json` | Quick-lookup index for entity search |\n\n---\n\n## Security & Privacy\n\nResearch Assistant is a local tool that **makes outbound HTTP requests** when extracting from URLs.\n\n| Protection | Status |\n|------------|--------|\n| **URL extraction** | Fetches HTTP/HTTPS URLs — blocked for private/local networks |\n| **CDN dependency** | Graph HTML loads D3 from cdn.jsdelivr.net (one-time external call) |\n| **No shell execution** | ✅ Pure Node.js, no exec/system calls |\n| **Input validation** | ✅ All text inputs sanitized |\n| **Null-safe iteration** | ✅ Defensive programming |\n| **Read-only by default** | ✅ Writes only to `memory/research/` |\n\n⚠️ **Privacy Warning**: Extracted entities (including emails, URLs, proper nouns) are persisted indefinitely in `memory/research/kb.json`. There is no built-in retention limit, deletion command, or redaction for stored content. Do not use this tool on confidential documents or pages containing PII.\n\n⚠️ **URL Extraction Warning**: `--extract <url>` makes outbound HTTP requests to user-supplied destinations. Private network ranges (10.x, 172.16-31.x, 192.168.x, localhost) are blocked. However, the fetched content is stored locally and indexed.\n\n---\n\n## Programmatic API\n\n```javascript\nconst RA = require('./skills/research-assistant/research-assistant.js');\n\n// Extract entities from text\nconst entities = RA.extractEntities('John Doe at example.com since 2026');\n\n// Search knowledge base\nconst results = RA.searchKB('John Doe');\n\n// Add to knowledge base\nRA.addToKB({\n  id: 'doc-1',\n  entities: [{ name: 'John Doe', type: 'person', count: 2 }],\n  relations: [],\n  summary: 'John Doe works on the API project.',\n  source: 'report.md'\n});\n\n// Build graph data\nconst graph = RA.buildGraphData('example.com');\n\n// Show summary\nRA.showSummary();\n```\n\n---\n\n## Testing\n\n```bash\n# Run full test suite (13 tests)\nnode skills/research-assistant/tests/test-research-assistant.js\n```\n\nTest coverage:\n- **Entity extraction** — proper nouns, dates, URLs, emails (4 cases)\n- **KB operations** — add, search by query, search by source, empty queries (4 cases)\n- **Knowledge graph** — output formatting, stats display (2 cases)\n- **Summarization** — key entities, sources (2 cases)\n- **Error handling** — null input, empty objects (2 cases)\n\n---\n\n## Configuration\n\n### Environment Variables\n\n| Variable | Description |\n|----------|-------------|\n| `RESEARCH_DIR` | Override knowledge base data directory |\n\n### Default Paths\n\n| Resource | Path |\n|----------|------|\n| Knowledge base | `<WORKSPACE>/memory/research/kb.json` |\n| Entity index | `<WORKSPACE>/memory/research/entity-index.json` |\n\n---\n\n## Examples\n\n### Research a Person\n```bash\nnode skills/research-assistant/research-assistant.js --extract \"Dr. Jane Smith, PhD, joined the AI team at MIT on 2022-09-01. Email: jane@mit.edu\"\n# Extracts: Jane Smith (person), 2022-09-01 (date), MIT (org), jane@mit.edu (email)\n```\n\n### Build a Knowledge Base from Docs\n```bash\n# Extract from multiple sources\nnode skills/research-assistant/research-assistant.js --add \"doc-1\" --source \"architecture.md\"\nnode skills/research-assistant/research-assistant.js --add \"doc-2\" --source \"api-spec.md\"\n\n# Search across all sources\nnode skills/research-assistant/research-assistant.js --search \"API\"\n```\n\n### Vizualize Connections\n```bash\nnode skills/research-assistant/research-assistant.js --graph --domain \"docs.example.com\"\n```\n\n---\n\n## License\n\nMIT — Part of the OpenClaw skill ecosystem.\n\n---\n\n## Related Skills\n\n- **Smart Files** — Content-aware file search and organization\n- **Notification Triage** — Smart filtering and classification\n- **Email Manager** — Email organization and search\n\nFile v1.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn7b6eyf5vc7khg5fr63pjm8xd82qvw5\",\n  \"slug\": \"agent-researcher\",\n  \"version\": \"1.1.0\",\n  \"publishedAt\": 1784512567930\n}\n\nFile v1.1.0:skill-card.md\n\n## Description: <br>\nKnowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity resolution and auto-summarization. Integrates with memory-router. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[jlacroix82](https://clawhub.ai/user/jlacroix82) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agent users use this skill to extract entities, relationships, summaries, and source metadata from files, directories, and URLs into a local searchable knowledge base for later search, summarization, and graph review. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Processed content can leave persistent local traces such as extracted entities, emails, URLs, summaries, and graph data. <br>\nMitigation: Use the skill only for content appropriate for local retention, avoid confidential or regulated data, and review or clear memory/research when retention is no longer desired. <br>\nRisk: URL extraction makes outbound HTTP or HTTPS requests to user-supplied destinations. <br>\nMitigation: Extract only from intended public URLs; the artifact includes private and local network blocking, but users should still avoid sensitive internal endpoints. <br>\nRisk: Exported graph HTML loads D3 from an external site when opened. <br>\nMitigation: Avoid opening exported graph files in restricted environments unless that external dependency is acceptable. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/jlacroix82/skills/agent-researcher) <br>\n- [Artifact README](artifact/README.md) <br>\n- [Artifact skill definition](artifact/SKILL.md) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, JSON, HTML, guidance] <br>\n**Output Format:** [CLI text output, JSON knowledge-base files, and optional HTML graph export.] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Stores retained local research data under memory/research; graph HTML loads D3 from an external CDN when opened.] <br>\n\n## Skill Version(s): <br>\n1.1.0 (source: server release metadata and artifact/clawhub.yaml) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v1.1.0:clawhub.yaml\n\nslug: agent-researcher\nname: research-assistant\nowner: jlacroix82\ndescription: Web search, content aggregation, and research assistance for agent-native skills\nversion: 1.1.0\ntype: skill\nauthor: OpenClaw\nlicense: MIT\nkeywords:\n  - research\n  - search\n  - web\n  - aggregation\n  - agent\nentry: SKILL.md\ndependencies: []\n\nArchive v1.0.0: 10 files, 17498 bytes\n\nFiles: clawhub.yaml (317b), README.md (6597b), research-assistant.js (23950b), skill-card.md (2460b), SKILL.md (4053b), test-research-assistant.js (1721b), test/run-tests.js (910b), tests/run-self-tests.js (4344b), tests/test-research-assistant.js (4344b), _meta.json (135b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: research-assistant\ndescription: Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity resolution and auto-summarization. Integrates with memory-router.\n---\n\n# Research Assistant ⚡\n\n**Turn everything you read into a searchable knowledge base.**\n\n## The Problem\n\nAgents read web pages, docs, and files — but the knowledge disappears after the session. No persistent knowledge base, no entity tracking, no relationship mapping.\n\nResearch Assistant fixes this with one tool.\n\n## Quick Start\n\n### Extract from a file\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract /path/to/file.md\n```\n\nExtracts entities (proper nouns, numbers, URLs, emails), relationships, and creates a summary.\n\n### Extract from a URL\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract https://example.com/article\n```\n\nFetches the page, strips HTML, extracts entities and relationships.\n\n### Extract from an entire directory\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract --all /path/to/docs\n```\n\nProcesses all .md, .txt, and .json files in a directory.\n\n### Search the knowledge base\n\n```bash\nnode skills/research-assistant/research-assistant.js --search \"machine learning\"\n```\n\nSearches all indexed sources by entities and content.\n\n### Auto-summarize on a topic\n\n```bash\nnode skills/research-assistant/research-assistant.js --summarize \"climate change\"\n```\n\nCollects all relevant entities and sources, generates a summary with key findings.\n\n### View knowledge graph\n\n```bash\nnode skills/research-assistant/research-assistant.js --graph\n```\n\nShows entities grouped by type and their relationships.\n\n### Status\n\n```bash\nnode skills/research-assistant/research-assistant.js\n```\n\nOverview of indexed sources, unique entities, relations, and entity type breakdown.\n\n## How It Works\n\n### Entity Extraction\n\n1. **Proper nouns** — Capitalized phrases (companies, people, places)\n2. **Numbers/dates** — Dates, years, quantities\n3. **URLs** — Links found in content\n4. **Emails** — Email addresses found in content\n5. **Relationships** — \"X is Y\", \"X works at Y\" patterns\n\n### Knowledge Base\n\n- Sources are indexed with entities and relationships\n- Entity index enables fast lookups\n- Relations are deduplicated and tracked\n- Auto-summarization pulls from all relevant sources\n\n### Integration with Memory Router\n\nResearch Assistant builds on the same entity resolution system as MemoryRouter. Entities extracted from research can be linked to MEMORY.md sections for persistent memory.\n\n## Configuration\n\nNo config needed. Knowledge base is stored in `memory/research/`.\n\nOverride data directory:\n```bash\n--dir /path/to/data\n```\n\n## Agent Protocol\n\nWhen reading new content:\n\n1. **Extract entities**: `--extract <file|url>`\n2. **Search existing**: `--search <topic>` before reading new content\n3. **Summarize findings**: `--summarize <topic>` after extraction\n4. **Link to memory**: Update MEMORY.md with key findings\n\n## Performance\n\n- File extraction: <10ms per file\n- URL extraction: <10s (network dependent)\n- Entity index: instant lookup\n- KB search: linear scan (optimized for <1000 sources)\n\n## Comparison\n\n| Approach | Knowledge Retention | Setup | Maintenance |\n|----------|-------------------|-------|-------------|\n| No knowledge base | 0% | None | None |\n| Manual notes | 30-50% | High | High |\n| **Research Assistant** | **80-95%** | **None** | **Automated** |\n| Vector DB | 80-95% | Very High | High |\n\n**Research Assistant gives you 80-95% knowledge retention with zero setup.**\n\n## Design Principles\n\n1. **Zero setup** — Works immediately, no config needed\n2. **No dependencies** — Pure Node.js, no npm packages\n3. **Entity-first** — Knowledge is structured around entities, not just text\n4. **Transparent** — Everything it extracts is reported\n5. **Scalable** — Handles 1000+ sources with entity index\n6. **Integrates** — Works with MemoryRouter for persistent memory\n\nFile v1.0.0:README.md\n\n# Research Assistant 🔬\n\n**Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity resolution and auto-summarization.**\n\n## Why Research Assistant?\n\nInformation is everywhere — web pages, documents, code files, emails. Research Assistant makes it *usable*:\n\n- **Entity extraction** — Automatically finds proper names, dates, URLs, emails, and key concepts\n- **Searchable knowledge base** — Queries across everything you've processed\n- **Knowledge graph** — Visualize entity relationships and connections\n- **Domain filtering** — Focus on specific topics or sources\n- **Auto-summarization** — Key entities and sources at a glance\n- **Zero external dependencies** — Pure Node.js, fully local\n\n---\n\n## Installation\n\n```bash\n# Already included in OpenClaw workspace at skills/research-assistant/\n# No npm install needed — pure Node.js\n```\n\n---\n\n## Quick Start\n\n```bash\n# Extract entities from text\nnode skills/research-assistant/research-assistant.js --extract \"John Doe joined the project on 2026-06-15\"\n\n# Search existing knowledge base\nnode skills/research-assistant/research-assistant.js --search \"John Doe\"\n\n# Add to knowledge base\nnode skills/research-assistant/research-assistant.js --add \"document-id\" --source \"report.md\"\n\n# Show knowledge graph\nnode skills/research-assistant/research-assistant.js --graph\n\n# Summarize knowledge base\nnode skills/research-assistant/research-assistant.js --summarize\n```\n\n---\n\n## Commands Reference\n\n### Entity Extraction\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract <text>\n```\n\nExtracts from unstructured text:\n- **Proper nouns** — Names, places, organizations\n- **Dates** — ISO dates, partial dates, date ranges\n- **URLs** — http/https links\n- **Email addresses**\n- **Numbers** — Counts, IDs, versions\n- **Key phrases** — Multi-word concepts (via NLP-like heuristics)\n\n```\n[research-assistant] Extracted 4 entities:\n  John Doe (person) × 2\n  2026-06-15 (date)\n  contact@example.com (email)\n  https://example.com (url)\n```\n\n---\n\n### Knowledge Base Operations\n\n```bash\n# Search\nnode skills/research-assistant/research-assistant.js --search \"query\"\n\n# Add content to KB\nnode skills/research-assistant/research-assistant.js --add <id> --source <source>\n\n# List KB entries\nnode skills/research-assistant/research-assistant.js --list\n```\n\nThe knowledge base is stored as JSON in `memory/research/` under your workspace root.\n\n---\n\n### Knowledge Graph\n\n```bash\n# Show full graph\nnode skills/research-assistant/research-assistant.js --graph\n\n# Filter by domain\nnode skills/research-assistant/research-assistant.js --graph --domain \"example.com\"\n```\n\nDisplays:\n- **Sources** — Total entries in KB\n- **Entities** — Unique entities with occurrence counts\n- **Relations** — Connections between entities\n- **Domain filter** — Restrict to specific source domains\n\n---\n\n### Summarization\n\n```bash\nnode skills/research-assistant/research-assistant.js --summarize\n```\n\nReturns a summary of the knowledge base:\n```\n[research-assistant] Summary:\n  Total entries: 5\n  Total entities: 12\n  Total relations: 3\n  Key entities:\n    John Doe (3 occurrences across 2 sources)\n    API (2 occurrences across 2 sources)\n  Sources: report.md, documentation.md\n```\n\n---\n\n## Data Storage\n\nAll state stored in `memory/research/`:\n\n| File | Description |\n|------|-------------|\n| `kb.json` | Knowledge base entries with entities, relations, summaries |\n| `entity-index.json` | Quick-lookup index for entity search |\n\n---\n\n## Security Architecture\n\nResearch Assistant is **fully local and sandboxed**:\n\n| Protection | Status |\n|------------|--------|\n| **No external calls** | ✅ Pure Node.js, no network dependencies |\n| **No shell execution** | ✅ No exec/system calls |\n| **No eval or Function** | ✅ No dynamic code execution |\n| **Input validation** | ✅ All text inputs sanitized |\n| **Null-safe iteration** | ✅ Defensive programming on all data structures |\n| **Read-only by default** | ✅ Writes only to designated KB directory |\n\n---\n\n## Programmatic API\n\n```javascript\nconst RA = require('./skills/research-assistant/research-assistant.js');\n\n// Extract entities from text\nconst entities = RA.extractEntities('John Doe at example.com since 2026');\n\n// Search knowledge base\nconst results = RA.searchKB('John Doe');\n\n// Add to knowledge base\nRA.addToKB({\n  id: 'doc-1',\n  entities: [{ name: 'John Doe', type: 'person', count: 2 }],\n  relations: [],\n  summary: 'John Doe works on the API project.',\n  source: 'report.md'\n});\n\n// Build graph data\nconst graph = RA.buildGraphData('example.com');\n\n// Show summary\nRA.showSummary();\n```\n\n---\n\n## Testing\n\n```bash\n# Run full test suite (13 tests)\nnode skills/research-assistant/tests/test-research-assistant.js\n```\n\nTest coverage:\n- **Entity extraction** — proper nouns, dates, URLs, emails (4 cases)\n- **KB operations** — add, search by query, search by source, empty queries (4 cases)\n- **Knowledge graph** — output formatting, stats display (2 cases)\n- **Summarization** — key entities, sources (2 cases)\n- **Error handling** — null input, empty objects (2 cases)\n\n---\n\n## Configuration\n\n### Environment Variables\n\n| Variable | Description |\n|----------|-------------|\n| `RA_KB_DIR` | Override knowledge base directory |\n\n### Default Paths\n\n| Resource | Path |\n|----------|------|\n| Knowledge base | `<WORKSPACE>/memory/research/kb.json` |\n| Entity index | `<WORKSPACE>/memory/research/entity-index.json` |\n\n---\n\n## Examples\n\n### Research a Person\n```bash\nnode skills/research-assistant/research-assistant.js --extract \"Dr. Jane Smith, PhD, joined the AI team at MIT on 2022-09-01. Email: jane@mit.edu\"\n# Extracts: Jane Smith (person), 2022-09-01 (date), MIT (org), jane@mit.edu (email)\n```\n\n### Build a Knowledge Base from Docs\n```bash\n# Extract from multiple sources\nnode skills/research-assistant/research-assistant.js --add \"doc-1\" --source \"architecture.md\"\nnode skills/research-assistant/research-assistant.js --add \"doc-2\" --source \"api-spec.md\"\n\n# Search across all sources\nnode skills/research-assistant/research-assistant.js --search \"API\"\n```\n\n### Vizualize Connections\n```bash\nnode skills/research-assistant/research-assistant.js --graph --domain \"docs.example.com\"\n```\n\n---\n\n## License\n\nMIT — Part of the OpenClaw skill ecosystem.\n\n---\n\n## Related Skills\n\n- **Smart Files** — Content-aware file search and organization\n- **Notification Triage** — Smart filtering and classification\n- **Email Manager** — Email organization and search\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7b6eyf5vc7khg5fr63pjm8xd82qvw5\",\n  \"slug\": \"agent-researcher\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1784412191850\n}\n\nFile v1.0.0:skill-card.md\n\n## Description: <br>\nKnowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity resolution and auto-summarization. Integrates with memory-router. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[jlacroix82](https://clawhub.ai/user/jlacroix82) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agents use this skill to extract entities, relationships, summaries, and source metadata from files, URLs, and document directories, then search and summarize that local research knowledge base across later work. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The local research store may retain names, emails, URLs, summaries, and source paths extracted from processed content. <br>\nMitigation: Avoid confidential or regulated inputs unless retention is managed explicitly; use a controlled research directory and review or delete stored memory/research files as needed. <br>\nRisk: URL extraction can make outbound requests to user-provided destinations, despite artifact documentation making contradictory network-access claims. <br>\nMitigation: Only extract trusted URLs in environments where outbound requests are acceptable, and review network posture before running the skill on untrusted input. <br>\n\n\n## Reference(s): <br>\n- [Research Assistant ClawHub release](https://clawhub.ai/jlacroix82/skills/agent-researcher) <br>\n- [Publisher profile: jlacroix82](https://clawhub.ai/user/jlacroix82) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with shell commands and text or JSON-backed research data produced by the local Node.js tool] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Stores searchable research state under memory/research by default; supports command-line extraction, search, graph, and summarization workflows.] <br>\n\n## Skill Version(s): <br>\n1.0.0 (source: server release metadata and clawhub.yaml) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nFile v1.0.0:clawhub.yaml\n\nslug: agent-researcher\nname: research-assistant\nowner: jlacroix82\ndescription: Web search, content aggregation, and research assistance for agent-native skills\nversion: 1.0.0\ntype: skill\nauthor: OpenClaw\nlicense: MIT\nkeywords:\n  - research\n  - search\n  - web\n  - aggregation\n  - agent\nentry: SKILL.md\ndependencies: []","readmeExcerpt":"Skill: research-assistant Owner: jlacroix82 Summary: Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity r... Tags: latest:1.1.5, security-fix:1.1.0 Version history: v1.1.5 | 2026-07-22T22:41:20.347Z | user v1.1.5: Security audit remediation — removed 'fully local' / 'zero external dependencies' claims, fixed email","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"node skills/research-assistant/research-assistant.js --extract /path/to/file.md"},{"language":"bash","snippet":"node skills/research-assistant/research-assistant.js --extract https://example.com/article"},{"language":"bash","snippet":"node skills/research-assistant/research-assistant.js --extract --all /path/to/docs"},{"language":"bash","snippet":"node skills/research-assistant/research-assistant.js --search \"machine learning\""},{"language":"bash","snippet":"node skills/research-assistant/research-assistant.js --summarize \"climate change\""},{"language":"bash","snippet":"node skills/research-assistant/research-assistant.js --graph"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: research-assistant\ndescription: Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity resolution and auto-summarization. Integrates with memory-router.\n---\n\n# Research Assistant ⚡\n\n**Turn everything you read into a searchable knowledge base.**\n\n## The Problem\n\nAgents read web pages, docs, and files — but the knowledge disappears after the session. No persistent knowledge base, no entity tracking, no relationship mapping.\n\nResearch Assistant fixes this with one tool.\n\n## ⚠️ Important Warnings\n\n> **Read this section before using.** Research Assistant makes outbound HTTP requests to user-supplied URLs and writes all extracted content (entities, summaries, relations) to persistent local files under `memory/research/`. These are not optional behaviors and they cannot be disabled. Do not point this tool at confidential documents, internal network endpoints, or sources containing PII.\n\n### Outbound Network Access\n`--extract <url>` makes an unauthenticated HTTP/HTTPS request to any user-supplied URL (10-second timeout). **No URL allowlist, rate limit, or proxy is applied.** The target server will see your real IP address. There is no SSRF protection — internal/private network URLs (10.x, 192.168.x, localhost, etc.) are NOT blocked. Treat this as remote code-execution-grade network exposure: only point it at URLs you would type into a browser.\n\n### Persistent Local Storage\nAll extracted entities, summaries, text content, and relationships are written to `memory/research/` and persist indefinitely:\n- `knowledge-base.json` — every entry ever extracted\n- `index.json` — searchable entity index\n- `relations.json` — relationship graph\n\nThese files grow unbounded with every extraction. There is no retention limit, automatic redaction, or built-in deletion command. PII or sensitive content ingested from URLs and files is stored forever. Monitor with `--status` and manually clean the `memory/research/` directory if needed.\n\n### PII in Extracted Data\nEntity extraction captures proper nouns, URLs, numbers, and dates. **Email address extraction is intentionally disabled** — the `extractEntities()` function does not match email patterns (see line 90 of `research-assistant.js`: `// NOTE: Email addresses are intentionally NOT extracted to avoid PII leakage`). However, email addresses may still appear inside the `summary` text field (first 200 chars of source) or inside HTML content fetched from URLs. Do not rely on the email-extraction disablement as a complete PII filter — review the stored knowledge base before exporting or sharing it.\n\n## Quick Start\n\n### Extract from a file\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract /path/to/file.md\n```\n\nExtracts entities (proper nouns, numbers, URLs) and relationships, and creates a summary. Email address extraction is disabled — see \"PII in Extracted Data\" above.\n\n### Extract from a URL\n\n```b"},{"path":"README.md","content":"# Research Assistant 🔬\n\n**Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity resolution and auto-summarization.**\n\n> **Read the \"Security & Privacy\" section before using.** This tool makes outbound HTTP requests to user-supplied URLs and writes all extracted content to persistent local files. These behaviors cannot be disabled.\n\n## Why Research Assistant?\n\nInformation is everywhere — web pages, documents, code files, emails. Research Assistant makes it *usable*:\n\n- **Entity extraction** — Automatically finds proper names, dates, URLs, and key concepts\n- **Searchable knowledge base** — Queries across everything you've processed\n- **Knowledge graph** — Visualize entity relationships and connections\n- **Domain filtering** — Focus on specific topics or sources\n- **Auto-summarization** — Key entities and sources at a glance\n- **Pure Node.js** — No npm runtime dependencies\n\n## ⚠️ What This Tool Does (Honest Description)\n\n- **Outbound HTTP**: `--extract <url>` fetches remote URLs. No allowlist, no rate limit, no proxy, no SSRF protection. Treat this as remote network exposure — only point it at URLs you would type into a browser.\n- **Persistent local storage**: Every extraction (URL or local file) is written to `memory/research/` and kept forever. There is no automatic retention or deletion.\n- **Email extraction is disabled** at the code level (see `extractEntities()` line 90), but emails can still appear inside fetched HTML or in source text — they are stored in the `summary` field.\n- **No shell execution, no system calls, no subprocess spawning.** The only network I/O is `--extract <url>` via Node's built-in `http`/`https` modules.\n\n---\n\n## Installation\n\n```bash\n# Already included in OpenClaw workspace at skills/research-assistant/\n# No npm install needed — pure Node.js\n```\n\n---\n\n## Quick Start\n\n```bash\n# Extract entities from text\nnode skills/research-assistant/research-assistant.js --extract \"John Doe joined the project on 2026-06-15\"\n\n# Search existing knowledge base\nnode skills/research-assistant/research-assistant.js --search \"John Doe\"\n\n# Add to knowledge base\nnode skills/research-assistant/research-assistant.js --add \"document-id\" --source \"report.md\"\n\n# Show knowledge graph\nnode skills/research-assistant/research-assistant.js --graph\n\n# Summarize knowledge base\nnode skills/research-assistant/research-assistant.js --summarize\n```\n\n---\n\n## Commands Reference\n\n### Entity Extraction\n\n```bash\nnode skills/research-assistant/research-assistant.js --extract <text>\n```\n\nExtracts from unstructured text:\n- **Proper nouns** — Names, places, organizations\n- **Dates** — ISO dates, partial dates, date ranges\n- **URLs** — http/https links\n- **Numbers** — Counts, IDs, versions\n- **Key phrases** — Multi-word concepts (via NLP-like heuristics)\n\nEmail address extraction is **disabled** in code. Emails may still appear in the stored `summary` field (first 200 "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7b6eyf5vc7khg5fr63pjm8xd82qvw5\",\n  \"slug\": \"agent-researcher\",\n  \"version\": \"1.1.5\",\n  \"publishedAt\": 1784760080347\n}"},{"path":"skill-card.md","content":"## Description:\n\nKnowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files into a searchable knowledge base with entity resolution and auto-summarization.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[jlacroix82](https://clawhub.ai/user/jlacroix82)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agent operators use this skill to extract entities, relationships, summaries, and key facts from web pages and local documents, then search or summarize a persistent local research knowledge base.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: URL extraction can contact arbitrary user-supplied HTTP or HTTPS URLs, including internal or private-network destinations.\n\nMitigation: Use only trusted public URLs, avoid localhost and private-network targets, and add egress controls such as an allowlist or proxy before use in sensitive environments.\n\nRisk: Extracted content, entities, summaries, and relationships are stored persistently and may include confidential information or PII.\n\nMitigation: Do not process confidential or PII-bearing sources unless retention, deletion, and redaction controls are added; manually review and clean memory/research/ as needed.\n\nRisk: Local file and directory extraction can read broad workspace inputs and add them to the persistent knowledge base.\n\nMitigation: Run the skill from a scoped workspace and provide only approved files or directories for extraction.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/jlacroix82/skills/agent-researcher)\n- [Publisher profile](https://clawhub.ai/user/jlacroix82)\n\n## Skill Output:\n\n**Output Type(s):** [text, shell commands, JSON files, guidance]\n\n**Output Format:** [Markdown guidance with inline shell commands, CLI text output, and persistent local JSON knowledge-base files.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Writes persistent local state under memory/research/; URL extraction can make outbound HTTP requests to user-supplied URLs.]\n\n## Skill Version(s):\n\n1.1.5 (source: server release metadata and clawhub.yaml)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."},{"path":"clawhub.yaml","content":"slug: agent-researcher\nname: research-assistant\nowner: jlacroix82\ndescription: Web search, content aggregation, and research assistance for agent-native skills. ⚠️ Persists extracted content and relationships to disk. Fetches arbitrary URLs. Review privacy and network safety before installing.\nversion: 1.1.5\ntype: skill\nauthor: OpenClaw\nlicense: MIT\nkeywords:\n  - research\n  - search\n  - web\n  - aggregation\n  - agent\nentry: SKILL.md\ndependencies: []"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity r... Skill: research-assistant Owner: jlacroix82 Summary: Knowledge builder that extracts entities, relationships, and key facts from web pages, documents, and files. Builds a searchable knowledge base with entity r... Tags: latest:1.1.5, security-fix:1.1.0 Version history: v1.1.5 | 2026-07-22T22:41:20.347Z | user v1.1.5: Security audit remediation — removed 'fully local' / 'zero external dependencies' claims, fixed email","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1463,"uniquenessScore":46,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T22:23:08.318Z","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-11T22:23:08.318Z","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-13T00:40:01.213Z","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/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}