@browserbasehq/orca 3.2.0-preview.2 โ 3.2.0-preview.4
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/cjs/lib/v3/agent/AnthropicCUAClient.js +5 -5
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.js +5 -5
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js +5 -5
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/act.js +1 -10
- package/dist/cjs/lib/v3/agent/tools/act.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/ariaTree.js +1 -12
- package/dist/cjs/lib/v3/agent/tools/ariaTree.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/braveSearch.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/click.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/clickAndHold.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/extract.js +1 -10
- package/dist/cjs/lib/v3/agent/tools/extract.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/fillFormVision.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/fillform.js +1 -10
- package/dist/cjs/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/index.d.ts +2 -2
- package/dist/cjs/lib/v3/agent/tools/index.js +53 -5
- package/dist/cjs/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/keys.d.ts +1 -1
- package/dist/cjs/lib/v3/agent/tools/keys.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/type.js.map +1 -1
- package/dist/cjs/lib/v3/api.js +9 -2
- package/dist/cjs/lib/v3/api.js.map +1 -1
- package/dist/cjs/lib/v3/flowlogger/EventEmitter.d.ts +7 -0
- package/dist/cjs/lib/v3/flowlogger/EventEmitter.js +30 -0
- package/dist/cjs/lib/v3/flowlogger/EventEmitter.js.map +1 -0
- package/dist/cjs/lib/v3/flowlogger/EventSink.d.ts +44 -0
- package/dist/cjs/lib/v3/flowlogger/EventSink.js +217 -0
- package/dist/cjs/lib/v3/flowlogger/EventSink.js.map +1 -0
- package/dist/cjs/lib/v3/flowlogger/EventStore.d.ts +26 -0
- package/dist/cjs/lib/v3/flowlogger/EventStore.js +135 -0
- package/dist/cjs/lib/v3/flowlogger/EventStore.js.map +1 -0
- package/dist/{esm/lib/v3/flowLogger.d.ts โ cjs/lib/v3/flowlogger/FlowLogger.d.ts} +32 -31
- package/dist/cjs/lib/v3/flowlogger/FlowLogger.js +591 -0
- package/dist/cjs/lib/v3/flowlogger/FlowLogger.js.map +1 -0
- package/dist/cjs/lib/v3/flowlogger/prettify.d.ts +6 -0
- package/dist/cjs/lib/v3/flowlogger/prettify.js +395 -0
- package/dist/cjs/lib/v3/flowlogger/prettify.js.map +1 -0
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js +26 -28
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +2 -2
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +3 -5
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/llm/aisdk.js +9 -9
- package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/options.d.ts +2 -0
- package/dist/cjs/lib/v3/types/public/options.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/cdp.d.ts +1 -1
- package/dist/cjs/lib/v3/understudy/cdp.js +83 -43
- package/dist/cjs/lib/v3/understudy/cdp.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/page.js +18 -23
- package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
- package/dist/cjs/lib/v3/v3.d.ts +5 -5
- package/dist/cjs/lib/v3/v3.js +48 -46
- package/dist/cjs/lib/v3/v3.js.map +1 -1
- package/dist/cjs/tests/integration/flowLogger.spec.d.ts +1 -0
- package/dist/cjs/tests/integration/flowLogger.spec.js +714 -0
- package/dist/cjs/tests/integration/flowLogger.spec.js.map +1 -0
- package/dist/cjs/tests/integration/testUtils.d.ts +33 -0
- package/dist/cjs/tests/integration/testUtils.js +144 -0
- package/dist/cjs/tests/integration/testUtils.js.map +1 -1
- package/dist/cjs/tests/integration/timeouts.spec.js +112 -2
- package/dist/cjs/tests/integration/timeouts.spec.js.map +1 -1
- package/dist/cjs/tests/unit/flowlogger-capturing-cdp.test.d.ts +1 -0
- package/dist/cjs/tests/unit/flowlogger-capturing-cdp.test.js +95 -0
- package/dist/cjs/tests/unit/flowlogger-capturing-cdp.test.js.map +1 -0
- package/dist/cjs/tests/unit/flowlogger-capturing-llm.test.d.ts +1 -0
- package/dist/cjs/tests/unit/flowlogger-capturing-llm.test.js +43 -0
- package/dist/cjs/tests/unit/flowlogger-capturing-llm.test.js.map +1 -0
- package/dist/cjs/tests/unit/flowlogger-eventstore.test.d.ts +1 -0
- package/dist/cjs/tests/unit/flowlogger-eventstore.test.js +250 -0
- package/dist/cjs/tests/unit/flowlogger-eventstore.test.js.map +1 -0
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +1 -1
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/GoogleCUAClient.js +1 -1
- package/dist/esm/lib/v3/agent/GoogleCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js +1 -1
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/act.js +1 -10
- package/dist/esm/lib/v3/agent/tools/act.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/ariaTree.js +1 -12
- package/dist/esm/lib/v3/agent/tools/ariaTree.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/braveSearch.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/browserbaseSearch.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/click.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/clickAndHold.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/extract.js +1 -10
- package/dist/esm/lib/v3/agent/tools/extract.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillFormVision.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillform.js +1 -10
- package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/index.d.ts +2 -2
- package/dist/esm/lib/v3/agent/tools/index.js +53 -5
- package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/keys.d.ts +1 -1
- package/dist/esm/lib/v3/agent/tools/keys.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/type.js.map +1 -1
- package/dist/esm/lib/v3/api.js +9 -2
- package/dist/esm/lib/v3/api.js.map +1 -1
- package/dist/esm/lib/v3/flowlogger/EventEmitter.d.ts +7 -0
- package/dist/esm/lib/v3/flowlogger/EventEmitter.js +26 -0
- package/dist/esm/lib/v3/flowlogger/EventEmitter.js.map +1 -0
- package/dist/esm/lib/v3/flowlogger/EventSink.d.ts +44 -0
- package/dist/esm/lib/v3/flowlogger/EventSink.js +206 -0
- package/dist/esm/lib/v3/flowlogger/EventSink.js.map +1 -0
- package/dist/esm/lib/v3/flowlogger/EventStore.d.ts +26 -0
- package/dist/esm/lib/v3/flowlogger/EventStore.js +127 -0
- package/dist/esm/lib/v3/flowlogger/EventStore.js.map +1 -0
- package/dist/{cjs/lib/v3/flowLogger.d.ts โ esm/lib/v3/flowlogger/FlowLogger.d.ts} +32 -31
- package/dist/esm/lib/v3/flowlogger/FlowLogger.js +583 -0
- package/dist/esm/lib/v3/flowlogger/FlowLogger.js.map +1 -0
- package/dist/esm/lib/v3/flowlogger/prettify.d.ts +6 -0
- package/dist/esm/lib/v3/flowlogger/prettify.js +389 -0
- package/dist/esm/lib/v3/flowlogger/prettify.js.map +1 -0
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js +25 -27
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js +1 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +2 -4
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/llm/aisdk.js +1 -1
- package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/esm/lib/v3/types/public/options.d.ts +2 -0
- package/dist/esm/lib/v3/types/public/options.js.map +1 -1
- package/dist/esm/lib/v3/understudy/cdp.d.ts +1 -1
- package/dist/esm/lib/v3/understudy/cdp.js +78 -38
- package/dist/esm/lib/v3/understudy/cdp.js.map +1 -1
- package/dist/esm/lib/v3/understudy/page.js +13 -18
- package/dist/esm/lib/v3/understudy/page.js.map +1 -1
- package/dist/esm/lib/v3/v3.d.ts +5 -5
- package/dist/esm/lib/v3/v3.js +43 -41
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/dist/esm/tests/integration/flowLogger.spec.d.ts +1 -0
- package/dist/esm/tests/integration/flowLogger.spec.js +712 -0
- package/dist/esm/tests/integration/flowLogger.spec.js.map +1 -0
- package/dist/esm/tests/integration/testUtils.d.ts +33 -0
- package/dist/esm/tests/integration/testUtils.js +138 -0
- package/dist/esm/tests/integration/testUtils.js.map +1 -1
- package/dist/esm/tests/integration/timeouts.spec.js +112 -2
- package/dist/esm/tests/integration/timeouts.spec.js.map +1 -1
- package/dist/esm/tests/unit/flowlogger-capturing-cdp.test.d.ts +1 -0
- package/dist/esm/tests/unit/flowlogger-capturing-cdp.test.js +93 -0
- package/dist/esm/tests/unit/flowlogger-capturing-cdp.test.js.map +1 -0
- package/dist/esm/tests/unit/flowlogger-capturing-llm.test.d.ts +1 -0
- package/dist/esm/tests/unit/flowlogger-capturing-llm.test.js +41 -0
- package/dist/esm/tests/unit/flowlogger-capturing-llm.test.js.map +1 -0
- package/dist/esm/tests/unit/flowlogger-eventstore.test.d.ts +1 -0
- package/dist/esm/tests/unit/flowlogger-eventstore.test.js +248 -0
- package/dist/esm/tests/unit/flowlogger-eventstore.test.js.map +1 -0
- package/package.json +3 -1
- package/dist/cjs/lib/v3/eventStore.d.ts +0 -41
- package/dist/cjs/lib/v3/eventStore.js +0 -375
- package/dist/cjs/lib/v3/eventStore.js.map +0 -1
- package/dist/cjs/lib/v3/flowLogger.js +0 -470
- package/dist/cjs/lib/v3/flowLogger.js.map +0 -1
- package/dist/esm/lib/v3/eventStore.d.ts +0 -41
- package/dist/esm/lib/v3/eventStore.js +0 -363
- package/dist/esm/lib/v3/eventStore.js.map +0 -1
- package/dist/esm/lib/v3/flowLogger.js +0 -462
- package/dist/esm/lib/v3/flowLogger.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlowLogger.js","sourceRoot":"","sources":["../../../../../lib/v3/flowlogger/FlowLogger.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport type { LanguageModelMiddleware } from \"ai\";\nimport { z } from \"zod\";\nimport { EventEmitterWithWildcardSupport } from \"./EventEmitter.js\";\n\n// =============================================================================\n// Flow Event Model\n// =============================================================================\n\nexport const FlowEventDataSchema = z.record(z.string(), z.unknown());\nexport const FlowEventInputSchema = z.object({\n eventType: z.string(),\n eventId: z.string().optional(),\n eventParentIds: z.array(z.string()).optional(),\n eventCreatedAt: z.string().optional(),\n sessionId: z.string().optional(),\n data: FlowEventDataSchema.optional(),\n});\n\nexport type FlowEventData = z.infer<typeof FlowEventDataSchema>;\nexport type FlowEventInput = z.input<typeof FlowEventInputSchema>;\n\n// the same as FlowEventInput, but with all fields required (non-optional)\ntype FlowEventFields = Omit<\n FlowEventInput,\n \"eventId\" | \"eventParentIds\" | \"eventCreatedAt\" | \"sessionId\" | \"data\"\n> & {\n eventId: string;\n eventParentIds: string[];\n eventCreatedAt: string;\n sessionId: string;\n data: FlowEventData;\n};\n\nexport class FlowEvent implements FlowEventFields {\n // \"ModuleMethodSomethingEvent\" -> hashToSmallInt(\"Modu) -> 5. eventId = \"...5\"\n private static deriveEventIdSuffix(eventType: string): string {\n const prefixMatch = eventType.match(/^[A-Z][a-z0-9]*/);\n const prefix = prefixMatch?.[0] ?? eventType.slice(0, 4);\n\n let hash = 0;\n for (const ch of prefix.slice(0, 4)) {\n hash = (hash * 31 + ch.charCodeAt(0)) % 10;\n }\n return String(hash); // e.g. \"0\" or \"9\"\n }\n\n // Builds a sortable UUID-like event id while preserving a stable, human-friendly suffix derived from the event family.\n static createEventId(eventType: string): string {\n const rawEventId = uuidv7();\n return `${rawEventId.slice(0, -1)}${FlowEvent.deriveEventIdSuffix(eventType)}`;\n }\n\n // Base required fields for all events:\n eventType: string;\n eventId: string;\n eventParentIds: string[];\n eventCreatedAt: string;\n // `sessionId` usually matches `browserbaseSessionId` today, but FlowLogger treats it as a generic Stagehand session identifier because those may diverge in the future.\n sessionId: string;\n data: FlowEventData; // event payload (e.g. params, action, result, error, etc.)\n\n // Normalizes the event shape used everywhere in the flow logger pipeline. This is called at emission time right before an event is attached to the event bus and any sinks.\n constructor(input: FlowEventInput) {\n if (!input.sessionId) {\n throw new Error(\"FlowEvent.sessionId is required.\");\n }\n if (input.eventType.endsWith(\"Event\")) {\n this.eventType = input.eventType;\n } else {\n this.eventType = `${input.eventType}Event`;\n }\n this.eventId = input.eventId ?? FlowEvent.createEventId(this.eventType);\n this.eventParentIds = input.eventParentIds ?? [];\n this.eventCreatedAt = input.eventCreatedAt ?? new Date().toISOString();\n this.sessionId = input.sessionId;\n this.data = input.data ?? {};\n }\n}\n\nexport interface FlowLoggerContext {\n // Mirrors `FlowEvent.sessionId`; it is currently the Stagehand session id and often matches `browserbaseSessionId`, but callers should not rely on that.\n sessionId: string;\n eventBus: EventEmitterWithWildcardSupport; // Shared per-session bus; `emit()` writes to it and V3 forwards wildcard events into the instance-owned EventStore.\n parentEvents: FlowEvent[]; // Active parent stack for the current async chain; wrappers push/pop this as logged work starts and ends.\n}\n\ntype AsyncOriginalMethod<\n TArgs extends unknown[] = unknown[],\n TResult = unknown,\n TThis = unknown,\n> = (this: TThis, ...args: TArgs) => Promise<TResult>;\n\ntype FlowLoggerLogOptions = FlowEventInput & {\n context?: FlowLoggerContext;\n};\n\n// AsyncLocalStorage is the authoritative source for the active flow parent stack inside a single async call-chain.\nconst loggerContext = new AsyncLocalStorage<FlowLoggerContext>();\n\n// Converts raw inline image/base64 payload lengths into a compact kb string for LLM prompt summaries.\nfunction dataToKb(data: string): string {\n return ((data.length * 0.75) / 1024).toFixed(1);\n}\n\n// =============================================================================\n// Flow Logger Internals\n// =============================================================================\n\ntype CdpLogEventType = \"call\" | \"response\" | \"responseError\" | \"message\";\n\ntype CdpLogPayload = {\n method: string;\n params?: unknown;\n result?: unknown;\n error?: string;\n targetId?: string | null;\n};\n\nconst CDP_EVENT_NAMES: Record<CdpLogEventType, string> = {\n call: \"CdpCallEvent\",\n response: \"CdpResponseEvent\",\n responseError: \"CdpResponseErrorEvent\",\n message: \"CdpMessageEvent\",\n};\n\nexport class FlowLogger {\n // Copies the mutable parts of a context before it is re-entered in a later async callback. This prevents later parent-stack mutations from leaking backward into stored snapshots.\n private static cloneContext(ctx: FlowLoggerContext): FlowLoggerContext {\n return {\n ...ctx,\n parentEvents: ctx.parentEvents.map((event) => ({\n ...event,\n eventParentIds: [...event.eventParentIds],\n })),\n };\n }\n\n // Chooses the safest context to re-enter when callers already have a stored context\n // and ALS may or may not already contain one for the same session.\n // If the current ALS stack extends the stored stack, we keep the richer ALS view.\n // If the stored stack is deeper, we preserve that instead.\n // If they diverge, we prefer the current ALS view because it reflects the currently executing call-chain.\n private static resolveReentryContext(\n context: FlowLoggerContext,\n ): FlowLoggerContext {\n const currentContext = loggerContext.getStore() ?? null;\n // If ALS is empty or belongs to another session, the caller's stored\n // snapshot is the only safe context we can re-enter.\n if (!currentContext || currentContext.sessionId !== context.sessionId) {\n return FlowLogger.cloneContext(context);\n }\n\n const providedParentIds = context.parentEvents.map(\n (event) => event.eventId,\n );\n const currentParentIds = currentContext.parentEvents.map(\n (event) => event.eventId,\n );\n const currentExtendsProvided = providedParentIds.every(\n (eventId, index) => currentParentIds[index] === eventId,\n );\n // ALS already has the provided chain as a prefix, so we keep the richer\n // currently-executing stack instead of truncating it.\n if (currentExtendsProvided) {\n return FlowLogger.cloneContext(currentContext);\n }\n\n const providedExtendsCurrent = currentParentIds.every(\n (eventId, index) => providedParentIds[index] === eventId,\n );\n // The stored snapshot is deeper than the current ALS stack, which usually\n // means we are re-entering from a later async callback and need to restore\n // the missing parent chain.\n if (providedExtendsCurrent) {\n return FlowLogger.cloneContext(context);\n }\n\n // If the two chains diverged, prefer the live ALS chain because it reflects\n // the work currently executing on this async path.\n return FlowLogger.cloneContext(currentContext);\n }\n\n // Materializes and emits a single flow event on the active ALS context.\n // This is the lowest-level write path used by all higher-level logging helpers\n // after they have decided which parent chain and session the event belongs to.\n private static emit(event: FlowEventInput): FlowEvent | null {\n const ctx = FlowLogger.currentContext;\n\n const emittedEvent = new FlowEvent({\n ...event,\n eventParentIds:\n event.eventParentIds ??\n ctx.parentEvents.map((parent) => parent.eventId),\n sessionId: ctx.sessionId,\n });\n ctx.eventBus.emit(emittedEvent.eventType, emittedEvent);\n return emittedEvent;\n }\n\n // Wraps a unit of async work with started/completed/error events while maintaining\n // the parent stack inside the active context.\n private static async runWithAutoStatusEventLogging<TResult>(\n options: FlowLoggerLogOptions,\n originalMethod: AsyncOriginalMethod<[], TResult>,\n ): Promise<TResult> {\n const ctx = FlowLogger.currentContext;\n const { data, eventParentIds, eventType } = options;\n let caughtError: unknown = null;\n\n // if eventParentIds is explicitly [], this is a root event, clear the parent events in context\n if (eventParentIds && eventParentIds.length === 0) {\n ctx.parentEvents = [];\n }\n\n const startedEvent = FlowLogger.emit({\n eventType,\n data,\n eventParentIds,\n });\n\n // Push after emitting so nested work sees this event as its direct parent\n // for the rest of the wrapped method's lifetime.\n ctx.parentEvents.push(startedEvent);\n\n try {\n return await originalMethod();\n } catch (error) {\n caughtError = error;\n // Error events attach directly under the started event even though the\n // stack is still live, so the failure edge is explicit in the tree.\n FlowLogger.emit({\n eventType: `${eventType}ErrorEvent`,\n eventParentIds: [...startedEvent.eventParentIds, startedEvent.eventId],\n data: {\n error: error instanceof Error ? error.message : String(error),\n durationMs:\n Date.now() - new Date(startedEvent.eventCreatedAt).getTime(),\n },\n });\n throw error;\n } finally {\n // Pop only the frame owned by this wrapper. If nested code has already\n // mutated the stack unexpectedly, we skip the completed event rather than\n // emitting a misleading lifecycle edge.\n const parentEvent = ctx.parentEvents.pop();\n if (parentEvent?.eventId === startedEvent.eventId && !caughtError) {\n FlowLogger.emit({\n eventType: `${eventType}CompletedEvent`,\n eventParentIds: [\n ...startedEvent.eventParentIds,\n startedEvent.eventId,\n ],\n data: {\n durationMs:\n Date.now() - new Date(startedEvent.eventCreatedAt).getTime(),\n },\n });\n }\n }\n }\n\n // Emits a CDP event under a caller-supplied context. CDP transport code uses this\n // instead of `runWithLogging()` because request/response/message events\n // are separate lifecycle edges with explicit parent ids.\n private static logCdpEvent(\n context: FlowLoggerContext,\n eventType: CdpLogEventType,\n { method, params, result, error, targetId }: CdpLogPayload,\n eventParentIds?: string[],\n ): FlowEvent | null {\n if (method.endsWith(\".enable\") || method === \"enable\") {\n return null;\n }\n\n if (eventType === \"message\" && FlowLogger.NOISY_CDP_EVENTS.has(method)) {\n return null;\n }\n\n return loggerContext.run(FlowLogger.cloneContext(context), () =>\n FlowLogger.emit({\n eventType: CDP_EVENT_NAMES[eventType],\n eventParentIds,\n data: {\n method,\n params,\n result,\n error,\n targetId,\n },\n }),\n );\n }\n\n // Emits an LLM request/response event only when a flow context is active.\n // LLM logging is best-effort, so callers should not fail if it is invoked outside a tracked async chain.\n private static emitLlmEvent(event: FlowEventInput): void {\n const context = FlowLogger.resolveContext();\n if (!context) {\n return;\n }\n\n loggerContext.run(context, () => {\n FlowLogger.emit(event);\n });\n }\n\n // Builds the one-line prompt summary used in LLM request events for AI SDK middleware calls.\n private static buildMiddlewarePromptSummary(params: {\n prompt?: unknown;\n tools?: unknown;\n }): string {\n const toolCount = Array.isArray(params.tools) ? params.tools.length : 0;\n const messages = (params.prompt ?? []) as Array<{\n role?: string;\n content?: unknown;\n }>;\n const lastMsg = messages\n .filter((message) => message.role !== \"system\")\n .pop();\n let rolePrefix = lastMsg?.role ?? \"?\";\n let promptSummary = `(no text) +{${toolCount} tools}`;\n\n if (!lastMsg) {\n return `?: ${promptSummary}`;\n }\n\n if (typeof lastMsg.content === \"string\") {\n promptSummary = `${lastMsg.content} +{${toolCount} tools}`;\n } else if (Array.isArray(lastMsg.content)) {\n const toolResult = (\n lastMsg.content as Array<{\n type?: string;\n toolName?: string;\n output?: { type?: string; value?: unknown };\n }>\n ).find((part) => part.type === \"tool-result\");\n\n if (toolResult) {\n rolePrefix = `tool result: ${toolResult.toolName}()`;\n if (toolResult.output?.type === \"json\" && toolResult.output.value) {\n promptSummary = `${JSON.stringify(toolResult.output.value)} +{${toolCount} tools}`;\n } else if (Array.isArray(toolResult.output?.value)) {\n promptSummary = `${\n extractLlmMessageSummary({\n content: toolResult.output.value,\n }) ?? \"(no text)\"\n } +{${toolCount} tools}`;\n }\n } else {\n promptSummary = `${\n extractLlmMessageSummary({ content: lastMsg.content }) ?? \"(no text)\"\n } +{${toolCount} tools}`;\n }\n }\n\n return `${rolePrefix}: ${promptSummary}`;\n }\n\n // Builds the one-line output summary used in LLM response events for AI SDK middleware calls.\n private static buildMiddlewareOutputSummary(result: {\n text?: string;\n content?: unknown;\n toolCalls?: unknown[];\n }): string {\n let outputSummary = result.text || \"\";\n if (!outputSummary && result.content) {\n if (typeof result.content === \"string\") {\n outputSummary = result.content;\n } else if (Array.isArray(result.content)) {\n outputSummary = (\n result.content as Array<{\n type?: string;\n text?: string;\n toolName?: string;\n }>\n )\n .map((contentPart) => {\n if (contentPart.text) {\n return contentPart.text;\n }\n\n if (contentPart.type === \"tool-call\") {\n return `tool call: ${contentPart.toolName}()`;\n }\n\n return `[${contentPart.type}]`;\n })\n .join(\" \");\n }\n }\n\n if (!outputSummary && result.toolCalls?.length) {\n return `[${result.toolCalls.length} tool calls]`;\n }\n\n return outputSummary || \"[empty]\";\n }\n\n // =============================================================================\n // Flow Logger Public Lifecycle API\n // =============================================================================\n\n // Initialize a new logging context. Call this at the start of a session.\n static init(\n sessionId: string,\n eventBus: EventEmitterWithWildcardSupport,\n ): FlowLoggerContext {\n const ctx: FlowLoggerContext = {\n sessionId,\n eventBus,\n parentEvents: [],\n };\n\n loggerContext.enterWith(ctx);\n return ctx;\n }\n\n // Clears the parent stack for a session when a V3 instance shuts down.\n // This does not emit a final event; it just tears down in-memory context.\n static async close(context?: FlowLoggerContext | null): Promise<void> {\n const ctx = context ?? loggerContext.getStore() ?? null;\n if (!ctx) return;\n ctx.parentEvents = [];\n }\n\n // Returns the current ALS-backed flow context and throws when code\n // executes outside a tracked flow. Use `resolveContext()` for best-effort lookups.\n static get currentContext(): FlowLoggerContext {\n const ctx = loggerContext.getStore() ?? null;\n if (!ctx) {\n throw new Error(\"FlowLogger context is missing.\");\n }\n\n return ctx;\n }\n\n // Returns a cloned FlowLogger context for the current async call-chain when one exists,\n // otherwise falls back to the provided instance-owned context.\n // This is the non-throwing lookup for callers that can continue without ALS.\n static resolveContext(\n fallbackContext?: FlowLoggerContext | null,\n ): FlowLoggerContext | null {\n const currentContext = loggerContext.getStore() ?? null;\n if (currentContext) {\n return FlowLogger.cloneContext(currentContext);\n }\n\n return fallbackContext ? FlowLogger.cloneContext(fallbackContext) : null;\n }\n\n // Decorator-style wrapper used on class methods that should emit their own started/completed/error envelope.\n // It resolves the flow context from either the decorator options or `this.flowLoggerContext`,\n // then delegates the actual lifecycle handling to `runWithLogging()`.\n static wrapWithLogging<TMethod extends AsyncOriginalMethod>(\n options: FlowLoggerLogOptions,\n ) {\n return function <\n TWrappedMethod extends AsyncOriginalMethod<\n Parameters<TMethod>,\n Awaited<ReturnType<TMethod>>,\n ThisParameterType<TMethod>\n >,\n >(originalMethod: TWrappedMethod): TWrappedMethod {\n const wrappedMethod = async function (\n this: ThisParameterType<TWrappedMethod>,\n ...args: Parameters<TWrappedMethod>\n ): Promise<Awaited<ReturnType<TWrappedMethod>>> {\n let context = options.context;\n if (!context) {\n context = (\n this as { flowLoggerContext?: FlowLoggerContext } | null | undefined\n )?.flowLoggerContext;\n }\n\n return await FlowLogger.runWithLogging(\n {\n ...options,\n context,\n },\n (...boundArgs: Parameters<TWrappedMethod>) =>\n originalMethod.apply(this, boundArgs) as Promise<\n Awaited<ReturnType<TWrappedMethod>>\n >,\n args,\n );\n };\n\n return wrappedMethod as unknown as TWrappedMethod;\n };\n }\n\n // Wraps an async function or zero-arg closure with flow events.\n // This is the imperative entrypoint used by handlers that cannot use the decorator form.\n // Standard case: the logged params are the same tuple passed to the wrapped method.\n static runWithLogging<TMethod extends AsyncOriginalMethod>(\n options: FlowLoggerLogOptions,\n originalMethod: TMethod,\n params: Readonly<Parameters<TMethod>>,\n ): Promise<Awaited<ReturnType<TMethod>>>;\n // Special case: log an arbitrary params tuple while executing a zero-arg closure.\n static runWithLogging<TResult>(\n options: FlowLoggerLogOptions,\n originalMethod: AsyncOriginalMethod<[], TResult>,\n params: ReadonlyArray<unknown>,\n ): Promise<Awaited<TResult>>;\n static runWithLogging(\n options: FlowLoggerLogOptions,\n originalMethod: AsyncOriginalMethod<unknown[], unknown>,\n params: ReadonlyArray<unknown>,\n ): Promise<unknown> {\n const eventData = {\n ...(options.data ?? {}),\n params: [...params],\n };\n\n const execute = (): Promise<unknown> =>\n FlowLogger.runWithAutoStatusEventLogging(\n {\n ...options,\n data: eventData,\n },\n () => originalMethod(...params),\n );\n\n // No explicit context and no active ALS means there is nothing to attach\n // this work to, so we leave execution untouched instead of fabricating a\n // root event.\n if (!options.context && !(loggerContext.getStore() ?? null)) {\n return originalMethod(...params);\n }\n\n if (options.context) {\n // Re-enter the caller-owned context so wrapper events land under the same\n // session tree even when this code executes outside the original ALS\n // chain.\n return loggerContext.run(\n FlowLogger.resolveReentryContext(options.context),\n execute,\n );\n }\n\n return execute();\n }\n\n // Re-enters an existing FlowLogger context without emitting wrapper events.\n // Use this when work already belongs to a known parent and needs AsyncLocalStorage set manually.\n static withContext<T>(context: FlowLoggerContext, fn: () => T): T {\n return loggerContext.run(FlowLogger.resolveReentryContext(context), fn);\n }\n\n // ===========================================================================\n // CDP Events\n // ===========================================================================\n\n private static readonly NOISY_CDP_EVENTS = new Set([\n \"Target.targetInfoChanged\",\n \"Runtime.executionContextCreated\",\n \"Runtime.executionContextDestroyed\",\n \"Runtime.executionContextsCleared\",\n \"Page.lifecycleEvent\",\n \"Network.dataReceived\",\n \"Network.loadingFinished\",\n \"Network.requestWillBeSentExtraInfo\",\n \"Network.responseReceivedExtraInfo\",\n \"Network.requestWillBeSent\",\n \"Network.responseReceived\",\n ]);\n\n // Logs the start of a CDP command. CDP transport calls this before sending a\n // message over the websocket so the eventual response can attach to it.\n static logCdpCallEvent(\n context: FlowLoggerContext,\n data: {\n method: string;\n params?: object;\n targetId?: string | null;\n },\n ): FlowEvent | null {\n return FlowLogger.logCdpEvent(context, \"call\", data);\n }\n\n // Logs the terminal response for a previously emitted CDP call event.\n static logCdpResponseEvent(\n context: FlowLoggerContext,\n parentEvent: Pick<FlowEvent, \"eventId\" | \"eventParentIds\">,\n data: {\n method: string;\n result?: unknown;\n error?: string;\n targetId?: string | null;\n },\n ): void {\n FlowLogger.logCdpEvent(\n context,\n data.error ? \"responseError\" : \"response\",\n data,\n [...parentEvent.eventParentIds, parentEvent.eventId],\n );\n }\n\n // Logs an unsolicited CDP message under the most recent related call event.\n static logCdpMessageEvent(\n context: FlowLoggerContext,\n parentEvent: Pick<FlowEvent, \"eventId\" | \"eventParentIds\">,\n data: {\n method: string;\n params?: unknown;\n targetId?: string | null;\n },\n ): void {\n FlowLogger.logCdpEvent(context, \"message\", data, [\n ...parentEvent.eventParentIds,\n parentEvent.eventId,\n ]);\n }\n\n // ===========================================================================\n // LLM Events\n // ===========================================================================\n\n // Emits a best-effort LLM request event when logging occurs inside an active flow context.\n static logLlmRequest({\n requestId,\n model,\n prompt,\n }: {\n requestId: string;\n model: string;\n prompt?: string;\n }): void {\n FlowLogger.emitLlmEvent({\n eventType: \"LlmRequestEvent\",\n data: {\n requestId,\n model,\n prompt,\n },\n });\n }\n\n // Emits a best-effort LLM response event when logging occurs inside an active flow context.\n static logLlmResponse({\n requestId,\n model,\n output,\n inputTokens,\n outputTokens,\n }: {\n requestId: string;\n model: string;\n output?: string;\n inputTokens?: number;\n outputTokens?: number;\n }): void {\n FlowLogger.emitLlmEvent({\n eventType: \"LlmResponseEvent\",\n data: {\n requestId,\n model,\n output,\n inputTokens,\n outputTokens,\n },\n });\n }\n\n // ===========================================================================\n // LLM Logging Middleware\n // ===========================================================================\n\n // Creates AI SDK middleware that wraps a generate call with FlowLogger LLM request/response events\n // while leaving model execution behavior unchanged.\n static createLlmLoggingMiddleware(\n modelId: string,\n ): Pick<LanguageModelMiddleware, \"wrapGenerate\"> {\n return {\n wrapGenerate: async ({ doGenerate, params }) => {\n const llmRequestId = uuidv7();\n FlowLogger.logLlmRequest({\n requestId: llmRequestId,\n model: modelId,\n prompt: FlowLogger.buildMiddlewarePromptSummary(params),\n });\n\n const result = await doGenerate();\n\n const res = result as {\n text?: string;\n content?: unknown;\n toolCalls?: unknown[];\n };\n\n FlowLogger.logLlmResponse({\n requestId: llmRequestId,\n model: modelId,\n output: FlowLogger.buildMiddlewareOutputSummary(res),\n inputTokens: result.usage?.inputTokens,\n outputTokens: result.usage?.outputTokens,\n });\n\n return result;\n },\n };\n }\n}\n\n// =============================================================================\n// LLM Event Extraction Helpers\n// =============================================================================\n\ntype ContentPart = {\n type?: string;\n text?: string;\n content?: unknown[];\n source?: { data?: string };\n image_url?: { url?: string };\n inlineData?: { data?: string };\n};\n\ntype LlmMessageContent = {\n content?: unknown;\n text?: string;\n parts?: unknown[];\n};\n\n// Extracts text and image markers from an LLM content array.\n// This is shared by the request-summary helpers below so different provider message\n// shapes render consistently in the flow log.\nfunction extractLlmMessageContent(content: unknown[]): {\n text?: string;\n extras: string[];\n} {\n const result = {\n text: undefined as string | undefined,\n extras: [] as string[],\n };\n\n for (const part of content) {\n const p = part as ContentPart;\n // Text\n if (!result.text && p.text) {\n result.text = p.type === \"text\" || !p.type ? p.text : undefined;\n }\n // Images - various formats\n if (p.type === \"image\" || p.type === \"image_url\") {\n const url = p.image_url?.url;\n if (url?.startsWith(\"data:\"))\n result.extras.push(`${dataToKb(url)}kb image`);\n else if (p.source?.data)\n result.extras.push(`${dataToKb(p.source.data)}kb image`);\n else result.extras.push(\"image\");\n } else if (p.source?.data) {\n result.extras.push(`${dataToKb(p.source.data)}kb image`);\n } else if (p.inlineData?.data) {\n result.extras.push(`${dataToKb(p.inlineData.data)}kb image`);\n }\n // Recurse into tool_result content\n if (p.type === \"tool_result\" && Array.isArray(p.content)) {\n const nested = extractLlmMessageContent(p.content);\n if (!result.text && nested.text) {\n result.text = nested.text;\n }\n result.extras.push(...nested.extras);\n }\n }\n\n return result;\n}\n\n// Produces a single compact summary from a provider-specific message payload\n// so request and tool-result logs stay readable.\nfunction extractLlmMessageSummary(\n input: LlmMessageContent,\n options?: {\n trimInstructionPrefix?: boolean;\n extras?: string[];\n },\n): string | undefined {\n const result = {\n text: undefined as string | undefined,\n extras: [...(options?.extras ?? [])],\n };\n\n if (typeof input.content === \"string\") {\n result.text = input.content;\n } else if (typeof input.text === \"string\") {\n result.text = input.text;\n } else if (Array.isArray(input.parts)) {\n const summary = extractLlmMessageContent(input.parts);\n result.text = summary.text;\n result.extras.push(...summary.extras);\n } else if (Array.isArray(input.content)) {\n const summary = extractLlmMessageContent(input.content);\n result.text = summary.text;\n result.extras.push(...summary.extras);\n }\n\n if (options?.trimInstructionPrefix && result.text) {\n result.text = result.text.replace(/^[Ii]nstruction: /, \"\");\n }\n\n const text = result.text;\n if (!text && result.extras.length === 0) return undefined;\n\n let summary = text || \"\";\n if (result.extras.length > 0) {\n const extrasStr = result.extras.map((e) => `+{${e}}`).join(\" \");\n summary = summary ? `${summary} ${extrasStr}` : extrasStr;\n }\n return summary || undefined;\n}\n\n// Formats the last user-facing prompt into the one-line form used by standard LLM request logs,\n// for example: `some text +{5.8kb image} +{schema}`.\nexport function extractLlmPromptSummary(\n messages: Array<{ role: string; content: unknown }>,\n options?: { toolCount?: number; hasSchema?: boolean },\n): string | undefined {\n try {\n const lastUserMsg = messages.filter((m) => m.role === \"user\").pop();\n if (!lastUserMsg) return undefined;\n\n return extractLlmMessageSummary(lastUserMsg, {\n trimInstructionPrefix: true,\n extras: [\n ...(options?.hasSchema ? [\"schema\"] : []),\n ...(options?.toolCount ? [`${options.toolCount} tools`] : []),\n ],\n });\n } catch {\n return undefined;\n }\n}\n\n// Extract a text summary from CUA-style messages. This accepts Anthropic, OpenAI, and Google-style payloads.\nexport function extractLlmCuaPromptSummary(\n messages: unknown[],\n): string | undefined {\n try {\n const lastMsg = messages\n .filter((m) => {\n const msg = m as { role?: string; type?: string };\n return msg.role === \"user\" || msg.type === \"tool_result\";\n })\n .pop() as\n | { content?: unknown; parts?: unknown[]; text?: string }\n | undefined;\n\n if (!lastMsg) return undefined;\n\n return extractLlmMessageSummary(lastMsg);\n } catch {\n return undefined;\n }\n}\n\n// Formats the response side of a CUA exchange into a single short log line.\nexport function extractLlmCuaResponseSummary(output: unknown): string {\n try {\n const items: unknown[] =\n (output as { candidates?: [{ content?: { parts?: unknown[] } }] })\n ?.candidates?.[0]?.content?.parts ??\n (Array.isArray(output) ? output : []);\n\n const summary = items\n .map((item) => {\n const i = item as {\n type?: string;\n text?: string;\n name?: string;\n functionCall?: { name?: string };\n };\n if (i.text) return i.text;\n if (i.functionCall?.name) return i.functionCall.name;\n if (i.type === \"tool_use\" && i.name) return i.name;\n return i.type ?? \"[item]\";\n })\n .join(\" \");\n\n return summary;\n } catch {\n return \"[error]\";\n }\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { FlowEvent } from "./FlowLogger.js";
|
|
2
|
+
import type { EventStoreApi } from "./EventStore.js";
|
|
3
|
+
export declare function prettifySanitizeEvent(event: FlowEvent): FlowEvent;
|
|
4
|
+
export declare function prettifyIsCdpEvent(event: FlowEvent): boolean;
|
|
5
|
+
export declare function prettifyEvent(store: Pick<EventStoreApi, "query">, event: FlowEvent): Promise<string | null>;
|
|
6
|
+
export declare function prettifyColorStderrLine(line: string): string;
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { toTitleCase } from "../../utils.js";
|
|
2
|
+
const MAX_LINE_LENGTH = 160; // Maximum width for a prettified log line.
|
|
3
|
+
// =============================================================================
|
|
4
|
+
// Pretty Formatting
|
|
5
|
+
// =============================================================================
|
|
6
|
+
// All functions in this section intentionally share the `prettify` prefix so the formatting pipeline is easy to scan and reason about in one place.
|
|
7
|
+
// Sanitizes individual values before they are included in prettified output. This currently shortens CDP ids but otherwise preserves structure.
|
|
8
|
+
function prettifySanitizeValue(value) {
|
|
9
|
+
if (typeof value === "string") {
|
|
10
|
+
return truncateCdpIds(value);
|
|
11
|
+
}
|
|
12
|
+
if (Array.isArray(value)) {
|
|
13
|
+
return value.map((entry) => prettifySanitizeValue(entry));
|
|
14
|
+
}
|
|
15
|
+
if (value && typeof value === "object") {
|
|
16
|
+
return Object.fromEntries(Object.entries(value).map(([key, entry]) => [
|
|
17
|
+
key,
|
|
18
|
+
prettifySanitizeValue(entry),
|
|
19
|
+
]));
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
// Produces a prettified-safe copy of the event without mutating the original event that other sinks may still need to serialize verbatim.
|
|
24
|
+
export function prettifySanitizeEvent(event) {
|
|
25
|
+
if (!event.eventType.startsWith("Cdp")) {
|
|
26
|
+
return event;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
...event,
|
|
30
|
+
data: prettifySanitizeValue(event.data),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
// Collapses newlines and tabs, then truncates a string to the configured pretty log width while preserving the tail for ids and result summaries.
|
|
34
|
+
function prettifyTruncateLine(value, maxLen) {
|
|
35
|
+
const collapsed = value.replace(/[\r\n\t]+/g, " ");
|
|
36
|
+
if (collapsed.length <= maxLen) {
|
|
37
|
+
return collapsed;
|
|
38
|
+
}
|
|
39
|
+
const endLen = Math.floor(maxLen * 0.3);
|
|
40
|
+
const startLen = maxLen - endLen - 1;
|
|
41
|
+
return `${collapsed.slice(0, startLen)}โฆ${collapsed.slice(-endLen)}`;
|
|
42
|
+
}
|
|
43
|
+
// Converts any event argument into a compact string representation for pretty logs.
|
|
44
|
+
function prettifyFormatValue(value) {
|
|
45
|
+
if (typeof value === "string")
|
|
46
|
+
return `'${value}'`;
|
|
47
|
+
if (value == null || typeof value !== "object")
|
|
48
|
+
return String(value);
|
|
49
|
+
try {
|
|
50
|
+
return JSON.stringify(value);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return "[unserializable]";
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Formats one or more call arguments into a comma-separated pretty string.
|
|
57
|
+
function prettifyFormatArgs(args) {
|
|
58
|
+
if (args === undefined) {
|
|
59
|
+
return "";
|
|
60
|
+
}
|
|
61
|
+
return (Array.isArray(args) ? args : [args])
|
|
62
|
+
.filter((entry) => entry !== undefined)
|
|
63
|
+
.map(prettifyFormatValue)
|
|
64
|
+
.filter((entry) => entry.length > 0)
|
|
65
|
+
.join(", ");
|
|
66
|
+
}
|
|
67
|
+
// Returns the short id fragment used by pretty tags.
|
|
68
|
+
function shortId(id) {
|
|
69
|
+
return id ? id.slice(-4) : "-";
|
|
70
|
+
}
|
|
71
|
+
// Shortens 32-character CDP ids so pretty logs stay readable while still leaving enough information to correlate related targets.
|
|
72
|
+
function truncateCdpIds(value) {
|
|
73
|
+
return value.replace(/([iI]d:?"?)([0-9A-F]{32})(?="?[,})\s]|$)/g, (_, prefix, id) => `${prefix}${id.slice(0, 4)}โฆ${id.slice(-4)}`);
|
|
74
|
+
}
|
|
75
|
+
let nonce = 0;
|
|
76
|
+
// Formats timestamps for pretty logs while appending a tiny nonce so lines emitted in the same millisecond remain stable and sortable.
|
|
77
|
+
function prettifyFormatTimestamp(date) {
|
|
78
|
+
const pad = (value, width = 2) => String(value).padStart(width, "0");
|
|
79
|
+
return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}.${pad(date.getMilliseconds(), 3)}${pad(nonce++ % 100)}`;
|
|
80
|
+
}
|
|
81
|
+
// Removes noisy quoting artifacts from the final pretty line.
|
|
82
|
+
function prettifyRemoveQuotes(value) {
|
|
83
|
+
return value
|
|
84
|
+
.replace(/([^\\])["']/g, "$1")
|
|
85
|
+
.replace(/^["']|["']$/g, "")
|
|
86
|
+
.trim();
|
|
87
|
+
}
|
|
88
|
+
// Strips event lifecycle suffixes so related started/completed/error variants can be grouped under one logical operation name.
|
|
89
|
+
function prettifyEventName(eventType) {
|
|
90
|
+
return eventType
|
|
91
|
+
.replace(/CompletedEvent$/, "")
|
|
92
|
+
.replace(/ErrorEvent$/, "")
|
|
93
|
+
.replace(/Event$/, "");
|
|
94
|
+
}
|
|
95
|
+
// Extracts the operation name from a Stagehand/Page/Understudy/Agent event.
|
|
96
|
+
function prettifyEventAction(eventType) {
|
|
97
|
+
return prettifyEventName(eventType)
|
|
98
|
+
.replace(/^Agent/, "")
|
|
99
|
+
.replace(/^Stagehand/, "")
|
|
100
|
+
.replace(/^Understudy/, "")
|
|
101
|
+
.replace(/^Page/, "");
|
|
102
|
+
}
|
|
103
|
+
// Formats `Target.method(args)` style entries while gracefully handling events whose action portion is intentionally blank, such as `StagehandEvent`.
|
|
104
|
+
function prettifyFormatMethodCall(target, method, args) {
|
|
105
|
+
const member = method ? `.${method[0].toLowerCase()}${method.slice(1)}` : "";
|
|
106
|
+
return `โท ${target}${member}(${prettifyFormatEventArgs(args)})`;
|
|
107
|
+
}
|
|
108
|
+
// Marks agent lifecycle events for ancestry tags.
|
|
109
|
+
function prettifyIsAgentEvent(event) {
|
|
110
|
+
return prettifyEventName(event.eventType).startsWith("Agent");
|
|
111
|
+
}
|
|
112
|
+
// Marks Stagehand lifecycle events for ancestry tags.
|
|
113
|
+
function prettifyIsStagehandEvent(event) {
|
|
114
|
+
return prettifyEventName(event.eventType).startsWith("Stagehand");
|
|
115
|
+
}
|
|
116
|
+
// Marks page and Understudy actions for the action tag.
|
|
117
|
+
function prettifyIsActionEvent(event) {
|
|
118
|
+
return /^(Page|Understudy)/.test(prettifyEventName(event.eventType));
|
|
119
|
+
}
|
|
120
|
+
// Routes transport-level CDP traffic to the CDP formatter.
|
|
121
|
+
export function prettifyIsCdpEvent(event) {
|
|
122
|
+
return prettifyEventName(event.eventType).startsWith("Cdp");
|
|
123
|
+
}
|
|
124
|
+
// Routes LLM request/response events to the LLM formatter.
|
|
125
|
+
function prettifyIsLlmEvent(event) {
|
|
126
|
+
return prettifyEventName(event.eventType).startsWith("Llm");
|
|
127
|
+
}
|
|
128
|
+
// Completed events should inherit tags from the started operation.
|
|
129
|
+
function prettifyIsCompletedEvent(event) {
|
|
130
|
+
return event.eventType.endsWith("CompletedEvent");
|
|
131
|
+
}
|
|
132
|
+
// Error events should inherit tags from the started operation.
|
|
133
|
+
function prettifyIsErrorEvent(event) {
|
|
134
|
+
return event.eventType.endsWith("ErrorEvent");
|
|
135
|
+
}
|
|
136
|
+
// Renders the bracketed pretty tag used in stderr/file pretty logs.
|
|
137
|
+
function prettifyFormatTag(label, id, icon) {
|
|
138
|
+
return id ? `[${icon} #${shortId(id)}${label ? ` ${label}` : ""}]` : "โค";
|
|
139
|
+
}
|
|
140
|
+
// Formats duration values stored on completed/error events.
|
|
141
|
+
function prettifyFormatDuration(durationMs) {
|
|
142
|
+
return typeof durationMs === "number"
|
|
143
|
+
? `${(durationMs / 1000).toFixed(2)}s`
|
|
144
|
+
: null;
|
|
145
|
+
}
|
|
146
|
+
// Summarizes a prompt or output payload down to a single displayable string for the LLM pretty formatter.
|
|
147
|
+
function prettifySummarizePrompt(value) {
|
|
148
|
+
if (typeof value === "string") {
|
|
149
|
+
return prettifyTruncateLine(value, MAX_LINE_LENGTH / 2);
|
|
150
|
+
}
|
|
151
|
+
if (value == null) {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
return prettifyTruncateLine(prettifyFormatValue(value), MAX_LINE_LENGTH / 2);
|
|
155
|
+
}
|
|
156
|
+
// Replaces large object references from live runtime objects with placeholders before they are stringified for pretty output.
|
|
157
|
+
function prettifyCompactValue(value) {
|
|
158
|
+
if (typeof value !== "object" || value === null) {
|
|
159
|
+
return value;
|
|
160
|
+
}
|
|
161
|
+
if (Array.isArray(value)) {
|
|
162
|
+
return value.map((entry) => prettifyCompactValue(entry));
|
|
163
|
+
}
|
|
164
|
+
const result = {};
|
|
165
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
166
|
+
if (key === "page" ||
|
|
167
|
+
key === "frame" ||
|
|
168
|
+
key === "locator" ||
|
|
169
|
+
key === "conn" ||
|
|
170
|
+
key === "mainSession" ||
|
|
171
|
+
key === "sessions" ||
|
|
172
|
+
key === "registry" ||
|
|
173
|
+
key === "networkManager" ||
|
|
174
|
+
key === "apiClient") {
|
|
175
|
+
result[key] = `[${toTitleCase(key)}]`;
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
result[key] = prettifyCompactValue(entry);
|
|
179
|
+
}
|
|
180
|
+
return result;
|
|
181
|
+
}
|
|
182
|
+
// Formats event arguments after compacting any live object references.
|
|
183
|
+
function prettifyFormatEventArgs(args) {
|
|
184
|
+
return prettifyFormatArgs(prettifyCompactValue(args));
|
|
185
|
+
}
|
|
186
|
+
// Finds the nearest event in the current parent chain that satisfies the given predicate. Pretty tags use this to recover agent/stagehand/action/llm ancestry.
|
|
187
|
+
function prettifyFindNearestEvent(event, parentMap, predicate, options) {
|
|
188
|
+
if (options?.includeSelf !== false && predicate(event)) {
|
|
189
|
+
return event;
|
|
190
|
+
}
|
|
191
|
+
for (let index = event.eventParentIds.length - 1; index >= 0; index -= 1) {
|
|
192
|
+
const parent = parentMap.get(event.eventParentIds[index]);
|
|
193
|
+
if (parent && predicate(parent)) {
|
|
194
|
+
return parent;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
// Builds the semantic ancestry tags shown on each pretty log line.
|
|
200
|
+
// 2026-03-16 22:04:15.45540 [๐
ฐ #1083] [๐ #7bf4 ACT] [๐ #2125 CLICK] [๐
ฒ #8B8B CDP] โด Network.policyUpdated({})
|
|
201
|
+
function prettifyBuildContextTags(event, parentMap) {
|
|
202
|
+
// Completed/error events should inherit tags from their started parent so the completion line points back to the original operation id.
|
|
203
|
+
const includeSelf = !prettifyIsCompletedEvent(event) && !prettifyIsErrorEvent(event);
|
|
204
|
+
const agentEvent = prettifyFindNearestEvent(event, parentMap, prettifyIsAgentEvent, { includeSelf });
|
|
205
|
+
const stagehandEvent = prettifyFindNearestEvent(event, parentMap, prettifyIsStagehandEvent, { includeSelf });
|
|
206
|
+
const actionEvent = prettifyFindNearestEvent(event, parentMap, prettifyIsActionEvent, { includeSelf });
|
|
207
|
+
const llmEvent = prettifyFindNearestEvent(event, parentMap, prettifyIsLlmEvent, {
|
|
208
|
+
includeSelf,
|
|
209
|
+
});
|
|
210
|
+
let targetId = null;
|
|
211
|
+
if (typeof event.data.targetId === "string") {
|
|
212
|
+
targetId = event.data.targetId;
|
|
213
|
+
}
|
|
214
|
+
let stagehandLabel = "";
|
|
215
|
+
if (stagehandEvent) {
|
|
216
|
+
stagehandLabel = prettifyEventAction(stagehandEvent.eventType).toUpperCase();
|
|
217
|
+
}
|
|
218
|
+
let actionLabel = "";
|
|
219
|
+
if (actionEvent) {
|
|
220
|
+
actionLabel = prettifyEventAction(actionEvent.eventType).toUpperCase();
|
|
221
|
+
}
|
|
222
|
+
if (prettifyIsAgentEvent(event)) {
|
|
223
|
+
return [prettifyFormatTag("", agentEvent?.eventId, "๐
ฐ")];
|
|
224
|
+
}
|
|
225
|
+
if (prettifyIsStagehandEvent(event)) {
|
|
226
|
+
return [
|
|
227
|
+
prettifyFormatTag("", agentEvent?.eventId, "๐
ฐ"),
|
|
228
|
+
prettifyFormatTag(prettifyEventAction(stagehandEvent?.eventType ?? event.eventType).toUpperCase(), stagehandEvent?.eventId, "๐"),
|
|
229
|
+
];
|
|
230
|
+
}
|
|
231
|
+
if (prettifyIsActionEvent(event)) {
|
|
232
|
+
return [
|
|
233
|
+
prettifyFormatTag("", agentEvent?.eventId, "๐
ฐ"),
|
|
234
|
+
prettifyFormatTag(stagehandLabel, stagehandEvent?.eventId, "๐"),
|
|
235
|
+
prettifyFormatTag(prettifyEventAction(actionEvent?.eventType ?? event.eventType).toUpperCase(), actionEvent?.eventId, "๐"),
|
|
236
|
+
];
|
|
237
|
+
}
|
|
238
|
+
if (prettifyIsCdpEvent(event)) {
|
|
239
|
+
return [
|
|
240
|
+
prettifyFormatTag("", agentEvent?.eventId, "๐
ฐ"),
|
|
241
|
+
prettifyFormatTag(stagehandLabel, stagehandEvent?.eventId, "๐"),
|
|
242
|
+
prettifyFormatTag(actionLabel, actionEvent?.eventId, "๐"),
|
|
243
|
+
prettifyFormatTag("CDP", targetId, "๐
ฒ"),
|
|
244
|
+
];
|
|
245
|
+
}
|
|
246
|
+
if (prettifyIsLlmEvent(event)) {
|
|
247
|
+
let requestId = null;
|
|
248
|
+
if (typeof event.data.requestId === "string") {
|
|
249
|
+
requestId = event.data.requestId;
|
|
250
|
+
}
|
|
251
|
+
return [
|
|
252
|
+
prettifyFormatTag("", agentEvent?.eventId, "๐
ฐ"),
|
|
253
|
+
prettifyFormatTag(stagehandLabel, stagehandEvent?.eventId, "๐"),
|
|
254
|
+
prettifyFormatTag("LLM", requestId ?? llmEvent?.eventId, "๐
ป"),
|
|
255
|
+
];
|
|
256
|
+
}
|
|
257
|
+
return [`[#${shortId(event.eventId)}]`];
|
|
258
|
+
}
|
|
259
|
+
// Formats the details section for started/root events.
|
|
260
|
+
function prettifyFormatStartedDetails(event) {
|
|
261
|
+
const data = event.data;
|
|
262
|
+
const name = prettifyEventName(event.eventType);
|
|
263
|
+
const method = prettifyEventAction(event.eventType);
|
|
264
|
+
if (name.startsWith("Stagehand")) {
|
|
265
|
+
return prettifyFormatMethodCall("Stagehand", method, data.params);
|
|
266
|
+
}
|
|
267
|
+
if (name.startsWith("Page")) {
|
|
268
|
+
return prettifyFormatMethodCall("Page", method, data.params);
|
|
269
|
+
}
|
|
270
|
+
if (name.startsWith("Understudy")) {
|
|
271
|
+
const args = [
|
|
272
|
+
data.target,
|
|
273
|
+
...(Array.isArray(data.params) ? data.params : []),
|
|
274
|
+
].filter((entry) => entry !== undefined);
|
|
275
|
+
return prettifyFormatMethodCall("Understudy", method, args);
|
|
276
|
+
}
|
|
277
|
+
if (name.startsWith("Agent")) {
|
|
278
|
+
return `โท Agent.execute(${prettifyFormatEventArgs(data.params)})`;
|
|
279
|
+
}
|
|
280
|
+
return `${event.eventType}(${prettifyFormatEventArgs(data.params ?? event.data)})`;
|
|
281
|
+
}
|
|
282
|
+
// Formats the details section for completed/error events.
|
|
283
|
+
function prettifyFormatCompletedDetails(event) {
|
|
284
|
+
const duration = prettifyFormatDuration(event.data.durationMs);
|
|
285
|
+
const prefix = prettifyIsAgentEvent(event)
|
|
286
|
+
? "Agent.execute() completed"
|
|
287
|
+
: `${prettifyEventAction(event.eventType).toUpperCase() || event.eventType} completed`;
|
|
288
|
+
const message = prettifyIsErrorEvent(event) && typeof event.data.error === "string"
|
|
289
|
+
? ` ERROR ${event.data.error}`
|
|
290
|
+
: "";
|
|
291
|
+
return `${prettifyIsErrorEvent(event) ? "โ" : "โ"} ${prefix}${duration ? ` in ${duration}` : ""}${message}`;
|
|
292
|
+
}
|
|
293
|
+
// Formats CDP request/response/message details. These are rendered differently from normal Stagehand lifecycle events because they represent transport-level traffic rather than method envelopes.
|
|
294
|
+
function prettifyFormatCdpDetails(event) {
|
|
295
|
+
const data = event.data;
|
|
296
|
+
const method = data.method ?? "unknown";
|
|
297
|
+
const icon = event.eventType === "CdpCallEvent" ? "โต" : "โด";
|
|
298
|
+
let payload;
|
|
299
|
+
if (event.eventType === "CdpCallEvent") {
|
|
300
|
+
payload = data.params;
|
|
301
|
+
}
|
|
302
|
+
else if (data.error) {
|
|
303
|
+
payload = { error: data.error };
|
|
304
|
+
}
|
|
305
|
+
else if (event.eventType === "CdpMessageEvent") {
|
|
306
|
+
payload = data.params;
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
payload = data.result;
|
|
310
|
+
}
|
|
311
|
+
return `${icon} ${method}(${prettifyFormatEventArgs(payload)})`;
|
|
312
|
+
}
|
|
313
|
+
// Formats LLM request/response details for pretty logs.
|
|
314
|
+
function prettifyFormatLlmDetails(event) {
|
|
315
|
+
const data = event.data;
|
|
316
|
+
const model = data.model ?? "llm";
|
|
317
|
+
if (event.eventType === "LlmRequestEvent") {
|
|
318
|
+
const prompt = prettifySummarizePrompt(data.prompt);
|
|
319
|
+
return prompt ? `${model} โด ${prompt}` : `${model} โด`;
|
|
320
|
+
}
|
|
321
|
+
const tokenInfo = (data.inputTokens || data.outputTokens) > 0
|
|
322
|
+
? ` ๊${data.inputTokens ?? 0} ๊${data.outputTokens ?? 0}`
|
|
323
|
+
: "";
|
|
324
|
+
const output = prettifySummarizePrompt(data.output);
|
|
325
|
+
return output ? `${model} โณ${tokenInfo} ${output}` : `${model} โณ${tokenInfo}`;
|
|
326
|
+
}
|
|
327
|
+
// Converts a flow event into a single pretty log line by combining the current event payload with recent shallow ancestry fetched from the store query sink.
|
|
328
|
+
export async function prettifyEvent(store, event) {
|
|
329
|
+
const recentEvents = await store.query({ limit: 500 });
|
|
330
|
+
const parentMap = new Map(recentEvents.map((recentEvent) => [recentEvent.eventId, recentEvent]));
|
|
331
|
+
const tags = prettifyBuildContextTags(event, parentMap);
|
|
332
|
+
let details = prettifyFormatStartedDetails(event);
|
|
333
|
+
if (prettifyIsCdpEvent(event)) {
|
|
334
|
+
details = prettifyFormatCdpDetails(event);
|
|
335
|
+
}
|
|
336
|
+
else if (prettifyIsLlmEvent(event)) {
|
|
337
|
+
details = prettifyFormatLlmDetails(event);
|
|
338
|
+
}
|
|
339
|
+
else if (prettifyIsCompletedEvent(event) || prettifyIsErrorEvent(event)) {
|
|
340
|
+
details = prettifyFormatCompletedDetails(event);
|
|
341
|
+
}
|
|
342
|
+
if (!details) {
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
const createdAt = new Date(event.eventCreatedAt);
|
|
346
|
+
let timestamp = prettifyFormatTimestamp(createdAt);
|
|
347
|
+
if (Number.isNaN(createdAt.getTime())) {
|
|
348
|
+
timestamp = prettifyFormatTimestamp(new Date());
|
|
349
|
+
}
|
|
350
|
+
const line = `${timestamp} ${tags.join(" ")} ${details}`;
|
|
351
|
+
const cleaned = prettifyRemoveQuotes(line);
|
|
352
|
+
const processed = prettifyIsCdpEvent(event)
|
|
353
|
+
? truncateCdpIds(cleaned)
|
|
354
|
+
: cleaned;
|
|
355
|
+
return prettifyTruncateLine(processed, MAX_LINE_LENGTH);
|
|
356
|
+
}
|
|
357
|
+
// Adds subtle terminal color to stderr-only pretty lines without affecting file sinks.
|
|
358
|
+
export function prettifyColorStderrLine(line) {
|
|
359
|
+
if (process.env.NO_COLOR !== undefined ||
|
|
360
|
+
(process.env.FORCE_COLOR ?? "") === "0" ||
|
|
361
|
+
(!process.env.FORCE_COLOR &&
|
|
362
|
+
(!process.stderr.isTTY || process.env.TERM === "dumb"))) {
|
|
363
|
+
return line;
|
|
364
|
+
}
|
|
365
|
+
const color = (code, value) => `\u001B[${code}m${value}\u001B[0m`;
|
|
366
|
+
return line
|
|
367
|
+
.replace(/^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{5})/, (_, timestamp) => color("2", timestamp))
|
|
368
|
+
.replace(/\[([๐
ฐ๐๐๐
ป๐
ฒ])([^\]]*)\]/gu, (_, icon, rest) => color(icon === "๐
ฐ"
|
|
369
|
+
? "36"
|
|
370
|
+
: icon === "๐"
|
|
371
|
+
? "33"
|
|
372
|
+
: icon === "๐"
|
|
373
|
+
? "32"
|
|
374
|
+
: icon === "๐
ป"
|
|
375
|
+
? "95"
|
|
376
|
+
: "90", `[${icon}${rest}]`))
|
|
377
|
+
.replace(/ in (\d+(?:\.\d+)?s)/g, (_, duration) => ` ${color("2", "in")} ${color("2", duration)}`)
|
|
378
|
+
.replace(/โท/g, color("96", "โท"))
|
|
379
|
+
.replace(/โด/g, color("96", "โด"))
|
|
380
|
+
.replace(/โณ/g, color("95", "โณ"))
|
|
381
|
+
.replace(/๊/g, color("33", "๊"))
|
|
382
|
+
.replace(/๊/g, color("95", "๊"))
|
|
383
|
+
.replace(/โฆ/g, color("94", "โฆ"))
|
|
384
|
+
.replace(/[(){}=]/g, (char) => color("94", char))
|
|
385
|
+
.replace(/([A-Za-z])(\.)([A-Za-z])/g, (_, left, dot, right) => `${left}${color("94", dot)}${right}`)
|
|
386
|
+
.replace(/ โ /g, ` ${color("32", "โ")} `)
|
|
387
|
+
.replace(/ โ /g, ` ${color("31", "โ")} `);
|
|
388
|
+
}
|
|
389
|
+
//# sourceMappingURL=prettify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prettify.js","sourceRoot":"","sources":["../../../../../lib/v3/flowlogger/prettify.ts"],"names":[],"mappings":"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","sourcesContent":["import { toTitleCase } from \"../../utils.js\";\nimport { FlowEvent } from \"./FlowLogger.js\";\nimport type { EventStoreApi } from \"./EventStore.js\";\n\nconst MAX_LINE_LENGTH = 160; // Maximum width for a prettified log line.\n\n// =============================================================================\n// Pretty Formatting\n// =============================================================================\n\n// All functions in this section intentionally share the `prettify` prefix so the formatting pipeline is easy to scan and reason about in one place.\n\n// Sanitizes individual values before they are included in prettified output. This currently shortens CDP ids but otherwise preserves structure.\nfunction prettifySanitizeValue(value: unknown): unknown {\n if (typeof value === \"string\") {\n return truncateCdpIds(value);\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => prettifySanitizeValue(entry));\n }\n\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value).map(([key, entry]) => [\n key,\n prettifySanitizeValue(entry),\n ]),\n );\n }\n\n return value;\n}\n\n// Produces a prettified-safe copy of the event without mutating the original event that other sinks may still need to serialize verbatim.\nexport function prettifySanitizeEvent(event: FlowEvent): FlowEvent {\n if (!event.eventType.startsWith(\"Cdp\")) {\n return event;\n }\n\n return {\n ...event,\n data: prettifySanitizeValue(event.data) as Record<string, unknown>,\n };\n}\n\n// Collapses newlines and tabs, then truncates a string to the configured pretty log width while preserving the tail for ids and result summaries.\nfunction prettifyTruncateLine(value: string, maxLen: number): string {\n const collapsed = value.replace(/[\\r\\n\\t]+/g, \" \");\n if (collapsed.length <= maxLen) {\n return collapsed;\n }\n\n const endLen = Math.floor(maxLen * 0.3);\n const startLen = maxLen - endLen - 1;\n return `${collapsed.slice(0, startLen)}โฆ${collapsed.slice(-endLen)}`;\n}\n\n// Converts any event argument into a compact string representation for pretty logs.\nfunction prettifyFormatValue(value: unknown): string {\n if (typeof value === \"string\") return `'${value}'`;\n if (value == null || typeof value !== \"object\") return String(value);\n\n try {\n return JSON.stringify(value);\n } catch {\n return \"[unserializable]\";\n }\n}\n\n// Formats one or more call arguments into a comma-separated pretty string.\nfunction prettifyFormatArgs(args?: unknown | unknown[]): string {\n if (args === undefined) {\n return \"\";\n }\n\n return (Array.isArray(args) ? args : [args])\n .filter((entry) => entry !== undefined)\n .map(prettifyFormatValue)\n .filter((entry) => entry.length > 0)\n .join(\", \");\n}\n\n// Returns the short id fragment used by pretty tags.\nfunction shortId(id: string | null | undefined): string {\n return id ? id.slice(-4) : \"-\";\n}\n\n// Shortens 32-character CDP ids so pretty logs stay readable while still leaving enough information to correlate related targets.\nfunction truncateCdpIds(value: string): string {\n return value.replace(\n /([iI]d:?\"?)([0-9A-F]{32})(?=\"?[,})\\s]|$)/g,\n (_, prefix: string, id: string) =>\n `${prefix}${id.slice(0, 4)}โฆ${id.slice(-4)}`,\n );\n}\n\nlet nonce = 0;\n\n// Formats timestamps for pretty logs while appending a tiny nonce so lines emitted in the same millisecond remain stable and sortable.\nfunction prettifyFormatTimestamp(date: Date): string {\n const pad = (value: number, width = 2) => String(value).padStart(width, \"0\");\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}.${pad(date.getMilliseconds(), 3)}${pad(nonce++ % 100)}`;\n}\n\n// Removes noisy quoting artifacts from the final pretty line.\nfunction prettifyRemoveQuotes(value: string): string {\n return value\n .replace(/([^\\\\])[\"']/g, \"$1\")\n .replace(/^[\"']|[\"']$/g, \"\")\n .trim();\n}\n\n// Strips event lifecycle suffixes so related started/completed/error variants can be grouped under one logical operation name.\nfunction prettifyEventName(eventType: string): string {\n return eventType\n .replace(/CompletedEvent$/, \"\")\n .replace(/ErrorEvent$/, \"\")\n .replace(/Event$/, \"\");\n}\n\n// Extracts the operation name from a Stagehand/Page/Understudy/Agent event.\nfunction prettifyEventAction(eventType: string): string {\n return prettifyEventName(eventType)\n .replace(/^Agent/, \"\")\n .replace(/^Stagehand/, \"\")\n .replace(/^Understudy/, \"\")\n .replace(/^Page/, \"\");\n}\n\n// Formats `Target.method(args)` style entries while gracefully handling events whose action portion is intentionally blank, such as `StagehandEvent`.\nfunction prettifyFormatMethodCall(\n target: string,\n method: string,\n args: unknown,\n): string {\n const member = method ? `.${method[0].toLowerCase()}${method.slice(1)}` : \"\";\n return `โท ${target}${member}(${prettifyFormatEventArgs(args)})`;\n}\n\n// Marks agent lifecycle events for ancestry tags.\nfunction prettifyIsAgentEvent(event: FlowEvent): boolean {\n return prettifyEventName(event.eventType).startsWith(\"Agent\");\n}\n\n// Marks Stagehand lifecycle events for ancestry tags.\nfunction prettifyIsStagehandEvent(event: FlowEvent): boolean {\n return prettifyEventName(event.eventType).startsWith(\"Stagehand\");\n}\n\n// Marks page and Understudy actions for the action tag.\nfunction prettifyIsActionEvent(event: FlowEvent): boolean {\n return /^(Page|Understudy)/.test(prettifyEventName(event.eventType));\n}\n\n// Routes transport-level CDP traffic to the CDP formatter.\nexport function prettifyIsCdpEvent(event: FlowEvent): boolean {\n return prettifyEventName(event.eventType).startsWith(\"Cdp\");\n}\n\n// Routes LLM request/response events to the LLM formatter.\nfunction prettifyIsLlmEvent(event: FlowEvent): boolean {\n return prettifyEventName(event.eventType).startsWith(\"Llm\");\n}\n\n// Completed events should inherit tags from the started operation.\nfunction prettifyIsCompletedEvent(event: FlowEvent): boolean {\n return event.eventType.endsWith(\"CompletedEvent\");\n}\n\n// Error events should inherit tags from the started operation.\nfunction prettifyIsErrorEvent(event: FlowEvent): boolean {\n return event.eventType.endsWith(\"ErrorEvent\");\n}\n\n// Renders the bracketed pretty tag used in stderr/file pretty logs.\nfunction prettifyFormatTag(\n label: string | null | undefined,\n id: string | null | undefined,\n icon: string,\n): string {\n return id ? `[${icon} #${shortId(id)}${label ? ` ${label}` : \"\"}]` : \"โค\";\n}\n\n// Formats duration values stored on completed/error events.\nfunction prettifyFormatDuration(durationMs?: unknown): string | null {\n return typeof durationMs === \"number\"\n ? `${(durationMs / 1000).toFixed(2)}s`\n : null;\n}\n\n// Summarizes a prompt or output payload down to a single displayable string for the LLM pretty formatter.\nfunction prettifySummarizePrompt(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n return prettifyTruncateLine(value, MAX_LINE_LENGTH / 2);\n }\n\n if (value == null) {\n return undefined;\n }\n\n return prettifyTruncateLine(prettifyFormatValue(value), MAX_LINE_LENGTH / 2);\n}\n\n// Replaces large object references from live runtime objects with placeholders before they are stringified for pretty output.\nfunction prettifyCompactValue(value: unknown): unknown {\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => prettifyCompactValue(entry));\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n if (\n key === \"page\" ||\n key === \"frame\" ||\n key === \"locator\" ||\n key === \"conn\" ||\n key === \"mainSession\" ||\n key === \"sessions\" ||\n key === \"registry\" ||\n key === \"networkManager\" ||\n key === \"apiClient\"\n ) {\n result[key] = `[${toTitleCase(key)}]`;\n continue;\n }\n\n result[key] = prettifyCompactValue(entry);\n }\n\n return result;\n}\n\n// Formats event arguments after compacting any live object references.\nfunction prettifyFormatEventArgs(args?: unknown | unknown[]): string {\n return prettifyFormatArgs(prettifyCompactValue(args) as unknown | unknown[]);\n}\n\n// Finds the nearest event in the current parent chain that satisfies the given predicate. Pretty tags use this to recover agent/stagehand/action/llm ancestry.\nfunction prettifyFindNearestEvent(\n event: FlowEvent,\n parentMap: Map<string, FlowEvent>,\n predicate: (candidate: FlowEvent) => boolean,\n options?: { includeSelf?: boolean },\n): FlowEvent | null {\n if (options?.includeSelf !== false && predicate(event)) {\n return event;\n }\n\n for (let index = event.eventParentIds.length - 1; index >= 0; index -= 1) {\n const parent = parentMap.get(event.eventParentIds[index]);\n if (parent && predicate(parent)) {\n return parent;\n }\n }\n\n return null;\n}\n\n// Builds the semantic ancestry tags shown on each pretty log line.\n// 2026-03-16 22:04:15.45540 [๐
ฐ #1083] [๐ #7bf4 ACT] [๐ #2125 CLICK] [๐
ฒ #8B8B CDP] โด Network.policyUpdated({})\nfunction prettifyBuildContextTags(\n event: FlowEvent,\n parentMap: Map<string, FlowEvent>,\n): string[] {\n // Completed/error events should inherit tags from their started parent so the completion line points back to the original operation id.\n const includeSelf =\n !prettifyIsCompletedEvent(event) && !prettifyIsErrorEvent(event);\n const agentEvent = prettifyFindNearestEvent(\n event,\n parentMap,\n prettifyIsAgentEvent,\n { includeSelf },\n );\n const stagehandEvent = prettifyFindNearestEvent(\n event,\n parentMap,\n prettifyIsStagehandEvent,\n { includeSelf },\n );\n const actionEvent = prettifyFindNearestEvent(\n event,\n parentMap,\n prettifyIsActionEvent,\n { includeSelf },\n );\n const llmEvent = prettifyFindNearestEvent(\n event,\n parentMap,\n prettifyIsLlmEvent,\n {\n includeSelf,\n },\n );\n\n let targetId: string | null = null;\n if (typeof event.data.targetId === \"string\") {\n targetId = event.data.targetId;\n }\n\n let stagehandLabel = \"\";\n if (stagehandEvent) {\n stagehandLabel = prettifyEventAction(\n stagehandEvent.eventType,\n ).toUpperCase();\n }\n\n let actionLabel = \"\";\n if (actionEvent) {\n actionLabel = prettifyEventAction(actionEvent.eventType).toUpperCase();\n }\n\n if (prettifyIsAgentEvent(event)) {\n return [prettifyFormatTag(\"\", agentEvent?.eventId, \"๐
ฐ\")];\n }\n\n if (prettifyIsStagehandEvent(event)) {\n return [\n prettifyFormatTag(\"\", agentEvent?.eventId, \"๐
ฐ\"),\n prettifyFormatTag(\n prettifyEventAction(\n stagehandEvent?.eventType ?? event.eventType,\n ).toUpperCase(),\n stagehandEvent?.eventId,\n \"๐\",\n ),\n ];\n }\n\n if (prettifyIsActionEvent(event)) {\n return [\n prettifyFormatTag(\"\", agentEvent?.eventId, \"๐
ฐ\"),\n prettifyFormatTag(stagehandLabel, stagehandEvent?.eventId, \"๐\"),\n prettifyFormatTag(\n prettifyEventAction(\n actionEvent?.eventType ?? event.eventType,\n ).toUpperCase(),\n actionEvent?.eventId,\n \"๐\",\n ),\n ];\n }\n\n if (prettifyIsCdpEvent(event)) {\n return [\n prettifyFormatTag(\"\", agentEvent?.eventId, \"๐
ฐ\"),\n prettifyFormatTag(stagehandLabel, stagehandEvent?.eventId, \"๐\"),\n prettifyFormatTag(actionLabel, actionEvent?.eventId, \"๐\"),\n prettifyFormatTag(\"CDP\", targetId, \"๐
ฒ\"),\n ];\n }\n\n if (prettifyIsLlmEvent(event)) {\n let requestId: string | null = null;\n if (typeof event.data.requestId === \"string\") {\n requestId = event.data.requestId;\n }\n\n return [\n prettifyFormatTag(\"\", agentEvent?.eventId, \"๐
ฐ\"),\n prettifyFormatTag(stagehandLabel, stagehandEvent?.eventId, \"๐\"),\n prettifyFormatTag(\"LLM\", requestId ?? llmEvent?.eventId, \"๐
ป\"),\n ];\n }\n\n return [`[#${shortId(event.eventId)}]`];\n}\n\n// Formats the details section for started/root events.\nfunction prettifyFormatStartedDetails(event: FlowEvent): string {\n const data = event.data as {\n params?: unknown[];\n target?: string;\n };\n const name = prettifyEventName(event.eventType);\n const method = prettifyEventAction(event.eventType);\n\n if (name.startsWith(\"Stagehand\")) {\n return prettifyFormatMethodCall(\"Stagehand\", method, data.params);\n }\n\n if (name.startsWith(\"Page\")) {\n return prettifyFormatMethodCall(\"Page\", method, data.params);\n }\n\n if (name.startsWith(\"Understudy\")) {\n const args = [\n data.target,\n ...(Array.isArray(data.params) ? data.params : []),\n ].filter((entry) => entry !== undefined);\n return prettifyFormatMethodCall(\"Understudy\", method, args);\n }\n\n if (name.startsWith(\"Agent\")) {\n return `โท Agent.execute(${prettifyFormatEventArgs(data.params)})`;\n }\n\n return `${event.eventType}(${prettifyFormatEventArgs(data.params ?? event.data)})`;\n}\n\n// Formats the details section for completed/error events.\nfunction prettifyFormatCompletedDetails(event: FlowEvent): string {\n const duration = prettifyFormatDuration(event.data.durationMs);\n const prefix = prettifyIsAgentEvent(event)\n ? \"Agent.execute() completed\"\n : `${prettifyEventAction(event.eventType).toUpperCase() || event.eventType} completed`;\n const message =\n prettifyIsErrorEvent(event) && typeof event.data.error === \"string\"\n ? ` ERROR ${event.data.error}`\n : \"\";\n return `${prettifyIsErrorEvent(event) ? \"โ\" : \"โ\"} ${prefix}${duration ? ` in ${duration}` : \"\"}${message}`;\n}\n\n// Formats CDP request/response/message details. These are rendered differently from normal Stagehand lifecycle events because they represent transport-level traffic rather than method envelopes.\nfunction prettifyFormatCdpDetails(event: FlowEvent): string {\n const data = event.data as {\n method?: string;\n params?: unknown;\n result?: unknown;\n error?: string;\n };\n const method = data.method ?? \"unknown\";\n const icon = event.eventType === \"CdpCallEvent\" ? \"โต\" : \"โด\";\n let payload: unknown;\n if (event.eventType === \"CdpCallEvent\") {\n payload = data.params;\n } else if (data.error) {\n payload = { error: data.error };\n } else if (event.eventType === \"CdpMessageEvent\") {\n payload = data.params;\n } else {\n payload = data.result;\n }\n\n return `${icon} ${method}(${prettifyFormatEventArgs(payload)})`;\n}\n\n// Formats LLM request/response details for pretty logs.\nfunction prettifyFormatLlmDetails(event: FlowEvent): string {\n const data = event.data as {\n model?: string;\n prompt?: unknown;\n output?: unknown;\n inputTokens?: number;\n outputTokens?: number;\n };\n const model = data.model ?? \"llm\";\n\n if (event.eventType === \"LlmRequestEvent\") {\n const prompt = prettifySummarizePrompt(data.prompt);\n return prompt ? `${model} โด ${prompt}` : `${model} โด`;\n }\n\n const tokenInfo =\n (data.inputTokens || data.outputTokens) > 0\n ? ` ๊${data.inputTokens ?? 0} ๊${data.outputTokens ?? 0}`\n : \"\";\n const output = prettifySummarizePrompt(data.output);\n return output ? `${model} โณ${tokenInfo} ${output}` : `${model} โณ${tokenInfo}`;\n}\n\n// Converts a flow event into a single pretty log line by combining the current event payload with recent shallow ancestry fetched from the store query sink.\nexport async function prettifyEvent(\n store: Pick<EventStoreApi, \"query\">,\n event: FlowEvent,\n): Promise<string | null> {\n const recentEvents = await store.query({ limit: 500 });\n const parentMap = new Map(\n recentEvents.map((recentEvent) => [recentEvent.eventId, recentEvent]),\n );\n const tags = prettifyBuildContextTags(event, parentMap);\n\n let details = prettifyFormatStartedDetails(event);\n if (prettifyIsCdpEvent(event)) {\n details = prettifyFormatCdpDetails(event);\n } else if (prettifyIsLlmEvent(event)) {\n details = prettifyFormatLlmDetails(event);\n } else if (prettifyIsCompletedEvent(event) || prettifyIsErrorEvent(event)) {\n details = prettifyFormatCompletedDetails(event);\n }\n\n if (!details) {\n return null;\n }\n\n const createdAt = new Date(event.eventCreatedAt);\n let timestamp = prettifyFormatTimestamp(createdAt);\n if (Number.isNaN(createdAt.getTime())) {\n timestamp = prettifyFormatTimestamp(new Date());\n }\n\n const line = `${timestamp} ${tags.join(\" \")} ${details}`;\n const cleaned = prettifyRemoveQuotes(line);\n const processed = prettifyIsCdpEvent(event)\n ? truncateCdpIds(cleaned)\n : cleaned;\n return prettifyTruncateLine(processed, MAX_LINE_LENGTH);\n}\n\n// Adds subtle terminal color to stderr-only pretty lines without affecting file sinks.\nexport function prettifyColorStderrLine(line: string): string {\n if (\n process.env.NO_COLOR !== undefined ||\n (process.env.FORCE_COLOR ?? \"\") === \"0\" ||\n (!process.env.FORCE_COLOR &&\n (!process.stderr.isTTY || process.env.TERM === \"dumb\"))\n ) {\n return line;\n }\n\n const color = (code: string, value: string) =>\n `\\u001B[${code}m${value}\\u001B[0m`;\n return line\n .replace(/^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d{5})/, (_, timestamp) =>\n color(\"2\", timestamp),\n )\n .replace(/\\[([๐
ฐ๐๐๐
ป๐
ฒ])([^\\]]*)\\]/gu, (_, icon, rest) =>\n color(\n icon === \"๐
ฐ\"\n ? \"36\"\n : icon === \"๐\"\n ? \"33\"\n : icon === \"๐\"\n ? \"32\"\n : icon === \"๐
ป\"\n ? \"95\"\n : \"90\",\n `[${icon}${rest}]`,\n ),\n )\n .replace(\n / in (\\d+(?:\\.\\d+)?s)/g,\n (_, duration) => ` ${color(\"2\", \"in\")} ${color(\"2\", duration)}`,\n )\n .replace(/โท/g, color(\"96\", \"โท\"))\n .replace(/โด/g, color(\"96\", \"โด\"))\n .replace(/โณ/g, color(\"95\", \"โณ\"))\n .replace(/๊/g, color(\"33\", \"๊\"))\n .replace(/๊/g, color(\"95\", \"๊\"))\n .replace(/โฆ/g, color(\"94\", \"โฆ\"))\n .replace(/[(){}=]/g, (char) => color(\"94\", char))\n .replace(\n /([A-Za-z])(\\.)([A-Za-z])/g,\n (_, left, dot, right) => `${left}${color(\"94\", dot)}${right}`,\n )\n .replace(/ โ /g, ` ${color(\"32\", \"โ\")} `)\n .replace(/ โ /g, ` ${color(\"31\", \"โ\")} `);\n}\n"]}
|