@senpi/runtime 1.1.0-dev.runtime-phase-2.20260609132603 → 1.1.0-dev.runtime-phase-2.20260610130051
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/dist/actions/close-position/close-position.action.d.ts +0 -16
- package/dist/actions/close-position/close-position.action.d.ts.map +1 -1
- package/dist/actions/close-position/close-position.action.js +38 -299
- package/dist/actions/close-position/close-position.action.js.map +1 -1
- package/dist/actions/decision-engine.d.ts +0 -2
- package/dist/actions/decision-engine.d.ts.map +1 -1
- package/dist/actions/decision-engine.js.map +1 -1
- package/dist/actions/llm-decision/factory.d.ts +0 -3
- package/dist/actions/llm-decision/factory.d.ts.map +1 -1
- package/dist/actions/llm-decision/factory.js +0 -1
- package/dist/actions/llm-decision/factory.js.map +1 -1
- package/dist/actions/llm-decision/openclaw-llm-decision.d.ts +0 -13
- package/dist/actions/llm-decision/openclaw-llm-decision.d.ts.map +1 -1
- package/dist/actions/llm-decision/openclaw-llm-decision.js +68 -195
- package/dist/actions/llm-decision/openclaw-llm-decision.js.map +1 -1
- package/dist/actions/open-position/open-position.action.d.ts +0 -12
- package/dist/actions/open-position/open-position.action.d.ts.map +1 -1
- package/dist/actions/open-position/open-position.action.js +123 -346
- package/dist/actions/open-position/open-position.action.js.map +1 -1
- package/dist/actions/position-tracker/position-tracker.action.d.ts +0 -6
- package/dist/actions/position-tracker/position-tracker.action.d.ts.map +1 -1
- package/dist/actions/position-tracker/position-tracker.action.js +0 -48
- package/dist/actions/position-tracker/position-tracker.action.js.map +1 -1
- package/dist/dsl/events/handlers.d.ts.map +1 -1
- package/dist/dsl/events/handlers.js +4 -0
- package/dist/dsl/events/handlers.js.map +1 -1
- package/dist/recording/emitter.d.ts +21 -0
- package/dist/recording/emitter.d.ts.map +1 -0
- package/dist/recording/emitter.js +2 -0
- package/dist/recording/emitter.js.map +1 -0
- package/dist/recording/identity.d.ts +34 -0
- package/dist/recording/identity.d.ts.map +1 -0
- package/dist/recording/identity.js +2 -0
- package/dist/recording/identity.js.map +1 -0
- package/dist/recording/index.d.ts +11 -0
- package/dist/recording/index.d.ts.map +1 -0
- package/dist/recording/index.js +2 -0
- package/dist/recording/index.js.map +1 -0
- package/dist/recording/noop-emitter.d.ts +17 -0
- package/dist/recording/noop-emitter.d.ts.map +1 -0
- package/dist/recording/noop-emitter.js +16 -0
- package/dist/recording/noop-emitter.js.map +1 -0
- package/dist/recording/otel/attributes.d.ts +35 -0
- package/dist/recording/otel/attributes.d.ts.map +1 -0
- package/dist/recording/otel/attributes.js +131 -0
- package/dist/recording/otel/attributes.js.map +1 -0
- package/dist/recording/otel/constants.d.ts +81 -0
- package/dist/recording/otel/constants.d.ts.map +1 -0
- package/dist/recording/otel/constants.js +96 -0
- package/dist/recording/otel/constants.js.map +1 -0
- package/dist/recording/otel/ids.d.ts +14 -0
- package/dist/recording/otel/ids.d.ts.map +1 -0
- package/dist/recording/otel/ids.js +12 -0
- package/dist/recording/otel/ids.js.map +1 -0
- package/dist/recording/otel/index.d.ts +13 -0
- package/dist/recording/otel/index.d.ts.map +1 -0
- package/dist/recording/otel/index.js +9 -0
- package/dist/recording/otel/index.js.map +1 -0
- package/dist/recording/otel/mappers.d.ts +42 -0
- package/dist/recording/otel/mappers.d.ts.map +1 -0
- package/dist/recording/otel/mappers.js +337 -0
- package/dist/recording/otel/mappers.js.map +1 -0
- package/dist/recording/otel/otel-emitter.d.ts +37 -0
- package/dist/recording/otel/otel-emitter.d.ts.map +1 -0
- package/dist/recording/otel/otel-emitter.js +75 -0
- package/dist/recording/otel/otel-emitter.js.map +1 -0
- package/dist/recording/otel/redaction.d.ts +31 -0
- package/dist/recording/otel/redaction.d.ts.map +1 -0
- package/dist/recording/otel/redaction.js +40 -0
- package/dist/recording/otel/redaction.js.map +1 -0
- package/dist/recording/records.d.ts +327 -0
- package/dist/recording/records.d.ts.map +1 -0
- package/dist/recording/records.js +14 -0
- package/dist/recording/records.js.map +1 -0
- package/dist/recording/transport/batcher.d.ts +59 -0
- package/dist/recording/transport/batcher.d.ts.map +1 -0
- package/dist/recording/transport/batcher.js +234 -0
- package/dist/recording/transport/batcher.js.map +1 -0
- package/dist/recording/transport/client.d.ts +41 -0
- package/dist/recording/transport/client.d.ts.map +1 -0
- package/dist/recording/transport/client.js +69 -0
- package/dist/recording/transport/client.js.map +1 -0
- package/dist/recording/transport/config.d.ts +53 -0
- package/dist/recording/transport/config.d.ts.map +1 -0
- package/dist/recording/transport/config.js +41 -0
- package/dist/recording/transport/config.js.map +1 -0
- package/dist/recording/transport/index.d.ts +16 -0
- package/dist/recording/transport/index.d.ts.map +1 -0
- package/dist/recording/transport/index.js +12 -0
- package/dist/recording/transport/index.js.map +1 -0
- package/dist/recording/transport/rows.d.ts +88 -0
- package/dist/recording/transport/rows.d.ts.map +1 -0
- package/dist/recording/transport/rows.js +15 -0
- package/dist/recording/transport/rows.js.map +1 -0
- package/dist/recording/wiring/emitter-factory.d.ts +39 -0
- package/dist/recording/wiring/emitter-factory.d.ts.map +1 -0
- package/dist/recording/wiring/emitter-factory.js +62 -0
- package/dist/recording/wiring/emitter-factory.js.map +1 -0
- package/dist/recording/wiring/identity.d.ts +27 -0
- package/dist/recording/wiring/identity.d.ts.map +1 -0
- package/dist/recording/wiring/identity.js +51 -0
- package/dist/recording/wiring/identity.js.map +1 -0
- package/dist/recording/wiring/index.d.ts +12 -0
- package/dist/recording/wiring/index.d.ts.map +1 -0
- package/dist/recording/wiring/index.js +9 -0
- package/dist/recording/wiring/index.js.map +1 -0
- package/dist/recording/wiring/record-builders.d.ts +68 -0
- package/dist/recording/wiring/record-builders.d.ts.map +1 -0
- package/dist/recording/wiring/record-builders.js +441 -0
- package/dist/recording/wiring/record-builders.js.map +1 -0
- package/dist/recording/wiring/subscriber.d.ts +21 -0
- package/dist/recording/wiring/subscriber.d.ts.map +1 -0
- package/dist/recording/wiring/subscriber.js +171 -0
- package/dist/recording/wiring/subscriber.js.map +1 -0
- package/dist/recording/wiring/values.d.ts +19 -0
- package/dist/recording/wiring/values.d.ts.map +1 -0
- package/dist/recording/wiring/values.js +49 -0
- package/dist/recording/wiring/values.js.map +1 -0
- package/dist/runtime/create-actions.d.ts.map +1 -1
- package/dist/runtime/create-actions.js +0 -2
- package/dist/runtime/create-actions.js.map +1 -1
- package/dist/runtime/create-runtime-context.d.ts +0 -2
- package/dist/runtime/create-runtime-context.d.ts.map +1 -1
- package/dist/runtime/create-runtime-context.js +0 -1
- package/dist/runtime/create-runtime-context.js.map +1 -1
- package/dist/runtime/create-scanner-module.d.ts +1 -1
- package/dist/runtime/create-scanner-module.d.ts.map +1 -1
- package/dist/runtime/create-scanner-module.js +1 -2
- package/dist/runtime/create-scanner-module.js.map +1 -1
- package/dist/runtime/load-runtime-config.d.ts +9 -0
- package/dist/runtime/load-runtime-config.d.ts.map +1 -1
- package/dist/runtime/load-runtime-config.js +41 -1
- package/dist/runtime/load-runtime-config.js.map +1 -1
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +3 -2
- package/dist/runtime/run.js.map +1 -1
- package/dist/runtime/runtime-schema.d.ts +182 -24
- package/dist/runtime/runtime-schema.d.ts.map +1 -1
- package/dist/runtime/runtime-schema.js +17 -1
- package/dist/runtime/runtime-schema.js.map +1 -1
- package/dist/runtime/runtime.d.ts +15 -5
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +248 -273
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/scanners/engine/data-providers.d.ts +0 -2
- package/dist/scanners/engine/data-providers.d.ts.map +1 -1
- package/dist/scanners/engine/data-providers.js.map +1 -1
- package/dist/scanners/engine/engine.d.ts.map +1 -1
- package/dist/scanners/engine/engine.js +9 -68
- package/dist/scanners/engine/engine.js.map +1 -1
- package/dist/scanners/events.d.ts +6 -0
- package/dist/scanners/events.d.ts.map +1 -1
- package/dist/scanners/events.js.map +1 -1
- package/dist/scanners/runtime-module.d.ts +0 -2
- package/dist/scanners/runtime-module.d.ts.map +1 -1
- package/dist/scanners/runtime-module.js +9 -2
- package/dist/scanners/runtime-module.js.map +1 -1
- package/dist/senpi/client.d.ts +2 -2
- package/dist/senpi/client.d.ts.map +1 -1
- package/dist/senpi/client.js +20 -120
- package/dist/senpi/client.js.map +1 -1
- package/dist/senpi/types.d.ts +1 -68
- package/dist/senpi/types.d.ts.map +1 -1
- package/dist/strategy/strategy-state.d.ts +1 -1
- package/dist/strategy/strategy-state.d.ts.map +1 -1
- package/dist/tracking/spans/plugin-span-tracker.d.ts.map +1 -1
- package/dist/tracking/spans/plugin-span-tracker.js +24 -4
- package/dist/tracking/spans/plugin-span-tracker.js.map +1 -1
- package/dist/tracking/spans/redact-pii.d.ts +0 -10
- package/dist/tracking/spans/redact-pii.d.ts.map +1 -1
- package/dist/tracking/spans/redact-pii.js +2 -80
- package/dist/tracking/spans/redact-pii.js.map +1 -1
- package/dist/types/runtime.d.ts +0 -3
- package/dist/types/runtime.d.ts.map +1 -1
- package/dist/types/strategy.d.ts +2 -2
- package/dist/types/strategy.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/actions/otel-helpers.d.ts +0 -65
- package/dist/actions/otel-helpers.d.ts.map +0 -1
- package/dist/actions/otel-helpers.js +0 -122
- package/dist/actions/otel-helpers.js.map +0 -1
- package/dist/otel/context.d.ts +0 -24
- package/dist/otel/context.d.ts.map +0 -1
- package/dist/otel/context.js +0 -29
- package/dist/otel/context.js.map +0 -1
- package/dist/otel/emitter.d.ts +0 -73
- package/dist/otel/emitter.d.ts.map +0 -1
- package/dist/otel/emitter.js +0 -248
- package/dist/otel/emitter.js.map +0 -1
- package/dist/otel/encode.d.ts +0 -48
- package/dist/otel/encode.d.ts.map +0 -1
- package/dist/otel/encode.js +0 -100
- package/dist/otel/encode.js.map +0 -1
- package/dist/otel/index.d.ts +0 -13
- package/dist/otel/index.d.ts.map +0 -1
- package/dist/otel/index.js +0 -10
- package/dist/otel/index.js.map +0 -1
- package/dist/otel/transport.d.ts +0 -57
- package/dist/otel/transport.d.ts.map +0 -1
- package/dist/otel/transport.js +0 -208
- package/dist/otel/transport.js.map +0 -1
- package/dist/otel/types.d.ts +0 -62
- package/dist/otel/types.d.ts.map +0 -1
- package/dist/otel/types.js +0 -2
- package/dist/otel/types.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batcher.js","sourceRoot":"","sources":["../../../src/recording/transport/batcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client — POSTs a batch of already-serialized telemetry rows to the
|
|
3
|
+
* ingestion service with bearer auth, and parses the
|
|
4
|
+
* `{ accepted, rejected, errors }` response into a {@link SendResult}.
|
|
5
|
+
*
|
|
6
|
+
* It transforms NOTHING (the mapper builds the rows) and NEVER throws: network
|
|
7
|
+
* errors, timeouts, and unreadable bodies resolve to a `SendResult` so the
|
|
8
|
+
* batcher can account for the drop without the failure reaching the caller.
|
|
9
|
+
*
|
|
10
|
+
* Rows arrive pre-serialized (`string[]`): the batcher serializes each row
|
|
11
|
+
* exactly once (for byte accounting) and reuses that JSON here, so the body is
|
|
12
|
+
* assembled by concatenation — never serialized a second time.
|
|
13
|
+
*/
|
|
14
|
+
import type { TransportConfig } from "./config.js";
|
|
15
|
+
/**
|
|
16
|
+
* How a POST resolved. Drives the batcher's counters:
|
|
17
|
+
* - `accepted` — 2xx; the server adjudicated the rows. `accepted`/`rejected`/
|
|
18
|
+
* `errors` carry its verdict (partial acceptance is still a 2xx).
|
|
19
|
+
* - `rejected` — `400`; the server adjudicated the WHOLE batch as invalid
|
|
20
|
+
* (every row bad) — a likely mapper bug.
|
|
21
|
+
* - `oversized` — `413`; the body exceeded the server's size limit. A permanent
|
|
22
|
+
* client-side batching defect — not transient transport, not a per-row bug.
|
|
23
|
+
* - `transport` — network failure, timeout, `401`, `408`, `429`, `5xx`: the
|
|
24
|
+
* batch never reached row adjudication. A transport-health signal.
|
|
25
|
+
*/
|
|
26
|
+
export type SendOutcome = "accepted" | "rejected" | "oversized" | "transport";
|
|
27
|
+
export interface SendResult {
|
|
28
|
+
outcome: SendOutcome;
|
|
29
|
+
/** HTTP status, or 0 when the request never completed (network/timeout). */
|
|
30
|
+
status: number;
|
|
31
|
+
accepted: number;
|
|
32
|
+
rejected: number;
|
|
33
|
+
errors: string[];
|
|
34
|
+
}
|
|
35
|
+
export interface TelemetryClient {
|
|
36
|
+
/** `rowsJson` are pre-serialized rows; the client only frames + POSTs them. */
|
|
37
|
+
sendTraces(rowsJson: readonly string[]): Promise<SendResult>;
|
|
38
|
+
sendLogs(rowsJson: readonly string[]): Promise<SendResult>;
|
|
39
|
+
}
|
|
40
|
+
export declare function createTelemetryClient(config: TransportConfig): TelemetryClient;
|
|
41
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/recording/transport/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAGnD;;;;;;;;;;GAUG;AACH,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,WAAW,CAAC;AAE9E,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,WAAW,CAAC;IACrB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,+EAA+E;IAC/E,UAAU,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7D,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC5D;AAwBD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,eAAe,CA4C9E"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client — POSTs a batch of already-serialized telemetry rows to the
|
|
3
|
+
* ingestion service with bearer auth, and parses the
|
|
4
|
+
* `{ accepted, rejected, errors }` response into a {@link SendResult}.
|
|
5
|
+
*
|
|
6
|
+
* It transforms NOTHING (the mapper builds the rows) and NEVER throws: network
|
|
7
|
+
* errors, timeouts, and unreadable bodies resolve to a `SendResult` so the
|
|
8
|
+
* batcher can account for the drop without the failure reaching the caller.
|
|
9
|
+
*
|
|
10
|
+
* Rows arrive pre-serialized (`string[]`): the batcher serializes each row
|
|
11
|
+
* exactly once (for byte accounting) and reuses that JSON here, so the body is
|
|
12
|
+
* assembled by concatenation — never serialized a second time.
|
|
13
|
+
*/
|
|
14
|
+
import { LOGS_PATH, TRACES_PATH } from "./config.js";
|
|
15
|
+
function toCount(v) {
|
|
16
|
+
return typeof v === "number" && Number.isFinite(v) ? v : 0;
|
|
17
|
+
}
|
|
18
|
+
function toErrors(v) {
|
|
19
|
+
return Array.isArray(v) ? v.filter((e) => typeof e === "string") : [];
|
|
20
|
+
}
|
|
21
|
+
/** Map an HTTP status to the outcome the batcher accounts on. */
|
|
22
|
+
function classify(status) {
|
|
23
|
+
if (status >= 200 && status < 300)
|
|
24
|
+
return "accepted";
|
|
25
|
+
if (status === 400)
|
|
26
|
+
return "rejected"; // whole batch invalid — mapper bug
|
|
27
|
+
if (status === 413)
|
|
28
|
+
return "oversized"; // body too large — client batching defect
|
|
29
|
+
return "transport"; // 401 / 408 / 429 / 5xx / other — rows never adjudicated
|
|
30
|
+
}
|
|
31
|
+
export function createTelemetryClient(config) {
|
|
32
|
+
const base = config.baseUrl.replace(/\/+$/, "");
|
|
33
|
+
async function send(path, bodyKey, rowsJson) {
|
|
34
|
+
const headers = { "Content-Type": "application/json" };
|
|
35
|
+
const token = config.getToken();
|
|
36
|
+
if (token)
|
|
37
|
+
headers.Authorization = `Bearer ${token}`;
|
|
38
|
+
let response;
|
|
39
|
+
try {
|
|
40
|
+
response = await fetch(`${base}${path}`, {
|
|
41
|
+
method: "POST",
|
|
42
|
+
headers,
|
|
43
|
+
// Frame the pre-serialized rows directly — no re-serialization. bodyKey
|
|
44
|
+
// is a fixed literal ("spans"/"logs"), so no escaping is needed.
|
|
45
|
+
body: `{"${bodyKey}":[${rowsJson.join(",")}]}`,
|
|
46
|
+
signal: AbortSignal.timeout(config.requestTimeoutMs),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Network error / timeout / abort — never reached the server.
|
|
51
|
+
return { outcome: "transport", status: 0, accepted: 0, rejected: 0, errors: [] };
|
|
52
|
+
}
|
|
53
|
+
const parsed = (await response
|
|
54
|
+
.json()
|
|
55
|
+
.catch(() => ({})));
|
|
56
|
+
return {
|
|
57
|
+
outcome: classify(response.status),
|
|
58
|
+
status: response.status,
|
|
59
|
+
accepted: toCount(parsed.accepted),
|
|
60
|
+
rejected: toCount(parsed.rejected),
|
|
61
|
+
errors: toErrors(parsed.errors),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
sendTraces: (rowsJson) => send(TRACES_PATH, "spans", rowsJson),
|
|
66
|
+
sendLogs: (rowsJson) => send(LOGS_PATH, "logs", rowsJson),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/recording/transport/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport config — injected, not hard-coupled to `src/tracking/` or the CLI.
|
|
3
|
+
*
|
|
4
|
+
* The caller supplies `getToken` / `baseUrl` (e.g. from the Senpi API-key store
|
|
5
|
+
* + `SENPI_TRACKING_URL`). Keeping the token an injected getter — rather than a
|
|
6
|
+
* captured string — lets the credential rotate without rebuilding the batcher,
|
|
7
|
+
* and keeps this module self-contained, with no dependency on `tracking/`.
|
|
8
|
+
*/
|
|
9
|
+
/** Default ingestion base URL (overridable via `SENPI_TRACKING_URL`). */
|
|
10
|
+
export declare const DEFAULT_BASE_URL = "https://agent-telemetry.prod.senpi.ai";
|
|
11
|
+
/** Endpoint paths, confirmed against the service route registration. */
|
|
12
|
+
export declare const TRACES_PATH = "/v1/traces";
|
|
13
|
+
export declare const LOGS_PATH = "/v1/logs";
|
|
14
|
+
/** Flush cadence — the primary trigger. */
|
|
15
|
+
export declare const DEFAULT_FLUSH_INTERVAL_MS = 5000;
|
|
16
|
+
/**
|
|
17
|
+
* Client-side per-batch byte cap. The server rejects bodies > 10 MiB; we cap
|
|
18
|
+
* under that (the service's own route comment notes the runtime emitter uses an
|
|
19
|
+
* 8 MiB cap with HTTP headroom). Crossing this watermark forces an early flush.
|
|
20
|
+
*/
|
|
21
|
+
export declare const DEFAULT_MAX_BATCH_BYTES: number;
|
|
22
|
+
/** Per-request timeout. Bounds flushes (incl. the best-effort shutdown flush). */
|
|
23
|
+
export declare const DEFAULT_REQUEST_TIMEOUT_MS = 15000;
|
|
24
|
+
export interface TransportConfig {
|
|
25
|
+
/** Resolved ingestion base URL (no trailing slash required). */
|
|
26
|
+
baseUrl: string;
|
|
27
|
+
/** Returns the current bearer token, or undefined when unavailable. */
|
|
28
|
+
getToken: () => string | undefined;
|
|
29
|
+
/** Timer flush cadence in ms. */
|
|
30
|
+
flushIntervalMs: number;
|
|
31
|
+
/** Per-batch byte cap that triggers an early flush. */
|
|
32
|
+
maxBatchBytes: number;
|
|
33
|
+
/** Per-request timeout in ms. */
|
|
34
|
+
requestTimeoutMs: number;
|
|
35
|
+
}
|
|
36
|
+
export interface TransportConfigOptions {
|
|
37
|
+
/** Required: the only thing the caller must supply. */
|
|
38
|
+
getToken: () => string | undefined;
|
|
39
|
+
/** Defaults to `SENPI_TRACKING_URL` if set, else {@link DEFAULT_BASE_URL}. */
|
|
40
|
+
baseUrl?: string;
|
|
41
|
+
flushIntervalMs?: number;
|
|
42
|
+
maxBatchBytes?: number;
|
|
43
|
+
requestTimeoutMs?: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Fill a partial config with defaults, resolving the base URL from env.
|
|
47
|
+
*
|
|
48
|
+
* The `SENPI_TRACKING_URL` lookup is intentionally inlined rather than shared
|
|
49
|
+
* with `src/tracking/`: this module stays self-contained and does not import
|
|
50
|
+
* from `tracking/`, so the three-line resolver lives here by design.
|
|
51
|
+
*/
|
|
52
|
+
export declare function resolveTransportConfig(options: TransportConfigOptions): TransportConfig;
|
|
53
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/recording/transport/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,0CAA0C,CAAC;AAExE,wEAAwE;AACxE,eAAO,MAAM,WAAW,eAAe,CAAC;AACxC,eAAO,MAAM,SAAS,aAAa,CAAC;AAEpC,2CAA2C;AAC3C,eAAO,MAAM,yBAAyB,OAAQ,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,QAAkB,CAAC;AAEvD,kFAAkF;AAClF,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACnC,iCAAiC;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,aAAa,EAAE,MAAM,CAAC;IACtB,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC,uDAAuD;IACvD,QAAQ,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACnC,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,sBAAsB,GAC9B,eAAe,CASjB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport config — injected, not hard-coupled to `src/tracking/` or the CLI.
|
|
3
|
+
*
|
|
4
|
+
* The caller supplies `getToken` / `baseUrl` (e.g. from the Senpi API-key store
|
|
5
|
+
* + `SENPI_TRACKING_URL`). Keeping the token an injected getter — rather than a
|
|
6
|
+
* captured string — lets the credential rotate without rebuilding the batcher,
|
|
7
|
+
* and keeps this module self-contained, with no dependency on `tracking/`.
|
|
8
|
+
*/
|
|
9
|
+
/** Default ingestion base URL (overridable via `SENPI_TRACKING_URL`). */
|
|
10
|
+
export const DEFAULT_BASE_URL = "https://agent-telemetry.prod.senpi.ai";
|
|
11
|
+
/** Endpoint paths, confirmed against the service route registration. */
|
|
12
|
+
export const TRACES_PATH = "/v1/traces";
|
|
13
|
+
export const LOGS_PATH = "/v1/logs";
|
|
14
|
+
/** Flush cadence — the primary trigger. */
|
|
15
|
+
export const DEFAULT_FLUSH_INTERVAL_MS = 5_000;
|
|
16
|
+
/**
|
|
17
|
+
* Client-side per-batch byte cap. The server rejects bodies > 10 MiB; we cap
|
|
18
|
+
* under that (the service's own route comment notes the runtime emitter uses an
|
|
19
|
+
* 8 MiB cap with HTTP headroom). Crossing this watermark forces an early flush.
|
|
20
|
+
*/
|
|
21
|
+
export const DEFAULT_MAX_BATCH_BYTES = 8 * 1024 * 1024;
|
|
22
|
+
/** Per-request timeout. Bounds flushes (incl. the best-effort shutdown flush). */
|
|
23
|
+
export const DEFAULT_REQUEST_TIMEOUT_MS = 15_000;
|
|
24
|
+
/**
|
|
25
|
+
* Fill a partial config with defaults, resolving the base URL from env.
|
|
26
|
+
*
|
|
27
|
+
* The `SENPI_TRACKING_URL` lookup is intentionally inlined rather than shared
|
|
28
|
+
* with `src/tracking/`: this module stays self-contained and does not import
|
|
29
|
+
* from `tracking/`, so the three-line resolver lives here by design.
|
|
30
|
+
*/
|
|
31
|
+
export function resolveTransportConfig(options) {
|
|
32
|
+
const envBase = process.env.SENPI_TRACKING_URL?.trim();
|
|
33
|
+
return {
|
|
34
|
+
getToken: options.getToken,
|
|
35
|
+
baseUrl: options.baseUrl ?? (envBase || DEFAULT_BASE_URL),
|
|
36
|
+
flushIntervalMs: options.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,
|
|
37
|
+
maxBatchBytes: options.maxBatchBytes ?? DEFAULT_MAX_BATCH_BYTES,
|
|
38
|
+
requestTimeoutMs: options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/recording/transport/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,yEAAyE;AACzE,MAAM,CAAC,MAAM,gBAAgB,GAAG,uCAAuC,CAAC;AAExE,wEAAwE;AACxE,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC;AACxC,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC;AAEpC,2CAA2C;AAC3C,MAAM,CAAC,MAAM,yBAAyB,GAAG,KAAK,CAAC;AAE/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvD,kFAAkF;AAClF,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAyBjD;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAA+B;IAE/B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IACvD,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAC;QACzD,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,yBAAyB;QACrE,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,uBAAuB;QAC/D,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,0BAA0B;KACzE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport / micro-batcher — batches already-row-shaped telemetry and ships it
|
|
3
|
+
* to the sibling ingestion service, fire-and-forget. Transforms nothing (the
|
|
4
|
+
* mapper builds the rows); never throws into trading behavior.
|
|
5
|
+
*
|
|
6
|
+
* The row types (`TraceRow` / `LogRow`) mirror the service contract and are the
|
|
7
|
+
* boundary with the mapper that produces them.
|
|
8
|
+
*/
|
|
9
|
+
export type { TraceRow, LogRow, SpanEventRow, SpanKind, StatusCode, TracesEnvelope, LogsEnvelope, IngestResponse, } from "./rows.js";
|
|
10
|
+
export { DEFAULT_BASE_URL, DEFAULT_FLUSH_INTERVAL_MS, DEFAULT_MAX_BATCH_BYTES, DEFAULT_REQUEST_TIMEOUT_MS, TRACES_PATH, LOGS_PATH, resolveTransportConfig, } from "./config.js";
|
|
11
|
+
export type { TransportConfig, TransportConfigOptions } from "./config.js";
|
|
12
|
+
export { createTelemetryClient } from "./client.js";
|
|
13
|
+
export type { TelemetryClient, SendResult, SendOutcome } from "./client.js";
|
|
14
|
+
export { createBatcher } from "./batcher.js";
|
|
15
|
+
export type { TelemetryBatcher, BatcherStats, SignalStats } from "./batcher.js";
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/recording/transport/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,YAAY,EACV,QAAQ,EACR,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,cAAc,EACd,YAAY,EACZ,cAAc,GACf,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,EAC1B,WAAW,EACX,SAAS,EACT,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5E,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport / micro-batcher — batches already-row-shaped telemetry and ships it
|
|
3
|
+
* to the sibling ingestion service, fire-and-forget. Transforms nothing (the
|
|
4
|
+
* mapper builds the rows); never throws into trading behavior.
|
|
5
|
+
*
|
|
6
|
+
* The row types (`TraceRow` / `LogRow`) mirror the service contract and are the
|
|
7
|
+
* boundary with the mapper that produces them.
|
|
8
|
+
*/
|
|
9
|
+
export { DEFAULT_BASE_URL, DEFAULT_FLUSH_INTERVAL_MS, DEFAULT_MAX_BATCH_BYTES, DEFAULT_REQUEST_TIMEOUT_MS, TRACES_PATH, LOGS_PATH, resolveTransportConfig, } from "./config.js";
|
|
10
|
+
export { createTelemetryClient } from "./client.js";
|
|
11
|
+
export { createBatcher } from "./batcher.js";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/recording/transport/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,OAAO,EACL,gBAAgB,EAChB,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,EAC1B,WAAW,EACX,SAAS,EACT,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry wire types — the mapper produces these; the transport ships them
|
|
3
|
+
* unchanged.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors the sibling ingestion service's row types verbatim: the destination
|
|
6
|
+
* ClickHouse row shapes — PascalCase keys, flat `Record<string,string>`
|
|
7
|
+
* attribute maps, epoch-ns timestamps as digit-strings, lowercase-hex ids,
|
|
8
|
+
* precomputed `Duration`. No OTLP envelope, no `AnyValue`.
|
|
9
|
+
*
|
|
10
|
+
* This module performs NO validation — the server's validator is the single
|
|
11
|
+
* source of truth for the hex/timestamp/enum rules; re-implementing them here
|
|
12
|
+
* would couple us to the service and drift.
|
|
13
|
+
*/
|
|
14
|
+
export type SpanKind = "Internal" | "Server" | "Client" | "Producer" | "Consumer" | "Unspecified";
|
|
15
|
+
export type StatusCode = "Unset" | "Ok" | "Error";
|
|
16
|
+
export interface SpanEventRow {
|
|
17
|
+
/** epoch ns as digit string. */
|
|
18
|
+
Timestamp: string;
|
|
19
|
+
Name: string;
|
|
20
|
+
Attributes: Record<string, string>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A span row on the wire / destined for Kafka. `address` is a derived field
|
|
24
|
+
* used for ownership + per-agent keying — not a ClickHouse column.
|
|
25
|
+
*/
|
|
26
|
+
export interface TraceRow {
|
|
27
|
+
/** epoch ns as string (span start). */
|
|
28
|
+
Timestamp: string;
|
|
29
|
+
/** 32-hex lowercase. */
|
|
30
|
+
TraceId: string;
|
|
31
|
+
/** 16-hex lowercase. */
|
|
32
|
+
SpanId: string;
|
|
33
|
+
/** 16-hex or empty string for roots. */
|
|
34
|
+
ParentSpanId: string;
|
|
35
|
+
TraceState: string;
|
|
36
|
+
SpanName: string;
|
|
37
|
+
SpanKind: SpanKind;
|
|
38
|
+
ServiceName: string;
|
|
39
|
+
/** end − start, ns, as string. */
|
|
40
|
+
Duration: string;
|
|
41
|
+
StatusCode: StatusCode;
|
|
42
|
+
StatusMessage: string;
|
|
43
|
+
SpanAttributes: Record<string, string>;
|
|
44
|
+
ResourceAttributes: Record<string, string>;
|
|
45
|
+
Events: SpanEventRow[];
|
|
46
|
+
ScopeName: string;
|
|
47
|
+
ScopeVersion: string;
|
|
48
|
+
TraceFlags: number;
|
|
49
|
+
/** Derived: lower(ResourceAttributes['strategy.address']); '' when absent. */
|
|
50
|
+
address: string;
|
|
51
|
+
}
|
|
52
|
+
/** A log row on the wire / destined for Kafka. `address` is a derived field. */
|
|
53
|
+
export interface LogRow {
|
|
54
|
+
/** epoch ns as digit string. */
|
|
55
|
+
Timestamp: string;
|
|
56
|
+
TraceId: string;
|
|
57
|
+
SpanId: string;
|
|
58
|
+
TraceFlags: number;
|
|
59
|
+
SeverityText: string;
|
|
60
|
+
SeverityNumber: number;
|
|
61
|
+
ServiceName: string;
|
|
62
|
+
Body: string;
|
|
63
|
+
ResourceAttributes: Record<string, string>;
|
|
64
|
+
ScopeName: string;
|
|
65
|
+
ScopeVersion: string;
|
|
66
|
+
LogAttributes: Record<string, string>;
|
|
67
|
+
/** Maps to the EventName CH column — the log-type discriminator. */
|
|
68
|
+
EventName: string;
|
|
69
|
+
/** Derived: lower(ResourceAttributes['strategy.address']); '' when absent. */
|
|
70
|
+
address: string;
|
|
71
|
+
}
|
|
72
|
+
export interface TracesEnvelope {
|
|
73
|
+
spans: TraceRow[];
|
|
74
|
+
}
|
|
75
|
+
export interface LogsEnvelope {
|
|
76
|
+
logs: LogRow[];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Server response. Partial acceptance is a `200`; a shortfall in `accepted`
|
|
80
|
+
* means rows the server refused (e.g. a malformed row that got through the
|
|
81
|
+
* mapper). A `400` means the whole batch failed validation.
|
|
82
|
+
*/
|
|
83
|
+
export interface IngestResponse {
|
|
84
|
+
accepted: number;
|
|
85
|
+
rejected: number;
|
|
86
|
+
errors?: string[];
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=rows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../../../src/recording/transport/rows.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,QAAQ,GAChB,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,UAAU,GACV,aAAa,CAAC;AAElB,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,gFAAgF;AAChF,MAAM,WAAW,MAAM;IACrB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;CACjB;AAKD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry wire types — the mapper produces these; the transport ships them
|
|
3
|
+
* unchanged.
|
|
4
|
+
*
|
|
5
|
+
* Mirrors the sibling ingestion service's row types verbatim: the destination
|
|
6
|
+
* ClickHouse row shapes — PascalCase keys, flat `Record<string,string>`
|
|
7
|
+
* attribute maps, epoch-ns timestamps as digit-strings, lowercase-hex ids,
|
|
8
|
+
* precomputed `Duration`. No OTLP envelope, no `AnyValue`.
|
|
9
|
+
*
|
|
10
|
+
* This module performs NO validation — the server's validator is the single
|
|
11
|
+
* source of truth for the hex/timestamp/enum rules; re-implementing them here
|
|
12
|
+
* would couple us to the service and drift.
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=rows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rows.js","sourceRoot":"","sources":["../../../src/recording/transport/rows.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Construct the recording emitter at boot. Telemetry is ON by default; it degrades to the inert
|
|
3
|
+
* {@link NoopEmitter} when explicitly disabled or when no API token is available — a missing token
|
|
4
|
+
* is never a boot failure. When live, an {@link OtelEmitter} feeds a {@link TelemetryBatcher} that
|
|
5
|
+
* must be shut down on stop.
|
|
6
|
+
*/
|
|
7
|
+
import type { IdentityEnvelope } from "../identity.js";
|
|
8
|
+
import type { RecordingEmitter } from "../emitter.js";
|
|
9
|
+
import { type TelemetryBatcher } from "../transport/index.js";
|
|
10
|
+
export interface RecordingEmitterOptions {
|
|
11
|
+
/** Resolved enable flag (config + env already applied by the caller). */
|
|
12
|
+
readonly enabled: boolean;
|
|
13
|
+
/** Bearer token (the `SENPI_API_KEY` JWT); absent → degrade to Noop. */
|
|
14
|
+
readonly token?: string;
|
|
15
|
+
/** Built lazily — only invoked on the live path, so the config canonicalize + hash is never
|
|
16
|
+
* computed for a noop emitter. */
|
|
17
|
+
readonly identity: () => IdentityEnvelope;
|
|
18
|
+
/** Emitter scope version — the real package version, wired at boot. */
|
|
19
|
+
readonly scopeVersion: string;
|
|
20
|
+
/** Ingestion base URL override (else env / default, resolved by the transport). */
|
|
21
|
+
readonly baseUrl?: string;
|
|
22
|
+
readonly flushIntervalMs?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface RecordingComponents {
|
|
25
|
+
readonly emitter: RecordingEmitter;
|
|
26
|
+
/** The batcher to flush/stop on shutdown; `null` when the emitter is a Noop. */
|
|
27
|
+
readonly batcher: TelemetryBatcher | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Build the emitter + (optional) batcher. Never throws: any construction error degrades to Noop so
|
|
31
|
+
* telemetry can never block boot.
|
|
32
|
+
*/
|
|
33
|
+
export declare function createRecordingComponents(options: RecordingEmitterOptions): RecordingComponents;
|
|
34
|
+
/**
|
|
35
|
+
* Resolve the enable flag: explicit env override wins, else the recipe's `telemetry.enabled`, else
|
|
36
|
+
* the default (`true`). Recognized env truthy/falsy spellings keep an ops override unambiguous.
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolveTelemetryEnabled(configEnabled: boolean | undefined, envValue: string | undefined): boolean;
|
|
39
|
+
//# sourceMappingURL=emitter-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter-factory.d.ts","sourceRoot":"","sources":["../../../src/recording/wiring/emitter-factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtD,OAAO,EAAyC,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAKrG,MAAM,WAAW,uBAAuB;IACtC,yEAAyE;IACzE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,wEAAwE;IACxE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;sCACkC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,gBAAgB,CAAC;IAC1C,uEAAuE;IACvE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,mFAAmF;IACnF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC3C;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,uBAAuB,GAAG,mBAAmB,CA+B/F;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,OAAO,GAAG,SAAS,EAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAWT"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Construct the recording emitter at boot. Telemetry is ON by default; it degrades to the inert
|
|
3
|
+
* {@link NoopEmitter} when explicitly disabled or when no API token is available — a missing token
|
|
4
|
+
* is never a boot failure. When live, an {@link OtelEmitter} feeds a {@link TelemetryBatcher} that
|
|
5
|
+
* must be shut down on stop.
|
|
6
|
+
*/
|
|
7
|
+
import { noopEmitter } from "../noop-emitter.js";
|
|
8
|
+
import { OtelEmitter } from "../otel/index.js";
|
|
9
|
+
import { createBatcher, resolveTransportConfig } from "../transport/index.js";
|
|
10
|
+
import { createLogger } from "../../utils/logger.js";
|
|
11
|
+
const logger = createLogger("[recording][wiring]");
|
|
12
|
+
/**
|
|
13
|
+
* Build the emitter + (optional) batcher. Never throws: any construction error degrades to Noop so
|
|
14
|
+
* telemetry can never block boot.
|
|
15
|
+
*/
|
|
16
|
+
export function createRecordingComponents(options) {
|
|
17
|
+
if (!options.enabled) {
|
|
18
|
+
logger.info("telemetry recording disabled by config/env; using noop emitter");
|
|
19
|
+
return { emitter: noopEmitter, batcher: null };
|
|
20
|
+
}
|
|
21
|
+
const token = options.token;
|
|
22
|
+
if (!token) {
|
|
23
|
+
logger.warn("telemetry recording enabled but no SENPI_API_KEY available; degrading to noop emitter (no telemetry will be shipped)");
|
|
24
|
+
return { emitter: noopEmitter, batcher: null };
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const identity = options.identity();
|
|
28
|
+
const batcher = createBatcher(resolveTransportConfig({
|
|
29
|
+
getToken: () => token,
|
|
30
|
+
baseUrl: options.baseUrl,
|
|
31
|
+
flushIntervalMs: options.flushIntervalMs,
|
|
32
|
+
}));
|
|
33
|
+
const emitter = new OtelEmitter(identity, batcher, { scopeVersion: options.scopeVersion });
|
|
34
|
+
logger.info("telemetry recording enabled", { service: identity.service });
|
|
35
|
+
return { emitter, batcher };
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
logger.warn("failed to construct telemetry emitter; degrading to noop", {
|
|
39
|
+
err: err instanceof Error ? err.message : String(err),
|
|
40
|
+
});
|
|
41
|
+
return { emitter: noopEmitter, batcher: null };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Resolve the enable flag: explicit env override wins, else the recipe's `telemetry.enabled`, else
|
|
46
|
+
* the default (`true`). Recognized env truthy/falsy spellings keep an ops override unambiguous.
|
|
47
|
+
*/
|
|
48
|
+
export function resolveTelemetryEnabled(configEnabled, envValue) {
|
|
49
|
+
const env = envValue?.trim().toLowerCase();
|
|
50
|
+
if (env === "false" || env === "0" || env === "no" || env === "off")
|
|
51
|
+
return false;
|
|
52
|
+
if (env === "true" || env === "1" || env === "yes" || env === "on")
|
|
53
|
+
return true;
|
|
54
|
+
if (env !== undefined && env !== "") {
|
|
55
|
+
// Telemetry is on by default, so a typo'd opt-out must not be silent.
|
|
56
|
+
logger.warn("unrecognized SENPI_TELEMETRY_ENABLED value; ignoring (use true/false/1/0/yes/no/on/off)", {
|
|
57
|
+
value: envValue,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return configEnabled ?? true;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=emitter-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter-factory.js","sourceRoot":"","sources":["../../../src/recording/wiring/emitter-factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAyB,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,MAAM,GAAG,YAAY,CAAC,qBAAqB,CAAC,CAAC;AAuBnD;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAgC;IACxE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CACT,sHAAsH,CACvH,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,aAAa,CAC3B,sBAAsB,CAAC;YACrB,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;YACrB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,eAAe,EAAE,OAAO,CAAC,eAAe;SACzC,CAAC,CACH,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QAC3F,MAAM,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1E,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,0DAA0D,EAAE;YACtE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACtD,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACjD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,aAAkC,EAClC,QAA4B;IAE5B,MAAM,GAAG,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAClF,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChF,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACpC,sEAAsE;QACtE,MAAM,CAAC,IAAI,CAAC,yFAAyF,EAAE;YACrG,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,aAAa,IAAI,IAAI,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the {@link IdentityEnvelope} and the config fingerprint stamped on every recorded row.
|
|
3
|
+
*
|
|
4
|
+
* The hash is computed over the **unresolved** config (raw, pre-`${VAR}`) with canonically sorted
|
|
5
|
+
* keys: this keeps it stable across secret rotation and deterministic for a byte-identical recipe,
|
|
6
|
+
* and means it never carries resolved secrets.
|
|
7
|
+
*/
|
|
8
|
+
import type { IdentityEnvelope } from "../identity.js";
|
|
9
|
+
/** Logical producer name stamped as `service.name` on every row. Must stay `senpi-trading-runtime`:
|
|
10
|
+
* it matches the sibling ingestion service's documented convention and the rows already in its
|
|
11
|
+
* ClickHouse tables, where `ServiceName` is part of the sort key. */
|
|
12
|
+
export declare const SERVICE_NAME = "senpi-trading-runtime";
|
|
13
|
+
/** SHA-256 hex of the canonicalized unresolved config; `undefined` when no config is available. */
|
|
14
|
+
export declare function computeConfigHash(unresolvedConfig: Record<string, unknown> | undefined): string | undefined;
|
|
15
|
+
export interface BuildIdentityParams {
|
|
16
|
+
/** Recipe / runtime name (the config's top-level `name`). */
|
|
17
|
+
readonly name: string;
|
|
18
|
+
readonly recipeVersion?: string | number;
|
|
19
|
+
/** Strategy identifier = wallet address. */
|
|
20
|
+
readonly strategyAddress: string;
|
|
21
|
+
/** Per-process boot id. */
|
|
22
|
+
readonly bootId: string;
|
|
23
|
+
/** Unresolved config, used to fingerprint the recipe (`configHash`). */
|
|
24
|
+
readonly unresolvedConfig?: Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
export declare function buildIdentity(params: BuildIdentityParams): IdentityEnvelope;
|
|
27
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/recording/wiring/identity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD;;qEAEqE;AACrE,eAAO,MAAM,YAAY,0BAA0B,CAAC;AAiBpD,mGAAmG;AACnG,wBAAgB,iBAAiB,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAO3G;AAED,MAAM,WAAW,mBAAmB;IAClC,6DAA6D;IAC7D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzC,4CAA4C;IAC5C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,2BAA2B;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,gBAAgB,CAU3E"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build the {@link IdentityEnvelope} and the config fingerprint stamped on every recorded row.
|
|
3
|
+
*
|
|
4
|
+
* The hash is computed over the **unresolved** config (raw, pre-`${VAR}`) with canonically sorted
|
|
5
|
+
* keys: this keeps it stable across secret rotation and deterministic for a byte-identical recipe,
|
|
6
|
+
* and means it never carries resolved secrets.
|
|
7
|
+
*/
|
|
8
|
+
import { createHash } from "node:crypto";
|
|
9
|
+
/** Logical producer name stamped as `service.name` on every row. Must stay `senpi-trading-runtime`:
|
|
10
|
+
* it matches the sibling ingestion service's documented convention and the rows already in its
|
|
11
|
+
* ClickHouse tables, where `ServiceName` is part of the sort key. */
|
|
12
|
+
export const SERVICE_NAME = "senpi-trading-runtime";
|
|
13
|
+
/**
|
|
14
|
+
* Canonical JSON with recursively sorted object keys, so two structurally-equal configs serialize
|
|
15
|
+
* identically regardless of key order. Arrays keep their order (order is meaningful there).
|
|
16
|
+
*/
|
|
17
|
+
function canonicalize(value) {
|
|
18
|
+
if (Array.isArray(value))
|
|
19
|
+
return value.map(canonicalize);
|
|
20
|
+
if (value !== null && typeof value === "object") {
|
|
21
|
+
const obj = value;
|
|
22
|
+
const out = {};
|
|
23
|
+
for (const key of Object.keys(obj).sort())
|
|
24
|
+
out[key] = canonicalize(obj[key]);
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
/** SHA-256 hex of the canonicalized unresolved config; `undefined` when no config is available. */
|
|
30
|
+
export function computeConfigHash(unresolvedConfig) {
|
|
31
|
+
if (!unresolvedConfig)
|
|
32
|
+
return undefined;
|
|
33
|
+
try {
|
|
34
|
+
return createHash("sha256").update(JSON.stringify(canonicalize(unresolvedConfig))).digest("hex");
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function buildIdentity(params) {
|
|
41
|
+
return {
|
|
42
|
+
service: SERVICE_NAME,
|
|
43
|
+
recipe: params.name,
|
|
44
|
+
recipeVersion: params.recipeVersion,
|
|
45
|
+
runtime: params.name,
|
|
46
|
+
strategyAddress: params.strategyAddress,
|
|
47
|
+
bootId: params.bootId,
|
|
48
|
+
configHash: computeConfigHash(params.unresolvedConfig),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/recording/wiring/identity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;qEAEqE;AACrE,MAAM,CAAC,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAEpD;;;GAGG;AACH,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACzD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,KAAgC,CAAC;QAC7C,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7E,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,iBAAiB,CAAC,gBAAqD;IACrF,IAAI,CAAC,gBAAgB;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAcD,MAAM,UAAU,aAAa,CAAC,MAA2B;IACvD,OAAO;QACL,OAAO,EAAE,YAAY;QACrB,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,OAAO,EAAE,MAAM,CAAC,IAAI;QACpB,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,iBAAiB,CAAC,MAAM,CAAC,gBAAgB,CAAC;KACvD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `src/recording/wiring/` — the integration seam between the trading runtime and the recording
|
|
3
|
+
* emitter: build the identity/emitter at boot, subscribe to the `SenpiEventBus`, and turn events
|
|
4
|
+
* into records. Pure consumer; no producer change.
|
|
5
|
+
*/
|
|
6
|
+
export { buildIdentity, computeConfigHash, SERVICE_NAME } from "./identity.js";
|
|
7
|
+
export type { BuildIdentityParams } from "./identity.js";
|
|
8
|
+
export { createRecordingComponents, resolveTelemetryEnabled } from "./emitter-factory.js";
|
|
9
|
+
export type { RecordingComponents, RecordingEmitterOptions } from "./emitter-factory.js";
|
|
10
|
+
export { createRecordingSubscriber } from "./subscriber.js";
|
|
11
|
+
export type { RecordingSubscriber, RecordingSubscriberDeps } from "./subscriber.js";
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/recording/wiring/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC/E,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC1F,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,YAAY,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `src/recording/wiring/` — the integration seam between the trading runtime and the recording
|
|
3
|
+
* emitter: build the identity/emitter at boot, subscribe to the `SenpiEventBus`, and turn events
|
|
4
|
+
* into records. Pure consumer; no producer change.
|
|
5
|
+
*/
|
|
6
|
+
export { buildIdentity, computeConfigHash, SERVICE_NAME } from "./identity.js";
|
|
7
|
+
export { createRecordingComponents, resolveTelemetryEnabled } from "./emitter-factory.js";
|
|
8
|
+
export { createRecordingSubscriber } from "./subscriber.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/recording/wiring/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE/E,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE1F,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC"}
|