@overkill-dev/resources 0.0.11 → 0.0.13
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/attachments/attachment-context.d.ts +5 -1
- package/attachments/attachment-context.d.ts.map +1 -1
- package/attachments/attachment-context.js +10 -0
- package/attachments/attachment-context.js.map +1 -1
- package/attachments/failure-artifact-stream.js +147 -0
- package/attachments/failure-artifact-stream.js.map +1 -0
- package/attachments/json-snapshot.js +110 -0
- package/attachments/json-snapshot.js.map +1 -0
- package/attachments/resource-failure-context.js +45 -0
- package/attachments/resource-failure-context.js.map +1 -0
- package/canonical-identity.js +54 -0
- package/canonical-identity.js.map +1 -0
- package/engine/identity.d.ts +5 -0
- package/engine/identity.d.ts.map +1 -1
- package/engine/identity.js +41 -0
- package/engine/identity.js.map +1 -0
- package/engine/run-artifact.d.ts +1 -1
- package/engine/run-artifact.d.ts.map +1 -1
- package/engine/runtime-attachment.d.ts +26 -6
- package/engine/runtime-attachment.d.ts.map +1 -1
- package/engine/runtime-attachment.js +7 -0
- package/engine/runtime-attachment.js.map +1 -0
- package/engine/workload-input.d.ts +8 -0
- package/engine/workload-input.d.ts.map +1 -0
- package/engine/workload-input.js +54 -0
- package/engine/workload-input.js.map +1 -0
- package/engine/workload-parameters.d.ts +3 -0
- package/engine/workload-parameters.d.ts.map +1 -0
- package/engine/workload-parameters.js +67 -0
- package/engine/workload-parameters.js.map +1 -0
- package/package-version.js +31 -0
- package/package-version.js.map +1 -0
- package/package.json +11 -3
- package/packages/resources/attachment-context.entry-point.d.ts +1 -1
- package/packages/resources/attachment-context.entry-point.d.ts.map +1 -1
- package/packages/resources/attachment-context.entry-point.js +1 -1
- package/packages/resources/attachment-context.entry-point.js.map +1 -1
- package/packages/resources/resources.entry-point.d.ts +7 -0
- package/packages/resources/resources.entry-point.d.ts.map +1 -1
- package/packages/resources/resources.entry-point.js +3 -0
- package/packages/resources/resources.entry-point.js.map +1 -1
- package/readme.md +46 -1
- package/resources/failure-artifacts.d.ts +49 -0
- package/resources/failure-artifacts.d.ts.map +1 -0
- package/resources/failure-artifacts.js +34 -0
- package/resources/failure-artifacts.js.map +1 -0
- package/resources/http-request-attribution.js +23 -0
- package/resources/http-request-attribution.js.map +1 -0
- package/resources/local-http-failure-capture.js +43 -0
- package/resources/local-http-failure-capture.js.map +1 -0
- package/resources/local-http-service-resource.d.ts.map +1 -1
- package/resources/local-http-service-resource.js +18 -7
- package/resources/local-http-service-resource.js.map +1 -1
- package/resources/local-http-transcript-observer.js +14 -21
- package/resources/local-http-transcript-observer.js.map +1 -1
- package/resources/local-process-service-resource.d.ts +1 -1
- package/resources/local-process-service-resource.d.ts.map +1 -1
- package/resources/local-process-service-resource.js +85 -12
- package/resources/local-process-service-resource.js.map +1 -1
- package/resources/local-service-resource.d.ts +26 -26
- package/resources/local-service-resource.d.ts.map +1 -1
- package/resources/local-service-resource.js +9 -5
- package/resources/local-service-resource.js.map +1 -1
- package/resources/resource-authoring-types.d.ts +22 -0
- package/resources/resource-authoring-types.d.ts.map +1 -0
- package/resources/resource-definition-shape.d.ts +2 -0
- package/resources/resource-definition-shape.d.ts.map +1 -1
- package/resources/resource-definition-types.d.ts +23 -15
- package/resources/resource-definition-types.d.ts.map +1 -1
- package/resources/resource-definition.d.ts +9 -0
- package/resources/resource-definition.d.ts.map +1 -0
- package/resources/resource-definition.js +17 -2
- package/resources/resource-definition.js.map +1 -1
- package/resources/resource-scenario-binding.js +9 -5
- package/resources/resource-scenario-binding.js.map +1 -1
- package/resources/resource-scenario.d.ts +3 -0
- package/resources/resource-scenario.d.ts.map +1 -1
- package/resources/resource-session.d.ts +5 -0
- package/resources/resource-session.d.ts.map +1 -1
- package/resources/resource-session.js +26 -5
- package/resources/resource-session.js.map +1 -1
- package/resources/resource-workload-binding.d.ts +9 -0
- package/resources/resource-workload-binding.d.ts.map +1 -0
- package/resources/resource-workload-binding.js +94 -0
- package/resources/resource-workload-binding.js.map +1 -0
- package/resources/resource-workload-types.d.ts +8 -0
- package/resources/resource-workload-types.d.ts.map +1 -0
- package/resources/resource-workload-types.js +4 -0
- package/resources/resource-workload-types.js.map +1 -0
- package/resources/resources.d.ts +12 -16
- package/resources/resources.d.ts.map +1 -1
- package/resources/resources.js.map +1 -1
- package/resources/runtime-lifecycle.d.ts +5 -0
- package/resources/runtime-lifecycle.d.ts.map +1 -1
- package/resources/runtime-lifecycle.js +5 -1
- package/resources/runtime-lifecycle.js.map +1 -1
- package/resources/runtime-workload-binding.d.ts +4 -0
- package/resources/runtime-workload-binding.d.ts.map +1 -0
- package/resources/runtime-workload-binding.js +32 -0
- package/resources/runtime-workload-binding.js.map +1 -0
- package/resources/simulated-http-server-resource.d.ts +1 -1
- package/resources/simulated-http-server-resource.d.ts.map +1 -1
- package/resources/simulated-http-server-resource.js +31 -3
- package/resources/simulated-http-server-resource.js.map +1 -1
- package/sbom.cdx.json +28 -11
- package/stored-value.js +12 -0
- package/stored-value.js.map +1 -0
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import type { AttachmentProducer, RuntimeAttachments } from '../engine/runtime-attachment.ts';
|
|
1
|
+
import type { AttachmentProducer, AttachmentLimits, FailureArtifactCondition, RuntimeAttachments } from '../engine/runtime-attachment.ts';
|
|
2
2
|
export type AttachmentContext = {
|
|
3
|
+
readonly limits: AttachmentLimits;
|
|
4
|
+
readonly prepareForProducer: (producer: AttachmentProducer, condition: FailureArtifactCondition, source: 'boundary-captured' | 'instrumented' | 'native', subtype: 'attachment' | 'witness') => RuntimeAttachments;
|
|
3
5
|
readonly forProducer: (producer: AttachmentProducer) => RuntimeAttachments;
|
|
4
6
|
};
|
|
5
7
|
export declare function attachmentsForProducer(producer: AttachmentProducer): RuntimeAttachments;
|
|
6
8
|
export declare function resourceAttachments(name: string): RuntimeAttachments;
|
|
7
9
|
export declare function runWithAttachmentContext<Value>(context: AttachmentContext, run: () => Promise<Value>): Promise<Value>;
|
|
10
|
+
export declare function preparedResourceAttachments(name: string, condition: FailureArtifactCondition, source: 'boundary-captured' | 'instrumented' | 'native', subtype: 'attachment' | 'witness'): RuntimeAttachments | null;
|
|
11
|
+
export declare function currentAttachmentLimits(): AttachmentLimits | null;
|
|
8
12
|
//# sourceMappingURL=attachment-context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment-context.d.ts","sourceRoot":"","sources":["../../../../source/attachments/attachment-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"attachment-context.d.ts","sourceRoot":"","sources":["../../../../source/attachments/attachment-context.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACR,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EACrB,MAAM,iCAAiC,CAAC;AAEzC,MAAM,MAAM,iBAAiB,GAAG;IAC5B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,kBAAkB,EAAE,CACzB,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAE,wBAAwB,EACnC,MAAM,EAAE,mBAAmB,GAAG,cAAc,GAAG,QAAQ,EACvD,OAAO,EAAE,YAAY,GAAG,SAAS,KAChC,kBAAkB,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,kBAAkB,CAAC;CAC9E,CAAC;AA2BF,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,kBAAkB,CAEvF;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAEpE;AAED,wBAAsB,wBAAwB,CAAC,KAAK,EAChD,OAAO,EAAE,iBAAiB,EAC1B,GAAG,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAC1B,OAAO,CAAC,KAAK,CAAC,CAEhB;AAED,wBAAgB,2BAA2B,CACvC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,wBAAwB,EACnC,MAAM,EAAE,mBAAmB,GAAG,cAAc,GAAG,QAAQ,EACvD,OAAO,EAAE,YAAY,GAAG,SAAS,GAClC,kBAAkB,GAAG,IAAI,CAG3B;AAED,wBAAgB,uBAAuB,IAAI,gBAAgB,GAAG,IAAI,CAEjE"}
|
|
@@ -28,4 +28,14 @@ export function resourceAttachments(name) {
|
|
|
28
28
|
export async function runWithAttachmentContext(context, run) {
|
|
29
29
|
return await attachmentContext.run(context, run);
|
|
30
30
|
}
|
|
31
|
+
export function preparedResourceAttachments(name, condition, source, subtype) {
|
|
32
|
+
return attachmentContext.getStore()?.prepareForProducer({ kind: 'resource', name }, condition, source, subtype) ??
|
|
33
|
+
null;
|
|
34
|
+
}
|
|
35
|
+
export function currentAttachmentLimits() {
|
|
36
|
+
return attachmentContext.getStore()?.limits ?? null;
|
|
37
|
+
}
|
|
38
|
+
export function currentAttachmentContext() {
|
|
39
|
+
return attachmentContext.getStore() ?? null;
|
|
40
|
+
}
|
|
31
41
|
//# sourceMappingURL=attachment-context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment-context.js","sourceRoot":"","sources":["../../../../source/attachments/attachment-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"attachment-context.js","sourceRoot":"","sources":["../../../../source/attachments/attachment-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAoBrD,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;AAEvF,SAAS,0BAA0B,CAAC,KAAc;IAC9C,OAAO,KAAK,YAAY,iBAAiB,CAAC;AAC9C,CAAC;AACD,SAAS,uBAAuB;IAC5B,MAAM,QAAQ,GAAY,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;IACxE,IAAI,0BAA0B,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAqB,CAAC;IAC3D,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,oBAAoB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5E,OAAO,OAAO,CAAC;AACnB,CAAC;AACD,MAAM,iBAAiB,GAAG,uBAAuB,EAAE,CAAC;AAEpD,SAAS,sBAAsB;IAC3B,MAAM,WAAW,GAAG,KAAK,UAAU,yBAAyB;QACxD,MAAM,IAAI,SAAS,CAAC,mEAAmE,CAAC,CAAC;IAC7F,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAA4B;IAC/D,OAAO,iBAAiB,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,QAAQ,CAAC,IAAI,sBAAsB,EAAE,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC5C,OAAO,sBAAsB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC1C,OAA0B,EAC1B,GAAyB;IAEzB,OAAO,MAAM,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,2BAA2B,CACvC,IAAY,EACZ,SAAmC,EACnC,MAAuD,EACvD,OAAiC;IAEjC,OAAO,iBAAiB,CAAC,QAAQ,EAAE,EAAE,kBAAkB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC;QAC3G,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,uBAAuB;IACnC,OAAO,iBAAiB,CAAC,QAAQ,EAAE,EAAE,MAAM,IAAI,IAAI,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,wBAAwB;IACpC,OAAO,iBAAiB,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { createStoredValue } from "../stored-value.js";
|
|
2
|
+
import { defaultAttachmentLimits } from "../engine/runtime-attachment.js";
|
|
3
|
+
import { workIdentityKey } from "../engine/identity.js";
|
|
4
|
+
import { currentAttachmentContext } from "./attachment-context.js";
|
|
5
|
+
import { resourceFailureAttachments } from "./resource-failure-context.js";
|
|
6
|
+
const registryKey = Symbol.for('@overkill-dev/failure-artifact-streams/v2');
|
|
7
|
+
function isFailureRunRegistry(value) {
|
|
8
|
+
return value instanceof WeakMap;
|
|
9
|
+
}
|
|
10
|
+
function sharedFailureRuns() {
|
|
11
|
+
const existing = Reflect.get(globalThis, registryKey);
|
|
12
|
+
if (isFailureRunRegistry(existing)) {
|
|
13
|
+
return existing;
|
|
14
|
+
}
|
|
15
|
+
const created = new WeakMap();
|
|
16
|
+
Object.defineProperty(globalThis, registryKey, { value: created });
|
|
17
|
+
return created;
|
|
18
|
+
}
|
|
19
|
+
const runs = sharedFailureRuns();
|
|
20
|
+
function currentFailureStreams() {
|
|
21
|
+
const context = currentAttachmentContext();
|
|
22
|
+
if (context === null) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const streams = runs.get(context) ?? new Map();
|
|
26
|
+
runs.set(context, streams);
|
|
27
|
+
return streams;
|
|
28
|
+
}
|
|
29
|
+
function attemptKey(work, attempt) {
|
|
30
|
+
return `${workIdentityKey(work)}:${attempt.index}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function drainCapture(state) {
|
|
34
|
+
const writer = state.writer.read() ?? await state.attachments.open(state.metadata);
|
|
35
|
+
state.writer.write(writer);
|
|
36
|
+
while (state.chunks.read().length > 0) {
|
|
37
|
+
const batch = state.chunks.read();
|
|
38
|
+
state.chunks.write([]);
|
|
39
|
+
for (const chunk of batch) {
|
|
40
|
+
await writer.write(chunk);
|
|
41
|
+
state.queuedBytes.write(state.queuedBytes.read() - Buffer.byteLength(chunk));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function capturePending(state) {
|
|
46
|
+
try {
|
|
47
|
+
await drainCapture(state);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
state.failure.write(error instanceof Error
|
|
51
|
+
? error
|
|
52
|
+
: new Error('Failure artifact stream could not capture output.', { cause: error }));
|
|
53
|
+
state.chunks.write([]);
|
|
54
|
+
state.queuedBytes.write(0);
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
state.pending.write(null);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async function observeLateCapture(state, chunk) {
|
|
61
|
+
const writer = state.writer.read();
|
|
62
|
+
const writing = writer === null ? state.attachments.json(state.metadata, null) : writer.write(chunk);
|
|
63
|
+
try {
|
|
64
|
+
await writing;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
state.failure.write(error instanceof Error ? error : new Error('Late failure capture failed.', { cause: error }));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function captureAcceptsWrite(state, chunk) {
|
|
71
|
+
if (state.closed.read() && !state.lateReported.read()) {
|
|
72
|
+
state.lateReported.write(true);
|
|
73
|
+
state.pending.write(observeLateCapture(state, chunk));
|
|
74
|
+
}
|
|
75
|
+
return !state.closed.read() && !state.truncated.read() && state.failure.read() === null;
|
|
76
|
+
}
|
|
77
|
+
function queueCapture(state, chunk) {
|
|
78
|
+
const available = defaultAttachmentLimits.maxInlineBytes - state.queuedBytes.read();
|
|
79
|
+
const limited = Buffer.byteLength(chunk) > available;
|
|
80
|
+
const decoder = new TextDecoder();
|
|
81
|
+
const prefix = limited
|
|
82
|
+
? decoder.decode(Buffer.from(chunk).subarray(0, available), { stream: true })
|
|
83
|
+
: chunk;
|
|
84
|
+
state.truncated.write(limited);
|
|
85
|
+
state.chunks.write([...state.chunks.read(), prefix]);
|
|
86
|
+
state.queuedBytes.write(state.queuedBytes.read() + Buffer.byteLength(prefix));
|
|
87
|
+
}
|
|
88
|
+
function writeCapture(state, chunk) {
|
|
89
|
+
if (!captureAcceptsWrite(state, chunk)) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
queueCapture(state, chunk);
|
|
93
|
+
if (state.pending.read() === null) {
|
|
94
|
+
state.pending.write(capturePending(state));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async function closeCapture(state) {
|
|
98
|
+
if (state.closed.read()) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
state.closed.write(true);
|
|
102
|
+
await state.pending.read();
|
|
103
|
+
const writer = state.writer.read();
|
|
104
|
+
if (writer !== null) {
|
|
105
|
+
await (state.truncated.read() ? writer.close('capture-limit') : writer.close());
|
|
106
|
+
}
|
|
107
|
+
const failure = state.failure.read();
|
|
108
|
+
if (failure !== null) {
|
|
109
|
+
throw failure;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function createCaptureState(attachments, name, mediaType) {
|
|
113
|
+
return {
|
|
114
|
+
attachments,
|
|
115
|
+
metadata: { kind: 'text', name, mediaType },
|
|
116
|
+
chunks: createStoredValue([]),
|
|
117
|
+
queuedBytes: createStoredValue(0),
|
|
118
|
+
truncated: createStoredValue(false),
|
|
119
|
+
failure: createStoredValue(null),
|
|
120
|
+
closed: createStoredValue(false),
|
|
121
|
+
lateReported: createStoredValue(false),
|
|
122
|
+
writer: createStoredValue(null),
|
|
123
|
+
pending: createStoredValue(null)
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function registerAttemptStream(context, stream) {
|
|
127
|
+
const streams = currentFailureStreams();
|
|
128
|
+
if (context.condition.kind === 'attempt' && streams !== null) {
|
|
129
|
+
const key = attemptKey(context.condition.work, context.condition.attempt);
|
|
130
|
+
const owned = streams.get(key) ?? new Set();
|
|
131
|
+
streams.set(key, new Set([...owned, stream]));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
export function createFailureArtifactStream(context, source, name, mediaType) {
|
|
135
|
+
const attachments = resourceFailureAttachments(context, source);
|
|
136
|
+
if (attachments === null) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
const state = createCaptureState(attachments, name, mediaType);
|
|
140
|
+
const stream = {
|
|
141
|
+
write: writeCapture.bind(null, state),
|
|
142
|
+
close: closeCapture.bind(null, state)
|
|
143
|
+
};
|
|
144
|
+
registerAttemptStream(context, stream);
|
|
145
|
+
return stream;
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=failure-artifact-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"failure-artifact-stream.js","sourceRoot":"","sources":["../../../../source/attachments/failure-artifact-stream.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { createStoredValue } from "../stored-value.js";
|
|
2
|
+
const maxJsonDepth = 64;
|
|
3
|
+
const containerBytes = 2;
|
|
4
|
+
class JsonByteLimitError extends Error {
|
|
5
|
+
constructor() {
|
|
6
|
+
super('JSON attachment exceeds its byte limit.');
|
|
7
|
+
this.name = 'JsonByteLimitError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function createJsonSnapshotBudget(maxBytes) {
|
|
11
|
+
const ancestors = new Set();
|
|
12
|
+
const remaining = createStoredValue(maxBytes);
|
|
13
|
+
return {
|
|
14
|
+
reserve(bytes) {
|
|
15
|
+
if (bytes > remaining.read()) {
|
|
16
|
+
throw new JsonByteLimitError();
|
|
17
|
+
}
|
|
18
|
+
remaining.write(remaining.read() - bytes);
|
|
19
|
+
},
|
|
20
|
+
enter(value) {
|
|
21
|
+
ancestors.add(value);
|
|
22
|
+
},
|
|
23
|
+
leave(value) {
|
|
24
|
+
ancestors.delete(value);
|
|
25
|
+
},
|
|
26
|
+
contains(value) {
|
|
27
|
+
return ancestors.has(value);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function scalar(value) {
|
|
32
|
+
return value === null || typeof value === 'boolean' || typeof value === 'string' ||
|
|
33
|
+
typeof value === 'number' && Number.isFinite(value);
|
|
34
|
+
}
|
|
35
|
+
function descriptorValue(descriptor) {
|
|
36
|
+
if (descriptor === undefined || !Object.hasOwn(descriptor, 'value')) {
|
|
37
|
+
throw new TypeError('JSON attachments cannot contain sparse arrays or accessors.');
|
|
38
|
+
}
|
|
39
|
+
return descriptor.value;
|
|
40
|
+
}
|
|
41
|
+
function arraySnapshot(value, budget, depth, visit) {
|
|
42
|
+
const entries = [];
|
|
43
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
44
|
+
budget.reserve(index === 0 ? 0 : 1);
|
|
45
|
+
entries.push(visit(descriptorValue(Object.getOwnPropertyDescriptor(value, String(index))), depth + 1));
|
|
46
|
+
}
|
|
47
|
+
return Object.freeze(entries);
|
|
48
|
+
}
|
|
49
|
+
function objectSnapshot(value, budget, depth, visit) {
|
|
50
|
+
const entries = {};
|
|
51
|
+
const keys = Reflect.ownKeys(value).filter(function enumerableKey(key) {
|
|
52
|
+
return Object.getOwnPropertyDescriptor(value, key)?.enumerable === true;
|
|
53
|
+
});
|
|
54
|
+
for (const [index, key] of keys.entries()) {
|
|
55
|
+
if (typeof key !== 'string') {
|
|
56
|
+
throw new TypeError('JSON attachments cannot contain symbol keys.');
|
|
57
|
+
}
|
|
58
|
+
budget.reserve(Buffer.byteLength(JSON.stringify(key)) + 1 + (index === 0 ? 0 : 1));
|
|
59
|
+
Object.defineProperty(entries, key, {
|
|
60
|
+
enumerable: true,
|
|
61
|
+
value: visit(descriptorValue(Object.getOwnPropertyDescriptor(value, key)), depth + 1)
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return Object.freeze(entries);
|
|
65
|
+
}
|
|
66
|
+
function isContainer(value) {
|
|
67
|
+
return typeof value === 'object' && value !== null;
|
|
68
|
+
}
|
|
69
|
+
function validateContainer(value, budget, depth) {
|
|
70
|
+
if (depth > maxJsonDepth || budget.contains(value)) {
|
|
71
|
+
throw new TypeError('Attachments require finite, acyclic JSON values with depth at most 64.');
|
|
72
|
+
}
|
|
73
|
+
const prototype = Object.getPrototypeOf(value);
|
|
74
|
+
if (!Array.isArray(value) && prototype !== Object.prototype && prototype !== null) {
|
|
75
|
+
throw new TypeError('JSON attachments require plain objects and arrays.');
|
|
76
|
+
}
|
|
77
|
+
budget.reserve(containerBytes);
|
|
78
|
+
budget.enter(value);
|
|
79
|
+
}
|
|
80
|
+
function containerSnapshot(value, budget, depth, visit) {
|
|
81
|
+
return Array.isArray(value)
|
|
82
|
+
? arraySnapshot(value, budget, depth, visit)
|
|
83
|
+
: objectSnapshot(value, budget, depth, visit);
|
|
84
|
+
}
|
|
85
|
+
function createJsonVisit(budget, validate) {
|
|
86
|
+
return function visit(value, depth) {
|
|
87
|
+
validate(value);
|
|
88
|
+
if (scalar(value)) {
|
|
89
|
+
budget.reserve(Buffer.byteLength(JSON.stringify(value)));
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
92
|
+
if (!isContainer(value)) {
|
|
93
|
+
throw new TypeError('Attachments require finite JSON values.');
|
|
94
|
+
}
|
|
95
|
+
validateContainer(value, budget, depth);
|
|
96
|
+
try {
|
|
97
|
+
return containerSnapshot(value, budget, depth, visit);
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
budget.leave(value);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export function snapshotValidatedJson(value, validate) {
|
|
106
|
+
const copy = createJsonVisit(createJsonSnapshotBudget(Number.POSITIVE_INFINITY), validate)(value, 0);
|
|
107
|
+
return { value: copy, encoded: JSON.stringify(copy) };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
//# sourceMappingURL=json-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-snapshot.js","sourceRoot":"","sources":["../../../../source/attachments/json-snapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
import { preparedResourceAttachments } from "./attachment-context.js";
|
|
3
|
+
const contextKey = Symbol.for('@overkill-dev/resource-failure-context/v1');
|
|
4
|
+
function isResourceFailureStorage(value) {
|
|
5
|
+
return value instanceof AsyncLocalStorage;
|
|
6
|
+
}
|
|
7
|
+
function sharedResourceFailureContext() {
|
|
8
|
+
const existing = Reflect.get(globalThis, contextKey);
|
|
9
|
+
if (isResourceFailureStorage(existing)) {
|
|
10
|
+
return existing;
|
|
11
|
+
}
|
|
12
|
+
const created = new AsyncLocalStorage();
|
|
13
|
+
Object.defineProperty(globalThis, contextKey, { value: created });
|
|
14
|
+
return created;
|
|
15
|
+
}
|
|
16
|
+
const resourceFailureContext = sharedResourceFailureContext();
|
|
17
|
+
export function currentResourceFailureContext() {
|
|
18
|
+
return resourceFailureContext.getStore() ?? null;
|
|
19
|
+
}
|
|
20
|
+
export function resourceFailureAttachments(context, source) {
|
|
21
|
+
return preparedResourceAttachments(context.name, context.condition, source, 'attachment');
|
|
22
|
+
}
|
|
23
|
+
export function attemptFailureContext(name, work, attempt) {
|
|
24
|
+
return { name, condition: { kind: 'attempt', work, attempt } };
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const scopeRegistryKey = Symbol.for('@overkill-dev/transcript-attempt-scopes/v1');
|
|
28
|
+
function isAttemptScopeRegistry(value) {
|
|
29
|
+
return value instanceof WeakMap;
|
|
30
|
+
}
|
|
31
|
+
function sharedAttemptScopes() {
|
|
32
|
+
const existing = Reflect.get(globalThis, scopeRegistryKey);
|
|
33
|
+
if (isAttemptScopeRegistry(existing)) {
|
|
34
|
+
return existing;
|
|
35
|
+
}
|
|
36
|
+
const created = new WeakMap();
|
|
37
|
+
Object.defineProperty(globalThis, scopeRegistryKey, { value: created });
|
|
38
|
+
return created;
|
|
39
|
+
}
|
|
40
|
+
const attemptScopes = sharedAttemptScopes();
|
|
41
|
+
|
|
42
|
+
export function transcriptAttempt(scope) {
|
|
43
|
+
return scope === null ? null : attemptScopes.get(scope) ?? null;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=resource-failure-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-failure-context.js","sourceRoot":"","sources":["../../../../source/attachments/resource-failure-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,OAAO,EAAE,6BAAkD,MAAM,yBAAyB,CAAC;AAM3F,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;AAE3E,SAAS,wBAAwB,CAAC,KAAc;IAC5C,OAAO,KAAK,YAAY,iBAAiB,CAAC;AAC9C,CAAC;AACD,SAAS,4BAA4B;IACjC,MAAM,QAAQ,GAAY,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC9D,IAAI,wBAAwB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrC,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAA0B,CAAC;IAChE,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAClE,OAAO,OAAO,CAAC;AACnB,CAAC;AACD,MAAM,sBAAsB,GAAG,4BAA4B,EAAE,CAAC;AAE9D,MAAM,UAAU,6BAA6B;IACzC,OAAO,sBAAsB,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,0BAA0B,CACtC,OAA+B,EAC/B,MAA4C;IAE5C,OAAO,2BAA2B,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,IAAY,EAAE,OAAkB;IAChF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;AACnE,CAAC;;MAWK,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;AAClF,SAAS,sBAAsB,CAAC,KAAc;IAC1C,OAAO,KAAK,YAAY,OAAO,CAAC;AACpC,CAAC;AACD,SAAS,mBAAmB;IACxB,MAAM,QAAQ,GAAY,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;IACpE,IAAI,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,MAAM,OAAO,GAAyB,IAAI,OAAO,EAAE,CAAC;IACpD,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,gBAAgB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACxE,OAAO,OAAO,CAAC;AACnB,CAAC;AACD,MAAM,aAAa,GAAG,mBAAmB,EAAE,CAAC;;MAQtC,UAAU,iBAAiB,CAC7B,KAA0B;IAE1B,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
function sortedObjectKeys(value) {
|
|
2
|
+
return Object.keys(value).toSorted(function compareKeys(left, right) {
|
|
3
|
+
return left.localeCompare(right);
|
|
4
|
+
});
|
|
5
|
+
}
|
|
6
|
+
function canonicalNumber(value) {
|
|
7
|
+
if (Number.isFinite(value)) {
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
throw new TypeError('Cannot serialize number value for shard partitioning.');
|
|
11
|
+
}
|
|
12
|
+
function canonicalScalar(value) {
|
|
13
|
+
if (typeof value === 'boolean') {
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
if (typeof value === 'number') {
|
|
17
|
+
return canonicalNumber(value);
|
|
18
|
+
}
|
|
19
|
+
if (typeof value === 'string') {
|
|
20
|
+
return value.normalize('NFC');
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
function isRecord(value) {
|
|
25
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
26
|
+
}
|
|
27
|
+
function canonicalArray(value, canonicalize) {
|
|
28
|
+
return value.map(canonicalize);
|
|
29
|
+
}
|
|
30
|
+
function canonicalRecord(value, canonicalize) {
|
|
31
|
+
return Object.fromEntries(sortedObjectKeys(value).map(function toCanonicalEntry(key) {
|
|
32
|
+
return [key.normalize('NFC'), canonicalize(value[key])];
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
function canonicalJsonValue(value) {
|
|
36
|
+
const scalar = canonicalScalar(value);
|
|
37
|
+
if (scalar !== undefined) {
|
|
38
|
+
return scalar;
|
|
39
|
+
}
|
|
40
|
+
if (value === null) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
if (Array.isArray(value)) {
|
|
44
|
+
return canonicalArray(value, canonicalJsonValue);
|
|
45
|
+
}
|
|
46
|
+
if (isRecord(value)) {
|
|
47
|
+
return canonicalRecord(value, canonicalJsonValue);
|
|
48
|
+
}
|
|
49
|
+
throw new TypeError(`Cannot serialize ${typeof value} value for shard partitioning.`);
|
|
50
|
+
}
|
|
51
|
+
export function canonicalIdentityJson(value) {
|
|
52
|
+
return JSON.stringify(canonicalJsonValue(value));
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=canonical-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-identity.js","sourceRoot":"","sources":["../../../source/canonical-identity.ts"],"names":[],"mappings":"AAIA,SAAS,gBAAgB,CAAC,KAAwC;IAC9D,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,WAAW,CAAC,IAAI,EAAE,KAAK;QAC/D,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IAClC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC5B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,cAAc,CACnB,KAAyB,EACzB,YAAmD;IAEnD,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,eAAe,CACpB,KAAwC,EACxC,YAAmD;IAEnD,OAAO,MAAM,CAAC,WAAW,CACrB,gBAAgB,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,gBAAgB,CAAC,GAAG;QACrD,OAAO,CAAE,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;IAC9D,CAAC,CAAC,CACL,CAAC;AACN,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACtC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEtC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,cAAc,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,eAAe,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,IAAI,SAAS,CAAC,oBAAoB,OAAO,KAAK,gCAAgC,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAChD,OAAO,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;AACrD,CAAC"}
|
package/engine/identity.d.ts
CHANGED
|
@@ -18,6 +18,11 @@ export type WorkloadId = {
|
|
|
18
18
|
readonly name: string;
|
|
19
19
|
readonly params: Readonly<Record<string, string>>;
|
|
20
20
|
};
|
|
21
|
+
export type WorkId = {
|
|
22
|
+
readonly case: CaseId;
|
|
23
|
+
readonly runtimes: readonly RuntimeId[];
|
|
24
|
+
readonly workload: WorkloadId | null;
|
|
25
|
+
};
|
|
21
26
|
export type AttemptId = {
|
|
22
27
|
readonly index: number;
|
|
23
28
|
};
|
package/engine/identity.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../../source/engine/identity.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AACjE,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvE,MAAM,MAAM,SAAS,GAAG;IACpB,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../../source/engine/identity.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AACjE,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvE,MAAM,MAAM,SAAS,GAAG;IACpB,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,SAII,GAkFQ,SAAS,GAAG;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function caseIdentityKey(caseId) {
|
|
2
|
+
return JSON.stringify([caseId.file, caseId.suite, caseId.title, caseId.params]);
|
|
3
|
+
}
|
|
4
|
+
function orderedRecordEntries(record) {
|
|
5
|
+
return Object.entries(record).toSorted(function compareKeys([left], [right]) {
|
|
6
|
+
return left.localeCompare(right);
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
function runtimeIdentityShape(runtime) {
|
|
10
|
+
return [
|
|
11
|
+
runtime.name,
|
|
12
|
+
runtime.variantId,
|
|
13
|
+
orderedRecordEntries(runtime.dimensions),
|
|
14
|
+
orderedRecordEntries(runtime.scenarios)
|
|
15
|
+
];
|
|
16
|
+
}
|
|
17
|
+
function runtimeIdentitiesShape(runtimes) {
|
|
18
|
+
return runtimes.map(runtimeIdentityShape);
|
|
19
|
+
}
|
|
20
|
+
function workloadIdentityShape(workload) {
|
|
21
|
+
if (workload === null) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return [
|
|
25
|
+
workload.name,
|
|
26
|
+
orderedRecordEntries(workload.params)
|
|
27
|
+
];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function workIdentityKey(work) {
|
|
31
|
+
if (work.runtimes.length === 0 && work.workload === null) {
|
|
32
|
+
return caseIdentityKey(work.case);
|
|
33
|
+
}
|
|
34
|
+
return JSON.stringify([
|
|
35
|
+
caseIdentityKey(work.case),
|
|
36
|
+
runtimeIdentitiesShape(work.runtimes),
|
|
37
|
+
workloadIdentityShape(work.workload)
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../../source/engine/identity.ts"],"names":[],"mappings":"AA+BA,MAAM,UAAU,eAce,CAAC,MAAc;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,CAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAE,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAwC;IAClE,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,WAAW,CAAC,CAAE,IAAI,CAAE,EAAE,CAAE,KAAK,CAAE;QAC3E,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAkB;IAC5C,OAAO;QACH,OAAO,CAAC,IAAI;QACZ,OAAO,CAAC,SAAS;QACjB,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC;QACxC,oBAAoB,CAAC,OAAO,CAAC,SAAS,CAAC;KAC1C,CAAC;AACN,CAAC;AAED,SAAS,sBAAsB,CAAC,QAA8B;IAC1D,OAAO,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,qBAAqB,CAAC,QAA2B;IACtD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO;QACH,QAAQ,CAAC,IAAI;QACb,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC;KACxC,CAAC;AACN,CAAC;;MAMK,UAIU,eAAe,CAAC,IAAY;IACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACvD,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC;QAClB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACrC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC;KACvC,CAAC,CAAC;AACP,CAAC"}
|
package/engine/run-artifact.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export type RunArtifactScope = {
|
|
|
10
10
|
type RunArtifactBaseId = {
|
|
11
11
|
readonly runtimes: readonly RuntimeId[];
|
|
12
12
|
readonly sequence: number;
|
|
13
|
-
readonly subtype: 'attachment' | 'coverage' | 'hedged-conflict' | 'log-capture';
|
|
13
|
+
readonly subtype: 'attachment' | 'coverage' | 'hedged-conflict' | 'log-capture' | 'witness';
|
|
14
14
|
readonly workload: WorkloadId | null;
|
|
15
15
|
};
|
|
16
16
|
type CaseArtifactId = RunArtifactBaseId & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-artifact.d.ts","sourceRoot":"","sources":["../../../../source/engine/run-artifact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE9E,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,aAAa,GAAG,mBAAmB,CAAC;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB,GAAG;IACA,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;CACxB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACrB,QAAQ,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,GAAG,iBAAiB,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"run-artifact.d.ts","sourceRoot":"","sources":["../../../../source/engine/run-artifact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE9E,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,aAAa,GAAG,mBAAmB,CAAC;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACzB,GAAG;IACA,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;CACxB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACrB,QAAQ,CAAC,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,GAAG,iBAAiB,GAAG,aAAa,GAAG,SAAS,CAAC;IAC5F,QAAQ,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,KAAK,cAAc,GAAG,iBAAiB,GAAG;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,gBAAgB,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KAAE,CAAC,CAAC;CACzE,CAAC;AAEF,KAAK,mBAAmB,GAAG,iBAAiB,GAAG;IAC3C,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;KAAE,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,mBAAmB,CAAC;AAEjE,MAAM,CAAsC,EAO3C,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { JsonValue, ReadonlyDeep } from 'type-fest';
|
|
2
|
+
import type { AttemptId, WorkId } from './identity.ts';
|
|
2
3
|
import type { RunArtifactId } from './run-artifact.ts';
|
|
3
4
|
export type AttachmentMetadata = {
|
|
4
5
|
readonly name: string;
|
|
@@ -8,7 +9,7 @@ export type AttachmentCompletion = {
|
|
|
8
9
|
readonly kind: 'complete';
|
|
9
10
|
} | {
|
|
10
11
|
readonly kind: 'incomplete';
|
|
11
|
-
readonly reason: 'byte-limit' | 'interrupted' | 'unclosed' | 'write-error';
|
|
12
|
+
readonly reason: 'byte-limit' | 'capture-limit' | 'interrupted' | 'unclosed' | 'write-error';
|
|
12
13
|
} | {
|
|
13
14
|
readonly kind: 'truncated';
|
|
14
15
|
readonly reason: 'byte-limit';
|
|
@@ -40,22 +41,40 @@ export type AttachmentProducer = {
|
|
|
40
41
|
readonly kind: 'resource';
|
|
41
42
|
readonly name: string;
|
|
42
43
|
};
|
|
44
|
+
export type FailureArtifactCondition = {
|
|
45
|
+
readonly kind: 'attempt';
|
|
46
|
+
readonly work: WorkId;
|
|
47
|
+
readonly attempt: AttemptId;
|
|
48
|
+
} | {
|
|
49
|
+
readonly kind: 'resource';
|
|
50
|
+
readonly resource: string;
|
|
51
|
+
readonly boundary: string;
|
|
52
|
+
};
|
|
53
|
+
type ExplicitAttachmentCapture = {
|
|
54
|
+
readonly capture: 'opt-in';
|
|
55
|
+
};
|
|
56
|
+
type AutomaticAttachmentCapture = {
|
|
57
|
+
readonly capture: 'automatic';
|
|
58
|
+
readonly retention: {
|
|
59
|
+
readonly condition: FailureArtifactCondition;
|
|
60
|
+
readonly state: 'prepared' | 'retained';
|
|
61
|
+
};
|
|
62
|
+
};
|
|
43
63
|
export type RuntimeAttachmentArtifact = {
|
|
44
64
|
readonly id: RunArtifactId & {
|
|
45
|
-
readonly subtype: 'attachment';
|
|
65
|
+
readonly subtype: 'attachment' | 'witness';
|
|
46
66
|
};
|
|
47
|
-
readonly source: 'instrumented';
|
|
67
|
+
readonly source: 'boundary-captured' | 'instrumented' | 'native';
|
|
48
68
|
readonly payload: AttachmentMetadata & {
|
|
49
69
|
readonly kind: 'runtime-attachment';
|
|
50
|
-
readonly capture: 'opt-in';
|
|
51
70
|
readonly capturedAtMicroseconds: number;
|
|
52
71
|
readonly producer: AttachmentProducer;
|
|
53
72
|
readonly content: AttachmentContent;
|
|
54
|
-
};
|
|
73
|
+
} & (AutomaticAttachmentCapture | ExplicitAttachmentCapture);
|
|
55
74
|
};
|
|
56
75
|
export type AttachmentWriter<Chunk> = {
|
|
57
76
|
readonly write: (chunk: Chunk) => Promise<void>;
|
|
58
|
-
readonly close: () => Promise<RuntimeAttachmentArtifact>;
|
|
77
|
+
readonly close: (...reason: readonly ['capture-limit'] | readonly []) => Promise<RuntimeAttachmentArtifact>;
|
|
59
78
|
};
|
|
60
79
|
export type RuntimeAttachments = {
|
|
61
80
|
readonly open: {
|
|
@@ -75,4 +94,5 @@ export type AttachmentLimits = {
|
|
|
75
94
|
readonly maxScopeBytes: number;
|
|
76
95
|
readonly maxScopeAttachments: number;
|
|
77
96
|
};
|
|
97
|
+
export {};
|
|
78
98
|
//# sourceMappingURL=runtime-attachment.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-attachment.d.ts","sourceRoot":"","sources":["../../../../source/engine/runtime-attachment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,MAAM,kBAAkB,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAAE,GAAG;IAChE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,GAAG,UAAU,GAAG,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime-attachment.d.ts","sourceRoot":"","sources":["../../../../source/engine/runtime-attachment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-attachment.js","sourceRoot":"","sources":["../../../../source/engine/runtime-attachment.ts"],"names":[],"mappings":"AA0FA,MAAM,CAAC,MAAM,uBAAuB,GAAqB,MAAM,CAAC,MAAM,CAAC;IACnE,cAAc,EAAE,SAAS;IACzB,gBAAgB,EAAE,UAAU;IAC5B,aAAa,EAAE,UAAU;IACzB,mBAAmB,EAAE,GAAG;CAC3B,CAAC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { WorkloadId } from './identity.ts';
|
|
2
|
+
import { type WorkloadParameters as WorkloadParameterRecord } from './workload-parameters.ts';
|
|
3
|
+
export type WorkloadParameters = WorkloadParameterRecord;
|
|
4
|
+
export type WorkloadInput = {
|
|
5
|
+
readonly id: WorkloadId;
|
|
6
|
+
readonly parameters: WorkloadParameters;
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=workload-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workload-input.d.ts","sourceRoot":"","sources":["../../../../source/engine/workload-input.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAEH,KAAK,kBAAkB,IAAI,uBAAuB,EACrD,MAAM,0BAA0B,CAAC;AAElC,MAAM,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG;IACxB,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;CAC3C,CAAC"}
|