@narumitw/pi-langfuse 0.50.5 → 0.51.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.
@@ -0,0 +1,352 @@
1
+ // @generated by scripts/build-runtime.mjs; do not edit.
2
+ // @ts-nocheck -- the generated entry uses a .ts extension for Pi's Jiti loader.
3
+ import {
4
+ DEFAULT_BASE_URL,
5
+ createLangfuseRuntimeFromBackend,
6
+ getLangfuseRuntimeInternal
7
+ } from "./chunk-IASLJKKB.js";
8
+
9
+ // src/runtime.ts
10
+ import { createHash } from "node:crypto";
11
+ import { LangfuseSpanProcessor } from "@langfuse/otel";
12
+ import {
13
+ LangfuseOtelSpanAttributes,
14
+ setLangfuseTracerProvider,
15
+ startObservation
16
+ } from "@langfuse/tracing";
17
+ import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
18
+ var RUNTIME_KEY = /* @__PURE__ */ Symbol.for("@narumitw/pi-langfuse/runtime/v2");
19
+ var LEGACY_RUNTIME_KEY = /* @__PURE__ */ Symbol.for("@narumitw/pi-langfuse/runtime/v1");
20
+ var ProductionObservation = class {
21
+ constructor(native, secrets) {
22
+ this.native = native;
23
+ this.secrets = secrets;
24
+ this.traceId = native.traceId;
25
+ }
26
+ native;
27
+ secrets;
28
+ traceId;
29
+ update(attributes) {
30
+ const { sessionId, userId, ...observationAttributes } = maskObservationAttributes(attributes, this.secrets);
31
+ this.native.updateOtelSpanAttributes(observationAttributes);
32
+ applySessionId(this.native, sessionId);
33
+ applyUserId(this.native, userId);
34
+ return this;
35
+ }
36
+ updateTrace(attributes) {
37
+ const { input, output, metadata, name, sessionId, userId, tags, version } = maskObservationAttributes(
38
+ attributes,
39
+ this.secrets
40
+ );
41
+ if (input !== void 0 || output !== void 0) {
42
+ this.native.setTraceIO({ input, output });
43
+ }
44
+ if (name !== void 0) {
45
+ this.native.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_NAME, name);
46
+ }
47
+ applySessionId(this.native, sessionId);
48
+ applyUserId(this.native, userId);
49
+ if (tags !== void 0) {
50
+ this.native.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_TAGS, tags);
51
+ }
52
+ if (version !== void 0) {
53
+ this.native.otelSpan.setAttribute(LangfuseOtelSpanAttributes.VERSION, version);
54
+ }
55
+ for (const [key, value] of Object.entries(metadata ?? {})) {
56
+ const serialized = serializeMetadataValue(value);
57
+ if (serialized !== void 0) {
58
+ this.native.otelSpan.setAttribute(`${LangfuseOtelSpanAttributes.TRACE_METADATA}.${key}`, serialized);
59
+ }
60
+ }
61
+ return this;
62
+ }
63
+ end(endTime) {
64
+ this.native.end(endTime);
65
+ return this;
66
+ }
67
+ };
68
+ var ProductionTraceBackend = class {
69
+ constructor(provider, processor, secrets) {
70
+ this.provider = provider;
71
+ this.processor = processor;
72
+ this.secrets = secrets;
73
+ }
74
+ provider;
75
+ processor;
76
+ secrets;
77
+ start(name, attributes, options) {
78
+ const maskedName = maskSecretString(name, this.secrets);
79
+ const { sessionId, userId, ...observationAttributes } = maskObservationAttributes(attributes, this.secrets);
80
+ const parent = options.parent;
81
+ const native = parent instanceof ProductionObservation ? startChild(parent.native, maskedName, observationAttributes, options.asType, options.startTime) : startRoot(maskedName, observationAttributes, options.asType, options.startTime);
82
+ applySessionId(native, sessionId);
83
+ applyUserId(native, userId);
84
+ return new ProductionObservation(native, this.secrets);
85
+ }
86
+ async forceFlush() {
87
+ await this.processor.forceFlush();
88
+ }
89
+ async shutdown() {
90
+ await this.provider.shutdown();
91
+ }
92
+ };
93
+ async function createLangfuseRuntime(options = {}) {
94
+ return createSharedRuntime(resolveLangfuseRuntimeConfig(options), defaultFactories);
95
+ }
96
+ async function createProductionBackend(config, factoryOverrides = {}) {
97
+ const runtime = await createSharedRuntime(resolveLangfuseRuntimeConfig({ config, env: false }), {
98
+ ...defaultFactories,
99
+ ...factoryOverrides
100
+ });
101
+ return getLangfuseRuntimeInternal(runtime).backend;
102
+ }
103
+ async function createSharedRuntime(config, factories) {
104
+ const globalRuntime = globalThis;
105
+ const fingerprint = configFingerprint(config);
106
+ const existing = globalRuntime[RUNTIME_KEY];
107
+ const legacyRuntime = globalRuntime[LEGACY_RUNTIME_KEY];
108
+ if (legacyRuntime !== void 0 && legacyRuntime !== existing) {
109
+ throw new Error("An older Langfuse runtime is already loaded; restart the process before enabling this version.");
110
+ }
111
+ if (existing) {
112
+ if (legacyRuntime === void 0) globalRuntime[LEGACY_RUNTIME_KEY] = existing;
113
+ const shared = await existing;
114
+ if (shared.runtime.closed) {
115
+ throw new Error("Langfuse tracing was already shut down; restart the process to enable it again.");
116
+ }
117
+ if (shared.fingerprint !== fingerprint) {
118
+ throw new Error("Langfuse configuration changed; restart the process to apply the new credentials.");
119
+ }
120
+ return shared.runtime;
121
+ }
122
+ const initializing = initializeRuntime(config, fingerprint, factories);
123
+ globalRuntime[RUNTIME_KEY] = initializing;
124
+ globalRuntime[LEGACY_RUNTIME_KEY] = initializing;
125
+ try {
126
+ return (await initializing).runtime;
127
+ } catch (error) {
128
+ if (globalRuntime[RUNTIME_KEY] === initializing) delete globalRuntime[RUNTIME_KEY];
129
+ if (globalRuntime[LEGACY_RUNTIME_KEY] === initializing) delete globalRuntime[LEGACY_RUNTIME_KEY];
130
+ throw error;
131
+ }
132
+ }
133
+ async function initializeRuntime(config, fingerprint, factories) {
134
+ const processor = factories.createProcessor(config);
135
+ let provider;
136
+ try {
137
+ provider = factories.createProvider(processor);
138
+ factories.selectProvider(provider);
139
+ } catch (error) {
140
+ await (provider?.shutdown() ?? processor.shutdown()).catch(() => void 0);
141
+ throw error;
142
+ }
143
+ const runtime = getLangfuseRuntimeInternal(
144
+ createLangfuseRuntimeFromBackend(
145
+ new ProductionTraceBackend(provider, processor, [config.publicKey, config.secretKey])
146
+ )
147
+ );
148
+ return { fingerprint, runtime, shutdown: true };
149
+ }
150
+ var defaultFactories = {
151
+ createProcessor: (config) => {
152
+ const secrets = [config.secretKey, config.publicKey];
153
+ return new LangfuseSpanProcessor({
154
+ publicKey: config.publicKey,
155
+ secretKey: config.secretKey,
156
+ baseUrl: config.baseUrl,
157
+ environment: config.environment ?? "",
158
+ release: config.release ?? "",
159
+ flushAt: 512,
160
+ flushInterval: 5,
161
+ timeout: 5,
162
+ mask: ({ data }) => maskSecrets(data, secrets),
163
+ shouldExportSpan: ({ otelSpan }) => typeof otelSpan.attributes["langfuse.observation.type"] === "string"
164
+ });
165
+ },
166
+ createProvider: (processor) => new NodeTracerProvider({ spanProcessors: [processor] }),
167
+ selectProvider: setLangfuseTracerProvider
168
+ };
169
+ function resolveLangfuseRuntimeConfig(options) {
170
+ const env = options.env === false ? void 0 : options.env ?? process.env;
171
+ const publicKey = requiredSetting("publicKey", options.config?.publicKey, env?.LANGFUSE_PUBLIC_KEY);
172
+ const secretKey = requiredSetting("secretKey", options.config?.secretKey, env?.LANGFUSE_SECRET_KEY);
173
+ const explicitBaseUrl = options.config?.baseUrl;
174
+ if (explicitBaseUrl !== void 0 && !normalizeString(explicitBaseUrl)) {
175
+ throw new Error("Langfuse baseUrl must be a non-empty string.");
176
+ }
177
+ const rawBaseUrl = selectedSetting(explicitBaseUrl, env?.LANGFUSE_BASE_URL) ?? DEFAULT_BASE_URL;
178
+ const baseUrl = normalizeBaseUrl(rawBaseUrl);
179
+ if (!baseUrl) {
180
+ throw new Error("Langfuse baseUrl must use HTTP or HTTPS without credentials, a query, or a fragment.");
181
+ }
182
+ const environment = optionalSetting("environment", options.config?.environment, env?.LANGFUSE_TRACING_ENVIRONMENT);
183
+ if (environment && (environment.length > 40 || !/^(?!langfuse)[a-z0-9_-]+$/u.test(environment))) {
184
+ throw new Error(
185
+ "Langfuse environment must be at most 40 lowercase letters, numbers, hyphens, or underscores and must not start with langfuse."
186
+ );
187
+ }
188
+ const release = optionalSetting("release", options.config?.release, env?.LANGFUSE_RELEASE);
189
+ return { publicKey, secretKey, baseUrl, ...environment ? { environment } : {}, ...release ? { release } : {} };
190
+ }
191
+ function requiredSetting(name, explicit, environment) {
192
+ const value = selectedSetting(explicit, environment);
193
+ if (!value) throw new Error(`Langfuse ${name} is required.`);
194
+ return value;
195
+ }
196
+ function optionalSetting(name, explicit, environment) {
197
+ const selected = explicit !== void 0 ? explicit : environment;
198
+ if (selected === void 0) return void 0;
199
+ const value = normalizeString(selected);
200
+ if (!value) throw new Error(`Langfuse ${name} must be a non-empty string.`);
201
+ return value;
202
+ }
203
+ function selectedSetting(explicit, environment) {
204
+ if (explicit !== void 0) return normalizeString(explicit);
205
+ return normalizeString(environment);
206
+ }
207
+ function normalizeBaseUrl(value) {
208
+ try {
209
+ const url = new URL(value);
210
+ if (url.protocol !== "http:" && url.protocol !== "https:") return void 0;
211
+ if (url.username || url.password || url.search || url.hash) return void 0;
212
+ return url.toString().replace(/\/+$/, "");
213
+ } catch {
214
+ return void 0;
215
+ }
216
+ }
217
+ function normalizeString(value) {
218
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
219
+ }
220
+ function serializeMetadataValue(value) {
221
+ return typeof value === "string" ? value : JSON.stringify(value);
222
+ }
223
+ function maskObservationAttributes(attributes, secrets) {
224
+ return {
225
+ ...attributes,
226
+ ...attributes.metadata ? { metadata: maskSecrets(attributes.metadata, secrets) } : {},
227
+ ...attributes.name ? { name: maskSecretString(attributes.name, secrets) } : {},
228
+ ...attributes.sessionId ? { sessionId: maskSecretString(attributes.sessionId, secrets) } : {},
229
+ ...attributes.userId ? { userId: maskSecretString(attributes.userId, secrets) } : {},
230
+ ...attributes.tags ? { tags: attributes.tags.map((tag) => maskSecretString(tag, secrets)) } : {},
231
+ ...attributes.statusMessage ? { statusMessage: maskSecretString(attributes.statusMessage, secrets) } : {},
232
+ ...attributes.model ? { model: maskSecretString(attributes.model, secrets) } : {},
233
+ ...attributes.version ? { version: maskSecretString(attributes.version, secrets) } : {},
234
+ ...attributes.modelParameters ? {
235
+ modelParameters: Object.fromEntries(
236
+ Object.entries(attributes.modelParameters).map(([key, value]) => [
237
+ maskSecretString(key, secrets),
238
+ typeof value === "string" ? maskSecretString(value, secrets) : value
239
+ ])
240
+ )
241
+ } : {}
242
+ };
243
+ }
244
+ function maskSecretString(value, secrets) {
245
+ return maskSecrets(value, secrets);
246
+ }
247
+ function applySessionId(observation, sessionId) {
248
+ if (sessionId !== void 0) {
249
+ observation.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_SESSION_ID, sessionId);
250
+ }
251
+ }
252
+ function applyUserId(observation, userId) {
253
+ if (userId !== void 0) {
254
+ observation.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_USER_ID, userId);
255
+ }
256
+ }
257
+ function startRoot(name, attributes, type, startTime) {
258
+ if (type === "agent") {
259
+ return startObservation(name, attributes, { asType: "agent", startTime });
260
+ }
261
+ if (type === "generation") {
262
+ return startObservation(name, attributes, {
263
+ asType: "generation",
264
+ startTime
265
+ });
266
+ }
267
+ if (type === "tool") {
268
+ return startObservation(name, attributes, { asType: "tool", startTime });
269
+ }
270
+ return startObservation(name, attributes, { asType: "span", startTime });
271
+ }
272
+ function startChild(parent, name, attributes, type, startTime) {
273
+ if (startTime) {
274
+ const parentSpanContext = parent.otelSpan.spanContext();
275
+ if (type === "agent") {
276
+ return startObservation(name, attributes, {
277
+ asType: "agent",
278
+ parentSpanContext,
279
+ startTime
280
+ });
281
+ }
282
+ if (type === "generation") {
283
+ return startObservation(name, attributes, {
284
+ asType: "generation",
285
+ parentSpanContext,
286
+ startTime
287
+ });
288
+ }
289
+ if (type === "tool") {
290
+ return startObservation(name, attributes, {
291
+ asType: "tool",
292
+ parentSpanContext,
293
+ startTime
294
+ });
295
+ }
296
+ return startObservation(name, attributes, {
297
+ asType: "span",
298
+ parentSpanContext,
299
+ startTime
300
+ });
301
+ }
302
+ if (type === "agent") {
303
+ return parent.startObservation(name, attributes, { asType: "agent" });
304
+ }
305
+ if (type === "generation") {
306
+ return parent.startObservation(name, attributes, { asType: "generation" });
307
+ }
308
+ if (type === "tool") {
309
+ return parent.startObservation(name, attributes, { asType: "tool" });
310
+ }
311
+ return parent.startObservation(name, attributes, { asType: "span" });
312
+ }
313
+ function configFingerprint(config) {
314
+ return createHash("sha256").update(
315
+ `${config.publicKey}\0${config.secretKey}\0${config.baseUrl}\0${config.environment ?? ""}\0${config.release ?? ""}`
316
+ ).digest("hex");
317
+ }
318
+ function maskSecrets(data, secrets) {
319
+ return maskSecretValue(data, secrets, /* @__PURE__ */ new WeakSet());
320
+ }
321
+ function maskSecretValue(data, secrets, active) {
322
+ if (typeof data === "string") {
323
+ let masked = data.replace(/\b(?:sk|pk)-lf-[A-Za-z0-9_-]+\b/g, "[LANGFUSE_KEY_REDACTED]");
324
+ for (const secret of secrets) {
325
+ if (secret) masked = masked.replaceAll(secret, "[LANGFUSE_KEY_REDACTED]");
326
+ }
327
+ return masked;
328
+ }
329
+ if (!data || typeof data !== "object") return data;
330
+ if (active.has(data)) return "[circular]";
331
+ active.add(data);
332
+ try {
333
+ if (Array.isArray(data)) {
334
+ return data.map((item) => maskSecretValue(item, secrets, active));
335
+ }
336
+ return Object.fromEntries(
337
+ Object.entries(data).map(([key, value]) => [
338
+ maskSecretString(key, secrets),
339
+ maskSecretValue(value, secrets, active)
340
+ ])
341
+ );
342
+ } finally {
343
+ active.delete(data);
344
+ }
345
+ }
346
+ export {
347
+ createLangfuseRuntime,
348
+ createProductionBackend,
349
+ maskSecrets,
350
+ resolveLangfuseRuntimeConfig
351
+ };
352
+ //# sourceMappingURL=runtime-6MIKLWNJ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/runtime.ts"],
4
+ "sourcesContent": ["import { createHash } from \"node:crypto\";\nimport { LangfuseSpanProcessor } from \"@langfuse/otel\";\nimport {\n type LangfuseObservation,\n type LangfuseObservationAttributes,\n LangfuseOtelSpanAttributes,\n setLangfuseTracerProvider,\n startObservation,\n} from \"@langfuse/tracing\";\nimport type { SpanProcessor } from \"@opentelemetry/sdk-trace-base\";\nimport { NodeTracerProvider } from \"@opentelemetry/sdk-trace-node\";\nimport { DEFAULT_BASE_URL, type LangfuseConfig } from \"./config.js\";\nimport {\n type CreateLangfuseRuntimeOptions,\n createLangfuseRuntimeFromBackend,\n getLangfuseRuntimeInternal,\n type LangfuseRuntime,\n type LangfuseRuntimeInternal,\n} from \"./runtime-core.js\";\nimport type { Observation, ObservationAttributes, ObservationType, TraceBackend } from \"./tracing.js\";\n\nexport type {\n CreateLangfuseRuntimeOptions,\n LangfuseRuntime,\n LangfuseRuntimeConfig,\n} from \"./runtime-core.js\";\n\nconst RUNTIME_KEY = Symbol.for(\"@narumitw/pi-langfuse/runtime/v2\");\nconst LEGACY_RUNTIME_KEY = Symbol.for(\"@narumitw/pi-langfuse/runtime/v1\");\n\ninterface ResolvedRuntimeConfig {\n publicKey: string;\n secretKey: string;\n baseUrl: string;\n environment?: string;\n release?: string;\n}\n\ninterface SharedRuntime {\n fingerprint: string;\n runtime: LangfuseRuntimeInternal;\n shutdown: true;\n}\n\ntype GlobalWithRuntime = typeof globalThis & {\n [RUNTIME_KEY]?: Promise<SharedRuntime>;\n [LEGACY_RUNTIME_KEY]?: unknown;\n};\n\nexport interface RuntimeFactories {\n createProcessor(config: ResolvedRuntimeConfig): SpanProcessor;\n createProvider(processor: SpanProcessor): NodeTracerProvider;\n selectProvider(provider: NodeTracerProvider): void;\n}\n\nclass ProductionObservation implements Observation {\n readonly traceId: string;\n\n constructor(\n readonly native: LangfuseObservation,\n private readonly secrets: readonly string[],\n ) {\n this.traceId = native.traceId;\n }\n\n update(attributes: ObservationAttributes): Observation {\n const { sessionId, userId, ...observationAttributes } = maskObservationAttributes(attributes, this.secrets);\n this.native.updateOtelSpanAttributes(observationAttributes as LangfuseObservationAttributes);\n applySessionId(this.native, sessionId);\n applyUserId(this.native, userId);\n return this;\n }\n\n updateTrace(attributes: ObservationAttributes): Observation {\n const { input, output, metadata, name, sessionId, userId, tags, version } = maskObservationAttributes(\n attributes,\n this.secrets,\n );\n if (input !== undefined || output !== undefined) {\n this.native.setTraceIO({ input, output });\n }\n if (name !== undefined) {\n this.native.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_NAME, name);\n }\n applySessionId(this.native, sessionId);\n applyUserId(this.native, userId);\n if (tags !== undefined) {\n this.native.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_TAGS, tags);\n }\n if (version !== undefined) {\n this.native.otelSpan.setAttribute(LangfuseOtelSpanAttributes.VERSION, version);\n }\n for (const [key, value] of Object.entries(metadata ?? {})) {\n const serialized = serializeMetadataValue(value);\n if (serialized !== undefined) {\n this.native.otelSpan.setAttribute(`${LangfuseOtelSpanAttributes.TRACE_METADATA}.${key}`, serialized);\n }\n }\n return this;\n }\n\n end(endTime?: number): Observation {\n this.native.end(endTime);\n return this;\n }\n}\n\nclass ProductionTraceBackend implements TraceBackend {\n constructor(\n private readonly provider: NodeTracerProvider,\n private readonly processor: SpanProcessor,\n private readonly secrets: readonly string[],\n ) {}\n\n start(\n name: string,\n attributes: ObservationAttributes,\n options: { asType: ObservationType; parent?: Observation; startTime?: Date },\n ): Observation {\n const maskedName = maskSecretString(name, this.secrets);\n const { sessionId, userId, ...observationAttributes } = maskObservationAttributes(attributes, this.secrets);\n const parent = options.parent;\n const native =\n parent instanceof ProductionObservation\n ? startChild(parent.native, maskedName, observationAttributes, options.asType, options.startTime)\n : startRoot(maskedName, observationAttributes, options.asType, options.startTime);\n applySessionId(native, sessionId);\n applyUserId(native, userId);\n return new ProductionObservation(native, this.secrets);\n }\n\n async forceFlush(): Promise<void> {\n await this.processor.forceFlush();\n }\n\n async shutdown(): Promise<void> {\n await this.provider.shutdown();\n }\n}\n\nexport async function createLangfuseRuntime(options: CreateLangfuseRuntimeOptions = {}): Promise<LangfuseRuntime> {\n return createSharedRuntime(resolveLangfuseRuntimeConfig(options), defaultFactories);\n}\n\nexport async function createProductionBackend(\n config: LangfuseConfig,\n factoryOverrides: Partial<RuntimeFactories> = {},\n): Promise<TraceBackend> {\n const runtime = await createSharedRuntime(resolveLangfuseRuntimeConfig({ config, env: false }), {\n ...defaultFactories,\n ...factoryOverrides,\n });\n return getLangfuseRuntimeInternal(runtime).backend;\n}\n\nasync function createSharedRuntime(\n config: ResolvedRuntimeConfig,\n factories: RuntimeFactories,\n): Promise<LangfuseRuntime> {\n const globalRuntime = globalThis as GlobalWithRuntime;\n const fingerprint = configFingerprint(config);\n const existing = globalRuntime[RUNTIME_KEY];\n const legacyRuntime = globalRuntime[LEGACY_RUNTIME_KEY];\n if (legacyRuntime !== undefined && legacyRuntime !== existing) {\n throw new Error(\"An older Langfuse runtime is already loaded; restart the process before enabling this version.\");\n }\n if (existing) {\n if (legacyRuntime === undefined) globalRuntime[LEGACY_RUNTIME_KEY] = existing;\n const shared = await existing;\n if (shared.runtime.closed) {\n throw new Error(\"Langfuse tracing was already shut down; restart the process to enable it again.\");\n }\n if (shared.fingerprint !== fingerprint) {\n throw new Error(\"Langfuse configuration changed; restart the process to apply the new credentials.\");\n }\n return shared.runtime;\n }\n\n const initializing = initializeRuntime(config, fingerprint, factories);\n globalRuntime[RUNTIME_KEY] = initializing;\n globalRuntime[LEGACY_RUNTIME_KEY] = initializing;\n try {\n return (await initializing).runtime;\n } catch (error) {\n if (globalRuntime[RUNTIME_KEY] === initializing) delete globalRuntime[RUNTIME_KEY];\n if (globalRuntime[LEGACY_RUNTIME_KEY] === initializing) delete globalRuntime[LEGACY_RUNTIME_KEY];\n throw error;\n }\n}\n\nasync function initializeRuntime(\n config: ResolvedRuntimeConfig,\n fingerprint: string,\n factories: RuntimeFactories,\n): Promise<SharedRuntime> {\n const processor = factories.createProcessor(config);\n let provider: NodeTracerProvider | undefined;\n try {\n provider = factories.createProvider(processor);\n factories.selectProvider(provider);\n } catch (error) {\n await (provider?.shutdown() ?? processor.shutdown()).catch(() => undefined);\n throw error;\n }\n const runtime = getLangfuseRuntimeInternal(\n createLangfuseRuntimeFromBackend(\n new ProductionTraceBackend(provider, processor, [config.publicKey, config.secretKey]),\n ),\n );\n return { fingerprint, runtime, shutdown: true };\n}\n\nconst defaultFactories: RuntimeFactories = {\n createProcessor: (config) => {\n const secrets = [config.secretKey, config.publicKey];\n return new LangfuseSpanProcessor({\n publicKey: config.publicKey,\n secretKey: config.secretKey,\n baseUrl: config.baseUrl,\n environment: config.environment ?? \"\",\n release: config.release ?? \"\",\n flushAt: 512,\n flushInterval: 5,\n timeout: 5,\n mask: ({ data }) => maskSecrets(data, secrets),\n shouldExportSpan: ({ otelSpan }) => typeof otelSpan.attributes[\"langfuse.observation.type\"] === \"string\",\n });\n },\n createProvider: (processor) => new NodeTracerProvider({ spanProcessors: [processor] }),\n selectProvider: setLangfuseTracerProvider,\n};\n\nexport function resolveLangfuseRuntimeConfig(options: CreateLangfuseRuntimeOptions): ResolvedRuntimeConfig {\n const env = options.env === false ? undefined : (options.env ?? process.env);\n const publicKey = requiredSetting(\"publicKey\", options.config?.publicKey, env?.LANGFUSE_PUBLIC_KEY);\n const secretKey = requiredSetting(\"secretKey\", options.config?.secretKey, env?.LANGFUSE_SECRET_KEY);\n const explicitBaseUrl = options.config?.baseUrl;\n if (explicitBaseUrl !== undefined && !normalizeString(explicitBaseUrl)) {\n throw new Error(\"Langfuse baseUrl must be a non-empty string.\");\n }\n const rawBaseUrl = selectedSetting(explicitBaseUrl, env?.LANGFUSE_BASE_URL) ?? DEFAULT_BASE_URL;\n const baseUrl = normalizeBaseUrl(rawBaseUrl);\n if (!baseUrl) {\n throw new Error(\"Langfuse baseUrl must use HTTP or HTTPS without credentials, a query, or a fragment.\");\n }\n const environment = optionalSetting(\"environment\", options.config?.environment, env?.LANGFUSE_TRACING_ENVIRONMENT);\n if (environment && (environment.length > 40 || !/^(?!langfuse)[a-z0-9_-]+$/u.test(environment))) {\n throw new Error(\n \"Langfuse environment must be at most 40 lowercase letters, numbers, hyphens, or underscores and must not start with langfuse.\",\n );\n }\n const release = optionalSetting(\"release\", options.config?.release, env?.LANGFUSE_RELEASE);\n return { publicKey, secretKey, baseUrl, ...(environment ? { environment } : {}), ...(release ? { release } : {}) };\n}\n\nfunction requiredSetting(name: string, explicit: string | undefined, environment: string | undefined): string {\n const value = selectedSetting(explicit, environment);\n if (!value) throw new Error(`Langfuse ${name} is required.`);\n return value;\n}\n\nfunction optionalSetting(\n name: string,\n explicit: string | undefined,\n environment: string | undefined,\n): string | undefined {\n const selected = explicit !== undefined ? explicit : environment;\n if (selected === undefined) return undefined;\n const value = normalizeString(selected);\n if (!value) throw new Error(`Langfuse ${name} must be a non-empty string.`);\n return value;\n}\n\nfunction selectedSetting(explicit: string | undefined, environment: string | undefined): string | undefined {\n if (explicit !== undefined) return normalizeString(explicit);\n return normalizeString(environment);\n}\n\nfunction normalizeBaseUrl(value: string): string | undefined {\n try {\n const url = new URL(value);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") return undefined;\n if (url.username || url.password || url.search || url.hash) return undefined;\n return url.toString().replace(/\\/+$/, \"\");\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction serializeMetadataValue(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n\nfunction maskObservationAttributes(\n attributes: ObservationAttributes,\n secrets: readonly string[],\n): ObservationAttributes {\n return {\n ...attributes,\n ...(attributes.metadata ? { metadata: maskSecrets(attributes.metadata, secrets) as Record<string, unknown> } : {}),\n ...(attributes.name ? { name: maskSecretString(attributes.name, secrets) } : {}),\n ...(attributes.sessionId ? { sessionId: maskSecretString(attributes.sessionId, secrets) } : {}),\n ...(attributes.userId ? { userId: maskSecretString(attributes.userId, secrets) } : {}),\n ...(attributes.tags ? { tags: attributes.tags.map((tag) => maskSecretString(tag, secrets)) } : {}),\n ...(attributes.statusMessage ? { statusMessage: maskSecretString(attributes.statusMessage, secrets) } : {}),\n ...(attributes.model ? { model: maskSecretString(attributes.model, secrets) } : {}),\n ...(attributes.version ? { version: maskSecretString(attributes.version, secrets) } : {}),\n ...(attributes.modelParameters\n ? {\n modelParameters: Object.fromEntries(\n Object.entries(attributes.modelParameters).map(([key, value]) => [\n maskSecretString(key, secrets),\n typeof value === \"string\" ? maskSecretString(value, secrets) : value,\n ]),\n ),\n }\n : {}),\n };\n}\n\nfunction maskSecretString(value: string, secrets: readonly string[]): string {\n return maskSecrets(value, secrets) as string;\n}\n\nfunction applySessionId(observation: LangfuseObservation, sessionId: string | undefined): void {\n if (sessionId !== undefined) {\n observation.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_SESSION_ID, sessionId);\n }\n}\n\nfunction applyUserId(observation: LangfuseObservation, userId: string | undefined): void {\n if (userId !== undefined) {\n observation.otelSpan.setAttribute(LangfuseOtelSpanAttributes.TRACE_USER_ID, userId);\n }\n}\n\nfunction startRoot(\n name: string,\n attributes: ObservationAttributes,\n type: ObservationType,\n startTime?: Date,\n): LangfuseObservation {\n if (type === \"agent\") {\n return startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"agent\", startTime });\n }\n if (type === \"generation\") {\n return startObservation(name, attributes as LangfuseObservationAttributes, {\n asType: \"generation\",\n startTime,\n });\n }\n if (type === \"tool\") {\n return startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"tool\", startTime });\n }\n return startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"span\", startTime });\n}\n\nfunction startChild(\n parent: LangfuseObservation,\n name: string,\n attributes: ObservationAttributes,\n type: ObservationType,\n startTime?: Date,\n): LangfuseObservation {\n if (startTime) {\n const parentSpanContext = parent.otelSpan.spanContext();\n if (type === \"agent\") {\n return startObservation(name, attributes as LangfuseObservationAttributes, {\n asType: \"agent\",\n parentSpanContext,\n startTime,\n });\n }\n if (type === \"generation\") {\n return startObservation(name, attributes as LangfuseObservationAttributes, {\n asType: \"generation\",\n parentSpanContext,\n startTime,\n });\n }\n if (type === \"tool\") {\n return startObservation(name, attributes as LangfuseObservationAttributes, {\n asType: \"tool\",\n parentSpanContext,\n startTime,\n });\n }\n return startObservation(name, attributes as LangfuseObservationAttributes, {\n asType: \"span\",\n parentSpanContext,\n startTime,\n });\n }\n if (type === \"agent\") {\n return parent.startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"agent\" });\n }\n if (type === \"generation\") {\n return parent.startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"generation\" });\n }\n if (type === \"tool\") {\n return parent.startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"tool\" });\n }\n return parent.startObservation(name, attributes as LangfuseObservationAttributes, { asType: \"span\" });\n}\n\nfunction configFingerprint(config: ResolvedRuntimeConfig): string {\n return createHash(\"sha256\")\n .update(\n `${config.publicKey}\\0${config.secretKey}\\0${config.baseUrl}\\0${config.environment ?? \"\"}\\0${config.release ?? \"\"}`,\n )\n .digest(\"hex\");\n}\n\nexport function maskSecrets(data: unknown, secrets: readonly string[]): unknown {\n return maskSecretValue(data, secrets, new WeakSet<object>());\n}\n\nfunction maskSecretValue(data: unknown, secrets: readonly string[], active: WeakSet<object>): unknown {\n if (typeof data === \"string\") {\n let masked = data.replace(/\\b(?:sk|pk)-lf-[A-Za-z0-9_-]+\\b/g, \"[LANGFUSE_KEY_REDACTED]\");\n for (const secret of secrets) {\n if (secret) masked = masked.replaceAll(secret, \"[LANGFUSE_KEY_REDACTED]\");\n }\n return masked;\n }\n if (!data || typeof data !== \"object\") return data;\n if (active.has(data)) return \"[circular]\";\n\n active.add(data);\n try {\n if (Array.isArray(data)) {\n return data.map((item) => maskSecretValue(item, secrets, active));\n }\n return Object.fromEntries(\n Object.entries(data).map(([key, value]) => [\n maskSecretString(key, secrets),\n maskSecretValue(value, secrets, active),\n ]),\n );\n } finally {\n active.delete(data);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,33 @@
1
+ export declare const DEFAULT_BASE_URL = "https://us.cloud.langfuse.com";
2
+ export interface LangfuseConfig {
3
+ publicKey: string;
4
+ secretKey: string;
5
+ baseUrl: string;
6
+ environment?: string;
7
+ release?: string;
8
+ userId?: string;
9
+ captureContent: boolean;
10
+ }
11
+ export type LangfuseConfigPatch = Partial<LangfuseConfig>;
12
+ export type LangfuseConfigResult = {
13
+ ok: true;
14
+ config: LangfuseConfig;
15
+ path: string;
16
+ warnings: string[];
17
+ } | {
18
+ ok: false;
19
+ path: string;
20
+ warnings: string[];
21
+ reason: string;
22
+ };
23
+ export declare function langfuseConfigPath(): string;
24
+ export declare function waitForLangfuseConfigWrites(path?: string): Promise<void>;
25
+ export declare function writeLangfuseConfig(patch: LangfuseConfigPatch, path?: string): Promise<LangfuseConfig>;
26
+ export declare function loadLangfuseConfig(path?: string): Promise<LangfuseConfigResult>;
27
+ export declare function normalizeLangfuseConfig(value: unknown): {
28
+ ok: true;
29
+ config: LangfuseConfig;
30
+ } | {
31
+ ok: false;
32
+ reason: string;
33
+ };
package/dist/git.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ import type { GitMetadata } from "./tracing.js";
3
+ type GitExecutor = ExtensionAPI["exec"];
4
+ export declare function resolveGitMetadata(exec: GitExecutor, cwd: string): Promise<GitMetadata | undefined>;
5
+ export {};
@@ -0,0 +1,2 @@
1
+ export { default } from "./langfuse.js";
2
+ export { type CreateLangfuseRuntimeOptions, createLangfuseRuntime, createPiLangfuseSession, type LangfuseRuntime, type LangfuseRuntimeConfig, type PiLangfuseSession, type PiLangfuseSessionOptions, } from "./public-api.js";