@genkaku/protocol 0.1.13 → 0.1.15
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 +6 -0
- package/dist/bridge.d.ts.map +1 -1
- package/dist/bridge.js +47 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/settleOptIn.d.ts +15 -0
- package/dist/settleOptIn.d.ts.map +1 -0
- package/dist/settleOptIn.js +37 -0
- package/package.json +1 -1
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, {
|
package/dist/bridge.d.ts.map
CHANGED
|
@@ -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,
|
|
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/index.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ export * from './ollama.ts';
|
|
|
23
23
|
export * from './p2pNode.ts';
|
|
24
24
|
export * from './paywall.ts';
|
|
25
25
|
export * from './publishOptIn.ts';
|
|
26
|
+
export * from './settleOptIn.ts';
|
|
26
27
|
export * from './receipts.ts';
|
|
27
28
|
export * from './registry.ts';
|
|
28
29
|
export * from './rpc.ts';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA;AACvB,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA;AAC3B,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,UAAU,CAAA;AACxB,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -23,6 +23,7 @@ export * from "./ollama.js";
|
|
|
23
23
|
export * from "./p2pNode.js";
|
|
24
24
|
export * from "./paywall.js";
|
|
25
25
|
export * from "./publishOptIn.js";
|
|
26
|
+
export * from "./settleOptIn.js";
|
|
26
27
|
export * from "./receipts.js";
|
|
27
28
|
export * from "./registry.js";
|
|
28
29
|
export * from "./rpc.js";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** File name under the GenKaKu key directory. */
|
|
2
|
+
export declare const SETTLE_OPT_IN_FILE = "settle.json";
|
|
3
|
+
/**
|
|
4
|
+
* Read the user's settlement opt-in.
|
|
5
|
+
* @param keyDir - GenKaKu state directory.
|
|
6
|
+
* @returns true/false when the user chose, or null to keep the profile default.
|
|
7
|
+
*/
|
|
8
|
+
export declare function readSettleOptIn(keyDir: string): boolean | null;
|
|
9
|
+
/**
|
|
10
|
+
* Persist the user's settlement opt-in.
|
|
11
|
+
* @param keyDir - GenKaKu state directory.
|
|
12
|
+
* @param settle - whether sessions should open and settle escrows.
|
|
13
|
+
*/
|
|
14
|
+
export declare function writeSettleOptIn(keyDir: string, settle: boolean): void;
|
|
15
|
+
//# sourceMappingURL=settleOptIn.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settleOptIn.d.ts","sourceRoot":"","sources":["../src/settleOptIn.ts"],"names":[],"mappings":"AAYA,iDAAiD;AACjD,eAAO,MAAM,kBAAkB,gBAAgB,CAAA;AAE/C;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAQ9D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAGtE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// GENKAKU: user-side settlement opt-in.
|
|
2
|
+
//
|
|
3
|
+
// `config.settle` is the deployment default and is NOT a volatile settings
|
|
4
|
+
// field: writing it into the profile patch is rejected by dsh ("is not
|
|
5
|
+
// volatile") and, because the write was fire-and-forget, it took the whole app
|
|
6
|
+
// down. The panel's Payments switch therefore persists here instead, next to
|
|
7
|
+
// the worker's publish opt-in, and the runtime reads it when it builds the
|
|
8
|
+
// bridge.
|
|
9
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
/** File name under the GenKaKu key directory. */
|
|
12
|
+
export const SETTLE_OPT_IN_FILE = 'settle.json';
|
|
13
|
+
/**
|
|
14
|
+
* Read the user's settlement opt-in.
|
|
15
|
+
* @param keyDir - GenKaKu state directory.
|
|
16
|
+
* @returns true/false when the user chose, or null to keep the profile default.
|
|
17
|
+
*/
|
|
18
|
+
export function readSettleOptIn(keyDir) {
|
|
19
|
+
try {
|
|
20
|
+
const value = JSON.parse(readFileSync(join(keyDir, SETTLE_OPT_IN_FILE), 'utf8'));
|
|
21
|
+
const settle = value.settle;
|
|
22
|
+
return typeof settle === 'boolean' ? settle : null;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Persist the user's settlement opt-in.
|
|
30
|
+
* @param keyDir - GenKaKu state directory.
|
|
31
|
+
* @param settle - whether sessions should open and settle escrows.
|
|
32
|
+
*/
|
|
33
|
+
export function writeSettleOptIn(keyDir, settle) {
|
|
34
|
+
mkdirSync(keyDir, { recursive: true, mode: 0o700 });
|
|
35
|
+
writeFileSync(join(keyDir, SETTLE_OPT_IN_FILE), `${JSON.stringify({ settle }, undefined, 2)}\n`, { mode: 0o600 });
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=settleOptIn.js.map
|
package/package.json
CHANGED