@osolmaz/pi-workflows 0.15.2 → 0.16.0

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 (124) hide show
  1. package/README.md +6 -6
  2. package/dist/client/activity.d.ts +2 -0
  3. package/dist/client/activity.js +6 -0
  4. package/dist/client/activity.js.map +1 -0
  5. package/dist/client/client.d.ts +101 -0
  6. package/dist/client/client.js +733 -0
  7. package/dist/client/client.js.map +1 -0
  8. package/dist/client/index.d.ts +3 -0
  9. package/dist/client/index.js +3 -0
  10. package/dist/client/index.js.map +1 -0
  11. package/dist/client/materialize.d.ts +7 -0
  12. package/dist/client/materialize.js +177 -0
  13. package/dist/client/materialize.js.map +1 -0
  14. package/dist/client/protocol.d.ts +60 -0
  15. package/dist/client/protocol.js +269 -0
  16. package/dist/client/protocol.js.map +1 -0
  17. package/dist/client/resolver.d.ts +23 -0
  18. package/dist/client/resolver.js +2 -0
  19. package/dist/client/resolver.js.map +1 -0
  20. package/dist/client/view.d.ts +118 -0
  21. package/dist/client/view.js +3 -0
  22. package/dist/client/view.js.map +1 -0
  23. package/dist/controllers/sqlite.d.ts +64 -0
  24. package/dist/controllers/sqlite.js +219 -3
  25. package/dist/controllers/sqlite.js.map +1 -1
  26. package/dist/extension/index.d.ts +1 -0
  27. package/dist/extension/index.js +384 -156
  28. package/dist/extension/index.js.map +1 -1
  29. package/dist/extension/session-delivery.d.ts +6 -0
  30. package/dist/extension/session-delivery.js +80 -25
  31. package/dist/extension/session-delivery.js.map +1 -1
  32. package/dist/extension/session-view.d.ts +21 -0
  33. package/dist/extension/session-view.js +127 -0
  34. package/dist/extension/session-view.js.map +1 -0
  35. package/dist/extension/widget.d.ts +2 -1
  36. package/dist/extension/widget.js +15 -7
  37. package/dist/extension/widget.js.map +1 -1
  38. package/dist/host/child-worker-supervisor.js +1 -1
  39. package/dist/host/child-worker-supervisor.js.map +1 -1
  40. package/dist/host/resolver-entry.d.ts +2 -23
  41. package/dist/host/resolver-entry.js +1 -1
  42. package/dist/host/resolver-entry.js.map +1 -1
  43. package/dist/host/runner.d.ts +12 -0
  44. package/dist/host/runner.js +565 -43
  45. package/dist/host/runner.js.map +1 -1
  46. package/dist/host/state.d.ts +8 -3
  47. package/dist/host/state.js +59 -27
  48. package/dist/host/state.js.map +1 -1
  49. package/dist/host/view.d.ts +73 -0
  50. package/dist/host/view.js +871 -0
  51. package/dist/host/view.js.map +1 -0
  52. package/dist/host/worker-protocol.js +1 -1
  53. package/dist/host/worker-protocol.js.map +1 -1
  54. package/dist/state/database.d.ts +1 -0
  55. package/dist/state/database.js +15 -0
  56. package/dist/state/database.js.map +1 -1
  57. package/dist/state/prune.d.ts +3 -1
  58. package/dist/state/prune.js +6 -8
  59. package/dist/state/prune.js.map +1 -1
  60. package/dist/state/schema.js +12 -1
  61. package/dist/state/schema.js.map +1 -1
  62. package/dist/viewer/backup.d.ts +2 -0
  63. package/dist/viewer/backup.js +28 -0
  64. package/dist/viewer/backup.js.map +1 -0
  65. package/dist/viewer/cli.d.ts +4 -0
  66. package/dist/viewer/cli.js +150 -170
  67. package/dist/viewer/cli.js.map +1 -1
  68. package/dist/viewer/tui.d.ts +5 -7
  69. package/dist/viewer/tui.js +188 -108
  70. package/dist/viewer/tui.js.map +1 -1
  71. package/dist/workflows/store.d.ts +62 -1
  72. package/dist/workflows/store.js +350 -44
  73. package/dist/workflows/store.js.map +1 -1
  74. package/docs/2026-09-01-restore-session-delivery-controls-plan.md +139 -0
  75. package/docs/2026-09-01-unified-workflow-client-plan.md +381 -0
  76. package/docs/2026-09-02-installed-live-e2e-plan.md +225 -0
  77. package/docs/SQLITE_STATE.md +13 -11
  78. package/docs/WORKFLOW_HOST.md +81 -64
  79. package/docs/WORKFLOW_STEP_MESSAGES.md +4 -4
  80. package/docs/development.md +2 -1
  81. package/docs/live-replay-protocol.md +70 -132
  82. package/docs/tui-viewer.md +10 -14
  83. package/docs/workflows.md +56 -3
  84. package/herdr-plugin.toml +1 -1
  85. package/package.json +9 -3
  86. package/protocol/client.v1.schema.json +137 -0
  87. package/protocol/fixtures/client-v1.json +23 -0
  88. package/src/client/activity.ts +6 -0
  89. package/src/client/client.ts +935 -0
  90. package/src/client/index.ts +24 -0
  91. package/src/client/materialize.ts +228 -0
  92. package/src/client/protocol.ts +327 -0
  93. package/src/client/resolver.ts +26 -0
  94. package/src/client/view.ts +138 -0
  95. package/src/controllers/sqlite.ts +342 -3
  96. package/src/extension/index.ts +482 -171
  97. package/src/extension/session-delivery.ts +88 -25
  98. package/src/extension/session-view.ts +154 -0
  99. package/src/extension/widget.ts +18 -9
  100. package/src/host/child-worker-supervisor.ts +1 -1
  101. package/src/host/resolver-entry.ts +11 -26
  102. package/src/host/runner.ts +749 -75
  103. package/src/host/state.ts +82 -44
  104. package/src/host/view.ts +1084 -0
  105. package/src/host/worker-protocol.ts +1 -1
  106. package/src/state/database.ts +13 -0
  107. package/src/state/prune.ts +11 -11
  108. package/src/state/schema.ts +12 -1
  109. package/src/viewer/backup.ts +29 -0
  110. package/src/viewer/cli.ts +171 -185
  111. package/src/viewer/tui.ts +196 -124
  112. package/src/workflows/store.ts +500 -45
  113. package/dist/host/client.d.ts +0 -48
  114. package/dist/host/client.js +0 -216
  115. package/dist/host/client.js.map +0 -1
  116. package/dist/host/protocol.d.ts +0 -38
  117. package/dist/host/protocol.js +0 -156
  118. package/dist/host/protocol.js.map +0 -1
  119. package/dist/viewer/watch.d.ts +0 -6
  120. package/dist/viewer/watch.js +0 -46
  121. package/dist/viewer/watch.js.map +0 -1
  122. package/src/host/client.ts +0 -293
  123. package/src/host/protocol.ts +0 -196
  124. package/src/viewer/watch.ts +0 -51
@@ -1,48 +0,0 @@
1
- import { type JsonValue } from "../state/json.js";
2
- import { type HostOperation, type HostResponse } from "./protocol.js";
3
- import type { ResolvedControllerInitialization, ResolvedSettingsChange, ResolvedWorkflowLaunch } from "./resolver-entry.js";
4
- export declare class WorkflowHostClient {
5
- readonly clientId: string;
6
- readonly databasePath: string;
7
- readonly endpoint: string;
8
- constructor(options?: {
9
- clientId?: string;
10
- databasePath?: string;
11
- hostEntryPath?: string;
12
- env?: Record<string, string>;
13
- });
14
- private readonly hostEntryPath;
15
- private readonly env;
16
- request(options: {
17
- operation: HostOperation;
18
- requestId?: string;
19
- idempotencyKey?: string;
20
- runId?: string;
21
- expectedRevision?: number;
22
- payload?: JsonValue;
23
- }): Promise<HostResponse>;
24
- resolveWorkflow(options: {
25
- cwd: string;
26
- workflowRef: string;
27
- timeoutMs?: number;
28
- }): Promise<ResolvedWorkflowLaunch>;
29
- resolveControllerInitialization(options: {
30
- cwd: string;
31
- controllerName: string;
32
- spec: JsonValue;
33
- timeoutMs?: number;
34
- }): Promise<ResolvedControllerInitialization>;
35
- resolveSettingsChange(options: {
36
- cwd: string;
37
- workflowRef: string;
38
- definitionDigest: string;
39
- mountPath: string;
40
- current: JsonValue;
41
- patch: JsonValue;
42
- actorId: string;
43
- timeoutMs?: number;
44
- }): Promise<ResolvedSettingsChange>;
45
- private runResolver;
46
- ensureRunning(): Promise<HostResponse>;
47
- private startDetached;
48
- }
@@ -1,216 +0,0 @@
1
- import { spawn } from "node:child_process";
2
- import { randomUUID } from "node:crypto";
3
- import { once } from "node:events";
4
- import fs from "node:fs";
5
- import { createRequire } from "node:module";
6
- import net from "node:net";
7
- import { fileURLToPath } from "node:url";
8
- import { workflowStatePath } from "../state/database.js";
9
- import { canonicalJson, parseJson } from "../state/json.js";
10
- import { encodeProtocolLine, hostSocketPath, NdjsonFrameDecoder, parseHostResponse, } from "./protocol.js";
11
- const CONNECT_TIMEOUT_MS = 2_000;
12
- const START_TIMEOUT_MS = 10_000;
13
- export class WorkflowHostClient {
14
- clientId;
15
- databasePath;
16
- endpoint;
17
- constructor(options = {}) {
18
- this.clientId = options.clientId ?? `client-${randomUUID()}`;
19
- this.databasePath = options.databasePath ?? workflowStatePath();
20
- this.endpoint = hostSocketPath(this.databasePath);
21
- this.hostEntryPath = options.hostEntryPath;
22
- this.env = options.env;
23
- }
24
- hostEntryPath;
25
- env;
26
- async request(options) {
27
- const request = {
28
- schema: "pi-workflows.host-request.v1",
29
- requestId: options.requestId ?? randomUUID(),
30
- clientId: this.clientId,
31
- operation: options.operation,
32
- idempotencyKey: options.idempotencyKey ?? randomUUID(),
33
- ...(options.runId === undefined ? {} : { runId: options.runId }),
34
- ...(options.expectedRevision === undefined
35
- ? {}
36
- : { expectedRevision: options.expectedRevision }),
37
- payload: options.payload ?? {},
38
- };
39
- return await sendRequest(this.endpoint, request);
40
- }
41
- async resolveWorkflow(options) {
42
- return (await this.runResolver({
43
- schema: "pi-workflows.resolve-request.v1",
44
- cwd: options.cwd,
45
- workflowRef: options.workflowRef,
46
- }, options.cwd, "pi-workflows.resolved-launch.v1", options.timeoutMs));
47
- }
48
- async resolveControllerInitialization(options) {
49
- return (await this.runResolver({
50
- schema: "pi-workflows.controller-initialization-request.v1",
51
- cwd: options.cwd,
52
- controllerName: options.controllerName,
53
- spec: options.spec,
54
- }, options.cwd, "pi-workflows.resolved-controller-initialization.v1", options.timeoutMs));
55
- }
56
- async resolveSettingsChange(options) {
57
- return (await this.runResolver({
58
- schema: "pi-workflows.settings-validation-request.v1",
59
- cwd: options.cwd,
60
- workflowRef: options.workflowRef,
61
- definitionDigest: options.definitionDigest,
62
- mountPath: options.mountPath,
63
- current: options.current,
64
- patch: options.patch,
65
- actorId: options.actorId,
66
- }, options.cwd, "pi-workflows.resolved-settings-change.v1", options.timeoutMs));
67
- }
68
- async runResolver(request, cwd, expectedSchema, timeoutMs = START_TIMEOUT_MS) {
69
- const builtEntry = fileURLToPath(new URL("./resolver-entry.js", import.meta.url));
70
- const sourceEntry = fileURLToPath(new URL("./resolver-entry.ts", import.meta.url));
71
- const args = fs.existsSync(builtEntry)
72
- ? [builtEntry]
73
- : ["--import", createRequire(import.meta.url).resolve("tsx"), sourceEntry];
74
- const child = spawn(process.execPath, args, {
75
- cwd,
76
- detached: process.platform !== "win32",
77
- stdio: ["pipe", "pipe", "pipe"],
78
- env: { ...process.env, ...this.env },
79
- });
80
- let stdout = Buffer.alloc(0);
81
- let stderr = Buffer.alloc(0);
82
- let outputError;
83
- const append = (current, chunk) => {
84
- const next = Buffer.concat([current, chunk]);
85
- if (next.byteLength > 1024 * 1024) {
86
- outputError = new Error("Workflow resolver output exceeds 1 MiB");
87
- stopProcessGroup(child.pid);
88
- return current;
89
- }
90
- return next;
91
- };
92
- child.stdout.on("data", (chunk) => {
93
- stdout = append(stdout, chunk);
94
- });
95
- child.stderr.on("data", (chunk) => {
96
- stderr = append(stderr, chunk);
97
- });
98
- child.stdin.end(canonicalJson(request));
99
- const timeout = setTimeout(() => stopProcessGroup(child.pid), timeoutMs);
100
- timeout.unref?.();
101
- const [code, signal] = (await once(child, "exit"));
102
- clearTimeout(timeout);
103
- if (outputError !== undefined)
104
- throw outputError;
105
- if (code !== 0) {
106
- const detail = stderr.toString("utf8").trim().slice(0, 2_000);
107
- throw new Error(detail || `Workflow resolver exited before completion (code ${code}, signal ${signal})`);
108
- }
109
- const value = parseJson(stdout.toString("utf8").trimEnd());
110
- if (!isRecord(value) || value.schema !== expectedSchema) {
111
- throw new Error("Workflow resolver returned an invalid result envelope");
112
- }
113
- return value;
114
- }
115
- async ensureRunning() {
116
- try {
117
- return await this.request({
118
- operation: "host.status",
119
- requestId: `host-status-${randomUUID()}`,
120
- idempotencyKey: `host-status-${randomUUID()}`,
121
- });
122
- }
123
- catch {
124
- this.startDetached();
125
- }
126
- const deadline = Date.now() + START_TIMEOUT_MS;
127
- let lastError;
128
- while (Date.now() < deadline) {
129
- await new Promise((resolve) => setTimeout(resolve, 50));
130
- try {
131
- return await this.request({
132
- operation: "host.status",
133
- requestId: `host-status-${randomUUID()}`,
134
- idempotencyKey: `host-status-${randomUUID()}`,
135
- });
136
- }
137
- catch (error) {
138
- lastError = error;
139
- }
140
- }
141
- throw new Error(`Workflow host did not become ready: ${lastError instanceof Error ? lastError.message : String(lastError)}`);
142
- }
143
- startDetached() {
144
- const builtEntry = fileURLToPath(new URL("./host-entry.js", import.meta.url));
145
- const sourceEntry = fileURLToPath(new URL("./host-entry.ts", import.meta.url));
146
- const entry = this.hostEntryPath ?? builtEntry;
147
- const args = this.hostEntryPath === undefined && !fs.existsSync(builtEntry)
148
- ? ["--import", createRequire(import.meta.url).resolve("tsx"), sourceEntry]
149
- : [entry];
150
- const child = spawn(process.execPath, [...args, "--database", this.databasePath], {
151
- detached: true,
152
- stdio: "ignore",
153
- env: { ...process.env, ...this.env },
154
- });
155
- child.unref();
156
- }
157
- }
158
- function stopProcessGroup(pid) {
159
- if (pid === undefined)
160
- return;
161
- try {
162
- if (process.platform !== "win32")
163
- process.kill(-pid, "SIGKILL");
164
- else
165
- process.kill(pid, "SIGKILL");
166
- }
167
- catch {
168
- // The resolver has already exited.
169
- }
170
- }
171
- function isRecord(value) {
172
- return typeof value === "object" && value !== null && !Array.isArray(value);
173
- }
174
- async function sendRequest(endpoint, request) {
175
- const socket = net.createConnection(endpoint);
176
- const decoder = new NdjsonFrameDecoder();
177
- let timer;
178
- try {
179
- await Promise.race([
180
- once(socket, "connect"),
181
- new Promise((_, reject) => {
182
- timer = setTimeout(() => reject(new Error("Workflow host connection timed out")), CONNECT_TIMEOUT_MS);
183
- timer.unref?.();
184
- }),
185
- once(socket, "error").then(([error]) => Promise.reject(error)),
186
- ]);
187
- if (!socket.write(encodeProtocolLine(request)))
188
- await once(socket, "drain");
189
- const response = await new Promise((resolve, reject) => {
190
- const timeout = setTimeout(() => reject(new Error("Workflow host response timed out")), CONNECT_TIMEOUT_MS);
191
- timeout.unref?.();
192
- socket.on("data", (chunk) => {
193
- try {
194
- const frame = decoder.push(chunk)[0];
195
- if (frame === undefined)
196
- return;
197
- clearTimeout(timeout);
198
- resolve(parseHostResponse(frame));
199
- }
200
- catch (error) {
201
- clearTimeout(timeout);
202
- reject(error);
203
- }
204
- });
205
- socket.once("error", reject);
206
- socket.once("close", () => reject(new Error("Workflow host closed before responding")));
207
- });
208
- return response;
209
- }
210
- finally {
211
- if (timer !== undefined)
212
- clearTimeout(timer);
213
- socket.destroy();
214
- }
215
- }
216
- //# sourceMappingURL=client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/host/client.ts"],"names":[],"mappings":"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"}
@@ -1,38 +0,0 @@
1
- import { type JsonValue } from "../state/json.js";
2
- export declare const HOST_PROTOCOL_VERSION = 1;
3
- export declare const HOST_REQUEST_SCHEMA: "pi-workflows.host-request.v1";
4
- export declare const HOST_RESPONSE_SCHEMA: "pi-workflows.host-response.v1";
5
- export declare const MAX_PROTOCOL_MESSAGE_BYTES: number;
6
- export declare const HOST_OPERATIONS: readonly ["run.start", "run.pause", "run.resume", "run.cancel", "run.status", "run.list", "checkpoint.answer", "decision.answer", "interaction.submit", "interaction.update", "notification.claim", "notification.deliver", "turn.claim", "turn.resolve", "controller.list", "controller.get", "controller.apply", "controller.reconcile", "controller.delete", "host.status", "host.stop"];
7
- export type HostOperation = (typeof HOST_OPERATIONS)[number];
8
- export type HostOutcome = "accepted" | "adopted" | "rejected" | "conflict" | "notFound" | "claimLost" | "unavailable";
9
- export type HostRequest = {
10
- schema: typeof HOST_REQUEST_SCHEMA;
11
- requestId: string;
12
- clientId: string;
13
- operation: HostOperation;
14
- idempotencyKey: string;
15
- runId?: string;
16
- expectedRevision?: number;
17
- payload: JsonValue;
18
- };
19
- export type HostResponse = {
20
- schema: typeof HOST_RESPONSE_SCHEMA;
21
- requestId: string;
22
- outcome: HostOutcome;
23
- revision?: number;
24
- receipt?: JsonValue;
25
- error?: string;
26
- };
27
- export declare class HostProtocolError extends Error {
28
- constructor(message: string);
29
- }
30
- export declare function encodeProtocolLine(message: HostRequest | HostResponse): Buffer;
31
- export declare function parseHostRequest(line: string | Buffer): HostRequest;
32
- export declare function parseHostResponse(line: string | Buffer): HostResponse;
33
- export declare function requestFingerprint(request: HostRequest): Buffer;
34
- export declare function hostSocketPath(databasePath: string): string;
35
- export declare class NdjsonFrameDecoder {
36
- private buffered;
37
- push(chunk: Buffer): Buffer[];
38
- }
@@ -1,156 +0,0 @@
1
- import { createHash } from "node:crypto";
2
- import path from "node:path";
3
- import { canonicalJson, parseJson } from "../state/json.js";
4
- export const HOST_PROTOCOL_VERSION = 1;
5
- export const HOST_REQUEST_SCHEMA = "pi-workflows.host-request.v1";
6
- export const HOST_RESPONSE_SCHEMA = "pi-workflows.host-response.v1";
7
- export const MAX_PROTOCOL_MESSAGE_BYTES = 1024 * 1024;
8
- export const HOST_OPERATIONS = [
9
- "run.start",
10
- "run.pause",
11
- "run.resume",
12
- "run.cancel",
13
- "run.status",
14
- "run.list",
15
- "checkpoint.answer",
16
- "decision.answer",
17
- "interaction.submit",
18
- "interaction.update",
19
- "notification.claim",
20
- "notification.deliver",
21
- "turn.claim",
22
- "turn.resolve",
23
- "controller.list",
24
- "controller.get",
25
- "controller.apply",
26
- "controller.reconcile",
27
- "controller.delete",
28
- "host.status",
29
- "host.stop",
30
- ];
31
- export class HostProtocolError extends Error {
32
- constructor(message) {
33
- super(message);
34
- this.name = "HostProtocolError";
35
- }
36
- }
37
- export function encodeProtocolLine(message) {
38
- const encoded = Buffer.from(`${canonicalJson(message)}\n`, "utf8");
39
- if (encoded.byteLength > MAX_PROTOCOL_MESSAGE_BYTES) {
40
- throw new HostProtocolError("Host protocol message exceeds 1 MiB");
41
- }
42
- return encoded;
43
- }
44
- export function parseHostRequest(line) {
45
- const value = parseProtocolValue(line);
46
- if (value.schema !== HOST_REQUEST_SCHEMA)
47
- throw new HostProtocolError("Invalid host request schema");
48
- requireOpaqueId(value.requestId, "requestId");
49
- requireOpaqueId(value.clientId, "clientId");
50
- requireOpaqueId(value.idempotencyKey, "idempotencyKey");
51
- if (!HOST_OPERATIONS.includes(value.operation)) {
52
- throw new HostProtocolError("Invalid host request operation");
53
- }
54
- if (value.runId !== undefined)
55
- requireOpaqueId(value.runId, "runId");
56
- if (value.expectedRevision !== undefined &&
57
- (!Number.isSafeInteger(value.expectedRevision) || value.expectedRevision < 0)) {
58
- throw new HostProtocolError("Host request expectedRevision must be a non-negative integer");
59
- }
60
- if (!Object.hasOwn(value, "payload"))
61
- throw new HostProtocolError("Host request payload is required");
62
- canonicalJson(value.payload);
63
- return value;
64
- }
65
- export function parseHostResponse(line) {
66
- const value = parseProtocolValue(line);
67
- if (value.schema !== HOST_RESPONSE_SCHEMA) {
68
- throw new HostProtocolError("Invalid host response schema");
69
- }
70
- requireOpaqueId(value.requestId, "requestId");
71
- const outcomes = [
72
- "accepted",
73
- "adopted",
74
- "rejected",
75
- "conflict",
76
- "notFound",
77
- "claimLost",
78
- "unavailable",
79
- ];
80
- if (!outcomes.includes(value.outcome)) {
81
- throw new HostProtocolError("Invalid host response outcome");
82
- }
83
- if (value.revision !== undefined &&
84
- (!Number.isSafeInteger(value.revision) || value.revision < 0)) {
85
- throw new HostProtocolError("Host response revision must be a non-negative integer");
86
- }
87
- if (value.error !== undefined && typeof value.error !== "string") {
88
- throw new HostProtocolError("Host response error must be text");
89
- }
90
- if (value.receipt !== undefined)
91
- canonicalJson(value.receipt);
92
- return value;
93
- }
94
- export function requestFingerprint(request) {
95
- return createHash("sha256").update(canonicalJson(request)).digest();
96
- }
97
- export function hostSocketPath(databasePath) {
98
- const stateDirectory = path.dirname(path.resolve(databasePath));
99
- if (process.platform === "win32") {
100
- const suffix = createHash("sha256").update(stateDirectory).digest("hex").slice(0, 24);
101
- return `\\\\.\\pipe\\pi-workflows-${suffix}`;
102
- }
103
- return path.join(stateDirectory, "host", "host.sock");
104
- }
105
- export class NdjsonFrameDecoder {
106
- buffered = Buffer.alloc(0);
107
- push(chunk) {
108
- this.buffered = Buffer.concat([this.buffered, chunk]);
109
- if (this.buffered.byteLength > MAX_PROTOCOL_MESSAGE_BYTES && !this.buffered.includes(0x0a)) {
110
- throw new HostProtocolError("Host protocol message exceeds 1 MiB");
111
- }
112
- const frames = [];
113
- for (;;) {
114
- const newline = this.buffered.indexOf(0x0a);
115
- if (newline < 0)
116
- break;
117
- const frame = this.buffered.subarray(0, newline);
118
- this.buffered = this.buffered.subarray(newline + 1);
119
- if (frame.byteLength === 0)
120
- continue;
121
- if (frame.byteLength + 1 > MAX_PROTOCOL_MESSAGE_BYTES) {
122
- throw new HostProtocolError("Host protocol message exceeds 1 MiB");
123
- }
124
- frames.push(frame);
125
- }
126
- return frames;
127
- }
128
- }
129
- function parseProtocolValue(line) {
130
- const buffer = Buffer.isBuffer(line) ? line : Buffer.from(line, "utf8");
131
- if (buffer.byteLength + 1 > MAX_PROTOCOL_MESSAGE_BYTES) {
132
- throw new HostProtocolError("Host protocol message exceeds 1 MiB");
133
- }
134
- let value;
135
- try {
136
- value = parseJson(buffer.toString("utf8"));
137
- }
138
- catch {
139
- throw new HostProtocolError("Host protocol message is not valid canonical JSON");
140
- }
141
- if (!isRecord(value))
142
- throw new HostProtocolError("Host protocol message must be an object");
143
- if (canonicalJson(value) !== buffer.toString("utf8")) {
144
- throw new HostProtocolError("Host protocol message must use canonical JSON");
145
- }
146
- return value;
147
- }
148
- function requireOpaqueId(value, field) {
149
- if (typeof value !== "string" || value.length === 0 || value.length > 256) {
150
- throw new HostProtocolError(`Host request ${field} must be nonempty text of at most 256 bytes`);
151
- }
152
- }
153
- function isRecord(value) {
154
- return typeof value === "object" && value !== null && !Array.isArray(value);
155
- }
156
- //# sourceMappingURL=protocol.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/host/protocol.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- export type Unsubscribe = () => void;
2
- /** Watch the canonical database and its WAL with a polling fallback. */
3
- export declare function watchStateDatabase(databasePath: string, onChange: () => void, options?: {
4
- pollMs?: number;
5
- debounceMs?: number;
6
- }): Unsubscribe;
@@ -1,46 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- /** Watch the canonical database and its WAL with a polling fallback. */
4
- export function watchStateDatabase(databasePath, onChange, options = {}) {
5
- const pollMs = options.pollMs ?? 1_000;
6
- const debounceMs = options.debounceMs ?? 80;
7
- const directory = path.dirname(databasePath);
8
- const base = path.basename(databasePath);
9
- const relevant = new Set([base, `${base}-wal`, `${base}-shm`]);
10
- let debounceTimer = null;
11
- let closed = false;
12
- const fire = () => {
13
- if (closed)
14
- return;
15
- if (debounceTimer !== null)
16
- clearTimeout(debounceTimer);
17
- debounceTimer = setTimeout(() => {
18
- debounceTimer = null;
19
- onChange();
20
- }, debounceMs);
21
- };
22
- let watcher = null;
23
- try {
24
- watcher = fs.watch(directory, (_event, filename) => {
25
- if (filename === null || relevant.has(filename.toString()))
26
- fire();
27
- });
28
- watcher.on("error", () => {
29
- watcher?.close();
30
- watcher = null;
31
- });
32
- }
33
- catch {
34
- watcher = null;
35
- }
36
- const poller = setInterval(fire, pollMs);
37
- poller.unref?.();
38
- return () => {
39
- closed = true;
40
- if (debounceTimer !== null)
41
- clearTimeout(debounceTimer);
42
- clearInterval(poller);
43
- watcher?.close();
44
- };
45
- }
46
- //# sourceMappingURL=watch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/viewer/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,wEAAwE;AACxE,MAAM,UAAU,kBAAkB,CAChC,YAAoB,EACpB,QAAoB,EACpB,OAAO,GAA6C,EAAE;IAEtD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC;IAC/D,IAAI,aAAa,GAA0B,IAAI,CAAC;IAChD,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,IAAI,MAAM;YAAE,OAAO;QACnB,IAAI,aAAa,KAAK,IAAI;YAAE,YAAY,CAAC,aAAa,CAAC,CAAC;QACxD,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,aAAa,GAAG,IAAI,CAAC;YACrB,QAAQ,EAAE,CAAC;QACb,CAAC,EAAE,UAAU,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,IAAI,OAAO,GAAwB,IAAI,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YACjD,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBAAE,IAAI,EAAE,CAAC;QACrE,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACvB,OAAO,EAAE,KAAK,EAAE,CAAC;YACjB,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;IAEjB,OAAO,GAAG,EAAE;QACV,MAAM,GAAG,IAAI,CAAC;QACd,IAAI,aAAa,KAAK,IAAI;YAAE,YAAY,CAAC,aAAa,CAAC,CAAC;QACxD,aAAa,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC"}