@mongodb-js/agent-engine-runner-shared 0.11.3

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 (220) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/LICENSE.md +201 -0
  3. package/README.md +29 -0
  4. package/dist/agent_config.d.ts +167 -0
  5. package/dist/agent_config.d.ts.map +1 -0
  6. package/dist/agent_config.js +544 -0
  7. package/dist/call_interrupted.d.ts +12 -0
  8. package/dist/call_interrupted.d.ts.map +1 -0
  9. package/dist/call_interrupted.js +11 -0
  10. package/dist/checkpoint_workspace.d.ts +25 -0
  11. package/dist/checkpoint_workspace.d.ts.map +1 -0
  12. package/dist/checkpoint_workspace.js +44 -0
  13. package/dist/context.d.ts +235 -0
  14. package/dist/context.d.ts.map +1 -0
  15. package/dist/context.js +322 -0
  16. package/dist/db_config.d.ts +28 -0
  17. package/dist/db_config.d.ts.map +1 -0
  18. package/dist/db_config.js +66 -0
  19. package/dist/db_naming.d.ts +54 -0
  20. package/dist/db_naming.d.ts.map +1 -0
  21. package/dist/db_naming.js +94 -0
  22. package/dist/error_reporting.d.ts +67 -0
  23. package/dist/error_reporting.d.ts.map +1 -0
  24. package/dist/error_reporting.js +311 -0
  25. package/dist/generated/workflow/v1/activity_pb.d.ts +342 -0
  26. package/dist/generated/workflow/v1/activity_pb.d.ts.map +1 -0
  27. package/dist/generated/workflow/v1/activity_pb.js +115 -0
  28. package/dist/generated/workflow/v1/common_pb.d.ts +184 -0
  29. package/dist/generated/workflow/v1/common_pb.d.ts.map +1 -0
  30. package/dist/generated/workflow/v1/common_pb.js +86 -0
  31. package/dist/generated/workflow/v1/runtime_pb.d.ts +200 -0
  32. package/dist/generated/workflow/v1/runtime_pb.d.ts.map +1 -0
  33. package/dist/generated/workflow/v1/runtime_pb.js +40 -0
  34. package/dist/generated/workflow/v1/state_pb.d.ts +254 -0
  35. package/dist/generated/workflow/v1/state_pb.d.ts.map +1 -0
  36. package/dist/generated/workflow/v1/state_pb.js +68 -0
  37. package/dist/guardrails_evaluator/core.d.ts +23 -0
  38. package/dist/guardrails_evaluator/core.d.ts.map +1 -0
  39. package/dist/guardrails_evaluator/core.js +122 -0
  40. package/dist/guardrails_evaluator/index.d.ts +10 -0
  41. package/dist/guardrails_evaluator/index.d.ts.map +1 -0
  42. package/dist/guardrails_evaluator/index.js +11 -0
  43. package/dist/guardrails_evaluator/regex.d.ts +20 -0
  44. package/dist/guardrails_evaluator/regex.d.ts.map +1 -0
  45. package/dist/guardrails_evaluator/regex.js +233 -0
  46. package/dist/hooks.d.ts +109 -0
  47. package/dist/hooks.d.ts.map +1 -0
  48. package/dist/hooks.js +216 -0
  49. package/dist/http_path.d.ts +18 -0
  50. package/dist/http_path.d.ts.map +1 -0
  51. package/dist/http_path.js +53 -0
  52. package/dist/index.d.ts +35 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +41 -0
  55. package/dist/launcher.d.ts +130 -0
  56. package/dist/launcher.d.ts.map +1 -0
  57. package/dist/launcher.js +325 -0
  58. package/dist/logger.d.ts +96 -0
  59. package/dist/logger.d.ts.map +1 -0
  60. package/dist/logger.js +204 -0
  61. package/dist/mcp_oauth.d.ts +51 -0
  62. package/dist/mcp_oauth.d.ts.map +1 -0
  63. package/dist/mcp_oauth.js +389 -0
  64. package/dist/mcp_oauth_secret.d.ts +21 -0
  65. package/dist/mcp_oauth_secret.d.ts.map +1 -0
  66. package/dist/mcp_oauth_secret.js +122 -0
  67. package/dist/mcp_tools.d.ts +71 -0
  68. package/dist/mcp_tools.d.ts.map +1 -0
  69. package/dist/mcp_tools.js +301 -0
  70. package/dist/memory_appbound.d.ts +42 -0
  71. package/dist/memory_appbound.d.ts.map +1 -0
  72. package/dist/memory_appbound.js +159 -0
  73. package/dist/memory_writer.d.ts +49 -0
  74. package/dist/memory_writer.d.ts.map +1 -0
  75. package/dist/memory_writer.js +171 -0
  76. package/dist/metrics.d.ts +84 -0
  77. package/dist/metrics.d.ts.map +1 -0
  78. package/dist/metrics.js +205 -0
  79. package/dist/models.d.ts +1458 -0
  80. package/dist/models.d.ts.map +1 -0
  81. package/dist/models.js +1726 -0
  82. package/dist/node_logger.d.ts +43 -0
  83. package/dist/node_logger.d.ts.map +1 -0
  84. package/dist/node_logger.js +158 -0
  85. package/dist/owner_callback.d.ts +16 -0
  86. package/dist/owner_callback.d.ts.map +1 -0
  87. package/dist/owner_callback.js +40 -0
  88. package/dist/progress.d.ts +57 -0
  89. package/dist/progress.d.ts.map +1 -0
  90. package/dist/progress.js +140 -0
  91. package/dist/runtime.d.ts +131 -0
  92. package/dist/runtime.d.ts.map +1 -0
  93. package/dist/runtime.js +351 -0
  94. package/dist/secure_llm_proxy.d.ts +115 -0
  95. package/dist/secure_llm_proxy.d.ts.map +1 -0
  96. package/dist/secure_llm_proxy.js +922 -0
  97. package/dist/secure_wrapper.d.ts +332 -0
  98. package/dist/secure_wrapper.d.ts.map +1 -0
  99. package/dist/secure_wrapper.js +1249 -0
  100. package/dist/server/aer.d.ts +61 -0
  101. package/dist/server/aer.d.ts.map +1 -0
  102. package/dist/server/aer.js +1124 -0
  103. package/dist/server/auth.d.ts +56 -0
  104. package/dist/server/auth.d.ts.map +1 -0
  105. package/dist/server/auth.js +132 -0
  106. package/dist/server/base.d.ts +104 -0
  107. package/dist/server/base.d.ts.map +1 -0
  108. package/dist/server/base.js +150 -0
  109. package/dist/server/callInterrupt.d.ts +49 -0
  110. package/dist/server/callInterrupt.d.ts.map +1 -0
  111. package/dist/server/callInterrupt.js +68 -0
  112. package/dist/server/callback_delivery.d.ts +14 -0
  113. package/dist/server/callback_delivery.d.ts.map +1 -0
  114. package/dist/server/callback_delivery.js +141 -0
  115. package/dist/server/chunk_types.d.ts +50 -0
  116. package/dist/server/chunk_types.d.ts.map +1 -0
  117. package/dist/server/chunk_types.js +62 -0
  118. package/dist/server/cors.d.ts +52 -0
  119. package/dist/server/cors.d.ts.map +1 -0
  120. package/dist/server/cors.js +107 -0
  121. package/dist/server/drain.d.ts +169 -0
  122. package/dist/server/drain.d.ts.map +1 -0
  123. package/dist/server/drain.js +455 -0
  124. package/dist/server/function.d.ts +77 -0
  125. package/dist/server/function.d.ts.map +1 -0
  126. package/dist/server/function.js +337 -0
  127. package/dist/server/http_retry.d.ts +37 -0
  128. package/dist/server/http_retry.d.ts.map +1 -0
  129. package/dist/server/http_retry.js +157 -0
  130. package/dist/server/index.d.ts +7 -0
  131. package/dist/server/index.d.ts.map +1 -0
  132. package/dist/server/index.js +5 -0
  133. package/dist/server/metadata.d.ts +50 -0
  134. package/dist/server/metadata.d.ts.map +1 -0
  135. package/dist/server/metadata.js +193 -0
  136. package/dist/server/oe_url.d.ts +36 -0
  137. package/dist/server/oe_url.d.ts.map +1 -0
  138. package/dist/server/oe_url.js +50 -0
  139. package/dist/server/owner_url.d.ts +35 -0
  140. package/dist/server/owner_url.d.ts.map +1 -0
  141. package/dist/server/owner_url.js +146 -0
  142. package/dist/server/query.d.ts +42 -0
  143. package/dist/server/query.d.ts.map +1 -0
  144. package/dist/server/query.js +28 -0
  145. package/dist/server/tool.d.ts +138 -0
  146. package/dist/server/tool.d.ts.map +1 -0
  147. package/dist/server/tool.js +1017 -0
  148. package/dist/span_names.d.ts +21 -0
  149. package/dist/span_names.d.ts.map +1 -0
  150. package/dist/span_names.js +31 -0
  151. package/dist/structured_logging/constants.d.ts +17 -0
  152. package/dist/structured_logging/constants.d.ts.map +1 -0
  153. package/dist/structured_logging/constants.js +71 -0
  154. package/dist/structured_logging/env.d.ts +18 -0
  155. package/dist/structured_logging/env.d.ts.map +1 -0
  156. package/dist/structured_logging/env.js +39 -0
  157. package/dist/structured_logging/install.d.ts +56 -0
  158. package/dist/structured_logging/install.d.ts.map +1 -0
  159. package/dist/structured_logging/install.js +107 -0
  160. package/dist/structured_logging/layout.d.ts +9 -0
  161. package/dist/structured_logging/layout.d.ts.map +1 -0
  162. package/dist/structured_logging/layout.js +144 -0
  163. package/dist/structured_logging/serialize.d.ts +27 -0
  164. package/dist/structured_logging/serialize.d.ts.map +1 -0
  165. package/dist/structured_logging/serialize.js +61 -0
  166. package/dist/structured_logging/stdio_capture.d.ts +59 -0
  167. package/dist/structured_logging/stdio_capture.d.ts.map +1 -0
  168. package/dist/structured_logging/stdio_capture.js +164 -0
  169. package/dist/structured_logging/uncaught.d.ts +14 -0
  170. package/dist/structured_logging/uncaught.d.ts.map +1 -0
  171. package/dist/structured_logging/uncaught.js +58 -0
  172. package/dist/structured_logging.d.ts +48 -0
  173. package/dist/structured_logging.d.ts.map +1 -0
  174. package/dist/structured_logging.js +47 -0
  175. package/dist/tls_client.d.ts +61 -0
  176. package/dist/tls_client.d.ts.map +1 -0
  177. package/dist/tls_client.js +298 -0
  178. package/dist/tool_api_error.d.ts +62 -0
  179. package/dist/tool_api_error.d.ts.map +1 -0
  180. package/dist/tool_api_error.js +399 -0
  181. package/dist/tool_memory_ownership.d.ts +10 -0
  182. package/dist/tool_memory_ownership.d.ts.map +1 -0
  183. package/dist/tool_memory_ownership.js +36 -0
  184. package/dist/toolpod_handlers.d.ts +126 -0
  185. package/dist/toolpod_handlers.d.ts.map +1 -0
  186. package/dist/toolpod_handlers.js +1016 -0
  187. package/dist/tracing/exporters.d.ts +51 -0
  188. package/dist/tracing/exporters.d.ts.map +1 -0
  189. package/dist/tracing/exporters.js +327 -0
  190. package/dist/tracing/index.d.ts +3 -0
  191. package/dist/tracing/index.d.ts.map +1 -0
  192. package/dist/tracing/index.js +2 -0
  193. package/dist/tracing/setup.d.ts +76 -0
  194. package/dist/tracing/setup.d.ts.map +1 -0
  195. package/dist/tracing/setup.js +436 -0
  196. package/dist/utils.d.ts +204 -0
  197. package/dist/utils.d.ts.map +1 -0
  198. package/dist/utils.js +867 -0
  199. package/dist/workflow/activity.d.ts +71 -0
  200. package/dist/workflow/activity.d.ts.map +1 -0
  201. package/dist/workflow/activity.js +357 -0
  202. package/dist/workflow/attempt.d.ts +12 -0
  203. package/dist/workflow/attempt.d.ts.map +1 -0
  204. package/dist/workflow/attempt.js +96 -0
  205. package/dist/workflow/client.d.ts +46 -0
  206. package/dist/workflow/client.d.ts.map +1 -0
  207. package/dist/workflow/client.js +299 -0
  208. package/dist/workflow/context.d.ts +37 -0
  209. package/dist/workflow/context.d.ts.map +1 -0
  210. package/dist/workflow/context.js +350 -0
  211. package/dist/workflow/heartbeat.d.ts +15 -0
  212. package/dist/workflow/heartbeat.d.ts.map +1 -0
  213. package/dist/workflow/heartbeat.js +78 -0
  214. package/dist/workflow/index.d.ts +14 -0
  215. package/dist/workflow/index.d.ts.map +1 -0
  216. package/dist/workflow/index.js +10 -0
  217. package/dist/workflow/memory.d.ts +17 -0
  218. package/dist/workflow/memory.d.ts.map +1 -0
  219. package/dist/workflow/memory.js +184 -0
  220. package/package.json +73 -0
@@ -0,0 +1,350 @@
1
+ /** Request-local durable attempt identity, positions, and observed activities. */
2
+ import { AsyncLocalStorage } from "node:async_hooks";
3
+ import { create, fromJson, toJson } from "@bufbuild/protobuf";
4
+ import { ActivityCommandSchema, } from "../generated/workflow/v1/activity_pb.js";
5
+ import { ActivityPositionSchema, OperationPathSchema, OperationPathSegmentSchema, } from "../generated/workflow/v1/common_pb.js";
6
+ const storage = new AsyncLocalStorage();
7
+ /**
8
+ * Nested operation-path resolvers are a ContextVar analog: they must follow
9
+ * the async chain, not a mutable field on the shared attempt holder. Sibling
10
+ * `resolverStorage.run` scopes then keep distinct paths after `await`.
11
+ */
12
+ const resolverStorage = new AsyncLocalStorage();
13
+ export class UnsupportedChildOperationFanOutError extends Error {
14
+ constructor(message) {
15
+ super(message);
16
+ this.name = "UnsupportedChildOperationFanOutError";
17
+ }
18
+ }
19
+ function pathKeyFromSegments(segments) {
20
+ return JSON.stringify(segments.map((segment) => [segment.name, Number(segment.ordinal)]));
21
+ }
22
+ function clonePosition(position) {
23
+ return fromJson(ActivityPositionSchema, toJson(ActivityPositionSchema, position));
24
+ }
25
+ function activityPositionKey(position) {
26
+ return [
27
+ Number(position.stepOrdinal),
28
+ pathKeyFromSegments(position.operationPath?.segments ?? []),
29
+ Number(position.activityOrdinal),
30
+ ];
31
+ }
32
+ function compareObservedPositions(left, right) {
33
+ const leftSegments = left.operationPath?.segments ?? [];
34
+ const rightSegments = right.operationPath?.segments ?? [];
35
+ const shared = Math.min(leftSegments.length, rightSegments.length);
36
+ for (let index = 0; index < shared; index += 1) {
37
+ const leftSegment = leftSegments[index];
38
+ const rightSegment = rightSegments[index];
39
+ if (leftSegment === undefined || rightSegment === undefined) {
40
+ break;
41
+ }
42
+ if (leftSegment.name < rightSegment.name)
43
+ return -1;
44
+ if (leftSegment.name > rightSegment.name)
45
+ return 1;
46
+ const ordinalCmp = Number(leftSegment.ordinal) - Number(rightSegment.ordinal);
47
+ if (ordinalCmp !== 0)
48
+ return ordinalCmp;
49
+ }
50
+ if (leftSegments.length !== rightSegments.length) {
51
+ return leftSegments.length - rightSegments.length;
52
+ }
53
+ return Number(left.activityOrdinal) - Number(right.activityOrdinal);
54
+ }
55
+ class ObservedActivityPositions {
56
+ positions = new Map();
57
+ record(position) {
58
+ const key = JSON.stringify(activityPositionKey(position));
59
+ this.positions.set(key, clonePosition(position));
60
+ }
61
+ forStep(stepOrdinal) {
62
+ return [...this.positions.values()]
63
+ .filter((position) => Number(position.stepOrdinal) === stepOrdinal)
64
+ .sort(compareObservedPositions);
65
+ }
66
+ }
67
+ class InterruptedActivities {
68
+ items = [];
69
+ record(command, controlFlow) {
70
+ // Settlement needs the command as admitted, even if the caller mutates it.
71
+ this.items.push({
72
+ command: fromJson(ActivityCommandSchema, toJson(ActivityCommandSchema, command)),
73
+ controlFlow,
74
+ });
75
+ }
76
+ forStep(stepOrdinal) {
77
+ return this.items.filter((item) => item.command.position?.stepOrdinal === BigInt(stepOrdinal));
78
+ }
79
+ }
80
+ class ActivityReconstruction {
81
+ activityIds = new Set();
82
+ interruptCounts = new Map();
83
+ replace(activityIds) {
84
+ this.activityIds = new Set(activityIds);
85
+ }
86
+ contains(activityId) {
87
+ return this.activityIds.has(activityId);
88
+ }
89
+ recordInterrupt(activityId) {
90
+ if (!this.activityIds.has(activityId)) {
91
+ throw new Error(`activity "${activityId}" is not being reconstructed`);
92
+ }
93
+ const count = (this.interruptCounts.get(activityId) ?? 0) + 1;
94
+ this.interruptCounts.set(activityId, count);
95
+ return count;
96
+ }
97
+ }
98
+ class ActivityOrdinalAllocator {
99
+ nextByPath = new Map();
100
+ byPathAndKey = new Map();
101
+ preallocate(path, keys) {
102
+ return keys.map((key) => this.allocate(path, key));
103
+ }
104
+ allocate(path, key) {
105
+ if (key !== undefined && key === "") {
106
+ throw new Error("activity ordinal key must be non-empty");
107
+ }
108
+ if (key !== undefined) {
109
+ const pathKey = JSON.stringify([path, key]);
110
+ const existing = this.byPathAndKey.get(pathKey);
111
+ if (existing !== undefined)
112
+ return existing;
113
+ const ordinal = this.nextByPath.get(path) ?? 1;
114
+ this.nextByPath.set(path, ordinal + 1);
115
+ this.byPathAndKey.set(pathKey, ordinal);
116
+ return ordinal;
117
+ }
118
+ const ordinal = this.nextByPath.get(path) ?? 1;
119
+ this.nextByPath.set(path, ordinal + 1);
120
+ return ordinal;
121
+ }
122
+ }
123
+ class ChildOperationPathAllocator {
124
+ nextOrdinalByChild = new Map();
125
+ ordinalByOccurrence = new Map();
126
+ keysByStepChild = new Map();
127
+ /**
128
+ * Assign ordinals to a complete sibling batch in list order, before
129
+ * concurrent same-name dispatch. Idempotent per occurrence key. The batch is
130
+ * validated before any assignment so a malformed or duplicate sibling
131
+ * identity cannot leave a partial reservation.
132
+ */
133
+ preallocate(path, stepOrdinal, boundaries) {
134
+ if (boundaries.length === 0) {
135
+ throw new Error("child operation name and occurrence key must be non-empty");
136
+ }
137
+ const seen = new Set();
138
+ for (const boundary of boundaries) {
139
+ if (!boundary.name || !boundary.occurrenceKey) {
140
+ throw new Error("child operation name and occurrence key must be non-empty");
141
+ }
142
+ const identity = JSON.stringify([boundary.name, boundary.occurrenceKey]);
143
+ if (seen.has(identity)) {
144
+ throw new UnsupportedChildOperationFanOutError(`child '${boundary.name}' has duplicate occurrence ` +
145
+ `'${boundary.occurrenceKey}' in the same batch`);
146
+ }
147
+ seen.add(identity);
148
+ }
149
+ return boundaries.map((boundary) => this.assign(path, stepOrdinal, boundary, true));
150
+ }
151
+ resolve(boundaries, stepOrdinal) {
152
+ const segments = [
153
+ create(OperationPathSegmentSchema, { name: "agent", ordinal: 1n }),
154
+ ];
155
+ for (const boundary of boundaries) {
156
+ const parent = pathKeyFromSegments(segments);
157
+ const ordinal = this.assign(parent, stepOrdinal, boundary, false);
158
+ segments.push(create(OperationPathSegmentSchema, {
159
+ name: boundary.name,
160
+ ordinal: BigInt(ordinal),
161
+ }));
162
+ }
163
+ return create(OperationPathSchema, { segments });
164
+ }
165
+ assign(parent, stepOrdinal, boundary, preallocating) {
166
+ if (!boundary.name || !boundary.occurrenceKey) {
167
+ throw new Error("child operation name and occurrence key must be non-empty");
168
+ }
169
+ const childKey = JSON.stringify([parent, boundary.name]);
170
+ const stepChildKey = JSON.stringify([stepOrdinal, childKey]);
171
+ const occurrenceKey = JSON.stringify([
172
+ stepChildKey,
173
+ boundary.occurrenceKey,
174
+ ]);
175
+ const existing = this.ordinalByOccurrence.get(occurrenceKey);
176
+ if (existing === undefined) {
177
+ const seenKeys = this.keysByStepChild.get(stepChildKey);
178
+ if (seenKeys && seenKeys.size > 0 && !preallocating) {
179
+ throw new UnsupportedChildOperationFanOutError(`child '${boundary.name}' has multiple occurrences in root step ` +
180
+ `${stepOrdinal}; deterministic preallocation is required`);
181
+ }
182
+ const ordinal = this.nextOrdinalByChild.get(childKey) ?? 1;
183
+ this.nextOrdinalByChild.set(childKey, ordinal + 1);
184
+ this.ordinalByOccurrence.set(occurrenceKey, ordinal);
185
+ }
186
+ const keys = this.keysByStepChild.get(stepChildKey) ?? new Set();
187
+ keys.add(boundary.occurrenceKey);
188
+ this.keysByStepChild.set(stepChildKey, keys);
189
+ return this.ordinalByOccurrence.get(occurrenceKey);
190
+ }
191
+ }
192
+ function rootOperationPath() {
193
+ return create(OperationPathSchema, {
194
+ segments: [
195
+ create(OperationPathSegmentSchema, { name: "agent", ordinal: 1n }),
196
+ ],
197
+ });
198
+ }
199
+ function initialStepOrdinal(context) {
200
+ const lineage = context.branchLineage;
201
+ if (lineage === undefined)
202
+ return 1;
203
+ const source = lineage.sourceWorkflowIdentity;
204
+ if (source === undefined ||
205
+ !source.sessionId ||
206
+ !source.executionId ||
207
+ lineage.sourceStepOrdinal <= 0n ||
208
+ !lineage.sourceStateHash) {
209
+ throw new Error("branch_lineage must identify a positive immutable source cutoff");
210
+ }
211
+ return Number(lineage.sourceStepOrdinal) + 1;
212
+ }
213
+ function bindHolder(attempt) {
214
+ return {
215
+ attempt,
216
+ step: { value: initialStepOrdinal(attempt) },
217
+ activityOrdinals: new ActivityOrdinalAllocator(),
218
+ childPaths: new ChildOperationPathAllocator(),
219
+ pendingChildBatch: { boundaries: [] },
220
+ observed: new ObservedActivityPositions(),
221
+ interrupted: new InterruptedActivities(),
222
+ reconstruction: new ActivityReconstruction(),
223
+ };
224
+ }
225
+ function activeHolder() {
226
+ const holder = storage.getStore();
227
+ if (holder === undefined || holder.attempt === null)
228
+ return undefined;
229
+ return holder;
230
+ }
231
+ function requireHolder(what) {
232
+ const holder = activeHolder();
233
+ if (holder === undefined) {
234
+ throw new Error(`${what} requires an active durable attempt context; ` +
235
+ "bind AttemptContext before admitting activities or committing steps");
236
+ }
237
+ return holder;
238
+ }
239
+ export function runWithAttemptContext(attempt, fn) {
240
+ const holder = bindHolder(attempt);
241
+ const close = () => {
242
+ holder.attempt = null;
243
+ };
244
+ try {
245
+ const result = storage.run(holder, fn);
246
+ if (result instanceof Promise) {
247
+ return result.finally(close);
248
+ }
249
+ close();
250
+ return result;
251
+ }
252
+ catch (error) {
253
+ close();
254
+ throw error;
255
+ }
256
+ }
257
+ export function currentAttemptContext() {
258
+ return storage.getStore()?.attempt ?? null;
259
+ }
260
+ export function currentStepOrdinal() {
261
+ const holder = requireHolder("step_ordinal");
262
+ if (holder.step.value <= 0) {
263
+ throw new Error("step_ordinal requires an active durable attempt context; " +
264
+ "bind AttemptContext before admitting activities or committing steps");
265
+ }
266
+ return holder.step.value;
267
+ }
268
+ export function currentOperationPath() {
269
+ const holder = activeHolder();
270
+ const resolver = resolverStorage.getStore();
271
+ if (holder === undefined || resolver === undefined) {
272
+ return rootOperationPath();
273
+ }
274
+ return holder.childPaths.resolve(resolver(), currentStepOrdinal());
275
+ }
276
+ export function runWithOperationPathResolver(resolver, fn) {
277
+ return resolverStorage.run(resolver, fn);
278
+ }
279
+ export function childOperationBoundaryScope(boundary, fn) {
280
+ // Append one child boundary to the active framework operation path.
281
+ //
282
+ // Framework adapters use this around dynamic child execution whose boundary
283
+ // is not visible in the parent graph topology. If a parent resolver is
284
+ // active, its boundaries are captured before the child changes framework
285
+ // runtime context and remain the prefix; otherwise the supplied boundary
286
+ // starts the nested path below the fixed root agent segment.
287
+ const parentResolver = resolverStorage.getStore();
288
+ const parentBoundaries = parentResolver?.() ?? [];
289
+ return runWithOperationPathResolver(() => [...parentBoundaries, boundary], fn);
290
+ }
291
+ export function recordObservedActivity(position) {
292
+ activeHolder()?.observed.record(position);
293
+ }
294
+ export function observedActivityPositions(stepOrdinal) {
295
+ return activeHolder()?.observed.forStep(stepOrdinal) ?? [];
296
+ }
297
+ export function recordInterruptedActivity(command, controlFlow) {
298
+ activeHolder()?.interrupted.record(command, controlFlow);
299
+ }
300
+ export function interruptedActivities(stepOrdinal) {
301
+ return activeHolder()?.interrupted.forStep(stepOrdinal) ?? [];
302
+ }
303
+ export function setActivityReconstructionIds(activityIds) {
304
+ activeHolder()?.reconstruction.replace(activityIds);
305
+ }
306
+ export function activityRequiresReconstruction(activityId) {
307
+ return activeHolder()?.reconstruction.contains(activityId) ?? false;
308
+ }
309
+ export function recordReconstructedActivityInterrupt(activityId) {
310
+ return requireHolder("activity reconstruction").reconstruction.recordInterrupt(activityId);
311
+ }
312
+ export function advanceStepOrdinal(committedStepOrdinal) {
313
+ if (committedStepOrdinal <= 0) {
314
+ throw new Error("committed step_ordinal must be positive");
315
+ }
316
+ const holder = requireHolder("step_ordinal");
317
+ holder.step.value = committedStepOrdinal + 1;
318
+ return holder.step.value;
319
+ }
320
+ export function toolActivityKey(toolCallId) {
321
+ if (!toolCallId) {
322
+ throw new Error("tool_call_id must be non-empty");
323
+ }
324
+ return `tool:${toolCallId}`;
325
+ }
326
+ export function allocateActivityOrdinal(key) {
327
+ const holder = requireHolder("activity_ordinal");
328
+ return holder.activityOrdinals.allocate(pathKeyFromSegments(currentOperationPath().segments), key);
329
+ }
330
+ export function preallocateActivityOrdinals(keys) {
331
+ const holder = requireHolder("activity_ordinal");
332
+ return holder.activityOrdinals.preallocate(pathKeyFromSegments(currentOperationPath().segments), keys);
333
+ }
334
+ export function preallocateChildOperationOrdinals(boundaries) {
335
+ const holder = requireHolder("child operation paths");
336
+ return holder.childPaths.preallocate(pathKeyFromSegments(currentOperationPath().segments), currentStepOrdinal(), boundaries);
337
+ }
338
+ export function currentPendingChildOperationBatch() {
339
+ return activeHolder()?.pendingChildBatch.boundaries ?? [];
340
+ }
341
+ export function setPendingChildOperationBatch(boundaries) {
342
+ // Replace in the shared attempt holder so detached worker copies observe
343
+ // the batch without a process-global map. The active-holder gate keeps
344
+ // detached callbacks from touching the batch after the attempt closes,
345
+ // matching every other attempt-scoped accessor.
346
+ const holder = activeHolder();
347
+ if (holder === undefined)
348
+ return;
349
+ holder.pendingChildBatch.boundaries = [...boundaries];
350
+ }
@@ -0,0 +1,15 @@
1
+ /** Fail-closed attempt lease heartbeat. */
2
+ import type { AttemptContext } from "../generated/workflow/v1/runtime_pb.js";
3
+ import { type WorkflowClient } from "./client.js";
4
+ export declare class AttemptHeartbeat {
5
+ private readonly attempt;
6
+ private readonly client;
7
+ private timer;
8
+ private stopped;
9
+ private inFlight;
10
+ constructor(attempt: AttemptContext, client: WorkflowClient);
11
+ start(): Promise<void>;
12
+ stop(): Promise<void>;
13
+ private request;
14
+ }
15
+ //# sourceMappingURL=heartbeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/workflow/heartbeat.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAK3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAI7E,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAUvE,qBAAa,gBAAgB;IAMzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAoC;gBAGjC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,cAAc;IAGnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyCtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,OAAO,CAAC,OAAO;CAWhB"}
@@ -0,0 +1,78 @@
1
+ /** Fail-closed attempt lease heartbeat. */
2
+ import { create } from "@bufbuild/protobuf";
3
+ import { AttemptHeartbeatRequestSchema } from "../generated/workflow/v1/runtime_pb.js";
4
+ import { WorkflowErrorCode } from "../generated/workflow/v1/common_pb.js";
5
+ import { getLogger } from "../logger.js";
6
+ import { heartbeatIntervalMs } from "./attempt.js";
7
+ import { WorkflowClientError } from "./client.js";
8
+ const logger = getLogger("agent_engine_runner_shared.workflow.heartbeat");
9
+ const LEASE_LOST_CODES = new Set([
10
+ WorkflowErrorCode.STALE_FENCE,
11
+ WorkflowErrorCode.UNAUTHORIZED,
12
+ WorkflowErrorCode.NOT_FOUND,
13
+ ]);
14
+ export class AttemptHeartbeat {
15
+ attempt;
16
+ client;
17
+ timer = null;
18
+ stopped = false;
19
+ inFlight = Promise.resolve();
20
+ constructor(attempt, client) {
21
+ this.attempt = attempt;
22
+ this.client = client;
23
+ }
24
+ async start() {
25
+ if (this.timer !== null) {
26
+ throw new Error("attempt heartbeat already started");
27
+ }
28
+ const request = this.request();
29
+ try {
30
+ await this.client.heartbeat(request);
31
+ }
32
+ catch (error) {
33
+ throw new Error("initial durable attempt heartbeat failed", {
34
+ cause: error,
35
+ });
36
+ }
37
+ const interval = heartbeatIntervalMs(this.attempt.heartbeatIntervalMs);
38
+ this.timer = setInterval(() => {
39
+ this.inFlight = this.inFlight.then(async () => {
40
+ if (this.stopped)
41
+ return;
42
+ try {
43
+ await this.client.heartbeat(request);
44
+ }
45
+ catch (error) {
46
+ if (error instanceof WorkflowClientError &&
47
+ LEASE_LOST_CODES.has(error.code)) {
48
+ this.stopped = true;
49
+ if (this.timer !== null)
50
+ clearInterval(this.timer);
51
+ logger.error({ err: error, attempt_id: this.attempt.attemptId }, "Durable attempt lease permanently lost");
52
+ return;
53
+ }
54
+ logger.warn({ err: error, attempt_id: this.attempt.attemptId }, "Failed to renew durable attempt lease; retrying");
55
+ }
56
+ });
57
+ }, interval);
58
+ this.timer.unref();
59
+ }
60
+ async stop() {
61
+ this.stopped = true;
62
+ if (this.timer !== null)
63
+ clearInterval(this.timer);
64
+ this.timer = null;
65
+ await this.inFlight;
66
+ }
67
+ request() {
68
+ if (this.attempt.workflowIdentity === undefined) {
69
+ throw new Error("AttemptContext.workflow_identity is required");
70
+ }
71
+ return create(AttemptHeartbeatRequestSchema, {
72
+ workflowIdentity: this.attempt.workflowIdentity,
73
+ attemptId: this.attempt.attemptId,
74
+ fencingToken: this.attempt.fencingToken,
75
+ ownerId: this.attempt.ownerId,
76
+ });
77
+ }
78
+ }
@@ -0,0 +1,14 @@
1
+ export { attemptStartRequestFromExecute, completeExecutionCommand, finalizeCurrentStepCommand, finalizeCurrentStepSuspensionsCommand, newDurabilityOwnerId, } from "./attempt.js";
2
+ export { ActivityDispatch, ActivityReplay, WorkflowClient, WorkflowClientError, encodeProtoJson, } from "./client.js";
3
+ export type { StartActivityResult } from "./client.js";
4
+ export { DurableActivityDeniedError, DurableActivityInterrupted, ReplayedActivityFailedError, buildActivityCommand, completedOutcome, failedOutcome, runSerialActivity, runStreamingActivity, unwrapActivityOutcome, valueToJson, } from "./activity.js";
5
+ export type { ActivityResolvedHook } from "./activity.js";
6
+ export { UnsupportedChildOperationFanOutError, activityRequiresReconstruction, allocateActivityOrdinal, advanceStepOrdinal, childOperationBoundaryScope, currentAttemptContext, currentOperationPath, currentPendingChildOperationBatch, currentStepOrdinal, interruptedActivities, observedActivityPositions, preallocateActivityOrdinals, preallocateChildOperationOrdinals, recordObservedActivity, recordInterruptedActivity, recordReconstructedActivityInterrupt, runWithAttemptContext, runWithOperationPathResolver, setActivityReconstructionIds, setPendingChildOperationBatch, toolActivityKey, } from "./context.js";
7
+ export type { ChildOperationBoundary, InterruptedActivity, OperationPathResolver, } from "./context.js";
8
+ export { AttemptHeartbeat } from "./heartbeat.js";
9
+ export { DurableMemoryState, validateDurableMemoryIdentity } from "./memory.js";
10
+ export * from "../generated/workflow/v1/activity_pb.js";
11
+ export * from "../generated/workflow/v1/common_pb.js";
12
+ export * from "../generated/workflow/v1/runtime_pb.js";
13
+ export * from "../generated/workflow/v1/state_pb.js";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,EAC9B,wBAAwB,EACxB,0BAA0B,EAC1B,qCAAqC,EACrC,oBAAoB,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,2BAA2B,EAC3B,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,oCAAoC,EACpC,8BAA8B,EAC9B,uBAAuB,EACvB,kBAAkB,EAClB,2BAA2B,EAC3B,qBAAqB,EACrB,oBAAoB,EACpB,iCAAiC,EACjC,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,EACzB,2BAA2B,EAC3B,iCAAiC,EACjC,sBAAsB,EACtB,yBAAyB,EACzB,oCAAoC,EACpC,qBAAqB,EACrB,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AAChF,cAAc,yCAAyC,CAAC;AACxD,cAAc,uCAAuC,CAAC;AACtD,cAAc,wCAAwC,CAAC;AACvD,cAAc,sCAAsC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { attemptStartRequestFromExecute, completeExecutionCommand, finalizeCurrentStepCommand, finalizeCurrentStepSuspensionsCommand, newDurabilityOwnerId, } from "./attempt.js";
2
+ export { ActivityDispatch, ActivityReplay, WorkflowClient, WorkflowClientError, encodeProtoJson, } from "./client.js";
3
+ export { DurableActivityDeniedError, DurableActivityInterrupted, ReplayedActivityFailedError, buildActivityCommand, completedOutcome, failedOutcome, runSerialActivity, runStreamingActivity, unwrapActivityOutcome, valueToJson, } from "./activity.js";
4
+ export { UnsupportedChildOperationFanOutError, activityRequiresReconstruction, allocateActivityOrdinal, advanceStepOrdinal, childOperationBoundaryScope, currentAttemptContext, currentOperationPath, currentPendingChildOperationBatch, currentStepOrdinal, interruptedActivities, observedActivityPositions, preallocateActivityOrdinals, preallocateChildOperationOrdinals, recordObservedActivity, recordInterruptedActivity, recordReconstructedActivityInterrupt, runWithAttemptContext, runWithOperationPathResolver, setActivityReconstructionIds, setPendingChildOperationBatch, toolActivityKey, } from "./context.js";
5
+ export { AttemptHeartbeat } from "./heartbeat.js";
6
+ export { DurableMemoryState, validateDurableMemoryIdentity } from "./memory.js";
7
+ export * from "../generated/workflow/v1/activity_pb.js";
8
+ export * from "../generated/workflow/v1/common_pb.js";
9
+ export * from "../generated/workflow/v1/runtime_pb.js";
10
+ export * from "../generated/workflow/v1/state_pb.js";
@@ -0,0 +1,17 @@
1
+ /** Durable activity synchronization with short-term Memory. */
2
+ import { type ActivityContext, type ActivityMemoryCommand } from "../generated/workflow/v1/activity_pb.js";
3
+ import type { WorkflowIdentity } from "../generated/workflow/v1/common_pb.js";
4
+ export interface WorkflowMemoryClient {
5
+ ensureMemoryWritten(command: ActivityMemoryCommand): Promise<void>;
6
+ }
7
+ export declare function validateDurableMemoryIdentity(identity: WorkflowIdentity | undefined, userId: string | null | undefined): void;
8
+ /** Own durable Memory projection, delivery, and pending user input. */
9
+ export declare class DurableMemoryState {
10
+ private pendingUserMessage;
11
+ private synchronization;
12
+ constructor(pendingUserMessage?: string | null);
13
+ synchronizeLlm(client: WorkflowMemoryClient, context: ActivityContext, result: unknown, userId: string | null | undefined): Promise<void>;
14
+ synchronizeTool(client: WorkflowMemoryClient, context: ActivityContext, result: unknown, userId: string | null | undefined, toolCallId: string | undefined, toolName: string): Promise<void>;
15
+ private synchronize;
16
+ }
17
+ //# sourceMappingURL=memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/workflow/memory.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAK/D,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAE3B,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAiB9E,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpE;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,gBAAgB,GAAG,SAAS,EACtC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,IAAI,CAYN;AAgGD,uEAAuE;AACvE,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,kBAAkB,CAAgB;IAC1C,OAAO,CAAC,eAAe,CAAoC;gBAE/C,kBAAkB,GAAE,MAAM,GAAG,IAAW;IAIpD,cAAc,CACZ,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAChC,OAAO,CAAC,IAAI,CAAC;IAuChB,eAAe,CACb,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACjC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC;IA+BhB,OAAO,CAAC,WAAW;CAyBpB"}