@hs-x/checkpoint 0.1.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/CONTEXT.md ADDED
@@ -0,0 +1,40 @@
1
+ # @hs-x/checkpoint
2
+
3
+ ## Purpose
4
+
5
+ `@hs-x/checkpoint` provides the runtime-side observability primitives for HS-X: Analytics Engine metric events, D1 exemplar rows, error fingerprinting, redaction, sampling, and bounded error write policy.
6
+
7
+ ## Contracts
8
+
9
+ - **Produces:** Checkpoint metric events, exemplar records, error fingerprints, redacted payloads, and test/fake writer implementations.
10
+ - **Consumes:** Checkpoint and drift schemas from `@hs-x/types`.
11
+ - **Depended on by:** `@hs-x/runtime` instrumentation, dashboard read surfaces, `hs-x doctor` / `drift` / `repair`, and future MCP tools.
12
+
13
+ ## Key types
14
+
15
+ - `fingerprintError()` — creates low-cardinality error grouping keys.
16
+ - `redactCheckpointValue()` — recursively redacts common PII and secret-shaped values.
17
+ - `createExemplarPolicy()` — applies success sampling and error write budgets.
18
+ - `createMemoryCheckpointWriter()` — fake writer for unit and contract tests.
19
+ - `createCloudflareCheckpointWriter()` — writes complete metrics to Analytics Engine, sampled exemplars to D1/R2, and queue envelopes for async fanout.
20
+ - `listD1CheckpointExemplars()` — reads D1 exemplar rows with schema validation and bounded filters.
21
+ - `recordCheckpointInvocation()` — writes the metric event and any allowed exemplar through a writer.
22
+
23
+ ## Common edits
24
+
25
+ - **Adding a write target.** Keep the `CheckpointWriter` contract stable and add a writer implementation behind it. Do not make runtime depend on Cloudflare globals directly; pass minimal binding-shaped interfaces.
26
+ - **Changing redaction.** Add PII-shaped fixtures/tests before changing default behavior.
27
+ - **Changing fingerprinting.** Keep fingerprints low-cardinality; do not include portal ids, object ids, timestamps, request ids, or full stack traces.
28
+
29
+ ## Gotchas
30
+
31
+ - Analytics Engine metric events are complete and unsampled. D1 exemplar rows are sampled or budgeted.
32
+ - The default D1 writer inserts into `checkpoint_exemplars`; the seed migration lives in `migrations/0001_checkpoint_exemplars.sql`.
33
+ - `unknown` drift is not healthy. Any CLI/dashboard surface must preserve that distinction.
34
+ - Redaction here is the default safety layer; later Schema annotations should make it more precise, not weaker.
35
+
36
+ ## Pointers
37
+
38
+ - `docs/hs-x-phase-1-plan.md#97-w6--observability-drift-attestation-and-checkpoint`
39
+ - `docs/hs-x-architecture.md#observability--checkpoint`
40
+ - Related packages: `@hs-x/types`, `@hs-x/runtime`, `@hs-x/control-plane`
package/README.md ADDED
@@ -0,0 +1,36 @@
1
+ # @hs-x/checkpoint
2
+
3
+ Checkpoint observability primitives for HS-X runtime instrumentation.
4
+
5
+ This package defines fingerprinting, redaction, exemplar policy, fake writer behavior, and Cloudflare binding writers against the canonical schemas in `@hs-x/types`.
6
+
7
+ ## Cloudflare writer
8
+
9
+ `createCloudflareCheckpointWriter()` composes the runtime write targets behind the stable `CheckpointWriter` contract:
10
+
11
+ - Analytics Engine receives every `CheckpointMetricEvent`.
12
+ - D1 receives sampled or budgeted `CheckpointRunExemplar` rows in `checkpoint_exemplars` by default.
13
+ - Queue receives metric and exemplar envelopes for async fanout.
14
+ - R2 receives error exemplars by default, with optional success exemplar archival.
15
+
16
+ The D1 table name is configurable but must already exist. The default migration is published at `migrations/0001_checkpoint_exemplars.sql` and creates:
17
+
18
+ ```sql
19
+ CREATE TABLE checkpoint_exemplars (
20
+ exemplar_id TEXT PRIMARY KEY,
21
+ account_id TEXT NOT NULL,
22
+ hsx_account_id TEXT NOT NULL,
23
+ project_id TEXT NOT NULL,
24
+ deploy_id TEXT NOT NULL,
25
+ worker_name TEXT NOT NULL,
26
+ capability_id TEXT NOT NULL,
27
+ portal_id TEXT NOT NULL,
28
+ outcome TEXT NOT NULL,
29
+ observed_at TEXT NOT NULL,
30
+ duration_ms REAL NOT NULL,
31
+ fingerprint TEXT,
32
+ value_json TEXT NOT NULL
33
+ );
34
+ ```
35
+
36
+ `listD1CheckpointExemplars()` reads those D1 rows back through the same shared schema with optional project, deploy, outcome, fingerprint, and limit filters.
@@ -0,0 +1,122 @@
1
+ import type { CheckpointErrorFingerprint, CheckpointMetricEvent, CheckpointRunExemplar } from '@hs-x/types';
2
+ import { Effect } from 'effect';
3
+ export declare const CHECKPOINT_VERSION = "0.1.0";
4
+ export declare const REDACTED = "[redacted]";
5
+ export interface FingerprintErrorOptions {
6
+ readonly capabilityId: string;
7
+ readonly error: unknown;
8
+ }
9
+ export interface RedactionOptions {
10
+ readonly maxDepth?: number;
11
+ }
12
+ export interface ExemplarPolicyOptions {
13
+ readonly successSampleRate?: number;
14
+ readonly errorWindowMs?: number;
15
+ readonly maxExemplarsPerFingerprint?: number;
16
+ readonly maxErrorExemplarsPerWorkerWindow?: number;
17
+ }
18
+ export interface ExemplarPolicy {
19
+ shouldPersistSuccess(exemplar: CheckpointRunExemplar): boolean;
20
+ shouldPersistError(exemplar: CheckpointRunExemplar): boolean;
21
+ }
22
+ export interface CheckpointWriter {
23
+ writeMetric(event: CheckpointMetricEvent): Promise<void> | void;
24
+ writeExemplar(exemplar: CheckpointRunExemplar): Promise<void> | void;
25
+ }
26
+ export interface AnalyticsEngineDatasetLike {
27
+ writeDataPoint(dataPoint: {
28
+ readonly blobs?: readonly string[];
29
+ readonly doubles?: readonly number[];
30
+ readonly indexes?: readonly string[];
31
+ }): void;
32
+ }
33
+ export interface D1DatabaseLike {
34
+ prepare(query: string): D1PreparedStatementLike;
35
+ }
36
+ export interface D1PreparedStatementLike {
37
+ bind(...values: readonly unknown[]): D1PreparedStatementLike;
38
+ run(): Promise<unknown>;
39
+ }
40
+ export interface D1ReadableDatabaseLike {
41
+ prepare(query: string): D1ReadablePreparedStatementLike;
42
+ }
43
+ export interface D1ReadablePreparedStatementLike extends D1PreparedStatementLike {
44
+ bind(...values: readonly unknown[]): D1ReadablePreparedStatementLike;
45
+ all<T = unknown>(): Promise<{
46
+ readonly results: readonly T[];
47
+ }>;
48
+ }
49
+ export interface QueueLike {
50
+ send(message: unknown): Promise<void> | void;
51
+ }
52
+ export interface R2BucketLike {
53
+ put(key: string, value: string, options?: R2PutOptionsLike): Promise<unknown>;
54
+ }
55
+ export interface R2PutOptionsLike {
56
+ readonly httpMetadata?: {
57
+ readonly contentType?: string;
58
+ };
59
+ readonly customMetadata?: Record<string, string>;
60
+ }
61
+ export interface CloudflareCheckpointWriterOptions {
62
+ readonly analyticsEngine?: AnalyticsEngineDatasetLike;
63
+ readonly d1?: D1DatabaseLike;
64
+ readonly queue?: QueueLike;
65
+ readonly r2?: R2BucketLike;
66
+ readonly d1TableName?: string;
67
+ readonly r2Prefix?: string;
68
+ readonly queueMetricEvents?: boolean;
69
+ readonly queueExemplarEvents?: boolean;
70
+ readonly writeR2SuccessExemplars?: boolean;
71
+ }
72
+ export interface ListD1CheckpointExemplarsOptions {
73
+ readonly d1: D1ReadableDatabaseLike;
74
+ readonly d1TableName?: string;
75
+ /**
76
+ * Required: scopes the read to a single tenant. Without this filter a
77
+ * caller who knows another account's `projectId` could read its
78
+ * exemplars (cross-tenant IDOR). Must be the authenticated caller's
79
+ * account, never a value derived from the request path.
80
+ */
81
+ readonly accountId: string;
82
+ readonly projectId?: string;
83
+ readonly deployId?: string;
84
+ readonly outcome?: CheckpointMetricEvent['outcome'];
85
+ readonly fingerprint?: string;
86
+ readonly limit?: number;
87
+ }
88
+ export type CheckpointQueueEvent = {
89
+ readonly type: 'checkpoint.metric';
90
+ readonly version: typeof CHECKPOINT_VERSION;
91
+ readonly event: CheckpointMetricEvent;
92
+ } | {
93
+ readonly type: 'checkpoint.exemplar';
94
+ readonly version: typeof CHECKPOINT_VERSION;
95
+ readonly exemplar: CheckpointRunExemplar;
96
+ };
97
+ export interface RecordCheckpointInvocationOptions {
98
+ readonly writer: CheckpointWriter;
99
+ readonly policy?: ExemplarPolicy;
100
+ readonly metric: CheckpointMetricEvent;
101
+ readonly input?: unknown;
102
+ readonly output?: unknown;
103
+ readonly error?: unknown;
104
+ }
105
+ export interface RecordCheckpointInvocationResult {
106
+ readonly metric: CheckpointMetricEvent;
107
+ readonly exemplar?: CheckpointRunExemplar;
108
+ }
109
+ export declare function fingerprintError({ capabilityId, error, }: FingerprintErrorOptions): CheckpointErrorFingerprint;
110
+ export declare function redactCheckpointValue(value: unknown, options?: RedactionOptions): unknown;
111
+ export declare function createExemplarPolicy(options?: ExemplarPolicyOptions): ExemplarPolicy;
112
+ export declare function recordCheckpointInvocation({ writer, policy, metric, input, output, error, }: RecordCheckpointInvocationOptions): Promise<RecordCheckpointInvocationResult>;
113
+ export declare function recordCheckpointInvocationEffect({ writer, policy, metric, input, output, error, }: RecordCheckpointInvocationOptions): Effect.Effect<RecordCheckpointInvocationResult, unknown>;
114
+ export declare function createCloudflareCheckpointWriter({ analyticsEngine, d1, queue, r2, d1TableName, r2Prefix, queueMetricEvents, queueExemplarEvents, writeR2SuccessExemplars, }: CloudflareCheckpointWriterOptions): CheckpointWriter;
115
+ export declare function metricDataPoint(event: CheckpointMetricEvent): {
116
+ readonly blobs: readonly string[];
117
+ readonly doubles: readonly number[];
118
+ readonly indexes: readonly string[];
119
+ };
120
+ export declare function checkpointExemplarId(exemplar: CheckpointRunExemplar): string;
121
+ export declare function listD1CheckpointExemplars({ d1, d1TableName, accountId, projectId, deployId, outcome, fingerprint, limit, }: ListD1CheckpointExemplarsOptions): Promise<readonly CheckpointRunExemplar[]>;
122
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,395 @@
1
+ import { schemas } from '@hs-x/types';
2
+ import { Effect, Schema } from 'effect';
3
+ export const CHECKPOINT_VERSION = '0.1.0';
4
+ export const REDACTED = '[redacted]';
5
+ const defaultPolicy = createExemplarPolicy();
6
+ export function fingerprintError({ capabilityId, error, }) {
7
+ const errorClass = errorClassFor(error);
8
+ const stackSignature = stackSignatureFor(errorClass, error);
9
+ const fingerprint = `${capabilityId}:${errorClass}:${hash(`${capabilityId}:${errorClass}:${stackSignature}`)}`;
10
+ return {
11
+ capabilityId: Schema.decodeSync(schemas.CapabilityId)(capabilityId),
12
+ errorClass,
13
+ stackSignature,
14
+ fingerprint,
15
+ };
16
+ }
17
+ export function redactCheckpointValue(value, options = {}) {
18
+ return redact(value, options.maxDepth ?? 8, new WeakSet());
19
+ }
20
+ export function createExemplarPolicy(options = {}) {
21
+ const successSampleRate = clamp(options.successSampleRate ?? 0.01, 0, 1);
22
+ const errorWindowMs = options.errorWindowMs ?? 60_000;
23
+ const maxExemplarsPerFingerprint = options.maxExemplarsPerFingerprint ?? 10;
24
+ const maxErrorExemplarsPerWorkerWindow = options.maxErrorExemplarsPerWorkerWindow ?? 100;
25
+ const fingerprintCounts = new Map();
26
+ const workerCounts = new Map();
27
+ return {
28
+ shouldPersistSuccess(exemplar) {
29
+ if (exemplar.outcome !== 'success') {
30
+ return false;
31
+ }
32
+ if (successSampleRate <= 0) {
33
+ return false;
34
+ }
35
+ if (successSampleRate >= 1) {
36
+ return true;
37
+ }
38
+ const key = `${exemplar.deployId}:${exemplar.workerName}:${exemplar.capabilityId}:${exemplar.portalId}:${exemplar.observedAt}`;
39
+ return hashToUnit(key) < successSampleRate;
40
+ },
41
+ shouldPersistError(exemplar) {
42
+ if (exemplar.outcome !== 'error' || !exemplar.fingerprint) {
43
+ return false;
44
+ }
45
+ const window = windowStart(exemplar.observedAt, errorWindowMs);
46
+ const fingerprintKey = `${exemplar.fingerprint.fingerprint}:${window}`;
47
+ const workerKey = `${exemplar.deployId}:${exemplar.workerName}:${window}`;
48
+ const fingerprintCount = fingerprintCounts.get(fingerprintKey) ?? 0;
49
+ const workerCount = workerCounts.get(workerKey) ?? 0;
50
+ if (fingerprintCount >= maxExemplarsPerFingerprint ||
51
+ workerCount >= maxErrorExemplarsPerWorkerWindow) {
52
+ return false;
53
+ }
54
+ fingerprintCounts.set(fingerprintKey, fingerprintCount + 1);
55
+ workerCounts.set(workerKey, workerCount + 1);
56
+ return true;
57
+ },
58
+ };
59
+ }
60
+ export async function recordCheckpointInvocation({ writer, policy = defaultPolicy, metric, input, output, error, }) {
61
+ return Effect.runPromise(recordCheckpointInvocationEffect({ writer, policy, metric, input, output, error }));
62
+ }
63
+ export function recordCheckpointInvocationEffect({ writer, policy = defaultPolicy, metric, input, output, error, }) {
64
+ return Effect.gen(function* () {
65
+ yield* writeMetricEffect(writer, metric);
66
+ const exemplar = buildExemplar({ metric, input, output, error });
67
+ const shouldWrite = yield* shouldPersistExemplarEffect(policy, exemplar);
68
+ if (!shouldWrite) {
69
+ return { metric };
70
+ }
71
+ yield* writeExemplarEffect(writer, exemplar);
72
+ return { metric, exemplar };
73
+ });
74
+ }
75
+ function shouldPersistExemplarEffect(policy, exemplar) {
76
+ return Effect.try({
77
+ try: () => exemplar.outcome === 'success'
78
+ ? policy.shouldPersistSuccess(exemplar)
79
+ : policy.shouldPersistError(exemplar),
80
+ catch: (cause) => cause,
81
+ });
82
+ }
83
+ function writeMetricEffect(writer, metric) {
84
+ return Effect.tryPromise({
85
+ try: () => Promise.resolve(writer.writeMetric(metric)),
86
+ catch: (cause) => cause,
87
+ });
88
+ }
89
+ function writeExemplarEffect(writer, exemplar) {
90
+ return Effect.tryPromise({
91
+ try: () => Promise.resolve(writer.writeExemplar(exemplar)),
92
+ catch: (cause) => cause,
93
+ });
94
+ }
95
+ export function createCloudflareCheckpointWriter({ analyticsEngine, d1, queue, r2, d1TableName = 'checkpoint_exemplars', r2Prefix = 'checkpoint/exemplars', queueMetricEvents = true, queueExemplarEvents = true, writeR2SuccessExemplars = false, }) {
96
+ assertSafeSqlIdentifier(d1TableName, 'd1TableName');
97
+ const normalizedR2Prefix = r2Prefix.replace(/^\/+|\/+$/g, '');
98
+ return {
99
+ async writeMetric(event) {
100
+ analyticsEngine?.writeDataPoint(metricDataPoint(event));
101
+ if (queue && queueMetricEvents) {
102
+ await queue.send({
103
+ type: 'checkpoint.metric',
104
+ version: CHECKPOINT_VERSION,
105
+ event,
106
+ });
107
+ }
108
+ },
109
+ async writeExemplar(exemplar) {
110
+ if (d1) {
111
+ await d1
112
+ .prepare(`INSERT INTO ${d1TableName} (
113
+ exemplar_id,
114
+ account_id,
115
+ hsx_account_id,
116
+ project_id,
117
+ deploy_id,
118
+ worker_name,
119
+ capability_id,
120
+ portal_id,
121
+ outcome,
122
+ observed_at,
123
+ duration_ms,
124
+ fingerprint,
125
+ value_json
126
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`)
127
+ .bind(checkpointExemplarId(exemplar), exemplar.accountId, exemplar.hsXAccountId, exemplar.projectId, exemplar.deployId, exemplar.workerName, exemplar.capabilityId, exemplar.portalId, exemplar.outcome, exemplar.observedAt, exemplar.durationMs, exemplar.fingerprint?.fingerprint ?? null, JSON.stringify(exemplar))
128
+ .run();
129
+ }
130
+ if (r2 && (writeR2SuccessExemplars || exemplar.outcome === 'error')) {
131
+ // Encode accountId as a prefix segment so R2 keys are namespaced
132
+ // per tenant. Defense-in-depth against cross-account projectId
133
+ // collisions and enumeration via shared `<prefix>/<projectId>/...`
134
+ // paths. Existing data written before this change lives under
135
+ // `<prefix>/<projectId>/...` and is not rewritten — readers that
136
+ // need pre-migration objects must check both layouts.
137
+ const key = [
138
+ normalizedR2Prefix,
139
+ exemplar.accountId,
140
+ exemplar.projectId,
141
+ checkpointExemplarId(exemplar),
142
+ ]
143
+ .filter((part) => part.length > 0)
144
+ .join('/');
145
+ await r2.put(key, JSON.stringify(exemplar), {
146
+ httpMetadata: { contentType: 'application/json' },
147
+ customMetadata: {
148
+ accountId: exemplar.accountId,
149
+ projectId: exemplar.projectId,
150
+ deployId: exemplar.deployId,
151
+ capabilityId: exemplar.capabilityId,
152
+ outcome: exemplar.outcome,
153
+ },
154
+ });
155
+ }
156
+ if (queue && queueExemplarEvents) {
157
+ await queue.send({
158
+ type: 'checkpoint.exemplar',
159
+ version: CHECKPOINT_VERSION,
160
+ exemplar,
161
+ });
162
+ }
163
+ },
164
+ };
165
+ }
166
+ export function metricDataPoint(event) {
167
+ return {
168
+ blobs: [
169
+ event.accountId,
170
+ event.hsXAccountId,
171
+ event.projectId,
172
+ event.deployId,
173
+ event.workerName,
174
+ event.capabilityId,
175
+ event.portalId,
176
+ event.outcome,
177
+ event.observedAt,
178
+ ],
179
+ doubles: [event.durationMs, event.outcome === 'error' ? 1 : 0],
180
+ indexes: [
181
+ event.hsXAccountId,
182
+ event.projectId,
183
+ event.deployId,
184
+ event.capabilityId,
185
+ event.portalId,
186
+ ],
187
+ };
188
+ }
189
+ export function checkpointExemplarId(exemplar) {
190
+ return [
191
+ exemplar.observedAt.replace(/[^0-9A-Za-z.-]/g, '_'),
192
+ exemplar.deployId,
193
+ exemplar.workerName,
194
+ exemplar.capabilityId,
195
+ exemplar.portalId,
196
+ hash(JSON.stringify({
197
+ observedAt: exemplar.observedAt,
198
+ deployId: exemplar.deployId,
199
+ workerName: exemplar.workerName,
200
+ capabilityId: exemplar.capabilityId,
201
+ portalId: exemplar.portalId,
202
+ outcome: exemplar.outcome,
203
+ fingerprint: exemplar.fingerprint?.fingerprint ?? '',
204
+ })),
205
+ ]
206
+ .map((part) => sanitizePathPart(part))
207
+ .join('__');
208
+ }
209
+ export async function listD1CheckpointExemplars({ d1, d1TableName = 'checkpoint_exemplars', accountId, projectId, deployId, outcome, fingerprint, limit = 50, }) {
210
+ assertSafeSqlIdentifier(d1TableName, 'd1TableName');
211
+ if (!accountId) {
212
+ throw new Error('listD1CheckpointExemplars requires accountId for tenant isolation.');
213
+ }
214
+ const clauses = ['account_id = ?'];
215
+ const values = [accountId];
216
+ if (projectId) {
217
+ clauses.push('project_id = ?');
218
+ values.push(projectId);
219
+ }
220
+ if (deployId) {
221
+ clauses.push('deploy_id = ?');
222
+ values.push(deployId);
223
+ }
224
+ if (outcome) {
225
+ clauses.push('outcome = ?');
226
+ values.push(outcome);
227
+ }
228
+ if (fingerprint) {
229
+ clauses.push('fingerprint = ?');
230
+ values.push(fingerprint);
231
+ }
232
+ const safeLimit = Math.max(1, Math.min(500, Math.floor(limit)));
233
+ values.push(safeLimit);
234
+ const where = clauses.length > 0 ? `WHERE ${clauses.join(' AND ')}` : '';
235
+ const rows = await d1
236
+ .prepare(`SELECT value_json
237
+ FROM ${d1TableName}
238
+ ${where}
239
+ ORDER BY observed_at DESC, exemplar_id DESC
240
+ LIMIT ?`)
241
+ .bind(...values)
242
+ .all();
243
+ return rows.results.map((row) => Schema.decodeUnknownSync(schemas.CheckpointRunExemplar)(JSON.parse(row.value_json)));
244
+ }
245
+ function buildExemplar({ metric, input, output, error, }) {
246
+ const base = {
247
+ accountId: metric.accountId,
248
+ hsXAccountId: metric.hsXAccountId,
249
+ projectId: metric.projectId,
250
+ deployId: metric.deployId,
251
+ workerName: metric.workerName,
252
+ capabilityId: metric.capabilityId,
253
+ portalId: metric.portalId,
254
+ outcome: metric.outcome,
255
+ observedAt: metric.observedAt,
256
+ durationMs: metric.durationMs,
257
+ redactedInput: redactCheckpointValue(input ?? {}),
258
+ };
259
+ if (metric.outcome === 'success') {
260
+ return output === undefined ? base : { ...base, redactedOutput: redactCheckpointValue(output) };
261
+ }
262
+ const redactedError = redactError(error);
263
+ return {
264
+ ...base,
265
+ fingerprint: fingerprintError({ capabilityId: metric.capabilityId, error }),
266
+ redactedError,
267
+ };
268
+ }
269
+ function redactError(error) {
270
+ if (error instanceof Error) {
271
+ return redactCheckpointValue({
272
+ name: error.name,
273
+ message: error.message,
274
+ stack: error.stack,
275
+ });
276
+ }
277
+ return redactCheckpointValue(error ?? { message: 'Unknown error' });
278
+ }
279
+ function errorClassFor(error) {
280
+ if (error instanceof Error && error.name.length > 0) {
281
+ return sanitizeToken(error.name);
282
+ }
283
+ if (isRecord(error) && typeof error.code === 'string' && error.code.length > 0) {
284
+ return sanitizeToken(error.code);
285
+ }
286
+ if (isRecord(error) && typeof error._tag === 'string' && error._tag.length > 0) {
287
+ return sanitizeToken(error._tag);
288
+ }
289
+ return 'UnknownError';
290
+ }
291
+ function stackSignatureFor(errorClass, error) {
292
+ if (error instanceof Error && typeof error.stack === 'string') {
293
+ const frame = error.stack
294
+ .split('\n')
295
+ .map((line) => normalizeStackLine(line))
296
+ .find((line) => line.length > 0 && !line.includes('node:internal'));
297
+ if (frame) {
298
+ return `${errorClass}:${frame}`;
299
+ }
300
+ }
301
+ if (isRecord(error) && typeof error.message === 'string' && error.message.length > 0) {
302
+ return `${errorClass}:${normalizeMessage(error.message)}`;
303
+ }
304
+ return `${errorClass}:unknown`;
305
+ }
306
+ function normalizeStackLine(line) {
307
+ return line
308
+ .trim()
309
+ .replace(/\((?:file:\/\/)?[^)]*\)/g, '()')
310
+ .replace(/(?:file:\/\/)?\/[^\s)]+/g, '<path>')
311
+ .replace(/:\d+:\d+/g, ':<line>:<col>')
312
+ .replace(/\b\d{4,}\b/g, '<number>')
313
+ .replace(/\s+/g, ' ');
314
+ }
315
+ function normalizeMessage(message) {
316
+ return message
317
+ .replace(/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g, '<email>')
318
+ .replace(/\b\d{4,}\b/g, '<number>')
319
+ .replace(/\s+/g, ' ')
320
+ .trim()
321
+ .slice(0, 160);
322
+ }
323
+ function redact(value, depth, seen) {
324
+ if (depth < 0) {
325
+ return '[truncated]';
326
+ }
327
+ if (typeof value === 'string') {
328
+ return redactString(value);
329
+ }
330
+ if (typeof value !== 'object' || value === null) {
331
+ return value;
332
+ }
333
+ if (seen.has(value)) {
334
+ return '[circular]';
335
+ }
336
+ seen.add(value);
337
+ if (Array.isArray(value)) {
338
+ return value.map((item) => redact(item, depth - 1, seen));
339
+ }
340
+ const output = {};
341
+ for (const [key, nested] of Object.entries(value)) {
342
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype')
343
+ continue;
344
+ output[key] = sensitiveKey(key) ? REDACTED : redact(nested, depth - 1, seen);
345
+ }
346
+ return output;
347
+ }
348
+ function redactString(value) {
349
+ const fullySensitive = /^Bearer\s+[A-Za-z0-9._~+/-]+=*$/i.test(value) ||
350
+ /^pat-[A-Za-z0-9_-]{12,}$/i.test(value) ||
351
+ /^hsx_[A-Za-z0-9_-]{16,}$/i.test(value);
352
+ if (fullySensitive) {
353
+ return REDACTED;
354
+ }
355
+ return value
356
+ .replace(/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g, REDACTED)
357
+ .replace(/\+?\d[\d\s().-]{8,}\d/g, REDACTED);
358
+ }
359
+ function sensitiveKey(key) {
360
+ return /(^|_|-)(authorization|password|secret|token|api[-_]?key|pak|refresh[-_]?token|access[-_]?token|email|phone)(_|-|$)/i.test(key);
361
+ }
362
+ function assertSafeSqlIdentifier(value, name) {
363
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(value)) {
364
+ throw new Error(`${name} must be a safe SQL identifier.`);
365
+ }
366
+ }
367
+ function sanitizeToken(value) {
368
+ return value.replace(/[^a-zA-Z0-9_.-]/g, '_') || 'UnknownError';
369
+ }
370
+ function sanitizePathPart(value) {
371
+ return value.replace(/[^A-Za-z0-9_.-]+/g, '_') || 'unknown';
372
+ }
373
+ function windowStart(observedAt, windowMs) {
374
+ const time = Date.parse(observedAt);
375
+ const safeTime = Number.isFinite(time) ? time : 0;
376
+ return Math.floor(safeTime / windowMs) * windowMs;
377
+ }
378
+ function clamp(value, min, max) {
379
+ return Math.min(max, Math.max(min, value));
380
+ }
381
+ function hashToUnit(value) {
382
+ return Number.parseInt(hash(value).slice(0, 8), 16) / 0xffffffff;
383
+ }
384
+ function hash(value) {
385
+ let hashValue = 0x811c9dc5;
386
+ for (let index = 0; index < value.length; index += 1) {
387
+ hashValue ^= value.charCodeAt(index);
388
+ hashValue = Math.imul(hashValue, 0x01000193);
389
+ }
390
+ return (hashValue >>> 0).toString(16).padStart(8, '0');
391
+ }
392
+ function isRecord(value) {
393
+ return typeof value === 'object' && value !== null;
394
+ }
395
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/test.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import type { CheckpointMetricEvent, CheckpointRunExemplar } from '@hs-x/types';
2
+ import type { CheckpointWriter } from './index.js';
3
+ export interface MemoryCheckpointWriter extends CheckpointWriter {
4
+ readonly metrics: readonly CheckpointMetricEvent[];
5
+ readonly exemplars: readonly CheckpointRunExemplar[];
6
+ reset(): void;
7
+ }
8
+ export declare function createMemoryCheckpointWriter(): MemoryCheckpointWriter;
9
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,QAAQ,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACnD,QAAQ,CAAC,SAAS,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACrD,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,4BAA4B,IAAI,sBAAsB,CAsBrE"}
package/dist/test.js ADDED
@@ -0,0 +1,23 @@
1
+ export function createMemoryCheckpointWriter() {
2
+ const metrics = [];
3
+ const exemplars = [];
4
+ return {
5
+ get metrics() {
6
+ return metrics;
7
+ },
8
+ get exemplars() {
9
+ return exemplars;
10
+ },
11
+ writeMetric(event) {
12
+ metrics.push(event);
13
+ },
14
+ writeExemplar(exemplar) {
15
+ exemplars.push(exemplar);
16
+ },
17
+ reset() {
18
+ metrics.length = 0;
19
+ exemplars.length = 0;
20
+ },
21
+ };
22
+ }
23
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"AASA,MAAM,UAAU,4BAA4B;IAC1C,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,MAAM,SAAS,GAA4B,EAAE,CAAC;IAE9C,OAAO;QACL,IAAI,OAAO;YACT,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,SAAS;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,WAAW,CAAC,KAAK;YACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,aAAa,CAAC,QAAQ;YACpB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;QACD,KAAK;YACH,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YACnB,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ CREATE TABLE IF NOT EXISTS checkpoint_exemplars (
2
+ exemplar_id TEXT PRIMARY KEY,
3
+ account_id TEXT NOT NULL,
4
+ hsx_account_id TEXT NOT NULL,
5
+ project_id TEXT NOT NULL,
6
+ deploy_id TEXT NOT NULL,
7
+ worker_name TEXT NOT NULL,
8
+ capability_id TEXT NOT NULL,
9
+ portal_id TEXT NOT NULL,
10
+ outcome TEXT NOT NULL,
11
+ observed_at TEXT NOT NULL,
12
+ duration_ms REAL NOT NULL,
13
+ fingerprint TEXT,
14
+ value_json TEXT NOT NULL
15
+ );
16
+
17
+ CREATE INDEX IF NOT EXISTS idx_checkpoint_exemplars_project_time
18
+ ON checkpoint_exemplars (project_id, observed_at DESC);
19
+
20
+ CREATE INDEX IF NOT EXISTS idx_checkpoint_exemplars_fingerprint_time
21
+ ON checkpoint_exemplars (fingerprint, observed_at DESC)
22
+ WHERE fingerprint IS NOT NULL;
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@hs-x/checkpoint",
3
+ "version": "0.1.0",
4
+ "description": "HS-X Checkpoint observability primitives — metrics, exemplars, fingerprinting, and redaction.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./test": {
14
+ "types": "./dist/test.d.ts",
15
+ "default": "./dist/test.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "migrations",
21
+ "README.md",
22
+ "CONTEXT.md"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsc -b",
26
+ "clean": "tsc -b --clean"
27
+ },
28
+ "dependencies": {
29
+ "@hs-x/types": "0.1.0",
30
+ "effect": "^3.10.19"
31
+ },
32
+ "devDependencies": {
33
+ "@hs-x/fixtures": "0.1.0"
34
+ },
35
+ "publishConfig": {
36
+ "access": "public"
37
+ }
38
+ }