@overkill-dev/run 0.0.64 → 0.0.66

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.
Files changed (275) hide show
  1. package/attachments/attachment-context.js +41 -0
  2. package/attachments/attachment-context.js.map +1 -0
  3. package/attachments/failure-artifact-stream.js +53 -0
  4. package/attachments/failure-artifact-stream.js.map +1 -0
  5. package/attachments/resource-failure-context.js +41 -0
  6. package/attachments/resource-failure-context.js.map +1 -0
  7. package/engine/case-execution.d.ts +1 -0
  8. package/engine/case-execution.d.ts.map +1 -1
  9. package/engine/case-execution.js +17 -29
  10. package/engine/case-execution.js.map +1 -1
  11. package/engine/recorded-assertion-failure.js +30 -0
  12. package/engine/recorded-assertion-failure.js.map +1 -0
  13. package/engine/run-artifact.d.ts +2 -2
  14. package/engine/run-artifact.d.ts.map +1 -1
  15. package/engine/run-result.d.ts +5 -1
  16. package/engine/run-result.d.ts.map +1 -1
  17. package/engine/run-result.js.map +1 -1
  18. package/engine/runtime-attachment.d.ts +82 -0
  19. package/engine/runtime-attachment.d.ts.map +1 -0
  20. package/engine/runtime-attachment.js +7 -0
  21. package/engine/runtime-attachment.js.map +1 -0
  22. package/package-version.js +31 -0
  23. package/package-version.js.map +1 -0
  24. package/package.json +29 -3
  25. package/packages/resources/attachment-context.entry-point.js +2 -0
  26. package/packages/resources/attachment-context.entry-point.js.map +1 -0
  27. package/packages/run/config.entry-point.d.ts +1 -1
  28. package/packages/run/config.entry-point.d.ts.map +1 -1
  29. package/packages/run/run.entry-point.d.ts +1 -1
  30. package/packages/run/run.entry-point.d.ts.map +1 -1
  31. package/packages/simulation/transcript.entry-point.js +2 -0
  32. package/packages/simulation/transcript.entry-point.js.map +1 -1
  33. package/readme.md +41 -7
  34. package/reporters/human-reporter-rendering.js +59 -15
  35. package/reporters/human-reporter-rendering.js.map +1 -1
  36. package/resources/failure-artifacts.js +9 -0
  37. package/resources/failure-artifacts.js.map +1 -0
  38. package/resources/resource-definition-brand.js +1 -1
  39. package/resources/resource-definition-brand.js.map +1 -1
  40. package/resources/resource-definition-types.d.ts.map +1 -1
  41. package/resources/resource-scenario-binding.js +2 -0
  42. package/resources/resource-scenario-binding.js.map +1 -1
  43. package/resources/resource-session.d.ts.map +1 -1
  44. package/resources/runtime-definition.d.ts.map +1 -1
  45. package/resources/runtime-definition.js +1 -1
  46. package/resources/runtime-definition.js.map +1 -1
  47. package/resources/runtime-matrix-definition.d.ts.map +1 -1
  48. package/resources/runtime-matrix-definition.js +2 -2
  49. package/resources/runtime-matrix-definition.js.map +1 -1
  50. package/run/assertion-result-schema.js +69 -0
  51. package/run/assertion-result-schema.js.map +1 -0
  52. package/run/attachment-connection.js +108 -0
  53. package/run/attachment-connection.js.map +1 -0
  54. package/run/attachment-coordinator-context.js +9 -0
  55. package/run/attachment-coordinator-context.js.map +1 -0
  56. package/run/attachment-coordinator.js +81 -0
  57. package/run/attachment-coordinator.js.map +1 -0
  58. package/run/attachment-eligibility.js +21 -0
  59. package/run/attachment-eligibility.js.map +1 -0
  60. package/run/attachment-execution.js +302 -0
  61. package/run/attachment-execution.js.map +1 -0
  62. package/run/attachment-failure.js +63 -0
  63. package/run/attachment-failure.js.map +1 -0
  64. package/run/attachment-frames.js +22 -0
  65. package/run/attachment-frames.js.map +1 -0
  66. package/run/attachment-json.js +118 -0
  67. package/run/attachment-json.js.map +1 -0
  68. package/run/attachment-protocol.js +9 -0
  69. package/run/attachment-protocol.js.map +1 -0
  70. package/run/attachment-record.js +60 -0
  71. package/run/attachment-record.js.map +1 -0
  72. package/run/attachment-reporter.js +40 -0
  73. package/run/attachment-reporter.js.map +1 -0
  74. package/run/attachment-results.js +111 -0
  75. package/run/attachment-results.js.map +1 -0
  76. package/run/attachment-retention.js +153 -0
  77. package/run/attachment-retention.js.map +1 -0
  78. package/run/attachment-run.js +36 -0
  79. package/run/attachment-run.js.map +1 -0
  80. package/run/attachment-server.js +136 -0
  81. package/run/attachment-server.js.map +1 -0
  82. package/run/attachment-storage-session.js +22 -0
  83. package/run/attachment-storage-session.js.map +1 -0
  84. package/run/attachment-storage-writer.js +128 -0
  85. package/run/attachment-storage-writer.js.map +1 -0
  86. package/run/attachment-store.js +287 -0
  87. package/run/attachment-store.js.map +1 -0
  88. package/run/attachment-wire-schema.js +159 -0
  89. package/run/attachment-wire-schema.js.map +1 -0
  90. package/run/attachment-worker-context.js +49 -0
  91. package/run/attachment-worker-context.js.map +1 -0
  92. package/run/attachment-writer.js +119 -0
  93. package/run/attachment-writer.js.map +1 -0
  94. package/run/capability-policy-snapshots.d.ts +3 -2
  95. package/run/capability-policy-snapshots.d.ts.map +1 -1
  96. package/run/capability-policy-snapshots.js.map +1 -1
  97. package/run/capability-policy.js +48 -38
  98. package/run/capability-policy.js.map +1 -1
  99. package/run/child-process-protocol.js +17 -13
  100. package/run/child-process-protocol.js.map +1 -1
  101. package/run/child-process-shutdown.js +54 -0
  102. package/run/child-process-shutdown.js.map +1 -0
  103. package/run/collected-run-plan-schema.js +90 -0
  104. package/run/collected-run-plan-schema.js.map +1 -0
  105. package/run/coverage-config-schema.d.ts +6 -6
  106. package/run/coverage-runtime-source.js +5 -0
  107. package/run/coverage-runtime-source.js.map +1 -1
  108. package/run/coverage-source-selection.js +6 -2
  109. package/run/coverage-source-selection.js.map +1 -1
  110. package/run/current-process-run-orchestrator.js +7 -11
  111. package/run/current-process-run-orchestrator.js.map +1 -1
  112. package/run/diff-schema.js +78 -0
  113. package/run/diff-schema.js.map +1 -0
  114. package/run/failure-artifact-retention.js +76 -0
  115. package/run/failure-artifact-retention.js.map +1 -0
  116. package/run/node-child-process-starters.js +8 -1
  117. package/run/node-child-process-starters.js.map +1 -1
  118. package/run/node-process-policy-observation.js +43 -0
  119. package/run/node-process-policy-observation.js.map +1 -0
  120. package/run/permission-denial-runtime-policy.js +3 -0
  121. package/run/permission-denial-runtime-policy.js.map +1 -1
  122. package/run/reporter-event-schema.js +42 -0
  123. package/run/reporter-event-schema.js.map +1 -0
  124. package/run/resource-disposal-error.js +27 -0
  125. package/run/resource-disposal-error.js.map +1 -0
  126. package/run/resource-failure-preparation.js +86 -0
  127. package/run/resource-failure-preparation.js.map +1 -0
  128. package/run/resource-lifecycle-disposal.js +132 -0
  129. package/run/resource-lifecycle-disposal.js.map +1 -0
  130. package/run/resource-lifecycle-projection.js +6 -2
  131. package/run/resource-lifecycle-projection.js.map +1 -1
  132. package/run/resource-lifecycle-session-acquirer.js +31 -8
  133. package/run/resource-lifecycle-session-acquirer.js.map +1 -1
  134. package/run/resource-lifecycle-startup-budget.js +1 -0
  135. package/run/resource-lifecycle-startup-budget.js.map +1 -1
  136. package/run/resource-lifecycle-state.d.ts +2 -1
  137. package/run/resource-lifecycle-state.d.ts.map +1 -1
  138. package/run/resource-lifecycle-state.js +40 -1
  139. package/run/resource-lifecycle-state.js.map +1 -1
  140. package/run/resource-lifecycle.js +47 -107
  141. package/run/resource-lifecycle.js.map +1 -1
  142. package/run/retry-artifact-retention.js.map +1 -1
  143. package/run/run-artifact-id-schema.js +27 -0
  144. package/run/run-artifact-id-schema.js.map +1 -0
  145. package/run/run-artifact-schema.js +74 -0
  146. package/run/run-artifact-schema.js.map +1 -0
  147. package/run/run-collection-error-result.js +1 -1
  148. package/run/run-collection-error-result.js.map +1 -1
  149. package/run/run-command-schema.js +60 -0
  150. package/run/run-command-schema.js.map +1 -0
  151. package/run/run-config-schema.d.ts +25 -6
  152. package/run/run-config-schema.d.ts.map +1 -1
  153. package/run/run-config-schema.js +11 -0
  154. package/run/run-config-schema.js.map +1 -1
  155. package/run/run-config.d.ts +7 -5
  156. package/run/run-config.d.ts.map +1 -1
  157. package/run/run-config.js +2 -1
  158. package/run/run-config.js.map +1 -1
  159. package/run/run-engine-primitives.d.ts +12 -1
  160. package/run/run-engine-primitives.d.ts.map +1 -1
  161. package/run/run-errors.d.ts +2 -0
  162. package/run/run-errors.d.ts.map +1 -1
  163. package/run/run-errors.js +17 -0
  164. package/run/run-errors.js.map +1 -1
  165. package/run/run-facts.js +1 -0
  166. package/run/run-facts.js.map +1 -1
  167. package/run/run-identity-schema.js +38 -0
  168. package/run/run-identity-schema.js.map +1 -0
  169. package/run/run-isolated-command.js +1 -0
  170. package/run/run-isolated-command.js.map +1 -1
  171. package/run/run-local-command.js +20 -4
  172. package/run/run-local-command.js.map +1 -1
  173. package/run/run-local-coverage.js +16 -3
  174. package/run/run-local-coverage.js.map +1 -1
  175. package/run/run-local-execution.js +2 -1
  176. package/run/run-local-execution.js.map +1 -1
  177. package/run/run-local-resolution.js.map +1 -1
  178. package/run/run-orchestrator.d.ts +2 -2
  179. package/run/run-orchestrator.d.ts.map +1 -1
  180. package/run/run-orchestrator.js +2 -2
  181. package/run/run-orchestrator.js.map +1 -1
  182. package/run/run-record-input.js.map +1 -1
  183. package/run/run-record-outcomes.d.ts +4 -1
  184. package/run/run-record-outcomes.d.ts.map +1 -1
  185. package/run/run-record-versions.js +1 -30
  186. package/run/run-record-versions.js.map +1 -1
  187. package/run/run-record.js.map +1 -1
  188. package/run/run-result-schema.js +65 -0
  189. package/run/run-result-schema.js.map +1 -0
  190. package/run/run-runtime-schema.js +64 -0
  191. package/run/run-runtime-schema.js.map +1 -0
  192. package/run/run-support.js +10 -1
  193. package/run/run-support.js.map +1 -1
  194. package/run/run-types.d.ts +3 -4
  195. package/run/run-types.d.ts.map +1 -1
  196. package/run/run-types.js.map +1 -1
  197. package/run/run-validation.js +9 -0
  198. package/run/run-validation.js.map +1 -1
  199. package/run/runtime-attachment-boundary.js +11 -0
  200. package/run/runtime-attachment-boundary.js.map +1 -0
  201. package/run/serialized-value-schema.js +76 -0
  202. package/run/serialized-value-schema.js.map +1 -0
  203. package/run/simulation-witness.js +38 -0
  204. package/run/simulation-witness.js.map +1 -0
  205. package/run/supervised-child-failure.js +26 -0
  206. package/run/supervised-child-failure.js.map +1 -0
  207. package/run/supervised-child-process.d.ts +3 -0
  208. package/run/supervised-child-process.d.ts.map +1 -1
  209. package/run/supervised-child-process.js +2 -0
  210. package/run/supervised-child-process.js.map +1 -1
  211. package/run/supervised-child-transport.js +125 -0
  212. package/run/supervised-child-transport.js.map +1 -0
  213. package/run/supervised-child.entry-point.js +38 -33
  214. package/run/supervised-child.entry-point.js.map +1 -1
  215. package/run/supervised-child.js +13 -11
  216. package/run/supervised-child.js.map +1 -1
  217. package/run/supervised-protocol-schema.js +42 -0
  218. package/run/supervised-protocol-schema.js.map +1 -0
  219. package/run/supervised-protocol.js.map +1 -1
  220. package/run/supervised-run-collection.js +33 -30
  221. package/run/supervised-run-collection.js.map +1 -1
  222. package/run/supervised-run-runtime.js +36 -12
  223. package/run/supervised-run-runtime.js.map +1 -1
  224. package/run/supervised-run-state.js +43 -22
  225. package/run/supervised-run-state.js.map +1 -1
  226. package/run/supervised-run.js +80 -39
  227. package/run/supervised-run.js.map +1 -1
  228. package/run/worker-pool-command.js +1 -0
  229. package/run/worker-pool-command.js.map +1 -1
  230. package/run/worker-pool-execution.js +12 -5
  231. package/run/worker-pool-execution.js.map +1 -1
  232. package/run/worker-pool-hedged-arbitration.js +7 -2
  233. package/run/worker-pool-hedged-arbitration.js.map +1 -1
  234. package/run/worker-pool-host-process.js +50 -20
  235. package/run/worker-pool-host-process.js.map +1 -1
  236. package/run/worker-pool-host-protocol-schema.js +80 -0
  237. package/run/worker-pool-host-protocol-schema.js.map +1 -0
  238. package/run/worker-pool-host-protocol.js.map +1 -1
  239. package/run/worker-pool-host-task.js +20 -11
  240. package/run/worker-pool-host-task.js.map +1 -1
  241. package/run/worker-pool-host-transport.js +96 -0
  242. package/run/worker-pool-host-transport.js.map +1 -0
  243. package/run/worker-pool-host.entry-point.js +37 -5
  244. package/run/worker-pool-host.entry-point.js.map +1 -1
  245. package/run/worker-pool-protocol.js +3 -0
  246. package/run/worker-pool-protocol.js.map +1 -1
  247. package/run/worker-pool-resource-lifecycle-execution.js +66 -1
  248. package/run/worker-pool-resource-lifecycle-execution.js.map +1 -1
  249. package/run/worker-pool-routing.js +2 -1
  250. package/run/worker-pool-routing.js.map +1 -1
  251. package/run/worker-pool-run.js +8 -1
  252. package/run/worker-pool-run.js.map +1 -1
  253. package/run/worker-pool-runtime.js +3 -7
  254. package/run/worker-pool-runtime.js.map +1 -1
  255. package/run/worker-pool-task-events.js +20 -14
  256. package/run/worker-pool-task-events.js.map +1 -1
  257. package/run/worker-pool-task-schema.js +61 -0
  258. package/run/worker-pool-task-schema.js.map +1 -0
  259. package/run/worker-pool-task-validation.js +1 -0
  260. package/run/worker-pool-task-validation.js.map +1 -1
  261. package/run/worker-pool-worker-resources.js +68 -0
  262. package/run/worker-pool-worker-resources.js.map +1 -1
  263. package/run/worker-pool-worker.js +25 -8
  264. package/run/worker-pool-worker.js.map +1 -1
  265. package/sbom.cdx.json +5 -5
  266. package/stored-value.js +12 -0
  267. package/stored-value.js.map +1 -0
  268. package/transcript/http-transcript-artifact.js +2 -0
  269. package/transcript/http-transcript-artifact.js.map +1 -0
  270. package/transcript/transcript-store.d.ts +1 -1
  271. package/transcript/transcript-store.d.ts.map +1 -1
  272. package/transcript/transcript-store.js +29 -3
  273. package/transcript/transcript-store.js.map +1 -1
  274. package/run/node-process-capability-restrictions.js +0 -92
  275. package/run/node-process-capability-restrictions.js.map +0 -1
@@ -0,0 +1,63 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { CaseRunnerError } from "../engine/run-result.js";
3
+ export class AttachmentOperationError extends CaseRunnerError {
4
+ consumed = false;
5
+ owner;
6
+ drift;
7
+ constructor(message, options) {
8
+ super(message, options);
9
+ this.name = 'AttachmentOperationError';
10
+ this.owner = options.drift ? { kind: 'run' } : options.owner;
11
+ this.drift = options.drift;
12
+ }
13
+ runnerError(attributedTo, work) {
14
+ this.consumed = true;
15
+ return {
16
+ ...super.runnerError(attributedTo, work),
17
+ attributedTo: this.drift ? null : attributedTo,
18
+ attributedToWork: this.drift ? null : work,
19
+ attributedToAttempt: this.owner.kind === 'case' ? this.owner.attempt : null
20
+ };
21
+ }
22
+ take() {
23
+ if (this.consumed) {
24
+ return null;
25
+ }
26
+ this.consumed = true;
27
+ return {
28
+ attributedTo: this.owner.kind === 'case' ? this.owner.work.case : null,
29
+ attributedToAttempt: this.owner.kind === 'case' ? this.owner.attempt : null,
30
+ attributedToWork: this.owner.kind === 'case' ? this.owner.work : null,
31
+ cause: this.cause,
32
+ diagnostics: [],
33
+ message: this.message,
34
+ subtype: this.drift ? 'attribution-drift' : 'artifact'
35
+ };
36
+ }
37
+ }
38
+ export function createAttachmentFailure(rejection, branch) {
39
+ const { owner, message, reason, drift } = rejection;
40
+ return new AttachmentOperationError(message, {
41
+ cause: { branch, id: randomUUID(), kind: 'runtime-attachment-error', owner, reason },
42
+ drift,
43
+ owner,
44
+ subtype: drift ? 'attribution-drift' : 'artifact'
45
+ });
46
+ }
47
+ export function attachmentFailureIdentity(error) {
48
+ const cause = error.cause;
49
+ if (typeof cause !== 'object' || cause === null || Reflect.get(cause, 'kind') !== 'runtime-attachment-error') {
50
+ return null;
51
+ }
52
+ const id = Reflect.get(cause, 'id');
53
+ return typeof id === 'string' ? id : null;
54
+ }
55
+ export function attachmentFailureBranch(error) {
56
+ const cause = error.cause;
57
+ if (attachmentFailureIdentity(error) === null || typeof cause !== 'object' || cause === null) {
58
+ return null;
59
+ }
60
+ const branch = Reflect.get(cause, 'branch');
61
+ return typeof branch === 'string' ? branch : null;
62
+ }
63
+ //# sourceMappingURL=attachment-failure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-failure.js","sourceRoot":"","sources":["../../../../source/run/attachment-failure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { Transform } from 'node:stream';
2
+ const newlineByte = 10;
3
+ export function boundedAttachmentFrames(limit) {
4
+ let pendingBytes = 0;
5
+ return new Transform({
6
+ transform(chunk, encoding, callback) {
7
+ if (typeof chunk === 'string') {
8
+ callback(new TypeError(`Attachment messages require bytes, received ${encoding}.`));
9
+ return;
10
+ }
11
+ for (const byte of chunk) {
12
+ pendingBytes = byte === newlineByte ? 0 : pendingBytes + 1;
13
+ if (pendingBytes > limit) {
14
+ callback(new Error('Attachment message exceeded its frame limit.'));
15
+ return;
16
+ }
17
+ }
18
+ callback(null, chunk);
19
+ }
20
+ });
21
+ }
22
+ //# sourceMappingURL=attachment-frames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-frames.js","sourceRoot":"","sources":["../../../../source/run/attachment-frames.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACjD,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,OAAO,IAAI,SAAS,CAAC;QACjB,SAAS,CAAC,KAAa,EAAE,QAAQ,EAAE,QAAQ;YACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC5B,QAAQ,CAAC,IAAI,SAAS,CAAC,+CAA+C,QAAQ,GAAG,CAAC,CAAC,CAAC;gBACpF,OAAO;YACX,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,YAAY,GAAG,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC;gBAC3D,IAAI,YAAY,GAAG,KAAK,EAAE,CAAC;oBACvB,QAAQ,CAAC,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;oBACpE,OAAO;gBACX,CAAC;YACL,CAAC;YACD,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1B,CAAC;KACJ,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,118 @@
1
+ import { createStoredRunValue } from "./supervised-run-state.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 = createStoredRunValue(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) {
86
+ return function visit(value, depth) {
87
+ if (scalar(value)) {
88
+ budget.reserve(Buffer.byteLength(JSON.stringify(value)));
89
+ return value;
90
+ }
91
+ if (!isContainer(value)) {
92
+ throw new TypeError('Attachments require finite JSON values.');
93
+ }
94
+ validateContainer(value, budget, depth);
95
+ try {
96
+ return containerSnapshot(value, budget, depth, visit);
97
+ }
98
+ finally {
99
+ budget.leave(value);
100
+ }
101
+ };
102
+ }
103
+ function boundedJsonSnapshot(value, maxBytes) {
104
+ const copy = createJsonVisit(createJsonSnapshotBudget(maxBytes))(value, 0);
105
+ return { value: copy, encoded: JSON.stringify(copy) };
106
+ }
107
+ export function snapshotAttachmentJson(value, maxBytes) {
108
+ try {
109
+ return boundedJsonSnapshot(value, maxBytes);
110
+ }
111
+ catch (error) {
112
+ if (error instanceof JsonByteLimitError) {
113
+ return null;
114
+ }
115
+ throw error;
116
+ }
117
+ }
118
+ //# sourceMappingURL=attachment-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-json.js","sourceRoot":"","sources":["../../../../source/run/attachment-json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAWjE,MAAM,YAAY,GAAG,EAAE,CAAC;AACxB,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,kBAAmB,SAAQ,KAAK;IAClC;QACI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACrC,CAAC;CACJ;AACD,SAAS,wBAAwB,CAAC,QAAgB;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAiB,CAAC;IAC3C,MAAM,SAAS,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACjD,OAAO;QACH,OAAO,CAAC,KAAK;YACT,IAAI,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC3B,MAAM,IAAI,kBAAkB,EAAE,CAAC;YACnC,CAAC;YACD,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC;QAC9C,CAAC;QACD,KAAK,CAAC,KAAK;YACP,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,CAAC,KAAK;YACP,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QACD,QAAQ,CAAC,KAAK;YACV,OAAO,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;KACJ,CAAC;AACN,CAAC;AACD,SAAS,MAAM,CAAC,KAAc;IAC1B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ;QAC5E,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AACD,SAAS,eAAe,CAAC,UAAoD;IACzE,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,SAAS,CAAC,6DAA6D,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,UAAU,CAAC,KAAK,CAAC;AAC5B,CAAC;AACD,SAAS,aAAa,CAClB,KAAyB,EACzB,MAA0B,EAC1B,KAAa,EACb,KAAgB;IAEhB,MAAM,OAAO,GAA8B,EAAE,CAAC;IAC9C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3G,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AACD,SAAS,cAAc,CACnB,KAAoB,EACpB,MAA0B,EAC1B,KAAa,EACb,KAAgB;IAEhB,MAAM,OAAO,GAA4C,EAAE,CAAC;IAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,aAAa,CAAC,GAAG;QACjE,OAAO,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;IAC5E,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,CAAE,KAAK,EAAE,GAAG,CAAE,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE;YAChC,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;SACxF,CAAC,CAAC;IACP,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AACD,SAAS,WAAW,CAAC,KAAc;IAC/B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACvD,CAAC;AACD,SAAS,iBAAiB,CAAC,KAAoB,EAAE,MAA0B,EAAE,KAAa;IACtF,IAAI,KAAK,GAAG,YAAY,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,SAAS,CAAC,wEAAwE,CAAC,CAAC;IAClG,CAAC;IACD,MAAM,SAAS,GAAY,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QAChF,MAAM,IAAI,SAAS,CAAC,oDAAoD,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AACD,SAAS,iBAAiB,CACtB,KAAoB,EACpB,MAA0B,EAC1B,KAAa,EACb,KAAgB;IAEhB,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACvB,CAAC,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC;QAC5C,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC;AACD,SAAS,eAAe,CAAC,MAA0B;IAC/C,OAAO,SAAS,KAAK,CAAC,KAAK,EAAE,KAAK;QAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YAChB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzD,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;QACnE,CAAC;QACD,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC;YACD,OAAO,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACP,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACL,CAAC,CAAC;AACN,CAAC;AACD,SAAS,mBAAmB,CAAC,KAAc,EAAE,QAAgB;IACzD,MAAM,IAAI,GAAG,eAAe,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1D,CAAC;AACD,MAAM,UAAU,sBAAsB,CAAC,KAAc,EAAE,QAAgB;IACnE,IAAI,CAAC;QACD,OAAO,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACtB,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { workIdentityKey } from "../engine/identity.js";
2
+ export const attachmentChunkBytes = 65_536;
3
+ export const attachmentMetadataBytes = 256;
4
+ export const attachmentMaxFrameBytes = 131_072;
5
+ export const attachmentMaxPendingRequests = 256;
6
+ export function attachmentScopeKey(owner) {
7
+ return owner.kind === 'run' ? 'run' : workIdentityKey(owner.work);
8
+ }
9
+ //# sourceMappingURL=attachment-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-protocol.js","sourceRoot":"","sources":["../../../../source/run/attachment-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAA+B,MAAM,uBAAuB,CAAC;AA2ErF,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AAC3C,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAC3C,MAAM,CAAC,MAAM,uBAAuB,GAAG,OAAO,CAAC;AAE/C,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAEhD,MAAM,UAAU,kBAAkB,CAAC,KAAsB;IACrD,OAAO,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { ulid } from 'ulid';
2
+ import { createStoredRunValue } from "./supervised-run-state.js";
3
+ import { collectedRunPlanFromTestPlan, createRunResultFromCollectedPlan } from "./collected-run-plan.js";
4
+ import { createRunRecordSession } from "./run-record.js";
5
+ import { runRecordVersions } from "./run-record-versions.js";
6
+ import { selectedProfile } from "./run-facts.js";
7
+ function createAttachmentRecordCheckpoint(record, resolved, dependencies) {
8
+ const pending = createStoredRunValue(Promise.resolve());
9
+ const startedAt = Number(dependencies.wallClock.currentMonotonicMicroseconds);
10
+ async function persist(artifacts, previous) {
11
+ await previous;
12
+ const plan = resolved.plan.kind === 'local'
13
+ ? collectedRunPlanFromTestPlan(resolved.plan.testPlan)
14
+ : resolved.plan.collectedPlan;
15
+ const partial = createRunResultFromCollectedPlan(plan, [], [], {
16
+ completedAtMicroseconds: Number(dependencies.wallClock.currentMonotonicMicroseconds),
17
+ planStatus: 'planned',
18
+ resourceUsage: null,
19
+ startedAtMicroseconds: startedAt,
20
+ testExecutionWallTimeMicroseconds: 0
21
+ });
22
+ const persisted = await record.checkpointResult({ ...partial, artifacts });
23
+ if (persisted.runnerErrors.length > 0) {
24
+ throw new Error(persisted.runnerErrors[0]?.message ?? 'Attachment record checkpoint failed.');
25
+ }
26
+ }
27
+ async function checkpoint(artifacts) {
28
+ pending.write(persist(artifacts, pending.read()));
29
+ await pending.read();
30
+ }
31
+ return { checkpoint };
32
+ }
33
+ export async function createAttachmentRecord(resolved, dependencies) {
34
+ const record = createRunRecordSession(resolved.cwd, {
35
+ config: resolved.config,
36
+ engine: resolved.engine,
37
+ profile: selectedProfile(resolved.request, resolved.config),
38
+ projectRoot: resolved.facts.environment.projectRoot,
39
+ request: { ...resolved.request, seed: { value: BigInt(resolved.facts.reproducibility.seed) } }
40
+ }, {
41
+ createId: ulid,
42
+ node: dependencies.node,
43
+ store: dependencies.runtimeStateStore,
44
+ versions: await runRecordVersions(resolved.engine, dependencies.node.version),
45
+ wallClock: dependencies.wallClock
46
+ });
47
+ await record.start(null);
48
+ await record.recordFacts(resolved.facts);
49
+ const checkpoints = createAttachmentRecordCheckpoint(record, resolved, dependencies);
50
+ return {
51
+ captureTime() {
52
+ return Number(dependencies.wallClock.currentMonotonicMicroseconds);
53
+ },
54
+ async checkpoint(artifacts) {
55
+ return checkpoints.checkpoint(artifacts);
56
+ },
57
+ session: record
58
+ };
59
+ }
60
+ //# sourceMappingURL=attachment-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-record.js","sourceRoot":"","sources":["../../../../source/run/attachment-record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,4BAA4B,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AACzG,OAAO,EAAE,sBAAsB,EAAyB,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAYjD,SAAS,gCAAgC,CACrC,MAAwB,EACxB,QAAqB,EACrB,YAAyC;IAEzC,MAAM,OAAO,GAAG,oBAAoB,CAAgB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IAC9E,KAAK,UAAU,OAAO,CAAC,SAA+C,EAAE,QAAuB;QAC3F,MAAM,QAAQ,CAAC;QACf,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO;YACvC,CAAC,CAAC,4BAA4B,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;YACtD,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;QAClC,MAAM,OAAO,GAAG,gCAAgC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;YAC3D,uBAAuB,EAAE,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,4BAA4B,CAAC;YACpF,UAAU,EAAE,SAAS;YACrB,aAAa,EAAE,IAAI;YACnB,qBAAqB,EAAE,SAAS;YAChC,iCAAiC,EAAE,CAAC;SACvC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3E,IAAI,SAAS,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,sCAAsC,CAAC,CAAC;QAClG,CAAC;IACL,CAAC;IACD,KAAK,UAAU,UAAU,CAAC,SAA+C;QACrE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAClD,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,CAAC;AAC1B,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CACxC,QAAqB,EACrB,YAAyC;IAEzC,MAAM,MAAM,GAAG,sBAAsB,CAAC,QAAQ,CAAC,GAAG,EAAE;QAChD,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC;QAC3D,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW;QACnD,OAAO,EAAE,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE;KACjG,EAAE;QACC,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,KAAK,EAAE,YAAY,CAAC,iBAAiB;QACrC,QAAQ,EAAE,MAAM,iBAAiB,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC;QAC7E,SAAS,EAAE,YAAY,CAAC,SAAS;KACpC,CAAC,CAAC;IACH,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,gCAAgC,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACrF,OAAO;QACH,WAAW;YACP,OAAO,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACvE,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,SAAS;YACtB,OAAO,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,EAAE,MAAM;KAClB,CAAC;AACN,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { defineReporter } from "../engine/reporter.js";
2
+ import { createDefaultWorkId } from "../engine/identity.js";
3
+ import { currentAttachmentCoordinator } from "./attachment-coordinator-context.js";
4
+ function eventWithAttachments(event, coordinator) {
5
+ if (event.kind !== 'test-end') {
6
+ return event;
7
+ }
8
+ coordinator.settleAttempt(event.workId ?? createDefaultWorkId(event.case), { index: event.attempt }, event.verdict, null);
9
+ return {
10
+ ...event,
11
+ artifacts: [
12
+ ...event.artifacts,
13
+ ...coordinator.caseArtifacts(event.workId ?? createDefaultWorkId(event.case), { index: event.attempt }, null)
14
+ ]
15
+ };
16
+ }
17
+ export function reporterWithAttachments(definition) {
18
+ const coordinator = currentAttachmentCoordinator();
19
+ if (coordinator === null) {
20
+ return definition;
21
+ }
22
+ return defineReporter(function createAttachmentReporter(context) {
23
+ const reporter = definition(context);
24
+ if (reporter.kind !== 'real-time') {
25
+ return reporter;
26
+ }
27
+ return new Proxy(reporter, {
28
+ get(target, property, receiver) {
29
+ if (property === 'onEvent') {
30
+ return async function deliverAttachmentEvent(event) {
31
+ return await target.onEvent(eventWithAttachments(event, coordinator));
32
+ };
33
+ }
34
+ const original = Reflect.get(target, property, receiver);
35
+ return original;
36
+ }
37
+ });
38
+ });
39
+ }
40
+ //# sourceMappingURL=attachment-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-reporter.js","sourceRoot":"","sources":["../../../../source/run/attachment-reporter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA4C,MAAM,uBAAuB,CAAC;AACjG,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,4BAA4B,EAA8B,MAAM,qCAAqC,CAAC;AAE/G,SAAS,oBAAoB,CAAC,KAAoB,EAAE,WAAkC;IAClF,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,WAAW,CAAC,aAAa,CACrB,KAAK,CAAC,MAAM,IAAI,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,EAC/C,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EACxB,KAAK,CAAC,OAAO,EACb,IAAI,CACP,CAAC;IACF,OAAO;QACH,GAAG,KAAK;QACR,SAAS,EAAE;YACP,GAAG,KAAK,CAAC,SAAS;YAClB,GAAG,WAAW,CAAC,aAAa,CACxB,KAAK,CAAC,MAAM,IAAI,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,EAC/C,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EACxB,IAAI,CACP;SACJ;KACJ,CAAC;AACN,CAAC;AACD,MAAM,UAAU,uBAAuB,CAAC,UAA2B;IAC/D,MAAM,WAAW,GAAG,4BAA4B,EAAE,CAAC;IACnD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,UAAU,CAAC;IACtB,CAAC;IACD,OAAO,cAAc,CAAC,SAAS,wBAAwB,CAAC,OAAO;QAC3D,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAChC,OAAO,QAAQ,CAAC;QACpB,CAAC;QACD,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE;YACvB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ;gBAC1B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBACzB,OAAO,KAAK,UAAU,sBAAsB,CAAC,KAAoB;wBAC7D,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;oBAC1E,CAAC,CAAC;gBACN,CAAC;gBACD,MAAM,QAAQ,GAAY,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAClE,OAAO,QAAQ,CAAC;YACpB,CAAC;SACJ,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,111 @@
1
+ import { appendRunnerErrors } from "../engine/execution-result.js";
2
+ import { workIdentityKey } from "../engine/identity.js";
3
+ import { runStatusFromPlan } from "../engine/run-result.js";
4
+ import { attachmentFailureIdentity, attachmentFailureBranch } from "./attachment-failure.js";
5
+ import { retainedRetryArtifacts } from "./retry-artifact-retention.js";
6
+ function unclosedError(owner) {
7
+ return {
8
+ attributedTo: owner.kind === 'case' ? owner.work.case : null,
9
+ attributedToAttempt: owner.kind === 'case' ? owner.attempt : null,
10
+ attributedToWork: owner.kind === 'case' ? owner.work : null,
11
+ cause: { owner, reason: 'unclosed' },
12
+ diagnostics: [],
13
+ message: 'Attachment writer did not close before its execution boundary ended.',
14
+ subtype: 'artifact'
15
+ };
16
+ }
17
+ export function attachmentArtifacts(artifacts) {
18
+ return artifacts.flatMap(function retainedAttachments(artifact) {
19
+ const { id, payload, source } = artifact;
20
+ if (payload.kind === 'runtime-attachment' && (id.subtype === 'attachment' || id.subtype === 'witness') &&
21
+ source !== 'v8-native') {
22
+ return [{ id: { ...id, subtype: id.subtype }, payload, source }];
23
+ }
24
+ return artifact.payload.kind === 'hedged-conflict'
25
+ ? [...artifact.payload.authoritative.attachments, ...artifact.payload.conflicting.attachments]
26
+ : [];
27
+ });
28
+ }
29
+ export function attachmentMatchesAttempt(artifact, work, attempt) {
30
+ if (artifact.id.scope.kind !== 'case' || artifact.id.attempt?.index !== attempt.index) {
31
+ return false;
32
+ }
33
+ const identity = {
34
+ case: artifact.id.scope.case,
35
+ runtimes: artifact.id.runtimes,
36
+ workload: artifact.id.workload
37
+ };
38
+ return workIdentityKey(identity) === workIdentityKey(work);
39
+ }
40
+ function distinctAttachmentErrors(errors) {
41
+ const ids = new Set();
42
+ return errors.filter(function distinctError(error) {
43
+ const id = attachmentFailureIdentity(error);
44
+ if (id === null) {
45
+ return true;
46
+ }
47
+ if (ids.has(id)) {
48
+ return false;
49
+ }
50
+ ids.add(id);
51
+ return true;
52
+ });
53
+ }
54
+ function retainedConflictEvidence(artifact, policy) {
55
+ const { payload } = artifact;
56
+ if (payload.kind !== 'hedged-conflict') {
57
+ return artifact;
58
+ }
59
+ const results = [{ workId: payload.work, attempts: payload.authoritative.attempts }];
60
+ const conflicting = [{ workId: payload.work, attempts: payload.conflicting.attempts }];
61
+ return {
62
+ id: { ...artifact.id, subtype: 'hedged-conflict' },
63
+ source: 'native',
64
+ payload: {
65
+ ...payload,
66
+ authoritative: {
67
+ ...payload.authoritative,
68
+ attachments: retainedRetryArtifacts(payload.authoritative.attachments, results, policy)
69
+ },
70
+ conflicting: {
71
+ ...payload.conflicting,
72
+ attachments: retainedRetryArtifacts(payload.conflicting.attachments, conflicting, policy)
73
+ }
74
+ }
75
+ };
76
+ }
77
+ function retainedAttachmentErrors(errors, retains) {
78
+ return distinctAttachmentErrors(errors.filter(function belongsToRetainedBranch(error) {
79
+ return retains(attachmentFailureBranch(error));
80
+ }));
81
+ }
82
+ export function resultWithRuntimeAttachments(result, attachments, options) {
83
+ const artifacts = retainedRetryArtifacts(attachments, result.perTest, options.policy);
84
+ const existing = new Set(result
85
+ .artifacts
86
+ .filter(function attachment(artifact) {
87
+ return artifact.id.subtype === 'attachment' || artifact.id.subtype === 'witness';
88
+ })
89
+ .map(function sequence(artifact) {
90
+ return artifact.id.sequence;
91
+ }));
92
+ const additions = artifacts.filter(function newAttachment(artifact) {
93
+ return !existing.has(artifact.id.sequence);
94
+ });
95
+ const runnerErrors = retainedAttachmentErrors(result.runnerErrors, options.retainsBranch);
96
+ return appendRunnerErrors({
97
+ ...result,
98
+ status: runStatusFromPlan(result.summary, runnerErrors, result.planStatus),
99
+ runnerErrors,
100
+ artifacts: [
101
+ ...result.artifacts.map(function retainConflict(artifact) {
102
+ return retainedConflictEvidence(artifact, options.policy);
103
+ }),
104
+ ...additions
105
+ ]
106
+ }, [
107
+ ...retainedAttachmentErrors(options.localErrors, options.retainsBranch),
108
+ ...options.owners.map(unclosedError)
109
+ ]);
110
+ }
111
+ //# sourceMappingURL=attachment-results.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-results.js","sourceRoot":"","sources":["../../../../source/run/attachment-results.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ import { mkdir, open } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { createStoredRunValue } from "./supervised-run-state.js";
4
+ import { snapshotAttachmentJson } from "./attachment-json.js";
5
+ function createAttachmentByteBudget(limit) {
6
+ const bytes = createStoredRunValue(0);
7
+ const exceeded = createStoredRunValue(false);
8
+ function reserve(length, available) {
9
+ const retainedLength = Math.max(0, Math.min(length, available, limit - bytes.read()));
10
+ exceeded.write(exceeded.read() || retainedLength < length);
11
+ return retainedLength;
12
+ }
13
+ function retained(retainedBytes) {
14
+ bytes.write(bytes.read() + retainedBytes);
15
+ }
16
+ return { bytes, exceeded, reserve, retained };
17
+ }
18
+ function inlineAttachmentRetentionOmit(state) {
19
+ const { budget } = state;
20
+ budget.exceeded.write(true);
21
+ }
22
+ function inlineAttachmentRetentionJson(state, text) {
23
+ const { ended, budget, completion } = state;
24
+ if (!ended.read() || budget.exceeded.read() || completion.read().kind !== 'complete') {
25
+ return { kind: 'omitted', limit: state.limit, reason: 'byte-limit' };
26
+ }
27
+ const value = JSON.parse(text);
28
+ const snapshot = snapshotAttachmentJson(value, state.limit);
29
+ return snapshot === null
30
+ ? { kind: 'omitted', limit: state.limit, reason: 'byte-limit' }
31
+ : { byteLength: budget.bytes.read(), kind: 'json', value: snapshot.value };
32
+ }
33
+ function inlineAttachmentRetentionContent(state) {
34
+ const { chunks, completion } = state;
35
+ const text = chunks.join('');
36
+ return state.kind === 'json'
37
+ ? inlineAttachmentRetentionJson(state, text)
38
+ : { byteLength: Buffer.byteLength(text), completion: completion.read(), kind: 'text', text };
39
+ }
40
+ async function inlineAttachmentRetentionFinish(state, requestedCompletion) {
41
+ const { ended, completion, budget, chunks, decoder } = state;
42
+ if (ended.read()) {
43
+ return;
44
+ }
45
+ ended.write(true);
46
+ completion.write(budget.exceeded.read() && requestedCompletion.kind === 'complete'
47
+ ? { kind: 'truncated', reason: 'byte-limit' }
48
+ : requestedCompletion);
49
+ if (!budget.exceeded.read()) {
50
+ try {
51
+ chunks.push(decoder.decode(new Uint8Array(), { stream: false }));
52
+ }
53
+ catch (error) {
54
+ completion.write({ kind: 'incomplete', reason: 'write-error' });
55
+ throw error;
56
+ }
57
+ }
58
+ }
59
+ async function inlineAttachmentRetentionRetain(state, chunk, availableBytes) {
60
+ const { budget, chunks, decoder } = state;
61
+ const length = budget.reserve(chunk.byteLength, availableBytes);
62
+ if (length > 0) {
63
+ try {
64
+ chunks.push(decoder.decode(chunk.subarray(0, length), { stream: true }));
65
+ }
66
+ catch (error) {
67
+ state.completion.write({ kind: 'incomplete', reason: 'write-error' });
68
+ state.ended.write(true);
69
+ throw error;
70
+ }
71
+ }
72
+ budget.retained(length);
73
+ return length;
74
+ }
75
+ function createInlineAttachmentRetention(kind, limit) {
76
+ const chunks = [];
77
+ const decoder = new TextDecoder('utf-8', { fatal: true });
78
+ const budget = createAttachmentByteBudget(limit);
79
+ const completion = createStoredRunValue({ kind: 'incomplete', reason: 'unclosed' });
80
+ const ended = createStoredRunValue(false);
81
+ const state = { kind, limit, chunks, decoder, budget, completion, ended };
82
+ return {
83
+ omit: inlineAttachmentRetentionOmit.bind(null, state),
84
+ content: inlineAttachmentRetentionContent.bind(null, state),
85
+ finish: inlineAttachmentRetentionFinish.bind(null, state),
86
+ retain: inlineAttachmentRetentionRetain.bind(null, state)
87
+ };
88
+ }
89
+ function fileAttachmentRetentionOmit() {
90
+ throw new TypeError('Binary attachments cannot be omitted as JSON.');
91
+ }
92
+ function fileAttachmentRetentionContent(state) {
93
+ const { budget, completion } = state;
94
+ return { byteLength: budget.bytes.read(), completion: completion.read(), kind: 'file', path: state.filePath };
95
+ }
96
+ async function fileAttachmentRetentionFinish(state, requestedCompletion) {
97
+ const { ended, completion, budget, file } = state;
98
+ if (ended.read()) {
99
+ return;
100
+ }
101
+ ended.write(true);
102
+ completion.write(budget.exceeded.read() || requestedCompletion.kind === 'truncated'
103
+ ? { kind: 'incomplete', reason: 'byte-limit' }
104
+ : requestedCompletion);
105
+ await file.close();
106
+ }
107
+ async function fileAttachmentRetentionWrite(state, chunk) {
108
+ const { file, budget } = state;
109
+ let offset = 0;
110
+ while (offset < chunk.byteLength) {
111
+ const result = await file.write(chunk.subarray(offset));
112
+ if (result.bytesWritten === 0) {
113
+ throw new Error('Attachment file write made no progress.');
114
+ }
115
+ offset += result.bytesWritten;
116
+ budget.retained(result.bytesWritten);
117
+ }
118
+ }
119
+ async function fileAttachmentRetentionRetain(state, chunk, availableBytes) {
120
+ const { budget } = state;
121
+ const length = budget.reserve(chunk.byteLength, availableBytes);
122
+ try {
123
+ await fileAttachmentRetentionWrite(state, chunk.subarray(0, length));
124
+ }
125
+ catch (error) {
126
+ await fileAttachmentRetentionFinish(state, { kind: 'incomplete', reason: 'write-error' });
127
+ throw error;
128
+ }
129
+ return length;
130
+ }
131
+ function createFileAttachmentRetention(file, filePath, limit) {
132
+ const budget = createAttachmentByteBudget(limit);
133
+ const completion = createStoredRunValue({
134
+ kind: 'incomplete',
135
+ reason: 'unclosed'
136
+ });
137
+ const ended = createStoredRunValue(false);
138
+ const state = { file, filePath, limit, budget, completion, ended };
139
+ return {
140
+ omit: fileAttachmentRetentionOmit,
141
+ content: fileAttachmentRetentionContent.bind(null, state),
142
+ finish: fileAttachmentRetentionFinish.bind(null, state),
143
+ retain: fileAttachmentRetentionRetain.bind(null, state)
144
+ };
145
+ }
146
+ export async function createAttachmentRetention(kind, projectRoot, filePath, limit) {
147
+ if (kind !== 'binary') {
148
+ return createInlineAttachmentRetention(kind, limit);
149
+ }
150
+ await mkdir(path.dirname(filePath), { recursive: true });
151
+ return createFileAttachmentRetention(await open(filePath, 'wx'), path.relative(projectRoot, filePath).split(path.sep).join('/'), limit);
152
+ }
153
+ //# sourceMappingURL=attachment-retention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-retention.js","sourceRoot":"","sources":["../../../../source/run/attachment-retention.ts"],"names":[],"mappings":"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"}