@pattern-js/runtime-node 0.2.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.
- package/LICENSE +21 -0
- package/README.md +70 -0
- package/dist/bin/pattern.d.ts +20 -0
- package/dist/bin/pattern.d.ts.map +1 -0
- package/dist/bin/pattern.js +365 -0
- package/dist/bin/pattern.js.map +1 -0
- package/dist/cli.d.ts +21 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +75 -0
- package/dist/cli.js.map +1 -0
- package/dist/filesystem.d.ts +38 -0
- package/dist/filesystem.d.ts.map +1 -0
- package/dist/filesystem.js +59 -0
- package/dist/filesystem.js.map +1 -0
- package/dist/http.d.ts +94 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +799 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/load/generator.d.ts +19 -0
- package/dist/load/generator.d.ts.map +1 -0
- package/dist/load/generator.js +94 -0
- package/dist/load/generator.js.map +1 -0
- package/dist/load/index.d.ts +43 -0
- package/dist/load/index.d.ts.map +1 -0
- package/dist/load/index.js +87 -0
- package/dist/load/index.js.map +1 -0
- package/dist/load/recorder.d.ts +36 -0
- package/dist/load/recorder.d.ts.map +1 -0
- package/dist/load/recorder.js +106 -0
- package/dist/load/recorder.js.map +1 -0
- package/dist/load/report.d.ts +28 -0
- package/dist/load/report.d.ts.map +1 -0
- package/dist/load/report.js +84 -0
- package/dist/load/report.js.map +1 -0
- package/dist/load/types.d.ts +85 -0
- package/dist/load/types.d.ts.map +1 -0
- package/dist/load/types.js +51 -0
- package/dist/load/types.js.map +1 -0
- package/dist/mods.d.ts +23 -0
- package/dist/mods.d.ts.map +1 -0
- package/dist/mods.js +48 -0
- package/dist/mods.js.map +1 -0
- package/dist/project.d.ts +94 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +168 -0
- package/dist/project.js.map +1 -0
- package/dist/schedule.d.ts +33 -0
- package/dist/schedule.d.ts.map +1 -0
- package/dist/schedule.js +132 -0
- package/dist/schedule.js.map +1 -0
- package/dist/trace/index.d.ts +32 -0
- package/dist/trace/index.d.ts.map +1 -0
- package/dist/trace/index.js +48 -0
- package/dist/trace/index.js.map +1 -0
- package/dist/trace/memory.d.ts +83 -0
- package/dist/trace/memory.d.ts.map +1 -0
- package/dist/trace/memory.js +260 -0
- package/dist/trace/memory.js.map +1 -0
- package/dist/trace/sqlite.d.ts +80 -0
- package/dist/trace/sqlite.d.ts.map +1 -0
- package/dist/trace/sqlite.js +344 -0
- package/dist/trace/sqlite.js.map +1 -0
- package/dist/worker/entry.d.ts +16 -0
- package/dist/worker/entry.d.ts.map +1 -0
- package/dist/worker/entry.js +135 -0
- package/dist/worker/entry.js.map +1 -0
- package/dist/worker-pool.d.ts +49 -0
- package/dist/worker-pool.d.ts.map +1 -0
- package/dist/worker-pool.js +203 -0
- package/dist/worker-pool.js.map +1 -0
- package/dist/ws-registry.d.ts +39 -0
- package/dist/ws-registry.d.ts.map +1 -0
- package/dist/ws-registry.js +99 -0
- package/dist/ws-registry.js.map +1 -0
- package/dist/ws.d.ts +72 -0
- package/dist/ws.d.ts.map +1 -0
- package/dist/ws.js +236 -0
- package/dist/ws.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @pattern-js/runtime-node — durable trace store on Node's `node:sqlite` (§10).
|
|
3
|
+
*
|
|
4
|
+
* The same `TraceStore` surface as the in-memory one, persisted to a SQLite file
|
|
5
|
+
* so runs survive restarts and any process writing the file (host, CLI) shows up
|
|
6
|
+
* in the admin. Hand-written SQL, no ORM, mirroring mod-store's driver: WAL for
|
|
7
|
+
* multi-process readers, one row per run + one per span (events + I/O samples
|
|
8
|
+
* stored as JSON so Replay scrubs straight from the DB). The live `tail()` stays
|
|
9
|
+
* an in-memory fan-out — a live SSE span feed is inherently process-local.
|
|
10
|
+
*/
|
|
11
|
+
import { type MetricsSummary, type Principal, type RunDetail, type RunFilter, type RunParentRef, type RunSummary, type SpanData, type TraceStore, type TraceStoreConfig } from "@pattern-js/core";
|
|
12
|
+
/** Minimal slice of node:sqlite's DatabaseSync this module needs. */
|
|
13
|
+
interface SqlDatabase {
|
|
14
|
+
exec(sql: string): void;
|
|
15
|
+
prepare(sql: string): {
|
|
16
|
+
run(...params: unknown[]): {
|
|
17
|
+
changes: number | bigint;
|
|
18
|
+
};
|
|
19
|
+
get(...params: unknown[]): unknown;
|
|
20
|
+
all(...params: unknown[]): unknown[];
|
|
21
|
+
};
|
|
22
|
+
close(): void;
|
|
23
|
+
}
|
|
24
|
+
export interface SqliteTraceStoreOptions {
|
|
25
|
+
capacity?: number;
|
|
26
|
+
now?: () => number;
|
|
27
|
+
}
|
|
28
|
+
export declare class SqliteTraceStore implements TraceStore {
|
|
29
|
+
private readonly db;
|
|
30
|
+
private capacity;
|
|
31
|
+
private readonly now;
|
|
32
|
+
private readonly bootTime;
|
|
33
|
+
private exclude;
|
|
34
|
+
private excludeSource;
|
|
35
|
+
private readonly excludedTraces;
|
|
36
|
+
private readonly subscribers;
|
|
37
|
+
constructor(db: SqlDatabase, opts?: SqliteTraceStoreOptions);
|
|
38
|
+
config(): TraceStoreConfig;
|
|
39
|
+
setCapacity(n: number): void;
|
|
40
|
+
setExclude(pattern: string | null): void;
|
|
41
|
+
onRunStart(run: {
|
|
42
|
+
runId: string;
|
|
43
|
+
traceId: string;
|
|
44
|
+
workflowId: string;
|
|
45
|
+
trigger: string;
|
|
46
|
+
principal: Principal;
|
|
47
|
+
parent?: RunParentRef;
|
|
48
|
+
executor?: string;
|
|
49
|
+
}): void;
|
|
50
|
+
onSpanEnd(span: SpanData): void;
|
|
51
|
+
onRunReady(run: {
|
|
52
|
+
runId: string;
|
|
53
|
+
traceId: string;
|
|
54
|
+
status: "ok" | "error";
|
|
55
|
+
at: number;
|
|
56
|
+
}): void;
|
|
57
|
+
onRunEnd(run: {
|
|
58
|
+
runId: string;
|
|
59
|
+
traceId: string;
|
|
60
|
+
status: "ok" | "error";
|
|
61
|
+
error?: unknown;
|
|
62
|
+
at?: number;
|
|
63
|
+
endedBy?: "drain" | "timeout";
|
|
64
|
+
}): void;
|
|
65
|
+
/** Keep at most `capacity` finished runs; drop the oldest + their spans. */
|
|
66
|
+
private prune;
|
|
67
|
+
list(filter?: RunFilter): Promise<RunSummary[]>;
|
|
68
|
+
get(runId: string): Promise<RunDetail | null>;
|
|
69
|
+
children(runId: string): Promise<RunSummary[]>;
|
|
70
|
+
tail(workflowId?: string): ReadableStream<SpanData>;
|
|
71
|
+
metrics(window?: {
|
|
72
|
+
minutes?: number;
|
|
73
|
+
}): Promise<MetricsSummary>;
|
|
74
|
+
close(): Promise<void>;
|
|
75
|
+
}
|
|
76
|
+
/** Open (or create) a SQLite-backed trace store at `path` (":memory:" works).
|
|
77
|
+
* Throws helpfully when `node:sqlite` is missing — the factory falls back. */
|
|
78
|
+
export declare function openSqliteTraceStore(path: string, opts?: SqliteTraceStoreOptions): Promise<SqliteTraceStore>;
|
|
79
|
+
export {};
|
|
80
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/trace/sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @pattern-js/runtime-node — durable trace store on Node's `node:sqlite` (§10).
|
|
3
|
+
*
|
|
4
|
+
* The same `TraceStore` surface as the in-memory one, persisted to a SQLite file
|
|
5
|
+
* so runs survive restarts and any process writing the file (host, CLI) shows up
|
|
6
|
+
* in the admin. Hand-written SQL, no ORM, mirroring mod-store's driver: WAL for
|
|
7
|
+
* multi-process readers, one row per run + one per span (events + I/O samples
|
|
8
|
+
* stored as JSON so Replay scrubs straight from the DB). The live `tail()` stays
|
|
9
|
+
* an in-memory fan-out — a live SSE span feed is inherently process-local.
|
|
10
|
+
*/
|
|
11
|
+
import { mkdirSync } from "node:fs";
|
|
12
|
+
import { dirname } from "node:path";
|
|
13
|
+
import { now as hiResNow, } from "@pattern-js/core";
|
|
14
|
+
const SCHEMA = `
|
|
15
|
+
CREATE TABLE IF NOT EXISTS trace_runs (
|
|
16
|
+
run_id TEXT PRIMARY KEY,
|
|
17
|
+
trace_id TEXT NOT NULL,
|
|
18
|
+
workflow_id TEXT NOT NULL,
|
|
19
|
+
trigger TEXT NOT NULL,
|
|
20
|
+
principal TEXT NOT NULL,
|
|
21
|
+
status TEXT NOT NULL,
|
|
22
|
+
start_time REAL NOT NULL,
|
|
23
|
+
end_time REAL,
|
|
24
|
+
duration_ms REAL,
|
|
25
|
+
ready_ms REAL,
|
|
26
|
+
ended_by TEXT,
|
|
27
|
+
executor TEXT,
|
|
28
|
+
span_count INTEGER NOT NULL DEFAULT 0,
|
|
29
|
+
error TEXT,
|
|
30
|
+
parent TEXT,
|
|
31
|
+
parent_run_id TEXT,
|
|
32
|
+
finished INTEGER NOT NULL DEFAULT 0
|
|
33
|
+
);
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_trace_runs_trace ON trace_runs(trace_id);
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_trace_runs_parent ON trace_runs(parent_run_id);
|
|
36
|
+
CREATE INDEX IF NOT EXISTS idx_trace_runs_finished ON trace_runs(finished, start_time);
|
|
37
|
+
|
|
38
|
+
CREATE TABLE IF NOT EXISTS trace_spans (
|
|
39
|
+
span_id TEXT PRIMARY KEY,
|
|
40
|
+
trace_id TEXT NOT NULL,
|
|
41
|
+
parent_span_id TEXT,
|
|
42
|
+
name TEXT NOT NULL,
|
|
43
|
+
start_time REAL NOT NULL,
|
|
44
|
+
end_time REAL NOT NULL,
|
|
45
|
+
status TEXT NOT NULL,
|
|
46
|
+
attributes TEXT,
|
|
47
|
+
events TEXT,
|
|
48
|
+
io TEXT,
|
|
49
|
+
error TEXT
|
|
50
|
+
);
|
|
51
|
+
CREATE INDEX IF NOT EXISTS idx_trace_spans_trace ON trace_spans(trace_id);
|
|
52
|
+
`;
|
|
53
|
+
const jparse = (s, fallback) => {
|
|
54
|
+
if (typeof s !== "string")
|
|
55
|
+
return fallback;
|
|
56
|
+
try {
|
|
57
|
+
return JSON.parse(s);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return fallback;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
function toSummary(r) {
|
|
64
|
+
return {
|
|
65
|
+
runId: String(r.run_id),
|
|
66
|
+
traceId: String(r.trace_id),
|
|
67
|
+
workflowId: String(r.workflow_id),
|
|
68
|
+
trigger: String(r.trigger),
|
|
69
|
+
principal: jparse(r.principal, { kind: "anonymous" }),
|
|
70
|
+
status: String(r.status),
|
|
71
|
+
startTime: Number(r.start_time),
|
|
72
|
+
endTime: r.end_time == null ? undefined : Number(r.end_time),
|
|
73
|
+
durationMs: r.duration_ms == null ? undefined : Number(r.duration_ms),
|
|
74
|
+
readyMs: r.ready_ms == null ? undefined : Number(r.ready_ms),
|
|
75
|
+
endedBy: r.ended_by ?? undefined,
|
|
76
|
+
executor: r.executor ?? undefined,
|
|
77
|
+
spanCount: Number(r.span_count),
|
|
78
|
+
error: r.error == null ? undefined : jparse(r.error, { message: String(r.error) }),
|
|
79
|
+
parent: r.parent == null ? undefined : jparse(r.parent, undefined),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function toSpan(r) {
|
|
83
|
+
return {
|
|
84
|
+
traceId: String(r.trace_id),
|
|
85
|
+
spanId: String(r.span_id),
|
|
86
|
+
parentSpanId: r.parent_span_id ?? undefined,
|
|
87
|
+
name: String(r.name),
|
|
88
|
+
startTime: Number(r.start_time),
|
|
89
|
+
endTime: Number(r.end_time),
|
|
90
|
+
attributes: jparse(r.attributes, {}),
|
|
91
|
+
events: jparse(r.events, []),
|
|
92
|
+
status: String(r.status),
|
|
93
|
+
error: r.error == null ? undefined : jparse(r.error, { message: String(r.error) }),
|
|
94
|
+
io: r.io == null ? undefined : jparse(r.io, undefined),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const percentile = (sorted, p) => {
|
|
98
|
+
if (sorted.length === 0)
|
|
99
|
+
return 0;
|
|
100
|
+
const idx = Math.min(sorted.length - 1, Math.ceil((p / 100) * sorted.length) - 1);
|
|
101
|
+
return sorted[Math.max(0, idx)] ?? 0;
|
|
102
|
+
};
|
|
103
|
+
export class SqliteTraceStore {
|
|
104
|
+
db;
|
|
105
|
+
capacity;
|
|
106
|
+
now;
|
|
107
|
+
bootTime;
|
|
108
|
+
exclude = null;
|
|
109
|
+
excludeSource = null;
|
|
110
|
+
excludedTraces = new Set();
|
|
111
|
+
subscribers = new Set();
|
|
112
|
+
constructor(db, opts = {}) {
|
|
113
|
+
this.db = db;
|
|
114
|
+
this.capacity = opts.capacity ?? 500;
|
|
115
|
+
this.now = opts.now ?? hiResNow;
|
|
116
|
+
this.bootTime = this.now();
|
|
117
|
+
}
|
|
118
|
+
config() {
|
|
119
|
+
return { capacity: this.capacity, exclude: this.excludeSource };
|
|
120
|
+
}
|
|
121
|
+
setCapacity(n) {
|
|
122
|
+
this.capacity = Math.max(10, Math.min(10_000, Math.floor(n)));
|
|
123
|
+
this.prune();
|
|
124
|
+
}
|
|
125
|
+
setExclude(pattern) {
|
|
126
|
+
if (!pattern) {
|
|
127
|
+
this.exclude = null;
|
|
128
|
+
this.excludeSource = null;
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
this.exclude = new RegExp(pattern);
|
|
132
|
+
this.excludeSource = pattern;
|
|
133
|
+
}
|
|
134
|
+
// ── Write side (TraceSink) ──
|
|
135
|
+
onRunStart(run) {
|
|
136
|
+
if (this.exclude?.test(run.workflowId)) {
|
|
137
|
+
this.excludedTraces.add(run.traceId);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
this.db
|
|
141
|
+
.prepare(`INSERT OR REPLACE INTO trace_runs
|
|
142
|
+
(run_id, trace_id, workflow_id, trigger, principal, status, start_time, span_count, executor, parent, parent_run_id, finished)
|
|
143
|
+
VALUES (?,?,?,?,?,?,?,?,?,?,?,0)`)
|
|
144
|
+
.run(run.runId, run.traceId, run.workflowId, run.trigger, JSON.stringify(run.principal), "running", this.now(), 0, run.executor ?? null, run.parent ? JSON.stringify(run.parent) : null, run.parent?.runId ?? null);
|
|
145
|
+
}
|
|
146
|
+
onSpanEnd(span) {
|
|
147
|
+
if (this.excludedTraces.has(span.traceId))
|
|
148
|
+
return;
|
|
149
|
+
this.db
|
|
150
|
+
.prepare(`INSERT OR REPLACE INTO trace_spans
|
|
151
|
+
(span_id, trace_id, parent_span_id, name, start_time, end_time, status, attributes, events, io, error)
|
|
152
|
+
VALUES (?,?,?,?,?,?,?,?,?,?,?)`)
|
|
153
|
+
.run(span.spanId, span.traceId, span.parentSpanId ?? null, span.name, span.startTime, span.endTime, span.status, JSON.stringify(span.attributes ?? {}), span.events ? JSON.stringify(span.events) : null, span.io ? JSON.stringify(span.io) : null, span.error ? JSON.stringify(span.error) : null);
|
|
154
|
+
this.db.prepare("UPDATE trace_runs SET span_count = span_count + 1 WHERE trace_id = ?").run(span.traceId);
|
|
155
|
+
// Fan out to live tail subscribers (node spans only — skip the run span).
|
|
156
|
+
if (span.attributes["pattern.node.id"] !== undefined) {
|
|
157
|
+
const r = this.db.prepare("SELECT workflow_id FROM trace_runs WHERE trace_id = ?").get(span.traceId);
|
|
158
|
+
const wf = r ? String(r.workflow_id) : undefined;
|
|
159
|
+
for (const sub of this.subscribers)
|
|
160
|
+
if (!sub.workflowId || sub.workflowId === wf)
|
|
161
|
+
sub.push(span);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
onRunReady(run) {
|
|
165
|
+
if (this.excludedTraces.has(run.traceId))
|
|
166
|
+
return;
|
|
167
|
+
const r = this.db.prepare("SELECT start_time FROM trace_runs WHERE trace_id = ?").get(run.traceId);
|
|
168
|
+
if (!r)
|
|
169
|
+
return;
|
|
170
|
+
const readyMs = Math.max(0, run.at - Number(r.start_time));
|
|
171
|
+
// Errors are terminal at ready; ok runs may still be draining a stream.
|
|
172
|
+
this.db
|
|
173
|
+
.prepare("UPDATE trace_runs SET ready_ms = ?, status = CASE WHEN ? = 'ok' THEN 'streaming' ELSE status END WHERE trace_id = ?")
|
|
174
|
+
.run(readyMs, run.status, run.traceId);
|
|
175
|
+
}
|
|
176
|
+
onRunEnd(run) {
|
|
177
|
+
if (this.excludedTraces.delete(run.traceId))
|
|
178
|
+
return;
|
|
179
|
+
const r = this.db.prepare("SELECT start_time FROM trace_runs WHERE trace_id = ?").get(run.traceId);
|
|
180
|
+
if (!r)
|
|
181
|
+
return;
|
|
182
|
+
const endTime = run.at ?? this.now();
|
|
183
|
+
const durationMs = endTime - Number(r.start_time);
|
|
184
|
+
const error = run.error !== undefined ? JSON.stringify({ message: run.error instanceof Error ? run.error.message : String(run.error) }) : null;
|
|
185
|
+
this.db
|
|
186
|
+
.prepare("UPDATE trace_runs SET status = ?, end_time = ?, duration_ms = ?, ended_by = ?, error = ?, finished = 1 WHERE trace_id = ?")
|
|
187
|
+
.run(run.status, endTime, durationMs, run.endedBy ?? null, error, run.traceId);
|
|
188
|
+
this.prune();
|
|
189
|
+
}
|
|
190
|
+
/** Keep at most `capacity` finished runs; drop the oldest + their spans. */
|
|
191
|
+
prune() {
|
|
192
|
+
const c = this.db.prepare("SELECT COUNT(*) AS n FROM trace_runs WHERE finished = 1").get();
|
|
193
|
+
if (Number(c.n) <= this.capacity)
|
|
194
|
+
return;
|
|
195
|
+
this.db
|
|
196
|
+
.prepare(`DELETE FROM trace_runs WHERE finished = 1 AND run_id NOT IN (
|
|
197
|
+
SELECT run_id FROM trace_runs WHERE finished = 1 ORDER BY start_time DESC LIMIT ?
|
|
198
|
+
)`)
|
|
199
|
+
.run(this.capacity);
|
|
200
|
+
this.db.prepare("DELETE FROM trace_spans WHERE trace_id NOT IN (SELECT trace_id FROM trace_runs)").run();
|
|
201
|
+
}
|
|
202
|
+
// ── Read side (TraceStore) ──
|
|
203
|
+
async list(filter = {}) {
|
|
204
|
+
const where = [];
|
|
205
|
+
const params = [];
|
|
206
|
+
if (filter.workflow) {
|
|
207
|
+
where.push("workflow_id = ?");
|
|
208
|
+
params.push(filter.workflow);
|
|
209
|
+
}
|
|
210
|
+
if (filter.status) {
|
|
211
|
+
where.push("status = ?");
|
|
212
|
+
params.push(filter.status);
|
|
213
|
+
}
|
|
214
|
+
const clause = where.length ? `WHERE ${where.join(" AND ")}` : "";
|
|
215
|
+
// In-flight (finished = 0) first, then newest started first.
|
|
216
|
+
const rows = this.db
|
|
217
|
+
.prepare(`SELECT * FROM trace_runs ${clause} ORDER BY finished ASC, start_time DESC LIMIT ?`)
|
|
218
|
+
.all(...params, filter.limit ?? 50);
|
|
219
|
+
return rows.map(toSummary);
|
|
220
|
+
}
|
|
221
|
+
async get(runId) {
|
|
222
|
+
const r = this.db.prepare("SELECT * FROM trace_runs WHERE run_id = ?").get(runId);
|
|
223
|
+
if (!r)
|
|
224
|
+
return null;
|
|
225
|
+
const spans = this.db
|
|
226
|
+
.prepare("SELECT * FROM trace_spans WHERE trace_id = ? ORDER BY rowid ASC")
|
|
227
|
+
.all(String(r.trace_id));
|
|
228
|
+
return { summary: toSummary(r), spans: spans.map(toSpan) };
|
|
229
|
+
}
|
|
230
|
+
async children(runId) {
|
|
231
|
+
const rows = this.db
|
|
232
|
+
.prepare("SELECT * FROM trace_runs WHERE parent_run_id = ? ORDER BY start_time ASC")
|
|
233
|
+
.all(runId);
|
|
234
|
+
return rows.map(toSummary);
|
|
235
|
+
}
|
|
236
|
+
tail(workflowId) {
|
|
237
|
+
let sub;
|
|
238
|
+
return new ReadableStream({
|
|
239
|
+
start: (controller) => {
|
|
240
|
+
sub = {
|
|
241
|
+
workflowId,
|
|
242
|
+
push: (s) => {
|
|
243
|
+
try {
|
|
244
|
+
controller.enqueue(s);
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
/* closed */
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
close: () => {
|
|
251
|
+
try {
|
|
252
|
+
controller.close();
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
/* already closed */
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
this.subscribers.add(sub);
|
|
260
|
+
},
|
|
261
|
+
cancel: () => {
|
|
262
|
+
this.subscribers.delete(sub);
|
|
263
|
+
},
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
async metrics(window) {
|
|
267
|
+
const minutes = window?.minutes;
|
|
268
|
+
const since = minutes ? this.now() - minutes * 60_000 : this.bootTime;
|
|
269
|
+
const rows = this.db
|
|
270
|
+
.prepare("SELECT workflow_id, status, duration_ms FROM trace_runs WHERE finished = 1 AND start_time >= ?")
|
|
271
|
+
.all(since);
|
|
272
|
+
const durations = new Map();
|
|
273
|
+
const errors = new Map();
|
|
274
|
+
let totalErrors = 0;
|
|
275
|
+
for (const r of rows) {
|
|
276
|
+
const wf = String(r.workflow_id);
|
|
277
|
+
if (r.duration_ms != null) {
|
|
278
|
+
const list = durations.get(wf) ?? [];
|
|
279
|
+
list.push(Number(r.duration_ms));
|
|
280
|
+
durations.set(wf, list);
|
|
281
|
+
}
|
|
282
|
+
if (r.status === "error") {
|
|
283
|
+
errors.set(wf, (errors.get(wf) ?? 0) + 1);
|
|
284
|
+
totalErrors++;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
const perWorkflow = [];
|
|
288
|
+
for (const [workflowId, ds] of durations) {
|
|
289
|
+
const sorted = [...ds].sort((a, b) => a - b);
|
|
290
|
+
perWorkflow.push({
|
|
291
|
+
workflowId,
|
|
292
|
+
count: sorted.length,
|
|
293
|
+
errors: errors.get(workflowId) ?? 0,
|
|
294
|
+
p50: percentile(sorted, 50),
|
|
295
|
+
p95: percentile(sorted, 95),
|
|
296
|
+
p99: percentile(sorted, 99),
|
|
297
|
+
maxMs: sorted[sorted.length - 1] ?? 0,
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
perWorkflow.sort((a, b) => b.count - a.count);
|
|
301
|
+
const inflight = this.db.prepare("SELECT COUNT(*) AS n FROM trace_runs WHERE finished = 0").get();
|
|
302
|
+
const elapsedMin = Math.max((this.now() - since) / 60_000, 1 / 60);
|
|
303
|
+
return {
|
|
304
|
+
window: minutes ? { label: `last ${minutes}m`, sinceBoot: false, minutes } : { label: "since boot", sinceBoot: true },
|
|
305
|
+
runs: rows.length,
|
|
306
|
+
errors: totalErrors,
|
|
307
|
+
errorRate: rows.length ? totalErrors / rows.length : 0,
|
|
308
|
+
inFlight: Number(inflight.n),
|
|
309
|
+
runsPerMin: rows.length / elapsedMin,
|
|
310
|
+
perWorkflow,
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
async close() {
|
|
314
|
+
for (const sub of this.subscribers)
|
|
315
|
+
sub.close();
|
|
316
|
+
this.subscribers.clear();
|
|
317
|
+
this.db.close();
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/** Open (or create) a SQLite-backed trace store at `path` (":memory:" works).
|
|
321
|
+
* Throws helpfully when `node:sqlite` is missing — the factory falls back. */
|
|
322
|
+
export async function openSqliteTraceStore(path, opts = {}) {
|
|
323
|
+
let DatabaseSync;
|
|
324
|
+
try {
|
|
325
|
+
DatabaseSync = process.getBuiltinModule("node:sqlite")?.DatabaseSync;
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
/* fall through */
|
|
329
|
+
}
|
|
330
|
+
if (!DatabaseSync) {
|
|
331
|
+
throw new Error("node:sqlite is not available in this Node build — trace persistence needs Node ≥22.5 (≥24 recommended).");
|
|
332
|
+
}
|
|
333
|
+
if (path !== ":memory:")
|
|
334
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
335
|
+
const db = new DatabaseSync(path);
|
|
336
|
+
db.exec("PRAGMA journal_mode = WAL");
|
|
337
|
+
// Multi-process: a CLI run, or a dev-server restart, may open the file while
|
|
338
|
+
// another connection holds the write lock — wait for it instead of failing
|
|
339
|
+
// (which would silently drop this process to the in-memory fallback).
|
|
340
|
+
db.exec("PRAGMA busy_timeout = 5000");
|
|
341
|
+
db.exec(SCHEMA);
|
|
342
|
+
return new SqliteTraceStore(db, opts);
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/trace/sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @pattern-js/runtime-node — worker-thread run entry (§4, §8).
|
|
3
|
+
*
|
|
4
|
+
* Runs one workflow per `run` message on its own thread, fully isolated from the
|
|
5
|
+
* host event loop. Value out-gate results are structured-cloned back; stream
|
|
6
|
+
* out-gate results are forwarded chunk-by-chunk over the port and reconstructed
|
|
7
|
+
* on the host. Cancellation crosses the seam via an `abort` message.
|
|
8
|
+
*
|
|
9
|
+
* The worker registers the base op catalog, then loads any mods named in
|
|
10
|
+
* `workerData.mods` (module specifiers) before processing runs — so workflows
|
|
11
|
+
* using mod-contributed ops work on the pool. Remaining v1 limitation: events/
|
|
12
|
+
* hooks fire in the worker's own engine — they do not cross back to the host
|
|
13
|
+
* until a network backplane exists.
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../src/worker/entry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @pattern-js/runtime-node — worker-thread run entry (§4, §8).
|
|
3
|
+
*
|
|
4
|
+
* Runs one workflow per `run` message on its own thread, fully isolated from the
|
|
5
|
+
* host event loop. Value out-gate results are structured-cloned back; stream
|
|
6
|
+
* out-gate results are forwarded chunk-by-chunk over the port and reconstructed
|
|
7
|
+
* on the host. Cancellation crosses the seam via an `abort` message.
|
|
8
|
+
*
|
|
9
|
+
* The worker registers the base op catalog, then loads any mods named in
|
|
10
|
+
* `workerData.mods` (module specifiers) before processing runs — so workflows
|
|
11
|
+
* using mod-contributed ops work on the pool. Remaining v1 limitation: events/
|
|
12
|
+
* hooks fire in the worker's own engine — they do not cross back to the host
|
|
13
|
+
* until a network backplane exists.
|
|
14
|
+
*/
|
|
15
|
+
import { parentPort, workerData } from "node:worker_threads";
|
|
16
|
+
import { Engine } from "@pattern-js/core";
|
|
17
|
+
import { loadMods } from "../mods.js";
|
|
18
|
+
const port = parentPort;
|
|
19
|
+
const engine = new Engine();
|
|
20
|
+
const aborts = new Map();
|
|
21
|
+
// Forward this worker's trace lifecycle back to the host so offloaded runs show
|
|
22
|
+
// up in the Runs view. The run executes under the HOST's run id (passed into
|
|
23
|
+
// runFrom below), so spans line up with what the pool tracks; the worker's own
|
|
24
|
+
// traceId rides along (unique, no collision). postMessage is structured-clone —
|
|
25
|
+
// SpanData is plain data; guard against an op that stashed a non-cloneable attr.
|
|
26
|
+
function forward(event) {
|
|
27
|
+
try {
|
|
28
|
+
port.postMessage({ type: "trace", event });
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
/* a non-serializable span attribute — drop the event rather than crash the run */
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
engine.onTrace({
|
|
35
|
+
onRunStart: (run) => forward({ kind: "runStart", run }),
|
|
36
|
+
onSpanEnd: (span) => forward({ kind: "spanEnd", span }),
|
|
37
|
+
onRunReady: (run) => forward({ kind: "runReady", run }),
|
|
38
|
+
onRunEnd: (run) => forward({ kind: "runEnd", run: { ...run, error: run.error ? serializeError(run.error) : undefined } }),
|
|
39
|
+
});
|
|
40
|
+
/** Mods install before the first run executes (messages queue behind this). */
|
|
41
|
+
const ready = (async () => {
|
|
42
|
+
const mods = workerData?.mods ?? [];
|
|
43
|
+
if (mods.length)
|
|
44
|
+
await loadMods(engine, mods);
|
|
45
|
+
})().catch((err) => {
|
|
46
|
+
// Surface mod-load failures on the first run instead of dying silently.
|
|
47
|
+
throw new Error(`worker failed to load mods: ${err instanceof Error ? err.message : String(err)}`);
|
|
48
|
+
});
|
|
49
|
+
// Mark handled so an idle worker doesn't crash on the rejection before the
|
|
50
|
+
// first run awaits `ready` (awaits still observe the rejected state).
|
|
51
|
+
void ready.catch(() => { });
|
|
52
|
+
port.on("message", (msg) => {
|
|
53
|
+
if (msg.type === "run")
|
|
54
|
+
void handleRun(msg);
|
|
55
|
+
else if (msg.type === "abort")
|
|
56
|
+
aborts.get(msg.id)?.abort();
|
|
57
|
+
});
|
|
58
|
+
async function handleRun(msg) {
|
|
59
|
+
const { id, workflow, triggerNodeId, input, principal, params, sampleIo, hookDepth, parent } = msg;
|
|
60
|
+
const ac = new AbortController();
|
|
61
|
+
aborts.set(id, ac);
|
|
62
|
+
let result;
|
|
63
|
+
try {
|
|
64
|
+
await ready;
|
|
65
|
+
// Upsert so a re-dispatched workflow always runs its latest definition.
|
|
66
|
+
// (Throws only for boundary config ports, which need the async resolve
|
|
67
|
+
// phase — the run below still executes the passed definition directly.)
|
|
68
|
+
try {
|
|
69
|
+
engine.registerWorkflow(workflow, { validate: false });
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
/* boundary config ports — resolved on the host, run directly here */
|
|
73
|
+
}
|
|
74
|
+
// Run under the HOST's run id so forwarded spans match the pool's handle.
|
|
75
|
+
result = await engine.runFrom(workflow, triggerNodeId, input, principal, ac.signal, params, sampleIo, hookDepth, id, parent);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
port.postMessage({ type: "result", id, status: "error", outputs: {}, error: serializeError(err) });
|
|
79
|
+
port.postMessage({ type: "done", id });
|
|
80
|
+
aborts.delete(id);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// Replace stream values with placeholders and forward them after the result.
|
|
84
|
+
let counter = 0;
|
|
85
|
+
const streamTasks = [];
|
|
86
|
+
const outputs = {};
|
|
87
|
+
for (const [nodeId, payload] of Object.entries(result.outputs)) {
|
|
88
|
+
const sp = {};
|
|
89
|
+
for (const [k, v] of Object.entries(payload)) {
|
|
90
|
+
if (v instanceof ReadableStream) {
|
|
91
|
+
const streamId = `${id}:${counter++}`;
|
|
92
|
+
sp[k] = { __patternStream: streamId };
|
|
93
|
+
streamTasks.push(forwardStream(id, streamId, v));
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
sp[k] = v;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
outputs[nodeId] = sp;
|
|
100
|
+
}
|
|
101
|
+
port.postMessage({
|
|
102
|
+
type: "result",
|
|
103
|
+
id,
|
|
104
|
+
status: result.status,
|
|
105
|
+
outputs,
|
|
106
|
+
error: result.error ? serializeError(result.error) : undefined,
|
|
107
|
+
});
|
|
108
|
+
await Promise.all(streamTasks);
|
|
109
|
+
port.postMessage({ type: "done", id });
|
|
110
|
+
aborts.delete(id);
|
|
111
|
+
}
|
|
112
|
+
async function forwardStream(runId, streamId, stream) {
|
|
113
|
+
const reader = stream.getReader();
|
|
114
|
+
try {
|
|
115
|
+
for (;;) {
|
|
116
|
+
const { done, value } = await reader.read();
|
|
117
|
+
if (done)
|
|
118
|
+
break;
|
|
119
|
+
port.postMessage({ type: "chunk", runId, streamId, value });
|
|
120
|
+
}
|
|
121
|
+
port.postMessage({ type: "streamEnd", runId, streamId });
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
port.postMessage({ type: "streamError", runId, streamId, error: serializeError(err) });
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
reader.releaseLock();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function serializeError(err) {
|
|
131
|
+
if (err instanceof Error)
|
|
132
|
+
return { message: err.message, name: err.name };
|
|
133
|
+
return { message: String(err) };
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=entry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../../src/worker/entry.ts"],"names":[],"mappings":"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"}
|