@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.
Files changed (97) hide show
  1. package/README.md +6 -0
  2. package/dist/agent-config-fields.js +23 -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 +12 -27
  11. package/dist/d1/repository.js +7 -21
  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.d.ts.map +1 -1
  20. package/dist/errors.js +11 -25
  21. package/dist/exchange-client.js +2 -18
  22. package/dist/exchanges/base-exchange-client.js +0 -16
  23. package/dist/exchanges/index.js +0 -16
  24. package/dist/format-time.js +2 -18
  25. package/dist/formatters.js +12 -28
  26. package/dist/health.js +7 -21
  27. package/dist/index.d.ts +8 -4
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +3895 -3653
  30. package/dist/kill-switch.js +14 -20
  31. package/dist/kvKeys.d.ts +11 -0
  32. package/dist/kvKeys.d.ts.map +1 -1
  33. package/dist/kvKeys.js +44 -45
  34. package/dist/kvUtils.d.ts +34 -1
  35. package/dist/kvUtils.d.ts.map +1 -1
  36. package/dist/kvUtils.js +60 -23
  37. package/dist/legal.js +5 -21
  38. package/dist/middleware/auth.d.ts +6 -3
  39. package/dist/middleware/auth.d.ts.map +1 -1
  40. package/dist/middleware/auth.js +27 -29
  41. package/dist/middleware/cors.js +4 -20
  42. package/dist/middleware/index.d.ts +3 -2
  43. package/dist/middleware/index.d.ts.map +1 -1
  44. package/dist/middleware/index.js +222 -164
  45. package/dist/middleware/logger.js +13 -27
  46. package/dist/middleware/rate-limit.js +2 -18
  47. package/dist/middleware/security-headers.js +2 -18
  48. package/dist/middleware/validate.d.ts +16 -0
  49. package/dist/middleware/validate.d.ts.map +1 -1
  50. package/dist/middleware/validate.js +39 -19
  51. package/dist/middleware/wait-until.d.ts +32 -0
  52. package/dist/middleware/wait-until.d.ts.map +1 -0
  53. package/dist/middleware/wait-until.js +30 -0
  54. package/dist/operator-transport.js +13 -17
  55. package/dist/path-utils.js +15 -31
  56. package/dist/queue-handler.d.ts +6 -0
  57. package/dist/queue-handler.d.ts.map +1 -1
  58. package/dist/queue-handler.js +51 -36
  59. package/dist/router.d.ts.map +1 -1
  60. package/dist/router.js +12 -18
  61. package/dist/schemas/index.d.ts +2 -1
  62. package/dist/schemas/index.d.ts.map +1 -1
  63. package/dist/schemas/index.js +91 -38
  64. package/dist/schemas/registry.d.ts +13 -0
  65. package/dist/schemas/registry.d.ts.map +1 -1
  66. package/dist/schemas/registry.js +82 -30
  67. package/dist/schemas/types.d.ts +5 -0
  68. package/dist/schemas/types.d.ts.map +1 -1
  69. package/dist/schemas/validators.d.ts.map +1 -1
  70. package/dist/schemas/validators.js +8 -22
  71. package/dist/service-bindings.js +31 -34
  72. package/dist/session.js +2 -18
  73. package/dist/sse.js +10 -18
  74. package/dist/stores/config-store.js +8 -22
  75. package/dist/stores/service-store.js +17 -30
  76. package/dist/stores/ui-store.js +0 -16
  77. package/dist/tenant.d.ts +61 -0
  78. package/dist/tenant.d.ts.map +1 -0
  79. package/dist/tenant.js +56 -0
  80. package/dist/test-utils.js +11 -27
  81. package/dist/types.d.ts +26 -6
  82. package/dist/types.d.ts.map +1 -1
  83. package/dist/types.js +16 -26
  84. package/dist/wizard/engine.d.ts.map +1 -1
  85. package/dist/wizard/engine.js +39 -56
  86. package/dist/wizard/index.d.ts +1 -0
  87. package/dist/wizard/index.d.ts.map +1 -1
  88. package/dist/wizard/index.js +54 -68
  89. package/dist/wizard/persistence.d.ts +4 -0
  90. package/dist/wizard/persistence.d.ts.map +1 -1
  91. package/dist/wizard/persistence.js +7 -19
  92. package/dist/wizard/presets.d.ts.map +1 -1
  93. package/dist/wizard/presets.js +16 -54
  94. package/dist/wizard/types.d.ts +6 -0
  95. package/dist/wizard/types.d.ts.map +1 -1
  96. package/dist/wizard/types.js +5 -0
  97. 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 = {};
@@ -22,9 +6,12 @@ function deriveCalledBy(manifests) {
22
6
  if (!calledBy[workerName])
23
7
  calledBy[workerName] = new Set;
24
8
  for (const svc of manifest.services) {
25
- if (!calledBy[svc.service])
26
- calledBy[svc.service] = new Set;
27
- calledBy[svc.service].add(workerName);
9
+ let callers = calledBy[svc.service];
10
+ if (!callers) {
11
+ callers = new Set;
12
+ calledBy[svc.service] = callers;
13
+ }
14
+ callers.add(workerName);
28
15
  }
29
16
  }
30
17
  const result = {};
@@ -37,6 +24,7 @@ var manifests = {
37
24
  hoox: {
38
25
  name: "hoox",
39
26
  path: "workers/hoox-worker",
27
+ defaultEnabled: true,
40
28
  vars: {
41
29
  WEBHOOK_API_KEY_BINDING: {
42
30
  type: "secret",
@@ -46,7 +34,11 @@ var manifests = {
46
34
  type: "secret",
47
35
  description: "Inter-worker auth key"
48
36
  },
49
- HA_TOKEN_BINDING: { type: "secret", description: "Home Assistant token" }
37
+ HA_TOKEN_BINDING: { type: "secret", description: "Home Assistant token" },
38
+ TELEGRAM_ALLOWED_CHAT_IDS: {
39
+ type: "secret",
40
+ description: "Comma-separated chat IDs for webhook notify (fail-closed when unset); alias AUTHORIZED_CHAT_IDS"
41
+ }
50
42
  },
51
43
  services: [
52
44
  {
@@ -72,7 +64,8 @@ var manifests = {
72
64
  ai: true,
73
65
  queues: { producer: ["trade-execution"] },
74
66
  durableObjects: [
75
- { name: "IDEMPOTENCY_STORE", className: "IdempotencyStore" }
67
+ { name: "IDEMPOTENCY_STORE", className: "IdempotencyStore" },
68
+ { name: "RATE_LIMITER", className: "RateLimiterStore" }
76
69
  ]
77
70
  },
78
71
  middleware: [
@@ -87,6 +80,7 @@ var manifests = {
87
80
  "trade-worker": {
88
81
  name: "trade-worker",
89
82
  path: "workers/trade-worker",
83
+ defaultEnabled: true,
90
84
  vars: {
91
85
  INTERNAL_KEY_BINDING: {
92
86
  type: "secret",
@@ -96,15 +90,26 @@ var manifests = {
96
90
  type: "secret",
97
91
  description: "Telegram outbound auth"
98
92
  },
99
- BINANCE_KEY_BINDING: { type: "secret", description: "Binance API key" },
100
- BINANCE_SECRET_BINDING: {
93
+ EXCHANGE_KEY_BINDING: {
101
94
  type: "secret",
102
- description: "Binance API secret"
95
+ description: "Unified exchange API key (Binance / Bybit / MEXC)"
103
96
  },
104
- MEXC_KEY_BINDING: { type: "secret", description: "MEXC API key" },
105
- MEXC_SECRET_BINDING: { type: "secret", description: "MEXC API secret" },
106
- BYBIT_KEY_BINDING: { type: "secret", description: "Bybit API key" },
107
- BYBIT_SECRET_BINDING: { type: "secret", description: "Bybit API secret" }
97
+ EXCHANGE_SECRET_BINDING: {
98
+ type: "secret",
99
+ description: "Unified exchange API secret"
100
+ },
101
+ EXCHANGE_TESTNET_KEY_BINDING: {
102
+ type: "secret",
103
+ description: "Optional unified testnet API key"
104
+ },
105
+ EXCHANGE_TESTNET_SECRET_BINDING: {
106
+ type: "secret",
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"
112
+ }
108
113
  },
109
114
  services: [
110
115
  {
@@ -116,6 +121,11 @@ var manifests = {
116
121
  binding: "TELEGRAM_SERVICE",
117
122
  service: "telegram-worker",
118
123
  description: "Notifications"
124
+ },
125
+ {
126
+ binding: "WEB3_WALLET_SERVICE",
127
+ service: "web3-wallet-worker",
128
+ description: "DEX spot swaps (Uniswap / Jupiter)"
119
129
  }
120
130
  ],
121
131
  infrastructure: {
@@ -146,6 +156,7 @@ var manifests = {
146
156
  "telegram-worker": {
147
157
  name: "telegram-worker",
148
158
  path: "workers/telegram-worker",
159
+ defaultEnabled: true,
149
160
  vars: {
150
161
  INTERNAL_KEY_BINDING: {
151
162
  type: "secret",
@@ -159,6 +170,10 @@ var manifests = {
159
170
  TELEGRAM_SECRET_TOKEN: {
160
171
  type: "secret",
161
172
  description: "Webhook verification token"
173
+ },
174
+ AUTHORIZED_CHAT_IDS: {
175
+ type: "secret",
176
+ description: "Comma-separated chat IDs; inbound webhook fail-closed when unset; outbound /alert allowlist"
162
177
  }
163
178
  },
164
179
  services: [],
@@ -179,6 +194,7 @@ var manifests = {
179
194
  "d1-worker": {
180
195
  name: "d1-worker",
181
196
  path: "workers/d1-worker",
197
+ defaultEnabled: true,
182
198
  vars: {
183
199
  INTERNAL_KEY_BINDING: {
184
200
  type: "secret",
@@ -201,11 +217,28 @@ var manifests = {
201
217
  "web3-wallet-worker": {
202
218
  name: "web3-wallet-worker",
203
219
  path: "workers/web3-wallet-worker",
220
+ defaultEnabled: false,
204
221
  vars: {
205
222
  WALLET_PK_SECRET: { type: "secret", description: "Wallet private key" },
206
223
  WALLET_MNEMONIC_SECRET: {
207
224
  type: "secret",
208
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"
209
242
  }
210
243
  },
211
244
  services: [
@@ -221,6 +254,7 @@ var manifests = {
221
254
  "agent-worker": {
222
255
  name: "agent-worker",
223
256
  path: "workers/agent-worker",
257
+ defaultEnabled: true,
224
258
  vars: {
225
259
  AGENT_INTERNAL_KEY: { type: "secret", description: "Agent worker auth" },
226
260
  INTERNAL_KEY_BINDING: {
@@ -257,6 +291,7 @@ var manifests = {
257
291
  "email-worker": {
258
292
  name: "email-worker",
259
293
  path: "workers/email-worker",
294
+ defaultEnabled: false,
260
295
  vars: {
261
296
  INTERNAL_KEY_BINDING: {
262
297
  type: "secret",
@@ -294,6 +329,7 @@ var manifests = {
294
329
  "analytics-worker": {
295
330
  name: "analytics-worker",
296
331
  path: "workers/analytics-worker",
332
+ defaultEnabled: true,
297
333
  vars: {
298
334
  CLOUDFLARE_API_TOKEN: {
299
335
  type: "secret",
@@ -313,6 +349,7 @@ var manifests = {
313
349
  "report-worker": {
314
350
  name: "report-worker",
315
351
  path: "workers/report-worker",
352
+ defaultEnabled: false,
316
353
  vars: {
317
354
  CF_API_TOKEN_BINDING: {
318
355
  type: "secret",
@@ -347,6 +384,7 @@ var manifests = {
347
384
  "pyne-worker": {
348
385
  name: "pyne-worker",
349
386
  path: "workers/pyne-worker",
387
+ defaultEnabled: true,
350
388
  vars: {
351
389
  API_KEY: {
352
390
  type: "secret",
@@ -384,6 +422,7 @@ var manifests = {
384
422
  dashboard: {
385
423
  name: "dashboard",
386
424
  path: "workers/dashboard",
425
+ defaultEnabled: true,
387
426
  vars: {
388
427
  DASHBOARD_USER: {
389
428
  type: "secret",
@@ -426,7 +465,17 @@ var manifests = {
426
465
  var CALLED_BY = deriveCalledBy(manifests);
427
466
  var WORKER_MANIFESTS = manifests;
428
467
  var WORKER_NAMES = Object.keys(manifests).sort();
429
-
468
+ var WORKER_CATALOG = WORKER_NAMES.map((name) => {
469
+ const m = manifests[name];
470
+ return {
471
+ name: m.name,
472
+ path: m.path,
473
+ defaultEnabled: m.defaultEnabled
474
+ };
475
+ });
476
+ function getWorkerDefaultEnabled(name) {
477
+ return manifests[name]?.defaultEnabled;
478
+ }
430
479
  // src/schemas/validators.ts
431
480
  import { parse } from "jsonc-parser";
432
481
  function validateWranglerJsonc(workerName, manifest, jsoncContent) {
@@ -465,7 +514,7 @@ function validateWranglerJsonc(workerName, manifest, jsoncContent) {
465
514
  }
466
515
  }
467
516
  for (const [name, def] of Object.entries(manifest.vars)) {
468
- if (def.type === "secret" && !name.endsWith("_BINDING") && !name.endsWith("_SECRET") && !name.startsWith("CLOUDFLARE_") && name !== "TELEGRAM_SECRET_TOKEN" && name !== "MAILGUN_API_KEY" && name !== "EMAIL_SCAN_SUBJECT" && name !== "DASHBOARD_USER" && name !== "DASHBOARD_PASS" && name !== "SESSION_SECRET" && name !== "AGENT_INTERNAL_KEY") {
517
+ if (def.type === "secret" && !name.endsWith("_BINDING") && !name.endsWith("_SECRET") && !name.startsWith("CLOUDFLARE_") && name !== "TELEGRAM_SECRET_TOKEN" && name !== "TELEGRAM_ALLOWED_CHAT_IDS" && name !== "AUTHORIZED_CHAT_IDS" && name !== "MAILGUN_API_KEY" && name !== "EMAIL_SCAN_SUBJECT" && name !== "DASHBOARD_USER" && name !== "DASHBOARD_PASS" && name !== "SESSION_SECRET" && name !== "AGENT_INTERNAL_KEY") {
469
518
  errors.push({
470
519
  worker: workerName,
471
520
  severity: "warning",
@@ -582,6 +631,8 @@ function generateWranglerJsonc(manifest) {
582
631
  parts.push(` "vars": {`);
583
632
  for (const [i, name] of varKeys.entries()) {
584
633
  const def = manifest.vars[name];
634
+ if (!def)
635
+ continue;
585
636
  const comma = i < varKeys.length - 1 ? "," : "";
586
637
  const val = def.type === "secret" ? "__SECRET__" : JSON.stringify(def.default ?? "");
587
638
  parts.push(` "${name}": ${val}${comma}`);
@@ -693,13 +744,15 @@ function validateAll(workerName, manifest, files) {
693
744
  };
694
745
  }
695
746
  export {
696
- validateWranglerJsonc,
697
- validateRootSecrets,
698
- validateDevVars,
699
- validateAll,
700
- generateWranglerJsonc,
701
- generateDevVars,
702
- WORKER_NAMES,
747
+ CALLED_BY,
748
+ WORKER_CATALOG,
703
749
  WORKER_MANIFESTS,
704
- CALLED_BY
750
+ WORKER_NAMES,
751
+ generateDevVars,
752
+ generateWranglerJsonc,
753
+ getWorkerDefaultEnabled,
754
+ validateAll,
755
+ validateDevVars,
756
+ validateRootSecrets,
757
+ validateWranglerJsonc
705
758
  };
@@ -9,4 +9,17 @@ export declare const CALLED_BY: Record<string, string[]>;
9
9
  export declare const WORKER_MANIFESTS: Record<string, WorkerManifest>;
10
10
  /** List of all worker names in the registry. */
11
11
  export declare const WORKER_NAMES: string[];
12
+ /**
13
+ * Catalog entry for CLI worker enable/disable — one row per known worker.
14
+ * `defaultEnabled` is the seed value when the worker is first added to config.
15
+ */
16
+ export interface WorkerCatalogEntry {
17
+ name: string;
18
+ path: string;
19
+ defaultEnabled: boolean;
20
+ }
21
+ /** Full catalog of known workers with default enable flags (sorted by name). */
22
+ export declare const WORKER_CATALOG: WorkerCatalogEntry[];
23
+ /** Lookup defaultEnabled for a known worker; undefined if not in catalog. */
24
+ export declare function getWorkerDefaultEnabled(name: string): boolean | undefined;
12
25
  //# sourceMappingURL=registry.d.ts.map
@@ -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;AA2ajD,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"}
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 = {};
@@ -22,9 +6,12 @@ function deriveCalledBy(manifests) {
22
6
  if (!calledBy[workerName])
23
7
  calledBy[workerName] = new Set;
24
8
  for (const svc of manifest.services) {
25
- if (!calledBy[svc.service])
26
- calledBy[svc.service] = new Set;
27
- calledBy[svc.service].add(workerName);
9
+ let callers = calledBy[svc.service];
10
+ if (!callers) {
11
+ callers = new Set;
12
+ calledBy[svc.service] = callers;
13
+ }
14
+ callers.add(workerName);
28
15
  }
29
16
  }
30
17
  const result = {};
@@ -37,6 +24,7 @@ var manifests = {
37
24
  hoox: {
38
25
  name: "hoox",
39
26
  path: "workers/hoox-worker",
27
+ defaultEnabled: true,
40
28
  vars: {
41
29
  WEBHOOK_API_KEY_BINDING: {
42
30
  type: "secret",
@@ -46,7 +34,11 @@ var manifests = {
46
34
  type: "secret",
47
35
  description: "Inter-worker auth key"
48
36
  },
49
- HA_TOKEN_BINDING: { type: "secret", description: "Home Assistant token" }
37
+ HA_TOKEN_BINDING: { type: "secret", description: "Home Assistant token" },
38
+ TELEGRAM_ALLOWED_CHAT_IDS: {
39
+ type: "secret",
40
+ description: "Comma-separated chat IDs for webhook notify (fail-closed when unset); alias AUTHORIZED_CHAT_IDS"
41
+ }
50
42
  },
51
43
  services: [
52
44
  {
@@ -72,7 +64,8 @@ var manifests = {
72
64
  ai: true,
73
65
  queues: { producer: ["trade-execution"] },
74
66
  durableObjects: [
75
- { name: "IDEMPOTENCY_STORE", className: "IdempotencyStore" }
67
+ { name: "IDEMPOTENCY_STORE", className: "IdempotencyStore" },
68
+ { name: "RATE_LIMITER", className: "RateLimiterStore" }
76
69
  ]
77
70
  },
78
71
  middleware: [
@@ -87,6 +80,7 @@ var manifests = {
87
80
  "trade-worker": {
88
81
  name: "trade-worker",
89
82
  path: "workers/trade-worker",
83
+ defaultEnabled: true,
90
84
  vars: {
91
85
  INTERNAL_KEY_BINDING: {
92
86
  type: "secret",
@@ -96,15 +90,26 @@ var manifests = {
96
90
  type: "secret",
97
91
  description: "Telegram outbound auth"
98
92
  },
99
- BINANCE_KEY_BINDING: { type: "secret", description: "Binance API key" },
100
- BINANCE_SECRET_BINDING: {
93
+ EXCHANGE_KEY_BINDING: {
94
+ type: "secret",
95
+ description: "Unified exchange API key (Binance / Bybit / MEXC)"
96
+ },
97
+ EXCHANGE_SECRET_BINDING: {
101
98
  type: "secret",
102
- description: "Binance API secret"
99
+ description: "Unified exchange API secret"
103
100
  },
104
- MEXC_KEY_BINDING: { type: "secret", description: "MEXC API key" },
105
- MEXC_SECRET_BINDING: { type: "secret", description: "MEXC API secret" },
106
- BYBIT_KEY_BINDING: { type: "secret", description: "Bybit API key" },
107
- BYBIT_SECRET_BINDING: { type: "secret", description: "Bybit API secret" }
101
+ EXCHANGE_TESTNET_KEY_BINDING: {
102
+ type: "secret",
103
+ description: "Optional unified testnet API key"
104
+ },
105
+ EXCHANGE_TESTNET_SECRET_BINDING: {
106
+ type: "secret",
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"
112
+ }
108
113
  },
109
114
  services: [
110
115
  {
@@ -116,6 +121,11 @@ var manifests = {
116
121
  binding: "TELEGRAM_SERVICE",
117
122
  service: "telegram-worker",
118
123
  description: "Notifications"
124
+ },
125
+ {
126
+ binding: "WEB3_WALLET_SERVICE",
127
+ service: "web3-wallet-worker",
128
+ description: "DEX spot swaps (Uniswap / Jupiter)"
119
129
  }
120
130
  ],
121
131
  infrastructure: {
@@ -146,6 +156,7 @@ var manifests = {
146
156
  "telegram-worker": {
147
157
  name: "telegram-worker",
148
158
  path: "workers/telegram-worker",
159
+ defaultEnabled: true,
149
160
  vars: {
150
161
  INTERNAL_KEY_BINDING: {
151
162
  type: "secret",
@@ -159,6 +170,10 @@ var manifests = {
159
170
  TELEGRAM_SECRET_TOKEN: {
160
171
  type: "secret",
161
172
  description: "Webhook verification token"
173
+ },
174
+ AUTHORIZED_CHAT_IDS: {
175
+ type: "secret",
176
+ description: "Comma-separated chat IDs; inbound webhook fail-closed when unset; outbound /alert allowlist"
162
177
  }
163
178
  },
164
179
  services: [],
@@ -179,6 +194,7 @@ var manifests = {
179
194
  "d1-worker": {
180
195
  name: "d1-worker",
181
196
  path: "workers/d1-worker",
197
+ defaultEnabled: true,
182
198
  vars: {
183
199
  INTERNAL_KEY_BINDING: {
184
200
  type: "secret",
@@ -201,11 +217,28 @@ var manifests = {
201
217
  "web3-wallet-worker": {
202
218
  name: "web3-wallet-worker",
203
219
  path: "workers/web3-wallet-worker",
220
+ defaultEnabled: false,
204
221
  vars: {
205
222
  WALLET_PK_SECRET: { type: "secret", description: "Wallet private key" },
206
223
  WALLET_MNEMONIC_SECRET: {
207
224
  type: "secret",
208
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"
209
242
  }
210
243
  },
211
244
  services: [
@@ -221,6 +254,7 @@ var manifests = {
221
254
  "agent-worker": {
222
255
  name: "agent-worker",
223
256
  path: "workers/agent-worker",
257
+ defaultEnabled: true,
224
258
  vars: {
225
259
  AGENT_INTERNAL_KEY: { type: "secret", description: "Agent worker auth" },
226
260
  INTERNAL_KEY_BINDING: {
@@ -257,6 +291,7 @@ var manifests = {
257
291
  "email-worker": {
258
292
  name: "email-worker",
259
293
  path: "workers/email-worker",
294
+ defaultEnabled: false,
260
295
  vars: {
261
296
  INTERNAL_KEY_BINDING: {
262
297
  type: "secret",
@@ -294,6 +329,7 @@ var manifests = {
294
329
  "analytics-worker": {
295
330
  name: "analytics-worker",
296
331
  path: "workers/analytics-worker",
332
+ defaultEnabled: true,
297
333
  vars: {
298
334
  CLOUDFLARE_API_TOKEN: {
299
335
  type: "secret",
@@ -313,6 +349,7 @@ var manifests = {
313
349
  "report-worker": {
314
350
  name: "report-worker",
315
351
  path: "workers/report-worker",
352
+ defaultEnabled: false,
316
353
  vars: {
317
354
  CF_API_TOKEN_BINDING: {
318
355
  type: "secret",
@@ -347,6 +384,7 @@ var manifests = {
347
384
  "pyne-worker": {
348
385
  name: "pyne-worker",
349
386
  path: "workers/pyne-worker",
387
+ defaultEnabled: true,
350
388
  vars: {
351
389
  API_KEY: {
352
390
  type: "secret",
@@ -384,6 +422,7 @@ var manifests = {
384
422
  dashboard: {
385
423
  name: "dashboard",
386
424
  path: "workers/dashboard",
425
+ defaultEnabled: true,
387
426
  vars: {
388
427
  DASHBOARD_USER: {
389
428
  type: "secret",
@@ -426,8 +465,21 @@ var manifests = {
426
465
  var CALLED_BY = deriveCalledBy(manifests);
427
466
  var WORKER_MANIFESTS = manifests;
428
467
  var WORKER_NAMES = Object.keys(manifests).sort();
468
+ var WORKER_CATALOG = WORKER_NAMES.map((name) => {
469
+ const m = manifests[name];
470
+ return {
471
+ name: m.name,
472
+ path: m.path,
473
+ defaultEnabled: m.defaultEnabled
474
+ };
475
+ });
476
+ function getWorkerDefaultEnabled(name) {
477
+ return manifests[name]?.defaultEnabled;
478
+ }
429
479
  export {
430
- WORKER_NAMES,
480
+ CALLED_BY,
481
+ WORKER_CATALOG,
431
482
  WORKER_MANIFESTS,
432
- CALLED_BY
483
+ WORKER_NAMES,
484
+ getWorkerDefaultEnabled
433
485
  };
@@ -10,6 +10,11 @@ export interface WorkerManifest {
10
10
  name: string;
11
11
  /** Path relative to project root (e.g. "workers/trade-worker") */
12
12
  path: string;
13
+ /**
14
+ * Default for `workers.<name>.enabled` in the root wrangler.jsonc catalog.
15
+ * Used by `hoox workers enable|disable` and when seeding missing workers.
16
+ */
17
+ defaultEnabled: boolean;
13
18
  /** Vars the worker declares in its wrangler.jsonc `vars` section */
14
19
  vars: Record<string, VarDef>;
15
20
  /** Service bindings this worker calls */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/schemas/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,yCAAyC;IACzC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,gDAAgD;IAChD,cAAc,EAAE,aAAa,CAAC;IAC9B,+DAA+D;IAC/D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;IACpB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;IACpB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/schemas/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;IACxB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,yCAAyC;IACzC,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,gDAAgD;IAChD,cAAc,EAAE,aAAa,CAAC;IAC9B,+DAA+D;IAC/D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;IACpB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;IACpB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAClC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/schemas/validators.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAalE;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,MAAM,GACnB,eAAe,EAAE,CA4GnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,gBAAgB,EAAE,MAAM,GACvB,eAAe,EAAE,CA2CnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,cAAc,EAAE,MAAM,GACrB,eAAe,EAAE,CA6BnB;AAID;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAmItE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAYhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE;IACL,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB,GACA;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAWhE"}
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/schemas/validators.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAalE;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,MAAM,GACnB,eAAe,EAAE,CA8GnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,gBAAgB,EAAE,MAAM,GACvB,eAAe,EAAE,CA2CnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,cAAc,EAAE,MAAM,GACrB,eAAe,EAAE,CA6BnB;AAID;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAoItE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAYhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE;IACL,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB,GACA;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAWhE"}
@@ -1,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) {
@@ -53,7 +37,7 @@ function validateWranglerJsonc(workerName, manifest, jsoncContent) {
53
37
  }
54
38
  }
55
39
  for (const [name, def] of Object.entries(manifest.vars)) {
56
- if (def.type === "secret" && !name.endsWith("_BINDING") && !name.endsWith("_SECRET") && !name.startsWith("CLOUDFLARE_") && name !== "TELEGRAM_SECRET_TOKEN" && name !== "MAILGUN_API_KEY" && name !== "EMAIL_SCAN_SUBJECT" && name !== "DASHBOARD_USER" && name !== "DASHBOARD_PASS" && name !== "SESSION_SECRET" && name !== "AGENT_INTERNAL_KEY") {
40
+ if (def.type === "secret" && !name.endsWith("_BINDING") && !name.endsWith("_SECRET") && !name.startsWith("CLOUDFLARE_") && name !== "TELEGRAM_SECRET_TOKEN" && name !== "TELEGRAM_ALLOWED_CHAT_IDS" && name !== "AUTHORIZED_CHAT_IDS" && name !== "MAILGUN_API_KEY" && name !== "EMAIL_SCAN_SUBJECT" && name !== "DASHBOARD_USER" && name !== "DASHBOARD_PASS" && name !== "SESSION_SECRET" && name !== "AGENT_INTERNAL_KEY") {
57
41
  errors.push({
58
42
  worker: workerName,
59
43
  severity: "warning",
@@ -170,6 +154,8 @@ function generateWranglerJsonc(manifest) {
170
154
  parts.push(` "vars": {`);
171
155
  for (const [i, name] of varKeys.entries()) {
172
156
  const def = manifest.vars[name];
157
+ if (!def)
158
+ continue;
173
159
  const comma = i < varKeys.length - 1 ? "," : "";
174
160
  const val = def.type === "secret" ? "__SECRET__" : JSON.stringify(def.default ?? "");
175
161
  parts.push(` "${name}": ${val}${comma}`);
@@ -281,10 +267,10 @@ function validateAll(workerName, manifest, files) {
281
267
  };
282
268
  }
283
269
  export {
284
- validateWranglerJsonc,
285
- validateRootSecrets,
286
- validateDevVars,
287
- validateAll,
270
+ generateDevVars,
288
271
  generateWranglerJsonc,
289
- generateDevVars
272
+ validateAll,
273
+ validateDevVars,
274
+ validateRootSecrets,
275
+ validateWranglerJsonc
290
276
  };