@mind2flow/daemon 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/command-center-client.d.ts +32 -0
  2. package/dist/command-center-client.d.ts.map +1 -0
  3. package/dist/command-center-client.js +137 -0
  4. package/dist/command-center-client.js.map +1 -0
  5. package/dist/config.d.ts +51 -0
  6. package/dist/config.d.ts.map +1 -0
  7. package/dist/config.js +89 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/daemon.d.ts +21 -0
  10. package/dist/daemon.d.ts.map +1 -0
  11. package/dist/daemon.js +1937 -0
  12. package/dist/daemon.js.map +1 -0
  13. package/dist/gateway-client.d.ts +175 -0
  14. package/dist/gateway-client.d.ts.map +1 -0
  15. package/dist/gateway-client.js +494 -0
  16. package/dist/gateway-client.js.map +1 -0
  17. package/dist/heartbeat.d.ts +35 -0
  18. package/dist/heartbeat.d.ts.map +1 -0
  19. package/dist/heartbeat.js +116 -0
  20. package/dist/heartbeat.js.map +1 -0
  21. package/dist/openclaw-manager.d.ts +41 -0
  22. package/dist/openclaw-manager.d.ts.map +1 -0
  23. package/dist/openclaw-manager.js +199 -0
  24. package/dist/openclaw-manager.js.map +1 -0
  25. package/dist/protocols/index.d.ts +21 -0
  26. package/dist/protocols/index.d.ts.map +1 -0
  27. package/dist/protocols/index.js +30 -0
  28. package/dist/protocols/index.js.map +1 -0
  29. package/dist/protocols/jsonrpc-protocol.d.ts +24 -0
  30. package/dist/protocols/jsonrpc-protocol.d.ts.map +1 -0
  31. package/dist/protocols/jsonrpc-protocol.js +83 -0
  32. package/dist/protocols/jsonrpc-protocol.js.map +1 -0
  33. package/dist/protocols/openclaw-protocol.d.ts +33 -0
  34. package/dist/protocols/openclaw-protocol.d.ts.map +1 -0
  35. package/dist/protocols/openclaw-protocol.js +131 -0
  36. package/dist/protocols/openclaw-protocol.js.map +1 -0
  37. package/dist/protocols/types.d.ts +86 -0
  38. package/dist/protocols/types.d.ts.map +1 -0
  39. package/dist/protocols/types.js +13 -0
  40. package/dist/protocols/types.js.map +1 -0
  41. package/package.json +40 -0
@@ -0,0 +1,494 @@
1
+ /**
2
+ * Gateway WebSocket RPC client with pluggable protocol adapters.
3
+ *
4
+ * Connects to a local gateway at ws://127.0.0.1:{port} and delegates
5
+ * all framing / handshake logic to a ProtocolAdapter:
6
+ *
7
+ * - OpenClawProtocol → native OpenClaw wire format (type:"req"/"res")
8
+ * - JsonRpcProtocol → standard JSON-RPC 2.0
9
+ *
10
+ * High-level methods (agent, configGet, health, …) remain unchanged.
11
+ */
12
+ import WebSocket from "ws";
13
+ import { EventEmitter } from "node:events";
14
+ import { randomUUID } from "node:crypto";
15
+ // ── Client ─────────────────────────────────────────────────────────
16
+ export class GatewayClient extends EventEmitter {
17
+ ws = null;
18
+ port;
19
+ pending = new Map();
20
+ reconnectDelay = 1_000;
21
+ maxReconnectDelay = 30_000;
22
+ reconnectTimer = null;
23
+ shouldReconnect = true;
24
+ callTimeout = 60_000; // 60s per RPC call
25
+ logLevel;
26
+ protocol;
27
+ handshakeCompleted = false;
28
+ constructor(port, protocol, logLevel = "info") {
29
+ super();
30
+ this.port = port;
31
+ this.protocol = protocol;
32
+ this.logLevel = logLevel;
33
+ }
34
+ // ── Connect ────────────────────────────────────────────────────
35
+ connect() {
36
+ if (this.ws)
37
+ return;
38
+ const url = `ws://127.0.0.1:${this.port}`;
39
+ this.log("info", `Connecting to Gateway at ${url} (protocol: ${this.protocol.name})`);
40
+ this.ws = new WebSocket(url);
41
+ this.handshakeCompleted = false;
42
+ this.ws.on("open", () => {
43
+ this.log("info", "WebSocket open — initiating handshake...");
44
+ this.reconnectDelay = 1_000;
45
+ // Send protocol handshake (OpenClaw requires connect frame;
46
+ // JSON-RPC returns null → ready immediately)
47
+ const handshake = this.protocol.buildHandshake({
48
+ clientId: "cli",
49
+ displayName: `m2f-daemon-${randomUUID().slice(0, 8)}`,
50
+ clientVersion: "1.0.0",
51
+ });
52
+ if (handshake) {
53
+ this.ws.send(handshake);
54
+ this.log("debug", "→ Handshake sent, waiting for response...");
55
+ }
56
+ else {
57
+ // No handshake needed — connection is ready
58
+ this.handshakeCompleted = true;
59
+ this.emit("connected");
60
+ }
61
+ });
62
+ this.ws.on("message", (raw) => {
63
+ const rawStr = raw.toString();
64
+ try {
65
+ // If handshake is pending, check if this is the handshake response
66
+ if (!this.handshakeCompleted) {
67
+ const hsResult = this.protocol.isHandshakeResponse(rawStr);
68
+ if (hsResult !== null) {
69
+ if (hsResult) {
70
+ this.log("info", "Handshake succeeded — connected to Gateway");
71
+ this.handshakeCompleted = true;
72
+ this.emit("connected");
73
+ }
74
+ else {
75
+ this.log("error", "Handshake REJECTED by Gateway");
76
+ this.emit("handshake-failed");
77
+ this.ws?.close(4001, "Handshake rejected");
78
+ }
79
+ return;
80
+ }
81
+ }
82
+ // Parse through protocol adapter
83
+ const parsed = this.protocol.parseMessage(rawStr);
84
+ switch (parsed.kind) {
85
+ case "response": {
86
+ const { id, ok, result, error } = parsed.response;
87
+ const call = this.pending.get(id);
88
+ if (call) {
89
+ this.pending.delete(id);
90
+ clearTimeout(call.timer);
91
+ if (!ok && error) {
92
+ call.reject(new Error(`RPC error ${error.code ?? 0}: ${error.message}`));
93
+ }
94
+ else {
95
+ call.resolve(result);
96
+ }
97
+ }
98
+ else {
99
+ this.log("debug", `Response for unknown id=${id}`);
100
+ }
101
+ break;
102
+ }
103
+ case "event": {
104
+ // Re-emit as legacy RPCNotification shape + new event
105
+ const evt = parsed.event;
106
+ this.emit("notification", { method: evt.event, params: evt.payload });
107
+ this.emit("gateway-event", evt);
108
+ break;
109
+ }
110
+ case "unknown":
111
+ this.log("debug", `Unhandled Gateway message: ${rawStr.slice(0, 200)}`);
112
+ break;
113
+ }
114
+ }
115
+ catch {
116
+ this.log("warn", "Invalid message from Gateway");
117
+ }
118
+ });
119
+ this.ws.on("close", (code, reason) => {
120
+ this.log("info", `Gateway connection closed (code=${code})`);
121
+ this.cleanup();
122
+ this.emit("disconnected");
123
+ this.scheduleReconnect();
124
+ });
125
+ this.ws.on("error", (err) => {
126
+ this.log("error", `Gateway WS error: ${err.message}`);
127
+ });
128
+ }
129
+ // ── RPC Call ───────────────────────────────────────────────────
130
+ call(method, params) {
131
+ return new Promise((resolve, reject) => {
132
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
133
+ reject(new Error("Gateway not connected"));
134
+ return;
135
+ }
136
+ if (!this.handshakeCompleted) {
137
+ reject(new Error("Gateway handshake not yet completed"));
138
+ return;
139
+ }
140
+ const id = randomUUID();
141
+ const encoded = this.protocol.encodeRequest({ id, method, params });
142
+ const timer = setTimeout(() => {
143
+ this.pending.delete(id);
144
+ reject(new Error(`RPC call '${method}' timed out after ${this.callTimeout}ms`));
145
+ }, this.callTimeout);
146
+ this.pending.set(id, { resolve, reject, timer });
147
+ this.ws.send(encoded);
148
+ this.log("debug", `→ RPC ${method} (id=${id.slice(0, 8)}…)`);
149
+ });
150
+ }
151
+ // ── High-level methods ─────────────────────────────────────────
152
+ /** Send a prompt to the OpenClaw agent and get the response. */
153
+ async agent(message, options) {
154
+ return this.call("agent", {
155
+ message,
156
+ sessionId: options?.sessionId,
157
+ deliver: options?.deliver ?? false,
158
+ });
159
+ }
160
+ /** Get the current Gateway configuration. */
161
+ async configGet() {
162
+ const result = await this.call("config.get");
163
+ return result;
164
+ }
165
+ /** Patch the Gateway configuration (e.g., change LLM model). */
166
+ async configPatch(raw, baseHash) {
167
+ return this.call("config.patch", { raw, baseHash });
168
+ }
169
+ /** Export the full Gateway configuration as raw text.
170
+ * Uses config.get which returns { raw, config, hash }. */
171
+ async configExport() {
172
+ const result = await this.call("config.get");
173
+ return result;
174
+ }
175
+ /** Get the config JSON Schema + UI hints from the Gateway. */
176
+ async configSchema() {
177
+ return this.call("config.schema");
178
+ }
179
+ /** Write config and trigger gateway restart (config.apply). */
180
+ async configApply(raw, baseHash, sessionKey) {
181
+ const params = { raw, baseHash };
182
+ if (sessionKey)
183
+ params.sessionKey = sessionKey;
184
+ return this.call("config.apply", params);
185
+ }
186
+ /** Full config overwrite without restart (config.set). */
187
+ async configSet(raw, baseHash) {
188
+ const params = { raw };
189
+ if (baseHash)
190
+ params.baseHash = baseHash;
191
+ return this.call("config.set", params);
192
+ }
193
+ /** Get Gateway health status. */
194
+ async health() {
195
+ return this.call("health");
196
+ }
197
+ /** Get detailed Gateway status. */
198
+ async status() {
199
+ return this.call("status");
200
+ }
201
+ /** List active sessions. */
202
+ async sessionsList() {
203
+ return this.call("sessions.list");
204
+ }
205
+ /** Kill / terminate a session (maps to sessions.delete). */
206
+ async sessionsKill(sessionId) {
207
+ return this.call("sessions.delete", { sessionId });
208
+ }
209
+ /** Preview a session transcript. */
210
+ async sessionsPreview(sessionId) {
211
+ return this.call("sessions.preview", { sessionId });
212
+ }
213
+ /** Patch session settings (model, thinking level, verbose, etc.). */
214
+ async sessionsPatch(sessionId, patch) {
215
+ return this.call("sessions.patch", { sessionId, ...patch });
216
+ }
217
+ /** Reset session context / conversation history. */
218
+ async sessionsReset(sessionId) {
219
+ return this.call("sessions.reset", { sessionId });
220
+ }
221
+ /** Delete a session entirely. */
222
+ async sessionsDelete(sessionId) {
223
+ return this.call("sessions.delete", { sessionId });
224
+ }
225
+ /** Compact (summarize) session context to reduce token usage. */
226
+ async sessionsCompact(sessionId) {
227
+ return this.call("sessions.compact", { sessionId });
228
+ }
229
+ // ── Skills ─────────────────────────────────────────────────────
230
+ /** Get full skills status report from the Gateway. */
231
+ async skillsStatus() {
232
+ return this.call("skills.status");
233
+ }
234
+ /** Install binary dependencies for a skill. */
235
+ async skillsInstall(skillKey, installOptionId) {
236
+ const params = { skillKey };
237
+ if (installOptionId)
238
+ params.installOptionId = installOptionId;
239
+ return this.call("skills.install", params);
240
+ }
241
+ /** Update a skill's configuration (enable/disable, apiKey, env vars). */
242
+ async skillsUpdate(skillKey, updates) {
243
+ return this.call("skills.update", { skillKey, ...updates });
244
+ }
245
+ /** List all binary dependencies required by skills. */
246
+ async skillsBins() {
247
+ return this.call("skills.bins");
248
+ }
249
+ // ── Cron Jobs ──────────────────────────────────────────────────
250
+ /** List all cron jobs configured on the Gateway. */
251
+ async cronList() {
252
+ return this.call("cron.list");
253
+ }
254
+ /** Add a new cron job. */
255
+ async cronAdd(job) {
256
+ return this.call("cron.add", job);
257
+ }
258
+ /** Update an existing cron job by jobId. */
259
+ async cronUpdate(jobId, patch) {
260
+ return this.call("cron.update", { jobId, ...patch });
261
+ }
262
+ /** Remove a cron job by jobId. */
263
+ async cronRemove(jobId) {
264
+ return this.call("cron.remove", { jobId });
265
+ }
266
+ /** Manually trigger a cron job (force or due mode). */
267
+ async cronRun(jobId, mode) {
268
+ const params = { jobId };
269
+ if (mode)
270
+ params.mode = mode;
271
+ return this.call("cron.run", params);
272
+ }
273
+ /** Get run history for a cron job. */
274
+ async cronRuns(jobId, limit) {
275
+ const params = { jobId };
276
+ if (limit !== undefined)
277
+ params.limit = limit;
278
+ return this.call("cron.runs", params);
279
+ }
280
+ /** Get cron scheduler status (running/paused, tick interval, job count). */
281
+ async cronStatus() {
282
+ return this.call("cron.status");
283
+ }
284
+ /** Toggle cron scheduler on/off.
285
+ * Note: The gateway does not have a native cron.toggle RPC.
286
+ * This patches the config to set cron.enabled. */
287
+ async cronToggle(enabled) {
288
+ // Use cron.status to verify current state, then patch config
289
+ // For now, pass through — the daemon handler manages the logic
290
+ return this.call("config.patch", {
291
+ raw: JSON.stringify({ cron: { enabled } }),
292
+ baseHash: "",
293
+ });
294
+ }
295
+ // ── Usage / Token Tracking ─────────────────────────────────────
296
+ /** Get current usage / cost status from the Gateway. */
297
+ async usageStatus() {
298
+ return this.call("usage.status");
299
+ }
300
+ /** Get usage cost breakdown over time. */
301
+ async usageCost(opts) {
302
+ return this.call("usage.cost", opts);
303
+ }
304
+ // ── Channels ───────────────────────────────────────────────────
305
+ /** Get status of all messaging channels (WhatsApp, Telegram, etc.). */
306
+ async channelsStatus(probe, timeoutMs) {
307
+ const params = {};
308
+ if (probe !== undefined)
309
+ params.probe = probe;
310
+ if (timeoutMs !== undefined)
311
+ params.timeoutMs = timeoutMs;
312
+ return this.call("channels.status", Object.keys(params).length ? params : undefined);
313
+ }
314
+ /** Logout / disconnect a specific channel (or specific account). */
315
+ async channelsLogout(channel, accountId) {
316
+ const params = { channel };
317
+ if (accountId)
318
+ params.accountId = accountId;
319
+ return this.call("channels.logout", params);
320
+ }
321
+ /** Start WhatsApp web login — returns QR code data. */
322
+ async webLoginStart(opts) {
323
+ return this.call("web.login.start", opts);
324
+ }
325
+ /** Wait for WhatsApp web login to complete (poll after QR scan). */
326
+ async webLoginWait(timeoutMs, accountId) {
327
+ const params = {};
328
+ if (timeoutMs !== undefined)
329
+ params.timeoutMs = timeoutMs;
330
+ if (accountId)
331
+ params.accountId = accountId;
332
+ return this.call("web.login.wait", Object.keys(params).length ? params : undefined);
333
+ }
334
+ // ── Models ─────────────────────────────────────────────────────
335
+ /** List available LLM models from the gateway. */
336
+ async modelsList() {
337
+ return this.call("models.list");
338
+ }
339
+ // ── Agents ─────────────────────────────────────────────────────
340
+ /** List all configured agent identities. */
341
+ async agentsList() {
342
+ return this.call("agents.list");
343
+ }
344
+ // ── Agent CRUD (via config.patch) ──────────────────────────────
345
+ //
346
+ // The gateway has no native agents.create/update/delete RPC methods.
347
+ // We implement them by reading the config, mutating agents.list,
348
+ // and writing it back via config.patch (RFC 7396 merge-patch).
349
+ // Arrays are replaced entirely, so we always send the full list.
350
+ /** Helper: read agents.list + hash from current config. */
351
+ async readAgentsList() {
352
+ const { config, hash } = await this.configGet();
353
+ const cfg = config;
354
+ const agentsSection = (cfg.agents ?? {});
355
+ const list = (agentsSection.list ?? []);
356
+ return { agents: list, hash, config: cfg };
357
+ }
358
+ /** Helper: write the updated agents.list back via config.patch. */
359
+ async writeAgentsList(agents, baseHash) {
360
+ const patch = JSON.stringify({ agents: { list: agents } });
361
+ return this.configPatch(patch, baseHash);
362
+ }
363
+ /** Create a new agent identity via config.patch. */
364
+ async agentsCreate(config) {
365
+ if (!config.id || typeof config.id !== "string") {
366
+ throw new Error("Agent config must include an 'id' field");
367
+ }
368
+ const { agents, hash } = await this.readAgentsList();
369
+ const existing = agents.find((a) => a.id?.toLowerCase() === config.id.toLowerCase());
370
+ if (existing) {
371
+ throw new Error(`Agent '${config.id}' already exists`);
372
+ }
373
+ agents.push(config);
374
+ const result = await this.writeAgentsList(agents, hash);
375
+ return { ok: true, agentId: config.id, result };
376
+ }
377
+ /** Update an existing agent's configuration via config.patch. */
378
+ async agentsUpdate(agentId, patch) {
379
+ const { agents, hash } = await this.readAgentsList();
380
+ const idx = agents.findIndex((a) => a.id?.toLowerCase() === agentId.toLowerCase());
381
+ if (idx === -1) {
382
+ throw new Error(`Agent '${agentId}' not found`);
383
+ }
384
+ // Merge patch into existing agent entry (shallow merge — caller
385
+ // sends the full sub-objects for nested fields like identity/model).
386
+ agents[idx] = { ...agents[idx], ...patch, id: agents[idx].id };
387
+ const result = await this.writeAgentsList(agents, hash);
388
+ return { ok: true, agentId, result };
389
+ }
390
+ /** Delete an agent identity via config.patch. */
391
+ async agentsDelete(agentId) {
392
+ const { agents, hash } = await this.readAgentsList();
393
+ const filtered = agents.filter((a) => a.id?.toLowerCase() !== agentId.toLowerCase());
394
+ if (filtered.length === agents.length) {
395
+ throw new Error(`Agent '${agentId}' not found`);
396
+ }
397
+ const result = await this.writeAgentsList(filtered, hash);
398
+ return { ok: true, agentId, result };
399
+ }
400
+ // ── Agent Files ────────────────────────────────────────────────
401
+ //
402
+ // Agent files (AGENTS.md, SOUL.md, TOOLS.md, etc.) live on disk
403
+ // under ~/.clawdbot/agents/<agentId>/. The gateway has no native
404
+ // RPC for file operations, so these remain stubs that return
405
+ // informational responses. The daemon can access these files
406
+ // directly if running on the same machine.
407
+ /** List files owned by an agent (stub — no gateway RPC). */
408
+ async agentsFilesList(agentId) {
409
+ return {
410
+ agentId,
411
+ files: [],
412
+ note: "Agent files are stored locally at ~/.clawdbot/agents/<id>/. Direct file access required.",
413
+ };
414
+ }
415
+ /** Read a specific agent file (stub — no gateway RPC). */
416
+ async agentsFilesGet(agentId, filePath) {
417
+ return {
418
+ agentId,
419
+ path: filePath,
420
+ content: null,
421
+ note: "Agent files are stored locally. Direct file access required.",
422
+ };
423
+ }
424
+ /** Write / update an agent file (stub — no gateway RPC). */
425
+ async agentsFilesSet(agentId, filePath, content) {
426
+ return {
427
+ agentId,
428
+ path: filePath,
429
+ ok: false,
430
+ note: "Agent files are stored locally. Direct file access required.",
431
+ };
432
+ }
433
+ // ── Logs ───────────────────────────────────────────────────────
434
+ /** Tail gateway log file with cursor-based pagination. */
435
+ async logsTail(opts) {
436
+ return this.call("logs.tail", opts ?? {});
437
+ }
438
+ // ── Browser ────────────────────────────────────────────────────
439
+ /** Proxy a request to the browser control service. */
440
+ async browserRequest(params) {
441
+ return this.call("browser.request", params);
442
+ }
443
+ // ── Reconnect ──────────────────────────────────────────────────
444
+ scheduleReconnect() {
445
+ if (!this.shouldReconnect)
446
+ return;
447
+ this.reconnectTimer = setTimeout(() => {
448
+ this.reconnectTimer = null;
449
+ this.connect();
450
+ }, this.reconnectDelay);
451
+ this.reconnectDelay = Math.min(this.reconnectDelay * 2 + Math.random() * 500, this.maxReconnectDelay);
452
+ }
453
+ // ── Shutdown ───────────────────────────────────────────────────
454
+ disconnect() {
455
+ this.shouldReconnect = false;
456
+ // Reject all pending calls
457
+ for (const [, call] of this.pending) {
458
+ clearTimeout(call.timer);
459
+ call.reject(new Error("Gateway client shutting down"));
460
+ }
461
+ this.pending.clear();
462
+ this.cleanup();
463
+ if (this.ws) {
464
+ this.ws.close(1000);
465
+ this.ws = null;
466
+ }
467
+ }
468
+ cleanup() {
469
+ if (this.reconnectTimer) {
470
+ clearTimeout(this.reconnectTimer);
471
+ this.reconnectTimer = null;
472
+ }
473
+ this.ws = null;
474
+ }
475
+ // ── State ──────────────────────────────────────────────────────
476
+ get isConnected() {
477
+ return this.ws?.readyState === WebSocket.OPEN;
478
+ }
479
+ // ── Logging ────────────────────────────────────────────────────
480
+ log(level, msg) {
481
+ const levels = ["debug", "info", "warn", "error"];
482
+ if (levels.indexOf(level) >= levels.indexOf(this.logLevel)) {
483
+ const ts = new Date().toISOString();
484
+ const prefix = `[${ts}] [GW-Client] [${level.toUpperCase()}]`;
485
+ if (level === "error")
486
+ console.error(`${prefix} ${msg}`);
487
+ else if (level === "warn")
488
+ console.warn(`${prefix} ${msg}`);
489
+ else
490
+ console.log(`${prefix} ${msg}`);
491
+ }
492
+ }
493
+ }
494
+ //# sourceMappingURL=gateway-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-client.js","sourceRoot":"","sources":["../src/gateway-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Heartbeat sender — collects system information and sends periodic
3
+ * heartbeats to the Command Center.
4
+ */
5
+ import type { CommandCenterClient } from "./command-center-client.js";
6
+ import type { GatewayClient } from "./gateway-client.js";
7
+ import type { OpenClawManager } from "./openclaw-manager.js";
8
+ export interface SystemInfo {
9
+ hostname: string;
10
+ os_type: string;
11
+ os_version: string;
12
+ arch: string;
13
+ cpu_count: number;
14
+ cpu_model: string;
15
+ total_memory_mb: number;
16
+ free_memory_mb: number;
17
+ cpu_usage_percent: number;
18
+ uptime_seconds: number;
19
+ }
20
+ export declare class HeartbeatService {
21
+ private client;
22
+ private gateway;
23
+ private manager;
24
+ private intervalMs;
25
+ private timer;
26
+ private logLevel;
27
+ constructor(client: CommandCenterClient, gateway: GatewayClient, manager: OpenClawManager, intervalMs: number, logLevel?: string);
28
+ start(): void;
29
+ stop(): void;
30
+ private send;
31
+ /** Send one-time system info (used after initial connection). */
32
+ sendSystemInfo(): void;
33
+ private log;
34
+ }
35
+ //# sourceMappingURL=heartbeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../src/heartbeat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI7D,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAiDD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,QAAQ,CAAS;gBAGvB,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,SAAS;IASnB,KAAK,IAAI,IAAI;IASb,IAAI,IAAI,IAAI;IAQZ,OAAO,CAAC,IAAI;IAyBZ,iEAAiE;IACjE,cAAc,IAAI,IAAI;IAYtB,OAAO,CAAC,GAAG;CAQZ"}