@wrenautomation/birdwatch 0.0.0-stage → 0.30.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/LICENSE.md +61 -0
- package/README.md +320 -2
- package/dist/app/cli.d.ts +4 -0
- package/dist/app/cli.js +149 -0
- package/dist/app/cli.js.map +1 -0
- package/dist/app/engine-cli.d.ts +44 -0
- package/dist/app/engine-cli.js +596 -0
- package/dist/app/engine-cli.js.map +1 -0
- package/dist/app/index.d.ts +6 -0
- package/dist/app/index.js +7 -0
- package/dist/app/index.js.map +1 -0
- package/dist/app/serve.d.ts +14 -0
- package/dist/app/serve.js +102 -0
- package/dist/app/serve.js.map +1 -0
- package/dist/document/body.d.ts +6 -0
- package/dist/document/body.js +18 -0
- package/dist/document/body.js.map +1 -0
- package/dist/document/check.d.ts +35 -0
- package/dist/document/check.js +68 -0
- package/dist/document/check.js.map +1 -0
- package/dist/document/extract.d.ts +81 -0
- package/dist/document/extract.js +226 -0
- package/dist/document/extract.js.map +1 -0
- package/dist/document/index.d.ts +11 -0
- package/dist/document/index.js +12 -0
- package/dist/document/index.js.map +1 -0
- package/dist/document/model.d.ts +10 -0
- package/dist/document/model.js +2 -0
- package/dist/document/model.js.map +1 -0
- package/dist/document/readers.d.ts +24 -0
- package/dist/document/readers.js +87 -0
- package/dist/document/readers.js.map +1 -0
- package/dist/document/types.d.ts +99 -0
- package/dist/document/types.js +93 -0
- package/dist/document/types.js.map +1 -0
- package/dist/engine/agent.d.ts +475 -0
- package/dist/engine/agent.js +990 -0
- package/dist/engine/agent.js.map +1 -0
- package/dist/engine/canonical.d.ts +4 -0
- package/dist/engine/canonical.js +55 -0
- package/dist/engine/canonical.js.map +1 -0
- package/dist/engine/context.d.ts +9 -0
- package/dist/engine/context.js +141 -0
- package/dist/engine/context.js.map +1 -0
- package/dist/engine/cost.d.ts +13 -0
- package/dist/engine/cost.js +31 -0
- package/dist/engine/cost.js.map +1 -0
- package/dist/engine/index.d.ts +16 -0
- package/dist/engine/index.js +17 -0
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/judge.d.ts +158 -0
- package/dist/engine/judge.js +323 -0
- package/dist/engine/judge.js.map +1 -0
- package/dist/engine/people.d.ts +34 -0
- package/dist/engine/people.js +125 -0
- package/dist/engine/people.js.map +1 -0
- package/dist/engine/plan.d.ts +6 -0
- package/dist/engine/plan.js +7 -0
- package/dist/engine/plan.js.map +1 -0
- package/dist/engine/plans/index.d.ts +19 -0
- package/dist/engine/plans/index.js +104 -0
- package/dist/engine/plans/index.js.map +1 -0
- package/dist/engine/ports.d.ts +76 -0
- package/dist/engine/ports.js +28 -0
- package/dist/engine/ports.js.map +1 -0
- package/dist/engine/recall.d.ts +42 -0
- package/dist/engine/recall.js +71 -0
- package/dist/engine/recall.js.map +1 -0
- package/dist/engine/state.d.ts +96 -0
- package/dist/engine/state.js +162 -0
- package/dist/engine/state.js.map +1 -0
- package/dist/engine/steps.d.ts +98 -0
- package/dist/engine/steps.js +435 -0
- package/dist/engine/steps.js.map +1 -0
- package/dist/engine/tree.d.ts +76 -0
- package/dist/engine/tree.js +148 -0
- package/dist/engine/tree.js.map +1 -0
- package/dist/engine/types.d.ts +250 -0
- package/dist/engine/types.js +168 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/engine/view.d.ts +138 -0
- package/dist/engine/view.js +188 -0
- package/dist/engine/view.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/ledger/files.d.ts +39 -0
- package/dist/ledger/files.js +113 -0
- package/dist/ledger/files.js.map +1 -0
- package/dist/ledger/ids.d.ts +4 -0
- package/dist/ledger/ids.js +9 -0
- package/dist/ledger/ids.js.map +1 -0
- package/dist/ledger/index.d.ts +11 -0
- package/dist/ledger/index.js +12 -0
- package/dist/ledger/index.js.map +1 -0
- package/dist/ledger/ledger.d.ts +46 -0
- package/dist/ledger/ledger.js +105 -0
- package/dist/ledger/ledger.js.map +1 -0
- package/dist/ledger/memory.d.ts +19 -0
- package/dist/ledger/memory.js +19 -0
- package/dist/ledger/memory.js.map +1 -0
- package/dist/ledger/records.d.ts +1424 -0
- package/dist/ledger/records.js +292 -0
- package/dist/ledger/records.js.map +1 -0
- package/dist/sources/arxiv.d.ts +105 -0
- package/dist/sources/arxiv.js +321 -0
- package/dist/sources/arxiv.js.map +1 -0
- package/dist/sources/exa.d.ts +19 -0
- package/dist/sources/exa.js +59 -0
- package/dist/sources/exa.js.map +1 -0
- package/dist/sources/fetcher.d.ts +35 -0
- package/dist/sources/fetcher.js +67 -0
- package/dist/sources/fetcher.js.map +1 -0
- package/dist/sources/google.d.ts +16 -0
- package/dist/sources/google.js +64 -0
- package/dist/sources/google.js.map +1 -0
- package/dist/sources/index.d.ts +17 -0
- package/dist/sources/index.js +18 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/junk.d.ts +10 -0
- package/dist/sources/junk.js +16 -0
- package/dist/sources/junk.js.map +1 -0
- package/dist/sources/ladder.d.ts +47 -0
- package/dist/sources/ladder.js +158 -0
- package/dist/sources/ladder.js.map +1 -0
- package/dist/sources/ledger.d.ts +7 -0
- package/dist/sources/ledger.js +35 -0
- package/dist/sources/ledger.js.map +1 -0
- package/dist/sources/paste.d.ts +8 -0
- package/dist/sources/paste.js +22 -0
- package/dist/sources/paste.js.map +1 -0
- package/dist/sources/searxng.d.ts +11 -0
- package/dist/sources/searxng.js +38 -0
- package/dist/sources/searxng.js.map +1 -0
- package/dist/sources/sites.d.ts +53 -0
- package/dist/sources/sites.js +285 -0
- package/dist/sources/sites.js.map +1 -0
- package/dist/sources/ytdlp.d.ts +43 -0
- package/dist/sources/ytdlp.js +117 -0
- package/dist/sources/ytdlp.js.map +1 -0
- package/package.json +61 -3
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Readers for one site each, over that site's own read route on an autobrowse worker (the same
|
|
3
|
+
* wire as the ladder). Each claims only its site's URLs and goes before the general openers
|
|
4
|
+
* (`first`): the route answers the thread or the post as data, where a fetched page is a wall or a
|
|
5
|
+
* JavaScript shell.
|
|
6
|
+
*
|
|
7
|
+
* `reddit`: a thread (`/comments/{id}`) through `reddit-public` (signed out, the RSS feed), then,
|
|
8
|
+
* when the caller named an account (`BIRDWATCH_ACCOUNTS=reddit=reddit@alt`), through `reddit`
|
|
9
|
+
* signed in as it. Signed out goes first: read volume on a signed-in account is what Reddit
|
|
10
|
+
* flags. A follow from a user's page (`/user/{name}`) lists their top posts and comments in one
|
|
11
|
+
* read (`/user/{name}/overview`), signed out. `facebook`: one public group post through `fb-public`, always signed out (Wren's Meta
|
|
12
|
+
* login runs the ads). Design: autobrowse `designs/2026-10-28-signed-in-reads.md`.
|
|
13
|
+
*
|
|
14
|
+
* A route that answered no (a 404, a spent cap, a refusal) is a miss with its reason and the
|
|
15
|
+
* worker's access code; a worker that did not answer, or a busy profile (503), is a Transient.
|
|
16
|
+
* A signed-out miss reads signed in, except a spent cap or a broken site (`rate_limited`,
|
|
17
|
+
* `upstream_broken`): signing in fixes neither.
|
|
18
|
+
*/
|
|
19
|
+
import { Transient } from "@wrenautomation/models";
|
|
20
|
+
import { junkReason } from "./junk.js";
|
|
21
|
+
import { LadderCallError } from "./ladder.js";
|
|
22
|
+
/** `reddit=reddit@alt,linkedin=linkedin@wren`: the account each site reader signs in as. */
|
|
23
|
+
export function accountsFrom(spec) {
|
|
24
|
+
const out = new Map();
|
|
25
|
+
for (const pair of (spec ?? "").split(",")) {
|
|
26
|
+
const [site, account] = pair.split("=").map((s) => s.trim());
|
|
27
|
+
if (site && account)
|
|
28
|
+
out.set(site, account);
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
const hostOf = (url) => {
|
|
33
|
+
try {
|
|
34
|
+
return new URL(url);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
/** A Reddit thread's id, and the comment's when the URL is one comment's permalink. */
|
|
41
|
+
export function redditThread(url) {
|
|
42
|
+
const u = hostOf(url);
|
|
43
|
+
if (!u)
|
|
44
|
+
return null;
|
|
45
|
+
const host = u.hostname.toLowerCase();
|
|
46
|
+
if (host === "redd.it") {
|
|
47
|
+
const m = /^\/([a-z0-9]{1,12})\/?$/i.exec(u.pathname);
|
|
48
|
+
return m?.[1] ? { article: m[1].toLowerCase() } : null;
|
|
49
|
+
}
|
|
50
|
+
if (host !== "reddit.com" && !host.endsWith(".reddit.com"))
|
|
51
|
+
return null;
|
|
52
|
+
// `/comments/{id}`, then the title's slug, then a comment's id: each after the id is optional.
|
|
53
|
+
const m = /\/comments\/([a-z0-9]{1,12})(?:\/[^/]*(?:\/([a-z0-9]{1,12}))?)?\/?$/i.exec(u.pathname);
|
|
54
|
+
if (!m?.[1])
|
|
55
|
+
return null;
|
|
56
|
+
return { article: m[1].toLowerCase(), ...(m[2] ? { comment: m[2].toLowerCase() } : {}) };
|
|
57
|
+
}
|
|
58
|
+
/** A Reddit user's name from their page (`/user/{name}`, `/u/{name}`). */
|
|
59
|
+
export function redditUser(url) {
|
|
60
|
+
const u = hostOf(url);
|
|
61
|
+
if (!u)
|
|
62
|
+
return null;
|
|
63
|
+
const host = u.hostname.toLowerCase();
|
|
64
|
+
if (host !== "reddit.com" && !host.endsWith(".reddit.com"))
|
|
65
|
+
return null;
|
|
66
|
+
const m = /^\/(?:user|u)\/([A-Za-z0-9_-]{3,20})(?:\/|$)/.exec(u.pathname);
|
|
67
|
+
return m?.[1] ?? null;
|
|
68
|
+
}
|
|
69
|
+
/** A user's overview (posts and comments mixed) as hits: each its permalink, title and words. */
|
|
70
|
+
export function userHits(body) {
|
|
71
|
+
return things(body).flatMap((t) => {
|
|
72
|
+
const link = str(t.permalink);
|
|
73
|
+
if (!link)
|
|
74
|
+
return [];
|
|
75
|
+
const words = (str(t.selftext) || str(t.body)).trim();
|
|
76
|
+
const title = str(t.title) || str(t.link_title);
|
|
77
|
+
const created = typeof t.created_utc === "number" ? t.created_utc : null;
|
|
78
|
+
return [
|
|
79
|
+
{
|
|
80
|
+
url: `https://www.reddit.com${link}`,
|
|
81
|
+
...(title ? { title } : {}),
|
|
82
|
+
...(str(t.subreddit) ? { channel: `r/${str(t.subreddit)}` } : {}),
|
|
83
|
+
...(created ? { date: new Date(created * 1000).toISOString().slice(0, 10) } : {}),
|
|
84
|
+
...(words ? { snippet: words.slice(0, 300) } : {}),
|
|
85
|
+
},
|
|
86
|
+
];
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/** A Facebook group post's group and post ids. */
|
|
90
|
+
export function facebookPost(url) {
|
|
91
|
+
const u = hostOf(url);
|
|
92
|
+
if (!u)
|
|
93
|
+
return null;
|
|
94
|
+
const host = u.hostname.toLowerCase();
|
|
95
|
+
if (host !== "facebook.com" && !host.endsWith(".facebook.com"))
|
|
96
|
+
return null;
|
|
97
|
+
const m = /^\/groups\/([\w.-]{2,100})\/(?:posts|permalink)\/(\d{5,25})\/?$/.exec(u.pathname);
|
|
98
|
+
return m?.[1] && m[2] ? { group: m[1], post: m[2] } : null;
|
|
99
|
+
}
|
|
100
|
+
const isObj = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
101
|
+
const str = (v) => (typeof v === "string" ? v : "");
|
|
102
|
+
const things = (listing) => {
|
|
103
|
+
const data = isObj(listing) && isObj(listing.data) ? listing.data : {};
|
|
104
|
+
const children = Array.isArray(data.children) ? data.children : [];
|
|
105
|
+
return children.filter(isObj).map((c) => (isObj(c.data) ? c.data : {}));
|
|
106
|
+
};
|
|
107
|
+
/** Reddit says the thread is not there (404): no account would read it either. */
|
|
108
|
+
class Gone extends Error {
|
|
109
|
+
}
|
|
110
|
+
/** The worker refused the call; `code` is its access code when it sent one. */
|
|
111
|
+
class Refused extends Error {
|
|
112
|
+
code;
|
|
113
|
+
constructor(message, code) {
|
|
114
|
+
super(message);
|
|
115
|
+
this.code = code;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/** Codes a signed-in read would not fix: a spent cap (it would spend the account instead) or a broken site. */
|
|
119
|
+
const NOT_FOR_SIGN_IN = new Set(["rate_limited", "upstream_broken"]);
|
|
120
|
+
/** A thread (`[post listing, comments listing]`) as text: the post, then each comment. */
|
|
121
|
+
export function threadDocument(url, body) {
|
|
122
|
+
if (isObj(body) && "error" in body) {
|
|
123
|
+
const said = `reddit: ${str(body.message) || `error ${String(body.error)}`}`;
|
|
124
|
+
throw body.error === 404 ? new Gone(said) : new Error(said);
|
|
125
|
+
}
|
|
126
|
+
const [postListing, commentListing] = Array.isArray(body) ? body : [body, null];
|
|
127
|
+
const post = things(postListing)[0];
|
|
128
|
+
if (!post)
|
|
129
|
+
throw new Error("reddit: the thread came back without its post");
|
|
130
|
+
const head = [
|
|
131
|
+
`r/${str(post.subreddit)} · u/${str(post.author)}`,
|
|
132
|
+
typeof post.score === "number" ? `${post.score} points` : "",
|
|
133
|
+
typeof post.num_comments === "number" ? `${post.num_comments} comments` : "",
|
|
134
|
+
]
|
|
135
|
+
.filter(Boolean)
|
|
136
|
+
.join(" · ");
|
|
137
|
+
const selftext = str(post.selftext).trim();
|
|
138
|
+
const link = post.is_self === false && str(post.url) ? `Link: ${str(post.url)}` : "";
|
|
139
|
+
const comments = things(commentListing)
|
|
140
|
+
.filter((c) => str(c.body).trim())
|
|
141
|
+
.map((c) => {
|
|
142
|
+
const score = typeof c.score === "number" ? ` (${c.score})` : "";
|
|
143
|
+
return `u/${str(c.author) || "[deleted]"}${score}: ${str(c.body).trim()}`;
|
|
144
|
+
});
|
|
145
|
+
const text = [
|
|
146
|
+
str(post.title),
|
|
147
|
+
head,
|
|
148
|
+
selftext || link,
|
|
149
|
+
comments.length ? `Comments:\n\n${comments.join("\n\n")}` : "",
|
|
150
|
+
]
|
|
151
|
+
.filter(Boolean)
|
|
152
|
+
.join("\n\n");
|
|
153
|
+
const created = typeof post.created_utc === "number" ? post.created_utc : null;
|
|
154
|
+
return {
|
|
155
|
+
url,
|
|
156
|
+
media: "text",
|
|
157
|
+
...(str(post.title) ? { title: str(post.title) } : {}),
|
|
158
|
+
text,
|
|
159
|
+
...(str(post.subreddit) ? { channel: `r/${str(post.subreddit)}` } : {}),
|
|
160
|
+
...(created ? { date: new Date(created * 1000).toISOString().slice(0, 10) } : {}),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
const POST_KEYS = ["author", "badge", "time", "title"];
|
|
164
|
+
/** fb-public's `{ post, comments }` as text: the post's whole text, then each comment. */
|
|
165
|
+
export function groupPostDocument(url, body) {
|
|
166
|
+
const post = isObj(body) && isObj(body.post) ? body.post : null;
|
|
167
|
+
if (!post)
|
|
168
|
+
throw new Error("facebook: the walk read no post (private, removed or a wall)");
|
|
169
|
+
const whole = str(post.all).trim() || str(post.text).trim();
|
|
170
|
+
const head = POST_KEYS.map((k) => str(post[k]).trim())
|
|
171
|
+
.filter(Boolean)
|
|
172
|
+
.join(" · ");
|
|
173
|
+
const comments = (isObj(body) && Array.isArray(body.comments) ? body.comments : [])
|
|
174
|
+
.filter(isObj)
|
|
175
|
+
.map((c) => `${str(c.author) || "someone"}: ${str(c.text).trim()}`)
|
|
176
|
+
.filter((line) => !line.endsWith(": "));
|
|
177
|
+
const text = [head, whole, comments.length ? `Comments:\n\n${comments.join("\n\n")}` : ""]
|
|
178
|
+
.filter(Boolean)
|
|
179
|
+
.join("\n\n");
|
|
180
|
+
return {
|
|
181
|
+
url,
|
|
182
|
+
media: "text",
|
|
183
|
+
...(str(post.title) ? { title: str(post.title) } : {}),
|
|
184
|
+
text,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
/** One route call; a refusal is a miss with the worker's words, no answer a Transient. */
|
|
188
|
+
export async function routeCall(sites, who, site, path, input, account) {
|
|
189
|
+
try {
|
|
190
|
+
return await sites.call(site, "GET", path, input, account ? { account } : undefined);
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
if (err instanceof LadderCallError) {
|
|
194
|
+
if (err.status === 429)
|
|
195
|
+
throw new Refused(`${who}: ${site}'s cap is spent for today`, err.code ?? "rate_limited");
|
|
196
|
+
// The profile stayed busy past the worker's wait: the read was never sent.
|
|
197
|
+
if (err.status === 503)
|
|
198
|
+
throw new Transient(`${who}: ${err.message}`);
|
|
199
|
+
throw new Refused(`${who}: ${err.code ? `${err.code}: ` : ""}${err.message}`, err.code);
|
|
200
|
+
}
|
|
201
|
+
throw new Transient(`${who}: the worker did not answer (${err.message})`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const usable = (who, doc) => {
|
|
205
|
+
const junk = junkReason(doc);
|
|
206
|
+
if (junk)
|
|
207
|
+
throw new Error(`${who}: ${junk}`);
|
|
208
|
+
return doc;
|
|
209
|
+
};
|
|
210
|
+
/** Top comments asked of a thread: enough to read the room, inside the route's 500. */
|
|
211
|
+
const COMMENTS = 200;
|
|
212
|
+
export function redditSource(o) {
|
|
213
|
+
const read = async (url, signedIn) => {
|
|
214
|
+
const t = redditThread(url);
|
|
215
|
+
if (!t)
|
|
216
|
+
throw new Error(`reddit: not a thread: ${url}`);
|
|
217
|
+
const input = {
|
|
218
|
+
article: t.article,
|
|
219
|
+
limit: COMMENTS,
|
|
220
|
+
sort: "top",
|
|
221
|
+
...(t.comment ? { comment: t.comment, context: 3 } : {}),
|
|
222
|
+
};
|
|
223
|
+
const who = signedIn ? `reddit as ${o.account}` : "reddit signed out";
|
|
224
|
+
const body = signedIn
|
|
225
|
+
? await routeCall(o.sites, who, "reddit", `/comments/${t.article}`, input, o.account)
|
|
226
|
+
: await routeCall(o.sites, who, "reddit-public", `/comments/${t.article}`, input);
|
|
227
|
+
return usable(who, threadDocument(url, body));
|
|
228
|
+
};
|
|
229
|
+
return {
|
|
230
|
+
name: "reddit",
|
|
231
|
+
kind: "open",
|
|
232
|
+
cost: "browser",
|
|
233
|
+
first: true,
|
|
234
|
+
opens: (url) => redditThread(url) !== null,
|
|
235
|
+
follows: (as, url) => as === "posts" && redditUser(url) !== null,
|
|
236
|
+
async follow(_as, url, n) {
|
|
237
|
+
const username = redditUser(url);
|
|
238
|
+
if (!username)
|
|
239
|
+
throw new Error(`reddit: not a user's page: ${url}`);
|
|
240
|
+
const input = { username, limit: Math.min(n, 100), sort: "top" };
|
|
241
|
+
const body = await routeCall(o.sites, "reddit signed out", "reddit-public", `/user/${username}/overview`, input);
|
|
242
|
+
return userHits(body);
|
|
243
|
+
},
|
|
244
|
+
async open(h) {
|
|
245
|
+
if (!o.account)
|
|
246
|
+
return read(h.url, false);
|
|
247
|
+
try {
|
|
248
|
+
return await read(h.url, false);
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
if (err instanceof Transient || err instanceof Gone)
|
|
252
|
+
throw err;
|
|
253
|
+
if (err instanceof Refused && err.code && NOT_FOR_SIGN_IN.has(err.code))
|
|
254
|
+
throw err;
|
|
255
|
+
// Say it: a signed-in read spends the account's standing, and the agent counts it.
|
|
256
|
+
console.warn(`${h.url}: ${err.message}; reading as ${o.account}`);
|
|
257
|
+
try {
|
|
258
|
+
return await read(h.url, true);
|
|
259
|
+
}
|
|
260
|
+
catch (again) {
|
|
261
|
+
if (again instanceof Transient)
|
|
262
|
+
throw again;
|
|
263
|
+
throw new Error(`${err.message}; ${again.message}`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
export function facebookSource(o) {
|
|
270
|
+
return {
|
|
271
|
+
name: "facebook",
|
|
272
|
+
kind: "open",
|
|
273
|
+
cost: "browser",
|
|
274
|
+
first: true,
|
|
275
|
+
opens: (url) => facebookPost(url) !== null,
|
|
276
|
+
async open(h) {
|
|
277
|
+
const p = facebookPost(h.url);
|
|
278
|
+
if (!p)
|
|
279
|
+
throw new Error(`facebook: not a group post: ${h.url}`);
|
|
280
|
+
const body = await routeCall(o.sites, "facebook", "fb-public", `/groups/${p.group}/posts/${p.post}`, p);
|
|
281
|
+
return usable("facebook", groupPostDocument(h.url, body));
|
|
282
|
+
},
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
//# sourceMappingURL=sites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sites.js","sourceRoot":"","sources":["../../src/sources/sites.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* yt-dlp as a source: `ytsearchN:<terms>` for hits (what the listing shows for free), and a
|
|
3
|
+
* YouTube video read whole (captions, else Gemini hears it) as one document. Other hosts' videos
|
|
4
|
+
* need the watcher's keys: not here yet. Metered: a read without captions costs a model call.
|
|
5
|
+
*/
|
|
6
|
+
import type { Model } from "@wrenautomation/models";
|
|
7
|
+
import type { VideoRead } from "@wrenautomation/read/video";
|
|
8
|
+
import { flatPlaylist, pageInfo, readYoutube, type YtDlpEntry } from "@wrenautomation/read/video";
|
|
9
|
+
import type { Document } from "../document/index.js";
|
|
10
|
+
import type { Source } from "../engine/ports.js";
|
|
11
|
+
export declare const videoDocument: (r: VideoRead) => Document;
|
|
12
|
+
/** One listed entry as a hit; `youtube` builds the watch URL from the id, other sites keep theirs. */
|
|
13
|
+
export declare const entryHit: (e: YtDlpEntry, site?: "youtube" | "other") => {
|
|
14
|
+
snippet?: string;
|
|
15
|
+
date?: string;
|
|
16
|
+
length?: number;
|
|
17
|
+
channel?: string;
|
|
18
|
+
title?: string;
|
|
19
|
+
url: string;
|
|
20
|
+
} | null;
|
|
21
|
+
/** A YouTube watch URL (or youtu.be): what the `youtube` source opens. */
|
|
22
|
+
export declare function isYoutube(url: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* The page yt-dlp lists a URL's own posts from: a YouTube channel's videos (a video resolves
|
|
25
|
+
* to its channel first), a TikTok profile. Null: not a page it lists.
|
|
26
|
+
*/
|
|
27
|
+
export declare function postsOf(url: string): {
|
|
28
|
+
target: string;
|
|
29
|
+
site: "youtube" | "other";
|
|
30
|
+
} | "video" | null;
|
|
31
|
+
export declare function ytdlpSource(o: {
|
|
32
|
+
ytDlp: string;
|
|
33
|
+
/**
|
|
34
|
+
* The model that reads what a video shows, made on first open (`geminiVideo` checks its keys
|
|
35
|
+
* over the network): listing sources costs no call.
|
|
36
|
+
*/
|
|
37
|
+
video?: () => Promise<Model | null>;
|
|
38
|
+
n?: number;
|
|
39
|
+
/** For tests: stand-ins for the yt-dlp calls. */
|
|
40
|
+
list?: typeof flatPlaylist;
|
|
41
|
+
read?: typeof readYoutube;
|
|
42
|
+
info?: typeof pageInfo;
|
|
43
|
+
}): Source;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* yt-dlp as a source: `ytsearchN:<terms>` for hits (what the listing shows for free), and a
|
|
3
|
+
* YouTube video read whole (captions, else Gemini hears it) as one document. Other hosts' videos
|
|
4
|
+
* need the watcher's keys: not here yet. Metered: a read without captions costs a model call.
|
|
5
|
+
*/
|
|
6
|
+
import { flatPlaylist, pageInfo, readYoutube } from "@wrenautomation/read/video";
|
|
7
|
+
import { youtubeId } from "../engine/canonical.js";
|
|
8
|
+
export const videoDocument = (r) => ({
|
|
9
|
+
url: r.url,
|
|
10
|
+
media: "video",
|
|
11
|
+
title: r.title,
|
|
12
|
+
text: r.body,
|
|
13
|
+
...(r.channel ? { channel: r.channel } : {}),
|
|
14
|
+
...(r.uploaded ? { date: r.uploaded } : {}),
|
|
15
|
+
...(r.duration !== undefined ? { length: r.duration } : {}),
|
|
16
|
+
});
|
|
17
|
+
/** One listed entry as a hit; `youtube` builds the watch URL from the id, other sites keep theirs. */
|
|
18
|
+
export const entryHit = (e, site = "youtube") => {
|
|
19
|
+
const own = e.webpage_url ?? e.url;
|
|
20
|
+
const url = site === "youtube" && e.id ? `https://www.youtube.com/watch?v=${e.id}` : own;
|
|
21
|
+
if (!url)
|
|
22
|
+
return null;
|
|
23
|
+
const by = e.channel ?? e.uploader;
|
|
24
|
+
return {
|
|
25
|
+
url,
|
|
26
|
+
...(e.title ? { title: e.title } : {}),
|
|
27
|
+
...(by ? { channel: by } : {}),
|
|
28
|
+
...(e.duration !== undefined ? { length: Math.round(e.duration) } : {}),
|
|
29
|
+
...(e.timestamp ? { date: new Date(e.timestamp * 1000).toISOString().slice(0, 10) } : {}),
|
|
30
|
+
...(e.description ? { snippet: e.description.slice(0, 300) } : {}),
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
/** A YouTube watch URL (or youtu.be): what the `youtube` source opens. */
|
|
34
|
+
export function isYoutube(url) {
|
|
35
|
+
try {
|
|
36
|
+
return Boolean(youtubeId(new URL(url)));
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The page yt-dlp lists a URL's own posts from: a YouTube channel's videos (a video resolves
|
|
44
|
+
* to its channel first), a TikTok profile. Null: not a page it lists.
|
|
45
|
+
*/
|
|
46
|
+
export function postsOf(url) {
|
|
47
|
+
let u;
|
|
48
|
+
try {
|
|
49
|
+
u = new URL(url);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const host = u.hostname.toLowerCase().replace(/^(www|m)\./, "");
|
|
55
|
+
const [first, second] = u.pathname.split("/").filter(Boolean);
|
|
56
|
+
if (host === "youtube.com" || host === "youtu.be") {
|
|
57
|
+
if (isYoutube(url))
|
|
58
|
+
return "video";
|
|
59
|
+
if (first?.startsWith("@"))
|
|
60
|
+
return { target: `https://www.youtube.com/${first}/videos`, site: "youtube" };
|
|
61
|
+
if ((first === "channel" || first === "c" || first === "user") && second)
|
|
62
|
+
return { target: `https://www.youtube.com/${first}/${second}/videos`, site: "youtube" };
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
if (host === "tiktok.com" && first?.startsWith("@"))
|
|
66
|
+
return { target: `https://www.tiktok.com/${first}`, site: "other" };
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
export function ytdlpSource(o) {
|
|
70
|
+
const list = o.list ?? flatPlaylist;
|
|
71
|
+
const read = o.read ?? readYoutube;
|
|
72
|
+
const info = o.info ?? pageInfo;
|
|
73
|
+
let video;
|
|
74
|
+
const videoModel = (make) => {
|
|
75
|
+
video ??= make();
|
|
76
|
+
return video;
|
|
77
|
+
};
|
|
78
|
+
return {
|
|
79
|
+
name: "youtube",
|
|
80
|
+
kind: "both",
|
|
81
|
+
cost: "metered",
|
|
82
|
+
// YouTube's own search knows no other site.
|
|
83
|
+
keeps: (site) => /(^|\.)(youtube\.com|youtu\.be)$/i.test(site),
|
|
84
|
+
async search(q) {
|
|
85
|
+
const entries = await list(o.ytDlp, `ytsearch${o.n ?? 10}:${q.terms}`);
|
|
86
|
+
return entries.map((e) => entryHit(e)).filter((h) => h !== null);
|
|
87
|
+
},
|
|
88
|
+
follows: (as, url) => as === "posts" && postsOf(url) !== null,
|
|
89
|
+
async follow(_as, url, n) {
|
|
90
|
+
let at = postsOf(url);
|
|
91
|
+
if (at === "video") {
|
|
92
|
+
const v = await info(o.ytDlp, url);
|
|
93
|
+
const channel = [v.channel_url, v.uploader_url].find((x) => typeof x === "string");
|
|
94
|
+
at = typeof channel === "string" ? postsOf(channel) : null;
|
|
95
|
+
if (!at || at === "video")
|
|
96
|
+
throw new Error(`youtube: no channel for ${url}`);
|
|
97
|
+
}
|
|
98
|
+
if (!at)
|
|
99
|
+
throw new Error(`youtube: no posts page for ${url}`);
|
|
100
|
+
const site = at.site;
|
|
101
|
+
const entries = await list(o.ytDlp, at.target, { start: 1, end: n });
|
|
102
|
+
return entries
|
|
103
|
+
.map((e) => entryHit(e, site))
|
|
104
|
+
.filter((h) => h !== null);
|
|
105
|
+
},
|
|
106
|
+
opens: isYoutube,
|
|
107
|
+
async open(h) {
|
|
108
|
+
if (!isYoutube(h.url))
|
|
109
|
+
throw new Error(`youtube: not a YouTube page: ${h.url}`);
|
|
110
|
+
return videoDocument(await read(h.url, {
|
|
111
|
+
ytDlp: o.ytDlp,
|
|
112
|
+
...(o.video ? { video: await videoModel(o.video) } : {}),
|
|
113
|
+
}));
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=ytdlp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ytdlp.js","sourceRoot":"","sources":["../../src/sources/ytdlp.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,64 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wrenautomation/birdwatch",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.30.0",
|
|
4
|
+
"description": "Research from the open web, driven by an agent one step per command: plan, search, triage, open, extract behind a quote gate, check, review, every record in a ledger. The agent decides; the engine runs the fixed steps. The ask and plan files, the document side (Document, Finding, Proof, the claim extractor), the sources (SearXNG, Exa, Google, arXiv, YouTube, Reddit, Facebook, the fetch ladder) and the ledger. One CLI, `birdwatch`, with the readers of @wrenautomation/read on it.",
|
|
5
|
+
"license": "PolyForm-Strict-1.0.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/wrenautomation/engine.git",
|
|
9
|
+
"directory": "packages/birdwatch"
|
|
10
|
+
},
|
|
11
|
+
"type": "module",
|
|
12
|
+
"files": [
|
|
13
|
+
"dist",
|
|
14
|
+
"!dist/**/*.test.*",
|
|
15
|
+
"README.md",
|
|
16
|
+
"LICENSE.md"
|
|
17
|
+
],
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"import": "./dist/index.js"
|
|
25
|
+
},
|
|
26
|
+
"./document": {
|
|
27
|
+
"types": "./dist/document/index.d.ts",
|
|
28
|
+
"import": "./dist/document/index.js"
|
|
29
|
+
},
|
|
30
|
+
"./engine": {
|
|
31
|
+
"types": "./dist/engine/index.d.ts",
|
|
32
|
+
"import": "./dist/engine/index.js"
|
|
33
|
+
},
|
|
34
|
+
"./ledger": {
|
|
35
|
+
"types": "./dist/ledger/index.d.ts",
|
|
36
|
+
"import": "./dist/ledger/index.js"
|
|
37
|
+
},
|
|
38
|
+
"./sources": {
|
|
39
|
+
"types": "./dist/sources/index.d.ts",
|
|
40
|
+
"import": "./dist/sources/index.js"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"bin": {
|
|
44
|
+
"birdwatch": "dist/app/cli.js"
|
|
45
|
+
},
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=24"
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"@hono/node-server": "2.1.3",
|
|
51
|
+
"commander": "15.0.0",
|
|
52
|
+
"hono": "4.13.12",
|
|
53
|
+
"htmlparser2": "12.0.0",
|
|
54
|
+
"minisearch": "7.2.0",
|
|
55
|
+
"ulid": "3.0.2",
|
|
56
|
+
"zod": "4.6.5",
|
|
57
|
+
"@wrenautomation/models": "0.30.0",
|
|
58
|
+
"@wrenautomation/read": "0.30.0"
|
|
59
|
+
},
|
|
60
|
+
"scripts": {
|
|
61
|
+
"typecheck": "tsc --noEmit",
|
|
62
|
+
"build": "sh ../../scripts/build.sh app/cli.js"
|
|
63
|
+
}
|
|
6
64
|
}
|