mirror of
https://github.com/Youzini-afk/ST-Bionic-Memory-Ecology.git
synced 2026-06-14 02:40:45 +08:00
199 lines
5.5 KiB
JavaScript
199 lines
5.5 KiB
JavaScript
// ST-BME restrained rebirth — Phase 1 identity resolver characterization.
|
|
|
|
import assert from "node:assert/strict";
|
|
import {
|
|
areChatIdsEquivalentForIdentityCore,
|
|
canMutateRuntimeGraphForIdentityCore,
|
|
doesChatIdMatchIdentityCore,
|
|
planRuntimeGraphIdentityRepairCore,
|
|
resolveActiveHostChatIdCore,
|
|
resolveCurrentChatIdentityCore,
|
|
resolveGraphOwnerIdentityCore,
|
|
resolvePersistenceChatIdCore,
|
|
resolveRuntimeGraphFallbackIdentityCore,
|
|
} from "../runtime/identity-resolver.js";
|
|
|
|
const context = {
|
|
chatId: "host-chat",
|
|
chatMetadata: {
|
|
integrity: "integrity-chat",
|
|
},
|
|
chat: [{ mes: "hello" }],
|
|
};
|
|
|
|
assert.equal(resolveActiveHostChatIdCore({ context }), "host-chat");
|
|
|
|
const activeIdentity = resolveCurrentChatIdentityCore({
|
|
context,
|
|
resolveAliasByHostChatId: () => "alias-chat",
|
|
});
|
|
assert.deepEqual(activeIdentity, {
|
|
chatId: "integrity-chat",
|
|
hostChatId: "host-chat",
|
|
integrity: "integrity-chat",
|
|
identitySource: "integrity",
|
|
hasLikelySelectedChat: true,
|
|
});
|
|
|
|
const aliasIdentity = resolveCurrentChatIdentityCore({
|
|
context: { chatId: "host-only", chatMetadata: {}, characterId: "1" },
|
|
resolveAliasByHostChatId: () => "persisted-by-alias",
|
|
});
|
|
assert.equal(aliasIdentity.chatId, "persisted-by-alias");
|
|
assert.equal(aliasIdentity.identitySource, "alias");
|
|
|
|
console.log(" ✓ active identity is resolved from context and aliases only");
|
|
|
|
const graph = { historyState: { chatId: "graph-chat" } };
|
|
const graphMeta = { chatId: "meta-chat", integrity: "meta-integrity" };
|
|
assert.deepEqual(resolveGraphOwnerIdentityCore({ graph, graphMeta }), {
|
|
chatId: "graph-chat",
|
|
source: "history-state",
|
|
integrity: "meta-integrity",
|
|
});
|
|
|
|
assert.deepEqual(
|
|
resolveRuntimeGraphFallbackIdentityCore({
|
|
graph: { historyState: {} },
|
|
graphMeta: {},
|
|
persistenceState: {
|
|
chatId: "state-chat",
|
|
queuedPersistChatId: "queued-chat",
|
|
commitMarker: { chatId: "marker-chat" },
|
|
},
|
|
}),
|
|
{ chatId: "state-chat", source: "runtime-fallback" },
|
|
);
|
|
|
|
assert.equal(
|
|
resolvePersistenceChatIdCore({
|
|
explicitChatId: "",
|
|
activeIdentity: { chatId: "" },
|
|
graph: { historyState: { chatId: "graph-owned" } },
|
|
graphMeta: {},
|
|
persistenceState: { chatId: "state-chat" },
|
|
}),
|
|
"graph-owned",
|
|
);
|
|
|
|
console.log(" ✓ graph-owner and runtime fallback identities stay separate");
|
|
|
|
const identity = {
|
|
chatId: "integrity-chat",
|
|
hostChatId: "host-chat",
|
|
integrity: "integrity-chat",
|
|
};
|
|
const aliasCandidates = ["alias-chat", "old-host-chat"];
|
|
assert.equal(doesChatIdMatchIdentityCore("old-host-chat", { identity, aliasCandidates }), true);
|
|
assert.equal(doesChatIdMatchIdentityCore("other-chat", { identity, aliasCandidates }), false);
|
|
assert.equal(
|
|
areChatIdsEquivalentForIdentityCore("host-chat", "old-host-chat", {
|
|
identity,
|
|
aliasCandidates,
|
|
}),
|
|
true,
|
|
);
|
|
|
|
console.log(" ✓ equivalence uses explicit identity evidence and aliases");
|
|
|
|
assert.equal(
|
|
canMutateRuntimeGraphForIdentityCore({
|
|
graph: { historyState: { chatId: "integrity-chat" } },
|
|
activeIdentity: identity,
|
|
graphOwnedChatId: "integrity-chat",
|
|
persistenceState: { loadState: "loaded" },
|
|
}),
|
|
true,
|
|
);
|
|
|
|
assert.equal(
|
|
canMutateRuntimeGraphForIdentityCore({
|
|
graph: { historyState: { chatId: "graph-chat" } },
|
|
activeIdentity: { chatId: "" },
|
|
graphOwnedChatId: "graph-chat",
|
|
persistenceState: {
|
|
chatId: "graph-chat",
|
|
commitMarker: { chatId: "other-chat" },
|
|
loadState: "no-chat",
|
|
dbReady: false,
|
|
},
|
|
allowNoChatState: true,
|
|
}),
|
|
false,
|
|
"wrong-chat commit marker must block no-chat mutation fallback",
|
|
);
|
|
|
|
assert.equal(
|
|
canMutateRuntimeGraphForIdentityCore({
|
|
graph: { historyState: { chatId: "graph-chat" } },
|
|
activeIdentity: { chatId: "" },
|
|
graphOwnedChatId: "graph-chat",
|
|
persistenceState: {
|
|
chatId: "graph-chat",
|
|
commitMarker: { chatId: "graph-chat" },
|
|
loadState: "no-chat",
|
|
dbReady: false,
|
|
},
|
|
allowNoChatState: true,
|
|
}),
|
|
true,
|
|
);
|
|
|
|
console.log(" ✓ runtime mutation fallback preserves no-chat safety checks");
|
|
|
|
assert.deepEqual(
|
|
planRuntimeGraphIdentityRepairCore({
|
|
graph: { historyState: {} },
|
|
graphOwnedChatId: "",
|
|
stateChatId: "state-chat",
|
|
activeIdentity: { chatId: "" },
|
|
markerChatId: "state-chat",
|
|
}),
|
|
{ shouldRepair: true, reason: "repair", chatId: "state-chat" },
|
|
);
|
|
|
|
assert.equal(
|
|
planRuntimeGraphIdentityRepairCore({
|
|
graph: { historyState: {} },
|
|
graphOwnedChatId: "",
|
|
stateChatId: "state-chat",
|
|
activeIdentity: { chatId: "live-chat" },
|
|
markerChatId: "state-chat",
|
|
}).reason,
|
|
"live-chat-mismatch",
|
|
);
|
|
|
|
assert.equal(
|
|
planRuntimeGraphIdentityRepairCore({
|
|
graph: { historyState: {} },
|
|
graphOwnedChatId: "",
|
|
stateChatId: "state-chat",
|
|
activeIdentity: { chatId: "" },
|
|
markerChatId: "other-chat",
|
|
}).reason,
|
|
"commit-marker-chat-mismatch",
|
|
);
|
|
|
|
assert.deepEqual(
|
|
planRuntimeGraphIdentityRepairCore({
|
|
graph: { historyState: { chatId: "already-owned" } },
|
|
graphOwnedChatId: "already-owned",
|
|
stateChatId: "state-chat",
|
|
activeIdentity: { chatId: "" },
|
|
}),
|
|
{ shouldRepair: false, reason: "graph-identity-present", chatId: "already-owned" },
|
|
);
|
|
|
|
assert.deepEqual(
|
|
planRuntimeGraphIdentityRepairCore({
|
|
graph: { historyState: {} },
|
|
graphOwnedChatId: "",
|
|
stateChatId: "",
|
|
activeIdentity: { chatId: "" },
|
|
}),
|
|
{ shouldRepair: false, reason: "missing-persistence-chat-id" },
|
|
);
|
|
|
|
console.log(" ✓ graph identity repair is planned only with non-conflicting evidence");
|
|
console.log("identity-resolver tests passed");
|