@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.
Files changed (121) hide show
  1. package/dist/border-paint.d.ts +11 -0
  2. package/dist/border-paint.d.ts.map +1 -0
  3. package/dist/border-paint.js +163 -0
  4. package/dist/border-paint.js.map +1 -0
  5. package/dist/bullmq-runtime.d.ts +19 -0
  6. package/dist/bullmq-runtime.d.ts.map +1 -0
  7. package/dist/bullmq-runtime.js +78 -0
  8. package/dist/bullmq-runtime.js.map +1 -0
  9. package/dist/compose-gate.d.ts +18 -0
  10. package/dist/compose-gate.d.ts.map +1 -0
  11. package/dist/compose-gate.js +80 -0
  12. package/dist/compose-gate.js.map +1 -0
  13. package/dist/compose-gate.test.d.ts +2 -0
  14. package/dist/compose-gate.test.d.ts.map +1 -0
  15. package/dist/compose-gate.test.js +35 -0
  16. package/dist/compose-gate.test.js.map +1 -0
  17. package/dist/connectivity-recovery.d.ts +81 -0
  18. package/dist/connectivity-recovery.d.ts.map +1 -0
  19. package/dist/connectivity-recovery.js +454 -0
  20. package/dist/connectivity-recovery.js.map +1 -0
  21. package/dist/connectivity-recovery.test.d.ts +2 -0
  22. package/dist/connectivity-recovery.test.d.ts.map +1 -0
  23. package/dist/connectivity-recovery.test.js +147 -0
  24. package/dist/connectivity-recovery.test.js.map +1 -0
  25. package/dist/create-queue-store.d.ts +8 -0
  26. package/dist/create-queue-store.d.ts.map +1 -0
  27. package/dist/create-queue-store.js +13 -0
  28. package/dist/create-queue-store.js.map +1 -0
  29. package/dist/delivery-hold.d.ts +10 -0
  30. package/dist/delivery-hold.d.ts.map +1 -0
  31. package/dist/delivery-hold.js +21 -0
  32. package/dist/delivery-hold.js.map +1 -0
  33. package/dist/delivery-hold.test.d.ts +2 -0
  34. package/dist/delivery-hold.test.d.ts.map +1 -0
  35. package/dist/delivery-hold.test.js +35 -0
  36. package/dist/delivery-hold.test.js.map +1 -0
  37. package/dist/index.d.ts +3 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +3 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/inject-delivery.d.ts +26 -0
  42. package/dist/inject-delivery.d.ts.map +1 -0
  43. package/dist/inject-delivery.js +108 -0
  44. package/dist/inject-delivery.js.map +1 -0
  45. package/dist/inject-delivery.test.d.ts +2 -0
  46. package/dist/inject-delivery.test.d.ts.map +1 -0
  47. package/dist/inject-delivery.test.js +14 -0
  48. package/dist/inject-delivery.test.js.map +1 -0
  49. package/dist/jsonl-dedupe.test.d.ts +2 -0
  50. package/dist/jsonl-dedupe.test.d.ts.map +1 -0
  51. package/dist/jsonl-dedupe.test.js +27 -0
  52. package/dist/jsonl-dedupe.test.js.map +1 -0
  53. package/dist/jsonl-store.d.ts +103 -0
  54. package/dist/jsonl-store.d.ts.map +1 -0
  55. package/dist/jsonl-store.js +235 -0
  56. package/dist/jsonl-store.js.map +1 -0
  57. package/dist/mesh-inbox-server.d.ts +3 -0
  58. package/dist/mesh-inbox-server.d.ts.map +1 -0
  59. package/dist/mesh-inbox-server.js +483 -0
  60. package/dist/mesh-inbox-server.js.map +1 -0
  61. package/dist/mesh-inbox-supervisor.d.ts +3 -0
  62. package/dist/mesh-inbox-supervisor.d.ts.map +1 -0
  63. package/dist/mesh-inbox-supervisor.js +227 -0
  64. package/dist/mesh-inbox-supervisor.js.map +1 -0
  65. package/dist/mesh-orchestrator.d.ts +32 -0
  66. package/dist/mesh-orchestrator.d.ts.map +1 -0
  67. package/dist/mesh-orchestrator.js +340 -0
  68. package/dist/mesh-orchestrator.js.map +1 -0
  69. package/dist/oc-resume-ack.d.ts +32 -0
  70. package/dist/oc-resume-ack.d.ts.map +1 -0
  71. package/dist/oc-resume-ack.js +89 -0
  72. package/dist/oc-resume-ack.js.map +1 -0
  73. package/dist/oc-resume-ack.test.d.ts +2 -0
  74. package/dist/oc-resume-ack.test.d.ts.map +1 -0
  75. package/dist/oc-resume-ack.test.js +23 -0
  76. package/dist/oc-resume-ack.test.js.map +1 -0
  77. package/dist/oc-resume.d.ts +25 -0
  78. package/dist/oc-resume.d.ts.map +1 -0
  79. package/dist/oc-resume.js +102 -0
  80. package/dist/oc-resume.js.map +1 -0
  81. package/dist/orchestrator.d.ts +17 -0
  82. package/dist/orchestrator.d.ts.map +1 -0
  83. package/dist/orchestrator.js +11 -0
  84. package/dist/orchestrator.js.map +1 -0
  85. package/dist/pane-ops-drain.d.ts +14 -0
  86. package/dist/pane-ops-drain.d.ts.map +1 -0
  87. package/dist/pane-ops-drain.js +53 -0
  88. package/dist/pane-ops-drain.js.map +1 -0
  89. package/dist/peer-backlog.d.ts +18 -0
  90. package/dist/peer-backlog.d.ts.map +1 -0
  91. package/dist/peer-backlog.js +137 -0
  92. package/dist/peer-backlog.js.map +1 -0
  93. package/dist/peer-comms-checkback.d.ts +5 -0
  94. package/dist/peer-comms-checkback.d.ts.map +1 -0
  95. package/dist/peer-comms-checkback.js +57 -0
  96. package/dist/peer-comms-checkback.js.map +1 -0
  97. package/dist/peer-skip.d.ts +10 -0
  98. package/dist/peer-skip.d.ts.map +1 -0
  99. package/dist/peer-skip.js +26 -0
  100. package/dist/peer-skip.js.map +1 -0
  101. package/dist/peer-skip.test.d.ts +2 -0
  102. package/dist/peer-skip.test.d.ts.map +1 -0
  103. package/dist/peer-skip.test.js +33 -0
  104. package/dist/peer-skip.test.js.map +1 -0
  105. package/dist/ppa-state.d.ts +32 -0
  106. package/dist/ppa-state.d.ts.map +1 -0
  107. package/dist/ppa-state.js +63 -0
  108. package/dist/ppa-state.js.map +1 -0
  109. package/dist/sqlite-store.d.ts +44 -0
  110. package/dist/sqlite-store.d.ts.map +1 -0
  111. package/dist/sqlite-store.js +422 -0
  112. package/dist/sqlite-store.js.map +1 -0
  113. package/dist/sqlite-store.test.d.ts +2 -0
  114. package/dist/sqlite-store.test.d.ts.map +1 -0
  115. package/dist/sqlite-store.test.js +63 -0
  116. package/dist/sqlite-store.test.js.map +1 -0
  117. package/dist/workers.d.ts +11 -0
  118. package/dist/workers.d.ts.map +1 -0
  119. package/dist/workers.js +12 -0
  120. package/dist/workers.js.map +1 -0
  121. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=peer-skip.test.d.ts.map
@@ -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":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAiB7B,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;AAErE,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;IACjD,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,OAAO,aAAa;IACP,QAAQ,CAAS;IAC1B,KAAK,CAAe;IAE5B,YAAY,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAEO,IAAI;QACV,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAiB,CAAC;QAC5E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAC7D,CAAC;IACH,CAAC;IAEO,IAAI;QACV,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9E,CAAC;IAED,uDAAuD;IACvD,KAAK,CAAC,KAQL;QACC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACjG,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;YACrC,IAAI,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;oBACxC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;oBACvD,CAAC,CAAC,CAAC,CAAC;gBACN,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG;YAC/B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,QAAQ;YACR,KAAK;YACL,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;SACzC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QACrD,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,QAAQ;QACN,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACxF,CAAC;CACF"}
@@ -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"}