From 76f67f096e081a299ce6058e8c41ca674f751cdd Mon Sep 17 00:00:00 2001 From: Jyong Date: Tue, 28 Jul 2026 06:34:02 -0400 Subject: [PATCH] fix(knowledge-fs): decode freeze bigint evidence --- ...gration-freeze-database-repository.test.ts | 28 +++++++++++++++++++ ...-integration-freeze-database-repository.ts | 6 ++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/knowledge-fs/packages/api/src/dify-integration-freeze-database-repository.test.ts b/knowledge-fs/packages/api/src/dify-integration-freeze-database-repository.test.ts index 4f8d76c17d2..8582f504fbe 100644 --- a/knowledge-fs/packages/api/src/dify-integration-freeze-database-repository.test.ts +++ b/knowledge-fs/packages/api/src/dify-integration-freeze-database-repository.test.ts @@ -64,6 +64,34 @@ describe.each(["postgres", "tidb"] as const)("database Dify integration freeze ( ).resolves.toMatchObject({ applied: false, replayed: true }); script.expectDone(); }); + + it("accepts safe bigint freeze values returned as decimal strings", async () => { + const script = scriptedDatabase(dialect, [ + { + operation: "select", + rows: [{ ...stateRow(), freeze_revision: "7", source_task_watermark: "12" }], + }, + ]); + + await expect( + createDatabaseDifyIntegrationFreezeRepository({ database: script.database }).get("tenant-a"), + ).resolves.toMatchObject({ freezeRevision: 7, sourceTaskWatermark: 12 }); + script.expectDone(); + }); + + it("rejects bigint freeze values outside JavaScript's safe integer range", async () => { + const script = scriptedDatabase(dialect, [ + { + operation: "select", + rows: [{ ...stateRow(), freeze_revision: "9007199254740992" }], + }, + ]); + + await expect( + createDatabaseDifyIntegrationFreezeRepository({ database: script.database }).get("tenant-a"), + ).rejects.toThrow("nonnegative safe integer"); + script.expectDone(); + }); }); interface ScriptStep { diff --git a/knowledge-fs/packages/api/src/dify-integration-freeze-database-repository.ts b/knowledge-fs/packages/api/src/dify-integration-freeze-database-repository.ts index b0d700e7b5b..cf0548fc934 100644 --- a/knowledge-fs/packages/api/src/dify-integration-freeze-database-repository.ts +++ b/knowledge-fs/packages/api/src/dify-integration-freeze-database-repository.ts @@ -5,7 +5,7 @@ import type { DatabaseRow, } from "@knowledge/core"; -import { numberColumn, stringColumn } from "./database-row-utils"; +import { nonnegativeSafeIntegerColumn, stringColumn } from "./database-row-utils"; import { databasePlaceholder, quoteDatabaseIdentifier } from "./database-sql-utils"; import { DifyIntegrationFreezeConflictError, @@ -154,11 +154,11 @@ async function updateState( function stateFromRow(row: DatabaseRow): DifyIntegrationFreezeState { const state = { freezeId: stringColumn(row, "freeze_id"), - freezeRevision: numberColumn(row, "freeze_revision"), + freezeRevision: nonnegativeSafeIntegerColumn(row, "freeze_revision"), frozenAt: stringColumn(row, "frozen_at"), namespaceId: stringColumn(row, "tenant_id"), sourceRevisionDigest: stringColumn(row, "source_revision_digest"), - sourceTaskWatermark: numberColumn(row, "source_task_watermark"), + sourceTaskWatermark: nonnegativeSafeIntegerColumn(row, "source_task_watermark"), updatedAt: stringColumn(row, "updated_at"), }; assertDifyIntegrationFreezeState(state);