@prisma-next/runtime-executor 0.0.1

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/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # @prisma-next/runtime-executor
2
+
3
+ Target-agnostic execution engine for Prisma Next.
4
+
5
+ ## Package Classification
6
+
7
+ - **Domain**: framework
8
+ - **Layer**: runtime-executor
9
+ - **Plane**: runtime
10
+
11
+ ## Overview
12
+
13
+ The runtime-executor package provides the target-neutral execution engine responsible for plan validation, marker verification, plugin lifecycle, telemetry, and the runtime SPI definition. It is designed to work with any target family (SQL, document, graph, etc.) through the `RuntimeFamilyAdapter` interface.
14
+
15
+ ## Purpose
16
+
17
+ Provide a target-agnostic execution engine that family runtimes (e.g., `@prisma-next/sql-runtime`) can compose with family-specific adapters, drivers, and codecs.
18
+
19
+ ## Responsibilities
20
+
21
+ - **Plan Validation**: Verify plans against contracts (coreHash/profileHash checks)
22
+ - **Marker Verification**: Read and parse contract markers from databases
23
+ - **Plugin Orchestration**: Manage plugin lifecycle (beforeExecute, onRow, afterExecute hooks)
24
+ - **Telemetry Recording**: Track execution metrics (lane, target, fingerprint, outcome, duration)
25
+ - **Error Envelopes**: Provide consistent error formatting across families
26
+ - **Runtime SPI**: Define the `RuntimeFamilyAdapter` interface that family runtimes implement
27
+
28
+ ## Key Abstractions
29
+
30
+ ### RuntimeFamilyAdapter
31
+
32
+ Family runtimes implement this interface to provide:
33
+ - `readMarkerStatement()` - Returns SQL/query statement to read marker
34
+ - `validatePlan(plan, contract)` - Family-specific plan validation
35
+ - `contract` - The family-specific contract type
36
+
37
+ ### RuntimeCore
38
+
39
+ The target-neutral runtime implementation that:
40
+ - Takes a `RuntimeFamilyAdapter` and driver
41
+ - Executes plans through the family adapter
42
+ - Orchestrates plugins
43
+ - Records telemetry
44
+ - Validates plans and markers
45
+
46
+ ## Dependencies
47
+
48
+ - `@prisma-next/contract` - Plan types
49
+ - `@prisma-next/operations` - Operation registry
50
+
51
+ **No SQL-specific dependencies** - This package is target-agnostic.
52
+
53
+ ## Usage
54
+
55
+ Family runtimes (e.g., `@prisma-next/sql-runtime`) compose runtime-executor with family-specific implementations:
56
+
57
+ ```typescript
58
+ import { createRuntimeCore } from '@prisma-next/runtime-executor';
59
+ import { SqlFamilyAdapter } from './sql-family-adapter';
60
+
61
+ const familyAdapter = new SqlFamilyAdapter(contract);
62
+ const core = createRuntimeCore({
63
+ familyAdapter,
64
+ driver,
65
+ verify: { mode: 'onFirstUse', requireMarker: false },
66
+ operationRegistry,
67
+ plugins: [budgets(), lints()],
68
+ });
69
+ ```
70
+
71
+ ## Exports
72
+
73
+ - `createRuntimeCore` - Create a target-neutral runtime instance
74
+ - `RuntimeFamilyAdapter` - Interface for family runtimes
75
+ - `MarkerReader` - Interface for marker reading
76
+ - `budgets`, `lints` - Target-neutral plugins
77
+ - `runtimeError` - Error envelope utilities
78
+ - `computeSqlFingerprint` - SQL fingerprint computation
79
+ - `parseContractMarkerRow` - Marker parsing utilities
80
+
81
+ ## Testing
82
+
83
+ Includes a mock-family smoke test (`test/mock-family.test.ts`) that proves runtime-executor can work without SQL dependencies.
@@ -0,0 +1,140 @@
1
+ import { ExecutionPlan, ContractMarkerRecord } from '@prisma-next/contract/types';
2
+ export { ContractMarkerRecord } from '@prisma-next/contract/types';
3
+ import { OperationRegistry } from '@prisma-next/operations';
4
+
5
+ interface RuntimeErrorEnvelope extends Error {
6
+ readonly code: string;
7
+ readonly category: 'PLAN' | 'CONTRACT' | 'LINT' | 'BUDGET' | 'RUNTIME';
8
+ readonly severity: 'error';
9
+ readonly details?: Record<string, unknown>;
10
+ }
11
+ declare function runtimeError(code: string, message: string, details?: Record<string, unknown>): RuntimeErrorEnvelope;
12
+
13
+ declare function computeSqlFingerprint(sql: string): string;
14
+
15
+ type LintSeverity = 'error' | 'warn';
16
+ type BudgetSeverity = 'error' | 'warn';
17
+ interface LintFinding {
18
+ readonly code: `LINT.${string}`;
19
+ readonly severity: LintSeverity;
20
+ readonly message: string;
21
+ readonly details?: Record<string, unknown>;
22
+ }
23
+ interface BudgetFinding {
24
+ readonly code: `BUDGET.${string}`;
25
+ readonly severity: BudgetSeverity;
26
+ readonly message: string;
27
+ readonly details?: Record<string, unknown>;
28
+ }
29
+ interface RawGuardrailConfig {
30
+ readonly budgets?: {
31
+ readonly unboundedSelectSeverity?: BudgetSeverity;
32
+ readonly estimatedRows?: number;
33
+ };
34
+ }
35
+ interface RawGuardrailResult {
36
+ readonly lints: LintFinding[];
37
+ readonly budgets: BudgetFinding[];
38
+ readonly statement: 'select' | 'mutation' | 'other';
39
+ }
40
+ declare function evaluateRawGuardrails(plan: ExecutionPlan, config?: RawGuardrailConfig): RawGuardrailResult;
41
+
42
+ declare function parseContractMarkerRow(row: unknown): ContractMarkerRecord;
43
+
44
+ type Severity = 'error' | 'warn' | 'info';
45
+ interface Log {
46
+ info(event: unknown): void;
47
+ warn(event: unknown): void;
48
+ error(event: unknown): void;
49
+ }
50
+ interface PluginContext<TContract = unknown, TAdapter = unknown, TDriver = unknown> {
51
+ readonly contract: TContract;
52
+ readonly adapter: TAdapter;
53
+ readonly driver: TDriver;
54
+ readonly mode: 'strict' | 'permissive';
55
+ readonly now: () => number;
56
+ readonly log: Log;
57
+ }
58
+ interface AfterExecuteResult {
59
+ readonly rowCount: number;
60
+ readonly latencyMs: number;
61
+ readonly completed: boolean;
62
+ }
63
+ interface Plugin<TContract = unknown, TAdapter = unknown, TDriver = unknown> {
64
+ readonly name: string;
65
+ beforeExecute?(plan: ExecutionPlan, ctx: PluginContext<TContract, TAdapter, TDriver>): Promise<void>;
66
+ onRow?(row: Record<string, unknown>, plan: ExecutionPlan, ctx: PluginContext<TContract, TAdapter, TDriver>): Promise<void>;
67
+ afterExecute?(plan: ExecutionPlan, result: AfterExecuteResult, ctx: PluginContext<TContract, TAdapter, TDriver>): Promise<void>;
68
+ }
69
+
70
+ interface BudgetsOptions {
71
+ readonly maxRows?: number;
72
+ readonly defaultTableRows?: number;
73
+ readonly tableRows?: Record<string, number>;
74
+ readonly maxLatencyMs?: number;
75
+ readonly severities?: {
76
+ readonly rowCount?: 'warn' | 'error';
77
+ readonly latency?: 'warn' | 'error';
78
+ };
79
+ readonly explain?: {
80
+ readonly enabled?: boolean;
81
+ };
82
+ }
83
+ declare function budgets<TContract = unknown, TAdapter = unknown, TDriver = unknown>(options?: BudgetsOptions): Plugin<TContract, TAdapter, TDriver>;
84
+
85
+ interface LintsOptions {
86
+ readonly severities?: {
87
+ readonly selectStar?: 'warn' | 'error';
88
+ readonly noLimit?: 'warn' | 'error';
89
+ readonly readOnlyMutation?: 'warn' | 'error';
90
+ readonly unindexedPredicate?: 'warn' | 'error';
91
+ };
92
+ }
93
+ declare function lints<TContract = unknown, TAdapter = unknown, TDriver = unknown>(options?: LintsOptions): Plugin<TContract, TAdapter, TDriver>;
94
+
95
+ interface MarkerStatement {
96
+ readonly sql: string;
97
+ readonly params: readonly unknown[];
98
+ }
99
+ interface MarkerReader {
100
+ readMarkerStatement(): MarkerStatement;
101
+ }
102
+ interface RuntimeFamilyAdapter<TContract = unknown> {
103
+ readonly contract: TContract;
104
+ readonly markerReader: MarkerReader;
105
+ validatePlan(plan: ExecutionPlan, contract: TContract): void;
106
+ }
107
+
108
+ interface RuntimeVerifyOptions {
109
+ readonly mode: 'onFirstUse' | 'startup' | 'always';
110
+ readonly requireMarker: boolean;
111
+ }
112
+ type TelemetryOutcome = 'success' | 'runtime-error';
113
+ interface RuntimeTelemetryEvent {
114
+ readonly lane: string;
115
+ readonly target: string;
116
+ readonly fingerprint: string;
117
+ readonly outcome: TelemetryOutcome;
118
+ readonly durationMs?: number;
119
+ }
120
+ interface RuntimeCoreOptions<TContract = unknown, TAdapter = unknown, TDriver = unknown> {
121
+ readonly familyAdapter: RuntimeFamilyAdapter<TContract>;
122
+ readonly driver: TDriver;
123
+ readonly verify: RuntimeVerifyOptions;
124
+ readonly plugins?: readonly Plugin<TContract, TAdapter, TDriver>[];
125
+ readonly mode?: 'strict' | 'permissive';
126
+ readonly log?: Log;
127
+ readonly operationRegistry: OperationRegistry;
128
+ }
129
+ interface RuntimeCore<TContract = unknown, TAdapter = unknown, TDriver = unknown> {
130
+ readonly _typeContract?: TContract;
131
+ readonly _typeAdapter?: TAdapter;
132
+ readonly _typeDriver?: TDriver;
133
+ execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row>): AsyncIterable<Row>;
134
+ telemetry(): RuntimeTelemetryEvent | null;
135
+ close(): Promise<void>;
136
+ operations(): OperationRegistry;
137
+ }
138
+ declare function createRuntimeCore<TContract = unknown, TAdapter = unknown, TDriver = unknown>(options: RuntimeCoreOptions<TContract, TAdapter, TDriver>): RuntimeCore<TContract, TAdapter, TDriver>;
139
+
140
+ export { type AfterExecuteResult, type BudgetFinding, type BudgetsOptions, type LintFinding, type LintsOptions, type Log, type MarkerReader, type MarkerStatement, type Plugin, type PluginContext, type RawGuardrailResult, type RuntimeCore, type RuntimeCoreOptions, type RuntimeErrorEnvelope, type RuntimeFamilyAdapter, type RuntimeTelemetryEvent, type RuntimeVerifyOptions, type Severity, type TelemetryOutcome, budgets, computeSqlFingerprint, createRuntimeCore, evaluateRawGuardrails, lints, parseContractMarkerRow, runtimeError };
package/dist/index.js ADDED
@@ -0,0 +1,697 @@
1
+ // src/errors.ts
2
+ function runtimeError(code, message, details) {
3
+ const error = new Error(message);
4
+ Object.defineProperty(error, "name", {
5
+ value: "RuntimeError",
6
+ configurable: true
7
+ });
8
+ return Object.assign(error, {
9
+ code,
10
+ category: resolveCategory(code),
11
+ severity: "error",
12
+ message,
13
+ details
14
+ });
15
+ }
16
+ function resolveCategory(code) {
17
+ const prefix = code.split(".")[0] ?? "RUNTIME";
18
+ switch (prefix) {
19
+ case "PLAN":
20
+ case "CONTRACT":
21
+ case "LINT":
22
+ case "BUDGET":
23
+ return prefix;
24
+ default:
25
+ return "RUNTIME";
26
+ }
27
+ }
28
+
29
+ // src/fingerprint.ts
30
+ import { createHash } from "crypto";
31
+ var STRING_LITERAL_REGEX = /'(?:''|[^'])*'/g;
32
+ var NUMERIC_LITERAL_REGEX = /\b\d+(?:\.\d+)?\b/g;
33
+ var WHITESPACE_REGEX = /\s+/g;
34
+ function computeSqlFingerprint(sql) {
35
+ const withoutStrings = sql.replace(STRING_LITERAL_REGEX, "?");
36
+ const withoutNumbers = withoutStrings.replace(NUMERIC_LITERAL_REGEX, "?");
37
+ const normalized = withoutNumbers.replace(WHITESPACE_REGEX, " ").trim().toLowerCase();
38
+ const hash = createHash("sha256").update(normalized).digest("hex");
39
+ return `sha256:${hash}`;
40
+ }
41
+
42
+ // src/guardrails/raw.ts
43
+ var SELECT_STAR_REGEX = /select\s+\*/i;
44
+ var LIMIT_REGEX = /\blimit\b/i;
45
+ var MUTATION_PREFIX_REGEX = /^(insert|update|delete|create|alter|drop|truncate)\b/i;
46
+ var READ_ONLY_INTENTS = /* @__PURE__ */ new Set(["read", "report", "readonly"]);
47
+ function evaluateRawGuardrails(plan, config) {
48
+ const lints2 = [];
49
+ const budgets2 = [];
50
+ const normalized = normalizeWhitespace(plan.sql);
51
+ const statementType = classifyStatement(normalized);
52
+ if (statementType === "select") {
53
+ if (SELECT_STAR_REGEX.test(normalized)) {
54
+ lints2.push(
55
+ createLint("LINT.SELECT_STAR", "error", "Raw SQL plan selects all columns via *", {
56
+ sql: snippet(plan.sql)
57
+ })
58
+ );
59
+ }
60
+ if (!LIMIT_REGEX.test(normalized)) {
61
+ const severity = config?.budgets?.unboundedSelectSeverity ?? "error";
62
+ lints2.push(
63
+ createLint("LINT.NO_LIMIT", "warn", "Raw SQL plan omits LIMIT clause", {
64
+ sql: snippet(plan.sql)
65
+ })
66
+ );
67
+ budgets2.push(
68
+ createBudget(
69
+ "BUDGET.ROWS_EXCEEDED",
70
+ severity,
71
+ "Raw SQL plan is unbounded and may exceed row budget",
72
+ {
73
+ sql: snippet(plan.sql),
74
+ ...config?.budgets?.estimatedRows !== void 0 ? { estimatedRows: config.budgets.estimatedRows } : {}
75
+ }
76
+ )
77
+ );
78
+ }
79
+ }
80
+ if (isMutationStatement(statementType) && isReadOnlyIntent(plan.meta)) {
81
+ lints2.push(
82
+ createLint(
83
+ "LINT.READ_ONLY_MUTATION",
84
+ "error",
85
+ "Raw SQL plan mutates data despite read-only intent",
86
+ {
87
+ sql: snippet(plan.sql),
88
+ intent: plan.meta.annotations?.["intent"]
89
+ }
90
+ )
91
+ );
92
+ }
93
+ const refs = plan.meta.refs;
94
+ if (refs) {
95
+ evaluateIndexCoverage(refs, lints2);
96
+ }
97
+ return { lints: lints2, budgets: budgets2, statement: statementType };
98
+ }
99
+ function evaluateIndexCoverage(refs, lints2) {
100
+ const predicateColumns = refs.columns ?? [];
101
+ if (predicateColumns.length === 0) {
102
+ return;
103
+ }
104
+ const indexes = refs.indexes ?? [];
105
+ if (indexes.length === 0) {
106
+ lints2.push(
107
+ createLint(
108
+ "LINT.UNINDEXED_PREDICATE",
109
+ "warn",
110
+ "Raw SQL plan predicates lack supporting indexes",
111
+ {
112
+ predicates: predicateColumns
113
+ }
114
+ )
115
+ );
116
+ return;
117
+ }
118
+ const hasSupportingIndex = predicateColumns.every(
119
+ (column) => indexes.some(
120
+ (index) => index.table === column.table && index.columns.some((col) => col.toLowerCase() === column.column.toLowerCase())
121
+ )
122
+ );
123
+ if (!hasSupportingIndex) {
124
+ lints2.push(
125
+ createLint(
126
+ "LINT.UNINDEXED_PREDICATE",
127
+ "warn",
128
+ "Raw SQL plan predicates lack supporting indexes",
129
+ {
130
+ predicates: predicateColumns
131
+ }
132
+ )
133
+ );
134
+ }
135
+ }
136
+ function classifyStatement(sql) {
137
+ const trimmed = sql.trim();
138
+ const lower = trimmed.toLowerCase();
139
+ if (lower.startsWith("with")) {
140
+ if (lower.includes("select")) {
141
+ return "select";
142
+ }
143
+ }
144
+ if (lower.startsWith("select")) {
145
+ return "select";
146
+ }
147
+ if (MUTATION_PREFIX_REGEX.test(trimmed)) {
148
+ return "mutation";
149
+ }
150
+ return "other";
151
+ }
152
+ function isMutationStatement(statement) {
153
+ return statement === "mutation";
154
+ }
155
+ function isReadOnlyIntent(meta) {
156
+ const annotations = meta.annotations;
157
+ const intent = typeof annotations?.intent === "string" ? annotations.intent.toLowerCase() : void 0;
158
+ return intent !== void 0 && READ_ONLY_INTENTS.has(intent);
159
+ }
160
+ function normalizeWhitespace(value) {
161
+ return value.replace(/\s+/g, " ").trim();
162
+ }
163
+ function snippet(sql) {
164
+ return normalizeWhitespace(sql).slice(0, 200);
165
+ }
166
+ function createLint(code, severity, message, details) {
167
+ return { code, severity, message, ...details ? { details } : {} };
168
+ }
169
+ function createBudget(code, severity, message, details) {
170
+ return { code, severity, message, ...details ? { details } : {} };
171
+ }
172
+
173
+ // src/marker.ts
174
+ import { type } from "arktype";
175
+ var MetaSchema = type({ "[string]": "unknown" });
176
+ function parseMeta(meta) {
177
+ if (meta === null || meta === void 0) {
178
+ return {};
179
+ }
180
+ let parsed;
181
+ if (typeof meta === "string") {
182
+ try {
183
+ parsed = JSON.parse(meta);
184
+ } catch {
185
+ return {};
186
+ }
187
+ } else {
188
+ parsed = meta;
189
+ }
190
+ const result = MetaSchema(parsed);
191
+ if (result instanceof type.errors) {
192
+ return {};
193
+ }
194
+ return result;
195
+ }
196
+ var ContractMarkerRowSchema = type({
197
+ core_hash: "string",
198
+ profile_hash: "string",
199
+ "contract_json?": "unknown | null",
200
+ "canonical_version?": "number | null",
201
+ "updated_at?": "Date | string",
202
+ "app_tag?": "string | null",
203
+ "meta?": "unknown | null"
204
+ });
205
+ function parseContractMarkerRow(row) {
206
+ const result = ContractMarkerRowSchema(row);
207
+ if (result instanceof type.errors) {
208
+ const messages = result.map((p) => p.message).join("; ");
209
+ throw new Error(`Invalid contract marker row: ${messages}`);
210
+ }
211
+ const validatedRow = result;
212
+ const updatedAt = validatedRow.updated_at ? validatedRow.updated_at instanceof Date ? validatedRow.updated_at : new Date(validatedRow.updated_at) : /* @__PURE__ */ new Date();
213
+ return {
214
+ coreHash: validatedRow.core_hash,
215
+ profileHash: validatedRow.profile_hash,
216
+ contractJson: validatedRow.contract_json ?? null,
217
+ canonicalVersion: validatedRow.canonical_version ?? null,
218
+ updatedAt,
219
+ appTag: validatedRow.app_tag ?? null,
220
+ meta: parseMeta(validatedRow.meta)
221
+ };
222
+ }
223
+
224
+ // src/plugins/budgets.ts
225
+ async function computeEstimatedRows(plan, driver) {
226
+ if (typeof driver.explain !== "function") {
227
+ return void 0;
228
+ }
229
+ try {
230
+ const result = await driver.explain(plan.sql, [...plan.params]);
231
+ return extractEstimatedRows(result.rows);
232
+ } catch {
233
+ return void 0;
234
+ }
235
+ }
236
+ function extractEstimatedRows(rows) {
237
+ for (const row of rows) {
238
+ const estimate = findPlanRows(row);
239
+ if (estimate !== void 0) {
240
+ return estimate;
241
+ }
242
+ }
243
+ return void 0;
244
+ }
245
+ function findPlanRows(node) {
246
+ if (!node || typeof node !== "object") {
247
+ return void 0;
248
+ }
249
+ const explainNode = node;
250
+ const planRows = explainNode["Plan Rows"];
251
+ if (typeof planRows === "number") {
252
+ return planRows;
253
+ }
254
+ if ("Plan" in explainNode && explainNode.Plan !== void 0) {
255
+ const nested = findPlanRows(explainNode.Plan);
256
+ if (nested !== void 0) {
257
+ return nested;
258
+ }
259
+ }
260
+ if (Array.isArray(explainNode.Plans)) {
261
+ for (const child of explainNode.Plans) {
262
+ const nested = findPlanRows(child);
263
+ if (nested !== void 0) {
264
+ return nested;
265
+ }
266
+ }
267
+ }
268
+ for (const value of Object.values(node)) {
269
+ if (typeof value === "object" && value !== null) {
270
+ const nested = findPlanRows(value);
271
+ if (nested !== void 0) {
272
+ return nested;
273
+ }
274
+ }
275
+ }
276
+ return void 0;
277
+ }
278
+ function budgetError(code, message, details) {
279
+ const error = new Error(message);
280
+ Object.defineProperty(error, "name", {
281
+ value: "RuntimeError",
282
+ configurable: true
283
+ });
284
+ return Object.assign(error, {
285
+ code,
286
+ category: "BUDGET",
287
+ severity: "error",
288
+ details
289
+ });
290
+ }
291
+ function estimateRows(plan, tableRows, defaultTableRows) {
292
+ if (!plan.ast) {
293
+ return null;
294
+ }
295
+ const table = plan.meta.refs?.tables?.[0];
296
+ if (!table) {
297
+ return null;
298
+ }
299
+ const tableEstimate = tableRows[table] ?? defaultTableRows;
300
+ if (plan.ast && typeof plan.ast === "object" && "kind" in plan.ast && plan.ast.kind === "select" && "limit" in plan.ast && typeof plan.ast.limit === "number") {
301
+ return Math.min(plan.ast.limit, tableEstimate);
302
+ }
303
+ return tableEstimate;
304
+ }
305
+ function hasDetectableLimit(plan) {
306
+ if (plan.ast && typeof plan.ast === "object" && "kind" in plan.ast && plan.ast.kind === "select" && "limit" in plan.ast && typeof plan.ast.limit === "number") {
307
+ return true;
308
+ }
309
+ const annotations = plan.meta.annotations;
310
+ return typeof annotations?.limit === "number" || typeof annotations?.LIMIT === "number";
311
+ }
312
+ function budgets(options) {
313
+ const maxRows = options?.maxRows ?? 1e4;
314
+ const defaultTableRows = options?.defaultTableRows ?? 1e4;
315
+ const tableRows = options?.tableRows ?? {};
316
+ const maxLatencyMs = options?.maxLatencyMs ?? 1e3;
317
+ const rowSeverity = options?.severities?.rowCount ?? "error";
318
+ const latencySeverity = options?.severities?.latency ?? "warn";
319
+ let observedRows = 0;
320
+ return Object.freeze({
321
+ name: "budgets",
322
+ async beforeExecute(plan, ctx) {
323
+ observedRows = 0;
324
+ void ctx.now();
325
+ const estimated = estimateRows(plan, tableRows, defaultTableRows);
326
+ const isUnbounded = !hasDetectableLimit(plan);
327
+ const sqlUpper = plan.sql.trimStart().toUpperCase();
328
+ const isSelect = sqlUpper.startsWith("SELECT");
329
+ if (isSelect && isUnbounded) {
330
+ if (estimated !== null && estimated >= maxRows) {
331
+ const error2 = budgetError(
332
+ "BUDGET.ROWS_EXCEEDED",
333
+ "Unbounded SELECT query exceeds budget",
334
+ {
335
+ source: "heuristic",
336
+ estimatedRows: estimated,
337
+ maxRows
338
+ }
339
+ );
340
+ const shouldBlock2 = rowSeverity === "error" || ctx.mode === "strict";
341
+ if (shouldBlock2) {
342
+ throw error2;
343
+ }
344
+ ctx.log.warn({
345
+ code: error2.code,
346
+ message: error2.message,
347
+ details: error2.details
348
+ });
349
+ return;
350
+ }
351
+ const error = budgetError("BUDGET.ROWS_EXCEEDED", "Unbounded SELECT query exceeds budget", {
352
+ source: "heuristic",
353
+ maxRows
354
+ });
355
+ const shouldBlock = rowSeverity === "error" || ctx.mode === "strict";
356
+ if (shouldBlock) {
357
+ throw error;
358
+ }
359
+ ctx.log.warn({
360
+ code: error.code,
361
+ message: error.message,
362
+ details: error.details
363
+ });
364
+ return;
365
+ }
366
+ if (estimated !== null) {
367
+ if (estimated > maxRows) {
368
+ const error = budgetError("BUDGET.ROWS_EXCEEDED", "Estimated row count exceeds budget", {
369
+ source: "heuristic",
370
+ estimatedRows: estimated,
371
+ maxRows
372
+ });
373
+ const shouldBlock = rowSeverity === "error" || ctx.mode === "strict";
374
+ if (shouldBlock) {
375
+ throw error;
376
+ }
377
+ ctx.log.warn({
378
+ code: error.code,
379
+ message: error.message,
380
+ details: error.details
381
+ });
382
+ }
383
+ return;
384
+ }
385
+ if (!plan.ast) {
386
+ const explainEnabled = options?.explain?.enabled === true;
387
+ if (explainEnabled && isSelect && typeof ctx.driver === "object" && ctx.driver !== null) {
388
+ const estimatedRows = await computeEstimatedRows(plan, ctx.driver);
389
+ if (estimatedRows !== void 0) {
390
+ if (estimatedRows > maxRows) {
391
+ const error = budgetError(
392
+ "BUDGET.ROWS_EXCEEDED",
393
+ "Estimated row count exceeds budget",
394
+ {
395
+ source: "explain",
396
+ estimatedRows,
397
+ maxRows
398
+ }
399
+ );
400
+ const shouldBlock = rowSeverity === "error" || ctx.mode === "strict";
401
+ if (shouldBlock) {
402
+ throw error;
403
+ }
404
+ ctx.log.warn({
405
+ code: error.code,
406
+ message: error.message,
407
+ details: error.details
408
+ });
409
+ }
410
+ return;
411
+ }
412
+ }
413
+ }
414
+ },
415
+ async onRow(_row, _plan, _ctx) {
416
+ void _row;
417
+ void _plan;
418
+ void _ctx;
419
+ observedRows += 1;
420
+ if (observedRows > maxRows) {
421
+ throw budgetError("BUDGET.ROWS_EXCEEDED", "Observed row count exceeds budget", {
422
+ source: "observed",
423
+ observedRows,
424
+ maxRows
425
+ });
426
+ }
427
+ },
428
+ async afterExecute(_plan, result, ctx) {
429
+ const latencyMs = result.latencyMs;
430
+ if (latencyMs > maxLatencyMs) {
431
+ const error = budgetError("BUDGET.TIME_EXCEEDED", "Query latency exceeds budget", {
432
+ latencyMs,
433
+ maxLatencyMs
434
+ });
435
+ const shouldBlock = latencySeverity === "error" && ctx.mode === "strict";
436
+ if (shouldBlock) {
437
+ throw error;
438
+ }
439
+ ctx.log.warn({
440
+ code: error.code,
441
+ message: error.message,
442
+ details: error.details
443
+ });
444
+ }
445
+ }
446
+ });
447
+ }
448
+
449
+ // src/plugins/lints.ts
450
+ function lintError(code, message, details) {
451
+ const error = new Error(message);
452
+ Object.defineProperty(error, "name", {
453
+ value: "RuntimeError",
454
+ configurable: true
455
+ });
456
+ return Object.assign(error, {
457
+ code,
458
+ category: "LINT",
459
+ severity: "error",
460
+ details
461
+ });
462
+ }
463
+ function lints(options) {
464
+ return Object.freeze({
465
+ name: "lints",
466
+ async beforeExecute(plan, ctx) {
467
+ if (plan.ast) {
468
+ return;
469
+ }
470
+ const evaluation = evaluateRawGuardrails(plan);
471
+ for (const lint of evaluation.lints) {
472
+ const configuredSeverity = getConfiguredSeverity(lint.code, options);
473
+ const effectiveSeverity = configuredSeverity ?? lint.severity;
474
+ if (effectiveSeverity === "error") {
475
+ throw lintError(lint.code, lint.message, lint.details);
476
+ }
477
+ if (effectiveSeverity === "warn") {
478
+ ctx.log.warn({
479
+ code: lint.code,
480
+ message: lint.message,
481
+ details: lint.details
482
+ });
483
+ }
484
+ }
485
+ }
486
+ });
487
+ }
488
+ function getConfiguredSeverity(code, options) {
489
+ const severities = options?.severities;
490
+ if (!severities) {
491
+ return void 0;
492
+ }
493
+ if (code === "LINT.SELECT_STAR") {
494
+ return severities.selectStar;
495
+ }
496
+ if (code === "LINT.NO_LIMIT") {
497
+ return severities.noLimit;
498
+ }
499
+ if (code === "LINT.READ_ONLY_MUTATION") {
500
+ return severities.readOnlyMutation;
501
+ }
502
+ if (code === "LINT.UNINDEXED_PREDICATE") {
503
+ return severities.unindexedPredicate;
504
+ }
505
+ return void 0;
506
+ }
507
+
508
+ // src/runtime-core.ts
509
+ var RuntimeCoreImpl = class {
510
+ _typeContract;
511
+ _typeAdapter;
512
+ _typeDriver;
513
+ contract;
514
+ familyAdapter;
515
+ driver;
516
+ plugins;
517
+ mode;
518
+ verify;
519
+ operationRegistry;
520
+ pluginContext;
521
+ verified;
522
+ startupVerified;
523
+ _telemetry;
524
+ constructor(options) {
525
+ const { familyAdapter, driver } = options;
526
+ this.contract = familyAdapter.contract;
527
+ this.familyAdapter = familyAdapter;
528
+ this.driver = driver;
529
+ this.plugins = options.plugins ?? [];
530
+ this.mode = options.mode ?? "strict";
531
+ this.verify = options.verify;
532
+ this.operationRegistry = options.operationRegistry;
533
+ this.verified = options.verify.mode === "startup" ? false : options.verify.mode === "always";
534
+ this.startupVerified = false;
535
+ this._telemetry = null;
536
+ this.pluginContext = {
537
+ contract: this.contract,
538
+ adapter: options.familyAdapter,
539
+ driver: this.driver,
540
+ mode: this.mode,
541
+ now: () => Date.now(),
542
+ log: options.log ?? {
543
+ info: () => {
544
+ },
545
+ warn: () => {
546
+ },
547
+ error: () => {
548
+ }
549
+ }
550
+ };
551
+ }
552
+ async verifyPlanIfNeeded(_plan) {
553
+ void _plan;
554
+ if (this.verify.mode === "always") {
555
+ this.verified = false;
556
+ }
557
+ if (this.verified) {
558
+ return;
559
+ }
560
+ const readStatement = this.familyAdapter.markerReader.readMarkerStatement();
561
+ const driver = this.driver;
562
+ const result = await driver.query(readStatement.sql, readStatement.params);
563
+ if (result.rows.length === 0) {
564
+ if (this.verify.requireMarker) {
565
+ throw runtimeError("CONTRACT.MARKER_MISSING", "Contract marker not found in database");
566
+ }
567
+ this.verified = true;
568
+ return;
569
+ }
570
+ const marker = parseContractMarkerRow(result.rows[0]);
571
+ const contract = this.contract;
572
+ if (marker.coreHash !== contract.coreHash) {
573
+ throw runtimeError("CONTRACT.MARKER_MISMATCH", "Database core hash does not match contract", {
574
+ expected: contract.coreHash,
575
+ actual: marker.coreHash
576
+ });
577
+ }
578
+ const expectedProfile = contract.profileHash ?? null;
579
+ if (expectedProfile !== null && marker.profileHash !== expectedProfile) {
580
+ throw runtimeError(
581
+ "CONTRACT.MARKER_MISMATCH",
582
+ "Database profile hash does not match contract",
583
+ {
584
+ expectedProfile,
585
+ actualProfile: marker.profileHash
586
+ }
587
+ );
588
+ }
589
+ this.verified = true;
590
+ this.startupVerified = true;
591
+ }
592
+ validatePlan(plan) {
593
+ this.familyAdapter.validatePlan(plan, this.contract);
594
+ }
595
+ recordTelemetry(plan, outcome, durationMs) {
596
+ const contract = this.contract;
597
+ this._telemetry = Object.freeze({
598
+ lane: plan.meta.lane,
599
+ target: contract.target,
600
+ fingerprint: computeSqlFingerprint(plan.sql),
601
+ outcome,
602
+ ...durationMs !== void 0 ? { durationMs } : {}
603
+ });
604
+ }
605
+ execute(plan) {
606
+ this.validatePlan(plan);
607
+ this._telemetry = null;
608
+ const iterator = async function* (self) {
609
+ const startedAt = Date.now();
610
+ let rowCount = 0;
611
+ let completed = false;
612
+ if (!self.startupVerified && self.verify.mode === "startup") {
613
+ await self.verifyPlanIfNeeded(plan);
614
+ }
615
+ if (self.verify.mode === "onFirstUse") {
616
+ await self.verifyPlanIfNeeded(plan);
617
+ }
618
+ try {
619
+ if (self.verify.mode === "always") {
620
+ await self.verifyPlanIfNeeded(plan);
621
+ }
622
+ for (const plugin of self.plugins) {
623
+ if (plugin.beforeExecute) {
624
+ await plugin.beforeExecute(plan, self.pluginContext);
625
+ }
626
+ }
627
+ const driver = self.driver;
628
+ const encodedParams = plan.params;
629
+ for await (const row of driver.execute({
630
+ sql: plan.sql,
631
+ params: encodedParams
632
+ })) {
633
+ for (const plugin of self.plugins) {
634
+ if (plugin.onRow) {
635
+ await plugin.onRow(row, plan, self.pluginContext);
636
+ }
637
+ }
638
+ rowCount++;
639
+ yield row;
640
+ }
641
+ completed = true;
642
+ self.recordTelemetry(plan, "success", Date.now() - startedAt);
643
+ } catch (error) {
644
+ if (self._telemetry === null) {
645
+ self.recordTelemetry(plan, "runtime-error", Date.now() - startedAt);
646
+ }
647
+ const latencyMs2 = Date.now() - startedAt;
648
+ for (const plugin of self.plugins) {
649
+ if (plugin.afterExecute) {
650
+ try {
651
+ await plugin.afterExecute(
652
+ plan,
653
+ { rowCount, latencyMs: latencyMs2, completed },
654
+ self.pluginContext
655
+ );
656
+ } catch {
657
+ }
658
+ }
659
+ }
660
+ throw error;
661
+ }
662
+ const latencyMs = Date.now() - startedAt;
663
+ for (const plugin of self.plugins) {
664
+ if (plugin.afterExecute) {
665
+ await plugin.afterExecute(plan, { rowCount, latencyMs, completed }, self.pluginContext);
666
+ }
667
+ }
668
+ };
669
+ return iterator(this);
670
+ }
671
+ telemetry() {
672
+ return this._telemetry;
673
+ }
674
+ operations() {
675
+ return this.operationRegistry;
676
+ }
677
+ close() {
678
+ const driver = this.driver;
679
+ if (typeof driver.close === "function") {
680
+ return driver.close();
681
+ }
682
+ return Promise.resolve();
683
+ }
684
+ };
685
+ function createRuntimeCore(options) {
686
+ return new RuntimeCoreImpl(options);
687
+ }
688
+ export {
689
+ budgets,
690
+ computeSqlFingerprint,
691
+ createRuntimeCore,
692
+ evaluateRawGuardrails,
693
+ lints,
694
+ parseContractMarkerRow,
695
+ runtimeError
696
+ };
697
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/fingerprint.ts","../src/guardrails/raw.ts","../src/marker.ts","../src/plugins/budgets.ts","../src/plugins/lints.ts","../src/runtime-core.ts"],"sourcesContent":["export interface RuntimeErrorEnvelope extends Error {\n readonly code: string;\n readonly category: 'PLAN' | 'CONTRACT' | 'LINT' | 'BUDGET' | 'RUNTIME';\n readonly severity: 'error';\n readonly details?: Record<string, unknown>;\n}\n\nexport function runtimeError(\n code: string,\n message: string,\n details?: Record<string, unknown>,\n): RuntimeErrorEnvelope {\n const error = new Error(message) as RuntimeErrorEnvelope;\n Object.defineProperty(error, 'name', {\n value: 'RuntimeError',\n configurable: true,\n });\n\n return Object.assign(error, {\n code,\n category: resolveCategory(code),\n severity: 'error' as const,\n message,\n details,\n });\n}\n\nfunction resolveCategory(code: string): RuntimeErrorEnvelope['category'] {\n const prefix = code.split('.')[0] ?? 'RUNTIME';\n switch (prefix) {\n case 'PLAN':\n case 'CONTRACT':\n case 'LINT':\n case 'BUDGET':\n return prefix;\n default:\n return 'RUNTIME';\n }\n}\n","import { createHash } from 'node:crypto';\n\nconst STRING_LITERAL_REGEX = /'(?:''|[^'])*'/g;\nconst NUMERIC_LITERAL_REGEX = /\\b\\d+(?:\\.\\d+)?\\b/g;\nconst WHITESPACE_REGEX = /\\s+/g;\n\nexport function computeSqlFingerprint(sql: string): string {\n const withoutStrings = sql.replace(STRING_LITERAL_REGEX, '?');\n const withoutNumbers = withoutStrings.replace(NUMERIC_LITERAL_REGEX, '?');\n const normalized = withoutNumbers.replace(WHITESPACE_REGEX, ' ').trim().toLowerCase();\n\n const hash = createHash('sha256').update(normalized).digest('hex');\n return `sha256:${hash}`;\n}\n","import type { ExecutionPlan, PlanMeta, PlanRefs } from '@prisma-next/contract/types';\n\nexport type LintSeverity = 'error' | 'warn';\nexport type BudgetSeverity = 'error' | 'warn';\n\nexport interface LintFinding {\n readonly code: `LINT.${string}`;\n readonly severity: LintSeverity;\n readonly message: string;\n readonly details?: Record<string, unknown>;\n}\n\nexport interface BudgetFinding {\n readonly code: `BUDGET.${string}`;\n readonly severity: BudgetSeverity;\n readonly message: string;\n readonly details?: Record<string, unknown>;\n}\n\nexport interface RawGuardrailConfig {\n readonly budgets?: {\n readonly unboundedSelectSeverity?: BudgetSeverity;\n readonly estimatedRows?: number;\n };\n}\n\nexport interface RawGuardrailResult {\n readonly lints: LintFinding[];\n readonly budgets: BudgetFinding[];\n readonly statement: 'select' | 'mutation' | 'other';\n}\n\nconst SELECT_STAR_REGEX = /select\\s+\\*/i;\nconst LIMIT_REGEX = /\\blimit\\b/i;\nconst MUTATION_PREFIX_REGEX = /^(insert|update|delete|create|alter|drop|truncate)\\b/i;\n\nconst READ_ONLY_INTENTS = new Set(['read', 'report', 'readonly']);\n\nexport function evaluateRawGuardrails(\n plan: ExecutionPlan,\n config?: RawGuardrailConfig,\n): RawGuardrailResult {\n const lints: LintFinding[] = [];\n const budgets: BudgetFinding[] = [];\n\n const normalized = normalizeWhitespace(plan.sql);\n const statementType = classifyStatement(normalized);\n\n if (statementType === 'select') {\n if (SELECT_STAR_REGEX.test(normalized)) {\n lints.push(\n createLint('LINT.SELECT_STAR', 'error', 'Raw SQL plan selects all columns via *', {\n sql: snippet(plan.sql),\n }),\n );\n }\n\n if (!LIMIT_REGEX.test(normalized)) {\n const severity = config?.budgets?.unboundedSelectSeverity ?? 'error';\n lints.push(\n createLint('LINT.NO_LIMIT', 'warn', 'Raw SQL plan omits LIMIT clause', {\n sql: snippet(plan.sql),\n }),\n );\n\n budgets.push(\n createBudget(\n 'BUDGET.ROWS_EXCEEDED',\n severity,\n 'Raw SQL plan is unbounded and may exceed row budget',\n {\n sql: snippet(plan.sql),\n ...(config?.budgets?.estimatedRows !== undefined\n ? { estimatedRows: config.budgets.estimatedRows }\n : {}),\n },\n ),\n );\n }\n }\n\n if (isMutationStatement(statementType) && isReadOnlyIntent(plan.meta)) {\n lints.push(\n createLint(\n 'LINT.READ_ONLY_MUTATION',\n 'error',\n 'Raw SQL plan mutates data despite read-only intent',\n {\n sql: snippet(plan.sql),\n intent: plan.meta.annotations?.['intent'],\n },\n ),\n );\n }\n\n const refs = plan.meta.refs;\n if (refs) {\n evaluateIndexCoverage(refs, lints);\n }\n\n return { lints, budgets, statement: statementType };\n}\n\nfunction evaluateIndexCoverage(refs: PlanRefs, lints: LintFinding[]) {\n const predicateColumns = refs.columns ?? [];\n if (predicateColumns.length === 0) {\n return;\n }\n\n const indexes = refs.indexes ?? [];\n\n if (indexes.length === 0) {\n lints.push(\n createLint(\n 'LINT.UNINDEXED_PREDICATE',\n 'warn',\n 'Raw SQL plan predicates lack supporting indexes',\n {\n predicates: predicateColumns,\n },\n ),\n );\n return;\n }\n\n const hasSupportingIndex = predicateColumns.every((column) =>\n indexes.some(\n (index) =>\n index.table === column.table &&\n index.columns.some((col) => col.toLowerCase() === column.column.toLowerCase()),\n ),\n );\n\n if (!hasSupportingIndex) {\n lints.push(\n createLint(\n 'LINT.UNINDEXED_PREDICATE',\n 'warn',\n 'Raw SQL plan predicates lack supporting indexes',\n {\n predicates: predicateColumns,\n },\n ),\n );\n }\n}\n\nfunction classifyStatement(sql: string): 'select' | 'mutation' | 'other' {\n const trimmed = sql.trim();\n const lower = trimmed.toLowerCase();\n\n if (lower.startsWith('with')) {\n if (lower.includes('select')) {\n return 'select';\n }\n }\n\n if (lower.startsWith('select')) {\n return 'select';\n }\n\n if (MUTATION_PREFIX_REGEX.test(trimmed)) {\n return 'mutation';\n }\n\n return 'other';\n}\n\nfunction isMutationStatement(statement: 'select' | 'mutation' | 'other'): boolean {\n return statement === 'mutation';\n}\n\nfunction isReadOnlyIntent(meta: PlanMeta): boolean {\n const annotations = meta.annotations as { intent?: string } | undefined;\n const intent =\n typeof annotations?.intent === 'string' ? annotations.intent.toLowerCase() : undefined;\n return intent !== undefined && READ_ONLY_INTENTS.has(intent);\n}\n\nfunction normalizeWhitespace(value: string): string {\n return value.replace(/\\s+/g, ' ').trim();\n}\n\nfunction snippet(sql: string): string {\n return normalizeWhitespace(sql).slice(0, 200);\n}\n\nfunction createLint(\n code: LintFinding['code'],\n severity: LintFinding['severity'],\n message: string,\n details?: Record<string, unknown>,\n): LintFinding {\n return { code, severity, message, ...(details ? { details } : {}) };\n}\n\nfunction createBudget(\n code: BudgetFinding['code'],\n severity: BudgetFinding['severity'],\n message: string,\n details?: Record<string, unknown>,\n): BudgetFinding {\n return { code, severity, message, ...(details ? { details } : {}) };\n}\n","import type { ContractMarkerRecord } from '@prisma-next/contract/types';\nimport { type } from 'arktype';\n\n// Re-export for backward compatibility\nexport type { ContractMarkerRecord } from '@prisma-next/contract/types';\n\nexport interface ContractMarkerRow {\n core_hash: string;\n profile_hash: string;\n contract_json: unknown | null;\n canonical_version: number | null;\n updated_at: Date;\n app_tag: string | null;\n meta: unknown | null;\n}\n\nconst MetaSchema = type({ '[string]': 'unknown' });\n\nfunction parseMeta(meta: unknown): Record<string, unknown> {\n if (meta === null || meta === undefined) {\n return {};\n }\n\n let parsed: unknown;\n if (typeof meta === 'string') {\n try {\n parsed = JSON.parse(meta);\n } catch {\n return {};\n }\n } else {\n parsed = meta;\n }\n\n const result = MetaSchema(parsed);\n if (result instanceof type.errors) {\n return {};\n }\n\n return result as Record<string, unknown>;\n}\n\nconst ContractMarkerRowSchema = type({\n core_hash: 'string',\n profile_hash: 'string',\n 'contract_json?': 'unknown | null',\n 'canonical_version?': 'number | null',\n 'updated_at?': 'Date | string',\n 'app_tag?': 'string | null',\n 'meta?': 'unknown | null',\n});\n\nexport function parseContractMarkerRow(row: unknown): ContractMarkerRecord {\n const result = ContractMarkerRowSchema(row);\n if (result instanceof type.errors) {\n const messages = result.map((p: { message: string }) => p.message).join('; ');\n throw new Error(`Invalid contract marker row: ${messages}`);\n }\n\n const validatedRow = result as {\n core_hash: string;\n profile_hash: string;\n contract_json?: unknown | null;\n canonical_version?: number | null;\n updated_at?: Date | string;\n app_tag?: string | null;\n meta?: unknown | null;\n };\n\n const updatedAt = validatedRow.updated_at\n ? validatedRow.updated_at instanceof Date\n ? validatedRow.updated_at\n : new Date(validatedRow.updated_at)\n : new Date();\n\n return {\n coreHash: validatedRow.core_hash,\n profileHash: validatedRow.profile_hash,\n contractJson: validatedRow.contract_json ?? null,\n canonicalVersion: validatedRow.canonical_version ?? null,\n updatedAt,\n appTag: validatedRow.app_tag ?? null,\n meta: parseMeta(validatedRow.meta),\n };\n}\n","import type { ExecutionPlan } from '@prisma-next/contract/types';\nimport type { AfterExecuteResult, Plugin, PluginContext } from './types';\n\nexport interface BudgetsOptions {\n readonly maxRows?: number;\n readonly defaultTableRows?: number;\n readonly tableRows?: Record<string, number>;\n readonly maxLatencyMs?: number;\n readonly severities?: {\n readonly rowCount?: 'warn' | 'error';\n readonly latency?: 'warn' | 'error';\n };\n readonly explain?: {\n readonly enabled?: boolean;\n };\n}\n\ninterface DriverWithExplain {\n explain?(\n sql: string,\n params: unknown[],\n ): Promise<{ rows: ReadonlyArray<Record<string, unknown>> }>;\n}\n\nasync function computeEstimatedRows(\n plan: ExecutionPlan,\n driver: DriverWithExplain,\n): Promise<number | undefined> {\n if (typeof driver.explain !== 'function') {\n return undefined;\n }\n\n try {\n const result = await driver.explain(plan.sql, [...plan.params]);\n return extractEstimatedRows(result.rows);\n } catch {\n return undefined;\n }\n}\n\nfunction extractEstimatedRows(rows: ReadonlyArray<Record<string, unknown>>): number | undefined {\n for (const row of rows) {\n const estimate = findPlanRows(row);\n if (estimate !== undefined) {\n return estimate;\n }\n }\n\n return undefined;\n}\n\ntype ExplainNode = {\n Plan?: unknown;\n Plans?: unknown[];\n 'Plan Rows'?: number;\n [key: string]: unknown;\n};\n\nfunction findPlanRows(node: unknown): number | undefined {\n if (!node || typeof node !== 'object') {\n return undefined;\n }\n\n const explainNode = node as ExplainNode;\n const planRows = explainNode['Plan Rows'];\n if (typeof planRows === 'number') {\n return planRows;\n }\n\n if ('Plan' in explainNode && explainNode.Plan !== undefined) {\n const nested = findPlanRows(explainNode.Plan);\n if (nested !== undefined) {\n return nested;\n }\n }\n\n if (Array.isArray(explainNode.Plans)) {\n for (const child of explainNode.Plans) {\n const nested = findPlanRows(child);\n if (nested !== undefined) {\n return nested;\n }\n }\n }\n\n for (const value of Object.values(node as Record<string, unknown>)) {\n if (typeof value === 'object' && value !== null) {\n const nested = findPlanRows(value);\n if (nested !== undefined) {\n return nested;\n }\n }\n }\n\n return undefined;\n}\n\nfunction budgetError(code: string, message: string, details?: Record<string, unknown>) {\n const error = new Error(message) as Error & {\n code: string;\n category: 'BUDGET';\n severity: 'error';\n details?: Record<string, unknown>;\n };\n Object.defineProperty(error, 'name', {\n value: 'RuntimeError',\n configurable: true,\n });\n return Object.assign(error, {\n code,\n category: 'BUDGET' as const,\n severity: 'error' as const,\n details,\n });\n}\n\nfunction estimateRows(\n plan: ExecutionPlan,\n tableRows: Record<string, number>,\n defaultTableRows: number,\n): number | null {\n if (!plan.ast) {\n return null;\n }\n\n const table = plan.meta.refs?.tables?.[0];\n if (!table) {\n return null;\n }\n\n const tableEstimate = tableRows[table] ?? defaultTableRows;\n\n if (\n plan.ast &&\n typeof plan.ast === 'object' &&\n 'kind' in plan.ast &&\n plan.ast.kind === 'select' &&\n 'limit' in plan.ast &&\n typeof plan.ast.limit === 'number'\n ) {\n return Math.min(plan.ast.limit, tableEstimate);\n }\n\n return tableEstimate;\n}\n\nfunction hasDetectableLimit(plan: ExecutionPlan): boolean {\n if (\n plan.ast &&\n typeof plan.ast === 'object' &&\n 'kind' in plan.ast &&\n plan.ast.kind === 'select' &&\n 'limit' in plan.ast &&\n typeof plan.ast.limit === 'number'\n ) {\n return true;\n }\n\n const annotations = plan.meta.annotations as { limit?: number; LIMIT?: number } | undefined;\n return typeof annotations?.limit === 'number' || typeof annotations?.LIMIT === 'number';\n}\n\nexport function budgets<TContract = unknown, TAdapter = unknown, TDriver = unknown>(\n options?: BudgetsOptions,\n): Plugin<TContract, TAdapter, TDriver> {\n const maxRows = options?.maxRows ?? 10_000;\n const defaultTableRows = options?.defaultTableRows ?? 10_000;\n const tableRows = options?.tableRows ?? {};\n const maxLatencyMs = options?.maxLatencyMs ?? 1_000;\n const rowSeverity = options?.severities?.rowCount ?? 'error';\n const latencySeverity = options?.severities?.latency ?? 'warn';\n\n let observedRows = 0;\n\n return Object.freeze({\n name: 'budgets',\n\n async beforeExecute(plan: ExecutionPlan, ctx: PluginContext<TContract, TAdapter, TDriver>) {\n observedRows = 0;\n void ctx.now();\n\n const estimated = estimateRows(plan, tableRows, defaultTableRows);\n const isUnbounded = !hasDetectableLimit(plan);\n const sqlUpper = plan.sql.trimStart().toUpperCase();\n const isSelect = sqlUpper.startsWith('SELECT');\n\n // Check for unbounded queries first - these should always error if they exceed or equal the budget\n if (isSelect && isUnbounded) {\n if (estimated !== null && estimated >= maxRows) {\n const error = budgetError(\n 'BUDGET.ROWS_EXCEEDED',\n 'Unbounded SELECT query exceeds budget',\n {\n source: 'heuristic',\n estimatedRows: estimated,\n maxRows,\n },\n );\n\n const shouldBlock = rowSeverity === 'error' || ctx.mode === 'strict';\n if (shouldBlock) {\n throw error;\n }\n ctx.log.warn({\n code: error.code,\n message: error.message,\n details: error.details,\n });\n return;\n }\n\n // Even if we can't estimate, unbounded queries should error\n const error = budgetError('BUDGET.ROWS_EXCEEDED', 'Unbounded SELECT query exceeds budget', {\n source: 'heuristic',\n maxRows,\n });\n\n const shouldBlock = rowSeverity === 'error' || ctx.mode === 'strict';\n if (shouldBlock) {\n throw error;\n }\n ctx.log.warn({\n code: error.code,\n message: error.message,\n details: error.details,\n });\n return;\n }\n\n // For bounded queries, check if estimated exceeds budget\n if (estimated !== null) {\n if (estimated > maxRows) {\n const error = budgetError('BUDGET.ROWS_EXCEEDED', 'Estimated row count exceeds budget', {\n source: 'heuristic',\n estimatedRows: estimated,\n maxRows,\n });\n\n const shouldBlock = rowSeverity === 'error' || ctx.mode === 'strict';\n if (shouldBlock) {\n throw error;\n }\n ctx.log.warn({\n code: error.code,\n message: error.message,\n details: error.details,\n });\n }\n return;\n }\n\n // Fallback: if no AST, try EXPLAIN if enabled\n if (!plan.ast) {\n const explainEnabled = options?.explain?.enabled === true;\n\n if (explainEnabled && isSelect && typeof ctx.driver === 'object' && ctx.driver !== null) {\n const estimatedRows = await computeEstimatedRows(plan, ctx.driver as DriverWithExplain);\n if (estimatedRows !== undefined) {\n if (estimatedRows > maxRows) {\n const error = budgetError(\n 'BUDGET.ROWS_EXCEEDED',\n 'Estimated row count exceeds budget',\n {\n source: 'explain',\n estimatedRows,\n maxRows,\n },\n );\n\n const shouldBlock = rowSeverity === 'error' || ctx.mode === 'strict';\n if (shouldBlock) {\n throw error;\n }\n ctx.log.warn({\n code: error.code,\n message: error.message,\n details: error.details,\n });\n }\n return;\n }\n }\n }\n },\n\n async onRow(\n _row: Record<string, unknown>,\n _plan: ExecutionPlan,\n _ctx: PluginContext<TContract, TAdapter, TDriver>,\n ) {\n void _row;\n void _plan;\n void _ctx;\n observedRows += 1;\n if (observedRows > maxRows) {\n throw budgetError('BUDGET.ROWS_EXCEEDED', 'Observed row count exceeds budget', {\n source: 'observed',\n observedRows,\n maxRows,\n });\n }\n },\n\n async afterExecute(\n _plan: ExecutionPlan,\n result: AfterExecuteResult,\n ctx: PluginContext<TContract, TAdapter, TDriver>,\n ) {\n const latencyMs = result.latencyMs;\n if (latencyMs > maxLatencyMs) {\n const error = budgetError('BUDGET.TIME_EXCEEDED', 'Query latency exceeds budget', {\n latencyMs,\n maxLatencyMs,\n });\n\n const shouldBlock = latencySeverity === 'error' && ctx.mode === 'strict';\n if (shouldBlock) {\n throw error;\n }\n ctx.log.warn({\n code: error.code,\n message: error.message,\n details: error.details,\n });\n }\n },\n });\n}\n","import type { ExecutionPlan } from '@prisma-next/contract/types';\nimport { evaluateRawGuardrails } from '../guardrails/raw';\nimport type { Plugin, PluginContext } from './types';\n\nexport interface LintsOptions {\n readonly severities?: {\n readonly selectStar?: 'warn' | 'error';\n readonly noLimit?: 'warn' | 'error';\n readonly readOnlyMutation?: 'warn' | 'error';\n readonly unindexedPredicate?: 'warn' | 'error';\n };\n}\n\nfunction lintError(code: string, message: string, details?: Record<string, unknown>) {\n const error = new Error(message) as Error & {\n code: string;\n category: 'LINT';\n severity: 'error';\n details?: Record<string, unknown>;\n };\n Object.defineProperty(error, 'name', {\n value: 'RuntimeError',\n configurable: true,\n });\n return Object.assign(error, {\n code,\n category: 'LINT' as const,\n severity: 'error' as const,\n details,\n });\n}\n\nexport function lints<TContract = unknown, TAdapter = unknown, TDriver = unknown>(\n options?: LintsOptions,\n): Plugin<TContract, TAdapter, TDriver> {\n return Object.freeze({\n name: 'lints',\n\n async beforeExecute(plan: ExecutionPlan, ctx: PluginContext<TContract, TAdapter, TDriver>) {\n if (plan.ast) {\n return;\n }\n\n const evaluation = evaluateRawGuardrails(plan);\n\n for (const lint of evaluation.lints) {\n const configuredSeverity = getConfiguredSeverity(lint.code, options);\n const effectiveSeverity = configuredSeverity ?? lint.severity;\n\n if (effectiveSeverity === 'error') {\n throw lintError(lint.code, lint.message, lint.details);\n }\n if (effectiveSeverity === 'warn') {\n ctx.log.warn({\n code: lint.code,\n message: lint.message,\n details: lint.details,\n });\n }\n }\n },\n });\n}\n\nfunction getConfiguredSeverity(code: string, options?: LintsOptions): 'warn' | 'error' | undefined {\n const severities = options?.severities;\n if (!severities) {\n return undefined;\n }\n\n if (code === 'LINT.SELECT_STAR') {\n return severities.selectStar;\n }\n if (code === 'LINT.NO_LIMIT') {\n return severities.noLimit;\n }\n if (code === 'LINT.READ_ONLY_MUTATION') {\n return severities.readOnlyMutation;\n }\n if (code === 'LINT.UNINDEXED_PREDICATE') {\n return severities.unindexedPredicate;\n }\n\n return undefined;\n}\n","import type { ExecutionPlan } from '@prisma-next/contract/types';\nimport type { OperationRegistry } from '@prisma-next/operations';\nimport { runtimeError } from './errors';\nimport { computeSqlFingerprint } from './fingerprint';\nimport { parseContractMarkerRow } from './marker';\nimport type { Log, Plugin, PluginContext } from './plugins/types';\nimport type { RuntimeFamilyAdapter } from './runtime-spi';\n\nexport interface RuntimeVerifyOptions {\n readonly mode: 'onFirstUse' | 'startup' | 'always';\n readonly requireMarker: boolean;\n}\n\nexport type TelemetryOutcome = 'success' | 'runtime-error';\n\nexport interface RuntimeTelemetryEvent {\n readonly lane: string;\n readonly target: string;\n readonly fingerprint: string;\n readonly outcome: TelemetryOutcome;\n readonly durationMs?: number;\n}\n\nexport interface RuntimeCoreOptions<TContract = unknown, TAdapter = unknown, TDriver = unknown> {\n readonly familyAdapter: RuntimeFamilyAdapter<TContract>;\n readonly driver: TDriver;\n readonly verify: RuntimeVerifyOptions;\n readonly plugins?: readonly Plugin<TContract, TAdapter, TDriver>[];\n readonly mode?: 'strict' | 'permissive';\n readonly log?: Log;\n readonly operationRegistry: OperationRegistry;\n}\n\nexport interface RuntimeCore<TContract = unknown, TAdapter = unknown, TDriver = unknown> {\n // Type parameters are used in the implementation for type safety\n readonly _typeContract?: TContract;\n readonly _typeAdapter?: TAdapter;\n readonly _typeDriver?: TDriver;\n execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row>): AsyncIterable<Row>;\n telemetry(): RuntimeTelemetryEvent | null;\n close(): Promise<void>;\n operations(): OperationRegistry;\n}\n\ninterface DriverWithQuery<_TDriver> {\n query(sql: string, params: readonly unknown[]): Promise<{ rows: ReadonlyArray<unknown> }>;\n}\n\ninterface DriverWithExecute<_TDriver> {\n execute<Row = Record<string, unknown>>(options: {\n sql: string;\n params: readonly unknown[];\n }): AsyncIterable<Row>;\n}\n\ninterface DriverWithClose<_TDriver> {\n close(): Promise<void>;\n}\n\nclass RuntimeCoreImpl<TContract = unknown, TAdapter = unknown, TDriver = unknown>\n implements RuntimeCore<TContract, TAdapter, TDriver>\n{\n readonly _typeContract?: TContract;\n readonly _typeAdapter?: TAdapter;\n readonly _typeDriver?: TDriver;\n private readonly contract: TContract;\n private readonly familyAdapter: RuntimeFamilyAdapter<TContract>;\n private readonly driver: TDriver;\n private readonly plugins: readonly Plugin<TContract, TAdapter, TDriver>[];\n private readonly mode: 'strict' | 'permissive';\n private readonly verify: RuntimeVerifyOptions;\n private readonly operationRegistry: OperationRegistry;\n private readonly pluginContext: PluginContext<TContract, TAdapter, TDriver>;\n\n private verified: boolean;\n private startupVerified: boolean;\n private _telemetry: RuntimeTelemetryEvent | null;\n\n constructor(options: RuntimeCoreOptions<TContract, TAdapter, TDriver>) {\n const { familyAdapter, driver } = options;\n this.contract = familyAdapter.contract;\n this.familyAdapter = familyAdapter;\n this.driver = driver;\n this.plugins = options.plugins ?? [];\n this.mode = options.mode ?? 'strict';\n this.verify = options.verify;\n this.operationRegistry = options.operationRegistry;\n\n this.verified = options.verify.mode === 'startup' ? false : options.verify.mode === 'always';\n this.startupVerified = false;\n this._telemetry = null;\n\n this.pluginContext = {\n contract: this.contract,\n adapter: options.familyAdapter as unknown as TAdapter,\n driver: this.driver,\n mode: this.mode,\n now: () => Date.now(),\n log: options.log ?? {\n info: () => {\n // No-op in MVP - diagnostics stay out of runtime core\n },\n warn: () => {\n // No-op in MVP - diagnostics stay out of runtime core\n },\n error: () => {\n // No-op in MVP - diagnostics stay out of runtime core\n },\n },\n };\n }\n\n private async verifyPlanIfNeeded(_plan: ExecutionPlan): Promise<void> {\n void _plan;\n if (this.verify.mode === 'always') {\n this.verified = false;\n }\n\n if (this.verified) {\n return;\n }\n\n const readStatement = this.familyAdapter.markerReader.readMarkerStatement();\n const driver = this.driver as unknown as DriverWithQuery<TDriver>;\n const result = await driver.query(readStatement.sql, readStatement.params);\n\n if (result.rows.length === 0) {\n if (this.verify.requireMarker) {\n throw runtimeError('CONTRACT.MARKER_MISSING', 'Contract marker not found in database');\n }\n\n this.verified = true;\n return;\n }\n\n const marker = parseContractMarkerRow(result.rows[0]);\n\n const contract = this.contract as { coreHash: string; profileHash?: string | null };\n if (marker.coreHash !== contract.coreHash) {\n throw runtimeError('CONTRACT.MARKER_MISMATCH', 'Database core hash does not match contract', {\n expected: contract.coreHash,\n actual: marker.coreHash,\n });\n }\n\n const expectedProfile = contract.profileHash ?? null;\n if (expectedProfile !== null && marker.profileHash !== expectedProfile) {\n throw runtimeError(\n 'CONTRACT.MARKER_MISMATCH',\n 'Database profile hash does not match contract',\n {\n expectedProfile,\n actualProfile: marker.profileHash,\n },\n );\n }\n\n this.verified = true;\n this.startupVerified = true;\n }\n\n private validatePlan(plan: ExecutionPlan): void {\n this.familyAdapter.validatePlan(plan, this.contract);\n }\n\n private recordTelemetry(\n plan: ExecutionPlan,\n outcome: TelemetryOutcome,\n durationMs?: number,\n ): void {\n const contract = this.contract as { target: string };\n this._telemetry = Object.freeze({\n lane: plan.meta.lane,\n target: contract.target,\n fingerprint: computeSqlFingerprint(plan.sql),\n outcome,\n ...(durationMs !== undefined ? { durationMs } : {}),\n });\n }\n\n execute<Row = Record<string, unknown>>(plan: ExecutionPlan<Row>): AsyncIterable<Row> {\n this.validatePlan(plan);\n this._telemetry = null;\n\n const iterator = async function* (\n self: RuntimeCoreImpl<TContract, TAdapter, TDriver>,\n ): AsyncGenerator<Row, void, unknown> {\n const startedAt = Date.now();\n let rowCount = 0;\n let completed = false;\n\n if (!self.startupVerified && self.verify.mode === 'startup') {\n await self.verifyPlanIfNeeded(plan);\n }\n\n if (self.verify.mode === 'onFirstUse') {\n await self.verifyPlanIfNeeded(plan);\n }\n\n try {\n if (self.verify.mode === 'always') {\n await self.verifyPlanIfNeeded(plan);\n }\n\n for (const plugin of self.plugins) {\n if (plugin.beforeExecute) {\n await plugin.beforeExecute(plan, self.pluginContext);\n }\n }\n\n const driver = self.driver as unknown as DriverWithExecute<TDriver>;\n const encodedParams = plan.params as readonly unknown[];\n\n for await (const row of driver.execute<Record<string, unknown>>({\n sql: plan.sql,\n params: encodedParams,\n })) {\n for (const plugin of self.plugins) {\n if (plugin.onRow) {\n await plugin.onRow(row, plan, self.pluginContext);\n }\n }\n rowCount++;\n yield row as Row;\n }\n\n completed = true;\n self.recordTelemetry(plan, 'success', Date.now() - startedAt);\n } catch (error) {\n if (self._telemetry === null) {\n self.recordTelemetry(plan, 'runtime-error', Date.now() - startedAt);\n }\n\n const latencyMs = Date.now() - startedAt;\n for (const plugin of self.plugins) {\n if (plugin.afterExecute) {\n try {\n await plugin.afterExecute(\n plan,\n { rowCount, latencyMs, completed },\n self.pluginContext,\n );\n } catch {\n // Ignore errors from afterExecute hooks\n }\n }\n }\n\n throw error;\n }\n\n const latencyMs = Date.now() - startedAt;\n for (const plugin of self.plugins) {\n if (plugin.afterExecute) {\n await plugin.afterExecute(plan, { rowCount, latencyMs, completed }, self.pluginContext);\n }\n }\n };\n\n return iterator(this);\n }\n\n telemetry(): RuntimeTelemetryEvent | null {\n return this._telemetry;\n }\n\n operations(): OperationRegistry {\n return this.operationRegistry;\n }\n\n close(): Promise<void> {\n const driver = this.driver as unknown as DriverWithClose<TDriver>;\n if (typeof driver.close === 'function') {\n return driver.close();\n }\n return Promise.resolve();\n }\n}\n\nexport function createRuntimeCore<TContract = unknown, TAdapter = unknown, TDriver = unknown>(\n options: RuntimeCoreOptions<TContract, TAdapter, TDriver>,\n): RuntimeCore<TContract, TAdapter, TDriver> {\n return new RuntimeCoreImpl(options);\n}\n"],"mappings":"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","names":["lints","budgets","error","shouldBlock","latencyMs"]}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@prisma-next/runtime-executor",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "sideEffects": false,
6
+ "description": "Target-agnostic execution engine for Prisma Next",
7
+ "dependencies": {
8
+ "arktype": "^2.1.25",
9
+ "@prisma-next/contract": "0.0.1",
10
+ "@prisma-next/operations": "0.0.1"
11
+ },
12
+ "devDependencies": {
13
+ "@prisma/dev": "^0.1.1",
14
+ "tsup": "^8.3.0",
15
+ "typescript": "^5.9.3",
16
+ "vitest": "^2.1.1",
17
+ "@prisma-next/test-utils": "0.0.1"
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "import": "./dist/index.js"
26
+ }
27
+ },
28
+ "scripts": {
29
+ "build": "tsup --config tsup.config.ts",
30
+ "test": "vitest run",
31
+ "test:coverage": "vitest run --coverage",
32
+ "typecheck": "tsc --project tsconfig.json --noEmit",
33
+ "lint": "biome check . --config-path ../../../biome.json --error-on-warnings",
34
+ "clean": "node ../../../scripts/clean.mjs"
35
+ }
36
+ }