apcore-js 0.19.0 → 0.21.0

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 (193) hide show
  1. package/README.md +110 -9
  2. package/dist/acl.d.ts +18 -0
  3. package/dist/acl.d.ts.map +1 -1
  4. package/dist/acl.js +54 -17
  5. package/dist/acl.js.map +1 -1
  6. package/dist/async-task.d.ts +70 -16
  7. package/dist/async-task.d.ts.map +1 -1
  8. package/dist/async-task.js +212 -72
  9. package/dist/async-task.js.map +1 -1
  10. package/dist/builtin-steps.d.ts +16 -5
  11. package/dist/builtin-steps.d.ts.map +1 -1
  12. package/dist/builtin-steps.js +45 -28
  13. package/dist/builtin-steps.js.map +1 -1
  14. package/dist/config.d.ts +38 -0
  15. package/dist/config.d.ts.map +1 -1
  16. package/dist/config.js +163 -33
  17. package/dist/config.js.map +1 -1
  18. package/dist/context.d.ts.map +1 -1
  19. package/dist/context.js +12 -1
  20. package/dist/context.js.map +1 -1
  21. package/dist/errors.d.ts +32 -10
  22. package/dist/errors.d.ts.map +1 -1
  23. package/dist/errors.js +55 -16
  24. package/dist/errors.js.map +1 -1
  25. package/dist/events/circuit-breaker.d.ts +45 -0
  26. package/dist/events/circuit-breaker.d.ts.map +1 -0
  27. package/dist/events/circuit-breaker.js +115 -0
  28. package/dist/events/circuit-breaker.js.map +1 -0
  29. package/dist/events/emitter.d.ts +22 -1
  30. package/dist/events/emitter.d.ts.map +1 -1
  31. package/dist/events/emitter.js +66 -2
  32. package/dist/events/emitter.js.map +1 -1
  33. package/dist/events/index.d.ts +4 -2
  34. package/dist/events/index.d.ts.map +1 -1
  35. package/dist/events/index.js +3 -2
  36. package/dist/events/index.js.map +1 -1
  37. package/dist/events/subscribers.d.ts +33 -1
  38. package/dist/events/subscribers.d.ts.map +1 -1
  39. package/dist/events/subscribers.js +124 -1
  40. package/dist/events/subscribers.js.map +1 -1
  41. package/dist/executor.d.ts +10 -2
  42. package/dist/executor.d.ts.map +1 -1
  43. package/dist/executor.js +173 -52
  44. package/dist/executor.js.map +1 -1
  45. package/dist/generated/version.d.ts +1 -1
  46. package/dist/generated/version.js +1 -1
  47. package/dist/index.d.ts +35 -25
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +23 -17
  50. package/dist/index.js.map +1 -1
  51. package/dist/middleware/base.d.ts +25 -3
  52. package/dist/middleware/base.d.ts.map +1 -1
  53. package/dist/middleware/base.js +24 -0
  54. package/dist/middleware/base.js.map +1 -1
  55. package/dist/middleware/circuit-breaker.d.ts +54 -0
  56. package/dist/middleware/circuit-breaker.d.ts.map +1 -0
  57. package/dist/middleware/circuit-breaker.js +168 -0
  58. package/dist/middleware/circuit-breaker.js.map +1 -0
  59. package/dist/middleware/context-namespace.d.ts +30 -0
  60. package/dist/middleware/context-namespace.d.ts.map +1 -0
  61. package/dist/middleware/context-namespace.js +38 -0
  62. package/dist/middleware/context-namespace.js.map +1 -0
  63. package/dist/middleware/index.d.ts +7 -1
  64. package/dist/middleware/index.d.ts.map +1 -1
  65. package/dist/middleware/index.js +4 -1
  66. package/dist/middleware/index.js.map +1 -1
  67. package/dist/middleware/manager.d.ts +11 -4
  68. package/dist/middleware/manager.d.ts.map +1 -1
  69. package/dist/middleware/manager.js +25 -9
  70. package/dist/middleware/manager.js.map +1 -1
  71. package/dist/middleware/platform-notify.d.ts +8 -4
  72. package/dist/middleware/platform-notify.d.ts.map +1 -1
  73. package/dist/middleware/platform-notify.js +11 -7
  74. package/dist/middleware/platform-notify.js.map +1 -1
  75. package/dist/middleware/tracing.d.ts +50 -0
  76. package/dist/middleware/tracing.d.ts.map +1 -0
  77. package/dist/middleware/tracing.js +89 -0
  78. package/dist/middleware/tracing.js.map +1 -0
  79. package/dist/module.d.ts +94 -2
  80. package/dist/module.d.ts.map +1 -1
  81. package/dist/module.js +99 -2
  82. package/dist/module.js.map +1 -1
  83. package/dist/observability/batch-span-processor.d.ts +48 -0
  84. package/dist/observability/batch-span-processor.d.ts.map +1 -0
  85. package/dist/observability/batch-span-processor.js +89 -0
  86. package/dist/observability/batch-span-processor.js.map +1 -0
  87. package/dist/observability/context-logger.d.ts +54 -1
  88. package/dist/observability/context-logger.d.ts.map +1 -1
  89. package/dist/observability/context-logger.js +270 -6
  90. package/dist/observability/context-logger.js.map +1 -1
  91. package/dist/observability/error-history.d.ts +36 -7
  92. package/dist/observability/error-history.d.ts.map +1 -1
  93. package/dist/observability/error-history.js +169 -50
  94. package/dist/observability/error-history.js.map +1 -1
  95. package/dist/observability/index.d.ts +16 -5
  96. package/dist/observability/index.d.ts.map +1 -1
  97. package/dist/observability/index.js +8 -3
  98. package/dist/observability/index.js.map +1 -1
  99. package/dist/observability/metrics.d.ts +14 -1
  100. package/dist/observability/metrics.d.ts.map +1 -1
  101. package/dist/observability/metrics.js +23 -2
  102. package/dist/observability/metrics.js.map +1 -1
  103. package/dist/observability/prometheus-exporter.d.ts +37 -0
  104. package/dist/observability/prometheus-exporter.d.ts.map +1 -0
  105. package/dist/observability/prometheus-exporter.js +135 -0
  106. package/dist/observability/prometheus-exporter.js.map +1 -0
  107. package/dist/observability/storage.d.ts +43 -0
  108. package/dist/observability/storage.d.ts.map +1 -0
  109. package/dist/observability/storage.js +58 -0
  110. package/dist/observability/storage.js.map +1 -0
  111. package/dist/observability/store.d.ts +29 -0
  112. package/dist/observability/store.d.ts.map +1 -0
  113. package/dist/observability/store.js +36 -0
  114. package/dist/observability/store.js.map +1 -0
  115. package/dist/observability/usage-exporter.d.ts +58 -0
  116. package/dist/observability/usage-exporter.d.ts.map +1 -0
  117. package/dist/observability/usage-exporter.js +86 -0
  118. package/dist/observability/usage-exporter.js.map +1 -0
  119. package/dist/observability/usage.d.ts +18 -1
  120. package/dist/observability/usage.d.ts.map +1 -1
  121. package/dist/observability/usage.js +25 -3
  122. package/dist/observability/usage.js.map +1 -1
  123. package/dist/pipeline-config.d.ts +11 -0
  124. package/dist/pipeline-config.d.ts.map +1 -1
  125. package/dist/pipeline-config.js +36 -10
  126. package/dist/pipeline-config.js.map +1 -1
  127. package/dist/pipeline.d.ts +123 -2
  128. package/dist/pipeline.d.ts.map +1 -1
  129. package/dist/pipeline.js +249 -50
  130. package/dist/pipeline.js.map +1 -1
  131. package/dist/registry/index.d.ts +2 -0
  132. package/dist/registry/index.d.ts.map +1 -1
  133. package/dist/registry/index.js +1 -0
  134. package/dist/registry/index.js.map +1 -1
  135. package/dist/registry/multi-class.d.ts +71 -0
  136. package/dist/registry/multi-class.d.ts.map +1 -0
  137. package/dist/registry/multi-class.js +120 -0
  138. package/dist/registry/multi-class.js.map +1 -0
  139. package/dist/registry/registry.d.ts +246 -5
  140. package/dist/registry/registry.d.ts.map +1 -1
  141. package/dist/registry/registry.js +485 -16
  142. package/dist/registry/registry.js.map +1 -1
  143. package/dist/schema/annotations.d.ts.map +1 -1
  144. package/dist/schema/annotations.js +1 -0
  145. package/dist/schema/annotations.js.map +1 -1
  146. package/dist/schema/constants.d.ts +9 -0
  147. package/dist/schema/constants.d.ts.map +1 -0
  148. package/dist/schema/constants.js +9 -0
  149. package/dist/schema/constants.js.map +1 -0
  150. package/dist/schema/index.d.ts +1 -1
  151. package/dist/schema/index.d.ts.map +1 -1
  152. package/dist/schema/index.js +1 -1
  153. package/dist/schema/index.js.map +1 -1
  154. package/dist/schema/loader.d.ts +27 -3
  155. package/dist/schema/loader.d.ts.map +1 -1
  156. package/dist/schema/loader.js +137 -32
  157. package/dist/schema/loader.js.map +1 -1
  158. package/dist/schema/types.d.ts +4 -0
  159. package/dist/schema/types.d.ts.map +1 -1
  160. package/dist/schema/types.js.map +1 -1
  161. package/dist/schema/validator.d.ts +9 -0
  162. package/dist/schema/validator.d.ts.map +1 -1
  163. package/dist/schema/validator.js +153 -4
  164. package/dist/schema/validator.js.map +1 -1
  165. package/dist/sys-modules/audit.d.ts +50 -0
  166. package/dist/sys-modules/audit.d.ts.map +1 -0
  167. package/dist/sys-modules/audit.js +89 -0
  168. package/dist/sys-modules/audit.js.map +1 -0
  169. package/dist/sys-modules/control.d.ts +32 -4
  170. package/dist/sys-modules/control.d.ts.map +1 -1
  171. package/dist/sys-modules/control.js +196 -25
  172. package/dist/sys-modules/control.js.map +1 -1
  173. package/dist/sys-modules/index.d.ts +7 -2
  174. package/dist/sys-modules/index.d.ts.map +1 -1
  175. package/dist/sys-modules/index.js +3 -1
  176. package/dist/sys-modules/index.js.map +1 -1
  177. package/dist/sys-modules/overrides.d.ts +58 -0
  178. package/dist/sys-modules/overrides.d.ts.map +1 -0
  179. package/dist/sys-modules/overrides.js +106 -0
  180. package/dist/sys-modules/overrides.js.map +1 -0
  181. package/dist/sys-modules/registration.d.ts +17 -12
  182. package/dist/sys-modules/registration.d.ts.map +1 -1
  183. package/dist/sys-modules/registration.js +134 -23
  184. package/dist/sys-modules/registration.js.map +1 -1
  185. package/dist/sys-modules/toggle.d.ts +7 -2
  186. package/dist/sys-modules/toggle.d.ts.map +1 -1
  187. package/dist/sys-modules/toggle.js +61 -5
  188. package/dist/sys-modules/toggle.js.map +1 -1
  189. package/dist/trace-context.d.ts +47 -9
  190. package/dist/trace-context.d.ts.map +1 -1
  191. package/dist/trace-context.js +139 -16
  192. package/dist/trace-context.js.map +1 -1
  193. package/package.json +1 -1
@@ -1,6 +1,26 @@
1
1
  /**
2
- * Event subscribers for webhook and A2A protocol delivery.
2
+ * Event subscribers for webhook, A2A, file, stdout, and filter delivery.
3
3
  */
4
+ import * as fs from 'node:fs';
5
+ const SEVERITY_ORDER = { info: 0, warn: 1, error: 2, fatal: 3 };
6
+ const _patternCache = new Map();
7
+ function fnmatch(text, pattern) {
8
+ let regex = _patternCache.get(pattern);
9
+ if (regex === undefined) {
10
+ const regexStr = Array.from(pattern)
11
+ .map((c) => {
12
+ if (c === '*')
13
+ return '.*';
14
+ if (c === '?')
15
+ return '.';
16
+ return c.replace(/[$()*+.?[\]^{|}-]/g, '\\$&');
17
+ })
18
+ .join('');
19
+ regex = new RegExp(`^${regexStr}$`);
20
+ _patternCache.set(pattern, regex);
21
+ }
22
+ return regex.test(text);
23
+ }
4
24
  /**
5
25
  * Delivers events via HTTP POST to a webhook URL.
6
26
  *
@@ -129,4 +149,107 @@ export class A2ASubscriber {
129
149
  }
130
150
  }
131
151
  }
152
+ /** Writes events to a local file (built-in type: 'file'). */
153
+ export class FileSubscriber {
154
+ _path;
155
+ _append;
156
+ _format;
157
+ _rotateBytes;
158
+ constructor(path, append = true, format = 'json', rotateBytes) {
159
+ this._path = path;
160
+ this._append = append;
161
+ this._format = format;
162
+ this._rotateBytes = rotateBytes ?? null;
163
+ }
164
+ async onEvent(event) {
165
+ try {
166
+ if (this._rotateBytes !== null) {
167
+ try {
168
+ const stat = fs.statSync(this._path);
169
+ if (stat.size >= this._rotateBytes) {
170
+ fs.renameSync(this._path, `${this._path}.1`);
171
+ }
172
+ }
173
+ catch {
174
+ // file doesn't exist yet — no rotation needed
175
+ }
176
+ }
177
+ const line = this._format === 'json'
178
+ ? JSON.stringify({
179
+ event_type: event.eventType,
180
+ module_id: event.moduleId,
181
+ timestamp: event.timestamp,
182
+ severity: event.severity,
183
+ data: event.data,
184
+ }) + '\n'
185
+ : `[${event.timestamp}] [${event.severity.toUpperCase()}] ${event.eventType} module=${event.moduleId} data=${JSON.stringify(event.data)}\n`;
186
+ fs.writeFileSync(this._path, line, { flag: this._append ? 'a' : 'w', encoding: 'utf-8' });
187
+ }
188
+ catch (err) {
189
+ console.warn('[apcore:events]', `FileSubscriber failed to write event ${event.eventType} to ${this._path}:`, err);
190
+ }
191
+ }
192
+ }
193
+ /** Writes events to stdout (built-in type: 'stdout'). */
194
+ export class StdoutSubscriber {
195
+ _format;
196
+ _levelFilter;
197
+ constructor(format = 'text', levelFilter) {
198
+ this._format = format;
199
+ if (levelFilter !== undefined && !(levelFilter in SEVERITY_ORDER)) {
200
+ console.warn(`[apcore:events] StdoutSubscriber: unknown level_filter '${levelFilter}' — valid values: info, warn, error, fatal. All events will pass.`);
201
+ }
202
+ this._levelFilter = levelFilter ?? null;
203
+ }
204
+ async onEvent(event) {
205
+ if (this._levelFilter !== null) {
206
+ const minLevel = SEVERITY_ORDER[this._levelFilter] ?? 0;
207
+ const eventLevel = SEVERITY_ORDER[event.severity] ?? 0;
208
+ if (eventLevel < minLevel)
209
+ return;
210
+ }
211
+ const line = this._format === 'json'
212
+ ? JSON.stringify({
213
+ event_type: event.eventType,
214
+ module_id: event.moduleId,
215
+ timestamp: event.timestamp,
216
+ severity: event.severity,
217
+ data: event.data,
218
+ })
219
+ : `[${event.timestamp}] [${event.severity.toUpperCase()}] ${event.eventType} module=${event.moduleId} data=${JSON.stringify(event.data)}`;
220
+ process.stdout.write(line + '\n');
221
+ }
222
+ }
223
+ /**
224
+ * Wraps a delegate subscriber with event-name filtering (built-in type: 'filter').
225
+ *
226
+ * Matching rules (evaluated in order):
227
+ * 1. If include_events is set, forward only events matching any pattern.
228
+ * 2. Otherwise if exclude_events is set, discard events matching any pattern.
229
+ * 3. If neither is set, forward all events.
230
+ */
231
+ export class FilterSubscriber {
232
+ _delegate;
233
+ _includeEvents;
234
+ _excludeEvents;
235
+ constructor(delegate, includeEvents, excludeEvents) {
236
+ this._delegate = delegate;
237
+ this._includeEvents = includeEvents ?? null;
238
+ this._excludeEvents = excludeEvents ?? null;
239
+ }
240
+ async onEvent(event) {
241
+ if (this._matches(event.eventType)) {
242
+ await this._delegate.onEvent(event);
243
+ }
244
+ }
245
+ _matches(eventType) {
246
+ if (this._includeEvents !== null) {
247
+ return this._includeEvents.some((pattern) => fnmatch(eventType, pattern));
248
+ }
249
+ if (this._excludeEvents !== null) {
250
+ return !this._excludeEvents.some((pattern) => fnmatch(eventType, pattern));
251
+ }
252
+ return true;
253
+ }
254
+ }
132
255
  //# sourceMappingURL=subscribers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../src/events/subscribers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../src/events/subscribers.ts"],"names":[],"mappings":"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"}
@@ -8,11 +8,11 @@ import type { ACL } from './acl.js';
8
8
  import type { ApprovalHandler } from './approval.js';
9
9
  import type { Config } from './config.js';
10
10
  import { Context } from './context.js';
11
- import { Middleware } from './middleware/index.js';
11
+ import { type Middleware } from './middleware/index.js';
12
12
  import type { PreflightResult } from './module.js';
13
- import type { Registry } from './registry/registry.js';
14
13
  import type { PipelineTrace, StrategyInfo } from './pipeline.js';
15
14
  import { ExecutionStrategy } from './pipeline.js';
15
+ import type { Registry } from './registry/registry.js';
16
16
  import type { ToggleState } from './sys-modules/toggle.js';
17
17
  export declare const REDACTED_VALUE: string;
18
18
  /** Well-known context.data keys used internally by the runtime. */
@@ -62,6 +62,14 @@ export declare class Executor {
62
62
  useAfter(callback: (moduleId: string, inputs: Record<string, unknown>, output: Record<string, unknown>, context: Context) => Record<string, unknown> | null): Executor;
63
63
  remove(middleware: Middleware): boolean;
64
64
  call(moduleId: string, inputs?: Record<string, unknown> | null, context?: Context | null, versionHint?: string | null): Promise<Record<string, unknown>>;
65
+ /**
66
+ * Reset PipelineContext for another attempt triggered by a RetrySignal.
67
+ *
68
+ * Preserves the top-level Context (so retry counters in context.data carry
69
+ * across attempts) while clearing per-run fields that the next attempt
70
+ * will re-populate. (sync finding A-D-017)
71
+ */
72
+ private _resetPipeCtxForRetry;
65
73
  /**
66
74
  * Alias for call(). Provided for compatibility with MCP bridge packages
67
75
  * that may call callAsync() by convention.
@@ -1 +1 @@
1
- {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAMvC,OAAO,EAAqC,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEtF,OAAO,KAAK,EAAmD,eAAe,EAAE,MAAM,aAAa,CAAC;AAGpG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAmB,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAA6D,MAAM,eAAe,CAAC;AAW7G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG3D,eAAO,MAAM,cAAc,EAAE,MAAyB,CAAC;AAEvD,mEAAmE;AACnE,eAAO,MAAM,mBAAmB,qCAAqC,CAAC;AACtE,eAAO,MAAM,iBAAiB,6BAA6B,CAAC;AAE5D,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKzB;AAsDD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,KAAK,SAAI,GACR,IAAI,CAqBN;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,SAAS,CAAW;IAC5B,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,eAAe,CAAiB;IAExC,0DAA0D;IAC1D,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAwC;gBAE5D,OAAO,EAAE;QACnB,QAAQ,EAAE,QAAQ,CAAC;QACnB,QAAQ,CAAC,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAAC;QAC7C,WAAW,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAClC,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;QACzC,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;KAClC;IAiDD,uDAAuD;IACvD,OAAO,CAAC,kBAAkB;IAe1B,wDAAwD;IACxD,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAIxE,+CAA+C;IAC/C,MAAM,CAAC,cAAc,IAAI,YAAY,EAAE;IAIvC,gEAAgE;IAChE,gBAAgB,IAAI,YAAY;IAIhC,0CAA0C;IAC1C,IAAI,eAAe,IAAI,iBAAiB,CAEvC;IAED,MAAM,CAAC,YAAY,CACjB,QAAQ,EAAE,QAAQ,EAClB,WAAW,CAAC,EAAE,UAAU,EAAE,GAAG,IAAI,EACjC,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,EAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EACtB,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,GACvC,QAAQ;IAIX,IAAI,QAAQ,IAAI,QAAQ,CAEvB;IAED,IAAI,WAAW,IAAI,UAAU,EAAE,CAE9B;IAED,oGAAoG;IACpG,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAiBtB,kGAAkG;IAClG,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAiBlD,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,QAAQ;IAKrC,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,QAAQ;IAKtI,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,QAAQ;IAKtK,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO;IAIjC,IAAI,CACR,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACvC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,EACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IA0CnC;;;OAGG;IACG,SAAS,CACb,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACvC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,EACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAInC;;;;OAIG;IACG,aAAa,CACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACvC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,EACxB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,GACvD,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC;IAsBpD;;;;;;;;;;OAUG;IACH;;;;;;;;;OASG;IACI,MAAM,CACX,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACvC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,EACxB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAC1B,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAmG1C;;;;;;OAMG;IACG,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACvC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,GACvB,OAAO,CAAC,eAAe,CAAC;IA6F3B,8DAA8D;IAC9D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAQpC;IAEF,gEAAgE;IAChE,OAAO,CAAC,cAAc;IAetB,wDAAwD;IACxD,OAAO,CAAC,iBAAiB;IAQzB,yFAAyF;IACzF,OAAO,CAAC,cAAc;CAYvB"}
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
package/dist/executor.js CHANGED
@@ -4,15 +4,15 @@
4
4
  * Async-only execution pipeline. Python's call() + call_async() merge into one async call().
5
5
  * Timeout uses Promise.race instead of threading.
6
6
  */
7
- import { Context } from './context.js';
7
+ import { BuiltinACLCheck, BuiltinApprovalGate, buildInternalStrategy, buildMinimalStrategy, buildPerformanceStrategy, buildStandardStrategy, buildTestingStrategy, } from './builtin-steps.js';
8
8
  import { ExecutionCancelledError } from './cancel.js';
9
- import { InvalidInputError, ModuleError, } from './errors.js';
10
- import { AfterMiddleware, BeforeMiddleware } from './middleware/index.js';
9
+ import { Context } from './context.js';
10
+ import { InvalidInputError, ModuleError, ModuleTimeoutError } from './errors.js';
11
+ import { AfterMiddleware, BeforeMiddleware, RetrySignal, } from './middleware/index.js';
11
12
  import { MiddlewareChainError, MiddlewareManager } from './middleware/manager.js';
12
13
  import { createPreflightResult } from './module.js';
14
+ import { ExecutionStrategy, PipelineAbortError, PipelineEngine, PipelineStepError, StrategyNotFoundError, } from './pipeline.js';
13
15
  import { MODULE_ID_PATTERN } from './registry/registry.js';
14
- import { ExecutionStrategy, PipelineEngine, PipelineAbortError, StrategyNotFoundError } from './pipeline.js';
15
- import { BuiltinACLCheck, BuiltinApprovalGate, buildStandardStrategy, buildInternalStrategy, buildTestingStrategy, buildPerformanceStrategy, buildMinimalStrategy, } from './builtin-steps.js';
16
16
  import { propagateError } from './utils/error-propagation.js';
17
17
  export const REDACTED_VALUE = '***REDACTED***';
18
18
  /** Well-known context.data keys used internally by the runtime. */
@@ -38,7 +38,11 @@ function redactFields(data, schemaDict) {
38
38
  }
39
39
  continue;
40
40
  }
41
- if (fieldSchema['type'] === 'object' && 'properties' in fieldSchema && typeof value === 'object' && value !== null && !Array.isArray(value)) {
41
+ if (fieldSchema['type'] === 'object' &&
42
+ 'properties' in fieldSchema &&
43
+ typeof value === 'object' &&
44
+ value !== null &&
45
+ !Array.isArray(value)) {
42
46
  redactFields(value, fieldSchema);
43
47
  continue;
44
48
  }
@@ -171,7 +175,7 @@ export class Executor {
171
175
  }
172
176
  /** List info for all registered strategies. */
173
177
  static listStrategies() {
174
- return [...Executor._strategyRegistry.values()].map(s => s.info());
178
+ return [...Executor._strategyRegistry.values()].map((s) => s.info());
175
179
  }
176
180
  /** Describe the pipeline of the executor's current strategy. */
177
181
  describePipeline() {
@@ -252,29 +256,54 @@ export class Executor {
252
256
  trace: null,
253
257
  versionHint: versionHint ?? null,
254
258
  };
255
- try {
256
- const [output, _trace] = await this._pipelineEngine.run(this._strategy, pipeCtx);
257
- return (output ?? {});
258
- }
259
- catch (exc) {
260
- if (exc instanceof ExecutionCancelledError)
261
- throw exc;
262
- // Pipeline errors propagate with their original types (ModuleNotFoundError, etc.)
263
- // because builtin steps now throw directly. MiddlewareChainError wraps the
264
- // original; unwrap it so callers see the real error class/code instead of a
265
- // generic MODULE_EXECUTE_ERROR.
266
- const ctxObj = pipeCtx.context;
267
- const underlying = exc instanceof MiddlewareChainError ? exc.original : exc;
268
- const wrapped = propagateError(underlying, moduleId, ctxObj);
269
- const executedMw = pipeCtx.executedMiddlewares;
270
- if (executedMw && executedMw.length > 0) {
271
- const recovery = this._middlewareManager.executeOnError(moduleId, pipeCtx.inputs, wrapped, ctxObj, executedMw);
272
- if (recovery !== null)
273
- return recovery;
259
+ // Loop iterates only when a RetrySignal is returned from middleware
260
+ // onError; every other path returns or throws on the first attempt
261
+ // (sync finding A-D-017).
262
+ while (true) {
263
+ try {
264
+ const [output, _trace] = await this._pipelineEngine.run(this._strategy, pipeCtx);
265
+ return (output ?? {});
266
+ }
267
+ catch (exc) {
268
+ if (exc instanceof ExecutionCancelledError)
269
+ throw exc;
270
+ // PipelineStepError is the engine-level contract (§1.1). Unwrap the cause
271
+ // so the executor's public API surfaces the original typed error.
272
+ const unwrapped = exc instanceof PipelineStepError ? (exc.cause instanceof Error ? exc.cause : exc) : exc;
273
+ // MiddlewareChainError wraps the original; unwrap it so callers see the
274
+ // real error class/code instead of a generic MODULE_EXECUTE_ERROR.
275
+ const ctxObj = pipeCtx.context;
276
+ const underlying = unwrapped instanceof MiddlewareChainError ? unwrapped.original : unwrapped;
277
+ const wrapped = propagateError(underlying, moduleId, ctxObj);
278
+ const executedMw = pipeCtx.executedMiddlewares;
279
+ if (executedMw && executedMw.length > 0) {
280
+ const recovery = await this._middlewareManager.executeOnError(moduleId, pipeCtx.inputs, wrapped, ctxObj, executedMw);
281
+ if (recovery instanceof RetrySignal) {
282
+ this._resetPipeCtxForRetry(pipeCtx, recovery.inputs);
283
+ continue;
284
+ }
285
+ if (recovery !== null)
286
+ return recovery;
287
+ }
288
+ throw wrapped;
274
289
  }
275
- throw wrapped;
276
290
  }
277
291
  }
292
+ /**
293
+ * Reset PipelineContext for another attempt triggered by a RetrySignal.
294
+ *
295
+ * Preserves the top-level Context (so retry counters in context.data carry
296
+ * across attempts) while clearing per-run fields that the next attempt
297
+ * will re-populate. (sync finding A-D-017)
298
+ */
299
+ _resetPipeCtxForRetry(pipeCtx, newInputs) {
300
+ pipeCtx.inputs = newInputs;
301
+ pipeCtx.validatedInputs = null;
302
+ pipeCtx.module = null;
303
+ pipeCtx.output = null;
304
+ pipeCtx.validatedOutput = null;
305
+ pipeCtx.executedMiddlewares = [];
306
+ }
278
307
  /**
279
308
  * Alias for call(). Provided for compatibility with MCP bridge packages
280
309
  * that may call callAsync() by convention.
@@ -303,8 +332,18 @@ export class Executor {
303
332
  strategy,
304
333
  trace: null,
305
334
  };
306
- const [output, trace] = await this._pipelineEngine.run(strategy, pipelineCtx);
307
- return [(output ?? {}), trace];
335
+ try {
336
+ const [output, trace] = await this._pipelineEngine.run(strategy, pipelineCtx);
337
+ return [(output ?? {}), trace];
338
+ }
339
+ catch (exc) {
340
+ // Unwrap PipelineStepError so callers see the original typed cause, consistent
341
+ // with call() behaviour (§1.1 engine-level contract vs public API surface).
342
+ if (exc instanceof PipelineStepError && exc.cause instanceof Error) {
343
+ throw exc.cause;
344
+ }
345
+ throw exc;
346
+ }
308
347
  }
309
348
  /**
310
349
  * Streaming execution pipeline. If the module exposes a stream() async generator,
@@ -352,10 +391,15 @@ export class Executor {
352
391
  if (exc instanceof ExecutionCancelledError)
353
392
  throw exc;
354
393
  const ctxObj = pipeCtx.context;
355
- const wrapped = propagateError(exc, moduleId, ctxObj);
394
+ // Unwrap PipelineStepError to expose the original typed cause (§1.1).
395
+ const unwrapped = exc instanceof PipelineStepError ? (exc.cause instanceof Error ? exc.cause : exc) : exc;
396
+ const wrapped = propagateError(unwrapped, moduleId, ctxObj);
356
397
  if (pipeCtx.executedMiddlewares && pipeCtx.executedMiddlewares.length > 0) {
357
- const recovery = this._middlewareManager.executeOnError(moduleId, pipeCtx.inputs, wrapped, ctxObj, pipeCtx.executedMiddlewares);
358
- if (recovery !== null) {
398
+ const recovery = await this._middlewareManager.executeOnError(moduleId, pipeCtx.inputs, wrapped, ctxObj, pipeCtx.executedMiddlewares);
399
+ // RetrySignal is not supported in stream mode — re-running a stream
400
+ // mid-flight is not well-defined. Fall through to throwing the wrapped
401
+ // error so the caller sees a normal failure (sync finding A-D-017).
402
+ if (recovery !== null && !(recovery instanceof RetrySignal)) {
359
403
  yield recovery;
360
404
  return;
361
405
  }
@@ -370,8 +414,22 @@ export class Executor {
370
414
  // Phase 2: Iterate stream, accumulate chunks
371
415
  const outputStream = pipeCtx.outputStream;
372
416
  const accumulated = {};
417
+ // Read the canonical deadline slot written by BuiltinContextCreation
418
+ // (ms-since-epoch). The earlier `pipeCtx.context.globalDeadline` read was
419
+ // always null in the executor pipeline path because that field is a
420
+ // separate context attribute that the pipeline never populates — and the
421
+ // subsequent `Date.now() / 1000` divisor pretended the value was epoch
422
+ // seconds. (sync finding A-D-202.)
423
+ const globalDeadline = pipeCtx.context?.data?.[CTX_GLOBAL_DEADLINE] ?? null;
373
424
  try {
374
425
  for await (const chunk of outputStream) {
426
+ // Enforce global_deadline between chunks — matches apcore-python
427
+ // executor.py:872-879 (sync finding A-D-014). The slot is stored as
428
+ // ms-since-epoch (Date.now() + globalTimeout in BuiltinContextCreation),
429
+ // so compare against Date.now() directly.
430
+ if (globalDeadline !== null && Date.now() > globalDeadline) {
431
+ throw new ModuleTimeoutError(moduleId, 0);
432
+ }
375
433
  deepMergeChunk(accumulated, chunk);
376
434
  yield chunk;
377
435
  }
@@ -382,8 +440,9 @@ export class Executor {
382
440
  const ctxObj = pipeCtx.context;
383
441
  const wrapped = propagateError(exc, moduleId, ctxObj);
384
442
  if (pipeCtx.executedMiddlewares && pipeCtx.executedMiddlewares.length > 0) {
385
- const recovery = this._middlewareManager.executeOnError(moduleId, pipeCtx.inputs, wrapped, ctxObj, pipeCtx.executedMiddlewares);
386
- if (recovery !== null) {
443
+ const recovery = await this._middlewareManager.executeOnError(moduleId, pipeCtx.inputs, wrapped, ctxObj, pipeCtx.executedMiddlewares);
444
+ // RetrySignal not supported mid-stream (sync finding A-D-017).
445
+ if (recovery !== null && !(recovery instanceof RetrySignal)) {
387
446
  yield recovery;
388
447
  return;
389
448
  }
@@ -392,25 +451,39 @@ export class Executor {
392
451
  }
393
452
  // Phase 3: Output validation + middleware_after on accumulated result
394
453
  pipeCtx.output = accumulated;
395
- const postSteps = this._strategy.steps.filter((s) => s.name === 'output_validation' || s.name === 'middleware_after' || s.name === 'return_result');
454
+ const postSteps = this._strategy.steps.filter((s) => s.name === 'output_validation' ||
455
+ s.name === 'middleware_after' ||
456
+ s.name === 'return_result');
396
457
  if (postSteps.length > 0) {
397
- const postStrategy = new ExecutionStrategy('post_stream', postSteps);
458
+ // The post-stream sub-strategy starts with module + output already
459
+ // populated on pipeCtx (set by Phase 1 / Phase 2 above), so seed those
460
+ // names into the dependency check (§2.1).
461
+ const postStrategy = new ExecutionStrategy('post_stream', postSteps, {
462
+ seedProvides: ['module', 'output'],
463
+ });
398
464
  try {
399
465
  await this._pipelineEngine.run(postStrategy, pipeCtx);
400
466
  }
401
467
  catch (exc) {
402
468
  if (exc instanceof ExecutionCancelledError)
403
469
  throw exc;
404
- // Chunks already yielded cannot be un-yielded, but silently swallowing
405
- // hides real schema violations and after-middleware failures. Rethrow so
406
- // the consumer's async-iteration loop surfaces the error on the final
407
- // next() call (post-completion rejection in an async generator).
470
+ // Chunks are already delivered to the caller and cannot be recalled.
471
+ // Swallow the phase-3 error and log a warning — matches apcore-python
472
+ // executor.py:920 which emits an ApCoreEvent("apcore.stream.post_validation_failed")
473
+ // and does NOT re-raise (sync finding A-D-012).
474
+ // TODO: emit ApCoreEvent via injected EventEmitter when Executor gains
475
+ // an optional eventEmitter constructor field (pending architectural wiring).
408
476
  const ctxObj = pipeCtx.context;
409
- const wrapped = propagateError(exc, moduleId, ctxObj);
410
- if (pipeCtx.executedMiddlewares && pipeCtx.executedMiddlewares.length > 0) {
411
- this._middlewareManager.executeOnError(moduleId, pipeCtx.inputs, wrapped, ctxObj, pipeCtx.executedMiddlewares);
412
- }
413
- throw wrapped;
477
+ const unwrappedPost = exc instanceof PipelineStepError ? (exc.cause instanceof Error ? exc.cause : exc) : exc;
478
+ const wrapped = propagateError(unwrappedPost, moduleId, ctxObj);
479
+ // Sync finding A-D-011: phase-3 errors must NOT invoke middleware
480
+ // `on_error` once chunks have already been yielded. The middleware
481
+ // recovery contract is "produce a recovery output before any output is
482
+ // visible"; running on_error after partial-output emission breaks that
483
+ // contract. apcore-python and apcore-rust only log/emit at this point;
484
+ // TS now matches.
485
+ console.warn(`[apcore:executor] stream phase-3 failure for '${moduleId}' (chunks already delivered): ${wrapped.message}`);
486
+ // Do not rethrow — phase-3 errors are swallowed per spec.
414
487
  }
415
488
  }
416
489
  }
@@ -427,7 +500,8 @@ export class Executor {
427
500
  // Check 0: module_id format (before pipeline)
428
501
  if (!MODULE_ID_PATTERN.test(moduleId)) {
429
502
  checks.push({
430
- check: 'module_id', passed: false,
503
+ check: 'module_id',
504
+ passed: false,
431
505
  error: { code: 'INVALID_INPUT', message: `Invalid module ID: "${moduleId}"` },
432
506
  });
433
507
  return createPreflightResult(checks);
@@ -459,10 +533,17 @@ export class Executor {
459
533
  trace = e.pipelineTrace;
460
534
  }
461
535
  else {
462
- const errorDict = (e instanceof ModuleError)
463
- ? { code: e.code, message: e.message }
464
- : { code: e.constructor?.name ?? 'Error', message: String(e) };
465
- const code = (e instanceof ModuleError) ? e.code : e.constructor?.name ?? 'Error';
536
+ // Unwrap PipelineStepError to expose the original typed cause (§1.1).
537
+ const underlying = e instanceof PipelineStepError ? (e.cause instanceof Error ? e.cause : e) : e;
538
+ const errorDict = underlying instanceof ModuleError
539
+ ? { code: underlying.code, message: underlying.message }
540
+ : {
541
+ code: underlying.constructor?.name ?? 'Error',
542
+ message: String(underlying),
543
+ };
544
+ const code = underlying instanceof ModuleError
545
+ ? underlying.code
546
+ : (underlying.constructor?.name ?? 'Error');
466
547
  let checkName;
467
548
  if (code === 'MODULE_NOT_FOUND')
468
549
  checkName = 'module_lookup';
@@ -470,7 +551,9 @@ export class Executor {
470
551
  checkName = 'acl';
471
552
  else if (code === 'SCHEMA_VALIDATION_ERROR' || code === 'INVALID_INPUT')
472
553
  checkName = 'schema';
473
- else if (code === 'CALL_DEPTH_EXCEEDED' || code === 'CIRCULAR_CALL' || code === 'CALL_FREQUENCY_EXCEEDED')
554
+ else if (code === 'CALL_DEPTH_EXCEEDED' ||
555
+ code === 'CIRCULAR_CALL' ||
556
+ code === 'CALL_FREQUENCY_EXCEEDED')
474
557
  checkName = 'call_chain';
475
558
  else
476
559
  checkName = 'unknown';
@@ -511,7 +594,45 @@ export class Executor {
511
594
  }
512
595
  }
513
596
  }
514
- return createPreflightResult(checks, requiresApproval);
597
+ // Module-level preview() (optional, RFC `rfc-preview-method.md` — Draft / RFC).
598
+ // Invoked only after the standard validation pipeline has been processed.
599
+ // Returning null is equivalent to omitting the method. Exceptions (sync
600
+ // throws or async rejections) are treated as advisory warnings and do NOT
601
+ // fail validation, mirroring `preflight()` semantics (RFC Open Question 1).
602
+ let predictedChanges;
603
+ if (pipeCtx.module != null) {
604
+ const mod = pipeCtx.module;
605
+ const modWithPreview = mod;
606
+ if (typeof modWithPreview.preview === 'function') {
607
+ try {
608
+ const raw = modWithPreview.preview(effectiveInputs, pipeCtx.context);
609
+ // Support both sync and async preview() implementations.
610
+ const result = raw != null && typeof raw.then === 'function'
611
+ ? await raw
612
+ : raw;
613
+ if (result != null && Array.isArray(result.changes) && result.changes.length > 0) {
614
+ predictedChanges = result.changes;
615
+ checks.push({ check: 'module_preview', passed: true });
616
+ }
617
+ else {
618
+ // Method present but returned null / empty — record the no-op
619
+ // check so consumers can distinguish "module has preview()" from
620
+ // "module does not implement preview()" if desired.
621
+ checks.push({ check: 'module_preview', passed: true });
622
+ }
623
+ }
624
+ catch (exc) {
625
+ const excName = exc instanceof Error ? exc.constructor.name : 'Error';
626
+ const excMsg = exc instanceof Error ? exc.message : String(exc);
627
+ checks.push({
628
+ check: 'module_preview',
629
+ passed: true,
630
+ warnings: [`preview() raised ${excName}: ${excMsg}`],
631
+ });
632
+ }
633
+ }
634
+ }
635
+ return createPreflightResult(checks, requiresApproval, predictedChanges);
515
636
  }
516
637
  /** Map pipeline step names to PreflightResult check names. */
517
638
  static _STEP_TO_CHECK = {