@overkill-dev/run 0.0.64 → 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 (141) hide show
  1. package/attachments/attachment-context.js +31 -0
  2. package/attachments/attachment-context.js.map +1 -0
  3. package/engine/run-artifact.d.ts +1 -1
  4. package/engine/run-artifact.d.ts.map +1 -1
  5. package/engine/run-result.d.ts +5 -1
  6. package/engine/run-result.d.ts.map +1 -1
  7. package/engine/run-result.js.map +1 -1
  8. package/engine/runtime-attachment.d.ts +62 -0
  9. package/engine/runtime-attachment.d.ts.map +1 -0
  10. package/engine/runtime-attachment.js +7 -0
  11. package/engine/runtime-attachment.js.map +1 -0
  12. package/package.json +9 -1
  13. package/packages/resources/attachment-context.entry-point.js +2 -0
  14. package/packages/resources/attachment-context.entry-point.js.map +1 -0
  15. package/packages/run/config.entry-point.d.ts +1 -1
  16. package/packages/run/config.entry-point.d.ts.map +1 -1
  17. package/packages/run/run.entry-point.d.ts +1 -1
  18. package/packages/run/run.entry-point.d.ts.map +1 -1
  19. package/readme.md +23 -1
  20. package/reporters/human-reporter-rendering.js +14 -0
  21. package/reporters/human-reporter-rendering.js.map +1 -1
  22. package/resources/resource-definition-brand.js +1 -1
  23. package/resources/resource-definition-brand.js.map +1 -1
  24. package/resources/resource-definition-types.d.ts.map +1 -1
  25. package/resources/resource-scenario-binding.js +2 -0
  26. package/resources/resource-scenario-binding.js.map +1 -1
  27. package/resources/resource-session.d.ts.map +1 -1
  28. package/resources/runtime-definition.d.ts.map +1 -1
  29. package/resources/runtime-definition.js +1 -1
  30. package/resources/runtime-definition.js.map +1 -1
  31. package/resources/runtime-matrix-definition.d.ts.map +1 -1
  32. package/resources/runtime-matrix-definition.js +2 -2
  33. package/resources/runtime-matrix-definition.js.map +1 -1
  34. package/run/attachment-connection.js +108 -0
  35. package/run/attachment-connection.js.map +1 -0
  36. package/run/attachment-coordinator-context.js +9 -0
  37. package/run/attachment-coordinator-context.js.map +1 -0
  38. package/run/attachment-coordinator.js +77 -0
  39. package/run/attachment-coordinator.js.map +1 -0
  40. package/run/attachment-eligibility.js +21 -0
  41. package/run/attachment-eligibility.js.map +1 -0
  42. package/run/attachment-execution.js +255 -0
  43. package/run/attachment-execution.js.map +1 -0
  44. package/run/attachment-failure.js +63 -0
  45. package/run/attachment-failure.js.map +1 -0
  46. package/run/attachment-frames.js +22 -0
  47. package/run/attachment-frames.js.map +1 -0
  48. package/run/attachment-json.js +118 -0
  49. package/run/attachment-json.js.map +1 -0
  50. package/run/attachment-protocol.js +5 -0
  51. package/run/attachment-protocol.js.map +1 -0
  52. package/run/attachment-record.js +60 -0
  53. package/run/attachment-record.js.map +1 -0
  54. package/run/attachment-reporter.js +39 -0
  55. package/run/attachment-reporter.js.map +1 -0
  56. package/run/attachment-results.js +115 -0
  57. package/run/attachment-results.js.map +1 -0
  58. package/run/attachment-retention.js +153 -0
  59. package/run/attachment-retention.js.map +1 -0
  60. package/run/attachment-run.js +36 -0
  61. package/run/attachment-run.js.map +1 -0
  62. package/run/attachment-server.js +136 -0
  63. package/run/attachment-server.js.map +1 -0
  64. package/run/attachment-storage-session.js +21 -0
  65. package/run/attachment-storage-session.js.map +1 -0
  66. package/run/attachment-store.js +330 -0
  67. package/run/attachment-store.js.map +1 -0
  68. package/run/attachment-wire-schema.js +123 -0
  69. package/run/attachment-wire-schema.js.map +1 -0
  70. package/run/attachment-worker-context.js +49 -0
  71. package/run/attachment-worker-context.js.map +1 -0
  72. package/run/attachment-writer.js +117 -0
  73. package/run/attachment-writer.js.map +1 -0
  74. package/run/coverage-config-schema.d.ts +4 -4
  75. package/run/resource-lifecycle-projection.js +6 -2
  76. package/run/resource-lifecycle-projection.js.map +1 -1
  77. package/run/resource-lifecycle-session-acquirer.js +2 -0
  78. package/run/resource-lifecycle-session-acquirer.js.map +1 -1
  79. package/run/resource-lifecycle-startup-budget.js +1 -0
  80. package/run/resource-lifecycle-startup-budget.js.map +1 -1
  81. package/run/resource-lifecycle-state.d.ts.map +1 -1
  82. package/run/resource-lifecycle-state.js +10 -0
  83. package/run/resource-lifecycle-state.js.map +1 -1
  84. package/run/resource-lifecycle.js +24 -6
  85. package/run/resource-lifecycle.js.map +1 -1
  86. package/run/retry-artifact-retention.js.map +1 -1
  87. package/run/run-config-schema.d.ts +23 -4
  88. package/run/run-config-schema.d.ts.map +1 -1
  89. package/run/run-config-schema.js +11 -0
  90. package/run/run-config-schema.js.map +1 -1
  91. package/run/run-config.d.ts +7 -5
  92. package/run/run-config.d.ts.map +1 -1
  93. package/run/run-config.js +2 -1
  94. package/run/run-config.js.map +1 -1
  95. package/run/run-engine-primitives.d.ts +12 -1
  96. package/run/run-engine-primitives.d.ts.map +1 -1
  97. package/run/run-facts.js +1 -0
  98. package/run/run-facts.js.map +1 -1
  99. package/run/run-isolated-command.js +1 -0
  100. package/run/run-isolated-command.js.map +1 -1
  101. package/run/run-local-command.js +4 -1
  102. package/run/run-local-command.js.map +1 -1
  103. package/run/run-local-execution.js +2 -1
  104. package/run/run-local-execution.js.map +1 -1
  105. package/run/run-local-resolution.js.map +1 -1
  106. package/run/run-record-input.js.map +1 -1
  107. package/run/run-record-outcomes.d.ts +4 -1
  108. package/run/run-record-outcomes.d.ts.map +1 -1
  109. package/run/run-record.js.map +1 -1
  110. package/run/run-support.js +6 -1
  111. package/run/run-support.js.map +1 -1
  112. package/run/run-types.d.ts +3 -4
  113. package/run/run-types.d.ts.map +1 -1
  114. package/run/run-types.js.map +1 -1
  115. package/run/run-validation.js +9 -0
  116. package/run/run-validation.js.map +1 -1
  117. package/run/runtime-attachment-boundary.js +11 -0
  118. package/run/runtime-attachment-boundary.js.map +1 -0
  119. package/run/supervised-child.js +11 -9
  120. package/run/supervised-child.js.map +1 -1
  121. package/run/supervised-protocol.js.map +1 -1
  122. package/run/supervised-run-runtime.js +9 -3
  123. package/run/supervised-run-runtime.js.map +1 -1
  124. package/run/supervised-run.js +11 -3
  125. package/run/supervised-run.js.map +1 -1
  126. package/run/worker-pool-command.js +1 -0
  127. package/run/worker-pool-command.js.map +1 -1
  128. package/run/worker-pool-execution.js +10 -2
  129. package/run/worker-pool-execution.js.map +1 -1
  130. package/run/worker-pool-hedged-arbitration.js +7 -2
  131. package/run/worker-pool-hedged-arbitration.js.map +1 -1
  132. package/run/worker-pool-protocol.js.map +1 -1
  133. package/run/worker-pool-run.js +8 -1
  134. package/run/worker-pool-run.js.map +1 -1
  135. package/run/worker-pool-runtime.js +3 -7
  136. package/run/worker-pool-runtime.js.map +1 -1
  137. package/run/worker-pool-task-events.js +5 -2
  138. package/run/worker-pool-task-events.js.map +1 -1
  139. package/run/worker-pool-worker.js +14 -4
  140. package/run/worker-pool-worker.js.map +1 -1
  141. package/sbom.cdx.json +4 -4
@@ -0,0 +1,108 @@
1
+ import { connect } from 'node:net';
2
+ import { createInterface } from 'node:readline';
3
+ import { createStoredRunValue } from "./supervised-run-state.js";
4
+ import { attachmentMaxFrameBytes, attachmentMaxPendingRequests } from "./attachment-protocol.js";
5
+ import { attachmentReplySchema } from "./attachment-wire-schema.js";
6
+ import { boundedAttachmentFrames } from "./attachment-frames.js";
7
+ const jsonEscapeExpansion = 6;
8
+ function attachmentChannelFail(state, error) {
9
+ const { failure, pending } = state;
10
+ failure.write(error);
11
+ for (const request of pending.values()) {
12
+ request.reject(error);
13
+ }
14
+ pending.clear();
15
+ }
16
+ function attachmentChannelReply(state, line) {
17
+ const { pending, socket } = state;
18
+ const value = JSON.parse(line);
19
+ const reply = attachmentReplySchema.parse(value);
20
+ pending.get(reply.request)?.resolve(reply.result);
21
+ pending.delete(reply.request);
22
+ if (pending.size === 0) {
23
+ socket.unref();
24
+ }
25
+ }
26
+ function attachmentChannelReceive(state, line) {
27
+ const { socket } = state;
28
+ try {
29
+ attachmentChannelReply(state, line);
30
+ }
31
+ catch (error) {
32
+ attachmentChannelFail(state, error instanceof Error ? error : new Error('Invalid attachment reply.'));
33
+ socket.destroy();
34
+ }
35
+ }
36
+ function attachmentChannelObserve(state) {
37
+ const { endpoint, socket } = state;
38
+ const frames = boundedAttachmentFrames(endpoint.limits.maxInlineBytes * jsonEscapeExpansion + attachmentMaxFrameBytes);
39
+ const lines = createInterface({ input: socket.pipe(frames), crlfDelay: Number.POSITIVE_INFINITY });
40
+ frames.on('error', function (error) {
41
+ attachmentChannelFail(state, error);
42
+ socket.destroy();
43
+ });
44
+ lines.on('error', function (error) {
45
+ attachmentChannelFail(state, error);
46
+ socket.destroy();
47
+ });
48
+ socket.on('error', function (error) {
49
+ attachmentChannelFail(state, error);
50
+ });
51
+ socket.on('close', function () {
52
+ attachmentChannelFail(state, new Error('Attachment execution boundary disconnected.'));
53
+ lines.close();
54
+ });
55
+ lines.on('line', function (line) {
56
+ attachmentChannelReceive(state, line);
57
+ });
58
+ }
59
+ function attachmentChannelClose(state) {
60
+ const { socket } = state;
61
+ socket.end();
62
+ }
63
+ async function sendAttachmentRequest(state, operation) {
64
+ const { sequence, pending, socket, endpoint } = state;
65
+ if (pending.size >= attachmentMaxPendingRequests) {
66
+ throw new Error('Attachment transport request limit exceeded.');
67
+ }
68
+ const request = sequence.read();
69
+ sequence.write(request + 1);
70
+ const response = Promise.withResolvers();
71
+ pending.set(request, response);
72
+ socket.ref();
73
+ socket.write(`${JSON.stringify({ request, token: endpoint.token, operation })}\n`);
74
+ return response.promise;
75
+ }
76
+ async function attachmentChannelExchange(state, operation) {
77
+ await state.ready;
78
+ const unavailable = state.failure.read();
79
+ if (unavailable !== null) {
80
+ throw unavailable;
81
+ }
82
+ return await sendAttachmentRequest(state, operation);
83
+ }
84
+ function observeAttachmentDisconnect(state, observer) {
85
+ state.socket.once('close', observer);
86
+ }
87
+ export function createAttachmentConnection(endpoint) {
88
+ const socket = connect({ host: '127.0.0.1', port: endpoint.port });
89
+ const pending = new Map();
90
+ const sequence = createStoredRunValue(0);
91
+ const failure = createStoredRunValue(null);
92
+ const ready = new Promise(function (resolve, reject) {
93
+ socket.once('connect', function () {
94
+ socket.unref();
95
+ resolve();
96
+ });
97
+ socket.once('error', reject);
98
+ });
99
+ const state = { endpoint, socket, pending, sequence, failure, ready };
100
+ attachmentChannelObserve(state);
101
+ return {
102
+ ready: state.ready,
103
+ observeDisconnect: observeAttachmentDisconnect.bind(null, state),
104
+ close: attachmentChannelClose.bind(null, state),
105
+ exchange: attachmentChannelExchange.bind(null, state)
106
+ };
107
+ }
108
+ //# sourceMappingURL=attachment-connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-connection.js","sourceRoot":"","sources":["../../../../source/run/attachment-connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ const coordinatorContext = new AsyncLocalStorage();
3
+ export function currentAttachmentCoordinator() {
4
+ return coordinatorContext.getStore() ?? null;
5
+ }
6
+ export async function runWithAttachmentCoordinator(coordinator, run) {
7
+ return await coordinatorContext.run(coordinator, run);
8
+ }
9
+ //# sourceMappingURL=attachment-coordinator-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-coordinator-context.js","sourceRoot":"","sources":["../../../../source/run/attachment-coordinator-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAkBrD,MAAM,kBAAkB,GAAG,IAAI,iBAAiB,EAAyB,CAAC;AAE1E,MAAM,UAAU,4BAA4B;IACxC,OAAO,kBAAkB,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAC9C,WAAkC,EAClC,GAAyB;IAEzB,OAAO,MAAM,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,77 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { createStoredRunValue } from "./supervised-run-state.js";
3
+ import { attachmentArtifacts, attachmentMatchesAttempt, resultWithRuntimeAttachments } from "./attachment-results.js";
4
+ import { createAttachmentExecution } from "./attachment-execution.js";
5
+ function attachmentRunCoordinatorBranchEndpoint(state, branch, retain) {
6
+ const { branches, store } = state;
7
+ const id = randomUUID();
8
+ branches.set(branch, id);
9
+ store.registerBranch(id, retain);
10
+ return { ...state.endpoint, branch: id };
11
+ }
12
+ function attachmentRunCoordinatorBranchArtifacts(state, branch) {
13
+ const { branches, store } = state;
14
+ const id = branches.get(branch);
15
+ return id === undefined ? [] : store.branchArtifacts(id);
16
+ }
17
+ function attachmentRunCoordinatorCaseArtifacts(state, work, attempt, branch) {
18
+ const { store } = state;
19
+ const artifacts = branch === null
20
+ ? store.branchArtifacts(null)
21
+ : attachmentRunCoordinatorBranchArtifacts(state, branch);
22
+ return artifacts.filter(function belongsToAttempt(artifact) {
23
+ return attachmentMatchesAttempt(artifact, work, attempt);
24
+ });
25
+ }
26
+ async function attachmentRunCoordinatorFinalize(state, result) {
27
+ const { finalized, execution, server, store, resolved } = state;
28
+ if (finalized.read() !== null) {
29
+ return result;
30
+ }
31
+ const localErrors = await execution.finish();
32
+ const owners = await server.finish();
33
+ const final = resultWithRuntimeAttachments(result, store.selectedArtifacts(), {
34
+ localErrors,
35
+ owners,
36
+ policy: resolved.facts.execution.retries?.artifacts ?? 'first-failure-and-final',
37
+ retainsBranch: store.retainsBranch
38
+ });
39
+ finalized.write(final);
40
+ await store.prune(attachmentArtifacts(final.artifacts));
41
+ return final;
42
+ }
43
+ async function attachmentRunCoordinatorClose(state) {
44
+ const { execution, server } = state;
45
+ await execution.finish();
46
+ await server.finish();
47
+ }
48
+ export function createAttachmentRunCoordinator(storage) {
49
+ const { store, server, resolved } = storage;
50
+ const branches = new WeakMap();
51
+ const execution = createAttachmentExecution(async function (operation) {
52
+ return store.exchange('local', operation);
53
+ }, server.endpoint.limits.maxInlineBytes);
54
+ const endpoint = server.endpoint;
55
+ const finalized = createStoredRunValue(null);
56
+ const state = {
57
+ storage,
58
+ store,
59
+ server,
60
+ resolved,
61
+ branches,
62
+ execution,
63
+ endpoint,
64
+ finalized
65
+ };
66
+ return {
67
+ artifacts: store.selectedArtifacts,
68
+ execution: state.execution,
69
+ endpoint: state.endpoint,
70
+ branchEndpoint: attachmentRunCoordinatorBranchEndpoint.bind(null, state),
71
+ branchArtifacts: attachmentRunCoordinatorBranchArtifacts.bind(null, state),
72
+ caseArtifacts: attachmentRunCoordinatorCaseArtifacts.bind(null, state),
73
+ finalize: attachmentRunCoordinatorFinalize.bind(null, state),
74
+ close: attachmentRunCoordinatorClose.bind(null, state)
75
+ };
76
+ }
77
+ //# sourceMappingURL=attachment-coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-coordinator.js","sourceRoot":"","sources":["../../../../source/run/attachment-coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { workIdentityKey } from "../engine/identity.js";
2
+ import { collectedRunCaseEntries } from "./collected-run-plan.js";
3
+ export function runHasAttachmentScopes(resolved) {
4
+ if (resolved.facts.execution.testFamily !== 'integration' || resolved.facts.cases.length === 0) {
5
+ return false;
6
+ }
7
+ const selected = new Set(resolved.facts.cases.map(function selectedWork(entry) {
8
+ return workIdentityKey(entry.workId);
9
+ }));
10
+ const cases = resolved.plan.kind === 'local'
11
+ ? resolved.plan.testPlan.cases.map(function localCase(testCase) {
12
+ return { testCase, workId: testCase.workId };
13
+ })
14
+ : collectedRunCaseEntries(resolved.plan.collectedPlan);
15
+ return cases.some(function hasAttachmentScope(entry) {
16
+ return selected.has(workIdentityKey(entry.workId)) &&
17
+ (entry.testCase.resourceAttachments.resourceGraph.length > 0 ||
18
+ entry.testCase.resourceAttachments.runtimeGraphs.length > 0);
19
+ });
20
+ }
21
+ //# sourceMappingURL=attachment-eligibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-eligibility.js","sourceRoot":"","sources":["../../../../source/run/attachment-eligibility.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAGlE,MAAM,UAAU,sBAAsB,CAAC,QAAqB;IACxD,IAAI,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,KAAK,aAAa,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7F,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,YAAY,CAAC,KAAK;QACzE,OAAO,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC,CAAC;IACJ,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO;QACxC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,SAAS,CAAC,QAAQ;YAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QACjD,CAAC,CAAC;QACF,CAAC,CAAC,uBAAuB,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,kBAAkB,CAAC,KAAK;QAC/C,OAAO,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9C,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;gBACxD,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,255 @@
1
+ import { AsyncLocalStorage } from 'node:async_hooks';
2
+ import { workIdentityKey } from "../engine/identity.js";
3
+ import { AttachmentOperationError, createAttachmentFailure } from "./attachment-failure.js";
4
+ import { createStoredRunValue } from "./supervised-run-state.js";
5
+ import { snapshotAttachmentJson } from "./attachment-json.js";
6
+ import { createAttachmentStream, copyAttachmentFile } from "./attachment-writer.js";
7
+ function createAttachmentAttempt(work, attempt) {
8
+ const owner = { attempt, kind: 'case', work };
9
+ const active = createStoredRunValue(true);
10
+ function end() {
11
+ active.write(false);
12
+ }
13
+ function isActive() {
14
+ return active.read();
15
+ }
16
+ return { owner, end, isActive };
17
+ }
18
+ function ownerKey(owner) {
19
+ return owner.kind === 'run' ? 'run' : `${workIdentityKey(owner.work)}:${owner.attempt.index}`;
20
+ }
21
+ const maxFailuresPerOwner = 100;
22
+ function attachmentExecutionSessionFail(state, rejection) {
23
+ const { owner, drift } = rejection;
24
+ const { failures } = state;
25
+ const error = createAttachmentFailure(rejection, state.currentBranch.getStore() ?? null);
26
+ const key = ownerKey(drift ? { kind: 'run' } : owner);
27
+ const errors = failures.get(key) ?? [];
28
+ if (errors.length < maxFailuresPerOwner) {
29
+ state.failures.set(key, [...errors, error]);
30
+ }
31
+ return error;
32
+ }
33
+ function attachmentExecutionSessionVerify(state, window) {
34
+ if (state.closed.read()) {
35
+ throw attachmentExecutionSessionFail(state, {
36
+ owner: window?.owner ?? { kind: 'run' },
37
+ message: 'Attachment escaped its integration run.',
38
+ reason: 'expired-run',
39
+ drift: true
40
+ });
41
+ }
42
+ if (window?.isActive() === false) {
43
+ throw attachmentExecutionSessionFail(state, {
44
+ owner: window.owner,
45
+ message: 'Attachment escaped its test attempt.',
46
+ reason: 'expired-attempt',
47
+ drift: true
48
+ });
49
+ }
50
+ }
51
+ async function attachmentExecutionSessionTransport(state, operation, owner) {
52
+ try {
53
+ return await state.exchange(operation);
54
+ }
55
+ catch (error) {
56
+ throw attachmentExecutionSessionFail(state, {
57
+ owner,
58
+ message: error instanceof Error ? error.message : 'Attachment transport failed.',
59
+ reason: 'transport',
60
+ drift: false
61
+ });
62
+ }
63
+ }
64
+ async function attachmentExecutionSessionSend(state, operation, owner) {
65
+ const response = await attachmentExecutionSessionTransport(state, operation, owner);
66
+ if (response.kind === 'error') {
67
+ throw attachmentExecutionSessionFail(state, {
68
+ owner,
69
+ message: response.message,
70
+ reason: response.reason,
71
+ drift: false
72
+ });
73
+ }
74
+ return response;
75
+ }
76
+ function activeAttachmentWindow(state) {
77
+ const window = state.currentAttempt.getStore();
78
+ attachmentExecutionSessionVerify(state, window);
79
+ return window;
80
+ }
81
+ async function attachmentExecutionSessionOpen(state, metadata, kind, producer) {
82
+ const { currentBranch, writers } = state;
83
+ const window = activeAttachmentWindow(state);
84
+ const owner = window?.owner ?? { kind: 'run' };
85
+ const response = await attachmentExecutionSessionSend(state, {
86
+ branch: currentBranch.getStore() ?? null,
87
+ contentKind: kind,
88
+ kind: 'open',
89
+ metadata,
90
+ owner,
91
+ producer
92
+ }, owner);
93
+ if (response.kind !== 'opened') {
94
+ throw attachmentExecutionSessionFail(state, {
95
+ owner,
96
+ message: 'Attachment open returned an invalid reply.',
97
+ reason: 'protocol',
98
+ drift: false
99
+ });
100
+ }
101
+ const token = Symbol('attachment-writer');
102
+ const writer = createAttachmentStream({
103
+ fail(message, reason) {
104
+ return attachmentExecutionSessionFail(state, {
105
+ owner,
106
+ message,
107
+ reason,
108
+ drift: false
109
+ });
110
+ },
111
+ owner,
112
+ release() {
113
+ writers.delete(token);
114
+ },
115
+ async send(operation) {
116
+ return attachmentExecutionSessionSend(state, operation, owner);
117
+ },
118
+ verify() {
119
+ attachmentExecutionSessionVerify(state, window);
120
+ }
121
+ }, response.writer, kind);
122
+ writers.set(token, writer);
123
+ return writer;
124
+ }
125
+ function attachmentExecutionSessionJsonSnapshot(state, value) {
126
+ const { currentAttempt } = state;
127
+ try {
128
+ return snapshotAttachmentJson(value, state.maxInlineBytes);
129
+ }
130
+ catch (error) {
131
+ const owner = currentAttempt.getStore()?.owner ?? { kind: 'run' };
132
+ throw attachmentExecutionSessionFail(state, {
133
+ owner,
134
+ message: error instanceof Error ? error.message : 'Invalid JSON attachment.',
135
+ reason: 'invalid-json',
136
+ drift: false
137
+ });
138
+ }
139
+ }
140
+ async function attachmentExecutionSessionJson(state, metadata, value, producer) {
141
+ activeAttachmentWindow(state);
142
+ const snapshot = attachmentExecutionSessionJsonSnapshot(state, value);
143
+ const writer = await attachmentExecutionSessionOpen(state, metadata, 'json', producer);
144
+ if (snapshot === null) {
145
+ await writer.omit();
146
+ }
147
+ else {
148
+ await writer.write(snapshot.encoded);
149
+ }
150
+ return await writer.close();
151
+ }
152
+ async function attachmentExecutionSessionFile(state, metadata, filePath, producer) {
153
+ const writer = await attachmentExecutionSessionOpen(state, metadata, 'binary', producer);
154
+ try {
155
+ await copyAttachmentFile(writer, filePath);
156
+ }
157
+ catch (error) {
158
+ await writer.finish('write-error');
159
+ if (error instanceof AttachmentOperationError) {
160
+ throw error;
161
+ }
162
+ throw attachmentExecutionSessionFail(state, {
163
+ owner: writer.owner,
164
+ message: error instanceof Error ? error.message : 'Attachment file read failed.',
165
+ reason: 'file-read',
166
+ drift: false
167
+ });
168
+ }
169
+ return await writer.close();
170
+ }
171
+ function attachmentExecutionSessionCapabilities(state, producer) {
172
+ return {
173
+ async file(metadata, filePath) {
174
+ return attachmentExecutionSessionFile(state, metadata, filePath, producer);
175
+ },
176
+ async json(metadata, value) {
177
+ return attachmentExecutionSessionJson(state, metadata, value, producer);
178
+ },
179
+ async open(metadata) {
180
+ return attachmentExecutionSessionOpen(state, metadata, metadata.kind, producer);
181
+ }
182
+ };
183
+ }
184
+ async function attachmentExecutionSessionFinishOwner(state, owner) {
185
+ const { writers } = state;
186
+ const selected = Array.from(writers.values()).filter(function ownedWriter(writer) {
187
+ return ownerKey(writer.owner) === ownerKey(owner);
188
+ });
189
+ await Promise.allSettled(selected.map(async function finishOwnedWriter(writer) {
190
+ await writer.finish('unclosed');
191
+ }));
192
+ }
193
+ function attachmentExecutionSessionTakeErrors(state, owner) {
194
+ const { failures } = state;
195
+ const key = ownerKey(owner);
196
+ const errors = failures.get(key) ?? [];
197
+ failures.delete(key);
198
+ return errors.flatMap(function unreportedError(error) {
199
+ const failure = error.take();
200
+ return failure === null ? [] : [failure];
201
+ });
202
+ }
203
+ async function attachmentExecutionSessionFinish(state) {
204
+ state.closed.write(true);
205
+ await attachmentExecutionSessionFinishOwner(state, { kind: 'run' });
206
+ return attachmentExecutionSessionTakeErrors(state, { kind: 'run' });
207
+ }
208
+ async function attachmentExecutionSessionOwnedAttempt(state, window, run) {
209
+ try {
210
+ return await run();
211
+ }
212
+ finally {
213
+ window.end();
214
+ await attachmentExecutionSessionFinishOwner(state, window.owner);
215
+ }
216
+ }
217
+ async function attachmentExecutionSessionRunAttempt(state, work, attempt, run) {
218
+ const { currentAttempt } = state;
219
+ const window = createAttachmentAttempt(work, attempt);
220
+ return await currentAttempt.run(window, async function () {
221
+ return attachmentExecutionSessionOwnedAttempt(state, window, run);
222
+ });
223
+ }
224
+ async function attachmentExecutionSessionRunBranch(state, branch, run) {
225
+ const { currentBranch } = state;
226
+ return await currentBranch.run(branch, run);
227
+ }
228
+ export function createAttachmentExecution(exchange, maxInlineBytes) {
229
+ const currentAttempt = new AsyncLocalStorage();
230
+ const currentBranch = new AsyncLocalStorage();
231
+ const writers = new Map();
232
+ const failures = new Map();
233
+ const state = {
234
+ closed: createStoredRunValue(false),
235
+ exchange,
236
+ maxInlineBytes,
237
+ currentAttempt,
238
+ currentBranch,
239
+ writers,
240
+ failures
241
+ };
242
+ const context = { forProducer: attachmentExecutionSessionCapabilities.bind(null, state) };
243
+ return {
244
+ context,
245
+ takeErrors: attachmentExecutionSessionTakeErrors.bind(null, state),
246
+ finish: attachmentExecutionSessionFinish.bind(null, state),
247
+ async runAttempt(work, attempt, run) {
248
+ return await attachmentExecutionSessionRunAttempt(state, work, attempt, run);
249
+ },
250
+ async runBranch(branch, run) {
251
+ return await attachmentExecutionSessionRunBranch(state, branch, run);
252
+ }
253
+ };
254
+ }
255
+ //# sourceMappingURL=attachment-execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-execution.js","sourceRoot":"","sources":["../../../../source/run/attachment-execution.ts"],"names":[],"mappings":"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"}
@@ -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"}