b7fea83ed6
Deliver the initial local bridge, Noctalia v4/v5 adapters, desktop client, service unit, tests, and implementation documentation for persistent Pi status and control.
74 lines
1.9 KiB
JavaScript
74 lines
1.9 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { mkdir, mkdtemp } from "node:fs/promises";
|
|
import { tmpdir } from "node:os";
|
|
import { join } from "node:path";
|
|
import test from "node:test";
|
|
import { startBridgeDaemon } from "../src/bridge/daemon.js";
|
|
import { createNoctaliaStateRelay } from "../src/client/noctalia-relay.js";
|
|
|
|
test("starts a bridge daemon around the local bridge service", async () => {
|
|
const root = await mkdtemp(join(tmpdir(), "pi-status-bridge-daemon-"));
|
|
const home = join(root, "home");
|
|
await mkdir(home);
|
|
const daemon = await startBridgeDaemon({
|
|
homeWorktree: home,
|
|
runtimeDir: join(root, "runtime"),
|
|
sessionRoot: join(root, "sessions"),
|
|
startAdapter: () => ({
|
|
send: async () => ({ type: "response", success: true }),
|
|
respondToExtension: () => {},
|
|
stop: async () => {},
|
|
}),
|
|
});
|
|
try {
|
|
assert.match(daemon.socketPath, /bridge\.sock$/);
|
|
assert.equal(daemon.listAgents()[0].worktreePath, home);
|
|
} finally {
|
|
await daemon.close();
|
|
}
|
|
});
|
|
|
|
test("relays only the selected agent's bridge state into a presentation update", async () => {
|
|
let listener;
|
|
const updates = [];
|
|
const relay = createNoctaliaStateRelay({
|
|
client: {
|
|
request: async () => ({ data: { isStreaming: false } }),
|
|
subscribe: async (_agentId, _cursor, callback) => {
|
|
listener = callback;
|
|
return () => {};
|
|
},
|
|
},
|
|
agent: { id: "agent-1", worktreePath: "/worktrees/feature" },
|
|
onState: (state) => updates.push(state),
|
|
});
|
|
|
|
await relay.start();
|
|
listener({ type: "agent_state", data: { state: "streaming" } });
|
|
listener({
|
|
type: "queue",
|
|
data: { event: { steering: ["focus"], followUp: [] } },
|
|
});
|
|
|
|
assert.deepEqual(updates, [
|
|
{
|
|
state: "idle",
|
|
projectLabel: "feature",
|
|
attentionCount: 0,
|
|
detail: "Idle",
|
|
},
|
|
{
|
|
state: "streaming",
|
|
projectLabel: "feature",
|
|
attentionCount: 0,
|
|
detail: "Streaming",
|
|
},
|
|
{
|
|
state: "streaming",
|
|
projectLabel: "feature",
|
|
attentionCount: 1,
|
|
detail: "Streaming",
|
|
},
|
|
]);
|
|
});
|