@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/README.md CHANGED
@@ -41,4 +41,10 @@ The named subdirectories with deep-import support are: `middleware`, `d1`, `sche
41
41
 
42
42
  ```bash
43
43
  bun test packages/shared
44
+ bun run build:shared # emits dist/ (gitignored)
45
+ bun run typecheck # builds shared first, then tsc every workspace
44
46
  ```
47
+
48
+ Worker `tsc` resolves `@hoox-sh/hoox-shared/<subpath>` through this package's
49
+ `exports` map to `dist/*.d.ts`. `bun run typecheck` (and the pre-push hook)
50
+ builds `dist/` first so a clean tree does not fail with missing-module errors.
@@ -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/kvKeys.ts
19
3
  var KV_TRADE_DEFAULT_LEVERAGE = "trade:default_leverage";
20
4
  var KV_TRADE_MAX_POSITION_SIZE = "trade:max_position_size";
@@ -26,6 +10,11 @@ var KV_BOT_ENABLED = "bot:enabled";
26
10
  var KV_BOT_DEFAULT_CHAT_ID = "bot:default_chat_id";
27
11
  var KV_BOT_NOTIFY_ON_EXECUTION = "bot:notify_on_execution";
28
12
  var KV_BOT_NOTIFY_ON_ERROR = "bot:notify_on_error";
13
+ var KV_BOT_NOTIFY_ON_STARTUP = "bot:notify_on_startup";
14
+ var KV_BOT_AI_SUMMARIES_ENABLED = "bot:ai_summaries_enabled";
15
+ var KV_BOT_SUMMARY_STYLE = "bot:summary_style";
16
+ var KV_BOT_INCLUDE_PNL = "bot:include_pnl";
17
+ var KV_TELEGRAM_ALLOWED_CHAT_IDS = "telegram:allowed_chat_ids";
29
18
  var KV_WEBHOOK_IP_CHECK_ENABLED = "webhook:tradingview:ip_check_enabled";
30
19
  var KV_WEBHOOK_ALLOWED_IPS = "webhook:tradingview:allowed_ips";
31
20
  var KV_WEBHOOK_QUEUE_MODE = "webhook:queue_mode";
@@ -56,6 +45,11 @@ var KVKeys = {
56
45
  KV_BOT_DEFAULT_CHAT_ID,
57
46
  KV_BOT_NOTIFY_ON_EXECUTION,
58
47
  KV_BOT_NOTIFY_ON_ERROR,
48
+ KV_BOT_NOTIFY_ON_STARTUP,
49
+ KV_BOT_AI_SUMMARIES_ENABLED,
50
+ KV_BOT_SUMMARY_STYLE,
51
+ KV_BOT_INCLUDE_PNL,
52
+ KV_TELEGRAM_ALLOWED_CHAT_IDS,
59
53
  KV_WEBHOOK_IP_CHECK_ENABLED,
60
54
  KV_WEBHOOK_ALLOWED_IPS,
61
55
  KV_WEBHOOK_QUEUE_MODE,
@@ -141,9 +135,9 @@ function getAgentConfigEmbeddedValue(config, fieldKey) {
141
135
  const map = config.modelMap;
142
136
  if (!map || typeof map !== "object" || Array.isArray(map))
143
137
  return;
144
- const v2 = map[spec.provider];
145
- if (typeof v2 === "string" || typeof v2 === "number" || typeof v2 === "boolean")
146
- return v2;
138
+ const v = map[spec.provider];
139
+ if (typeof v === "string" || typeof v === "number" || typeof v === "boolean")
140
+ return v;
147
141
  return;
148
142
  }
149
143
  const v = config[spec.key];
@@ -208,15 +202,15 @@ function applyAgentConfigFieldUpdates(config, updates) {
208
202
  return next;
209
203
  }
210
204
  export {
211
- setAgentConfigEmbeddedValue,
212
- serializeAgentConfigForKv,
213
- parseAgentConfigJson,
214
- isAgentConfigSection,
215
- isAgentConfigEmbeddedField,
216
- getAgentConfigEmbeddedValue,
217
- expandAgentConfigToFieldMap,
218
- applyAgentConfigFieldUpdates,
219
- DASHBOARD_SECTIONS_AGENT_CONFIG,
205
+ AGENT_CONFIG_EMBEDDED_FIELDS,
220
206
  AGENT_CONFIG_KV_KEY,
221
- AGENT_CONFIG_EMBEDDED_FIELDS
207
+ DASHBOARD_SECTIONS_AGENT_CONFIG,
208
+ applyAgentConfigFieldUpdates,
209
+ expandAgentConfigToFieldMap,
210
+ getAgentConfigEmbeddedValue,
211
+ isAgentConfigEmbeddedField,
212
+ isAgentConfigSection,
213
+ parseAgentConfigJson,
214
+ serializeAgentConfigForKv,
215
+ setAgentConfigEmbeddedValue
222
216
  };
@@ -2,10 +2,6 @@
2
2
  * Copyright (c) 2026 HOOX · HOOX · jango-blockchained (hoox-sh)
3
3
  * SPDX-License-Identifier: Apache-2.0
4
4
  */
5
- /**
6
- * Analytics tracking utilities for Cloudflare Workers
7
- * Centralizes the trackAnalytics helper used across all workers
8
- */
9
5
  /**
10
6
  * Environment with optional analytics service binding.
11
7
  * Workers that support analytics tracking should extend this type.
@@ -22,6 +18,9 @@
22
18
  */
23
19
  export interface AnalyticsEnv {
24
20
  ANALYTICS_SERVICE?: Fetcher;
21
+ /** Opt-in tenant isolation (see tenant.ts). Absent = self-host default. */
22
+ TENANT_ID?: string;
23
+ TENANT_MODE?: string;
25
24
  }
26
25
  /**
27
26
  * Optional configuration for trackAnalytics.
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAY;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,YAAY,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAY;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,YAAY,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA8Cf"}
package/dist/analytics.js CHANGED
@@ -1,27 +1,67 @@
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/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
+ }
17
47
 
18
48
  // src/analytics.ts
19
49
  async function trackAnalytics(env, endpoint, body, options) {
20
50
  if (!env.ANALYTICS_SERVICE)
21
51
  return;
22
52
  try {
53
+ let tenantId = null;
54
+ try {
55
+ tenantId = effectiveTenantId(env);
56
+ } catch {
57
+ tenantId = null;
58
+ }
59
+ const rest = { ...body };
60
+ delete rest.tenant_id;
61
+ delete rest.tenantId;
23
62
  const payload = {
24
- ...body,
63
+ ...rest,
64
+ ...tenantId ? { tenant_id: tenantId } : {},
25
65
  ...options?.indexes ? { indexes: [...options.indexes] } : {}
26
66
  };
27
67
  const headers = {
@@ -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;
@@ -190,6 +181,6 @@ var init_api_client = __esm(() => {
190
181
  init_api_client();
191
182
 
192
183
  export {
193
- hooxFetch,
194
- WorkerAPIError
184
+ WorkerAPIError,
185
+ hooxFetch
195
186
  };
package/dist/colors.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/colors.ts
19
3
  var Colors = {
20
4
  background: "#050508",
@@ -73,10 +57,10 @@ var AlertSeverityColor = {
73
57
  critical: Colors.error
74
58
  };
75
59
  export {
76
- WorkerStatusColor,
77
- LogLevelColor,
78
- CoolBracketPalette,
79
- ConnectionStatusColor,
60
+ AlertSeverityColor,
80
61
  Colors,
81
- AlertSeverityColor
62
+ ConnectionStatusColor,
63
+ CoolBracketPalette,
64
+ LogLevelColor,
65
+ WorkerStatusColor
82
66
  };
package/dist/config.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/config.ts
19
3
  import {
20
4
  readFileSync,
@@ -131,16 +115,16 @@ function validateConfig(config) {
131
115
  return errors;
132
116
  }
133
117
  export {
134
- writeSecureFileSync,
135
- writeConfigSync,
136
- writeConfig,
137
- validateConfig,
138
- readConfigSync,
139
- readConfig,
140
- isUnixModeGroupOrWorldAccessible,
141
- isConfigWorldOrGroupReadable,
142
- formatConfigPermissionWarning,
143
- ensureHooxDirSecure,
118
+ HOOX_CONFIG_FILE_MODE,
144
119
  HOOX_DIR_MODE,
145
- HOOX_CONFIG_FILE_MODE
120
+ ensureHooxDirSecure,
121
+ formatConfigPermissionWarning,
122
+ isConfigWorldOrGroupReadable,
123
+ isUnixModeGroupOrWorldAccessible,
124
+ readConfig,
125
+ readConfigSync,
126
+ validateConfig,
127
+ writeConfig,
128
+ writeConfigSync,
129
+ writeSecureFileSync
146
130
  };
@@ -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/cron-handler.ts
19
3
  function createCronHandler(options) {
20
4
  const { name, handler, logger } = options;
package/dist/d1/index.js CHANGED
@@ -1,28 +1,14 @@
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/errors.ts
19
3
  function toError(err, fallback = "Unknown error") {
20
4
  if (err instanceof Error)
21
5
  return err.message;
22
6
  if (typeof err === "string")
23
7
  return err;
24
- if (err && typeof err === "object" && "message" in err && typeof err.message === "string") {
25
- return err.message;
8
+ if (err && typeof err === "object" && "message" in err) {
9
+ const message = err.message;
10
+ if (typeof message === "string")
11
+ return message;
26
12
  }
27
13
  if (err === null || err === undefined)
28
14
  return fallback;
@@ -70,14 +56,14 @@ function sanitizeOutput(data) {
70
56
  const obj = data;
71
57
  const keys = Object.keys(obj);
72
58
  if (keys.length < 10) {
73
- const sanitized2 = {};
59
+ const sanitized = {};
74
60
  for (const k of keys) {
75
61
  if (k === "stack" || k === "cause")
76
62
  continue;
77
63
  const v = obj[k];
78
- sanitized2[k] = v instanceof Error ? { name: v.name, message: v.message } : sanitizeOutput(v);
64
+ sanitized[k] = v instanceof Error ? { name: v.name, message: v.message } : sanitizeOutput(v);
79
65
  }
80
- return sanitized2;
66
+ return sanitized;
81
67
  }
82
68
  if (!hasSensitiveFields(obj) && !hasErrorValues(obj)) {
83
69
  return obj;
@@ -292,7 +278,6 @@ class D1Repository {
292
278
  }
293
279
  }
294
280
  }
295
-
296
281
  // src/d1/schemas.ts
297
282
  import { z } from "zod";
298
283
  var TradeRecordSchema = z.object({
@@ -351,10 +336,10 @@ var TradeSignalRecordSchema = z.object({
351
336
  processed_at: z.number().int().optional()
352
337
  }).strict();
353
338
  export {
354
- TradeSignalRecordSchema,
355
- TradeRecordSchema,
356
- SystemLogRecordSchema,
357
- PositionRecordSchema,
339
+ BalanceRecordSchema,
358
340
  D1Repository,
359
- BalanceRecordSchema
341
+ PositionRecordSchema,
342
+ SystemLogRecordSchema,
343
+ TradeRecordSchema,
344
+ TradeSignalRecordSchema
360
345
  };
@@ -1,28 +1,14 @@
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/errors.ts
19
3
  function toError(err, fallback = "Unknown error") {
20
4
  if (err instanceof Error)
21
5
  return err.message;
22
6
  if (typeof err === "string")
23
7
  return err;
24
- if (err && typeof err === "object" && "message" in err && typeof err.message === "string") {
25
- return err.message;
8
+ if (err && typeof err === "object" && "message" in err) {
9
+ const message = err.message;
10
+ if (typeof message === "string")
11
+ return message;
26
12
  }
27
13
  if (err === null || err === undefined)
28
14
  return fallback;
@@ -70,14 +56,14 @@ function sanitizeOutput(data) {
70
56
  const obj = data;
71
57
  const keys = Object.keys(obj);
72
58
  if (keys.length < 10) {
73
- const sanitized2 = {};
59
+ const sanitized = {};
74
60
  for (const k of keys) {
75
61
  if (k === "stack" || k === "cause")
76
62
  continue;
77
63
  const v = obj[k];
78
- sanitized2[k] = v instanceof Error ? { name: v.name, message: v.message } : sanitizeOutput(v);
64
+ sanitized[k] = v instanceof Error ? { name: v.name, message: v.message } : sanitizeOutput(v);
79
65
  }
80
- return sanitized2;
66
+ return sanitized;
81
67
  }
82
68
  if (!hasSensitiveFields(obj) && !hasErrorValues(obj)) {
83
69
  return obj;
@@ -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/d1/schemas.ts
19
3
  import { z } from "zod";
20
4
  var TradeRecordSchema = z.object({
@@ -73,9 +57,9 @@ var TradeSignalRecordSchema = z.object({
73
57
  processed_at: z.number().int().optional()
74
58
  }).strict();
75
59
  export {
76
- TradeSignalRecordSchema,
77
- TradeRecordSchema,
78
- SystemLogRecordSchema,
60
+ BalanceRecordSchema,
79
61
  PositionRecordSchema,
80
- BalanceRecordSchema
62
+ SystemLogRecordSchema,
63
+ TradeRecordSchema,
64
+ TradeSignalRecordSchema
81
65
  };
@@ -58,11 +58,12 @@ export declare const DASHBOARD_FIELD_KV_OVERRIDES: Record<string, string>;
58
58
  * - providers/models: edited via `agent:config` (see agent-config-fields.ts)
59
59
  * - cron: wrangler trigger schedule, not KV
60
60
  * - behavior: not read as flat behavior:* keys by the agent worker
61
+ * - endpoints: documentation-only in report-worker dashboard.jsonc
61
62
  */
62
63
  export declare const DASHBOARD_SECTIONS_NOT_FLAT_KV: ReadonlySet<string>;
63
64
  /**
64
65
  * Sections that are not editable as flat or agent:config fields
65
- * (no worker consumer yet).
66
+ * (no worker consumer yet / docs only).
66
67
  */
67
68
  export declare const DASHBOARD_SECTIONS_UI_SKIP: ReadonlySet<string>;
68
69
  /** True when a section should map to flat CONFIG_KV get/set / apply-manifest. */
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-manifest.d.ts","sourceRoot":"","sources":["../src/dashboard-manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dashboard-manifest.d.ts","sourceRoot":"","sources":["../src/dashboard-manifest.ts"],"names":[],"mappings":"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"}
@@ -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/dashboard-manifest.ts
19
3
  import { existsSync, readdirSync, readFileSync } from "fs";
20
4
  import { join } from "path";
@@ -34,10 +18,12 @@ var DASHBOARD_SECTION_PREFIX = {
34
18
  global: "global:",
35
19
  webhook: "webhook:",
36
20
  routing: "routing:",
21
+ notify: "telegram:",
37
22
  security: "webhook:",
38
23
  trade: "trade:",
39
24
  agent: "agent:",
40
25
  bot: "bot:",
26
+ bot_ai: "bot:",
41
27
  email: "email:",
42
28
  signal: "email:",
43
29
  database: "database:",
@@ -50,26 +36,44 @@ var DASHBOARD_SECTION_PREFIX = {
50
36
  providers: "agent:",
51
37
  models: "agent:",
52
38
  ai: "ai:",
39
+ tracking: "ai:",
40
+ query: "ai:",
53
41
  report: "report:",
42
+ schedule: "report:",
43
+ rendering: "report:",
44
+ storage: "report:",
45
+ delivery: "report:",
46
+ endpoints: "report:",
47
+ wallet: "wallet:",
48
+ dex: "wallet:",
49
+ wallet_security: "wallet:",
54
50
  pyne: "pyne:",
55
51
  pyne_alerts: "pyne:"
56
52
  };
57
53
  var DASHBOARD_FIELD_KV_OVERRIDES = {
58
54
  "webhook:tradingview_ip_check_enabled": "webhook:tradingview:ip_check_enabled",
59
55
  "webhook:tradingview_allowed_ips": "webhook:tradingview:allowed_ips",
56
+ "webhook:queue_mode": "webhook:queue_mode",
57
+ "notify:allowed_chat_ids": "telegram:allowed_chat_ids",
60
58
  "exchanges:binance_enabled": "exchange:binance:enabled",
61
59
  "exchanges:mexc_enabled": "exchange:mexc:enabled",
62
- "exchanges:bybit_enabled": "exchange:bybit:enabled"
60
+ "exchanges:bybit_enabled": "exchange:bybit:enabled",
61
+ "exchanges:uniswap_ethereum_enabled": "exchange:uniswap-ethereum:enabled",
62
+ "exchanges:uniswap_arbitrum_enabled": "exchange:uniswap-arbitrum:enabled",
63
+ "exchanges:jupiter_solana_enabled": "exchange:jupiter-solana:enabled",
64
+ "wallet:config": "wallet:config"
63
65
  };
64
66
  var DASHBOARD_SECTIONS_NOT_FLAT_KV = new Set([
65
67
  "providers",
66
68
  "models",
67
69
  "cron",
68
- "behavior"
70
+ "behavior",
71
+ "endpoints"
69
72
  ]);
70
73
  var DASHBOARD_SECTIONS_UI_SKIP = new Set([
71
74
  "cron",
72
- "behavior"
75
+ "behavior",
76
+ "endpoints"
73
77
  ]);
74
78
  function isDashboardSectionFlatKv(sectionId) {
75
79
  return !DASHBOARD_SECTIONS_NOT_FLAT_KV.has(sectionId);
@@ -383,19 +387,19 @@ function loadDashboardManifestsFromRoot(root, onError) {
383
387
  return manifests;
384
388
  }
385
389
  export {
386
- stripJsonc,
387
- parseDashboardManifest,
388
- loadDashboardManifestsFromRoot,
389
- loadDashboardKvManifestFromRoot,
390
- kvManifestFromDashboardManifests,
391
- isDashboardSectionFlatKv,
392
- isDashboardSectionEditable,
393
- dashboardWorkerDir,
394
- buildDashboardKvKey,
395
- DASHBOARD_WORKER_PREFIX,
396
- DASHBOARD_WORKER_IDS,
397
- DASHBOARD_SECTION_PREFIX,
398
- DASHBOARD_SECTIONS_UI_SKIP,
390
+ DASHBOARD_FIELD_KV_OVERRIDES,
399
391
  DASHBOARD_SECTIONS_NOT_FLAT_KV,
400
- DASHBOARD_FIELD_KV_OVERRIDES
392
+ DASHBOARD_SECTIONS_UI_SKIP,
393
+ DASHBOARD_SECTION_PREFIX,
394
+ DASHBOARD_WORKER_IDS,
395
+ DASHBOARD_WORKER_PREFIX,
396
+ buildDashboardKvKey,
397
+ dashboardWorkerDir,
398
+ isDashboardSectionEditable,
399
+ isDashboardSectionFlatKv,
400
+ kvManifestFromDashboardManifests,
401
+ loadDashboardKvManifestFromRoot,
402
+ loadDashboardManifestsFromRoot,
403
+ parseDashboardManifest,
404
+ stripJsonc
401
405
  };