@genkaku/protocol 0.1.19 → 0.1.22

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/dist/bridge.d.ts CHANGED
@@ -39,6 +39,9 @@ export type BridgeOptions = {
39
39
  workers?: string[];
40
40
  settle?: boolean;
41
41
  }) => void | Promise<void>;
42
+ /** Re-run discovery. The worker set is read at startup, so the host restarts
43
+ * its half; this callback returns before that happens (the reply must land). */
44
+ onRefresh?: () => void | Promise<void>;
42
45
  /** Wallet operations the panel drives. Key material only ever leaves over
43
46
  * the panel CORS gate, and only after an explicit confirmation flag. */
44
47
  wallet?: WalletControl;
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAGpC,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACxE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAA;AAc/B,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAgB,MAAM,EAAc,MAAM,YAAY,CAAA;AAI7D,uEAAuE;AACvE,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,CAAA;KAAE,CAAC,CAAA;IACjE,GAAG,EAAE,MAAM,CAAA;IACX,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAA;CAChD,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,cAAc,CAAA;IACnB,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;IAC9B,OAAO,EAAE,MAAM,GAAG,CAAA;IAClB,yEAAyE;IACzE,MAAM,EAAE,OAAO,CAAA;IACf,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3B,wFAAwF;IACxF,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACnC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC3F,wDAAwD;IACxD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD;gFAC4E;IAC5E,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtF;6EACyE;IACzE,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB;4DACwD;IACxD,MAAM,CAAC,EAAE,CACP,OAAO,EAAE,MAAM,EAAE,KACd,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;CAClH,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B,CAAA;AAuJD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAskBlF"}
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAGpC,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACxE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAA;AAc/B,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAgB,MAAM,EAAc,MAAM,YAAY,CAAA;AAI7D,uEAAuE;AACvE,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,CAAA;KAAE,CAAC,CAAA;IACjE,GAAG,EAAE,MAAM,CAAA;IACX,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAA;CAChD,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,cAAc,CAAA;IACnB,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;IAC9B,OAAO,EAAE,MAAM,GAAG,CAAA;IAClB,yEAAyE;IACzE,MAAM,EAAE,OAAO,CAAA;IACf,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3B,wFAAwF;IACxF,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACnC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC3F,wDAAwD;IACxD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD;gFAC4E;IAC5E,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtF;qFACiF;IACjF,SAAS,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACtC;6EACyE;IACzE,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB;4DACwD;IACxD,MAAM,CAAC,EAAE,CACP,OAAO,EAAE,MAAM,EAAE,KACd,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAA;CAClH,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B,CAAA;AAsLD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAwmBlF"}
package/dist/bridge.js CHANGED
@@ -75,6 +75,36 @@ function debugLog(line) {
75
75
  // best effort
76
76
  }
77
77
  }
78
+ /** Chain writes run one at a time per bridge.
79
+ *
80
+ * A chat response is written to the client BEFORE its escrow is settled or
81
+ * refunded, so the next request can arrive while that transaction is still in
82
+ * flight. Both then ask an RPC endpoint for the account's "pending" nonce —
83
+ * and `fallback` may answer from a different endpoint than the one that
84
+ * accepted the first transaction. The second write reuses that nonce, every
85
+ * endpoint rejects it, and the user sees a 500 instead of an answer. A single
86
+ * queue removes the overlap; the retry covers the remaining window where the
87
+ * endpoint that served the nonce simply had not seen the previous receipt. */
88
+ let chainQueue = Promise.resolve();
89
+ const NONCE_RACE = /nonce|already known|known transaction|replacement transaction|underpriced/i;
90
+ function chainWrite(task) {
91
+ const run = chainQueue.then(async () => {
92
+ try {
93
+ return await task();
94
+ }
95
+ catch (error) {
96
+ const message = error instanceof Error ? error.message : String(error);
97
+ if (!NONCE_RACE.test(message))
98
+ throw error;
99
+ // The queue is what keeps writes apart; the retry only covers an RPC
100
+ // endpoint whose "pending" view had not caught up with the last receipt.
101
+ await new Promise(resolve => setTimeout(resolve, 2_000));
102
+ return await task();
103
+ }
104
+ });
105
+ chainQueue = run.then(() => undefined, () => undefined);
106
+ return run;
107
+ }
78
108
  /** Self-contained status dashboard: no external assets, polls /genkaku/status. */
79
109
  const DASHBOARD_HTML = `<!doctype html>
80
110
  <html lang="en">
@@ -154,14 +184,31 @@ export async function startOpenAiBridge(opts) {
154
184
  return offers;
155
185
  }
156
186
  async function board() {
157
- const rows = await Promise.all(opts.workers.map(async (addr) => {
158
- try {
159
- return (await offersOf(addr)).map(offer => ({ addr, offer }));
160
- }
161
- catch (error) {
162
- opts.log(`offers: ${addr} unreachable (${error instanceof Error ? error.message : String(error)})`);
163
- return [];
187
+ // One dial per PEER, not per address. The chain directory and the seed can
188
+ // both list the same worker (a LAN address plus a relay circuit), and
189
+ // dialing those in parallel makes libp2p race itself — both attempts then
190
+ // time out. Try the peer's addresses in order, direct first, and stop at
191
+ // the first board that answers.
192
+ const peers = new Map();
193
+ for (const addr of opts.workers) {
194
+ const key = peerIdOf(addr) ?? addr;
195
+ const list = peers.get(key);
196
+ if (list == null)
197
+ peers.set(key, [addr]);
198
+ else if (!list.includes(addr))
199
+ list.push(addr);
200
+ }
201
+ const rows = await Promise.all([...peers.values()].map(async (addrs) => {
202
+ const ordered = [...addrs].sort((a, b) => Number(a.includes('/p2p-circuit')) - Number(b.includes('/p2p-circuit')));
203
+ for (const addr of ordered) {
204
+ try {
205
+ return (await offersOf(addr)).map(offer => ({ addr, offer }));
206
+ }
207
+ catch (error) {
208
+ opts.log(`offers: ${addr} unreachable (${error instanceof Error ? error.message : String(error)})`);
209
+ }
164
210
  }
211
+ return [];
165
212
  }));
166
213
  return dedupeOffers(rows.flat());
167
214
  }
@@ -340,9 +387,15 @@ export async function startOpenAiBridge(opts) {
340
387
  : 1024, MAX_COMPLETION_TOKENS);
341
388
  let escrowId = '0';
342
389
  let walletC = null;
343
- if (opts.settle && picked.offer.workerWallet?.startsWith('0x')) {
390
+ // A zero quote is free by the operator's own listing. Opening an escrow of
391
+ // 0 reverts on-chain, and the worker's paywall accepts an unpriced session
392
+ // for exactly these models, so skip the chain entirely.
393
+ if (picked.offer.pricePerHour === 0n) {
394
+ opts.log(`session ${jobId}: ${picked.offer.model} is free — no escrow`);
395
+ }
396
+ else if (opts.settle && picked.offer.workerWallet?.startsWith('0x')) {
344
397
  walletC = walletClientFor(opts.env, opts.userKey());
345
- const opened = await openEscrow(publicClientFor(opts.env), walletC, opts.env, picked.offer.workerWallet, picked.offer.pricePerHour);
398
+ const opened = await chainWrite(() => openEscrow(publicClientFor(opts.env), walletC, opts.env, picked.offer.workerWallet, picked.offer.pricePerHour));
346
399
  escrowId = opened.escrowId.toString();
347
400
  }
348
401
  // Headers are written lazily, on the first byte the worker actually sends:
@@ -473,23 +526,23 @@ export async function startOpenAiBridge(opts) {
473
526
  // The commitment the money is bound to — re-derive it offline from
474
527
  // the prompt/answer to audit a settle (P4.9f commit-challenge).
475
528
  debugLog(`receipt ${jobId}: hash=${receiptHash} billed=${result.billed} tokens=${result.tokens}`);
476
- await settle({
529
+ await chainWrite(() => settle({
477
530
  node,
478
531
  // Co-sign over the same path the session used: a worker behind NAT
479
532
  // is only reachable through its relay address.
480
533
  addr: dialed.addr,
481
- walletC,
534
+ walletC: walletC,
482
535
  jobId,
483
536
  escrowId,
484
- receiptHash,
537
+ receiptHash: receiptHash,
485
538
  spend: result.billed,
486
- });
539
+ }));
487
540
  }
488
541
  else {
489
542
  // Nothing was billed (a session shorter than one started minute).
490
543
  // Return the escrow instead of leaving the user's money parked.
491
544
  try {
492
- const tx = await refundSession(walletC, opts.env, BigInt(escrowId));
545
+ const tx = await chainWrite(() => refundSession(walletC, opts.env, BigInt(escrowId)));
493
546
  debugLog(`escrow ${escrowId}: nothing billed, refunded (tx ${tx})`);
494
547
  opts.log(`escrow ${escrowId}: nothing billed, refunded (tx ${tx})`);
495
548
  }
@@ -511,7 +564,7 @@ export async function startOpenAiBridge(opts) {
511
564
  // (a non-technical user would never find the manual refund).
512
565
  if (opts.settle && walletC != null && escrowId !== '0') {
513
566
  try {
514
- const tx = await refundSession(walletC, opts.env, BigInt(escrowId));
567
+ const tx = await chainWrite(() => refundSession(walletC, opts.env, BigInt(escrowId)));
515
568
  debugLog(`escrow ${escrowId}: session failed before settle, refunded (tx ${tx})`);
516
569
  opts.log(`escrow ${escrowId}: refunded after a failed session (tx ${tx})`);
517
570
  }
@@ -595,9 +648,19 @@ export async function startOpenAiBridge(opts) {
595
648
  return;
596
649
  }
597
650
  if (body.refresh === true) {
598
- // Drop the 10s offer cache so the next status/model read re-dials
599
- // every discovered worker right now.
651
+ // Drop the 10s offer cache, then ask the host to re-read the chain
652
+ // directory and the seed. Clearing the cache alone only re-dialed
653
+ // the workers we already knew about.
600
654
  cache.clear();
655
+ transports.clear();
656
+ if (opts.onRefresh != null) {
657
+ try {
658
+ await opts.onRefresh();
659
+ }
660
+ catch (error) {
661
+ opts.log(`refresh: restart refused (${error instanceof Error ? error.message : String(error)})`);
662
+ }
663
+ }
601
664
  }
602
665
  const patch = {};
603
666
  if (body.workers !== undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../src/chain.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../src/chain.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,MAAM,CAAA;AAKjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,OAAO,EAAgB,KAAK,gBAAgB,EAAc,MAAM,eAAe,CAAA;AAE/E,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6Fb,CAAA;AAEV,6EAA6E;AAC7E,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,KAAK,MAAM,EAAE,CAAA;IACnB,MAAM,EAAE,KAAK,MAAM,EAAE,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED;iFACiF;AACjF,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,cAAc,EACnB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAe/B;AAED;;;0EAG0E;AAC1E,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiFf,CAAA;AAEV,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuCX,CAAA;AAaV;kFACkF;AAClF;gFACgF;AAChF,wBAAgB,eAAe,CAAC,GAAG,EAAE,cAAc,GAAG,YAAY,CAEjE;AAED;gFACgF;AAChF,oEAAoE;AACpE,wBAAgB,eAAe,CAC7B,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,KAAK,MAAM,EAAE,GACjB,YAAY,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAMzC;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA;AAC9D,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA;AAI9D;;6DAE6D;AAC7D,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAQpG;AAED;0EAC0E;AAC1E,wBAAgB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,KAAK,MAAM,EAAE,CAEvE;AAID,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBrH;AAED,qEAAqE;AACrE,MAAM,MAAM,cAAc,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAE1D;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,KAAK,MAAM,EAAE,GACpB,OAAO,CAAC,cAAc,CAAC,CAazB;AAED;yDACyD;AACzD,wBAAgB,aAAa,CAAC,GAAG,EAAE,KAAK,MAAM,EAAE,GAAG,KAAK,MAAM,EAAE,CAE/D;AAID;;4CAE4C;AAC5C,wBAAsB,UAAU,CAC9B,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,KAAK,MAAM,EAAE,EACrB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAmFjD;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,KAAK,MAAM,EAAE,CAAA;CAAE,GAC9F,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAcxB;AAED;;kCAEkC;AAClC,wBAAsB,YAAY,CAChC,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,cAAc,EACnB,EAAE,EAAE,KAAK,MAAM,EAAE,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAkBxB;AAED;;4DAE4D;AAC5D,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAUxB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CActG;AAID,+EAA+E;AAC/E,wBAAsB,UAAU,CAC9B,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,KAAK,MAAM,EAAE,GACpB,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,KAAK,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CAoBvF;AAED;;;yBAGyB;AACzB,wBAAsB,cAAc,CAClC,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;IAAE,YAAY,EAAE,KAAK,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,KAAK,MAAM,EAAE,CAAA;CAAE,GAC/D,OAAO,CAAC;IAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAoBtD;AAED,yEAAyE;AACzE,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAGhE,CAAA;AAED,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAG9D,CAAA;AAED,kEAAkE;AAClE,eAAO,MAAM,iBAAiB,MAAM,CAAA;AACpC,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,IAAI,CAAA;AAElC;;;;uDAIuD;AACvD,wBAAgB,SAAS,CACvB,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,QAAQ,SAAoB,EAC5B,QAAQ,SAAoB,GAC3B,MAAM,CA8BR;AAED;;;6EAG6E;AAC7E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAqClD;AAED;qEACqE;AACrE,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE/D;AAED;;iEAEiE;AACjE,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAKhF;AAED;kEACkE;AAClE,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAO1E;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAKtD;AAED,uEAAuE;AACvE,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;IAAE,YAAY,EAAE,KAAK,MAAM,EAAE,CAAC;IAAC,UAAU,EAAE,KAAK,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAChF,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAkBxB;AAED;+EAC+E;AAC/E,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAkBxB;AAED;uEACuE;AACvE,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAkBxB;AAED,uEAAuE;AACvE,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,KAAK,MAAM,EAAE,CAAA;IACrB,MAAM,EAAE,KAAK,MAAM,EAAE,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,6EAA6E;AAC7E,KAAK,MAAM,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAA;AAG3D,2EAA2E;AAC3E,KAAK,aAAa,GAAG,OAAO,CAC1B,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,EAC3D;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAClB,CAAA;AAaD;;;eAGe;AACf,wBAAsB,WAAW,CAC/B,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,KAAK,MAAM,EAAE,EACtB,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,SAAI,GACP,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAkB7B;AAED;;;+CAG+C;AAC/C,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,cAAc,EACnB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,MAAM,EAAE,CAAA;CAAO,GAC9F,OAAO,CAAC,cAAc,EAAE,CAAC,CA4E3B;AAED;;gFAEgF;AAChF,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,aAAa,EACtB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,OAAO,CAAC;IAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAuB3D;AAED,kEAAkE;AAClE,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,KAAK,MAAM,EAAE,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAEvG"}
package/dist/chain.js CHANGED
@@ -734,7 +734,11 @@ export async function readWorkerLocators(publicC, env, opts = {}) {
734
734
  const floor = opts.fromBlock ?? REGISTRY_DEPLOY_BLOCK[env];
735
735
  if (latest < floor)
736
736
  return [];
737
- const chunkSize = opts.chunkSize ?? 50000n;
737
+ // Public Base endpoints cap `eth_getLogs` between 200 (sepolia.base.org) and
738
+ // just under 50,000 blocks. 9,000 clears every one of them, so a scanned
739
+ // range is one request per chunk in the normal case instead of a bisection.
740
+ // `collectLogs` still halves a chunk that a stricter provider rejects.
741
+ const chunkSize = opts.chunkSize ?? 9000n;
738
742
  const from = floor;
739
743
  const to = latest;
740
744
  const locatedEvent = registryEvent('WorkerLocated');
@@ -801,7 +805,11 @@ export async function readWorkerDeactivations(publicC, env, opts) {
801
805
  if (CONTRACTS[env].registry === '')
802
806
  return [];
803
807
  const to = opts.toBlock ?? (await publicC.getBlockNumber());
804
- const chunkSize = opts.chunkSize ?? 50000n;
808
+ // Public Base endpoints cap `eth_getLogs` between 200 (sepolia.base.org) and
809
+ // just under 50,000 blocks. 9,000 clears every one of them, so a scanned
810
+ // range is one request per chunk in the normal case instead of a bisection.
811
+ // `collectLogs` still halves a chunk that a stricter provider rejects.
812
+ const chunkSize = opts.chunkSize ?? 9000n;
805
813
  const event = registryEvent('WorkerDeactivated');
806
814
  const out = [];
807
815
  for (let start = opts.fromBlock; start <= to; start += chunkSize) {
@@ -1 +1 @@
1
- {"version":3,"file":"llmBridge.d.ts","sourceRoot":"","sources":["../src/llmBridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"llmBridge.d.ts","sourceRoot":"","sources":["../src/llmBridge.ts"],"names":[],"mappings":"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"}
package/dist/llmBridge.js CHANGED
@@ -225,6 +225,12 @@ export function createOllamaChatSource(host = process.env.GENKAKU_OLLAMA_HOST ??
225
225
  model: req.model,
226
226
  messages: req.messages,
227
227
  stream: true,
228
+ // Thinking models (qwen3, deepseek-r1, …) spend `num_predict` on
229
+ // hidden reasoning first. The protocol has no reasoning channel yet,
230
+ // so that text never reaches the client and a short budget yields an
231
+ // EMPTY answer that looks like a dead worker. Ask for the answer
232
+ // directly; `GENKAKU_OLLAMA_THINK=1` restores the model's default.
233
+ ...(process.env.GENKAKU_OLLAMA_THINK === '1' ? {} : { think: false }),
228
234
  ...(req.tools === undefined || req.tools.length === 0 ? {} : { tools: req.tools }),
229
235
  options: {
230
236
  num_ctx: Number(process.env.GENKAKU_OLLAMA_NUM_CTX ?? 8192),
@@ -1 +1 @@
1
- {"version":3,"file":"p2pNode.d.ts","sourceRoot":"","sources":["../src/p2pNode.ts"],"names":[],"mappings":"AAcA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAClD,OAAO,EAAE,KAAK,GAAG,EAAW,MAAM,MAAM,CAAA;AAIxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAE5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAGnD,OAAO,EAAoB,KAAK,KAAK,EAAU,MAAM,YAAY,CAAA;AAajE,OAAO,KAAK,EAAgB,YAAY,EAAiB,MAAM,oBAAoB,CAAA;AAGnF,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AACzD,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExC,eAAO,MAAM,iBAAiB,2JAQpB,CAAA;AAEV,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,EAAE,WAAW,CAAA;IACxB,MAAM,EAAE,qBAAqB,CAAA;IAC7B,+DAA+D;IAC/D,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B,2EAA2E;IAC3E,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,+EAA+E;IAC/E,OAAO,EAAE,KAAK,EAAE,CAAA;IAChB,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAA;IACzC,gFAAgF;IAChF,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;kFAC8E;IAC9E,SAAS,CAAC,EAAE,GAAG,CAAA;IACf;6EACyE;IACzE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,0DAA0D;IAC1D,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7B,CAAA;AAED;0EAC0E,CAAA,MAAM,MAAM,aAAa,GAAG;IACpG,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAA;IAChB,kEAAkE;IAClE,SAAS,EAAE,KAAK,MAAM,EAAE,CAAA;IACxB,UAAU,EAAE,KAAK,MAAM,EAAE,CAAA;CAC1B,CAAA;AAkBD,+EAA+E;AAC/E,wBAAsB,cAAc,CAAC,MAAM,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAY3E;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,MAAM,EAAE,CAAA;IACzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,cAAc,EAAE,MAAM,MAAM,CAAA;IAC5B,+DAA+D;IAC/D,SAAS,EAAE,MAAM,MAAM,CAAA;IACvB,qEAAqE;IACrE,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAA;CACtC,CAAA;AAOD,wBAAsB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CA8gBjF"}
1
+ {"version":3,"file":"p2pNode.d.ts","sourceRoot":"","sources":["../src/p2pNode.ts"],"names":[],"mappings":"AAcA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AAClD,OAAO,EAAE,KAAK,GAAG,EAAW,MAAM,MAAM,CAAA;AAIxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;AAE5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAGnD,OAAO,EAAoB,KAAK,KAAK,EAAU,MAAM,YAAY,CAAA;AAajE,OAAO,KAAK,EAAgB,YAAY,EAAiB,MAAM,oBAAoB,CAAA;AAGnF,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AACzD,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExC,eAAO,MAAM,iBAAiB,2JAQpB,CAAA;AAEV,MAAM,MAAM,cAAc,GAAG;IAC3B,WAAW,EAAE,WAAW,CAAA;IACxB,MAAM,EAAE,qBAAqB,CAAA;IAC7B,+DAA+D;IAC/D,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B,2EAA2E;IAC3E,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,+EAA+E;IAC/E,OAAO,EAAE,KAAK,EAAE,CAAA;IAChB,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAA;IACzC,gFAAgF;IAChF,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB;kFAC8E;IAC9E,SAAS,CAAC,EAAE,GAAG,CAAA;IACf;6EACyE;IACzE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,0DAA0D;IAC1D,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7B,CAAA;AAED;0EAC0E,CAAA,MAAM,MAAM,aAAa,GAAG;IACpG,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAA;IAChB,kEAAkE;IAClE,SAAS,EAAE,KAAK,MAAM,EAAE,CAAA;IACxB,UAAU,EAAE,KAAK,MAAM,EAAE,CAAA;CAC1B,CAAA;AAkBD,+EAA+E;AAC/E,wBAAsB,cAAc,CAAC,MAAM,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAY3E;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,MAAM,EAAE,CAAA;IACzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,cAAc,EAAE,MAAM,MAAM,CAAA;IAC5B,+DAA+D;IAC/D,SAAS,EAAE,MAAM,MAAM,CAAA;IACvB,qEAAqE;IACrE,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAA;CACtC,CAAA;AAOD,wBAAsB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CA+gBjF"}
package/dist/p2pNode.js CHANGED
@@ -167,6 +167,7 @@ export async function createSidecar(opts) {
167
167
  jobId: env.jobId,
168
168
  escrowId: env.escrowId || '0',
169
169
  clientPeer: env.clientPeer ?? '',
170
+ model: env.model,
170
171
  }).catch(() => ({ ok: false, code: 'paywall-error', reason: 'paywall check failed' }));
171
172
  if (!verdict.ok) {
172
173
  opts.sessionEvents?.({
package/dist/paywall.d.ts CHANGED
@@ -4,6 +4,8 @@ export type PaywallRequest = {
4
4
  jobId: string;
5
5
  escrowId: string;
6
6
  clientPeer: string;
7
+ /** the model in the OPEN envelope; decides whether "unpriced" is free */
8
+ model: string;
7
9
  };
8
10
  export type PaywallVerdict = {
9
11
  ok: true; /** the escrow's payer — receipts must be signed by this wallet */
@@ -21,6 +23,10 @@ export type PaywallOptions = {
21
23
  worker: `0x${string}`;
22
24
  /** dev escape hatch: allow `escrowId: "0"` (unpriced) sessions */
23
25
  allowUnpriced?: boolean;
26
+ /** the operator's current quote per model (micro-USDC/hour). An unpriced
27
+ * session is authorized only for a model quoted at exactly zero — a priced
28
+ * model must still present real escrow, so naming "0" cannot skip payment. */
29
+ prices?: (model: string) => bigint | undefined;
24
30
  now?: () => number;
25
31
  log?: {
26
32
  warn: (msg: string, ...args: unknown[]) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"paywall.d.ts","sourceRoot":"","sources":["../src/paywall.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC,CAAC,kEAAkE;IAAC,KAAK,EAAE,KAAK,MAAM,EAAE,CAAA;CAAE,GACrG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAE/C,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,cAAc,CAAC,CAAA;AAK1E,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,aAAa,CAAA;IACtB,GAAG,EAAE,cAAc,CAAA;IACnB,iDAAiD;IACjD,MAAM,EAAE,KAAK,MAAM,EAAE,CAAA;IACrB,kEAAkE;IAClE,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE,CAAA;CAC1D,CAAA;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CA4C3D"}
1
+ {"version":3,"file":"paywall.d.ts","sourceRoot":"","sources":["../src/paywall.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAqB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,yEAAyE;IACzE,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC,CAAC,kEAAkE;IAAC,KAAK,EAAE,KAAK,MAAM,EAAE,CAAA;CAAE,GACrG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAE/C,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,cAAc,CAAC,CAAA;AAK1E,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,aAAa,CAAA;IACtB,GAAG,EAAE,cAAc,CAAA;IACnB,iDAAiD;IACjD,MAAM,EAAE,KAAK,MAAM,EAAE,CAAA;IACrB,kEAAkE;IAClE,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB;;mFAE+E;IAC/E,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;IAC9C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE,CAAA;CAC1D,CAAA;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAgD3D"}
package/dist/paywall.js CHANGED
@@ -28,9 +28,12 @@ export function createPaywall(opts) {
28
28
  return async (request) => {
29
29
  const raw = (request.escrowId ?? '').trim();
30
30
  if (raw === '' || raw === '0') {
31
- // Unpriced sessions have no payer to certify; the dev escape hatch keeps
32
- // them working for an explicit opt-out only.
33
- return opts.allowUnpriced === true
31
+ // Unpriced sessions have no payer to certify. Two ways in: the operator
32
+ // disabled the paywall outright (dev), or this model's own quote is 0 —
33
+ // a free listing cannot open a 0-value escrow because the contract
34
+ // reverts, so free has to mean "no escrow".
35
+ const price = request.model === '' ? undefined : opts.prices?.(request.model);
36
+ return opts.allowUnpriced === true || price === 0n
34
37
  ? { ok: true, payer: ZERO }
35
38
  : { ok: false, code: 'payment-required', reason: 'unpriced session rejected: open an escrow first' };
36
39
  }
package/dist/rpc.d.ts CHANGED
@@ -1,7 +1,12 @@
1
1
  import { type Transport } from 'viem';
2
2
  import type { NetEnvironment } from './netconfig.ts';
3
- /** Public endpoints, measured reachable 2026-11. Order is a last-resort tie
4
- * break only — the probe reorders per machine, and `fallback` handles failures. */
3
+ /** Public endpoints, measured reachable 2026-11. Order matters twice: it is the
4
+ * order `fallback` walks within one request, and the directory scan walks logs
5
+ * across every one of them. `sepolia.base.org` is last because it rejects any
6
+ * `eth_getLogs` range wider than 200 blocks — putting it first made every scan
7
+ * chunk a bisection storm. Blast API was removed: it now answers 403 for every
8
+ * method, and because `fallback` reports the LAST transport's error, a dead
9
+ * endpoint at the end masked the real failure of the four healthy ones. */
5
10
  export declare const PUBLIC_RPC_ENDPOINTS: Record<NetEnvironment, readonly string[]>;
6
11
  /** Explicit override, then last-good endpoint, then the rest.
7
12
  * `GENKAKU_RPC_URL` is kept FIRST and not removed: if the operator's endpoint
package/dist/rpc.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,MAAM,CAAA;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD;oFACoF;AACpF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAe1E,CAAA;AAyCD;;wEAEwE;AACxE,wBAAgB,OAAO,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,EAAE,CAgBrD;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,SAAS,CAO3D;AAED;gEACgE;AAChE,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,cAAc,EACnB,GAAG,CAAC,EAAE;IAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;CAAE,GACzG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA0CxB;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CASnG"}
1
+ {"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../src/rpc.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,MAAM,CAAA;AAGrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEpD;;;;;;4EAM4E;AAC5E,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAe1E,CAAA;AA2CD;;wEAEwE;AACxE,wBAAgB,OAAO,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,EAAE,CA0BrD;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,SAAS,CAO3D;AAED;gEACgE;AAChE,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,cAAc,EACnB,GAAG,CAAC,EAAE;IAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;CAAE,GACzG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiFxB;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CASnG"}
package/dist/rpc.js CHANGED
@@ -15,15 +15,21 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
15
15
  import { homedir } from 'node:os';
16
16
  import { join } from 'node:path';
17
17
  import { fallback, http } from 'viem';
18
- /** Public endpoints, measured reachable 2026-11. Order is a last-resort tie
19
- * break only — the probe reorders per machine, and `fallback` handles failures. */
18
+ import { CONTRACTS } from "./netconfig.js";
19
+ /** Public endpoints, measured reachable 2026-11. Order matters twice: it is the
20
+ * order `fallback` walks within one request, and the directory scan walks logs
21
+ * across every one of them. `sepolia.base.org` is last because it rejects any
22
+ * `eth_getLogs` range wider than 200 blocks — putting it first made every scan
23
+ * chunk a bisection storm. Blast API was removed: it now answers 403 for every
24
+ * method, and because `fallback` reports the LAST transport's error, a dead
25
+ * endpoint at the end masked the real failure of the four healthy ones. */
20
26
  export const PUBLIC_RPC_ENDPOINTS = {
21
27
  'base-sepolia': [
22
- 'https://sepolia.base.org',
23
28
  'https://base-sepolia-rpc.publicnode.com',
24
- 'https://base-sepolia.drpc.org',
25
29
  'https://base-sepolia.gateway.tenderly.co',
26
- 'https://base-sepolia.public.blastapi.io',
30
+ 'https://base-sepolia.drpc.org',
31
+ 'https://base-sepolia.api.onfinality.io/public',
32
+ 'https://sepolia.base.org',
27
33
  ],
28
34
  base: [
29
35
  'https://mainnet.base.org',
@@ -70,12 +76,19 @@ export function rpcUrls(env) {
70
76
  .split(',')
71
77
  .map(s => s.trim())
72
78
  .filter(s => s.startsWith('http'));
73
- const preferred = readCache().preferred?.[env];
79
+ const cache = readCache();
80
+ const preferred = cache.preferred?.[env];
81
+ const logsOk = cache.logsOk?.[env];
82
+ // A cached preference from an older build can name an endpoint that cannot
83
+ // serve the directory scan. Treat "not logs-capable" as a demotion, not a
84
+ // removal: it stays as the last resort for plain calls.
85
+ const preferredLeads = preferred != null && (logsOk == null || logsOk.includes(preferred));
74
86
  const publicList = PUBLIC_RPC_ENDPOINTS[env];
75
87
  const ordered = [
76
88
  ...override,
77
- ...(preferred != null ? [preferred] : []),
78
- ...publicList,
89
+ ...(preferredLeads ? [preferred] : []),
90
+ ...publicList.filter(url => url !== preferred),
91
+ ...(preferred != null && !preferredLeads ? [preferred] : []),
79
92
  ];
80
93
  return [...new Set(ordered)];
81
94
  }
@@ -104,7 +117,38 @@ export async function probeRpc(env, log) {
104
117
  const body = await response.json();
105
118
  if (typeof body.result !== 'string')
106
119
  return null;
107
- return { url, ms: Date.now() - started, block: body.result };
120
+ // Faithful latency is not enough: a preferred endpoint that cannot serve
121
+ // `eth_getLogs` over the scanner's chunk would force every directory sync
122
+ // to bisect. The probe therefore asks for a real 5,000-block window — the
123
+ // 200-block endpoints (sepolia.base.org) fail it here instead of during a
124
+ // chat. The window may be empty; only the answer's shape matters.
125
+ // Filter by the registry address: an unfiltered window returns every log
126
+ // on the chain and the heavy endpoints reject it as too large, which
127
+ // would disqualify all of them for the wrong reason.
128
+ const registry = CONTRACTS[env].registry;
129
+ const latest = BigInt(body.result);
130
+ const from = latest > 2000n ? latest - 2000n : 0n;
131
+ const logs = registry === '' ? true : await fetch(url, {
132
+ method: 'POST',
133
+ headers: { 'content-type': 'application/json' },
134
+ body: JSON.stringify({
135
+ jsonrpc: '2.0',
136
+ id: 1,
137
+ method: 'eth_getLogs',
138
+ params: [{
139
+ address: registry,
140
+ fromBlock: `0x${from.toString(16)}`,
141
+ toBlock: body.result,
142
+ }],
143
+ }),
144
+ signal: AbortSignal.timeout(PROBE_TIMEOUT_MS),
145
+ }).then(async (r) => {
146
+ if (!r.ok)
147
+ return false;
148
+ const j = await r.json();
149
+ return Array.isArray(j.result);
150
+ }).catch(() => false);
151
+ return { url, ms: Date.now() - started, block: body.result, logs };
108
152
  }
109
153
  catch {
110
154
  return null;
@@ -115,7 +159,7 @@ export async function probeRpc(env, log) {
115
159
  log?.warn('rpc: no endpoint answered a probe; requests will still try all of them');
116
160
  return null;
117
161
  }
118
- healthy.sort((a, b) => a.ms - b.ms);
162
+ healthy.sort((a, b) => Number(b.logs) - Number(a.logs) || a.ms - b.ms);
119
163
  const best = healthy[0];
120
164
  if (best == null)
121
165
  return null;
@@ -125,8 +169,12 @@ export async function probeRpc(env, log) {
125
169
  ...cache.latency,
126
170
  [env]: Object.fromEntries(healthy.map(h => [h.url, h.ms])),
127
171
  };
172
+ cache.logsOk = {
173
+ ...cache.logsOk,
174
+ [env]: healthy.filter(h => h.logs).map(h => h.url),
175
+ };
128
176
  writeCache(cache);
129
- log?.info('rpc: %s (%dms, block %s) — %d/%d endpoints healthy', best.url, best.ms, BigInt(best.block).toString(), healthy.length, urls.length);
177
+ log?.info('rpc: %s (%dms, block %s) — %d/%d endpoints healthy, %d serve logs', best.url, best.ms, BigInt(best.block).toString(), healthy.length, urls.length, healthy.filter(h => h.logs).length);
130
178
  return best.url;
131
179
  }
132
180
  /** Human-readable network state for the dashboard (no input field anywhere). */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@genkaku/protocol",
3
- "version": "0.1.19",
3
+ "version": "0.1.22",
4
4
  "description": "GenKaKu protocol core: on-chain worker directory, USDC escrow billing, libp2p transport, Ollama lifecycle",
5
5
  "license": "MIT",
6
6
  "type": "module",