@agentplat/mesh-sim-postgres 0.3.0-beta.4

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.
@@ -0,0 +1,33 @@
1
+ import { type ScalableEvaluationCheckpointStoreCasReceiptV1, type ScalableEvaluationDurableCheckpointStoreV1, type ScalableEvaluationRunnerCheckpointV1 } from '@agentplat/mesh-sim';
2
+ import type { Pool } from 'pg';
3
+ export declare const DEFAULT_POSTGRES_SCALABLE_EVALUATION_CHECKPOINT_BYTES_V1: number;
4
+ export declare const MAXIMUM_POSTGRES_SCALABLE_EVALUATION_CHECKPOINT_BYTES_V1: number;
5
+ export interface PostgresScalableEvaluationCheckpointStoreOptionsV1 {
6
+ readonly schema?: string;
7
+ /** Shared-table isolation boundary; values are always SQL parameters. */
8
+ readonly namespace: string;
9
+ readonly maximumCheckpointBytes?: number;
10
+ }
11
+ /**
12
+ * Restart-durable PostgreSQL head store for scalable evaluation runners.
13
+ * CAS is serialized by namespace/run advisory lock and row lock. The caller
14
+ * owns the pool and applies this package's migrations.
15
+ */
16
+ export declare class PostgresScalableEvaluationCheckpointStoreV1 implements ScalableEvaluationDurableCheckpointStoreV1 {
17
+ #private;
18
+ readonly pool: Pool;
19
+ readonly restartDurabilityV1: import("@agentplat/mesh-sim").ScalableEvaluationRestartDurabilityDeclarationV1;
20
+ constructor(pool: Pool, options: PostgresScalableEvaluationCheckpointStoreOptionsV1);
21
+ loadV1(input: {
22
+ readonly runId: string;
23
+ }): Promise<ScalableEvaluationRunnerCheckpointV1 | null>;
24
+ compareAndSwapV1(input: {
25
+ readonly runId: string;
26
+ readonly expectedRevision: number | null;
27
+ readonly checkpoint: ScalableEvaluationRunnerCheckpointV1;
28
+ }): Promise<ScalableEvaluationCheckpointStoreCasReceiptV1>;
29
+ private validateStoredRow;
30
+ private query;
31
+ private transaction;
32
+ }
33
+ //# sourceMappingURL=scalable-evaluation-checkpoint-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scalable-evaluation-checkpoint-store.d.ts","sourceRoot":"","sources":["../src/scalable-evaluation-checkpoint-store.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,6CAA6C,EAClD,KAAK,0CAA0C,EAC/C,KAAK,oCAAoC,EAC1C,MAAM,qBAAqB,CAAC;AAM7B,OAAO,KAAK,EAAE,IAAI,EAA8B,MAAM,IAAI,CAAC;AAE3D,eAAO,MAAM,wDAAwD,QACnD,CAAC;AACnB,eAAO,MAAM,wDAAwD,QACnD,CAAC;AAEnB,MAAM,WAAW,kDAAkD;IACjE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,yEAAyE;IACzE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAC1C;AAKD;;;;GAIG;AACH,qBAAa,2CACX,YAAW,0CAA0C;;IAQnD,QAAQ,CAAC,IAAI,EAAE,IAAI;IANrB,QAAQ,CAAC,mBAAmB,iFAAC;gBAMlB,IAAI,EAAE,IAAI,EACnB,OAAO,EAAE,kDAAkD;IAuBvD,MAAM,CAAC,KAAK,EAAE;QAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,oCAAoC,GAAG,IAAI,CAAC;IAelD,gBAAgB,CAAC,KAAK,EAAE;QAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QACzC,QAAQ,CAAC,UAAU,EAAE,oCAAoC,CAAC;KAC3D,GAAG,OAAO,CAAC,6CAA6C,CAAC;IA4F1D,OAAO,CAAC,iBAAiB;IAyCzB,OAAO,CAAC,KAAK;YAQC,WAAW;CAgB1B"}
@@ -0,0 +1,242 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { canonicalizePlanningJsonV1 } from '@agentplat/collective-planning';
3
+ import { createScalableEvaluationRestartDurabilityDeclarationV1, scalableEvaluationDigestV1, validateScalableEvaluationRunnerCheckpointV1, } from '@agentplat/mesh-sim';
4
+ import { defaultPostgresSchema, normalizePostgresIdentifier, quotePostgresIdentifier, } from '@agentplat/postgres';
5
+ export const DEFAULT_POSTGRES_SCALABLE_EVALUATION_CHECKPOINT_BYTES_V1 = 16 * 1024 * 1024;
6
+ export const MAXIMUM_POSTGRES_SCALABLE_EVALUATION_CHECKPOINT_BYTES_V1 = 64 * 1024 * 1024;
7
+ /**
8
+ * Restart-durable PostgreSQL head store for scalable evaluation runners.
9
+ * CAS is serialized by namespace/run advisory lock and row lock. The caller
10
+ * owns the pool and applies this package's migrations.
11
+ */
12
+ export class PostgresScalableEvaluationCheckpointStoreV1 {
13
+ pool;
14
+ restartDurabilityV1;
15
+ #prefix;
16
+ #namespace;
17
+ #maximumCheckpointBytes;
18
+ constructor(pool, options) {
19
+ this.pool = pool;
20
+ if (!pool || typeof pool.connect !== 'function')
21
+ throw new TypeError('PostgreSQL pool is required');
22
+ if (!options || typeof options !== 'object')
23
+ throw new TypeError('checkpoint store options are required');
24
+ this.#namespace = token(options.namespace, 'namespace', 128);
25
+ const schema = normalizePostgresIdentifier(options.schema ?? defaultPostgresSchema, 'schema');
26
+ this.#prefix = `${quotePostgresIdentifier(schema)}.`;
27
+ this.#maximumCheckpointBytes = checkpointLimit(options.maximumCheckpointBytes);
28
+ this.restartDurabilityV1 =
29
+ createScalableEvaluationRestartDurabilityDeclarationV1({
30
+ providerId: 'agentplat.mesh-sim-postgres.scalable-evaluation.v1',
31
+ continuityId: `postgres:${schema}:${this.#namespace}`,
32
+ maximumCheckpointBytes: this.#maximumCheckpointBytes,
33
+ });
34
+ }
35
+ async loadV1(input) {
36
+ const runId = token(input?.runId, 'runId', 256);
37
+ const result = await this.query(`SELECT run_id, revision, checkpoint_digest, previous_checkpoint_digest,
38
+ definition_digest, adapter_descriptor_digest, schedule_digest,
39
+ ports_digest, configuration_digest, checkpoint,
40
+ checkpoint_sha256, checkpoint_bytes
41
+ FROM ${this.#prefix}mesh_sim_scalable_evaluation_checkpoints
42
+ WHERE namespace=$1 AND run_id=$2`, [this.#namespace, runId]);
43
+ if (result.rowCount === 0)
44
+ return null;
45
+ return this.validateStoredRow(result.rows[0], runId).checkpoint;
46
+ }
47
+ async compareAndSwapV1(input) {
48
+ const runId = token(input?.runId, 'runId', 256);
49
+ const expectedRevision = optionalRevision(input?.expectedRevision);
50
+ const checkpoint = validateScalableEvaluationRunnerCheckpointV1(input?.checkpoint);
51
+ if (checkpoint.runId !== runId)
52
+ throw new TypeError('checkpoint run identity conflict');
53
+ const bytes = checkpointBytes(checkpoint, this.#maximumCheckpointBytes);
54
+ const contentHash = sha256(bytes);
55
+ return this.transaction(async (db) => {
56
+ await this.query(`SELECT pg_advisory_xact_lock(hashtextextended($1, 0))`, [`${this.#namespace}\u001fscalable-evaluation\u001f${runId}`], db);
57
+ const current = await this.query(`SELECT run_id, revision, checkpoint_digest, previous_checkpoint_digest,
58
+ definition_digest, adapter_descriptor_digest, schedule_digest,
59
+ ports_digest, configuration_digest, checkpoint,
60
+ checkpoint_sha256, checkpoint_bytes
61
+ FROM ${this.#prefix}mesh_sim_scalable_evaluation_checkpoints
62
+ WHERE namespace=$1 AND run_id=$2
63
+ FOR UPDATE`, [this.#namespace, runId], db);
64
+ if (current.rowCount === 0) {
65
+ if (expectedRevision !== null ||
66
+ checkpoint.revision !== 1 ||
67
+ checkpoint.previousCheckpointDigest !== null)
68
+ return casReceipt(checkpoint, 'conflict', null);
69
+ await this.query(`INSERT INTO ${this.#prefix}mesh_sim_scalable_evaluation_checkpoints
70
+ (namespace, run_id, revision, checkpoint_digest,
71
+ previous_checkpoint_digest, definition_digest,
72
+ adapter_descriptor_digest, schedule_digest, ports_digest,
73
+ configuration_digest, checkpoint, checkpoint_sha256,
74
+ checkpoint_bytes)
75
+ VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11::jsonb,$12,$13)`, rowValues(this.#namespace, runId, checkpoint, bytes, contentHash), db);
76
+ return casReceipt(checkpoint, 'stored', checkpoint.revision);
77
+ }
78
+ const stored = this.validateStoredRow(current.rows[0], runId);
79
+ const intendedPredecessorRevision = checkpoint.revision === 1 ? null : checkpoint.revision - 1;
80
+ if (equal(stored.bytes, bytes) &&
81
+ stored.checkpoint.checkpointDigest === checkpoint.checkpointDigest)
82
+ return casReceipt(checkpoint, expectedRevision === intendedPredecessorRevision
83
+ ? 'duplicate'
84
+ : 'conflict', stored.checkpoint.revision);
85
+ if (expectedRevision !== stored.checkpoint.revision ||
86
+ checkpoint.revision !== stored.checkpoint.revision + 1 ||
87
+ checkpoint.previousCheckpointDigest !==
88
+ stored.checkpoint.checkpointDigest ||
89
+ !sameConfiguration(stored.checkpoint, checkpoint))
90
+ return casReceipt(checkpoint, 'conflict', stored.checkpoint.revision);
91
+ await this.query(`UPDATE ${this.#prefix}mesh_sim_scalable_evaluation_checkpoints
92
+ SET revision=$3, checkpoint_digest=$4,
93
+ previous_checkpoint_digest=$5, definition_digest=$6,
94
+ adapter_descriptor_digest=$7, schedule_digest=$8,
95
+ ports_digest=$9, configuration_digest=$10,
96
+ checkpoint=$11::jsonb, checkpoint_sha256=$12,
97
+ checkpoint_bytes=$13, updated_at=transaction_timestamp()
98
+ WHERE namespace=$1 AND run_id=$2`, rowValues(this.#namespace, runId, checkpoint, bytes, contentHash), db);
99
+ return casReceipt(checkpoint, 'stored', checkpoint.revision);
100
+ });
101
+ }
102
+ validateStoredRow(row, runId) {
103
+ const bytes = checkpointBytes(row.checkpoint, this.#maximumCheckpointBytes);
104
+ const recordedBytes = storedInteger(row.checkpoint_bytes, 'checkpoint byte length');
105
+ if (recordedBytes !== bytes.byteLength ||
106
+ String(row.checkpoint_sha256) !== sha256(bytes))
107
+ throw new TypeError('checkpoint content hash mismatch');
108
+ const checkpoint = validateScalableEvaluationRunnerCheckpointV1(JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes)));
109
+ if (String(row.run_id) !== runId ||
110
+ storedInteger(row.revision, 'checkpoint revision') !==
111
+ checkpoint.revision ||
112
+ String(row.checkpoint_digest) !== checkpoint.checkpointDigest ||
113
+ nullableString(row.previous_checkpoint_digest) !==
114
+ checkpoint.previousCheckpointDigest ||
115
+ String(row.definition_digest) !== checkpoint.definitionDigest ||
116
+ String(row.adapter_descriptor_digest) !==
117
+ checkpoint.adapterDescriptorDigest ||
118
+ String(row.schedule_digest) !== checkpoint.scheduleDigest ||
119
+ String(row.ports_digest) !== checkpoint.portsDigest ||
120
+ String(row.configuration_digest) !== checkpoint.configurationDigest)
121
+ throw new TypeError('checkpoint column binding mismatch');
122
+ return Object.freeze({ checkpoint, bytes });
123
+ }
124
+ query(text, values, db = this.pool) {
125
+ return db.query(text, values);
126
+ }
127
+ async transaction(work) {
128
+ const client = await this.pool.connect();
129
+ try {
130
+ await client.query('BEGIN');
131
+ const value = await work(client);
132
+ await client.query('COMMIT');
133
+ return value;
134
+ }
135
+ catch (error) {
136
+ await client.query('ROLLBACK').catch(() => undefined);
137
+ throw error;
138
+ }
139
+ finally {
140
+ client.release();
141
+ }
142
+ }
143
+ }
144
+ function checkpointLimit(value) {
145
+ const selected = value ?? DEFAULT_POSTGRES_SCALABLE_EVALUATION_CHECKPOINT_BYTES_V1;
146
+ if (!Number.isSafeInteger(selected) ||
147
+ selected < 1 ||
148
+ selected > MAXIMUM_POSTGRES_SCALABLE_EVALUATION_CHECKPOINT_BYTES_V1)
149
+ throw new RangeError('maximumCheckpointBytes is invalid');
150
+ return selected;
151
+ }
152
+ function checkpointBytes(value, maximum) {
153
+ let canonical;
154
+ try {
155
+ canonical = canonicalizePlanningJsonV1(value, {
156
+ maximumBytes: maximum,
157
+ maximumDepth: 64,
158
+ maximumNodes: 2_000_000,
159
+ maximumKeysPerObject: 4_096,
160
+ maximumItemsPerArray: 262_144,
161
+ });
162
+ }
163
+ catch (error) {
164
+ throw new RangeError('checkpoint exceeds configured limits', {
165
+ cause: error,
166
+ });
167
+ }
168
+ const bytes = new TextEncoder().encode(canonical);
169
+ if (bytes.byteLength < 1 || bytes.byteLength > maximum)
170
+ throw new RangeError('checkpoint exceeds configured byte limit');
171
+ return bytes;
172
+ }
173
+ function rowValues(namespace, runId, checkpoint, bytes, contentHash) {
174
+ return [
175
+ namespace,
176
+ runId,
177
+ checkpoint.revision,
178
+ checkpoint.checkpointDigest,
179
+ checkpoint.previousCheckpointDigest,
180
+ checkpoint.definitionDigest,
181
+ checkpoint.adapterDescriptorDigest,
182
+ checkpoint.scheduleDigest,
183
+ checkpoint.portsDigest,
184
+ checkpoint.configurationDigest,
185
+ new TextDecoder().decode(bytes),
186
+ contentHash,
187
+ bytes.byteLength,
188
+ ];
189
+ }
190
+ function sameConfiguration(left, right) {
191
+ return (left.definitionDigest === right.definitionDigest &&
192
+ left.adapterDescriptorDigest === right.adapterDescriptorDigest &&
193
+ left.scheduleDigest === right.scheduleDigest &&
194
+ left.portsDigest === right.portsDigest &&
195
+ left.configurationDigest === right.configurationDigest);
196
+ }
197
+ function casReceipt(checkpoint, status, currentRevision) {
198
+ const body = {
199
+ schemaVersion: 1,
200
+ runId: checkpoint.runId,
201
+ revision: checkpoint.revision,
202
+ checkpointDigest: checkpoint.checkpointDigest,
203
+ status,
204
+ currentRevision,
205
+ };
206
+ return Object.freeze({
207
+ ...body,
208
+ receiptDigest: scalableEvaluationDigestV1('checkpoint-store-cas-receipt', body),
209
+ });
210
+ }
211
+ function optionalRevision(value) {
212
+ if (value === null)
213
+ return null;
214
+ if (!Number.isSafeInteger(value) || value < 1)
215
+ throw new TypeError('expectedRevision is invalid');
216
+ return value;
217
+ }
218
+ function storedInteger(value, label) {
219
+ const parsed = Number(value);
220
+ if (!Number.isSafeInteger(parsed) || parsed < 1)
221
+ throw new TypeError(`${label} is invalid`);
222
+ return parsed;
223
+ }
224
+ function nullableString(value) {
225
+ return value === null || value === undefined ? null : String(value);
226
+ }
227
+ function token(value, label, maximum) {
228
+ if (typeof value !== 'string' ||
229
+ value.length === 0 ||
230
+ value.length > maximum ||
231
+ !/^[A-Za-z0-9][A-Za-z0-9._:@/-]*$/u.test(value))
232
+ throw new TypeError(`${label} is invalid`);
233
+ return value;
234
+ }
235
+ function sha256(bytes) {
236
+ return createHash('sha256').update(bytes).digest('hex');
237
+ }
238
+ function equal(left, right) {
239
+ return (left.byteLength === right.byteLength &&
240
+ left.every((value, index) => value === right[index]));
241
+ }
242
+ //# sourceMappingURL=scalable-evaluation-checkpoint-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scalable-evaluation-checkpoint-store.js","sourceRoot":"","sources":["../src/scalable-evaluation-checkpoint-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ DROP TABLE IF EXISTS __AGENTPLAT_SCHEMA__.mesh_sim_slot_commits;
2
+ DROP TABLE IF EXISTS __AGENTPLAT_SCHEMA__.mesh_sim_execution_states;
3
+ DROP TABLE IF EXISTS __AGENTPLAT_SCHEMA__.mesh_sim_artifact_bindings;
4
+ DROP TABLE IF EXISTS __AGENTPLAT_SCHEMA__.mesh_sim_artifact_blobs;
@@ -0,0 +1,45 @@
1
+ CREATE TABLE __AGENTPLAT_SCHEMA__.mesh_sim_artifact_blobs (
2
+ namespace text NOT NULL,
3
+ content_sha256 text NOT NULL CHECK (content_sha256 ~ '^[a-f0-9]{64}$'),
4
+ bytes bytea NOT NULL,
5
+ created_at timestamptz NOT NULL DEFAULT transaction_timestamp(),
6
+ PRIMARY KEY (namespace, content_sha256)
7
+ );
8
+ CREATE TABLE __AGENTPLAT_SCHEMA__.mesh_sim_artifact_bindings (
9
+ namespace text NOT NULL,
10
+ artifact_id text NOT NULL,
11
+ content_sha256 text NOT NULL CHECK (content_sha256 ~ '^[a-f0-9]{64}$'),
12
+ binding bytea NOT NULL,
13
+ binding_sha256 text NOT NULL CHECK (binding_sha256 ~ '^[a-f0-9]{64}$'),
14
+ operation_expires_at_ms bigint CHECK (operation_expires_at_ms >= 0),
15
+ created_at timestamptz NOT NULL DEFAULT transaction_timestamp(),
16
+ PRIMARY KEY (namespace, artifact_id),
17
+ FOREIGN KEY (namespace, content_sha256) REFERENCES __AGENTPLAT_SCHEMA__.mesh_sim_artifact_blobs(namespace, content_sha256)
18
+ );
19
+ CREATE TABLE __AGENTPLAT_SCHEMA__.mesh_sim_execution_states (
20
+ namespace text NOT NULL,
21
+ execution_id text NOT NULL,
22
+ registration_digest text NOT NULL,
23
+ execution_digest text NOT NULL,
24
+ state jsonb NOT NULL CHECK (jsonb_typeof(state) = 'object'),
25
+ state_sha256 text NOT NULL CHECK (state_sha256 ~ '^[a-f0-9]{64}$'),
26
+ updated_at timestamptz NOT NULL DEFAULT transaction_timestamp(),
27
+ PRIMARY KEY (namespace, execution_id)
28
+ );
29
+ CREATE TABLE __AGENTPLAT_SCHEMA__.mesh_sim_slot_commits (
30
+ namespace text NOT NULL,
31
+ run_key text NOT NULL,
32
+ execution_id text NOT NULL,
33
+ registration_digest text NOT NULL CHECK (registration_digest ~ '^sha256:[a-f0-9]{64}$'),
34
+ cell_id text NOT NULL,
35
+ fence_worker_id text NOT NULL,
36
+ fence_lease_token text NOT NULL,
37
+ fence_generation bigint NOT NULL CHECK (fence_generation > 0),
38
+ fence_expires_at_ms bigint NOT NULL CHECK (fence_expires_at_ms >= 0),
39
+ operation_expires_at_ms bigint CHECK (operation_expires_at_ms >= 0),
40
+ execution jsonb NOT NULL CHECK (jsonb_typeof(execution) = 'object'),
41
+ execution_sha256 text NOT NULL CHECK (execution_sha256 ~ '^[a-f0-9]{64}$'),
42
+ committed_at timestamptz NOT NULL DEFAULT transaction_timestamp(),
43
+ PRIMARY KEY (namespace, run_key),
44
+ FOREIGN KEY (namespace, execution_id) REFERENCES __AGENTPLAT_SCHEMA__.mesh_sim_execution_states(namespace, execution_id)
45
+ );
@@ -0,0 +1 @@
1
+ DROP TABLE IF EXISTS __AGENTPLAT_SCHEMA__.mesh_sim_scalable_evaluation_checkpoints;
@@ -0,0 +1,22 @@
1
+ CREATE TABLE __AGENTPLAT_SCHEMA__.mesh_sim_scalable_evaluation_checkpoints (
2
+ namespace text NOT NULL CHECK (char_length(namespace) BETWEEN 1 AND 128),
3
+ run_id text NOT NULL CHECK (char_length(run_id) BETWEEN 1 AND 256),
4
+ revision bigint NOT NULL CHECK (revision > 0),
5
+ checkpoint_digest text NOT NULL CHECK (checkpoint_digest ~ '^sha256:[a-f0-9]{64}$'),
6
+ previous_checkpoint_digest text CHECK (previous_checkpoint_digest ~ '^sha256:[a-f0-9]{64}$'),
7
+ definition_digest text NOT NULL CHECK (definition_digest ~ '^sha256:[a-f0-9]{64}$'),
8
+ adapter_descriptor_digest text NOT NULL CHECK (adapter_descriptor_digest ~ '^sha256:[a-f0-9]{64}$'),
9
+ schedule_digest text NOT NULL CHECK (schedule_digest ~ '^sha256:[a-f0-9]{64}$'),
10
+ ports_digest text NOT NULL CHECK (ports_digest ~ '^sha256:[a-f0-9]{64}$'),
11
+ configuration_digest text NOT NULL CHECK (configuration_digest ~ '^sha256:[a-f0-9]{64}$'),
12
+ checkpoint jsonb NOT NULL CHECK (jsonb_typeof(checkpoint) = 'object'),
13
+ checkpoint_sha256 text NOT NULL CHECK (checkpoint_sha256 ~ '^[a-f0-9]{64}$'),
14
+ checkpoint_bytes integer NOT NULL CHECK (checkpoint_bytes BETWEEN 1 AND 67108864),
15
+ created_at timestamptz NOT NULL DEFAULT transaction_timestamp(),
16
+ updated_at timestamptz NOT NULL DEFAULT transaction_timestamp(),
17
+ CHECK (
18
+ (revision = 1 AND previous_checkpoint_digest IS NULL) OR
19
+ (revision > 1 AND previous_checkpoint_digest IS NOT NULL)
20
+ ),
21
+ PRIMARY KEY (namespace, run_id)
22
+ );
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@agentplat/mesh-sim-postgres",
3
+ "version": "0.3.0-beta.4",
4
+ "description": "PostgreSQL campaign custody, fenced execution, and restart-durable scalable evaluation checkpoints for AgentPlat Mesh simulation.",
5
+ "type": "module",
6
+ "license": "Apache-2.0",
7
+ "sideEffects": false,
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "migrations",
19
+ "README.md"
20
+ ],
21
+ "dependencies": {
22
+ "@types/node": "^20.10.0",
23
+ "@types/pg": "^8.11.10",
24
+ "pg": "^8.13.1",
25
+ "@agentplat/mesh-sim": "^0.3.0-beta.4",
26
+ "@agentplat/postgres": "^0.3.0-beta.4",
27
+ "@agentplat/collective-planning": "^0.3.0-beta.4"
28
+ },
29
+ "engines": {
30
+ "node": ">=20.19.3"
31
+ },
32
+ "publishConfig": {
33
+ "access": "public"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/Agentplat/agentplat.git",
38
+ "directory": "packages/mesh-sim-postgres"
39
+ },
40
+ "scripts": {
41
+ "build": "tsc -p tsconfig.json",
42
+ "type-check": "tsc -p tsconfig.json --noEmit",
43
+ "test": "pnpm run build && node --test tests/*.test.mjs",
44
+ "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\""
45
+ }
46
+ }