@hoox-sh/hoox-shared 1.5.0 → 1.6.0
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/agent-config-fields.d.ts +5 -0
- package/dist/agent-config-fields.d.ts.map +1 -1
- package/dist/analytics.d.ts.map +1 -1
- package/dist/analytics.js +8 -3
- package/dist/config.d.ts +10 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +256 -24
- package/dist/errors.d.ts +1 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/exchange-client.d.ts +0 -19
- package/dist/exchange-client.d.ts.map +1 -1
- package/dist/exchange-client.js +0 -66
- package/dist/exchanges/base-exchange-client.d.ts.map +1 -1
- package/dist/exchanges/base-exchange-client.js +4 -3
- package/dist/exchanges/index.js +4 -3
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +293 -604
- package/dist/middleware/auth.d.ts +9 -0
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/index.js +3 -2
- package/dist/middleware/logger.d.ts +2 -0
- package/dist/middleware/logger.d.ts.map +1 -1
- package/dist/middleware/rate-limit.d.ts +7 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +3 -2
- package/dist/middleware/validate.d.ts +2 -0
- package/dist/middleware/validate.d.ts.map +1 -1
- package/dist/path-utils.d.ts.map +1 -1
- package/dist/path-utils.js +13 -3
- package/dist/queue-handler.d.ts.map +1 -1
- package/dist/queue-handler.js +19 -8
- package/dist/router.d.ts +5 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/schemas/index.js +40 -23
- package/dist/schemas/registry.d.ts.map +1 -1
- package/dist/schemas/registry.js +4 -1
- package/dist/schemas/validators.d.ts.map +1 -1
- package/dist/schemas/validators.js +36 -22
- package/dist/service-bindings.d.ts +4 -0
- package/dist/service-bindings.d.ts.map +1 -1
- package/dist/session.d.ts +10 -3
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +109 -33
- package/dist/sse.d.ts.map +1 -1
- package/dist/sse.js +24 -6
- package/dist/stores/config-store.d.ts +2 -50
- package/dist/stores/config-store.d.ts.map +1 -1
- package/dist/stores/config-store.js +145 -134
- package/dist/stores/service-store.d.ts +2 -192
- package/dist/stores/service-store.d.ts.map +1 -1
- package/dist/stores/service-store.js +24 -6
- package/dist/stores/ui-store.d.ts +2 -48
- package/dist/stores/ui-store.d.ts.map +1 -1
- package/dist/tenant.d.ts +1 -0
- package/dist/tenant.d.ts.map +1 -1
- package/dist/types.d.ts +6 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +19 -0
- package/dist/wizard/engine.d.ts.map +1 -1
- package/dist/wizard/engine.js +13 -7
- package/dist/wizard/index.js +13 -7
- package/dist/wizard/presets.js +3 -3
- package/package.json +1 -1
|
@@ -21,6 +21,15 @@ import type { MiddlewareHandler } from "../types/router";
|
|
|
21
21
|
* we pad both encodings to the same max length before XOR comparison.
|
|
22
22
|
*/
|
|
23
23
|
export declare function timingSafeEqual(a: string, b: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Web Crypto constant-time string comparison (Cloudflare recommended).
|
|
26
|
+
*
|
|
27
|
+
* Hashes both inputs with SHA-256 so lengths never leak, then compares
|
|
28
|
+
* equal-length digests via `crypto.subtle.timingSafeEqual`.
|
|
29
|
+
*
|
|
30
|
+
* Falls back to the synchronous XOR implementation if subtle crypto is
|
|
31
|
+
* unavailable (e.g. very constrained test harnesses).
|
|
32
|
+
*/
|
|
24
33
|
export declare function timingSafeEqualAsync(a: string, b: string): Promise<boolean>;
|
|
25
34
|
/**
|
|
26
35
|
* Environment bindings accepted for operator Bearer auth.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAe7D;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAe7D;AAUD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,GACR,OAAO,CAAC,OAAO,CAAC,CAelB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,eAAe,GAAG,GAAG,GACzB,MAAM,GAAG,SAAS,CAUpB;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,GAAG,GAAG,eAAe,GACzB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAE1B;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,eAAe,GAAG,GAAG,GACzB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyB1B;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,iBAAiB,CAAC,eAAe,CAAC,CAUjF;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;AAS7D,6FAA6F;AAC7F,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,eAAe,EACpB,QAAQ,EAAE,mBAAmB,GAC5B,MAAM,EAAE,CASV;AAiCD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,eAAe,EACpB,OAAO,GAAE,mBAA4C,GACpD,QAAQ,GAAG,IAAI,CAcjB;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,GAAE,mBAA4C,GACpD,iBAAiB,CAAC,eAAe,CAAC,CAoBpC;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,eAAe,EACpB,OAAO,GAAE,mBAA4C,GACpD;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAezC"}
|
package/dist/middleware/index.js
CHANGED
|
@@ -421,7 +421,7 @@ function createRateLimiter(kv, config) {
|
|
|
421
421
|
};
|
|
422
422
|
}
|
|
423
423
|
const newCount = await storage.incr(fullKey, {
|
|
424
|
-
expirationTtl: config.windowSeconds
|
|
424
|
+
expirationTtl: Math.max(60, config.windowSeconds)
|
|
425
425
|
});
|
|
426
426
|
if (newCount > config.maxRequests) {
|
|
427
427
|
const retryAfter = Math.ceil(config.windowSeconds - Date.now() % (config.windowSeconds * 1000) / 1000);
|
|
@@ -458,7 +458,8 @@ function createRateLimiter(kv, config) {
|
|
|
458
458
|
return null;
|
|
459
459
|
}
|
|
460
460
|
async function checkKey(key) {
|
|
461
|
-
const
|
|
461
|
+
const windowStart = Math.floor(Date.now() / (config.windowSeconds * 1000));
|
|
462
|
+
const fullKey = `${prefix}:${key}:${windowStart}`;
|
|
462
463
|
return checkWithKey(fullKey);
|
|
463
464
|
}
|
|
464
465
|
async function enforceKey(key) {
|
|
@@ -12,6 +12,8 @@ export interface Logger {
|
|
|
12
12
|
warn(message: string, context?: Record<string, unknown>): void;
|
|
13
13
|
error(message: string, context?: Record<string, unknown>): void;
|
|
14
14
|
}
|
|
15
|
+
/** JSON-line logger bound to a service/module context. */
|
|
15
16
|
export declare function createLogger(ctx: LogContext): Logger;
|
|
17
|
+
/** Wrap a fetch handler so each request logs method, path, status, and duration. */
|
|
16
18
|
export declare function withRequestLog<E>(handler: (request: Request, env: E, ctx: ExecutionContext) => Promise<Response>, logCtx: LogContext): (request: Request, env: E, ctx: ExecutionContext) => Promise<Response>;
|
|
17
19
|
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/middleware/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAWD,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACjE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CA4BpD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAC9B,OAAO,EAAE,CACP,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,CAAC,EACN,GAAG,EAAE,gBAAgB,KAClB,OAAO,CAAC,QAAQ,CAAC,EACtB,MAAM,EAAE,UAAU,GACjB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,QAAQ,CAAC,CA2BxE"}
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/middleware/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAWD,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/D,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC/D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACjE;AAED,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CA4BpD;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,CAAC,EAC9B,OAAO,EAAE,CACP,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,CAAC,EACN,GAAG,EAAE,gBAAgB,KAClB,OAAO,CAAC,QAAQ,CAAC,EACtB,MAAM,EAAE,UAAU,GACjB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,QAAQ,CAAC,CA2BxE"}
|
|
@@ -25,6 +25,13 @@ export interface RateLimiter {
|
|
|
25
25
|
checkKey(key: string): Promise<RateLimitResult>;
|
|
26
26
|
enforceKey(key: string): Promise<Response | null>;
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Create a KV- or memory-backed rate limiter.
|
|
30
|
+
*
|
|
31
|
+
* `check` / `enforce` key by client IP and a clock window.
|
|
32
|
+
* `checkKey` / `enforceKey` key by the caller string plus the same window
|
|
33
|
+
* (so a busy key does not accumulate forever).
|
|
34
|
+
*/
|
|
28
35
|
export declare function createRateLimiter(kv: Env["CONFIG_KV"] | undefined, config: RateLimitConfig): RateLimiter;
|
|
29
36
|
export {};
|
|
30
37
|
//# sourceMappingURL=rate-limit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAClD,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAChD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CACnD;AAuHD,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,GAAG,CAAC,WAAW,CAAC,GAAG,SAAS,EAChC,MAAM,EAAE,eAAe,GACtB,WAAW,
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../src/middleware/rate-limit.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAClD,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAChD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;CACnD;AAuHD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,GAAG,CAAC,WAAW,CAAC,GAAG,SAAS,EAChC,MAAM,EAAE,eAAe,GACtB,WAAW,CAoHb"}
|
|
@@ -102,7 +102,7 @@ function createRateLimiter(kv, config) {
|
|
|
102
102
|
};
|
|
103
103
|
}
|
|
104
104
|
const newCount = await storage.incr(fullKey, {
|
|
105
|
-
expirationTtl: config.windowSeconds
|
|
105
|
+
expirationTtl: Math.max(60, config.windowSeconds)
|
|
106
106
|
});
|
|
107
107
|
if (newCount > config.maxRequests) {
|
|
108
108
|
const retryAfter = Math.ceil(config.windowSeconds - Date.now() % (config.windowSeconds * 1000) / 1000);
|
|
@@ -139,7 +139,8 @@ function createRateLimiter(kv, config) {
|
|
|
139
139
|
return null;
|
|
140
140
|
}
|
|
141
141
|
async function checkKey(key) {
|
|
142
|
-
const
|
|
142
|
+
const windowStart = Math.floor(Date.now() / (config.windowSeconds * 1000));
|
|
143
|
+
const fullKey = `${prefix}:${key}:${windowStart}`;
|
|
143
144
|
return checkWithKey(fullKey);
|
|
144
145
|
}
|
|
145
146
|
async function enforceKey(key) {
|
|
@@ -36,6 +36,8 @@ export declare function parseJsonBody<T extends z.ZodTypeAny>(request: Request,
|
|
|
36
36
|
* Kept for backward compatibility with existing workers.
|
|
37
37
|
*/
|
|
38
38
|
export declare function validateJsonLegacy(request: Request): Promise<Result<Record<string, unknown>>>;
|
|
39
|
+
/** Require `field` on a parsed JSON body; fail with a missing-field error. */
|
|
39
40
|
export declare function requireField<T>(body: Record<string, unknown>, field: string): Result<T>;
|
|
41
|
+
/** Read `field` from a parsed JSON body, or `defaultValue` when absent. */
|
|
40
42
|
export declare function optionalField<T>(body: Record<string, unknown>, field: string, defaultValue: T): T;
|
|
41
43
|
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/middleware/validate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,8DAA8D;AAC9D,eAAO,MAAM,2BAA2B,UAAY,CAAC;AAErD,MAAM,WAAW,oBAAoB;IACnC,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EACjD,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,OAAO,GACZ,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAWpB;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EACxD,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAsC7B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAU1C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,CAAC,CAAC,CAKX;AAED,wBAAgB,aAAa,CAAC,CAAC,EAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,CAAC,GACd,CAAC,CAGH"}
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/middleware/validate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,8DAA8D;AAC9D,eAAO,MAAM,2BAA2B,UAAY,CAAC;AAErD,MAAM,WAAW,oBAAoB;IACnC,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EACjD,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,OAAO,GACZ,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAWpB;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,EACxD,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAsC7B;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAU1C;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,GACZ,MAAM,CAAC,CAAC,CAAC,CAKX;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,CAAC,EAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,CAAC,GACd,CAAC,CAGH"}
|
package/dist/path-utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../src/path-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkCH;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC;AAEjE,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,
|
|
1
|
+
{"version":3,"file":"path-utils.d.ts","sourceRoot":"","sources":["../src/path-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkCH;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC;AAEjE,+EAA+E;AAC/E,MAAM,MAAM,iBAAiB,GAC3B,KAAK,GAAG,KAAK,GAAG,YAAY,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEnD,0CAA0C;AAC1C,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,iDAAiD;IACjD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,qDAAqD;IACrD,OAAO,EAAE;QACP,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,4EAA4E;AAC5E,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;CACnB;AA4BD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAgBtC;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgBpD;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,QAAQ,CAEpD;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,GAAG,IAAI,CAYzD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CA4B1D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,GAAE,MAAsB,GAC/B,MAAM,GAAG,IAAI,CAQf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,iBAAiB,CAiEpB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAOnE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,QAAQ,CAiC9D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAStD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBvE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,IAAI,QAAQ,CAE1C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,IAAI,QAAQ,CAE3C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,IAAI,QAAQ,CAEzC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,IAAI,QAAQ,CAE9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,IAAI,QAAQ,CAE3C"}
|
package/dist/path-utils.js
CHANGED
|
@@ -8,10 +8,20 @@ import {
|
|
|
8
8
|
chmodSync
|
|
9
9
|
} from "fs";
|
|
10
10
|
import { homedir } from "os";
|
|
11
|
-
import { dirname, join, resolve } from "path";
|
|
11
|
+
import { dirname, join, resolve, sep } from "path";
|
|
12
12
|
function createHooxPath(path) {
|
|
13
13
|
return path;
|
|
14
14
|
}
|
|
15
|
+
function isInsideDir(child, parent) {
|
|
16
|
+
const resolvedChild = resolve(child);
|
|
17
|
+
const resolvedParent = resolve(parent);
|
|
18
|
+
const cmpChild = process.platform === "win32" ? resolvedChild.toLowerCase() : resolvedChild;
|
|
19
|
+
const cmpParent = process.platform === "win32" ? resolvedParent.toLowerCase() : resolvedParent;
|
|
20
|
+
if (cmpChild === cmpParent)
|
|
21
|
+
return true;
|
|
22
|
+
const prefix = cmpParent.endsWith(sep) ? cmpParent : cmpParent + sep;
|
|
23
|
+
return cmpChild.startsWith(prefix);
|
|
24
|
+
}
|
|
15
25
|
function getHooxHome() {
|
|
16
26
|
try {
|
|
17
27
|
const override = process.env.HOOX_HOME?.trim();
|
|
@@ -175,7 +185,7 @@ function resolveHooxPath(relativePath) {
|
|
|
175
185
|
const fullPath = join(hooxHome, normalizedPath);
|
|
176
186
|
const resolvedPath = resolve(fullPath);
|
|
177
187
|
const resolvedHome = resolve(hooxHome);
|
|
178
|
-
if (!resolvedPath
|
|
188
|
+
if (!isInsideDir(resolvedPath, resolvedHome)) {
|
|
179
189
|
throw new Error(`Resolved path "${resolvedPath}" is outside Hoox home directory`);
|
|
180
190
|
}
|
|
181
191
|
return createHooxPath(resolvedPath);
|
|
@@ -185,7 +195,7 @@ function isWithinHooxHome(path) {
|
|
|
185
195
|
const hooxHome = getHooxHome();
|
|
186
196
|
const resolvedPath = resolve(path);
|
|
187
197
|
const resolvedHome = resolve(hooxHome);
|
|
188
|
-
return resolvedPath
|
|
198
|
+
return isInsideDir(resolvedPath, resolvedHome);
|
|
189
199
|
} catch {
|
|
190
200
|
return false;
|
|
191
201
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-handler.d.ts","sourceRoot":"","sources":["../src/queue-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,2BAA2B,CAAC;AAEvE,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,+CAA+C;IAC/C,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7E,sDAAsD;IACtD,OAAO,CAAC,EAAE,CACR,OAAO,EAAE,CAAC,EACV,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,KACjB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,iEAAiE;IACjE,KAAK,CAAC,EAAE,CACN,OAAO,EAAE,CAAC,EACV,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,KACV,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,oCAAoC;IACpC,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;QACxC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;KAC1C,CAAC;IACF;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAkCD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"queue-handler.d.ts","sourceRoot":"","sources":["../src/queue-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,2BAA2B,CAAC;AAEvE,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,+CAA+C;IAC/C,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC7E,sDAAsD;IACtD,OAAO,CAAC,EAAE,CACR,OAAO,EAAE,CAAC,EACV,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,KACjB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,iEAAiE;IACjE,KAAK,CAAC,EAAE,CACN,OAAO,EAAE,CAAC,EACV,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,KACV,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,oCAAoC;IACpC,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;QACxC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;KAC1C,CAAC;IACF;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAkCD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,IA2ErD,OAAO,YAAY,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,IAAI,CAAC,CAGrD"}
|
package/dist/queue-handler.js
CHANGED
|
@@ -33,22 +33,33 @@ function createQueueHandler(options) {
|
|
|
33
33
|
} = options;
|
|
34
34
|
const concurrency = typeof concurrencyOpt === "number" && Number.isFinite(concurrencyOpt) && concurrencyOpt >= 1 ? Math.floor(concurrencyOpt) : 1;
|
|
35
35
|
async function processMessage(msg) {
|
|
36
|
-
const
|
|
36
|
+
const delivery = Math.max(1, typeof msg.attempts === "number" && Number.isFinite(msg.attempts) ? msg.attempts : 1);
|
|
37
|
+
const retryIndex = delivery - 1;
|
|
37
38
|
const logId = `[${msg.id}]`;
|
|
38
39
|
try {
|
|
39
|
-
logger?.info(`${logId} Processing message (attempt ${
|
|
40
|
-
await onMessage(msg.body,
|
|
40
|
+
logger?.info(`${logId} Processing message (attempt ${delivery})`);
|
|
41
|
+
await onMessage(msg.body, retryIndex);
|
|
41
42
|
logger?.info(`${logId} Message processed successfully`);
|
|
43
|
+
msg.ack();
|
|
42
44
|
} catch (error) {
|
|
43
45
|
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
44
|
-
if (
|
|
45
|
-
const delaySeconds = backoffDelays[
|
|
46
|
-
logger?.info(`${logId} Retrying in ${delaySeconds}s (attempt ${
|
|
47
|
-
|
|
46
|
+
if (retryIndex < maxRetries) {
|
|
47
|
+
const delaySeconds = backoffDelays[retryIndex] ?? backoffDelays[backoffDelays.length - 1] ?? 0;
|
|
48
|
+
logger?.info(`${logId} Retrying in ${delaySeconds}s (attempt ${delivery + 1}/${maxRetries + 1})`);
|
|
49
|
+
try {
|
|
50
|
+
await onRetry?.(msg.body, retryIndex, errorMsg, delaySeconds);
|
|
51
|
+
} catch (hookError) {
|
|
52
|
+
logger?.error(`${logId} onRetry failed: ${hookError instanceof Error ? hookError.message : String(hookError)}`);
|
|
53
|
+
}
|
|
48
54
|
msg.retry({ delaySeconds });
|
|
49
55
|
} else {
|
|
50
56
|
logger?.error(`${logId} Max retries exceeded (${maxRetries + 1} attempts), moving to DLQ`);
|
|
51
|
-
|
|
57
|
+
try {
|
|
58
|
+
await onDLQ?.(msg.body, retryIndex, errorMsg);
|
|
59
|
+
} catch (hookError) {
|
|
60
|
+
logger?.error(`${logId} onDLQ failed: ${hookError instanceof Error ? hookError.message : String(hookError)}`);
|
|
61
|
+
}
|
|
62
|
+
msg.ack();
|
|
52
63
|
}
|
|
53
64
|
}
|
|
54
65
|
}
|
package/dist/router.d.ts
CHANGED
|
@@ -11,5 +11,10 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import type { Router } from "./types/router";
|
|
13
13
|
export type { Handler, MiddlewareHandler, RouteParams } from "./types/router";
|
|
14
|
+
/**
|
|
15
|
+
* Create a Worker router with exact-path and `:param` matching.
|
|
16
|
+
* Last registered route for a method+path wins. Unmatched methods on a
|
|
17
|
+
* known path return 405; unknown paths return 404.
|
|
18
|
+
*/
|
|
14
19
|
export declare function createRouter<TEnv = unknown>(): Router<TEnv>;
|
|
15
20
|
//# sourceMappingURL=router.d.ts.map
|
package/dist/router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AAEH,OAAO,KAAK,EAKV,MAAM,EACP,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9E,wBAAgB,YAAY,CAAC,IAAI,GAAG,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,CA6M3D"}
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AAEH,OAAO,KAAK,EAKV,MAAM,EACP,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE9E;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAG,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,CA6M3D"}
|
package/dist/schemas/index.js
CHANGED
|
@@ -260,7 +260,10 @@ var manifests = {
|
|
|
260
260
|
INTERNAL_KEY_BINDING: {
|
|
261
261
|
type: "secret",
|
|
262
262
|
description: "Inter-worker auth key"
|
|
263
|
-
}
|
|
263
|
+
},
|
|
264
|
+
OPENAI_API_KEY: { type: "secret", description: "OpenAI API key" },
|
|
265
|
+
ANTHROPIC_API_KEY: { type: "secret", description: "Anthropic API key" },
|
|
266
|
+
GOOGLE_API_KEY: { type: "secret", description: "Google AI API key" }
|
|
264
267
|
},
|
|
265
268
|
services: [
|
|
266
269
|
{
|
|
@@ -478,12 +481,15 @@ function getWorkerDefaultEnabled(name) {
|
|
|
478
481
|
}
|
|
479
482
|
// src/schemas/validators.ts
|
|
480
483
|
import { parse } from "jsonc-parser";
|
|
484
|
+
function parseJsoncDocument(content) {
|
|
485
|
+
const errors = [];
|
|
486
|
+
const value = parse(content, errors, { allowTrailingComma: true });
|
|
487
|
+
return { value, errors };
|
|
488
|
+
}
|
|
481
489
|
function validateWranglerJsonc(workerName, manifest, jsoncContent) {
|
|
482
490
|
const errors = [];
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
parsed = parse(jsoncContent);
|
|
486
|
-
} catch {
|
|
491
|
+
const { value: parsed, errors: parseErrors } = parseJsoncDocument(jsoncContent);
|
|
492
|
+
if (parseErrors.length > 0) {
|
|
487
493
|
errors.push({
|
|
488
494
|
worker: workerName,
|
|
489
495
|
severity: "error",
|
|
@@ -514,7 +520,7 @@ function validateWranglerJsonc(workerName, manifest, jsoncContent) {
|
|
|
514
520
|
}
|
|
515
521
|
}
|
|
516
522
|
for (const [name, def] of Object.entries(manifest.vars)) {
|
|
517
|
-
if (def.type === "secret" && !name.endsWith("_BINDING") && !name.endsWith("_SECRET") && !name.startsWith("CLOUDFLARE_") && name !== "TELEGRAM_SECRET_TOKEN" && name !== "TELEGRAM_ALLOWED_CHAT_IDS" && name !== "AUTHORIZED_CHAT_IDS" && name !== "MAILGUN_API_KEY" && name !== "EMAIL_SCAN_SUBJECT" && name !== "DASHBOARD_USER" && name !== "DASHBOARD_PASS" && name !== "SESSION_SECRET" && name !== "AGENT_INTERNAL_KEY") {
|
|
523
|
+
if (def.type === "secret" && !name.endsWith("_BINDING") && !name.endsWith("_SECRET") && !name.startsWith("CLOUDFLARE_") && name !== "TELEGRAM_SECRET_TOKEN" && name !== "TELEGRAM_ALLOWED_CHAT_IDS" && name !== "AUTHORIZED_CHAT_IDS" && name !== "MAILGUN_API_KEY" && name !== "EMAIL_SCAN_SUBJECT" && name !== "DASHBOARD_USER" && name !== "DASHBOARD_PASS" && name !== "SESSION_SECRET" && name !== "AGENT_INTERNAL_KEY" && name !== "OPENAI_API_KEY" && name !== "ANTHROPIC_API_KEY" && name !== "GOOGLE_API_KEY") {
|
|
518
524
|
errors.push({
|
|
519
525
|
worker: workerName,
|
|
520
526
|
severity: "warning",
|
|
@@ -560,10 +566,8 @@ function validateWranglerJsonc(workerName, manifest, jsoncContent) {
|
|
|
560
566
|
}
|
|
561
567
|
function validateRootSecrets(workerName, manifest, rootJsoncContent) {
|
|
562
568
|
const errors = [];
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
parsed = parse(rootJsoncContent);
|
|
566
|
-
} catch {
|
|
569
|
+
const { value: parsed, errors: parseErrors } = parseJsoncDocument(rootJsoncContent);
|
|
570
|
+
if (parseErrors.length > 0) {
|
|
567
571
|
errors.push({
|
|
568
572
|
worker: workerName,
|
|
569
573
|
severity: "error",
|
|
@@ -621,6 +625,11 @@ function validateDevVars(workerName, manifest, devVarsContent) {
|
|
|
621
625
|
}
|
|
622
626
|
return errors;
|
|
623
627
|
}
|
|
628
|
+
function queueProducerBinding(queue) {
|
|
629
|
+
if (queue === "trade-execution")
|
|
630
|
+
return "TRADE_QUEUE";
|
|
631
|
+
return queue.replace(/[^A-Za-z0-9]+/g, "_").toUpperCase();
|
|
632
|
+
}
|
|
624
633
|
function generateWranglerJsonc(manifest) {
|
|
625
634
|
const parts = [];
|
|
626
635
|
parts.push(`{`);
|
|
@@ -687,21 +696,29 @@ function generateWranglerJsonc(manifest) {
|
|
|
687
696
|
parts.push(` ],`);
|
|
688
697
|
}
|
|
689
698
|
if (infra.queues) {
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
699
|
+
const producers = infra.queues.producer ?? [];
|
|
700
|
+
const consumers = infra.queues.consumer ?? [];
|
|
701
|
+
if (producers.length > 0 || consumers.length > 0) {
|
|
702
|
+
const queueParts = [];
|
|
703
|
+
if (producers.length > 0) {
|
|
704
|
+
queueParts.push(` "producers": [`);
|
|
705
|
+
for (const [i, q] of producers.entries()) {
|
|
706
|
+
const comma = i < producers.length - 1 ? "," : "";
|
|
707
|
+
queueParts.push(` { "queue": "${q}", "binding": "${queueProducerBinding(q)}" }${comma}`);
|
|
708
|
+
}
|
|
709
|
+
queueParts.push(consumers.length > 0 ? ` ],` : ` ]`);
|
|
695
710
|
}
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
711
|
+
if (consumers.length > 0) {
|
|
712
|
+
queueParts.push(` "consumers": [`);
|
|
713
|
+
for (const [i, q] of consumers.entries()) {
|
|
714
|
+
const comma = i < consumers.length - 1 ? "," : "";
|
|
715
|
+
queueParts.push(` { "queue": "${q}" }${comma}`);
|
|
716
|
+
}
|
|
717
|
+
queueParts.push(` ]`);
|
|
703
718
|
}
|
|
704
|
-
parts.push(`
|
|
719
|
+
parts.push(` "queues": {`);
|
|
720
|
+
parts.push(...queueParts);
|
|
721
|
+
parts.push(` },`);
|
|
705
722
|
}
|
|
706
723
|
}
|
|
707
724
|
if (infra.durableObjects && infra.durableObjects.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/schemas/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/schemas/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAwejD,qEAAqE;AACrE,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAA6B,CAAC;AAE7E,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAa,CAAC;AAE1E,gDAAgD;AAChD,eAAO,MAAM,YAAY,EAAE,MAAM,EAAkC,CAAC;AAEpE;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,gFAAgF;AAChF,eAAO,MAAM,cAAc,EAAE,kBAAkB,EAO7C,CAAC;AAEH,6EAA6E;AAC7E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAEzE"}
|
package/dist/schemas/registry.js
CHANGED
|
@@ -260,7 +260,10 @@ var manifests = {
|
|
|
260
260
|
INTERNAL_KEY_BINDING: {
|
|
261
261
|
type: "secret",
|
|
262
262
|
description: "Inter-worker auth key"
|
|
263
|
-
}
|
|
263
|
+
},
|
|
264
|
+
OPENAI_API_KEY: { type: "secret", description: "OpenAI API key" },
|
|
265
|
+
ANTHROPIC_API_KEY: { type: "secret", description: "Anthropic API key" },
|
|
266
|
+
GOOGLE_API_KEY: { type: "secret", description: "Google AI API key" }
|
|
264
267
|
},
|
|
265
268
|
services: [
|
|
266
269
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/schemas/validators.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/schemas/validators.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAsBlE;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,MAAM,GACnB,eAAe,EAAE,CAgHnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,gBAAgB,EAAE,MAAM,GACvB,eAAe,EAAE,CA0CnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,cAAc,EAAE,MAAM,GACrB,eAAe,EAAE,CA6BnB;AAUD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CA8ItE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAYhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE;IACL,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB,GACA;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAWhE"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// src/schemas/validators.ts
|
|
3
3
|
import { parse } from "jsonc-parser";
|
|
4
|
+
function parseJsoncDocument(content) {
|
|
5
|
+
const errors = [];
|
|
6
|
+
const value = parse(content, errors, { allowTrailingComma: true });
|
|
7
|
+
return { value, errors };
|
|
8
|
+
}
|
|
4
9
|
function validateWranglerJsonc(workerName, manifest, jsoncContent) {
|
|
5
10
|
const errors = [];
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
parsed = parse(jsoncContent);
|
|
9
|
-
} catch {
|
|
11
|
+
const { value: parsed, errors: parseErrors } = parseJsoncDocument(jsoncContent);
|
|
12
|
+
if (parseErrors.length > 0) {
|
|
10
13
|
errors.push({
|
|
11
14
|
worker: workerName,
|
|
12
15
|
severity: "error",
|
|
@@ -37,7 +40,7 @@ function validateWranglerJsonc(workerName, manifest, jsoncContent) {
|
|
|
37
40
|
}
|
|
38
41
|
}
|
|
39
42
|
for (const [name, def] of Object.entries(manifest.vars)) {
|
|
40
|
-
if (def.type === "secret" && !name.endsWith("_BINDING") && !name.endsWith("_SECRET") && !name.startsWith("CLOUDFLARE_") && name !== "TELEGRAM_SECRET_TOKEN" && name !== "TELEGRAM_ALLOWED_CHAT_IDS" && name !== "AUTHORIZED_CHAT_IDS" && name !== "MAILGUN_API_KEY" && name !== "EMAIL_SCAN_SUBJECT" && name !== "DASHBOARD_USER" && name !== "DASHBOARD_PASS" && name !== "SESSION_SECRET" && name !== "AGENT_INTERNAL_KEY") {
|
|
43
|
+
if (def.type === "secret" && !name.endsWith("_BINDING") && !name.endsWith("_SECRET") && !name.startsWith("CLOUDFLARE_") && name !== "TELEGRAM_SECRET_TOKEN" && name !== "TELEGRAM_ALLOWED_CHAT_IDS" && name !== "AUTHORIZED_CHAT_IDS" && name !== "MAILGUN_API_KEY" && name !== "EMAIL_SCAN_SUBJECT" && name !== "DASHBOARD_USER" && name !== "DASHBOARD_PASS" && name !== "SESSION_SECRET" && name !== "AGENT_INTERNAL_KEY" && name !== "OPENAI_API_KEY" && name !== "ANTHROPIC_API_KEY" && name !== "GOOGLE_API_KEY") {
|
|
41
44
|
errors.push({
|
|
42
45
|
worker: workerName,
|
|
43
46
|
severity: "warning",
|
|
@@ -83,10 +86,8 @@ function validateWranglerJsonc(workerName, manifest, jsoncContent) {
|
|
|
83
86
|
}
|
|
84
87
|
function validateRootSecrets(workerName, manifest, rootJsoncContent) {
|
|
85
88
|
const errors = [];
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
parsed = parse(rootJsoncContent);
|
|
89
|
-
} catch {
|
|
89
|
+
const { value: parsed, errors: parseErrors } = parseJsoncDocument(rootJsoncContent);
|
|
90
|
+
if (parseErrors.length > 0) {
|
|
90
91
|
errors.push({
|
|
91
92
|
worker: workerName,
|
|
92
93
|
severity: "error",
|
|
@@ -144,6 +145,11 @@ function validateDevVars(workerName, manifest, devVarsContent) {
|
|
|
144
145
|
}
|
|
145
146
|
return errors;
|
|
146
147
|
}
|
|
148
|
+
function queueProducerBinding(queue) {
|
|
149
|
+
if (queue === "trade-execution")
|
|
150
|
+
return "TRADE_QUEUE";
|
|
151
|
+
return queue.replace(/[^A-Za-z0-9]+/g, "_").toUpperCase();
|
|
152
|
+
}
|
|
147
153
|
function generateWranglerJsonc(manifest) {
|
|
148
154
|
const parts = [];
|
|
149
155
|
parts.push(`{`);
|
|
@@ -210,21 +216,29 @@ function generateWranglerJsonc(manifest) {
|
|
|
210
216
|
parts.push(` ],`);
|
|
211
217
|
}
|
|
212
218
|
if (infra.queues) {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
219
|
+
const producers = infra.queues.producer ?? [];
|
|
220
|
+
const consumers = infra.queues.consumer ?? [];
|
|
221
|
+
if (producers.length > 0 || consumers.length > 0) {
|
|
222
|
+
const queueParts = [];
|
|
223
|
+
if (producers.length > 0) {
|
|
224
|
+
queueParts.push(` "producers": [`);
|
|
225
|
+
for (const [i, q] of producers.entries()) {
|
|
226
|
+
const comma = i < producers.length - 1 ? "," : "";
|
|
227
|
+
queueParts.push(` { "queue": "${q}", "binding": "${queueProducerBinding(q)}" }${comma}`);
|
|
228
|
+
}
|
|
229
|
+
queueParts.push(consumers.length > 0 ? ` ],` : ` ]`);
|
|
218
230
|
}
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
231
|
+
if (consumers.length > 0) {
|
|
232
|
+
queueParts.push(` "consumers": [`);
|
|
233
|
+
for (const [i, q] of consumers.entries()) {
|
|
234
|
+
const comma = i < consumers.length - 1 ? "," : "";
|
|
235
|
+
queueParts.push(` { "queue": "${q}" }${comma}`);
|
|
236
|
+
}
|
|
237
|
+
queueParts.push(` ]`);
|
|
226
238
|
}
|
|
227
|
-
parts.push(`
|
|
239
|
+
parts.push(` "queues": {`);
|
|
240
|
+
parts.push(...queueParts);
|
|
241
|
+
parts.push(` },`);
|
|
228
242
|
}
|
|
229
243
|
}
|
|
230
244
|
if (infra.durableObjects && infra.durableObjects.length > 0) {
|
|
@@ -70,6 +70,10 @@ export declare function authenticatedServiceFetch<E extends AuthenticatedService
|
|
|
70
70
|
/** Ordered env fields to try when internalKey is not set */
|
|
71
71
|
internalKeyFields?: InternalAuthKeyName;
|
|
72
72
|
}): Promise<Response>;
|
|
73
|
+
/**
|
|
74
|
+
* Unauthenticated service-binding fetch. Callers that need mesh auth must
|
|
75
|
+
* use {@link authenticatedServiceFetch}, which injects `X-Internal-Auth-Key`.
|
|
76
|
+
*/
|
|
73
77
|
export declare function serviceFetch(binding: ServiceBinding, path: string, body?: unknown, options?: {
|
|
74
78
|
method?: string;
|
|
75
79
|
headers?: Record<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-bindings.d.ts","sourceRoot":"","sources":["../src/service-bindings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAmB,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE9E,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACzE;AAED,uDAAuD;AACvD,eAAO,MAAM,qBAAqB;;;;;;;;;IAShC,sDAAsD;;;;CAI9C,CAAC;AAEX,iFAAiF;AACjF,eAAO,MAAM,uBAAuB,0DAG1B,CAAC;AAEX,kFAAkF;AAClF,eAAO,MAAM,wBAAwB,2DAG3B,CAAC;AAEX,2EAA2E;AAC3E,eAAO,MAAM,6BAA6B,sFAIhC,CAAC;AAEX,sFAAsF;AACtF,eAAO,MAAM,0BAA0B,6DAG7B,CAAC;AAEX,oDAAoD;AACpD,eAAO,MAAM,8BAA8B,oEAGjC,CAAC;AAEX,4CAA4C;AAC5C,eAAO,MAAM,8BAA8B,iEAGjC,CAAC;AAEX,wEAAwE;AACxE,eAAO,MAAM,iCAAiC,6EAIpC,CAAC;AAEX,8CAA8C;AAC9C,eAAO,MAAM,uCAAuC,sFAI1C,CAAC;AAEX,gDAAgD;AAChD,eAAO,MAAM,wCAAwC,6FAI3C,CAAC;AAEX,0DAA0D;AAC1D,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,mBAAmB,GAC7B,MAAM,GAAG,SAAS,CAEpB;AAED,MAAM,WAAW,uBAAuB;IACtC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,uBAAuB,EACzE,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,mBAAmB,CAAC;CACzC,GACA,OAAO,CAAC,QAAQ,CAAC,CAsBnB;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC,QAAQ,CAAC,CAWnB"}
|
|
1
|
+
{"version":3,"file":"service-bindings.d.ts","sourceRoot":"","sources":["../src/service-bindings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAmB,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE9E,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACzE;AAED,uDAAuD;AACvD,eAAO,MAAM,qBAAqB;;;;;;;;;IAShC,sDAAsD;;;;CAI9C,CAAC;AAEX,iFAAiF;AACjF,eAAO,MAAM,uBAAuB,0DAG1B,CAAC;AAEX,kFAAkF;AAClF,eAAO,MAAM,wBAAwB,2DAG3B,CAAC;AAEX,2EAA2E;AAC3E,eAAO,MAAM,6BAA6B,sFAIhC,CAAC;AAEX,sFAAsF;AACtF,eAAO,MAAM,0BAA0B,6DAG7B,CAAC;AAEX,oDAAoD;AACpD,eAAO,MAAM,8BAA8B,oEAGjC,CAAC;AAEX,4CAA4C;AAC5C,eAAO,MAAM,8BAA8B,iEAGjC,CAAC;AAEX,wEAAwE;AACxE,eAAO,MAAM,iCAAiC,6EAIpC,CAAC;AAEX,8CAA8C;AAC9C,eAAO,MAAM,uCAAuC,sFAI1C,CAAC;AAEX,gDAAgD;AAChD,eAAO,MAAM,wCAAwC,6FAI3C,CAAC;AAEX,0DAA0D;AAC1D,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,mBAAmB,GAC7B,MAAM,GAAG,SAAS,CAEpB;AAED,MAAM,WAAW,uBAAuB;IACtC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,uBAAuB,EACzE,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,mBAAmB,CAAC;CACzC,GACA,OAAO,CAAC,QAAQ,CAAC,CAsBnB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC,QAAQ,CAAC,CAWnB"}
|
package/dist/session.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright (c) 2026 HOOX · HOOX · jango-blockchained (hoox-sh)
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
|
-
import type
|
|
5
|
+
import { type ViewId } from "./types";
|
|
6
6
|
export interface SessionState {
|
|
7
7
|
/** Last active view ID (e.g. "dashboard", "workers") */
|
|
8
8
|
activeView: ViewId;
|
|
@@ -18,6 +18,11 @@ export interface SessionState {
|
|
|
18
18
|
/** ISO timestamp of when the session was saved */
|
|
19
19
|
savedAt: string;
|
|
20
20
|
}
|
|
21
|
+
/** Restore result: on-disk session plus whether a file was actually read. */
|
|
22
|
+
export type RestoredSession = SessionState & {
|
|
23
|
+
/** True when session.json existed and was parsed (even if fields fell back). */
|
|
24
|
+
fromDisk: boolean;
|
|
25
|
+
};
|
|
21
26
|
/**
|
|
22
27
|
* Persist the current UI state to $HOME/.hoox/.tui-state/session.json.
|
|
23
28
|
* Call this on app destroy / clean shutdown.
|
|
@@ -33,7 +38,9 @@ export declare function saveSession(activeView: ViewId, sidebarExpanded: boolean
|
|
|
33
38
|
* Restore the previous session state from $HOME/.hoox/.tui-state/session.json.
|
|
34
39
|
* Returns defaults if the file doesn't exist or can't be parsed.
|
|
35
40
|
*
|
|
36
|
-
* @returns The saved session state, or defaults
|
|
41
|
+
* @returns The saved session state, or defaults. `fromDisk` is false when
|
|
42
|
+
* no file existed or JSON was unreadable — callers may then apply
|
|
43
|
+
* `defaultView` from TUI preferences.
|
|
37
44
|
*/
|
|
38
|
-
export declare function restoreSession(): Promise<
|
|
45
|
+
export declare function restoreSession(): Promise<RestoredSession>;
|
|
39
46
|
//# sourceMappingURL=session.d.ts.map
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,EAAY,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAKhD,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,eAAe,EAAE,OAAO,CAAC;IACzB,+CAA+C;IAC/C,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,6EAA6E;AAC7E,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG;IAC3C,gFAAgF;IAChF,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAoDF;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,OAAO,EACxB,UAAU,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAC1C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAkBf;AAID;;;;;;;GAOG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CA+B/D"}
|