@genkaku/protocol 0.1.12 → 0.1.14

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
@@ -32,6 +32,12 @@ export type BridgeOptions = {
32
32
  status?: (base: BridgeStatus) => Record<string, unknown> | Promise<Record<string, unknown>>;
33
33
  /** optional live mode switch from POST /genkaku/mode */
34
34
  onMode?: (mode: RoleMode) => void | Promise<void>;
35
+ /** Persist the panel's settings edits (workers / payments) into the plugin's
36
+ * settings document. The runtime applies them by restarting the bridge. */
37
+ onSettings?: (patch: {
38
+ workers?: string[];
39
+ settle?: boolean;
40
+ }) => void | Promise<void>;
35
41
  /** P4.9h: derived credit per worker wallet (escrow events, not self-report).
36
42
  * Absent = offers keep whatever the worker claimed. */
37
43
  credit?: (wallets: string[]) => Map<string, {
@@ -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;AACpC,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;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,CA6flF"}
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACpC,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;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,CAkjBlF"}
package/dist/bridge.js CHANGED
@@ -564,6 +564,53 @@ export async function startOpenAiBridge(opts) {
564
564
  json(res, 200, { ok: true });
565
565
  return;
566
566
  }
567
+ if (req.method === 'POST' && (path === '/genkaku/settings' || path === '/genkaku/settings/')) {
568
+ let body;
569
+ try {
570
+ body = await readJson(req);
571
+ }
572
+ catch {
573
+ failure(res, 400, 'invalid JSON body');
574
+ return;
575
+ }
576
+ if (body.refresh === true) {
577
+ // Drop the 10s offer cache so the next status/model read re-dials
578
+ // every discovered worker right now.
579
+ cache.clear();
580
+ }
581
+ const patch = {};
582
+ if (body.workers !== undefined) {
583
+ if (!Array.isArray(body.workers)) {
584
+ failure(res, 400, 'workers must be an array of multiaddrs');
585
+ return;
586
+ }
587
+ const workers = body.workers
588
+ .filter((w) => typeof w === 'string')
589
+ .map(w => w.trim())
590
+ .filter(w => w.startsWith('/'));
591
+ if (workers.length !== body.workers.length || workers.length > 16 || workers.some(w => w.length > 512)) {
592
+ failure(res, 400, 'each worker must be a multiaddr (max 16)');
593
+ return;
594
+ }
595
+ patch.workers = workers;
596
+ }
597
+ if (body.settle !== undefined) {
598
+ if (typeof body.settle !== 'boolean') {
599
+ failure(res, 400, 'settle must be a boolean');
600
+ return;
601
+ }
602
+ patch.settle = body.settle;
603
+ }
604
+ if (Object.keys(patch).length > 0) {
605
+ if (opts.onSettings == null) {
606
+ failure(res, 501, 'settings are not writable in this profile');
607
+ return;
608
+ }
609
+ await opts.onSettings(patch);
610
+ }
611
+ json(res, 200, { ok: true, applied: Object.keys(patch), refreshed: body.refresh === true });
612
+ return;
613
+ }
567
614
  if (req.method === 'GET' && (path === '/genkaku/status' || path === '/genkaku/status/')) {
568
615
  await status(res);
569
616
  return;
package/dist/dial.d.ts CHANGED
@@ -5,6 +5,15 @@ import type { OpenEnvelope } from './workerSession.ts';
5
5
  /** Direct dials before a worker's address is considered unreachable and the
6
6
  * seed-VM relay path is preferred for subsequent sessions. */
7
7
  export declare const DIRECT_ATTEMPTS_BEFORE_RELAY = 3;
8
+ /** A circuit-relayed connection carries a relay-imposed byte/duration limit, so
9
+ * libp2p marks it "limited" and refuses new streams unless the caller opts in.
10
+ * Every GenKaKu protocol is application data and must opt in; on a direct
11
+ * connection the flag is ignored.
12
+ *
13
+ * The timeout is per call — sharing one AbortSignal would abort every dial made
14
+ * after the module's first five seconds. An unreachable peer must not stall a
15
+ * marketplace listing behind a TCP timeout. */
16
+ export declare const DIAL_TIMEOUT_MS = 5000;
8
17
  export type DialRoute = 'direct' | 'relay';
9
18
  /** Build `/p2p-circuit` addresses for `peerId` from the relays the seed handed
10
19
  * out. The relay hop keeps its own `/p2p/<id>`; ours is appended last. */
@@ -1 +1 @@
1
- {"version":3,"file":"dial.d.ts","sourceRoot":"","sources":["../src/dial.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dial.d.ts","sourceRoot":"","sources":["../src/dial.ts"],"names":[],"mappings":"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"}
package/dist/dial.js CHANGED
@@ -22,8 +22,15 @@ const directFailures = new Map();
22
22
  /** A circuit-relayed connection carries a relay-imposed byte/duration limit, so
23
23
  * libp2p marks it "limited" and refuses new streams unless the caller opts in.
24
24
  * Every GenKaKu protocol is application data and must opt in; on a direct
25
- * connection the flag is ignored. */
26
- const RELAY_STREAM = { runOnLimitedConnection: true };
25
+ * connection the flag is ignored.
26
+ *
27
+ * The timeout is per call — sharing one AbortSignal would abort every dial made
28
+ * after the module's first five seconds. An unreachable peer must not stall a
29
+ * marketplace listing behind a TCP timeout. */
30
+ export const DIAL_TIMEOUT_MS = 5_000;
31
+ function streamOpts(timeoutMs = DIAL_TIMEOUT_MS) {
32
+ return { signal: AbortSignal.timeout(timeoutMs), runOnLimitedConnection: true };
33
+ }
27
34
  /** Build `/p2p-circuit` addresses for `peerId` from the relays the seed handed
28
35
  * out. The relay hop keeps its own `/p2p/<id>`; ours is appended last. */
29
36
  export function circuitAddrsFor(relays, peerId) {
@@ -121,7 +128,7 @@ export async function dialWorker(node, addr) {
121
128
  }
122
129
  return {
123
130
  async open(env) {
124
- openStream = await node.dialProtocol(ma, '/genkaku/open/0', RELAY_STREAM);
131
+ openStream = await node.dialProtocol(ma, '/genkaku/open/0', streamOpts());
125
132
  // errors surface via the read side
126
133
  openSinkDone = openStream.sink(oq.source()).catch(() => { });
127
134
  oq.push(lpEncode(env));
@@ -155,7 +162,7 @@ export async function dialWorker(node, addr) {
155
162
  onError(cb) { errCbs.add(cb); },
156
163
  async sendReceipt(jobId, seq, amount, sig = '', inputHash = ZERO_HASH, outputHash = ZERO_HASH) {
157
164
  if (!receiptStream) {
158
- receiptStream = await node.dialProtocol(ma, '/genkaku/receipt/0', RELAY_STREAM);
165
+ receiptStream = await node.dialProtocol(ma, '/genkaku/receipt/0', streamOpts());
159
166
  receiptSinkDone = receiptStream.sink(rq.source()).catch(() => { });
160
167
  }
161
168
  rq.push(lpEncode({
@@ -183,7 +190,7 @@ export async function dialWorker(node, addr) {
183
190
  export async function helloWorker(node, addr) {
184
191
  const expectedPeer = peerIdOf(addr);
185
192
  const nonce = newNonce();
186
- const stream = await node.dialProtocol(multiaddr(addr), '/genkaku/hello/0', RELAY_STREAM);
193
+ const stream = await node.dialProtocol(multiaddr(addr), '/genkaku/hello/0', streamOpts());
187
194
  let reply;
188
195
  try {
189
196
  stream.sink([lpEncode({ proto: 'hello/0', nonce })]).catch(() => { });
@@ -308,7 +315,7 @@ export async function fetchOffers(node, addr) {
308
315
  });
309
316
  }
310
317
  async function fetchOfferBoard(node, addr) {
311
- const s = await node.dialProtocol(multiaddr(addr), '/genkaku/offers/0', RELAY_STREAM);
318
+ const s = await node.dialProtocol(multiaddr(addr), '/genkaku/offers/0', streamOpts());
312
319
  const reader = new FrameReader();
313
320
  let board = [];
314
321
  for await (const chunk of s.source) {
@@ -335,7 +342,7 @@ export async function fetchSeedPeers(node, addr) {
335
342
  // takes the native path.
336
343
  if (addr.startsWith('http://') || addr.startsWith('https://')) {
337
344
  try {
338
- const res = await fetch(`${addr.replace(/\/$/, '')}/peers`);
345
+ const res = await fetch(`${addr.replace(/\/$/, '')}/peers`, { signal: AbortSignal.timeout(DIAL_TIMEOUT_MS) });
339
346
  if (!res.ok)
340
347
  return [];
341
348
  const body = (await res.json());
@@ -347,7 +354,7 @@ export async function fetchSeedPeers(node, addr) {
347
354
  return [];
348
355
  }
349
356
  }
350
- const s = await node.dialProtocol(multiaddr(addr), '/genkaku/peers/0', RELAY_STREAM);
357
+ const s = await node.dialProtocol(multiaddr(addr), '/genkaku/peers/0', streamOpts());
351
358
  const reader = new FrameReader();
352
359
  for await (const chunk of s.source) {
353
360
  reader.push(chunk);
@@ -366,7 +373,7 @@ export async function fetchSeedPeers(node, addr) {
366
373
  export async function fetchSeedRelays(node, seed) {
367
374
  if (seed.startsWith('http://') || seed.startsWith('https://')) {
368
375
  try {
369
- const res = await fetch(`${seed.replace(/\/$/, '')}/peers`);
376
+ const res = await fetch(`${seed.replace(/\/$/, '')}/peers`, { signal: AbortSignal.timeout(DIAL_TIMEOUT_MS) });
370
377
  if (!res.ok)
371
378
  return [];
372
379
  const body = (await res.json());
@@ -381,7 +388,7 @@ export async function fetchSeedRelays(node, seed) {
381
388
  if (node == null)
382
389
  return [];
383
390
  try {
384
- const s = await node.dialProtocol(multiaddr(seed), '/genkaku/peers/0', RELAY_STREAM);
391
+ const s = await node.dialProtocol(multiaddr(seed), '/genkaku/peers/0', streamOpts());
385
392
  const reader = new FrameReader();
386
393
  for await (const chunk of s.source) {
387
394
  reader.push(chunk);
@@ -409,7 +416,7 @@ export async function fetchSeedRelays(node, seed) {
409
416
  * digest JobEscrow.settle recovers against the session's worker address.
410
417
  */
411
418
  export async function requestSettleCosign(node, addr, args) {
412
- const s = await node.dialProtocol(multiaddr(addr), '/genkaku/settle/0', RELAY_STREAM);
419
+ const s = await node.dialProtocol(multiaddr(addr), '/genkaku/settle/0', streamOpts());
413
420
  const reader = new FrameReader();
414
421
  let reply = null;
415
422
  const sinkDone = s.sink([lpEncode({
@@ -452,7 +459,7 @@ export async function announceToSeed(node, seed, addrs) {
452
459
  : [seed];
453
460
  for (const target of targets) {
454
461
  try {
455
- const s = await node.dialProtocol(multiaddr(target), '/genkaku/announce/0', RELAY_STREAM);
462
+ const s = await node.dialProtocol(multiaddr(target), '/genkaku/announce/0', streamOpts());
456
463
  try {
457
464
  s.sink([lpEncode({ proto: 'announce/0', addrs })]).catch(() => { });
458
465
  const reader = new FrameReader();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@genkaku/protocol",
3
- "version": "0.1.12",
3
+ "version": "0.1.14",
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",