@hoox-sh/hoox-shared 1.4.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 +21 -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 +8 -25
- package/dist/d1/repository.js +3 -19
- 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.js +7 -23
- 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 +3 -19
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2211 -2098
- package/dist/kill-switch.js +12 -20
- package/dist/kvKeys.d.ts +8 -0
- package/dist/kvKeys.d.ts.map +1 -1
- package/dist/kvKeys.js +42 -46
- package/dist/kvUtils.js +8 -24
- package/dist/legal.js +5 -21
- package/dist/middleware/auth.js +9 -25
- package/dist/middleware/cors.js +4 -20
- package/dist/middleware/index.js +141 -163
- package/dist/middleware/logger.js +9 -25
- package/dist/middleware/rate-limit.js +2 -18
- package/dist/middleware/security-headers.js +2 -18
- package/dist/middleware/validate.js +5 -21
- package/dist/middleware/wait-until.js +2 -18
- package/dist/operator-transport.js +13 -17
- package/dist/path-utils.js +15 -31
- package/dist/queue-handler.js +0 -16
- package/dist/router.js +0 -16
- package/dist/schemas/index.js +35 -27
- package/dist/schemas/registry.d.ts.map +1 -1
- package/dist/schemas/registry.js +29 -20
- package/dist/schemas/validators.js +5 -21
- package/dist/service-bindings.js +13 -29
- 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 +16 -29
- 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 +4 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +10 -24
- package/dist/wizard/engine.d.ts.map +1 -1
- package/dist/wizard/engine.js +21 -21
- package/dist/wizard/index.d.ts +1 -0
- package/dist/wizard/index.d.ts.map +1 -1
- package/dist/wizard/index.js +36 -33
- 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 +10 -22
- 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/schemas/index.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/schemas/registry.ts
|
|
19
3
|
function deriveCalledBy(manifests) {
|
|
20
4
|
const calledBy = {};
|
|
@@ -121,6 +105,10 @@ var manifests = {
|
|
|
121
105
|
EXCHANGE_TESTNET_SECRET_BINDING: {
|
|
122
106
|
type: "secret",
|
|
123
107
|
description: "Optional unified testnet API secret"
|
|
108
|
+
},
|
|
109
|
+
WALLET_EXECUTE_KEY_BINDING: {
|
|
110
|
+
type: "secret",
|
|
111
|
+
description: "Mesh key for DEX swaps via web3-wallet-worker"
|
|
124
112
|
}
|
|
125
113
|
},
|
|
126
114
|
services: [
|
|
@@ -133,6 +121,11 @@ var manifests = {
|
|
|
133
121
|
binding: "TELEGRAM_SERVICE",
|
|
134
122
|
service: "telegram-worker",
|
|
135
123
|
description: "Notifications"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
binding: "WEB3_WALLET_SERVICE",
|
|
127
|
+
service: "web3-wallet-worker",
|
|
128
|
+
description: "DEX spot swaps (Uniswap / Jupiter)"
|
|
136
129
|
}
|
|
137
130
|
],
|
|
138
131
|
infrastructure: {
|
|
@@ -230,6 +223,22 @@ var manifests = {
|
|
|
230
223
|
WALLET_MNEMONIC_SECRET: {
|
|
231
224
|
type: "secret",
|
|
232
225
|
description: "Wallet mnemonic phrase"
|
|
226
|
+
},
|
|
227
|
+
WALLET_EXECUTE_KEY_BINDING: {
|
|
228
|
+
type: "secret",
|
|
229
|
+
description: "Mesh key for privileged wallet routes"
|
|
230
|
+
},
|
|
231
|
+
SOLANA_PRIVATE_KEY: {
|
|
232
|
+
type: "secret",
|
|
233
|
+
description: "Solana signing key (base58 seed or Phantom export)"
|
|
234
|
+
},
|
|
235
|
+
JUPITER_API_KEY: {
|
|
236
|
+
type: "secret",
|
|
237
|
+
description: "Jupiter Swap V2 API key"
|
|
238
|
+
},
|
|
239
|
+
RPC_URL_SOLANA: {
|
|
240
|
+
type: "plaintext",
|
|
241
|
+
description: "Solana JSON-RPC URL"
|
|
233
242
|
}
|
|
234
243
|
},
|
|
235
244
|
services: [
|
|
@@ -467,7 +476,6 @@ var WORKER_CATALOG = WORKER_NAMES.map((name) => {
|
|
|
467
476
|
function getWorkerDefaultEnabled(name) {
|
|
468
477
|
return manifests[name]?.defaultEnabled;
|
|
469
478
|
}
|
|
470
|
-
|
|
471
479
|
// src/schemas/validators.ts
|
|
472
480
|
import { parse } from "jsonc-parser";
|
|
473
481
|
function validateWranglerJsonc(workerName, manifest, jsoncContent) {
|
|
@@ -736,15 +744,15 @@ function validateAll(workerName, manifest, files) {
|
|
|
736
744
|
};
|
|
737
745
|
}
|
|
738
746
|
export {
|
|
739
|
-
|
|
740
|
-
validateRootSecrets,
|
|
741
|
-
validateDevVars,
|
|
742
|
-
validateAll,
|
|
743
|
-
getWorkerDefaultEnabled,
|
|
744
|
-
generateWranglerJsonc,
|
|
745
|
-
generateDevVars,
|
|
746
|
-
WORKER_NAMES,
|
|
747
|
-
WORKER_MANIFESTS,
|
|
747
|
+
CALLED_BY,
|
|
748
748
|
WORKER_CATALOG,
|
|
749
|
-
|
|
749
|
+
WORKER_MANIFESTS,
|
|
750
|
+
WORKER_NAMES,
|
|
751
|
+
generateDevVars,
|
|
752
|
+
generateWranglerJsonc,
|
|
753
|
+
getWorkerDefaultEnabled,
|
|
754
|
+
validateAll,
|
|
755
|
+
validateDevVars,
|
|
756
|
+
validateRootSecrets,
|
|
757
|
+
validateWranglerJsonc
|
|
750
758
|
};
|
|
@@ -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;AAqejD,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
|
@@ -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/schemas/registry.ts
|
|
19
3
|
function deriveCalledBy(manifests) {
|
|
20
4
|
const calledBy = {};
|
|
@@ -121,6 +105,10 @@ var manifests = {
|
|
|
121
105
|
EXCHANGE_TESTNET_SECRET_BINDING: {
|
|
122
106
|
type: "secret",
|
|
123
107
|
description: "Optional unified testnet API secret"
|
|
108
|
+
},
|
|
109
|
+
WALLET_EXECUTE_KEY_BINDING: {
|
|
110
|
+
type: "secret",
|
|
111
|
+
description: "Mesh key for DEX swaps via web3-wallet-worker"
|
|
124
112
|
}
|
|
125
113
|
},
|
|
126
114
|
services: [
|
|
@@ -133,6 +121,11 @@ var manifests = {
|
|
|
133
121
|
binding: "TELEGRAM_SERVICE",
|
|
134
122
|
service: "telegram-worker",
|
|
135
123
|
description: "Notifications"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
binding: "WEB3_WALLET_SERVICE",
|
|
127
|
+
service: "web3-wallet-worker",
|
|
128
|
+
description: "DEX spot swaps (Uniswap / Jupiter)"
|
|
136
129
|
}
|
|
137
130
|
],
|
|
138
131
|
infrastructure: {
|
|
@@ -230,6 +223,22 @@ var manifests = {
|
|
|
230
223
|
WALLET_MNEMONIC_SECRET: {
|
|
231
224
|
type: "secret",
|
|
232
225
|
description: "Wallet mnemonic phrase"
|
|
226
|
+
},
|
|
227
|
+
WALLET_EXECUTE_KEY_BINDING: {
|
|
228
|
+
type: "secret",
|
|
229
|
+
description: "Mesh key for privileged wallet routes"
|
|
230
|
+
},
|
|
231
|
+
SOLANA_PRIVATE_KEY: {
|
|
232
|
+
type: "secret",
|
|
233
|
+
description: "Solana signing key (base58 seed or Phantom export)"
|
|
234
|
+
},
|
|
235
|
+
JUPITER_API_KEY: {
|
|
236
|
+
type: "secret",
|
|
237
|
+
description: "Jupiter Swap V2 API key"
|
|
238
|
+
},
|
|
239
|
+
RPC_URL_SOLANA: {
|
|
240
|
+
type: "plaintext",
|
|
241
|
+
description: "Solana JSON-RPC URL"
|
|
233
242
|
}
|
|
234
243
|
},
|
|
235
244
|
services: [
|
|
@@ -468,9 +477,9 @@ function getWorkerDefaultEnabled(name) {
|
|
|
468
477
|
return manifests[name]?.defaultEnabled;
|
|
469
478
|
}
|
|
470
479
|
export {
|
|
471
|
-
|
|
472
|
-
WORKER_NAMES,
|
|
473
|
-
WORKER_MANIFESTS,
|
|
480
|
+
CALLED_BY,
|
|
474
481
|
WORKER_CATALOG,
|
|
475
|
-
|
|
482
|
+
WORKER_MANIFESTS,
|
|
483
|
+
WORKER_NAMES,
|
|
484
|
+
getWorkerDefaultEnabled
|
|
476
485
|
};
|
|
@@ -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/schemas/validators.ts
|
|
19
3
|
import { parse } from "jsonc-parser";
|
|
20
4
|
function validateWranglerJsonc(workerName, manifest, jsoncContent) {
|
|
@@ -283,10 +267,10 @@ function validateAll(workerName, manifest, files) {
|
|
|
283
267
|
};
|
|
284
268
|
}
|
|
285
269
|
export {
|
|
286
|
-
|
|
287
|
-
validateRootSecrets,
|
|
288
|
-
validateDevVars,
|
|
289
|
-
validateAll,
|
|
270
|
+
generateDevVars,
|
|
290
271
|
generateWranglerJsonc,
|
|
291
|
-
|
|
272
|
+
validateAll,
|
|
273
|
+
validateDevVars,
|
|
274
|
+
validateRootSecrets,
|
|
275
|
+
validateWranglerJsonc
|
|
292
276
|
};
|
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;
|
|
@@ -244,18 +228,18 @@ function serviceFetch(binding, path, body, options) {
|
|
|
244
228
|
});
|
|
245
229
|
}
|
|
246
230
|
export {
|
|
247
|
-
|
|
248
|
-
resolveInternalAuthKey,
|
|
249
|
-
authenticatedServiceFetch,
|
|
250
|
-
WALLET_EXECUTE_AUTH_KEY_FIELDS,
|
|
251
|
-
TRADE_READ_AUTH_KEY_FIELDS,
|
|
252
|
-
TRADE_EXECUTE_AUTH_KEY_FIELDS,
|
|
253
|
-
TELEGRAM_ALERT_AUTH_KEY_FIELDS,
|
|
254
|
-
ServiceAuthError,
|
|
255
|
-
InternalAuthKeyFields,
|
|
256
|
-
DASHBOARD_TRADE_EXECUTE_AUTH_KEY_FIELDS,
|
|
257
|
-
DASHBOARD_TELEGRAM_ALERT_AUTH_KEY_FIELDS,
|
|
258
|
-
DASHBOARD_D1_READ_AUTH_KEY_FIELDS,
|
|
231
|
+
D1_READ_AUTH_KEY_FIELDS,
|
|
259
232
|
D1_WRITE_AUTH_KEY_FIELDS,
|
|
260
|
-
|
|
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
|
|
261
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());
|
|
@@ -323,9 +310,9 @@ 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
|
};
|