@ixo/decision-oracle 0.2.17 → 0.2.19
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/dist/cron/collection.d.ts +14 -1
- package/dist/cron/collection.d.ts.map +1 -1
- package/dist/cron/collection.js +62 -15
- package/dist/cron/collection.js.map +1 -1
- package/dist/cron/feed.d.ts +49 -0
- package/dist/cron/feed.d.ts.map +1 -0
- package/dist/cron/feed.js +170 -0
- package/dist/cron/feed.js.map +1 -0
- package/dist/cron/scan.d.ts.map +1 -1
- package/dist/cron/scan.js +24 -3
- package/dist/cron/scan.js.map +1 -1
- package/dist/db/schema.d.ts +68 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +18 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/lib/ixo/blocksync/index.d.ts +12 -2
- package/dist/lib/ixo/blocksync/index.d.ts.map +1 -1
- package/dist/lib/ixo/blocksync/index.js +17 -2
- package/dist/lib/ixo/blocksync/index.js.map +1 -1
- package/dist/lib/ixo/blocksync/queries.d.ts +2 -1
- package/dist/lib/ixo/blocksync/queries.d.ts.map +1 -1
- package/dist/lib/ixo/blocksync/queries.js +17 -1
- package/dist/lib/ixo/blocksync/queries.js.map +1 -1
- package/dist/lib/ixo/blocksync/types.d.ts +10 -0
- package/dist/lib/ixo/blocksync/types.d.ts.map +1 -1
- package/dist/lib/ixo/blocksync/types.js +5 -0
- package/dist/lib/ixo/blocksync/types.js.map +1 -1
- package/dist/lib/ixo/chain-write.d.ts.map +1 -1
- package/dist/lib/ixo/chain-write.js +5 -1
- package/dist/lib/ixo/chain-write.js.map +1 -1
- package/dist/lib/openhands/backstop.d.ts +14 -5
- package/dist/lib/openhands/backstop.d.ts.map +1 -1
- package/dist/lib/openhands/backstop.js +22 -10
- package/dist/lib/openhands/backstop.js.map +1 -1
- package/dist/routes/v1/shared.d.ts +18 -0
- package/dist/routes/v1/shared.d.ts.map +1 -1
- package/dist/workflows/claim-ingest.d.ts.map +1 -1
- package/dist/workflows/claim-ingest.js +21 -6
- package/dist/workflows/claim-ingest.js.map +1 -1
- package/docs/api.md +22 -6
- package/docs/guide.md +11 -2
- package/migrations/0027_cron_state.sql +4 -0
- package/migrations/0028_next_scan_at.sql +1 -0
- package/migrations/meta/0027_snapshot.json +3007 -0
- package/migrations/meta/0028_snapshot.json +3014 -0
- package/migrations/meta/_journal.json +14 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -782,6 +782,6 @@ symlinks are not packed). CI diffs them — change one, copy it to the other.
|
|
|
782
782
|
|
|
783
783
|
## Status
|
|
784
784
|
|
|
785
|
-
Published on npm: `@ixo/decision-oracle` 0.2.
|
|
785
|
+
Published on npm: `@ixo/decision-oracle` 0.2.19 and `@ixo/decision-oracle-client` 0.1.1.
|
|
786
786
|
|
|
787
787
|
Apache License 2.0: `LICENSE` at the repo root and in each package.
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
*/
|
|
28
28
|
import type { Database } from "../db/client.js";
|
|
29
29
|
import type { OracleEnv } from "../env.js";
|
|
30
|
-
import { type BlocksyncDeps } from "../lib/ixo/blocksync/index.js";
|
|
30
|
+
import { type BlocksyncDeps, type CollectionNode, type ScannedClaim } from "../lib/ixo/blocksync/index.js";
|
|
31
31
|
import type { Logger } from "../lib/logger.js";
|
|
32
32
|
import type { Metrics } from "../lib/metrics.js";
|
|
33
33
|
/**
|
|
@@ -54,4 +54,17 @@ export declare function processCollection(ctx: CronCtx, collection: {
|
|
|
54
54
|
}, { stamp }?: {
|
|
55
55
|
stamp?: boolean;
|
|
56
56
|
}): Promise<number>;
|
|
57
|
+
/** How long a rotation visit parks a collection (D2), by what Blocksync says about it. */
|
|
58
|
+
export declare const PARK_CLOSED_MS: number;
|
|
59
|
+
export declare const PARK_UNCLAIMED_MS = 86400000;
|
|
60
|
+
export declare const PARK_ACTIVE_MS = 3600000;
|
|
61
|
+
export declare function nextScanDelay(node: CollectionNode | null, now: Date): number;
|
|
62
|
+
/** Park (a date) or un-park (null = due) these collections — one statement. */
|
|
63
|
+
export declare function setNextScan(db: Database, collectionIds: readonly string[], at: Date | null): Promise<void>;
|
|
64
|
+
/** Drop claims that already have a ledger row — their workflow has already started (or finished). */
|
|
65
|
+
export declare function filterUnseen<T extends ScannedClaim>(db: Database, claims: T[]): Promise<T[]>;
|
|
66
|
+
/** One createBatch call for the page (idempotent — existing instance ids are skipped). */
|
|
67
|
+
export declare function startInstances(ctx: CronCtx, collectionId: string, claims: ScannedClaim[]): Promise<void>;
|
|
68
|
+
/** Forward-only, in SQL: a slower writer (a tick, the feed, a webhook) never rewinds a faster one. */
|
|
69
|
+
export declare function moveCursor(db: Database, collectionId: string, to: string): Promise<void>;
|
|
57
70
|
//# sourceMappingURL=collection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../../src/cron/collection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,
|
|
1
|
+
{"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../../src/cron/collection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,cAAc,EAGnB,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C;;;GAGG;AACH,eAAO,MAAM,UAAU,MAAM,CAAC;AAE9B,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,aAAa,CAAC;IACpB,EAAE,EAAE,QAAQ,CAAC;IACb,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,OAAO,EACZ,UAAU,EAAE;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC3D,EAAE,KAAa,EAAE,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1C,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED,0FAA0F;AAC1F,eAAO,MAAM,cAAc,QAAiB,CAAC;AAC7C,eAAO,MAAM,iBAAiB,WAAa,CAAC;AAC5C,eAAO,MAAM,cAAc,UAAY,CAAC;AAMxC,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,CAM5E;AAeD,+EAA+E;AAC/E,wBAAsB,WAAW,CAC/B,EAAE,EAAE,QAAQ,EACZ,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,EAAE,EAAE,IAAI,GAAG,IAAI,GACd,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,qGAAqG;AACrG,wBAAsB,YAAY,CAAC,CAAC,SAAS,YAAY,EACvD,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,CAAC,EAAE,GACV,OAAO,CAAC,CAAC,EAAE,CAAC,CAYd;AAED,0FAA0F;AAC1F,wBAAsB,cAAc,CAClC,GAAG,EAAE,OAAO,EACZ,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,YAAY,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAwBD,sGAAsG;AACtG,wBAAsB,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAU9F"}
|
package/dist/cron/collection.js
CHANGED
|
@@ -25,10 +25,10 @@
|
|
|
25
25
|
* Rubrics are NOT this lane's business: the workflow's facts step resolves and pins the
|
|
26
26
|
* collection's `#rub` per claim (workflows/claim-ingest.ts). The cron never reads or writes `rubricId`.
|
|
27
27
|
*/
|
|
28
|
-
import { and, eq, inArray, isNull, lt, or } from "drizzle-orm";
|
|
28
|
+
import { and, eq, inArray, isNotNull, isNull, lt, or } from "drizzle-orm";
|
|
29
29
|
import { claimIngests, watchedCollections } from "../db/schema.js";
|
|
30
30
|
import { instanceIdFor } from "../lib/ids.js";
|
|
31
|
-
import { getClaimsSince } from "../lib/ixo/blocksync/index.js";
|
|
31
|
+
import { getClaimsSince, getCollection, } from "../lib/ixo/blocksync/index.js";
|
|
32
32
|
import { toTraceparent } from "../lib/tracing.js";
|
|
33
33
|
/**
|
|
34
34
|
* Claims fetched per collection per tick — also the createBatch ceiling (100/call) AND D1's cap on
|
|
@@ -45,13 +45,19 @@ export async function processCollection(ctx, collection, { stamp = false } = {})
|
|
|
45
45
|
const { collectionId, cursor } = collection;
|
|
46
46
|
try {
|
|
47
47
|
const claims = await getClaimsSince(ctx.deps, collectionId, cursor, SCAN_LIMIT);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
48
|
+
let started = 0;
|
|
49
|
+
if (claims.length > 0) {
|
|
50
|
+
const unseen = await filterUnseen(ctx.db, claims);
|
|
51
|
+
if (unseen.length > 0)
|
|
52
|
+
await startInstances(ctx, collectionId, unseen);
|
|
53
|
+
await advanceCursor(ctx, collectionId, cursor, claims, unseen.length);
|
|
54
|
+
started = unseen.length;
|
|
55
|
+
}
|
|
56
|
+
// A full page has more behind it: stay due. Best-effort: a missed write leaves the row as it
|
|
57
|
+
// was (NULL = due), never a lost claim.
|
|
58
|
+
const next = stamp && claims.length < SCAN_LIMIT ? await parkUntil(ctx, collectionId) : null;
|
|
59
|
+
await setNextScan(ctx.db, [collectionId], next).catch((err) => ctx.logger.warn("cron.park.unwritten", { collectionId, detail: asMessage(err) }));
|
|
60
|
+
return started;
|
|
55
61
|
}
|
|
56
62
|
finally {
|
|
57
63
|
// Rotation clock: stamped on every rotation visit — found claims, found nothing, or failed — so
|
|
@@ -60,8 +66,45 @@ export async function processCollection(ctx, collection, { stamp = false } = {})
|
|
|
60
66
|
await stampScanned(ctx.db, collectionId).catch(() => { });
|
|
61
67
|
}
|
|
62
68
|
}
|
|
69
|
+
/** How long a rotation visit parks a collection (D2), by what Blocksync says about it. */
|
|
70
|
+
export const PARK_CLOSED_MS = 7 * 86_400_000;
|
|
71
|
+
export const PARK_UNCLAIMED_MS = 86_400_000;
|
|
72
|
+
export const PARK_ACTIVE_MS = 3_600_000;
|
|
73
|
+
/** An ended collection still takes claims indexed late — park it a day after its end. */
|
|
74
|
+
const END_GRACE_MS = 86_400_000;
|
|
75
|
+
const asMessage = (err) => (err instanceof Error ? err.message : String(err));
|
|
76
|
+
export function nextScanDelay(node, now) {
|
|
77
|
+
if (!node)
|
|
78
|
+
return PARK_UNCLAIMED_MS;
|
|
79
|
+
const ends = node.endDate ? Date.parse(node.endDate) : Number.NaN;
|
|
80
|
+
if ((node.state ?? 0) !== 0 || ends + END_GRACE_MS < now.getTime())
|
|
81
|
+
return PARK_CLOSED_MS;
|
|
82
|
+
if (Number(node.count ?? 0) === 0)
|
|
83
|
+
return PARK_UNCLAIMED_MS;
|
|
84
|
+
return PARK_ACTIVE_MS;
|
|
85
|
+
}
|
|
86
|
+
/** When the rotation should look again — null (due) when Blocksync cannot say. */
|
|
87
|
+
async function parkUntil(ctx, collectionId) {
|
|
88
|
+
const now = new Date();
|
|
89
|
+
try {
|
|
90
|
+
return new Date(now.getTime() + nextScanDelay(await getCollection(ctx.deps, collectionId), now));
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
ctx.logger.warn("cron.park.unread", { collectionId, detail: asMessage(err) });
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/** Park (a date) or un-park (null = due) these collections — one statement. */
|
|
98
|
+
export async function setNextScan(db, collectionIds, at) {
|
|
99
|
+
if (collectionIds.length === 0)
|
|
100
|
+
return;
|
|
101
|
+
await db
|
|
102
|
+
.update(watchedCollections)
|
|
103
|
+
.set({ nextScanAt: at })
|
|
104
|
+
.where(and(inArray(watchedCollections.collectionId, [...collectionIds]), at === null ? isNotNull(watchedCollections.nextScanAt) : undefined));
|
|
105
|
+
}
|
|
63
106
|
/** Drop claims that already have a ledger row — their workflow has already started (or finished). */
|
|
64
|
-
async function filterUnseen(db, claims) {
|
|
107
|
+
export async function filterUnseen(db, claims) {
|
|
65
108
|
const seen = await db
|
|
66
109
|
.select({ claimId: claimIngests.claimId })
|
|
67
110
|
.from(claimIngests)
|
|
@@ -70,7 +113,7 @@ async function filterUnseen(db, claims) {
|
|
|
70
113
|
return claims.filter((c) => !seenIds.has(c.claimId));
|
|
71
114
|
}
|
|
72
115
|
/** One createBatch call for the page (idempotent — existing instance ids are skipped). */
|
|
73
|
-
async function startInstances(ctx, collectionId, claims) {
|
|
116
|
+
export async function startInstances(ctx, collectionId, claims) {
|
|
74
117
|
const batch = await Promise.all(claims.map(async (c) => ({
|
|
75
118
|
id: await instanceIdFor(c.claimId),
|
|
76
119
|
// The tick's trace, so the claim's run logs under the scan that found it.
|
|
@@ -103,10 +146,7 @@ async function advanceCursor(ctx, collectionId, cursor, claims, started) {
|
|
|
103
146
|
// Newest non-NULL submissionDate (NULLs sort last in ASC and must not park the cursor).
|
|
104
147
|
const advanceTo = claims.filter((c) => c.submissionDate).at(-1)?.submissionDate ?? null;
|
|
105
148
|
if (advanceTo && advanceTo !== cursor) {
|
|
106
|
-
await ctx.db
|
|
107
|
-
.update(watchedCollections)
|
|
108
|
-
.set({ cursor: advanceTo })
|
|
109
|
-
.where(and(eq(watchedCollections.collectionId, collectionId), or(isNull(watchedCollections.cursor), lt(watchedCollections.cursor, advanceTo))));
|
|
149
|
+
await moveCursor(ctx.db, collectionId, advanceTo);
|
|
110
150
|
return;
|
|
111
151
|
}
|
|
112
152
|
// Full page, nothing new, watermark can't move: a same-timestamp tie wider than SCAN_LIMIT.
|
|
@@ -114,6 +154,13 @@ async function advanceCursor(ctx, collectionId, cursor, claims, started) {
|
|
|
114
154
|
ctx.logger.warn("cron.cursor.stuck", { collectionId, cursor, tie: claims.length });
|
|
115
155
|
}
|
|
116
156
|
}
|
|
157
|
+
/** Forward-only, in SQL: a slower writer (a tick, the feed, a webhook) never rewinds a faster one. */
|
|
158
|
+
export async function moveCursor(db, collectionId, to) {
|
|
159
|
+
await db
|
|
160
|
+
.update(watchedCollections)
|
|
161
|
+
.set({ cursor: to })
|
|
162
|
+
.where(and(eq(watchedCollections.collectionId, collectionId), or(isNull(watchedCollections.cursor), lt(watchedCollections.cursor, to))));
|
|
163
|
+
}
|
|
117
164
|
/** Stamp the rotation clock (see schema `lastScannedAt`). */
|
|
118
165
|
async function stampScanned(db, collectionId) {
|
|
119
166
|
await db
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection.js","sourceRoot":"","sources":["../../src/cron/collection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"collection.js","sourceRoot":"","sources":["../../src/cron/collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The global claims feed (oracle speed plan D4): ONE Blocksync read per minute for every claim on
|
|
3
|
+
* the chain since the last one, matched to this oracle's active watched collections in D1 —
|
|
4
|
+
* discovery cost grows with new claims, not with watched collections (the rotation in scan.ts is
|
|
5
|
+
* one read per collection per visit).
|
|
6
|
+
*
|
|
7
|
+
* read position → page the feed (≤ FEED_PAGES_PER_TICK) → keep watched claims → filterUnseen →
|
|
8
|
+
* startInstances → move the position (and the collections' own cursors)
|
|
9
|
+
*
|
|
10
|
+
* The same rules as the per-collection lane (collection.ts), on a chain-wide window:
|
|
11
|
+
* - A 2-minute OVERLAP: Blocksync writes each block in one ordered transaction, but a claim
|
|
12
|
+
* indexed a moment after the read that passed its timestamp is re-read on the next tick;
|
|
13
|
+
* `filterUnseen` + idempotent instance ids make re-reading free.
|
|
14
|
+
* - The position moves only AFTER the page's instances started, so a failure re-reads the page.
|
|
15
|
+
* - A tick that stops at its page cap keeps Blocksync's keyset cursor (`after`), so the next tick
|
|
16
|
+
* continues mid-window instead of re-reading the overlap of a burst.
|
|
17
|
+
* - First run: the position starts at now − overlap. No backfill — a collection's own first sweep
|
|
18
|
+
* (cursor NULL, processCollection) reads its history.
|
|
19
|
+
*
|
|
20
|
+
* The daily replay (`runClaimsReplay`, the hour tier) is the reconcile for a claim indexed later
|
|
21
|
+
* than the overlap: it re-reads the feed 24 h behind, one hourly slice at a time, so every claim is
|
|
22
|
+
* read a second time a day after it was submitted.
|
|
23
|
+
*
|
|
24
|
+
* Per-collection cursors stay consistent: the feed moves a collection's cursor (forward-only) only
|
|
25
|
+
* when that cursor already lies inside the window the feed has read — so everything between it and
|
|
26
|
+
* the new value was seen. A NULL cursor is never moved: the first sweep still owns that history.
|
|
27
|
+
*/
|
|
28
|
+
import type { Database } from "../db/client.js";
|
|
29
|
+
import { type CronCtx } from "./collection.js";
|
|
30
|
+
export declare const FEED_STATE = "claims-feed";
|
|
31
|
+
export declare const REPLAY_STATE = "claims-feed-replay";
|
|
32
|
+
export declare const FEED_OVERLAP_MS: number;
|
|
33
|
+
export declare const REPLAY_LAG_MS: number;
|
|
34
|
+
export declare const FEED_PAGES_PER_TICK = 10;
|
|
35
|
+
export declare const REPLAY_PAGES_PER_TICK = 50;
|
|
36
|
+
/** `at`: the last submissionDate fully started. `after`: the keyset cursor of a capped pass. */
|
|
37
|
+
export interface FeedPosition {
|
|
38
|
+
at: string;
|
|
39
|
+
after?: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function readPosition(db: Database, name: string): Promise<FeedPosition | null>;
|
|
42
|
+
/** The minute job. Returns the number of instances started. */
|
|
43
|
+
export declare function runClaimsFeed(ctx: CronCtx, now?: Date): Promise<number>;
|
|
44
|
+
/**
|
|
45
|
+
* The replay (hour tier): the slice of the feed between its last end and now − 24 h, so each
|
|
46
|
+
* claim is read once more a day later. It never reaches before the feed's own first run.
|
|
47
|
+
*/
|
|
48
|
+
export declare function runClaimsReplay(ctx: CronCtx, now?: Date): Promise<number>;
|
|
49
|
+
//# sourceMappingURL=feed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../src/cron/feed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAG7C,OAAO,EACL,KAAK,OAAO,EAMb,MAAM,cAAc,CAAC;AAEtB,eAAO,MAAM,UAAU,gBAAgB,CAAC;AACxC,eAAO,MAAM,YAAY,uBAAuB,CAAC;AACjD,eAAO,MAAM,eAAe,QAAa,CAAC;AAC1C,eAAO,MAAM,aAAa,QAAmB,CAAC;AAC9C,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAMxC,gGAAgG;AAChG,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,wBAAsB,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAK3F;AAoBD,+DAA+D;AAC/D,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,OAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBnF;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,OAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAYrF"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The global claims feed (oracle speed plan D4): ONE Blocksync read per minute for every claim on
|
|
3
|
+
* the chain since the last one, matched to this oracle's active watched collections in D1 —
|
|
4
|
+
* discovery cost grows with new claims, not with watched collections (the rotation in scan.ts is
|
|
5
|
+
* one read per collection per visit).
|
|
6
|
+
*
|
|
7
|
+
* read position → page the feed (≤ FEED_PAGES_PER_TICK) → keep watched claims → filterUnseen →
|
|
8
|
+
* startInstances → move the position (and the collections' own cursors)
|
|
9
|
+
*
|
|
10
|
+
* The same rules as the per-collection lane (collection.ts), on a chain-wide window:
|
|
11
|
+
* - A 2-minute OVERLAP: Blocksync writes each block in one ordered transaction, but a claim
|
|
12
|
+
* indexed a moment after the read that passed its timestamp is re-read on the next tick;
|
|
13
|
+
* `filterUnseen` + idempotent instance ids make re-reading free.
|
|
14
|
+
* - The position moves only AFTER the page's instances started, so a failure re-reads the page.
|
|
15
|
+
* - A tick that stops at its page cap keeps Blocksync's keyset cursor (`after`), so the next tick
|
|
16
|
+
* continues mid-window instead of re-reading the overlap of a burst.
|
|
17
|
+
* - First run: the position starts at now − overlap. No backfill — a collection's own first sweep
|
|
18
|
+
* (cursor NULL, processCollection) reads its history.
|
|
19
|
+
*
|
|
20
|
+
* The daily replay (`runClaimsReplay`, the hour tier) is the reconcile for a claim indexed later
|
|
21
|
+
* than the overlap: it re-reads the feed 24 h behind, one hourly slice at a time, so every claim is
|
|
22
|
+
* read a second time a day after it was submitted.
|
|
23
|
+
*
|
|
24
|
+
* Per-collection cursors stay consistent: the feed moves a collection's cursor (forward-only) only
|
|
25
|
+
* when that cursor already lies inside the window the feed has read — so everything between it and
|
|
26
|
+
* the new value was seen. A NULL cursor is never moved: the first sweep still owns that history.
|
|
27
|
+
*/
|
|
28
|
+
import { eq, inArray } from "drizzle-orm";
|
|
29
|
+
import { cronState, watchedCollections } from "../db/schema.js";
|
|
30
|
+
import { getClaimsFeedPage } from "../lib/ixo/blocksync/index.js";
|
|
31
|
+
import { filterUnseen, moveCursor, SCAN_LIMIT, setNextScan, startInstances, } from "./collection.js";
|
|
32
|
+
export const FEED_STATE = "claims-feed";
|
|
33
|
+
export const REPLAY_STATE = "claims-feed-replay";
|
|
34
|
+
export const FEED_OVERLAP_MS = 2 * 60_000;
|
|
35
|
+
export const REPLAY_LAG_MS = 24 * 60 * 60_000;
|
|
36
|
+
export const FEED_PAGES_PER_TICK = 10;
|
|
37
|
+
export const REPLAY_PAGES_PER_TICK = 50;
|
|
38
|
+
/** Collection ids per `IN (…)` — under D1's 100 bound parameters, with room for the status. */
|
|
39
|
+
const IN_CHUNK = 90;
|
|
40
|
+
/** The feed's open end: any claim the chain has, whatever a block's clock said. */
|
|
41
|
+
const FEED_HORIZON_MS = 24 * 60 * 60_000;
|
|
42
|
+
const iso = (ms) => new Date(ms).toISOString();
|
|
43
|
+
export async function readPosition(db, name) {
|
|
44
|
+
const row = await db.query.cronState.findFirst({ where: eq(cronState.name, name) });
|
|
45
|
+
if (!row)
|
|
46
|
+
return null;
|
|
47
|
+
const value = JSON.parse(row.value);
|
|
48
|
+
return typeof value.at === "string" ? value : null;
|
|
49
|
+
}
|
|
50
|
+
async function writePosition(db, name, position) {
|
|
51
|
+
const value = JSON.stringify(position);
|
|
52
|
+
await db
|
|
53
|
+
.insert(cronState)
|
|
54
|
+
.values({ name, value })
|
|
55
|
+
.onConflictDoUpdate({ target: cronState.name, set: { value } });
|
|
56
|
+
}
|
|
57
|
+
/** No active chain-lane collection ⇒ nothing to match, so no read at all. */
|
|
58
|
+
async function anyActive(db) {
|
|
59
|
+
const row = await db
|
|
60
|
+
.select({ id: watchedCollections.collectionId })
|
|
61
|
+
.from(watchedCollections)
|
|
62
|
+
.where(eq(watchedCollections.status, "active"))
|
|
63
|
+
.limit(1);
|
|
64
|
+
return row.length > 0;
|
|
65
|
+
}
|
|
66
|
+
/** The minute job. Returns the number of instances started. */
|
|
67
|
+
export async function runClaimsFeed(ctx, now = new Date()) {
|
|
68
|
+
if (!(await anyActive(ctx.db)))
|
|
69
|
+
return 0;
|
|
70
|
+
const stored = await readPosition(ctx.db, FEED_STATE);
|
|
71
|
+
if (!stored) {
|
|
72
|
+
const start = { at: iso(now.getTime() - FEED_OVERLAP_MS) };
|
|
73
|
+
await writePosition(ctx.db, REPLAY_STATE, start);
|
|
74
|
+
await writePosition(ctx.db, FEED_STATE, start);
|
|
75
|
+
ctx.logger.info("cron.feed.initialised", { at: start.at });
|
|
76
|
+
return 0;
|
|
77
|
+
}
|
|
78
|
+
const since = stored.after ? stored.at : iso(Date.parse(stored.at) - FEED_OVERLAP_MS);
|
|
79
|
+
return follow(ctx, FEED_STATE, {
|
|
80
|
+
window: { since, until: iso(now.getTime() + FEED_HORIZON_MS) },
|
|
81
|
+
after: stored.after ?? null,
|
|
82
|
+
pages: FEED_PAGES_PER_TICK,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The replay (hour tier): the slice of the feed between its last end and now − 24 h, so each
|
|
87
|
+
* claim is read once more a day later. It never reaches before the feed's own first run.
|
|
88
|
+
*/
|
|
89
|
+
export async function runClaimsReplay(ctx, now = new Date()) {
|
|
90
|
+
if (!(await anyActive(ctx.db)))
|
|
91
|
+
return 0;
|
|
92
|
+
const stored = await readPosition(ctx.db, REPLAY_STATE);
|
|
93
|
+
const until = iso(now.getTime() - REPLAY_LAG_MS);
|
|
94
|
+
if (!stored || (!stored.after && Date.parse(stored.at) >= Date.parse(until)))
|
|
95
|
+
return 0;
|
|
96
|
+
return follow(ctx, REPLAY_STATE, {
|
|
97
|
+
window: { since: stored.at, until },
|
|
98
|
+
after: stored.after ?? null,
|
|
99
|
+
pages: REPLAY_PAGES_PER_TICK,
|
|
100
|
+
// A finished slice ends at its bound, so the next one starts exactly there.
|
|
101
|
+
end: until,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
async function follow(ctx, name, pass) {
|
|
105
|
+
const { window } = pass;
|
|
106
|
+
let after = pass.after;
|
|
107
|
+
let at = null;
|
|
108
|
+
let started = 0;
|
|
109
|
+
for (let page = 0; page < pass.pages; page++) {
|
|
110
|
+
const { claims, next } = await getClaimsFeedPage(ctx.deps, window, after, SCAN_LIMIT);
|
|
111
|
+
started += await startWatched(ctx, claims, window.since);
|
|
112
|
+
at = claims.filter((c) => c.submissionDate).at(-1)?.submissionDate ?? at;
|
|
113
|
+
if (!next) {
|
|
114
|
+
const end = pass.end ?? at;
|
|
115
|
+
if (end)
|
|
116
|
+
await writePosition(ctx.db, name, { at: end });
|
|
117
|
+
return started;
|
|
118
|
+
}
|
|
119
|
+
after = next;
|
|
120
|
+
await writePosition(ctx.db, name, { at: at ?? window.since, after });
|
|
121
|
+
}
|
|
122
|
+
ctx.logger.warn("cron.feed.capped", { name, pages: pass.pages, at });
|
|
123
|
+
return started;
|
|
124
|
+
}
|
|
125
|
+
/** Start this page's claims that belong to an active watched collection. */
|
|
126
|
+
async function startWatched(ctx, claims, coveredFrom) {
|
|
127
|
+
if (claims.length === 0)
|
|
128
|
+
return 0;
|
|
129
|
+
const ids = [...new Set(claims.map((c) => c.collectionId))];
|
|
130
|
+
const cursors = new Map();
|
|
131
|
+
const watched = [];
|
|
132
|
+
for (let i = 0; i < ids.length; i += IN_CHUNK) {
|
|
133
|
+
const rows = await ctx.db
|
|
134
|
+
.select({
|
|
135
|
+
id: watchedCollections.collectionId,
|
|
136
|
+
status: watchedCollections.status,
|
|
137
|
+
cursor: watchedCollections.cursor,
|
|
138
|
+
})
|
|
139
|
+
.from(watchedCollections)
|
|
140
|
+
.where(inArray(watchedCollections.collectionId, ids.slice(i, i + IN_CHUNK)));
|
|
141
|
+
for (const row of rows) {
|
|
142
|
+
watched.push(row.id);
|
|
143
|
+
if (row.status === "active")
|
|
144
|
+
cursors.set(row.id, row.cursor);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// A hit un-parks the rotation (D2) — a paused one too, so the claims it holds back are scanned
|
|
148
|
+
// the moment it resumes, however it resumes.
|
|
149
|
+
await setNextScan(ctx.db, watched, null);
|
|
150
|
+
const mine = claims.filter((c) => cursors.has(c.collectionId));
|
|
151
|
+
if (mine.length === 0)
|
|
152
|
+
return 0;
|
|
153
|
+
const unseen = await filterUnseen(ctx.db, mine);
|
|
154
|
+
const byCollection = new Map();
|
|
155
|
+
for (const c of unseen) {
|
|
156
|
+
byCollection.set(c.collectionId, [...(byCollection.get(c.collectionId) ?? []), c]);
|
|
157
|
+
}
|
|
158
|
+
for (const [collectionId, group] of byCollection) {
|
|
159
|
+
await startInstances(ctx, collectionId, group);
|
|
160
|
+
}
|
|
161
|
+
for (const [collectionId, cursor] of cursors) {
|
|
162
|
+
if (cursor === null || Date.parse(cursor) < Date.parse(coveredFrom))
|
|
163
|
+
continue;
|
|
164
|
+
const last = mine.filter((c) => c.collectionId === collectionId && c.submissionDate).at(-1);
|
|
165
|
+
if (last?.submissionDate)
|
|
166
|
+
await moveCursor(ctx.db, collectionId, last.submissionDate);
|
|
167
|
+
}
|
|
168
|
+
return unseen.length;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=feed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feed.js","sourceRoot":"","sources":["../../src/cron/feed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAkB,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAEL,YAAY,EACZ,UAAU,EACV,UAAU,EACV,WAAW,EACX,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAG,oBAAoB,CAAC;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAG,MAAM,CAAC;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;AAC9C,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AACtC,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACxC,+FAA+F;AAC/F,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,mFAAmF;AACnF,MAAM,eAAe,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;AAQzC,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EAAY,EAAE,IAAY;IAC3D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACpF,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAiB,CAAC;IACpD,OAAO,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,EAAY,EAAE,IAAY,EAAE,QAAsB;IAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,EAAE;SACL,MAAM,CAAC,SAAS,CAAC;SACjB,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;SACvB,kBAAkB,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,6EAA6E;AAC7E,KAAK,UAAU,SAAS,CAAC,EAAY;IACnC,MAAM,GAAG,GAAG,MAAM,EAAE;SACjB,MAAM,CAAC,EAAE,EAAE,EAAE,kBAAkB,CAAC,YAAY,EAAE,CAAC;SAC/C,IAAI,CAAC,kBAAkB,CAAC;SACxB,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;SAC9C,KAAK,CAAC,CAAC,CAAC,CAAC;IACZ,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;AACxB,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAY,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE;IAChE,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,eAAe,CAAC,EAAE,CAAC;QAC3D,MAAM,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAC/C,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC;IACtF,OAAO,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE;QAC7B,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,eAAe,CAAC,EAAE;QAC9D,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI;QAC3B,KAAK,EAAE,mBAAmB;KAC3B,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAY,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE;IAClE,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACvF,OAAO,MAAM,CAAC,GAAG,EAAE,YAAY,EAAE;QAC/B,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE;QACnC,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI;QAC3B,KAAK,EAAE,qBAAqB;QAC5B,4EAA4E;QAC5E,GAAG,EAAE,KAAK;KACX,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,MAAM,CACnB,GAAY,EACZ,IAAY,EACZ,IAKC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACvB,IAAI,EAAE,GAAkB,IAAI,CAAC;IAC7B,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;QAC7C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QACtF,OAAO,IAAI,MAAM,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACzD,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,IAAI,EAAE,CAAC;QACzE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;YAC3B,IAAI,GAAG;gBAAE,MAAM,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;YACxD,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,KAAK,GAAG,IAAI,CAAC;QACb,MAAM,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IACrE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4EAA4E;AAC5E,KAAK,UAAU,YAAY,CACzB,GAAY,EACZ,MAAmB,EACnB,WAAmB;IAEnB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IACjD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE;aACtB,MAAM,CAAC;YACN,EAAE,EAAE,kBAAkB,CAAC,YAAY;YACnC,MAAM,EAAE,kBAAkB,CAAC,MAAM;YACjC,MAAM,EAAE,kBAAkB,CAAC,MAAM;SAClC,CAAC;aACD,IAAI,CAAC,kBAAkB,CAAC;aACxB,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC/E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrB,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IACD,+FAA+F;IAC/F,6CAA6C;IAC7C,MAAM,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IAC/D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAEhC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAuB,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC;IACD,KAAK,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,YAAY,EAAE,CAAC;QACjD,MAAM,cAAc,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QAC7C,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;YAAE,SAAS;QAC9E,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,YAAY,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,IAAI,IAAI,EAAE,cAAc;YAAE,MAAM,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC"}
|
package/dist/cron/scan.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/cron/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAUxC,OAAO,EAAE,KAAK,OAAO,EAAqB,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/cron/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAUxC,OAAO,EAAE,KAAK,OAAO,EAAqB,MAAM,cAAc,CAAC;AAQ/D;;;;GAIG;AACH,eAAO,MAAM,UAAU;aACrB,WAAW,EAAE,QAAQ;aACrB,aAAa,EAAE,MAAM;aACrB,WAAW,EAAE,MAAM;CACX,CAAC;AACX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAepE;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAgBnD;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB7E"}
|
package/dist/cron/scan.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* (`CRON_TIERS` below), each trigger only its own jobs.
|
|
15
15
|
*/
|
|
16
16
|
import * as Sentry from "@sentry/cloudflare";
|
|
17
|
-
import { asc, eq } from "drizzle-orm";
|
|
17
|
+
import { and, asc, eq, isNull, lte, or } from "drizzle-orm";
|
|
18
18
|
import { loadConfig } from "../config.js";
|
|
19
19
|
import { getDb } from "../db/client.js";
|
|
20
20
|
import { watchedCollections } from "../db/schema.js";
|
|
@@ -28,6 +28,7 @@ import { runApiLaneTick } from "./api-lane.js";
|
|
|
28
28
|
import { chainBacklog } from "./backlog.js";
|
|
29
29
|
import { resumeEngineCredits } from "./billing.js";
|
|
30
30
|
import { processCollection } from "./collection.js";
|
|
31
|
+
import { runClaimsFeed, runClaimsReplay } from "./feed.js";
|
|
31
32
|
import { resumeAdminFunds } from "./funding.js";
|
|
32
33
|
import { openhandsTick } from "./openhands.js";
|
|
33
34
|
/** Collections processed concurrently within a tick. */
|
|
@@ -161,6 +162,15 @@ async function minute(ctx, env) {
|
|
|
161
162
|
await openhandsTick(ctx, env, "minute");
|
|
162
163
|
// Before the scan, whose failure is the one that escapes the tick; it never throws itself.
|
|
163
164
|
await chainBacklog(ctx);
|
|
165
|
+
// The fast path (cron/feed.ts): one chain-wide read for every watched collection. Contained —
|
|
166
|
+
// the rotation below still discovers everything if the feed is down.
|
|
167
|
+
try {
|
|
168
|
+
await timeCronJob(metrics, "claims-feed", () => Sentry.withMonitor("oracle-claims-feed", () => runClaimsFeed(ctx), MONITOR));
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
logger.error("cron.feed.failed", { detail: err instanceof Error ? err.message : String(err) });
|
|
172
|
+
reportError(err, { lane: "cron", step: "claims-feed" });
|
|
173
|
+
}
|
|
164
174
|
await timeCronJob(metrics, "scan", () => Sentry.withMonitor("oracle-scan", () => scanDue(ctx, config), MONITOR));
|
|
165
175
|
}
|
|
166
176
|
async function five(ctx, env) {
|
|
@@ -183,6 +193,16 @@ async function five(ctx, env) {
|
|
|
183
193
|
async function hour(ctx, env) {
|
|
184
194
|
const { logger, metrics } = ctx;
|
|
185
195
|
const config = loadConfig(env);
|
|
196
|
+
// The feed's reconcile: re-read the slice that turned 24 h old (cron/feed.ts).
|
|
197
|
+
try {
|
|
198
|
+
await timeCronJob(metrics, "claims-replay", () => runClaimsReplay(ctx));
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
logger.error("cron.replay.failed", {
|
|
202
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
203
|
+
});
|
|
204
|
+
reportError(err, { lane: "cron", step: "claims-replay" });
|
|
205
|
+
}
|
|
186
206
|
// The chain review rooms follow their reviewer grants (lib/matrix/deliver.ts): hourly, whoever's
|
|
187
207
|
// grant expired is kicked and a failed invite retried — a revoke kicks at once already.
|
|
188
208
|
try {
|
|
@@ -206,7 +226,8 @@ async function hour(ctx, env) {
|
|
|
206
226
|
/** The discovery half of the tick — its own Sentry cron monitor, so a scan that stops pages. */
|
|
207
227
|
async function scanDue(ctx, config) {
|
|
208
228
|
const { db, logger, metrics } = ctx;
|
|
209
|
-
// Active rows only (`paused` = enqueue nothing, schema.ts),
|
|
229
|
+
// Active, due rows only (`paused` = enqueue nothing; `nextScanAt` = parked, schema.ts),
|
|
230
|
+
// least-recently-scanned first;
|
|
210
231
|
// never-scanned (NULL) at the very front — SQLite sorts NULL first in ASC, no NULLS FIRST needed.
|
|
211
232
|
const due = await db
|
|
212
233
|
.select({
|
|
@@ -214,7 +235,7 @@ async function scanDue(ctx, config) {
|
|
|
214
235
|
cursor: watchedCollections.cursor,
|
|
215
236
|
})
|
|
216
237
|
.from(watchedCollections)
|
|
217
|
-
.where(eq(watchedCollections.status, "active"))
|
|
238
|
+
.where(and(eq(watchedCollections.status, "active"), or(isNull(watchedCollections.nextScanAt), lte(watchedCollections.nextScanAt, new Date()))))
|
|
218
239
|
.orderBy(asc(watchedCollections.lastScannedAt), asc(watchedCollections.collectionId))
|
|
219
240
|
.limit(config.CRON_COLLECTIONS_PER_TICK);
|
|
220
241
|
if (due.length === 0) {
|
package/dist/cron/scan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/cron/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,MAAM,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/cron/scan.ts"],"names":[],"mappings":"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"}
|
package/dist/db/schema.d.ts
CHANGED
|
@@ -311,6 +311,23 @@ export declare const watchedCollections: import("drizzle-orm/sqlite-core").SQLit
|
|
|
311
311
|
identity: undefined;
|
|
312
312
|
generated: undefined;
|
|
313
313
|
}, {}, {}>;
|
|
314
|
+
nextScanAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
315
|
+
name: "nextScanAt";
|
|
316
|
+
tableName: "watched_collections";
|
|
317
|
+
dataType: "date";
|
|
318
|
+
columnType: "SQLiteTimestamp";
|
|
319
|
+
data: Date;
|
|
320
|
+
driverParam: number;
|
|
321
|
+
notNull: false;
|
|
322
|
+
hasDefault: false;
|
|
323
|
+
isPrimaryKey: false;
|
|
324
|
+
isAutoincrement: false;
|
|
325
|
+
hasRuntimeDefault: false;
|
|
326
|
+
enumValues: undefined;
|
|
327
|
+
baseColumn: never;
|
|
328
|
+
identity: undefined;
|
|
329
|
+
generated: undefined;
|
|
330
|
+
}, {}, {}>;
|
|
314
331
|
operatorAmounts: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
315
332
|
name: "operatorAmounts";
|
|
316
333
|
tableName: "watched_collections";
|
|
@@ -6913,4 +6930,55 @@ export declare const openhandsHires: import("drizzle-orm/sqlite-core").SQLiteTab
|
|
|
6913
6930
|
};
|
|
6914
6931
|
dialect: 'sqlite';
|
|
6915
6932
|
}>;
|
|
6933
|
+
/**
|
|
6934
|
+
* The package's own small cron state, one row per named value (cron/feed.ts): the global claims
|
|
6935
|
+
* feed's position (`claims-feed`) and the daily replay's (`claims-feed-replay`), each a JSON
|
|
6936
|
+
* `{ at, after? }` — `at` the last submissionDate fully started, `after` Blocksync's keyset cursor
|
|
6937
|
+
* when a tick stopped at its page cap mid-window. Written only after the page's instances started.
|
|
6938
|
+
*/
|
|
6939
|
+
export declare const cronState: import("drizzle-orm/sqlite-core").SQLiteTableWithColumns<{
|
|
6940
|
+
name: "cron_state";
|
|
6941
|
+
schema: undefined;
|
|
6942
|
+
columns: {
|
|
6943
|
+
name: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
6944
|
+
name: "name";
|
|
6945
|
+
tableName: "cron_state";
|
|
6946
|
+
dataType: "string";
|
|
6947
|
+
columnType: "SQLiteText";
|
|
6948
|
+
data: string;
|
|
6949
|
+
driverParam: string;
|
|
6950
|
+
notNull: true;
|
|
6951
|
+
hasDefault: false;
|
|
6952
|
+
isPrimaryKey: true;
|
|
6953
|
+
isAutoincrement: false;
|
|
6954
|
+
hasRuntimeDefault: false;
|
|
6955
|
+
enumValues: [string, ...string[]];
|
|
6956
|
+
baseColumn: never;
|
|
6957
|
+
identity: undefined;
|
|
6958
|
+
generated: undefined;
|
|
6959
|
+
}, {}, {
|
|
6960
|
+
length: undefined;
|
|
6961
|
+
}>;
|
|
6962
|
+
value: import("drizzle-orm/sqlite-core").SQLiteColumn<{
|
|
6963
|
+
name: "value";
|
|
6964
|
+
tableName: "cron_state";
|
|
6965
|
+
dataType: "string";
|
|
6966
|
+
columnType: "SQLiteText";
|
|
6967
|
+
data: string;
|
|
6968
|
+
driverParam: string;
|
|
6969
|
+
notNull: true;
|
|
6970
|
+
hasDefault: false;
|
|
6971
|
+
isPrimaryKey: false;
|
|
6972
|
+
isAutoincrement: false;
|
|
6973
|
+
hasRuntimeDefault: false;
|
|
6974
|
+
enumValues: [string, ...string[]];
|
|
6975
|
+
baseColumn: never;
|
|
6976
|
+
identity: undefined;
|
|
6977
|
+
generated: undefined;
|
|
6978
|
+
}, {}, {
|
|
6979
|
+
length: undefined;
|
|
6980
|
+
}>;
|
|
6981
|
+
};
|
|
6982
|
+
dialect: 'sqlite';
|
|
6983
|
+
}>;
|
|
6916
6984
|
//# sourceMappingURL=schema.d.ts.map
|