@genkaku/protocol 0.1.15 → 0.1.16
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 +10 -0
- package/dist/bridge.d.ts.map +1 -1
- package/dist/bridge.js +74 -4
- package/dist/chain.d.ts +16 -0
- package/dist/chain.d.ts.map +1 -1
- package/dist/chain.js +33 -0
- package/dist/cors.d.ts +7 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/cors.js +26 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/keys.d.ts +2 -0
- package/dist/keys.d.ts.map +1 -1
- package/dist/keys.js +11 -0
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +5 -4
- package/package.json +1 -1
package/dist/bridge.d.ts
CHANGED
|
@@ -38,6 +38,16 @@ export type BridgeOptions = {
|
|
|
38
38
|
workers?: string[];
|
|
39
39
|
settle?: boolean;
|
|
40
40
|
}) => void | Promise<void>;
|
|
41
|
+
/** Wallet operations the panel drives. Key material only ever leaves over
|
|
42
|
+
* loopback CORS, and only after an explicit confirmation flag. */
|
|
43
|
+
wallet?: {
|
|
44
|
+
address: () => string;
|
|
45
|
+
exportKey: () => string;
|
|
46
|
+
importKey: (privateKey: string) => void;
|
|
47
|
+
rotate: () => void;
|
|
48
|
+
/** testnet only; mints MockUSDC to the current user wallet */
|
|
49
|
+
mint?: (amount: bigint) => Promise<string>;
|
|
50
|
+
};
|
|
41
51
|
/** P4.9h: derived credit per worker wallet (escrow events, not self-report).
|
|
42
52
|
* Absent = offers keep whatever the worker claimed. */
|
|
43
53
|
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;
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
|
package/dist/bridge.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
// escrow on Base Sepolia. No provider wire code leaks into dsh.
|
|
5
5
|
import { appendFileSync } from 'node:fs';
|
|
6
6
|
import { createServer } from 'node:http';
|
|
7
|
+
import { applyLoopbackCors } from "./cors.js";
|
|
7
8
|
import { openEscrow, publicClientFor, readWorker, refundSession, settleSession, signReceiptPayload, walletAddress, walletClientFor, } from "./chain.js";
|
|
8
9
|
import { dialWorkerAny, fetchOffers, requestSettleCosign } from "./dial.js";
|
|
9
10
|
import { dedupeOffers, toWire } from "./offer.js";
|
|
@@ -532,10 +533,10 @@ export async function startOpenAiBridge(opts) {
|
|
|
532
533
|
void (async () => {
|
|
533
534
|
try {
|
|
534
535
|
const path = (req.url ?? '/').split('?')[0] ?? '/';
|
|
535
|
-
if (req
|
|
536
|
-
res.
|
|
537
|
-
res.
|
|
538
|
-
|
|
536
|
+
if (!applyLoopbackCors(req, res)) {
|
|
537
|
+
res.writeHead(403, { 'content-type': 'application/json' });
|
|
538
|
+
res.end(JSON.stringify({ error: { message: 'origin not allowed' } }));
|
|
539
|
+
return;
|
|
539
540
|
}
|
|
540
541
|
if (req.method === 'OPTIONS') {
|
|
541
542
|
res.writeHead(204);
|
|
@@ -564,6 +565,75 @@ export async function startOpenAiBridge(opts) {
|
|
|
564
565
|
json(res, 200, { ok: true });
|
|
565
566
|
return;
|
|
566
567
|
}
|
|
568
|
+
if (req.method === 'POST' && path.startsWith('/genkaku/wallet/')) {
|
|
569
|
+
const action = path.slice('/genkaku/wallet/'.length).replace(/\/$/, '');
|
|
570
|
+
if (opts.wallet == null) {
|
|
571
|
+
failure(res, 501, 'wallet operations are not enabled in this role');
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
let body = {};
|
|
575
|
+
try {
|
|
576
|
+
body = await readJson(req);
|
|
577
|
+
}
|
|
578
|
+
catch {
|
|
579
|
+
failure(res, 400, 'invalid JSON body');
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
if (action === 'export') {
|
|
583
|
+
// The key is the wallet: require an explicit acknowledgement so a
|
|
584
|
+
// stray click (or a scripted call without intent) cannot read it.
|
|
585
|
+
if (body.confirm !== true) {
|
|
586
|
+
failure(res, 400, 'export requires confirm: true');
|
|
587
|
+
return;
|
|
588
|
+
}
|
|
589
|
+
res.setHeader('cache-control', 'no-store');
|
|
590
|
+
json(res, 200, { ok: true, address: opts.wallet.address(), privateKey: opts.wallet.exportKey() });
|
|
591
|
+
return;
|
|
592
|
+
}
|
|
593
|
+
if (action === 'import') {
|
|
594
|
+
const key = typeof body.privateKey === 'string' ? body.privateKey.trim() : '';
|
|
595
|
+
if (key === '') {
|
|
596
|
+
failure(res, 400, 'privateKey is required');
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
try {
|
|
600
|
+
opts.wallet.importKey(key);
|
|
601
|
+
}
|
|
602
|
+
catch (error) {
|
|
603
|
+
failure(res, 400, error instanceof Error ? error.message : String(error));
|
|
604
|
+
return;
|
|
605
|
+
}
|
|
606
|
+
json(res, 200, { ok: true, address: opts.wallet.address(), restarting: true });
|
|
607
|
+
return;
|
|
608
|
+
}
|
|
609
|
+
if (action === 'new') {
|
|
610
|
+
opts.wallet.rotate();
|
|
611
|
+
json(res, 200, { ok: true, address: opts.wallet.address(), restarting: true });
|
|
612
|
+
return;
|
|
613
|
+
}
|
|
614
|
+
if (action === 'mint') {
|
|
615
|
+
if (opts.wallet.mint == null) {
|
|
616
|
+
failure(res, 400, 'test USDC mint is only available on base-sepolia');
|
|
617
|
+
return;
|
|
618
|
+
}
|
|
619
|
+
const raw = body.amountUsdc === undefined ? '100' : String(body.amountUsdc);
|
|
620
|
+
const amount = Math.round(Number(raw) * 1e6);
|
|
621
|
+
if (!Number.isFinite(amount) || amount <= 0 || amount > 10_000e6) {
|
|
622
|
+
failure(res, 400, 'amountUsdc must be between 0 and 10000');
|
|
623
|
+
return;
|
|
624
|
+
}
|
|
625
|
+
try {
|
|
626
|
+
const tx = await opts.wallet.mint(BigInt(amount));
|
|
627
|
+
json(res, 200, { ok: true, tx, amountUsdc: Number(raw) });
|
|
628
|
+
}
|
|
629
|
+
catch (error) {
|
|
630
|
+
failure(res, 500, error instanceof Error ? error.message : String(error));
|
|
631
|
+
}
|
|
632
|
+
return;
|
|
633
|
+
}
|
|
634
|
+
failure(res, 404, 'unknown wallet action');
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
567
637
|
if (req.method === 'POST' && (path === '/genkaku/settings' || path === '/genkaku/settings/')) {
|
|
568
638
|
let body;
|
|
569
639
|
try {
|
package/dist/chain.d.ts
CHANGED
|
@@ -339,6 +339,18 @@ export declare const USDC_ABI: readonly [{
|
|
|
339
339
|
readonly name: "";
|
|
340
340
|
readonly type: "uint256";
|
|
341
341
|
}];
|
|
342
|
+
}, {
|
|
343
|
+
readonly name: "mint";
|
|
344
|
+
readonly type: "function";
|
|
345
|
+
readonly stateMutability: "nonpayable";
|
|
346
|
+
readonly inputs: readonly [{
|
|
347
|
+
readonly name: "to";
|
|
348
|
+
readonly type: "address";
|
|
349
|
+
}, {
|
|
350
|
+
readonly name: "amount";
|
|
351
|
+
readonly type: "uint256";
|
|
352
|
+
}];
|
|
353
|
+
readonly outputs: readonly [];
|
|
342
354
|
}];
|
|
343
355
|
/** Public reads. The transport is a failover list (P4.9b): a rate-limited or
|
|
344
356
|
* dead endpoint rolls to the next one without surfacing anything to the user. */
|
|
@@ -389,6 +401,10 @@ export declare function settleSession(walletC: GenkakuWallet, env: NetEnvironmen
|
|
|
389
401
|
spend: bigint;
|
|
390
402
|
workerSig: `0x${string}`;
|
|
391
403
|
}): Promise<`0x${string}`>;
|
|
404
|
+
/** Mint test USDC to `to`. MockUSDC on Base Sepolia lets anyone mint; the
|
|
405
|
+
* canonical mainnet token has no such function, so the env check is load
|
|
406
|
+
* bearing, not a convenience. */
|
|
407
|
+
export declare function mintTestUsdc(walletC: GenkakuWallet, env: NetEnvironment, to: `0x${string}`, amount: bigint): Promise<`0x${string}`>;
|
|
392
408
|
/** Reclaim an unsettled escrow. A short session can bill zero started minutes;
|
|
393
409
|
* without this the funds would sit in the contract until the user found a
|
|
394
410
|
* manual refund, which a non-technical user never will. */
|
package/dist/chain.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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
|
|
1
|
+
{"version":3,"file":"chain.d.ts","sourceRoot":"","sources":["../src/chain.ts"],"names":[],"mappings":"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"}
|
package/dist/chain.js
CHANGED
|
@@ -236,6 +236,18 @@ export const USDC_ABI = [{
|
|
|
236
236
|
inputs: [{ name: 'owner', type: 'address' }],
|
|
237
237
|
outputs: [{ name: '', type: 'uint256' }],
|
|
238
238
|
},
|
|
239
|
+
{
|
|
240
|
+
// MockUSDC (Base Sepolia only) — the mainnet token has no mint, and the
|
|
241
|
+
// only caller is guarded by `env === 'base-sepolia'`.
|
|
242
|
+
name: 'mint',
|
|
243
|
+
type: 'function',
|
|
244
|
+
stateMutability: 'nonpayable',
|
|
245
|
+
inputs: [
|
|
246
|
+
{ name: 'to', type: 'address' },
|
|
247
|
+
{ name: 'amount', type: 'uint256' },
|
|
248
|
+
],
|
|
249
|
+
outputs: [],
|
|
250
|
+
},
|
|
239
251
|
];
|
|
240
252
|
function viemChain(env) {
|
|
241
253
|
// P6 will add the mainnet chain object. Until then the ONLY wired chain is
|
|
@@ -412,6 +424,27 @@ export async function settleSession(walletC, env, args) {
|
|
|
412
424
|
account: walletC.account,
|
|
413
425
|
});
|
|
414
426
|
}
|
|
427
|
+
/** Mint test USDC to `to`. MockUSDC on Base Sepolia lets anyone mint; the
|
|
428
|
+
* canonical mainnet token has no such function, so the env check is load
|
|
429
|
+
* bearing, not a convenience. */
|
|
430
|
+
export async function mintTestUsdc(walletC, env, to, amount) {
|
|
431
|
+
if (env !== 'base-sepolia') {
|
|
432
|
+
throw new Error('[genkaku:chain] test USDC mint is only available on base-sepolia');
|
|
433
|
+
}
|
|
434
|
+
const configured = CONTRACTS[env].usdc;
|
|
435
|
+
if (configured === '')
|
|
436
|
+
throw new Error(`[genkaku:chain] no USDC token for ${env}`);
|
|
437
|
+
const usdc = configured;
|
|
438
|
+
return await walletC.writeContract({
|
|
439
|
+
address: usdc,
|
|
440
|
+
abi: USDC_ABI,
|
|
441
|
+
functionName: 'mint',
|
|
442
|
+
args: [to, amount],
|
|
443
|
+
authorizationList: undefined,
|
|
444
|
+
chain: viemChain(env),
|
|
445
|
+
account: walletC.account,
|
|
446
|
+
});
|
|
447
|
+
}
|
|
415
448
|
/** Reclaim an unsettled escrow. A short session can bill zero started minutes;
|
|
416
449
|
* without this the funds would sit in the contract until the user found a
|
|
417
450
|
* manual refund, which a non-technical user never will. */
|
package/dist/cors.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
/**
|
|
3
|
+
* Apply CORS headers when the request comes from a loopback origin.
|
|
4
|
+
* @returns false when a browser origin outside loopback tried to call us.
|
|
5
|
+
*/
|
|
6
|
+
export declare function applyLoopbackCors(req: IncomingMessage, res: ServerResponse): boolean;
|
|
7
|
+
//# sourceMappingURL=cors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../src/cors.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAIhE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAepF"}
|
package/dist/cors.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// GENKAKU: CORS for the loopback control planes.
|
|
2
|
+
//
|
|
3
|
+
// The bridge and the worker status server answer on 127.0.0.1 and used to send
|
|
4
|
+
// `access-control-allow-origin: *`. Any website the user visited could then
|
|
5
|
+
// read wallet state and, once wallet endpoints existed, key material. Only a
|
|
6
|
+
// loopback Origin (the DSH web app) may read these responses.
|
|
7
|
+
const LOOPBACK = /^https?:\/\/(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/;
|
|
8
|
+
/**
|
|
9
|
+
* Apply CORS headers when the request comes from a loopback origin.
|
|
10
|
+
* @returns false when a browser origin outside loopback tried to call us.
|
|
11
|
+
*/
|
|
12
|
+
export function applyLoopbackCors(req, res) {
|
|
13
|
+
const origin = req.headers.origin;
|
|
14
|
+
// curl, the HTML dashboard (same-origin navigation) and node clients send no
|
|
15
|
+
// Origin; they are not subject to the browser's cross-origin rules.
|
|
16
|
+
if (origin == null)
|
|
17
|
+
return true;
|
|
18
|
+
if (!LOOPBACK.test(origin))
|
|
19
|
+
return false;
|
|
20
|
+
res.setHeader('access-control-allow-origin', origin);
|
|
21
|
+
res.setHeader('vary', 'origin');
|
|
22
|
+
res.setHeader('access-control-allow-methods', 'GET, POST, OPTIONS');
|
|
23
|
+
res.setHeader('access-control-allow-headers', 'content-type');
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=cors.js.map
|
package/dist/index.d.ts
CHANGED
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,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"}
|
|
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,WAAW,CAAA;AACzB,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
package/dist/keys.d.ts
CHANGED
|
@@ -12,6 +12,8 @@ export type KeyVault = {
|
|
|
12
12
|
userKey(): PrivKey;
|
|
13
13
|
/** the app's worker identity key — generated on first use */
|
|
14
14
|
workerKey(): PrivKey;
|
|
15
|
+
/** replace the user key (import / rotate); refuses while an env key wins */
|
|
16
|
+
setUserKey(key: PrivKey): void;
|
|
15
17
|
/** derived addresses only (renderer-safe mirror of the keys) */
|
|
16
18
|
addresses(): {
|
|
17
19
|
user: EthAddress;
|
package/dist/keys.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAA;AAG/B,MAAM,MAAM,OAAO,GAAG,GAAG,CAAA;AACzB,MAAM,MAAM,UAAU,GAAG,KAAK,MAAM,EAAE,CAAA;AAEtC;gFACgF;AAChF,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;CAC9B,CAAA;AASD,MAAM,MAAM,QAAQ,GAAG;IACrB,2DAA2D;IAC3D,OAAO,IAAI,OAAO,CAAA;IAClB,6DAA6D;IAC7D,SAAS,IAAI,OAAO,CAAA;IACpB,gEAAgE;IAChE,SAAS,IAAI;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,CAAA;IACrD,qEAAqE;IACrE,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAA;CACpC,CAAA;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,QAAQ,CAAA;CACjB,GAAG,QAAQ,
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAA;AAG/B,MAAM,MAAM,OAAO,GAAG,GAAG,CAAA;AACzB,MAAM,MAAM,UAAU,GAAG,KAAK,MAAM,EAAE,CAAA;AAEtC;gFACgF;AAChF,MAAM,MAAM,QAAQ,GAAG;IACrB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;CAC9B,CAAA;AASD,MAAM,MAAM,QAAQ,GAAG;IACrB,2DAA2D;IAC3D,OAAO,IAAI,OAAO,CAAA;IAClB,6DAA6D;IAC7D,SAAS,IAAI,OAAO,CAAA;IACpB,4EAA4E;IAC5E,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAA;IAC9B,gEAAgE;IAChE,SAAS,IAAI;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,CAAA;IACrD,qEAAqE;IACrE,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAA;CACpC,CAAA;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE;IACnC,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,QAAQ,CAAA;CACjB,GAAG,QAAQ,CAuHX;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAQnD"}
|
package/dist/keys.js
CHANGED
|
@@ -97,6 +97,17 @@ export function createKeyVault(opts) {
|
|
|
97
97
|
user: privateKeyToAccount(lock('user')).address,
|
|
98
98
|
worker: privateKeyToAccount(lock('worker')).address,
|
|
99
99
|
}),
|
|
100
|
+
setUserKey(key) {
|
|
101
|
+
// An env-supplied key is process-scoped by design; silently replacing it
|
|
102
|
+
// would make the panel look successful while the old identity stays live.
|
|
103
|
+
if (envUser != null) {
|
|
104
|
+
throw new Error('the user key comes from GENKAKU_USER_KEY; unset it before importing or rotating');
|
|
105
|
+
}
|
|
106
|
+
const next = normalizeKey(key);
|
|
107
|
+
userKey = next;
|
|
108
|
+
vault.userKeyEnc = codec.encrypt(next).toString('base64');
|
|
109
|
+
persist();
|
|
110
|
+
},
|
|
100
111
|
get usingEnvOverrides() {
|
|
101
112
|
return envUser != null || envWorker != null;
|
|
102
113
|
},
|
package/dist/status.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,+CAA+C;AAC/C,MAAM,MAAM,WAAW,GAAG;IACxB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,SAAS,CAAA;CACjB,CAAA;AAED,0EAA0E;AAC1E,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,4EAA4E;IAC5E,SAAS,EAAE,OAAO,CAAA;IAClB,2EAA2E;IAC3E,cAAc,EAAE,OAAO,CAAA;IACvB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,oFAAoF;IACpF,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,iFAAiF;IACjF,SAAS,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAA;IACtC,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B,CAAA;AAED,mEAAmE;AACnE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,6DAA6D;AAC7D,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAEzF,0DAA0D;AAC1D,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAExE,2DAA2D;AAC3D,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAE7E,8DAA8D;AAC9D,MAAM,MAAM,aAAa,GAAG;IAC1B,mEAAmE;IACnE,KAAK,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7B,2CAA2C;IAC3C,aAAa,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IACrC,sEAAsE;IACtE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC1H,0CAA0C;IAC1C,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACzC,CAAA;AAyKD,6DAA6D;AAC7D,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,EACxD,SAAS,CAAC,EAAE,oBAAoB,EAChC,MAAM,CAAC,EAAE,iBAAiB,EAC1B,MAAM,CAAC,EAAE,aAAa,EACtB,SAAS,CAAC,EAAE,oBAAoB,GAC/B,OAAO,CAAC,YAAY,CAAC,CA+LvB"}
|
package/dist/status.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// GET /genkaku/status (JSON). Snapshot is called per request so the page and
|
|
3
3
|
// the JSON always reflect the live sidecar, never a boot-time copy.
|
|
4
4
|
import { createServer } from 'node:http';
|
|
5
|
+
import { applyLoopbackCors } from "./cors.js";
|
|
5
6
|
/** Self-contained dashboard; mirrors the user bridge style and polls the JSON. */
|
|
6
7
|
const DASHBOARD_HTML = `<!doctype html>
|
|
7
8
|
<html lang="en">
|
|
@@ -170,10 +171,10 @@ export async function startStatusServer(port, snapshot, onCatalog, onMode, ollam
|
|
|
170
171
|
void (async () => {
|
|
171
172
|
try {
|
|
172
173
|
const path = (req.url ?? '/').split('?')[0] ?? '/';
|
|
173
|
-
if (req
|
|
174
|
-
res.
|
|
175
|
-
res.
|
|
176
|
-
|
|
174
|
+
if (!applyLoopbackCors(req, res)) {
|
|
175
|
+
res.writeHead(403, { 'content-type': 'application/json' });
|
|
176
|
+
res.end(JSON.stringify({ error: { message: 'origin not allowed' } }));
|
|
177
|
+
return;
|
|
177
178
|
}
|
|
178
179
|
if (req.method === 'OPTIONS') {
|
|
179
180
|
res.writeHead(204);
|
package/package.json
CHANGED