import { randomUUID } from "node:crypto" ;
import { describe, expect, it } from "vitest" ;
import { getSkillsSnapshotVersion, resetSkillsRefreshForTest } from "../agents/skills/refresh.js" ;
import {
getRemoteSkillEligibility,
recordRemoteNodeBins,
recordRemoteNodeInfo,
removeRemoteNodeInfo,
} from "./skills-remote.js" ;
describe("skills-remote" , () => {
it("removes disconnected nodes from remote skill eligibility" , () => {
const nodeId = `node-${randomUUID()}`;
const bin = `bin-${randomUUID()}`;
recordRemoteNodeInfo({
nodeId,
displayName: "Remote Mac" ,
platform: "darwin" ,
commands: ["system.run" ],
});
recordRemoteNodeBins(nodeId, [bin]);
expect(getRemoteSkillEligibility()?.hasBin(bin)).toBe(true );
removeRemoteNodeInfo(nodeId);
expect(getRemoteSkillEligibility()?.hasBin(bin) ?? false ).toBe(false );
});
it("supports idempotent remote node removal" , () => {
const nodeId = `node-${randomUUID()}`;
expect(() => {
removeRemoteNodeInfo(nodeId);
removeRemoteNodeInfo(nodeId);
}).not.toThrow();
});
it("bumps the skills snapshot version when an eligible remote node disconnects" , async () => {
await resetSkillsRefreshForTest();
const workspaceDir = `/tmp/ws-${randomUUID()}`;
const nodeId = `node-${randomUUID()}`;
recordRemoteNodeInfo({
nodeId,
displayName: "Remote Mac" ,
platform: "darwin" ,
commands: ["system.run" ],
});
const before = getSkillsSnapshotVersion(workspaceDir);
removeRemoteNodeInfo(nodeId);
const after = getSkillsSnapshotVersion(workspaceDir);
expect(after).toBeGreaterThan(before);
});
it("ignores non-mac and non-system.run nodes for eligibility" , () => {
const linuxNodeId = `node-${randomUUID()}`;
const noRunNodeId = `node-${randomUUID()}`;
const bin = `bin-${randomUUID()}`;
try {
recordRemoteNodeInfo({
nodeId: linuxNodeId,
displayName: "Linux Box" ,
platform: "linux" ,
commands: ["system.run" ],
});
recordRemoteNodeBins(linuxNodeId, [bin]);
recordRemoteNodeInfo({
nodeId: noRunNodeId,
displayName: "Remote Mac" ,
platform: "darwin" ,
commands: ["system.which" ],
});
recordRemoteNodeBins(noRunNodeId, [bin]);
expect(getRemoteSkillEligibility()).toBeUndefined();
} finally {
removeRemoteNodeInfo(linuxNodeId);
removeRemoteNodeInfo(noRunNodeId);
}
});
it("aggregates bins and note labels across eligible mac nodes" , () => {
const nodeA = `node-${randomUUID()}`;
const nodeB = `node-${randomUUID()}`;
const binA = `bin-${randomUUID()}`;
const binB = `bin-${randomUUID()}`;
try {
recordRemoteNodeInfo({
nodeId: nodeA,
displayName: "Mac Studio" ,
platform: "darwin" ,
commands: ["system.run" ],
});
recordRemoteNodeBins(nodeA, [binA]);
recordRemoteNodeInfo({
nodeId: nodeB,
platform: "macOS" ,
commands: ["system.run" ],
});
recordRemoteNodeBins(nodeB, [binB]);
const eligibility = getRemoteSkillEligibility();
expect(eligibility?.platforms).toEqual(["darwin" ]);
expect(eligibility?.hasBin(binA)).toBe(true );
expect(eligibility?.hasAnyBin([`missing-${randomUUID()}`, binB])).toBe(true );
expect(eligibility?.note).toContain("Mac Studio" );
expect(eligibility?.note).toContain(nodeB);
} finally {
removeRemoteNodeInfo(nodeA);
removeRemoteNodeInfo(nodeB);
}
});
it("suppresses the exec host=node note when routing is not allowed" , () => {
const nodeId = `node-${randomUUID()}`;
const bin = `bin-${randomUUID()}`;
try {
recordRemoteNodeInfo({
nodeId,
displayName: "Mac Studio" ,
platform: "darwin" ,
commands: ["system.run" ],
});
recordRemoteNodeBins(nodeId, [bin]);
const eligibility = getRemoteSkillEligibility({ advertiseExecNode: false });
expect(eligibility?.hasBin(bin)).toBe(true );
expect(eligibility?.note).toBeUndefined();
} finally {
removeRemoteNodeInfo(nodeId);
}
});
});
Messung V0.5 in Prozent C=100 H=100 G=100
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-09)
¤
*© Formatika GbR, Deutschland