@mastra/pg 1.27.0-alpha.1 → 1.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/docs/SKILL.md +1 -1
  2. package/dist/docs/assets/SOURCE_MAP.json +1 -1
  3. package/dist/index.cjs +234 -195
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.js +234 -195
  6. package/dist/index.js.map +1 -1
  7. package/dist/storage/db/index.d.ts.map +1 -1
  8. package/dist/storage/db/sanitize-json.d.ts +2 -10
  9. package/dist/storage/db/sanitize-json.d.ts.map +1 -1
  10. package/dist/storage/domains/agents/index.d.ts.map +1 -1
  11. package/dist/storage/domains/background-tasks/index.d.ts.map +1 -1
  12. package/dist/storage/domains/channels/index.d.ts.map +1 -1
  13. package/dist/storage/domains/datasets/index.d.ts.map +1 -1
  14. package/dist/storage/domains/experiments/index.d.ts.map +1 -1
  15. package/dist/storage/domains/knowledge/index.d.ts.map +1 -1
  16. package/dist/storage/domains/mcp-clients/index.d.ts.map +1 -1
  17. package/dist/storage/domains/mcp-servers/index.d.ts.map +1 -1
  18. package/dist/storage/domains/memory/index.d.ts.map +1 -1
  19. package/dist/storage/domains/notifications/index.d.ts.map +1 -1
  20. package/dist/storage/domains/observability/index.d.ts.map +1 -1
  21. package/dist/storage/domains/observability/v-next/discovery.d.ts.map +1 -1
  22. package/dist/storage/domains/observability/v-next/index.d.ts +1 -1
  23. package/dist/storage/domains/observability/v-next/index.d.ts.map +1 -1
  24. package/dist/storage/domains/observability/v-next/metrics.d.ts.map +1 -1
  25. package/dist/storage/domains/observability/v-next/scores.d.ts.map +1 -1
  26. package/dist/storage/domains/observability/v-next/trace-query.d.ts.map +1 -1
  27. package/dist/storage/domains/observability/v-next/traces.d.ts.map +1 -1
  28. package/dist/storage/domains/prompt-blocks/index.d.ts.map +1 -1
  29. package/dist/storage/domains/schedules/index.d.ts.map +1 -1
  30. package/dist/storage/domains/scorer-definitions/index.d.ts.map +1 -1
  31. package/dist/storage/domains/scores/index.d.ts.map +1 -1
  32. package/dist/storage/domains/skills/index.d.ts.map +1 -1
  33. package/dist/storage/domains/thread-state/index.d.ts.map +1 -1
  34. package/dist/storage/domains/workflows/index.d.ts +0 -2
  35. package/dist/storage/domains/workflows/index.d.ts.map +1 -1
  36. package/dist/storage/domains/workspaces/index.d.ts.map +1 -1
  37. package/dist/storage/factory-storage.d.ts.map +1 -1
  38. package/package.json +5 -5
package/dist/index.js CHANGED
@@ -15,6 +15,7 @@ import { MessageList } from "@mastra/core/agent";
15
15
  import { coreFeatures } from "@mastra/core/features";
16
16
  import { saveScorePayloadSchema } from "@mastra/core/evals";
17
17
  import { skillSnapshotFieldValuesEqual } from "@mastra/core/storage/domains/skills";
18
+ import { isDeepStrictEqual } from "util";
18
19
  //#region src/shared/config.ts
19
20
  /**
20
21
  * Type guard for pre-configured pg.Pool config
@@ -2408,6 +2409,29 @@ function isDuplicateSchemaError(error) {
2408
2409
  return /schema .* already exists/i.test(message);
2409
2410
  }
2410
2411
  //#endregion
2412
+ //#region src/storage/db/sanitize-json.ts
2413
+ const repair = (value) => value.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g, "�").replaceAll("\0", "");
2414
+ function repairJson(value) {
2415
+ if (typeof value === "string") return repair(value);
2416
+ if (Array.isArray(value)) return value.map(repairJson);
2417
+ if (value && typeof value === "object") {
2418
+ const repaired = Object.create(null);
2419
+ for (const [key, entry] of Object.entries(value)) {
2420
+ const repairedKey = repair(key);
2421
+ if (Object.hasOwn(repaired, repairedKey)) throw new Error(`JSON keys collide after PostgreSQL normalization: ${repairedKey}`);
2422
+ repaired[repairedKey] = repairJson(entry);
2423
+ }
2424
+ return repaired;
2425
+ }
2426
+ return value;
2427
+ }
2428
+ /** Serialize JSON values without emitting Unicode sequences PostgreSQL rejects. */
2429
+ function toPgJson(value) {
2430
+ const json = JSON.stringify(value);
2431
+ if (json === void 0 || !/\\u(?:0000|[dD][89a-fA-F][0-9a-fA-F]{2})/.test(json)) return json;
2432
+ return JSON.stringify(repairJson(JSON.parse(json)));
2433
+ }
2434
+ //#endregion
2411
2435
  //#region src/storage/db/schema-snapshot.ts
2412
2436
  /**
2413
2437
  * Returns the snapshot currently installed on `client`, but only when it was
@@ -2932,7 +2956,7 @@ var PgDB = class extends MastraBase {
2932
2956
  */
2933
2957
  prepareValuesForInsert(record, tableName) {
2934
2958
  return Object.entries(record).map(([key, value]) => {
2935
- if ((TABLE_SCHEMAS[tableName]?.[key])?.type === "jsonb" && value !== null && value !== void 0) return JSON.stringify(value);
2959
+ if ((TABLE_SCHEMAS[tableName]?.[key])?.type === "jsonb" && value !== null && value !== void 0) return toPgJson(value);
2936
2960
  return value;
2937
2961
  });
2938
2962
  }
@@ -2950,8 +2974,8 @@ var PgDB = class extends MastraBase {
2950
2974
  prepareValue(value, columnName, tableName) {
2951
2975
  if (value === null || value === void 0) return value;
2952
2976
  if (value instanceof Date) return value.toISOString();
2953
- if ((TABLE_SCHEMAS[tableName]?.[columnName])?.type === "jsonb") return JSON.stringify(value);
2954
- if (typeof value === "object") return JSON.stringify(value);
2977
+ if ((TABLE_SCHEMAS[tableName]?.[columnName])?.type === "jsonb") return toPgJson(value);
2978
+ if (typeof value === "object") return toPgJson(value);
2955
2979
  return value;
2956
2980
  }
2957
2981
  async setupSchema() {
@@ -4205,7 +4229,7 @@ var AgentsPG = class AgentsPG extends AgentsStorage {
4205
4229
  "published",
4206
4230
  versionId,
4207
4231
  row.ownerId ?? row.authorId ?? null,
4208
- row.metadata ? JSON.stringify(row.metadata) : null,
4232
+ row.metadata ? toPgJson(row.metadata) : null,
4209
4233
  row.createdAt ?? now,
4210
4234
  row.updatedAt ?? now
4211
4235
  ]);
@@ -4221,17 +4245,17 @@ var AgentsPG = class AgentsPG extends AgentsStorage {
4221
4245
  row.name ?? agentId,
4222
4246
  row.description ?? null,
4223
4247
  this.serializeInstructions(row.instructions ?? ""),
4224
- row.model ? JSON.stringify(row.model) : "{}",
4225
- row.tools ? JSON.stringify(row.tools) : null,
4226
- row.defaultOptions ? JSON.stringify(row.defaultOptions) : null,
4227
- row.workflows ? JSON.stringify(row.workflows) : null,
4228
- row.agents ? JSON.stringify(row.agents) : null,
4229
- row.integrationTools ? JSON.stringify(row.integrationTools) : null,
4230
- row.toolProviders ? JSON.stringify(row.toolProviders) : null,
4231
- row.inputProcessors ? JSON.stringify(row.inputProcessors) : null,
4232
- row.outputProcessors ? JSON.stringify(row.outputProcessors) : null,
4233
- row.memory ? JSON.stringify(row.memory) : null,
4234
- row.scorers ? JSON.stringify(row.scorers) : null,
4248
+ row.model ? toPgJson(row.model) : "{}",
4249
+ row.tools ? toPgJson(row.tools) : null,
4250
+ row.defaultOptions ? toPgJson(row.defaultOptions) : null,
4251
+ row.workflows ? toPgJson(row.workflows) : null,
4252
+ row.agents ? toPgJson(row.agents) : null,
4253
+ row.integrationTools ? toPgJson(row.integrationTools) : null,
4254
+ row.toolProviders ? toPgJson(row.toolProviders) : null,
4255
+ row.inputProcessors ? toPgJson(row.inputProcessors) : null,
4256
+ row.outputProcessors ? toPgJson(row.outputProcessors) : null,
4257
+ row.memory ? toPgJson(row.memory) : null,
4258
+ row.scorers ? toPgJson(row.scorers) : null,
4235
4259
  null,
4236
4260
  "Migrated from legacy schema",
4237
4261
  row.createdAt ?? now
@@ -4281,7 +4305,7 @@ var AgentsPG = class AgentsPG extends AgentsStorage {
4281
4305
  for (const toolKey of toolsArray) toolsObject[toolKey] = {};
4282
4306
  await this.#db.client.none(`UPDATE ${fullVersionsTableName}
4283
4307
  SET tools = $1::jsonb
4284
- WHERE id = $2`, [JSON.stringify(toolsObject), record.id]);
4308
+ WHERE id = $2`, [toPgJson(toolsObject), record.id]);
4285
4309
  }
4286
4310
  this.logger?.info?.(`Migrated ${recordsWithArrayTools.length} agent version(s) tools from array to object format`);
4287
4311
  } catch (error) {
@@ -4378,6 +4402,7 @@ var AgentsPG = class AgentsPG extends AgentsStorage {
4378
4402
  const now = /* @__PURE__ */ new Date();
4379
4403
  const nowIso = now.toISOString();
4380
4404
  const visibility = agent.visibility ?? (agent.authorId ? "private" : null);
4405
+ const metadataJson = agent.metadata ? toPgJson(agent.metadata) : null;
4381
4406
  await this.#db.client.none(`INSERT INTO ${agentsTable} (
4382
4407
  id, status, "authorId", visibility, metadata, "favoriteCount",
4383
4408
  "activeVersionId",
@@ -4387,7 +4412,7 @@ var AgentsPG = class AgentsPG extends AgentsStorage {
4387
4412
  "draft",
4388
4413
  agent.authorId ?? null,
4389
4414
  visibility,
4390
- agent.metadata ? JSON.stringify(agent.metadata) : null,
4415
+ metadataJson,
4391
4416
  0,
4392
4417
  null,
4393
4418
  nowIso,
@@ -4411,7 +4436,7 @@ var AgentsPG = class AgentsPG extends AgentsStorage {
4411
4436
  activeVersionId: void 0,
4412
4437
  authorId: agent.authorId,
4413
4438
  visibility: visibility ?? void 0,
4414
- metadata: agent.metadata,
4439
+ metadata: metadataJson ? JSON.parse(metadataJson) : agent.metadata,
4415
4440
  favoriteCount: 0,
4416
4441
  createdAt: now,
4417
4442
  updatedAt: now
@@ -4469,7 +4494,7 @@ var AgentsPG = class AgentsPG extends AgentsStorage {
4469
4494
  }
4470
4495
  if (metadata !== void 0) {
4471
4496
  setClauses.push(`metadata = $${paramIndex++}`);
4472
- values.push(JSON.stringify(metadata));
4497
+ values.push(toPgJson(metadata));
4473
4498
  }
4474
4499
  const now = (/* @__PURE__ */ new Date()).toISOString();
4475
4500
  setClauses.push(`"updatedAt" = $${paramIndex++}`);
@@ -4563,7 +4588,7 @@ var AgentsPG = class AgentsPG extends AgentsStorage {
4563
4588
  }
4564
4589
  if (metadata && Object.keys(metadata).length > 0) {
4565
4590
  conditions.push(`a.metadata @> $${paramIdx++}::jsonb`);
4566
- queryParams.push(JSON.stringify(metadata));
4591
+ queryParams.push(toPgJson(metadata));
4567
4592
  }
4568
4593
  if (entityIds && entityIds.length > 0) {
4569
4594
  const placeholders = entityIds.map(() => `$${paramIdx++}`).join(", ");
@@ -4629,9 +4654,8 @@ var AgentsPG = class AgentsPG extends AgentsStorage {
4629
4654
  indexName: TABLE_AGENT_VERSIONS,
4630
4655
  schemaName: getSchemaName$5(this.#schema)
4631
4656
  });
4632
- const now = /* @__PURE__ */ new Date();
4633
- const nowIso = now.toISOString();
4634
- await this.#db.client.none(`INSERT INTO ${tableName} (
4657
+ const nowIso = (/* @__PURE__ */ new Date()).toISOString();
4658
+ const row = await this.#db.client.one(`INSERT INTO ${tableName} (
4635
4659
  id, "agentId", "versionNumber",
4636
4660
  name, description, instructions, model, tools,
4637
4661
  "defaultOptions", workflows, agents, "integrationTools", "toolProviders",
@@ -4640,40 +4664,37 @@ var AgentsPG = class AgentsPG extends AgentsStorage {
4640
4664
  durable, browser,
4641
4665
  "changedFields", "changeMessage",
4642
4666
  "createdAt", "createdAtZ"
4643
- ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28)`, [
4667
+ ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28) RETURNING *`, [
4644
4668
  input.id,
4645
4669
  input.agentId,
4646
4670
  input.versionNumber,
4647
4671
  input.name,
4648
4672
  input.description ?? null,
4649
4673
  this.serializeInstructions(input.instructions),
4650
- JSON.stringify(input.model),
4651
- input.tools ? JSON.stringify(input.tools) : null,
4652
- input.defaultOptions ? JSON.stringify(input.defaultOptions) : null,
4653
- input.workflows ? JSON.stringify(input.workflows) : null,
4654
- input.agents ? JSON.stringify(input.agents) : null,
4655
- input.integrationTools ? JSON.stringify(input.integrationTools) : null,
4656
- input.toolProviders ? JSON.stringify(input.toolProviders) : null,
4657
- input.inputProcessors ? JSON.stringify(input.inputProcessors) : null,
4658
- input.outputProcessors ? JSON.stringify(input.outputProcessors) : null,
4659
- input.memory ? JSON.stringify(input.memory) : null,
4660
- input.scorers ? JSON.stringify(input.scorers) : null,
4661
- input.mcpClients ? JSON.stringify(input.mcpClients) : null,
4662
- input.requestContextSchema ? JSON.stringify(input.requestContextSchema) : null,
4663
- input.workspace ? JSON.stringify(input.workspace) : null,
4664
- input.skills ? JSON.stringify(input.skills) : null,
4674
+ toPgJson(input.model),
4675
+ input.tools ? toPgJson(input.tools) : null,
4676
+ input.defaultOptions ? toPgJson(input.defaultOptions) : null,
4677
+ input.workflows ? toPgJson(input.workflows) : null,
4678
+ input.agents ? toPgJson(input.agents) : null,
4679
+ input.integrationTools ? toPgJson(input.integrationTools) : null,
4680
+ input.toolProviders ? toPgJson(input.toolProviders) : null,
4681
+ input.inputProcessors ? toPgJson(input.inputProcessors) : null,
4682
+ input.outputProcessors ? toPgJson(input.outputProcessors) : null,
4683
+ input.memory ? toPgJson(input.memory) : null,
4684
+ input.scorers ? toPgJson(input.scorers) : null,
4685
+ input.mcpClients ? toPgJson(input.mcpClients) : null,
4686
+ input.requestContextSchema ? toPgJson(input.requestContextSchema) : null,
4687
+ input.workspace ? toPgJson(input.workspace) : null,
4688
+ input.skills ? toPgJson(input.skills) : null,
4665
4689
  input.skillsFormat ?? null,
4666
- input.durable !== void 0 ? JSON.stringify(input.durable) : null,
4667
- input.browser ? JSON.stringify(input.browser) : null,
4668
- input.changedFields ? JSON.stringify(input.changedFields) : null,
4690
+ input.durable !== void 0 ? toPgJson(input.durable) : null,
4691
+ input.browser ? toPgJson(input.browser) : null,
4692
+ input.changedFields ? toPgJson(input.changedFields) : null,
4669
4693
  input.changeMessage ?? null,
4670
4694
  nowIso,
4671
4695
  nowIso
4672
4696
  ]);
4673
- return {
4674
- ...input,
4675
- createdAt: now
4676
- };
4697
+ return this.parseVersionRow(row);
4677
4698
  } catch (error) {
4678
4699
  if (error instanceof MastraError) throw error;
4679
4700
  throw new MastraError({
@@ -4957,7 +4978,7 @@ function getTableName$4(schemaName) {
4957
4978
  return schemaName ? `${schemaName}.${quoted}` : quoted;
4958
4979
  }
4959
4980
  function serializeJson(v) {
4960
- if (typeof v === "object" && v != null) return JSON.stringify(v);
4981
+ if (typeof v === "object" && v != null) return toPgJson(v);
4961
4982
  return v ?? null;
4962
4983
  }
4963
4984
  function parseJson$2(v) {
@@ -5536,7 +5557,7 @@ var ChannelsPG = class ChannelsPG extends ChannelsStorage {
5536
5557
  installation.agentId,
5537
5558
  installation.status,
5538
5559
  installation.webhookId ?? null,
5539
- JSON.stringify(installation.data),
5560
+ toPgJson(installation.data),
5540
5561
  installation.configHash ?? null,
5541
5562
  installation.error ?? null,
5542
5563
  createdAt,
@@ -5596,7 +5617,7 @@ var ChannelsPG = class ChannelsPG extends ChannelsStorage {
5596
5617
  "updatedAt" = EXCLUDED."updatedAt",
5597
5618
  "updatedAtZ" = EXCLUDED."updatedAtZ"`, [
5598
5619
  config.platform,
5599
- JSON.stringify(config.data),
5620
+ toPgJson(config.data),
5600
5621
  now,
5601
5622
  now
5602
5623
  ]);
@@ -5640,7 +5661,7 @@ var ChannelsPG = class ChannelsPG extends ChannelsStorage {
5640
5661
  //#region src/storage/domains/datasets/index.ts
5641
5662
  /** Serialize a value for a jsonb column. Returns null for null/undefined. */
5642
5663
  function jsonbArg(value) {
5643
- return value === void 0 || value === null ? null : JSON.stringify(value);
5664
+ return value === void 0 || value === null ? null : toPgJson(value);
5644
5665
  }
5645
5666
  /** Preserve JSON null as data, rather than converting it to an absent SQL value. */
5646
5667
  function jsonDataArg(value) {
@@ -6021,23 +6042,23 @@ var DatasetsPG = class DatasetsPG extends DatasetsStorage {
6021
6042
  }
6022
6043
  if (args.metadata !== void 0) {
6023
6044
  setClauses.push(`"metadata" = $${paramIndex++}`);
6024
- values.push(JSON.stringify(args.metadata));
6045
+ values.push(toPgJson(args.metadata));
6025
6046
  }
6026
6047
  if (args.inputSchema !== void 0) {
6027
6048
  setClauses.push(`"inputSchema" = $${paramIndex++}`);
6028
- values.push(args.inputSchema === null ? null : JSON.stringify(args.inputSchema));
6049
+ values.push(args.inputSchema === null ? null : toPgJson(args.inputSchema));
6029
6050
  }
6030
6051
  if (args.groundTruthSchema !== void 0) {
6031
6052
  setClauses.push(`"groundTruthSchema" = $${paramIndex++}`);
6032
- values.push(args.groundTruthSchema === null ? null : JSON.stringify(args.groundTruthSchema));
6053
+ values.push(args.groundTruthSchema === null ? null : toPgJson(args.groundTruthSchema));
6033
6054
  }
6034
6055
  if (args.requestContextSchema !== void 0) {
6035
6056
  setClauses.push(`"requestContextSchema" = $${paramIndex++}`);
6036
- values.push(args.requestContextSchema === null ? null : JSON.stringify(args.requestContextSchema));
6057
+ values.push(args.requestContextSchema === null ? null : toPgJson(args.requestContextSchema));
6037
6058
  }
6038
6059
  if (args.tags !== void 0) {
6039
6060
  setClauses.push(`"tags" = $${paramIndex++}`);
6040
- values.push(args.tags === null ? null : JSON.stringify(args.tags));
6061
+ values.push(args.tags === null ? null : toPgJson(args.tags));
6041
6062
  }
6042
6063
  if (args.targetType !== void 0) {
6043
6064
  setClauses.push(`"targetType" = $${paramIndex++}`);
@@ -6045,11 +6066,11 @@ var DatasetsPG = class DatasetsPG extends DatasetsStorage {
6045
6066
  }
6046
6067
  if (args.targetIds !== void 0) {
6047
6068
  setClauses.push(`"targetIds" = $${paramIndex++}`);
6048
- values.push(args.targetIds === null ? null : JSON.stringify(args.targetIds));
6069
+ values.push(args.targetIds === null ? null : toPgJson(args.targetIds));
6049
6070
  }
6050
6071
  if (args.scorerIds !== void 0) {
6051
6072
  setClauses.push(`"scorerIds" = $${paramIndex++}`);
6052
- values.push(args.scorerIds === null ? null : JSON.stringify(args.scorerIds));
6073
+ values.push(args.scorerIds === null ? null : toPgJson(args.scorerIds));
6053
6074
  }
6054
6075
  values.push(args.id);
6055
6076
  await this.#db.client.none(`UPDATE ${tableName} SET ${setClauses.join(", ")} WHERE "id" = $${paramIndex}`, values);
@@ -6497,10 +6518,9 @@ var DatasetsPG = class DatasetsPG extends DatasetsStorage {
6497
6518
  indexName: TABLE_EXPERIMENT_RESULTS,
6498
6519
  schemaName: getSchemaName$5(this.#schema)
6499
6520
  });
6500
- const purgedAt = (/* @__PURE__ */ new Date()).toISOString();
6501
- const purgedMetadata = JSON.stringify({
6521
+ const purgedMetadata = toPgJson({
6502
6522
  __purged: true,
6503
- purgedAt
6523
+ purgedAt: (/* @__PURE__ */ new Date()).toISOString()
6504
6524
  });
6505
6525
  await this.#db.client.tx(async (t) => {
6506
6526
  if (!await t.oneOrNone(`SELECT "id" FROM ${datasetsTable} WHERE "id" = $1 FOR UPDATE`, [datasetId])) return;
@@ -7300,7 +7320,7 @@ var ExperimentsPG = class ExperimentsPG extends ExperimentsStorage {
7300
7320
  }
7301
7321
  if (input.metadata !== void 0) {
7302
7322
  setClauses.push(`"metadata" = $${paramIndex++}`);
7303
- values.push(JSON.stringify(input.metadata));
7323
+ values.push(toPgJson(input.metadata));
7304
7324
  }
7305
7325
  if (input.status !== void 0) {
7306
7326
  setClauses.push(`"status" = $${paramIndex++}`);
@@ -7531,19 +7551,19 @@ var ExperimentsPG = class ExperimentsPG extends ExperimentsStorage {
7531
7551
  input.itemDatasetVersion ?? null,
7532
7552
  input.organizationId ?? null,
7533
7553
  input.projectId ?? null,
7534
- JSON.stringify(purgeMetadata ? null : input.input),
7535
- purgeMetadata || input.output == null ? null : JSON.stringify(input.output),
7536
- purgeMetadata || input.groundTruth == null ? null : JSON.stringify(input.groundTruth),
7537
- JSON.stringify(purgeMetadata ?? input.metadata ?? null),
7538
- purgeMetadata || input.error == null ? null : JSON.stringify(input.error),
7554
+ toPgJson(purgeMetadata ? null : input.input),
7555
+ purgeMetadata || input.output == null ? null : toPgJson(input.output),
7556
+ purgeMetadata || input.groundTruth == null ? null : toPgJson(input.groundTruth),
7557
+ toPgJson(purgeMetadata ?? input.metadata ?? null),
7558
+ purgeMetadata || input.error == null ? null : toPgJson(input.error),
7539
7559
  input.startedAt.toISOString(),
7540
7560
  input.completedAt.toISOString(),
7541
7561
  input.retryCount,
7542
7562
  input.attempt ?? 0,
7543
7563
  input.traceId ?? null,
7544
7564
  input.status ?? null,
7545
- purgeMetadata || input.tags == null ? null : JSON.stringify(input.tags),
7546
- purgeMetadata || input.toolMockReport == null ? null : JSON.stringify(input.toolMockReport),
7565
+ purgeMetadata || input.tags == null ? null : toPgJson(input.tags),
7566
+ purgeMetadata || input.toolMockReport == null ? null : toPgJson(input.toolMockReport),
7547
7567
  nowIso
7548
7568
  ]);
7549
7569
  });
@@ -7589,19 +7609,19 @@ var ExperimentsPG = class ExperimentsPG extends ExperimentsStorage {
7589
7609
  input.itemDatasetVersion ?? null,
7590
7610
  input.organizationId ?? null,
7591
7611
  input.projectId ?? null,
7592
- JSON.stringify(purgeMetadata ? null : input.input),
7593
- purgeMetadata || input.output == null ? null : JSON.stringify(input.output),
7594
- purgeMetadata || input.groundTruth == null ? null : JSON.stringify(input.groundTruth),
7595
- JSON.stringify(purgeMetadata ?? input.metadata ?? null),
7596
- purgeMetadata || input.error == null ? null : JSON.stringify(input.error),
7612
+ toPgJson(purgeMetadata ? null : input.input),
7613
+ purgeMetadata || input.output == null ? null : toPgJson(input.output),
7614
+ purgeMetadata || input.groundTruth == null ? null : toPgJson(input.groundTruth),
7615
+ toPgJson(purgeMetadata ?? input.metadata ?? null),
7616
+ purgeMetadata || input.error == null ? null : toPgJson(input.error),
7597
7617
  input.startedAt.toISOString(),
7598
7618
  input.completedAt.toISOString(),
7599
7619
  input.retryCount,
7600
7620
  attempt,
7601
7621
  input.traceId ?? null,
7602
7622
  input.status ?? null,
7603
- purgeMetadata || input.tags == null ? null : JSON.stringify(input.tags),
7604
- purgeMetadata || input.toolMockReport == null ? null : JSON.stringify(input.toolMockReport),
7623
+ purgeMetadata || input.tags == null ? null : toPgJson(input.tags),
7624
+ purgeMetadata || input.toolMockReport == null ? null : toPgJson(input.toolMockReport),
7605
7625
  (/* @__PURE__ */ new Date()).toISOString()
7606
7626
  ]);
7607
7627
  }
@@ -7615,19 +7635,19 @@ var ExperimentsPG = class ExperimentsPG extends ExperimentsStorage {
7615
7635
  input.itemDatasetVersion ?? null,
7616
7636
  input.organizationId ?? null,
7617
7637
  input.projectId ?? null,
7618
- JSON.stringify(purgeMetadata ? null : input.input),
7619
- purgeMetadata || input.output == null ? null : JSON.stringify(input.output),
7620
- purgeMetadata || input.groundTruth == null ? null : JSON.stringify(input.groundTruth),
7621
- JSON.stringify(purgeMetadata ?? input.metadata ?? null),
7622
- purgeMetadata || input.error == null ? null : JSON.stringify(input.error),
7638
+ toPgJson(purgeMetadata ? null : input.input),
7639
+ purgeMetadata || input.output == null ? null : toPgJson(input.output),
7640
+ purgeMetadata || input.groundTruth == null ? null : toPgJson(input.groundTruth),
7641
+ toPgJson(purgeMetadata ?? input.metadata ?? null),
7642
+ purgeMetadata || input.error == null ? null : toPgJson(input.error),
7623
7643
  input.startedAt.toISOString(),
7624
7644
  input.completedAt.toISOString(),
7625
7645
  input.retryCount,
7626
7646
  attempt,
7627
7647
  input.traceId ?? null,
7628
7648
  input.status ?? null,
7629
- purgeMetadata || input.tags == null ? null : JSON.stringify(input.tags),
7630
- purgeMetadata || input.toolMockReport == null ? null : JSON.stringify(input.toolMockReport)
7649
+ purgeMetadata || input.tags == null ? null : toPgJson(input.tags),
7650
+ purgeMetadata || input.toolMockReport == null ? null : toPgJson(input.toolMockReport)
7631
7651
  ]);
7632
7652
  });
7633
7653
  return this.transformExperimentResultRow(row);
@@ -7667,7 +7687,7 @@ var ExperimentsPG = class ExperimentsPG extends ExperimentsStorage {
7667
7687
  input.status ?? null,
7668
7688
  Boolean(purgeMetadata),
7669
7689
  input.tags !== void 0,
7670
- input.tags === void 0 ? null : JSON.stringify(input.tags),
7690
+ input.tags === void 0 ? null : toPgJson(input.tags),
7671
7691
  input.comment !== void 0,
7672
7692
  input.comment ?? null,
7673
7693
  ...input.experimentId !== void 0 ? [input.experimentId] : []
@@ -7738,7 +7758,7 @@ var ExperimentsPG = class ExperimentsPG extends ExperimentsStorage {
7738
7758
  }
7739
7759
  for (const tag of args.tags ?? []) {
7740
7760
  conditions.push(`"tags" @> $${paramIndex++}::jsonb`);
7741
- queryParams.push(JSON.stringify([tag]));
7761
+ queryParams.push(toPgJson([tag]));
7742
7762
  }
7743
7763
  if (args.filters) {
7744
7764
  const { organizationId, projectId } = args.filters;
@@ -8665,6 +8685,7 @@ var KnowledgePG = class extends KnowledgeStorage {
8665
8685
  return this.#transaction(async (tx) => {
8666
8686
  const parent = await this.#resolveTerminalNode(tx, nodeReferenceId(input.node));
8667
8687
  if (!parent) throw new KnowledgeNotFoundError("node", nodeReferenceId(input.node));
8688
+ const metadataJson = input.metadata ? toPgJson(input.metadata) : null;
8668
8689
  const record = {
8669
8690
  id: input.id ?? createKnowledgeUlid(),
8670
8691
  node: parent.id,
@@ -8688,13 +8709,16 @@ var KnowledgePG = class extends KnowledgeStorage {
8688
8709
  record.capturedAt.toISOString(),
8689
8710
  record.when?.toISOString() ?? null,
8690
8711
  record.maxScope ?? null,
8691
- record.metadata ? JSON.stringify(record.metadata) : null
8712
+ metadataJson
8692
8713
  ]
8693
8714
  });
8694
8715
  await this.#replaceMentions(tx, "record", record.id, record.text, resolutionScope, defaultScope);
8695
8716
  await this.#activity(tx, "record-created", "record", record.id, scope, record.sourceThreadId);
8696
8717
  await this.#outbox(tx, "record", record.id, "upsert", record.id, scope);
8697
- return record;
8718
+ return metadataJson ? {
8719
+ ...record,
8720
+ metadata: JSON.parse(metadataJson)
8721
+ } : record;
8698
8722
  });
8699
8723
  }
8700
8724
  async getKnowledge(input) {
@@ -9263,6 +9287,7 @@ var MCPClientsPG = class MCPClientsPG extends MCPClientsStorage {
9263
9287
  });
9264
9288
  const now = /* @__PURE__ */ new Date();
9265
9289
  const nowIso = now.toISOString();
9290
+ const metadataJson = mcpClient.metadata ? toPgJson(mcpClient.metadata) : null;
9266
9291
  await this.#db.client.none(`INSERT INTO ${tableName} (
9267
9292
  id, status, "activeVersionId", "authorId", metadata,
9268
9293
  "createdAt", "createdAtZ", "updatedAt", "updatedAtZ"
@@ -9271,7 +9296,7 @@ var MCPClientsPG = class MCPClientsPG extends MCPClientsStorage {
9271
9296
  "draft",
9272
9297
  null,
9273
9298
  mcpClient.authorId ?? null,
9274
- mcpClient.metadata ? JSON.stringify(mcpClient.metadata) : null,
9299
+ metadataJson,
9275
9300
  nowIso,
9276
9301
  nowIso,
9277
9302
  nowIso,
@@ -9292,7 +9317,7 @@ var MCPClientsPG = class MCPClientsPG extends MCPClientsStorage {
9292
9317
  status: "draft",
9293
9318
  activeVersionId: void 0,
9294
9319
  authorId: mcpClient.authorId,
9295
- metadata: mcpClient.metadata,
9320
+ metadata: metadataJson ? JSON.parse(metadataJson) : mcpClient.metadata,
9296
9321
  createdAt: now,
9297
9322
  updatedAt: now
9298
9323
  };
@@ -9350,7 +9375,7 @@ var MCPClientsPG = class MCPClientsPG extends MCPClientsStorage {
9350
9375
  ...metadata
9351
9376
  };
9352
9377
  setClauses.push(`metadata = $${paramIndex++}`);
9353
- values.push(JSON.stringify(mergedMetadata));
9378
+ values.push(toPgJson(mergedMetadata));
9354
9379
  }
9355
9380
  const now = (/* @__PURE__ */ new Date()).toISOString();
9356
9381
  setClauses.push(`"updatedAt" = $${paramIndex++}`);
@@ -9423,7 +9448,7 @@ var MCPClientsPG = class MCPClientsPG extends MCPClientsStorage {
9423
9448
  }
9424
9449
  if (metadata && Object.keys(metadata).length > 0) {
9425
9450
  conditions.push(`metadata @> $${paramIdx++}::jsonb`);
9426
- queryParams.push(JSON.stringify(metadata));
9451
+ queryParams.push(toPgJson(metadata));
9427
9452
  }
9428
9453
  const whereClause = `WHERE ${conditions.join(" AND ")}`;
9429
9454
  const countResult = await this.#db.readClient.one(`SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`, queryParams);
@@ -9474,6 +9499,8 @@ var MCPClientsPG = class MCPClientsPG extends MCPClientsStorage {
9474
9499
  });
9475
9500
  const now = /* @__PURE__ */ new Date();
9476
9501
  const nowIso = now.toISOString();
9502
+ const serversJson = toPgJson(input.servers);
9503
+ const changedFieldsJson = input.changedFields ? toPgJson(input.changedFields) : null;
9477
9504
  await this.#db.client.none(`INSERT INTO ${tableName} (
9478
9505
  id, "mcpClientId", "versionNumber",
9479
9506
  name, description, servers,
@@ -9485,14 +9512,16 @@ var MCPClientsPG = class MCPClientsPG extends MCPClientsStorage {
9485
9512
  input.versionNumber,
9486
9513
  input.name,
9487
9514
  input.description ?? null,
9488
- JSON.stringify(input.servers),
9489
- input.changedFields ? JSON.stringify(input.changedFields) : null,
9515
+ serversJson,
9516
+ changedFieldsJson,
9490
9517
  input.changeMessage ?? null,
9491
9518
  nowIso,
9492
9519
  nowIso
9493
9520
  ]);
9494
9521
  return {
9495
9522
  ...input,
9523
+ servers: JSON.parse(serversJson),
9524
+ changedFields: changedFieldsJson ? JSON.parse(changedFieldsJson) : input.changedFields,
9496
9525
  createdAt: now
9497
9526
  };
9498
9527
  } catch (error) {
@@ -9834,7 +9863,7 @@ var MCPServersPG = class MCPServersPG extends MCPServersStorage {
9834
9863
  "draft",
9835
9864
  null,
9836
9865
  mcpServer.authorId ?? null,
9837
- mcpServer.metadata ? JSON.stringify(mcpServer.metadata) : null,
9866
+ mcpServer.metadata ? toPgJson(mcpServer.metadata) : null,
9838
9867
  nowIso,
9839
9868
  nowIso,
9840
9869
  nowIso,
@@ -9913,7 +9942,7 @@ var MCPServersPG = class MCPServersPG extends MCPServersStorage {
9913
9942
  ...metadata
9914
9943
  };
9915
9944
  setClauses.push(`metadata = $${paramIndex++}`);
9916
- values.push(JSON.stringify(mergedMetadata));
9945
+ values.push(toPgJson(mergedMetadata));
9917
9946
  }
9918
9947
  const now = (/* @__PURE__ */ new Date()).toISOString();
9919
9948
  setClauses.push(`"updatedAt" = $${paramIndex++}`);
@@ -9986,7 +10015,7 @@ var MCPServersPG = class MCPServersPG extends MCPServersStorage {
9986
10015
  }
9987
10016
  if (metadata && Object.keys(metadata).length > 0) {
9988
10017
  conditions.push(`metadata @> $${paramIdx++}::jsonb`);
9989
- queryParams.push(JSON.stringify(metadata));
10018
+ queryParams.push(toPgJson(metadata));
9990
10019
  }
9991
10020
  const whereClause = `WHERE ${conditions.join(" AND ")}`;
9992
10021
  const countResult = await this.#db.readClient.one(`SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`, queryParams);
@@ -10052,14 +10081,14 @@ var MCPServersPG = class MCPServersPG extends MCPServersStorage {
10052
10081
  input.version,
10053
10082
  input.description ?? null,
10054
10083
  input.instructions ?? null,
10055
- input.repository ? JSON.stringify(input.repository) : null,
10084
+ input.repository ? toPgJson(input.repository) : null,
10056
10085
  input.releaseDate ?? null,
10057
10086
  input.isLatest ?? null,
10058
10087
  input.packageCanonical ?? null,
10059
- input.tools ? JSON.stringify(input.tools) : null,
10060
- input.agents ? JSON.stringify(input.agents) : null,
10061
- input.workflows ? JSON.stringify(input.workflows) : null,
10062
- input.changedFields ? JSON.stringify(input.changedFields) : null,
10088
+ input.tools ? toPgJson(input.tools) : null,
10089
+ input.agents ? toPgJson(input.agents) : null,
10090
+ input.workflows ? toPgJson(input.workflows) : null,
10091
+ input.changedFields ? toPgJson(input.changedFields) : null,
10063
10092
  input.changeMessage ?? null,
10064
10093
  nowIso,
10065
10094
  nowIso
@@ -10794,7 +10823,7 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
10794
10823
  }
10795
10824
  if (filter?.metadata && Object.keys(filter.metadata).length > 0) for (const [key, value] of Object.entries(filter.metadata)) {
10796
10825
  whereClauses.push(`metadata::jsonb @> $${paramIndex}::jsonb`);
10797
- queryParams.push(JSON.stringify({ [key]: value }));
10826
+ queryParams.push(toPgJson({ [key]: value }));
10798
10827
  paramIndex++;
10799
10828
  }
10800
10829
  const baseQuery = `FROM ${tableName} ${whereClauses.length > 0 ? `WHERE ${whereClauses.join(" AND ")}` : ""}`;
@@ -10853,6 +10882,7 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
10853
10882
  });
10854
10883
  const createdAt = toUtcISOString(thread.createdAt);
10855
10884
  const updatedAt = toUtcISOString(thread.updatedAt);
10885
+ const metadataJson = thread.metadata ? toPgJson(thread.metadata) : null;
10856
10886
  await this.#db.client.none(`INSERT INTO ${tableName} (
10857
10887
  id,
10858
10888
  "resourceId",
@@ -10874,13 +10904,16 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
10874
10904
  thread.id,
10875
10905
  thread.resourceId,
10876
10906
  thread.title,
10877
- thread.metadata ? JSON.stringify(thread.metadata) : null,
10907
+ metadataJson,
10878
10908
  createdAt,
10879
10909
  createdAt,
10880
10910
  updatedAt,
10881
10911
  updatedAt
10882
10912
  ]);
10883
- return thread;
10913
+ return {
10914
+ ...thread,
10915
+ metadata: metadataJson ? JSON.parse(metadataJson) : thread.metadata
10916
+ };
10884
10917
  } catch (error) {
10885
10918
  throw new MastraError({
10886
10919
  id: createStorageErrorId("PG", "SAVE_THREAD", "FAILED"),
@@ -11696,16 +11729,20 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
11696
11729
  async saveResource({ resource }) {
11697
11730
  const createdAt = toUtcISOString(resource.createdAt);
11698
11731
  const updatedAt = toUtcISOString(resource.updatedAt);
11732
+ const metadataJson = toPgJson(resource.metadata);
11699
11733
  await this.#db.insert({
11700
11734
  tableName: TABLE_RESOURCES,
11701
11735
  record: {
11702
11736
  ...resource,
11703
- metadata: JSON.stringify(resource.metadata),
11737
+ metadata: metadataJson,
11704
11738
  createdAt,
11705
11739
  updatedAt
11706
11740
  }
11707
11741
  });
11708
- return resource;
11742
+ return {
11743
+ ...resource,
11744
+ metadata: metadataJson ? JSON.parse(metadataJson) : resource.metadata
11745
+ };
11709
11746
  }
11710
11747
  async updateResource({ resourceId, workingMemory, metadata }) {
11711
11748
  const existingResource = await this.#getResourceById(this.#db.client, resourceId);
@@ -11740,9 +11777,11 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
11740
11777
  values.push(workingMemory);
11741
11778
  paramIndex++;
11742
11779
  }
11780
+ let metadataJson;
11743
11781
  if (metadata) {
11782
+ metadataJson = toPgJson(updatedResource.metadata);
11744
11783
  updates.push(`metadata = $${paramIndex}`);
11745
- values.push(JSON.stringify(updatedResource.metadata));
11784
+ values.push(metadataJson);
11746
11785
  paramIndex++;
11747
11786
  }
11748
11787
  const updatedAtStr = updatedResource.updatedAt.toISOString();
@@ -11752,7 +11791,10 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
11752
11791
  values.push(updatedAtStr);
11753
11792
  values.push(resourceId);
11754
11793
  await this.#db.client.none(`UPDATE ${tableName} SET ${updates.join(", ")} WHERE id = $${paramIndex}`, values);
11755
- return updatedResource;
11794
+ return metadataJson ? {
11795
+ ...updatedResource,
11796
+ metadata: JSON.parse(metadataJson)
11797
+ } : updatedResource;
11756
11798
  }
11757
11799
  async copyThread(args) {
11758
11800
  const { sourceThreadId, newThreadId: providedThreadId, resourceId, title, metadata, options } = args;
@@ -11837,7 +11879,7 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
11837
11879
  newThread.id,
11838
11880
  newThread.resourceId,
11839
11881
  newThread.title,
11840
- newThread.metadata ? JSON.stringify(newThread.metadata) : null,
11882
+ newThread.metadata ? toPgJson(newThread.metadata) : null,
11841
11883
  nowStr,
11842
11884
  nowStr,
11843
11885
  nowStr,
@@ -12028,7 +12070,7 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
12028
12070
  "",
12029
12071
  null,
12030
12072
  "initial",
12031
- JSON.stringify(input.config),
12073
+ toPgJson(input.config),
12032
12074
  0,
12033
12075
  null,
12034
12076
  null,
@@ -12091,7 +12133,7 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
12091
12133
  record.activeObservations || "",
12092
12134
  null,
12093
12135
  record.originType || "initial",
12094
- record.config ? JSON.stringify(record.config) : null,
12136
+ record.config ? toPgJson(record.config) : null,
12095
12137
  record.generationCount || 0,
12096
12138
  lastObservedAtStr,
12097
12139
  lastObservedAtStr,
@@ -12100,8 +12142,8 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
12100
12142
  record.pendingMessageTokens || 0,
12101
12143
  record.totalTokensObserved || 0,
12102
12144
  record.observationTokenCount || 0,
12103
- record.observedMessageIds ? JSON.stringify(record.observedMessageIds) : null,
12104
- record.bufferedObservationChunks ? JSON.stringify(record.bufferedObservationChunks) : null,
12145
+ record.observedMessageIds ? toPgJson(record.observedMessageIds) : null,
12146
+ record.bufferedObservationChunks ? toPgJson(record.bufferedObservationChunks) : null,
12105
12147
  record.bufferedReflection || null,
12106
12148
  record.bufferedReflectionTokens ?? null,
12107
12149
  record.bufferedReflectionInputTokens ?? null,
@@ -12113,7 +12155,7 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
12113
12155
  record.lastBufferedAtTokens || 0,
12114
12156
  lastBufferedAtTimeStr,
12115
12157
  record.observedTimezone || null,
12116
- record.metadata ? JSON.stringify(record.metadata) : null,
12158
+ record.metadata ? toPgJson(record.metadata) : null,
12117
12159
  record.createdAt.toISOString(),
12118
12160
  record.createdAt.toISOString(),
12119
12161
  record.updatedAt.toISOString(),
@@ -12141,7 +12183,7 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
12141
12183
  });
12142
12184
  const lastObservedAtStr = input.lastObservedAt.toISOString();
12143
12185
  const nowStr = now.toISOString();
12144
- const observedMessageIdsJson = input.observedMessageIds ? JSON.stringify(input.observedMessageIds) : null;
12186
+ const observedMessageIdsJson = input.observedMessageIds ? toPgJson(input.observedMessageIds) : null;
12145
12187
  if ((await this.#db.client.query(`UPDATE ${tableName} SET
12146
12188
  "activeObservations" = $1,
12147
12189
  "lastObservedAt" = $2,
@@ -12230,7 +12272,7 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
12230
12272
  input.reflection,
12231
12273
  null,
12232
12274
  "reflection",
12233
- JSON.stringify(record.config),
12275
+ toPgJson(record.config),
12234
12276
  input.currentRecord.generationCount + 1,
12235
12277
  lastObservedAtStr,
12236
12278
  lastObservedAtStr,
@@ -12246,7 +12288,7 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
12246
12288
  0,
12247
12289
  null,
12248
12290
  record.observedTimezone || null,
12249
- record.metadata ? JSON.stringify(record.metadata) : null,
12291
+ record.metadata ? toPgJson(record.metadata) : null,
12250
12292
  nowStr,
12251
12293
  nowStr,
12252
12294
  nowStr,
@@ -12497,7 +12539,7 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
12497
12539
  const merged = this.deepMergeConfig(existing, input.config);
12498
12540
  const nowStr = (/* @__PURE__ */ new Date()).toISOString();
12499
12541
  await this.#db.client.query(`UPDATE ${tableName} SET config = $1, "updatedAt" = $2, "updatedAtZ" = $3 WHERE id = $4`, [
12500
- JSON.stringify(merged),
12542
+ toPgJson(merged),
12501
12543
  nowStr,
12502
12544
  nowStr,
12503
12545
  input.id
@@ -12548,7 +12590,7 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
12548
12590
  "updatedAt" = $4,
12549
12591
  "updatedAtZ" = $5
12550
12592
  WHERE id = $6`, [
12551
- JSON.stringify([newChunk]),
12593
+ toPgJson([newChunk]),
12552
12594
  input.chunk.cycleId,
12553
12595
  lastBufferedAtTime,
12554
12596
  nowStr,
@@ -12663,7 +12705,7 @@ var MemoryPG = class MemoryPG extends MemoryStorage {
12663
12705
  activatedContent,
12664
12706
  activatedTokens,
12665
12707
  activatedMessageTokens,
12666
- remainingChunks.length > 0 ? JSON.stringify(remainingChunks) : null,
12708
+ remainingChunks.length > 0 ? toPgJson(remainingChunks) : null,
12667
12709
  lastObservedAtStr,
12668
12710
  lastObservedAtStr,
12669
12711
  nowStr,
@@ -13043,7 +13085,7 @@ var NotificationsPG = class NotificationsPG extends NotificationsStorage {
13043
13085
  });
13044
13086
  const setColumns = entries.map(([key], index) => `"${parseSqlIdentifier(key, "column name")}" = $${index + 1}`);
13045
13087
  const values = entries.map(([key, value]) => {
13046
- if (TABLE_SCHEMAS[TABLE_NOTIFICATIONS][key]?.type === "jsonb" && value !== null) return JSON.stringify(value);
13088
+ if (TABLE_SCHEMAS[TABLE_NOTIFICATIONS][key]?.type === "jsonb" && value !== null) return toPgJson(value);
13047
13089
  return value;
13048
13090
  });
13049
13091
  await this.#db.client.none(`UPDATE ${tableName} SET ${setColumns.join(", ")} WHERE "threadId" = $${values.length + 1} AND "id" = $${values.length + 2}`, [
@@ -13764,15 +13806,15 @@ var ObservabilityPG = class ObservabilityPG extends ObservabilityStorage {
13764
13806
  }
13765
13807
  if (filters.scope != null) {
13766
13808
  conditions.push(`r."scope" @> $${paramIndex++}`);
13767
- params.push(JSON.stringify(filters.scope));
13809
+ params.push(toPgJson(filters.scope));
13768
13810
  }
13769
13811
  if (filters.metadata != null) {
13770
13812
  conditions.push(`r."metadata" @> $${paramIndex++}`);
13771
- params.push(JSON.stringify(filters.metadata));
13813
+ params.push(toPgJson(filters.metadata));
13772
13814
  }
13773
13815
  if (filters.tags != null && filters.tags.length > 0) {
13774
13816
  conditions.push(`r."tags" @> $${paramIndex++}`);
13775
- params.push(JSON.stringify(filters.tags));
13817
+ params.push(toPgJson(filters.tags));
13776
13818
  }
13777
13819
  if (filters.status !== void 0) switch (filters.status) {
13778
13820
  case TraceStatus.ERROR:
@@ -15081,7 +15123,7 @@ async function upsertCache(client, schema, cacheKey, values) {
15081
15123
  VALUES ($1, NOW(), $2::jsonb)
15082
15124
  ON CONFLICT ("cacheKey") DO UPDATE SET
15083
15125
  "refreshedAt" = EXCLUDED."refreshedAt",
15084
- "values" = EXCLUDED."values"`, [cacheKey, JSON.stringify(values)]);
15126
+ "values" = EXCLUDED."values"`, [cacheKey, toPgJson(values)]);
15085
15127
  }
15086
15128
  /**
15087
15129
  * Time predicate that bounds a discovery refresh to recent events.
@@ -16035,20 +16077,6 @@ const COMPLEX_GROUP_BY_EXCLUDED = /* @__PURE__ */ new Set([
16035
16077
  "requestContext"
16036
16078
  ]);
16037
16079
  //#endregion
16038
- //#region src/storage/db/sanitize-json.ts
16039
- /**
16040
- * Sanitizes JSON string for PostgreSQL jsonb:
16041
- * - Removes problematic Unicode sequences:
16042
- * - \u0000 (null character) - causes error 22P05 "unsupported Unicode escape sequence"
16043
- * - \uD800-\uDFFF (unpaired surrogates) - causes "Unicode low surrogate must follow a high surrogate"
16044
- * - \\uD800 (escaped-backslash + surrogate, e.g. from JS regex literals like [^\ud800-\udfff]):
16045
- * removing just \uXXXX would leave a dangling backslash that creates a new invalid escape (e.g. \-)
16046
- * - Escapes any remaining invalid JSON escape sequences (e.g. \v, \k, \-)
16047
- */
16048
- function sanitizeJsonForPg(jsonString) {
16049
- return jsonString.replace(/\\\\?u(0000|[Dd][89A-Fa-f][0-9A-Fa-f]{2})/g, "").replace(/(^|[^\\])(\\(?!["\\/bfnrtu]))/g, "$1\\\\");
16050
- }
16051
- //#endregion
16052
16080
  //#region src/storage/domains/observability/v-next/sql.ts
16053
16081
  /**
16054
16082
  * SQL helpers for the v-next Postgres observability domain.
@@ -16070,7 +16098,7 @@ function sanitizeJsonForPg(jsonString) {
16070
16098
  */
16071
16099
  function encodeJsonb(value) {
16072
16100
  if (value === null || value === void 0) return null;
16073
- return sanitizeJsonForPg(JSON.stringify(value));
16101
+ return toPgJson(value);
16074
16102
  }
16075
16103
  /**
16076
16104
  * Build a multi-row INSERT with explicit column types and ON CONFLICT DO NOTHING.
@@ -16471,7 +16499,7 @@ function applyMetricFilters(acc, filters) {
16471
16499
  applySingleOrArrayFilter(acc, "costUnit", filters?.costUnit);
16472
16500
  if (filters?.labels) {
16473
16501
  acc.conditions.push(`"labels" @> $${acc.next++}::jsonb`);
16474
- acc.params.push(JSON.stringify(filters.labels));
16502
+ acc.params.push(toPgJson(filters.labels));
16475
16503
  }
16476
16504
  }
16477
16505
  /** Additional WHERE for metric-name restriction (OLAP queries take a `name` array). */
@@ -16984,7 +17012,7 @@ function applyScoreFilters(acc, filters) {
16984
17012
  }
16985
17013
  if (filters?.metadata && Object.keys(filters.metadata).length > 0) for (const [key, value] of Object.entries(filters.metadata)) {
16986
17014
  acc.conditions.push(`"metadata"->($${acc.next++}::text) = $${acc.next++}::jsonb`);
16987
- acc.params.push(key, JSON.stringify(value ?? null));
17015
+ acc.params.push(key, toPgJson(value ?? null));
16988
17016
  }
16989
17017
  }
16990
17018
  /** OLAP queries take an explicit scorerId / scoreSource pair as identity. */
@@ -17250,12 +17278,16 @@ async function getScorePercentiles(client, schema, args) {
17250
17278
  //#endregion
17251
17279
  //#region src/storage/domains/observability/v-next/trace-query.ts
17252
17280
  const TRACE_STATUS_SQL = `CASE WHEN r."error" IS NOT NULL THEN 'error' ELSE 'success' END`;
17281
+ function durationMsSql(startedAt, endedAt) {
17282
+ return `EXTRACT(EPOCH FROM (${endedAt} - ${startedAt}))::numeric * 1000`;
17283
+ }
17253
17284
  const TRACE_FIELDS = {
17254
17285
  traceId: "r.\"traceId\"",
17255
17286
  threadId: "r.\"threadId\"",
17256
17287
  resourceId: "r.\"resourceId\"",
17257
17288
  startedAt: "r.\"startedAt\"",
17258
17289
  endedAt: "r.\"endedAt\"",
17290
+ durationMs: durationMsSql("r.\"startedAt\"", "r.\"endedAt\""),
17259
17291
  entityName: "r.\"entityName\"",
17260
17292
  entityType: "r.\"entityType\"",
17261
17293
  environment: "r.\"environment\"",
@@ -17584,7 +17616,7 @@ function compilePostgresTraceScope(schema, selection, relationCollections, scope
17584
17616
  CASE WHEN s."isPending" THEN NULL ELSE s."endedAt" END AS "endedAt",
17585
17617
  CASE
17586
17618
  WHEN s."isPending" THEN NULL
17587
- ELSE EXTRACT(EPOCH FROM (s."endedAt" - s."startedAt")) * 1000
17619
+ ELSE ${durationMsSql("s.\"startedAt\"", "s.\"endedAt\"")}
17588
17620
  END AS "durationMs",
17589
17621
  CASE WHEN s."error" IS NOT NULL THEN 'error' ELSE 'success' END AS "status",
17590
17622
  s."error",
@@ -18183,7 +18215,7 @@ function buildListTracesFilters(filters, spanTable, nextParamIdx) {
18183
18215
  }
18184
18216
  if (filters.metadata != null) {
18185
18217
  conditions.push(`r."metadataSearch" @> $${i++}::jsonb`);
18186
- params.push(JSON.stringify(filters.metadata));
18218
+ params.push(toPgJson(filters.metadata));
18187
18219
  }
18188
18220
  if (filters.tags != null && filters.tags.length > 0) {
18189
18221
  conditions.push(`r."tags" @> $${i++}::text[]`);
@@ -18461,7 +18493,7 @@ function buildListBranchesFilters(filters, spanType, spanTable, nextParamIdx) {
18461
18493
  }
18462
18494
  if (filters.metadata != null) {
18463
18495
  conditions.push(`r."metadataSearch" @> $${i++}::jsonb`);
18464
- params.push(JSON.stringify(filters.metadata));
18496
+ params.push(toPgJson(filters.metadata));
18465
18497
  }
18466
18498
  if (filters.tags != null && filters.tags.length > 0) {
18467
18499
  conditions.push(`r."tags" @> $${i++}::text[]`);
@@ -18926,6 +18958,7 @@ var ObservabilityStoragePostgresVNext = class ObservabilityStoragePostgresVNext
18926
18958
  "metrics",
18927
18959
  "logs",
18928
18960
  "trace-query",
18961
+ "trace-query-root-duration",
18929
18962
  "trace-query-discovery",
18930
18963
  "thread-query",
18931
18964
  "trace-query-tenant-scope"
@@ -18935,6 +18968,7 @@ var ObservabilityStoragePostgresVNext = class ObservabilityStoragePostgresVNext
18935
18968
  "logs",
18936
18969
  "delta-polling",
18937
18970
  "trace-query",
18971
+ "trace-query-root-duration",
18938
18972
  "trace-query-discovery",
18939
18973
  "thread-query",
18940
18974
  "trace-query-tenant-scope"
@@ -19252,7 +19286,7 @@ var PromptBlocksPG = class PromptBlocksPG extends PromptBlocksStorage {
19252
19286
  "draft",
19253
19287
  null,
19254
19288
  promptBlock.authorId ?? null,
19255
- promptBlock.metadata ? JSON.stringify(promptBlock.metadata) : null,
19289
+ promptBlock.metadata ? toPgJson(promptBlock.metadata) : null,
19256
19290
  nowIso,
19257
19291
  nowIso,
19258
19292
  nowIso,
@@ -19331,7 +19365,7 @@ var PromptBlocksPG = class PromptBlocksPG extends PromptBlocksStorage {
19331
19365
  ...metadata
19332
19366
  };
19333
19367
  setClauses.push(`metadata = $${paramIndex++}`);
19334
- values.push(JSON.stringify(mergedMetadata));
19368
+ values.push(toPgJson(mergedMetadata));
19335
19369
  }
19336
19370
  const now = (/* @__PURE__ */ new Date()).toISOString();
19337
19371
  setClauses.push(`"updatedAt" = $${paramIndex++}`);
@@ -19406,7 +19440,7 @@ var PromptBlocksPG = class PromptBlocksPG extends PromptBlocksStorage {
19406
19440
  }
19407
19441
  if (metadata && Object.keys(metadata).length > 0) {
19408
19442
  conditions.push(`metadata @> $${paramIdx++}::jsonb`);
19409
- queryParams.push(JSON.stringify(metadata));
19443
+ queryParams.push(toPgJson(metadata));
19410
19444
  }
19411
19445
  const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
19412
19446
  const countResult = await this.#db.readClient.one(`SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`, queryParams);
@@ -19469,9 +19503,9 @@ var PromptBlocksPG = class PromptBlocksPG extends PromptBlocksStorage {
19469
19503
  input.name,
19470
19504
  input.description ?? null,
19471
19505
  input.content,
19472
- input.rules ? JSON.stringify(input.rules) : null,
19473
- input.requestContextSchema ? JSON.stringify(input.requestContextSchema) : null,
19474
- input.changedFields ? JSON.stringify(input.changedFields) : null,
19506
+ input.rules ? toPgJson(input.rules) : null,
19507
+ input.requestContextSchema ? toPgJson(input.requestContextSchema) : null,
19508
+ input.changedFields ? toPgJson(input.changedFields) : null,
19475
19509
  input.changeMessage ?? null,
19476
19510
  nowIso,
19477
19511
  nowIso
@@ -19978,8 +20012,8 @@ var SchedulesPG = class SchedulesPG extends SchedulesStorage {
19978
20012
  if ("timezone" in patch) push("timezone = ?", patch.timezone ?? null);
19979
20013
  if ("status" in patch && patch.status !== void 0) push("status = ?", patch.status);
19980
20014
  if ("nextFireAt" in patch && patch.nextFireAt !== void 0) push("next_fire_at = ?", patch.nextFireAt);
19981
- if ("target" in patch && patch.target !== void 0) push("target = ?::jsonb", JSON.stringify(patch.target));
19982
- if ("metadata" in patch) push("metadata = ?::jsonb", patch.metadata != null ? JSON.stringify(patch.metadata) : null);
20015
+ if ("target" in patch && patch.target !== void 0) push("target = ?::jsonb", toPgJson(patch.target));
20016
+ if ("metadata" in patch) push("metadata = ?::jsonb", patch.metadata != null ? toPgJson(patch.metadata) : null);
19983
20017
  if ("ownerType" in patch) push("owner_type = ?", patch.ownerType ?? null);
19984
20018
  if ("ownerId" in patch) push("owner_id = ?", patch.ownerId ?? null);
19985
20019
  push("updated_at = ?", Date.now());
@@ -20197,7 +20231,7 @@ var ScorerDefinitionsPG = class ScorerDefinitionsPG extends ScorerDefinitionsSto
20197
20231
  scorerDefinition.authorId ?? null,
20198
20232
  scorerDefinition.organizationId ?? null,
20199
20233
  scorerDefinition.projectId ?? null,
20200
- scorerDefinition.metadata ? JSON.stringify(scorerDefinition.metadata) : null,
20234
+ scorerDefinition.metadata ? toPgJson(scorerDefinition.metadata) : null,
20201
20235
  nowIso,
20202
20236
  nowIso,
20203
20237
  nowIso,
@@ -20278,7 +20312,7 @@ var ScorerDefinitionsPG = class ScorerDefinitionsPG extends ScorerDefinitionsSto
20278
20312
  ...metadata
20279
20313
  };
20280
20314
  setClauses.push(`metadata = $${paramIndex++}`);
20281
- values.push(JSON.stringify(mergedMetadata));
20315
+ values.push(toPgJson(mergedMetadata));
20282
20316
  }
20283
20317
  const now = (/* @__PURE__ */ new Date()).toISOString();
20284
20318
  setClauses.push(`"updatedAt" = $${paramIndex++}`);
@@ -20361,7 +20395,7 @@ var ScorerDefinitionsPG = class ScorerDefinitionsPG extends ScorerDefinitionsSto
20361
20395
  }
20362
20396
  if (metadata && Object.keys(metadata).length > 0) {
20363
20397
  conditions.push(`metadata @> $${paramIdx++}::jsonb`);
20364
- queryParams.push(JSON.stringify(metadata));
20398
+ queryParams.push(toPgJson(metadata));
20365
20399
  }
20366
20400
  const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
20367
20401
  const countResult = await this.#db.readClient.one(`SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`, queryParams);
@@ -20424,12 +20458,12 @@ var ScorerDefinitionsPG = class ScorerDefinitionsPG extends ScorerDefinitionsSto
20424
20458
  input.name,
20425
20459
  input.description ?? null,
20426
20460
  input.type,
20427
- input.model ? JSON.stringify(input.model) : null,
20461
+ input.model ? toPgJson(input.model) : null,
20428
20462
  input.instructions ?? null,
20429
- input.scoreRange ? JSON.stringify(input.scoreRange) : null,
20430
- input.presetConfig ? JSON.stringify(input.presetConfig) : null,
20431
- input.defaultSampling ? JSON.stringify(input.defaultSampling) : null,
20432
- input.changedFields ? JSON.stringify(input.changedFields) : null,
20463
+ input.scoreRange ? toPgJson(input.scoreRange) : null,
20464
+ input.presetConfig ? toPgJson(input.presetConfig) : null,
20465
+ input.defaultSampling ? toPgJson(input.defaultSampling) : null,
20466
+ input.changedFields ? toPgJson(input.changedFields) : null,
20433
20467
  input.changeMessage ?? null,
20434
20468
  nowIso,
20435
20469
  nowIso
@@ -20949,15 +20983,15 @@ var ScoresPG = class ScoresPG extends ScoresStorage {
20949
20983
  record: {
20950
20984
  id,
20951
20985
  ...rest,
20952
- input: JSON.stringify(input) || "",
20953
- output: JSON.stringify(output) || "",
20954
- scorer: scorer ? JSON.stringify(scorer) : null,
20955
- preprocessStepResult: preprocessStepResult ? JSON.stringify(preprocessStepResult) : null,
20956
- analyzeStepResult: analyzeStepResult ? JSON.stringify(analyzeStepResult) : null,
20957
- metadata: metadata ? JSON.stringify(metadata) : null,
20958
- additionalContext: additionalContext ? JSON.stringify(additionalContext) : null,
20959
- requestContext: requestContext ? JSON.stringify(requestContext) : null,
20960
- entity: entity ? JSON.stringify(entity) : null,
20986
+ input: toPgJson(input) || "",
20987
+ output: toPgJson(output) || "",
20988
+ scorer: scorer ? toPgJson(scorer) : null,
20989
+ preprocessStepResult: preprocessStepResult ? toPgJson(preprocessStepResult) : null,
20990
+ analyzeStepResult: analyzeStepResult ? toPgJson(analyzeStepResult) : null,
20991
+ metadata: metadata ? toPgJson(metadata) : null,
20992
+ additionalContext: additionalContext ? toPgJson(additionalContext) : null,
20993
+ requestContext: requestContext ? toPgJson(requestContext) : null,
20994
+ entity: entity ? toPgJson(entity) : null,
20961
20995
  createdAt: now.toISOString(),
20962
20996
  updatedAt: now.toISOString()
20963
20997
  }
@@ -21542,15 +21576,15 @@ var SkillsPG = class SkillsPG extends SkillsStorage {
21542
21576
  input.description ?? null,
21543
21577
  input.instructions ?? null,
21544
21578
  input.license ?? null,
21545
- input.compatibility ? JSON.stringify(input.compatibility) : null,
21546
- input.source ? JSON.stringify(input.source) : null,
21547
- input.references ? JSON.stringify(input.references) : null,
21548
- input.scripts ? JSON.stringify(input.scripts) : null,
21549
- input.assets ? JSON.stringify(input.assets) : null,
21550
- input.files ? JSON.stringify(input.files) : null,
21551
- input.metadata ? JSON.stringify(input.metadata) : null,
21552
- input.tree ? JSON.stringify(input.tree) : null,
21553
- input.changedFields ? JSON.stringify(input.changedFields) : null,
21579
+ input.compatibility ? toPgJson(input.compatibility) : null,
21580
+ input.source ? toPgJson(input.source) : null,
21581
+ input.references ? toPgJson(input.references) : null,
21582
+ input.scripts ? toPgJson(input.scripts) : null,
21583
+ input.assets ? toPgJson(input.assets) : null,
21584
+ input.files ? toPgJson(input.files) : null,
21585
+ input.metadata ? toPgJson(input.metadata) : null,
21586
+ input.tree ? toPgJson(input.tree) : null,
21587
+ input.changedFields ? toPgJson(input.changedFields) : null,
21554
21588
  input.changeMessage ?? null,
21555
21589
  nowIso,
21556
21590
  nowIso
@@ -21926,7 +21960,7 @@ var ThreadStatePG = class ThreadStatePG extends ThreadStateStorage {
21926
21960
  }
21927
21961
  async setState({ threadId, type, value }) {
21928
21962
  const now = (/* @__PURE__ */ new Date()).toISOString();
21929
- const serialized = JSON.stringify(value ?? null);
21963
+ const serialized = toPgJson(value ?? null);
21930
21964
  try {
21931
21965
  await this.#db.client.none(`INSERT INTO ${this.#table} ("threadId", "type", "value", "createdAt", "createdAtZ", "updatedAt", "updatedAtZ")
21932
21966
  VALUES ($1, $2, $3::jsonb, $4::timestamp, $5::timestamptz, $4::timestamp, $5::timestamptz)
@@ -22703,7 +22737,7 @@ var WorkflowsPG = class WorkflowsPG extends WorkflowsStorage {
22703
22737
  requestContext
22704
22738
  });
22705
22739
  const now = /* @__PURE__ */ new Date();
22706
- const sanitizedSnapshot = sanitizeJsonForPg(JSON.stringify(snapshot));
22740
+ const sanitizedSnapshot = toPgJson(snapshot);
22707
22741
  await t.none(`INSERT INTO ${tableName}
22708
22742
  (workflow_name, run_id, snapshot, "createdAt", "updatedAt", "createdAtZ", "updatedAtZ")
22709
22743
  VALUES ($1, $2, $3, $4, $5, $6, $7)
@@ -22750,7 +22784,7 @@ var WorkflowsPG = class WorkflowsPG extends WorkflowsStorage {
22750
22784
  ...snapshot,
22751
22785
  ...state
22752
22786
  };
22753
- const sanitizedSnapshot = sanitizeJsonForPg(JSON.stringify(updatedSnapshot));
22787
+ const sanitizedSnapshot = toPgJson(updatedSnapshot);
22754
22788
  const now = /* @__PURE__ */ new Date();
22755
22789
  await t.none(`UPDATE ${tableName}
22756
22790
  SET snapshot = $1, "updatedAt" = $2, "updatedAtZ" = $3
@@ -22780,7 +22814,7 @@ var WorkflowsPG = class WorkflowsPG extends WorkflowsStorage {
22780
22814
  const now = /* @__PURE__ */ new Date();
22781
22815
  const createdAtValue = createdAt ? createdAt : now;
22782
22816
  const updatedAtValue = updatedAt ? updatedAt : now;
22783
- const sanitizedSnapshot = sanitizeJsonForPg(JSON.stringify(snapshot));
22817
+ const sanitizedSnapshot = toPgJson(snapshot);
22784
22818
  await this.#db.client.none(`INSERT INTO ${getTableName({
22785
22819
  indexName: TABLE_WORKFLOW_SNAPSHOT,
22786
22820
  schemaName: getSchemaName(this.#schema)
@@ -23092,7 +23126,7 @@ var WorkspacesPG = class WorkspacesPG extends WorkspacesStorage {
23092
23126
  "draft",
23093
23127
  null,
23094
23128
  workspace.authorId ?? null,
23095
- workspace.metadata ? JSON.stringify(workspace.metadata) : null,
23129
+ workspace.metadata ? toPgJson(workspace.metadata) : null,
23096
23130
  nowIso,
23097
23131
  nowIso,
23098
23132
  nowIso,
@@ -23167,7 +23201,11 @@ var WorkspacesPG = class WorkspacesPG extends WorkspacesStorage {
23167
23201
  ...latestConfig,
23168
23202
  ...configFields
23169
23203
  };
23170
- const changedFields = SNAPSHOT_FIELDS.filter((field) => field in configFields && JSON.stringify(configFields[field]) !== JSON.stringify(latestConfig[field]));
23204
+ const normalized = (value) => {
23205
+ const json = toPgJson(value);
23206
+ return json === void 0 ? void 0 : JSON.parse(json);
23207
+ };
23208
+ const changedFields = SNAPSHOT_FIELDS.filter((field) => field in configFields && !isDeepStrictEqual(normalized(configFields[field]), normalized(latestConfig[field])));
23171
23209
  if (changedFields.length > 0) {
23172
23210
  versionCreated = true;
23173
23211
  const newVersionId = crypto.randomUUID();
@@ -23201,12 +23239,13 @@ var WorkspacesPG = class WorkspacesPG extends WorkspacesStorage {
23201
23239
  values.push(status);
23202
23240
  }
23203
23241
  if (metadata !== void 0) {
23242
+ const normalizedMetadata = JSON.parse(toPgJson(metadata));
23204
23243
  const mergedMetadata = {
23205
23244
  ...existingWorkspace.metadata || {},
23206
- ...metadata
23245
+ ...normalizedMetadata
23207
23246
  };
23208
23247
  setClauses.push(`metadata = $${paramIndex++}`);
23209
- values.push(JSON.stringify(mergedMetadata));
23248
+ values.push(toPgJson(mergedMetadata));
23210
23249
  }
23211
23250
  const now = (/* @__PURE__ */ new Date()).toISOString();
23212
23251
  setClauses.push(`"updatedAt" = $${paramIndex++}`);
@@ -23277,7 +23316,7 @@ var WorkspacesPG = class WorkspacesPG extends WorkspacesStorage {
23277
23316
  }
23278
23317
  if (metadata && Object.keys(metadata).length > 0) {
23279
23318
  conditions.push(`metadata @> $${paramIdx++}::jsonb`);
23280
- queryParams.push(JSON.stringify(metadata));
23319
+ queryParams.push(toPgJson(metadata));
23281
23320
  }
23282
23321
  const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
23283
23322
  const countResult = await this.#db.readClient.one(`SELECT COUNT(*) as count FROM ${tableName} ${whereClause}`, queryParams);
@@ -23340,15 +23379,15 @@ var WorkspacesPG = class WorkspacesPG extends WorkspacesStorage {
23340
23379
  input.versionNumber,
23341
23380
  input.name,
23342
23381
  input.description ?? null,
23343
- input.filesystem ? JSON.stringify(input.filesystem) : null,
23344
- input.sandbox ? JSON.stringify(input.sandbox) : null,
23345
- input.mounts ? JSON.stringify(input.mounts) : null,
23346
- input.search ? JSON.stringify(input.search) : null,
23347
- input.skills ? JSON.stringify(input.skills) : null,
23348
- input.tools ? JSON.stringify(input.tools) : null,
23382
+ input.filesystem ? toPgJson(input.filesystem) : null,
23383
+ input.sandbox ? toPgJson(input.sandbox) : null,
23384
+ input.mounts ? toPgJson(input.mounts) : null,
23385
+ input.search ? toPgJson(input.search) : null,
23386
+ input.skills ? toPgJson(input.skills) : null,
23387
+ input.tools ? toPgJson(input.tools) : null,
23349
23388
  input.autoSync ?? false,
23350
23389
  input.operationTimeout ?? null,
23351
- input.changedFields ? JSON.stringify(input.changedFields) : null,
23390
+ input.changedFields ? toPgJson(input.changedFields) : null,
23352
23391
  input.changeMessage ?? null,
23353
23392
  nowIso,
23354
23393
  nowIso
@@ -23640,7 +23679,7 @@ var PgFactoryStorageOps = class {
23640
23679
  switch (spec.type) {
23641
23680
  case "timestamp": return value instanceof Date ? value : new Date(String(value));
23642
23681
  case "boolean": return Boolean(value);
23643
- case "json": return JSON.stringify(value);
23682
+ case "json": return toPgJson(value);
23644
23683
  case "bigint":
23645
23684
  case "integer": return Number(value);
23646
23685
  default: return String(value);