gateproof 0.1.0 → 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/README.md +277 -7
- package/dist/act.d.ts +2 -0
- package/dist/act.d.ts.map +1 -1
- package/dist/act.js +1 -1
- package/dist/act.js.map +1 -1
- package/dist/action-executors.d.ts +10 -0
- package/dist/action-executors.d.ts.map +1 -1
- package/dist/action-executors.js +14 -3
- package/dist/action-executors.js.map +1 -1
- package/dist/assert.d.ts +2 -2
- package/dist/assert.d.ts.map +1 -1
- package/dist/assert.js +1 -1
- package/dist/assert.js.map +1 -1
- package/dist/cloudflare/cli-stream.d.ts.map +1 -1
- package/dist/cloudflare/cli-stream.js +7 -3
- package/dist/cloudflare/cli-stream.js.map +1 -1
- package/dist/constants.d.ts +11 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +11 -0
- package/dist/constants.js.map +1 -0
- package/dist/http-backend.d.ts +23 -0
- package/dist/http-backend.d.ts.map +1 -0
- package/dist/http-backend.js +124 -0
- package/dist/http-backend.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +97 -49
- package/dist/index.js.map +1 -1
- package/dist/observe.d.ts.map +1 -1
- package/dist/observe.js +4 -3
- package/dist/observe.js.map +1 -1
- package/dist/prd/define-prd.d.ts +7 -0
- package/dist/prd/define-prd.d.ts.map +1 -0
- package/dist/prd/define-prd.js +8 -0
- package/dist/prd/define-prd.js.map +1 -0
- package/dist/prd/index.d.ts +5 -0
- package/dist/prd/index.d.ts.map +1 -0
- package/dist/prd/index.js +4 -0
- package/dist/prd/index.js.map +1 -0
- package/dist/prd/runner.d.ts +22 -0
- package/dist/prd/runner.d.ts.map +1 -0
- package/dist/prd/runner.js +221 -0
- package/dist/prd/runner.js.map +1 -0
- package/dist/prd/scope-check.d.ts +28 -0
- package/dist/prd/scope-check.d.ts.map +1 -0
- package/dist/prd/scope-check.js +135 -0
- package/dist/prd/scope-check.js.map +1 -0
- package/dist/prd/types.d.ts +21 -0
- package/dist/prd/types.d.ts.map +1 -0
- package/dist/prd/types.js +2 -0
- package/dist/prd/types.js.map +1 -0
- package/dist/report.d.ts +67 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +51 -0
- package/dist/report.js.map +1 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +3 -2
- package/dist/utils.js.map +1 -1
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +7 -3
- package/dist/validation.js.map +1 -1
- package/package.json +11 -3
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { Effect, Queue } from "effect";
|
|
2
|
+
import { createLogStreamFromQueue } from "./observe";
|
|
3
|
+
import { HTTP_DEFAULT_POLL_INTERVAL_MS, HTTP_DEFAULT_TIMEOUT_MS, HTTP_MAX_RESPONSE_SIZE_BYTES } from "./constants";
|
|
4
|
+
/**
|
|
5
|
+
* Creates an observe resource that polls an HTTP endpoint and captures responses as logs.
|
|
6
|
+
* This gives agents visibility into what the endpoint is returning.
|
|
7
|
+
*/
|
|
8
|
+
export function createHttpObserveResource(config) {
|
|
9
|
+
let queue = null;
|
|
10
|
+
let stopped = false;
|
|
11
|
+
let pollTimer = null;
|
|
12
|
+
const poll = async () => {
|
|
13
|
+
if (stopped || !queue)
|
|
14
|
+
return;
|
|
15
|
+
const startTime = Date.now();
|
|
16
|
+
const requestId = crypto.randomUUID();
|
|
17
|
+
const timeoutMs = config.timeoutMs ?? HTTP_DEFAULT_TIMEOUT_MS;
|
|
18
|
+
const maxResponseSizeBytes = config.maxResponseSizeBytes ?? HTTP_MAX_RESPONSE_SIZE_BYTES;
|
|
19
|
+
try {
|
|
20
|
+
const response = await fetch(config.url, {
|
|
21
|
+
method: config.method || "GET",
|
|
22
|
+
headers: config.headers,
|
|
23
|
+
body: config.body,
|
|
24
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
25
|
+
});
|
|
26
|
+
const durationMs = Date.now() - startTime;
|
|
27
|
+
const contentType = response.headers.get("content-type") || "";
|
|
28
|
+
let body = null;
|
|
29
|
+
const contentLengthHeader = response.headers.get("content-length");
|
|
30
|
+
const contentLength = contentLengthHeader ? Number(contentLengthHeader) : undefined;
|
|
31
|
+
if (typeof contentLength === "number" && !Number.isNaN(contentLength) && contentLength > maxResponseSizeBytes) {
|
|
32
|
+
const log = {
|
|
33
|
+
requestId,
|
|
34
|
+
timestamp: new Date().toISOString(),
|
|
35
|
+
stage: "http",
|
|
36
|
+
action: `${config.method || "GET"} ${config.url}`,
|
|
37
|
+
status: "error",
|
|
38
|
+
durationMs,
|
|
39
|
+
error: {
|
|
40
|
+
tag: "HttpResponseTooLarge",
|
|
41
|
+
message: `Response size ${contentLength} exceeds limit ${maxResponseSizeBytes}`,
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
await Effect.runPromise(Queue.offer(queue, log).pipe(Effect.tapError((error) => Effect.logError("Failed to enqueue HTTP size-limit log", error)), Effect.catchAll(() => Effect.void)));
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (contentType.includes("application/json")) {
|
|
48
|
+
body = await response.json().catch(() => null);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
body = await response.text().catch(() => null);
|
|
52
|
+
}
|
|
53
|
+
const log = {
|
|
54
|
+
requestId,
|
|
55
|
+
timestamp: new Date().toISOString(),
|
|
56
|
+
stage: "http",
|
|
57
|
+
action: `${config.method || "GET"} ${config.url}`,
|
|
58
|
+
status: response.ok ? "success" : "error",
|
|
59
|
+
durationMs,
|
|
60
|
+
data: {
|
|
61
|
+
statusCode: response.status,
|
|
62
|
+
statusText: response.statusText,
|
|
63
|
+
contentType,
|
|
64
|
+
body,
|
|
65
|
+
headers: Object.fromEntries(response.headers.entries()),
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
await Effect.runPromise(Queue.offer(queue, log).pipe(Effect.tapError((error) => Effect.logError("Failed to enqueue HTTP log", error)), Effect.catchAll(() => Effect.void)));
|
|
69
|
+
}
|
|
70
|
+
catch (unknownError) {
|
|
71
|
+
const error = unknownError instanceof Error ? unknownError : new Error(String(unknownError));
|
|
72
|
+
const durationMs = Date.now() - startTime;
|
|
73
|
+
const log = {
|
|
74
|
+
requestId,
|
|
75
|
+
timestamp: new Date().toISOString(),
|
|
76
|
+
stage: "http",
|
|
77
|
+
action: `${config.method || "GET"} ${config.url}`,
|
|
78
|
+
status: "error",
|
|
79
|
+
durationMs,
|
|
80
|
+
error: {
|
|
81
|
+
tag: error.name || "HttpError",
|
|
82
|
+
message: error.message || String(error),
|
|
83
|
+
stack: error.stack,
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
await Effect.runPromise(Queue.offer(queue, log).pipe(Effect.tapError((enqueueError) => Effect.logError("Failed to enqueue HTTP error log", enqueueError)), Effect.catchAll(() => Effect.void)));
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
return {
|
|
90
|
+
start() {
|
|
91
|
+
return Effect.gen(function* () {
|
|
92
|
+
stopped = false;
|
|
93
|
+
queue = yield* Queue.bounded(1000);
|
|
94
|
+
// Initial poll
|
|
95
|
+
yield* Effect.promise(() => poll());
|
|
96
|
+
// Start polling loop
|
|
97
|
+
const interval = config.pollInterval ?? HTTP_DEFAULT_POLL_INTERVAL_MS;
|
|
98
|
+
pollTimer = setInterval(() => poll(), interval);
|
|
99
|
+
return createLogStreamFromQueue(queue);
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
stop() {
|
|
103
|
+
return Effect.gen(function* () {
|
|
104
|
+
stopped = true;
|
|
105
|
+
if (pollTimer) {
|
|
106
|
+
clearInterval(pollTimer);
|
|
107
|
+
pollTimer = null;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
},
|
|
111
|
+
/**
|
|
112
|
+
* Query historical logs.
|
|
113
|
+
*
|
|
114
|
+
* Note: HTTP backend is forward-only and does not maintain historical logs.
|
|
115
|
+
* This method always returns an empty array because HTTP polling only captures
|
|
116
|
+
* logs as they arrive in real-time. For querying historical logs, use a backend
|
|
117
|
+
* that supports log storage (e.g., Cloudflare Analytics Engine).
|
|
118
|
+
*/
|
|
119
|
+
query(_filter) {
|
|
120
|
+
return Effect.succeed([]);
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=http-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-backend.js","sourceRoot":"","sources":["../src/http-backend.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -28,10 +28,27 @@ export interface GateSpec {
|
|
|
28
28
|
observe: ObserveResource;
|
|
29
29
|
act: Action[];
|
|
30
30
|
assert: Assertion[];
|
|
31
|
+
/**
|
|
32
|
+
* Timeout configuration for log collection.
|
|
33
|
+
*
|
|
34
|
+
* - **idleMs**: If no logs arrive for this duration AND logs have been collected, return early.
|
|
35
|
+
* Default: 3000ms
|
|
36
|
+
* - **maxMs**: Maximum total time to wait for logs. If exceeded, gate fails with timeout.
|
|
37
|
+
* Default: 15000ms
|
|
38
|
+
*
|
|
39
|
+
* Examples:
|
|
40
|
+
* - `{ idleMs: 1000, maxMs: 5000 }`: Wait up to 5s total, but return early if idle > 1s with logs
|
|
41
|
+
* - `{ idleMs: 0, maxMs: 10000 }`: Wait full 10s, never return early on idle
|
|
42
|
+
*/
|
|
31
43
|
stop?: {
|
|
32
44
|
idleMs: number;
|
|
33
45
|
maxMs: number;
|
|
34
46
|
};
|
|
47
|
+
/**
|
|
48
|
+
* Maximum number of logs to collect before stopping.
|
|
49
|
+
* Defaults to 50_000.
|
|
50
|
+
*/
|
|
51
|
+
maxLogs?: number;
|
|
35
52
|
report?: "json" | "pretty";
|
|
36
53
|
}
|
|
37
54
|
export declare namespace Gate {
|
|
@@ -45,4 +62,7 @@ export type { ObserveResource } from "./observe";
|
|
|
45
62
|
export type { Provider } from "./provider";
|
|
46
63
|
export { createEmptyBackend, createEmptyObserveResource, runGateWithErrorHandling } from "./utils";
|
|
47
64
|
export { createTestObserveResource } from "./test-helpers";
|
|
65
|
+
export { createHttpObserveResource } from "./http-backend";
|
|
66
|
+
export type { GateResultV1, PrdReportV1, StoryResultV1, SerializableError } from "./report";
|
|
67
|
+
export { serializeError, toGateResultV1 } from "./report";
|
|
48
68
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAwC,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAO,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAU,eAAe,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAwC,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAO,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAU,eAAe,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;;;;;;AAYxC,qBAAa,SAAU,SAAQ,cAE7B;CAAG;;;;;;;;AAEL,qBAAa,eAAgB,SAAQ,oBAOpC;CAAG;AAEJ,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,eAAe,GAAG,eAAe,GAAG,wBAAwB,GAAG,kBAAkB,CAAC;AAE1H,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,eAAe,CAAC;IACzB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,IAAI,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC5B;AA8ID,yBAAiB,IAAI,CAAC;IACpB,SAAgB,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAEvD;IAED,SAAgB,SAAS,CACvB,IAAI,EAAE,QAAQ,GACb,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,CAiGvD;CACF;AAuBD,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AACnG,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC5F,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,8 @@ import { Effect, Ref, Either, Stream } from "effect";
|
|
|
2
2
|
import { Assert } from "./assert";
|
|
3
3
|
import { Schema } from "@effect/schema";
|
|
4
4
|
import { getActionExecutor } from "./action-executors";
|
|
5
|
+
import { DEFAULT_IDLE_MS, DEFAULT_MAX_MS, MAX_LOG_BUFFER, LOG_BUFFER_CAPACITY } from "./constants";
|
|
6
|
+
import { sortDeterministic, toGateResultV1 } from "./report";
|
|
5
7
|
export class GateError extends Schema.TaggedError()("GateError", {
|
|
6
8
|
cause: Schema.Unknown
|
|
7
9
|
}) {
|
|
@@ -28,51 +30,85 @@ function summarize(logs) {
|
|
|
28
30
|
errorTags.add(log.error.tag);
|
|
29
31
|
}
|
|
30
32
|
return {
|
|
31
|
-
requestIds: [...requestIds],
|
|
32
|
-
stagesSeen: [...stages],
|
|
33
|
-
actionsSeen: [...actions],
|
|
34
|
-
errorTags: [...errorTags]
|
|
33
|
+
requestIds: sortDeterministic([...requestIds]),
|
|
34
|
+
stagesSeen: sortDeterministic([...stages]),
|
|
35
|
+
actionsSeen: sortDeterministic([...actions]),
|
|
36
|
+
errorTags: sortDeterministic([...errorTags])
|
|
35
37
|
};
|
|
36
38
|
}
|
|
39
|
+
function makeLogTimeoutError(stop, cause) {
|
|
40
|
+
return new LogTimeoutError({
|
|
41
|
+
maxMs: stop.maxMs,
|
|
42
|
+
idleMs: stop.idleMs,
|
|
43
|
+
cause
|
|
44
|
+
});
|
|
45
|
+
}
|
|
37
46
|
function runAction(action) {
|
|
38
47
|
const executor = getActionExecutor(action);
|
|
39
48
|
return executor.execute(action);
|
|
40
49
|
}
|
|
41
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Collects logs from a stream with timeout and idle detection.
|
|
52
|
+
*
|
|
53
|
+
* Behavior:
|
|
54
|
+
* - **maxMs**: Maximum total time to wait for logs. If exceeded, returns LogTimeoutError.
|
|
55
|
+
* - **idleMs**: If no logs arrive for this duration, return early (with collected logs if any, or empty array if none).
|
|
56
|
+
*
|
|
57
|
+
* Examples:
|
|
58
|
+
* - Stream produces logs continuously: collects until maxLogs or maxMs exceeded
|
|
59
|
+
* - Stream stops producing logs: if idleMs elapsed and we have logs, return them
|
|
60
|
+
* - Stream never produces logs: waits for idleMs then returns empty array if maxMs not exceeded, otherwise timeout error
|
|
61
|
+
* - Stream error: preserved in LogTimeoutError.cause
|
|
62
|
+
*/
|
|
63
|
+
function collectLogs(stream, stop, maxLogs) {
|
|
42
64
|
const startTime = Date.now();
|
|
43
65
|
const lastLogTimeRef = Ref.unsafeMake(Date.now());
|
|
44
66
|
return Effect.gen(function* () {
|
|
45
67
|
const logStream = Stream.fromAsyncIterable(stream, () => Effect.void);
|
|
46
|
-
const collected = yield* logStream.pipe(Stream.tap(() => Ref.set(lastLogTimeRef, Date.now())), Stream.take(
|
|
68
|
+
const collected = yield* logStream.pipe(Stream.tap(() => Ref.set(lastLogTimeRef, Date.now())), Stream.take(maxLogs), Stream.buffer({ capacity: LOG_BUFFER_CAPACITY }), Stream.timeout(`${stop.maxMs} millis`), Stream.runCollect, Effect.catchAll((error) => Effect.gen(function* () {
|
|
69
|
+
// Stream-level timeout
|
|
47
70
|
if (error && typeof error === "object" && "_tag" in error && error._tag === "TimeoutException") {
|
|
48
|
-
return Effect.fail(
|
|
71
|
+
return yield* Effect.fail(makeLogTimeoutError(stop, error));
|
|
49
72
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
});
|
|
59
|
-
}));
|
|
73
|
+
const now = Date.now();
|
|
74
|
+
const totalTime = now - startTime;
|
|
75
|
+
if (totalTime > stop.maxMs) {
|
|
76
|
+
return yield* Effect.fail(makeLogTimeoutError(stop, error));
|
|
77
|
+
}
|
|
78
|
+
// Non-timeout stream error before maxMs elapsed – surface as timeout with cause
|
|
79
|
+
return yield* Effect.fail(makeLogTimeoutError(stop, error));
|
|
80
|
+
})));
|
|
60
81
|
const now = Date.now();
|
|
61
82
|
const lastLogTime = yield* Ref.get(lastLogTimeRef);
|
|
62
83
|
const idleTime = now - lastLogTime;
|
|
63
84
|
const totalTime = now - startTime;
|
|
64
85
|
if (totalTime > stop.maxMs) {
|
|
65
|
-
return yield* Effect.fail(
|
|
86
|
+
return yield* Effect.fail(makeLogTimeoutError(stop));
|
|
66
87
|
}
|
|
88
|
+
// If we have logs and have been idle longer than idleMs, return what we have.
|
|
67
89
|
if (idleTime > stop.idleMs && collected.length > 0) {
|
|
68
90
|
return Array.from(collected);
|
|
69
91
|
}
|
|
92
|
+
// If we have any logs at all, return them.
|
|
70
93
|
if (collected.length > 0) {
|
|
71
94
|
return Array.from(collected);
|
|
72
95
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
96
|
+
// No logs collected yet. Wait for idleMs before giving up, unless maxMs would be exceeded.
|
|
97
|
+
if (idleTime < stop.idleMs) {
|
|
98
|
+
const remainingIdle = stop.idleMs - idleTime;
|
|
99
|
+
const remainingMax = stop.maxMs - totalTime;
|
|
100
|
+
const waitTime = Math.min(remainingIdle, remainingMax);
|
|
101
|
+
if (waitTime > 0) {
|
|
102
|
+
yield* Effect.sleep(`${waitTime} millis`);
|
|
103
|
+
// After waiting, check if maxMs is now exceeded
|
|
104
|
+
const afterWaitTime = Date.now() - startTime;
|
|
105
|
+
if (afterWaitTime > stop.maxMs) {
|
|
106
|
+
return yield* Effect.fail(makeLogTimeoutError(stop));
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// No logs collected after waiting – return empty array.
|
|
111
|
+
return [];
|
|
76
112
|
});
|
|
77
113
|
}
|
|
78
114
|
function handleGateError(error, startedAt, logs) {
|
|
@@ -94,7 +130,8 @@ export var Gate;
|
|
|
94
130
|
function runEffect(spec) {
|
|
95
131
|
return Effect.acquireUseRelease(spec.observe.start().pipe(Effect.catchAll((error) => Effect.fail(new GateError({ cause: error })))), (stream) => Effect.gen(function* () {
|
|
96
132
|
const startedAt = Date.now();
|
|
97
|
-
const stop = spec.stop ?? { idleMs:
|
|
133
|
+
const stop = spec.stop ?? { idleMs: DEFAULT_IDLE_MS, maxMs: DEFAULT_MAX_MS };
|
|
134
|
+
const maxLogs = spec.maxLogs ?? MAX_LOG_BUFFER;
|
|
98
135
|
yield* Effect.sleep("200 millis");
|
|
99
136
|
let actionError = null;
|
|
100
137
|
for (const action of spec.act) {
|
|
@@ -108,7 +145,7 @@ export var Gate;
|
|
|
108
145
|
if (Either.isLeft(actionResult)) {
|
|
109
146
|
return handleGateError(actionResult.left, startedAt, []);
|
|
110
147
|
}
|
|
111
|
-
const logsResult = yield* collectLogs(stream, stop).pipe(Effect.timeoutFail({
|
|
148
|
+
const logsResult = yield* collectLogs(stream, stop, maxLogs).pipe(Effect.timeoutFail({
|
|
112
149
|
duration: `${stop.maxMs} millis`,
|
|
113
150
|
onTimeout: () => new LogTimeoutError({ maxMs: stop.maxMs, idleMs: stop.idleMs })
|
|
114
151
|
}), Effect.catchTag("LogTimeoutError", (error) => Effect.succeed({
|
|
@@ -118,30 +155,36 @@ export var Gate;
|
|
|
118
155
|
evidence: summarize([]),
|
|
119
156
|
error: error instanceof Error ? error : new Error(String(error))
|
|
120
157
|
})), Effect.either);
|
|
121
|
-
if (Either.isRight(logsResult)
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
158
|
+
if (Either.isRight(logsResult)) {
|
|
159
|
+
const right = logsResult.right;
|
|
160
|
+
// Right side can be either collected logs or a pre-built timeout GateResult
|
|
161
|
+
if (Array.isArray(right)) {
|
|
162
|
+
const logs = right;
|
|
163
|
+
const assertResult = yield* Assert.run(spec.assert, logs).pipe(Effect.either);
|
|
164
|
+
const evidence = summarize(logs);
|
|
165
|
+
const durationMs = Date.now() - startedAt;
|
|
166
|
+
if (Either.isLeft(assertResult)) {
|
|
167
|
+
const result = handleGateError(assertResult.left, startedAt, logs);
|
|
168
|
+
printResult(spec.report, result);
|
|
169
|
+
return result;
|
|
170
|
+
}
|
|
171
|
+
const result = {
|
|
172
|
+
status: "success",
|
|
173
|
+
durationMs,
|
|
174
|
+
logs,
|
|
175
|
+
evidence
|
|
176
|
+
};
|
|
177
|
+
printResult(spec.report, result);
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
// Timeout case already mapped into a GateResult above
|
|
181
|
+
return right;
|
|
135
182
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
};
|
|
142
|
-
printResult(spec.report, result);
|
|
143
|
-
return result;
|
|
144
|
-
}), () => spec.observe.stop().pipe(Effect.catchAll(() => Effect.void)));
|
|
183
|
+
// Left side is a LogTimeoutError or other gate error
|
|
184
|
+
return handleGateError(logsResult.left, startedAt, []);
|
|
185
|
+
}), () => spec.observe
|
|
186
|
+
.stop()
|
|
187
|
+
.pipe(Effect.tapError((error) => Effect.logError("Failed to stop observe resource", error)), Effect.catchAll(() => Effect.void)));
|
|
145
188
|
}
|
|
146
189
|
Gate.runEffect = runEffect;
|
|
147
190
|
})(Gate || (Gate = {}));
|
|
@@ -152,17 +195,22 @@ function printResult(report, result) {
|
|
|
152
195
|
if (result.evidence.errorTags.length) {
|
|
153
196
|
console.log(`errorTags=${result.evidence.errorTags.join(",")}`);
|
|
154
197
|
}
|
|
155
|
-
if (result.status !== "success") {
|
|
156
|
-
const
|
|
198
|
+
if (result.status !== "success" && result.error) {
|
|
199
|
+
const errorWithTag = result.error;
|
|
200
|
+
const errorTag = errorWithTag._tag ?? "unknown";
|
|
157
201
|
console.log(`error=${errorTag}`);
|
|
158
202
|
}
|
|
159
203
|
}
|
|
160
204
|
else {
|
|
161
|
-
|
|
205
|
+
// Use serializable version for JSON output
|
|
206
|
+
const serializable = toGateResultV1(result);
|
|
207
|
+
console.log(JSON.stringify(serializable, null, 2));
|
|
162
208
|
}
|
|
163
209
|
}
|
|
164
210
|
export { Act } from "./act";
|
|
165
211
|
export { Assert } from "./assert";
|
|
166
212
|
export { createEmptyBackend, createEmptyObserveResource, runGateWithErrorHandling } from "./utils";
|
|
167
213
|
export { createTestObserveResource } from "./test-helpers";
|
|
214
|
+
export { createHttpObserveResource } from "./http-backend";
|
|
215
|
+
export { serializeError, toGateResultV1 } from "./report";
|
|
168
216
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAS,GAAG,EAAE,MAAM,EAAY,MAAM,EAAS,MAAM,QAAQ,CAAC;AAK7E,OAAO,EAAE,MAAM,EAA6C,MAAM,UAAU,CAAC;AAE7E,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/observe.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../src/observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAmB,MAAM,QAAQ,CAAC;AACxD,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;;;;;;;;
|
|
1
|
+
{"version":3,"file":"observe.d.ts","sourceRoot":"","sources":["../src/observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAmB,MAAM,QAAQ,CAAC;AACxD,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;;;;;;;;AAOxC,qBAAa,kBAAmB,SAAQ,uBAOvC;CAAG;AAEJ,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAO3E;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IACtD,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAChD,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAC;CACpE;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IACtD,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;CACjD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,eAAe,CAsBvE;AAkBD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GACtB,SAAS,CAqCX"}
|
package/dist/observe.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Effect, Queue, Runtime, Stream } from "effect";
|
|
2
2
|
import { Schema } from "@effect/schema";
|
|
3
|
+
import { QUEUE_DRAIN_LIMIT, QUEUE_DRAIN_TIMEOUT_MS, QUEUE_TAKE_TIMEOUT_MS } from "./constants";
|
|
3
4
|
export class ObservabilityError extends Schema.TaggedError()("ObservabilityError", {
|
|
4
5
|
cause: Schema.Unknown,
|
|
5
6
|
message: Schema.optional(Schema.String),
|
|
@@ -54,7 +55,7 @@ export function createLogStreamFromQueue(queue) {
|
|
|
54
55
|
async *[Symbol.asyncIterator]() {
|
|
55
56
|
try {
|
|
56
57
|
while (true) {
|
|
57
|
-
const log = await Runtime.runPromise(runtime)(Queue.take(queue).pipe(Effect.timeout(
|
|
58
|
+
const log = await Runtime.runPromise(runtime)(Queue.take(queue).pipe(Effect.timeout(`${QUEUE_TAKE_TIMEOUT_MS} millis`), Effect.catchAll(() => Effect.succeed(null))));
|
|
58
59
|
if (log === null)
|
|
59
60
|
break;
|
|
60
61
|
yield log;
|
|
@@ -63,8 +64,8 @@ export function createLogStreamFromQueue(queue) {
|
|
|
63
64
|
finally {
|
|
64
65
|
const remaining = [];
|
|
65
66
|
try {
|
|
66
|
-
for (let i = 0; i <
|
|
67
|
-
const log = await Runtime.runPromise(runtime)(Queue.take(queue).pipe(Effect.timeout(
|
|
67
|
+
for (let i = 0; i < QUEUE_DRAIN_LIMIT; i++) {
|
|
68
|
+
const log = await Runtime.runPromise(runtime)(Queue.take(queue).pipe(Effect.timeout(`${QUEUE_DRAIN_TIMEOUT_MS} millis`), Effect.catchAll(() => Effect.succeed(null))));
|
|
68
69
|
if (log === null)
|
|
69
70
|
break;
|
|
70
71
|
remaining.push(log);
|
package/dist/observe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../src/observe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"observe.js","sourceRoot":"","sources":["../src/observe.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Prd } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Helper to define a PRD with type-safe story IDs.
|
|
4
|
+
* Preserves literal union types for StoryId.
|
|
5
|
+
*/
|
|
6
|
+
export declare function definePrd<TId extends string>(prd: Prd<TId>): Prd<TId>;
|
|
7
|
+
//# sourceMappingURL=define-prd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-prd.d.ts","sourceRoot":"","sources":["../../src/prd/define-prd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAEnC;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,SAAS,MAAM,EAC1C,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GACZ,GAAG,CAAC,GAAG,CAAC,CAEV"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-prd.js","sourceRoot":"","sources":["../../src/prd/define-prd.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,GAAa;IAEb,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { Prd, Story, GateResult, StoryScope } from "./types";
|
|
2
|
+
export { definePrd } from "./define-prd";
|
|
3
|
+
export { runPrd, type RunPrdResult } from "./runner";
|
|
4
|
+
export { validateScope, getDiffStats, type ScopeViolation } from "./scope-check";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prd/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prd/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,MAAM,EAAqB,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAuB,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Prd, Story } from "./types";
|
|
2
|
+
import type { PrdReportV1 } from "../report";
|
|
3
|
+
export interface RunPrdResult {
|
|
4
|
+
success: boolean;
|
|
5
|
+
failedStory?: Story;
|
|
6
|
+
error?: Error;
|
|
7
|
+
report?: PrdReportV1;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Runs a PRD by executing story gates in dependency order.
|
|
11
|
+
* Stops on first failure.
|
|
12
|
+
*
|
|
13
|
+
* @param options.reportPath - If provided, writes a structured JSON report to this path
|
|
14
|
+
* @param options.checkScope - If true, validates scope constraints against git diff
|
|
15
|
+
* @param options.baseRef - Git ref to compare against for scope checking (default: "HEAD" for local, "origin/main" for CI)
|
|
16
|
+
*/
|
|
17
|
+
export declare function runPrd<TId extends string>(prd: Prd<TId>, cwd?: string, options?: {
|
|
18
|
+
reportPath?: string;
|
|
19
|
+
checkScope?: boolean;
|
|
20
|
+
baseRef?: string;
|
|
21
|
+
}): Promise<RunPrdResult>;
|
|
22
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/prd/runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAc,MAAM,SAAS,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAoC,MAAM,WAAW,CAAC;AAI/E,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAkFD;;;;;;;GAOG;AACH,wBAAsB,MAAM,CAAC,GAAG,SAAS,MAAM,EAC7C,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,EACb,GAAG,GAAE,MAAsB,EAC3B,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CACb,GACL,OAAO,CAAC,YAAY,CAAC,CAyJvB"}
|