@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
package/dist/types.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/types.ts
19
3
  import { z } from "zod";
20
4
  var TradeActionSchema = z.enum([
@@ -23,26 +7,30 @@ var TradeActionSchema = z.enum([
23
7
  "CLOSE_LONG",
24
8
  "CLOSE_SHORT"
25
9
  ]);
10
+ var MAX_WEBHOOK_LEVERAGE = 125;
11
+ var MAX_WEBHOOK_QUANTITY = 1e6;
26
12
  var WebhookPayloadSchema = z.object({
27
13
  exchange: z.string().min(1),
28
14
  action: TradeActionSchema,
29
15
  symbol: z.string().min(1).max(20),
30
- quantity: z.number().positive().finite(),
16
+ quantity: z.number().positive().finite().max(MAX_WEBHOOK_QUANTITY),
31
17
  price: z.number().positive().finite().optional(),
32
18
  orderType: z.string().optional(),
33
- leverage: z.number().int().positive().optional(),
34
- test: z.boolean().optional()
19
+ leverage: z.number().int().positive().max(MAX_WEBHOOK_LEVERAGE).optional(),
20
+ test: z.boolean().optional(),
21
+ tenantId: z.string().min(1).max(64).optional()
35
22
  }).strict();
36
23
  var TradeQueueMessageSchema = z.object({
37
24
  requestId: z.string().min(1).max(128),
38
25
  exchange: z.string().min(1).max(64),
39
26
  action: TradeActionSchema,
40
27
  symbol: z.string().min(1).max(32),
41
- quantity: z.number().positive().finite(),
28
+ quantity: z.number().positive().finite().max(MAX_WEBHOOK_QUANTITY),
42
29
  price: z.number().positive().finite().optional(),
43
- leverage: z.number().int().positive().max(125).optional(),
30
+ leverage: z.number().int().positive().max(MAX_WEBHOOK_LEVERAGE).optional(),
44
31
  test: z.boolean().optional(),
45
32
  idempotencyKey: z.string().min(1).max(512).optional(),
33
+ tenantId: z.string().min(1).max(64).optional(),
46
34
  queuedAt: z.string().min(1).max(64)
47
35
  }).strict();
48
36
  var TradeSignalSchema = z.object({
@@ -75,10 +63,12 @@ var BalanceSchema = z.object({
75
63
  timestamp: z.number().int().positive()
76
64
  }).strict();
77
65
  export {
78
- WebhookPayloadSchema,
79
- TradeSignalSchema,
80
- TradeQueueMessageSchema,
81
- TradeActionSchema,
66
+ BalanceSchema,
67
+ MAX_WEBHOOK_LEVERAGE,
68
+ MAX_WEBHOOK_QUANTITY,
82
69
  PositionSchema,
83
- BalanceSchema
70
+ TradeActionSchema,
71
+ TradeQueueMessageSchema,
72
+ TradeSignalSchema,
73
+ WebhookPayloadSchema
84
74
  };
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/wizard/engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,OAAO,KAAK,EACV,MAAM,EACN,cAAc,EACd,WAAW,EACX,iBAAiB,EAEjB,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AAiKjB,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAc;gBAEf,YAAY,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;IAI/C,uCAAuC;IACvC,QAAQ,IAAI,WAAW;IAIvB,uCAAuC;IACvC,cAAc,IAAI,cAAc;IAIhC,sCAAsC;IACtC,iBAAiB,IAAI,MAAM,EAAE;IAI7B,iFAAiF;IACjF,UAAU,IAAI,OAAO;IAKrB,gEAAgE;IAChE,SAAS,IAAI,OAAO;IAIpB;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE;IA0BjD,0CAA0C;IAC1C,MAAM,IAAI,IAAI;IAgBd,qCAAqC;IACrC,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,WAAW,IAAI,iBAAiB;IA+DhC;;;OAGG;IACH,mBAAmB,IAAI,gBAAgB;IAwCvC,OAAO,CAAC,UAAU;CA4DnB"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/wizard/engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,OAAO,KAAK,EACV,MAAM,EACN,cAAc,EACd,WAAW,EACX,iBAAiB,EAEjB,gBAAgB,EAGjB,MAAM,SAAS,CAAC;AAkKjB,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAc;gBAEf,YAAY,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;IAI/C,uCAAuC;IACvC,QAAQ,IAAI,WAAW;IAIvB,uCAAuC;IACvC,cAAc,IAAI,cAAc;IAQhC,sCAAsC;IACtC,iBAAiB,IAAI,MAAM,EAAE;IAI7B,iFAAiF;IACjF,UAAU,IAAI,OAAO;IAKrB,gEAAgE;IAChE,SAAS,IAAI,OAAO;IAIpB;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE;IA6BjD,0CAA0C;IAC1C,MAAM,IAAI,IAAI;IAiBd,qCAAqC;IACrC,KAAK,IAAI,IAAI;IAIb;;;OAGG;IACH,WAAW,IAAI,iBAAiB;IAoEhC;;;OAGG;IACH,mBAAmB,IAAI,gBAAgB;IA8CvC,OAAO,CAAC,UAAU;CA4DnB"}
@@ -1,19 +1,6 @@
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/wizard/types.ts
3
+ var CLOUDFLARE_API_TOKEN_PLACEHOLDER = "<USE_CLOUDFLARE_API_TOKEN_ENV_OR_WRANGLER_AUTH>";
17
4
 
18
5
  // src/wizard/presets.ts
19
6
  var PRESETS = [
@@ -35,7 +22,7 @@ var PRESETS = [
35
22
  "analytics-worker",
36
23
  "telegram-worker"
37
24
  ],
38
- integrations: ["binance", "telegram"]
25
+ integrations: ["exchange", "telegram"]
39
26
  },
40
27
  {
41
28
  name: "full",
@@ -52,15 +39,7 @@ var PRESETS = [
52
39
  "web3-wallet-worker",
53
40
  "pyne-worker"
54
41
  ],
55
- integrations: [
56
- "binance",
57
- "bybit",
58
- "mexc",
59
- "telegram",
60
- "openai",
61
- "wallet",
62
- "pyne"
63
- ]
42
+ integrations: ["exchange", "telegram", "openai", "wallet", "pyne"]
64
43
  }
65
44
  ];
66
45
  var WORKER_DEPENDENCIES = {
@@ -92,30 +71,12 @@ function resolveDependencies(selected) {
92
71
  }
93
72
  var INTEGRATIONS = [
94
73
  {
95
- key: "binance",
96
- label: "Binance Exchange",
74
+ key: "exchange",
75
+ label: "Exchange API (Binance / Bybit / MEXC)",
97
76
  workerName: "trade-worker",
98
77
  secrets: {
99
- BINANCE_KEY_BINDING: "Binance API Key",
100
- BINANCE_SECRET_BINDING: "Binance API Secret"
101
- }
102
- },
103
- {
104
- key: "mexc",
105
- label: "MEXC Exchange",
106
- workerName: "trade-worker",
107
- secrets: {
108
- MEXC_KEY_BINDING: "MEXC API Key",
109
- MEXC_SECRET_BINDING: "MEXC API Secret"
110
- }
111
- },
112
- {
113
- key: "bybit",
114
- label: "Bybit Exchange",
115
- workerName: "trade-worker",
116
- secrets: {
117
- BYBIT_KEY_BINDING: "Bybit API Key",
118
- BYBIT_SECRET_BINDING: "Bybit API Secret"
78
+ EXCHANGE_KEY_BINDING: "Exchange API Key",
79
+ EXCHANGE_SECRET_BINDING: "Exchange API Secret"
119
80
  }
120
81
  },
121
82
  {
@@ -125,6 +86,10 @@ var INTEGRATIONS = [
125
86
  secrets: {
126
87
  WALLET_MNEMONIC_SECRET: "Wallet Mnemonic Phrase",
127
88
  WALLET_PK_SECRET: "Wallet Private Key"
89
+ },
90
+ optionalSecrets: {
91
+ SOLANA_PRIVATE_KEY: "Solana private key (base58; leave empty to auto-generate)",
92
+ JUPITER_API_KEY: "Jupiter Swap API key (portal.jup.ag; Solana DEX)"
128
93
  }
129
94
  },
130
95
  {
@@ -193,7 +158,7 @@ var BASE_WORKERS = {
193
158
  "d1-worker": {
194
159
  enabled: true,
195
160
  path: "workers/d1-worker",
196
- vars: { database_name: "hoox-db" }
161
+ vars: { database_name: "trade-data-db" }
197
162
  },
198
163
  hoox: { enabled: true, path: "workers/hoox-worker", vars: {} },
199
164
  "agent-worker": { enabled: true, path: "workers/agent-worker", vars: {} },
@@ -345,7 +310,11 @@ class WizardEngine {
345
310
  return { ...this.state };
346
311
  }
347
312
  getCurrentStep() {
348
- return STEPS.find((s) => s.id === this.state.step) ?? STEPS[0];
313
+ const step = STEPS.find((s) => s.id === this.state.step) ?? STEPS[0];
314
+ if (!step) {
315
+ throw new Error("Wizard has no steps defined");
316
+ }
317
+ return step;
349
318
  }
350
319
  getCompletedSteps() {
351
320
  return [...this.state.completedSteps];
@@ -368,8 +337,11 @@ class WizardEngine {
368
337
  this.state.completedSteps.push(this.state.step);
369
338
  }
370
339
  const currentIdx = STEP_ORDER.indexOf(this.state.step);
371
- if (currentIdx < STEP_ORDER.length - 1) {
372
- this.state.step = STEP_ORDER[currentIdx + 1];
340
+ if (currentIdx >= 0 && currentIdx < STEP_ORDER.length - 1) {
341
+ const nextStep = STEP_ORDER[currentIdx + 1];
342
+ if (nextStep !== undefined) {
343
+ this.state.step = nextStep;
344
+ }
373
345
  }
374
346
  this.state.updatedAt = Date.now();
375
347
  return [];
@@ -380,6 +352,8 @@ class WizardEngine {
380
352
  const currentIdx = STEP_ORDER.indexOf(this.state.step);
381
353
  if (currentIdx > 0) {
382
354
  const previousStep = STEP_ORDER[currentIdx - 1];
355
+ if (previousStep === undefined)
356
+ return;
383
357
  this.state.step = previousStep;
384
358
  this.state.completedSteps = this.state.completedSteps.filter((s) => s !== this.state.step || STEP_ORDER.indexOf(s) <= STEP_ORDER.indexOf(previousStep));
385
359
  }
@@ -415,7 +389,10 @@ class WizardEngine {
415
389
  if (integration.vars) {
416
390
  Object.assign(workers[workerName].vars, integration.vars);
417
391
  }
418
- for (const secretName of Object.keys(integration.secrets)) {
392
+ for (const secretName of [
393
+ ...Object.keys(integration.secrets),
394
+ ...Object.keys(integration.optionalSecrets ?? {})
395
+ ]) {
419
396
  if (!workers[workerName].secrets.includes(secretName)) {
420
397
  workers[workerName].secrets.push(secretName);
421
398
  }
@@ -433,7 +410,7 @@ class WizardEngine {
433
410
  }
434
411
  return {
435
412
  global: {
436
- cloudflare_api_token: cf?.apiToken ?? "",
413
+ cloudflare_api_token: CLOUDFLARE_API_TOKEN_PLACEHOLDER,
437
414
  cloudflare_account_id: cf?.accountId ?? "",
438
415
  cloudflare_secret_store_id: cf?.secretStoreId ?? "",
439
416
  subdomain_prefix: cf?.subdomain ?? ""
@@ -446,19 +423,20 @@ class WizardEngine {
446
423
  d1Databases: [],
447
424
  kvNamespaces: [],
448
425
  r2Buckets: [],
449
- queues: []
426
+ queues: [],
427
+ vectorizeIndexes: []
450
428
  };
451
429
  const allWorkers = [
452
430
  ...Object.keys(BASE_WORKERS),
453
431
  ...this.state.selectedWorkers,
454
432
  ...this.state.selectedIntegrations.map((k) => {
455
- const i = INTEGRATIONS.find((i2) => i2.key === k);
433
+ const i = INTEGRATIONS.find((i) => i.key === k);
456
434
  return i?.workerName ?? "";
457
435
  }).filter(Boolean)
458
436
  ];
459
437
  const workerSet = new Set(allWorkers);
460
438
  if (workerSet.has("d1-worker")) {
461
- plan.d1Databases.push("hoox-db");
439
+ plan.d1Databases.push("trade-data-db");
462
440
  }
463
441
  if (workerSet.has("hoox") || workerSet.has("analytics-worker")) {
464
442
  plan.kvNamespaces.push("CONFIG_KV");
@@ -466,8 +444,13 @@ class WizardEngine {
466
444
  if (workerSet.has("web3-wallet-worker")) {
467
445
  plan.kvNamespaces.push("WEB3_CACHE_KV");
468
446
  }
447
+ if (workerSet.has("hoox") || workerSet.has("telegram-worker")) {
448
+ plan.vectorizeIndexes = plan.vectorizeIndexes ?? [];
449
+ plan.vectorizeIndexes.push("hoox-rag-index");
450
+ }
469
451
  plan.d1Databases = [...new Set(plan.d1Databases)];
470
452
  plan.kvNamespaces = [...new Set(plan.kvNamespaces)];
453
+ plan.vectorizeIndexes = [...new Set(plan.vectorizeIndexes ?? [])];
471
454
  return plan;
472
455
  }
473
456
  applyInput(input) {
@@ -4,6 +4,7 @@
4
4
  */
5
5
  export type { StepId, WorkerPresetName, WorkerPreset } from "./types";
6
6
  export type { WorkerConfig, WorkersJsonConfig, IntegratedService, ProvisioningPlan, ProvisionResult, WizardCloudflareConfig, WizardState, StepDefinition, } from "./types";
7
+ export { CLOUDFLARE_API_TOKEN_PLACEHOLDER } from "./types";
7
8
  export type { Provisioner } from "./provisioner";
8
9
  export { WizardEngine } from "./engine";
9
10
  export { PRESETS, WORKER_DEPENDENCIES, INTEGRATIONS, BASE_WORKERS, BASE_SECRETS, resolveDependencies, } from "./presets";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wizard/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACtE,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,cAAc,GACf,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,OAAO,EACL,OAAO,EACP,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wizard/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACtE,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,WAAW,EACX,cAAc,GACf,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,gCAAgC,EAAE,MAAM,SAAS,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,OAAO,EACL,OAAO,EACP,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,mBAAmB,GACpB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,eAAe,CAAC"}
@@ -1,20 +1,6 @@
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
-
2
+ // src/wizard/types.ts
3
+ var CLOUDFLARE_API_TOKEN_PLACEHOLDER = "<USE_CLOUDFLARE_API_TOKEN_ENV_OR_WRANGLER_AUTH>";
18
4
  // src/wizard/presets.ts
19
5
  var PRESETS = [
20
6
  {
@@ -35,7 +21,7 @@ var PRESETS = [
35
21
  "analytics-worker",
36
22
  "telegram-worker"
37
23
  ],
38
- integrations: ["binance", "telegram"]
24
+ integrations: ["exchange", "telegram"]
39
25
  },
40
26
  {
41
27
  name: "full",
@@ -52,15 +38,7 @@ var PRESETS = [
52
38
  "web3-wallet-worker",
53
39
  "pyne-worker"
54
40
  ],
55
- integrations: [
56
- "binance",
57
- "bybit",
58
- "mexc",
59
- "telegram",
60
- "openai",
61
- "wallet",
62
- "pyne"
63
- ]
41
+ integrations: ["exchange", "telegram", "openai", "wallet", "pyne"]
64
42
  }
65
43
  ];
66
44
  var WORKER_DEPENDENCIES = {
@@ -92,30 +70,12 @@ function resolveDependencies(selected) {
92
70
  }
93
71
  var INTEGRATIONS = [
94
72
  {
95
- key: "binance",
96
- label: "Binance Exchange",
73
+ key: "exchange",
74
+ label: "Exchange API (Binance / Bybit / MEXC)",
97
75
  workerName: "trade-worker",
98
76
  secrets: {
99
- BINANCE_KEY_BINDING: "Binance API Key",
100
- BINANCE_SECRET_BINDING: "Binance API Secret"
101
- }
102
- },
103
- {
104
- key: "mexc",
105
- label: "MEXC Exchange",
106
- workerName: "trade-worker",
107
- secrets: {
108
- MEXC_KEY_BINDING: "MEXC API Key",
109
- MEXC_SECRET_BINDING: "MEXC API Secret"
110
- }
111
- },
112
- {
113
- key: "bybit",
114
- label: "Bybit Exchange",
115
- workerName: "trade-worker",
116
- secrets: {
117
- BYBIT_KEY_BINDING: "Bybit API Key",
118
- BYBIT_SECRET_BINDING: "Bybit API Secret"
77
+ EXCHANGE_KEY_BINDING: "Exchange API Key",
78
+ EXCHANGE_SECRET_BINDING: "Exchange API Secret"
119
79
  }
120
80
  },
121
81
  {
@@ -125,6 +85,10 @@ var INTEGRATIONS = [
125
85
  secrets: {
126
86
  WALLET_MNEMONIC_SECRET: "Wallet Mnemonic Phrase",
127
87
  WALLET_PK_SECRET: "Wallet Private Key"
88
+ },
89
+ optionalSecrets: {
90
+ SOLANA_PRIVATE_KEY: "Solana private key (base58; leave empty to auto-generate)",
91
+ JUPITER_API_KEY: "Jupiter Swap API key (portal.jup.ag; Solana DEX)"
128
92
  }
129
93
  },
130
94
  {
@@ -193,7 +157,7 @@ var BASE_WORKERS = {
193
157
  "d1-worker": {
194
158
  enabled: true,
195
159
  path: "workers/d1-worker",
196
- vars: { database_name: "hoox-db" }
160
+ vars: { database_name: "trade-data-db" }
197
161
  },
198
162
  hoox: { enabled: true, path: "workers/hoox-worker", vars: {} },
199
163
  "agent-worker": { enabled: true, path: "workers/agent-worker", vars: {} },
@@ -345,7 +309,11 @@ class WizardEngine {
345
309
  return { ...this.state };
346
310
  }
347
311
  getCurrentStep() {
348
- return STEPS.find((s) => s.id === this.state.step) ?? STEPS[0];
312
+ const step = STEPS.find((s) => s.id === this.state.step) ?? STEPS[0];
313
+ if (!step) {
314
+ throw new Error("Wizard has no steps defined");
315
+ }
316
+ return step;
349
317
  }
350
318
  getCompletedSteps() {
351
319
  return [...this.state.completedSteps];
@@ -368,8 +336,11 @@ class WizardEngine {
368
336
  this.state.completedSteps.push(this.state.step);
369
337
  }
370
338
  const currentIdx = STEP_ORDER.indexOf(this.state.step);
371
- if (currentIdx < STEP_ORDER.length - 1) {
372
- this.state.step = STEP_ORDER[currentIdx + 1];
339
+ if (currentIdx >= 0 && currentIdx < STEP_ORDER.length - 1) {
340
+ const nextStep = STEP_ORDER[currentIdx + 1];
341
+ if (nextStep !== undefined) {
342
+ this.state.step = nextStep;
343
+ }
373
344
  }
374
345
  this.state.updatedAt = Date.now();
375
346
  return [];
@@ -380,6 +351,8 @@ class WizardEngine {
380
351
  const currentIdx = STEP_ORDER.indexOf(this.state.step);
381
352
  if (currentIdx > 0) {
382
353
  const previousStep = STEP_ORDER[currentIdx - 1];
354
+ if (previousStep === undefined)
355
+ return;
383
356
  this.state.step = previousStep;
384
357
  this.state.completedSteps = this.state.completedSteps.filter((s) => s !== this.state.step || STEP_ORDER.indexOf(s) <= STEP_ORDER.indexOf(previousStep));
385
358
  }
@@ -415,7 +388,10 @@ class WizardEngine {
415
388
  if (integration.vars) {
416
389
  Object.assign(workers[workerName].vars, integration.vars);
417
390
  }
418
- for (const secretName of Object.keys(integration.secrets)) {
391
+ for (const secretName of [
392
+ ...Object.keys(integration.secrets),
393
+ ...Object.keys(integration.optionalSecrets ?? {})
394
+ ]) {
419
395
  if (!workers[workerName].secrets.includes(secretName)) {
420
396
  workers[workerName].secrets.push(secretName);
421
397
  }
@@ -433,7 +409,7 @@ class WizardEngine {
433
409
  }
434
410
  return {
435
411
  global: {
436
- cloudflare_api_token: cf?.apiToken ?? "",
412
+ cloudflare_api_token: CLOUDFLARE_API_TOKEN_PLACEHOLDER,
437
413
  cloudflare_account_id: cf?.accountId ?? "",
438
414
  cloudflare_secret_store_id: cf?.secretStoreId ?? "",
439
415
  subdomain_prefix: cf?.subdomain ?? ""
@@ -446,19 +422,20 @@ class WizardEngine {
446
422
  d1Databases: [],
447
423
  kvNamespaces: [],
448
424
  r2Buckets: [],
449
- queues: []
425
+ queues: [],
426
+ vectorizeIndexes: []
450
427
  };
451
428
  const allWorkers = [
452
429
  ...Object.keys(BASE_WORKERS),
453
430
  ...this.state.selectedWorkers,
454
431
  ...this.state.selectedIntegrations.map((k) => {
455
- const i = INTEGRATIONS.find((i2) => i2.key === k);
432
+ const i = INTEGRATIONS.find((i) => i.key === k);
456
433
  return i?.workerName ?? "";
457
434
  }).filter(Boolean)
458
435
  ];
459
436
  const workerSet = new Set(allWorkers);
460
437
  if (workerSet.has("d1-worker")) {
461
- plan.d1Databases.push("hoox-db");
438
+ plan.d1Databases.push("trade-data-db");
462
439
  }
463
440
  if (workerSet.has("hoox") || workerSet.has("analytics-worker")) {
464
441
  plan.kvNamespaces.push("CONFIG_KV");
@@ -466,8 +443,13 @@ class WizardEngine {
466
443
  if (workerSet.has("web3-wallet-worker")) {
467
444
  plan.kvNamespaces.push("WEB3_CACHE_KV");
468
445
  }
446
+ if (workerSet.has("hoox") || workerSet.has("telegram-worker")) {
447
+ plan.vectorizeIndexes = plan.vectorizeIndexes ?? [];
448
+ plan.vectorizeIndexes.push("hoox-rag-index");
449
+ }
469
450
  plan.d1Databases = [...new Set(plan.d1Databases)];
470
451
  plan.kvNamespaces = [...new Set(plan.kvNamespaces)];
452
+ plan.vectorizeIndexes = [...new Set(plan.vectorizeIndexes ?? [])];
471
453
  return plan;
472
454
  }
473
455
  applyInput(input) {
@@ -520,10 +502,13 @@ class WizardEngine {
520
502
  }
521
503
  }
522
504
  }
523
-
524
505
  // src/wizard/persistence.ts
525
506
  function serializeState(state) {
526
- return JSON.stringify(state, null, 2);
507
+ const copy = {
508
+ ...state,
509
+ cloudflareConfig: state.cloudflareConfig ? { ...state.cloudflareConfig, apiToken: "" } : undefined
510
+ };
511
+ return JSON.stringify(copy, null, 2);
527
512
  }
528
513
  function deserializeState(json) {
529
514
  const parsed = JSON.parse(json);
@@ -531,14 +516,15 @@ function deserializeState(json) {
531
516
  }
532
517
  var WIZARD_STATE_PATH = ".wizard-state.json";
533
518
  export {
534
- serializeState,
535
- resolveDependencies,
536
- deserializeState,
537
- WizardEngine,
538
- WORKER_DEPENDENCIES,
539
- WIZARD_STATE_PATH,
540
- PRESETS,
541
- INTEGRATIONS,
519
+ BASE_SECRETS,
542
520
  BASE_WORKERS,
543
- BASE_SECRETS
521
+ CLOUDFLARE_API_TOKEN_PLACEHOLDER,
522
+ INTEGRATIONS,
523
+ PRESETS,
524
+ WIZARD_STATE_PATH,
525
+ WORKER_DEPENDENCIES,
526
+ WizardEngine,
527
+ deserializeState,
528
+ resolveDependencies,
529
+ serializeState
544
530
  };
@@ -5,6 +5,10 @@
5
5
  import type { WizardState } from "./types";
6
6
  /**
7
7
  * Serialize wizard state to JSON string.
8
+ *
9
+ * The Cloudflare API token is stripped — `.wizard-state.json` must not
10
+ * hold live credentials. Resume re-reads `CLOUDFLARE_API_TOKEN` from the
11
+ * environment (or re-prompts).
8
12
  */
9
13
  export declare function serializeState(state: WizardState): string;
10
14
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/wizard/persistence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAG1D;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,uBAAuB,CAAC"}
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../../src/wizard/persistence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,CAQzD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAG1D;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,uBAAuB,CAAC"}
@@ -1,23 +1,11 @@
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/wizard/persistence.ts
19
3
  function serializeState(state) {
20
- return JSON.stringify(state, null, 2);
4
+ const copy = {
5
+ ...state,
6
+ cloudflareConfig: state.cloudflareConfig ? { ...state.cloudflareConfig, apiToken: "" } : undefined
7
+ };
8
+ return JSON.stringify(copy, null, 2);
21
9
  }
22
10
  function deserializeState(json) {
23
11
  const parsed = JSON.parse(json);
@@ -25,7 +13,7 @@ function deserializeState(json) {
25
13
  }
26
14
  var WIZARD_STATE_PATH = ".wizard-state.json";
27
15
  export {
28
- serializeState,
16
+ WIZARD_STATE_PATH,
29
17
  deserializeState,
30
- WIZARD_STATE_PATH
18
+ serializeState
31
19
  };
@@ -1 +1 @@
1
- {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../src/wizard/presets.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAI/D,eAAO,MAAM,OAAO,EAAE,YAAY,EA8CjC,CAAC;AAIF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAOxD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAkBhE;AAID;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,iBAAiB,EAkG3C,CAAC;AAIF,eAAO,MAAM,YAAY,EAAE,MAAM,CAC/B,MAAM,EACN;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAmBjE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAIjD,CAAC"}
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../src/wizard/presets.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAI/D,eAAO,MAAM,OAAO,EAAE,YAAY,EAsCjC,CAAC;AAIF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAOxD,CAAC;AAEF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAkBhE;AAID;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,iBAAiB,EAqF3C,CAAC;AAIF,eAAO,MAAM,YAAY,EAAE,MAAM,CAC/B,MAAM,EACN;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAmBjE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAIjD,CAAC"}