@researcher-now/skill 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/SKILL.md +52 -14
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
|
|
3
3
|
The researcher.now agent skill: article & video analysis (formatted content plus structured claims, facts, and quotes) and deep multi-source research returning cited Research Reports. `SKILL.md` follows the standard skill format — drop it into your agent's skills directory (e.g. `~/.hermes/skills/research/researcher-now/SKILL.md`).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Create an rk_ key at https://researcher.now/account/ · Full agent docs: [researcher.now/llms.txt](https://researcher.now/llms.txt)
|
package/SKILL.md
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: researcher-now
|
|
3
3
|
description: |
|
|
4
|
-
Article, video, and deep research analysis via researcher.now. Use when the user says: summarize this YouTube video, extract this article, YouTube transcript, research X, find sources on Y, what does this video say. Single URLs return formatted content PLUS finished structured analysis (claims, facts, quotes) in seconds
|
|
4
|
+
Article, video, and deep research analysis via researcher.now. Use when the user says: summarize this YouTube video, extract this article, YouTube transcript, research X, find sources on Y, what does this video say. Single URLs return formatted content PLUS finished structured analysis (claims, facts, quotes) in seconds, then a full synthesized report on the same run; deep research returns a cited, synthesized Research Report with reusable source records, a live watch URL, and run-scoped Q&A.
|
|
5
5
|
license: MIT
|
|
6
6
|
metadata:
|
|
7
7
|
author: Researcher
|
|
8
8
|
homepage: https://researcher.now
|
|
9
|
-
source: https://github.com/researcher-now/
|
|
9
|
+
source: https://github.com/researcher-now/skill
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# Researcher
|
|
@@ -20,21 +20,47 @@ Think in five verbs:
|
|
|
20
20
|
1. Plan: preview a vague or high-stakes request before spending.
|
|
21
21
|
2. Run: start durable server-side work and share the watch URL immediately.
|
|
22
22
|
3. Inspect: read the truth bundle, markdown, sources, source extractions, usage, warnings, and events.
|
|
23
|
-
4. Iterate: fork, continue, deepen, focus, steer, re-extract, or regenerate the report.
|
|
23
|
+
4. Iterate: fund (raise the budget in place), fork, continue, deepen, focus, steer, re-extract, or regenerate the report.
|
|
24
24
|
5. Export: save markdown plus structured sources/source-extractions downstream.
|
|
25
25
|
|
|
26
|
+
## Stay Current
|
|
27
|
+
|
|
28
|
+
- Contract version: `2026-06-26`. Keyless access now works over MCP too (`https://researcher.now/mcp`, no API key — paid tools answer 402 with an MPP session challenge; authorizing it provisions an account and returns a durable key). Every API response carries an
|
|
29
|
+
`X-Researcher-Contract` header, and run-creating responses a
|
|
30
|
+
`contractVersion` field. When it differs from the version above, re-read
|
|
31
|
+
`https://researcher.now/agent.txt` (and `GET /v1/skill`) before continuing.
|
|
32
|
+
- Response fields are authoritative over your own saved notes: prices,
|
|
33
|
+
shapes, and statuses you recorded from earlier runs go stale — what the API
|
|
34
|
+
returns now is the truth. Never report a cost from memory; use the
|
|
35
|
+
response's `estimatedCostUsd` or the run's settled cost.
|
|
36
|
+
- Time-boxed change notices arrive as `X-Researcher-Notice` headers and
|
|
37
|
+
`contractNotices` body fields for ~2 weeks after a change — read and obey
|
|
38
|
+
them.
|
|
39
|
+
- If a response includes `pluginUpdateNote`, tell the operator to run
|
|
40
|
+
`pip install -U researcher-now`.
|
|
41
|
+
|
|
26
42
|
## Setup
|
|
27
43
|
|
|
44
|
+
Dead-simple keyless (no key, no signup): point any x402/MPP client at researcher.now with a funded wallet — it pays per request and the first paid call returns a durable key in `X-Researcher-Agent-Key` to reuse. One line:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
tempo wallet login # one time (curl -L https://tempo.xyz/install | bash)
|
|
48
|
+
tempo request https://researcher.now/v1/runs --json '{"source":{"type":"topic","topic":"…"},"limits":{"maxCostUsd":2}}'
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Full recipes (HTTP/mppx/MCP): `references/keyless-quickstart.md`. Or use a key:
|
|
52
|
+
|
|
28
53
|
- Required input: `RESEARCHER_API_KEY` or `RESEARCHER_TOKEN`, a customer Researcher API token from `https://researcher.now/account/?setup=agent`.
|
|
29
54
|
- Optional input: `RESEARCHER_BASE_URL`; default it to `https://researcher.now`.
|
|
30
55
|
- Use `RESEARCHER_API_KEY` as the bearer token. Accept `RESEARCHER_TOKEN` as an alias if the environment already uses it.
|
|
31
|
-
- If no customer token is available, send
|
|
56
|
+
- If no customer token is available and a human is present, send them to `https://researcher.now/account/?setup=agent`.
|
|
57
|
+
- Keyless provisioning (no human): `POST /v1/runs` (or `/v1/analyze`) with no `Authorization`. With no payment attached you receive `402` plus a tempo MPP session challenge (`WWW-Authenticate`, `intent:"session"`); authorize it from your wallet and retry with the session credential. The verified channel payer becomes a persistent account, and a paid run returns a durable `rk_` key in `agentApiKey` (and the `X-Researcher-Agent-Key` response header). Store it and use it as `RESEARCHER_API_KEY` for all later reads, management, and runs. Writes can stay keyless by re-authorizing a session each call.
|
|
32
58
|
- Never search local files, shell history, or logs for customer tokens.
|
|
33
59
|
- Never use admin-token, payment-bypass, or internal-only routes in customer workflows.
|
|
34
60
|
|
|
35
61
|
## Choose The Operation
|
|
36
62
|
|
|
37
|
-
- Use `POST /v1/analyze` with `{ "url": ... }` for a SINGLE article
|
|
63
|
+
- Use `POST /v1/analyze` with `{ "url": ... }` for a SINGLE article, YouTube video, X/Twitter video post, or Spotify / Apple Podcasts episode when the user wants it read/summarized/analyzed now: responds in seconds with formatted markdown or a speaker-aware transcript PLUS the structured analysis (claims, facts, quantitative data, quotes), then the run continues to a full synthesized report on the same `viewerUrl`. Billed like any run: a $5 budget session settled to actual usage at close-out (unused budget returned). Check the response `status`: `"running"` means the report is being written; `"awaiting_funding"` means the analysis was a free preview — relay the `viewerUrl` so the user can fund and finish the report. Podcast episodes always answer with `deferred: true` (`reason: "podcast"`) and no inline transcript — audio transcription takes minutes; relay the `viewerUrl` immediately and poll `GET /v1/runs/:id/job` instead of waiting on the HTTP call. Prefer this over a deep run for one-URL asks — only start a deep run for multi-source synthesis.
|
|
38
64
|
- Use `POST /v1/runs` with `preflightPlan:true` before spending when the customer prompt is vague, high-stakes, or needs an explicit success checklist.
|
|
39
65
|
- Use `POST /v1/runs` for all new durable work. Pick `source.type` as `topic`, `url`, `feed`, or `video`; include `requestedBy` and an `Idempotency-Key`.
|
|
40
66
|
- Use `source.type:"video"` for a YouTube URL, podcast/video link, or transcript-first task. Do not scrape video as a generic webpage.
|
|
@@ -43,23 +69,31 @@ Think in five verbs:
|
|
|
43
69
|
- Use `GET /v1/runs`, `/v1/library`, or `/v1/library/recall?q=*` to enumerate existing runs and recall.
|
|
44
70
|
- Use `GET /v1/runs/:id/job` for live run state. Read top-level `status`, `currentStage`, `currentActivity`, and `state`; legacy `job.status` remains nested under `job`.
|
|
45
71
|
- Use `POST /v1/webhooks` with `event:"run.complete"` before starting unattended or multi-run work. If no webhook receiver is available, stream or poll until `succeeded`, `failed`, or `cancelled`.
|
|
72
|
+
- Use `GET /v1/exports/pending` at session start and before commissioning new research: it lists terminal runs no agent on this account has seen yet — including runs started on the researcher.now web app, the API, or Discord. Surface each run's watch URL to the user, then acknowledge with `POST /v1/exports/ack {"ids":[...]}` so they stop appearing. Full results stay available via the normal run endpoints.
|
|
73
|
+
- Use `POST /v1/topics` when the user wants standing coverage of a subject ("keep an eye on X", "track Y going forward") instead of a one-off report. Body: `{ "prompt": "...", "title"?, "seeds"?: { "xAccounts"?: [], "githubProfiles"?: [], "feeds"?: [], "domains"?: [] }, "cadence"?: "realtime" | "hourly" | "daily" | "weekly" (default daily; realtime scans roughly every 10 minutes), "monthlyBudgetUsd"? }`. Make `prompt` the subject plus the user's stake in it. Creating a topic fires a bootstrap deep-research run automatically; seeds become standing watch targets (X accounts, GitHub profiles, RSS feeds, websites) plus an automatic wide-search lane. `seeds.xAccounts` accepts up to 1,000 handles (large lists are scanned in batches); `seeds.githubProfiles` takes up to 100 GitHub usernames watched via the public events API (releases, new repos, pushes, opened pull requests), surfaced on `GET /v1/topics/:id` as watch targets with kind `github`. Same customer key as `/v1/runs`.
|
|
74
|
+
- Use `GET /v1/topics` to list topics and `GET /v1/topics/:idOrSlug` for one topic plus recent events (including `scan_digest` items), watch targets, and docs. The path segment accepts either the topic's `slug` or its uuid, and every topic object carries a `slug` (a URL-friendly form of its title, unique within your account). Rename a topic with `PATCH /v1/topics/:id` body `{ "title": "..." }` (1-200 chars after trimming): it regenerates the slug, returns `{ topic }` with the new title and slug, and appends a `title_updated` event. Lifecycle: `bootstrapping` -> `active` once the bootstrap run completes | `bootstrap_failed` if the bootstrap run could not start. Scanning is independent of that lifecycle: the topic scans on its cadence (appending `scan_digest` events) from creation, including while bootstrapping, and stops only when paused or archived.
|
|
75
|
+
- Read topic docs from `GET /v1/topics/:id`: `docs.thesis` and `docs.working` are two versioned markdown documents, each `{ version, contentMarkdown, summary, createdAt }` or `null` before seeding. `thesis` holds the stable top-level beliefs seeded from the bootstrap research run (numbered claims with confidence and falsification conditions) and is never auto-edited — synthesis only flags tensions against it. `working` is the living idea layer: new scan items are continuously synthesized into it under pressure triggers (enough new items, staleness, first items after seeding), not on a fixed clock; each reorganization appends a new version. Watch for `docs_seeded` and `doc_synthesized` events — the `doc_synthesized` `message` is the what-changed summary and its `metadata.tensions` flags thesis claims under pressure, referencing claim ids — plus `docs_seed_failed` / `doc_synthesis_failed` on errors and `docs_seed_skipped` when seeding was skipped.
|
|
76
|
+
- Read Daily briefs from `GET /v1/topics/:id`: `dailyBriefs` is an array, newest first (up to 30), each `{ id, briefDate, windowStart, windowEnd, contentMarkdown, summary, itemCount, thesisDeltas, sourceItems, createdAt }` — an immutable, dated, once-per-day narrative of what happened in `[windowStart, windowEnd]` that matters to the topic, thesis-relative when a thesis doc exists. `thesisDeltas` is `[{ claimId, direction, note }]` where `direction` is `reinforced | contradicted | raised` and `claimId` references a thesis claim id (like `C1`) or is null; quiet days produce no brief. `sourceItems` is the day's notable scanned items (deduped by url, ranked by engagement/recency, capped at 12), each carrying the same optional visual fields as `scan_digest` items below. The response also carries `briefsSeenAt` (when the briefs were last marked seen, or null); `POST /v1/topics/:id/briefs/seen` marks them seen and returns `{ briefsSeenAt }`. Each written brief appends a `daily_brief_generated` event whose `message` is the brief's one-line summary.
|
|
77
|
+
- `scan_digest` items and brief `sourceItems` carry optional visual fields so clients can render tweets-as-tweets and og thumbnails, each present only when the provider supplied it: `text` (full post text), `authorName`, `authorAvatarUrl`, `media` (`[{ type: photo|video|animated_gif, url, previewUrl? }]`), `image` (thumbnail/og image for non-tweet items), and `domain`. All existing item fields are unchanged.
|
|
78
|
+
- Consult an expert persona when the user asks what a specific notable person thinks, would say, or has said about something ("what would Paul Graham say about X", "ask Buffett about Y", "how would Elon approach Z"). `GET /public/entities` lists the durable personas (Paul Graham, Warren Buffett, Elon Musk, Patrick Collison, Jeff Bezos, Stanley Druckenmiller, and more) with their slug, name, and what they are known for. `POST /v1/entities/:slug/chat` with `{ "message": "..." }` returns an answer in that persona's voice grounded in their actual writing, talks, and posts, with citations to exact sources (`answer` plus `citations`), and a `sessionId`. Each persona is a research-grounded corpus, not improvised mimicry; a small per-question fee applies. Multi-turn memory: pass the returned `sessionId` back on the next `POST /v1/entities/:slug/chat` (in the body alongside `message`) and the persona remembers the conversation; resume later by listing sessions with `GET /v1/entities/:slug/chat/sessions` (`list_persona_sessions` on MCP) and reusing a `sessionId`. Depth dial: pass `"depth": "quick"` (default) or `"depth": "deep"` for a wider reranked retrieval on hard questions. Async: pass `"async": true` to get a `turnId` immediately and poll `GET /v1/entities/:slug/chat/turns/:turnId/events` until the terminal `done` event, which carries the final answer (heavy/deep turns run on a bounded worker queue so concurrent consults stay responsive). On MCP these are `list_personas`, `ask_persona` (accepts `sessionId` and `depth`), and `list_persona_sessions`.
|
|
46
79
|
- Use `GET /v1/runs/:id/results` or `/markdown` to read a completed run.
|
|
47
80
|
- Use `GET /v1/runs/:id/transcript` for typed video transcript segments instead of raw transcript metadata blobs.
|
|
48
81
|
- Use `POST /v1/runs/:id/sources/:sourceId/redo` when a source extracted weakly and the run can be salvaged without forking.
|
|
49
82
|
- Use `GET /v1/library/search?claim=...` for account-level claim recall across completed runs.
|
|
50
83
|
- Use `POST /v1/runs/:id/chat` for questions scoped to one completed run, or the `/chat/sessions` endpoints for multi-turn UI flows.
|
|
51
|
-
- Use `POST /v1/runs/:id/iterate` as the canonical iteration wrapper for start, pause, continue, deepen, focus, steer, report, fork, evaluate, cancel, and stop. Include `Idempotency-Key` on paid iterate calls.
|
|
84
|
+
- Use `POST /v1/runs/:id/iterate` as the canonical iteration wrapper for start, fund, pause, continue, deepen, focus, steer, report, fork, evaluate, cancel, and stop. Include `Idempotency-Key` on paid iterate calls.
|
|
52
85
|
- Use `POST /v1/runs/:id/iterate` with `action:"cancel"` or `action:"stop"` to abort active work.
|
|
53
86
|
- Use `/tags`, `/collections`, `/diff`, `/export`, and `/webhooks` when organizing runs, comparing continuations, or sending terminal runs to downstream systems.
|
|
54
87
|
|
|
55
88
|
## Run Workflow
|
|
56
89
|
|
|
57
|
-
1.
|
|
58
|
-
2.
|
|
59
|
-
3.
|
|
60
|
-
4.
|
|
61
|
-
5. For
|
|
62
|
-
6. For
|
|
90
|
+
1. At session start, drain the agent inbox (`GET /v1/exports/pending`) and surface any completed runs the user has not seen, then acknowledge them. Runs started outside this agent land there too.
|
|
91
|
+
2. Convert the user's ask into a precise research prompt. Preserve requested output shape, required sources, time horizon, evaluation criteria, and exclusions.
|
|
92
|
+
3. Create the run and return the watch URL as soon as the API returns it. Do not wait for completion before sharing the link. Relay the URL exactly as returned — never construct researcher.now links yourself (for example from the `runId`); the share slug is random and cannot be derived from the run id, so a constructed link will 404.
|
|
93
|
+
4. For unattended or multi-run work, register an account-scoped `run.complete` webhook or keep polling/streaming until the run reaches `succeeded`, `failed`, or `cancelled`.
|
|
94
|
+
5. Remove terminal runs from queued or in-flight lists immediately. For failed/cancelled runs, surface the status, error, watch URL, and usage instead of waiting for a report.
|
|
95
|
+
6. For succeeded runs, fetch results, markdown, sources, extractions, and usage/cost if the user needs the final artifact or an audit.
|
|
96
|
+
7. For quality-sensitive work, review the report against the original prompt. Continue, deepen, focus, or fork instead of declaring success when prompt requirements are missing.
|
|
63
97
|
|
|
64
98
|
## Prompt Contract
|
|
65
99
|
|
|
@@ -75,6 +109,7 @@ For research runs, include these fields in the prompt whenever they are known:
|
|
|
75
109
|
|
|
76
110
|
- Use `maxCostUsd` as a cap when the user gives a budget. A budget is a ceiling, not a target spend.
|
|
77
111
|
- If the API returns `402` or wallet/payment authorization errors, use `account_funding_url` from the response when present. Otherwise send the user to `https://researcher.now/account/`.
|
|
112
|
+
- If `POST /v1/analyze` answers `502` or times out at the gateway, the server very likely kept working and created the run anyway. Do NOT blind-retry in a loop and do not theorize about the cause: `GET /v1/runs` (newest first), look for a run matching your URL/title, and resume by polling it. Retry the analyze call at most once, and only after that check finds nothing — concurrent duplicates coalesce server-side, so a single retry is safe but a retry loop is never useful.
|
|
78
113
|
- If a stage fails, treat the run as terminal, surface the run URL and the useful error message, and remove it from queued/in-flight state. Do not replace a failed Researcher run with a generic web-search summary.
|
|
79
114
|
- If the run has weak evidence or misses prompt requirements, use continuation or forked follow-up work rather than pretending the output is complete.
|
|
80
115
|
|
|
@@ -83,7 +118,7 @@ For research runs, include these fields in the prompt whenever they are known:
|
|
|
83
118
|
When creating a run, return:
|
|
84
119
|
|
|
85
120
|
- the run title or topic
|
|
86
|
-
- the Researcher run URL
|
|
121
|
+
- the Researcher run URL, copied verbatim from the API's `url`/`watchUrl`/`viewerUrl` (never assembled from the run id)
|
|
87
122
|
- the run id
|
|
88
123
|
- budget/cap if one was set
|
|
89
124
|
- what the run is currently doing, if available
|
|
@@ -92,10 +127,11 @@ When reading or reviewing a run, cite the Researcher URL and state whether the r
|
|
|
92
127
|
|
|
93
128
|
## Iteration Decision Table
|
|
94
129
|
|
|
95
|
-
- `iterate`: canonical wrapper; pass `action` as `start`, `pause`, `continue`, `deepen`, `focus`, `steer`, `report`, `fork`, `evaluate`, `cancel`, or `stop`.
|
|
130
|
+
- `iterate`: canonical wrapper; pass `action` as `start`, `fund`, `pause`, `continue`, `deepen`, `focus`, `steer`, `report`, `fork`, `evaluate`, `cancel`, or `stop`.
|
|
96
131
|
- `fork`: create a separate reviewable child version without starting new paid work.
|
|
97
132
|
- `continue`: add more work to the same run or an approved fork.
|
|
98
133
|
- `deepen`: convenience continuation for broader/deeper acquisition.
|
|
134
|
+
- `fund`: `{action:"fund", addUsd: 10}` raises the run budget. A running run keeps going with the new headroom; a run that completed at its budget resumes from its checkpoints — no re-plan, no duplicate work.
|
|
99
135
|
- `focus`: convenience continuation narrowed to named topics.
|
|
100
136
|
- `steer`: mid-run guidance consumed at worker checkpoints.
|
|
101
137
|
- `report`: regenerate/update the report from the current corpus without more acquisition.
|
|
@@ -117,4 +153,6 @@ Use `POST /v1/runs/:id/export` for webhook-shaped one-off export, or register ac
|
|
|
117
153
|
|
|
118
154
|
## Recipes
|
|
119
155
|
|
|
156
|
+
For the dead-simple keyless on-ramp (zero to first result with a wallet, no API key — copy-paste tempo/mppx/MCP commands), load `references/keyless-quickstart.md`.
|
|
157
|
+
|
|
120
158
|
For copy-pasteable HTTP examples, endpoint payloads, and run-control recipes, load `references/api-recipes.md`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@researcher-now/skill",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Agent skill for researcher.now: article & video analysis (formatted content + structured claims/facts/quotes) and deep multi-source research returning cited Research Reports. Includes SKILL.md for Hermes/Claude-style skill loaders.",
|
|
5
5
|
"keywords": ["skill", "agent-skill", "research", "deep-research", "youtube-transcript", "hermes", "claude"],
|
|
6
6
|
"homepage": "https://researcher.now",
|