@hoox-sh/hoox-shared 1.2.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 (161) hide show
  1. package/README.md +44 -0
  2. package/dist/agent-config-fields.d.ts +32 -0
  3. package/dist/agent-config-fields.d.ts.map +1 -0
  4. package/dist/agent-config-fields.js +220 -0
  5. package/dist/analytics.d.ts +47 -0
  6. package/dist/analytics.d.ts.map +1 -0
  7. package/dist/analytics.js +45 -0
  8. package/dist/api-client.d.ts +48 -0
  9. package/dist/api-client.d.ts.map +1 -0
  10. package/dist/api-client.js +191 -0
  11. package/dist/colors.d.ts +76 -0
  12. package/dist/colors.d.ts.map +1 -0
  13. package/dist/colors.js +82 -0
  14. package/dist/config.d.ts +61 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +146 -0
  17. package/dist/cron-handler.d.ts +38 -0
  18. package/dist/cron-handler.d.ts.map +1 -0
  19. package/dist/cron-handler.js +48 -0
  20. package/dist/d1/index.d.ts +9 -0
  21. package/dist/d1/index.d.ts.map +1 -0
  22. package/dist/d1/index.js +360 -0
  23. package/dist/d1/repository.d.ts +86 -0
  24. package/dist/d1/repository.d.ts.map +1 -0
  25. package/dist/d1/repository.js +297 -0
  26. package/dist/d1/schemas.d.ts +89 -0
  27. package/dist/d1/schemas.d.ts.map +1 -0
  28. package/dist/d1/schemas.js +81 -0
  29. package/dist/dashboard-manifest.d.ts +135 -0
  30. package/dist/dashboard-manifest.d.ts.map +1 -0
  31. package/dist/dashboard-manifest.js +401 -0
  32. package/dist/errors.d.ts +44 -0
  33. package/dist/errors.d.ts.map +1 -0
  34. package/dist/errors.js +149 -0
  35. package/dist/exchange-client.d.ts +98 -0
  36. package/dist/exchange-client.d.ts.map +1 -0
  37. package/dist/exchange-client.js +107 -0
  38. package/dist/exchanges/base-exchange-client.d.ts +81 -0
  39. package/dist/exchanges/base-exchange-client.d.ts.map +1 -0
  40. package/dist/exchanges/base-exchange-client.js +123 -0
  41. package/dist/exchanges/index.d.ts +7 -0
  42. package/dist/exchanges/index.d.ts.map +1 -0
  43. package/dist/exchanges/index.js +123 -0
  44. package/dist/exchanges/types.d.ts +23 -0
  45. package/dist/exchanges/types.d.ts.map +1 -0
  46. package/dist/exchanges/types.js +1 -0
  47. package/dist/format-time.d.ts +28 -0
  48. package/dist/format-time.d.ts.map +1 -0
  49. package/dist/format-time.js +57 -0
  50. package/dist/formatters.d.ts +36 -0
  51. package/dist/formatters.d.ts.map +1 -0
  52. package/dist/formatters.js +155 -0
  53. package/dist/health.d.ts +19 -0
  54. package/dist/health.d.ts.map +1 -0
  55. package/dist/health.js +160 -0
  56. package/dist/index.d.ts +72 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +4198 -0
  59. package/dist/kvKeys.d.ts +76 -0
  60. package/dist/kvKeys.d.ts.map +1 -0
  61. package/dist/kvKeys.js +107 -0
  62. package/dist/kvUtils.d.ts +30 -0
  63. package/dist/kvUtils.d.ts.map +1 -0
  64. package/dist/kvUtils.js +170 -0
  65. package/dist/legal.d.ts +15 -0
  66. package/dist/legal.d.ts.map +1 -0
  67. package/dist/legal.js +40 -0
  68. package/dist/middleware/auth.d.ts +102 -0
  69. package/dist/middleware/auth.d.ts.map +1 -0
  70. package/dist/middleware/auth.js +151 -0
  71. package/dist/middleware/cors.d.ts +58 -0
  72. package/dist/middleware/cors.d.ts.map +1 -0
  73. package/dist/middleware/cors.js +77 -0
  74. package/dist/middleware/index.d.ts +14 -0
  75. package/dist/middleware/index.d.ts.map +1 -0
  76. package/dist/middleware/index.js +635 -0
  77. package/dist/middleware/logger.d.ts +17 -0
  78. package/dist/middleware/logger.d.ts.map +1 -0
  79. package/dist/middleware/logger.js +202 -0
  80. package/dist/middleware/rate-limit.d.ts +30 -0
  81. package/dist/middleware/rate-limit.d.ts.map +1 -0
  82. package/dist/middleware/rate-limit.js +181 -0
  83. package/dist/middleware/security-headers.d.ts +43 -0
  84. package/dist/middleware/security-headers.d.ts.map +1 -0
  85. package/dist/middleware/security-headers.js +58 -0
  86. package/dist/middleware/validate.d.ts +25 -0
  87. package/dist/middleware/validate.d.ts.map +1 -0
  88. package/dist/middleware/validate.js +56 -0
  89. package/dist/operator-transport.d.ts +65 -0
  90. package/dist/operator-transport.d.ts.map +1 -0
  91. package/dist/operator-transport.js +87 -0
  92. package/dist/path-utils.d.ts +190 -0
  93. package/dist/path-utils.d.ts.map +1 -0
  94. package/dist/path-utils.js +188 -0
  95. package/dist/queue-handler.d.ts +47 -0
  96. package/dist/queue-handler.d.ts.map +1 -0
  97. package/dist/queue-handler.js +46 -0
  98. package/dist/router.d.ts +15 -0
  99. package/dist/router.d.ts.map +1 -0
  100. package/dist/router.js +130 -0
  101. package/dist/schemas/index.d.ts +8 -0
  102. package/dist/schemas/index.d.ts.map +1 -0
  103. package/dist/schemas/index.js +705 -0
  104. package/dist/schemas/registry.d.ts +12 -0
  105. package/dist/schemas/registry.d.ts.map +1 -0
  106. package/dist/schemas/registry.js +433 -0
  107. package/dist/schemas/types.d.ts +83 -0
  108. package/dist/schemas/types.d.ts.map +1 -0
  109. package/dist/schemas/types.js +1 -0
  110. package/dist/schemas/validators.d.ts +39 -0
  111. package/dist/schemas/validators.d.ts.map +1 -0
  112. package/dist/schemas/validators.js +290 -0
  113. package/dist/service-bindings.d.ts +78 -0
  114. package/dist/service-bindings.d.ts.map +1 -0
  115. package/dist/service-bindings.js +248 -0
  116. package/dist/session.d.ts +39 -0
  117. package/dist/session.d.ts.map +1 -0
  118. package/dist/session.js +261 -0
  119. package/dist/sse.d.ts +39 -0
  120. package/dist/sse.d.ts.map +1 -0
  121. package/dist/sse.js +154 -0
  122. package/dist/stores/config-store.d.ts +91 -0
  123. package/dist/stores/config-store.d.ts.map +1 -0
  124. package/dist/stores/config-store.js +255 -0
  125. package/dist/stores/service-store.d.ts +266 -0
  126. package/dist/stores/service-store.d.ts.map +1 -0
  127. package/dist/stores/service-store.js +516 -0
  128. package/dist/stores/ui-store.d.ts +67 -0
  129. package/dist/stores/ui-store.d.ts.map +1 -0
  130. package/dist/stores/ui-store.js +62 -0
  131. package/dist/test-utils.d.ts +136 -0
  132. package/dist/test-utils.d.ts.map +1 -0
  133. package/dist/test-utils.js +128 -0
  134. package/dist/types/errors.d.ts +20 -0
  135. package/dist/types/errors.d.ts.map +1 -0
  136. package/dist/types/errors.js +1 -0
  137. package/dist/types/router.d.ts +36 -0
  138. package/dist/types/router.d.ts.map +1 -0
  139. package/dist/types/router.js +1 -0
  140. package/dist/types.d.ts +442 -0
  141. package/dist/types.d.ts.map +1 -0
  142. package/dist/types.js +83 -0
  143. package/dist/wizard/engine.d.ts +46 -0
  144. package/dist/wizard/engine.d.ts.map +1 -0
  145. package/dist/wizard/engine.js +525 -0
  146. package/dist/wizard/index.d.ts +11 -0
  147. package/dist/wizard/index.d.ts.map +1 -0
  148. package/dist/wizard/index.js +544 -0
  149. package/dist/wizard/persistence.d.ts +18 -0
  150. package/dist/wizard/persistence.d.ts.map +1 -0
  151. package/dist/wizard/persistence.js +31 -0
  152. package/dist/wizard/presets.d.ts +38 -0
  153. package/dist/wizard/presets.d.ts.map +1 -0
  154. package/dist/wizard/presets.js +223 -0
  155. package/dist/wizard/provisioner.d.ts +15 -0
  156. package/dist/wizard/provisioner.d.ts.map +1 -0
  157. package/dist/wizard/provisioner.js +1 -0
  158. package/dist/wizard/types.d.ts +76 -0
  159. package/dist/wizard/types.d.ts.map +1 -0
  160. package/dist/wizard/types.js +1 -0
  161. package/package.json +117 -0
@@ -0,0 +1,255 @@
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
+ // src/config.ts
19
+ import {
20
+ readFileSync,
21
+ writeFileSync,
22
+ existsSync,
23
+ mkdirSync,
24
+ chmodSync,
25
+ statSync
26
+ } from "fs";
27
+ import { join } from "path";
28
+ import { homedir } from "os";
29
+ var HOX_DIR = join(homedir(), ".hoox");
30
+ var CONFIG_PATH = join(HOX_DIR, "config.json");
31
+ var HOOX_DIR_MODE = 448;
32
+ var HOOX_CONFIG_FILE_MODE = 384;
33
+ var DEFAULT_CONFIG = {
34
+ apiUrl: "http://localhost:8787",
35
+ apiToken: "",
36
+ transport: "public",
37
+ refreshIntervalMs: 500,
38
+ theme: "dark",
39
+ activeExchanges: ["binance", "bybit", "mexc"],
40
+ notifications: {
41
+ alerts: true,
42
+ trades: true,
43
+ debug: false,
44
+ system: true
45
+ },
46
+ soundEnabled: true,
47
+ defaultView: "dashboard"
48
+ };
49
+ function readConfigSync() {
50
+ const envConfig = {
51
+ apiUrl: process.env.HOOX_API_URL,
52
+ apiToken: process.env.HOOX_API_TOKEN
53
+ };
54
+ let fileConfig = {};
55
+ try {
56
+ if (existsSync(CONFIG_PATH)) {
57
+ fileConfig = JSON.parse(readFileSync(CONFIG_PATH, "utf-8"));
58
+ }
59
+ } catch {}
60
+ return {
61
+ ...DEFAULT_CONFIG,
62
+ ...fileConfig,
63
+ ...Object.fromEntries(Object.entries(envConfig).filter(([_, v]) => v !== undefined))
64
+ };
65
+ }
66
+ async function readConfig() {
67
+ return readConfigSync();
68
+ }
69
+ function ensureHooxDirSecure(dir = HOX_DIR) {
70
+ if (!existsSync(dir)) {
71
+ mkdirSync(dir, { recursive: true, mode: HOOX_DIR_MODE });
72
+ }
73
+ try {
74
+ chmodSync(dir, HOOX_DIR_MODE);
75
+ } catch {}
76
+ }
77
+ function writeSecureFileSync(filePath, contents, mode = HOOX_CONFIG_FILE_MODE) {
78
+ writeFileSync(filePath, contents, { encoding: "utf-8", mode });
79
+ try {
80
+ chmodSync(filePath, mode);
81
+ } catch {}
82
+ }
83
+ function isUnixModeGroupOrWorldAccessible(mode) {
84
+ return (mode & 63) !== 0;
85
+ }
86
+ function isConfigWorldOrGroupReadable(filePath = CONFIG_PATH) {
87
+ try {
88
+ if (!existsSync(filePath))
89
+ return false;
90
+ return isUnixModeGroupOrWorldAccessible(statSync(filePath).mode & 511);
91
+ } catch {
92
+ return false;
93
+ }
94
+ }
95
+ function formatConfigPermissionWarning(filePath = CONFIG_PATH) {
96
+ if (!isConfigWorldOrGroupReadable(filePath))
97
+ return null;
98
+ return `Warning: ${filePath} is group/world-accessible. ` + `Run: chmod 600 ${filePath} (and chmod 700 on the parent dir). ` + `This file may contain apiToken / operator secrets.`;
99
+ }
100
+ function writeConfigSync(config) {
101
+ try {
102
+ ensureHooxDirSecure(HOX_DIR);
103
+ writeSecureFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), HOOX_CONFIG_FILE_MODE);
104
+ } catch (err) {
105
+ console.error("Failed to write config:", err);
106
+ }
107
+ }
108
+ async function writeConfig(config) {
109
+ writeConfigSync(config);
110
+ }
111
+ var VALID_TRANSPORTS = new Set([
112
+ "public",
113
+ "access",
114
+ "mtls",
115
+ "tunnel"
116
+ ]);
117
+ function validateConfig(config) {
118
+ const errors = [];
119
+ if (config.apiUrl && !config.apiUrl.startsWith("http")) {
120
+ errors.push("apiUrl must start with http:// or https://");
121
+ }
122
+ if (config.refreshIntervalMs !== undefined && config.refreshIntervalMs < 100) {
123
+ errors.push("refreshIntervalMs must be >= 100ms");
124
+ }
125
+ if (config.theme && !["dark", "light"].includes(config.theme)) {
126
+ errors.push('theme must be "dark" or "light"');
127
+ }
128
+ if (config.transport !== undefined && !VALID_TRANSPORTS.has(config.transport)) {
129
+ errors.push('transport must be "public" | "access" | "mtls" | "tunnel"');
130
+ }
131
+ return errors;
132
+ }
133
+
134
+ // src/stores/config-store.ts
135
+ import { create } from "zustand";
136
+ import { immer } from "zustand/middleware/immer";
137
+ import { persist, createJSONStorage } from "zustand/middleware";
138
+ import { chmodSync as chmodSync2, mkdirSync as mkdirSync2, existsSync as existsSync2 } from "fs";
139
+ import { homedir as homedir2 } from "os";
140
+ import { join as join2 } from "path";
141
+ var bunConfigStorage = {
142
+ getItem: async (_name) => {
143
+ try {
144
+ const file = Bun.file(join2(homedir2(), ".hoox", "config.json"));
145
+ const exists = await file.exists();
146
+ if (!exists)
147
+ return null;
148
+ return await file.text();
149
+ } catch {
150
+ return null;
151
+ }
152
+ },
153
+ setItem: async (_name, value) => {
154
+ const dir = join2(homedir2(), ".hoox");
155
+ if (!existsSync2(dir)) {
156
+ mkdirSync2(dir, { recursive: true, mode: HOOX_DIR_MODE });
157
+ }
158
+ try {
159
+ chmodSync2(dir, HOOX_DIR_MODE);
160
+ } catch {}
161
+ const filePath = join2(dir, "config.json");
162
+ await Bun.write(filePath, value);
163
+ try {
164
+ chmodSync2(filePath, HOOX_CONFIG_FILE_MODE);
165
+ } catch {}
166
+ },
167
+ removeItem: async (_name) => {}
168
+ };
169
+ var DEFAULT_SHORTCUTS = {
170
+ "command-palette": "Ctrl+P",
171
+ "toggle-sidebar": "Ctrl+B",
172
+ "force-refresh": "Ctrl+R",
173
+ quit: "Ctrl+Q",
174
+ "view-1": "Ctrl+1",
175
+ "view-2": "Ctrl+2",
176
+ "view-3": "Ctrl+3",
177
+ "view-4": "Ctrl+4",
178
+ "view-5": "Ctrl+5",
179
+ "view-6": "Ctrl+6",
180
+ "view-7": "Ctrl+7",
181
+ "view-8": "Ctrl+8",
182
+ "view-9": "Ctrl+9",
183
+ "view-10": "Ctrl+0"
184
+ };
185
+ var DEFAULT_LOG_FILTER = {
186
+ levels: ["info", "warn", "error"],
187
+ workers: [],
188
+ searchText: ""
189
+ };
190
+ var DEFAULT_NOTIFICATIONS = {
191
+ alerts: true,
192
+ trades: false,
193
+ debug: false,
194
+ system: true
195
+ };
196
+ var defaults = {
197
+ theme: "dark",
198
+ refreshIntervalMs: 500,
199
+ defaultView: "dashboard",
200
+ activeExchanges: [],
201
+ keyboardShortcuts: { ...DEFAULT_SHORTCUTS },
202
+ logFilters: { ...DEFAULT_LOG_FILTER },
203
+ notifications: { ...DEFAULT_NOTIFICATIONS },
204
+ soundEnabled: false
205
+ };
206
+ var useConfigStore = create()(persist(immer((set) => ({
207
+ ...defaults,
208
+ updateConfig: (partial) => set((state) => {
209
+ if (partial.theme !== undefined)
210
+ state.theme = partial.theme;
211
+ if (partial.refreshIntervalMs !== undefined)
212
+ state.refreshIntervalMs = partial.refreshIntervalMs;
213
+ if (partial.defaultView !== undefined)
214
+ state.defaultView = partial.defaultView;
215
+ if (partial.activeExchanges !== undefined)
216
+ state.activeExchanges = partial.activeExchanges;
217
+ if (partial.keyboardShortcuts !== undefined)
218
+ state.keyboardShortcuts = partial.keyboardShortcuts;
219
+ if (partial.logFilters !== undefined)
220
+ state.logFilters = partial.logFilters;
221
+ if (partial.notifications !== undefined)
222
+ state.notifications = partial.notifications;
223
+ if (partial.soundEnabled !== undefined)
224
+ state.soundEnabled = partial.soundEnabled;
225
+ }),
226
+ resetDefaults: () => set((state) => {
227
+ Object.assign(state, defaults);
228
+ }),
229
+ setShortcut: (action, key) => set((state) => {
230
+ state.keyboardShortcuts[action] = key;
231
+ }),
232
+ toggleNotification: (channel) => set((state) => {
233
+ state.notifications[channel] = !state.notifications[channel];
234
+ })
235
+ })), {
236
+ name: "hoox-config",
237
+ storage: createJSONStorage(() => bunConfigStorage),
238
+ partialize: (state) => ({
239
+ theme: state.theme,
240
+ refreshIntervalMs: state.refreshIntervalMs,
241
+ defaultView: state.defaultView,
242
+ activeExchanges: state.activeExchanges,
243
+ keyboardShortcuts: state.keyboardShortcuts,
244
+ logFilters: state.logFilters,
245
+ notifications: state.notifications,
246
+ soundEnabled: state.soundEnabled
247
+ }),
248
+ merge: (persisted, current) => ({
249
+ ...current,
250
+ ...persisted
251
+ })
252
+ }));
253
+ export {
254
+ useConfigStore
255
+ };
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Copyright (c) 2026 HOOX · HOOX · jango-blockchained (hoox-sh)
3
+ * SPDX-License-Identifier: Apache-2.0
4
+ */
5
+ import type { WorkerInfo, Trade, Alert, LogEntry, SystemMetrics, ConnectionStatus, CliErrorDetails } from "../types";
6
+ export interface ServiceState {
7
+ workers: WorkerInfo[];
8
+ tradeStream: Trade[];
9
+ alerts: Alert[];
10
+ logs: LogEntry[];
11
+ metrics: SystemMetrics | null;
12
+ connectionStatus: ConnectionStatus;
13
+ lastUpdated: number;
14
+ selectedWorkerId: string | null;
15
+ /** Number of consecutive failed reconnection attempts */
16
+ retryCount: number;
17
+ /** Last connection error message (for display) */
18
+ lastError: string | null;
19
+ /**
20
+ * Structured CLI bridge error details. Populated when a `hoox` command
21
+ * fails so the status bar can render the full diagnostic context
22
+ * (command, exit code, stderr, error type) — not just a one-line summary.
23
+ * Cleared together with `lastError` on success or retry reset.
24
+ */
25
+ lastErrorDetails: CliErrorDetails | null;
26
+ /** Timestamp (ms) of the last successful API fetch */
27
+ lastSuccessfulFetch: number;
28
+ /** Current backoff delay in ms (0 when not reconnecting) */
29
+ reconnectDelay: number;
30
+ /** Timestamp when the connection was lost (for downtime calculation) */
31
+ disconnectedAt: number | null;
32
+ }
33
+ interface ServiceActions {
34
+ fetchWorkers: () => Promise<void>;
35
+ streamTrades: () => Promise<void>;
36
+ streamLogs: () => Promise<void>;
37
+ /**
38
+ * Abort active SSE trade/log subscriptions. Safe to call when none are open.
39
+ * Prefer calling on shell unmount so reconnect loops do not outlive the TUI.
40
+ */
41
+ stopStreams: () => void;
42
+ addAlert: (alert: Alert) => void;
43
+ addAlerts: (alerts: Alert[]) => void;
44
+ setConnectionStatus: (status: ConnectionStatus) => void;
45
+ selectWorker: (id: string | null) => void;
46
+ setWorkers: (workers: WorkerInfo[]) => void;
47
+ pushTrade: (trade: Trade) => void;
48
+ pushLog: (log: LogEntry) => void;
49
+ setMetrics: (metrics: SystemMetrics) => void;
50
+ /** Called on successful API response — resets error state */
51
+ handleConnectionSuccess: () => void;
52
+ /** Called on API failure — increments retry, applies backoff */
53
+ handleConnectionFailure: (errorMessage: string) => void;
54
+ /** Reset all retry/reconnect state (on full reconnect) */
55
+ resetRetries: () => void;
56
+ /** Force a connection retry from offline state */
57
+ forceRetry: () => void;
58
+ /**
59
+ * Record a structured CLI bridge failure. Stores both the short
60
+ * `lastError` string (for the one-line summary) and the full
61
+ * `lastErrorDetails` (for click-to-expand). Pass `null` to clear.
62
+ */
63
+ setLastErrorDetails: (details: CliErrorDetails | null) => void;
64
+ /**
65
+ * Clear the last error and last error details. Convenience alias for
66
+ * `setLastErrorDetails(null)` — clearer at call sites where the
67
+ * intent is to acknowledge an error rather than record a new one.
68
+ */
69
+ clearError: () => void;
70
+ /**
71
+ * Record a CLI bridge failure **and** add a matching high-severity
72
+ * alert to the alerts ring buffer. Use this when a failure should
73
+ * also be visible in the alerts panel (not just the status bar).
74
+ */
75
+ addCliErrorAlert: (details: CliErrorDetails) => void;
76
+ }
77
+ export declare const useServiceStore: import("zustand").UseBoundStore<Omit<import("zustand").StoreApi<ServiceState & ServiceActions>, "setState"> & {
78
+ setState(nextStateOrUpdater: (ServiceState & ServiceActions) | Partial<ServiceState & ServiceActions> | ((state: {
79
+ workers: {
80
+ id: string;
81
+ name: string;
82
+ status: import("..").WorkerStatus;
83
+ uptime: number;
84
+ cpu: number;
85
+ memory: number;
86
+ requests: number;
87
+ durableObjectCount: number;
88
+ edgeCount: number;
89
+ version?: string | undefined;
90
+ lastDeployed?: number | undefined;
91
+ }[];
92
+ tradeStream: {
93
+ id: string;
94
+ symbol: string;
95
+ side: import("..").TradeSide;
96
+ price: number;
97
+ quantity: number;
98
+ timestamp: number;
99
+ exchange: string;
100
+ strategy?: string | undefined;
101
+ pnl?: number | undefined;
102
+ }[];
103
+ alerts: {
104
+ id: string;
105
+ type: string;
106
+ severity: import("..").AlertSeverity;
107
+ message: string;
108
+ timestamp: number;
109
+ workerId?: string | undefined;
110
+ acknowledged: boolean;
111
+ source?: string | undefined;
112
+ }[];
113
+ logs: {
114
+ id: string;
115
+ level: import("..").LogLevel;
116
+ message: string;
117
+ timestamp: number;
118
+ workerId?: string | undefined;
119
+ source?: string | undefined;
120
+ metadata?: {
121
+ [x: string]: unknown;
122
+ } | undefined;
123
+ }[];
124
+ metrics: {
125
+ totalWorkers: number;
126
+ onlineWorkers: number;
127
+ totalPnl: number;
128
+ activeStrategies: number;
129
+ dailyTrades: number;
130
+ aiCalls: number;
131
+ uptime: number;
132
+ lastUpdated: number;
133
+ } | null;
134
+ connectionStatus: ConnectionStatus;
135
+ lastUpdated: number;
136
+ selectedWorkerId: string | null;
137
+ retryCount: number;
138
+ lastError: string | null;
139
+ lastErrorDetails: {
140
+ command: string;
141
+ exitCode: number;
142
+ stderr: string;
143
+ stdout: string;
144
+ errorType: import("..").CliErrorType;
145
+ timestamp: number;
146
+ duration: number;
147
+ } | null;
148
+ lastSuccessfulFetch: number;
149
+ reconnectDelay: number;
150
+ disconnectedAt: number | null;
151
+ fetchWorkers: () => Promise<void>;
152
+ streamTrades: () => Promise<void>;
153
+ streamLogs: () => Promise<void>;
154
+ stopStreams: () => void;
155
+ addAlert: (alert: Alert) => void;
156
+ addAlerts: (alerts: Alert[]) => void;
157
+ setConnectionStatus: (status: ConnectionStatus) => void;
158
+ selectWorker: (id: string | null) => void;
159
+ setWorkers: (workers: WorkerInfo[]) => void;
160
+ pushTrade: (trade: Trade) => void;
161
+ pushLog: (log: LogEntry) => void;
162
+ setMetrics: (metrics: SystemMetrics) => void;
163
+ handleConnectionSuccess: () => void;
164
+ handleConnectionFailure: (errorMessage: string) => void;
165
+ resetRetries: () => void;
166
+ forceRetry: () => void;
167
+ setLastErrorDetails: (details: CliErrorDetails | null) => void;
168
+ clearError: () => void;
169
+ addCliErrorAlert: (details: CliErrorDetails) => void;
170
+ }) => void), shouldReplace?: false): void;
171
+ setState(nextStateOrUpdater: (ServiceState & ServiceActions) | ((state: {
172
+ workers: {
173
+ id: string;
174
+ name: string;
175
+ status: import("..").WorkerStatus;
176
+ uptime: number;
177
+ cpu: number;
178
+ memory: number;
179
+ requests: number;
180
+ durableObjectCount: number;
181
+ edgeCount: number;
182
+ version?: string | undefined;
183
+ lastDeployed?: number | undefined;
184
+ }[];
185
+ tradeStream: {
186
+ id: string;
187
+ symbol: string;
188
+ side: import("..").TradeSide;
189
+ price: number;
190
+ quantity: number;
191
+ timestamp: number;
192
+ exchange: string;
193
+ strategy?: string | undefined;
194
+ pnl?: number | undefined;
195
+ }[];
196
+ alerts: {
197
+ id: string;
198
+ type: string;
199
+ severity: import("..").AlertSeverity;
200
+ message: string;
201
+ timestamp: number;
202
+ workerId?: string | undefined;
203
+ acknowledged: boolean;
204
+ source?: string | undefined;
205
+ }[];
206
+ logs: {
207
+ id: string;
208
+ level: import("..").LogLevel;
209
+ message: string;
210
+ timestamp: number;
211
+ workerId?: string | undefined;
212
+ source?: string | undefined;
213
+ metadata?: {
214
+ [x: string]: unknown;
215
+ } | undefined;
216
+ }[];
217
+ metrics: {
218
+ totalWorkers: number;
219
+ onlineWorkers: number;
220
+ totalPnl: number;
221
+ activeStrategies: number;
222
+ dailyTrades: number;
223
+ aiCalls: number;
224
+ uptime: number;
225
+ lastUpdated: number;
226
+ } | null;
227
+ connectionStatus: ConnectionStatus;
228
+ lastUpdated: number;
229
+ selectedWorkerId: string | null;
230
+ retryCount: number;
231
+ lastError: string | null;
232
+ lastErrorDetails: {
233
+ command: string;
234
+ exitCode: number;
235
+ stderr: string;
236
+ stdout: string;
237
+ errorType: import("..").CliErrorType;
238
+ timestamp: number;
239
+ duration: number;
240
+ } | null;
241
+ lastSuccessfulFetch: number;
242
+ reconnectDelay: number;
243
+ disconnectedAt: number | null;
244
+ fetchWorkers: () => Promise<void>;
245
+ streamTrades: () => Promise<void>;
246
+ streamLogs: () => Promise<void>;
247
+ stopStreams: () => void;
248
+ addAlert: (alert: Alert) => void;
249
+ addAlerts: (alerts: Alert[]) => void;
250
+ setConnectionStatus: (status: ConnectionStatus) => void;
251
+ selectWorker: (id: string | null) => void;
252
+ setWorkers: (workers: WorkerInfo[]) => void;
253
+ pushTrade: (trade: Trade) => void;
254
+ pushLog: (log: LogEntry) => void;
255
+ setMetrics: (metrics: SystemMetrics) => void;
256
+ handleConnectionSuccess: () => void;
257
+ handleConnectionFailure: (errorMessage: string) => void;
258
+ resetRetries: () => void;
259
+ forceRetry: () => void;
260
+ setLastErrorDetails: (details: CliErrorDetails | null) => void;
261
+ clearError: () => void;
262
+ addCliErrorAlert: (details: CliErrorDetails) => void;
263
+ }) => void), shouldReplace: true): void;
264
+ }>;
265
+ export {};
266
+ //# sourceMappingURL=service-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-store.d.ts","sourceRoot":"","sources":["../../src/stores/service-store.ts"],"names":[],"mappings":"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"}