@overkill-dev/run 0.0.63 → 0.0.65

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 (310) hide show
  1. package/assertion-protocol/source-location-forwarding.js +14 -2
  2. package/assertion-protocol/source-location-forwarding.js.map +1 -1
  3. package/assertion-protocol/source-location.js +1 -0
  4. package/assertion-protocol/source-location.js.map +1 -1
  5. package/attachments/attachment-context.js +31 -0
  6. package/attachments/attachment-context.js.map +1 -0
  7. package/engine/async-leak-diagnostics.js +9 -9
  8. package/engine/async-leak-diagnostics.js.map +1 -1
  9. package/engine/case-attempt-execution.js +191 -0
  10. package/engine/case-attempt-execution.js.map +1 -0
  11. package/engine/case-execution.d.ts +5 -3
  12. package/engine/case-execution.d.ts.map +1 -1
  13. package/engine/case-execution.js +25 -24
  14. package/engine/case-execution.js.map +1 -1
  15. package/engine/coverage-artifact.d.ts +1 -0
  16. package/engine/coverage-artifact.d.ts.map +1 -1
  17. package/engine/execution-async-leak-policy.js +3 -10
  18. package/engine/execution-async-leak-policy.js.map +1 -1
  19. package/engine/execution-global-error-observer.d.ts +2 -1
  20. package/engine/execution-global-error-observer.d.ts.map +1 -1
  21. package/engine/execution-global-error-observer.js +19 -15
  22. package/engine/execution-global-error-observer.js.map +1 -1
  23. package/engine/execution-options.d.ts +4 -1
  24. package/engine/execution-options.d.ts.map +1 -1
  25. package/engine/execution-options.js +7 -2
  26. package/engine/execution-options.js.map +1 -1
  27. package/engine/execution-resource-budget-tracking.js.map +1 -1
  28. package/engine/execution-resource-tracked-cases.js.map +1 -1
  29. package/engine/execution-result.js.map +1 -1
  30. package/engine/execution-supervision-state.js.map +1 -1
  31. package/engine/execution-supervision.d.ts.map +1 -1
  32. package/engine/execution-supervision.js +50 -33
  33. package/engine/execution-supervision.js.map +1 -1
  34. package/engine/execution-test-plan-cases.js +6 -126
  35. package/engine/execution-test-plan-cases.js.map +1 -1
  36. package/engine/execution-test-plan-resource-usage.js.map +1 -1
  37. package/engine/execution.js +3 -3
  38. package/engine/execution.js.map +1 -1
  39. package/engine/identity.d.ts +3 -0
  40. package/engine/identity.d.ts.map +1 -1
  41. package/engine/reporter-dispatcher.js +1 -0
  42. package/engine/reporter-dispatcher.js.map +1 -1
  43. package/engine/reporter-event-queue.js.map +1 -1
  44. package/engine/reporter.d.ts +2 -1
  45. package/engine/reporter.d.ts.map +1 -1
  46. package/engine/reporter.js.map +1 -1
  47. package/engine/resource-usage.d.ts +22 -0
  48. package/engine/resource-usage.d.ts.map +1 -0
  49. package/engine/retry-policy.d.ts +4 -0
  50. package/engine/retry-policy.d.ts.map +1 -0
  51. package/engine/retry-policy.js +22 -0
  52. package/engine/retry-policy.js.map +1 -0
  53. package/engine/run-artifact.d.ts +45 -0
  54. package/engine/run-artifact.d.ts.map +1 -0
  55. package/engine/run-result.d.ts +22 -53
  56. package/engine/run-result.d.ts.map +1 -1
  57. package/engine/run-result.js +14 -0
  58. package/engine/run-result.js.map +1 -1
  59. package/engine/runner-error-reporting.js.map +1 -1
  60. package/engine/runtime-attachment.d.ts +62 -0
  61. package/engine/runtime-attachment.d.ts.map +1 -0
  62. package/engine/runtime-attachment.js +7 -0
  63. package/engine/runtime-attachment.js.map +1 -0
  64. package/engine/test-attempt-history.js +24 -0
  65. package/engine/test-attempt-history.js.map +1 -0
  66. package/package.json +25 -6
  67. package/packages/resources/attachment-context.entry-point.js +2 -0
  68. package/packages/resources/attachment-context.entry-point.js.map +1 -0
  69. package/packages/run/config.entry-point.d.ts +3 -1
  70. package/packages/run/config.entry-point.d.ts.map +1 -1
  71. package/packages/run/run.entry-point.d.ts +3 -1
  72. package/packages/run/run.entry-point.d.ts.map +1 -1
  73. package/packages/run/transcript-store.entry-point.d.ts +3 -0
  74. package/packages/run/transcript-store.entry-point.d.ts.map +1 -0
  75. package/packages/run/transcript-store.entry-point.js +2 -0
  76. package/packages/run/transcript-store.entry-point.js.map +1 -0
  77. package/packages/simulation/transcript.entry-point.js +2 -0
  78. package/packages/simulation/transcript.entry-point.js.map +1 -0
  79. package/readme.md +69 -2
  80. package/reporters/human-reporter-rendering.js +25 -2
  81. package/reporters/human-reporter-rendering.js.map +1 -1
  82. package/reporters/line-reporter.js +6 -1
  83. package/reporters/line-reporter.js.map +1 -1
  84. package/resources/resource-definition-brand.js +1 -1
  85. package/resources/resource-definition-brand.js.map +1 -1
  86. package/resources/resource-definition-types.d.ts.map +1 -1
  87. package/resources/resource-scenario-binding.js +2 -0
  88. package/resources/resource-scenario-binding.js.map +1 -1
  89. package/resources/resource-session.d.ts.map +1 -1
  90. package/resources/resources.d.ts.map +1 -1
  91. package/resources/resources.js +3 -6
  92. package/resources/resources.js.map +1 -1
  93. package/resources/runtime-definition.d.ts.map +1 -1
  94. package/resources/runtime-definition.js +1 -1
  95. package/resources/runtime-definition.js.map +1 -1
  96. package/resources/runtime-matrix-definition.d.ts.map +1 -1
  97. package/resources/runtime-matrix-definition.js +2 -2
  98. package/resources/runtime-matrix-definition.js.map +1 -1
  99. package/run/attachment-connection.js +108 -0
  100. package/run/attachment-connection.js.map +1 -0
  101. package/run/attachment-coordinator-context.js +9 -0
  102. package/run/attachment-coordinator-context.js.map +1 -0
  103. package/run/attachment-coordinator.js +77 -0
  104. package/run/attachment-coordinator.js.map +1 -0
  105. package/run/attachment-eligibility.js +21 -0
  106. package/run/attachment-eligibility.js.map +1 -0
  107. package/run/attachment-execution.js +255 -0
  108. package/run/attachment-execution.js.map +1 -0
  109. package/run/attachment-failure.js +63 -0
  110. package/run/attachment-failure.js.map +1 -0
  111. package/run/attachment-frames.js +22 -0
  112. package/run/attachment-frames.js.map +1 -0
  113. package/run/attachment-json.js +118 -0
  114. package/run/attachment-json.js.map +1 -0
  115. package/run/attachment-protocol.js +5 -0
  116. package/run/attachment-protocol.js.map +1 -0
  117. package/run/attachment-record.js +60 -0
  118. package/run/attachment-record.js.map +1 -0
  119. package/run/attachment-reporter.js +39 -0
  120. package/run/attachment-reporter.js.map +1 -0
  121. package/run/attachment-results.js +115 -0
  122. package/run/attachment-results.js.map +1 -0
  123. package/run/attachment-retention.js +153 -0
  124. package/run/attachment-retention.js.map +1 -0
  125. package/run/attachment-run.js +36 -0
  126. package/run/attachment-run.js.map +1 -0
  127. package/run/attachment-server.js +136 -0
  128. package/run/attachment-server.js.map +1 -0
  129. package/run/attachment-storage-session.js +21 -0
  130. package/run/attachment-storage-session.js.map +1 -0
  131. package/run/attachment-store.js +330 -0
  132. package/run/attachment-store.js.map +1 -0
  133. package/run/attachment-wire-schema.js +123 -0
  134. package/run/attachment-wire-schema.js.map +1 -0
  135. package/run/attachment-worker-context.js +49 -0
  136. package/run/attachment-worker-context.js.map +1 -0
  137. package/run/attachment-writer.js +117 -0
  138. package/run/attachment-writer.js.map +1 -0
  139. package/run/capability-policy.js +10 -5
  140. package/run/capability-policy.js.map +1 -1
  141. package/run/collected-run-plan.js.map +1 -1
  142. package/run/coverage-config-schema.d.ts +4 -4
  143. package/run/coverage-loaded-sources.js +112 -0
  144. package/run/coverage-loaded-sources.js.map +1 -0
  145. package/run/coverage-native-data.js +18 -0
  146. package/run/coverage-native-data.js.map +1 -0
  147. package/run/coverage-paths.js +45 -4
  148. package/run/coverage-paths.js.map +1 -1
  149. package/run/coverage-reporting.js +104 -8
  150. package/run/coverage-reporting.js.map +1 -1
  151. package/run/coverage-run-record.js +50 -0
  152. package/run/coverage-run-record.js.map +1 -0
  153. package/run/coverage-runtime-source.js +37 -0
  154. package/run/coverage-runtime-source.js.map +1 -0
  155. package/run/coverage-session.js +344 -6
  156. package/run/coverage-session.js.map +1 -1
  157. package/run/coverage-source-map.js +125 -0
  158. package/run/coverage-source-map.js.map +1 -0
  159. package/run/coverage-source-selection.js +120 -0
  160. package/run/coverage-source-selection.js.map +1 -0
  161. package/run/duration-history.d.ts.map +1 -1
  162. package/run/duration-history.js +1 -0
  163. package/run/duration-history.js.map +1 -1
  164. package/run/node-run-execution.js +25 -0
  165. package/run/node-run-execution.js.map +1 -0
  166. package/run/node-runtime-state-store.js +38 -0
  167. package/run/node-runtime-state-store.js.map +1 -0
  168. package/run/node-worker-pool-factory.js +0 -31
  169. package/run/node-worker-pool-factory.js.map +1 -1
  170. package/run/path-containment.js +6 -1
  171. package/run/path-containment.js.map +1 -1
  172. package/run/permission-denial-runtime-policy.js +21 -13
  173. package/run/permission-denial-runtime-policy.js.map +1 -1
  174. package/run/recorded-coverage-run.js +45 -0
  175. package/run/recorded-coverage-run.js.map +1 -0
  176. package/run/recorded-coverage-session.js +50 -0
  177. package/run/recorded-coverage-session.js.map +1 -0
  178. package/run/resource-lifecycle-projection.js +6 -2
  179. package/run/resource-lifecycle-projection.js.map +1 -1
  180. package/run/resource-lifecycle-session-acquirer.js +13 -6
  181. package/run/resource-lifecycle-session-acquirer.js.map +1 -1
  182. package/run/resource-lifecycle-startup-budget.js +1 -0
  183. package/run/resource-lifecycle-startup-budget.js.map +1 -1
  184. package/run/resource-lifecycle-state.d.ts +4 -2
  185. package/run/resource-lifecycle-state.d.ts.map +1 -1
  186. package/run/resource-lifecycle-state.js +19 -3
  187. package/run/resource-lifecycle-state.js.map +1 -1
  188. package/run/resource-lifecycle.js +57 -13
  189. package/run/resource-lifecycle.js.map +1 -1
  190. package/run/resource-usage.js.map +1 -1
  191. package/run/retry-artifact-retention.js +37 -0
  192. package/run/retry-artifact-retention.js.map +1 -0
  193. package/run/run-config-schema.d.ts +48 -4
  194. package/run/run-config-schema.d.ts.map +1 -1
  195. package/run/run-config-schema.js +18 -0
  196. package/run/run-config-schema.js.map +1 -1
  197. package/run/run-config.d.ts +9 -6
  198. package/run/run-config.d.ts.map +1 -1
  199. package/run/run-config.js +6 -1
  200. package/run/run-config.js.map +1 -1
  201. package/run/run-coverage.js +5 -2
  202. package/run/run-coverage.js.map +1 -1
  203. package/run/run-engine-primitives.d.ts +13 -1
  204. package/run/run-engine-primitives.d.ts.map +1 -1
  205. package/run/run-errors.d.ts.map +1 -1
  206. package/run/run-errors.js +1 -0
  207. package/run/run-errors.js.map +1 -1
  208. package/run/run-execution-config.d.ts +5 -0
  209. package/run/run-execution-config.d.ts.map +1 -1
  210. package/run/run-facts.js +3 -0
  211. package/run/run-facts.js.map +1 -1
  212. package/run/run-isolated-command.js +3 -0
  213. package/run/run-isolated-command.js.map +1 -1
  214. package/run/run-local-command.js +12 -83
  215. package/run/run-local-command.js.map +1 -1
  216. package/run/run-local-coverage.js +72 -0
  217. package/run/run-local-coverage.js.map +1 -0
  218. package/run/run-local-execution.js +3 -1
  219. package/run/run-local-execution.js.map +1 -1
  220. package/run/run-local-resolution.js +6 -3
  221. package/run/run-local-resolution.js.map +1 -1
  222. package/run/run-orchestrator-dependencies.d.ts +1 -1
  223. package/run/run-orchestrator-dependencies.d.ts.map +1 -1
  224. package/run/run-orchestrator.d.ts.map +1 -1
  225. package/run/run-orchestrator.js +6 -18
  226. package/run/run-orchestrator.js.map +1 -1
  227. package/run/run-record-error.js +26 -0
  228. package/run/run-record-error.js.map +1 -0
  229. package/run/run-record-input.js +34 -0
  230. package/run/run-record-input.js.map +1 -0
  231. package/run/run-record-outcomes.d.ts +49 -0
  232. package/run/run-record-outcomes.d.ts.map +1 -0
  233. package/run/run-record-result.js +58 -0
  234. package/run/run-record-result.js.map +1 -0
  235. package/run/run-record-storage.js +51 -0
  236. package/run/run-record-storage.js.map +1 -0
  237. package/run/run-record-types.d.ts +73 -0
  238. package/run/run-record-types.d.ts.map +1 -0
  239. package/run/run-record-versions.js +51 -0
  240. package/run/run-record-versions.js.map +1 -0
  241. package/run/run-record.js +48 -0
  242. package/run/run-record.js.map +1 -0
  243. package/run/run-result-reporting.js +16 -0
  244. package/run/run-result-reporting.js.map +1 -0
  245. package/run/run-supervised-finalization.js +8 -0
  246. package/run/run-supervised-finalization.js.map +1 -0
  247. package/run/run-supervised-process.js +34 -33
  248. package/run/run-supervised-process.js.map +1 -1
  249. package/run/run-support.js +23 -9
  250. package/run/run-support.js.map +1 -1
  251. package/run/run-types.d.ts +7 -5
  252. package/run/run-types.d.ts.map +1 -1
  253. package/run/run-types.js.map +1 -1
  254. package/run/run-validation.js +9 -0
  255. package/run/run-validation.js.map +1 -1
  256. package/run/runtime-attachment-boundary.js +11 -0
  257. package/run/runtime-attachment-boundary.js.map +1 -0
  258. package/run/supervised-child-test-plan.js +2 -0
  259. package/run/supervised-child-test-plan.js.map +1 -1
  260. package/run/supervised-child.js +12 -9
  261. package/run/supervised-child.js.map +1 -1
  262. package/run/supervised-output-capture.js +66 -0
  263. package/run/supervised-output-capture.js.map +1 -0
  264. package/run/supervised-protocol.js.map +1 -1
  265. package/run/supervised-run-collection.js +3 -1
  266. package/run/supervised-run-collection.js.map +1 -1
  267. package/run/supervised-run-resource-policy.js +12 -1
  268. package/run/supervised-run-resource-policy.js.map +1 -1
  269. package/run/supervised-run-runtime.js +25 -30
  270. package/run/supervised-run-runtime.js.map +1 -1
  271. package/run/supervised-run-state.js +64 -81
  272. package/run/supervised-run-state.js.map +1 -1
  273. package/run/supervised-run.js +14 -4
  274. package/run/supervised-run.js.map +1 -1
  275. package/run/worker-pool-collection.js +1 -0
  276. package/run/worker-pool-collection.js.map +1 -1
  277. package/run/worker-pool-command.js +2 -0
  278. package/run/worker-pool-command.js.map +1 -1
  279. package/run/worker-pool-execution.js +12 -3
  280. package/run/worker-pool-execution.js.map +1 -1
  281. package/run/worker-pool-hedged-arbitration.js +11 -2
  282. package/run/worker-pool-hedged-arbitration.js.map +1 -1
  283. package/run/worker-pool-host-process.js.map +1 -1
  284. package/run/worker-pool-host-protocol.js.map +1 -1
  285. package/run/worker-pool-protocol.js.map +1 -1
  286. package/run/worker-pool-resource-lifecycle-execution.js +1 -0
  287. package/run/worker-pool-resource-lifecycle-execution.js.map +1 -1
  288. package/run/worker-pool-resource-tracking.js +2 -2
  289. package/run/worker-pool-resource-tracking.js.map +1 -1
  290. package/run/worker-pool-results.js +7 -9
  291. package/run/worker-pool-results.js.map +1 -1
  292. package/run/worker-pool-run.js +10 -3
  293. package/run/worker-pool-run.js.map +1 -1
  294. package/run/worker-pool-runtime.js +3 -7
  295. package/run/worker-pool-runtime.js.map +1 -1
  296. package/run/worker-pool-task-events.js +12 -4
  297. package/run/worker-pool-task-events.js.map +1 -1
  298. package/run/worker-pool-worker-plan.js +1 -0
  299. package/run/worker-pool-worker-plan.js.map +1 -1
  300. package/run/worker-pool-worker-resources.js +1 -0
  301. package/run/worker-pool-worker-resources.js.map +1 -1
  302. package/run/worker-pool-worker.js +15 -4
  303. package/run/worker-pool-worker.js.map +1 -1
  304. package/sbom.cdx.json +65 -14
  305. package/transcript/http-transcript.js +3 -0
  306. package/transcript/http-transcript.js.map +1 -0
  307. package/transcript/transcript-store.d.ts +25 -0
  308. package/transcript/transcript-store.d.ts.map +1 -0
  309. package/transcript/transcript-store.js +73 -0
  310. package/transcript/transcript-store.js.map +1 -0
@@ -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":"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"}
@@ -0,0 +1,39 @@
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
+ return {
9
+ ...event,
10
+ artifacts: [
11
+ ...event.artifacts,
12
+ ...coordinator.caseArtifacts(event.workId ?? createDefaultWorkId(event.case), { index: event.attempt }, null)
13
+ ]
14
+ };
15
+ }
16
+ export function reporterWithAttachments(definition) {
17
+ const coordinator = currentAttachmentCoordinator();
18
+ if (coordinator === null) {
19
+ return definition;
20
+ }
21
+ return defineReporter(function createAttachmentReporter(context) {
22
+ const reporter = definition(context);
23
+ if (reporter.kind !== 'real-time') {
24
+ return reporter;
25
+ }
26
+ return new Proxy(reporter, {
27
+ get(target, property, receiver) {
28
+ if (property === 'onEvent') {
29
+ return async function deliverAttachmentEvent(event) {
30
+ return await target.onEvent(eventWithAttachments(event, coordinator));
31
+ };
32
+ }
33
+ const original = Reflect.get(target, property, receiver);
34
+ return original;
35
+ }
36
+ });
37
+ });
38
+ }
39
+ //# 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,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,115 @@
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
+ if (artifact.payload.kind === 'runtime-attachment' && artifact.id.subtype === 'attachment' &&
20
+ artifact.source === 'instrumented') {
21
+ return [{
22
+ ...artifact,
23
+ id: { ...artifact.id, subtype: 'attachment' },
24
+ payload: artifact.payload,
25
+ source: 'instrumented'
26
+ }];
27
+ }
28
+ return artifact.payload.kind === 'hedged-conflict'
29
+ ? [...artifact.payload.authoritative.attachments, ...artifact.payload.conflicting.attachments]
30
+ : [];
31
+ });
32
+ }
33
+ export function attachmentMatchesAttempt(artifact, work, attempt) {
34
+ if (artifact.id.scope.kind !== 'case' || artifact.id.attempt?.index !== attempt.index) {
35
+ return false;
36
+ }
37
+ const identity = {
38
+ case: artifact.id.scope.case,
39
+ runtimes: artifact.id.runtimes,
40
+ workload: artifact.id.workload
41
+ };
42
+ return workIdentityKey(identity) === workIdentityKey(work);
43
+ }
44
+ function distinctAttachmentErrors(errors) {
45
+ const ids = new Set();
46
+ return errors.filter(function distinctError(error) {
47
+ const id = attachmentFailureIdentity(error);
48
+ if (id === null) {
49
+ return true;
50
+ }
51
+ if (ids.has(id)) {
52
+ return false;
53
+ }
54
+ ids.add(id);
55
+ return true;
56
+ });
57
+ }
58
+ function retainedConflictEvidence(artifact, policy) {
59
+ const { payload } = artifact;
60
+ if (payload.kind !== 'hedged-conflict') {
61
+ return artifact;
62
+ }
63
+ const results = [{ workId: payload.work, attempts: payload.authoritative.attempts }];
64
+ const conflicting = [{ workId: payload.work, attempts: payload.conflicting.attempts }];
65
+ return {
66
+ id: { ...artifact.id, subtype: 'hedged-conflict' },
67
+ source: 'native',
68
+ payload: {
69
+ ...payload,
70
+ authoritative: {
71
+ ...payload.authoritative,
72
+ attachments: retainedRetryArtifacts(payload.authoritative.attachments, results, policy)
73
+ },
74
+ conflicting: {
75
+ ...payload.conflicting,
76
+ attachments: retainedRetryArtifacts(payload.conflicting.attachments, conflicting, policy)
77
+ }
78
+ }
79
+ };
80
+ }
81
+ function retainedAttachmentErrors(errors, retains) {
82
+ return distinctAttachmentErrors(errors.filter(function belongsToRetainedBranch(error) {
83
+ return retains(attachmentFailureBranch(error));
84
+ }));
85
+ }
86
+ export function resultWithRuntimeAttachments(result, attachments, options) {
87
+ const artifacts = retainedRetryArtifacts(attachments, result.perTest, options.policy);
88
+ const existing = new Set(result
89
+ .artifacts
90
+ .filter(function attachment(artifact) {
91
+ return artifact.id.subtype === 'attachment';
92
+ })
93
+ .map(function sequence(artifact) {
94
+ return artifact.id.sequence;
95
+ }));
96
+ const additions = artifacts.filter(function newAttachment(artifact) {
97
+ return !existing.has(artifact.id.sequence);
98
+ });
99
+ const runnerErrors = retainedAttachmentErrors(result.runnerErrors, options.retainsBranch);
100
+ return appendRunnerErrors({
101
+ ...result,
102
+ status: runStatusFromPlan(result.summary, runnerErrors, result.planStatus),
103
+ runnerErrors,
104
+ artifacts: [
105
+ ...result.artifacts.map(function retainConflict(artifact) {
106
+ return retainedConflictEvidence(artifact, options.policy);
107
+ }),
108
+ ...additions
109
+ ]
110
+ }, [
111
+ ...retainedAttachmentErrors(options.localErrors, options.retainsBranch),
112
+ ...options.owners.map(unclosedError)
113
+ ]);
114
+ }
115
+ //# 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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"}
@@ -0,0 +1,36 @@
1
+ import { createAttachmentStorageSession } from "./attachment-storage-session.js";
2
+ import { createAttachmentRecord } from "./attachment-record.js";
3
+ import { createAttachmentRunCoordinator } from "./attachment-coordinator.js";
4
+ import { runWithAttachmentExecution } from "./resource-lifecycle-state.js";
5
+ import { runWithAttachmentCoordinator } from "./attachment-coordinator-context.js";
6
+ import { runHasAttachmentScopes } from "./attachment-eligibility.js";
7
+ async function executeAttachmentSession(record, coordinator, run) {
8
+ try {
9
+ const result = await runWithAttachmentCoordinator(coordinator, async function () {
10
+ return runWithAttachmentExecution(coordinator.execution, run);
11
+ });
12
+ return await record.session.complete(await coordinator.finalize(result));
13
+ }
14
+ catch (error) {
15
+ await coordinator.close();
16
+ try {
17
+ await record.checkpoint(coordinator.artifacts());
18
+ }
19
+ finally {
20
+ await record.session.interrupt(error);
21
+ }
22
+ throw error;
23
+ }
24
+ finally {
25
+ await coordinator.close();
26
+ }
27
+ }
28
+ export async function executeWithAttachments(resolved, dependencies, run) {
29
+ if (!runHasAttachmentScopes(resolved)) {
30
+ return await run();
31
+ }
32
+ const record = await createAttachmentRecord(resolved, dependencies);
33
+ const coordinator = createAttachmentRunCoordinator(await createAttachmentStorageSession(resolved, record));
34
+ return await executeAttachmentSession(record, coordinator, run);
35
+ }
36
+ //# sourceMappingURL=attachment-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-run.js","sourceRoot":"","sources":["../../../../source/run/attachment-run.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,iCAAiC,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAyB,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,8BAA8B,EAAiC,MAAM,6BAA6B,CAAC;AAC5G,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAIrE,KAAK,UAAU,wBAAwB,CACnC,MAAwB,EACxB,WAAqC,EACrC,GAA6B;IAE7B,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAC7C,WAAW,EACX,KAAK;YACD,OAAO,0BAA0B,CAAC,WAAW,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAClE,CAAC,CACJ,CAAC;QACF,OAAO,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7E,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACtB,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC;YACD,MAAM,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;QACrD,CAAC;gBAAS,CAAC;YACP,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,KAAK,CAAC;IAChB,CAAC;YAAS,CAAC;QACP,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CACxC,QAAqB,EACrB,YAAyC,EACzC,GAA6B;IAE7B,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpC,OAAO,MAAM,GAAG,EAAE,CAAC;IACvB,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,8BAA8B,CAAC,MAAM,8BAA8B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3G,OAAO,MAAM,wBAAwB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,136 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { createServer } from 'node:net';
3
+ import { createInterface } from 'node:readline';
4
+ import { createStoredRunValue } from "./supervised-run-state.js";
5
+ import { attachmentMaxFrameBytes, attachmentMaxPendingRequests } from "./attachment-protocol.js";
6
+ import { attachmentRequestSchema } from "./attachment-wire-schema.js";
7
+ import { boundedAttachmentFrames } from "./attachment-frames.js";
8
+ async function attachmentServerChannelsReply(state, line, socket, channel) {
9
+ const { store } = state;
10
+ const value = JSON.parse(line);
11
+ const request = attachmentRequestSchema.parse(value);
12
+ if (request.token !== state.token) {
13
+ throw new Error('Invalid attachment execution token.');
14
+ }
15
+ const result = await store.exchange(channel, request.operation);
16
+ await new Promise(function acknowledgeAttachment(resolve, reject) {
17
+ socket.write(`${JSON.stringify({ request: request.request, result })}\n`, function attachmentSent(error) {
18
+ if (error === undefined || error === null) {
19
+ resolve();
20
+ }
21
+ else {
22
+ reject(error);
23
+ }
24
+ });
25
+ });
26
+ }
27
+ async function attachmentServerChannelsRequest(state, request) {
28
+ const { line, socket, channel, previous } = request;
29
+ await previous;
30
+ try {
31
+ await attachmentServerChannelsReply(state, line, socket, channel);
32
+ }
33
+ catch {
34
+ socket.destroy();
35
+ }
36
+ finally {
37
+ request.queued.write(request.queued.read() - 1);
38
+ }
39
+ }
40
+ async function attachmentServerChannelsInterrupt(state, channel, previous) {
41
+ const { abandoned, store } = state;
42
+ await previous;
43
+ abandoned.push(...await store.finish(channel));
44
+ }
45
+ function observeAttachmentChannelFailures(socket, frames, lines) {
46
+ frames.on('error', function () {
47
+ socket.destroy();
48
+ });
49
+ lines.on('error', function () {
50
+ socket.destroy();
51
+ });
52
+ socket.on('error', function () {
53
+ socket.destroy();
54
+ });
55
+ }
56
+ function attachmentServerChannelsAccept(state, socket) {
57
+ const { sockets } = state;
58
+ sockets.add(socket);
59
+ const channel = randomUUID();
60
+ const frames = boundedAttachmentFrames(attachmentMaxFrameBytes);
61
+ const lines = createInterface({ input: socket.pipe(frames), crlfDelay: Number.POSITIVE_INFINITY });
62
+ let queue = Promise.resolve();
63
+ const queued = createStoredRunValue(0);
64
+ observeAttachmentChannelFailures(socket, frames, lines);
65
+ lines.on('line', function receiveAttachmentLine(line) {
66
+ if (queued.read() >= attachmentMaxPendingRequests) {
67
+ socket.destroy();
68
+ return;
69
+ }
70
+ queued.write(queued.read() + 1);
71
+ state.operations.delete(queue);
72
+ queue = attachmentServerChannelsRequest(state, { line, socket, channel, previous: queue, queued });
73
+ state.operations.add(queue);
74
+ });
75
+ socket.on('close', function attachmentChannelClosed() {
76
+ sockets.delete(socket);
77
+ lines.close();
78
+ state.operations.delete(queue);
79
+ const interrupted = attachmentServerChannelsInterrupt(state, channel, queue);
80
+ state.operations.add(interrupted);
81
+ });
82
+ }
83
+ async function attachmentServerChannelsFinish(state, server) {
84
+ const { store } = state;
85
+ await Promise.all(state.operations.values());
86
+ const owners = [...state.abandoned.values(), ...await store.finish(null)];
87
+ for (const socket of state.sockets.values()) {
88
+ socket.destroy();
89
+ }
90
+ await new Promise(function closeAttachmentServer(resolve, reject) {
91
+ server.close(function attachmentServerClosed(error) {
92
+ if (error === undefined) {
93
+ resolve();
94
+ }
95
+ else {
96
+ reject(error);
97
+ }
98
+ });
99
+ });
100
+ await Promise.all(state.operations.values());
101
+ return owners;
102
+ }
103
+ function createAttachmentServerChannels(store, token) {
104
+ const sockets = new Set();
105
+ const operations = new Set();
106
+ const abandoned = [];
107
+ const state = { store, token, sockets, operations, abandoned };
108
+ return {
109
+ accept: attachmentServerChannelsAccept.bind(null, state),
110
+ finish: attachmentServerChannelsFinish.bind(null, state)
111
+ };
112
+ }
113
+ export async function createAttachmentServer(store, limits) {
114
+ const token = randomUUID();
115
+ const channels = createAttachmentServerChannels(store, token);
116
+ const server = createServer(function (socket) {
117
+ channels.accept(socket);
118
+ });
119
+ await new Promise(function listenForAttachments(resolve, reject) {
120
+ server.once('error', reject);
121
+ server.listen(0, '127.0.0.1', resolve);
122
+ });
123
+ const address = server.address();
124
+ if (address === null || typeof address === 'string') {
125
+ throw new Error('Attachment server did not obtain an execution address.');
126
+ }
127
+ let finishing = null;
128
+ return {
129
+ endpoint: { branch: null, limits, port: address.port, token },
130
+ async finish() {
131
+ finishing = finishing ?? channels.finish(server);
132
+ return await finishing;
133
+ }
134
+ };
135
+ }
136
+ //# sourceMappingURL=attachment-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-server.js","sourceRoot":"","sources":["../../../../source/run/attachment-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import path from 'node:path';
2
+ import { createAttachmentStore } from "./attachment-store.js";
3
+ import { createAttachmentServer } from "./attachment-server.js";
4
+ export async function createAttachmentStorageSession(resolved, record) {
5
+ const limits = resolved.facts.execution.attachments;
6
+ if (limits === null) {
7
+ throw new TypeError('Runtime attachments require integration limits.');
8
+ }
9
+ const store = createAttachmentStore({
10
+ captureTime: record.captureTime,
11
+ checkpoint: record.checkpoint,
12
+ directory: path.resolve(resolved.facts.environment.projectRoot, resolved.config.runtimeStateDir, 'runs', record.session.id, 'artifacts'),
13
+ limits,
14
+ projectRoot: resolved.facts.environment.projectRoot,
15
+ work: resolved.facts.cases.map(function workIdentity(entry) {
16
+ return entry.workId;
17
+ })
18
+ });
19
+ return { resolved, server: await createAttachmentServer(store, limits), store };
20
+ }
21
+ //# sourceMappingURL=attachment-storage-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-storage-session.js","sourceRoot":"","sources":["../../../../source/run/attachment-storage-session.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAwB,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAyB,MAAM,wBAAwB,CAAC;AASvF,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAChD,QAAqB,EACrB,MAAwB;IAExB,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC;IACpD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,KAAK,GAAG,qBAAqB,CAAC;QAChC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,IAAI,CAAC,OAAO,CACnB,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EACtC,QAAQ,CAAC,MAAM,CAAC,eAAe,EAC/B,MAAM,EACN,MAAM,CAAC,OAAO,CAAC,EAAE,EACjB,WAAW,CACd;QACD,MAAM;QACN,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW;QACnD,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,YAAY,CAAC,KAAK;YACtD,OAAO,KAAK,CAAC,MAAM,CAAC;QACxB,CAAC,CAAC;KACL,CAAC,CAAC;IACH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;AACpF,CAAC"}