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.
- package/README.md +110 -9
- package/dist/acl.d.ts +18 -0
- package/dist/acl.d.ts.map +1 -1
- package/dist/acl.js +54 -17
- package/dist/acl.js.map +1 -1
- package/dist/async-task.d.ts +70 -16
- package/dist/async-task.d.ts.map +1 -1
- package/dist/async-task.js +212 -72
- package/dist/async-task.js.map +1 -1
- package/dist/builtin-steps.d.ts +16 -5
- package/dist/builtin-steps.d.ts.map +1 -1
- package/dist/builtin-steps.js +45 -28
- package/dist/builtin-steps.js.map +1 -1
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +163 -33
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +12 -1
- package/dist/context.js.map +1 -1
- package/dist/errors.d.ts +32 -10
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +55 -16
- package/dist/errors.js.map +1 -1
- package/dist/events/circuit-breaker.d.ts +45 -0
- package/dist/events/circuit-breaker.d.ts.map +1 -0
- package/dist/events/circuit-breaker.js +115 -0
- package/dist/events/circuit-breaker.js.map +1 -0
- package/dist/events/emitter.d.ts +22 -1
- package/dist/events/emitter.d.ts.map +1 -1
- package/dist/events/emitter.js +66 -2
- package/dist/events/emitter.js.map +1 -1
- package/dist/events/index.d.ts +4 -2
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +3 -2
- package/dist/events/index.js.map +1 -1
- package/dist/events/subscribers.d.ts +33 -1
- package/dist/events/subscribers.d.ts.map +1 -1
- package/dist/events/subscribers.js +124 -1
- package/dist/events/subscribers.js.map +1 -1
- package/dist/executor.d.ts +10 -2
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +173 -52
- package/dist/executor.js.map +1 -1
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/index.d.ts +35 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -17
- package/dist/index.js.map +1 -1
- package/dist/middleware/base.d.ts +25 -3
- package/dist/middleware/base.d.ts.map +1 -1
- package/dist/middleware/base.js +24 -0
- package/dist/middleware/base.js.map +1 -1
- package/dist/middleware/circuit-breaker.d.ts +54 -0
- package/dist/middleware/circuit-breaker.d.ts.map +1 -0
- package/dist/middleware/circuit-breaker.js +168 -0
- package/dist/middleware/circuit-breaker.js.map +1 -0
- package/dist/middleware/context-namespace.d.ts +30 -0
- package/dist/middleware/context-namespace.d.ts.map +1 -0
- package/dist/middleware/context-namespace.js +38 -0
- package/dist/middleware/context-namespace.js.map +1 -0
- package/dist/middleware/index.d.ts +7 -1
- package/dist/middleware/index.d.ts.map +1 -1
- package/dist/middleware/index.js +4 -1
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/manager.d.ts +11 -4
- package/dist/middleware/manager.d.ts.map +1 -1
- package/dist/middleware/manager.js +25 -9
- package/dist/middleware/manager.js.map +1 -1
- package/dist/middleware/platform-notify.d.ts +8 -4
- package/dist/middleware/platform-notify.d.ts.map +1 -1
- package/dist/middleware/platform-notify.js +11 -7
- package/dist/middleware/platform-notify.js.map +1 -1
- package/dist/middleware/tracing.d.ts +50 -0
- package/dist/middleware/tracing.d.ts.map +1 -0
- package/dist/middleware/tracing.js +89 -0
- package/dist/middleware/tracing.js.map +1 -0
- package/dist/module.d.ts +94 -2
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +99 -2
- package/dist/module.js.map +1 -1
- package/dist/observability/batch-span-processor.d.ts +48 -0
- package/dist/observability/batch-span-processor.d.ts.map +1 -0
- package/dist/observability/batch-span-processor.js +89 -0
- package/dist/observability/batch-span-processor.js.map +1 -0
- package/dist/observability/context-logger.d.ts +54 -1
- package/dist/observability/context-logger.d.ts.map +1 -1
- package/dist/observability/context-logger.js +270 -6
- package/dist/observability/context-logger.js.map +1 -1
- package/dist/observability/error-history.d.ts +36 -7
- package/dist/observability/error-history.d.ts.map +1 -1
- package/dist/observability/error-history.js +169 -50
- package/dist/observability/error-history.js.map +1 -1
- package/dist/observability/index.d.ts +16 -5
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +8 -3
- package/dist/observability/index.js.map +1 -1
- package/dist/observability/metrics.d.ts +14 -1
- package/dist/observability/metrics.d.ts.map +1 -1
- package/dist/observability/metrics.js +23 -2
- package/dist/observability/metrics.js.map +1 -1
- package/dist/observability/prometheus-exporter.d.ts +37 -0
- package/dist/observability/prometheus-exporter.d.ts.map +1 -0
- package/dist/observability/prometheus-exporter.js +135 -0
- package/dist/observability/prometheus-exporter.js.map +1 -0
- package/dist/observability/storage.d.ts +43 -0
- package/dist/observability/storage.d.ts.map +1 -0
- package/dist/observability/storage.js +58 -0
- package/dist/observability/storage.js.map +1 -0
- package/dist/observability/store.d.ts +29 -0
- package/dist/observability/store.d.ts.map +1 -0
- package/dist/observability/store.js +36 -0
- package/dist/observability/store.js.map +1 -0
- package/dist/observability/usage-exporter.d.ts +58 -0
- package/dist/observability/usage-exporter.d.ts.map +1 -0
- package/dist/observability/usage-exporter.js +86 -0
- package/dist/observability/usage-exporter.js.map +1 -0
- package/dist/observability/usage.d.ts +18 -1
- package/dist/observability/usage.d.ts.map +1 -1
- package/dist/observability/usage.js +25 -3
- package/dist/observability/usage.js.map +1 -1
- package/dist/pipeline-config.d.ts +11 -0
- package/dist/pipeline-config.d.ts.map +1 -1
- package/dist/pipeline-config.js +36 -10
- package/dist/pipeline-config.js.map +1 -1
- package/dist/pipeline.d.ts +123 -2
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js +249 -50
- package/dist/pipeline.js.map +1 -1
- package/dist/registry/index.d.ts +2 -0
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +1 -0
- package/dist/registry/index.js.map +1 -1
- package/dist/registry/multi-class.d.ts +71 -0
- package/dist/registry/multi-class.d.ts.map +1 -0
- package/dist/registry/multi-class.js +120 -0
- package/dist/registry/multi-class.js.map +1 -0
- package/dist/registry/registry.d.ts +246 -5
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/registry.js +485 -16
- package/dist/registry/registry.js.map +1 -1
- package/dist/schema/annotations.d.ts.map +1 -1
- package/dist/schema/annotations.js +1 -0
- package/dist/schema/annotations.js.map +1 -1
- package/dist/schema/constants.d.ts +9 -0
- package/dist/schema/constants.d.ts.map +1 -0
- package/dist/schema/constants.js +9 -0
- package/dist/schema/constants.js.map +1 -0
- package/dist/schema/index.d.ts +1 -1
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +1 -1
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/loader.d.ts +27 -3
- package/dist/schema/loader.d.ts.map +1 -1
- package/dist/schema/loader.js +137 -32
- package/dist/schema/loader.js.map +1 -1
- package/dist/schema/types.d.ts +4 -0
- package/dist/schema/types.d.ts.map +1 -1
- package/dist/schema/types.js.map +1 -1
- package/dist/schema/validator.d.ts +9 -0
- package/dist/schema/validator.d.ts.map +1 -1
- package/dist/schema/validator.js +153 -4
- package/dist/schema/validator.js.map +1 -1
- package/dist/sys-modules/audit.d.ts +50 -0
- package/dist/sys-modules/audit.d.ts.map +1 -0
- package/dist/sys-modules/audit.js +89 -0
- package/dist/sys-modules/audit.js.map +1 -0
- package/dist/sys-modules/control.d.ts +32 -4
- package/dist/sys-modules/control.d.ts.map +1 -1
- package/dist/sys-modules/control.js +196 -25
- package/dist/sys-modules/control.js.map +1 -1
- package/dist/sys-modules/index.d.ts +7 -2
- package/dist/sys-modules/index.d.ts.map +1 -1
- package/dist/sys-modules/index.js +3 -1
- package/dist/sys-modules/index.js.map +1 -1
- package/dist/sys-modules/overrides.d.ts +58 -0
- package/dist/sys-modules/overrides.d.ts.map +1 -0
- package/dist/sys-modules/overrides.js +106 -0
- package/dist/sys-modules/overrides.js.map +1 -0
- package/dist/sys-modules/registration.d.ts +17 -12
- package/dist/sys-modules/registration.d.ts.map +1 -1
- package/dist/sys-modules/registration.js +134 -23
- package/dist/sys-modules/registration.js.map +1 -1
- package/dist/sys-modules/toggle.d.ts +7 -2
- package/dist/sys-modules/toggle.d.ts.map +1 -1
- package/dist/sys-modules/toggle.js +61 -5
- package/dist/sys-modules/toggle.js.map +1 -1
- package/dist/trace-context.d.ts +47 -9
- package/dist/trace-context.d.ts.map +1 -1
- package/dist/trace-context.js +139 -16
- package/dist/trace-context.js.map +1 -1
- 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":"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"}
|
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
|
|
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. */
|
package/dist/module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,
|
|
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
|
package/dist/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAgB,IAAI,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAqC3E,MAAM,CAAC,MAAM,mBAAmB,GAAsB,MAAM,CAAC,MAAM,CAAC;IAClE,QAAQ,EAAE,KAAK;IACf,WAAW,EAAE,KAAK;IAClB,UAAU,EAAE,KAAK;IACjB,gBAAgB,EAAE,KAAK;IACvB,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,KAAK;IAChB,SAAS,EAAE,KAAK;IAChB,QAAQ,EAAE,CAAC;IACX,cAAc,EAAE,IAAI;IACpB,SAAS,EAAE,KAAK;IAChB,eAAe,EAAE,QAAQ;IACzB,YAAY,EAAE,IAAI;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;CACzB,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,SAAsC;IAEtC,IAAI,QAAQ,GAAG,SAAS,EAAE,QAAQ,IAAI,mBAAmB,CAAC,QAAQ,CAAC;IACnE,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,iCAAiC,QAAQ,6BAA6B,CAAC,CAAC;QACrF,QAAQ,GAAG,CAAC,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,GAAG,mBAAmB;QACtB,GAAG,SAAS;QACZ,QAAQ;QACR,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;KACtD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB;IAC5D,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW;IACnD,kBAAkB,EAAE,WAAW,EAAE,kBAAkB,EAAE,cAAc,EAAE,OAAO;CAC7E,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAoB;IACpD,OAAO;QACL,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,iBAAiB,EAAE,CAAC,CAAC,gBAAgB;QACrC,UAAU,EAAE,CAAC,CAAC,SAAS;QACvB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,SAAS,EAAE,CAAC,CAAC,QAAQ;QACrB,gBAAgB,EAAE,CAAC,CAAC,cAAc;QAClC,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,gBAAgB,EAAE,CAAC,CAAC,eAAe;QACnC,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,KAAK,EAAE,CAAC,CAAC,KAAK;KACf,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAA6B;IAC/D,MAAM,aAAa,GAAI,IAAI,CAAC,OAAO,CAA6B,IAAI,EAAE,CAAC;IACvE,MAAM,QAAQ,GAA4B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,QAAQ,GAAI,IAAI,CAAC,WAAW,CAAY,IAAI,CAAC,CAAC;IAClD,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,kCAAkC,QAAQ,6BAA6B,CAAC,CAAC;QACtF,QAAQ,GAAG,CAAC,CAAC;IACf,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,QAAQ,EAAG,IAAI,CAAC,UAAU,CAAa,IAAI,KAAK;QAChD,WAAW,EAAG,IAAI,CAAC,aAAa,CAAa,IAAI,KAAK;QACtD,UAAU,EAAG,IAAI,CAAC,YAAY,CAAa,IAAI,KAAK;QACpD,gBAAgB,EAAG,IAAI,CAAC,mBAAmB,CAAa,IAAI,KAAK;QACjE,SAAS,EAAG,IAAI,CAAC,YAAY,CAAa,IAAI,IAAI;QAClD,SAAS,EAAG,IAAI,CAAC,WAAW,CAAa,IAAI,KAAK;QAClD,SAAS,EAAG,IAAI,CAAC,WAAW,CAAa,IAAI,KAAK;QAClD,QAAQ;QACR,cAAc,EAAG,IAAI,CAAC,kBAAkB,CAAqB,IAAI,IAAI;QACrE,SAAS,EAAG,IAAI,CAAC,WAAW,CAAa,IAAI,KAAK;QAClD,eAAe,EAAG,IAAI,CAAC,kBAAkB,CAAY,IAAI,QAAQ;QACjE,sEAAsE;QACtE,qDAAqD;QACrD,YAAY,EAAG,IAAI,CAAC,cAAc,CAAyB,IAAI,IAAI;QACnE,8EAA8E;QAC9E,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,aAAa,EAAE,CAAC;KACxD,CAAC,CAAC;AACL,CAAC;AAyCD,MAAM,UAAU,qBAAqB,CACnC,MAA8B,EAC9B,mBAA4B,KAAK,EACjC,gBAA2B;IAE3B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC;SACzC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAM,CAAC,CAAC;IACtB,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IACvE,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC;AACrD,CAAC;AA4CD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,GAAG,eAAe,CAAC;AAEpC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;IACnC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,KAAK,EAAW,EAAE;QACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACxE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,CAAC,GAAG,KAAgC,CAAC;QAC3C,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC/C,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC/C,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1E,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC7B,kDAAkD;YAClD,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC;QAC1C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAS;IACzC,CAAC,IAAI,CAAC,EAAE,WAAW;IACnB,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;IACzC,UAAU,EAAE;QACV,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,+CAA+C;SAC7D;QACD,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,0CAA0C;SACxD;QACD,OAAO,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,6DAA6D;SAC3E;QACD,MAAM,EAAE;YACN,uEAAuE;YACvE,WAAW,EAAE,yDAAyD;SACvE;QACD,KAAK,EAAE;YACL,WAAW,EAAE,gCAAgC;SAC9C;KACF;IACD,iBAAiB,EAAE;QACjB,2EAA2E;QAC3E,KAAK,EAAE,EAAE;KACV;IACD,oBAAoB,EAAE,KAAK;CAC5B,CAAC,CAAC;AAEH,gDAAgD;AAChD,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;QAC3B,WAAW,EACT,qEAAqE;KACxE,CAAC;CACH,CAAC,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"context-logger.d.ts","sourceRoot":"","sources":["../../src/observability/context-logger.ts"],"names":[],"mappings":"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"}
|