diff --git a/.github/workflows/typecheck.yml b/.github/workflows/typecheck.yml
new file mode 100644
index 000000000..fdf2d6f47
--- /dev/null
+++ b/.github/workflows/typecheck.yml
@@ -0,0 +1,22 @@
+name: Typecheck
+on:
+  push:
+    branches: [main]
+  pull_request:
+    branches: [main]
+
+jobs:
+  typecheck:
+    name: Run typecheck
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - uses: pnpm/action-setup@v4
+        with:
+          version: 9
+      - shell: bash
+        run: |
+          pnpm install --no-frozen-lockfile
+
+      - shell: bash
+        run: pnpm run typecheck
diff --git a/examples/canvas/package.json b/examples/canvas/package.json
index 8c3ec0261..9ccea892c 100644
--- a/examples/canvas/package.json
+++ b/examples/canvas/package.json
@@ -4,6 +4,7 @@
 	"license": "MIT",
 	"scripts": {
 		"build": "vite build",
+		"typecheck": "tsc --noEmit",
 		"clean": "rm -rf dist/ node_modules/",
 		"dev": "vite serve",
 		"start": "vite preview --host --port 5173"
diff --git a/examples/chat/package.json b/examples/chat/package.json
index a223c09c5..01c1d4f39 100644
--- a/examples/chat/package.json
+++ b/examples/chat/package.json
@@ -4,6 +4,7 @@
 	"license": "MIT",
 	"scripts": {
 		"build": "vite build",
+		"typecheck": "tsc --noEmit",
 		"clean": "rm -rf dist/ node_modules/",
 		"dev": "vite serve",
 		"start": "vite preview --host --port 5173"
diff --git a/examples/chat/src/objects/chat.ts b/examples/chat/src/objects/chat.ts
index 5ee96a0eb..ce5a073db 100644
--- a/examples/chat/src/objects/chat.ts
+++ b/examples/chat/src/objects/chat.ts
@@ -1,7 +1,6 @@
-import { type DRP, type ResolveConflictsType } from "@ts-drp/object";
-import { ActionType, SemanticsType } from "@ts-drp/types";
+import { type IDRP, type ResolveConflictsType, ActionType, SemanticsType } from "@ts-drp/types";
 
-export class Chat implements DRP {
+export class Chat implements IDRP {
 	semanticsType: SemanticsType = SemanticsType.pair;
 	// store messages as strings in the format (timestamp, message, peerId)
 	messages: Set<string>;
@@ -17,7 +16,7 @@ export class Chat implements DRP {
 		return this.messages;
 	}
 
-	resolveConflicts(_): ResolveConflictsType {
+	resolveConflicts(): ResolveConflictsType {
 		return { action: ActionType.Nop };
 	}
 }
diff --git a/examples/grid/package.json b/examples/grid/package.json
index 131af4762..565adaa75 100644
--- a/examples/grid/package.json
+++ b/examples/grid/package.json
@@ -4,6 +4,7 @@
 	"license": "MIT",
 	"scripts": {
 		"build": "vite build",
+		"typecheck": "tsc --noEmit",
 		"clean": "rm -rf dist/ node_modules/",
 		"dev": "vite serve",
 		"start": "vite preview --host --port 5173"
diff --git a/examples/grid/src/index.ts b/examples/grid/src/index.ts
index 8829efa16..f10e2c0f4 100644
--- a/examples/grid/src/index.ts
+++ b/examples/grid/src/index.ts
@@ -1,5 +1,6 @@
-import { DRPNode, type DRPNodeConfig } from "@ts-drp/node";
-import { enableTracing, type IMetrics, OpentelemetryMetrics } from "@ts-drp/tracer";
+import { DRPNode } from "@ts-drp/node";
+import { enableTracing, OpentelemetryMetrics } from "@ts-drp/tracer";
+import { type DRPNodeConfig, type IMetrics } from "@ts-drp/types";
 
 import { env } from "./env";
 import { Grid } from "./objects/grid";
diff --git a/examples/grid/src/objects/grid.ts b/examples/grid/src/objects/grid.ts
index 3a6a334c8..17fd8da16 100644
--- a/examples/grid/src/objects/grid.ts
+++ b/examples/grid/src/objects/grid.ts
@@ -1,7 +1,12 @@
-import { type DRP, type ResolveConflictsType } from "@ts-drp/object";
-import { ActionType, SemanticsType, type Vertex } from "@ts-drp/types";
+import {
+	type IDRP,
+	type ResolveConflictsType,
+	ActionType,
+	SemanticsType,
+	type Vertex,
+} from "@ts-drp/types";
 
-export class Grid implements DRP {
+export class Grid implements IDRP {
 	semanticsType: SemanticsType = SemanticsType.pair;
 	positions: Map<string, { x: number; y: number }>;
 
diff --git a/examples/grid/src/state.ts b/examples/grid/src/state.ts
index f2cdee1b7..891e9af22 100644
--- a/examples/grid/src/state.ts
+++ b/examples/grid/src/state.ts
@@ -1,11 +1,11 @@
 import { DRPNode } from "@ts-drp/node";
-import { type DRPObject } from "@ts-drp/object";
+import { type IDRPObject } from "@ts-drp/types";
 
 import { type Grid } from "./objects/grid";
 
 interface GridState {
 	node: DRPNode;
-	drpObject: DRPObject | undefined;
+	drpObject: IDRPObject | undefined;
 	gridDRP: Grid | undefined;
 	peers: string[];
 	discoveryPeers: string[];
diff --git a/examples/grid/vite.config.mts b/examples/grid/vite.config.mts
index 2cab18d98..f68b40036 100644
--- a/examples/grid/vite.config.mts
+++ b/examples/grid/vite.config.mts
@@ -21,6 +21,7 @@ export default defineConfig({
 			"@ts-drp": path.resolve(__dirname, "../../packages"),
 		},
 	},
+	// @ts-expect-error -- test is a valid property
 	test: {
 		exclude: ["**/node_modules", "**/e2e"],
 	},
diff --git a/examples/local-bootstrap/package.json b/examples/local-bootstrap/package.json
index f6011cdef..e8a36fb07 100644
--- a/examples/local-bootstrap/package.json
+++ b/examples/local-bootstrap/package.json
@@ -4,6 +4,7 @@
 	"license": "MIT",
 	"scripts": {
 		"build": "vite build",
+		"typecheck": "tsc --noEmit",
 		"clean": "rm -rf dist/ node_modules/",
 		"dev": "vite serve"
 	},
diff --git a/package.json b/package.json
index fe1f49737..6ed17f4b0 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,7 @@
 	"type": "module",
 	"scripts": {
 		"bench": "vitest bench",
-		"build": "pnpm build:packages && pnpm build:examples",
+		"build": "pnpm -r build",
 		"build:examples": "pnpm --filter 'ts-drp-example*' build",
 		"build:packages": "pnpm --filter '@ts-drp/*' build",
 		"clean": "pnpm --filter '@ts-drp/*' clean && rm -r node_modules/ docs/",
@@ -34,6 +34,7 @@
 		"proto-gen:types": "buf generate packages/types/src/proto -o packages/types/src/proto",
 		"release": "release-it",
 		"test": "vitest",
+		"typecheck": "pnpm --parallel typecheck",
 		"watch": "pnpm --parallel --filter '@ts-drp/*' watch"
 	},
 	"dependencies": {
@@ -45,7 +46,7 @@
 		"@playwright/test": "^1.49.1",
 		"@release-it-plugins/workspaces": "^4.2.0",
 		"@typescript-eslint/parser": "^8.21.0",
-		"@vitest/coverage-v8": "3.0.5",
+		"@vitest/coverage-v8": "^3.0.5",
 		"assemblyscript": "^0.27.29",
 		"eslint": "^9.19.0",
 		"eslint-config-prettier": "^10.0.1",
diff --git a/packages/blueprints/package.json b/packages/blueprints/package.json
index f17ef2fdb..21795c9c9 100644
--- a/packages/blueprints/package.json
+++ b/packages/blueprints/package.json
@@ -21,7 +21,8 @@
 		}
 	},
 	"scripts": {
-		"build": "tsc -b",
+		"build": "tsc -b tsconfig.build.json",
+		"typecheck": "tsc --noEmit",
 		"clean": "rm -rf dist/ node_modules/",
 		"prepack": "tsc -b",
 		"test": "vitest",
@@ -29,7 +30,6 @@
 	},
 	"dependencies": {
 		"@thi.ng/random": "^4.1.0",
-		"@ts-drp/object": "0.8.5",
 		"@ts-drp/types": "0.8.5"
 	}
 }
diff --git a/packages/blueprints/tests/AddMul.test.ts b/packages/blueprints/tests/AddMul.test.ts
index 3d2d5b28c..eeff5024d 100644
--- a/packages/blueprints/tests/AddMul.test.ts
+++ b/packages/blueprints/tests/AddMul.test.ts
@@ -1,4 +1,4 @@
-import { ActionType } from "@ts-drp/types";
+import { ActionType, type Vertex } from "@ts-drp/types";
 import { beforeEach, describe, expect, test } from "vitest";
 
 import { AddMulDRP } from "../src/AddMul/index.js";
@@ -25,12 +25,15 @@ describe("AddMulDRP tests", () => {
 
 	test("Test: Add (Weird inputs)", () => {
 		drp.add(5);
+		// @ts-expect-error - weird input
 		drp.add("");
 		expect(drp.query_value()).toEqual(5);
 
+		// @ts-expect-error - weird input
 		drp.add(true);
 		expect(drp.query_value()).toEqual(5);
 
+		// @ts-expect-error - weird input
 		drp.add({});
 		expect(drp.query_value()).toEqual(5);
 	});
@@ -51,12 +54,15 @@ describe("AddMulDRP tests", () => {
 
 	test("Test: Mul (Weird inputs)", () => {
 		drp.add(5);
+		// @ts-expect-error - weird input
 		drp.mul("");
 		expect(drp.query_value()).toEqual(5);
 
+		// @ts-expect-error - weird input
 		drp.mul(true);
 		expect(drp.query_value()).toEqual(5);
 
+		// @ts-expect-error - weird input
 		drp.mul({});
 		expect(drp.query_value()).toEqual(5);
 	});
@@ -76,15 +82,19 @@ describe("AddMulDRP tests", () => {
 	});
 
 	test("Test: initialValue (Weird inputs)", () => {
+		// @ts-expect-error - weird input
 		drp = new AddMulDRP("10");
 		expect(drp.query_value()).toEqual(0);
 
+		// @ts-expect-error - weird input
 		drp = new AddMulDRP(true);
 		expect(drp.query_value()).toEqual(0);
 
+		// @ts-expect-error - weird input
 		drp = new AddMulDRP({});
 		expect(drp.query_value()).toEqual(0);
 
+		// @ts-expect-error - weird input
 		drp = new AddMulDRP([]);
 		expect(drp.query_value()).toEqual(0);
 	});
@@ -166,24 +176,28 @@ describe("AddMulDRP tests", () => {
 	});
 
 	test("Test: resolveConflicts (Weird inputs)", () => {
-		const vertex1 = {
+		const vertex1: Vertex = {
 			hash: "1",
+			// @ts-expect-error - operation is missing
 			operation: {
 				opType: "add",
 			},
 		};
-		const vertex2 = {
+		const vertex2: Vertex = {
 			hash: "2",
+			// @ts-expect-error - operation is missing
 			operation: {
 				opType: "mulx",
 			},
 		};
-		const vertex3 = {
+		const vertex3: Vertex = {
+			// @ts-expect-error - operation is missing
 			operation: {
 				opType: "mul",
 			},
 		};
-		const vertex4 = {};
+		// @ts-expect-error - operation is missing
+		const vertex4: Vertex = {};
 
 		let action = drp.resolveConflicts([vertex1, vertex2]);
 		expect(action).toEqual({ action: ActionType.Nop });
diff --git a/packages/blueprints/tsconfig.build.json b/packages/blueprints/tsconfig.build.json
new file mode 100644
index 000000000..07e127d11
--- /dev/null
+++ b/packages/blueprints/tsconfig.build.json
@@ -0,0 +1 @@
+{"extends": "./tsconfig.json","exclude": ["tests/**/*.ts"]}
diff --git a/packages/blueprints/tsconfig.json b/packages/blueprints/tsconfig.json
index 3e8b28b11..55527891c 100644
--- a/packages/blueprints/tsconfig.json
+++ b/packages/blueprints/tsconfig.json
@@ -3,11 +3,11 @@
 	"compilerOptions": {
 		"outDir": "dist"
 	},
-	"references": [
-		{
-			"path": "../object"
-		}
+	"include": [
+		"src/**/*.ts",
+		"tests/**/*.ts"
 	],
-	"include": ["src/**/*.ts"],
-	"exclude": ["src/**/*.asc.ts"]
+	"exclude": [
+		"src/**/*.asc.ts"
+	]
 }
diff --git a/packages/interval-runner/package.json b/packages/interval-runner/package.json
index d522feec6..917974492 100644
--- a/packages/interval-runner/package.json
+++ b/packages/interval-runner/package.json
@@ -21,12 +21,13 @@
 		}
 	},
 	"scripts": {
-		"build": "tsc -b",
+		"build": "tsc -b tsconfig.build.json",
 		"clean": "rm -rf dist/ node_modules/",
 		"cli": "tsx ./src/run.ts",
 		"prebuild": "node -p \"'export const VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts",
 		"prepack": "tsc -b",
 		"test": "vitest",
+		"typecheck": "tsc --noEmit",
 		"watch": "tsc -b -w"
 	},
 	"dependencies": {
diff --git a/packages/interval-runner/tsconfig.build.json b/packages/interval-runner/tsconfig.build.json
new file mode 100644
index 000000000..07e127d11
--- /dev/null
+++ b/packages/interval-runner/tsconfig.build.json
@@ -0,0 +1 @@
+{"extends": "./tsconfig.json","exclude": ["tests/**/*.ts"]}
diff --git a/packages/keychain/package.json b/packages/keychain/package.json
index c2f5724a9..d63d7204c 100644
--- a/packages/keychain/package.json
+++ b/packages/keychain/package.json
@@ -21,9 +21,10 @@
 		}
 	},
 	"scripts": {
-		"build": "tsc -b",
+		"build": "tsc -b tsconfig.build.json",
 		"clean": "rm -rf dist/ node_modules/",
 		"prepack": "tsc -b",
+		"typecheck": "tsc --noEmit",
 		"watch": "tsc -b -w"
 	},
 	"dependencies": {
@@ -33,7 +34,6 @@
 		"@libp2p/crypto": "^5.0.5",
 		"@libp2p/interface": "^2.1.3",
 		"@noble/secp256k1": "^2.2.3",
-		"@ts-drp/object": "0.8.5",
 		"@ts-drp/types": "^0.8.5",
 		"uint8arrays": "^5.1.0"
 	},
diff --git a/packages/keychain/tsconfig.build.json b/packages/keychain/tsconfig.build.json
new file mode 100644
index 000000000..07e127d11
--- /dev/null
+++ b/packages/keychain/tsconfig.build.json
@@ -0,0 +1 @@
+{"extends": "./tsconfig.json","exclude": ["tests/**/*.ts"]}
diff --git a/packages/keychain/tsconfig.json b/packages/keychain/tsconfig.json
index 3dfb23cf7..ddb28fb86 100644
--- a/packages/keychain/tsconfig.json
+++ b/packages/keychain/tsconfig.json
@@ -3,5 +3,5 @@
 	"compilerOptions": {
 		"outDir": "dist"
 	},
-	"include": ["src/**/*.ts", "src/**/*.js"]
+	"include": ["src/**/*.ts", "src/**/*.js", "tests/**/*.ts"]
 }
diff --git a/packages/logger/package.json b/packages/logger/package.json
index e28d98211..538d2f33e 100644
--- a/packages/logger/package.json
+++ b/packages/logger/package.json
@@ -21,13 +21,13 @@
 		}
 	},
 	"scripts": {
-		"build": "tsc -b",
+		"build": "tsc -b tsconfig.build.json",
 		"clean": "rm -rf dist/ node_modules/",
 		"prepack": "tsc -b",
+		"typecheck": "tsc --noEmit",
 		"watch": "tsc -b -w"
 	},
 	"dependencies": {
-		"@ts-drp/types": "^0.8.5",
 		"loglevel": "^1.9.2",
 		"loglevel-plugin-prefix": "^0.8.4",
 		"@ts-drp/types": "^0.8.5"
diff --git a/packages/logger/test/log.test.ts b/packages/logger/tests/log.test.ts
similarity index 100%
rename from packages/logger/test/log.test.ts
rename to packages/logger/tests/log.test.ts
diff --git a/packages/logger/tsconfig.build.json b/packages/logger/tsconfig.build.json
new file mode 100644
index 000000000..07e127d11
--- /dev/null
+++ b/packages/logger/tsconfig.build.json
@@ -0,0 +1 @@
+{"extends": "./tsconfig.json","exclude": ["tests/**/*.ts"]}
diff --git a/packages/logger/tsconfig.json b/packages/logger/tsconfig.json
index 9cc8b37cd..0ca984477 100644
--- a/packages/logger/tsconfig.json
+++ b/packages/logger/tsconfig.json
@@ -3,5 +3,8 @@
 	"compilerOptions": {
 		"outDir": "dist"
 	},
-	"include": ["src/**/*.ts"]
+	"include": [
+		"src/**/*.ts",
+		"tests/**/*.ts"
+	]
 }
diff --git a/packages/network/package.json b/packages/network/package.json
index 567324a1b..c463af952 100644
--- a/packages/network/package.json
+++ b/packages/network/package.json
@@ -21,13 +21,15 @@
 		}
 	},
 	"scripts": {
-		"build": "tsc -b",
+		"build": "tsc -b tsconfig.build.json",
 		"clean": "rm -rf dist/ node_modules/",
 		"prepack": "tsc -b",
 		"test": "vitest",
+		"typecheck": "tsc --noEmit",
 		"watch": "tsc -b -w"
 	},
 	"devDependencies": {
+		"@ts-drp/keychain": "0.8.5",
 		"race-event": "^1.3.0"
 	},
 	"dependencies": {
@@ -41,8 +43,8 @@
 		"@libp2p/crypto": "^5.0.5",
 		"@libp2p/dcutr": "^2.0.6",
 		"@libp2p/devtools-metrics": "^1.1.5",
-		"@libp2p/interface": "^2.1.3",
 		"@libp2p/identify": "^3.0.6",
+		"@libp2p/interface": "^2.1.3",
 		"@libp2p/ping": "2.0.11",
 		"@libp2p/pubsub-peer-discovery": "^11.0.0",
 		"@libp2p/webrtc": "^5.0.9",
diff --git a/packages/network/tests/index.test.ts b/packages/network/tests/index.test.ts
index 089f31ba9..9e4504d13 100644
--- a/packages/network/tests/index.test.ts
+++ b/packages/network/tests/index.test.ts
@@ -1,4 +1,4 @@
-import { Keychain } from "@ts-drp/keychain/src/keychain.js";
+import { Keychain } from "@ts-drp/keychain";
 import { beforeAll, describe, expect, test } from "vitest";
 
 import { DRPNetworkNode } from "../src/node.js";
diff --git a/packages/network/tests/network.test.ts b/packages/network/tests/network.test.ts
index 360c00d87..de91c26df 100644
--- a/packages/network/tests/network.test.ts
+++ b/packages/network/tests/network.test.ts
@@ -6,11 +6,11 @@ import {
 	type Libp2p,
 	type SubscriptionChangeData,
 } from "@libp2p/interface";
-import { loadConfig } from "@ts-drp/node/src/config.js";
-import { Message } from "@ts-drp/types";
+import { type DRPNodeConfig, Message } from "@ts-drp/types";
 import { raceEvent } from "race-event";
 import { beforeAll, describe, expect, test, afterAll } from "vitest";
 
+import rawConfig from "../../../configs/local-bootstrap.json" with { type: "json" };
 import { DRPNetworkNode, type DRPNetworkNodeConfig, streamToUint8Array } from "../src/node.js";
 
 describe("DRPNetworkNode can connect & send messages", () => {
@@ -42,9 +42,9 @@ describe("DRPNetworkNode can connect & send messages", () => {
 	};
 
 	beforeAll(async () => {
-		const configPath = `${__dirname}/../../../configs/local-bootstrap.json`;
+		const config: DRPNodeConfig = rawConfig;
 		const bootstrapConfig: DRPNetworkNodeConfig = {
-			...loadConfig(configPath)?.network_config,
+			...config.network_config,
 			log_config: { level: "silent" },
 		};
 		bootstrapNode = new DRPNetworkNode(bootstrapConfig);
diff --git a/packages/network/tsconfig.build.json b/packages/network/tsconfig.build.json
new file mode 100644
index 000000000..07e127d11
--- /dev/null
+++ b/packages/network/tsconfig.build.json
@@ -0,0 +1 @@
+{"extends": "./tsconfig.json","exclude": ["tests/**/*.ts"]}
diff --git a/packages/network/tsconfig.json b/packages/network/tsconfig.json
index 48e3023fd..1d740f8d7 100644
--- a/packages/network/tsconfig.json
+++ b/packages/network/tsconfig.json
@@ -8,5 +8,8 @@
 			"path": "../logger"
 		}
 	],
-	"include": ["src/**/*.ts"]
+	"include": [
+		"src/**/*.ts",
+		"tests/**/*.ts"
+	]
 }
diff --git a/packages/node/package.json b/packages/node/package.json
index bc9b88ad5..9d9410289 100644
--- a/packages/node/package.json
+++ b/packages/node/package.json
@@ -21,12 +21,13 @@
 		}
 	},
 	"scripts": {
-		"build": "tsc -b",
+		"build": "tsc -b tsconfig.build.json",
 		"clean": "rm -rf dist/ node_modules/",
 		"cli": "tsx ./src/run.ts",
 		"prebuild": "node -p \"'export const VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts",
 		"prepack": "tsc -b",
 		"test": "vitest",
+		"typecheck": "tsc --noEmit",
 		"watch": "tsc -b -w"
 	},
 	"devDependencies": {
diff --git a/packages/node/src/config.ts b/packages/node/src/config.ts
index 94b381888..52fc06c2a 100644
--- a/packages/node/src/config.ts
+++ b/packages/node/src/config.ts
@@ -1,8 +1,7 @@
+import type { DRPNodeConfig } from "@ts-drp/types";
 import * as dotenv from "dotenv";
 import fs from "node:fs";
 
-import type { DRPNodeConfig } from "./index.js";
-
 export function loadConfig(configPath?: string | undefined): DRPNodeConfig | undefined {
 	let config: DRPNodeConfig | undefined;
 
diff --git a/packages/node/src/handlers.ts b/packages/node/src/handlers.ts
index 960c34e64..f864c57c3 100644
--- a/packages/node/src/handlers.ts
+++ b/packages/node/src/handlers.ts
@@ -3,7 +3,7 @@ import type { Stream } from "@libp2p/interface";
 import { peerIdFromPublicKey } from "@libp2p/peer-id";
 import { Signature } from "@noble/secp256k1";
 import { streamToUint8Array } from "@ts-drp/network";
-import { HashGraph } from "@ts-drp/object";
+import { HashGraph, deserializeDRPState, serializeDRPState } from "@ts-drp/object";
 import {
 	AttestationUpdate,
 	type DRPState,
@@ -25,7 +25,6 @@ import * as crypto from "crypto";
 
 import { type DRPNode } from "./index.js";
 import { log } from "./logger.js";
-import { deserializeStateMessage, serializeStateMessage } from "./utils.js";
 
 interface HandleParams {
 	node: DRPNode;
@@ -100,8 +99,8 @@ function fetchStateHandler({ node, message }: HandleParams): ReturnType<IHandler
 	const response = FetchStateResponse.create({
 		objectId: fetchState.objectId,
 		vertexHash: fetchState.vertexHash,
-		aclState: serializeStateMessage(aclState),
-		drpState: serializeStateMessage(drpState),
+		aclState: serializeDRPState(aclState),
+		drpState: serializeDRPState(drpState),
 	});
 
 	const messageFetchStateResponse = Message.create({
@@ -130,8 +129,8 @@ function fetchStateResponseHandler({ node, message }: HandleParams): ReturnType<
 		return;
 	}
 
-	const aclState = deserializeStateMessage(fetchStateResponse.aclState);
-	const drpState = deserializeStateMessage(fetchStateResponse.drpState);
+	const aclState = deserializeDRPState(fetchStateResponse.aclState);
+	const drpState = deserializeDRPState(fetchStateResponse.drpState);
 	if (fetchStateResponse.vertexHash === HashGraph.rootHash) {
 		const state = aclState;
 		object.aclStates.set(fetchStateResponse.vertexHash, state);
diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts
index dd8d41426..8e0a6b150 100644
--- a/packages/node/src/index.ts
+++ b/packages/node/src/index.ts
@@ -1,29 +1,26 @@
 import type { GossipsubMessage } from "@chainsafe/libp2p-gossipsub";
 import type { EventCallback, IncomingStreamData, StreamHandler } from "@libp2p/interface";
-import { type KeychainConfig, Keychain } from "@ts-drp/keychain";
+import { Keychain } from "@ts-drp/keychain";
 import { Logger } from "@ts-drp/logger";
-import { DRPNetworkNode, type DRPNetworkNodeConfig } from "@ts-drp/network";
+import { DRPNetworkNode } from "@ts-drp/network";
 import { DRPObject } from "@ts-drp/object";
 import {
 	type IMetrics,
+	type DRPNodeConfig,
 	Message,
 	MessageType,
 	type IACL,
 	type IDRP,
-	type LoggerOptions,
 	type IDRPObject,
 } from "@ts-drp/types";
 
+import { loadConfig } from "./config.js";
 import { drpMessagesHandler } from "./handlers.js";
 import { log } from "./logger.js";
 import * as operations from "./operations.js";
 import { DRPObjectStore } from "./store/index.js";
-// snake_casing to match the JSON config
-export interface DRPNodeConfig {
-	log_config?: LoggerOptions;
-	network_config?: DRPNetworkNodeConfig;
-	keychain_config?: KeychainConfig;
-}
+
+export { loadConfig };
 
 export class DRPNode {
 	config?: DRPNodeConfig;
diff --git a/packages/node/src/run.ts b/packages/node/src/run.ts
index e1cb5313d..12f1122ff 100644
--- a/packages/node/src/run.ts
+++ b/packages/node/src/run.ts
@@ -1,6 +1,8 @@
+import { type DRPNodeConfig } from "@ts-drp/types";
+
 import { program } from "./cli/index.js";
 import { loadConfig } from "./config.js";
-import { type DRPNodeConfig, DRPNode } from "./index.js";
+import { DRPNode } from "./index.js";
 import { init as rpc_init } from "./rpc/index.js";
 
 export const run = async (port: number = 6969): Promise<void> => {
diff --git a/packages/node/src/utils.ts b/packages/node/src/utils.ts
deleted file mode 100644
index 9b436b765..000000000
--- a/packages/node/src/utils.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { deserializeValue, serializeValue } from "@ts-drp/object";
-import {
-	DRPState,
-	DRPStateEntry,
-	DRPStateEntryOtherTheWire,
-	DRPStateOtherTheWire,
-} from "@ts-drp/types";
-
-export function serializeStateMessage(state?: DRPState): DRPStateOtherTheWire {
-	const drpState = DRPStateOtherTheWire.create();
-	for (const e of state?.state ?? []) {
-		const entry = DRPStateEntryOtherTheWire.create({
-			key: e.key,
-			data: serializeValue(e.value),
-		});
-		drpState.state.push(entry);
-	}
-	return drpState;
-}
-
-export function deserializeStateMessage(state?: DRPStateOtherTheWire): DRPState {
-	const drpState = DRPState.create();
-
-	for (const e of state?.state ?? []) {
-		const entry = DRPStateEntry.create({
-			key: e.key,
-			value: deserializeValue(e.data),
-		});
-		drpState.state.push(entry);
-	}
-	return drpState;
-}
diff --git a/packages/node/tests/node.test.ts b/packages/node/tests/node.test.ts
index 6c8147edc..53bc52bde 100644
--- a/packages/node/tests/node.test.ts
+++ b/packages/node/tests/node.test.ts
@@ -2,7 +2,7 @@ import { bls } from "@chainsafe/bls/herumi";
 import { SetDRP } from "@ts-drp/blueprints";
 import { Logger } from "@ts-drp/logger";
 import { DRPObject, ObjectACL } from "@ts-drp/object";
-import { type DRP, DrpType, type Vertex, ACLGroup } from "@ts-drp/types";
+import { type IDRP, DrpType, type Vertex, ACLGroup } from "@ts-drp/types";
 import { beforeAll, beforeEach, describe, expect, test, vi } from "vitest";
 
 import {
@@ -222,7 +222,7 @@ describe("DRPNode voting tests", () => {
 });
 
 describe("DRPNode with rpc", () => {
-	let drp: DRP;
+	let drp: IDRP;
 	let drpNode: DRPNode;
 	let drpObject: DRPObject;
 	let mockLogger: Logger;
diff --git a/packages/node/tests/utils.test.ts b/packages/node/tests/utils.test.ts
index bb62c2854..48690046a 100644
--- a/packages/node/tests/utils.test.ts
+++ b/packages/node/tests/utils.test.ts
@@ -1,9 +1,7 @@
-import { SetDRP } from "@ts-drp/blueprints/src/index.js";
-import { DRPObject } from "@ts-drp/object/src/index.js";
+import { SetDRP } from "@ts-drp/blueprints";
+import { DRPObject, deserializeDRPState, serializeDRPState } from "@ts-drp/object";
 import { beforeAll, describe, expect, test } from "vitest";
 
-import { deserializeStateMessage, serializeStateMessage } from "../src/utils.js";
-
 describe("State message utils", () => {
 	let object: DRPObject;
 
@@ -20,8 +18,8 @@ describe("State message utils", () => {
 
 	test("Should serialize/deserialize state message", () => {
 		const state = object["_computeDRPState"].bind(object);
-		const serialized = serializeStateMessage(state(object.hashGraph.getFrontier()));
-		const deserialized = deserializeStateMessage(serialized);
+		const serialized = serializeDRPState(state(object.hashGraph.getFrontier()));
+		const deserialized = deserializeDRPState(serialized);
 		expect(deserialized).toStrictEqual(state(object.hashGraph.getFrontier()));
 	});
 });
diff --git a/packages/node/tsconfig.build.json b/packages/node/tsconfig.build.json
new file mode 100644
index 000000000..843981301
--- /dev/null
+++ b/packages/node/tsconfig.build.json
@@ -0,0 +1,6 @@
+{
+    "extends": "./tsconfig.json",
+    "exclude": [
+        "tests/**/*.ts"
+    ]
+}
diff --git a/packages/node/tsconfig.json b/packages/node/tsconfig.json
index b78d8d1c9..7f727758c 100644
--- a/packages/node/tsconfig.json
+++ b/packages/node/tsconfig.json
@@ -1,25 +1,11 @@
 {
 	"extends": "../../tsconfig.json",
-
 	"compilerOptions": {
 		"outDir": "dist"
 	},
-	"references": [
-		{
-			"path": "../blueprints"
-		},
-		{
-			"path": "../network"
-		},
-		{
-			"path": "../object"
-		},
-		{
-			"path": "../logger"
-		},
-		{
-			"path": "../keychain"
-		}
-	],
-	"include": ["src/**/*.ts", "src/**/*.js"]
+	"include": [
+		"src/**/*.ts",
+		"src/**/*.js",
+		"tests/**/*.ts"
+	]
 }
diff --git a/packages/object/package.json b/packages/object/package.json
index 9ce596a0c..db7d82506 100644
--- a/packages/object/package.json
+++ b/packages/object/package.json
@@ -23,15 +23,17 @@
 	},
 	"scripts": {
 		"benchmark": "tsx tests/hashgraph.bench.ts | tee benchmark-output.txt",
-		"build": "tsc -b",
+		"build": "tsc -b tsconfig.build.json",
 		"clean": "rm -rf dist/ node_modules/",
 		"prepack": "tsc -b",
 		"test": "vitest",
+		"typecheck": "tsc --noEmit",
 		"watch": "tsc -b -w"
 	},
 	"devDependencies": {
 		"@bufbuild/protobuf": "^2.0.0",
 		"@ts-drp/blueprints": "^0.8.5",
+		"@ts-drp/keychain": "^0.8.5",
 		"@types/benchmark": "^2.1.5",
 		"benchmark": "^2.1.4",
 		"pprof": "^4.0.0",
@@ -43,7 +45,6 @@
 		"@ts-drp/logger": "^0.8.5",
 		"@ts-drp/tracer": "^0.8.5",
 		"@ts-drp/types": "^0.8.5",
-		"@types/node": "^22.5.4",
 		"es-toolkit": "1.30.1",
 		"fast-deep-equal": "^3.1.3",
 		"fast-equals": "^5.2.2",
diff --git a/packages/object/src/utils/serializer.ts b/packages/object/src/utils/serializer.ts
index 082d7581b..300eb3040 100644
--- a/packages/object/src/utils/serializer.ts
+++ b/packages/object/src/utils/serializer.ts
@@ -1,4 +1,10 @@
 import { encode, decode, ExtensionCodec } from "@msgpack/msgpack";
+import {
+	DRPState,
+	DRPStateEntry,
+	DRPStateEntryOtherTheWire,
+	DRPStateOtherTheWire,
+} from "@ts-drp/types";
 
 const extensionCodec = new ExtensionCodec();
 
@@ -66,3 +72,28 @@ export function serializeValue(obj: unknown): Uint8Array {
 export function deserializeValue(value: Uint8Array): unknown {
 	return decode(value, { extensionCodec });
 }
+
+export function serializeDRPState(state?: DRPState): DRPStateOtherTheWire {
+	const drpState = DRPStateOtherTheWire.create();
+	for (const e of state?.state ?? []) {
+		const entry = DRPStateEntryOtherTheWire.create({
+			key: e.key,
+			data: serializeValue(e.value),
+		});
+		drpState.state.push(entry);
+	}
+	return drpState;
+}
+
+export function deserializeDRPState(state?: DRPStateOtherTheWire): DRPState {
+	const drpState = DRPState.create();
+
+	for (const e of state?.state ?? []) {
+		const entry = DRPStateEntry.create({
+			key: e.key,
+			value: deserializeValue(e.data),
+		});
+		drpState.state.push(entry);
+	}
+	return drpState;
+}
diff --git a/packages/object/tests/actiontypes.test.ts b/packages/object/tests/actiontypes.test.ts
index 939023b35..3f5fc269f 100644
--- a/packages/object/tests/actiontypes.test.ts
+++ b/packages/object/tests/actiontypes.test.ts
@@ -1,4 +1,4 @@
-import { AddMulDRP } from "@ts-drp/blueprints/src/AddMul/index.js";
+import { AddMulDRP } from "@ts-drp/blueprints";
 import { beforeAll, beforeEach, describe, expect, test, vi } from "vitest";
 
 import { DRPObject, ObjectACL } from "../src/index.js";
diff --git a/packages/object/tests/causallyrelated.bench.ts b/packages/object/tests/causallyrelated.bench.ts
index f61fe1ff7..fb29f5166 100644
--- a/packages/object/tests/causallyrelated.bench.ts
+++ b/packages/object/tests/causallyrelated.bench.ts
@@ -1,7 +1,8 @@
-import { SetDRP } from "@ts-drp/blueprints/src/index.js";
+import { SetDRP } from "@ts-drp/blueprints";
+import { type Hash } from "@ts-drp/types";
 import { bench, describe } from "vitest";
 
-import { DRPObject, type Hash } from "../src/index.js";
+import { DRPObject } from "../src/index.js";
 
 describe("AreCausallyDependent benchmark", () => {
 	const samples = 100000;
diff --git a/packages/object/tests/drpobject.test.ts b/packages/object/tests/drpobject.test.ts
index 58d7a132a..1d8ab098e 100644
--- a/packages/object/tests/drpobject.test.ts
+++ b/packages/object/tests/drpobject.test.ts
@@ -1,8 +1,14 @@
-import { SetDRP } from "@ts-drp/blueprints/src/index.js";
-import { type Vertex, ActionType, SemanticsType } from "@ts-drp/types";
+import { SetDRP } from "@ts-drp/blueprints";
+import {
+	type IDRP,
+	type Vertex,
+	ActionType,
+	SemanticsType,
+	type ResolveConflictsType,
+} from "@ts-drp/types";
 import { beforeEach, describe, expect, it, test, vi } from "vitest";
 
-import { type DRP, DRPObject, ObjectACL, type ResolveConflictsType } from "../src/index.js";
+import { DRPObject, ObjectACL } from "../src/index.js";
 
 const acl = new ObjectACL({
 	admins: new Map([
@@ -74,7 +80,7 @@ describe("Drp Object should be able to change state value", () => {
 describe("Test for duplicate call issue", () => {
 	let counter = 0;
 
-	class CounterDRP implements DRP {
+	class CounterDRP implements IDRP {
 		semanticsType = SemanticsType.pair;
 
 		private _counter: number;
diff --git a/packages/object/tests/finality.test.ts b/packages/object/tests/finality.test.ts
index 915f00880..4fda1a24a 100644
--- a/packages/object/tests/finality.test.ts
+++ b/packages/object/tests/finality.test.ts
@@ -1,6 +1,6 @@
 import { bls } from "@chainsafe/bls/herumi";
-import { SetDRP } from "@ts-drp/blueprints/src/index.js";
-import { Keychain } from "@ts-drp/keychain/src/keychain.js";
+import { SetDRP } from "@ts-drp/blueprints";
+import { Keychain } from "@ts-drp/keychain";
 import { type Attestation, type AggregatedAttestation } from "@ts-drp/types";
 import { toString as uint8ArrayToString } from "uint8arrays";
 import { beforeEach, describe, expect, test } from "vitest";
diff --git a/packages/object/tests/hashgraph.bench.ts b/packages/object/tests/hashgraph.bench.ts
index 23a760236..aa9d2a10e 100644
--- a/packages/object/tests/hashgraph.bench.ts
+++ b/packages/object/tests/hashgraph.bench.ts
@@ -1,7 +1,8 @@
-import { MapDRP, SetDRP } from "@ts-drp/blueprints/src/index.js";
+import { MapDRP, SetDRP } from "@ts-drp/blueprints";
+import { type IDRP } from "@ts-drp/types";
 import Benchmark from "benchmark";
 
-import { type DRP, DRPObject, ObjectACL } from "../src/index.js";
+import { DRPObject, ObjectACL } from "../src/index.js";
 
 const acl = new ObjectACL({
 	admins: new Map([["peer1", { secp256k1PublicKey: "pubKey1", blsPublicKey: "pubKey1" }]]),
@@ -71,7 +72,7 @@ suite.add("Create a HashGraph with 1000 operations for set wins map", () => {
 		acl,
 		drp: new MapDRP<number, number>(),
 	});
-	const drp = object.drp as DRP as MapDRP<number, number>;
+	const drp = object.drp as IDRP as MapDRP<number, number>;
 	for (let i = 0; i < 1000; ++i) {
 		drp.set(i, i);
 	}
@@ -83,7 +84,7 @@ suite.add(`Create a HashGraph with ${NUMBER_OF_OPERATIONS} operations for set wi
 		acl,
 		drp: new MapDRP<number, number>(),
 	});
-	const drp = object.drp as DRP as MapDRP<number, number>;
+	const drp = object.drp as IDRP as MapDRP<number, number>;
 	for (let i = 0; i < NUMBER_OF_OPERATIONS; ++i) {
 		drp.set(i, i);
 	}
@@ -97,7 +98,7 @@ suite.add(
 			acl,
 			drp: new MapDRP<number, number>(),
 		});
-		const drp = object.drp as DRP as MapDRP<number, number>;
+		const drp = object.drp as IDRP as MapDRP<number, number>;
 		for (let i = 0; i < NUMBER_OF_OPERATIONS; ++i) {
 			drp.set(i, i);
 		}
@@ -115,7 +116,7 @@ suite.add(
 			acl,
 			drp: new MapDRP<number, number>(),
 		});
-		const drp = object.drp as DRP as MapDRP<number, number>;
+		const drp = object.drp as IDRP as MapDRP<number, number>;
 		for (let i = 0; i < NUMBER_OF_OPERATIONS; ++i) {
 			drp.set(i, i);
 		}
@@ -134,7 +135,7 @@ suite.add(
 			acl,
 			drp: new MapDRP<number, number>(),
 		});
-		const drp = object.drp as DRP as MapDRP<number, number>;
+		const drp = object.drp as IDRP as MapDRP<number, number>;
 		for (let i = 0; i < 250; i += 4) {
 			drp.set(i, i);
 			if (i % 2 === 0) {
@@ -179,7 +180,7 @@ suite.add(
 			acl,
 			drp: new MapDRP<number, number>(),
 		});
-		const drp1 = object1.drp as DRP as MapDRP<number, number>;
+		const drp1 = object1.drp as IDRP as MapDRP<number, number>;
 		initialize(drp1);
 
 		const object2: DRPObject = new DRPObject({
@@ -187,7 +188,7 @@ suite.add(
 			acl,
 			drp: new MapDRP<number, number>(),
 		});
-		const drp2 = object2.drp as DRP as MapDRP<number, number>;
+		const drp2 = object2.drp as IDRP as MapDRP<number, number>;
 		initialize(drp2);
 
 		object1.merge(object2.hashGraph.getAllVertices());
diff --git a/packages/object/tests/hashgraph.flamegraph.ts b/packages/object/tests/hashgraph.flamegraph.ts
index 0995469bf..2fe1735d5 100644
--- a/packages/object/tests/hashgraph.flamegraph.ts
+++ b/packages/object/tests/hashgraph.flamegraph.ts
@@ -1,4 +1,4 @@
-import { SetDRP } from "@ts-drp/blueprints/src/index.js";
+import { SetDRP } from "@ts-drp/blueprints";
 import fs from "fs";
 import * as pprof from "pprof";
 
diff --git a/packages/object/tests/hashgraph.test.ts b/packages/object/tests/hashgraph.test.ts
index f3605778e..fc65cb6e4 100644
--- a/packages/object/tests/hashgraph.test.ts
+++ b/packages/object/tests/hashgraph.test.ts
@@ -7,7 +7,7 @@ import {
 	type Hash,
 	DrpType,
 	ACLGroup,
-	type DRP,
+	type IDRP,
 } from "@ts-drp/types";
 import { beforeAll, beforeEach, describe, expect, test, vi } from "vitest";
 
@@ -884,8 +884,8 @@ describe("HashGraph for set wins map tests", () => {
 		      \
 		       -- V2:SET("key2, "value2")
 		*/
-		const drp1 = obj1.drp as DRP as MapDRP<string, string>;
-		const drp2 = obj2.drp as DRP as MapDRP<string, string>;
+		const drp1 = obj1.drp as IDRP as MapDRP<string, string>;
+		const drp2 = obj2.drp as IDRP as MapDRP<string, string>;
 		drp1.set("key1", "value1");
 		drp2.set("key2", "value2");
 		drp1.delete("key1");
@@ -906,8 +906,8 @@ describe("HashGraph for set wins map tests", () => {
 		       --- V2:SET("key1", "value1") -- V3:DELETE("key1") -- V4:SET("key2", "value2")
 		*/
 
-		const drp1 = obj1.drp as DRP as MapDRP<string, string>;
-		const drp2 = obj2.drp as DRP as MapDRP<string, string>;
+		const drp1 = obj1.drp as IDRP as MapDRP<string, string>;
+		const drp2 = obj2.drp as IDRP as MapDRP<string, string>;
 
 		drp1.set("key1", "value2"); // smaller hash
 		drp2.set("key1", "value1"); // greater hash
@@ -935,9 +935,9 @@ describe("HashGraph for set wins map tests", () => {
 		       \                                                    ----------------------------\
 		        -- V6:SET("key2", "eulav3") ---------------------------------------------------- v8:SET("key1", "value")
 		*/
-		const drp1 = obj1.drp as DRP as MapDRP<string, string>;
-		const drp2 = obj2.drp as DRP as MapDRP<string, string>;
-		const drp3 = obj3.drp as DRP as MapDRP<string, string>;
+		const drp1 = obj1.drp as IDRP as MapDRP<string, string>;
+		const drp2 = obj2.drp as IDRP as MapDRP<string, string>;
+		const drp3 = obj3.drp as IDRP as MapDRP<string, string>;
 
 		drp1.set("key1", "value1");
 		drp1.delete("key2");
@@ -985,8 +985,8 @@ describe("HashGraph for delete wins map tests", () => {
 		      \
 		       -- V2:SET("key1", "value2") -- DELETE("key1")
 		*/
-		const drp1 = obj1.drp as DRP as MapDRP<string, string>;
-		const drp2 = obj2.drp as DRP as MapDRP<string, string>;
+		const drp1 = obj1.drp as IDRP as MapDRP<string, string>;
+		const drp2 = obj2.drp as IDRP as MapDRP<string, string>;
 
 		drp1.set("key1", "value1"); // greater hash
 		drp2.set("key1", "value2"); // smaller hash
@@ -1006,8 +1006,8 @@ describe("HashGraph for delete wins map tests", () => {
 		       --V2:SET("key1", "value1") -- V4:SET("key2", "value3")
 		*/
 
-		const drp1 = obj1.drp as DRP as MapDRP<string, string>;
-		const drp2 = obj2.drp as DRP as MapDRP<string, string>;
+		const drp1 = obj1.drp as IDRP as MapDRP<string, string>;
+		const drp2 = obj2.drp as IDRP as MapDRP<string, string>;
 
 		drp1.set("key1", "value2");
 		drp2.set("key1", "value1");
@@ -1048,8 +1048,8 @@ describe("Hash validation tests", () => {
 	});
 
 	test("Should accept vertices with valid hash", () => {
-		const drp1 = obj1.drp as DRP as MapDRP<string, string>;
-		const drp2 = obj2.drp as DRP as MapDRP<string, string>;
+		const drp1 = obj1.drp as IDRP as MapDRP<string, string>;
+		const drp2 = obj2.drp as IDRP as MapDRP<string, string>;
 		drp1.set("key1", "value1");
 		drp2.set("key2", "value2");
 
diff --git a/packages/object/tests/serializer.bench.ts b/packages/object/tests/serializer.bench.ts
index c0eb514dc..52519e0dd 100644
--- a/packages/object/tests/serializer.bench.ts
+++ b/packages/object/tests/serializer.bench.ts
@@ -1,8 +1,7 @@
 /* eslint-disable @typescript-eslint/no-explicit-any */
 import Benchmark from "benchmark";
 
-import { deserializeValue } from "../dist/src/index.js";
-import { serializeValue } from "../src/utils/serializer.js";
+import { serializeValue, deserializeValue } from "../src/utils/serializer.js";
 function createNestedObject(depth: number, breadth: number): any {
 	if (depth <= 0) {
 		return {
diff --git a/packages/object/tests/utils.test.ts b/packages/object/tests/utils.test.ts
index 7b0b83fff..64becc6fd 100644
--- a/packages/object/tests/utils.test.ts
+++ b/packages/object/tests/utils.test.ts
@@ -1,10 +1,16 @@
 /* eslint-disable @typescript-eslint/no-explicit-any */
-import { SetDRP } from "@ts-drp/blueprints/src/index.js";
-import { serializeStateMessage, deserializeStateMessage } from "@ts-drp/node/src/utils.js";
+import { SetDRP } from "@ts-drp/blueprints";
 import { FetchStateResponse } from "@ts-drp/types";
 import { expect, describe, it } from "vitest";
 
-import { DRPObject, HashGraph, serializeValue, deserializeValue } from "../src/index.js";
+import {
+	DRPObject,
+	HashGraph,
+	serializeValue,
+	deserializeValue,
+	serializeDRPState,
+	deserializeDRPState,
+} from "../src/index.js";
 
 class TestCustomClass {
 	constructor(
@@ -231,13 +237,13 @@ describe("Serialize & deserialize", () => {
 		const response = FetchStateResponse.create({
 			objectId: "test",
 			vertexHash: "test",
-			aclState: serializeStateMessage(aclState),
-			drpState: serializeStateMessage(drpState),
+			aclState: serializeDRPState(aclState),
+			drpState: serializeDRPState(drpState),
 		});
 		const data = FetchStateResponse.encode(response).finish();
 		const decoded = FetchStateResponse.decode(data);
-		const aclStateDecoded = deserializeStateMessage(decoded.aclState);
-		const drpStateDecoded = deserializeStateMessage(decoded.drpState);
+		const aclStateDecoded = deserializeDRPState(decoded.aclState);
+		const drpStateDecoded = deserializeDRPState(decoded.drpState);
 		expect(aclStateDecoded).toStrictEqual(aclState);
 		expect(drpStateDecoded).toStrictEqual(drpState);
 	});
diff --git a/packages/object/tsconfig.build.json b/packages/object/tsconfig.build.json
new file mode 100644
index 000000000..f927c80c5
--- /dev/null
+++ b/packages/object/tsconfig.build.json
@@ -0,0 +1,7 @@
+{
+    "extends": "./tsconfig.json",
+    "exclude": [
+        "dist",
+        "tests/**/*.ts"
+    ]
+}
diff --git a/packages/object/tsconfig.json b/packages/object/tsconfig.json
index 48e3023fd..842881500 100644
--- a/packages/object/tsconfig.json
+++ b/packages/object/tsconfig.json
@@ -3,10 +3,12 @@
 	"compilerOptions": {
 		"outDir": "dist"
 	},
-	"references": [
-		{
-			"path": "../logger"
-		}
+	"include": [
+		"src/**/*.ts",
+		"tests/**/*.ts"
 	],
-	"include": ["src/**/*.ts"]
+	"exclude": [
+		"dist",
+		"./*.d.ts",
+	]
 }
diff --git a/packages/tracer/package.json b/packages/tracer/package.json
index e0c3fbd64..cc0ee69af 100644
--- a/packages/tracer/package.json
+++ b/packages/tracer/package.json
@@ -21,9 +21,10 @@
 		}
 	},
 	"scripts": {
-		"build": "tsc -b",
+		"build": "tsc -b tsconfig.build.json",
 		"clean": "rm -rf dist/ node_modules/",
 		"prepack": "tsc -b",
+		"typecheck": "tsc --noEmit",
 		"watch": "tsc -b -w"
 	},
 	"dependencies": {
diff --git a/packages/tracer/tsconfig.build.json b/packages/tracer/tsconfig.build.json
new file mode 100644
index 000000000..07e127d11
--- /dev/null
+++ b/packages/tracer/tsconfig.build.json
@@ -0,0 +1 @@
+{"extends": "./tsconfig.json","exclude": ["tests/**/*.ts"]}
diff --git a/packages/tracer/tsconfig.json b/packages/tracer/tsconfig.json
index 9cc8b37cd..0ca984477 100644
--- a/packages/tracer/tsconfig.json
+++ b/packages/tracer/tsconfig.json
@@ -3,5 +3,8 @@
 	"compilerOptions": {
 		"outDir": "dist"
 	},
-	"include": ["src/**/*.ts"]
+	"include": [
+		"src/**/*.ts",
+		"tests/**/*.ts"
+	]
 }
diff --git a/packages/types/package.json b/packages/types/package.json
index 6e6a312b0..a3d1db727 100644
--- a/packages/types/package.json
+++ b/packages/types/package.json
@@ -21,9 +21,10 @@
 		}
 	},
 	"scripts": {
-		"build": "tsc -b",
+		"build": "tsc -b tsconfig.build.json",
 		"clean": "rm -rf dist/ node_modules/",
 		"prepack": "tsc -b",
+		"typecheck": "tsc --noEmit",
 		"watch": "tsc -b -w"
 	},
 	"dependencies": {
diff --git a/packages/types/tsconfig.build.json b/packages/types/tsconfig.build.json
new file mode 100644
index 000000000..e23113e7f
--- /dev/null
+++ b/packages/types/tsconfig.build.json
@@ -0,0 +1,8 @@
+{
+    "extends": "./tsconfig.json",
+    "exclude": [
+        "tests/**/*.ts",
+        "test/**/*.ts",
+        "tests/**/*.js"
+    ]
+}
diff --git a/packages/types/tsconfig.json b/packages/types/tsconfig.json
index 350ad9a93..80b332a26 100644
--- a/packages/types/tsconfig.json
+++ b/packages/types/tsconfig.json
@@ -5,6 +5,8 @@
     },
     "include": [
         "src/**/*.ts",
-        "src/**/*.js"
+        "src/**/*.js",
+        "tests/**/*.ts",
+        "tests/**/*.js"
     ]
 }
diff --git a/packages/utils/package.json b/packages/utils/package.json
index ec69a48a6..96c73d606 100644
--- a/packages/utils/package.json
+++ b/packages/utils/package.json
@@ -21,12 +21,13 @@
 		}
 	},
 	"scripts": {
-		"build": "tsc -b",
+		"build": "tsc -b tsconfig.build.json",
 		"clean": "rm -rf dist/ node_modules/",
 		"cli": "tsx ./src/run.ts",
 		"prebuild": "node -p \"'export const VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts",
 		"prepack": "tsc -b",
 		"test": "vitest",
+		"typecheck": "tsc --noEmit",
 		"watch": "tsc -b -w"
 	}
 }
diff --git a/packages/utils/tsconfig.build.json b/packages/utils/tsconfig.build.json
new file mode 100644
index 000000000..07e127d11
--- /dev/null
+++ b/packages/utils/tsconfig.build.json
@@ -0,0 +1 @@
+{"extends": "./tsconfig.json","exclude": ["tests/**/*.ts"]}
diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json
index d37ac717a..0ca984477 100644
--- a/packages/utils/tsconfig.json
+++ b/packages/utils/tsconfig.json
@@ -4,6 +4,7 @@
 		"outDir": "dist"
 	},
 	"include": [
-		"src/**/*.ts"
+		"src/**/*.ts",
+		"tests/**/*.ts"
 	]
 }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index eadab3205..98adf6ddf 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -20,7 +20,7 @@ importers:
         version: 9.21.0
       '@playwright/test':
         specifier: ^1.49.1
-        version: 1.50.1
+        version: 1.51.0
       '@release-it-plugins/workspaces':
         specifier: ^4.2.0
         version: 4.2.0(release-it@17.11.0(typescript@5.8.2))
@@ -28,8 +28,8 @@ importers:
         specifier: ^8.21.0
         version: 8.26.0(eslint@9.21.0)(typescript@5.8.2)
       '@vitest/coverage-v8':
-        specifier: 3.0.5
-        version: 3.0.5(vitest@3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))
+        specifier: ^3.0.5
+        version: 3.0.8(vitest@3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))
       assemblyscript:
         specifier: ^0.27.29
         version: 0.27.34
@@ -38,7 +38,7 @@ importers:
         version: 9.21.0
       eslint-config-prettier:
         specifier: ^10.0.1
-        version: 10.0.2(eslint@9.21.0)
+        version: 10.1.0(eslint@9.21.0)
       eslint-import-resolver-typescript:
         specifier: ^3.8.3
         version: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0)
@@ -47,13 +47,13 @@ importers:
         version: 2.31.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0)
       eslint-plugin-prettier:
         specifier: ^5.2.3
-        version: 5.2.3(eslint-config-prettier@10.0.2(eslint@9.21.0))(eslint@9.21.0)(prettier@3.5.3)
+        version: 5.2.3(eslint-config-prettier@10.1.0(eslint@9.21.0))(eslint@9.21.0)(prettier@3.5.3)
       eslint-plugin-unused-imports:
         specifier: ^4.1.4
         version: 4.1.4(@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)
       eslint-plugin-vitest:
         specifier: ^0.5.4
-        version: 0.5.4(@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)(vitest@3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))
+        version: 0.5.4(@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)(vitest@3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))
       globals:
         specifier: ^16.0.0
         version: 16.0.0
@@ -80,13 +80,13 @@ importers:
         version: 8.26.0(eslint@9.21.0)(typescript@5.8.2)
       vite:
         specifier: ^6.0.9
-        version: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
+        version: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
       vite-tsconfig-paths:
         specifier: ^5.0.1
-        version: 5.1.4(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))
+        version: 5.1.4(typescript@5.8.2)(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))
       vitest:
         specifier: ^3.0.5
-        version: 3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
+        version: 3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
 
   examples/canvas:
     dependencies:
@@ -108,10 +108,10 @@ importers:
         version: 5.8.2
       vite:
         specifier: ^6.0.9
-        version: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
+        version: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
       vite-plugin-node-polyfills:
         specifier: ^0.22.0
-        version: 0.22.0(rollup@4.34.9)(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))
+        version: 0.22.0(rollup@4.34.9)(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))
 
   examples/chat:
     dependencies:
@@ -133,10 +133,10 @@ importers:
         version: 5.8.2
       vite:
         specifier: ^6.0.9
-        version: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
+        version: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
       vite-plugin-node-polyfills:
         specifier: ^0.22.0
-        version: 0.22.0(rollup@4.34.9)(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))
+        version: 0.22.0(rollup@4.34.9)(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))
 
   examples/grid:
     dependencies:
@@ -161,10 +161,10 @@ importers:
         version: 5.8.2
       vite:
         specifier: ^6.0.9
-        version: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
+        version: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
       vite-plugin-node-polyfills:
         specifier: ^0.22.0
-        version: 0.22.0(rollup@4.34.9)(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))
+        version: 0.22.0(rollup@4.34.9)(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))
 
   examples/local-bootstrap:
     dependencies:
@@ -180,19 +180,16 @@ importers:
         version: 5.8.2
       vite:
         specifier: ^6.0.9
-        version: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
+        version: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
       vite-plugin-node-polyfills:
         specifier: ^0.22.0
-        version: 0.22.0(rollup@4.34.9)(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))
+        version: 0.22.0(rollup@4.34.9)(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))
 
   packages/blueprints:
     dependencies:
       '@thi.ng/random':
         specifier: ^4.1.0
         version: 4.1.12
-      '@ts-drp/object':
-        specifier: 0.8.5
-        version: link:../object
       '@ts-drp/types':
         specifier: 0.8.5
         version: link:../types
@@ -229,9 +226,6 @@ importers:
       '@noble/secp256k1':
         specifier: ^2.2.3
         version: 2.2.3
-      '@ts-drp/object':
-        specifier: 0.8.5
-        version: link:../object
       '@ts-drp/types':
         specifier: ^0.8.5
         version: link:../types
@@ -336,6 +330,9 @@ importers:
         specifier: ^5.1.0
         version: 5.1.0
     devDependencies:
+      '@ts-drp/keychain':
+        specifier: 0.8.5
+        version: link:../keychain
       race-event:
         specifier: ^1.3.0
         version: 1.3.0
@@ -417,7 +414,7 @@ importers:
         version: 4.19.1
       vitest:
         specifier: ^3.0.5
-        version: 3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
+        version: 3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
 
   packages/object:
     dependencies:
@@ -436,9 +433,6 @@ importers:
       '@ts-drp/types':
         specifier: ^0.8.5
         version: link:../types
-      '@types/node':
-        specifier: ^22.5.4
-        version: 22.13.9
       es-toolkit:
         specifier: 1.30.1
         version: 1.30.1
@@ -458,6 +452,9 @@ importers:
       '@ts-drp/blueprints':
         specifier: ^0.8.5
         version: link:../blueprints
+      '@ts-drp/keychain':
+        specifier: ^0.8.5
+        version: link:../keychain
       '@types/benchmark':
         specifier: ^2.1.5
         version: 2.1.5
@@ -1995,8 +1992,8 @@ packages:
     resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
     engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
 
-  '@playwright/test@1.50.1':
-    resolution: {integrity: sha512-Jii3aBg+CEDpgnuDxEp/h7BimHcUTDlpEtce89xEumlJ5ef2hqepZ+PWp1DDpYC/VO9fmWVI1IlEaoI5fK9FXQ==}
+  '@playwright/test@1.51.0':
+    resolution: {integrity: sha512-dJ0dMbZeHhI+wb77+ljx/FeC8VBP6j/rj9OAojO08JI80wTZy6vRk9KvHKiDCUh4iMpEiseMgqRBIeW+eKX6RA==}
     engines: {node: '>=18'}
     hasBin: true
 
@@ -2452,20 +2449,20 @@ packages:
   '@ungap/structured-clone@1.3.0':
     resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
 
-  '@vitest/coverage-v8@3.0.5':
-    resolution: {integrity: sha512-zOOWIsj5fHh3jjGwQg+P+J1FW3s4jBu1Zqga0qW60yutsBtqEqNEJKWYh7cYn1yGD+1bdPsPdC/eL4eVK56xMg==}
+  '@vitest/coverage-v8@3.0.8':
+    resolution: {integrity: sha512-y7SAKsQirsEJ2F8bulBck4DoluhI2EEgTimHd6EEUgJBGKy9tC25cpywh1MH4FvDGoG2Unt7+asVd1kj4qOSAw==}
     peerDependencies:
-      '@vitest/browser': 3.0.5
-      vitest: 3.0.5
+      '@vitest/browser': 3.0.8
+      vitest: 3.0.8
     peerDependenciesMeta:
       '@vitest/browser':
         optional: true
 
-  '@vitest/expect@3.0.7':
-    resolution: {integrity: sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw==}
+  '@vitest/expect@3.0.8':
+    resolution: {integrity: sha512-Xu6TTIavTvSSS6LZaA3EebWFr6tsoXPetOWNMOlc7LO88QVVBwq2oQWBoDiLCN6YTvNYsGSjqOO8CAdjom5DCQ==}
 
-  '@vitest/mocker@3.0.7':
-    resolution: {integrity: sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w==}
+  '@vitest/mocker@3.0.8':
+    resolution: {integrity: sha512-n3LjS7fcW1BCoF+zWZxG7/5XvuYH+lsFg+BDwwAz0arIwHQJFUEsKBQ0BLU49fCxuM/2HSeBPHQD8WjgrxMfow==}
     peerDependencies:
       msw: ^2.4.9
       vite: ^5.0.0 || ^6.0.0
@@ -2475,20 +2472,20 @@ packages:
       vite:
         optional: true
 
-  '@vitest/pretty-format@3.0.7':
-    resolution: {integrity: sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==}
+  '@vitest/pretty-format@3.0.8':
+    resolution: {integrity: sha512-BNqwbEyitFhzYMYHUVbIvepOyeQOSFA/NeJMIP9enMntkkxLgOcgABH6fjyXG85ipTgvero6noreavGIqfJcIg==}
 
-  '@vitest/runner@3.0.7':
-    resolution: {integrity: sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g==}
+  '@vitest/runner@3.0.8':
+    resolution: {integrity: sha512-c7UUw6gEcOzI8fih+uaAXS5DwjlBaCJUo7KJ4VvJcjL95+DSR1kova2hFuRt3w41KZEFcOEiq098KkyrjXeM5w==}
 
-  '@vitest/snapshot@3.0.7':
-    resolution: {integrity: sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA==}
+  '@vitest/snapshot@3.0.8':
+    resolution: {integrity: sha512-x8IlMGSEMugakInj44nUrLSILh/zy1f2/BgH0UeHpNyOocG18M9CWVIFBaXPt8TrqVZWmcPjwfG/ht5tnpba8A==}
 
-  '@vitest/spy@3.0.7':
-    resolution: {integrity: sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w==}
+  '@vitest/spy@3.0.8':
+    resolution: {integrity: sha512-MR+PzJa+22vFKYb934CejhR4BeRpMSoxkvNoDit68GQxRLSf11aT6CTj3XaqUU9rxgWJFnqicN/wxw6yBRkI1Q==}
 
-  '@vitest/utils@3.0.7':
-    resolution: {integrity: sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg==}
+  '@vitest/utils@3.0.8':
+    resolution: {integrity: sha512-nkBC3aEhfX2PdtQI/QwAWp8qZWwzASsU4Npbcd5RdMPBSSLCpkZp52P3xku3s3uA0HIEhGvEcF8rNkBsz9dQ4Q==}
 
   abbrev@1.1.1:
     resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
@@ -3245,8 +3242,8 @@ packages:
   ee-first@1.1.1:
     resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
 
-  electron-to-chromium@1.5.112:
-    resolution: {integrity: sha512-oen93kVyqSb3l+ziUgzIOlWt/oOuy4zRmpwestMn4rhFWAoFJeFuCVte9F2fASjeZZo7l/Cif9TiyrdW4CwEMA==}
+  electron-to-chromium@1.5.113:
+    resolution: {integrity: sha512-wjT2O4hX+wdWPJ76gWSkMhcHAV2PTMX+QetUCPYEdCIe+cxmgzzSSiGRCKW8nuh4mwKZlpv0xvoW7OF2X+wmHg==}
 
   elliptic@6.6.1:
     resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==}
@@ -3363,8 +3360,8 @@ packages:
     engines: {node: '>=6.0'}
     hasBin: true
 
-  eslint-config-prettier@10.0.2:
-    resolution: {integrity: sha512-1105/17ZIMjmCOJOPNfVdbXafLCLj3hPmkmB7dLgt7XsQ/zkxSuDerE/xgO3RxoHysR1N1whmquY0lSn2O0VLg==}
+  eslint-config-prettier@10.1.0:
+    resolution: {integrity: sha512-EZxtSSOjkmuRfrDZxcnRgLy8ea/hVGcsCj1zFIKiAZ3SJJOz0Pdusq2FFj0qJrFcpg2KzCo8j8bjInYpgMsdgA==}
     hasBin: true
     peerDependencies:
       eslint: '>=7.0.0'
@@ -5102,13 +5099,13 @@ packages:
   platform@1.3.6:
     resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==}
 
-  playwright-core@1.50.1:
-    resolution: {integrity: sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==}
+  playwright-core@1.51.0:
+    resolution: {integrity: sha512-x47yPE3Zwhlil7wlNU/iktF7t2r/URR3VLbH6EknJd/04Qc/PSJ0EY3CMXipmglLG+zyRxW6HNo2EGbKLHPWMg==}
     engines: {node: '>=18'}
     hasBin: true
 
-  playwright@1.50.1:
-    resolution: {integrity: sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==}
+  playwright@1.51.0:
+    resolution: {integrity: sha512-442pTfGM0xxfCYxuBa/Pu6B2OqxqqaYq39JS8QDMGThUvIOCd6s0ANDog3uwA0cHavVlnTQzGCN7Id2YekDSXA==}
     engines: {node: '>=18'}
     hasBin: true
 
@@ -6072,8 +6069,8 @@ packages:
   vfile@6.0.3:
     resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
 
-  vite-node@3.0.7:
-    resolution: {integrity: sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==}
+  vite-node@3.0.8:
+    resolution: {integrity: sha512-6PhR4H9VGlcwXZ+KWCdMqbtG649xCPZqfI9j2PsK1FcXgEzro5bGHcVKFCTqPLaNKZES8Evqv4LwvZARsq5qlg==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
     hasBin: true
 
@@ -6090,8 +6087,8 @@ packages:
       vite:
         optional: true
 
-  vite@6.2.0:
-    resolution: {integrity: sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==}
+  vite@6.2.1:
+    resolution: {integrity: sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
     hasBin: true
     peerDependencies:
@@ -6130,16 +6127,16 @@ packages:
       yaml:
         optional: true
 
-  vitest@3.0.7:
-    resolution: {integrity: sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==}
+  vitest@3.0.8:
+    resolution: {integrity: sha512-dfqAsNqRGUc8hB9OVR2P0w8PZPEckti2+5rdZip0WIz9WW0MnImJ8XiR61QhqLa92EQzKP2uPkzenKOAHyEIbA==}
     engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
     hasBin: true
     peerDependencies:
       '@edge-runtime/vm': '*'
       '@types/debug': ^4.1.12
       '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
-      '@vitest/browser': 3.0.7
-      '@vitest/ui': 3.0.7
+      '@vitest/browser': 3.0.8
+      '@vitest/ui': 3.0.8
       happy-dom: '*'
       jsdom: '*'
     peerDependenciesMeta:
@@ -8251,9 +8248,9 @@ snapshots:
 
   '@pkgr/core@0.1.1': {}
 
-  '@playwright/test@1.50.1':
+  '@playwright/test@1.51.0':
     dependencies:
-      playwright: 1.50.1
+      playwright: 1.51.0
 
   '@pnpm/config.env-replace@1.1.0': {}
 
@@ -8788,7 +8785,7 @@ snapshots:
 
   '@ungap/structured-clone@1.3.0': {}
 
-  '@vitest/coverage-v8@3.0.5(vitest@3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))':
+  '@vitest/coverage-v8@3.0.8(vitest@3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))':
     dependencies:
       '@ampproject/remapping': 2.3.0
       '@bcoe/v8-coverage': 1.0.2
@@ -8802,47 +8799,47 @@ snapshots:
       std-env: 3.8.1
       test-exclude: 7.0.1
       tinyrainbow: 2.0.0
-      vitest: 3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
+      vitest: 3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
     transitivePeerDependencies:
       - supports-color
 
-  '@vitest/expect@3.0.7':
+  '@vitest/expect@3.0.8':
     dependencies:
-      '@vitest/spy': 3.0.7
-      '@vitest/utils': 3.0.7
+      '@vitest/spy': 3.0.8
+      '@vitest/utils': 3.0.8
       chai: 5.2.0
       tinyrainbow: 2.0.0
 
-  '@vitest/mocker@3.0.7(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))':
+  '@vitest/mocker@3.0.8(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))':
     dependencies:
-      '@vitest/spy': 3.0.7
+      '@vitest/spy': 3.0.8
       estree-walker: 3.0.3
       magic-string: 0.30.17
     optionalDependencies:
-      vite: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
+      vite: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
 
-  '@vitest/pretty-format@3.0.7':
+  '@vitest/pretty-format@3.0.8':
     dependencies:
       tinyrainbow: 2.0.0
 
-  '@vitest/runner@3.0.7':
+  '@vitest/runner@3.0.8':
     dependencies:
-      '@vitest/utils': 3.0.7
+      '@vitest/utils': 3.0.8
       pathe: 2.0.3
 
-  '@vitest/snapshot@3.0.7':
+  '@vitest/snapshot@3.0.8':
     dependencies:
-      '@vitest/pretty-format': 3.0.7
+      '@vitest/pretty-format': 3.0.8
       magic-string: 0.30.17
       pathe: 2.0.3
 
-  '@vitest/spy@3.0.7':
+  '@vitest/spy@3.0.8':
     dependencies:
       tinyspy: 3.0.2
 
-  '@vitest/utils@3.0.7':
+  '@vitest/utils@3.0.8':
     dependencies:
-      '@vitest/pretty-format': 3.0.7
+      '@vitest/pretty-format': 3.0.8
       loupe: 3.1.3
       tinyrainbow: 2.0.0
 
@@ -9237,7 +9234,7 @@ snapshots:
   browserslist@4.24.4:
     dependencies:
       caniuse-lite: 1.0.30001702
-      electron-to-chromium: 1.5.112
+      electron-to-chromium: 1.5.113
       node-releases: 2.0.19
       update-browserslist-db: 1.1.3(browserslist@4.24.4)
 
@@ -9680,7 +9677,7 @@ snapshots:
 
   ee-first@1.1.1: {}
 
-  electron-to-chromium@1.5.112: {}
+  electron-to-chromium@1.5.113: {}
 
   elliptic@6.6.1:
     dependencies:
@@ -9883,7 +9880,7 @@ snapshots:
     optionalDependencies:
       source-map: 0.6.1
 
-  eslint-config-prettier@10.0.2(eslint@9.21.0):
+  eslint-config-prettier@10.1.0(eslint@9.21.0):
     dependencies:
       eslint: 9.21.0
 
@@ -9950,14 +9947,14 @@ snapshots:
       - eslint-import-resolver-webpack
       - supports-color
 
-  eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.0.2(eslint@9.21.0))(eslint@9.21.0)(prettier@3.5.3):
+  eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.1.0(eslint@9.21.0))(eslint@9.21.0)(prettier@3.5.3):
     dependencies:
       eslint: 9.21.0
       prettier: 3.5.3
       prettier-linter-helpers: 1.0.0
       synckit: 0.9.2
     optionalDependencies:
-      eslint-config-prettier: 10.0.2(eslint@9.21.0)
+      eslint-config-prettier: 10.1.0(eslint@9.21.0)
 
   eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0):
     dependencies:
@@ -9965,13 +9962,13 @@ snapshots:
     optionalDependencies:
       '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)
 
-  eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)(vitest@3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)):
+  eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)(vitest@3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)):
     dependencies:
       '@typescript-eslint/utils': 7.18.0(eslint@9.21.0)(typescript@5.8.2)
       eslint: 9.21.0
     optionalDependencies:
       '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)
-      vitest: 3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
+      vitest: 3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
     transitivePeerDependencies:
       - supports-color
       - typescript
@@ -11902,11 +11899,11 @@ snapshots:
 
   platform@1.3.6: {}
 
-  playwright-core@1.50.1: {}
+  playwright-core@1.51.0: {}
 
-  playwright@1.50.1:
+  playwright@1.51.0:
     dependencies:
-      playwright-core: 1.50.1
+      playwright-core: 1.51.0
     optionalDependencies:
       fsevents: 2.3.2
 
@@ -13080,13 +13077,13 @@ snapshots:
       '@types/unist': 3.0.3
       vfile-message: 4.0.2
 
-  vite-node@3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0):
+  vite-node@3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0):
     dependencies:
       cac: 6.7.14
       debug: 4.4.0
       es-module-lexer: 1.6.0
       pathe: 2.0.3
-      vite: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
+      vite: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
     transitivePeerDependencies:
       - '@types/node'
       - jiti
@@ -13101,26 +13098,26 @@ snapshots:
       - tsx
       - yaml
 
-  vite-plugin-node-polyfills@0.22.0(rollup@4.34.9)(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)):
+  vite-plugin-node-polyfills@0.22.0(rollup@4.34.9)(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)):
     dependencies:
       '@rollup/plugin-inject': 5.0.5(rollup@4.34.9)
       node-stdlib-browser: 1.3.1
-      vite: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
+      vite: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
     transitivePeerDependencies:
       - rollup
 
-  vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)):
+  vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)):
     dependencies:
       debug: 4.4.0
       globrex: 0.1.2
       tsconfck: 3.1.5(typescript@5.8.2)
     optionalDependencies:
-      vite: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
+      vite: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
     transitivePeerDependencies:
       - supports-color
       - typescript
 
-  vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0):
+  vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0):
     dependencies:
       esbuild: 0.25.0
       postcss: 8.5.3
@@ -13132,15 +13129,15 @@ snapshots:
       tsx: 4.19.1
       yaml: 2.7.0
 
-  vitest@3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0):
+  vitest@3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0):
     dependencies:
-      '@vitest/expect': 3.0.7
-      '@vitest/mocker': 3.0.7(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))
-      '@vitest/pretty-format': 3.0.7
-      '@vitest/runner': 3.0.7
-      '@vitest/snapshot': 3.0.7
-      '@vitest/spy': 3.0.7
-      '@vitest/utils': 3.0.7
+      '@vitest/expect': 3.0.8
+      '@vitest/mocker': 3.0.8(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))
+      '@vitest/pretty-format': 3.0.8
+      '@vitest/runner': 3.0.8
+      '@vitest/snapshot': 3.0.8
+      '@vitest/spy': 3.0.8
+      '@vitest/utils': 3.0.8
       chai: 5.2.0
       debug: 4.4.0
       expect-type: 1.2.0
@@ -13151,8 +13148,8 @@ snapshots:
       tinyexec: 0.3.2
       tinypool: 1.0.2
       tinyrainbow: 2.0.0
-      vite: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
-      vite-node: 3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
+      vite: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
+      vite-node: 3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)
       why-is-node-running: 2.3.0
     optionalDependencies:
       '@types/node': 22.13.9