@narumitw/pi-langfuse 0.50.6 → 0.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +82 -4
- package/dist/chunks/chunk-IASLJKKB.js +316 -0
- package/dist/chunks/chunk-IASLJKKB.js.map +7 -0
- package/dist/chunks/runtime-6MIKLWNJ.js +352 -0
- package/dist/chunks/runtime-6MIKLWNJ.js.map +7 -0
- package/dist/config.d.ts +33 -0
- package/dist/git.d.ts +5 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1551 -0
- package/dist/index.js.map +7 -0
- package/dist/index.ts +588 -479
- package/dist/index.ts.map +4 -4
- package/dist/langfuse.d.ts +13 -0
- package/dist/pi-session.d.ts +43 -0
- package/dist/public-api.d.ts +4 -0
- package/dist/runtime-core.d.ts +26 -0
- package/dist/runtime.d.ts +22 -0
- package/dist/sanitizer.d.ts +2 -0
- package/dist/tracing.d.ts +202 -0
- package/package.json +11 -3
- package/src/git.ts +60 -0
- package/src/index.ts +9 -0
- package/src/langfuse.ts +88 -292
- package/src/pi-session.ts +570 -0
- package/src/public-api.ts +17 -0
- package/src/runtime-core.ts +113 -0
- package/src/runtime.ts +234 -51
- package/src/sanitizer.ts +10 -7
- package/src/tracing.ts +52 -14
- package/dist/chunks/runtime-X75FRK2E.js +0 -215
- package/dist/chunks/runtime-X75FRK2E.js.map +0 -7
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/git.ts", "../src/sanitizer.ts", "../src/tracing.ts", "../src/pi-session.ts", "../src/langfuse.ts", "../src/public-api.ts"],
|
|
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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",
|
|
6
|
+
"names": ["truncateString", "byteLength"]
|
|
7
|
+
}
|