@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.
Files changed (77) hide show
  1. package/README.md +6 -0
  2. package/dist/agent-config-fields.js +21 -29
  3. package/dist/analytics.d.ts +3 -4
  4. package/dist/analytics.d.ts.map +1 -1
  5. package/dist/analytics.js +56 -16
  6. package/dist/api-client.js +12 -21
  7. package/dist/colors.js +5 -21
  8. package/dist/config.js +11 -27
  9. package/dist/cron-handler.js +0 -16
  10. package/dist/d1/index.js +8 -25
  11. package/dist/d1/repository.js +3 -19
  12. package/dist/d1/schemas.js +4 -20
  13. package/dist/dashboard-manifest.d.ts +2 -1
  14. package/dist/dashboard-manifest.d.ts.map +1 -1
  15. package/dist/dashboard-manifest.js +37 -33
  16. package/dist/entitlements.d.ts +46 -0
  17. package/dist/entitlements.d.ts.map +1 -0
  18. package/dist/entitlements.js +15 -0
  19. package/dist/errors.js +7 -23
  20. package/dist/exchange-client.js +2 -18
  21. package/dist/exchanges/base-exchange-client.js +0 -16
  22. package/dist/exchanges/index.js +0 -16
  23. package/dist/format-time.js +2 -18
  24. package/dist/formatters.js +12 -28
  25. package/dist/health.js +3 -19
  26. package/dist/index.d.ts +5 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +2211 -2098
  29. package/dist/kill-switch.js +12 -20
  30. package/dist/kvKeys.d.ts +8 -0
  31. package/dist/kvKeys.d.ts.map +1 -1
  32. package/dist/kvKeys.js +42 -46
  33. package/dist/kvUtils.js +8 -24
  34. package/dist/legal.js +5 -21
  35. package/dist/middleware/auth.js +9 -25
  36. package/dist/middleware/cors.js +4 -20
  37. package/dist/middleware/index.js +141 -163
  38. package/dist/middleware/logger.js +9 -25
  39. package/dist/middleware/rate-limit.js +2 -18
  40. package/dist/middleware/security-headers.js +2 -18
  41. package/dist/middleware/validate.js +5 -21
  42. package/dist/middleware/wait-until.js +2 -18
  43. package/dist/operator-transport.js +13 -17
  44. package/dist/path-utils.js +15 -31
  45. package/dist/queue-handler.js +0 -16
  46. package/dist/router.js +0 -16
  47. package/dist/schemas/index.js +35 -27
  48. package/dist/schemas/registry.d.ts.map +1 -1
  49. package/dist/schemas/registry.js +29 -20
  50. package/dist/schemas/validators.js +5 -21
  51. package/dist/service-bindings.js +13 -29
  52. package/dist/session.js +2 -18
  53. package/dist/sse.js +10 -18
  54. package/dist/stores/config-store.js +8 -22
  55. package/dist/stores/service-store.js +16 -29
  56. package/dist/stores/ui-store.js +0 -16
  57. package/dist/tenant.d.ts +61 -0
  58. package/dist/tenant.d.ts.map +1 -0
  59. package/dist/tenant.js +56 -0
  60. package/dist/test-utils.js +11 -27
  61. package/dist/types.d.ts +4 -2
  62. package/dist/types.d.ts.map +1 -1
  63. package/dist/types.js +10 -24
  64. package/dist/wizard/engine.d.ts.map +1 -1
  65. package/dist/wizard/engine.js +21 -21
  66. package/dist/wizard/index.d.ts +1 -0
  67. package/dist/wizard/index.d.ts.map +1 -1
  68. package/dist/wizard/index.js +36 -33
  69. package/dist/wizard/persistence.d.ts +4 -0
  70. package/dist/wizard/persistence.d.ts.map +1 -1
  71. package/dist/wizard/persistence.js +7 -19
  72. package/dist/wizard/presets.d.ts.map +1 -1
  73. package/dist/wizard/presets.js +10 -22
  74. package/dist/wizard/types.d.ts +6 -0
  75. package/dist/wizard/types.d.ts.map +1 -1
  76. package/dist/wizard/types.js +5 -0
  77. package/package.json +7 -2
@@ -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
- validateWranglerJsonc,
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
- CALLED_BY
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;AA4cjD,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"}
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"}
@@ -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
- getWorkerDefaultEnabled,
472
- WORKER_NAMES,
473
- WORKER_MANIFESTS,
480
+ CALLED_BY,
474
481
  WORKER_CATALOG,
475
- CALLED_BY
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
- validateWranglerJsonc,
287
- validateRootSecrets,
288
- validateDevVars,
289
- validateAll,
270
+ generateDevVars,
290
271
  generateWranglerJsonc,
291
- generateDevVars
272
+ validateAll,
273
+ validateDevVars,
274
+ validateRootSecrets,
275
+ validateWranglerJsonc
292
276
  };
@@ -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
- serviceFetch,
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
- D1_READ_AUTH_KEY_FIELDS
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
- saveSession,
324
- restoreSession
307
+ restoreSession,
308
+ saveSession
325
309
  };
package/dist/sse.js CHANGED
@@ -1,19 +1,15 @@
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
- });
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
- 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);
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
- useConfigStore,
505
- getTuiPreferencesPath
490
+ getTuiPreferencesPath,
491
+ useConfigStore
506
492
  };
@@ -1,19 +1,15 @@
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
- });
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
- const { hooxFetch: hooxFetch2 } = await Promise.resolve().then(() => (init_api_client(), exports_api_client));
313
+ await Promise.resolve().then(() => init_api_client());
327
314
  try {
328
- const data = await hooxFetch2("/v1/workers");
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
- const { subscribeSSE: subscribeSSE2 } = await Promise.resolve().then(() => (init_sse(), exports_sse));
376
+ await Promise.resolve().then(() => init_sse());
390
377
  tradeStreamAbort?.();
391
378
  tradeStreamAbort = null;
392
379
  try {
393
- const sub = subscribeSSE2("/v1/trades/stream", (trade) => {
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
- const { subscribeSSE: subscribeSSE2 } = await Promise.resolve().then(() => (init_sse(), exports_sse));
399
+ await Promise.resolve().then(() => init_sse());
413
400
  logStreamAbort?.();
414
401
  logStreamAbort = null;
415
402
  try {
416
- const sub = subscribeSSE2("/v1/logs/stream", (log) => {
403
+ const sub = subscribeSSE("/v1/logs/stream", (log) => {
417
404
  get().pushLog(log);
418
405
  });
419
406
  const resolved = await Promise.resolve(sub);
@@ -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";
@@ -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
+ };
@@ -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
- createMockVectorizeIndex,
117
- createMockSecretsStore,
118
- createMockR2,
119
- createMockQueue,
120
- createMockKV,
121
- createMockFetcher,
122
- createMockExecutionContext,
123
- createMockEnv,
124
- createMockD1,
125
- createMockAnalyticsEngineDataset,
100
+ createMockAi,
126
101
  createMockAnalyticsEngine,
127
- createMockAi
102
+ createMockAnalyticsEngineDataset,
103
+ createMockD1,
104
+ createMockEnv,
105
+ createMockExecutionContext,
106
+ createMockFetcher,
107
+ createMockKV,
108
+ createMockQueue,
109
+ createMockR2,
110
+ createMockSecretsStore,
111
+ createMockVectorizeIndex
128
112
  };