@skillsmith/core 0.7.0 → 0.8.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/CHANGELOG.md +21 -0
- package/README.md +2 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/src/embeddings/probe.d.ts +62 -0
- package/dist/src/embeddings/probe.d.ts.map +1 -0
- package/dist/src/embeddings/probe.js +89 -0
- package/dist/src/embeddings/probe.js.map +1 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/telemetry/index.d.ts +2 -1
- package/dist/src/telemetry/index.d.ts.map +1 -1
- package/dist/src/telemetry/index.js +4 -1
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/posthog.d.ts +19 -1
- package/dist/src/telemetry/posthog.d.ts.map +1 -1
- package/dist/src/telemetry/posthog.js +14 -0
- package/dist/src/telemetry/posthog.js.map +1 -1
- package/dist/src/telemetry/wrap.bench.d.ts +13 -0
- package/dist/src/telemetry/wrap.bench.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.bench.js +41 -0
- package/dist/src/telemetry/wrap.bench.js.map +1 -0
- package/dist/src/telemetry/wrap.d.ts +75 -0
- package/dist/src/telemetry/wrap.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.js +124 -0
- package/dist/src/telemetry/wrap.js.map +1 -0
- package/dist/src/telemetry/wrap.test.d.ts +14 -0
- package/dist/src/telemetry/wrap.test.d.ts.map +1 -0
- package/dist/src/telemetry/wrap.test.js +283 -0
- package/dist/src/telemetry/wrap.test.js.map +1 -0
- package/dist/tests/embeddings/probe.test.d.ts +13 -0
- package/dist/tests/embeddings/probe.test.d.ts.map +1 -0
- package/dist/tests/embeddings/probe.test.js +154 -0
- package/dist/tests/embeddings/probe.test.js.map +1 -0
- package/package.json +12 -3
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5039: Canonical embedding-capability probe.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `packages/mcp-server/src/index.ts` (originally landed in
|
|
5
|
+
* SMI-5009) to give all consumers — MCP servers, CLIs, future tooling — a
|
|
6
|
+
* single source of truth for the "is the @huggingface/transformers stack
|
|
7
|
+
* available at boot?" question.
|
|
8
|
+
*
|
|
9
|
+
* Design contract (preserved verbatim from the mcp-server origin so behavior
|
|
10
|
+
* is bit-for-bit identical for that consumer; new options are additive):
|
|
11
|
+
*
|
|
12
|
+
* - Hard 2 s default timeout via `Promise.race` against a `Symbol` sentinel.
|
|
13
|
+
* Bound applies even if `EmbeddingService.checkAvailability()` hangs.
|
|
14
|
+
* - try/catch wraps the probe; a throw is logged and never propagates.
|
|
15
|
+
* - Logs to **stderr only** via the supplied `logger` (default
|
|
16
|
+
* `console.error`). MCP servers communicate over stdio — polluting stdout
|
|
17
|
+
* would corrupt protocol framing. This invariant is asserted by spawn-
|
|
18
|
+
* based "stdout pollution" tests in each consumer package.
|
|
19
|
+
* - Silent on success (real embeddings active); only emits a line when
|
|
20
|
+
* mock fallback is engaged, the probe times out, or the probe throws.
|
|
21
|
+
* - Honors `SKILLSMITH_QUIET=true` env var (case-insensitive) AND the
|
|
22
|
+
* explicit `quiet` option — when set, the log line is suppressed even on
|
|
23
|
+
* mock fallback. The probe still **runs** (it warms the module-load
|
|
24
|
+
* cache); only the operator-visible warning is silenced.
|
|
25
|
+
* - Never throws. Probe failure must never block server / CLI boot.
|
|
26
|
+
*
|
|
27
|
+
* @see SMI-5009 — original probe in mcp-server.
|
|
28
|
+
* @see SMI-5039 — extraction to core.
|
|
29
|
+
* @see ADR-009 — embedding service fallback policy.
|
|
30
|
+
*/
|
|
31
|
+
export interface ProbeEmbeddingCapabilityOptions {
|
|
32
|
+
/**
|
|
33
|
+
* Override the hard probe timeout (milliseconds). Defaults to 2 000 ms.
|
|
34
|
+
* The bound applies even if `EmbeddingService.checkAvailability()` never
|
|
35
|
+
* resolves — that is the entire point of the probe.
|
|
36
|
+
*/
|
|
37
|
+
timeoutMs?: number;
|
|
38
|
+
/**
|
|
39
|
+
* Custom log sink. Defaults to `console.error`. MUST write to stderr (or a
|
|
40
|
+
* stderr-equivalent sink) — see the "stdio invariant" note in this file's
|
|
41
|
+
* docstring. Provided primarily for unit tests + future structured-logging
|
|
42
|
+
* consumers.
|
|
43
|
+
*/
|
|
44
|
+
logger?: (msg: string) => void;
|
|
45
|
+
/**
|
|
46
|
+
* When `true`, suppress the warning log line even on mock fallback.
|
|
47
|
+
* The probe still runs and warms the module-load cache; only the
|
|
48
|
+
* operator-visible warning is silenced. Equivalent to setting
|
|
49
|
+
* `SKILLSMITH_QUIET=true` in the environment.
|
|
50
|
+
*/
|
|
51
|
+
quiet?: boolean;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Probe `@huggingface/transformers` availability with a hard timeout +
|
|
55
|
+
* structured stderr warning when the mock fallback engages.
|
|
56
|
+
*
|
|
57
|
+
* NEVER throws. Returns within `timeoutMs` even if the underlying capability
|
|
58
|
+
* check hangs. Safe to `await` directly before connecting an MCP transport or
|
|
59
|
+
* dispatching a CLI command that depends on embeddings.
|
|
60
|
+
*/
|
|
61
|
+
export declare function probeEmbeddingCapability(opts?: ProbeEmbeddingCapabilityOptions): Promise<void>;
|
|
62
|
+
//# sourceMappingURL=probe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe.d.ts","sourceRoot":"","sources":["../../../src/embeddings/probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAOH,MAAM,WAAW,+BAA+B;IAC9C;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAE9B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AASD;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,GAAE,+BAAoC,GACzC,OAAO,CAAC,IAAI,CAAC,CA8Cf"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5039: Canonical embedding-capability probe.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `packages/mcp-server/src/index.ts` (originally landed in
|
|
5
|
+
* SMI-5009) to give all consumers — MCP servers, CLIs, future tooling — a
|
|
6
|
+
* single source of truth for the "is the @huggingface/transformers stack
|
|
7
|
+
* available at boot?" question.
|
|
8
|
+
*
|
|
9
|
+
* Design contract (preserved verbatim from the mcp-server origin so behavior
|
|
10
|
+
* is bit-for-bit identical for that consumer; new options are additive):
|
|
11
|
+
*
|
|
12
|
+
* - Hard 2 s default timeout via `Promise.race` against a `Symbol` sentinel.
|
|
13
|
+
* Bound applies even if `EmbeddingService.checkAvailability()` hangs.
|
|
14
|
+
* - try/catch wraps the probe; a throw is logged and never propagates.
|
|
15
|
+
* - Logs to **stderr only** via the supplied `logger` (default
|
|
16
|
+
* `console.error`). MCP servers communicate over stdio — polluting stdout
|
|
17
|
+
* would corrupt protocol framing. This invariant is asserted by spawn-
|
|
18
|
+
* based "stdout pollution" tests in each consumer package.
|
|
19
|
+
* - Silent on success (real embeddings active); only emits a line when
|
|
20
|
+
* mock fallback is engaged, the probe times out, or the probe throws.
|
|
21
|
+
* - Honors `SKILLSMITH_QUIET=true` env var (case-insensitive) AND the
|
|
22
|
+
* explicit `quiet` option — when set, the log line is suppressed even on
|
|
23
|
+
* mock fallback. The probe still **runs** (it warms the module-load
|
|
24
|
+
* cache); only the operator-visible warning is silenced.
|
|
25
|
+
* - Never throws. Probe failure must never block server / CLI boot.
|
|
26
|
+
*
|
|
27
|
+
* @see SMI-5009 — original probe in mcp-server.
|
|
28
|
+
* @see SMI-5039 — extraction to core.
|
|
29
|
+
* @see ADR-009 — embedding service fallback policy.
|
|
30
|
+
*/
|
|
31
|
+
import { EmbeddingService } from './index.js';
|
|
32
|
+
/** Hard upper bound on probe execution (preserved from SMI-5009). */
|
|
33
|
+
const DEFAULT_TIMEOUT_MS = 2000;
|
|
34
|
+
/** Detect SKILLSMITH_QUIET env var (case-insensitive truthy match). */
|
|
35
|
+
function envQuiet() {
|
|
36
|
+
const v = process.env.SKILLSMITH_QUIET;
|
|
37
|
+
if (v == null)
|
|
38
|
+
return false;
|
|
39
|
+
return v.toLowerCase() === 'true' || v === '1';
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Probe `@huggingface/transformers` availability with a hard timeout +
|
|
43
|
+
* structured stderr warning when the mock fallback engages.
|
|
44
|
+
*
|
|
45
|
+
* NEVER throws. Returns within `timeoutMs` even if the underlying capability
|
|
46
|
+
* check hangs. Safe to `await` directly before connecting an MCP transport or
|
|
47
|
+
* dispatching a CLI command that depends on embeddings.
|
|
48
|
+
*/
|
|
49
|
+
export async function probeEmbeddingCapability(opts = {}) {
|
|
50
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
51
|
+
const log = opts.logger ?? ((msg) => console.error(msg));
|
|
52
|
+
const quiet = opts.quiet === true || envQuiet();
|
|
53
|
+
const emit = (msg) => {
|
|
54
|
+
if (!quiet)
|
|
55
|
+
log(msg);
|
|
56
|
+
};
|
|
57
|
+
const TIMEOUT_SENTINEL = Symbol('probe-timeout');
|
|
58
|
+
let timeoutHandle;
|
|
59
|
+
try {
|
|
60
|
+
const result = await Promise.race([
|
|
61
|
+
EmbeddingService.checkAvailability(),
|
|
62
|
+
new Promise((resolve) => {
|
|
63
|
+
timeoutHandle = setTimeout(() => resolve(TIMEOUT_SENTINEL), timeoutMs);
|
|
64
|
+
}),
|
|
65
|
+
]);
|
|
66
|
+
if (result === TIMEOUT_SENTINEL) {
|
|
67
|
+
emit('[skillsmith] embeddings: mock (transformers unavailable: probe-timeout after 2s; install @huggingface/transformers or set SKILLSMITH_USE_MOCK_EMBEDDINGS=true to silence)');
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (result === true) {
|
|
71
|
+
// Silent on success — avoid noise on healthy boots.
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// checkAvailability returned false → derive reason from cached load error.
|
|
75
|
+
const loadErr = EmbeddingService.getTransformersLoadError();
|
|
76
|
+
const reason = loadErr?.message ?? 'module-load-failed';
|
|
77
|
+
emit(`[skillsmith] embeddings: mock (transformers unavailable: ${reason}; install @huggingface/transformers or set SKILLSMITH_USE_MOCK_EMBEDDINGS=true to silence)`);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
81
|
+
emit(`[skillsmith] embeddings: probe-failed (${msg}; install @huggingface/transformers or set SKILLSMITH_USE_MOCK_EMBEDDINGS=true to silence)`);
|
|
82
|
+
// Continue boot — probe failure must NEVER block server start.
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
if (timeoutHandle !== undefined)
|
|
86
|
+
clearTimeout(timeoutHandle);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=probe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe.js","sourceRoot":"","sources":["../../../src/embeddings/probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7C,qEAAqE;AACrE,MAAM,kBAAkB,GAAG,IAAI,CAAA;AA2B/B,uEAAuE;AACvE,SAAS,QAAQ;IACf,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAA;IACtC,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,KAAK,CAAA;IAC3B,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,IAAI,CAAC,KAAK,GAAG,CAAA;AAChD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAwC,EAAE;IAE1C,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAA;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IAChE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,QAAQ,EAAE,CAAA;IAC/C,MAAM,IAAI,GAAG,CAAC,GAAW,EAAQ,EAAE;QACjC,IAAI,CAAC,KAAK;YAAE,GAAG,CAAC,GAAG,CAAC,CAAA;IACtB,CAAC,CAAA;IAED,MAAM,gBAAgB,GAAkB,MAAM,CAAC,eAAe,CAAC,CAAA;IAC/D,IAAI,aAAyC,CAAA;IAE7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAoC;YACnE,gBAAgB,CAAC,iBAAiB,EAAE;YACpC,IAAI,OAAO,CAA0B,CAAC,OAAO,EAAE,EAAE;gBAC/C,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC,CAAA;YACxE,CAAC,CAAC;SACH,CAAC,CAAA;QAEF,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;YAChC,IAAI,CACF,2KAA2K,CAC5K,CAAA;YACD,OAAM;QACR,CAAC;QAED,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,oDAAoD;YACpD,OAAM;QACR,CAAC;QAED,2EAA2E;QAC3E,MAAM,OAAO,GAAG,gBAAgB,CAAC,wBAAwB,EAAE,CAAA;QAC3D,MAAM,MAAM,GAAG,OAAO,EAAE,OAAO,IAAI,oBAAoB,CAAA;QACvD,IAAI,CACF,4DAA4D,MAAM,4FAA4F,CAC/J,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC5D,IAAI,CACF,0CAA0C,GAAG,4FAA4F,CAC1I,CAAA;QACD,+DAA+D;IACjE,CAAC;YAAS,CAAC;QACT,IAAI,aAAa,KAAK,SAAS;YAAE,YAAY,CAAC,aAAa,CAAC,CAAA;IAC9D,CAAC;AACH,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @skillsmith/core - Core functionality for skill discovery
|
|
3
3
|
*/
|
|
4
|
-
export declare const VERSION = "0.
|
|
4
|
+
export declare const VERSION = "0.8.0";
|
|
5
5
|
export * from './exports/services.js';
|
|
6
6
|
export * from './exports/repositories.js';
|
|
7
7
|
export { createDatabaseSync, createDatabaseAsync } from './db/createDatabase.js';
|
package/dist/src/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @skillsmith/core - Core functionality for skill discovery
|
|
3
3
|
*/
|
|
4
4
|
// Version
|
|
5
|
-
export const VERSION = '0.
|
|
5
|
+
export const VERSION = '0.8.0';
|
|
6
6
|
// ============================================================================
|
|
7
7
|
// Grouped Exports from Barrel Files
|
|
8
8
|
// ============================================================================
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
export { SkillsmithTracer, getTracer, initializeTracing, shutdownTracing, traced, type TracerConfig, type SpanAttributes, type SpanWrapper, } from './tracer.js';
|
|
10
10
|
export { MetricsRegistry, getMetrics, initializeMetrics, timeAsync, timeSync, LATENCY_BUCKETS, type MetricsConfig, type MetricLabels, type Counter, type Histogram, type Gauge, type MetricsSnapshot, } from './metrics.js';
|
|
11
11
|
export { exportToPrometheus, getPrometheusMetrics, createPrometheusHandler, type PrometheusExportOptions, } from './prometheus.js';
|
|
12
|
-
export { initializePostHog, shutdownPostHog, flushPostHog, trackEvent, trackSkillSearch, trackSkillView, trackSkillInstall, trackApiError, identifyUser, isFeatureFlagEnabled, getPostHog, isPostHogEnabled, ALLOWED_TRAITS, type PostHogConfig, type SkillsmithEventType, type SkillEventProperties, type AllowedUserTraits, } from './posthog.js';
|
|
12
|
+
export { initializePostHog, shutdownPostHog, flushPostHog, trackEvent, trackSkillSearch, trackSkillView, trackSkillInstall, trackSkillInvoke, trackApiError, identifyUser, isFeatureFlagEnabled, getPostHog, isPostHogEnabled, ALLOWED_TRAITS, type PostHogConfig, type SkillsmithEventType, type SkillEventProperties, type TrackSkillInvokeParams, type AllowedUserTraits, } from './posthog.js';
|
|
13
|
+
export { withTelemetry, isTelemetered, setEmissionGate, type WithTelemetryOpts } from './wrap.js';
|
|
13
14
|
/**
|
|
14
15
|
* Initialize all telemetry (tracing + metrics)
|
|
15
16
|
* Call this at application startup
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,MAAM,EACN,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,WAAW,GACjB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,KAAK,EACV,KAAK,eAAe,GACrB,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,uBAAuB,GAC7B,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,GACvB,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,MAAM,EACN,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,WAAW,GACjB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,KAAK,EACV,KAAK,eAAe,GACrB,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,KAAK,uBAAuB,GAC7B,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,GACvB,MAAM,cAAc,CAAA;AAIrB,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAEjG;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,CAAC,EAAE;IACjD,OAAO,CAAC,EAAE,OAAO,aAAa,EAAE,YAAY,CAAA;IAC5C,OAAO,CAAC,EAAE,OAAO,cAAc,EAAE,aAAa,CAAA;CAC/C,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAGvD"}
|
|
@@ -13,7 +13,10 @@ export { MetricsRegistry, getMetrics, initializeMetrics, timeAsync, timeSync, LA
|
|
|
13
13
|
// Prometheus exports (SMI-1018)
|
|
14
14
|
export { exportToPrometheus, getPrometheusMetrics, createPrometheusHandler, } from './prometheus.js';
|
|
15
15
|
// PostHog exports (SMI-1184)
|
|
16
|
-
export { initializePostHog, shutdownPostHog, flushPostHog, trackEvent, trackSkillSearch, trackSkillView, trackSkillInstall, trackApiError, identifyUser, isFeatureFlagEnabled, getPostHog, isPostHogEnabled, ALLOWED_TRAITS, } from './posthog.js';
|
|
16
|
+
export { initializePostHog, shutdownPostHog, flushPostHog, trackEvent, trackSkillSearch, trackSkillView, trackSkillInstall, trackSkillInvoke, trackApiError, identifyUser, isFeatureFlagEnabled, getPostHog, isPostHogEnabled, ALLOWED_TRAITS, } from './posthog.js';
|
|
17
|
+
// In-process HOF + registry (SMI-5016)
|
|
18
|
+
// Emission gate (SMI-5019 wire-in) — privacy-safe default-suppress.
|
|
19
|
+
export { withTelemetry, isTelemetered, setEmissionGate } from './wrap.js';
|
|
17
20
|
/**
|
|
18
21
|
* Initialize all telemetry (tracing + metrics)
|
|
19
22
|
* Call this at application startup
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,iBAAiB;AACjB,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,MAAM,GAIP,MAAM,aAAa,CAAA;AAEpB,kBAAkB;AAClB,OAAO,EACL,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,eAAe,GAOhB,MAAM,cAAc,CAAA;AAErB,gCAAgC;AAChC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,iBAAiB,CAAA;AAExB,6BAA6B;AAC7B,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,iBAAiB;AACjB,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,MAAM,GAIP,MAAM,aAAa,CAAA;AAEpB,kBAAkB;AAClB,OAAO,EACL,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,eAAe,GAOhB,MAAM,cAAc,CAAA;AAErB,gCAAgC;AAChC,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,iBAAiB,CAAA;AAExB,6BAA6B;AAC7B,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,cAAc,GAMf,MAAM,cAAc,CAAA;AAErB,uCAAuC;AACvC,oEAAoE;AACpE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAA0B,MAAM,WAAW,CAAA;AAEjG;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAGzC;IACC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;IACzD,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;IAE1D,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;AAC7F,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAA;IACvD,MAAM,eAAe,EAAE,CAAA;AACzB,CAAC"}
|
|
@@ -28,7 +28,7 @@ export interface PostHogConfig {
|
|
|
28
28
|
/**
|
|
29
29
|
* Event types for Skillsmith analytics
|
|
30
30
|
*/
|
|
31
|
-
export type SkillsmithEventType = 'skill_search' | 'skill_view' | 'skill_install' | 'skill_uninstall' | 'skill_compare' | 'skill_recommend' | 'api_error' | 'feature_flag_evaluated';
|
|
31
|
+
export type SkillsmithEventType = 'skill_search' | 'skill_view' | 'skill_install' | 'skill_uninstall' | 'skill_compare' | 'skill_recommend' | 'api_error' | 'feature_flag_evaluated' | 'skill_invoke' | 'skill_context_load' | 'skill_invoke_unparsed';
|
|
32
32
|
/**
|
|
33
33
|
* Event properties for skill-related events
|
|
34
34
|
*/
|
|
@@ -140,6 +140,24 @@ export declare function trackSkillView(distinctId: string, skillId: string, sour
|
|
|
140
140
|
* Convenience function to track skill install events
|
|
141
141
|
*/
|
|
142
142
|
export declare function trackSkillInstall(distinctId: string, skillId: string, source: 'cli' | 'mcp' | 'api'): void;
|
|
143
|
+
/**
|
|
144
|
+
* Parameters for tracking a skill invocation event (SMI-5016).
|
|
145
|
+
* `distinctId` defaults to `'anonymous'` so the HOF can emit without knowing
|
|
146
|
+
* the per-user ID at wrap-time; callers with a resolved ID should pass it.
|
|
147
|
+
*/
|
|
148
|
+
export interface TrackSkillInvokeParams {
|
|
149
|
+
skillId: string;
|
|
150
|
+
source: 'mcp-tool' | 'cli' | 'vscode-extension';
|
|
151
|
+
framework: string;
|
|
152
|
+
durationMs: number;
|
|
153
|
+
success: boolean;
|
|
154
|
+
distinctId?: string;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Convenience function to track skill invocation events (SMI-5016).
|
|
158
|
+
* Mirrors `trackSkillInstall()` — positional for resolved-ID callers.
|
|
159
|
+
*/
|
|
160
|
+
export declare function trackSkillInvoke(params: TrackSkillInvokeParams): void;
|
|
143
161
|
/**
|
|
144
162
|
* Convenience function to track API errors
|
|
145
163
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posthog.d.ts","sourceRoot":"","sources":["../../../src/telemetry/posthog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,kDAAkD;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAC3B,cAAc,GACd,YAAY,GACZ,eAAe,GACf,iBAAiB,GACjB,eAAe,GACf,iBAAiB,GACjB,WAAW,GACX,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"posthog.d.ts","sourceRoot":"","sources":["../../../src/telemetry/posthog.ts"],"names":[],"mappings":"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"}
|
|
@@ -200,6 +200,20 @@ export function trackSkillInstall(distinctId, skillId, source) {
|
|
|
200
200
|
source,
|
|
201
201
|
});
|
|
202
202
|
}
|
|
203
|
+
/**
|
|
204
|
+
* Convenience function to track skill invocation events (SMI-5016).
|
|
205
|
+
* Mirrors `trackSkillInstall()` — positional for resolved-ID callers.
|
|
206
|
+
*/
|
|
207
|
+
export function trackSkillInvoke(params) {
|
|
208
|
+
const { skillId, source, framework, durationMs, success, distinctId = 'anonymous' } = params;
|
|
209
|
+
trackEvent(distinctId, 'skill_invoke', {
|
|
210
|
+
skill_id: skillId,
|
|
211
|
+
invoke_source: source,
|
|
212
|
+
framework,
|
|
213
|
+
duration_ms: durationMs,
|
|
214
|
+
success,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
203
217
|
/**
|
|
204
218
|
* Convenience function to track API errors
|
|
205
219
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posthog.js","sourceRoot":"","sources":["../../../src/telemetry/posthog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"posthog.js","sourceRoot":"","sources":["../../../src/telemetry/posthog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5016 / Risk #7: withTelemetry overhead microbenchmark.
|
|
3
|
+
*
|
|
4
|
+
* Uses vitest `bench()` for reporting. Run via:
|
|
5
|
+
* docker exec skillsmith-dev-1 \
|
|
6
|
+
* npx vitest bench --run packages/core/src/telemetry/wrap.bench.ts
|
|
7
|
+
*
|
|
8
|
+
* NOTE: `bench()` is reporting-only — it does NOT fail CI on regression.
|
|
9
|
+
* The assertable p99 < 1ms gate lives in `wrap.test.ts` ('overhead' suite)
|
|
10
|
+
* and runs in every CI test pass.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=wrap.bench.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.bench.d.ts","sourceRoot":"","sources":["../../../src/telemetry/wrap.bench.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5016 / Risk #7: withTelemetry overhead microbenchmark.
|
|
3
|
+
*
|
|
4
|
+
* Uses vitest `bench()` for reporting. Run via:
|
|
5
|
+
* docker exec skillsmith-dev-1 \
|
|
6
|
+
* npx vitest bench --run packages/core/src/telemetry/wrap.bench.ts
|
|
7
|
+
*
|
|
8
|
+
* NOTE: `bench()` is reporting-only — it does NOT fail CI on regression.
|
|
9
|
+
* The assertable p99 < 1ms gate lives in `wrap.test.ts` ('overhead' suite)
|
|
10
|
+
* and runs in every CI test pass.
|
|
11
|
+
*/
|
|
12
|
+
import { describe, bench, vi, beforeAll } from 'vitest';
|
|
13
|
+
import { withTelemetry } from './wrap.js';
|
|
14
|
+
vi.mock('./posthog.js', () => ({
|
|
15
|
+
trackSkillInvoke: vi.fn(),
|
|
16
|
+
}));
|
|
17
|
+
const noopHandler = async () => 42;
|
|
18
|
+
const wrappedNoop = withTelemetry(noopHandler, {
|
|
19
|
+
source: 'mcp-tool',
|
|
20
|
+
extractSkillId: () => 'bench/skill',
|
|
21
|
+
});
|
|
22
|
+
const wrappedWithFramework = withTelemetry(noopHandler, {
|
|
23
|
+
source: 'mcp-tool',
|
|
24
|
+
extractSkillId: () => 'bench/skill',
|
|
25
|
+
extractFramework: () => 'cursor',
|
|
26
|
+
});
|
|
27
|
+
beforeAll(async () => {
|
|
28
|
+
// JIT warm-up before measurement begins
|
|
29
|
+
for (let i = 0; i < 200; i++) {
|
|
30
|
+
await wrappedNoop();
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
describe('withTelemetry HOF overhead', () => {
|
|
34
|
+
bench('no-op handler — no extractFramework', async () => {
|
|
35
|
+
await wrappedNoop();
|
|
36
|
+
}, { iterations: 500, warmupIterations: 50 });
|
|
37
|
+
bench('no-op handler — with extractFramework', async () => {
|
|
38
|
+
await wrappedWithFramework();
|
|
39
|
+
}, { iterations: 500, warmupIterations: 50 });
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=wrap.bench.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.bench.js","sourceRoot":"","sources":["../../../src/telemetry/wrap.bench.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEzC,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC1B,CAAC,CAAC,CAAA;AAEH,MAAM,WAAW,GAAG,KAAK,IAAqB,EAAE,CAAC,EAAE,CAAA;AAEnD,MAAM,WAAW,GAAG,aAAa,CAAC,WAAW,EAAE;IAC7C,MAAM,EAAE,UAAU;IAClB,cAAc,EAAE,GAAG,EAAE,CAAC,aAAa;CACpC,CAAC,CAAA;AAEF,MAAM,oBAAoB,GAAG,aAAa,CAAC,WAAW,EAAE;IACtD,MAAM,EAAE,UAAU;IAClB,cAAc,EAAE,GAAG,EAAE,CAAC,aAAa;IACnC,gBAAgB,EAAE,GAAG,EAAE,CAAC,QAAQ;CACjC,CAAC,CAAA;AAEF,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,wCAAwC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAO,WAAiD,EAAE,CAAA;IAC5D,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,KAAK,CACH,qCAAqC,EACrC,KAAK,IAAI,EAAE;QACT,MAAO,WAAiD,EAAE,CAAA;IAC5D,CAAC,EACD,EAAE,UAAU,EAAE,GAAG,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAC1C,CAAA;IAED,KAAK,CACH,uCAAuC,EACvC,KAAK,IAAI,EAAE;QACT,MAAO,oBAA0D,EAAE,CAAA;IACrE,CAAC,EACD,EAAE,UAAU,EAAE,GAAG,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAC1C,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5016: In-process telemetry HOF + Set-based registry.
|
|
3
|
+
*
|
|
4
|
+
* `withTelemetry` wraps a handler function with timing + emit + error-safe
|
|
5
|
+
* envelope. A module-scoped `Set<Function>` tracks all wrapped functions so
|
|
6
|
+
* the three-tree snapshot test (SMI-5018) can assert 100% dispatcher coverage
|
|
7
|
+
* via `isTelemetered()`.
|
|
8
|
+
*
|
|
9
|
+
* Applied review change H3: registry is an exported Set (not function-object
|
|
10
|
+
* mutation) so arrow-const exports can be wrapped without mutation.
|
|
11
|
+
* Applied review change H4: `framework` is captured per-call, not memoised.
|
|
12
|
+
*/
|
|
13
|
+
type AnyFunction = (...args: any[]) => any;
|
|
14
|
+
/**
|
|
15
|
+
* Install (or clear) the per-process emission gate.
|
|
16
|
+
*
|
|
17
|
+
* Pass a predicate to enable telemetry only when the predicate returns true;
|
|
18
|
+
* pass `undefined` to revert to the default-suppress behaviour. Callers should
|
|
19
|
+
* always reset to `undefined` in a `finally` so a thrown handler does not
|
|
20
|
+
* leak emission permission to the next request.
|
|
21
|
+
*
|
|
22
|
+
* The predicate is evaluated once per call to a wrapped function, inside the
|
|
23
|
+
* `finally` block, so it sees the live state of any per-request resolver.
|
|
24
|
+
*/
|
|
25
|
+
export declare function setEmissionGate(gate: (() => boolean) | undefined): void;
|
|
26
|
+
/**
|
|
27
|
+
* Options for `withTelemetry`.
|
|
28
|
+
*
|
|
29
|
+
* `extractSkillId` and `extractFramework` receive the arguments array at
|
|
30
|
+
* call-time so they can derive values from the live request context.
|
|
31
|
+
* `extractFramework` is intentionally per-call (H4) — not memoised.
|
|
32
|
+
*/
|
|
33
|
+
export interface WithTelemetryOpts<TArgs extends readonly unknown[]> {
|
|
34
|
+
/** Discriminator stored with the event — which invocation surface this is. */
|
|
35
|
+
source: 'mcp-tool' | 'cli' | 'vscode-extension';
|
|
36
|
+
/** Derive the skill ID from the handler's arguments at call-time. */
|
|
37
|
+
extractSkillId: (args: TArgs) => string;
|
|
38
|
+
/**
|
|
39
|
+
* Derive the framework string from the handler's arguments at call-time.
|
|
40
|
+
* Per H4: called once per invocation, never memoised.
|
|
41
|
+
* Returns `'unknown'` if omitted.
|
|
42
|
+
*/
|
|
43
|
+
extractFramework?: (args: TArgs) => string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Wraps `handler` with a timing + telemetry emit envelope and registers the
|
|
47
|
+
* returned function in the module-scoped `wrapped` Set.
|
|
48
|
+
*
|
|
49
|
+
* Guarantees:
|
|
50
|
+
* - The emit happens even when `handler` throws (`finally` block).
|
|
51
|
+
* - Telemetry errors are swallowed — they never affect the caller.
|
|
52
|
+
* - The returned function preserves the original call signature (`F`).
|
|
53
|
+
* - Calling `withTelemetry` on the same original function twice produces two
|
|
54
|
+
* distinct wrapped functions (both registered in the Set).
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* // Arrow-const export — the critical H3 case:
|
|
58
|
+
* export const myTool = withTelemetry(
|
|
59
|
+
* async (args) => { ... },
|
|
60
|
+
* { source: 'mcp-tool', extractSkillId: (a) => a[0].skill }
|
|
61
|
+
* )
|
|
62
|
+
*/
|
|
63
|
+
export declare function withTelemetry<TArgs extends readonly unknown[], TReturn>(handler: (...args: TArgs) => Promise<TReturn> | TReturn, opts: WithTelemetryOpts<TArgs>): (...args: TArgs) => Promise<TReturn>;
|
|
64
|
+
/**
|
|
65
|
+
* Returns `true` if `fn` was produced by `withTelemetry`.
|
|
66
|
+
*
|
|
67
|
+
* Used by the three-tree snapshot test (SMI-5018) to assert that every
|
|
68
|
+
* dispatcher export is telemetry-wrapped.
|
|
69
|
+
*
|
|
70
|
+
* Note: checks the *wrapped* function reference, not the original handler.
|
|
71
|
+
* `isTelemetered(originalHandler)` is always `false`.
|
|
72
|
+
*/
|
|
73
|
+
export declare function isTelemetered(fn: AnyFunction): boolean;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=wrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../../src/telemetry/wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,KAAK,WAAW,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;AAyB1C;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CAEvE;AAMD;;;;;;GAMG;AAMH,MAAM,WAAW,iBAAiB,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE;IACjE,8EAA8E;IAC9E,MAAM,EAAE,UAAU,GAAG,KAAK,GAAG,kBAAkB,CAAA;IAC/C,qEAAqE;IACrE,cAAc,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAA;IACvC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,CAAA;CAC3C;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE,EAAE,OAAO,EACrE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,EACvD,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAC7B,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAoCtC;AAMD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAEtD"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5016: In-process telemetry HOF + Set-based registry.
|
|
3
|
+
*
|
|
4
|
+
* `withTelemetry` wraps a handler function with timing + emit + error-safe
|
|
5
|
+
* envelope. A module-scoped `Set<Function>` tracks all wrapped functions so
|
|
6
|
+
* the three-tree snapshot test (SMI-5018) can assert 100% dispatcher coverage
|
|
7
|
+
* via `isTelemetered()`.
|
|
8
|
+
*
|
|
9
|
+
* Applied review change H3: registry is an exported Set (not function-object
|
|
10
|
+
* mutation) so arrow-const exports can be wrapped without mutation.
|
|
11
|
+
* Applied review change H4: `framework` is captured per-call, not memoised.
|
|
12
|
+
*/
|
|
13
|
+
import { trackSkillInvoke } from './posthog.js';
|
|
14
|
+
const wrapped = new Set();
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Emission gate (SMI-5019 wire-in)
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
//
|
|
19
|
+
// Default-suppress: until an emission gate is installed via `setEmissionGate`,
|
|
20
|
+
// `withTelemetry` does NOT emit. Privacy-safe by construction — consumers
|
|
21
|
+
// (e.g. the mcp-server license-gate middleware) MUST call `setEmissionGate`
|
|
22
|
+
// during request handling to enable emission for their context.
|
|
23
|
+
//
|
|
24
|
+
// The alternative (default-emit) would be backwards-compatible but risks
|
|
25
|
+
// emitting telemetry for an unknown anonymous_id before consent has been
|
|
26
|
+
// resolved. We pick the privacy-safe default per SMI-5019; a misconfigured
|
|
27
|
+
// host that forgets to install a gate simply emits no telemetry, which is
|
|
28
|
+
// observable (counts stay at zero) and recoverable.
|
|
29
|
+
//
|
|
30
|
+
// Multi-tenancy caveat: the gate is module-scoped. For a single-tenant MCP
|
|
31
|
+
// server process (the v1 shape) this is correct. A future multi-tenant
|
|
32
|
+
// transport would need `AsyncLocalStorage`-backed per-request state — see
|
|
33
|
+
// the matching caveat in `license.gate.ts`.
|
|
34
|
+
let emissionGate;
|
|
35
|
+
/**
|
|
36
|
+
* Install (or clear) the per-process emission gate.
|
|
37
|
+
*
|
|
38
|
+
* Pass a predicate to enable telemetry only when the predicate returns true;
|
|
39
|
+
* pass `undefined` to revert to the default-suppress behaviour. Callers should
|
|
40
|
+
* always reset to `undefined` in a `finally` so a thrown handler does not
|
|
41
|
+
* leak emission permission to the next request.
|
|
42
|
+
*
|
|
43
|
+
* The predicate is evaluated once per call to a wrapped function, inside the
|
|
44
|
+
* `finally` block, so it sees the live state of any per-request resolver.
|
|
45
|
+
*/
|
|
46
|
+
export function setEmissionGate(gate) {
|
|
47
|
+
emissionGate = gate;
|
|
48
|
+
}
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// HOF
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
/**
|
|
53
|
+
* Wraps `handler` with a timing + telemetry emit envelope and registers the
|
|
54
|
+
* returned function in the module-scoped `wrapped` Set.
|
|
55
|
+
*
|
|
56
|
+
* Guarantees:
|
|
57
|
+
* - The emit happens even when `handler` throws (`finally` block).
|
|
58
|
+
* - Telemetry errors are swallowed — they never affect the caller.
|
|
59
|
+
* - The returned function preserves the original call signature (`F`).
|
|
60
|
+
* - Calling `withTelemetry` on the same original function twice produces two
|
|
61
|
+
* distinct wrapped functions (both registered in the Set).
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* // Arrow-const export — the critical H3 case:
|
|
65
|
+
* export const myTool = withTelemetry(
|
|
66
|
+
* async (args) => { ... },
|
|
67
|
+
* { source: 'mcp-tool', extractSkillId: (a) => a[0].skill }
|
|
68
|
+
* )
|
|
69
|
+
*/
|
|
70
|
+
export function withTelemetry(handler, opts) {
|
|
71
|
+
const wrappedFn = async (...args) => {
|
|
72
|
+
const start = Date.now();
|
|
73
|
+
const skillId = opts.extractSkillId(args);
|
|
74
|
+
// Per H4: evaluated per-call so a single server process can serve multiple
|
|
75
|
+
// clients with different frameworks on the same HTTP transport.
|
|
76
|
+
const framework = opts.extractFramework?.(args) ?? 'unknown';
|
|
77
|
+
let success = true;
|
|
78
|
+
try {
|
|
79
|
+
return await handler(...args);
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
success = false;
|
|
83
|
+
throw e;
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
// Emit BEFORE the catch re-throw lands; swallow telemetry errors so they
|
|
87
|
+
// never affect the wrapped function's observable behaviour.
|
|
88
|
+
try {
|
|
89
|
+
// SMI-5019 wire-in: consult the emission gate. Default-suppress when
|
|
90
|
+
// no gate is installed — see module-level comment for the rationale.
|
|
91
|
+
if (emissionGate && emissionGate()) {
|
|
92
|
+
trackSkillInvoke({
|
|
93
|
+
skillId,
|
|
94
|
+
source: opts.source,
|
|
95
|
+
framework,
|
|
96
|
+
durationMs: Date.now() - start,
|
|
97
|
+
success,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
// Intentionally swallowed — telemetry must never break user code.
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
wrapped.add(wrappedFn);
|
|
107
|
+
return wrappedFn;
|
|
108
|
+
}
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
// Registry accessor
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
/**
|
|
113
|
+
* Returns `true` if `fn` was produced by `withTelemetry`.
|
|
114
|
+
*
|
|
115
|
+
* Used by the three-tree snapshot test (SMI-5018) to assert that every
|
|
116
|
+
* dispatcher export is telemetry-wrapped.
|
|
117
|
+
*
|
|
118
|
+
* Note: checks the *wrapped* function reference, not the original handler.
|
|
119
|
+
* `isTelemetered(originalHandler)` is always `false`.
|
|
120
|
+
*/
|
|
121
|
+
export function isTelemetered(fn) {
|
|
122
|
+
return wrapped.has(fn);
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=wrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.js","sourceRoot":"","sources":["../../../src/telemetry/wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAS/C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAe,CAAA;AAEtC,8EAA8E;AAC9E,mCAAmC;AACnC,8EAA8E;AAC9E,EAAE;AACF,+EAA+E;AAC/E,0EAA0E;AAC1E,4EAA4E;AAC5E,gEAAgE;AAChE,EAAE;AACF,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;AAC3E,0EAA0E;AAC1E,oDAAoD;AACpD,EAAE;AACF,2EAA2E;AAC3E,uEAAuE;AACvE,0EAA0E;AAC1E,4CAA4C;AAC5C,IAAI,YAAyC,CAAA;AAE7C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,IAAiC;IAC/D,YAAY,GAAG,IAAI,CAAA;AACrB,CAAC;AA+BD,8EAA8E;AAC9E,MAAM;AACN,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAuD,EACvD,IAA8B;IAE9B,MAAM,SAAS,GAAG,KAAK,EAAE,GAAG,IAAW,EAAoB,EAAE;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;QACzC,2EAA2E;QAC3E,gEAAgE;QAChE,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAC,IAAI,SAAS,CAAA;QAC5D,IAAI,OAAO,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;QAC/B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,GAAG,KAAK,CAAA;YACf,MAAM,CAAC,CAAA;QACT,CAAC;gBAAS,CAAC;YACT,yEAAyE;YACzE,4DAA4D;YAC5D,IAAI,CAAC;gBACH,qEAAqE;gBACrE,qEAAqE;gBACrE,IAAI,YAAY,IAAI,YAAY,EAAE,EAAE,CAAC;oBACnC,gBAAgB,CAAC;wBACf,OAAO;wBACP,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,SAAS;wBACT,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;wBAC9B,OAAO;qBACR,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,kEAAkE;YACpE,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACtB,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,EAAe;IAC3C,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACxB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-5016: Unit tests for withTelemetry HOF + isTelemetered registry.
|
|
3
|
+
*
|
|
4
|
+
* Covers the shared-state matrix invariants from plan line 720:
|
|
5
|
+
* - function-decl wrap
|
|
6
|
+
* - arrow-const export wrap (H3 critical case)
|
|
7
|
+
* - double-register idempotency (Set dedupes by reference)
|
|
8
|
+
* - isTelemetered true/false
|
|
9
|
+
* - emit-on-throw (success:false, then re-throw)
|
|
10
|
+
* - telemetry emit failure does NOT affect wrapped fn
|
|
11
|
+
* - per-request framework (H4 — not memoised)
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=wrap.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap.test.d.ts","sourceRoot":"","sources":["../../../src/telemetry/wrap.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|