@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.
Files changed (48) hide show
  1. package/README.md +1 -1
  2. package/dist/cron/collection.d.ts +14 -1
  3. package/dist/cron/collection.d.ts.map +1 -1
  4. package/dist/cron/collection.js +62 -15
  5. package/dist/cron/collection.js.map +1 -1
  6. package/dist/cron/feed.d.ts +49 -0
  7. package/dist/cron/feed.d.ts.map +1 -0
  8. package/dist/cron/feed.js +170 -0
  9. package/dist/cron/feed.js.map +1 -0
  10. package/dist/cron/scan.d.ts.map +1 -1
  11. package/dist/cron/scan.js +24 -3
  12. package/dist/cron/scan.js.map +1 -1
  13. package/dist/db/schema.d.ts +68 -0
  14. package/dist/db/schema.d.ts.map +1 -1
  15. package/dist/db/schema.js +18 -0
  16. package/dist/db/schema.js.map +1 -1
  17. package/dist/lib/ixo/blocksync/index.d.ts +12 -2
  18. package/dist/lib/ixo/blocksync/index.d.ts.map +1 -1
  19. package/dist/lib/ixo/blocksync/index.js +17 -2
  20. package/dist/lib/ixo/blocksync/index.js.map +1 -1
  21. package/dist/lib/ixo/blocksync/queries.d.ts +2 -1
  22. package/dist/lib/ixo/blocksync/queries.d.ts.map +1 -1
  23. package/dist/lib/ixo/blocksync/queries.js +17 -1
  24. package/dist/lib/ixo/blocksync/queries.js.map +1 -1
  25. package/dist/lib/ixo/blocksync/types.d.ts +10 -0
  26. package/dist/lib/ixo/blocksync/types.d.ts.map +1 -1
  27. package/dist/lib/ixo/blocksync/types.js +5 -0
  28. package/dist/lib/ixo/blocksync/types.js.map +1 -1
  29. package/dist/lib/ixo/chain-write.d.ts.map +1 -1
  30. package/dist/lib/ixo/chain-write.js +5 -1
  31. package/dist/lib/ixo/chain-write.js.map +1 -1
  32. package/dist/lib/openhands/backstop.d.ts +14 -5
  33. package/dist/lib/openhands/backstop.d.ts.map +1 -1
  34. package/dist/lib/openhands/backstop.js +22 -10
  35. package/dist/lib/openhands/backstop.js.map +1 -1
  36. package/dist/routes/v1/shared.d.ts +18 -0
  37. package/dist/routes/v1/shared.d.ts.map +1 -1
  38. package/dist/workflows/claim-ingest.d.ts.map +1 -1
  39. package/dist/workflows/claim-ingest.js +21 -6
  40. package/dist/workflows/claim-ingest.js.map +1 -1
  41. package/docs/api.md +22 -6
  42. package/docs/guide.md +11 -2
  43. package/migrations/0027_cron_state.sql +4 -0
  44. package/migrations/0028_next_scan_at.sql +1 -0
  45. package/migrations/meta/0027_snapshot.json +3007 -0
  46. package/migrations/meta/0028_snapshot.json +3014 -0
  47. package/migrations/meta/_journal.json +14 -0
  48. 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.17 and `@ixo/decision-oracle-client` 0.1.1.
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,EAAE,KAAK,aAAa,EAAqC,MAAM,sBAAsB,CAAC;AAC7F,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,CAgBjB"}
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"}
@@ -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
- if (claims.length === 0)
49
- return 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
- return unseen.length;
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":"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"}
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":"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"}
@@ -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;AAO/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"}
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), least-recently-scanned first;
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) {
@@ -1 +1 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/cron/scan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/cron/scan.ts"],"names":[],"mappings":"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"}
@@ -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