@seat-mesh/daemon 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/border-paint.d.ts +11 -0
- package/dist/border-paint.d.ts.map +1 -0
- package/dist/border-paint.js +163 -0
- package/dist/border-paint.js.map +1 -0
- package/dist/bullmq-runtime.d.ts +19 -0
- package/dist/bullmq-runtime.d.ts.map +1 -0
- package/dist/bullmq-runtime.js +78 -0
- package/dist/bullmq-runtime.js.map +1 -0
- package/dist/compose-gate.d.ts +18 -0
- package/dist/compose-gate.d.ts.map +1 -0
- package/dist/compose-gate.js +80 -0
- package/dist/compose-gate.js.map +1 -0
- package/dist/compose-gate.test.d.ts +2 -0
- package/dist/compose-gate.test.d.ts.map +1 -0
- package/dist/compose-gate.test.js +35 -0
- package/dist/compose-gate.test.js.map +1 -0
- package/dist/connectivity-recovery.d.ts +81 -0
- package/dist/connectivity-recovery.d.ts.map +1 -0
- package/dist/connectivity-recovery.js +454 -0
- package/dist/connectivity-recovery.js.map +1 -0
- package/dist/connectivity-recovery.test.d.ts +2 -0
- package/dist/connectivity-recovery.test.d.ts.map +1 -0
- package/dist/connectivity-recovery.test.js +147 -0
- package/dist/connectivity-recovery.test.js.map +1 -0
- package/dist/create-queue-store.d.ts +8 -0
- package/dist/create-queue-store.d.ts.map +1 -0
- package/dist/create-queue-store.js +13 -0
- package/dist/create-queue-store.js.map +1 -0
- package/dist/delivery-hold.d.ts +10 -0
- package/dist/delivery-hold.d.ts.map +1 -0
- package/dist/delivery-hold.js +21 -0
- package/dist/delivery-hold.js.map +1 -0
- package/dist/delivery-hold.test.d.ts +2 -0
- package/dist/delivery-hold.test.d.ts.map +1 -0
- package/dist/delivery-hold.test.js +35 -0
- package/dist/delivery-hold.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/inject-delivery.d.ts +26 -0
- package/dist/inject-delivery.d.ts.map +1 -0
- package/dist/inject-delivery.js +108 -0
- package/dist/inject-delivery.js.map +1 -0
- package/dist/inject-delivery.test.d.ts +2 -0
- package/dist/inject-delivery.test.d.ts.map +1 -0
- package/dist/inject-delivery.test.js +14 -0
- package/dist/inject-delivery.test.js.map +1 -0
- package/dist/jsonl-dedupe.test.d.ts +2 -0
- package/dist/jsonl-dedupe.test.d.ts.map +1 -0
- package/dist/jsonl-dedupe.test.js +27 -0
- package/dist/jsonl-dedupe.test.js.map +1 -0
- package/dist/jsonl-store.d.ts +103 -0
- package/dist/jsonl-store.d.ts.map +1 -0
- package/dist/jsonl-store.js +235 -0
- package/dist/jsonl-store.js.map +1 -0
- package/dist/mesh-inbox-server.d.ts +3 -0
- package/dist/mesh-inbox-server.d.ts.map +1 -0
- package/dist/mesh-inbox-server.js +483 -0
- package/dist/mesh-inbox-server.js.map +1 -0
- package/dist/mesh-inbox-supervisor.d.ts +3 -0
- package/dist/mesh-inbox-supervisor.d.ts.map +1 -0
- package/dist/mesh-inbox-supervisor.js +227 -0
- package/dist/mesh-inbox-supervisor.js.map +1 -0
- package/dist/mesh-orchestrator.d.ts +32 -0
- package/dist/mesh-orchestrator.d.ts.map +1 -0
- package/dist/mesh-orchestrator.js +340 -0
- package/dist/mesh-orchestrator.js.map +1 -0
- package/dist/oc-resume-ack.d.ts +32 -0
- package/dist/oc-resume-ack.d.ts.map +1 -0
- package/dist/oc-resume-ack.js +89 -0
- package/dist/oc-resume-ack.js.map +1 -0
- package/dist/oc-resume-ack.test.d.ts +2 -0
- package/dist/oc-resume-ack.test.d.ts.map +1 -0
- package/dist/oc-resume-ack.test.js +23 -0
- package/dist/oc-resume-ack.test.js.map +1 -0
- package/dist/oc-resume.d.ts +25 -0
- package/dist/oc-resume.d.ts.map +1 -0
- package/dist/oc-resume.js +102 -0
- package/dist/oc-resume.js.map +1 -0
- package/dist/orchestrator.d.ts +17 -0
- package/dist/orchestrator.d.ts.map +1 -0
- package/dist/orchestrator.js +11 -0
- package/dist/orchestrator.js.map +1 -0
- package/dist/pane-ops-drain.d.ts +14 -0
- package/dist/pane-ops-drain.d.ts.map +1 -0
- package/dist/pane-ops-drain.js +53 -0
- package/dist/pane-ops-drain.js.map +1 -0
- package/dist/peer-backlog.d.ts +18 -0
- package/dist/peer-backlog.d.ts.map +1 -0
- package/dist/peer-backlog.js +137 -0
- package/dist/peer-backlog.js.map +1 -0
- package/dist/peer-comms-checkback.d.ts +5 -0
- package/dist/peer-comms-checkback.d.ts.map +1 -0
- package/dist/peer-comms-checkback.js +57 -0
- package/dist/peer-comms-checkback.js.map +1 -0
- package/dist/peer-skip.d.ts +10 -0
- package/dist/peer-skip.d.ts.map +1 -0
- package/dist/peer-skip.js +26 -0
- package/dist/peer-skip.js.map +1 -0
- package/dist/peer-skip.test.d.ts +2 -0
- package/dist/peer-skip.test.d.ts.map +1 -0
- package/dist/peer-skip.test.js +33 -0
- package/dist/peer-skip.test.js.map +1 -0
- package/dist/ppa-state.d.ts +32 -0
- package/dist/ppa-state.d.ts.map +1 -0
- package/dist/ppa-state.js +63 -0
- package/dist/ppa-state.js.map +1 -0
- package/dist/sqlite-store.d.ts +44 -0
- package/dist/sqlite-store.d.ts.map +1 -0
- package/dist/sqlite-store.js +422 -0
- package/dist/sqlite-store.js.map +1 -0
- package/dist/sqlite-store.test.d.ts +2 -0
- package/dist/sqlite-store.test.d.ts.map +1 -0
- package/dist/sqlite-store.test.js +63 -0
- package/dist/sqlite-store.test.js.map +1 -0
- package/dist/workers.d.ts +11 -0
- package/dist/workers.d.ts.map +1 -0
- package/dist/workers.js +12 -0
- package/dist/workers.js.map +1 -0
- package/package.json +28 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { chatRoomConfigForLoaded, checkbackTimingForExpect, expectPeerSlotReply, expectRoomCallPending, expectRoomPeerReply, parseDurationToSeconds, } from "@seat-mesh/core";
|
|
2
|
+
function expiresIn(duration, fallbackSec = 300) {
|
|
3
|
+
const sec = parseDurationToSeconds(duration) ?? fallbackSec;
|
|
4
|
+
return new Date(Date.now() + sec * 1000).toISOString();
|
|
5
|
+
}
|
|
6
|
+
function expectForPeerRow(row) {
|
|
7
|
+
const callMatch = row.msg.match(/\.\/sm\.sh room accept ([^\s]+)/);
|
|
8
|
+
if (callMatch?.[1])
|
|
9
|
+
return expectRoomCallPending(callMatch[1]);
|
|
10
|
+
const tailMatch = row.msg.match(/\.\/sm\.sh room tail -r ([^\s]+)/);
|
|
11
|
+
if (tailMatch?.[1] && /\[mesh-peer\] ACCEPTED/i.test(row.msg)) {
|
|
12
|
+
return expectRoomPeerReply(tailMatch[1]);
|
|
13
|
+
}
|
|
14
|
+
if (row.kind === "room" && row.roomSlug) {
|
|
15
|
+
const from = row.fromAgent ?? `worker-${row.fromSlot}`;
|
|
16
|
+
return `${expectRoomPeerReply(row.roomSlug)} from ${from}`;
|
|
17
|
+
}
|
|
18
|
+
if (row.kind === "to-slot" || row.kind === "to-mini") {
|
|
19
|
+
return expectPeerSlotReply(row.fromSlot);
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
/** Arm poll-later on recipient after PEER inject (queued path). */
|
|
24
|
+
export function armRecipientCheckbackAfterPeer(store, loaded, row) {
|
|
25
|
+
if (row.kind !== "room" && row.kind !== "to-slot" && row.kind !== "to-mini")
|
|
26
|
+
return;
|
|
27
|
+
const expect = expectForPeerRow(row);
|
|
28
|
+
if (!expect)
|
|
29
|
+
return;
|
|
30
|
+
const dup = store
|
|
31
|
+
.readCheckbacks()
|
|
32
|
+
.some((r) => r.status === "active" &&
|
|
33
|
+
r.ownerPane === row.targetPane &&
|
|
34
|
+
r.expect === expect &&
|
|
35
|
+
Date.parse(r.expiresAt ?? "") > Date.now());
|
|
36
|
+
if (dup)
|
|
37
|
+
return;
|
|
38
|
+
const cfg = chatRoomConfigForLoaded(loaded);
|
|
39
|
+
const timing = checkbackTimingForExpect(cfg, expect);
|
|
40
|
+
const renew = parseDurationToSeconds(timing.renew) ?? (expect.startsWith("room-call:") ? 60 : 180);
|
|
41
|
+
const now = new Date().toISOString();
|
|
42
|
+
const cb = {
|
|
43
|
+
id: `cb-peer-${Date.now()}-${row.id.slice(0, 8)}`,
|
|
44
|
+
kind: expect.startsWith("room-call:") ? "room-call" : "peer-comms",
|
|
45
|
+
status: "active",
|
|
46
|
+
renewSec: renew,
|
|
47
|
+
expect,
|
|
48
|
+
ownerPane: row.targetPane,
|
|
49
|
+
expiresAt: expiresIn(timing.duration, expect.startsWith("room-call:") ? 60 : 300),
|
|
50
|
+
recipientLabel: row.targetLabel,
|
|
51
|
+
senderLabel: row.fromSlot,
|
|
52
|
+
createdAt: now,
|
|
53
|
+
updatedAt: now,
|
|
54
|
+
};
|
|
55
|
+
store.upsertCheckback(cb);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=peer-comms-checkback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-comms-checkback.js","sourceRoot":"","sources":["../src/peer-comms-checkback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PeerRow } from "./jsonl-store.js";
|
|
2
|
+
/** Cold-start already delivered to this pane — do not re-inject duplicate pending rows. */
|
|
3
|
+
export declare function shouldSkipDeliveredColdStart(row: PeerRow): boolean;
|
|
4
|
+
/** Global room thin FYI pings must not land on worker seats (coord + @mention only). */
|
|
5
|
+
export declare function shouldSkipGlobalWorkerRoomPing(row: PeerRow): boolean;
|
|
6
|
+
export declare function markPeerRowSkipped(store: {
|
|
7
|
+
readPeer: () => PeerRow[];
|
|
8
|
+
writePeer: (rows: PeerRow[]) => void;
|
|
9
|
+
}, row: PeerRow): void;
|
|
10
|
+
//# sourceMappingURL=peer-skip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-skip.d.ts","sourceRoot":"","sources":["../src/peer-skip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,2FAA2F;AAC3F,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAGlE;AAED,wFAAwF;AACxF,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAIpE;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,OAAO,EAAE,CAAC;IAAC,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;CAAE,EAC1E,GAAG,EAAE,OAAO,GACX,IAAI,CASN"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Cold-start already delivered to this pane — do not re-inject duplicate pending rows. */
|
|
2
|
+
export function shouldSkipDeliveredColdStart(row) {
|
|
3
|
+
if (row.fromSlot !== "mesh-cold-start")
|
|
4
|
+
return false;
|
|
5
|
+
return row.sent === true && Boolean(row.sentAt);
|
|
6
|
+
}
|
|
7
|
+
/** Global room thin FYI pings must not land on worker seats (coord + @mention only). */
|
|
8
|
+
export function shouldSkipGlobalWorkerRoomPing(row) {
|
|
9
|
+
if (row.kind !== "room" || row.roomSlug !== "global")
|
|
10
|
+
return false;
|
|
11
|
+
if (!/^slot-[1-9]$/.test(row.targetLabel))
|
|
12
|
+
return false;
|
|
13
|
+
return /\|\s*fyi\s+\d+\s+unseen/i.test(row.msg);
|
|
14
|
+
}
|
|
15
|
+
export function markPeerRowSkipped(store, row) {
|
|
16
|
+
const rows = store.readPeer();
|
|
17
|
+
const i = rows.findIndex((r) => r.id === row.id);
|
|
18
|
+
if (i < 0)
|
|
19
|
+
return;
|
|
20
|
+
rows[i].sent = true;
|
|
21
|
+
rows[i].sentAt = new Date().toISOString();
|
|
22
|
+
rows[i].deliverPane = "skipped";
|
|
23
|
+
rows[i].deliverMode = "idle";
|
|
24
|
+
store.writePeer(rows);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=peer-skip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-skip.js","sourceRoot":"","sources":["../src/peer-skip.ts"],"names":[],"mappings":"AAEA,2FAA2F;AAC3F,MAAM,UAAU,4BAA4B,CAAC,GAAY;IACvD,IAAI,GAAG,CAAC,QAAQ,KAAK,iBAAiB;QAAE,OAAO,KAAK,CAAC;IACrD,OAAO,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,8BAA8B,CAAC,GAAY;IACzD,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACnE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IACxD,OAAO,0BAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAA0E,EAC1E,GAAY;IAEZ,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO;IAClB,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,CAAC,CAAE,CAAC,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,IAAI,CAAC,CAAC,CAAE,CAAC,WAAW,GAAG,SAAS,CAAC;IACjC,IAAI,CAAC,CAAC,CAAE,CAAC,WAAW,GAAG,MAAM,CAAC;IAC9B,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-skip.test.d.ts","sourceRoot":"","sources":["../src/peer-skip.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { shouldSkipGlobalWorkerRoomPing } from "./peer-skip.js";
|
|
3
|
+
const base = {
|
|
4
|
+
id: "x",
|
|
5
|
+
at: "2026-09-12T00:00:00.000Z",
|
|
6
|
+
kind: "room",
|
|
7
|
+
fromSlot: "6",
|
|
8
|
+
fromPorts: "3060/3061",
|
|
9
|
+
roomSlug: "global",
|
|
10
|
+
fromAgent: "worker-6",
|
|
11
|
+
targetPane: "%3",
|
|
12
|
+
targetLabel: "slot-1",
|
|
13
|
+
msg: "slot-1 3010/3011 | [mesh-inbox-room] global | worker-6 | fyi 18 unseen\nVerify: ./sm.sh room tail -n 15",
|
|
14
|
+
sent: false,
|
|
15
|
+
};
|
|
16
|
+
describe("shouldSkipGlobalWorkerRoomPing", () => {
|
|
17
|
+
it("skips global thin fyi to worker slot", () => {
|
|
18
|
+
expect(shouldSkipGlobalWorkerRoomPing(base)).toBe(true);
|
|
19
|
+
});
|
|
20
|
+
it("does not skip global to mini", () => {
|
|
21
|
+
expect(shouldSkipGlobalWorkerRoomPing({ ...base, targetLabel: "mini-1" })).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
it("does not skip supervise room to worker", () => {
|
|
24
|
+
expect(shouldSkipGlobalWorkerRoomPing({ ...base, roomSlug: "supervise", targetLabel: "slot-1" })).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
it("does not skip global rich broadcast to worker", () => {
|
|
27
|
+
expect(shouldSkipGlobalWorkerRoomPing({
|
|
28
|
+
...base,
|
|
29
|
+
msg: "[mesh-inbox-room] global | manager | broadcast\nBROADCAST: smoke",
|
|
30
|
+
})).toBe(false);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=peer-skip.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peer-skip.test.js","sourceRoot":"","sources":["../src/peer-skip.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAEhE,MAAM,IAAI,GAAY;IACpB,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,0BAA0B;IAC9B,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,GAAG;IACb,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,UAAU;IACrB,UAAU,EAAE,IAAI;IAChB,WAAW,EAAE,QAAQ;IACrB,GAAG,EAAE,yGAAyG;IAC9G,IAAI,EAAE,KAAK;CACZ,CAAC;AAEF,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,8BAA8B,CAAC,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CACJ,8BAA8B,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAC1F,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CACJ,8BAA8B,CAAC;YAC7B,GAAG,IAAI;YACP,GAAG,EAAE,kEAAkE;SACxE,CAAC,CACH,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface PpaPaneState {
|
|
2
|
+
label: string;
|
|
3
|
+
paneId: string;
|
|
4
|
+
agent: string;
|
|
5
|
+
border: string;
|
|
6
|
+
composer: string;
|
|
7
|
+
idleS: number;
|
|
8
|
+
updatedAt: string;
|
|
9
|
+
}
|
|
10
|
+
export interface PpaStateFile {
|
|
11
|
+
updatedAt: string;
|
|
12
|
+
panes: Record<string, PpaPaneState>;
|
|
13
|
+
}
|
|
14
|
+
export declare class PpaStateStore {
|
|
15
|
+
private readonly filePath;
|
|
16
|
+
private state;
|
|
17
|
+
constructor(stateDir: string);
|
|
18
|
+
private load;
|
|
19
|
+
private save;
|
|
20
|
+
/** Called from border paint when a pane is sampled. */
|
|
21
|
+
touch(input: {
|
|
22
|
+
paneId: string;
|
|
23
|
+
label: string;
|
|
24
|
+
agent: string;
|
|
25
|
+
border: string;
|
|
26
|
+
composerPhase: string;
|
|
27
|
+
composerLabel: string;
|
|
28
|
+
nowMs?: number;
|
|
29
|
+
}): void;
|
|
30
|
+
snapshot(): PpaPaneState[];
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=ppa-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ppa-state.d.ts","sourceRoot":"","sources":["../src/ppa-state.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CACrC;AAaD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,KAAK,CAAe;gBAEhB,QAAQ,EAAE,MAAM;IAK5B,OAAO,CAAC,IAAI;IAWZ,OAAO,CAAC,IAAI;IAIZ,uDAAuD;IACvD,KAAK,CAAC,KAAK,EAAE;QACX,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,IAAI;IA4BR,QAAQ,IAAI,YAAY,EAAE;CAG3B"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const IDLE_PHASES = new Set(["empty", "idle", "afk", "plain_shell"]);
|
|
4
|
+
function isIdlePhase(phase) {
|
|
5
|
+
return IDLE_PHASES.has(phase);
|
|
6
|
+
}
|
|
7
|
+
function isIdleComposer(composer) {
|
|
8
|
+
const phase = composer.split(":")[0] ?? composer;
|
|
9
|
+
return isIdlePhase(phase);
|
|
10
|
+
}
|
|
11
|
+
export class PpaStateStore {
|
|
12
|
+
filePath;
|
|
13
|
+
state;
|
|
14
|
+
constructor(stateDir) {
|
|
15
|
+
this.filePath = path.join(stateDir, "ppa-state.json");
|
|
16
|
+
this.state = this.load();
|
|
17
|
+
}
|
|
18
|
+
load() {
|
|
19
|
+
if (!fs.existsSync(this.filePath)) {
|
|
20
|
+
return { updatedAt: new Date(0).toISOString(), panes: {} };
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
return JSON.parse(fs.readFileSync(this.filePath, "utf8"));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return { updatedAt: new Date(0).toISOString(), panes: {} };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
save() {
|
|
30
|
+
fs.writeFileSync(this.filePath, JSON.stringify(this.state, null, 2) + "\n");
|
|
31
|
+
}
|
|
32
|
+
/** Called from border paint when a pane is sampled. */
|
|
33
|
+
touch(input) {
|
|
34
|
+
const nowMs = input.nowMs ?? Date.now();
|
|
35
|
+
const composer = `${input.composerPhase}${input.composerLabel ? `:${input.composerLabel}` : ""}`;
|
|
36
|
+
const prev = this.state.panes[input.paneId];
|
|
37
|
+
let idleS = 0;
|
|
38
|
+
if (isIdlePhase(input.composerPhase)) {
|
|
39
|
+
if (prev && isIdleComposer(prev.composer)) {
|
|
40
|
+
const prevUpdated = Date.parse(prev.updatedAt);
|
|
41
|
+
const delta = Number.isFinite(prevUpdated)
|
|
42
|
+
? Math.max(0, Math.floor((nowMs - prevUpdated) / 1000))
|
|
43
|
+
: 0;
|
|
44
|
+
idleS = prev.idleS + delta;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
this.state.panes[input.paneId] = {
|
|
48
|
+
label: input.label,
|
|
49
|
+
paneId: input.paneId,
|
|
50
|
+
agent: input.agent,
|
|
51
|
+
border: input.border,
|
|
52
|
+
composer,
|
|
53
|
+
idleS,
|
|
54
|
+
updatedAt: new Date(nowMs).toISOString(),
|
|
55
|
+
};
|
|
56
|
+
this.state.updatedAt = new Date(nowMs).toISOString();
|
|
57
|
+
this.save();
|
|
58
|
+
}
|
|
59
|
+
snapshot() {
|
|
60
|
+
return Object.values(this.state.panes).sort((a, b) => a.label.localeCompare(b.label));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=ppa-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ppa-state.js","sourceRoot":"","sources":["../src/ppa-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type PaneOpRow } from "@seat-mesh/core";
|
|
2
|
+
import { type CheckbackRow, type PeerRow, type ToMasterRow } from "./jsonl-store.js";
|
|
3
|
+
export declare function migrateJsonlDirToSqlite(dbPath: string, jsonlDir: string, log: (line: string) => void): boolean;
|
|
4
|
+
export declare class SqliteStore {
|
|
5
|
+
readonly stateDir: string;
|
|
6
|
+
readonly log: (line: string) => void;
|
|
7
|
+
private readonly db;
|
|
8
|
+
constructor(dbPath: string, stateDir: string, log?: (line: string) => void);
|
|
9
|
+
close(): void;
|
|
10
|
+
setMeta(key: string, value: string): void;
|
|
11
|
+
get checkbackPath(): string;
|
|
12
|
+
get inboxPath(): string;
|
|
13
|
+
get peerPath(): string;
|
|
14
|
+
get paneOpsPath(): string;
|
|
15
|
+
readCheckbacks(): CheckbackRow[];
|
|
16
|
+
writeCheckbacks(rows: CheckbackRow[]): void;
|
|
17
|
+
upsertCheckback(row: CheckbackRow): CheckbackRow;
|
|
18
|
+
cancelCheckback(id: string): boolean;
|
|
19
|
+
cancelAllCheckbacks(): number;
|
|
20
|
+
cancelCheckbacksForPaneExpect(ownerPane: string, expect: string): number;
|
|
21
|
+
clearPaneOps(): number;
|
|
22
|
+
readInbox(): ToMasterRow[];
|
|
23
|
+
writeInbox(rows: ToMasterRow[]): void;
|
|
24
|
+
appendInbox(row: ToMasterRow): void;
|
|
25
|
+
resolveInbox(opts: {
|
|
26
|
+
id?: string;
|
|
27
|
+
all?: boolean;
|
|
28
|
+
}): {
|
|
29
|
+
resolved: number;
|
|
30
|
+
ids: string[];
|
|
31
|
+
};
|
|
32
|
+
readPeer(): PeerRow[];
|
|
33
|
+
writePeer(rows: PeerRow[]): void;
|
|
34
|
+
appendPeer(row: PeerRow): void;
|
|
35
|
+
appendPeers(rows: PeerRow[]): void;
|
|
36
|
+
readPaneOps(): PaneOpRow[];
|
|
37
|
+
writePaneOps(rows: PaneOpRow[]): void;
|
|
38
|
+
appendPaneOp(row: PaneOpRow): void;
|
|
39
|
+
updatePaneOp(row: PaneOpRow): void;
|
|
40
|
+
countPaneOpsPending(): number;
|
|
41
|
+
formatInboxInject(row: ToMasterRow, targetRole?: "manager" | "secretary"): string;
|
|
42
|
+
compactPeer(): number;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=sqlite-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-store.d.ts","sourceRoot":"","sources":["../src/sqlite-store.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAmH1B,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC1B,OAAO,CAoCT;AAED,qBAAa,WAAW;IAKpB,QAAQ,CAAC,QAAQ,EAAE,MAAM;IACzB,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI;IALtC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;gBAG5B,MAAM,EAAE,MAAM,EACL,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAe;IAQjD,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAQzC,IAAI,aAAa,IAAI,MAAM,CAE1B;IACD,IAAI,SAAS,IAAI,MAAM,CAEtB;IACD,IAAI,QAAQ,IAAI,MAAM,CAErB;IACD,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,cAAc,IAAI,YAAY,EAAE;IAOhC,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI;IAY3C,eAAe,CAAC,GAAG,EAAE,YAAY,GAAG,YAAY;IAchD,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IASpC,mBAAmB,IAAI,MAAM;IAS7B,6BAA6B,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IASxE,YAAY,IAAI,MAAM;IAQtB,SAAS,IAAI,WAAW,EAAE;IAI1B,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI;IAmBrC,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAcnC,YAAY,CAAC,IAAI,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,EAAE,CAAA;KAAE;IAwBvF,QAAQ,IAAI,OAAO,EAAE;IASrB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAchC,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAS9B,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAIlC,WAAW,IAAI,SAAS,EAAE;IAS1B,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI;IASrC,YAAY,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IAMlC,YAAY,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IAIlC,mBAAmB,IAAI,MAAM;IAI7B,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,GAAE,SAAS,GAAG,WAAuB,GAAG,MAAM;IAiB5F,WAAW,IAAI,MAAM;CAUtB"}
|