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
@@ -0,0 +1,89 @@
1
+ /**
2
+ * TracingMiddleware — OpenTelemetry-compatible span lifecycle management (Issue #42).
3
+ *
4
+ * Behaviour:
5
+ * - before(): creates a span named after the module_id, sets apcore.* attributes,
6
+ * and stores the span_id in context.data["_apcore.mw.tracing.span_id"].
7
+ * - after(): ends the span with status OK.
8
+ * - onError(): ends the span with status ERROR.
9
+ * - If @opentelemetry/api is not installed (and no tracer is injected), all methods
10
+ * are silent no-ops.
11
+ */
12
+ import { createRequire } from 'node:module';
13
+ import { Middleware } from './base.js';
14
+ export const CTX_TRACING_SPAN_ID = '_apcore.mw.tracing.span_id';
15
+ // Internal key — stores the live Span object for retrieval in after()/onError().
16
+ // Not part of the public spec; not serialised; prefixed with _ to signal internal use.
17
+ const CTX_TRACING_SPAN = '_apcore.mw.tracing._active_span';
18
+ // OTel SpanStatusCode values (from @opentelemetry/api):
19
+ // UNSET = 0, OK = 1, ERROR = 2
20
+ const SPAN_STATUS_OK = 1;
21
+ const SPAN_STATUS_ERROR = 2;
22
+ // Attempt to load @opentelemetry/api synchronously via Node.js require.
23
+ // If the package is absent, _defaultTrace remains null and TracingMiddleware
24
+ // silently becomes a no-op unless a tracer is explicitly injected.
25
+ const _nodeRequire = createRequire(import.meta.url);
26
+ let _defaultTrace = null;
27
+ try {
28
+ _defaultTrace = _nodeRequire('@opentelemetry/api').trace;
29
+ }
30
+ catch {
31
+ _defaultTrace = null;
32
+ }
33
+ export class TracingMiddleware extends Middleware {
34
+ _tracer;
35
+ constructor(options = {}) {
36
+ super(options.priority ?? 800);
37
+ if ('tracer' in options) {
38
+ this._tracer = options.tracer ?? null;
39
+ }
40
+ else {
41
+ const name = options.serviceName ?? 'apcore';
42
+ this._tracer = _defaultTrace ? _defaultTrace.getTracer(name) : null;
43
+ }
44
+ }
45
+ /** Type-safe accessor for the active span stored by before(). */
46
+ _activeSpan(context) {
47
+ const val = context.data[CTX_TRACING_SPAN];
48
+ if (val == null)
49
+ return null;
50
+ // Minimal shape check: any valid OtelSpan must expose an `end` method.
51
+ if (typeof val === 'object' && typeof val.end === 'function') {
52
+ return val;
53
+ }
54
+ return null;
55
+ }
56
+ before(moduleId, _inputs, context) {
57
+ if (!this._tracer)
58
+ return null;
59
+ try {
60
+ const span = this._tracer.startSpan(moduleId);
61
+ span.setAttribute('apcore.trace_id', context.traceId);
62
+ span.setAttribute('apcore.caller_id', context.callerId ?? '');
63
+ span.setAttribute('apcore.module_id', moduleId);
64
+ context.data[CTX_TRACING_SPAN_ID] = span.spanContext().spanId;
65
+ context.data[CTX_TRACING_SPAN] = span;
66
+ }
67
+ catch (err) {
68
+ console.warn(`[apcore:middleware] TracingMiddleware: span creation failed for '${moduleId}':`, err);
69
+ }
70
+ return null;
71
+ }
72
+ after(_moduleId, _inputs, _output, context) {
73
+ const span = this._activeSpan(context);
74
+ if (span) {
75
+ span.setStatus({ code: SPAN_STATUS_OK });
76
+ span.end();
77
+ }
78
+ return null;
79
+ }
80
+ onError(_moduleId, _inputs, error, context) {
81
+ const span = this._activeSpan(context);
82
+ if (span) {
83
+ span.setStatus({ code: SPAN_STATUS_ERROR, message: String(error) });
84
+ span.end();
85
+ }
86
+ return null;
87
+ }
88
+ }
89
+ //# sourceMappingURL=tracing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../src/middleware/tracing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,CAAC,MAAM,mBAAmB,GAAG,4BAA4B,CAAC;AAChE,iFAAiF;AACjF,uFAAuF;AACvF,MAAM,gBAAgB,GAAG,iCAAiC,CAAC;AAE3D,wDAAwD;AACxD,iCAAiC;AACjC,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAa5B,wEAAwE;AACxE,6EAA6E;AAC7E,mEAAmE;AACnE,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpD,IAAI,aAAa,GAAmD,IAAI,CAAC;AACzE,IAAI,CAAC;IACH,aAAa,GAAI,YAAY,CAAC,oBAAoB,CAAqD,CAAC,KAAK,CAAC;AAChH,CAAC;AAAC,MAAM,CAAC;IACP,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAeD,MAAM,OAAO,iBAAkB,SAAQ,UAAU;IAC9B,OAAO,CAAoB;IAE5C,YAAY,UAAoC,EAAE;QAChD,KAAK,CAAC,OAAO,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC;QAE/B,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,IAAI,QAAQ,CAAC;YAC7C,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACtE,CAAC;IACH,CAAC;IAED,iEAAiE;IACzD,WAAW,CAAC,OAAgB;QAClC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC3C,IAAI,GAAG,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAC7B,uEAAuE;QACvE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAQ,GAAgB,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;YAC3E,OAAO,GAAe,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEQ,MAAM,CACb,QAAgB,EAChB,OAAgC,EAChC,OAAgB;QAEhB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAE/B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;YAC9D,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;YAEhD,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;QACxC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,oEAAoE,QAAQ,IAAI,EAAE,GAAG,CAAC,CAAC;QACtG,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEQ,KAAK,CACZ,SAAiB,EACjB,OAAgC,EAChC,OAAgC,EAChC,OAAgB;QAEhB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAEQ,OAAO,CACd,SAAiB,EACjB,OAAgC,EAChC,KAAY,EACZ,OAAgB;QAEhB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACpE,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
package/dist/module.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Module interface and related data types.
3
3
  */
4
- import type { TSchema } from '@sinclair/typebox';
4
+ import { type TSchema } from '@sinclair/typebox';
5
5
  import type { Context } from './context.js';
6
6
  export interface ModuleAnnotations {
7
7
  readonly readonly: boolean;
@@ -20,6 +20,19 @@ export interface ModuleAnnotations {
20
20
  readonly paginated: boolean;
21
21
  /** Pagination strategy. Accepts any string. */
22
22
  readonly paginationStyle: string;
23
+ /**
24
+ * Whether the module appears in enumeration surfaces (`Registry.list()`,
25
+ * `Registry.find()`, manifest export, MCP `tools/list`). Defaults to `true`
26
+ * so existing modules remain visible. Setting `false` keeps the module
27
+ * callable by exact ID but hides it from discovery — `ephemeral.*` modules
28
+ * SHOULD set this to `false` per PROTOCOL_SPEC §4.4 / RFC
29
+ * `apcore/docs/spec/rfc-ephemeral-modules.md`.
30
+ *
31
+ * Optional on the interface so v0.20.x callers building `ModuleAnnotations`
32
+ * literals keep compiling; absent values default to `true` per spec when
33
+ * `Registry._isDiscoverable` interprets them.
34
+ */
35
+ readonly discoverable?: boolean;
23
36
  /** Extension dictionary for ecosystem package metadata. */
24
37
  readonly extra: Readonly<Record<string, unknown>>;
25
38
  }
@@ -65,8 +78,74 @@ export interface PreflightResult {
65
78
  readonly checks: PreflightCheckResult[];
66
79
  readonly requiresApproval: boolean;
67
80
  readonly errors: Array<Record<string, unknown>>;
81
+ /**
82
+ * Optional. Module-self-reported structured prediction of the changes that
83
+ * executing the call would produce, populated by `Executor.validate()` when
84
+ * the target module implements `preview()` (see RFC
85
+ * `apcore/docs/spec/rfc-preview-method.md`, currently Draft / RFC).
86
+ *
87
+ * - Absent (or empty) when the module does not implement `preview()` or
88
+ * when `preview()` returned `null`.
89
+ * - When `preview()` throws, `predictedChanges` is left unset and a
90
+ * `module_preview` advisory check carries the warning, mirroring
91
+ * `preflight()` semantics (warnings do not fail validation).
92
+ */
93
+ readonly predictedChanges?: Change[];
68
94
  }
69
- export declare function createPreflightResult(checks: PreflightCheckResult[], requiresApproval?: boolean): PreflightResult;
95
+ export declare function createPreflightResult(checks: PreflightCheckResult[], requiresApproval?: boolean, predictedChanges?: Change[]): PreflightResult;
96
+ /**
97
+ * Structured prediction of a single side-effect that executing a module call
98
+ * would produce. Per RFC `apcore/docs/spec/rfc-preview-method.md`
99
+ * (Draft / RFC, target acceptance v0.21.0).
100
+ *
101
+ * `action`, `target`, and `summary` are required; module authors define their
102
+ * own free-form taxonomy for `action` (e.g. "write", "delete", "send",
103
+ * "charge", "publish") and `target` (e.g. "users.42", "smtp:user@example.com").
104
+ *
105
+ * `before` / `after` are optional snapshots of prior / predicted state. Both
106
+ * are typed `unknown` to keep the schema heterogeneous across module classes
107
+ * (DB writes, network calls, file I/O, email sends).
108
+ *
109
+ * Extension fields with the `x-` prefix are permitted (consistent with
110
+ * PROTOCOL_SPEC §4.4 extras).
111
+ */
112
+ export interface Change {
113
+ /** Free-form verb describing the kind of change (e.g. "write", "delete", "send"). */
114
+ action: string;
115
+ /** Free-form identifier of what is changed (e.g. "users.42", "stripe:charge:ch_abc"). */
116
+ target: string;
117
+ /** Required, human-readable single-line summary of the change. */
118
+ summary: string;
119
+ /** Optional. Snapshot of the prior state, when observable. */
120
+ before?: unknown;
121
+ /** Optional. Predicted new state. */
122
+ after?: unknown;
123
+ /** Extension fields. Keys MUST start with the `x-` prefix. */
124
+ [key: `x-${string}`]: unknown;
125
+ }
126
+ /**
127
+ * Module's structured prediction of the changes that calling `execute()` with
128
+ * the given inputs would produce. Returned by the optional `Module.preview()`
129
+ * method; folded into `PreflightResult.predictedChanges` by
130
+ * `Executor.validate()`.
131
+ */
132
+ export interface PreviewResult {
133
+ /** Ordered list of predicted side-effects. */
134
+ changes: Change[];
135
+ }
136
+ /**
137
+ * TypeBox schema mirroring `Change`. Exported alongside the TypeScript type
138
+ * for runtime validation / wire-format use. Mirrors the JSON Schema sketch in
139
+ * `apcore/docs/spec/rfc-preview-method.md`. The raw JSON Schema body
140
+ * (`type`, `required`, `properties`, `patternProperties`,
141
+ * `additionalProperties: false`) is the canonical cross-SDK wire format; the
142
+ * `[Kind]` field routes `Value.Check` to the registered checker above.
143
+ */
144
+ export declare const TChange: import("@sinclair/typebox").TUnsafe<Change>;
145
+ /** TypeBox schema mirroring `PreviewResult`. */
146
+ export declare const TPreviewResult: import("@sinclair/typebox").TObject<{
147
+ changes: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TUnsafe<Change>>;
148
+ }>;
70
149
  export interface Module {
71
150
  inputSchema: TSchema;
72
151
  outputSchema: TSchema;
@@ -78,6 +157,19 @@ export interface Module {
78
157
  validate?(inputs: Record<string, unknown>): ValidationResult | Promise<ValidationResult>;
79
158
  /** Optional: Domain-specific pre-execution warnings (called by Executor.validate() Check 7). Advisory only — warnings do NOT block execution. */
80
159
  preflight?(inputs: Record<string, unknown>, context: Context): string[] | Promise<string[]>;
160
+ /**
161
+ * Optional: Return a structured prediction of the changes this call would
162
+ * produce. Invoked by `Executor.validate()` after the standard validation
163
+ * pipeline succeeds, only on modules that implement it.
164
+ *
165
+ * Per RFC `apcore/docs/spec/rfc-preview-method.md` (currently Draft / RFC):
166
+ * - MUST NOT have side effects.
167
+ * - Returning `null` (or omitting the method) means "no predicted changes".
168
+ * - Throwing / rejecting is treated as advisory and does NOT fail validation.
169
+ * The error is surfaced as a warning via the `module_preview` check,
170
+ * matching `preflight()` semantics.
171
+ */
172
+ preview?(inputs: Record<string, unknown>, context: Context): PreviewResult | null | Promise<PreviewResult | null>;
81
173
  /** Optional: Return module description for LLM/AI tool discovery. */
82
174
  describe?(): ModuleDescription | Promise<ModuleDescription>;
83
175
  /** Optional: Called when module is loaded into the registry. */
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
package/dist/module.js CHANGED
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Module interface and related data types.
3
3
  */
4
+ import { Kind, Type, TypeRegistry } from '@sinclair/typebox';
4
5
  export const DEFAULT_ANNOTATIONS = Object.freeze({
5
6
  readonly: false,
6
7
  destructive: false,
@@ -13,6 +14,7 @@ export const DEFAULT_ANNOTATIONS = Object.freeze({
13
14
  cacheKeyFields: null,
14
15
  paginated: false,
15
16
  paginationStyle: 'cursor',
17
+ discoverable: true,
16
18
  extra: Object.freeze({}),
17
19
  });
18
20
  /**
@@ -35,7 +37,7 @@ export function createAnnotations(overrides) {
35
37
  const KNOWN_WIRE_KEYS = new Set([
36
38
  'readonly', 'destructive', 'idempotent', 'requires_approval',
37
39
  'open_world', 'streaming', 'cacheable', 'cache_ttl',
38
- 'cache_key_fields', 'paginated', 'pagination_style', 'extra',
40
+ 'cache_key_fields', 'paginated', 'pagination_style', 'discoverable', 'extra',
39
41
  ]);
40
42
  /**
41
43
  * Serialize ModuleAnnotations to a snake_case JSON-compatible record.
@@ -53,6 +55,7 @@ export function annotationsToJSON(a) {
53
55
  cache_key_fields: a.cacheKeyFields,
54
56
  paginated: a.paginated,
55
57
  pagination_style: a.paginationStyle,
58
+ discoverable: a.discoverable,
56
59
  extra: a.extra,
57
60
  };
58
61
  }
@@ -90,15 +93,109 @@ export function annotationsFromJSON(data) {
90
93
  cacheKeyFields: data['cache_key_fields'] ?? null,
91
94
  paginated: data['paginated'] ?? false,
92
95
  paginationStyle: data['pagination_style'] ?? 'cursor',
96
+ // PROTOCOL_SPEC §4.4 — defaults to true so wires from older SDKs that
97
+ // don't yet emit the field stay backward-compatible.
98
+ discoverable: data['discoverable'] ?? true,
93
99
  // §4.4.1 rule 7: nested explicit `extra` wins over legacy top-level overflow.
94
100
  extra: Object.freeze({ ...overflow, ...explicitExtra }),
95
101
  });
96
102
  }
97
- export function createPreflightResult(checks, requiresApproval = false) {
103
+ export function createPreflightResult(checks, requiresApproval = false, predictedChanges) {
98
104
  const valid = checks.every(c => c.passed);
99
105
  const errors = checks
100
106
  .filter(c => !c.passed && c.error != null)
101
107
  .map(c => c.error);
108
+ if (predictedChanges !== undefined) {
109
+ return { valid, checks, requiresApproval, errors, predictedChanges };
110
+ }
102
111
  return { valid, checks, requiresApproval, errors };
103
112
  }
113
+ /**
114
+ * Custom TypeBox kind for `Change`.
115
+ *
116
+ * Encoded via `Type.Unsafe<Change>(...)` so the underlying JSON Schema can
117
+ * carry both `patternProperties: { "^x-": {} }` (admitting arbitrary `x-*`
118
+ * extension keys per PROTOCOL_SPEC §4.4 / §4.6 conventions) and
119
+ * `additionalProperties: false` (rejecting unknown non-`x-` keys). TypeBox
120
+ * 0.34's `Type.Object` schema-checker does not consult `patternProperties`,
121
+ * so a `Type.Object({...}, { additionalProperties: false })` form would
122
+ * incorrectly reject `x-*` keys; and `Type.Intersect([Object, Record])`
123
+ * loses `additionalProperties: false` precision. The cross-SDK
124
+ * schema-encoding table in `apcore/docs/spec/rfc-preview-method.md`
125
+ * ("Change.x-* extension fields") prescribes the `Type.Unsafe` escape hatch.
126
+ *
127
+ * To make the schema usable with `Value.Check` (which routes by `[Kind]`), we
128
+ * register a custom `'apcore:Change'` kind whose checker enforces the same
129
+ * shape the JSON Schema describes. The JSON Schema body remains the canonical
130
+ * cross-SDK wire form.
131
+ */
132
+ const CHANGE_KIND = 'apcore:Change';
133
+ if (!TypeRegistry.Has(CHANGE_KIND)) {
134
+ TypeRegistry.Set(CHANGE_KIND, (_schema, value) => {
135
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
136
+ return false;
137
+ }
138
+ const v = value;
139
+ if (typeof v.action !== 'string')
140
+ return false;
141
+ if (typeof v.target !== 'string')
142
+ return false;
143
+ if (typeof v.summary !== 'string')
144
+ return false;
145
+ const known = new Set(['action', 'target', 'summary', 'before', 'after']);
146
+ for (const key of Object.keys(v)) {
147
+ if (known.has(key))
148
+ continue;
149
+ // Anything else MUST start with `x-` (any value).
150
+ if (!key.startsWith('x-'))
151
+ return false;
152
+ }
153
+ return true;
154
+ });
155
+ }
156
+ /**
157
+ * TypeBox schema mirroring `Change`. Exported alongside the TypeScript type
158
+ * for runtime validation / wire-format use. Mirrors the JSON Schema sketch in
159
+ * `apcore/docs/spec/rfc-preview-method.md`. The raw JSON Schema body
160
+ * (`type`, `required`, `properties`, `patternProperties`,
161
+ * `additionalProperties: false`) is the canonical cross-SDK wire format; the
162
+ * `[Kind]` field routes `Value.Check` to the registered checker above.
163
+ */
164
+ export const TChange = Type.Unsafe({
165
+ [Kind]: CHANGE_KIND,
166
+ type: 'object',
167
+ required: ['action', 'target', 'summary'],
168
+ properties: {
169
+ action: {
170
+ type: 'string',
171
+ description: 'Free-form verb describing the kind of change.',
172
+ },
173
+ target: {
174
+ type: 'string',
175
+ description: 'Free-form identifier of what is changed.',
176
+ },
177
+ summary: {
178
+ type: 'string',
179
+ description: 'Required, human-readable single-line summary of the change.',
180
+ },
181
+ before: {
182
+ // unknown — module-class specific. JSON Schema `{}` accepts any value.
183
+ description: 'Optional. Snapshot of the prior state, when observable.',
184
+ },
185
+ after: {
186
+ description: 'Optional. Predicted new state.',
187
+ },
188
+ },
189
+ patternProperties: {
190
+ // Arbitrary x-* extension keys with arbitrary values (PROTOCOL_SPEC §4.4).
191
+ '^x-': {},
192
+ },
193
+ additionalProperties: false,
194
+ });
195
+ /** TypeBox schema mirroring `PreviewResult`. */
196
+ export const TPreviewResult = Type.Object({
197
+ changes: Type.Array(TChange, {
198
+ description: "Module's prediction of what would change if the call were executed.",
199
+ }),
200
+ });
104
201
  //# sourceMappingURL=module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Span processors: SimpleSpanProcessor (synchronous) and BatchSpanProcessor (async, non-blocking).
3
+ */
4
+ import type { Span, SpanExporter } from './tracing.js';
5
+ export interface SpanProcessor {
6
+ onSpan(span: Span): void;
7
+ shutdown(): Promise<void>;
8
+ }
9
+ /** Synchronous processor — exports each span immediately. For development and testing. */
10
+ export declare class SimpleSpanProcessor implements SpanProcessor {
11
+ private readonly _exporter;
12
+ constructor(options: {
13
+ exporter: SpanExporter;
14
+ });
15
+ onSpan(span: Span): void;
16
+ shutdown(): Promise<void>;
17
+ }
18
+ export interface BatchSpanProcessorOptions {
19
+ exporter: SpanExporter;
20
+ maxQueueSize?: number;
21
+ scheduleDelayMs?: number;
22
+ maxExportBatchSize?: number;
23
+ exportTimeoutMs?: number;
24
+ }
25
+ /**
26
+ * Non-blocking batch processor — buffers spans and exports in background.
27
+ *
28
+ * When the queue is full, new spans are dropped and spansDropped is incremented.
29
+ * On shutdown, remaining spans are flushed within exportTimeoutMs.
30
+ */
31
+ export declare class BatchSpanProcessor implements SpanProcessor {
32
+ private readonly _exporter;
33
+ private readonly _maxQueueSize;
34
+ private readonly _scheduleDelayMs;
35
+ private readonly _maxExportBatchSize;
36
+ private readonly _exportTimeoutMs;
37
+ private _queue;
38
+ private _spansDropped;
39
+ private _timer;
40
+ constructor(options: BatchSpanProcessorOptions);
41
+ get queueSize(): number;
42
+ get spansDropped(): number;
43
+ onSpan(span: Span): void;
44
+ shutdown(): Promise<void>;
45
+ private _startTimer;
46
+ private _flush;
47
+ }
48
+ //# sourceMappingURL=batch-span-processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-span-processor.d.ts","sourceRoot":"","sources":["../../src/observability/batch-span-processor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,0FAA0F;AAC1F,qBAAa,mBAAoB,YAAW,aAAa;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,OAAO,EAAE;QAAE,QAAQ,EAAE,YAAY,CAAA;KAAE;IAI/C,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAIlB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,YAAY,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,MAAM,CAA+C;gBAEjD,OAAO,EAAE,yBAAyB;IAS9C,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAQlB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB/B,OAAO,CAAC,WAAW;YAUL,MAAM;CAQrB"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Span processors: SimpleSpanProcessor (synchronous) and BatchSpanProcessor (async, non-blocking).
3
+ */
4
+ /** Synchronous processor — exports each span immediately. For development and testing. */
5
+ export class SimpleSpanProcessor {
6
+ _exporter;
7
+ constructor(options) {
8
+ this._exporter = options.exporter;
9
+ }
10
+ onSpan(span) {
11
+ this._exporter.export(span);
12
+ }
13
+ async shutdown() { }
14
+ }
15
+ /**
16
+ * Non-blocking batch processor — buffers spans and exports in background.
17
+ *
18
+ * When the queue is full, new spans are dropped and spansDropped is incremented.
19
+ * On shutdown, remaining spans are flushed within exportTimeoutMs.
20
+ */
21
+ export class BatchSpanProcessor {
22
+ _exporter;
23
+ _maxQueueSize;
24
+ _scheduleDelayMs;
25
+ _maxExportBatchSize;
26
+ _exportTimeoutMs;
27
+ _queue = [];
28
+ _spansDropped = 0;
29
+ _timer = null;
30
+ constructor(options) {
31
+ this._exporter = options.exporter;
32
+ this._maxQueueSize = options.maxQueueSize ?? 2048;
33
+ this._scheduleDelayMs = options.scheduleDelayMs ?? 5000;
34
+ this._maxExportBatchSize = options.maxExportBatchSize ?? 512;
35
+ this._exportTimeoutMs = options.exportTimeoutMs ?? 30000;
36
+ this._startTimer();
37
+ }
38
+ get queueSize() {
39
+ return this._queue.length;
40
+ }
41
+ get spansDropped() {
42
+ return this._spansDropped;
43
+ }
44
+ onSpan(span) {
45
+ if (this._queue.length >= this._maxQueueSize) {
46
+ this._spansDropped++;
47
+ return;
48
+ }
49
+ this._queue.push(span);
50
+ }
51
+ async shutdown() {
52
+ if (this._timer !== null) {
53
+ clearInterval(this._timer);
54
+ this._timer = null;
55
+ }
56
+ let timeoutId = null;
57
+ const timeoutPromise = new Promise((_, reject) => {
58
+ timeoutId = setTimeout(() => reject(new Error('Export timeout')), this._exportTimeoutMs);
59
+ });
60
+ try {
61
+ await Promise.race([this._flush(), timeoutPromise]);
62
+ }
63
+ catch {
64
+ this._queue = [];
65
+ }
66
+ finally {
67
+ if (timeoutId !== null)
68
+ clearTimeout(timeoutId);
69
+ }
70
+ }
71
+ _startTimer() {
72
+ this._timer = setInterval(() => {
73
+ void this._flush();
74
+ }, this._scheduleDelayMs);
75
+ // Prevent the timer from keeping the Node.js event loop alive in tests
76
+ if (typeof this._timer.unref === 'function') {
77
+ this._timer.unref();
78
+ }
79
+ }
80
+ async _flush() {
81
+ while (this._queue.length > 0) {
82
+ const batch = this._queue.splice(0, this._maxExportBatchSize);
83
+ for (const span of batch) {
84
+ this._exporter.export(span);
85
+ }
86
+ }
87
+ }
88
+ }
89
+ //# sourceMappingURL=batch-span-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-span-processor.js","sourceRoot":"","sources":["../../src/observability/batch-span-processor.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,0FAA0F;AAC1F,MAAM,OAAO,mBAAmB;IACb,SAAS,CAAe;IAEzC,YAAY,OAAmC;QAC7C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,IAAU;QACf,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,QAAQ,KAAmB,CAAC;CACnC;AAUD;;;;;GAKG;AACH,MAAM,OAAO,kBAAkB;IACZ,SAAS,CAAe;IACxB,aAAa,CAAS;IACtB,gBAAgB,CAAS;IACzB,mBAAmB,CAAS;IAC5B,gBAAgB,CAAS;IAClC,MAAM,GAAW,EAAE,CAAC;IACpB,aAAa,GAAG,CAAC,CAAC;IAClB,MAAM,GAA0C,IAAI,CAAC;IAE7D,YAAY,OAAkC;QAC5C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC;QAClD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC;QACxD,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,IAAI,GAAG,CAAC;QAC7D,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,eAAe,IAAI,KAAK,CAAC;QACzD,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,IAAU;QACf,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC7C,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,IAAI,SAAS,GAAyC,IAAI,CAAC;QAC3D,MAAM,cAAc,GAAG,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACrD,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,IAAI,SAAS,KAAK,IAAI;gBAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7B,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC1B,uEAAuE;QACvE,IAAI,OAAQ,IAAI,CAAC,MAA4C,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAClF,IAAI,CAAC,MAA2C,CAAC,KAAK,EAAE,CAAC;QAC5D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAC9D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -1,8 +1,59 @@
1
1
  /**
2
- * Structured logging: ContextLogger and ObsLoggingMiddleware.
2
+ * Structured logging: ContextLogger, RedactionConfig, and ObsLoggingMiddleware.
3
3
  */
4
+ import type { Config } from '../config.js';
4
5
  import type { Context } from '../context.js';
5
6
  import { Middleware } from '../middleware/base.js';
7
+ /**
8
+ * Default sensitive field patterns (Issue #45 §3 — canonical superset
9
+ * promoted from #43 §5). Used when no `redaction.sensitive_keys`
10
+ * (canonical) / `redaction.field_patterns` (legacy) is configured.
11
+ * Wildcards follow apcore's `matchPattern` semantics (segment-aware globs).
12
+ *
13
+ * Aligned with apcore-python's authoritative list (Python is the canonical
14
+ * superset because broader default redaction is safer than narrower).
15
+ * `apiKey` is kept alongside `api_key` / `apikey` for camelCase parity
16
+ * because TypeScript's `matchPattern` is case-sensitive.
17
+ */
18
+ export declare const DEFAULT_REDACTION_FIELD_PATTERNS: readonly string[];
19
+ /**
20
+ * Runtime-configurable redaction rules for ObsLoggingMiddleware.
21
+ * Applied in addition to schema-level x-sensitive annotations.
22
+ */
23
+ export declare class RedactionConfig {
24
+ readonly fieldPatterns: readonly string[];
25
+ readonly valuePatterns: readonly (RegExp | string)[];
26
+ readonly replacement: string;
27
+ constructor(options?: {
28
+ fieldPatterns?: string[];
29
+ valuePatterns?: (RegExp | string)[];
30
+ replacement?: string;
31
+ });
32
+ /**
33
+ * Build a RedactionConfig from an apcore {@link Config}.
34
+ *
35
+ * Reads canonical keys first (sync finding CRITICAL #4 — aligns with
36
+ * apcore-python / apcore-rust):
37
+ * - `obs.redaction.sensitive_keys` (string[])
38
+ * - `obs.redaction.regex_patterns` (string[]; compiled case-insensitively)
39
+ * - `obs.redaction.replacement` (string)
40
+ *
41
+ * For backwards compatibility, falls back to legacy keys (Issue #43 §5)
42
+ * when the canonical key is unset, and emits a one-shot deprecation
43
+ * warning the first time a legacy key is read:
44
+ * - `observability.redaction.field_patterns` (legacy of sensitive_keys)
45
+ * - `observability.redaction.value_patterns` (legacy of regex_patterns)
46
+ * - `observability.redaction.replacement` (legacy of replacement)
47
+ *
48
+ * Falls back to {@link DEFAULT_REDACTION_FIELD_PATTERNS} when no sensitive
49
+ * keys are configured so `_secret_*` and standard sensitive keys (apiKey,
50
+ * api_key, token, authorization, password) remain redacted out of the box.
51
+ */
52
+ static fromConfig(config: Config): RedactionConfig;
53
+ /** Apply redaction rules to a flat object of field name → value. */
54
+ apply(obj: Record<string, unknown>): Record<string, unknown>;
55
+ private _shouldRedact;
56
+ }
6
57
  interface WritableOutput {
7
58
  write(s: string): void;
8
59
  }
@@ -41,10 +92,12 @@ export declare class ObsLoggingMiddleware extends Middleware {
41
92
  private _logger;
42
93
  private _logInputs;
43
94
  private _logOutputs;
95
+ private _redactionConfig;
44
96
  constructor(options?: {
45
97
  logger?: ContextLogger;
46
98
  logInputs?: boolean;
47
99
  logOutputs?: boolean;
100
+ redactionConfig?: RedactionConfig | null;
48
101
  });
49
102
  before(moduleId: string, inputs: Record<string, unknown>, context: Context): null;
50
103
  after(moduleId: string, _inputs: Record<string, unknown>, output: Record<string, unknown>, context: Context): null;
@@ -1 +1 @@
1
- {"version":3,"file":"context-logger.d.ts","sourceRoot":"","sources":["../../src/observability/context-logger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-logger.d.ts","sourceRoot":"","sources":["../../src/observability/context-logger.ts"],"names":[],"mappings":"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"}