@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
package/dist/colors.d.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 HOOX · HOOX · jango-blockchained (hoox-sh)
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Color Tokens — Hoox TUI / shared design system (terminal-safe hex).
|
|
7
|
+
*
|
|
8
|
+
* Design DNA (2026 polish):
|
|
9
|
+
* - Near-black canvas (not warm grey)
|
|
10
|
+
* - Cool indigo / cyan accent (Grok Build–adjacent; less orange)
|
|
11
|
+
* - Squared edges (no rounding — editorial HUD aesthetic)
|
|
12
|
+
*
|
|
13
|
+
* Usage: import { Colors, ConnectionStatusColor } from "@hoox-sh/hoox-shared"
|
|
14
|
+
* <text fg={Colors.accent}>Important</text>
|
|
15
|
+
*/
|
|
16
|
+
export declare const Colors: {
|
|
17
|
+
readonly background: "#050508";
|
|
18
|
+
readonly foreground: "#E8E8F0";
|
|
19
|
+
readonly card: "#0A0A0F";
|
|
20
|
+
readonly border: "#232330";
|
|
21
|
+
readonly muted: "#8B8B9E";
|
|
22
|
+
readonly "muted-foreground": "#6E6E84";
|
|
23
|
+
readonly dim: "#3C3C50";
|
|
24
|
+
readonly accent: "#818CF8";
|
|
25
|
+
readonly "accent-dim": "#6366F1";
|
|
26
|
+
readonly success: "#34D399";
|
|
27
|
+
readonly warning: "#FBBF24";
|
|
28
|
+
readonly error: "#FB7185";
|
|
29
|
+
readonly info: "#38BDF8";
|
|
30
|
+
readonly text: "#E8E8F0";
|
|
31
|
+
readonly "text-muted": "#8B8B9E";
|
|
32
|
+
readonly panel: "#0A0A0F";
|
|
33
|
+
readonly divider: "#232330";
|
|
34
|
+
readonly highlight: "#22D3EE";
|
|
35
|
+
/** Dialog / overlay dim only — not a surface color */
|
|
36
|
+
readonly backdrop: "#000000";
|
|
37
|
+
};
|
|
38
|
+
export type ColorKey = keyof typeof Colors;
|
|
39
|
+
/**
|
|
40
|
+
* Cool spectrum for animated brackets (cyan → indigo → violet → magenta → back).
|
|
41
|
+
* Used by TUI chrome (`CoolBrackets`) similar to Grok Build accent motion.
|
|
42
|
+
*/
|
|
43
|
+
export declare const CoolBracketPalette: readonly ["#22D3EE", "#38BDF8", "#60A5FA", "#818CF8", "#A78BFA", "#C084FC", "#E879F9", "#A78BFA", "#818CF8", "#38BDF8"];
|
|
44
|
+
export type CoolBracketColor = (typeof CoolBracketPalette)[number];
|
|
45
|
+
/** Connection pill colors (status bar). */
|
|
46
|
+
export declare const ConnectionStatusColor: {
|
|
47
|
+
readonly connected: "#34D399";
|
|
48
|
+
readonly polling: "#22D3EE";
|
|
49
|
+
readonly reconnecting: "#FBBF24";
|
|
50
|
+
readonly offline: "#FB7185";
|
|
51
|
+
};
|
|
52
|
+
export type ConnectionStatusKey = keyof typeof ConnectionStatusColor;
|
|
53
|
+
/** Worker / service health colors. */
|
|
54
|
+
export declare const WorkerStatusColor: {
|
|
55
|
+
readonly operational: "#34D399";
|
|
56
|
+
readonly degraded: "#FBBF24";
|
|
57
|
+
readonly down: "#FB7185";
|
|
58
|
+
};
|
|
59
|
+
export type WorkerStatusKey = keyof typeof WorkerStatusColor;
|
|
60
|
+
/** Log stream level colors. `debug` uses muted (readable), not dim. */
|
|
61
|
+
export declare const LogLevelColor: {
|
|
62
|
+
readonly error: "#FB7185";
|
|
63
|
+
readonly warn: "#FBBF24";
|
|
64
|
+
readonly info: "#E8E8F0";
|
|
65
|
+
readonly debug: "#8B8B9E";
|
|
66
|
+
};
|
|
67
|
+
export type LogLevelColorKey = keyof typeof LogLevelColor;
|
|
68
|
+
/** Alert severity colors. */
|
|
69
|
+
export declare const AlertSeverityColor: {
|
|
70
|
+
readonly info: "#38BDF8";
|
|
71
|
+
readonly warning: "#FBBF24";
|
|
72
|
+
readonly error: "#FB7185";
|
|
73
|
+
readonly critical: "#FB7185";
|
|
74
|
+
};
|
|
75
|
+
export type AlertSeverityColorKey = keyof typeof AlertSeverityColor;
|
|
76
|
+
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../src/colors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;IA2BjB,sDAAsD;;CAE9C,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,MAAM,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,kBAAkB,yHAWrB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,2CAA2C;AAC3C,eAAO,MAAM,qBAAqB;;;;;CAKxB,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,MAAM,OAAO,qBAAqB,CAAC;AAErE,sCAAsC;AACtC,eAAO,MAAM,iBAAiB;;;;CAIpB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,iBAAiB,CAAC;AAE7D,uEAAuE;AACvE,eAAO,MAAM,aAAa;;;;;CAKhB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,aAAa,CAAC;AAE1D,6BAA6B;AAC7B,eAAO,MAAM,kBAAkB;;;;;CAKrB,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAAG,MAAM,OAAO,kBAAkB,CAAC"}
|
package/dist/colors.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
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/colors.ts
|
|
19
|
+
var Colors = {
|
|
20
|
+
background: "#050508",
|
|
21
|
+
foreground: "#E8E8F0",
|
|
22
|
+
card: "#0A0A0F",
|
|
23
|
+
border: "#232330",
|
|
24
|
+
muted: "#8B8B9E",
|
|
25
|
+
"muted-foreground": "#6E6E84",
|
|
26
|
+
dim: "#3C3C50",
|
|
27
|
+
accent: "#818CF8",
|
|
28
|
+
"accent-dim": "#6366F1",
|
|
29
|
+
success: "#34D399",
|
|
30
|
+
warning: "#FBBF24",
|
|
31
|
+
error: "#FB7185",
|
|
32
|
+
info: "#38BDF8",
|
|
33
|
+
text: "#E8E8F0",
|
|
34
|
+
"text-muted": "#8B8B9E",
|
|
35
|
+
panel: "#0A0A0F",
|
|
36
|
+
divider: "#232330",
|
|
37
|
+
highlight: "#22D3EE",
|
|
38
|
+
backdrop: "#000000"
|
|
39
|
+
};
|
|
40
|
+
var CoolBracketPalette = [
|
|
41
|
+
"#22D3EE",
|
|
42
|
+
"#38BDF8",
|
|
43
|
+
"#60A5FA",
|
|
44
|
+
"#818CF8",
|
|
45
|
+
"#A78BFA",
|
|
46
|
+
"#C084FC",
|
|
47
|
+
"#E879F9",
|
|
48
|
+
"#A78BFA",
|
|
49
|
+
"#818CF8",
|
|
50
|
+
"#38BDF8"
|
|
51
|
+
];
|
|
52
|
+
var ConnectionStatusColor = {
|
|
53
|
+
connected: Colors.success,
|
|
54
|
+
polling: Colors.highlight,
|
|
55
|
+
reconnecting: Colors.warning,
|
|
56
|
+
offline: Colors.error
|
|
57
|
+
};
|
|
58
|
+
var WorkerStatusColor = {
|
|
59
|
+
operational: Colors.success,
|
|
60
|
+
degraded: Colors.warning,
|
|
61
|
+
down: Colors.error
|
|
62
|
+
};
|
|
63
|
+
var LogLevelColor = {
|
|
64
|
+
error: Colors.error,
|
|
65
|
+
warn: Colors.warning,
|
|
66
|
+
info: Colors.foreground,
|
|
67
|
+
debug: Colors.muted
|
|
68
|
+
};
|
|
69
|
+
var AlertSeverityColor = {
|
|
70
|
+
info: Colors.info,
|
|
71
|
+
warning: Colors.warning,
|
|
72
|
+
error: Colors.error,
|
|
73
|
+
critical: Colors.error
|
|
74
|
+
};
|
|
75
|
+
export {
|
|
76
|
+
WorkerStatusColor,
|
|
77
|
+
LogLevelColor,
|
|
78
|
+
CoolBracketPalette,
|
|
79
|
+
ConnectionStatusColor,
|
|
80
|
+
Colors,
|
|
81
|
+
AlertSeverityColor
|
|
82
|
+
};
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 HOOX · HOOX · jango-blockchained (hoox-sh)
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
/** Owner rwx only — config dir may hold secrets and certs. */
|
|
6
|
+
export declare const HOOX_DIR_MODE = 448;
|
|
7
|
+
/** Owner rw only — config.json may contain apiToken. */
|
|
8
|
+
export declare const HOOX_CONFIG_FILE_MODE = 384;
|
|
9
|
+
/** Operator transport stored in config (mirrors HOOX_TRANSPORT). */
|
|
10
|
+
export type HooxConfigTransport = "public" | "access" | "mtls" | "tunnel";
|
|
11
|
+
export interface HooxConfig {
|
|
12
|
+
apiUrl: string;
|
|
13
|
+
apiToken: string;
|
|
14
|
+
/**
|
|
15
|
+
* Operator transport preference for TUI/CLI remote sessions.
|
|
16
|
+
* Env `HOOX_TRANSPORT` overrides this when set.
|
|
17
|
+
*/
|
|
18
|
+
transport?: HooxConfigTransport;
|
|
19
|
+
refreshIntervalMs: number;
|
|
20
|
+
theme: "dark" | "light";
|
|
21
|
+
activeExchanges: string[];
|
|
22
|
+
notifications: {
|
|
23
|
+
alerts: boolean;
|
|
24
|
+
trades: boolean;
|
|
25
|
+
debug: boolean;
|
|
26
|
+
system: boolean;
|
|
27
|
+
};
|
|
28
|
+
soundEnabled: boolean;
|
|
29
|
+
defaultView: string;
|
|
30
|
+
}
|
|
31
|
+
/** Read config from disk, merging with defaults and env vars */
|
|
32
|
+
export declare function readConfigSync(): HooxConfig;
|
|
33
|
+
export declare function readConfig(): Promise<HooxConfig>;
|
|
34
|
+
/**
|
|
35
|
+
* Ensure `~/.hoox` exists with owner-only permissions.
|
|
36
|
+
* Best-effort chmod on existing dirs (may fail on some FS / Windows).
|
|
37
|
+
*/
|
|
38
|
+
export declare function ensureHooxDirSecure(dir?: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* Write a path with owner-only file mode (0o600).
|
|
41
|
+
* Used by config writers and other secret-bearing files under ~/.hoox.
|
|
42
|
+
*/
|
|
43
|
+
export declare function writeSecureFileSync(filePath: string, contents: string, mode?: number): void;
|
|
44
|
+
/**
|
|
45
|
+
* True when group or other have any access bits set (Unix permission triad).
|
|
46
|
+
* Pure helper so tests do not depend on real filesystem after mock.module.
|
|
47
|
+
*/
|
|
48
|
+
export declare function isUnixModeGroupOrWorldAccessible(mode: number): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* True when group or other have any access bits set (Unix).
|
|
51
|
+
* Always false when the file is missing or mode is unavailable.
|
|
52
|
+
*/
|
|
53
|
+
export declare function isConfigWorldOrGroupReadable(filePath?: string): boolean;
|
|
54
|
+
/** Human-readable warning when config perms are too open. */
|
|
55
|
+
export declare function formatConfigPermissionWarning(filePath?: string): string | null;
|
|
56
|
+
/** Write config to disk with owner-only permissions. */
|
|
57
|
+
export declare function writeConfigSync(config: HooxConfig): void;
|
|
58
|
+
export declare function writeConfig(config: HooxConfig): Promise<void>;
|
|
59
|
+
/** Validate config — returns array of error messages */
|
|
60
|
+
export declare function validateConfig(config: Partial<HooxConfig>): string[];
|
|
61
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2BH,8DAA8D;AAC9D,eAAO,MAAM,aAAa,MAAQ,CAAC;AACnC,wDAAwD;AACxD,eAAO,MAAM,qBAAqB,MAAQ,CAAC;AAE3C,oEAAoE;AACpE,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE1E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE;QACb,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,OAAO,CAAC;QACf,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAmBD,gEAAgE;AAChE,wBAAgB,cAAc,IAAI,UAAU,CAsB3C;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,CAEtD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,MAAgB,GAAG,IAAI,CAS/D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAA8B,GACnC,IAAI,CAON;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtE;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,GAAE,MAAoB,GAC7B,OAAO,CAOT;AAED,6DAA6D;AAC7D,wBAAgB,6BAA6B,CAC3C,QAAQ,GAAE,MAAoB,GAC7B,MAAM,GAAG,IAAI,CAOf;AAED,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAWxD;AAED,wBAAsB,WAAW,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;AASD,wDAAwD;AACxD,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,EAAE,CAqBpE"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
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
|
+
export {
|
|
134
|
+
writeSecureFileSync,
|
|
135
|
+
writeConfigSync,
|
|
136
|
+
writeConfig,
|
|
137
|
+
validateConfig,
|
|
138
|
+
readConfigSync,
|
|
139
|
+
readConfig,
|
|
140
|
+
isUnixModeGroupOrWorldAccessible,
|
|
141
|
+
isConfigWorldOrGroupReadable,
|
|
142
|
+
formatConfigPermissionWarning,
|
|
143
|
+
ensureHooxDirSecure,
|
|
144
|
+
HOOX_DIR_MODE,
|
|
145
|
+
HOOX_CONFIG_FILE_MODE
|
|
146
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 HOOX · HOOX · jango-blockchained (hoox-sh)
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
import type { ScheduledEvent } from "@cloudflare/workers-types";
|
|
6
|
+
export interface CronHandlerOptions<Env = unknown> {
|
|
7
|
+
/** Name of the worker for logging context */
|
|
8
|
+
name: string;
|
|
9
|
+
/** Handler function to execute */
|
|
10
|
+
handler: (event: ScheduledEvent, env: Env, ctx: ExecutionContext) => Promise<void> | void;
|
|
11
|
+
/** Optional logger instance */
|
|
12
|
+
logger?: {
|
|
13
|
+
info(message: string, data?: Record<string, unknown>): void;
|
|
14
|
+
error(message: string, data?: Record<string, unknown>): void;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Creates a standardized cron handler with consistent logging and error handling.
|
|
19
|
+
*
|
|
20
|
+
* Usage:
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const cronHandler = createCronHandler({
|
|
23
|
+
* name: "agent-worker",
|
|
24
|
+
* handler: async (event, env, ctx) => {
|
|
25
|
+
* await runAgentRoutine(env);
|
|
26
|
+
* },
|
|
27
|
+
* logger: createLogger({ service: "agent-worker" })
|
|
28
|
+
* });
|
|
29
|
+
*
|
|
30
|
+
* export default {
|
|
31
|
+
* async scheduled(event, env, ctx) {
|
|
32
|
+
* return await cronHandler(event, env, ctx);
|
|
33
|
+
* }
|
|
34
|
+
* };
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function createCronHandler<Env = unknown>(options: CronHandlerOptions<Env>): (event: ScheduledEvent, env: Env, ctx: ExecutionContext) => Promise<void>;
|
|
38
|
+
//# sourceMappingURL=cron-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cron-handler.d.ts","sourceRoot":"","sources":["../src/cron-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,MAAM,WAAW,kBAAkB,CAAC,GAAG,GAAG,OAAO;IAC/C,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,OAAO,EAAE,CACP,KAAK,EAAE,cAAc,EACrB,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,gBAAgB,KAClB,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1B,+BAA+B;IAC/B,MAAM,CAAC,EAAE;QACP,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QAC5D,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;KAC9D,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,GAAG,OAAO,EAC7C,OAAO,EAAE,kBAAkB,CAAC,GAAG,CAAC,IAK9B,OAAO,cAAc,EACrB,KAAK,GAAG,EACR,KAAK,gBAAgB,KACpB,OAAO,CAAC,IAAI,CAAC,CA6BjB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
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/cron-handler.ts
|
|
19
|
+
function createCronHandler(options) {
|
|
20
|
+
const { name, handler, logger } = options;
|
|
21
|
+
return async (event, env, ctx) => {
|
|
22
|
+
const startTime = Date.now();
|
|
23
|
+
logger?.info(`${name} cron triggered`, {
|
|
24
|
+
cron: event.cron,
|
|
25
|
+
scheduledTime: event.scheduledTime
|
|
26
|
+
});
|
|
27
|
+
try {
|
|
28
|
+
await handler(event, env, ctx);
|
|
29
|
+
const durationMs = Date.now() - startTime;
|
|
30
|
+
logger?.info(`${name} cron handler completed successfully`, {
|
|
31
|
+
cron: event.cron,
|
|
32
|
+
durationMs
|
|
33
|
+
});
|
|
34
|
+
} catch (error) {
|
|
35
|
+
const durationMs = Date.now() - startTime;
|
|
36
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
37
|
+
logger?.error(`${name} cron handler failed`, {
|
|
38
|
+
cron: event.cron,
|
|
39
|
+
durationMs,
|
|
40
|
+
error: errorMsg
|
|
41
|
+
});
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
createCronHandler
|
|
48
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2026 HOOX · HOOX · jango-blockchained (hoox-sh)
|
|
3
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
*/
|
|
5
|
+
export { D1Repository } from "./repository";
|
|
6
|
+
export type { BatchStatement } from "./repository";
|
|
7
|
+
export type { TradeRecord, PositionRecord, BalanceRecord, SystemLogRecord, TradeSignalRecord, D1QueryResult, } from "./schemas";
|
|
8
|
+
export { TradeRecordSchema, PositionRecordSchema, BalanceRecordSchema, SystemLogRecordSchema, TradeSignalRecordSchema, } from "./schemas";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/d1/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,aAAa,GACd,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,WAAW,CAAC"}
|