@hoox-sh/hoox-shared 1.3.0 → 1.5.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/README.md +6 -0
- package/dist/agent-config-fields.js +23 -29
- package/dist/analytics.d.ts +3 -4
- package/dist/analytics.d.ts.map +1 -1
- package/dist/analytics.js +56 -16
- package/dist/api-client.js +12 -21
- package/dist/colors.js +5 -21
- package/dist/config.js +11 -27
- package/dist/cron-handler.js +0 -16
- package/dist/d1/index.js +12 -27
- package/dist/d1/repository.js +7 -21
- package/dist/d1/schemas.js +4 -20
- package/dist/dashboard-manifest.d.ts +2 -1
- package/dist/dashboard-manifest.d.ts.map +1 -1
- package/dist/dashboard-manifest.js +37 -33
- package/dist/entitlements.d.ts +46 -0
- package/dist/entitlements.d.ts.map +1 -0
- package/dist/entitlements.js +15 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +11 -25
- package/dist/exchange-client.js +2 -18
- package/dist/exchanges/base-exchange-client.js +0 -16
- package/dist/exchanges/index.js +0 -16
- package/dist/format-time.js +2 -18
- package/dist/formatters.js +12 -28
- package/dist/health.js +7 -21
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3895 -3653
- package/dist/kill-switch.js +14 -20
- package/dist/kvKeys.d.ts +11 -0
- package/dist/kvKeys.d.ts.map +1 -1
- package/dist/kvKeys.js +44 -45
- package/dist/kvUtils.d.ts +34 -1
- package/dist/kvUtils.d.ts.map +1 -1
- package/dist/kvUtils.js +60 -23
- package/dist/legal.js +5 -21
- package/dist/middleware/auth.d.ts +6 -3
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +27 -29
- package/dist/middleware/cors.js +4 -20
- package/dist/middleware/index.d.ts +3 -2
- package/dist/middleware/index.d.ts.map +1 -1
- package/dist/middleware/index.js +222 -164
- package/dist/middleware/logger.js +13 -27
- package/dist/middleware/rate-limit.js +2 -18
- package/dist/middleware/security-headers.js +2 -18
- package/dist/middleware/validate.d.ts +16 -0
- package/dist/middleware/validate.d.ts.map +1 -1
- package/dist/middleware/validate.js +39 -19
- package/dist/middleware/wait-until.d.ts +32 -0
- package/dist/middleware/wait-until.d.ts.map +1 -0
- package/dist/middleware/wait-until.js +30 -0
- package/dist/operator-transport.js +13 -17
- package/dist/path-utils.js +15 -31
- package/dist/queue-handler.d.ts +6 -0
- package/dist/queue-handler.d.ts.map +1 -1
- package/dist/queue-handler.js +51 -36
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +12 -18
- package/dist/schemas/index.d.ts +2 -1
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +91 -38
- package/dist/schemas/registry.d.ts +13 -0
- package/dist/schemas/registry.d.ts.map +1 -1
- package/dist/schemas/registry.js +82 -30
- package/dist/schemas/types.d.ts +5 -0
- package/dist/schemas/types.d.ts.map +1 -1
- package/dist/schemas/validators.d.ts.map +1 -1
- package/dist/schemas/validators.js +8 -22
- package/dist/service-bindings.js +31 -34
- package/dist/session.js +2 -18
- package/dist/sse.js +10 -18
- package/dist/stores/config-store.js +8 -22
- package/dist/stores/service-store.js +17 -30
- package/dist/stores/ui-store.js +0 -16
- package/dist/tenant.d.ts +61 -0
- package/dist/tenant.d.ts.map +1 -0
- package/dist/tenant.js +56 -0
- package/dist/test-utils.js +11 -27
- package/dist/types.d.ts +26 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +16 -26
- package/dist/wizard/engine.d.ts.map +1 -1
- package/dist/wizard/engine.js +39 -56
- package/dist/wizard/index.d.ts +1 -0
- package/dist/wizard/index.d.ts.map +1 -1
- package/dist/wizard/index.js +54 -68
- package/dist/wizard/persistence.d.ts +4 -0
- package/dist/wizard/persistence.d.ts.map +1 -1
- package/dist/wizard/persistence.js +7 -19
- package/dist/wizard/presets.d.ts.map +1 -1
- package/dist/wizard/presets.js +16 -54
- package/dist/wizard/types.d.ts +6 -0
- package/dist/wizard/types.d.ts.map +1 -1
- package/dist/wizard/types.js +5 -0
- package/package.json +7 -2
package/dist/service-bindings.js
CHANGED
|
@@ -1,20 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __returnValue = (v) => v;
|
|
4
|
-
function __exportSetter(name, newValue) {
|
|
5
|
-
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
-
}
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, {
|
|
10
|
-
get: all[name],
|
|
11
|
-
enumerable: true,
|
|
12
|
-
configurable: true,
|
|
13
|
-
set: __exportSetter.bind(all, name)
|
|
14
|
-
});
|
|
15
|
-
};
|
|
16
|
-
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
|
-
|
|
18
2
|
// src/middleware/auth.ts
|
|
19
3
|
function timingSafeEqual(a, b) {
|
|
20
4
|
const encoder = new TextEncoder;
|
|
@@ -23,12 +7,24 @@ function timingSafeEqual(a, b) {
|
|
|
23
7
|
const len = Math.max(aBuf.length, bBuf.length);
|
|
24
8
|
let result = aBuf.length === bBuf.length ? 0 : 1;
|
|
25
9
|
for (let i = 0;i < len; i++) {
|
|
26
|
-
const av =
|
|
27
|
-
const bv =
|
|
10
|
+
const av = aBuf[i] ?? 0;
|
|
11
|
+
const bv = bBuf[i] ?? 0;
|
|
28
12
|
result |= av ^ bv;
|
|
29
13
|
}
|
|
30
14
|
return result === 0;
|
|
31
15
|
}
|
|
16
|
+
async function timingSafeEqualAsync(a, b) {
|
|
17
|
+
const subtle = globalThis.crypto?.subtle;
|
|
18
|
+
if (!subtle || typeof subtle.digest !== "function" || typeof subtle.timingSafeEqual !== "function") {
|
|
19
|
+
return timingSafeEqual(a, b);
|
|
20
|
+
}
|
|
21
|
+
const encoder = new TextEncoder;
|
|
22
|
+
const [providedHash, expectedHash] = await Promise.all([
|
|
23
|
+
subtle.digest("SHA-256", encoder.encode(a)),
|
|
24
|
+
subtle.digest("SHA-256", encoder.encode(b))
|
|
25
|
+
]);
|
|
26
|
+
return subtle.timingSafeEqual(providedHash, expectedHash);
|
|
27
|
+
}
|
|
32
28
|
function resolveOperatorApiKey(env) {
|
|
33
29
|
const preferred = env.OPERATOR_API_KEY;
|
|
34
30
|
if (typeof preferred === "string" && preferred.length > 0) {
|
|
@@ -53,7 +49,7 @@ async function requireOperatorAuth(request, env) {
|
|
|
53
49
|
}
|
|
54
50
|
const authHeader = request.headers.get("Authorization");
|
|
55
51
|
const expectedHeader = `Bearer ${apiKey}`;
|
|
56
|
-
if (!authHeader || !
|
|
52
|
+
if (!authHeader || !await timingSafeEqualAsync(authHeader, expectedHeader)) {
|
|
57
53
|
return new Response(JSON.stringify({ error: "Unauthorized" }), {
|
|
58
54
|
status: 401,
|
|
59
55
|
headers: { "Content-Type": "application/json" }
|
|
@@ -86,12 +82,13 @@ function collectInternalAuthKeys(env, keyNames) {
|
|
|
86
82
|
return keys;
|
|
87
83
|
}
|
|
88
84
|
function matchesAnyInternalAuthKey(providedKey, expectedKeys) {
|
|
85
|
+
let matched = false;
|
|
89
86
|
for (const expected of expectedKeys) {
|
|
90
87
|
if (timingSafeEqual(providedKey, expected)) {
|
|
91
|
-
|
|
88
|
+
matched = true;
|
|
92
89
|
}
|
|
93
90
|
}
|
|
94
|
-
return
|
|
91
|
+
return matched;
|
|
95
92
|
}
|
|
96
93
|
function internalAuthNotConfiguredResponse(keyNames) {
|
|
97
94
|
const label = normalizeKeyNames(keyNames).join(" | ");
|
|
@@ -231,18 +228,18 @@ function serviceFetch(binding, path, body, options) {
|
|
|
231
228
|
});
|
|
232
229
|
}
|
|
233
230
|
export {
|
|
234
|
-
|
|
235
|
-
resolveInternalAuthKey,
|
|
236
|
-
authenticatedServiceFetch,
|
|
237
|
-
WALLET_EXECUTE_AUTH_KEY_FIELDS,
|
|
238
|
-
TRADE_READ_AUTH_KEY_FIELDS,
|
|
239
|
-
TRADE_EXECUTE_AUTH_KEY_FIELDS,
|
|
240
|
-
TELEGRAM_ALERT_AUTH_KEY_FIELDS,
|
|
241
|
-
ServiceAuthError,
|
|
242
|
-
InternalAuthKeyFields,
|
|
243
|
-
DASHBOARD_TRADE_EXECUTE_AUTH_KEY_FIELDS,
|
|
244
|
-
DASHBOARD_TELEGRAM_ALERT_AUTH_KEY_FIELDS,
|
|
245
|
-
DASHBOARD_D1_READ_AUTH_KEY_FIELDS,
|
|
231
|
+
D1_READ_AUTH_KEY_FIELDS,
|
|
246
232
|
D1_WRITE_AUTH_KEY_FIELDS,
|
|
247
|
-
|
|
233
|
+
DASHBOARD_D1_READ_AUTH_KEY_FIELDS,
|
|
234
|
+
DASHBOARD_TELEGRAM_ALERT_AUTH_KEY_FIELDS,
|
|
235
|
+
DASHBOARD_TRADE_EXECUTE_AUTH_KEY_FIELDS,
|
|
236
|
+
InternalAuthKeyFields,
|
|
237
|
+
ServiceAuthError,
|
|
238
|
+
TELEGRAM_ALERT_AUTH_KEY_FIELDS,
|
|
239
|
+
TRADE_EXECUTE_AUTH_KEY_FIELDS,
|
|
240
|
+
TRADE_READ_AUTH_KEY_FIELDS,
|
|
241
|
+
WALLET_EXECUTE_AUTH_KEY_FIELDS,
|
|
242
|
+
authenticatedServiceFetch,
|
|
243
|
+
resolveInternalAuthKey,
|
|
244
|
+
serviceFetch
|
|
248
245
|
};
|
package/dist/session.js
CHANGED
|
@@ -1,20 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __returnValue = (v) => v;
|
|
4
|
-
function __exportSetter(name, newValue) {
|
|
5
|
-
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
-
}
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, {
|
|
10
|
-
get: all[name],
|
|
11
|
-
enumerable: true,
|
|
12
|
-
configurable: true,
|
|
13
|
-
set: __exportSetter.bind(all, name)
|
|
14
|
-
});
|
|
15
|
-
};
|
|
16
|
-
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
|
-
|
|
18
2
|
// src/path-utils.ts
|
|
19
3
|
import {
|
|
20
4
|
existsSync,
|
|
@@ -320,6 +304,6 @@ function validateViewId(id) {
|
|
|
320
304
|
return typeof id === "string" && VALID_VIEW_IDS.has(id);
|
|
321
305
|
}
|
|
322
306
|
export {
|
|
323
|
-
|
|
324
|
-
|
|
307
|
+
restoreSession,
|
|
308
|
+
saveSession
|
|
325
309
|
};
|
package/dist/sse.js
CHANGED
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
configurable: true,
|
|
13
|
-
set: __exportSetter.bind(all, name)
|
|
14
|
-
});
|
|
2
|
+
var __esm = (fn, res, err) => () => {
|
|
3
|
+
if (fn)
|
|
4
|
+
try {
|
|
5
|
+
res = fn(fn = 0);
|
|
6
|
+
} catch (e) {
|
|
7
|
+
err = [e];
|
|
8
|
+
}
|
|
9
|
+
if (err)
|
|
10
|
+
throw err[0];
|
|
11
|
+
return res;
|
|
15
12
|
};
|
|
16
|
-
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
13
|
|
|
18
14
|
// src/operator-transport.ts
|
|
19
15
|
function stripTrailingSlashes(url) {
|
|
@@ -83,10 +79,6 @@ var init_operator_transport = __esm(() => {
|
|
|
83
79
|
});
|
|
84
80
|
|
|
85
81
|
// src/sse.ts
|
|
86
|
-
var exports_sse = {};
|
|
87
|
-
__export(exports_sse, {
|
|
88
|
-
subscribeSSE: () => subscribeSSE
|
|
89
|
-
});
|
|
90
82
|
function subscribeSSE(path, callback, onStatus, options) {
|
|
91
83
|
let aborted = false;
|
|
92
84
|
const profile = options?.transport ?? (options?.transportEnv ? resolveOperatorTransportProfile(options.transportEnv) : resolveOperatorTransportProfile());
|
|
@@ -1,19 +1,10 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, {
|
|
10
|
-
get: all[name],
|
|
11
|
-
enumerable: true,
|
|
12
|
-
configurable: true,
|
|
13
|
-
set: __exportSetter.bind(all, name)
|
|
14
|
-
});
|
|
15
|
-
};
|
|
16
|
-
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
2
|
+
// src/stores/config-store.ts
|
|
3
|
+
import { create } from "zustand";
|
|
4
|
+
import { immer } from "zustand/middleware/immer";
|
|
5
|
+
import { persist, createJSONStorage } from "zustand/middleware";
|
|
6
|
+
import { chmodSync as chmodSync3, mkdirSync as mkdirSync3, existsSync as existsSync3, readFileSync as readFileSync3 } from "fs";
|
|
7
|
+
import { join as join3 } from "path";
|
|
17
8
|
|
|
18
9
|
// src/config.ts
|
|
19
10
|
import {
|
|
@@ -353,11 +344,6 @@ function getHooxStatePath() {
|
|
|
353
344
|
}
|
|
354
345
|
|
|
355
346
|
// src/stores/config-store.ts
|
|
356
|
-
import { create } from "zustand";
|
|
357
|
-
import { immer } from "zustand/middleware/immer";
|
|
358
|
-
import { persist, createJSONStorage } from "zustand/middleware";
|
|
359
|
-
import { chmodSync as chmodSync3, mkdirSync as mkdirSync3, existsSync as existsSync3, readFileSync as readFileSync3 } from "fs";
|
|
360
|
-
import { join as join3 } from "path";
|
|
361
347
|
function getTuiPreferencesPath() {
|
|
362
348
|
return join3(getHooxHome(), ".tui-state", "preferences.json");
|
|
363
349
|
}
|
|
@@ -501,6 +487,6 @@ var useConfigStore = create()(persist(immer((set) => ({
|
|
|
501
487
|
})
|
|
502
488
|
}));
|
|
503
489
|
export {
|
|
504
|
-
|
|
505
|
-
|
|
490
|
+
getTuiPreferencesPath,
|
|
491
|
+
useConfigStore
|
|
506
492
|
};
|
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
configurable: true,
|
|
13
|
-
set: __exportSetter.bind(all, name)
|
|
14
|
-
});
|
|
2
|
+
var __esm = (fn, res, err) => () => {
|
|
3
|
+
if (fn)
|
|
4
|
+
try {
|
|
5
|
+
res = fn(fn = 0);
|
|
6
|
+
} catch (e) {
|
|
7
|
+
err = [e];
|
|
8
|
+
}
|
|
9
|
+
if (err)
|
|
10
|
+
throw err[0];
|
|
11
|
+
return res;
|
|
15
12
|
};
|
|
16
|
-
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
13
|
|
|
18
14
|
// src/operator-transport.ts
|
|
19
15
|
function stripTrailingSlashes(url) {
|
|
@@ -83,11 +79,6 @@ var init_operator_transport = __esm(() => {
|
|
|
83
79
|
});
|
|
84
80
|
|
|
85
81
|
// src/api-client.ts
|
|
86
|
-
var exports_api_client = {};
|
|
87
|
-
__export(exports_api_client, {
|
|
88
|
-
hooxFetch: () => hooxFetch,
|
|
89
|
-
WorkerAPIError: () => WorkerAPIError
|
|
90
|
-
});
|
|
91
82
|
function isRetryableStatus(status) {
|
|
92
83
|
if (status === 401 || status === 403 || status === 429)
|
|
93
84
|
return false;
|
|
@@ -189,10 +180,6 @@ var init_api_client = __esm(() => {
|
|
|
189
180
|
});
|
|
190
181
|
|
|
191
182
|
// src/sse.ts
|
|
192
|
-
var exports_sse = {};
|
|
193
|
-
__export(exports_sse, {
|
|
194
|
-
subscribeSSE: () => subscribeSSE
|
|
195
|
-
});
|
|
196
183
|
function subscribeSSE(path, callback, onStatus, options) {
|
|
197
184
|
let aborted = false;
|
|
198
185
|
const profile = options?.transport ?? (options?.transportEnv ? resolveOperatorTransportProfile(options.transportEnv) : resolveOperatorTransportProfile());
|
|
@@ -317,15 +304,15 @@ function getBackoffDelay(retryCount) {
|
|
|
317
304
|
if (retryCount <= 0)
|
|
318
305
|
return 0;
|
|
319
306
|
const index = Math.min(retryCount - 1, BACKOFF_SEQUENCE.length - 1);
|
|
320
|
-
return BACKOFF_SEQUENCE[index];
|
|
307
|
+
return BACKOFF_SEQUENCE[index] ?? 0;
|
|
321
308
|
}
|
|
322
309
|
var useServiceStore = create()(immer((set, get) => ({
|
|
323
310
|
...initialState,
|
|
324
311
|
fetchWorkers: async () => {
|
|
325
312
|
const gen = ++fetchWorkersGeneration;
|
|
326
|
-
|
|
313
|
+
await Promise.resolve().then(() => init_api_client());
|
|
327
314
|
try {
|
|
328
|
-
const data = await
|
|
315
|
+
const data = await hooxFetch("/v1/workers");
|
|
329
316
|
if (gen !== fetchWorkersGeneration)
|
|
330
317
|
return;
|
|
331
318
|
clearReconnectTimer();
|
|
@@ -386,11 +373,11 @@ var useServiceStore = create()(immer((set, get) => ({
|
|
|
386
373
|
}
|
|
387
374
|
},
|
|
388
375
|
streamTrades: async () => {
|
|
389
|
-
|
|
376
|
+
await Promise.resolve().then(() => init_sse());
|
|
390
377
|
tradeStreamAbort?.();
|
|
391
378
|
tradeStreamAbort = null;
|
|
392
379
|
try {
|
|
393
|
-
const sub =
|
|
380
|
+
const sub = subscribeSSE("/v1/trades/stream", (trade) => {
|
|
394
381
|
get().pushTrade(trade);
|
|
395
382
|
});
|
|
396
383
|
const resolved = await Promise.resolve(sub);
|
|
@@ -409,11 +396,11 @@ var useServiceStore = create()(immer((set, get) => ({
|
|
|
409
396
|
}
|
|
410
397
|
},
|
|
411
398
|
streamLogs: async () => {
|
|
412
|
-
|
|
399
|
+
await Promise.resolve().then(() => init_sse());
|
|
413
400
|
logStreamAbort?.();
|
|
414
401
|
logStreamAbort = null;
|
|
415
402
|
try {
|
|
416
|
-
const sub =
|
|
403
|
+
const sub = subscribeSSE("/v1/logs/stream", (log) => {
|
|
417
404
|
get().pushLog(log);
|
|
418
405
|
});
|
|
419
406
|
const resolved = await Promise.resolve(sub);
|
package/dist/stores/ui-store.js
CHANGED
|
@@ -1,20 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __returnValue = (v) => v;
|
|
4
|
-
function __exportSetter(name, newValue) {
|
|
5
|
-
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
-
}
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, {
|
|
10
|
-
get: all[name],
|
|
11
|
-
enumerable: true,
|
|
12
|
-
configurable: true,
|
|
13
|
-
set: __exportSetter.bind(all, name)
|
|
14
|
-
});
|
|
15
|
-
};
|
|
16
|
-
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
|
-
|
|
18
2
|
// src/stores/ui-store.ts
|
|
19
3
|
import { create } from "zustand";
|
|
20
4
|
import { immer } from "zustand/middleware/immer";
|
package/dist/tenant.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 HOOX · jango-blockchained (hoox-sh)
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Opt-in tenant isolation for worker state.
|
|
7
|
+
*
|
|
8
|
+
* Self-hosted single-tenant deployments are unaffected: every helper below
|
|
9
|
+
* is a no-op unless `TENANT_MODE` is explicitly enabled (`"true"` / `"1"`).
|
|
10
|
+
* Setting `TENANT_ID` alone does NOT enable scoping — the flag is the switch.
|
|
11
|
+
*
|
|
12
|
+
* When enabled, `TENANT_ID` (required, `[A-Za-z0-9_-]{1,64}`) namespaces:
|
|
13
|
+
* - KV keys and Durable Object names via {@link scopeKey}
|
|
14
|
+
* - R2 object keys via {@link scopeR2Key} (`t-<id>/…`, R2-safe charset)
|
|
15
|
+
* - queue / service payloads via {@link withTenantId}
|
|
16
|
+
*
|
|
17
|
+
* Misconfiguration fails loudly: resolving a scope with the flag on and an
|
|
18
|
+
* invalid id throws. Message-carried ids (shared queue consumer) are
|
|
19
|
+
* validated leniently instead — untrusted input must never throw.
|
|
20
|
+
*/
|
|
21
|
+
import type { TenantContext } from "./types";
|
|
22
|
+
export interface TenantEnv {
|
|
23
|
+
TENANT_ID?: string;
|
|
24
|
+
TENANT_MODE?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface TenantScope {
|
|
27
|
+
enabled: boolean;
|
|
28
|
+
tenantId: string | null;
|
|
29
|
+
}
|
|
30
|
+
export declare function isTenantFlagOn(env: TenantEnv | undefined | null): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Resolve the tenant scope for an env. Throws when the flag is on but the
|
|
33
|
+
* id is missing/invalid (fail-closed platform deploys). Returns disabled
|
|
34
|
+
* without throwing when the flag is off (self-host default).
|
|
35
|
+
*/
|
|
36
|
+
export declare function tenantScope(env: TenantEnv | undefined | null): TenantScope;
|
|
37
|
+
/** True when tenant scoping is active (flag on + valid id). Never throws. */
|
|
38
|
+
export declare function isTenantMode(env: TenantEnv | undefined | null): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Effective tenant for a scope decision: the env tenant when the flag is on,
|
|
41
|
+
* otherwise a message-carried id (shared queue consumer path), else null.
|
|
42
|
+
* Lenient on message input — untrusted data never throws here.
|
|
43
|
+
*/
|
|
44
|
+
export declare function effectiveTenantId(env: TenantEnv | undefined | null, msg?: {
|
|
45
|
+
tenantId?: unknown;
|
|
46
|
+
}): string | null;
|
|
47
|
+
/** Namespace a KV key or DO name: `t/<id>/<key>` when scoped, else `key`. */
|
|
48
|
+
export declare function scopeKey(env: TenantEnv | undefined | null, key: string, msg?: {
|
|
49
|
+
tenantId?: unknown;
|
|
50
|
+
}): string;
|
|
51
|
+
/** Namespace an R2 object key: `t-<id>/<key>` (colon-free for key guards). */
|
|
52
|
+
export declare function scopeR2Key(env: TenantEnv | undefined | null, key: string, msg?: {
|
|
53
|
+
tenantId?: unknown;
|
|
54
|
+
}): string;
|
|
55
|
+
/** Attach `tenantId` to an outbound payload object when scoped. */
|
|
56
|
+
export declare function withTenantId<T extends object>(env: TenantEnv | undefined | null, obj: T): T & {
|
|
57
|
+
tenantId?: string;
|
|
58
|
+
};
|
|
59
|
+
/** Build the shared {@link TenantContext} when scoped, else null. */
|
|
60
|
+
export declare function tenantContextOf(env: TenantEnv | undefined | null): TenantContext | null;
|
|
61
|
+
//# sourceMappingURL=tenant.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.d.ts","sourceRoot":"","sources":["../src/tenant.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAID,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAGzE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,GAAG,WAAW,CAS1E;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAMvE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,EACjC,GAAG,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3B,MAAM,GAAG,IAAI,CAOf;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,CACtB,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,EACjC,GAAG,EAAE,MAAM,EACX,GAAG,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3B,MAAM,CAGR;AAED,8EAA8E;AAC9E,wBAAgB,UAAU,CACxB,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,EACjC,GAAG,EAAE,MAAM,EACX,GAAG,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3B,MAAM,CAGR;AAED,mEAAmE;AACnE,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,EAC3C,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,EACjC,GAAG,EAAE,CAAC,GACL,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAG3B;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAC7B,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,GAChC,aAAa,GAAG,IAAI,CAGtB"}
|
package/dist/tenant.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/tenant.ts
|
|
3
|
+
var TENANT_ID_RE = /^[A-Za-z0-9_-]{1,64}$/;
|
|
4
|
+
function isTenantFlagOn(env) {
|
|
5
|
+
const v = env?.TENANT_MODE;
|
|
6
|
+
return v === "true" || v === "1";
|
|
7
|
+
}
|
|
8
|
+
function tenantScope(env) {
|
|
9
|
+
if (!isTenantFlagOn(env))
|
|
10
|
+
return { enabled: false, tenantId: null };
|
|
11
|
+
const id = (env?.TENANT_ID ?? "").trim();
|
|
12
|
+
if (!id || !TENANT_ID_RE.test(id)) {
|
|
13
|
+
throw new Error("TENANT_MODE is enabled but TENANT_ID is missing or invalid (expected [A-Za-z0-9_-], 1-64 chars)");
|
|
14
|
+
}
|
|
15
|
+
return { enabled: true, tenantId: id };
|
|
16
|
+
}
|
|
17
|
+
function isTenantMode(env) {
|
|
18
|
+
try {
|
|
19
|
+
return tenantScope(env).enabled;
|
|
20
|
+
} catch {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function effectiveTenantId(env, msg) {
|
|
25
|
+
if (isTenantFlagOn(env)) {
|
|
26
|
+
return tenantScope(env).tenantId;
|
|
27
|
+
}
|
|
28
|
+
const m = typeof msg?.tenantId === "string" ? msg.tenantId.trim() : "";
|
|
29
|
+
return m && TENANT_ID_RE.test(m) ? m : null;
|
|
30
|
+
}
|
|
31
|
+
function scopeKey(env, key, msg) {
|
|
32
|
+
const id = effectiveTenantId(env, msg);
|
|
33
|
+
return id ? `t/${id}/${key}` : key;
|
|
34
|
+
}
|
|
35
|
+
function scopeR2Key(env, key, msg) {
|
|
36
|
+
const id = effectiveTenantId(env, msg);
|
|
37
|
+
return id ? `t-${id}/${key}` : key;
|
|
38
|
+
}
|
|
39
|
+
function withTenantId(env, obj) {
|
|
40
|
+
const ts = tenantScope(env);
|
|
41
|
+
return ts.enabled && ts.tenantId ? { ...obj, tenantId: ts.tenantId } : obj;
|
|
42
|
+
}
|
|
43
|
+
function tenantContextOf(env) {
|
|
44
|
+
const ts = tenantScope(env);
|
|
45
|
+
return ts.enabled && ts.tenantId ? { tenantId: ts.tenantId } : null;
|
|
46
|
+
}
|
|
47
|
+
export {
|
|
48
|
+
effectiveTenantId,
|
|
49
|
+
isTenantFlagOn,
|
|
50
|
+
isTenantMode,
|
|
51
|
+
scopeKey,
|
|
52
|
+
scopeR2Key,
|
|
53
|
+
tenantContextOf,
|
|
54
|
+
tenantScope,
|
|
55
|
+
withTenantId
|
|
56
|
+
};
|
package/dist/test-utils.js
CHANGED
|
@@ -1,20 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __returnValue = (v) => v;
|
|
4
|
-
function __exportSetter(name, newValue) {
|
|
5
|
-
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
-
}
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, {
|
|
10
|
-
get: all[name],
|
|
11
|
-
enumerable: true,
|
|
12
|
-
configurable: true,
|
|
13
|
-
set: __exportSetter.bind(all, name)
|
|
14
|
-
});
|
|
15
|
-
};
|
|
16
|
-
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
|
-
|
|
18
2
|
// src/test-utils.ts
|
|
19
3
|
function createMockKV(overrides) {
|
|
20
4
|
return {
|
|
@@ -113,16 +97,16 @@ function createMockEnv(overrides) {
|
|
|
113
97
|
return overrides;
|
|
114
98
|
}
|
|
115
99
|
export {
|
|
116
|
-
|
|
117
|
-
createMockSecretsStore,
|
|
118
|
-
createMockR2,
|
|
119
|
-
createMockQueue,
|
|
120
|
-
createMockKV,
|
|
121
|
-
createMockFetcher,
|
|
122
|
-
createMockExecutionContext,
|
|
123
|
-
createMockEnv,
|
|
124
|
-
createMockD1,
|
|
125
|
-
createMockAnalyticsEngineDataset,
|
|
100
|
+
createMockAi,
|
|
126
101
|
createMockAnalyticsEngine,
|
|
127
|
-
|
|
102
|
+
createMockAnalyticsEngineDataset,
|
|
103
|
+
createMockD1,
|
|
104
|
+
createMockEnv,
|
|
105
|
+
createMockExecutionContext,
|
|
106
|
+
createMockFetcher,
|
|
107
|
+
createMockKV,
|
|
108
|
+
createMockQueue,
|
|
109
|
+
createMockR2,
|
|
110
|
+
createMockSecretsStore,
|
|
111
|
+
createMockVectorizeIndex
|
|
128
112
|
};
|
package/dist/types.d.ts
CHANGED
|
@@ -9,6 +9,9 @@ export declare const TradeActionSchema: z.ZodEnum<{
|
|
|
9
9
|
CLOSE_LONG: "CLOSE_LONG";
|
|
10
10
|
CLOSE_SHORT: "CLOSE_SHORT";
|
|
11
11
|
}>;
|
|
12
|
+
/** Hard caps aligned with major CEX max leverage / sane notional guards. */
|
|
13
|
+
export declare const MAX_WEBHOOK_LEVERAGE = 125;
|
|
14
|
+
export declare const MAX_WEBHOOK_QUANTITY = 1000000;
|
|
12
15
|
export declare const WebhookPayloadSchema: z.ZodObject<{
|
|
13
16
|
exchange: z.ZodString;
|
|
14
17
|
action: z.ZodEnum<{
|
|
@@ -23,6 +26,7 @@ export declare const WebhookPayloadSchema: z.ZodObject<{
|
|
|
23
26
|
orderType: z.ZodOptional<z.ZodString>;
|
|
24
27
|
leverage: z.ZodOptional<z.ZodNumber>;
|
|
25
28
|
test: z.ZodOptional<z.ZodBoolean>;
|
|
29
|
+
tenantId: z.ZodOptional<z.ZodString>;
|
|
26
30
|
}, z.core.$strict>;
|
|
27
31
|
/** Validated trade queue payload (hoox producer → trade-worker consumer). */
|
|
28
32
|
export declare const TradeQueueMessageSchema: z.ZodObject<{
|
|
@@ -40,6 +44,7 @@ export declare const TradeQueueMessageSchema: z.ZodObject<{
|
|
|
40
44
|
leverage: z.ZodOptional<z.ZodNumber>;
|
|
41
45
|
test: z.ZodOptional<z.ZodBoolean>;
|
|
42
46
|
idempotencyKey: z.ZodOptional<z.ZodString>;
|
|
47
|
+
tenantId: z.ZodOptional<z.ZodString>;
|
|
43
48
|
queuedAt: z.ZodString;
|
|
44
49
|
}, z.core.$strict>;
|
|
45
50
|
export declare const TradeSignalSchema: z.ZodObject<{
|
|
@@ -56,10 +61,10 @@ export declare const TradeSignalSchema: z.ZodObject<{
|
|
|
56
61
|
quantity: z.ZodNumber;
|
|
57
62
|
leverage: z.ZodOptional<z.ZodNumber>;
|
|
58
63
|
status: z.ZodOptional<z.ZodEnum<{
|
|
59
|
-
skipped: "skipped";
|
|
60
|
-
failed: "failed";
|
|
61
64
|
pending: "pending";
|
|
62
65
|
executed: "executed";
|
|
66
|
+
failed: "failed";
|
|
67
|
+
skipped: "skipped";
|
|
63
68
|
}>>;
|
|
64
69
|
createdAt: z.ZodOptional<z.ZodString>;
|
|
65
70
|
executedAt: z.ZodOptional<z.ZodString>;
|
|
@@ -151,7 +156,15 @@ export interface WorkerConfigManifestLite {
|
|
|
151
156
|
new_sqlite_classes?: string[];
|
|
152
157
|
}[];
|
|
153
158
|
}
|
|
159
|
+
/** Per-service result from agent-worker `POST /agent/housekeeping`. */
|
|
154
160
|
export interface HousekeepingCheck {
|
|
161
|
+
service: string;
|
|
162
|
+
/** "ok" | "error" | "skipped" (and any future statuses). */
|
|
163
|
+
status: string;
|
|
164
|
+
detail: unknown;
|
|
165
|
+
}
|
|
166
|
+
/** @deprecated Prefer HousekeepingCheck; kept for older issue-list payloads. */
|
|
167
|
+
export interface HousekeepingIssue {
|
|
155
168
|
worker: string;
|
|
156
169
|
type: "error" | "warning" | "info";
|
|
157
170
|
message: string;
|
|
@@ -161,12 +174,19 @@ export interface HousekeepingSummary {
|
|
|
161
174
|
warnings: number;
|
|
162
175
|
info: number;
|
|
163
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* Housekeeping response from agent-worker.
|
|
179
|
+
* Current shape uses `checks`; `issues`/`summary`/worker counts are legacy.
|
|
180
|
+
*/
|
|
164
181
|
export interface HousekeepingPayload {
|
|
165
182
|
timestamp: string;
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
183
|
+
checks?: HousekeepingCheck[];
|
|
184
|
+
reconcile?: unknown;
|
|
185
|
+
/** @deprecated Legacy issue-list shape */
|
|
186
|
+
issues?: HousekeepingIssue[];
|
|
187
|
+
totalWorkers?: number;
|
|
188
|
+
checkedWorkers?: number;
|
|
189
|
+
summary?: HousekeepingSummary;
|
|
170
190
|
}
|
|
171
191
|
export interface SettingsPayload {
|
|
172
192
|
worker: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,iBAAiB;;;;;EAK5B,CAAC;AAEH,eAAO,MAAM,oBAAoB
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,iBAAiB;;;;;EAK5B,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,MAAM,CAAC;AACxC,eAAO,MAAM,oBAAoB,UAAY,CAAC;AAE9C,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;kBAqBtB,CAAC;AAEZ,6EAA6E;AAC7E,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;kBAwBzB,CAAC;AAEZ,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;kBAcnB,CAAC;AAEZ,eAAO,MAAM,cAAc;;;;;;;;;;;;;;kBAWhB,CAAC;AAEZ,eAAO,MAAM,aAAa;;;;;kBAOf,CAAC;AAIZ,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,CAAC,CAAC;CACT;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC;AAEtE,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,yBAAyB,EAAE,CAAA;KAAE,CAAC;IAC3D,qBAAqB,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACpD,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,eAAe,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC;IACxE,UAAU,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAAC;CAC/D;AAED,uEAAuE;AACvE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,gFAAgF;AAChF,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,mBAAmB,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CAClC;AAID;;;;;;;GAOG;AACH,MAAM,WAAW,GAAG;IAClB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,8CAA8C;IAC9C,SAAS,CAAC,EAAE,WAAW,CAAC;CACzB;AAED,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAI9E,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,YAAY,EAAE,CAAC;CAC5B;AAID;;;GAGG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,OAAO;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,CAAC,CAAC;CACZ;AAMD,0CAA0C;AAC1C,MAAM,MAAM,MAAM,GACd,WAAW,GACX,SAAS,GACT,eAAe,GACf,eAAe,GACf,aAAa,GACb,iBAAiB,GACjB,eAAe,GACf,cAAc,GACd,UAAU,GACV,aAAa,GACb,WAAW,GACX,gBAAgB,GAChB,UAAU,GACV,SAAS,GACT,eAAe,GACf,iBAAiB,CAAC;AAStB;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,OAAO;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,sCAAsC;AACtC,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAID,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,UAAU,GAAG,MAAM,CAAC;AAE/D;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,yDAAyD;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAID,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAID;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,gBAAgB,EAAE,MAAM,CAAC;IACzB,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;CACrB;AAID,iEAAiE;AACjE,MAAM,MAAM,gBAAgB,GAC1B,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,CAAC;AAIvD,iCAAiC;AACjC,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wCAAwC;AACxC,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAID;;;;;;GAMG;AACH,MAAM,MAAM,YAAY;AACtB,uEAAuE;AACrE,kBAAkB;AACpB,mDAAmD;GACjD,SAAS;AACX,qEAAqE;GACnE,SAAS;AACX,oDAAoD;GAClD,eAAe;AACjB,iEAAiE;GAC/D,aAAa,CAAC;AAElB;;;;;;;GAOG;AACH,MAAM,WAAW,eAAe;IAC9B,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;IACjB,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,SAAS,EAAE,YAAY,CAAC;IACxB,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|