@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.
- package/README.md +44 -0
- package/dist/agent-config-fields.d.ts +32 -0
- package/dist/agent-config-fields.d.ts.map +1 -0
- package/dist/agent-config-fields.js +220 -0
- package/dist/analytics.d.ts +47 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +45 -0
- package/dist/api-client.d.ts +48 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +191 -0
- package/dist/colors.d.ts +76 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js +82 -0
- package/dist/config.d.ts +61 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +146 -0
- package/dist/cron-handler.d.ts +38 -0
- package/dist/cron-handler.d.ts.map +1 -0
- package/dist/cron-handler.js +48 -0
- package/dist/d1/index.d.ts +9 -0
- package/dist/d1/index.d.ts.map +1 -0
- package/dist/d1/index.js +360 -0
- package/dist/d1/repository.d.ts +86 -0
- package/dist/d1/repository.d.ts.map +1 -0
- package/dist/d1/repository.js +297 -0
- package/dist/d1/schemas.d.ts +89 -0
- package/dist/d1/schemas.d.ts.map +1 -0
- package/dist/d1/schemas.js +81 -0
- package/dist/dashboard-manifest.d.ts +135 -0
- package/dist/dashboard-manifest.d.ts.map +1 -0
- package/dist/dashboard-manifest.js +401 -0
- package/dist/errors.d.ts +44 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +149 -0
- package/dist/exchange-client.d.ts +98 -0
- package/dist/exchange-client.d.ts.map +1 -0
- package/dist/exchange-client.js +107 -0
- package/dist/exchanges/base-exchange-client.d.ts +81 -0
- package/dist/exchanges/base-exchange-client.d.ts.map +1 -0
- package/dist/exchanges/base-exchange-client.js +123 -0
- package/dist/exchanges/index.d.ts +7 -0
- package/dist/exchanges/index.d.ts.map +1 -0
- package/dist/exchanges/index.js +123 -0
- package/dist/exchanges/types.d.ts +23 -0
- package/dist/exchanges/types.d.ts.map +1 -0
- package/dist/exchanges/types.js +1 -0
- package/dist/format-time.d.ts +28 -0
- package/dist/format-time.d.ts.map +1 -0
- package/dist/format-time.js +57 -0
- package/dist/formatters.d.ts +36 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +155 -0
- package/dist/health.d.ts +19 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +160 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4198 -0
- package/dist/kvKeys.d.ts +76 -0
- package/dist/kvKeys.d.ts.map +1 -0
- package/dist/kvKeys.js +107 -0
- package/dist/kvUtils.d.ts +30 -0
- package/dist/kvUtils.d.ts.map +1 -0
- package/dist/kvUtils.js +170 -0
- package/dist/legal.d.ts +15 -0
- package/dist/legal.d.ts.map +1 -0
- package/dist/legal.js +40 -0
- package/dist/middleware/auth.d.ts +102 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +151 -0
- package/dist/middleware/cors.d.ts +58 -0
- package/dist/middleware/cors.d.ts.map +1 -0
- package/dist/middleware/cors.js +77 -0
- package/dist/middleware/index.d.ts +14 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +635 -0
- package/dist/middleware/logger.d.ts +17 -0
- package/dist/middleware/logger.d.ts.map +1 -0
- package/dist/middleware/logger.js +202 -0
- package/dist/middleware/rate-limit.d.ts +30 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit.js +181 -0
- package/dist/middleware/security-headers.d.ts +43 -0
- package/dist/middleware/security-headers.d.ts.map +1 -0
- package/dist/middleware/security-headers.js +58 -0
- package/dist/middleware/validate.d.ts +25 -0
- package/dist/middleware/validate.d.ts.map +1 -0
- package/dist/middleware/validate.js +56 -0
- package/dist/operator-transport.d.ts +65 -0
- package/dist/operator-transport.d.ts.map +1 -0
- package/dist/operator-transport.js +87 -0
- package/dist/path-utils.d.ts +190 -0
- package/dist/path-utils.d.ts.map +1 -0
- package/dist/path-utils.js +188 -0
- package/dist/queue-handler.d.ts +47 -0
- package/dist/queue-handler.d.ts.map +1 -0
- package/dist/queue-handler.js +46 -0
- package/dist/router.d.ts +15 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +130 -0
- package/dist/schemas/index.d.ts +8 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +705 -0
- package/dist/schemas/registry.d.ts +12 -0
- package/dist/schemas/registry.d.ts.map +1 -0
- package/dist/schemas/registry.js +433 -0
- package/dist/schemas/types.d.ts +83 -0
- package/dist/schemas/types.d.ts.map +1 -0
- package/dist/schemas/types.js +1 -0
- package/dist/schemas/validators.d.ts +39 -0
- package/dist/schemas/validators.d.ts.map +1 -0
- package/dist/schemas/validators.js +290 -0
- package/dist/service-bindings.d.ts +78 -0
- package/dist/service-bindings.d.ts.map +1 -0
- package/dist/service-bindings.js +248 -0
- package/dist/session.d.ts +39 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +261 -0
- package/dist/sse.d.ts +39 -0
- package/dist/sse.d.ts.map +1 -0
- package/dist/sse.js +154 -0
- package/dist/stores/config-store.d.ts +91 -0
- package/dist/stores/config-store.d.ts.map +1 -0
- package/dist/stores/config-store.js +255 -0
- package/dist/stores/service-store.d.ts +266 -0
- package/dist/stores/service-store.d.ts.map +1 -0
- package/dist/stores/service-store.js +516 -0
- package/dist/stores/ui-store.d.ts +67 -0
- package/dist/stores/ui-store.d.ts.map +1 -0
- package/dist/stores/ui-store.js +62 -0
- package/dist/test-utils.d.ts +136 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/test-utils.js +128 -0
- package/dist/types/errors.d.ts +20 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +1 -0
- package/dist/types/router.d.ts +36 -0
- package/dist/types/router.d.ts.map +1 -0
- package/dist/types/router.js +1 -0
- package/dist/types.d.ts +442 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +83 -0
- package/dist/wizard/engine.d.ts +46 -0
- package/dist/wizard/engine.d.ts.map +1 -0
- package/dist/wizard/engine.js +525 -0
- package/dist/wizard/index.d.ts +11 -0
- package/dist/wizard/index.d.ts.map +1 -0
- package/dist/wizard/index.js +544 -0
- package/dist/wizard/persistence.d.ts +18 -0
- package/dist/wizard/persistence.d.ts.map +1 -0
- package/dist/wizard/persistence.js +31 -0
- package/dist/wizard/presets.d.ts +38 -0
- package/dist/wizard/presets.d.ts.map +1 -0
- package/dist/wizard/presets.js +223 -0
- package/dist/wizard/provisioner.d.ts +15 -0
- package/dist/wizard/provisioner.d.ts.map +1 -0
- package/dist/wizard/provisioner.js +1 -0
- package/dist/wizard/types.d.ts +76 -0
- package/dist/wizard/types.d.ts.map +1 -0
- package/dist/wizard/types.js +1 -0
- 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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"}
|