@varta-health/client 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.
package/dist/vlp.js ADDED
@@ -0,0 +1,159 @@
1
+ // VLP v0.2 wire encode / decode + CRC-32C.
2
+ //
3
+ // The normative wire specification lives at `book/src/spec/vlp.md`. This
4
+ // module is the canonical Node.js implementation that the production
5
+ // `Varta` client builds on top of. Cross-language byte equality is
6
+ // enforced by the conformance test suite at `tests/conformance.test.ts`,
7
+ // which drives `tools/vlp-test-vectors.json`.
8
+ export const MAGIC = Buffer.from([0x56, 0x41]); // "VA"
9
+ export const VERSION = 0x02;
10
+ export const NONCE_TERMINAL = 0xffffffffffffffffn;
11
+ export const TIMESTAMP_INVALID = 0xffffffffffffffffn;
12
+ export const FRAME_BYTES = 32;
13
+ // Beat status — matches the 1-byte wire value at offset 3.
14
+ // `Stall` is observer-synthesized; agents MUST NOT emit it on the wire.
15
+ // `decode()` raises `DecodeError` with `kind="StallOnWire"` if it appears.
16
+ export var Status;
17
+ (function (Status) {
18
+ Status[Status["Ok"] = 0] = "Ok";
19
+ Status[Status["Degraded"] = 1] = "Degraded";
20
+ Status[Status["Critical"] = 2] = "Critical";
21
+ Status[Status["Stall"] = 3] = "Stall";
22
+ })(Status || (Status = {}));
23
+ const STATUS_BY_NAME = {
24
+ ok: Status.Ok,
25
+ degraded: Status.Degraded,
26
+ critical: Status.Critical,
27
+ stall: Status.Stall,
28
+ };
29
+ export class DecodeError extends Error {
30
+ kind;
31
+ constructor(kind, detail = "") {
32
+ super(detail ? `${kind}: ${detail}` : kind);
33
+ this.name = "DecodeError";
34
+ this.kind = kind;
35
+ }
36
+ }
37
+ // CRC-32C (Castagnoli) — RFC 3720 appendix B. Reflected polynomial
38
+ // 0x82F63B78, init 0xFFFFFFFF, refin/refout, xorout 0xFFFFFFFF. Matches
39
+ // the canonical Rust implementation at `crates/varta-vlp/src/crc32c.rs`.
40
+ const POLY_REFLECTED = 0x82f63b78;
41
+ const CRC_TABLE = (() => {
42
+ const table = new Uint32Array(256);
43
+ for (let i = 0; i < 256; i++) {
44
+ let c = i >>> 0;
45
+ for (let k = 0; k < 8; k++) {
46
+ c = (c & 1) !== 0 ? (c >>> 1) ^ POLY_REFLECTED : c >>> 1;
47
+ }
48
+ table[i] = c >>> 0;
49
+ }
50
+ return table;
51
+ })();
52
+ export function crc32c(data) {
53
+ let crc = 0xffffffff >>> 0;
54
+ for (let i = 0; i < data.length; i++) {
55
+ const idx = ((crc ^ data[i]) & 0xff) >>> 0;
56
+ crc = ((CRC_TABLE[idx] ^ (crc >>> 8)) >>> 0);
57
+ }
58
+ return (crc ^ 0xffffffff) >>> 0;
59
+ }
60
+ function coerceStatus(status) {
61
+ if (typeof status === "string") {
62
+ const s = STATUS_BY_NAME[status.toLowerCase()];
63
+ if (s === undefined) {
64
+ throw new RangeError(`unknown status name: ${status}`);
65
+ }
66
+ return s;
67
+ }
68
+ if (status === Status.Ok || status === Status.Degraded ||
69
+ status === Status.Critical || status === Status.Stall) {
70
+ return status;
71
+ }
72
+ throw new RangeError(`invalid status: ${status}`);
73
+ }
74
+ // Encode a single VLP v0.2 frame into a fresh 32-byte Buffer.
75
+ //
76
+ // The hot path of the production client uses `encodeInto` against a
77
+ // pre-allocated scratch buffer to keep per-beat allocation minimal.
78
+ export function encode(status, pid, timestamp, nonce, payload) {
79
+ const buf = Buffer.alloc(FRAME_BYTES);
80
+ encodeInto(buf, status, pid, timestamp, nonce, payload);
81
+ return buf;
82
+ }
83
+ // Encode a single VLP v0.2 frame into `buf` (must be ≥ 32 bytes).
84
+ export function encodeInto(buf, status, pid, timestamp, nonce, payload) {
85
+ if (buf.length < FRAME_BYTES) {
86
+ throw new RangeError(`buffer must be at least ${FRAME_BYTES} bytes`);
87
+ }
88
+ const s = coerceStatus(status);
89
+ buf[0] = 0x56;
90
+ buf[1] = 0x41;
91
+ buf[2] = VERSION;
92
+ buf[3] = s & 0xff;
93
+ buf.writeUInt32LE(pid >>> 0, 4);
94
+ buf.writeBigUInt64LE(timestamp, 8);
95
+ buf.writeBigUInt64LE(nonce, 16);
96
+ buf.writeUInt32LE(payload >>> 0, 24);
97
+ const crc = crc32c(buf.subarray(0, 28));
98
+ buf.writeUInt32LE(crc, 28);
99
+ }
100
+ // Decode a 32-byte VLP v0.2 frame.
101
+ //
102
+ // Throws `DecodeError` on the first failed validation step. See
103
+ // `book/src/spec/vlp.md` §5 for the normative decode order:
104
+ // magic → version → CRC → status (incl. Stall rejection) → pid →
105
+ // timestamp → nonce.
106
+ export function decode(buf) {
107
+ if (buf.length !== FRAME_BYTES) {
108
+ throw new DecodeError("BadMagic", `length ${buf.length} != ${FRAME_BYTES}`);
109
+ }
110
+ if (buf[0] !== 0x56 || buf[1] !== 0x41) {
111
+ throw new DecodeError("BadMagic", Buffer.from(buf.slice(0, 2)).toString("hex"));
112
+ }
113
+ if (buf[2] !== VERSION) {
114
+ throw new DecodeError("BadVersion", `0x${(buf[2]).toString(16).padStart(2, "0")}`);
115
+ }
116
+ const view = Buffer.isBuffer(buf) ? buf : Buffer.from(buf);
117
+ const storedCrc = view.readUInt32LE(28);
118
+ const computedCrc = crc32c(view.subarray(0, 28));
119
+ if (storedCrc !== computedCrc) {
120
+ throw new DecodeError("BadCrc", `expected ${computedCrc.toString(16).padStart(8, "0")}, got ${storedCrc
121
+ .toString(16)
122
+ .padStart(8, "0")}`);
123
+ }
124
+ const statusByte = view[3];
125
+ if (statusByte > 3) {
126
+ throw new DecodeError("BadStatus", `0x${statusByte.toString(16).padStart(2, "0")}`);
127
+ }
128
+ if (statusByte === Status.Stall) {
129
+ throw new DecodeError("StallOnWire");
130
+ }
131
+ const pid = view.readUInt32LE(4);
132
+ const timestamp = view.readBigUInt64LE(8);
133
+ const nonce = view.readBigUInt64LE(16);
134
+ const payload = view.readUInt32LE(24);
135
+ if (pid === 0 || pid === 1) {
136
+ throw new DecodeError("BadPid", String(pid));
137
+ }
138
+ if (timestamp === TIMESTAMP_INVALID) {
139
+ throw new DecodeError("BadTimestamp");
140
+ }
141
+ if (nonce === NONCE_TERMINAL && statusByte !== Status.Critical) {
142
+ throw new DecodeError("BadNonce", `nonce=NONCE_TERMINAL paired with status=0x${statusByte
143
+ .toString(16)
144
+ .padStart(2, "0")}`);
145
+ }
146
+ return {
147
+ status: statusByte,
148
+ pid,
149
+ timestamp,
150
+ nonce,
151
+ payload,
152
+ };
153
+ }
154
+ // Convenience wrapper for parity with the Go client's exported
155
+ // `DecodeFrame`. Returns the same shape as `decode()`.
156
+ export function decodeFrame(buf) {
157
+ return decode(buf);
158
+ }
159
+ //# sourceMappingURL=vlp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vlp.js","sourceRoot":"","sources":["../src/vlp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare const SECURE_SHARED_BYTES = 60;
2
+ export declare const SECURE_MASTER_BYTES = 64;
3
+ export declare const KEY_BYTES = 32;
4
+ export declare const IV_RANDOM_BYTES = 8;
5
+ export declare const IV_COUNTER_BYTES = 4;
6
+ export declare const TAG_BYTES = 16;
7
+ export declare const PLAINTEXT_BYTES = 32;
8
+ export declare const SESSION_SALT_BYTES = 16;
9
+ export declare function hkdfSha256(ikm: Buffer, salt: Buffer, info: Buffer, length: number): Buffer;
10
+ export declare function deriveAgentKey(masterKey: Buffer, agentId: number): Buffer;
11
+ export declare function deriveIvPrefix(sessionSalt: Buffer, prefixIndex: number): Buffer;
12
+ export declare function deriveEpochKey(agentKey: Buffer, epoch: bigint): Buffer;
13
+ export declare function encodeShared(key: Buffer, ivRandom: Buffer, ivCounter: number, plaintext: Buffer): Buffer;
14
+ export declare function decodeShared(key: Buffer, wire: Buffer): Buffer;
15
+ export declare function encodeMaster(masterKey: Buffer, agentPid: number, ivRandom: Buffer, ivCounter: number, plaintext: Buffer): Buffer;
16
+ export declare function decodeMaster(masterKey: Buffer, wire: Buffer): Buffer;
17
+ //# sourceMappingURL=vlp_secure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vlp_secure.d.ts","sourceRoot":"","sources":["../src/vlp_secure.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,eAAO,MAAM,eAAe,KAAK,CAAC;AAClC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAQrC,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,MAAM,CAGR;AAID,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAQzE;AAED,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,MAAM,CAQR;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQtE;AAiDD,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,MAAM,CAiBR;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAS9D;AAID,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,MAAM,CAqBR;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAYpE"}
@@ -0,0 +1,158 @@
1
+ // VLP v0.2 secure-transport wire encode / decode.
2
+ //
3
+ // Provides:
4
+ // * HKDF-SHA256 key derivation (Node's built-in `crypto.hkdfSync`).
5
+ // * ChaCha20-Poly1305 shared-key and master-key seal/open via the
6
+ // built-in `crypto.createCipheriv` / `createDecipheriv` — no npm
7
+ // dependency required (stable in Node ≥ 15.0).
8
+ //
9
+ // The normative spec lives at `book/src/spec/vlp-secure.md`. KDF info
10
+ // strings are versioned (`-v1`) and frozen; any future migration MUST
11
+ // bump the version suffix and the test vectors.
12
+ import { createCipheriv, createDecipheriv, hkdfSync, } from "node:crypto";
13
+ export const SECURE_SHARED_BYTES = 60;
14
+ export const SECURE_MASTER_BYTES = 64;
15
+ export const KEY_BYTES = 32;
16
+ export const IV_RANDOM_BYTES = 8;
17
+ export const IV_COUNTER_BYTES = 4;
18
+ export const TAG_BYTES = 16;
19
+ export const PLAINTEXT_BYTES = 32;
20
+ export const SESSION_SALT_BYTES = 16;
21
+ // HKDF-SHA256 (RFC 5869) — extract + expand.
22
+ //
23
+ // IMPORTANT: Node's `hkdfSync(digest, ikm, salt, info, length)` argument
24
+ // order matches the Python and Rust references when called with an
25
+ // EMPTY salt for `deriveIvPrefix` — see cerebrum note 2026-05-16. The
26
+ // IKM is `sessionSalt`, the salt is `Buffer.alloc(0)`.
27
+ export function hkdfSha256(ikm, salt, info, length) {
28
+ const out = hkdfSync("sha256", ikm, salt, info, length);
29
+ return Buffer.from(out);
30
+ }
31
+ // Domain-specific key derivations — see `book/src/spec/vlp-secure.md` §6.
32
+ export function deriveAgentKey(masterKey, agentId) {
33
+ if (masterKey.length !== KEY_BYTES) {
34
+ throw new RangeError(`masterKey must be ${KEY_BYTES} bytes`);
35
+ }
36
+ const info = Buffer.alloc("varta-agent-v1\x00".length + 4);
37
+ info.write("varta-agent-v1\x00", 0, "binary");
38
+ info.writeUInt32LE(agentId >>> 0, "varta-agent-v1\x00".length);
39
+ return hkdfSha256(masterKey, Buffer.alloc(0), info, KEY_BYTES);
40
+ }
41
+ export function deriveIvPrefix(sessionSalt, prefixIndex) {
42
+ if (sessionSalt.length !== SESSION_SALT_BYTES) {
43
+ throw new RangeError(`sessionSalt must be ${SESSION_SALT_BYTES} bytes`);
44
+ }
45
+ const info = Buffer.alloc("varta-iv-prefix-v1\x00".length + 4);
46
+ info.write("varta-iv-prefix-v1\x00", 0, "binary");
47
+ info.writeUInt32LE(prefixIndex >>> 0, "varta-iv-prefix-v1\x00".length);
48
+ return hkdfSha256(sessionSalt, Buffer.alloc(0), info, IV_RANDOM_BYTES);
49
+ }
50
+ export function deriveEpochKey(agentKey, epoch) {
51
+ if (agentKey.length !== KEY_BYTES) {
52
+ throw new RangeError(`agentKey must be ${KEY_BYTES} bytes`);
53
+ }
54
+ const info = Buffer.alloc("varta-epoch-v1\x00".length + 8);
55
+ info.write("varta-epoch-v1\x00", 0, "binary");
56
+ info.writeBigUInt64LE(epoch, "varta-epoch-v1\x00".length);
57
+ return hkdfSha256(agentKey, Buffer.alloc(0), info, KEY_BYTES);
58
+ }
59
+ function buildNonce(ivRandom, ivCounter) {
60
+ const nonce = Buffer.alloc(12);
61
+ ivRandom.copy(nonce, 0, 0, IV_RANDOM_BYTES);
62
+ nonce.writeUInt32LE(ivCounter >>> 0, IV_RANDOM_BYTES);
63
+ return nonce;
64
+ }
65
+ function aeadSeal(key, nonce, aad, plaintext) {
66
+ const cipher = createCipheriv("chacha20-poly1305", key, nonce, {
67
+ authTagLength: TAG_BYTES,
68
+ });
69
+ if (aad !== null) {
70
+ cipher.setAAD(aad, { plaintextLength: plaintext.length });
71
+ }
72
+ const ct = Buffer.concat([cipher.update(plaintext), cipher.final()]);
73
+ const tag = cipher.getAuthTag();
74
+ return Buffer.concat([ct, tag]);
75
+ }
76
+ function aeadOpen(key, nonce, aad, ctAndTag) {
77
+ if (ctAndTag.length < TAG_BYTES) {
78
+ throw new Error("ciphertext shorter than authentication tag");
79
+ }
80
+ const ct = ctAndTag.subarray(0, ctAndTag.length - TAG_BYTES);
81
+ const tag = ctAndTag.subarray(ctAndTag.length - TAG_BYTES);
82
+ const decipher = createDecipheriv("chacha20-poly1305", key, nonce, {
83
+ authTagLength: TAG_BYTES,
84
+ });
85
+ if (aad !== null) {
86
+ decipher.setAAD(aad, { plaintextLength: ct.length });
87
+ }
88
+ decipher.setAuthTag(tag);
89
+ return Buffer.concat([decipher.update(ct), decipher.final()]);
90
+ }
91
+ // Produce a 60-byte shared-key secure frame.
92
+ // Wire layout: ivRandom[8] || ivCounter_LE[4] || ciphertext+tag[48]
93
+ export function encodeShared(key, ivRandom, ivCounter, plaintext) {
94
+ if (key.length !== KEY_BYTES) {
95
+ throw new RangeError(`key must be ${KEY_BYTES} bytes`);
96
+ }
97
+ if (ivRandom.length !== IV_RANDOM_BYTES) {
98
+ throw new RangeError(`ivRandom must be ${IV_RANDOM_BYTES} bytes`);
99
+ }
100
+ if (plaintext.length !== PLAINTEXT_BYTES) {
101
+ throw new RangeError("plaintext must be a 32-byte VLP frame");
102
+ }
103
+ const nonce = buildNonce(ivRandom, ivCounter);
104
+ const ctAndTag = aeadSeal(key, nonce, null, plaintext);
105
+ const wire = Buffer.alloc(SECURE_SHARED_BYTES);
106
+ ivRandom.copy(wire, 0);
107
+ wire.writeUInt32LE(ivCounter >>> 0, IV_RANDOM_BYTES);
108
+ ctAndTag.copy(wire, IV_RANDOM_BYTES + IV_COUNTER_BYTES);
109
+ return wire;
110
+ }
111
+ export function decodeShared(key, wire) {
112
+ if (wire.length !== SECURE_SHARED_BYTES) {
113
+ throw new RangeError(`wire must be ${SECURE_SHARED_BYTES} bytes`);
114
+ }
115
+ const ivRandom = wire.subarray(0, IV_RANDOM_BYTES);
116
+ const ivCounter = wire.readUInt32LE(IV_RANDOM_BYTES);
117
+ const ctAndTag = wire.subarray(IV_RANDOM_BYTES + IV_COUNTER_BYTES);
118
+ const nonce = buildNonce(ivRandom, ivCounter);
119
+ return aeadOpen(key, nonce, null, ctAndTag);
120
+ }
121
+ // Produce a 64-byte master-key secure frame.
122
+ // Wire layout: agentPid_LE[4] (AAD) || ivRandom[8] || ivCounter_LE[4] || ciphertext+tag[48]
123
+ export function encodeMaster(masterKey, agentPid, ivRandom, ivCounter, plaintext) {
124
+ if (masterKey.length !== KEY_BYTES) {
125
+ throw new RangeError(`masterKey must be ${KEY_BYTES} bytes`);
126
+ }
127
+ if (ivRandom.length !== IV_RANDOM_BYTES) {
128
+ throw new RangeError(`ivRandom must be ${IV_RANDOM_BYTES} bytes`);
129
+ }
130
+ if (plaintext.length !== PLAINTEXT_BYTES) {
131
+ throw new RangeError("plaintext must be a 32-byte VLP frame");
132
+ }
133
+ const agentKey = deriveAgentKey(masterKey, agentPid);
134
+ const aad = Buffer.alloc(4);
135
+ aad.writeUInt32LE(agentPid >>> 0, 0);
136
+ const nonce = buildNonce(ivRandom, ivCounter);
137
+ const ctAndTag = aeadSeal(agentKey, nonce, aad, plaintext);
138
+ const wire = Buffer.alloc(SECURE_MASTER_BYTES);
139
+ aad.copy(wire, 0);
140
+ ivRandom.copy(wire, 4);
141
+ wire.writeUInt32LE(ivCounter >>> 0, 4 + IV_RANDOM_BYTES);
142
+ ctAndTag.copy(wire, 4 + IV_RANDOM_BYTES + IV_COUNTER_BYTES);
143
+ return wire;
144
+ }
145
+ export function decodeMaster(masterKey, wire) {
146
+ if (wire.length !== SECURE_MASTER_BYTES) {
147
+ throw new RangeError(`wire must be ${SECURE_MASTER_BYTES} bytes`);
148
+ }
149
+ const aad = wire.subarray(0, 4);
150
+ const agentPid = wire.readUInt32LE(0);
151
+ const ivRandom = wire.subarray(4, 4 + IV_RANDOM_BYTES);
152
+ const ivCounter = wire.readUInt32LE(4 + IV_RANDOM_BYTES);
153
+ const ctAndTag = wire.subarray(4 + IV_RANDOM_BYTES + IV_COUNTER_BYTES);
154
+ const agentKey = deriveAgentKey(masterKey, agentPid);
155
+ const nonce = buildNonce(ivRandom, ivCounter);
156
+ return aeadOpen(agentKey, nonce, aad, ctAndTag);
157
+ }
158
+ //# sourceMappingURL=vlp_secure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vlp_secure.js","sourceRoot":"","sources":["../src/vlp_secure.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@varta-health/client",
3
+ "version": "0.1.0",
4
+ "description": "Health protocol client for distributed local agents (Varta VLP v0.2).",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./panic": {
14
+ "types": "./dist/panic.d.ts",
15
+ "import": "./dist/panic.js"
16
+ },
17
+ "./vlp": {
18
+ "types": "./dist/vlp.d.ts",
19
+ "import": "./dist/vlp.js"
20
+ },
21
+ "./vlp-secure": {
22
+ "types": "./dist/vlp_secure.d.ts",
23
+ "import": "./dist/vlp_secure.js"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "LICENSE",
29
+ "README.md",
30
+ "CHANGELOG.md"
31
+ ],
32
+ "engines": {
33
+ "node": ">=18.0.0"
34
+ },
35
+ "scripts": {
36
+ "build": "tsc -p tsconfig.json",
37
+ "clean": "rm -rf dist",
38
+ "prepublishOnly": "npm run clean && npm run build",
39
+ "test": "npm run test:conformance && npm run test:unit",
40
+ "test:conformance": "node --test --import tsx tests/conformance.test.ts",
41
+ "test:unit": "node --test --import tsx tests/client_unit.test.ts tests/transport.test.ts tests/fork_safety.test.ts tests/panic.test.ts",
42
+ "test:interop": "node --test --import tsx tests/interop.test.ts",
43
+ "typecheck": "tsc --noEmit"
44
+ },
45
+ "keywords": [
46
+ "varta",
47
+ "vlp",
48
+ "heartbeat",
49
+ "monitoring",
50
+ "observability",
51
+ "prometheus",
52
+ "agent",
53
+ "watchdog",
54
+ "healthcheck"
55
+ ],
56
+ "author": "Varta Maintainers",
57
+ "license": "MIT OR Apache-2.0",
58
+ "repository": {
59
+ "type": "git",
60
+ "url": "git+https://github.com/aramirez087/Varta.git",
61
+ "directory": "clients/node"
62
+ },
63
+ "homepage": "https://github.com/aramirez087/Varta/tree/main/clients/node",
64
+ "bugs": {
65
+ "url": "https://github.com/aramirez087/Varta/issues"
66
+ },
67
+ "devDependencies": {
68
+ "@types/node": "^20.11.0",
69
+ "tsx": "^4.7.0",
70
+ "typescript": "^5.4.0"
71
+ }
72
+ }