@narumitw/pi-langfuse 0.51.0 → 0.51.1
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/chunks/{chunk-IASLJKKB.js → chunk-DBQAWNKG.ts} +1 -1
- package/dist/chunks/{runtime-6MIKLWNJ.js → runtime-6ZHLVC3A.ts} +2 -2
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/index.ts +3 -3
- package/dist/library-chunks/chunk-SAJ76IYU.js +316 -0
- package/dist/library-chunks/chunk-SAJ76IYU.js.map +7 -0
- package/dist/library-chunks/runtime-A6SQ6VEH.js +352 -0
- package/dist/library-chunks/runtime-A6SQ6VEH.js.map +7 -0
- package/package.json +1 -1
- /package/dist/chunks/{chunk-IASLJKKB.js.map → chunk-DBQAWNKG.ts.map} +0 -0
- /package/dist/chunks/{runtime-6MIKLWNJ.js.map → runtime-6ZHLVC3A.ts.map} +0 -0
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
DEFAULT_BASE_URL,
|
|
5
5
|
createLangfuseRuntimeFromBackend,
|
|
6
6
|
getLangfuseRuntimeInternal
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-DBQAWNKG.ts";
|
|
8
8
|
|
|
9
9
|
// src/runtime.ts
|
|
10
10
|
import { createHash } from "node:crypto";
|
|
@@ -349,4 +349,4 @@ export {
|
|
|
349
349
|
maskSecrets,
|
|
350
350
|
resolveLangfuseRuntimeConfig
|
|
351
351
|
};
|
|
352
|
-
//# sourceMappingURL=runtime-
|
|
352
|
+
//# sourceMappingURL=runtime-6ZHLVC3A.ts.map
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
loadLangfuseConfig,
|
|
8
8
|
normalizeLangfuseConfig,
|
|
9
9
|
writeLangfuseConfig
|
|
10
|
-
} from "./chunks/chunk-
|
|
10
|
+
} from "./library-chunks/chunk-SAJ76IYU.js";
|
|
11
11
|
|
|
12
12
|
// src/git.ts
|
|
13
13
|
var GIT_LOOKUP_TIMEOUT_MS = 1e3;
|
|
@@ -1317,7 +1317,7 @@ function createLangfuseExtension(dependencies = {}) {
|
|
|
1317
1317
|
loadingConfig = result.config;
|
|
1318
1318
|
const createBackend = dependencies.createBackend;
|
|
1319
1319
|
const ownsRuntime = createBackend !== void 0;
|
|
1320
|
-
const runtime = createBackend ? createLangfuseRuntimeFromBackend(await createBackend(result.config)) : await (await import("./chunks/runtime-
|
|
1320
|
+
const runtime = createBackend ? createLangfuseRuntimeFromBackend(await createBackend(result.config)) : await (await import("./library-chunks/runtime-A6SQ6VEH.js")).createLangfuseRuntime({ config: result.config, env: false });
|
|
1321
1321
|
if (isCurrent() || !runtimeConfigForShutdown) runtimeConfigForShutdown = result.config;
|
|
1322
1322
|
if (isCurrent()) {
|
|
1323
1323
|
activeConfig = result.config;
|
|
@@ -1540,7 +1540,7 @@ var langfuse_default = createLangfuseExtension();
|
|
|
1540
1540
|
|
|
1541
1541
|
// src/public-api.ts
|
|
1542
1542
|
async function createLangfuseRuntime(options = {}) {
|
|
1543
|
-
const runtime = await import("./chunks/runtime-
|
|
1543
|
+
const runtime = await import("./library-chunks/runtime-A6SQ6VEH.js");
|
|
1544
1544
|
return runtime.createLangfuseRuntime(options);
|
|
1545
1545
|
}
|
|
1546
1546
|
export {
|
package/dist/index.js.map
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/git.ts", "../src/sanitizer.ts", "../src/tracing.ts", "../src/pi-session.ts", "../src/langfuse.ts", "../src/public-api.ts"],
|
|
4
4
|
"sourcesContent": ["import type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport type { GitMetadata } from \"./tracing.js\";\n\nconst GIT_LOOKUP_TIMEOUT_MS = 1_000;\nconst MAX_GIT_BRANCH_LENGTH = 256;\n\ntype GitExecutor = ExtensionAPI[\"exec\"];\n\nexport async function resolveGitMetadata(exec: GitExecutor, cwd: string): Promise<GitMetadata | undefined> {\n const [branchResult, commit] = await Promise.all([resolveGitBranch(exec, cwd), resolveGitCommit(exec, cwd)]);\n if (!branchResult.resolved) return undefined;\n if (branchResult.branch) {\n return {\n branch: branchResult.branch,\n ...(commit ? { commit } : {}),\n detached: false,\n };\n }\n return commit ? { commit, detached: true } : undefined;\n}\n\nasync function resolveGitBranch(exec: GitExecutor, cwd: string): Promise<{ resolved: boolean; branch?: string }> {\n try {\n const result = await exec(\"git\", [\"symbolic-ref\", \"--quiet\", \"--short\", \"HEAD\"], {\n cwd,\n timeout: GIT_LOOKUP_TIMEOUT_MS,\n });\n if (result.killed) return { resolved: false };\n if (result.code === 1) return { resolved: true };\n if (result.code !== 0) return { resolved: false };\n const branch = normalizeGitBranch(result.stdout);\n return branch ? { resolved: true, branch } : { resolved: false };\n } catch {\n return { resolved: false };\n }\n}\n\nasync function resolveGitCommit(exec: GitExecutor, cwd: string): Promise<string | undefined> {\n try {\n const result = await exec(\"git\", [\"rev-parse\", \"--verify\", \"--short=12\", \"HEAD\"], {\n cwd,\n timeout: GIT_LOOKUP_TIMEOUT_MS,\n });\n if (result.code !== 0 || result.killed) return undefined;\n const commit = result.stdout.trim();\n return /^[0-9a-f]{4,64}$/iu.test(commit) ? commit.toLowerCase() : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeGitBranch(value: string): string | undefined {\n const branch = value.trim();\n if (!branch || branch.length > MAX_GIT_BRANCH_LENGTH) return undefined;\n for (const character of branch) {\n const code = character.codePointAt(0) ?? 0;\n if (code <= 31 || code === 127) return undefined;\n }\n return branch;\n}\n", "export const MAX_CAPTURE_BYTES = 64 * 1024;\nconst MAX_STRING_LENGTH = 50_000;\nconst MAX_COLLECTION_LENGTH = 200;\nconst MAX_DEPTH = 12;\nconst TRUNCATED = \"[truncated: content budget exceeded]\";\nconst BASE64_DATA_URI = /data:[^,\\s\"'`]*;base64,[^\\s\"'`]*/gi;\nconst BASE64_DATA_URI_OMITTED = \"[base64 data URI omitted]\";\nconst OPAQUE_SIGNATURE_KEYS = new Set([\"thinkingSignature\", \"textSignature\", \"thoughtSignature\"]);\n\nexport function sanitizeTraceValue(value: unknown): unknown {\n const budget = { remaining: MAX_CAPTURE_BYTES };\n const sanitized = sanitize(value, new WeakSet<object>(), 0, budget);\n return serializedBytes(sanitized) <= MAX_CAPTURE_BYTES ? sanitized : TRUNCATED;\n}\n\nfunction sanitize(value: unknown, active: WeakSet<object>, depth: number, budget: { remaining: number }): unknown {\n if (budget.remaining <= byteLength(TRUNCATED)) return TRUNCATED;\n if (value === null || typeof value === \"number\" || typeof value === \"boolean\") {\n return consume(value, budget);\n }\n if (typeof value === \"string\") {\n return consume(sanitizeString(value, Math.min(MAX_STRING_LENGTH, budget.remaining)), budget);\n }\n if (typeof value === \"bigint\") return consume(value.toString(), budget);\n if (typeof value === \"undefined\" || typeof value === \"function\" || typeof value === \"symbol\") {\n return undefined;\n }\n if (value instanceof Date) {\n return consume(Number.isNaN(value.getTime()) ? \"[invalid date]\" : value.toISOString(), budget);\n }\n if (value instanceof Error) {\n return sanitize({ name: value.name, message: value.message }, active, depth, budget);\n }\n if (depth >= MAX_DEPTH) return consume(\"[maximum depth reached]\", budget);\n if (active.has(value)) return consume(\"[circular]\", budget);\n active.add(value);\n\n let result: unknown;\n if (Array.isArray(value)) {\n const items: unknown[] = [];\n for (const item of value.slice(0, MAX_COLLECTION_LENGTH)) {\n if (budget.remaining <= byteLength(TRUNCATED)) break;\n items.push(sanitize(item, active, depth + 1, budget));\n }\n if (items.length < value.length) items.push(`[${value.length - items.length} items omitted]`);\n result = items;\n } else {\n const record = value as Record<string, unknown>;\n const output: Record<string, unknown> = {};\n const objectType = readProperty(record, \"type\").value;\n const redactData = objectType === \"image\" || objectType === \"base64\";\n let visited = 0;\n let processed = 0;\n let omitted = false;\n try {\n for (const key in record) {\n if (visited >= MAX_COLLECTION_LENGTH || budget.remaining <= byteLength(TRUNCATED)) {\n omitted = true;\n break;\n }\n visited += 1;\n if (!Object.hasOwn(record, key) || OPAQUE_SIGNATURE_KEYS.has(key)) continue;\n const keyBudget = Math.min(MAX_STRING_LENGTH, Math.max(0, budget.remaining - 4));\n if (key.length > keyBudget) {\n omitted = true;\n break;\n }\n const keyBytes = byteLength(key);\n if (keyBytes > keyBudget) {\n omitted = true;\n break;\n }\n const sanitizedKey = sanitizeString(key, keyBudget);\n budget.remaining -= byteLength(sanitizedKey) + 4;\n const property = readProperty(record, key);\n if (redactData && key === \"data\") {\n output[sanitizedKey] = consume(\"[base64 omitted]\", budget);\n } else if (!property.ok) output[sanitizedKey] = consume(\"[unreadable property]\", budget);\n else output[sanitizedKey] = sanitize(property.value, active, depth + 1, budget);\n processed += 1;\n }\n } catch {\n if (processed === 0) {\n active.delete(value);\n return consume(\"[unreadable object]\", budget);\n }\n omitted = true;\n }\n if (omitted) output.$truncated = \"additional object entries omitted\";\n result = output;\n }\n active.delete(value);\n return result;\n}\n\nfunction readProperty(\n record: Record<string, unknown>,\n key: string,\n): { ok: true; value: unknown } | { ok: false; value?: undefined } {\n try {\n return { ok: true, value: record[key] };\n } catch {\n return { ok: false };\n }\n}\n\nfunction consume<T>(value: T, budget: { remaining: number }): T | string {\n const size = serializedBytes(value);\n if (size > budget.remaining) {\n budget.remaining -= byteLength(TRUNCATED);\n return TRUNCATED;\n }\n budget.remaining -= size;\n return value;\n}\n\nfunction sanitizeString(value: string, maxBytes: number): string {\n return truncateString(value, maxBytes).replace(BASE64_DATA_URI, BASE64_DATA_URI_OMITTED);\n}\n\nfunction truncateString(value: string, maxBytes: number): string {\n const boundedPrefix = value.slice(0, maxBytes);\n if (boundedPrefix.length === value.length && byteLength(boundedPrefix) <= maxBytes) {\n return boundedPrefix;\n }\n const suffix = \"\u2026 [truncated]\";\n const target = Math.max(0, maxBytes - byteLength(suffix) - 2);\n let bytes = 0;\n let output = \"\";\n for (const character of boundedPrefix) {\n const size = byteLength(character);\n if (bytes + size > target) break;\n output += character;\n bytes += size;\n }\n return `${output}${suffix}`;\n}\n\nfunction serializedBytes(value: unknown): number {\n return byteLength(JSON.stringify(value) ?? \"null\");\n}\n\nfunction byteLength(value: string): number {\n return Buffer.byteLength(value, \"utf8\");\n}\n", "import { sanitizeTraceValue } from \"./sanitizer.js\";\n\nexport { MAX_CAPTURE_BYTES, sanitizeTraceValue } from \"./sanitizer.js\";\n\nexport const TRACE_SCHEMA_VERSION = \"2\";\nconst MAX_HEADER_VALUE_LENGTH = 1_024;\nconst CONTENT_DISABLED = \"[content capture disabled]\";\nconst ALLOWED_RESPONSE_HEADERS = new Set([\n \"anthropic-ratelimit-requests-limit\",\n \"anthropic-ratelimit-requests-remaining\",\n \"anthropic-ratelimit-requests-reset\",\n \"anthropic-ratelimit-tokens-limit\",\n \"anthropic-ratelimit-tokens-remaining\",\n \"anthropic-ratelimit-tokens-reset\",\n \"cf-ray\",\n \"openai-request-id\",\n \"request-id\",\n \"retry-after\",\n \"x-amzn-requestid\",\n \"x-request-id\",\n \"x-ratelimit-limit-requests\",\n \"x-ratelimit-limit-tokens\",\n \"x-ratelimit-remaining-requests\",\n \"x-ratelimit-remaining-tokens\",\n \"x-ratelimit-reset-requests\",\n \"x-ratelimit-reset-tokens\",\n]);\n\nexport interface ObservationAttributes {\n input?: unknown;\n output?: unknown;\n metadata?: Record<string, unknown>;\n level?: \"DEBUG\" | \"DEFAULT\" | \"WARNING\" | \"ERROR\";\n statusMessage?: string;\n completionStartTime?: Date;\n model?: string;\n modelParameters?: Record<string, string | number>;\n usageDetails?: Record<string, number>;\n costDetails?: Record<string, number>;\n version?: string;\n name?: string;\n sessionId?: string;\n userId?: string;\n tags?: string[];\n}\n\nexport interface Observation {\n readonly traceId?: string;\n update(attributes: ObservationAttributes): Observation;\n updateTrace?(attributes: ObservationAttributes): Observation;\n end(endTime?: number): Observation;\n}\n\nexport type ObservationType = \"agent\" | \"generation\" | \"span\" | \"tool\";\n\nexport interface TraceBackend {\n start(\n name: string,\n attributes: ObservationAttributes,\n options: { asType: ObservationType; parent?: Observation; startTime?: Date },\n ): Observation;\n forceFlush(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\nexport interface TraceRecorderOptions {\n sessionId: string;\n userId?: string;\n cwd: string;\n mode: string;\n captureContent: boolean;\n traceName?: string;\n tags?: readonly string[];\n metadata?: Readonly<Record<string, unknown>>;\n onTraceId?: (traceId: string) => void;\n}\n\ninterface ModelDescriptor {\n provider?: string;\n id?: string;\n api?: string;\n}\n\nexport interface GitMetadata {\n branch?: string;\n commit?: string;\n detached: boolean;\n}\n\nexport interface ContextSnapshot {\n leafId?: string | null;\n contextUsage?: {\n tokens: number | null;\n contextWindow: number;\n percent: number | null;\n };\n}\n\ninterface BeginAgentInput {\n prompt: unknown;\n images?: unknown;\n model?: ModelDescriptor;\n git?: GitMetadata;\n snapshot?: ContextSnapshot;\n requestId?: string;\n}\n\ninterface AttemptInput {\n reason?: string;\n}\n\ninterface GenerationInput {\n startedAt?: number;\n payload?: unknown;\n payloadStage?: \"before_provider_request\";\n model?: ModelDescriptor;\n thinkingLevel?: string;\n}\n\ninterface AssistantMessage {\n role: string;\n content?: unknown;\n provider?: string;\n api?: string;\n model?: string;\n responseModel?: string;\n responseId?: string;\n usage?: {\n input?: number;\n output?: number;\n cacheRead?: number;\n cacheWrite?: number;\n cacheWrite1h?: number;\n reasoning?: number;\n totalTokens?: number;\n cost?: {\n input?: number;\n output?: number;\n cacheRead?: number;\n cacheWrite?: number;\n total?: number;\n };\n };\n stopReason?: string;\n errorMessage?: string;\n}\n\ninterface ToolResult {\n content?: unknown;\n details?: unknown;\n isError?: boolean;\n}\n\ninterface TurnResult {\n message: { role: string; stopReason?: string; errorMessage?: string };\n toolResultCount: number;\n}\n\ninterface CompactionStart {\n reason: string;\n willRetry: boolean;\n tokensBefore?: number;\n messagesToSummarize: number;\n turnPrefixMessages: number;\n branchEntries: number;\n isSplitTurn: boolean;\n}\n\ninterface CompactionFinish {\n reason: string;\n willRetry: boolean;\n fromExtension: boolean;\n tokensBefore?: number;\n details?: unknown;\n usage?: {\n input?: number;\n output?: number;\n cacheRead?: number;\n cacheWrite?: number;\n totalTokens?: number;\n cost?: {\n input?: number;\n output?: number;\n cacheRead?: number;\n cacheWrite?: number;\n total?: number;\n };\n };\n}\n\ntype Outcome = \"success\" | \"error\" | \"aborted\" | \"length\" | \"interrupted\";\n\ninterface GenerationState {\n observation: Observation;\n endTime?: number;\n completionStartTime?: number;\n requestMetadata: Record<string, unknown>;\n statuses: number[];\n headers: Record<string, string>;\n}\n\ninterface ToolState {\n observation: Observation;\n startedAt: number;\n progressUpdates: number;\n firstProgressAt?: number;\n}\n\ninterface CompactionState {\n observation: Observation;\n}\n\ninterface Counters {\n attempts: number;\n turns: number;\n generations: number;\n tools: number;\n toolErrors: number;\n compactions: number;\n recoveredErrors: number;\n failedAttempts: number;\n}\n\nexport class TraceRecorder {\n private root: Observation | undefined;\n private attempt: Observation | undefined;\n private attemptIndex: number | undefined;\n private turn: Observation | undefined;\n private turnIndex: number | undefined;\n private generation: GenerationState | undefined;\n private readonly tools = new Map<string, ToolState>();\n private readonly duplicateToolIds = new Set<string>();\n private compaction: CompactionState | undefined;\n private lastOutput: unknown;\n private lastAssistant: AssistantMessage | undefined;\n private lastAttemptOutcome: Outcome | undefined;\n private unresolvedToolErrors = 0;\n private startSnapshot: ContextSnapshot | undefined;\n private counters: Counters = emptyCounters();\n\n constructor(\n private readonly backend: TraceBackend,\n private readonly context: TraceRecorderOptions,\n ) {}\n\n private startObservation(\n name: string,\n attributes: ObservationAttributes,\n options: { asType: ObservationType; parent?: Observation; startTime?: Date },\n ): Observation {\n const { sessionId, userId } = this.context;\n return this.backend.start(name, { ...attributes, sessionId, ...(userId ? { userId } : {}) }, options);\n }\n\n hasActiveTrace(): boolean {\n return this.root !== undefined;\n }\n\n hasActiveAttempt(): boolean {\n return this.attempt !== undefined;\n }\n\n beginAgent(input: BeginAgentInput): void {\n if (this.root) this.closeActiveTrace(\"Interrupted by a new Pi run.\", undefined, \"interrupted\");\n\n this.lastOutput = undefined;\n this.lastAssistant = undefined;\n this.lastAttemptOutcome = undefined;\n this.unresolvedToolErrors = 0;\n this.duplicateToolIds.clear();\n this.startSnapshot = input.snapshot;\n this.counters = emptyCounters();\n const traceInput = this.capture({\n prompt: input.prompt,\n ...(hasItems(input.images) ? { images: input.images } : {}),\n });\n const metadata: Record<string, unknown> = {\n ...customTraceMetadata(this.context.metadata),\n \"pi.cwd\": this.context.cwd,\n ...(input.git?.branch ? { \"pi.git.branch\": input.git.branch } : {}),\n ...(input.git?.commit ? { \"pi.git.commit\": input.git.commit } : {}),\n ...(input.git ? { \"pi.git.detached\": input.git.detached } : {}),\n \"pi.mode\": this.context.mode,\n ...(input.model?.id ? { \"pi.model\": input.model.id } : {}),\n ...(input.model?.provider ? { \"pi.provider\": input.model.provider } : {}),\n ...(input.requestId ? { \"pi.request.id\": input.requestId } : {}),\n \"pi.session.id\": this.context.sessionId,\n \"pi.trace.schema_version\": Number(TRACE_SCHEMA_VERSION),\n ...snapshotMetadata(\"start\", input.snapshot),\n };\n const attributes = { input: traceInput, metadata, version: TRACE_SCHEMA_VERSION };\n const gitTag = input.git?.branch ? `branch:${input.git.branch}` : input.git?.detached ? \"git:detached\" : undefined;\n\n this.root = this.startObservation(\"pi.agent\", attributes, { asType: \"agent\" });\n this.root.updateTrace?.({\n name: normalizeTraceName(this.context.traceName),\n sessionId: this.context.sessionId,\n ...(this.context.userId ? { userId: this.context.userId } : {}),\n version: TRACE_SCHEMA_VERSION,\n input: traceInput,\n metadata,\n tags: traceTags(this.context.tags, gitTag),\n });\n const traceId = this.root.traceId;\n if (traceId && this.context.onTraceId) {\n try {\n void Promise.resolve(this.context.onTraceId(traceId)).catch(() => undefined);\n } catch {\n // Host callbacks must not corrupt observation lifecycle state.\n }\n }\n }\n\n beginAttempt(input: AttemptInput = {}): void {\n if (!this.root) return;\n if (this.attempt) {\n this.closeAttempt(undefined, \"Interrupted by the next Pi attempt.\", \"interrupted\");\n }\n const index = this.counters.attempts;\n this.counters.attempts += 1;\n this.lastAssistant = undefined;\n this.unresolvedToolErrors = 0;\n this.attemptIndex = index;\n this.attempt = this.startObservation(\n \"pi.attempt\",\n {\n metadata: {\n \"pi.attempt.index\": index,\n ...(input.reason ? { \"pi.attempt.reason\": input.reason } : {}),\n },\n version: TRACE_SCHEMA_VERSION,\n },\n { asType: \"span\", parent: this.root },\n );\n }\n\n finishAttempt(message?: AssistantMessage): void {\n if (message?.role === \"assistant\") this.finishAssistant(message);\n if (!this.attempt) return;\n const outcome = this.unresolvedToolErrors > 0 ? \"error\" : classifyOutcome(message);\n this.closeAttempt(\n message,\n this.unresolvedToolErrors > 0 ? \"Pi attempt ended after a tool failure.\" : undefined,\n outcome,\n );\n }\n\n beginTurn(turnIndex: number): void {\n if (!this.root) return;\n if (this.turn) this.closeTurn(\"Interrupted by the next Pi turn.\", \"ERROR\");\n this.counters.turns += 1;\n this.turnIndex = turnIndex;\n this.turn = this.startObservation(\n \"pi.turn\",\n { metadata: { \"pi.turn.index\": turnIndex }, version: TRACE_SCHEMA_VERSION },\n { asType: \"span\", parent: this.attempt ?? this.root },\n );\n }\n\n finishTurn(turnIndex: number, result: TurnResult): void {\n if (!this.turn) return;\n this.closeGeneration(\"Turn ended without a finalized assistant message.\");\n this.closeTools(\"Tool span ended when the Pi turn finished.\");\n\n const mismatched = this.turnIndex !== turnIndex;\n const outcome = classifyOutcome(result.message);\n this.turn.update({\n metadata: {\n \"pi.turn.index\": this.turnIndex ?? turnIndex,\n \"pi.turn.tool_result_count\": result.toolResultCount,\n ...(result.message.stopReason ? { \"pi.turn.stop_reason\": result.message.stopReason } : {}),\n },\n ...(mismatched && outcome === \"success\"\n ? {\n level: \"WARNING\" as const,\n statusMessage: `Turn ${turnIndex} ended while turn ${this.turnIndex} was active.`,\n }\n : severityForOutcome(outcome, result.message.errorMessage)),\n });\n this.turn.end();\n this.turn = undefined;\n this.turnIndex = undefined;\n }\n\n beginGeneration(input: GenerationInput = {}): void {\n if (!this.root) return;\n this.closeGeneration(\"Interrupted by the next provider request.\");\n if (this.unresolvedToolErrors > 0) {\n this.counters.recoveredErrors += this.unresolvedToolErrors;\n this.unresolvedToolErrors = 0;\n }\n this.counters.generations += 1;\n const requestMetadata: Record<string, unknown> = {\n ...(input.payloadStage ? { \"pi.request.payload_stage\": input.payloadStage } : {}),\n ...(input.model?.provider ? { \"pi.request.provider\": input.model.provider } : {}),\n ...(input.model?.id ? { \"pi.request.model\": input.model.id } : {}),\n ...(input.model?.api ? { \"pi.request.api\": input.model.api } : {}),\n ...(input.thinkingLevel ? { \"pi.request.thinking_level\": input.thinkingLevel } : {}),\n };\n const observation = this.startObservation(\n \"pi.llm\",\n {\n ...(input.payload !== undefined ? { input: this.capture(input.payload) } : {}),\n ...(input.model?.id ? { model: input.model.id } : {}),\n ...(input.thinkingLevel ? { modelParameters: { thinking_level: input.thinkingLevel } } : {}),\n ...(Object.keys(requestMetadata).length > 0 ? { metadata: requestMetadata } : {}),\n version: TRACE_SCHEMA_VERSION,\n },\n {\n asType: \"generation\",\n parent: this.turn ?? this.attempt ?? this.root,\n ...(input.startedAt === undefined ? {} : { startTime: new Date(input.startedAt) }),\n },\n );\n this.generation = {\n observation,\n requestMetadata,\n statuses: [],\n headers: {},\n };\n }\n\n recordProviderResponse(status: number, headers: Record<string, string> = {}): void {\n if (!this.generation) return;\n this.generation.statuses.push(status);\n Object.assign(this.generation.headers, allowlistedResponseHeaders(headers));\n }\n\n markGenerationFirstOutput(timestamp = Date.now()): void {\n if (this.generation && this.generation.completionStartTime === undefined) {\n this.generation.completionStartTime = timestamp;\n }\n }\n\n markGenerationEnd(endTime = Date.now()): void {\n if (this.generation && this.generation.endTime === undefined) {\n this.generation.endTime = endTime;\n }\n }\n\n finishAssistant(message: AssistantMessage): void {\n if (message.role !== \"assistant\") return;\n this.lastAssistant = message;\n this.lastOutput = this.capture(message.content);\n if (!this.generation) return;\n\n const state = this.generation;\n const usageDetails = numericRecord({\n input: message.usage?.input,\n output: message.usage?.output,\n cache_read_input_tokens: message.usage?.cacheRead,\n cache_creation_input_tokens: message.usage?.cacheWrite,\n total: message.usage?.totalTokens,\n });\n const costDetails = positiveNumericRecord({\n input: message.usage?.cost?.input,\n output: message.usage?.cost?.output,\n cache_read: message.usage?.cost?.cacheRead,\n cache_write: message.usage?.cost?.cacheWrite,\n total: message.usage?.cost?.total,\n });\n const outcome = classifyOutcome(message);\n const responseModel = message.responseModel ?? message.model;\n const httpMetadata = generationHttpMetadata(state);\n const recoveredStatuses = state.statuses.filter((status) => status >= 400).length;\n if (outcome === \"success\" && recoveredStatuses > 0) {\n this.counters.recoveredErrors += recoveredStatuses;\n }\n state.observation.update({\n output: this.lastOutput,\n ...(state.completionStartTime !== undefined ? { completionStartTime: new Date(state.completionStartTime) } : {}),\n ...(responseModel ? { model: responseModel } : {}),\n ...(Object.keys(usageDetails).length > 0 ? { usageDetails } : {}),\n ...(Object.keys(costDetails).length > 0 ? { costDetails } : {}),\n metadata: {\n ...state.requestMetadata,\n ...httpMetadata,\n ...(message.provider ? { \"pi.provider\": message.provider, \"pi.response.provider\": message.provider } : {}),\n ...(message.api ? { \"pi.response.api\": message.api } : {}),\n ...(responseModel ? { \"pi.response.model\": responseModel } : {}),\n ...(message.responseId ? { \"pi.response.id\": message.responseId } : {}),\n ...(message.responseModel && message.model && message.responseModel !== message.model\n ? { \"pi.requested_model\": message.model }\n : {}),\n ...(message.stopReason ? { \"pi.stop_reason\": message.stopReason } : {}),\n ...(finiteNumber(message.usage?.reasoning) ? { \"pi.usage.reasoning_tokens\": message.usage.reasoning } : {}),\n ...(finiteNumber(message.usage?.cacheWrite1h)\n ? { \"pi.usage.cache_write_1h_tokens\": message.usage.cacheWrite1h }\n : {}),\n },\n ...severityForOutcome(outcome, message.errorMessage),\n });\n state.observation.end(state.endTime);\n this.generation = undefined;\n }\n\n beginTool(toolCallId: string, toolName: string, args?: unknown, startedAt = Date.now()): void {\n if (!this.root) return;\n this.counters.tools += 1;\n if (this.duplicateToolIds.has(toolCallId)) {\n this.counters.toolErrors += 1;\n const duplicate = this.startToolObservation(toolCallId, toolName, args);\n duplicate.update({\n level: \"ERROR\",\n statusMessage: \"Duplicate tool call ID cannot be correlated safely.\",\n });\n duplicate.end();\n return;\n }\n\n const existing = this.tools.get(toolCallId);\n if (existing) {\n existing.observation.update({\n level: \"ERROR\",\n statusMessage: \"Duplicate tool execution started.\",\n });\n existing.observation.end();\n this.tools.delete(toolCallId);\n this.counters.toolErrors += 2;\n const duplicate = this.startToolObservation(toolCallId, toolName, args);\n duplicate.update({\n level: \"ERROR\",\n statusMessage: \"Duplicate tool call ID cannot be correlated safely.\",\n });\n duplicate.end();\n this.duplicateToolIds.add(toolCallId);\n return;\n }\n\n this.tools.set(toolCallId, {\n observation: this.startToolObservation(toolCallId, toolName, args),\n startedAt,\n progressUpdates: 0,\n });\n }\n\n recordToolInput(toolCallId: string, input: unknown): void {\n if (input === undefined || this.duplicateToolIds.has(toolCallId)) return;\n this.tools.get(toolCallId)?.observation.update({ input: this.capture(input) });\n }\n\n recordToolProgress(toolCallId: string, timestamp = Date.now()): void {\n const tool = this.tools.get(toolCallId);\n if (!tool) return;\n tool.progressUpdates += 1;\n tool.firstProgressAt ??= timestamp;\n }\n\n finishTool(toolCallId: string, result: ToolResult): void {\n if (this.duplicateToolIds.has(toolCallId)) return;\n const tool = this.tools.get(toolCallId);\n if (!tool) return;\n if (result.isError) {\n this.counters.toolErrors += 1;\n this.unresolvedToolErrors += 1;\n }\n tool.observation.update({\n output: this.capture({ content: result.content, details: result.details }),\n metadata: {\n \"pi.tool.progress_update_count\": tool.progressUpdates,\n ...(tool.firstProgressAt !== undefined\n ? {\n \"pi.tool.time_to_first_progress_ms\": Math.max(0, tool.firstProgressAt - tool.startedAt),\n }\n : {}),\n },\n ...(result.isError ? { level: \"ERROR\" as const, statusMessage: \"Pi tool execution failed.\" } : {}),\n });\n tool.observation.end();\n this.tools.delete(toolCallId);\n }\n\n beginCompaction(input: CompactionStart): void {\n if (!this.root) return;\n this.closeCompaction(\"Interrupted by another Pi compaction.\");\n this.counters.compactions += 1;\n this.compaction = {\n observation: this.startObservation(\n \"pi.compaction\",\n {\n metadata: {\n \"pi.compaction.reason\": input.reason,\n \"pi.compaction.will_retry\": input.willRetry,\n ...(finiteNumber(input.tokensBefore) ? { \"pi.compaction.tokens_before\": input.tokensBefore } : {}),\n \"pi.compaction.messages_to_summarize\": input.messagesToSummarize,\n \"pi.compaction.turn_prefix_messages\": input.turnPrefixMessages,\n \"pi.compaction.branch_entries\": input.branchEntries,\n \"pi.compaction.is_split_turn\": input.isSplitTurn,\n },\n version: TRACE_SCHEMA_VERSION,\n },\n { asType: \"span\", parent: this.root },\n ),\n };\n }\n\n finishCompaction(input: CompactionFinish): void {\n if (!this.compaction) return;\n const details = structuralCompactionDetails(input.details);\n const usage = numericRecord({\n input: input.usage?.input,\n output: input.usage?.output,\n cache_read: input.usage?.cacheRead,\n cache_write: input.usage?.cacheWrite,\n total: input.usage?.totalTokens,\n });\n const cost = positiveNumericRecord({\n input: input.usage?.cost?.input,\n output: input.usage?.cost?.output,\n cache_read: input.usage?.cost?.cacheRead,\n cache_write: input.usage?.cost?.cacheWrite,\n total: input.usage?.cost?.total,\n });\n this.compaction.observation.update({\n metadata: {\n \"pi.compaction.reason\": input.reason,\n \"pi.compaction.will_retry\": input.willRetry,\n \"pi.compaction.from_extension\": input.fromExtension,\n ...(finiteNumber(input.tokensBefore) ? { \"pi.compaction.tokens_before\": input.tokensBefore } : {}),\n ...details,\n ...prefixRecord(\"pi.compaction.usage\", usage),\n ...prefixRecord(\"pi.compaction.cost\", cost),\n },\n });\n this.compaction.observation.end();\n this.compaction = undefined;\n }\n\n settle(snapshot?: ContextSnapshot): void {\n this.closeActiveTrace(undefined, snapshot);\n }\n\n interrupt(statusMessage: string, snapshot?: ContextSnapshot): void {\n this.closeActiveTrace(statusMessage, snapshot, \"interrupted\");\n }\n\n dispose(statusMessage = \"Pi session ended before the active trace settled.\", snapshot?: ContextSnapshot): void {\n this.closeActiveTrace(statusMessage, snapshot, \"interrupted\");\n }\n\n private closeActiveTrace(statusMessage?: string, snapshot?: ContextSnapshot, forcedOutcome?: Outcome): void {\n this.closeTurn(statusMessage ?? \"Pi turn ended when the agent run settled.\");\n this.closeAttempt(undefined, statusMessage, forcedOutcome ?? \"interrupted\");\n this.closeCompaction(statusMessage ?? \"Pi compaction ended when the agent run settled.\");\n\n if (!this.root) return;\n const baseOutcome = forcedOutcome ?? this.lastAttemptOutcome ?? classifyOutcome(this.lastAssistant);\n const recoveredErrorCount =\n this.counters.recoveredErrors + (baseOutcome === \"success\" ? this.counters.failedAttempts : 0);\n const traceOutcome = baseOutcome === \"success\" && recoveredErrorCount > 0 ? \"recovered_success\" : baseOutcome;\n const finalMetadata: Record<string, unknown> = {\n \"pi.trace.schema_version\": Number(TRACE_SCHEMA_VERSION),\n \"pi.trace.outcome\": traceOutcome,\n ...(this.lastAssistant?.stopReason ? { \"pi.trace.stop_reason\": this.lastAssistant.stopReason } : {}),\n \"pi.trace.attempt_count\": this.counters.attempts,\n \"pi.trace.turn_count\": this.counters.turns,\n \"pi.trace.generation_count\": this.counters.generations,\n \"pi.trace.tool_count\": this.counters.tools,\n \"pi.trace.tool_error_count\": this.counters.toolErrors,\n \"pi.trace.compaction_count\": this.counters.compactions,\n \"pi.trace.recovered_error_count\": recoveredErrorCount,\n ...snapshotMetadata(\"start\", this.startSnapshot),\n ...snapshotMetadata(\"end\", snapshot),\n };\n const finalAttributes: ObservationAttributes = {\n ...(this.lastOutput !== undefined ? { output: this.lastOutput } : {}),\n metadata: finalMetadata,\n ...severityForOutcome(baseOutcome, statusMessage ?? this.lastAssistant?.errorMessage),\n };\n this.root.update(finalAttributes);\n this.root.updateTrace?.({\n ...(this.lastOutput !== undefined ? { output: this.lastOutput } : {}),\n metadata: finalMetadata,\n version: TRACE_SCHEMA_VERSION,\n });\n this.root.end();\n this.root = undefined;\n this.lastOutput = undefined;\n this.lastAssistant = undefined;\n this.lastAttemptOutcome = undefined;\n this.unresolvedToolErrors = 0;\n this.duplicateToolIds.clear();\n this.startSnapshot = undefined;\n }\n\n private closeAttempt(message?: AssistantMessage, statusMessage?: string, forcedOutcome?: Outcome): void {\n if (!this.attempt) return;\n this.closeTurn(statusMessage ?? \"Pi turn ended when the attempt finished.\");\n const outcome = forcedOutcome ?? classifyOutcome(message);\n if (outcome === \"error\") this.counters.failedAttempts += 1;\n this.lastAttemptOutcome = outcome;\n this.attempt.update({\n ...(message?.content !== undefined ? { output: this.capture(message.content) } : {}),\n metadata: {\n \"pi.attempt.index\": this.attemptIndex ?? Math.max(0, this.counters.attempts - 1),\n \"pi.attempt.outcome\": outcome,\n ...(message?.stopReason ? { \"pi.attempt.stop_reason\": message.stopReason } : {}),\n },\n ...severityForOutcome(outcome, statusMessage ?? message?.errorMessage),\n });\n this.attempt.end();\n this.attempt = undefined;\n this.attemptIndex = undefined;\n this.unresolvedToolErrors = 0;\n }\n\n private startToolObservation(toolCallId: string, toolName: string, args?: unknown): Observation {\n return this.startObservation(\n `pi.tool.${toolName}`,\n {\n ...(args !== undefined ? { input: this.capture(args) } : {}),\n metadata: { \"pi.tool.call_id\": toolCallId, \"pi.tool.name\": toolName },\n version: TRACE_SCHEMA_VERSION,\n },\n { asType: \"tool\", parent: this.turn ?? this.attempt ?? this.root },\n );\n }\n\n private closeTurn(statusMessage: string, generationLevel: \"ERROR\" | \"WARNING\" = \"WARNING\"): void {\n this.closeGeneration(statusMessage, generationLevel);\n this.closeTools(statusMessage);\n if (!this.turn) return;\n this.turn.update({ level: \"WARNING\", statusMessage });\n this.turn.end();\n this.turn = undefined;\n this.turnIndex = undefined;\n }\n\n private closeTools(statusMessage: string): void {\n for (const tool of this.tools.values()) {\n tool.observation.update({\n level: \"WARNING\",\n statusMessage,\n metadata: {\n \"pi.tool.progress_update_count\": tool.progressUpdates,\n ...(tool.firstProgressAt !== undefined\n ? {\n \"pi.tool.time_to_first_progress_ms\": Math.max(0, tool.firstProgressAt - tool.startedAt),\n }\n : {}),\n },\n });\n tool.observation.end();\n }\n this.tools.clear();\n }\n\n private closeGeneration(statusMessage: string, level: \"ERROR\" | \"WARNING\" = \"ERROR\"): void {\n if (!this.generation) return;\n this.generation.observation.update({\n level,\n statusMessage,\n metadata: {\n ...this.generation.requestMetadata,\n ...generationHttpMetadata(this.generation),\n },\n });\n this.generation.observation.end(this.generation.endTime);\n this.generation = undefined;\n }\n\n private closeCompaction(statusMessage: string): void {\n if (!this.compaction) return;\n this.compaction.observation.update({ level: \"WARNING\", statusMessage });\n this.compaction.observation.end();\n this.compaction = undefined;\n }\n\n private capture(value: unknown): unknown {\n return this.context.captureContent ? sanitizeTraceValue(value) : CONTENT_DISABLED;\n }\n}\n\nfunction normalizeTraceName(value: string | undefined): string {\n return typeof value === \"string\" && value.trim() ? value.trim() : \"pi.trace\";\n}\n\nfunction traceTags(customTags: readonly string[] | undefined, gitTag: string | undefined): string[] {\n const tags = [\"pi\", ...(gitTag ? [gitTag] : []), ...(customTags ?? [])];\n return [...new Set(tags.map(sanitizeTraceTag).filter((tag): tag is string => tag !== undefined))];\n}\n\nfunction sanitizeTraceTag(value: unknown): string | undefined {\n if (typeof value !== \"string\" || !value.trim()) return undefined;\n const sanitized = sanitizeTraceValue(value.trim());\n return typeof sanitized === \"string\" && sanitized.trim() ? sanitized.trim() : undefined;\n}\n\nfunction customTraceMetadata(metadata: Readonly<Record<string, unknown>> | undefined): Record<string, unknown> {\n if (!metadata) return {};\n const sanitized = sanitizeTraceValue(metadata);\n if (!sanitized || typeof sanitized !== \"object\" || Array.isArray(sanitized)) return {};\n return Object.fromEntries(Object.entries(sanitized).filter(([key]) => !key.startsWith(\"pi.\")));\n}\n\nfunction generationHttpMetadata(state: GenerationState): Record<string, unknown> {\n const finalStatus = state.statuses.at(-1);\n return {\n ...(state.statuses.length > 0\n ? {\n \"http.response.status_codes\": [...state.statuses],\n \"http.response.status_code\": finalStatus,\n \"http.response.attempt_count\": state.statuses.length,\n \"http.response.retry_count\": Math.max(0, state.statuses.length - 1),\n }\n : {}),\n ...(Object.keys(state.headers).length > 0 ? { \"http.response.headers\": { ...state.headers } } : {}),\n };\n}\n\nfunction allowlistedResponseHeaders(headers: Record<string, string>): Record<string, string> {\n const output: Record<string, string> = {};\n for (const [rawName, rawValue] of Object.entries(headers)) {\n const name = rawName.toLowerCase();\n if (!ALLOWED_RESPONSE_HEADERS.has(name) || typeof rawValue !== \"string\") continue;\n output[name] = truncateString(rawValue, MAX_HEADER_VALUE_LENGTH);\n }\n return output;\n}\n\nfunction structuralCompactionDetails(details: unknown): Record<string, unknown> {\n if (!details || typeof details !== \"object\" || Array.isArray(details)) return {};\n const record = details as Record<string, unknown>;\n return {\n ...(Array.isArray(record.readFiles) ? { \"pi.compaction.read_file_count\": record.readFiles.length } : {}),\n ...(Array.isArray(record.modifiedFiles)\n ? { \"pi.compaction.modified_file_count\": record.modifiedFiles.length }\n : {}),\n };\n}\n\nfunction snapshotMetadata(prefix: string, snapshot?: ContextSnapshot): Record<string, unknown> {\n if (!snapshot) return {};\n return {\n ...(snapshot.leafId ? { [`pi.trace.${prefix}_leaf_id`]: snapshot.leafId } : {}),\n ...(snapshot.contextUsage\n ? {\n ...(finiteNumber(snapshot.contextUsage.tokens)\n ? { [`pi.trace.${prefix}_context_tokens`]: snapshot.contextUsage.tokens }\n : {}),\n [`pi.trace.${prefix}_context_window`]: snapshot.contextUsage.contextWindow,\n ...(finiteNumber(snapshot.contextUsage.percent)\n ? { [`pi.trace.${prefix}_context_percent`]: snapshot.contextUsage.percent }\n : {}),\n }\n : {}),\n };\n}\n\nfunction classifyOutcome(message?: { role?: string; stopReason?: string; errorMessage?: string }): Outcome {\n if (message?.role !== \"assistant\") return \"interrupted\";\n if (message.stopReason === \"error\" || message.errorMessage) return \"error\";\n if (message.stopReason === \"aborted\") return \"aborted\";\n if (message.stopReason === \"length\") return \"length\";\n return \"success\";\n}\n\nfunction severityForOutcome(\n outcome: Outcome,\n statusMessage?: string,\n): Pick<ObservationAttributes, \"level\" | \"statusMessage\"> {\n if (outcome === \"success\") return {};\n if (outcome === \"error\") {\n return {\n level: \"ERROR\",\n statusMessage: statusMessage ?? \"The Pi operation failed.\",\n };\n }\n return {\n level: \"WARNING\",\n statusMessage:\n statusMessage ??\n (outcome === \"aborted\"\n ? \"The Pi operation was aborted.\"\n : outcome === \"length\"\n ? \"The model reached its output limit.\"\n : \"The Pi operation was interrupted.\"),\n };\n}\n\nfunction prefixRecord(prefix: string, values: Record<string, number>): Record<string, number> {\n return Object.fromEntries(Object.entries(values).map(([key, value]) => [`${prefix}.${key}`, value]));\n}\n\nfunction truncateString(value: string, maxBytes: number): string {\n const boundedPrefix = value.slice(0, maxBytes);\n if (boundedPrefix.length === value.length && byteLength(boundedPrefix) <= maxBytes) {\n return boundedPrefix;\n }\n const suffix = \"\u2026 [truncated]\";\n const target = Math.max(0, maxBytes - byteLength(suffix) - 2);\n let bytes = 0;\n let output = \"\";\n for (const character of boundedPrefix) {\n const size = byteLength(character);\n if (bytes + size > target) break;\n output += character;\n bytes += size;\n }\n return `${output}${suffix}`;\n}\n\nfunction byteLength(value: string): number {\n return Buffer.byteLength(value, \"utf8\");\n}\n\nfunction numericRecord(values: Record<string, number | undefined>): Record<string, number> {\n return Object.fromEntries(\n Object.entries(values).filter((entry): entry is [string, number] => finiteNumber(entry[1])),\n );\n}\n\nfunction positiveNumericRecord(values: Record<string, number | undefined>): Record<string, number> {\n return Object.fromEntries(\n Object.entries(values).filter((entry): entry is [string, number] => finiteNumber(entry[1]) && entry[1] > 0),\n );\n}\n\nfunction finiteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction hasItems(value: unknown): boolean {\n return Array.isArray(value) ? value.length > 0 : value !== undefined;\n}\n\nfunction emptyCounters(): Counters {\n return {\n attempts: 0,\n turns: 0,\n generations: 0,\n tools: 0,\n toolErrors: 0,\n compactions: 0,\n recoveredErrors: 0,\n failedAttempts: 0,\n };\n}\n", "import type { ExtensionAPI, ExtensionContext, ExtensionFactory } from \"@earendil-works/pi-coding-agent\";\nimport { resolveGitMetadata } from \"./git.js\";\nimport { getLangfuseRuntimeInternal, type LangfuseRuntime } from \"./runtime-core.js\";\nimport {\n type ContextSnapshot,\n type GitMetadata,\n sanitizeTraceValue,\n TraceRecorder,\n type TraceRecorderOptions,\n} from \"./tracing.js\";\n\nexport interface PiLangfuseSessionOptions {\n traceName?: string;\n sessionId?: string;\n userId?: string;\n tags?: readonly string[];\n metadata?: Readonly<Record<string, unknown>>;\n captureContent?: boolean;\n onTraceId?: (traceId: string) => void;\n}\n\nexport interface PiLangfuseSession {\n readonly extension: ExtensionFactory;\n setRequestId(requestId?: string): void;\n dispose(): Promise<void>;\n}\n\ninterface ResolvedSession {\n runtime: LangfuseRuntime;\n options?: PiLangfuseSessionOptions;\n releaseIfStale?(reason: string): Promise<void>;\n}\n\ninterface PiLangfuseSessionControllerOptions {\n resolveSession(ctx: ExtensionContext, isCurrent: () => boolean): Promise<ResolvedSession | undefined>;\n resolveGitMetadata?(pi: ExtensionAPI, cwd: string): Promise<GitMetadata | undefined>;\n onSessionStart?(): void;\n onSessionShutdown?(): void;\n onSessionReady?(session: ResolvedSession): void;\n onSessionUnavailable?(): void;\n onInitializationError?(error: unknown, ctx: ExtensionContext): void;\n beforeSessionDispose?(): Promise<void>;\n onShutdownError?(error: unknown, ctx: ExtensionContext): void;\n flushOnReplacement?: boolean;\n shutdownRuntimeOnQuit?: boolean;\n}\n\ntype Registration = object;\n\ntype InitializationResult = { ok: true } | { ok: false; error: unknown };\n\ninterface PendingInitialization {\n current: boolean;\n reason?: string;\n completion: Promise<InitializationResult>;\n complete(result: InitializationResult): void;\n}\n\ninterface PendingProviderGeneration {\n startedAt: number;\n payload: unknown;\n model?: { provider: string; id: string; api: string };\n thinkingLevel?: string;\n responses: Array<{ status: number; headers: Record<string, string> }>;\n}\n\ninterface ActiveBinding {\n registration: Registration;\n recorder: TraceRecorder;\n runtime: LangfuseRuntime;\n releaseRuntime: () => void;\n}\n\nexport interface PiLangfuseSessionController extends PiLangfuseSession {\n readonly active: boolean;\n readonly runtime: LangfuseRuntime | undefined;\n flush(): Promise<void>;\n}\n\nexport function createPiLangfuseSession(\n runtime: LangfuseRuntime,\n options: PiLangfuseSessionOptions = {},\n): PiLangfuseSession {\n const sessionOptions = snapshotSessionOptions(options);\n return createPiLangfuseSessionController({\n resolveSession: async () => ({ runtime, options: sessionOptions }),\n });\n}\n\nexport function createPiLangfuseSessionController(\n options: PiLangfuseSessionControllerOptions,\n): PiLangfuseSessionController {\n let binding: ActiveBinding | undefined;\n let runtimeForShutdown: LangfuseRuntime | undefined;\n let ownerRegistration: Registration | undefined;\n let pendingInitialization: PendingInitialization | undefined;\n const outstandingInitializations = new Set<PendingInitialization>();\n let disposePromise: Promise<void> | undefined;\n let disposed = false;\n let sessionGeneration = 0;\n let requestId: string | undefined;\n let requestIdRevision = 0;\n let nextAttemptReason: string | undefined;\n let lastSnapshot: ContextSnapshot | undefined;\n let pendingProviderGeneration: PendingProviderGeneration | undefined;\n\n const controller: PiLangfuseSessionController = {\n extension(pi) {\n if (disposed) throw new Error(\"A disposed Pi Langfuse session controller cannot be bound.\");\n registerHooks(pi);\n },\n setRequestId(value) {\n requestId = normalizeOptionalString(value);\n requestIdRevision += 1;\n },\n dispose() {\n if (disposePromise) return disposePromise;\n disposed = true;\n const initializations = invalidateAllInitializations(\"disposed\");\n ownerRegistration = undefined;\n sessionGeneration += 1;\n closeBinding(binding, \"Pi Langfuse session controller was disposed.\", lastSnapshot);\n runtimeForShutdown = undefined;\n disposePromise = joinInitializations(initializations);\n return disposePromise;\n },\n get active() {\n return binding !== undefined;\n },\n get runtime() {\n return binding?.runtime;\n },\n async flush() {\n const runtime = binding?.runtime;\n if (!runtime) throw new Error(\"Langfuse tracing is not enabled for this session.\");\n await runtime.flush();\n },\n };\n\n function closeBinding(target: ActiveBinding | undefined, statusMessage: string, snapshot?: ContextSnapshot): void {\n if (!target) return;\n const wasCurrent = binding === target;\n if (wasCurrent) {\n binding = undefined;\n pendingProviderGeneration = undefined;\n }\n target.releaseRuntime();\n target.recorder.dispose(statusMessage, snapshot);\n if (wasCurrent) nextAttemptReason = undefined;\n }\n\n function invalidatePendingInitialization(reason: string): void {\n if (!pendingInitialization) return;\n pendingInitialization.current = false;\n pendingInitialization.reason = reason;\n pendingInitialization = undefined;\n }\n\n function invalidateAllInitializations(reason: string): PendingInitialization[] {\n const initializations = [...outstandingInitializations];\n for (const initialization of initializations) {\n initialization.current = false;\n initialization.reason = reason;\n }\n pendingInitialization = undefined;\n return initializations;\n }\n\n function createPendingInitialization(): PendingInitialization {\n let complete!: (result: InitializationResult) => void;\n const completion = new Promise<InitializationResult>((resolve) => {\n complete = resolve;\n });\n const initialization = { current: true, completion, complete };\n outstandingInitializations.add(initialization);\n return initialization;\n }\n\n async function joinInitializations(initializations: readonly PendingInitialization[]): Promise<void> {\n const results = await Promise.all(initializations.map(({ completion }) => completion));\n const errors = results.flatMap((result) => (result.ok ? [] : [result.error]));\n if (errors.length === 1) throw errors[0];\n if (errors.length > 1) throw new AggregateError(errors, \"Pi Langfuse session initialization cleanup failed.\");\n }\n\n async function initializeSession(\n registration: Registration,\n initialization: PendingInitialization,\n ctx: ExtensionContext,\n ): Promise<void> {\n const generation = ++sessionGeneration;\n closeBinding(binding, \"Pi session was replaced before shutdown completed.\", lastSnapshot);\n lastSnapshot = contextSnapshot(ctx);\n nextAttemptReason = undefined;\n options.onSessionStart?.();\n\n const isCurrent = () =>\n !disposed && initialization.current && ownerRegistration === registration && generation === sessionGeneration;\n let resolved: ResolvedSession | undefined;\n try {\n resolved = await options.resolveSession(ctx, isCurrent);\n } catch (error) {\n if (isCurrent()) options.onInitializationError?.(error, ctx);\n return;\n }\n if (!isCurrent()) {\n const reason = initialization.reason ?? \"replaced\";\n if (\n resolved &&\n options.shutdownRuntimeOnQuit &&\n reason !== \"quit\" &&\n reason !== \"disposed\" &&\n (!runtimeForShutdown || runtimeForShutdown.closed)\n ) {\n runtimeForShutdown = resolved.runtime;\n }\n await resolved?.releaseIfStale?.(reason);\n return;\n }\n if (!resolved) {\n options.onSessionUnavailable?.();\n return;\n }\n\n try {\n const internal = getLangfuseRuntimeInternal(resolved.runtime);\n const recorderOptions = createRecorderOptions(ctx, resolved.options);\n const recorder = new TraceRecorder(internal.backend, recorderOptions);\n const nextBinding = {} as ActiveBinding;\n const releaseRuntime = internal.registerSession((statusMessage) => {\n closeBinding(nextBinding, statusMessage, lastSnapshot);\n });\n Object.assign(nextBinding, { registration, recorder, runtime: resolved.runtime, releaseRuntime });\n if (!isCurrent()) {\n releaseRuntime();\n return;\n }\n binding = nextBinding;\n if (options.shutdownRuntimeOnQuit) runtimeForShutdown = resolved.runtime;\n options.onSessionReady?.(resolved);\n } catch (error) {\n if (isCurrent()) options.onInitializationError?.(error, ctx);\n }\n }\n\n function registerHooks(pi: ExtensionAPI): void {\n const registration: Registration = {};\n const activeRecorder = () => activeRecorderFor(registration);\n\n pi.on(\"session_start\", async (_event, ctx) => {\n if (disposed) return;\n pendingProviderGeneration = undefined;\n if (ownerRegistration && ownerRegistration !== registration) {\n options.onInitializationError?.(\n new Error(\"A Pi Langfuse session controller cannot manage multiple active Pi sessions.\"),\n ctx,\n );\n return;\n }\n\n invalidatePendingInitialization(\"replaced\");\n ownerRegistration = registration;\n const initialization = createPendingInitialization();\n pendingInitialization = initialization;\n let result: InitializationResult = { ok: true };\n try {\n await initializeSession(registration, initialization, ctx);\n } catch (error) {\n result = { ok: false, error };\n throw error;\n } finally {\n initialization.complete(result);\n outstandingInitializations.delete(initialization);\n if (pendingInitialization === initialization) pendingInitialization = undefined;\n }\n });\n\n pi.on(\"before_agent_start\", async (event, ctx) => {\n // Cache warming emits provider hooks without assistant lifecycle events. Unclaimed\n // metadata is discarded at the next real run rather than classified by timing.\n pendingProviderGeneration = undefined;\n const active = ownerRegistration === registration ? binding : undefined;\n if (!active || active.runtime.closed) return;\n nextAttemptReason = undefined;\n const git = await (options.resolveGitMetadata\n ? options.resolveGitMetadata(pi, ctx.cwd)\n : resolveGitMetadata((command, args, execOptions) => pi.exec(command, args, execOptions), ctx.cwd)\n ).catch(() => undefined);\n if (ownerRegistration !== registration || binding !== active || active.runtime.closed) return;\n lastSnapshot = contextSnapshot(ctx);\n startRootTrace((nextRequestId) => {\n active.recorder.beginAgent({\n prompt: event.prompt,\n images: event.images,\n model: ctx.model ? { provider: ctx.model.provider, id: ctx.model.id, api: ctx.model.api } : undefined,\n git,\n snapshot: lastSnapshot,\n ...(nextRequestId ? { requestId: nextRequestId } : {}),\n });\n });\n });\n\n pi.on(\"agent_start\", () => {\n const recorder = activeRecorder();\n if (!recorder) return;\n recorder.beginAttempt(nextAttemptReason ? { reason: nextAttemptReason } : undefined);\n nextAttemptReason = undefined;\n });\n\n pi.on(\"turn_start\", (event, ctx) => {\n const recorder = activeRecorder();\n if (!recorder) return;\n lastSnapshot = contextSnapshot(ctx);\n ensureActiveRun(recorder, ctx, startRootTrace);\n recorder.beginTurn(event.turnIndex);\n });\n\n pi.on(\"before_provider_request\", (event, ctx) => {\n if (!activeRecorder()) return;\n lastSnapshot = contextSnapshot(ctx);\n pendingProviderGeneration = {\n startedAt: Date.now(),\n payload: event.payload,\n model: ctx.model ? { provider: ctx.model.provider, id: ctx.model.id, api: ctx.model.api } : undefined,\n thinkingLevel: pi.getThinkingLevel(),\n responses: [],\n };\n });\n\n pi.on(\"after_provider_response\", (event) => {\n pendingProviderGeneration?.responses.push({ status: event.status, headers: event.headers });\n });\n\n pi.on(\"message_start\", (event, ctx) => {\n if (event.message.role === \"assistant\") claimPendingProviderGeneration(ctx, activeRecorder());\n });\n\n pi.on(\"message_update\", (event, ctx) => {\n if (!isRealOutputDelta(event.assistantMessageEvent)) return;\n const recorder = activeRecorder();\n claimPendingProviderGeneration(ctx, recorder);\n recorder?.markGenerationFirstOutput();\n });\n\n pi.on(\"message_end\", (event, ctx) => {\n if (event.message.role !== \"assistant\") return;\n const recorder = activeRecorder();\n claimPendingProviderGeneration(ctx, recorder);\n recorder?.markGenerationEnd();\n });\n\n pi.on(\"turn_end\", (event, ctx) => {\n const recorder = activeRecorder();\n if (!recorder) return;\n if (event.message.role === \"assistant\") claimPendingProviderGeneration(ctx, recorder);\n lastSnapshot = contextSnapshot(ctx);\n if (event.message.role === \"assistant\") recorder.finishAssistant(event.message);\n recorder.finishTurn(event.turnIndex, {\n message: event.message,\n toolResultCount: event.toolResults.length,\n });\n });\n\n pi.on(\"tool_execution_start\", (event) => {\n activeRecorder()?.beginTool(event.toolCallId, event.toolName, event.args);\n });\n\n pi.on(\"tool_execution_update\", (event) => {\n activeRecorder()?.recordToolProgress(event.toolCallId);\n });\n\n pi.on(\"tool_result\", (event) => {\n activeRecorder()?.recordToolInput(event.toolCallId, event.input);\n });\n\n pi.on(\"tool_execution_end\", (event) => {\n activeRecorder()?.finishTool(event.toolCallId, {\n content: event.result.content,\n details: event.result.details,\n isError: event.isError,\n });\n });\n\n pi.on(\"agent_end\", (event) => {\n const message = findLastAssistant(event.messages);\n activeRecorder()?.finishAttempt(message);\n });\n\n pi.on(\"session_before_compact\", (event) => {\n activeRecorder()?.beginCompaction({\n reason: event.reason,\n willRetry: event.willRetry,\n tokensBefore: event.preparation.tokensBefore,\n messagesToSummarize: event.preparation.messagesToSummarize.length,\n turnPrefixMessages: event.preparation.turnPrefixMessages.length,\n branchEntries: event.branchEntries.length,\n isSplitTurn: event.preparation.isSplitTurn,\n });\n });\n\n pi.on(\"session_compact\", (event) => {\n const recorder = activeRecorder();\n const entry = event.compactionEntry as typeof event.compactionEntry & {\n usage?: Parameters<TraceRecorder[\"finishCompaction\"]>[0][\"usage\"];\n };\n recorder?.finishCompaction({\n reason: event.reason,\n willRetry: event.willRetry,\n fromExtension: event.fromExtension,\n tokensBefore: entry.tokensBefore,\n details: entry.details,\n usage: entry.usage,\n });\n if (event.willRetry && recorder?.hasActiveTrace()) nextAttemptReason = \"post_compaction\";\n });\n\n pi.on(\"agent_settled\", (_event, ctx) => {\n const recorder = activeRecorder();\n if (!recorder) return;\n lastSnapshot = contextSnapshot(ctx);\n recorder.settle(lastSnapshot);\n pendingProviderGeneration = undefined;\n nextAttemptReason = undefined;\n });\n\n pi.on(\"session_shutdown\", async (event, ctx) => {\n if (ownerRegistration !== registration) return;\n const initializations = invalidateAllInitializations(event.reason);\n ownerRegistration = undefined;\n const generation = ++sessionGeneration;\n options.onSessionShutdown?.();\n const active = binding?.registration === registration ? binding : undefined;\n const runtime = active?.runtime ?? runtimeForShutdown;\n lastSnapshot = active ? contextSnapshot(ctx) : lastSnapshot;\n closeBinding(\n active,\n event.reason === \"quit\"\n ? \"Pi shut down before the active trace settled.\"\n : `Pi session ended before settlement (${event.reason}).`,\n lastSnapshot,\n );\n\n let beforeDisposeFailure: { error: unknown } | undefined;\n try {\n await options.beforeSessionDispose?.();\n } catch (error) {\n beforeDisposeFailure = { error };\n }\n\n try {\n await joinInitializations(initializations);\n if (disposed || generation !== sessionGeneration) return;\n if (beforeDisposeFailure) throw beforeDisposeFailure.error;\n if (runtime) {\n if (event.reason === \"quit\" && options.shutdownRuntimeOnQuit) await runtime.shutdown();\n else if (options.flushOnReplacement) await runtime.flush();\n }\n } catch (error) {\n if (!disposed && generation === sessionGeneration) options.onShutdownError?.(error, ctx);\n }\n });\n }\n\n function claimPendingProviderGeneration(ctx: ExtensionContext, recorder: TraceRecorder | undefined): void {\n const pending = pendingProviderGeneration;\n if (!pending || !recorder) return;\n pendingProviderGeneration = undefined;\n ensureActiveRun(recorder, ctx, startRootTrace);\n recorder.beginGeneration({\n startedAt: pending.startedAt,\n payload: pending.payload,\n payloadStage: \"before_provider_request\",\n model: pending.model,\n thinkingLevel: pending.thinkingLevel,\n });\n for (const response of pending.responses) recorder.recordProviderResponse(response.status, response.headers);\n }\n\n function startRootTrace(start: (nextRequestId: string | undefined) => void): void {\n const revision = requestIdRevision;\n const nextRequestId = requestId;\n start(nextRequestId);\n if (requestIdRevision === revision) requestId = undefined;\n }\n\n function activeRecorderFor(registration: Registration): TraceRecorder | undefined {\n return ownerRegistration === registration && binding?.registration === registration && !binding.runtime.closed\n ? binding.recorder\n : undefined;\n }\n\n return controller;\n}\n\nfunction createRecorderOptions(ctx: ExtensionContext, options: PiLangfuseSessionOptions = {}): TraceRecorderOptions {\n const userId = normalizeUserId(options.userId);\n return {\n sessionId: normalizeOptionalString(options.sessionId) ?? ctx.sessionManager.getSessionId(),\n ...(userId ? { userId } : {}),\n cwd: ctx.cwd,\n mode: ctx.mode,\n captureContent: options.captureContent ?? true,\n ...(normalizeOptionalString(options.traceName) ? { traceName: normalizeOptionalString(options.traceName) } : {}),\n ...(options.tags ? { tags: [...options.tags] } : {}),\n ...(options.metadata ? { metadata: { ...options.metadata } } : {}),\n ...(options.onTraceId ? { onTraceId: options.onTraceId } : {}),\n };\n}\n\nfunction snapshotSessionOptions(options: PiLangfuseSessionOptions): PiLangfuseSessionOptions {\n normalizeUserId(options.userId);\n return {\n ...options,\n ...(options.tags ? { tags: [...options.tags] } : {}),\n ...(options.metadata ? { metadata: { ...options.metadata } } : {}),\n };\n}\n\nfunction ensureActiveRun(\n recorder: TraceRecorder,\n ctx: ExtensionContext,\n startRootTrace: (start: (nextRequestId: string | undefined) => void) => void,\n): void {\n if (!recorder.hasActiveTrace()) {\n startRootTrace((nextRequestId) => {\n recorder.beginAgent({\n prompt: \"[automatic continuation]\",\n model: ctx.model ? { provider: ctx.model.provider, id: ctx.model.id, api: ctx.model.api } : undefined,\n snapshot: contextSnapshot(ctx),\n ...(nextRequestId ? { requestId: nextRequestId } : {}),\n });\n });\n }\n if (!recorder.hasActiveAttempt()) recorder.beginAttempt();\n}\n\nfunction contextSnapshot(ctx: ExtensionContext): ContextSnapshot {\n return {\n leafId: typeof ctx.sessionManager.getLeafId === \"function\" ? ctx.sessionManager.getLeafId() : undefined,\n contextUsage: ctx.getContextUsage(),\n };\n}\n\nfunction findLastAssistant<T extends { role?: string }>(messages: readonly T[]): T | undefined {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message?.role === \"assistant\") return message;\n }\n return undefined;\n}\n\nfunction isRealOutputDelta(event: { type: string; delta?: unknown }): boolean {\n return (\n (event.type === \"text_delta\" || event.type === \"thinking_delta\" || event.type === \"toolcall_delta\") &&\n typeof event.delta === \"string\" &&\n event.delta.length > 0\n );\n}\n\nfunction normalizeUserId(value: unknown): string | undefined {\n const userId = normalizeOptionalString(value);\n if (userId && userId.length > 200) throw new Error(\"Langfuse userId must be at most 200 characters.\");\n return userId;\n}\n\nfunction normalizeOptionalString(value: unknown): string | undefined {\n if (typeof value !== \"string\" || !value.trim()) return undefined;\n const sanitized = sanitizeTraceValue(value.trim());\n return typeof sanitized === \"string\" && sanitized.trim() ? sanitized.trim() : undefined;\n}\n", "import type { ExtensionAPI, ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport {\n DEFAULT_BASE_URL,\n type LangfuseConfig,\n type LangfuseConfigPatch,\n type LangfuseConfigResult,\n loadLangfuseConfig,\n normalizeLangfuseConfig,\n writeLangfuseConfig,\n} from \"./config.js\";\nimport { createPiLangfuseSessionController, type PiLangfuseSessionController } from \"./pi-session.js\";\nimport { createLangfuseRuntimeFromBackend } from \"./runtime-core.js\";\nimport type { GitMetadata, TraceBackend } from \"./tracing.js\";\n\nexport { resolveGitMetadata } from \"./git.js\";\n\ninterface ExtensionDependencies {\n loadConfig(path?: string): Promise<LangfuseConfigResult>;\n writeConfig(config: LangfuseConfigPatch, path?: string): Promise<unknown>;\n createBackend(config: LangfuseConfig): Promise<TraceBackend>;\n resolveGitMetadata(cwd: string): Promise<GitMetadata | undefined>;\n}\n\nconst FLUSH_ACTION = \"Flush completed traces for this session\";\nconst SET_UP_ACTION = \"Set up Langfuse for this Pi agent directory (restart required)\";\nconst UPDATE_ACTION = \"Update Langfuse for this Pi agent directory (restart required)\";\nconst HELP_ACTION = \"Show setup and privacy help\";\n\nexport function createLangfuseExtension(dependencies: Partial<ExtensionDependencies> = {}): (pi: ExtensionAPI) => void {\n const loadConfig = dependencies.loadConfig ?? loadLangfuseConfig;\n const writeConfig = dependencies.writeConfig ?? writeLangfuseConfig;\n const resolveInjectedGitMetadata = dependencies.resolveGitMetadata;\n\n return function langfuse(pi: ExtensionAPI) {\n let activeConfig: LangfuseConfig | undefined;\n let loadingConfig: LangfuseConfig | undefined;\n let runtimeConfigForShutdown: LangfuseConfig | undefined;\n let shutdownConfig: LangfuseConfig | undefined;\n let configPath: string | undefined;\n let initializationError: string | undefined;\n let hasStoredConfig = false;\n let configurationNotice: string | undefined;\n let sessionGeneration = 0;\n let menuController = new AbortController();\n let configWriteQueue = Promise.resolve();\n\n const tracing: PiLangfuseSessionController = createPiLangfuseSessionController({\n onSessionStart() {\n sessionGeneration += 1;\n menuController.abort(new DOMException(\"Langfuse session replaced\", \"AbortError\"));\n menuController = new AbortController();\n activeConfig = undefined;\n loadingConfig = undefined;\n shutdownConfig = undefined;\n configPath = undefined;\n initializationError = undefined;\n hasStoredConfig = false;\n configurationNotice = undefined;\n },\n onSessionShutdown() {\n sessionGeneration += 1;\n menuController.abort(new DOMException(\"Langfuse session shut down\", \"AbortError\"));\n shutdownConfig = activeConfig ?? runtimeConfigForShutdown ?? loadingConfig;\n activeConfig = undefined;\n },\n async resolveSession(ctx, isCurrent) {\n await configWriteQueue;\n if (!isCurrent()) return undefined;\n const result = await loadConfig();\n if (!isCurrent()) return undefined;\n configPath = result.path;\n for (const warning of result.warnings) ctx.ui.notify(warning, \"warning\");\n if (!result.ok) {\n initializationError = formatConfigError(result);\n ctx.ui.notify(initializationError, \"warning\");\n return undefined;\n }\n\n hasStoredConfig = true;\n loadingConfig = result.config;\n const createBackend = dependencies.createBackend;\n const ownsRuntime = createBackend !== undefined;\n const runtime = createBackend\n ? createLangfuseRuntimeFromBackend(await createBackend(result.config))\n : await (await import(\"./runtime.js\")).createLangfuseRuntime({ config: result.config, env: false });\n if (isCurrent() || !runtimeConfigForShutdown) runtimeConfigForShutdown = result.config;\n if (isCurrent()) {\n activeConfig = result.config;\n loadingConfig = undefined;\n }\n return {\n runtime,\n releaseIfStale: async (reason) => {\n if (ownsRuntime || reason === \"quit\") await runtime.shutdown();\n },\n options: {\n ...(result.config.userId ? { userId: result.config.userId } : {}),\n captureContent: result.config.captureContent,\n },\n };\n },\n ...(resolveInjectedGitMetadata\n ? { resolveGitMetadata: (_pi: ExtensionAPI, cwd: string) => resolveInjectedGitMetadata(cwd) }\n : {}),\n onInitializationError(error, ctx) {\n const config = loadingConfig;\n loadingConfig = undefined;\n initializationError = `Langfuse tracing could not start: ${formatError(error, config)}`;\n ctx.ui.notify(initializationError, \"warning\");\n },\n beforeSessionDispose: async () => {\n await configWriteQueue;\n },\n onShutdownError(error, ctx) {\n ctx.ui.notify(`Langfuse shutdown export failed: ${formatError(error, shutdownConfig)}`, \"error\");\n },\n flushOnReplacement: true,\n shutdownRuntimeOnQuit: true,\n });\n\n async function showLangfuseMenu(ctx: ExtensionCommandContext) {\n if (!ctx.hasUI) {\n ctx.ui.notify(formatNonInteractiveStatus(activeConfig, configPath, initializationError), \"warning\");\n return;\n }\n const menuGeneration = sessionGeneration;\n const menuSignal = menuController.signal;\n const isCurrent = () => menuGeneration === sessionGeneration && !menuSignal.aborted;\n const { defineMenu, runMenu } = await import(\"@narumitw/pi-tui-kit\");\n if (!isCurrent()) return;\n type Screen = \"main\";\n type Action = \"flush\" | \"configure\" | \"help\";\n const menu = defineMenu<undefined, Screen, Action>({\n start: \"main\",\n screens: {\n main: () => ({\n kind: \"actions\",\n title: \"Langfuse\",\n lines: formatMenuTitle(activeConfig, configPath, initializationError, configurationNotice)\n .split(\"\\n\")\n .slice(1),\n items: [\n ...(tracing.active ? [{ id: \"flush\", label: FLUSH_ACTION, action: \"flush\" as const }] : []),\n {\n id: \"configure\",\n label: hasStoredConfig ? UPDATE_ACTION : SET_UP_ACTION,\n action: \"configure\",\n },\n { id: \"help\", label: HELP_ACTION, action: \"help\" },\n ],\n hint: \"close\",\n }),\n },\n actions: {\n flush: async () => {\n const menuConfig = activeConfig;\n if (!tracing.active) {\n ctx.ui.notify(\"Langfuse tracing is not enabled for this session.\", \"warning\");\n return { kind: \"close\" };\n }\n try {\n await tracing.flush();\n if (menuGeneration !== sessionGeneration) return { kind: \"close\" };\n ctx.ui.notify(\"Langfuse traces flushed for this session.\", \"info\");\n } catch (error) {\n if (menuGeneration !== sessionGeneration) return { kind: \"close\" };\n ctx.ui.notify(`Langfuse flush failed: ${formatError(error, menuConfig)}`, \"error\");\n }\n return { kind: \"close\" };\n },\n configure: async () => {\n const loaded = await loadConfig(configPath);\n if (menuGeneration !== sessionGeneration) return { kind: \"close\" };\n configPath = loaded.path;\n const next = await promptForConfig(\n ctx,\n loaded.ok ? loaded.config : undefined,\n () => menuGeneration === sessionGeneration,\n );\n if (!next || menuGeneration !== sessionGeneration) return { kind: \"close\" };\n try {\n const write = configWriteQueue.then(() => writeConfig(next, loaded.path));\n configWriteQueue = write.then(\n () => undefined,\n () => undefined,\n );\n await write;\n if (menuGeneration !== sessionGeneration) return { kind: \"close\" };\n hasStoredConfig = true;\n configurationNotice = \"Saved; restart each Pi process to use it in subsequent sessions.\";\n ctx.ui.notify(\n `Saved Langfuse config to ${loaded.path} for this Pi agent directory. Restart each Pi process to apply it to subsequent sessions.`,\n \"info\",\n );\n } catch (error) {\n if (menuGeneration !== sessionGeneration) return { kind: \"close\" };\n ctx.ui.notify(`Failed to save Langfuse config: ${formatError(error, next)}`, \"error\");\n }\n return { kind: \"close\" };\n },\n help: async () => {\n ctx.ui.notify(formatHelp(configPath), \"info\");\n return { kind: \"close\" };\n },\n },\n });\n await runMenu(ctx, menu, {\n getState: () => undefined,\n signal: menuSignal,\n isCurrent,\n });\n }\n\n pi.registerCommand(\"langfuse\", {\n description: \"Open interactive Langfuse tracing controls\",\n handler: async (_args, ctx) => showLangfuseMenu(ctx),\n });\n\n tracing.extension(pi);\n };\n}\n\nasync function promptForConfig(\n ctx: ExtensionCommandContext,\n current: LangfuseConfig | undefined,\n isCurrent: () => boolean,\n): Promise<LangfuseConfigPatch | undefined> {\n const secretKey = await ctx.ui.input(\"Langfuse secret key (leave blank to keep existing):\");\n if (!isCurrent()) return undefined;\n if (secretKey === undefined) {\n ctx.ui.notify(\"Cancelled\", \"info\");\n return undefined;\n }\n const publicKey = await ctx.ui.input(\"Langfuse public key (leave blank to keep existing):\");\n if (!isCurrent()) return undefined;\n if (publicKey === undefined) {\n ctx.ui.notify(\"Cancelled\", \"info\");\n return undefined;\n }\n const baseUrl = await ctx.ui.input(\n `Langfuse base URL (leave blank for default ${DEFAULT_BASE_URL}):`,\n DEFAULT_BASE_URL,\n );\n if (!isCurrent()) return undefined;\n if (baseUrl === undefined) {\n ctx.ui.notify(\"Cancelled\", \"info\");\n return undefined;\n }\n\n const patch: LangfuseConfigPatch = {\n ...(publicKey.trim() ? { publicKey: publicKey.trim() } : {}),\n ...(secretKey.trim() ? { secretKey: secretKey.trim() } : {}),\n baseUrl: baseUrl.trim() || DEFAULT_BASE_URL,\n };\n const normalized = normalizeLangfuseConfig({ ...current, ...patch });\n if (!normalized.ok) {\n ctx.ui.notify(`Invalid Langfuse config: ${normalized.reason}`, \"error\");\n return undefined;\n }\n return patch;\n}\n\nfunction formatMenuTitle(\n activeConfig: LangfuseConfig | undefined,\n configPath: string | undefined,\n initializationError: string | undefined,\n configurationNotice: string | undefined,\n): string {\n const lines = [\"Langfuse\", \"\", \"Current session:\", ` Tracing: ${activeConfig ? \"enabled\" : \"disabled\"}`];\n if (activeConfig) {\n lines.push(\n ` Endpoint: ${activeConfig.baseUrl}`,\n ` Content capture: ${activeConfig.captureContent ? \"enabled\" : \"disabled\"}`,\n );\n } else if (configurationNotice) {\n lines.push(\" State: tracing remains disabled until Pi restarts.\");\n } else if (initializationError) {\n lines.push(` Reason: ${initializationError}`);\n }\n lines.push(\n \"\",\n \"Agent-directory configuration:\",\n ` Configuration: ${configPath ?? \"unknown\"}`,\n \" Scope: this Pi agent directory; restart each Pi process to apply changes.\",\n );\n if (configurationNotice) lines.push(` Pending: ${configurationNotice}`);\n lines.push(\"\", \"What do you want to do?\");\n return lines.join(\"\\n\");\n}\n\nfunction formatNonInteractiveStatus(\n activeConfig: LangfuseConfig | undefined,\n configPath: string | undefined,\n initializationError: string | undefined,\n): string {\n return [\n \"/langfuse requires interactive UI.\",\n `Current session tracing: ${activeConfig ? \"enabled\" : \"disabled\"}`,\n ...(activeConfig\n ? [\n `Endpoint: ${activeConfig.baseUrl}`,\n `Content capture: ${activeConfig.captureContent ? \"enabled\" : \"disabled\"}`,\n ]\n : initializationError\n ? [`Reason: ${initializationError}`]\n : []),\n `Configuration: ${configPath ?? \"unknown\"}`,\n \"Edit the private config manually, then restart each Pi process to apply it to subsequent sessions.\",\n ].join(\"\\n\");\n}\n\nfunction formatHelp(configPath: string | undefined): string {\n return [\n \"Langfuse setup and privacy:\",\n \"Run /langfuse in interactive Pi to manage tracing for the current session.\",\n `Configuration: ${configPath ?? \"pi-langfuse.json\"}`,\n \"The file belongs to this Pi agent directory; restart each Pi process after changing it.\",\n \"Trace content may contain prompts, responses, tool arguments, tool results, and source code.\",\n \"Git branch, commit, cwd, model, and usage remain in metadata when content capture is disabled.\",\n 'Use \"captureContent\": false in the private config to export metadata only.',\n ].join(\"\\n\");\n}\n\nfunction formatConfigError(result: Extract<LangfuseConfigResult, { ok: false }>): string {\n const setupHint = result.reason.startsWith(\"Configuration file not found:\")\n ? \" Run /langfuse and choose Set up Langfuse.\"\n : \"\";\n return `Langfuse tracing is disabled: ${result.reason}${setupHint}`;\n}\n\nfunction formatError(error: unknown, config?: LangfuseConfigPatch): string {\n let message = error instanceof Error ? error.message : String(error);\n const secrets = [config?.publicKey, config?.secretKey]\n .filter((secret): secret is string => Boolean(secret))\n .sort((left, right) => right.length - left.length);\n for (const secret of secrets) {\n message = message.split(secret).join(\"[LANGFUSE_KEY_REDACTED]\");\n }\n return message;\n}\n\nexport default createLangfuseExtension();\n", "import type { CreateLangfuseRuntimeOptions, LangfuseRuntime } from \"./runtime-core.js\";\n\nexport {\n createPiLangfuseSession,\n type PiLangfuseSession,\n type PiLangfuseSessionOptions,\n} from \"./pi-session.js\";\nexport type {\n CreateLangfuseRuntimeOptions,\n LangfuseRuntime,\n LangfuseRuntimeConfig,\n} from \"./runtime-core.js\";\n\nexport async function createLangfuseRuntime(options: CreateLangfuseRuntimeOptions = {}): Promise<LangfuseRuntime> {\n const runtime = await import(\"./runtime.js\");\n return runtime.createLangfuseRuntime(options);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["truncateString", "byteLength"]
|
|
7
7
|
}
|
package/dist/index.ts
CHANGED
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
loadLangfuseConfig,
|
|
8
8
|
normalizeLangfuseConfig,
|
|
9
9
|
writeLangfuseConfig
|
|
10
|
-
} from "./chunks/chunk-
|
|
10
|
+
} from "./chunks/chunk-DBQAWNKG.ts";
|
|
11
11
|
|
|
12
12
|
// src/git.ts
|
|
13
13
|
var GIT_LOOKUP_TIMEOUT_MS = 1e3;
|
|
@@ -1317,7 +1317,7 @@ function createLangfuseExtension(dependencies = {}) {
|
|
|
1317
1317
|
loadingConfig = result.config;
|
|
1318
1318
|
const createBackend = dependencies.createBackend;
|
|
1319
1319
|
const ownsRuntime = createBackend !== void 0;
|
|
1320
|
-
const runtime = createBackend ? createLangfuseRuntimeFromBackend(await createBackend(result.config)) : await (await import("./chunks/runtime-
|
|
1320
|
+
const runtime = createBackend ? createLangfuseRuntimeFromBackend(await createBackend(result.config)) : await (await import("./chunks/runtime-6ZHLVC3A.ts")).createLangfuseRuntime({ config: result.config, env: false });
|
|
1321
1321
|
if (isCurrent() || !runtimeConfigForShutdown) runtimeConfigForShutdown = result.config;
|
|
1322
1322
|
if (isCurrent()) {
|
|
1323
1323
|
activeConfig = result.config;
|
|
@@ -1540,7 +1540,7 @@ var langfuse_default = createLangfuseExtension();
|
|
|
1540
1540
|
|
|
1541
1541
|
// src/public-api.ts
|
|
1542
1542
|
async function createLangfuseRuntime(options = {}) {
|
|
1543
|
-
const runtime = await import("./chunks/runtime-
|
|
1543
|
+
const runtime = await import("./chunks/runtime-6ZHLVC3A.ts");
|
|
1544
1544
|
return runtime.createLangfuseRuntime(options);
|
|
1545
1545
|
}
|
|
1546
1546
|
export {
|
|
@@ -0,0 +1,316 @@
|
|
|
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
|
+
|
|
4
|
+
// src/config.ts
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
6
|
+
import { chmod, mkdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
7
|
+
import { dirname, join } from "node:path";
|
|
8
|
+
import { getAgentDir } from "@earendil-works/pi-coding-agent";
|
|
9
|
+
var CONFIG_FILE_NAME = "pi-langfuse.json";
|
|
10
|
+
var DEFAULT_BASE_URL = "https://us.cloud.langfuse.com";
|
|
11
|
+
function langfuseConfigPath() {
|
|
12
|
+
return join(getAgentDir(), CONFIG_FILE_NAME);
|
|
13
|
+
}
|
|
14
|
+
var configSaveQueues = /* @__PURE__ */ new Map();
|
|
15
|
+
function writeLangfuseConfig(patch, path = langfuseConfigPath()) {
|
|
16
|
+
const previous = configSaveQueues.get(path) ?? Promise.resolve();
|
|
17
|
+
const operation = previous.then(() => writeLangfuseConfigNow(patch, path));
|
|
18
|
+
const tail = operation.then(
|
|
19
|
+
() => void 0,
|
|
20
|
+
() => void 0
|
|
21
|
+
);
|
|
22
|
+
configSaveQueues.set(path, tail);
|
|
23
|
+
void tail.then(() => {
|
|
24
|
+
if (configSaveQueues.get(path) === tail) configSaveQueues.delete(path);
|
|
25
|
+
});
|
|
26
|
+
return operation;
|
|
27
|
+
}
|
|
28
|
+
async function writeLangfuseConfigNow(patch, path) {
|
|
29
|
+
const currentDocument = await readLangfuseDocumentForUpdate(path);
|
|
30
|
+
const normalized = normalizeLangfuseConfig({ ...currentDocument, ...patch });
|
|
31
|
+
if (!normalized.ok) throw new Error(normalized.reason);
|
|
32
|
+
const {
|
|
33
|
+
publicKey: _publicKey,
|
|
34
|
+
secretKey: _secretKey,
|
|
35
|
+
baseUrl: _baseUrl,
|
|
36
|
+
environment: _environment,
|
|
37
|
+
release: _release,
|
|
38
|
+
userId: _userId,
|
|
39
|
+
captureContent: _captureContent,
|
|
40
|
+
...unknownFields
|
|
41
|
+
} = currentDocument;
|
|
42
|
+
const nextDocument = { ...unknownFields, ...normalized.config };
|
|
43
|
+
await mkdir(dirname(path), { recursive: true, mode: 448 });
|
|
44
|
+
const tempPath = `${path}.${process.pid}.${randomUUID()}.tmp`;
|
|
45
|
+
try {
|
|
46
|
+
await writeFile(tempPath, `${JSON.stringify(nextDocument, null, 2)}
|
|
47
|
+
`, {
|
|
48
|
+
encoding: "utf8",
|
|
49
|
+
mode: 384
|
|
50
|
+
});
|
|
51
|
+
await chmod(tempPath, 384);
|
|
52
|
+
await rename(tempPath, path);
|
|
53
|
+
return normalized.config;
|
|
54
|
+
} catch (error) {
|
|
55
|
+
await rm(tempPath, { force: true }).catch(() => void 0);
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function readLangfuseDocumentForUpdate(path) {
|
|
60
|
+
let parsed;
|
|
61
|
+
try {
|
|
62
|
+
parsed = JSON.parse(await readFile(path, "utf8"));
|
|
63
|
+
} catch (error) {
|
|
64
|
+
if (isNodeError(error) && error.code === "ENOENT") return {};
|
|
65
|
+
throw new Error(
|
|
66
|
+
`Cannot update ${CONFIG_FILE_NAME} because the existing file is malformed or unreadable; repair it first.`
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
const normalized = normalizeLangfuseConfig(parsed);
|
|
70
|
+
if (!normalized.ok) {
|
|
71
|
+
throw new Error(
|
|
72
|
+
`Cannot update ${CONFIG_FILE_NAME} because the existing file has invalid recognized fields; repair it first.`
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
return { ...parsed };
|
|
76
|
+
}
|
|
77
|
+
async function loadLangfuseConfig(path = langfuseConfigPath()) {
|
|
78
|
+
await configSaveQueues.get(path);
|
|
79
|
+
const warnings = [];
|
|
80
|
+
const permissionFailure = await ensurePrivatePermissions(path, warnings);
|
|
81
|
+
if (permissionFailure) {
|
|
82
|
+
return {
|
|
83
|
+
ok: false,
|
|
84
|
+
path,
|
|
85
|
+
warnings,
|
|
86
|
+
reason: `Refusing to load credentials: ${permissionFailure}`
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
let text;
|
|
90
|
+
try {
|
|
91
|
+
text = await readFile(path, "utf8");
|
|
92
|
+
} catch (error) {
|
|
93
|
+
if (isNodeError(error) && error.code === "ENOENT") {
|
|
94
|
+
return { ok: false, path, warnings, reason: `Configuration file not found: ${path}` };
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
ok: false,
|
|
98
|
+
path,
|
|
99
|
+
warnings,
|
|
100
|
+
reason: `Failed to read ${path}: ${formatError(error)}`
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
let parsed;
|
|
104
|
+
try {
|
|
105
|
+
parsed = JSON.parse(text);
|
|
106
|
+
} catch {
|
|
107
|
+
return {
|
|
108
|
+
ok: false,
|
|
109
|
+
path,
|
|
110
|
+
warnings,
|
|
111
|
+
reason: `Failed to parse ${path} as JSON; repair the file before retrying.`
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const normalized = normalizeLangfuseConfig(parsed);
|
|
115
|
+
if (!normalized.ok) return { ok: false, path, warnings, reason: normalized.reason };
|
|
116
|
+
return { ok: true, config: normalized.config, path, warnings };
|
|
117
|
+
}
|
|
118
|
+
function normalizeLangfuseConfig(value) {
|
|
119
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
120
|
+
return { ok: false, reason: "pi-langfuse.json must contain a JSON object." };
|
|
121
|
+
}
|
|
122
|
+
const input = value;
|
|
123
|
+
const publicKey = normalizeString(input.publicKey);
|
|
124
|
+
const secretKey = normalizeString(input.secretKey);
|
|
125
|
+
if (!publicKey) {
|
|
126
|
+
return { ok: false, reason: "pi-langfuse.json requires a literal publicKey string." };
|
|
127
|
+
}
|
|
128
|
+
if (!secretKey) {
|
|
129
|
+
return { ok: false, reason: "pi-langfuse.json requires a literal secretKey string." };
|
|
130
|
+
}
|
|
131
|
+
if (isInterpolation(publicKey)) {
|
|
132
|
+
return {
|
|
133
|
+
ok: false,
|
|
134
|
+
reason: "pi-langfuse.json publicKey must be literal; environment and command interpolation are not supported."
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
if (isInterpolation(secretKey)) {
|
|
138
|
+
return {
|
|
139
|
+
ok: false,
|
|
140
|
+
reason: "pi-langfuse.json secretKey must be literal; environment and command interpolation are not supported."
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
const rawBaseUrl = input.baseUrl === void 0 ? DEFAULT_BASE_URL : normalizeString(input.baseUrl);
|
|
144
|
+
if (!rawBaseUrl) {
|
|
145
|
+
return { ok: false, reason: "pi-langfuse.json baseUrl must be a non-empty string." };
|
|
146
|
+
}
|
|
147
|
+
const baseUrl = normalizeBaseUrl(rawBaseUrl);
|
|
148
|
+
if (!baseUrl) {
|
|
149
|
+
return {
|
|
150
|
+
ok: false,
|
|
151
|
+
reason: "pi-langfuse.json baseUrl must use HTTP or HTTPS without credentials, a query, or a fragment."
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
if (input.captureContent !== void 0 && typeof input.captureContent !== "boolean") {
|
|
155
|
+
return { ok: false, reason: "pi-langfuse.json captureContent must be a boolean." };
|
|
156
|
+
}
|
|
157
|
+
const environment = optionalString(input.environment, "environment");
|
|
158
|
+
if (!environment.ok) return environment;
|
|
159
|
+
if (environment.value && (environment.value.length > 40 || !/^(?!langfuse)[a-z0-9_-]+$/u.test(environment.value))) {
|
|
160
|
+
return {
|
|
161
|
+
ok: false,
|
|
162
|
+
reason: "pi-langfuse.json environment must be at most 40 lowercase letters, numbers, hyphens, or underscores and must not start with langfuse."
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const release = optionalString(input.release, "release");
|
|
166
|
+
if (!release.ok) return release;
|
|
167
|
+
const userId = optionalString(input.userId, "userId");
|
|
168
|
+
if (!userId.ok) return userId;
|
|
169
|
+
if (userId.value && userId.value.length > 200) {
|
|
170
|
+
return { ok: false, reason: "pi-langfuse.json userId must be at most 200 characters." };
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
ok: true,
|
|
174
|
+
config: {
|
|
175
|
+
publicKey,
|
|
176
|
+
secretKey,
|
|
177
|
+
baseUrl,
|
|
178
|
+
...environment.value ? { environment: environment.value } : {},
|
|
179
|
+
...release.value ? { release: release.value } : {},
|
|
180
|
+
...userId.value ? { userId: userId.value } : {},
|
|
181
|
+
captureContent: input.captureContent ?? true
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
async function ensurePrivatePermissions(path, warnings) {
|
|
186
|
+
try {
|
|
187
|
+
const file = await stat(path);
|
|
188
|
+
if ((file.mode & 511) !== 384) {
|
|
189
|
+
await chmod(path, 384);
|
|
190
|
+
const repaired = await stat(path);
|
|
191
|
+
if ((repaired.mode & 511) !== 384) {
|
|
192
|
+
throw new Error(`permissions remained ${(repaired.mode & 511).toString(8)}`);
|
|
193
|
+
}
|
|
194
|
+
warnings.push(`Restricted ${path} permissions to 0600.`);
|
|
195
|
+
}
|
|
196
|
+
} catch (error) {
|
|
197
|
+
if (isNodeError(error) && error.code === "ENOENT") return void 0;
|
|
198
|
+
const failure = `Failed to enforce 0600 permissions for ${path}: ${formatError(error)}`;
|
|
199
|
+
warnings.push(failure);
|
|
200
|
+
return failure;
|
|
201
|
+
}
|
|
202
|
+
return void 0;
|
|
203
|
+
}
|
|
204
|
+
function normalizeBaseUrl(value) {
|
|
205
|
+
try {
|
|
206
|
+
const url = new URL(value);
|
|
207
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") return void 0;
|
|
208
|
+
if (url.username || url.password || url.search || url.hash) return void 0;
|
|
209
|
+
return url.toString().replace(/\/+$/, "");
|
|
210
|
+
} catch {
|
|
211
|
+
return void 0;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
function optionalString(value, name) {
|
|
215
|
+
if (value === void 0) return { ok: true };
|
|
216
|
+
const normalized = normalizeString(value);
|
|
217
|
+
return normalized ? { ok: true, value: normalized } : { ok: false, reason: `pi-langfuse.json ${name} must be a non-empty string.` };
|
|
218
|
+
}
|
|
219
|
+
function normalizeString(value) {
|
|
220
|
+
return typeof value === "string" && value.trim() ? value.trim() : void 0;
|
|
221
|
+
}
|
|
222
|
+
function isInterpolation(value) {
|
|
223
|
+
return value.startsWith("$") || value.startsWith("!");
|
|
224
|
+
}
|
|
225
|
+
function isNodeError(error) {
|
|
226
|
+
return error instanceof Error && "code" in error;
|
|
227
|
+
}
|
|
228
|
+
function formatError(error) {
|
|
229
|
+
return error instanceof Error ? error.message : String(error);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// src/runtime-core.ts
|
|
233
|
+
var RUNTIME_INTERNAL_KEY = /* @__PURE__ */ Symbol.for("@narumitw/pi-langfuse/runtime-internal/v2");
|
|
234
|
+
var ManagedLangfuseRuntime = class {
|
|
235
|
+
constructor(backend) {
|
|
236
|
+
this.backend = backend;
|
|
237
|
+
}
|
|
238
|
+
backend;
|
|
239
|
+
state = "open";
|
|
240
|
+
sessionDisposers = /* @__PURE__ */ new Set();
|
|
241
|
+
flushQueue = Promise.resolve();
|
|
242
|
+
shutdownPromise;
|
|
243
|
+
get closed() {
|
|
244
|
+
return this.state !== "open";
|
|
245
|
+
}
|
|
246
|
+
registerSession(disposer) {
|
|
247
|
+
if (this.state !== "open") throw new Error("Langfuse runtime is shutting down or already closed.");
|
|
248
|
+
this.sessionDisposers.add(disposer);
|
|
249
|
+
return () => this.sessionDisposers.delete(disposer);
|
|
250
|
+
}
|
|
251
|
+
flush() {
|
|
252
|
+
if (this.state !== "open") {
|
|
253
|
+
return Promise.reject(new Error("Langfuse runtime is shutting down or already closed."));
|
|
254
|
+
}
|
|
255
|
+
const operation = this.flushQueue.then(() => this.backend.forceFlush());
|
|
256
|
+
this.flushQueue = operation.then(
|
|
257
|
+
() => void 0,
|
|
258
|
+
() => void 0
|
|
259
|
+
);
|
|
260
|
+
return operation;
|
|
261
|
+
}
|
|
262
|
+
shutdown() {
|
|
263
|
+
if (this.shutdownPromise) return this.shutdownPromise;
|
|
264
|
+
this.state = "closing";
|
|
265
|
+
this.shutdownPromise = this.shutdownNow();
|
|
266
|
+
return this.shutdownPromise;
|
|
267
|
+
}
|
|
268
|
+
async shutdownNow() {
|
|
269
|
+
const errors = [];
|
|
270
|
+
for (const dispose of [...this.sessionDisposers]) {
|
|
271
|
+
try {
|
|
272
|
+
await dispose("Langfuse runtime shut down before the Pi session was disposed.");
|
|
273
|
+
} catch (error) {
|
|
274
|
+
errors.push(error);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
this.sessionDisposers.clear();
|
|
278
|
+
await this.flushQueue;
|
|
279
|
+
try {
|
|
280
|
+
await this.backend.forceFlush();
|
|
281
|
+
} catch (error) {
|
|
282
|
+
errors.push(error);
|
|
283
|
+
}
|
|
284
|
+
try {
|
|
285
|
+
await this.backend.shutdown();
|
|
286
|
+
} catch (error) {
|
|
287
|
+
errors.push(error);
|
|
288
|
+
} finally {
|
|
289
|
+
this.state = "closed";
|
|
290
|
+
}
|
|
291
|
+
if (errors.length === 1) throw errors[0];
|
|
292
|
+
if (errors.length > 1) throw new AggregateError(errors, "Langfuse runtime shutdown failed.");
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
function getLangfuseRuntimeInternal(runtime) {
|
|
296
|
+
const internal = runtime[RUNTIME_INTERNAL_KEY];
|
|
297
|
+
if (!internal) throw new Error("Langfuse runtime was not created by @narumitw/pi-langfuse.");
|
|
298
|
+
return internal;
|
|
299
|
+
}
|
|
300
|
+
function createLangfuseRuntimeFromBackend(backend) {
|
|
301
|
+
return registerLangfuseRuntime(new ManagedLangfuseRuntime(backend));
|
|
302
|
+
}
|
|
303
|
+
function registerLangfuseRuntime(runtime) {
|
|
304
|
+
Object.defineProperty(runtime, RUNTIME_INTERNAL_KEY, { value: runtime });
|
|
305
|
+
return runtime;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
export {
|
|
309
|
+
DEFAULT_BASE_URL,
|
|
310
|
+
writeLangfuseConfig,
|
|
311
|
+
loadLangfuseConfig,
|
|
312
|
+
normalizeLangfuseConfig,
|
|
313
|
+
getLangfuseRuntimeInternal,
|
|
314
|
+
createLangfuseRuntimeFromBackend
|
|
315
|
+
};
|
|
316
|
+
//# sourceMappingURL=chunk-SAJ76IYU.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/config.ts", "../../src/runtime-core.ts"],
|
|
4
|
+
"sourcesContent": ["import { randomUUID } from \"node:crypto\";\nimport { chmod, mkdir, readFile, rename, rm, stat, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\n\nconst CONFIG_FILE_NAME = \"pi-langfuse.json\";\nexport const DEFAULT_BASE_URL = \"https://us.cloud.langfuse.com\";\n\nexport interface LangfuseConfig {\n publicKey: string;\n secretKey: string;\n baseUrl: string;\n environment?: string;\n release?: string;\n userId?: string;\n captureContent: boolean;\n}\n\nexport type LangfuseConfigPatch = Partial<LangfuseConfig>;\n\nexport type LangfuseConfigResult =\n | { ok: true; config: LangfuseConfig; path: string; warnings: string[] }\n | { ok: false; path: string; warnings: string[]; reason: string };\n\nexport function langfuseConfigPath(): string {\n return join(getAgentDir(), CONFIG_FILE_NAME);\n}\n\nconst configSaveQueues = new Map<string, Promise<void>>();\n\nexport async function waitForLangfuseConfigWrites(path = langfuseConfigPath()): Promise<void> {\n await configSaveQueues.get(path);\n}\n\nexport function writeLangfuseConfig(patch: LangfuseConfigPatch, path = langfuseConfigPath()): Promise<LangfuseConfig> {\n const previous = configSaveQueues.get(path) ?? Promise.resolve();\n const operation = previous.then(() => writeLangfuseConfigNow(patch, path));\n const tail = operation.then(\n () => undefined,\n () => undefined,\n );\n configSaveQueues.set(path, tail);\n void tail.then(() => {\n if (configSaveQueues.get(path) === tail) configSaveQueues.delete(path);\n });\n return operation;\n}\n\nasync function writeLangfuseConfigNow(patch: LangfuseConfigPatch, path: string): Promise<LangfuseConfig> {\n const currentDocument = await readLangfuseDocumentForUpdate(path);\n const normalized = normalizeLangfuseConfig({ ...currentDocument, ...patch });\n if (!normalized.ok) throw new Error(normalized.reason);\n const {\n publicKey: _publicKey,\n secretKey: _secretKey,\n baseUrl: _baseUrl,\n environment: _environment,\n release: _release,\n userId: _userId,\n captureContent: _captureContent,\n ...unknownFields\n } = currentDocument;\n const nextDocument = { ...unknownFields, ...normalized.config };\n\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n const tempPath = `${path}.${process.pid}.${randomUUID()}.tmp`;\n try {\n await writeFile(tempPath, `${JSON.stringify(nextDocument, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n await chmod(tempPath, 0o600);\n await rename(tempPath, path);\n return normalized.config;\n } catch (error) {\n await rm(tempPath, { force: true }).catch(() => undefined);\n throw error;\n }\n}\n\nasync function readLangfuseDocumentForUpdate(path: string): Promise<Record<string, unknown>> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(await readFile(path, \"utf8\")) as unknown;\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") return {};\n throw new Error(\n `Cannot update ${CONFIG_FILE_NAME} because the existing file is malformed or unreadable; repair it first.`,\n );\n }\n const normalized = normalizeLangfuseConfig(parsed);\n if (!normalized.ok) {\n throw new Error(\n `Cannot update ${CONFIG_FILE_NAME} because the existing file has invalid recognized fields; repair it first.`,\n );\n }\n return { ...(parsed as Record<string, unknown>) };\n}\n\nexport async function loadLangfuseConfig(path = langfuseConfigPath()): Promise<LangfuseConfigResult> {\n await configSaveQueues.get(path);\n const warnings: string[] = [];\n const permissionFailure = await ensurePrivatePermissions(path, warnings);\n if (permissionFailure) {\n return {\n ok: false,\n path,\n warnings,\n reason: `Refusing to load credentials: ${permissionFailure}`,\n };\n }\n\n let text: string;\n try {\n text = await readFile(path, \"utf8\");\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") {\n return { ok: false, path, warnings, reason: `Configuration file not found: ${path}` };\n }\n return {\n ok: false,\n path,\n warnings,\n reason: `Failed to read ${path}: ${formatError(error)}`,\n };\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n return {\n ok: false,\n path,\n warnings,\n reason: `Failed to parse ${path} as JSON; repair the file before retrying.`,\n };\n }\n\n const normalized = normalizeLangfuseConfig(parsed);\n if (!normalized.ok) return { ok: false, path, warnings, reason: normalized.reason };\n return { ok: true, config: normalized.config, path, warnings };\n}\n\nexport function normalizeLangfuseConfig(\n value: unknown,\n): { ok: true; config: LangfuseConfig } | { ok: false; reason: string } {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return { ok: false, reason: \"pi-langfuse.json must contain a JSON object.\" };\n }\n const input = value as Record<string, unknown>;\n const publicKey = normalizeString(input.publicKey);\n const secretKey = normalizeString(input.secretKey);\n if (!publicKey) {\n return { ok: false, reason: \"pi-langfuse.json requires a literal publicKey string.\" };\n }\n if (!secretKey) {\n return { ok: false, reason: \"pi-langfuse.json requires a literal secretKey string.\" };\n }\n if (isInterpolation(publicKey)) {\n return {\n ok: false,\n reason: \"pi-langfuse.json publicKey must be literal; environment and command interpolation are not supported.\",\n };\n }\n if (isInterpolation(secretKey)) {\n return {\n ok: false,\n reason: \"pi-langfuse.json secretKey must be literal; environment and command interpolation are not supported.\",\n };\n }\n\n const rawBaseUrl = input.baseUrl === undefined ? DEFAULT_BASE_URL : normalizeString(input.baseUrl);\n if (!rawBaseUrl) {\n return { ok: false, reason: \"pi-langfuse.json baseUrl must be a non-empty string.\" };\n }\n const baseUrl = normalizeBaseUrl(rawBaseUrl);\n if (!baseUrl) {\n return {\n ok: false,\n reason: \"pi-langfuse.json baseUrl must use HTTP or HTTPS without credentials, a query, or a fragment.\",\n };\n }\n\n if (input.captureContent !== undefined && typeof input.captureContent !== \"boolean\") {\n return { ok: false, reason: \"pi-langfuse.json captureContent must be a boolean.\" };\n }\n const environment = optionalString(input.environment, \"environment\");\n if (!environment.ok) return environment;\n if (environment.value && (environment.value.length > 40 || !/^(?!langfuse)[a-z0-9_-]+$/u.test(environment.value))) {\n return {\n ok: false,\n reason:\n \"pi-langfuse.json environment must be at most 40 lowercase letters, numbers, hyphens, or underscores and must not start with langfuse.\",\n };\n }\n const release = optionalString(input.release, \"release\");\n if (!release.ok) return release;\n const userId = optionalString(input.userId, \"userId\");\n if (!userId.ok) return userId;\n if (userId.value && userId.value.length > 200) {\n return { ok: false, reason: \"pi-langfuse.json userId must be at most 200 characters.\" };\n }\n\n return {\n ok: true,\n config: {\n publicKey,\n secretKey,\n baseUrl,\n ...(environment.value ? { environment: environment.value } : {}),\n ...(release.value ? { release: release.value } : {}),\n ...(userId.value ? { userId: userId.value } : {}),\n captureContent: input.captureContent ?? true,\n },\n };\n}\n\nasync function ensurePrivatePermissions(path: string, warnings: string[]): Promise<string | undefined> {\n try {\n const file = await stat(path);\n if ((file.mode & 0o777) !== 0o600) {\n await chmod(path, 0o600);\n const repaired = await stat(path);\n if ((repaired.mode & 0o777) !== 0o600) {\n throw new Error(`permissions remained ${(repaired.mode & 0o777).toString(8)}`);\n }\n warnings.push(`Restricted ${path} permissions to 0600.`);\n }\n } catch (error) {\n if (isNodeError(error) && error.code === \"ENOENT\") return undefined;\n const failure = `Failed to enforce 0600 permissions for ${path}: ${formatError(error)}`;\n warnings.push(failure);\n return failure;\n }\n return undefined;\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 optionalString(value: unknown, name: string): { ok: true; value?: string } | { ok: false; reason: string } {\n if (value === undefined) return { ok: true };\n const normalized = normalizeString(value);\n return normalized\n ? { ok: true, value: normalized }\n : { ok: false, reason: `pi-langfuse.json ${name} must be a non-empty string.` };\n}\n\nfunction normalizeString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction isInterpolation(value: string): boolean {\n return value.startsWith(\"$\") || value.startsWith(\"!\");\n}\n\nfunction isNodeError(error: unknown): error is NodeJS.ErrnoException {\n return error instanceof Error && \"code\" in error;\n}\n\nfunction formatError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import type { TraceBackend } from \"./tracing.js\";\n\nexport interface LangfuseRuntimeConfig {\n publicKey?: string;\n secretKey?: string;\n baseUrl?: string;\n environment?: string;\n release?: string;\n}\n\nexport interface CreateLangfuseRuntimeOptions {\n config?: LangfuseRuntimeConfig;\n env?: NodeJS.ProcessEnv | false;\n}\n\nexport interface LangfuseRuntime {\n readonly closed: boolean;\n flush(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\ntype RuntimeSessionDisposer = (statusMessage: string) => void | Promise<void>;\n\nexport interface LangfuseRuntimeInternal extends LangfuseRuntime {\n readonly backend: TraceBackend;\n registerSession(disposer: RuntimeSessionDisposer): () => void;\n}\n\nconst RUNTIME_INTERNAL_KEY = Symbol.for(\"@narumitw/pi-langfuse/runtime-internal/v2\");\n\nclass ManagedLangfuseRuntime implements LangfuseRuntimeInternal {\n private state: \"open\" | \"closing\" | \"closed\" = \"open\";\n private readonly sessionDisposers = new Set<RuntimeSessionDisposer>();\n private flushQueue = Promise.resolve();\n private shutdownPromise: Promise<void> | undefined;\n\n constructor(readonly backend: TraceBackend) {}\n\n get closed(): boolean {\n return this.state !== \"open\";\n }\n\n registerSession(disposer: RuntimeSessionDisposer): () => void {\n if (this.state !== \"open\") throw new Error(\"Langfuse runtime is shutting down or already closed.\");\n this.sessionDisposers.add(disposer);\n return () => this.sessionDisposers.delete(disposer);\n }\n\n flush(): Promise<void> {\n if (this.state !== \"open\") {\n return Promise.reject(new Error(\"Langfuse runtime is shutting down or already closed.\"));\n }\n const operation = this.flushQueue.then(() => this.backend.forceFlush());\n this.flushQueue = operation.then(\n () => undefined,\n () => undefined,\n );\n return operation;\n }\n\n shutdown(): Promise<void> {\n if (this.shutdownPromise) return this.shutdownPromise;\n this.state = \"closing\";\n this.shutdownPromise = this.shutdownNow();\n return this.shutdownPromise;\n }\n\n private async shutdownNow(): Promise<void> {\n const errors: unknown[] = [];\n for (const dispose of [...this.sessionDisposers]) {\n try {\n await dispose(\"Langfuse runtime shut down before the Pi session was disposed.\");\n } catch (error) {\n errors.push(error);\n }\n }\n this.sessionDisposers.clear();\n\n await this.flushQueue;\n try {\n await this.backend.forceFlush();\n } catch (error) {\n errors.push(error);\n }\n try {\n await this.backend.shutdown();\n } catch (error) {\n errors.push(error);\n } finally {\n this.state = \"closed\";\n }\n\n if (errors.length === 1) throw errors[0];\n if (errors.length > 1) throw new AggregateError(errors, \"Langfuse runtime shutdown failed.\");\n }\n}\n\nexport function getLangfuseRuntimeInternal(runtime: LangfuseRuntime): LangfuseRuntimeInternal {\n const internal = (runtime as LangfuseRuntime & { [key: symbol]: LangfuseRuntimeInternal | undefined })[\n RUNTIME_INTERNAL_KEY\n ];\n if (!internal) throw new Error(\"Langfuse runtime was not created by @narumitw/pi-langfuse.\");\n return internal;\n}\n\nexport function createLangfuseRuntimeFromBackend(backend: TraceBackend): LangfuseRuntime {\n return registerLangfuseRuntime(new ManagedLangfuseRuntime(backend));\n}\n\nexport function registerLangfuseRuntime(runtime: LangfuseRuntimeInternal): LangfuseRuntimeInternal {\n Object.defineProperty(runtime, RUNTIME_INTERNAL_KEY, { value: runtime });\n return runtime;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -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-SAJ76IYU.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-A6SQ6VEH.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
|
+
}
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|