建立ToolDbProcessPort合约层

结论:已新增ToolDbProcessPort合约、OPFS tool DB flat-file/transcript store和Node/WASM gates,baseline保持28/28/131/0且promotion继续锁定。
This commit is contained in:
2026-06-19 06:36:26 +08:00
parent d9ac3770a7
commit d8e0196c61
13 changed files with 711 additions and 0 deletions

View File

@@ -0,0 +1,69 @@
import assert from "node:assert/strict";
import { readFileSync } from "node:fs";
import { resolve } from "node:path";
import {
createLinuxCncToolDbProcessPort,
createToolDbProcessDiagnostics,
createToolDbTransactionPlan,
validateToolDbTranscript,
} from "../../../runtime/sdk/src/tool-db-process-port.js";
import {
createToolDbStorePaths,
} from "../../../runtime/opfs/tool-db-store.js";
const iniText = readFileSync(
resolve("linuxcnc/configs/sim/axis/db_demo/db_nonran.ini"),
"utf8",
);
assert.match(iniText, /DB_PROGRAM\s*=\s*\.\/db_nonran\.py/);
const plan = createToolDbTransactionPlan();
assert.equal(plan.length, 5);
assert.equal(plan[0].expect, "v2.1");
assert.equal(plan.some((step) => step.line === "g"), true);
assert.equal(plan.some((step) => step.line === "p t11 p111 d0.33 z0.11"), true);
assert.equal(plan.some((step) => step.line === "l t14 p0"), true);
assert.equal(plan.some((step) => step.line === "u t0 p0"), true);
const port = createLinuxCncToolDbProcessPort({
dbProgramPath: "./db_nonran.py",
sourceFiles: [
"configs/sim/axis/db_demo/db_nonran.py",
"configs/sim/axis/db_demo/db.py",
"lib/python/tooldb.py",
],
runtimeMode: "contract-only",
});
assert.equal((await port.start()).runtimeExecutionReady, false);
assert.equal((await port.runTransactionPlan()).status, "blocked_runtime_adapter_required");
const transcript = [
{ direction: "read", line: "v2.1" },
{ direction: "write", line: "g" },
{ direction: "read", line: "T10 P110 D0.10 Z0.10" },
{ direction: "read", line: "FINI (get_cmd)" },
{ direction: "write", line: "p t11 p111 d0.33 z0.11" },
{ direction: "write", line: "l t14 p0" },
{ direction: "write", line: "u t0 p0" },
];
assert.equal(validateToolDbTranscript(transcript).ready, true);
const paths = createToolDbStorePaths("db-demo", { runId: "run-1" });
assert.equal(paths.dbFile, "linuxcnc/machines/db-demo/tool-db/db_nonran_file");
assert.equal(paths.transcript, "linuxcnc/machines/db-demo/tool-db/transcripts/run-1/transcript.json");
const diagnostics = createToolDbProcessDiagnostics({
dbProgramPath: "./db_nonran.py",
opfsDbPath: "/machines/db-demo/tool-db/db_nonran_file",
transcript,
dbFileText: "T11 P111 D0.33 Z0.11\n",
startupToolCount: 10,
mutationCount: 3,
});
assert.equal(diagnostics.tblFallbackSufficient, false);
assert.equal(diagnostics.runtimeExecutionReady, false);
assert.equal(diagnostics.executionEnabled, false);
assert.equal(diagnostics.promotionAllowed, false);
console.log("tool_db_process_port_wasm=ok");

View File

@@ -0,0 +1,6 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/../../.." && pwd)"
node "$ROOT_DIR/tests/wasm/node/verify_tool_db_process_port_wasm.mjs"