@sequence0/blockclaw 2.0.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 +97 -0
- package/dist/agent/binary.d.ts +15 -0
- package/dist/agent/binary.d.ts.map +1 -0
- package/dist/agent/binary.js +172 -0
- package/dist/agent/binary.js.map +1 -0
- package/dist/agent/chains.d.ts +26 -0
- package/dist/agent/chains.d.ts.map +1 -0
- package/dist/agent/chains.js +123 -0
- package/dist/agent/chains.js.map +1 -0
- package/dist/agent/client.d.ts +484 -0
- package/dist/agent/client.d.ts.map +1 -0
- package/dist/agent/client.js +448 -0
- package/dist/agent/client.js.map +1 -0
- package/dist/agent/config.d.ts +75 -0
- package/dist/agent/config.d.ts.map +1 -0
- package/dist/agent/config.js +133 -0
- package/dist/agent/config.js.map +1 -0
- package/dist/agent/process.d.ts +36 -0
- package/dist/agent/process.d.ts.map +1 -0
- package/dist/agent/process.js +208 -0
- package/dist/agent/process.js.map +1 -0
- package/dist/agent/wallet.d.ts +43 -0
- package/dist/agent/wallet.d.ts.map +1 -0
- package/dist/agent/wallet.js +146 -0
- package/dist/agent/wallet.js.map +1 -0
- package/dist/ai/brain.d.ts +21 -0
- package/dist/ai/brain.d.ts.map +1 -0
- package/dist/ai/brain.js +117 -0
- package/dist/ai/brain.js.map +1 -0
- package/dist/ai/prompts.d.ts +15 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +67 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/ai/rules.d.ts +19 -0
- package/dist/ai/rules.d.ts.map +1 -0
- package/dist/ai/rules.js +143 -0
- package/dist/ai/rules.js.map +1 -0
- package/dist/core/detector.d.ts +16 -0
- package/dist/core/detector.d.ts.map +1 -0
- package/dist/core/detector.js +90 -0
- package/dist/core/detector.js.map +1 -0
- package/dist/core/healer.d.ts +62 -0
- package/dist/core/healer.d.ts.map +1 -0
- package/dist/core/healer.js +355 -0
- package/dist/core/healer.js.map +1 -0
- package/dist/core/heartbeat.d.ts +67 -0
- package/dist/core/heartbeat.d.ts.map +1 -0
- package/dist/core/heartbeat.js +426 -0
- package/dist/core/heartbeat.js.map +1 -0
- package/dist/core/memory.d.ts +57 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +149 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/updater.d.ts +16 -0
- package/dist/core/updater.d.ts.map +1 -0
- package/dist/core/updater.js +107 -0
- package/dist/core/updater.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -0
- package/dist/interface/commands/ask.d.ts +3 -0
- package/dist/interface/commands/ask.d.ts.map +1 -0
- package/dist/interface/commands/ask.js +39 -0
- package/dist/interface/commands/ask.js.map +1 -0
- package/dist/interface/commands/backup.d.ts +3 -0
- package/dist/interface/commands/backup.d.ts.map +1 -0
- package/dist/interface/commands/backup.js +576 -0
- package/dist/interface/commands/backup.js.map +1 -0
- package/dist/interface/commands/config.d.ts +3 -0
- package/dist/interface/commands/config.d.ts.map +1 -0
- package/dist/interface/commands/config.js +107 -0
- package/dist/interface/commands/config.js.map +1 -0
- package/dist/interface/commands/daemon.d.ts +3 -0
- package/dist/interface/commands/daemon.d.ts.map +1 -0
- package/dist/interface/commands/daemon.js +162 -0
- package/dist/interface/commands/daemon.js.map +1 -0
- package/dist/interface/commands/doctor.d.ts +3 -0
- package/dist/interface/commands/doctor.d.ts.map +1 -0
- package/dist/interface/commands/doctor.js +143 -0
- package/dist/interface/commands/doctor.js.map +1 -0
- package/dist/interface/commands/earnings.d.ts +3 -0
- package/dist/interface/commands/earnings.d.ts.map +1 -0
- package/dist/interface/commands/earnings.js +165 -0
- package/dist/interface/commands/earnings.js.map +1 -0
- package/dist/interface/commands/health.d.ts +3 -0
- package/dist/interface/commands/health.d.ts.map +1 -0
- package/dist/interface/commands/health.js +48 -0
- package/dist/interface/commands/health.js.map +1 -0
- package/dist/interface/commands/history.d.ts +3 -0
- package/dist/interface/commands/history.d.ts.map +1 -0
- package/dist/interface/commands/history.js +113 -0
- package/dist/interface/commands/history.js.map +1 -0
- package/dist/interface/commands/info.d.ts +3 -0
- package/dist/interface/commands/info.d.ts.map +1 -0
- package/dist/interface/commands/info.js +82 -0
- package/dist/interface/commands/info.js.map +1 -0
- package/dist/interface/commands/logs.d.ts +3 -0
- package/dist/interface/commands/logs.d.ts.map +1 -0
- package/dist/interface/commands/logs.js +98 -0
- package/dist/interface/commands/logs.js.map +1 -0
- package/dist/interface/commands/menu.d.ts +4 -0
- package/dist/interface/commands/menu.d.ts.map +1 -0
- package/dist/interface/commands/menu.js +156 -0
- package/dist/interface/commands/menu.js.map +1 -0
- package/dist/interface/commands/receive.d.ts +3 -0
- package/dist/interface/commands/receive.d.ts.map +1 -0
- package/dist/interface/commands/receive.js +81 -0
- package/dist/interface/commands/receive.js.map +1 -0
- package/dist/interface/commands/register.d.ts +3 -0
- package/dist/interface/commands/register.d.ts.map +1 -0
- package/dist/interface/commands/register.js +231 -0
- package/dist/interface/commands/register.js.map +1 -0
- package/dist/interface/commands/restart.d.ts +3 -0
- package/dist/interface/commands/restart.d.ts.map +1 -0
- package/dist/interface/commands/restart.js +154 -0
- package/dist/interface/commands/restart.js.map +1 -0
- package/dist/interface/commands/send.d.ts +3 -0
- package/dist/interface/commands/send.d.ts.map +1 -0
- package/dist/interface/commands/send.js +108 -0
- package/dist/interface/commands/send.js.map +1 -0
- package/dist/interface/commands/service.d.ts +3 -0
- package/dist/interface/commands/service.d.ts.map +1 -0
- package/dist/interface/commands/service.js +474 -0
- package/dist/interface/commands/service.js.map +1 -0
- package/dist/interface/commands/setup.d.ts +5 -0
- package/dist/interface/commands/setup.d.ts.map +1 -0
- package/dist/interface/commands/setup.js +410 -0
- package/dist/interface/commands/setup.js.map +1 -0
- package/dist/interface/commands/start.d.ts +3 -0
- package/dist/interface/commands/start.d.ts.map +1 -0
- package/dist/interface/commands/start.js +171 -0
- package/dist/interface/commands/start.js.map +1 -0
- package/dist/interface/commands/status.d.ts +3 -0
- package/dist/interface/commands/status.d.ts.map +1 -0
- package/dist/interface/commands/status.js +77 -0
- package/dist/interface/commands/status.js.map +1 -0
- package/dist/interface/commands/stop.d.ts +3 -0
- package/dist/interface/commands/stop.d.ts.map +1 -0
- package/dist/interface/commands/stop.js +62 -0
- package/dist/interface/commands/stop.js.map +1 -0
- package/dist/interface/commands/update.d.ts +3 -0
- package/dist/interface/commands/update.d.ts.map +1 -0
- package/dist/interface/commands/update.js +53 -0
- package/dist/interface/commands/update.js.map +1 -0
- package/dist/interface/commands/wallet.d.ts +3 -0
- package/dist/interface/commands/wallet.d.ts.map +1 -0
- package/dist/interface/commands/wallet.js +446 -0
- package/dist/interface/commands/wallet.js.map +1 -0
- package/dist/interface/commands/webhook.d.ts +3 -0
- package/dist/interface/commands/webhook.d.ts.map +1 -0
- package/dist/interface/commands/webhook.js +99 -0
- package/dist/interface/commands/webhook.js.map +1 -0
- package/dist/interface/commands/withdraw.d.ts +3 -0
- package/dist/interface/commands/withdraw.d.ts.map +1 -0
- package/dist/interface/commands/withdraw.js +261 -0
- package/dist/interface/commands/withdraw.js.map +1 -0
- package/dist/interface/interactive.d.ts +43 -0
- package/dist/interface/interactive.d.ts.map +1 -0
- package/dist/interface/interactive.js +276 -0
- package/dist/interface/interactive.js.map +1 -0
- package/dist/interface/logo.d.ts +2 -0
- package/dist/interface/logo.d.ts.map +1 -0
- package/dist/interface/logo.js +21 -0
- package/dist/interface/logo.js.map +1 -0
- package/dist/interface/webhooks.d.ts +19 -0
- package/dist/interface/webhooks.d.ts.map +1 -0
- package/dist/interface/webhooks.js +172 -0
- package/dist/interface/webhooks.js.map +1 -0
- package/dist/utils/format.d.ts +19 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +107 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +47 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +35 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +45 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/platform.d.ts +26 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +72 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import TOML from "toml";
|
|
3
|
+
import { AGENT_CONFIG, BLOCKCLAW_CONFIG, ensureBlockclawDir } from "../utils/paths.js";
|
|
4
|
+
import { logger } from "../utils/logger.js";
|
|
5
|
+
/** Read the agent's config.toml */
|
|
6
|
+
export function readAgentConfig() {
|
|
7
|
+
return readToml(AGENT_CONFIG);
|
|
8
|
+
}
|
|
9
|
+
/** Current config schema version */
|
|
10
|
+
const CURRENT_CONFIG_VERSION = 1;
|
|
11
|
+
/** Read the BlockClaw config.toml, migrating old configs if needed */
|
|
12
|
+
export function readBlockclawConfig() {
|
|
13
|
+
const config = readToml(BLOCKCLAW_CONFIG) ?? {};
|
|
14
|
+
// Migrate configs that lack a version (pre-versioning)
|
|
15
|
+
if (config.config_version === undefined) {
|
|
16
|
+
config.config_version = CURRENT_CONFIG_VERSION;
|
|
17
|
+
// Backfill missing defaults from v1
|
|
18
|
+
if (config.heartbeat_interval === undefined)
|
|
19
|
+
config.heartbeat_interval = 30;
|
|
20
|
+
// Persist the migrated config so migration only runs once
|
|
21
|
+
try {
|
|
22
|
+
writeBlockclawConfig(config);
|
|
23
|
+
}
|
|
24
|
+
catch { /* best-effort */ }
|
|
25
|
+
}
|
|
26
|
+
return config;
|
|
27
|
+
}
|
|
28
|
+
/** Write the BlockClaw config.toml */
|
|
29
|
+
export function writeBlockclawConfig(config) {
|
|
30
|
+
ensureBlockclawDir();
|
|
31
|
+
// Always stamp the current config version
|
|
32
|
+
config.config_version = CURRENT_CONFIG_VERSION;
|
|
33
|
+
const lines = [
|
|
34
|
+
"# BlockClaw Configuration",
|
|
35
|
+
`# Generated by BlockClaw`,
|
|
36
|
+
"",
|
|
37
|
+
];
|
|
38
|
+
for (const [key, value] of Object.entries(config)) {
|
|
39
|
+
if (value === undefined || value === null)
|
|
40
|
+
continue;
|
|
41
|
+
if (typeof value === "string") {
|
|
42
|
+
lines.push(`${key} = "${escapeTomlString(value)}"`);
|
|
43
|
+
}
|
|
44
|
+
else if (typeof value === "boolean") {
|
|
45
|
+
lines.push(`${key} = ${value}`);
|
|
46
|
+
}
|
|
47
|
+
else if (typeof value === "number") {
|
|
48
|
+
lines.push(`${key} = ${value}`);
|
|
49
|
+
}
|
|
50
|
+
else if (Array.isArray(value)) {
|
|
51
|
+
lines.push(`${key} = [${value.map(v => `"${escapeTomlString(String(v))}"`).join(", ")}]`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
fs.writeFileSync(BLOCKCLAW_CONFIG, lines.join("\n") + "\n", { encoding: "utf8", mode: 0o600 });
|
|
55
|
+
}
|
|
56
|
+
/** Set a single config value */
|
|
57
|
+
export function setConfigValue(key, value) {
|
|
58
|
+
const config = readBlockclawConfig();
|
|
59
|
+
// Parse value type
|
|
60
|
+
if (value === "true" || value === "false") {
|
|
61
|
+
config[key] = value === "true";
|
|
62
|
+
}
|
|
63
|
+
else if (/^\d+$/.test(value)) {
|
|
64
|
+
config[key] = parseInt(value, 10);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
config[key] = value;
|
|
68
|
+
}
|
|
69
|
+
writeBlockclawConfig(config);
|
|
70
|
+
logger.success(`Set ${key} = ${value}`);
|
|
71
|
+
}
|
|
72
|
+
/** Get a single config value */
|
|
73
|
+
export function getConfigValue(key) {
|
|
74
|
+
const config = readBlockclawConfig();
|
|
75
|
+
return config[key];
|
|
76
|
+
}
|
|
77
|
+
/** Initialize default BlockClaw config */
|
|
78
|
+
export function initConfig(network = "mainnet") {
|
|
79
|
+
const config = {
|
|
80
|
+
api_port: 8080,
|
|
81
|
+
network,
|
|
82
|
+
auto_heal: true,
|
|
83
|
+
heartbeat_interval: 30,
|
|
84
|
+
max_restarts: 5,
|
|
85
|
+
restart_window: 300,
|
|
86
|
+
auto_update: false,
|
|
87
|
+
verbose: false,
|
|
88
|
+
};
|
|
89
|
+
writeBlockclawConfig(config);
|
|
90
|
+
logger.success(`Config initialized at ${BLOCKCLAW_CONFIG}`);
|
|
91
|
+
}
|
|
92
|
+
/** Merge agent config + blockclaw config into process options */
|
|
93
|
+
export function mergeConfigs() {
|
|
94
|
+
const agent = readAgentConfig() ?? {};
|
|
95
|
+
const bc = readBlockclawConfig();
|
|
96
|
+
return {
|
|
97
|
+
network: bc.network ?? agent.network ?? "mainnet",
|
|
98
|
+
port: agent.port ?? 9000,
|
|
99
|
+
apiPort: bc.api_port ?? agent.api_port ?? 8080,
|
|
100
|
+
dataDir: agent.data_dir,
|
|
101
|
+
rpcUrl: agent.rpc_url,
|
|
102
|
+
registry: agent.registry,
|
|
103
|
+
walletFactory: agent.wallet_factory,
|
|
104
|
+
feeCollector: agent.fee_collector,
|
|
105
|
+
programRegistry: agent.program_registry,
|
|
106
|
+
delegationRegistry: agent.delegation_registry,
|
|
107
|
+
daemon: agent.daemon ?? true,
|
|
108
|
+
bootstrap: agent.bootstrap,
|
|
109
|
+
logLevel: agent.log_level ?? "info",
|
|
110
|
+
externalIp: agent.external_ip,
|
|
111
|
+
noRegistry: agent.no_registry ?? false,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/** Escape a string for safe TOML output */
|
|
115
|
+
function escapeTomlString(value) {
|
|
116
|
+
return value
|
|
117
|
+
.replace(/\\/g, "\\\\")
|
|
118
|
+
.replace(/"/g, '\\"')
|
|
119
|
+
.replace(/\n/g, "\\n")
|
|
120
|
+
.replace(/\r/g, "\\r")
|
|
121
|
+
.replace(/\t/g, "\\t");
|
|
122
|
+
}
|
|
123
|
+
/** Read and parse a TOML file */
|
|
124
|
+
function readToml(filePath) {
|
|
125
|
+
try {
|
|
126
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
127
|
+
return TOML.parse(content);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/agent/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ChildProcess } from "node:child_process";
|
|
2
|
+
export interface AgentProcessOptions {
|
|
3
|
+
binPath: string;
|
|
4
|
+
network?: string;
|
|
5
|
+
port?: number;
|
|
6
|
+
apiPort?: number;
|
|
7
|
+
dataDir?: string;
|
|
8
|
+
rpcUrl?: string;
|
|
9
|
+
registry?: string;
|
|
10
|
+
walletFactory?: string;
|
|
11
|
+
feeCollector?: string;
|
|
12
|
+
programRegistry?: string;
|
|
13
|
+
delegationRegistry?: string;
|
|
14
|
+
daemon?: boolean;
|
|
15
|
+
bootstrap?: string[];
|
|
16
|
+
logLevel?: string;
|
|
17
|
+
externalIp?: string;
|
|
18
|
+
noRegistry?: boolean;
|
|
19
|
+
configFile?: string;
|
|
20
|
+
}
|
|
21
|
+
/** Spawn the agent binary as a child process */
|
|
22
|
+
export declare function spawnAgent(opts: AgentProcessOptions): ChildProcess;
|
|
23
|
+
/** Check if the agent process is running by PID */
|
|
24
|
+
export declare function isAgentRunning(): {
|
|
25
|
+
running: boolean;
|
|
26
|
+
pid: number | null;
|
|
27
|
+
};
|
|
28
|
+
/** Stop the agent process gracefully */
|
|
29
|
+
export declare function stopAgent(apiPort?: number): Promise<boolean>;
|
|
30
|
+
/** Find agent process by name (fallback if no PID file) */
|
|
31
|
+
export declare function findAgentProcess(): Promise<number | null>;
|
|
32
|
+
/** Check if a port is available */
|
|
33
|
+
export declare function isPortAvailable(port: number): Promise<boolean>;
|
|
34
|
+
/** Find an available port starting from a given port */
|
|
35
|
+
export declare function findAvailablePort(startPort: number): Promise<number>;
|
|
36
|
+
//# sourceMappingURL=process.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/agent/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,YAAY,EAAY,MAAM,oBAAoB,CAAC;AAQnE,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,gDAAgD;AAChD,wBAAgB,UAAU,CAAC,IAAI,EAAE,mBAAmB,GAAG,YAAY,CAqBlE;AAgCD,mDAAmD;AACnD,wBAAgB,cAAc,IAAI;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAYzE;AAED,wCAAwC;AACxC,wBAAsB,SAAS,CAAC,OAAO,GAAE,MAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CA4DxE;AAsCD,2DAA2D;AAC3D,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQ/D;AAED,mCAAmC;AACnC,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUpE;AAED,wDAAwD;AACxD,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK1E"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { spawn, execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import { AGENT_LOG, AGENT_PID_FILE, AGENT_SOCKET, ensureBlockclawDir } from "../utils/paths.js";
|
|
5
|
+
import { logger } from "../utils/logger.js";
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
/** Spawn the agent binary as a child process */
|
|
8
|
+
export function spawnAgent(opts) {
|
|
9
|
+
const args = buildArgs(opts);
|
|
10
|
+
logger.debug(`Spawning: ${opts.binPath} ${args.join(" ")}`);
|
|
11
|
+
const logStream = fs.createWriteStream(AGENT_LOG, { flags: "a" });
|
|
12
|
+
const child = spawn(opts.binPath, args, {
|
|
13
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
14
|
+
detached: opts.daemon ?? false,
|
|
15
|
+
});
|
|
16
|
+
child.stdout?.pipe(logStream);
|
|
17
|
+
child.stderr?.pipe(logStream);
|
|
18
|
+
if (opts.daemon && child.pid) {
|
|
19
|
+
writePid(child.pid);
|
|
20
|
+
child.unref();
|
|
21
|
+
}
|
|
22
|
+
return child;
|
|
23
|
+
}
|
|
24
|
+
/** Build CLI arguments from options */
|
|
25
|
+
function buildArgs(opts) {
|
|
26
|
+
const args = [];
|
|
27
|
+
if (opts.network)
|
|
28
|
+
args.push("--network", opts.network);
|
|
29
|
+
if (opts.port)
|
|
30
|
+
args.push("--port", String(opts.port));
|
|
31
|
+
if (opts.apiPort)
|
|
32
|
+
args.push("--api-port", String(opts.apiPort));
|
|
33
|
+
if (opts.dataDir)
|
|
34
|
+
args.push("--data-dir", opts.dataDir);
|
|
35
|
+
if (opts.rpcUrl)
|
|
36
|
+
args.push("--rpc-url", opts.rpcUrl);
|
|
37
|
+
if (opts.registry)
|
|
38
|
+
args.push("--registry", opts.registry);
|
|
39
|
+
if (opts.walletFactory)
|
|
40
|
+
args.push("--wallet-factory", opts.walletFactory);
|
|
41
|
+
if (opts.feeCollector)
|
|
42
|
+
args.push("--fee-collector", opts.feeCollector);
|
|
43
|
+
if (opts.programRegistry)
|
|
44
|
+
args.push("--program-registry", opts.programRegistry);
|
|
45
|
+
if (opts.delegationRegistry)
|
|
46
|
+
args.push("--delegation-registry", opts.delegationRegistry);
|
|
47
|
+
if (opts.daemon)
|
|
48
|
+
args.push("--daemon");
|
|
49
|
+
if (opts.logLevel)
|
|
50
|
+
args.push("--log-level", opts.logLevel);
|
|
51
|
+
if (opts.externalIp)
|
|
52
|
+
args.push("--external-ip", opts.externalIp);
|
|
53
|
+
if (opts.noRegistry)
|
|
54
|
+
args.push("--no-registry");
|
|
55
|
+
if (opts.configFile)
|
|
56
|
+
args.push("--config", opts.configFile);
|
|
57
|
+
// Always pass the socket path so the agent creates it
|
|
58
|
+
args.push("--socket", AGENT_SOCKET);
|
|
59
|
+
if (opts.bootstrap) {
|
|
60
|
+
for (const b of opts.bootstrap) {
|
|
61
|
+
args.push("--bootstrap", b);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return args;
|
|
65
|
+
}
|
|
66
|
+
/** Check if the agent process is running by PID */
|
|
67
|
+
export function isAgentRunning() {
|
|
68
|
+
const pid = readPid();
|
|
69
|
+
if (!pid)
|
|
70
|
+
return { running: false, pid: null };
|
|
71
|
+
try {
|
|
72
|
+
process.kill(pid, 0); // Signal 0 = check existence
|
|
73
|
+
return { running: true, pid };
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Process not running, clean up stale PID file
|
|
77
|
+
removePid();
|
|
78
|
+
return { running: false, pid: null };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Stop the agent process gracefully */
|
|
82
|
+
export async function stopAgent(apiPort = 8080) {
|
|
83
|
+
// Try graceful shutdown via Unix socket first (preferred)
|
|
84
|
+
if (fs.existsSync(AGENT_SOCKET)) {
|
|
85
|
+
try {
|
|
86
|
+
const http = await import("node:http");
|
|
87
|
+
await new Promise((resolve, reject) => {
|
|
88
|
+
const req = http.default.request({ socketPath: AGENT_SOCKET, path: "/shutdown", method: "POST" }, (res) => { res.resume(); res.on("end", () => resolve()); });
|
|
89
|
+
req.on("error", reject);
|
|
90
|
+
req.setTimeout(5000, () => { req.destroy(); reject(new Error("timeout")); });
|
|
91
|
+
req.end();
|
|
92
|
+
});
|
|
93
|
+
logger.debug("Graceful shutdown via Unix socket");
|
|
94
|
+
await waitForExit(3000);
|
|
95
|
+
removePid();
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Socket not responding, try TCP
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Try graceful shutdown via TCP (legacy fallback)
|
|
103
|
+
try {
|
|
104
|
+
const response = await fetch(`http://localhost:${apiPort}/shutdown`, {
|
|
105
|
+
method: "POST",
|
|
106
|
+
signal: AbortSignal.timeout(5000),
|
|
107
|
+
});
|
|
108
|
+
if (response.ok) {
|
|
109
|
+
logger.debug("Graceful shutdown via TCP fallback");
|
|
110
|
+
await waitForExit(3000);
|
|
111
|
+
removePid();
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// API not responding, try SIGTERM
|
|
117
|
+
}
|
|
118
|
+
// Fall back to SIGTERM
|
|
119
|
+
const { running, pid } = isAgentRunning();
|
|
120
|
+
if (!running || !pid)
|
|
121
|
+
return false;
|
|
122
|
+
try {
|
|
123
|
+
process.kill(pid, "SIGTERM");
|
|
124
|
+
logger.debug(`Sent SIGTERM to PID ${pid}`);
|
|
125
|
+
await waitForExit(5000);
|
|
126
|
+
removePid();
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// Force kill
|
|
131
|
+
try {
|
|
132
|
+
process.kill(pid, "SIGKILL");
|
|
133
|
+
logger.debug(`Sent SIGKILL to PID ${pid}`);
|
|
134
|
+
removePid();
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/** Wait for the agent process to exit */
|
|
143
|
+
async function waitForExit(timeoutMs) {
|
|
144
|
+
const start = Date.now();
|
|
145
|
+
while (Date.now() - start < timeoutMs) {
|
|
146
|
+
const { running } = isAgentRunning();
|
|
147
|
+
if (!running)
|
|
148
|
+
return;
|
|
149
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/** Write PID to file */
|
|
153
|
+
function writePid(pid) {
|
|
154
|
+
ensureBlockclawDir();
|
|
155
|
+
fs.writeFileSync(AGENT_PID_FILE, String(pid), "utf8");
|
|
156
|
+
}
|
|
157
|
+
/** Read PID from file */
|
|
158
|
+
function readPid() {
|
|
159
|
+
try {
|
|
160
|
+
const content = fs.readFileSync(AGENT_PID_FILE, "utf8").trim();
|
|
161
|
+
const pid = parseInt(content, 10);
|
|
162
|
+
return isNaN(pid) ? null : pid;
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/** Remove PID file */
|
|
169
|
+
function removePid() {
|
|
170
|
+
try {
|
|
171
|
+
fs.unlinkSync(AGENT_PID_FILE);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// File may not exist
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/** Find agent process by name (fallback if no PID file) */
|
|
178
|
+
export async function findAgentProcess() {
|
|
179
|
+
try {
|
|
180
|
+
const { stdout } = await execFileAsync("pgrep", ["-f", "sequence0-agent"], { timeout: 3000 });
|
|
181
|
+
const pids = stdout.trim().split("\n").map(Number).filter(Boolean);
|
|
182
|
+
return pids.length > 0 ? pids[0] : null;
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/** Check if a port is available */
|
|
189
|
+
export async function isPortAvailable(port) {
|
|
190
|
+
const net = await import("node:net");
|
|
191
|
+
return new Promise((resolve) => {
|
|
192
|
+
const server = net.createServer();
|
|
193
|
+
server.once("error", () => resolve(false));
|
|
194
|
+
server.once("listening", () => {
|
|
195
|
+
server.close(() => resolve(true));
|
|
196
|
+
});
|
|
197
|
+
server.listen(port, "127.0.0.1");
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
/** Find an available port starting from a given port */
|
|
201
|
+
export async function findAvailablePort(startPort) {
|
|
202
|
+
for (let port = startPort; port < startPort + 100; port++) {
|
|
203
|
+
if (await isPortAvailable(port))
|
|
204
|
+
return port;
|
|
205
|
+
}
|
|
206
|
+
throw new Error(`No available port found in range ${startPort}-${startPort + 99}`);
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/agent/process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { AgentClient, type WalletRecord } from "./client.js";
|
|
2
|
+
/** Wallet operations wrapper around the agent IPC client */
|
|
3
|
+
export declare class WalletManager {
|
|
4
|
+
private client;
|
|
5
|
+
constructor(client: AgentClient);
|
|
6
|
+
/** List all wallets */
|
|
7
|
+
list(): Promise<WalletRecord[]>;
|
|
8
|
+
/**
|
|
9
|
+
* Create a universal wallet that works on ALL supported chains.
|
|
10
|
+
*
|
|
11
|
+
* Internally creates two DKG wallets (secp256k1 + ed25519) and presents
|
|
12
|
+
* them as a single wallet to the user. The user never sees curve types.
|
|
13
|
+
*/
|
|
14
|
+
createUniversal(opts: {
|
|
15
|
+
walletId: string;
|
|
16
|
+
participants?: string[];
|
|
17
|
+
threshold?: number;
|
|
18
|
+
creator?: string;
|
|
19
|
+
}): Promise<{
|
|
20
|
+
secp256k1Id: string;
|
|
21
|
+
ed25519Id: string;
|
|
22
|
+
}>;
|
|
23
|
+
/**
|
|
24
|
+
* Create a single-curve wallet (for power users who know what they want).
|
|
25
|
+
*/
|
|
26
|
+
create(opts: {
|
|
27
|
+
walletId: string;
|
|
28
|
+
participants?: string[];
|
|
29
|
+
threshold?: number;
|
|
30
|
+
curve?: string;
|
|
31
|
+
creator?: string;
|
|
32
|
+
}): Promise<void>;
|
|
33
|
+
/** Get wallet info */
|
|
34
|
+
balance(walletId: string): Promise<WalletRecord>;
|
|
35
|
+
/**
|
|
36
|
+
* Check if a wallet pair exists (secp256k1 + ed25519 = universal wallet).
|
|
37
|
+
* Returns true if both `{name}` and `{name}-ed` exist.
|
|
38
|
+
*/
|
|
39
|
+
isUniversalWallet(walletId: string, allWallets: WalletRecord[]): boolean;
|
|
40
|
+
/** Print wallet list — groups universal wallet pairs as single entries */
|
|
41
|
+
printList(): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=wallet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/agent/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAM7D,4DAA4D;AAC5D,qBAAa,aAAa;IACZ,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAEvC,uBAAuB;IACjB,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAIrC;;;;;OAKG;IACG,eAAe,CAAC,IAAI,EAAE;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAuCvD;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBjB,sBAAsB;IAChB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAOtD;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,GAAG,OAAO;IAKxE,0EAA0E;IACpE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;CAwDjC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
2
|
+
import { formatAddress } from "../utils/format.js";
|
|
3
|
+
import { CHAINS } from "./chains.js";
|
|
4
|
+
import pc from "picocolors";
|
|
5
|
+
/** Wallet operations wrapper around the agent IPC client */
|
|
6
|
+
export class WalletManager {
|
|
7
|
+
client;
|
|
8
|
+
constructor(client) {
|
|
9
|
+
this.client = client;
|
|
10
|
+
}
|
|
11
|
+
/** List all wallets */
|
|
12
|
+
async list() {
|
|
13
|
+
return this.client.wallets();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create a universal wallet that works on ALL supported chains.
|
|
17
|
+
*
|
|
18
|
+
* Internally creates two DKG wallets (secp256k1 + ed25519) and presents
|
|
19
|
+
* them as a single wallet to the user. The user never sees curve types.
|
|
20
|
+
*/
|
|
21
|
+
async createUniversal(opts) {
|
|
22
|
+
// Get peer list if participants not provided
|
|
23
|
+
let participants = opts.participants;
|
|
24
|
+
if (!participants || participants.length === 0) {
|
|
25
|
+
const status = await this.client.status();
|
|
26
|
+
participants = [status.peer_id, ...status.connected_peer_ids];
|
|
27
|
+
}
|
|
28
|
+
if (!participants || participants.length < 2) {
|
|
29
|
+
throw new Error("Need at least 2 network members to create a wallet. Check your network connection.");
|
|
30
|
+
}
|
|
31
|
+
const threshold = opts.threshold ?? Math.ceil((participants.length * 2) / 3);
|
|
32
|
+
// Create secp256k1 wallet (Ethereum, Bitcoin, Polygon, etc.)
|
|
33
|
+
const secpId = opts.walletId;
|
|
34
|
+
await this.client.initiateDkg({
|
|
35
|
+
wallet_id: secpId,
|
|
36
|
+
participants,
|
|
37
|
+
threshold,
|
|
38
|
+
curve: "secp256k1",
|
|
39
|
+
creator: opts.creator,
|
|
40
|
+
timestamp: Date.now(),
|
|
41
|
+
});
|
|
42
|
+
// Create ed25519 wallet (Solana, Sui, Aptos, etc.)
|
|
43
|
+
const edId = `${opts.walletId}-ed`;
|
|
44
|
+
await this.client.initiateDkg({
|
|
45
|
+
wallet_id: edId,
|
|
46
|
+
participants,
|
|
47
|
+
threshold,
|
|
48
|
+
curve: "ed25519",
|
|
49
|
+
creator: opts.creator,
|
|
50
|
+
timestamp: Date.now(),
|
|
51
|
+
});
|
|
52
|
+
return { secp256k1Id: secpId, ed25519Id: edId };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create a single-curve wallet (for power users who know what they want).
|
|
56
|
+
*/
|
|
57
|
+
async create(opts) {
|
|
58
|
+
let participants = opts.participants;
|
|
59
|
+
if (!participants || participants.length === 0) {
|
|
60
|
+
const status = await this.client.status();
|
|
61
|
+
participants = [status.peer_id, ...status.connected_peer_ids];
|
|
62
|
+
}
|
|
63
|
+
if (!participants || participants.length < 2) {
|
|
64
|
+
throw new Error("Need at least 2 network members to create a wallet. Check your network connection.");
|
|
65
|
+
}
|
|
66
|
+
const threshold = opts.threshold ?? Math.ceil((participants.length * 2) / 3);
|
|
67
|
+
const curve = opts.curve ?? "secp256k1";
|
|
68
|
+
await this.client.initiateDkg({
|
|
69
|
+
wallet_id: opts.walletId,
|
|
70
|
+
participants,
|
|
71
|
+
threshold,
|
|
72
|
+
curve,
|
|
73
|
+
creator: opts.creator,
|
|
74
|
+
timestamp: Date.now(),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/** Get wallet info */
|
|
78
|
+
async balance(walletId) {
|
|
79
|
+
const wallets = await this.list();
|
|
80
|
+
const wallet = wallets.find((w) => w.wallet_id === walletId);
|
|
81
|
+
if (!wallet)
|
|
82
|
+
throw new Error(`Wallet not found: ${walletId}`);
|
|
83
|
+
return wallet;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Check if a wallet pair exists (secp256k1 + ed25519 = universal wallet).
|
|
87
|
+
* Returns true if both `{name}` and `{name}-ed` exist.
|
|
88
|
+
*/
|
|
89
|
+
isUniversalWallet(walletId, allWallets) {
|
|
90
|
+
const edId = `${walletId}-ed`;
|
|
91
|
+
return allWallets.some((w) => w.wallet_id === edId);
|
|
92
|
+
}
|
|
93
|
+
/** Print wallet list — groups universal wallet pairs as single entries */
|
|
94
|
+
async printList() {
|
|
95
|
+
const wallets = await this.list();
|
|
96
|
+
if (wallets.length === 0) {
|
|
97
|
+
logger.info("No wallets found. Create one with: blockclaw wallet create");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
console.log();
|
|
101
|
+
console.log(` ${pc.bold("Wallets")}`);
|
|
102
|
+
console.log();
|
|
103
|
+
const shown = new Set();
|
|
104
|
+
const secpCount = CHAINS.filter((c) => c.curve === "secp256k1").length;
|
|
105
|
+
const edCount = CHAINS.filter((c) => c.curve === "ed25519").length;
|
|
106
|
+
const totalChains = secpCount + edCount;
|
|
107
|
+
for (const w of wallets) {
|
|
108
|
+
if (shown.has(w.wallet_id))
|
|
109
|
+
continue;
|
|
110
|
+
// Check if this is part of a universal wallet pair
|
|
111
|
+
const edPair = wallets.find((x) => x.wallet_id === `${w.wallet_id}-ed`);
|
|
112
|
+
const isEdHalf = w.wallet_id.endsWith("-ed");
|
|
113
|
+
// Skip the -ed half — it's shown as part of the pair
|
|
114
|
+
if (isEdHalf) {
|
|
115
|
+
const baseName = w.wallet_id.slice(0, -3);
|
|
116
|
+
if (wallets.some((x) => x.wallet_id === baseName)) {
|
|
117
|
+
shown.add(w.wallet_id);
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
shown.add(w.wallet_id);
|
|
122
|
+
if (edPair) {
|
|
123
|
+
// Universal wallet — show as one entry
|
|
124
|
+
shown.add(edPair.wallet_id);
|
|
125
|
+
const addr = w.address ? formatAddress(w.address) : pc.dim("pending");
|
|
126
|
+
console.log(` ${pc.cyan(w.wallet_id)}`);
|
|
127
|
+
console.log(` ${pc.dim("Address:")} ${addr}`);
|
|
128
|
+
console.log(` ${pc.dim("Security:")} ${w.threshold}-of-${w.participants.length}`);
|
|
129
|
+
console.log(` ${pc.dim("Chains:")} All ${totalChains} supported chains`);
|
|
130
|
+
console.log();
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// Single-curve wallet
|
|
134
|
+
const addr = w.address ? formatAddress(w.address) : pc.dim("pending");
|
|
135
|
+
const curve = w.chain ?? "secp256k1";
|
|
136
|
+
const chainCount = CHAINS.filter((c) => c.curve === curve).length;
|
|
137
|
+
console.log(` ${pc.cyan(w.wallet_id)}`);
|
|
138
|
+
console.log(` ${pc.dim("Address:")} ${addr}`);
|
|
139
|
+
console.log(` ${pc.dim("Security:")} ${w.threshold}-of-${w.participants.length}`);
|
|
140
|
+
console.log(` ${pc.dim("Chains:")} ${chainCount} compatible chains`);
|
|
141
|
+
console.log();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/agent/wallet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AgentClient } from "../agent/client.js";
|
|
2
|
+
import { Memory } from "../core/memory.js";
|
|
3
|
+
type AIProvider = "claude" | "ollama" | "rules";
|
|
4
|
+
/** AI Brain — orchestrates responses from rules engine or LLM */
|
|
5
|
+
export declare class Brain {
|
|
6
|
+
private client;
|
|
7
|
+
private memory;
|
|
8
|
+
private rules;
|
|
9
|
+
private provider;
|
|
10
|
+
constructor(client: AgentClient, memory: Memory);
|
|
11
|
+
/** Process a query and return a response */
|
|
12
|
+
ask(question: string): Promise<string>;
|
|
13
|
+
getProvider(): AIProvider;
|
|
14
|
+
private detectProvider;
|
|
15
|
+
private gatherContext;
|
|
16
|
+
private callLLM;
|
|
17
|
+
private callClaude;
|
|
18
|
+
private callOllama;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=brain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../src/ai/brain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAO3C,KAAK,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEhD,iEAAiE;AACjE,qBAAa,KAAK;IAKd,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,MAAM;IALhB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAa;gBAGnB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,MAAM;IAMxB,4CAA4C;IACtC,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAc5C,WAAW,IAAI,UAAU;IAIzB,OAAO,CAAC,cAAc;YAOR,aAAa;YA6Bb,OAAO;YAMP,UAAU;YAuBV,UAAU;CAoBzB"}
|