opensteer 0.9.2 → 0.9.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.
Files changed (39) hide show
  1. package/README.md +158 -165
  2. package/dist/{chunk-HD6KVZ42.js → chunk-GEUHKPC2.js} +46 -16
  3. package/dist/chunk-GEUHKPC2.js.map +1 -0
  4. package/dist/{chunk-2TIVULZY.js → chunk-GSCQQKZZ.js} +53 -9
  5. package/dist/chunk-GSCQQKZZ.js.map +1 -0
  6. package/dist/{chunk-KPYLS2KQ.js → chunk-HQCMXRBE.js} +5 -4
  7. package/dist/chunk-HQCMXRBE.js.map +1 -0
  8. package/dist/{chunk-BMPUL66S.js → chunk-T5P2QGZ3.js} +58 -53
  9. package/dist/chunk-T5P2QGZ3.js.map +1 -0
  10. package/dist/{chunk-FIMNKEG5.js → chunk-ZRF7WMS3.js} +4 -4
  11. package/dist/{chunk-FIMNKEG5.js.map → chunk-ZRF7WMS3.js.map} +1 -1
  12. package/dist/cli/bin.cjs +160 -72
  13. package/dist/cli/bin.cjs.map +1 -1
  14. package/dist/cli/bin.js +17 -7
  15. package/dist/cli/bin.js.map +1 -1
  16. package/dist/index.cjs +149 -69
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.cts +19 -2
  19. package/dist/index.d.ts +19 -2
  20. package/dist/index.js +4 -4
  21. package/dist/local-view/public/assets/app.css +219 -55
  22. package/dist/local-view/public/assets/app.js +58 -2
  23. package/dist/local-view/public/index.html +101 -26
  24. package/dist/local-view/serve-entry.cjs +106 -57
  25. package/dist/local-view/serve-entry.cjs.map +1 -1
  26. package/dist/local-view/serve-entry.js +2 -2
  27. package/dist/opensteer-PJI7VUIT.js +6 -0
  28. package/dist/{opensteer-MIQ43CY4.js.map → opensteer-PJI7VUIT.js.map} +1 -1
  29. package/dist/{session-control-IFE3IPS3.js → session-control-M3JD7ZKA.js} +4 -4
  30. package/dist/{session-control-IFE3IPS3.js.map → session-control-M3JD7ZKA.js.map} +1 -1
  31. package/package.json +5 -5
  32. package/skills/opensteer/SKILL.md +7 -8
  33. package/skills/recorder/SKILL.md +43 -48
  34. package/dist/chunk-2TIVULZY.js.map +0 -1
  35. package/dist/chunk-BMPUL66S.js.map +0 -1
  36. package/dist/chunk-HD6KVZ42.js.map +0 -1
  37. package/dist/chunk-KPYLS2KQ.js.map +0 -1
  38. package/dist/opensteer-MIQ43CY4.js +0 -6
  39. package/skills/recorder/references/recorder-reference.md +0 -71
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../runtime-core/src/artifacts.ts","../../runtime-core/src/observation-utils.ts","../../runtime-core/src/observations.ts","../../runtime-core/src/registry.ts","../../runtime-core/src/network/saved-store.ts","../../runtime-core/src/traces.ts","../../runtime-core/src/root.ts","../../runtime-core/src/internal/engine-selection.ts","../src/local-browser/chrome-singletons.ts","../src/local-browser/profile-clone.ts","../src/local-browser/stealth-init-script.ts","../src/local-browser/stealth.ts","../src/local-browser/stealth-profiles.ts","../src/local-view/preferences.ts","../src/local-browser/dir-lock.ts","../src/local-view/service.ts","../src/local-view/registration.ts","../src/browser-manager.ts"],"names":["path","normalizeProvenance","record","randomUUID","cleared","join","readdir","getPlatformString","mkdir","rm","existsSync","writeFile","readFile","resolve","require","spawn","sleep"],"mappings":"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","file":"chunk-GSCQQKZZ.js","sourcesContent":["import path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\nimport type {\n ArtifactProvenance,\n ArtifactReference,\n ArtifactRelation,\n CookieRecord,\n DomSnapshot,\n ExternalBinaryLocation,\n HtmlSnapshot,\n OpensteerArtifact,\n OpensteerArtifactKind,\n ScriptSourceArtifactData,\n StorageSnapshot,\n TraceContext,\n} from \"@opensteer/protocol\";\n\nimport {\n encodePathSegment,\n ensureDirectory,\n filePathToUri,\n isAlreadyExistsError,\n joinStoragePath,\n normalizeNonEmptyString,\n normalizeTimestamp,\n pathExists,\n readBinaryFile,\n readJsonFile,\n resolveStoragePath,\n sha256Hex,\n writeBufferIfMissing,\n writeJsonFileExclusive,\n} from \"./internal/filesystem.js\";\nimport { canonicalJsonString, toCanonicalJsonValue } from \"./json.js\";\n\nexport type ArtifactPayloadType = \"structured\" | \"binary\";\nexport type ProtocolArtifactDelivery = \"external\" | \"inline-if-structured\";\n\nexport interface ArtifactScope extends TraceContext {}\n\nexport interface ArtifactManifest {\n readonly artifactId: string;\n readonly kind: OpensteerArtifactKind;\n readonly createdAt: number;\n readonly provenance?: ArtifactProvenance;\n readonly scope: ArtifactScope;\n readonly mediaType: string;\n readonly payloadType: ArtifactPayloadType;\n readonly byteLength: number;\n readonly sha256: string;\n readonly objectRelativePath: string;\n}\n\nexport type StructuredArtifactKind = Exclude<OpensteerArtifactKind, \"screenshot\">;\n\ninterface StructuredArtifactDataByKind {\n readonly \"html-snapshot\": HtmlSnapshot;\n readonly \"dom-snapshot\": DomSnapshot;\n readonly cookies: readonly CookieRecord[];\n readonly \"storage-snapshot\": StorageSnapshot;\n readonly \"script-source\": ScriptSourceArtifactData;\n}\n\ntype StructuredArtifactPayloadByKind = {\n [K in StructuredArtifactKind]: {\n readonly kind: K;\n readonly payloadType: \"structured\";\n readonly data: StructuredArtifactDataByKind[K];\n };\n};\n\ntype StoredArtifactPayloadByKind = {\n readonly screenshot: {\n readonly kind: \"screenshot\";\n readonly payloadType: \"binary\";\n readonly data: Uint8Array;\n };\n} & StructuredArtifactPayloadByKind;\n\nexport type StoredArtifactPayload = StoredArtifactPayloadByKind[OpensteerArtifactKind];\n\nexport interface StoredArtifactRecord {\n readonly manifest: ArtifactManifest;\n readonly payload: StoredArtifactPayload;\n}\n\ntype WriteStructuredArtifactInputByKind<K extends StructuredArtifactKind> = {\n readonly artifactId?: string;\n readonly kind: K;\n readonly createdAt?: number;\n readonly provenance?: ArtifactProvenance;\n readonly scope?: ArtifactScope;\n readonly mediaType?: string;\n readonly data: StructuredArtifactDataByKind[K];\n};\n\nexport type WriteStructuredArtifactInput = {\n [K in StructuredArtifactKind]: WriteStructuredArtifactInputByKind<K>;\n}[StructuredArtifactKind];\n\nexport interface WriteBinaryArtifactInput {\n readonly artifactId?: string;\n readonly kind: \"screenshot\";\n readonly createdAt?: number;\n readonly provenance?: ArtifactProvenance;\n readonly scope?: ArtifactScope;\n readonly mediaType: string;\n readonly data: Uint8Array;\n}\n\nexport interface OpensteerArtifactStore {\n readonly manifestsDirectory: string;\n readonly objectsDirectory: string;\n\n writeStructured(input: WriteStructuredArtifactInput): Promise<ArtifactManifest>;\n writeBinary(input: WriteBinaryArtifactInput): Promise<ArtifactManifest>;\n getManifest(artifactId: string): Promise<ArtifactManifest | undefined>;\n read(artifactId: string): Promise<StoredArtifactRecord | undefined>;\n toProtocolArtifactReference(\n artifactId: string,\n relation: ArtifactRelation,\n ): Promise<ArtifactReference | undefined>;\n toProtocolArtifact(\n artifactId: string,\n options?: {\n readonly delivery?: ProtocolArtifactDelivery;\n },\n ): Promise<OpensteerArtifact | undefined>;\n}\n\nfunction normalizeScope(scope: ArtifactScope | undefined): ArtifactScope {\n if (scope === undefined) {\n return {};\n }\n\n return {\n ...(scope.sessionRef === undefined ? {} : { sessionRef: scope.sessionRef }),\n ...(scope.pageRef === undefined ? {} : { pageRef: scope.pageRef }),\n ...(scope.frameRef === undefined ? {} : { frameRef: scope.frameRef }),\n ...(scope.documentRef === undefined ? {} : { documentRef: scope.documentRef }),\n ...(scope.documentEpoch === undefined ? {} : { documentEpoch: scope.documentEpoch }),\n };\n}\n\nfunction normalizeProvenance(\n provenance: ArtifactProvenance | undefined,\n): ArtifactProvenance | undefined {\n if (provenance === undefined) {\n return undefined;\n }\n\n return {\n ...(provenance.sourceArtifactId === undefined\n ? {}\n : {\n sourceArtifactId: normalizeNonEmptyString(\n \"provenance.sourceArtifactId\",\n provenance.sourceArtifactId,\n ),\n }),\n ...(provenance.transform === undefined\n ? {}\n : { transform: normalizeNonEmptyString(\"provenance.transform\", provenance.transform) }),\n };\n}\n\nasync function readStructuredPayload<TData>(objectPath: string): Promise<TData> {\n return JSON.parse(Buffer.from(await readBinaryFile(objectPath)).toString(\"utf8\")) as TData;\n}\n\nexport class FilesystemArtifactStore implements OpensteerArtifactStore {\n readonly manifestsDirectory: string;\n readonly objectsDirectory: string;\n\n constructor(private readonly rootPath: string) {\n this.manifestsDirectory = path.join(this.rootPath, \"artifacts\", \"manifests\");\n this.objectsDirectory = path.join(this.rootPath, \"artifacts\", \"objects\", \"sha256\");\n }\n\n async initialize(): Promise<void> {\n await ensureDirectory(this.manifestsDirectory);\n await ensureDirectory(this.objectsDirectory);\n }\n\n async writeStructured(input: WriteStructuredArtifactInput): Promise<ArtifactManifest> {\n const artifactId = normalizeNonEmptyString(\n \"artifactId\",\n input.artifactId ?? `artifact:${randomUUID()}`,\n );\n const manifestPath = this.manifestPath(artifactId);\n\n const jsonData = toCanonicalJsonValue(input.data);\n const objectBytes = Buffer.from(canonicalJsonString(jsonData), \"utf8\");\n const sha256 = sha256Hex(objectBytes);\n const objectRelativePath = joinStoragePath(\"artifacts\", \"objects\", \"sha256\", sha256);\n const objectPath = resolveStoragePath(this.rootPath, objectRelativePath);\n\n await writeBufferIfMissing(objectPath, objectBytes);\n\n const provenance = normalizeProvenance(input.provenance);\n const manifest: ArtifactManifest = {\n artifactId,\n kind: input.kind,\n createdAt: normalizeTimestamp(\"createdAt\", input.createdAt ?? Date.now()),\n ...(provenance === undefined ? {} : { provenance }),\n scope: normalizeScope(input.scope),\n mediaType: input.mediaType ?? \"application/json\",\n payloadType: \"structured\",\n byteLength: objectBytes.byteLength,\n sha256,\n objectRelativePath,\n };\n\n try {\n await writeJsonFileExclusive(manifestPath, manifest);\n } catch (error) {\n if (isAlreadyExistsError(error)) {\n throw new Error(`artifact ${artifactId} already exists`);\n }\n\n throw error;\n }\n\n return manifest;\n }\n\n async writeBinary(input: WriteBinaryArtifactInput): Promise<ArtifactManifest> {\n const artifactId = normalizeNonEmptyString(\n \"artifactId\",\n input.artifactId ?? `artifact:${randomUUID()}`,\n );\n const manifestPath = this.manifestPath(artifactId);\n\n const mediaType = normalizeNonEmptyString(\"mediaType\", input.mediaType);\n const data = new Uint8Array(input.data);\n const sha256 = sha256Hex(data);\n const extension = mediaTypeExtension(mediaType);\n const objectRelativePath = joinStoragePath(\n \"artifacts\",\n \"objects\",\n \"sha256\",\n `${sha256}${extension}`,\n );\n const objectPath = resolveStoragePath(this.rootPath, objectRelativePath);\n\n await writeBufferIfMissing(objectPath, data);\n\n const provenance = normalizeProvenance(input.provenance);\n const manifest: ArtifactManifest = {\n artifactId,\n kind: input.kind,\n createdAt: normalizeTimestamp(\"createdAt\", input.createdAt ?? Date.now()),\n ...(provenance === undefined ? {} : { provenance }),\n scope: normalizeScope(input.scope),\n mediaType,\n payloadType: \"binary\",\n byteLength: data.byteLength,\n sha256,\n objectRelativePath,\n };\n\n try {\n await writeJsonFileExclusive(manifestPath, manifest);\n } catch (error) {\n if (isAlreadyExistsError(error)) {\n throw new Error(`artifact ${artifactId} already exists`);\n }\n\n throw error;\n }\n\n return manifest;\n }\n\n async getManifest(artifactId: string): Promise<ArtifactManifest | undefined> {\n const manifestPath = this.manifestPath(artifactId);\n if (!(await pathExists(manifestPath))) {\n return undefined;\n }\n\n return readJsonFile<ArtifactManifest>(manifestPath);\n }\n\n async read(artifactId: string): Promise<StoredArtifactRecord | undefined> {\n const manifest = await this.getManifest(artifactId);\n if (manifest === undefined) {\n return undefined;\n }\n\n const objectPath = resolveStoragePath(this.rootPath, manifest.objectRelativePath);\n if (manifest.kind === \"screenshot\") {\n if (manifest.payloadType !== \"binary\") {\n throw new Error(`artifact ${artifactId} has an invalid screenshot payload type`);\n }\n\n return {\n manifest,\n payload: {\n kind: \"screenshot\",\n payloadType: \"binary\",\n data: await readBinaryFile(objectPath),\n },\n };\n }\n\n if (manifest.payloadType !== \"structured\") {\n throw new Error(`artifact ${artifactId} has an invalid structured payload type`);\n }\n\n switch (manifest.kind) {\n case \"html-snapshot\":\n return {\n manifest,\n payload: {\n kind: \"html-snapshot\",\n payloadType: \"structured\",\n data: await readStructuredPayload<HtmlSnapshot>(objectPath),\n },\n };\n case \"dom-snapshot\":\n return {\n manifest,\n payload: {\n kind: \"dom-snapshot\",\n payloadType: \"structured\",\n data: await readStructuredPayload<DomSnapshot>(objectPath),\n },\n };\n case \"cookies\":\n return {\n manifest,\n payload: {\n kind: \"cookies\",\n payloadType: \"structured\",\n data: await readStructuredPayload<readonly CookieRecord[]>(objectPath),\n },\n };\n case \"storage-snapshot\":\n return {\n manifest,\n payload: {\n kind: \"storage-snapshot\",\n payloadType: \"structured\",\n data: await readStructuredPayload<StorageSnapshot>(objectPath),\n },\n };\n case \"script-source\":\n return {\n manifest,\n payload: {\n kind: \"script-source\",\n payloadType: \"structured\",\n data: await readStructuredPayload<ScriptSourceArtifactData>(objectPath),\n },\n };\n }\n }\n\n async toProtocolArtifactReference(\n artifactId: string,\n relation: ArtifactRelation,\n ): Promise<ArtifactReference | undefined> {\n const manifest = await this.getManifest(artifactId);\n if (manifest === undefined) {\n return undefined;\n }\n\n return {\n artifactId: manifest.artifactId,\n kind: manifest.kind,\n relation,\n };\n }\n\n async toProtocolArtifact(\n artifactId: string,\n options: {\n readonly delivery?: ProtocolArtifactDelivery;\n } = {},\n ): Promise<OpensteerArtifact | undefined> {\n const record = await this.read(artifactId);\n if (record === undefined) {\n return undefined;\n }\n\n const delivery = options.delivery ?? \"external\";\n const externalPayload = manifestToExternalBinaryLocation(this.rootPath, record.manifest);\n\n const artifactBase = {\n artifactId: record.manifest.artifactId,\n createdAt: record.manifest.createdAt,\n ...(record.manifest.provenance === undefined\n ? {}\n : { provenance: record.manifest.provenance }),\n ...(record.manifest.scope.sessionRef === undefined\n ? {}\n : { sessionRef: record.manifest.scope.sessionRef }),\n ...(record.manifest.scope.pageRef === undefined\n ? {}\n : { pageRef: record.manifest.scope.pageRef }),\n ...(record.manifest.scope.frameRef === undefined\n ? {}\n : { frameRef: record.manifest.scope.frameRef }),\n ...(record.manifest.scope.documentRef === undefined\n ? {}\n : { documentRef: record.manifest.scope.documentRef }),\n ...(record.manifest.scope.documentEpoch === undefined\n ? {}\n : { documentEpoch: record.manifest.scope.documentEpoch }),\n };\n\n switch (record.payload.kind) {\n case \"screenshot\":\n return { ...artifactBase, kind: \"screenshot\", payload: externalPayload };\n case \"html-snapshot\":\n return {\n ...artifactBase,\n kind: \"html-snapshot\",\n payload:\n delivery === \"inline-if-structured\"\n ? { delivery: \"inline\", data: record.payload.data }\n : externalPayload,\n };\n case \"dom-snapshot\":\n return {\n ...artifactBase,\n kind: \"dom-snapshot\",\n payload:\n delivery === \"inline-if-structured\"\n ? { delivery: \"inline\", data: record.payload.data }\n : externalPayload,\n };\n case \"cookies\":\n return {\n ...artifactBase,\n kind: \"cookies\",\n payload:\n delivery === \"inline-if-structured\"\n ? { delivery: \"inline\", data: record.payload.data }\n : externalPayload,\n };\n case \"storage-snapshot\":\n return {\n ...artifactBase,\n kind: \"storage-snapshot\",\n payload:\n delivery === \"inline-if-structured\"\n ? { delivery: \"inline\", data: record.payload.data }\n : externalPayload,\n };\n case \"script-source\":\n return {\n ...artifactBase,\n kind: \"script-source\",\n payload:\n delivery === \"inline-if-structured\"\n ? { delivery: \"inline\", data: record.payload.data }\n : externalPayload,\n };\n }\n }\n\n private manifestPath(artifactId: string): string {\n return path.join(this.manifestsDirectory, `${encodePathSegment(artifactId)}.json`);\n }\n}\n\nexport function createArtifactStore(rootPath: string): FilesystemArtifactStore {\n return new FilesystemArtifactStore(rootPath);\n}\n\nexport function manifestToExternalBinaryLocation(\n rootPath: string,\n manifest: Pick<ArtifactManifest, \"objectRelativePath\" | \"mediaType\" | \"byteLength\" | \"sha256\">,\n): ExternalBinaryLocation {\n return {\n delivery: \"external\",\n uri: filePathToUri(resolveStoragePath(rootPath, manifest.objectRelativePath)),\n mimeType: manifest.mediaType,\n byteLength: manifest.byteLength,\n sha256: manifest.sha256,\n };\n}\n\nfunction mediaTypeExtension(mediaType: string): string {\n switch (mediaType) {\n case \"image/png\":\n return \".png\";\n case \"image/jpeg\":\n return \".jpeg\";\n case \"image/webp\":\n return \".webp\";\n default:\n return \"\";\n }\n}\n","import type {\n ObservationContext,\n ObservationEventError,\n ObservabilityConfig,\n ObservabilityTraceContext,\n} from \"@opensteer/protocol\";\n\nimport type { JsonValue } from \"./json.js\";\nimport { toCanonicalJsonValue } from \"./json.js\";\n\nconst REDACTED = \"[REDACTED]\";\n\nconst SENSITIVE_KEY_PATTERN =\n /(authorization|proxy[_-]?authorization|cookie|set-cookie|api[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|token|secret|password|passwd|private[_-]?key|database[_-]?url|db[_-]?url|session(?:id)?|csrf(?:token)?)/i;\n\nconst SENSITIVE_VALUE_PATTERNS = [\n /\\bsk-[A-Za-z0-9_-]{20,}\\b/g,\n /\\bAIza[0-9A-Za-z_-]{20,}\\b/g,\n /\\b(?:gh[pousr]_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,})\\b/g,\n /\\beyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\b/g,\n /\\bBearer\\s+[A-Za-z0-9._~+/=-]{16,}\\b/gi,\n];\n\ninterface RedactionState {\n readonly sensitiveKeys: ReadonlySet<string>;\n readonly sensitiveValues: readonly string[];\n}\n\nexport interface ObservationRedactor {\n redactText(value: string): string;\n redactJson(value: JsonValue | undefined): JsonValue | undefined;\n redactError(error: ObservationEventError | undefined): ObservationEventError | undefined;\n redactLabels(\n labels: Readonly<Record<string, string>> | undefined,\n ): Record<string, string> | undefined;\n redactTraceContext(\n traceContext: ObservabilityTraceContext | undefined,\n ): ObservabilityTraceContext | undefined;\n}\n\nexport function normalizeObservationContext(\n context: ObservationContext | undefined,\n): ObservationContext | undefined {\n if (context === undefined) {\n return undefined;\n }\n\n const normalized = {\n ...(context.sessionRef === undefined ? {} : { sessionRef: context.sessionRef }),\n ...(context.pageRef === undefined ? {} : { pageRef: context.pageRef }),\n ...(context.frameRef === undefined ? {} : { frameRef: context.frameRef }),\n ...(context.documentRef === undefined ? {} : { documentRef: context.documentRef }),\n ...(context.documentEpoch === undefined ? {} : { documentEpoch: context.documentEpoch }),\n } satisfies ObservationContext;\n\n return Object.keys(normalized).length === 0 ? undefined : normalized;\n}\n\nexport function createObservationRedactor(\n config: Partial<ObservabilityConfig> | undefined,\n): ObservationRedactor {\n const state = createRedactionState(config);\n\n return {\n redactText(value) {\n return redactString(value, state);\n },\n redactJson(value) {\n return value === undefined\n ? undefined\n : (redactUnknown(value, state, new WeakSet()) as JsonValue);\n },\n redactError(error) {\n if (error === undefined) {\n return undefined;\n }\n return {\n ...(error.code === undefined ? {} : { code: redactString(error.code, state) }),\n message: redactString(error.message, state),\n ...(error.retriable === undefined ? {} : { retriable: error.retriable }),\n ...(error.details === undefined\n ? {}\n : { details: toCanonicalJsonValue(redactUnknown(error.details, state, new WeakSet())) }),\n };\n },\n redactLabels(labels) {\n if (labels === undefined) {\n return undefined;\n }\n\n const next = Object.entries(labels).reduce<Record<string, string>>(\n (accumulator, [key, value]) => {\n accumulator[key] = isSensitiveKey(key, state) ? REDACTED : redactString(value, state);\n return accumulator;\n },\n {},\n );\n\n return Object.keys(next).length === 0 ? undefined : next;\n },\n redactTraceContext(traceContext) {\n if (traceContext === undefined) {\n return undefined;\n }\n\n const next = {\n ...(traceContext.traceparent === undefined\n ? {}\n : { traceparent: redactString(traceContext.traceparent, state) }),\n ...(traceContext.baggage === undefined\n ? {}\n : { baggage: redactString(traceContext.baggage, state) }),\n };\n return Object.keys(next).length === 0 ? undefined : next;\n },\n };\n}\n\nfunction createRedactionState(config: Partial<ObservabilityConfig> | undefined): RedactionState {\n return {\n sensitiveKeys: new Set(\n (config?.redaction?.sensitiveKeys ?? [])\n .map((value) => value.trim().toLowerCase())\n .filter((value) => value.length > 0),\n ),\n sensitiveValues: [\n ...new Set(\n (config?.redaction?.sensitiveValues ?? [])\n .map((value) => value.trim())\n .filter((value) => value.length > 0),\n ),\n ],\n };\n}\n\nfunction redactUnknown(value: unknown, state: RedactionState, seen: WeakSet<object>): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n\n if (typeof value === \"string\") {\n return redactString(value, state);\n }\n\n if (typeof value !== \"object\") {\n return value;\n }\n\n if (seen.has(value)) {\n return REDACTED;\n }\n seen.add(value);\n\n if (Array.isArray(value)) {\n return value.map((entry) => redactUnknown(entry, state, seen));\n }\n\n const next: Record<string, unknown> = {};\n for (const [key, nestedValue] of Object.entries(value)) {\n next[key] = isSensitiveKey(key, state) ? REDACTED : redactUnknown(nestedValue, state, seen);\n }\n return next;\n}\n\nfunction redactString(value: string, state: RedactionState): string {\n let next = value;\n\n for (const secret of state.sensitiveValues) {\n next = next.split(secret).join(REDACTED);\n }\n\n for (const pattern of SENSITIVE_VALUE_PATTERNS) {\n next = next.replace(pattern, REDACTED);\n }\n\n return redactUrlString(next, state);\n}\n\nfunction redactUrlString(value: string, state: RedactionState): string {\n let parsed: URL;\n try {\n parsed = new URL(value);\n } catch {\n return value;\n }\n\n let changed = false;\n if (parsed.username) {\n parsed.username = REDACTED;\n changed = true;\n }\n if (parsed.password) {\n parsed.password = REDACTED;\n changed = true;\n }\n\n for (const [key] of parsed.searchParams) {\n if (!isSensitiveKey(key, state)) {\n continue;\n }\n parsed.searchParams.set(key, REDACTED);\n changed = true;\n }\n\n return changed ? parsed.toString() : value;\n}\n\nfunction isSensitiveKey(key: string, state: RedactionState): boolean {\n return state.sensitiveKeys.has(key.trim().toLowerCase()) || SENSITIVE_KEY_PATTERN.test(key);\n}\n","import path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\nimport type {\n AppendObservationEventInput,\n ObservationArtifact,\n ObservationEvent,\n ObservationSession,\n ObservationSink,\n ObservabilityConfig,\n ObservabilityProfile,\n OpenObservationSessionInput,\n SessionObservationSink,\n WriteObservationArtifactInput,\n} from \"@opensteer/protocol\";\n\nimport type { ArtifactManifest, OpensteerArtifactStore } from \"./artifacts.js\";\nimport { manifestToExternalBinaryLocation } from \"./artifacts.js\";\nimport {\n encodePathSegment,\n ensureDirectory,\n listJsonFiles,\n normalizeNonEmptyString,\n normalizeTimestamp,\n pathExists,\n readJsonFile,\n writeJsonFileAtomic,\n writeJsonFileExclusive,\n withFilesystemLock,\n} from \"./internal/filesystem.js\";\nimport type { JsonValue } from \"./json.js\";\nimport { toCanonicalJsonValue } from \"./json.js\";\nimport {\n createObservationRedactor,\n normalizeObservationContext,\n type ObservationRedactor,\n} from \"./observation-utils.js\";\n\nexport interface ListObservationEventsInput {\n readonly kind?: ObservationEvent[\"kind\"];\n readonly phase?: ObservationEvent[\"phase\"];\n readonly correlationId?: string;\n readonly pageRef?: string;\n readonly afterSequence?: number;\n readonly from?: number;\n readonly to?: number;\n readonly limit?: number;\n}\n\nexport interface ListObservationArtifactsInput {\n readonly kind?: ObservationArtifact[\"kind\"];\n readonly pageRef?: string;\n readonly limit?: number;\n}\n\nexport interface FilesystemObservationStore extends ObservationSink {\n readonly sessionsDirectory: string;\n\n initialize(): Promise<void>;\n getSession(sessionId: string): Promise<ObservationSession | undefined>;\n listEvents(\n sessionId: string,\n input?: ListObservationEventsInput,\n ): Promise<readonly ObservationEvent[]>;\n listArtifacts(\n sessionId: string,\n input?: ListObservationArtifactsInput,\n ): Promise<readonly ObservationArtifact[]>;\n getArtifact(sessionId: string, artifactId: string): Promise<ObservationArtifact | undefined>;\n}\n\ninterface NormalizedObservabilityConfig extends ObservabilityConfig {\n readonly profile: ObservabilityProfile;\n}\n\nexport function normalizeObservabilityConfig(\n input: Partial<ObservabilityConfig> | undefined,\n): NormalizedObservabilityConfig {\n const profile = input?.profile ?? \"diagnostic\";\n const labels =\n input?.labels === undefined\n ? undefined\n : Object.entries(input.labels).reduce<Record<string, string>>((accumulator, [key, value]) => {\n const normalizedKey = key.trim();\n const normalizedValue = value.trim();\n if (normalizedKey.length === 0 || normalizedValue.length === 0) {\n return accumulator;\n }\n if (Object.keys(accumulator).length >= 20) {\n return accumulator;\n }\n accumulator[normalizedKey] = normalizedValue;\n return accumulator;\n }, {});\n const redaction =\n input?.redaction === undefined\n ? undefined\n : {\n ...(input.redaction.sensitiveKeys === undefined\n ? {}\n : {\n sensitiveKeys: input.redaction.sensitiveKeys\n .map((value) => value.trim())\n .filter((value) => value.length > 0),\n }),\n ...(input.redaction.sensitiveValues === undefined\n ? {}\n : {\n sensitiveValues: input.redaction.sensitiveValues\n .map((value) => value.trim())\n .filter((value) => value.length > 0),\n }),\n };\n\n return {\n profile,\n ...(labels === undefined || Object.keys(labels).length === 0 ? {} : { labels }),\n ...(input?.traceContext === undefined\n ? {}\n : {\n traceContext: {\n ...(input.traceContext.traceparent === undefined\n ? {}\n : { traceparent: input.traceContext.traceparent.trim() }),\n ...(input.traceContext.baggage === undefined\n ? {}\n : { baggage: input.traceContext.baggage.trim() }),\n },\n }),\n ...(redaction === undefined ? {} : { redaction }),\n };\n}\n\nfunction eventFileName(sequence: number): string {\n return `${String(sequence).padStart(12, \"0\")}.json`;\n}\n\nclass FilesystemSessionSink implements SessionObservationSink {\n constructor(\n private readonly store: FilesystemObservationStoreImpl,\n readonly sessionId: string,\n ) {}\n\n append(input: AppendObservationEventInput): Promise<ObservationEvent> {\n return this.store.appendEvent(this.sessionId, input);\n }\n\n appendBatch(input: readonly AppendObservationEventInput[]): Promise<readonly ObservationEvent[]> {\n return this.store.appendEvents(this.sessionId, input);\n }\n\n writeArtifact(input: WriteObservationArtifactInput): Promise<ObservationArtifact> {\n return this.store.writeArtifact(this.sessionId, input);\n }\n\n async flush(): Promise<void> {}\n\n close(reason?: string): Promise<void> {\n return this.store.closeSession(this.sessionId, reason);\n }\n}\n\nclass FilesystemObservationStoreImpl implements FilesystemObservationStore {\n readonly sessionsDirectory: string;\n private readonly redactors = new Map<string, ObservationRedactor>();\n\n constructor(\n private readonly rootPath: string,\n private readonly artifacts: OpensteerArtifactStore,\n ) {\n this.sessionsDirectory = path.join(this.rootPath, \"observations\", \"sessions\");\n }\n\n async initialize(): Promise<void> {\n await ensureDirectory(this.sessionsDirectory);\n }\n\n async openSession(input: OpenObservationSessionInput): Promise<SessionObservationSink> {\n const sessionId = normalizeNonEmptyString(\"sessionId\", input.sessionId);\n const openedAt = normalizeTimestamp(\"openedAt\", input.openedAt ?? Date.now());\n const config = normalizeObservabilityConfig(input.config);\n const redactor = createObservationRedactor(config);\n this.redactors.set(sessionId, redactor);\n const redactedLabels = redactor.redactLabels(config.labels);\n const redactedTraceContext = redactor.redactTraceContext(config.traceContext);\n\n await withFilesystemLock(this.sessionLockPath(sessionId), async () => {\n const existing = await this.reconcileSessionManifest(sessionId);\n if (existing === undefined) {\n await ensureDirectory(this.sessionEventsDirectory(sessionId));\n await ensureDirectory(this.sessionArtifactsDirectory(sessionId));\n const session: ObservationSession = {\n sessionId,\n profile: config.profile,\n ...(redactedLabels === undefined ? {} : { labels: redactedLabels }),\n ...(redactedTraceContext === undefined ? {} : { traceContext: redactedTraceContext }),\n openedAt,\n updatedAt: openedAt,\n currentSequence: 0,\n eventCount: 0,\n artifactCount: 0,\n };\n await writeJsonFileExclusive(this.sessionManifestPath(sessionId), session);\n return;\n }\n\n const patched: ObservationSession = {\n ...existing,\n profile: config.profile,\n ...(redactedLabels === undefined ? {} : { labels: redactedLabels }),\n ...(redactedTraceContext === undefined ? {} : { traceContext: redactedTraceContext }),\n updatedAt: Math.max(existing.updatedAt, openedAt),\n };\n await writeJsonFileAtomic(this.sessionManifestPath(sessionId), patched);\n });\n\n return new FilesystemSessionSink(this, sessionId);\n }\n\n async getSession(sessionId: string): Promise<ObservationSession | undefined> {\n const manifestPath = this.sessionManifestPath(sessionId);\n if (!(await pathExists(manifestPath))) {\n return undefined;\n }\n\n return readJsonFile<ObservationSession>(manifestPath);\n }\n\n async appendEvent(\n sessionId: string,\n input: AppendObservationEventInput,\n ): Promise<ObservationEvent> {\n const [event] = await this.appendEvents(sessionId, [input]);\n if (event === undefined) {\n throw new Error(`failed to append observation event for session ${sessionId}`);\n }\n return event;\n }\n\n async appendEvents(\n sessionId: string,\n input: readonly AppendObservationEventInput[],\n ): Promise<readonly ObservationEvent[]> {\n if (input.length === 0) {\n return [];\n }\n\n return withFilesystemLock(this.sessionLockPath(sessionId), async () => {\n const session = await this.reconcileSessionManifest(sessionId);\n if (session === undefined) {\n throw new Error(`observation session ${sessionId} was not found`);\n }\n const redactor = this.redactors.get(sessionId) ?? createObservationRedactor(undefined);\n\n const events: ObservationEvent[] = [];\n let sequence = session.currentSequence;\n let updatedAt = session.updatedAt;\n\n for (const raw of input) {\n sequence += 1;\n const createdAt = normalizeTimestamp(\"createdAt\", raw.createdAt);\n const context = normalizeObservationContext(raw.context);\n const redactedData =\n raw.data === undefined ? undefined : redactor.redactJson(toCanonicalJsonValue(raw.data));\n const redactedError = redactor.redactError(raw.error);\n const event: ObservationEvent = {\n eventId: normalizeNonEmptyString(\n \"eventId\",\n raw.eventId ?? `observation:${sessionId}:${String(sequence).padStart(12, \"0\")}`,\n ),\n sessionId,\n sequence,\n kind: raw.kind,\n phase: raw.phase,\n createdAt,\n correlationId: normalizeNonEmptyString(\"correlationId\", raw.correlationId),\n ...(raw.spanId === undefined\n ? {}\n : { spanId: normalizeNonEmptyString(\"spanId\", raw.spanId) }),\n ...(raw.parentSpanId === undefined\n ? {}\n : { parentSpanId: normalizeNonEmptyString(\"parentSpanId\", raw.parentSpanId) }),\n ...(context === undefined ? {} : { context }),\n ...(redactedData === undefined ? {} : { data: redactedData }),\n ...(redactedError === undefined ? {} : { error: redactedError }),\n ...(raw.artifactIds === undefined || raw.artifactIds.length === 0\n ? {}\n : { artifactIds: [...raw.artifactIds] }),\n };\n\n await writeJsonFileExclusive(\n path.join(this.sessionEventsDirectory(sessionId), eventFileName(sequence)),\n event,\n );\n updatedAt = Math.max(updatedAt, createdAt);\n events.push(event);\n }\n\n await writeJsonFileAtomic(this.sessionManifestPath(sessionId), {\n ...session,\n currentSequence: sequence,\n eventCount: session.eventCount + events.length,\n updatedAt,\n } satisfies ObservationSession);\n\n return events;\n });\n }\n\n async writeArtifact(\n sessionId: string,\n input: WriteObservationArtifactInput,\n ): Promise<ObservationArtifact> {\n return withFilesystemLock(this.sessionLockPath(sessionId), async () => {\n const session = await this.reconcileSessionManifest(sessionId);\n if (session === undefined) {\n throw new Error(`observation session ${sessionId} was not found`);\n }\n const redactor = this.redactors.get(sessionId) ?? createObservationRedactor(undefined);\n\n const createdAt = normalizeTimestamp(\"createdAt\", input.createdAt);\n const context = normalizeObservationContext(input.context);\n const redactedStorageKey =\n input.storageKey === undefined ? undefined : redactor.redactText(input.storageKey);\n const redactedMetadata =\n input.metadata === undefined\n ? undefined\n : redactor.redactJson(toCanonicalJsonValue(input.metadata));\n const artifact: ObservationArtifact = {\n artifactId: normalizeNonEmptyString(\"artifactId\", input.artifactId),\n sessionId,\n kind: input.kind,\n createdAt,\n ...(context === undefined ? {} : { context }),\n ...(input.mediaType === undefined ? {} : { mediaType: input.mediaType }),\n ...(input.byteLength === undefined ? {} : { byteLength: input.byteLength }),\n ...(input.sha256 === undefined ? {} : { sha256: input.sha256 }),\n ...(input.opensteerArtifactId === undefined\n ? {}\n : { opensteerArtifactId: input.opensteerArtifactId }),\n ...(redactedStorageKey === undefined ? {} : { storageKey: redactedStorageKey }),\n ...(redactedMetadata === undefined ? {} : { metadata: redactedMetadata }),\n };\n\n const artifactPath = this.sessionArtifactPath(sessionId, artifact.artifactId);\n if (!(await pathExists(artifactPath))) {\n await writeJsonFileExclusive(artifactPath, artifact);\n await writeJsonFileAtomic(this.sessionManifestPath(sessionId), {\n ...session,\n artifactCount: session.artifactCount + 1,\n updatedAt: Math.max(session.updatedAt, createdAt),\n } satisfies ObservationSession);\n }\n\n return artifact;\n });\n }\n\n async listEvents(\n sessionId: string,\n input: ListObservationEventsInput = {},\n ): Promise<readonly ObservationEvent[]> {\n const directoryPath = this.sessionEventsDirectory(sessionId);\n if (!(await pathExists(directoryPath))) {\n return [];\n }\n\n const files = await listJsonFiles(directoryPath);\n const events = await Promise.all(\n files.map((fileName) => readJsonFile<ObservationEvent>(path.join(directoryPath, fileName))),\n );\n const filtered = events.filter((event) => {\n if (input.kind !== undefined && event.kind !== input.kind) return false;\n if (input.phase !== undefined && event.phase !== input.phase) return false;\n if (input.correlationId !== undefined && event.correlationId !== input.correlationId) {\n return false;\n }\n if (input.pageRef !== undefined && event.context?.pageRef !== input.pageRef) return false;\n if (input.afterSequence !== undefined && event.sequence <= input.afterSequence) return false;\n if (input.from !== undefined && event.createdAt < input.from) return false;\n if (input.to !== undefined && event.createdAt > input.to) return false;\n return true;\n });\n\n if (input.limit === undefined || filtered.length <= input.limit) {\n return filtered;\n }\n return filtered.slice(-input.limit);\n }\n\n async listArtifacts(\n sessionId: string,\n input: ListObservationArtifactsInput = {},\n ): Promise<readonly ObservationArtifact[]> {\n const directoryPath = this.sessionArtifactsDirectory(sessionId);\n if (!(await pathExists(directoryPath))) {\n return [];\n }\n\n const files = await listJsonFiles(directoryPath);\n const artifacts = await Promise.all(\n files.map((fileName) =>\n readJsonFile<ObservationArtifact>(path.join(directoryPath, fileName)),\n ),\n );\n const filtered = artifacts.filter((artifact) => {\n if (input.kind !== undefined && artifact.kind !== input.kind) return false;\n if (input.pageRef !== undefined && artifact.context?.pageRef !== input.pageRef) return false;\n return true;\n });\n if (input.limit === undefined || filtered.length <= input.limit) {\n return filtered;\n }\n return filtered.slice(-input.limit);\n }\n\n async getArtifact(\n sessionId: string,\n artifactId: string,\n ): Promise<ObservationArtifact | undefined> {\n const artifactPath = this.sessionArtifactPath(sessionId, artifactId);\n if (!(await pathExists(artifactPath))) {\n return undefined;\n }\n return readJsonFile<ObservationArtifact>(artifactPath);\n }\n\n async closeSession(sessionId: string, _reason?: string): Promise<void> {\n await withFilesystemLock(this.sessionLockPath(sessionId), async () => {\n const session = await this.reconcileSessionManifest(sessionId);\n if (session === undefined || session.closedAt !== undefined) {\n return;\n }\n\n const now = Date.now();\n await writeJsonFileAtomic(this.sessionManifestPath(sessionId), {\n ...session,\n updatedAt: Math.max(session.updatedAt, now),\n closedAt: now,\n } satisfies ObservationSession);\n });\n this.redactors.delete(sessionId);\n }\n\n async writeArtifactFromManifest(\n sessionId: string,\n manifest: ArtifactManifest,\n kind: ObservationArtifact[\"kind\"],\n metadata?: JsonValue,\n ): Promise<ObservationArtifact> {\n return this.writeArtifact(sessionId, {\n artifactId: manifest.artifactId,\n kind,\n createdAt: manifest.createdAt,\n context: manifest.scope,\n mediaType: manifest.mediaType,\n byteLength: manifest.byteLength,\n sha256: manifest.sha256,\n opensteerArtifactId: manifest.artifactId,\n storageKey: manifestToExternalBinaryLocation(this.rootPath, manifest).uri,\n ...(metadata === undefined ? {} : { metadata }),\n });\n }\n\n async ensureArtifactLinked(\n sessionId: string,\n manifest: ArtifactManifest,\n ): Promise<ObservationArtifact> {\n const existing = await this.getArtifact(sessionId, manifest.artifactId);\n if (existing !== undefined) {\n return existing;\n }\n\n const kind = toObservationArtifactKind(manifest.kind);\n return this.writeArtifactFromManifest(sessionId, manifest, kind);\n }\n\n async hydrateArtifactManifests(\n artifactIds: readonly string[],\n ): Promise<readonly ArtifactManifest[]> {\n return (\n await Promise.all(\n artifactIds.map(async (artifactId) => this.artifacts.getManifest(artifactId)),\n )\n ).filter((value): value is ArtifactManifest => value !== undefined);\n }\n\n private sessionDirectory(sessionId: string): string {\n return path.join(this.sessionsDirectory, encodePathSegment(sessionId));\n }\n\n private sessionManifestPath(sessionId: string): string {\n return path.join(this.sessionDirectory(sessionId), \"session.json\");\n }\n\n private sessionEventsDirectory(sessionId: string): string {\n return path.join(this.sessionDirectory(sessionId), \"events\");\n }\n\n private sessionArtifactsDirectory(sessionId: string): string {\n return path.join(this.sessionDirectory(sessionId), \"artifacts\");\n }\n\n private sessionArtifactPath(sessionId: string, artifactId: string): string {\n return path.join(\n this.sessionArtifactsDirectory(sessionId),\n `${encodePathSegment(artifactId)}.json`,\n );\n }\n\n private sessionLockPath(sessionId: string): string {\n return path.join(this.sessionDirectory(sessionId), \".lock\");\n }\n\n private async reconcileSessionManifest(\n sessionId: string,\n ): Promise<ObservationSession | undefined> {\n const session = await this.getSession(sessionId);\n if (session === undefined) {\n return undefined;\n }\n\n const [hasEventDirectory, hasArtifactDirectory] = await Promise.all([\n pathExists(this.sessionEventsDirectory(sessionId)),\n pathExists(this.sessionArtifactsDirectory(sessionId)),\n ]);\n const [eventFiles, artifactFiles] = await Promise.all([\n hasEventDirectory\n ? listJsonFiles(this.sessionEventsDirectory(sessionId))\n : Promise.resolve([]),\n hasArtifactDirectory\n ? listJsonFiles(this.sessionArtifactsDirectory(sessionId))\n : Promise.resolve([]),\n ]);\n\n const currentSequence = eventFiles.reduce((maxSequence, fileName) => {\n const parsed = Number.parseInt(fileName.replace(/\\.json$/u, \"\"), 10);\n return Number.isFinite(parsed) ? Math.max(maxSequence, parsed) : maxSequence;\n }, 0);\n const eventCount = eventFiles.length;\n const artifactCount = artifactFiles.length;\n\n if (\n session.currentSequence === currentSequence &&\n session.eventCount === eventCount &&\n session.artifactCount === artifactCount\n ) {\n return session;\n }\n\n const [events, artifacts] = await Promise.all([\n Promise.all(\n eventFiles.map((fileName) =>\n readJsonFile<ObservationEvent>(\n path.join(this.sessionEventsDirectory(sessionId), fileName),\n ),\n ),\n ),\n Promise.all(\n artifactFiles.map((fileName) =>\n readJsonFile<ObservationArtifact>(\n path.join(this.sessionArtifactsDirectory(sessionId), fileName),\n ),\n ),\n ),\n ]);\n\n const updatedAt = Math.max(\n session.openedAt,\n session.closedAt ?? 0,\n ...events.map((event) => event.createdAt),\n ...artifacts.map((artifact) => artifact.createdAt),\n );\n const reconciled: ObservationSession = {\n ...session,\n currentSequence,\n eventCount,\n artifactCount,\n updatedAt,\n };\n await writeJsonFileAtomic(this.sessionManifestPath(sessionId), reconciled);\n return reconciled;\n }\n}\n\nfunction toObservationArtifactKind(kind: ArtifactManifest[\"kind\"]): ObservationArtifact[\"kind\"] {\n switch (kind) {\n case \"screenshot\":\n return \"screenshot\";\n case \"dom-snapshot\":\n return \"dom-snapshot\";\n case \"html-snapshot\":\n return \"html-snapshot\";\n default:\n return \"other\";\n }\n}\n\nexport function createObservationStore(\n rootPath: string,\n artifacts: OpensteerArtifactStore,\n): FilesystemObservationStore {\n return new FilesystemObservationStoreImpl(rootPath, artifacts);\n}\n","import path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\nimport {\n type OpensteerInteractionTracePayload,\n type OpensteerRequestPlanFreshness,\n type OpensteerRequestPlanPayload,\n} from \"@opensteer/protocol\";\n\nimport {\n encodePathSegment,\n ensureDirectory,\n isAlreadyExistsError,\n listJsonFiles,\n normalizeNonEmptyString,\n normalizeTimestamp,\n pathExists,\n readJsonFile,\n sha256Hex,\n withFilesystemLock,\n writeJsonFileAtomic,\n writeJsonFileExclusive,\n} from \"./internal/filesystem.js\";\nimport { canonicalJsonString, type JsonValue } from \"./json.js\";\n\nexport interface RegistryProvenance {\n readonly source: string;\n readonly sourceId?: string;\n readonly capturedAt?: number;\n readonly notes?: string;\n}\n\nexport interface RegistryRecord<TPayload = JsonValue> {\n readonly id: string;\n readonly key: string;\n readonly version: string;\n readonly createdAt: number;\n readonly updatedAt: number;\n readonly contentHash: string;\n readonly tags: readonly string[];\n readonly provenance?: RegistryProvenance;\n readonly payload: TPayload;\n}\n\nexport type DescriptorRecord = RegistryRecord;\nexport type InteractionTraceRecord = RegistryRecord<OpensteerInteractionTracePayload>;\n\nexport type RequestPlanFreshness = OpensteerRequestPlanFreshness;\n\nexport interface RequestPlanRecord extends RegistryRecord<OpensteerRequestPlanPayload> {\n readonly freshness?: RequestPlanFreshness;\n}\n\nexport interface ResolveRegistryRecordInput {\n readonly key: string;\n readonly version?: string;\n}\n\nexport interface WriteDescriptorInput<TPayload = JsonValue> {\n readonly id?: string;\n readonly key: string;\n readonly version: string;\n readonly createdAt?: number;\n readonly updatedAt?: number;\n readonly tags?: readonly string[];\n readonly provenance?: RegistryProvenance;\n readonly payload: TPayload;\n}\n\nexport interface WriteRequestPlanInput extends WriteDescriptorInput<OpensteerRequestPlanPayload> {\n readonly freshness?: RequestPlanFreshness;\n}\nexport interface WriteInteractionTraceInput extends WriteDescriptorInput<OpensteerInteractionTracePayload> {}\n\nexport interface ListRegistryRecordsInput {\n readonly key?: string;\n}\n\nexport interface UpdateRequestPlanFreshnessInput {\n readonly id: string;\n readonly updatedAt?: number;\n readonly freshness?: RequestPlanFreshness;\n}\n\nexport interface DescriptorRegistryStore {\n readonly recordsDirectory: string;\n readonly indexesDirectory: string;\n\n write(input: WriteDescriptorInput): Promise<DescriptorRecord>;\n getById(id: string): Promise<DescriptorRecord | undefined>;\n list(input?: ListRegistryRecordsInput): Promise<readonly DescriptorRecord[]>;\n resolve(input: ResolveRegistryRecordInput): Promise<DescriptorRecord | undefined>;\n}\n\nexport interface RequestPlanRegistryStore {\n readonly recordsDirectory: string;\n readonly indexesDirectory: string;\n\n write(input: WriteRequestPlanInput): Promise<RequestPlanRecord>;\n getById(id: string): Promise<RequestPlanRecord | undefined>;\n list(input?: ListRegistryRecordsInput): Promise<readonly RequestPlanRecord[]>;\n resolve(input: ResolveRegistryRecordInput): Promise<RequestPlanRecord | undefined>;\n updateFreshness(input: UpdateRequestPlanFreshnessInput): Promise<RequestPlanRecord>;\n}\n\nexport interface InteractionTraceRegistryStore {\n readonly recordsDirectory: string;\n readonly indexesDirectory: string;\n\n write(input: WriteInteractionTraceInput): Promise<InteractionTraceRecord>;\n getById(id: string): Promise<InteractionTraceRecord | undefined>;\n list(input?: ListRegistryRecordsInput): Promise<readonly InteractionTraceRecord[]>;\n resolve(input: ResolveRegistryRecordInput): Promise<InteractionTraceRecord | undefined>;\n}\n\nfunction normalizeTags(tags: readonly string[] | undefined): readonly string[] {\n if (tags === undefined) {\n return [];\n }\n\n return Array.from(new Set(tags.map((tag) => normalizeNonEmptyString(\"tag\", tag)))).sort(\n (left, right) => left.localeCompare(right),\n );\n}\n\nfunction normalizeProvenance(\n provenance: RegistryProvenance | undefined,\n): RegistryProvenance | undefined {\n if (provenance === undefined) {\n return undefined;\n }\n\n return {\n source: normalizeNonEmptyString(\"provenance.source\", provenance.source),\n ...(provenance.sourceId === undefined\n ? {}\n : { sourceId: normalizeNonEmptyString(\"provenance.sourceId\", provenance.sourceId) }),\n ...(provenance.capturedAt === undefined\n ? {}\n : { capturedAt: normalizeTimestamp(\"provenance.capturedAt\", provenance.capturedAt) }),\n ...(provenance.notes === undefined\n ? {}\n : { notes: normalizeNonEmptyString(\"provenance.notes\", provenance.notes) }),\n };\n}\n\nfunction normalizeFreshness(\n freshness: RequestPlanFreshness | undefined,\n): RequestPlanFreshness | undefined {\n if (freshness === undefined) {\n return undefined;\n }\n\n return {\n ...(freshness.lastValidatedAt === undefined\n ? {}\n : {\n lastValidatedAt: normalizeTimestamp(\n \"freshness.lastValidatedAt\",\n freshness.lastValidatedAt,\n ),\n }),\n ...(freshness.staleAt === undefined\n ? {}\n : { staleAt: normalizeTimestamp(\"freshness.staleAt\", freshness.staleAt) }),\n ...(freshness.expiresAt === undefined\n ? {}\n : { expiresAt: normalizeTimestamp(\"freshness.expiresAt\", freshness.expiresAt) }),\n };\n}\n\nfunction compareByCreatedAtAndId(\n left: Pick<RegistryRecord<unknown>, \"createdAt\" | \"id\">,\n right: Pick<RegistryRecord<unknown>, \"createdAt\" | \"id\">,\n): number {\n if (left.createdAt !== right.createdAt) {\n return right.createdAt - left.createdAt;\n }\n\n return left.id.localeCompare(right.id);\n}\n\nabstract class FilesystemRegistryStore<TRecord extends RegistryRecord<unknown>> {\n readonly recordsDirectory: string;\n readonly indexesDirectory: string;\n\n protected constructor(\n rootPath: string,\n private readonly registryRelativePath: readonly string[],\n ) {\n const basePath = path.join(rootPath, ...registryRelativePath);\n this.recordsDirectory = path.join(basePath, \"records\");\n this.indexesDirectory = path.join(basePath, \"indexes\", \"by-key\");\n }\n\n async initialize(): Promise<void> {\n await ensureDirectory(this.recordsDirectory);\n await ensureDirectory(this.indexesDirectory);\n }\n\n async getById(id: string): Promise<TRecord | undefined> {\n const recordPath = this.recordPath(id);\n if (!(await pathExists(recordPath))) {\n return undefined;\n }\n\n return readJsonFile<TRecord>(recordPath);\n }\n\n async resolve(input: ResolveRegistryRecordInput): Promise<TRecord | undefined> {\n const key = normalizeNonEmptyString(\"key\", input.key);\n if (input.version !== undefined) {\n return this.resolveIndexedRecord(key, normalizeNonEmptyString(\"version\", input.version));\n }\n\n const matches = (await this.readAllRecords()).filter((record) => record.key === key);\n matches.sort(compareByCreatedAtAndId);\n return matches[0];\n }\n\n protected async writeRecord(record: TRecord): Promise<TRecord> {\n return withFilesystemLock(this.writeLockPath(), async () => {\n if ((await this.getById(record.id)) !== undefined) {\n throw new Error(`registry record ${record.id} already exists`);\n }\n\n const indexPath = this.indexPath(record.key, record.version);\n if (await pathExists(indexPath)) {\n const indexedRecord = await readJsonFile<{ readonly id: string }>(indexPath);\n throw new Error(\n `registry record ${record.key}@${record.version} already exists as ${indexedRecord.id}`,\n );\n }\n\n const exactMatch = await this.findExactRecord(record.key, record.version);\n if (exactMatch !== undefined) {\n throw new Error(\n `registry record ${record.key}@${record.version} already exists as ${exactMatch.id}`,\n );\n }\n\n try {\n await writeJsonFileExclusive(this.recordPath(record.id), record);\n } catch (error) {\n if (isAlreadyExistsError(error)) {\n throw new Error(`registry record ${record.id} already exists`);\n }\n\n throw error;\n }\n\n try {\n await writeJsonFileExclusive(indexPath, {\n id: record.id,\n });\n } catch (error) {\n if (isAlreadyExistsError(error)) {\n throw new Error(`registry record ${record.key}@${record.version} already exists`);\n }\n\n throw error;\n }\n\n return record;\n });\n }\n\n protected readAllRecords(): Promise<readonly TRecord[]> {\n return this.readRecordsFromDirectory();\n }\n\n protected async readRecordsFromDirectory(): Promise<readonly TRecord[]> {\n const files = await listJsonFiles(this.recordsDirectory);\n const records = await Promise.all(\n files.map((fileName) => readJsonFile<TRecord>(path.join(this.recordsDirectory, fileName))),\n );\n records.sort(compareByCreatedAtAndId);\n return records;\n }\n\n private async findExactRecord(key: string, version: string): Promise<TRecord | undefined> {\n const records = await this.readAllRecords();\n return records.find((record) => record.key === key && record.version === version);\n }\n\n private async resolveIndexedRecord(key: string, version: string): Promise<TRecord | undefined> {\n const indexPath = this.indexPath(key, version);\n if (!(await pathExists(indexPath))) {\n const exactMatches = (await this.readAllRecords()).filter(\n (record) => record.key === key && record.version === version,\n );\n if (exactMatches.length <= 1) {\n return exactMatches[0];\n }\n\n throw new Error(\n `registry contains multiple records for ${key}@${version} without an index entry`,\n );\n }\n\n const indexedRecord = await readJsonFile<{ readonly id: string }>(indexPath);\n const record = await this.getById(indexedRecord.id);\n if (record === undefined) {\n throw new Error(\n `registry index ${key}@${version} points to missing record ${indexedRecord.id}`,\n );\n }\n\n return record;\n }\n\n protected recordPath(id: string): string {\n return path.join(this.recordsDirectory, `${encodePathSegment(id)}.json`);\n }\n\n protected indexPath(key: string, version: string): string {\n return path.join(\n this.indexesDirectory,\n encodePathSegment(key),\n `${encodePathSegment(version)}.json`,\n );\n }\n\n protected writeLockPath(): string {\n return path.join(path.dirname(this.recordsDirectory), \".write.lock\");\n }\n}\n\nexport class FilesystemDescriptorRegistry\n extends FilesystemRegistryStore<DescriptorRecord>\n implements DescriptorRegistryStore\n{\n constructor(rootPath: string) {\n super(rootPath, [\"registry\", \"descriptors\"]);\n }\n\n async write(input: WriteDescriptorInput): Promise<DescriptorRecord> {\n const id = normalizeNonEmptyString(\"id\", input.id ?? `descriptor:${randomUUID()}`);\n const key = normalizeNonEmptyString(\"key\", input.key);\n const version = normalizeNonEmptyString(\"version\", input.version);\n const createdAt = normalizeTimestamp(\"createdAt\", input.createdAt ?? Date.now());\n const updatedAt = normalizeTimestamp(\"updatedAt\", input.updatedAt ?? createdAt);\n\n if (updatedAt < createdAt) {\n throw new RangeError(\"updatedAt must be greater than or equal to createdAt\");\n }\n\n const payload = input.payload;\n const contentHash = sha256Hex(Buffer.from(canonicalJsonString(payload), \"utf8\"));\n const provenance = normalizeProvenance(input.provenance);\n const record: DescriptorRecord = {\n id,\n key,\n version,\n createdAt,\n updatedAt,\n contentHash,\n tags: normalizeTags(input.tags),\n ...(provenance === undefined ? {} : { provenance }),\n payload,\n };\n\n return this.writeRecord(record);\n }\n\n async list(input: ListRegistryRecordsInput = {}): Promise<readonly DescriptorRecord[]> {\n const key = input.key === undefined ? undefined : normalizeNonEmptyString(\"key\", input.key);\n const records = await this.readAllRecords();\n return key === undefined ? records : records.filter((record) => record.key === key);\n }\n}\n\nexport class FilesystemRequestPlanRegistry\n extends FilesystemRegistryStore<RequestPlanRecord>\n implements RequestPlanRegistryStore\n{\n constructor(rootPath: string) {\n super(rootPath, [\"registry\", \"request-plans\"]);\n }\n\n async write(input: WriteRequestPlanInput): Promise<RequestPlanRecord> {\n const id = normalizeNonEmptyString(\"id\", input.id ?? `request-plan:${randomUUID()}`);\n const key = normalizeNonEmptyString(\"key\", input.key);\n const version = normalizeNonEmptyString(\"version\", input.version);\n const createdAt = normalizeTimestamp(\"createdAt\", input.createdAt ?? Date.now());\n const updatedAt = normalizeTimestamp(\"updatedAt\", input.updatedAt ?? createdAt);\n\n if (updatedAt < createdAt) {\n throw new RangeError(\"updatedAt must be greater than or equal to createdAt\");\n }\n\n const payload = input.payload;\n const contentHash = sha256Hex(Buffer.from(canonicalJsonString(payload), \"utf8\"));\n const provenance = normalizeProvenance(input.provenance);\n const freshness = normalizeFreshness(input.freshness);\n const record: RequestPlanRecord = {\n id,\n key,\n version,\n createdAt,\n updatedAt,\n contentHash,\n tags: normalizeTags(input.tags),\n ...(provenance === undefined ? {} : { provenance }),\n payload,\n ...(freshness === undefined ? {} : { freshness }),\n };\n\n return this.writeRecord(record);\n }\n\n async list(input: ListRegistryRecordsInput = {}): Promise<readonly RequestPlanRecord[]> {\n const key = input.key === undefined ? undefined : normalizeNonEmptyString(\"key\", input.key);\n const records = await this.readAllRecords();\n return key === undefined ? records : records.filter((record) => record.key === key);\n }\n\n async updateFreshness(input: UpdateRequestPlanFreshnessInput): Promise<RequestPlanRecord> {\n const id = normalizeNonEmptyString(\"id\", input.id);\n\n return withFilesystemLock(this.writeLockPath(), async () => {\n const existing = await this.getById(id);\n if (existing === undefined) {\n throw new Error(`registry record ${id} was not found`);\n }\n\n const nextFreshness = normalizeFreshness(input.freshness ?? existing.freshness);\n const nextUpdatedAt = normalizeTimestamp(\n \"updatedAt\",\n input.updatedAt ?? Math.max(Date.now(), existing.updatedAt),\n );\n if (nextUpdatedAt < existing.createdAt) {\n throw new RangeError(\"updatedAt must be greater than or equal to createdAt\");\n }\n\n const nextRecord: RequestPlanRecord = {\n ...existing,\n updatedAt: nextUpdatedAt,\n ...(nextFreshness === undefined ? {} : { freshness: nextFreshness }),\n };\n\n await writeJsonFileAtomic(this.recordPath(id), nextRecord);\n return nextRecord;\n });\n }\n}\n\nexport class FilesystemInteractionTraceRegistry\n extends FilesystemRegistryStore<InteractionTraceRecord>\n implements InteractionTraceRegistryStore\n{\n constructor(rootPath: string) {\n super(rootPath, [\"registry\", \"interaction-traces\"]);\n }\n\n async write(input: WriteInteractionTraceInput): Promise<InteractionTraceRecord> {\n const id = normalizeNonEmptyString(\"id\", input.id ?? `interaction-trace:${randomUUID()}`);\n const key = normalizeNonEmptyString(\"key\", input.key);\n const version = normalizeNonEmptyString(\"version\", input.version);\n const createdAt = normalizeTimestamp(\"createdAt\", input.createdAt ?? Date.now());\n const updatedAt = normalizeTimestamp(\"updatedAt\", input.updatedAt ?? createdAt);\n\n if (updatedAt < createdAt) {\n throw new RangeError(\"updatedAt must be greater than or equal to createdAt\");\n }\n\n const payload = input.payload;\n const contentHash = sha256Hex(Buffer.from(canonicalJsonString(payload), \"utf8\"));\n const provenance = normalizeProvenance(input.provenance);\n const record: InteractionTraceRecord = {\n id,\n key,\n version,\n createdAt,\n updatedAt,\n contentHash,\n tags: normalizeTags(input.tags),\n ...(provenance === undefined ? {} : { provenance }),\n payload,\n };\n\n return this.writeRecord(record);\n }\n\n async list(input: ListRegistryRecordsInput = {}): Promise<readonly InteractionTraceRecord[]> {\n const key = input.key === undefined ? undefined : normalizeNonEmptyString(\"key\", input.key);\n const records = await this.readAllRecords();\n return key === undefined ? records : records.filter((record) => record.key === key);\n }\n}\n\nexport function createDescriptorRegistry(rootPath: string): FilesystemDescriptorRegistry {\n return new FilesystemDescriptorRegistry(rootPath);\n}\n\nexport function createRequestPlanRegistry(rootPath: string): FilesystemRequestPlanRegistry {\n return new FilesystemRequestPlanRegistry(rootPath);\n}\n\nexport function createInteractionTraceRegistry(\n rootPath: string,\n): FilesystemInteractionTraceRegistry {\n return new FilesystemInteractionTraceRegistry(rootPath);\n}\n","import path from \"node:path\";\nimport type { DatabaseSync as NodeSqliteDatabaseSync } from \"node:sqlite\";\n\nimport type { NetworkQueryRecord, NetworkResourceType } from \"@opensteer/protocol\";\n\nimport { ensureDirectory } from \"../internal/filesystem.js\";\n\nconst TAG_DELIMITER = \"\\u001f\";\nconst NODE_SQLITE_SPECIFIER = `node:${\"sqlite\"}`;\nconst SAVED_NETWORK_SQLITE_SUPPORT_ERROR =\n \"Saved-network operations require Node's built-in SQLite support. Use a Node runtime with node:sqlite enabled.\";\n\nexport interface SavedNetworkQueryInput {\n readonly pageRef?: NetworkQueryRecord[\"record\"][\"pageRef\"];\n readonly recordId?: string;\n readonly requestId?: string;\n readonly capture?: string;\n readonly tag?: string;\n readonly url?: string;\n readonly hostname?: string;\n readonly path?: string;\n readonly method?: string;\n readonly status?: string | number;\n readonly resourceType?: NetworkResourceType;\n readonly includeBodies?: boolean;\n readonly limit?: number;\n}\n\nexport type SavedNetworkBodyWriteMode = \"authoritative\" | \"metadata-only\";\n\nexport interface SavedNetworkSaveOptions {\n readonly bodyWriteMode: SavedNetworkBodyWriteMode;\n readonly tag?: string;\n}\n\nexport interface SavedNetworkStore {\n readonly databasePath: string;\n\n initialize(): Promise<void>;\n save(records: readonly NetworkQueryRecord[], options: SavedNetworkSaveOptions): Promise<number>;\n tagByFilter(filter: SavedNetworkQueryInput, tag: string): Promise<number>;\n query(input?: SavedNetworkQueryInput): Promise<readonly NetworkQueryRecord[]>;\n getByRecordId(\n recordId: string,\n options?: { readonly includeBodies?: boolean },\n ): Promise<NetworkQueryRecord | undefined>;\n clear(input?: { readonly capture?: string; readonly tag?: string }): Promise<number>;\n}\n\nexport interface IterateSavedNetworkRecordBatchesOptions {\n readonly batchSize?: number;\n readonly includeBodies?: boolean;\n}\n\ntype SavedNetworkRow = {\n readonly record_id: string;\n readonly request_id: string;\n readonly session_ref: string;\n readonly page_ref: string | null;\n readonly frame_ref: string | null;\n readonly document_ref: string | null;\n readonly capture: string | null;\n readonly method: string;\n readonly url: string;\n readonly hostname: string;\n readonly path: string;\n readonly status: number | null;\n readonly status_text: string | null;\n readonly resource_type: string;\n readonly navigation_request: number;\n readonly request_headers_json: string;\n readonly response_headers_json: string;\n readonly request_body_json: string | null;\n readonly response_body_json: string | null;\n readonly initiator_json: string | null;\n readonly timing_json: string | null;\n readonly transfer_json: string | null;\n readonly source_json: string | null;\n readonly capture_state: string;\n readonly request_body_state: string;\n readonly response_body_state: string;\n readonly request_body_skip_reason: string | null;\n readonly response_body_skip_reason: string | null;\n readonly request_body_error: string | null;\n readonly response_body_error: string | null;\n readonly redirect_from_request_id: string | null;\n readonly redirect_to_request_id: string | null;\n readonly saved_at: number;\n readonly tags: string | null;\n};\n\nclass SqliteSavedNetworkStore implements SavedNetworkStore {\n readonly databasePath: string;\n\n private database: NodeSqliteDatabaseSync | undefined;\n private directoryInitialization: Promise<void> | undefined;\n private databaseInitialization: Promise<NodeSqliteDatabaseSync> | undefined;\n\n constructor(rootPath: string) {\n this.databasePath = path.join(rootPath, \"registry\", \"saved-network.sqlite\");\n }\n\n async initialize(): Promise<void> {\n await this.ensureDatabaseDirectory();\n }\n\n async save(\n records: readonly NetworkQueryRecord[],\n options: SavedNetworkSaveOptions,\n ): Promise<number> {\n const database = await this.requireDatabase();\n const upsertRecord = database.prepare(buildSavedNetworkUpsertSql(options.bodyWriteMode));\n const insertTag = database.prepare(`\n INSERT OR IGNORE INTO saved_network_tags (record_id, tag)\n VALUES (@record_id, @tag)\n `);\n\n return withSqliteTransaction(database, () => {\n let savedCount = 0;\n for (const entry of records) {\n const url = new URL(entry.record.url);\n const pageRefKey = entry.record.pageRef ?? \"\";\n upsertRecord.run({\n record_id: entry.recordId,\n request_id: entry.record.requestId,\n session_ref: entry.record.sessionRef,\n page_ref: entry.record.pageRef ?? null,\n page_ref_key: pageRefKey,\n frame_ref: entry.record.frameRef ?? null,\n document_ref: entry.record.documentRef ?? null,\n capture: entry.capture ?? null,\n method: entry.record.method,\n method_lc: entry.record.method.toLowerCase(),\n url: entry.record.url,\n url_lc: entry.record.url.toLowerCase(),\n hostname: url.hostname,\n hostname_lc: url.hostname.toLowerCase(),\n path: url.pathname,\n path_lc: url.pathname.toLowerCase(),\n status: entry.record.status ?? null,\n status_text: entry.record.statusText ?? null,\n resource_type: entry.record.resourceType,\n navigation_request: entry.record.navigationRequest ? 1 : 0,\n request_headers_json: JSON.stringify(entry.record.requestHeaders),\n response_headers_json: JSON.stringify(entry.record.responseHeaders),\n request_body_json: stringifyOptional(entry.record.requestBody),\n response_body_json: stringifyOptional(entry.record.responseBody),\n initiator_json: stringifyOptional(entry.record.initiator),\n timing_json: stringifyOptional(entry.record.timing),\n transfer_json: stringifyOptional(entry.record.transfer),\n source_json: stringifyOptional(entry.record.source),\n capture_state: entry.record.captureState ?? \"complete\",\n request_body_state:\n entry.record.requestBodyState ??\n (entry.record.requestBody === undefined ? \"skipped\" : \"complete\"),\n response_body_state:\n entry.record.responseBodyState ??\n (entry.record.responseBody === undefined ? \"skipped\" : \"complete\"),\n request_body_skip_reason: entry.record.requestBodySkipReason ?? null,\n response_body_skip_reason: entry.record.responseBodySkipReason ?? null,\n request_body_error: entry.record.requestBodyError ?? null,\n response_body_error: entry.record.responseBodyError ?? null,\n redirect_from_request_id: entry.record.redirectFromRequestId ?? null,\n redirect_to_request_id: entry.record.redirectToRequestId ?? null,\n saved_at: entry.savedAt ?? Date.now(),\n });\n\n const tags = new Set<string>(entry.tags ?? []);\n if (options.tag !== undefined) {\n tags.add(options.tag);\n }\n for (const currentTag of tags) {\n const result = insertTag.run({\n record_id: entry.recordId,\n tag: currentTag,\n }) as { readonly changes?: number };\n savedCount += result.changes ?? 0;\n }\n }\n return savedCount;\n });\n }\n\n async tagByFilter(filter: SavedNetworkQueryInput, tag: string): Promise<number> {\n const database = await this.requireDatabase();\n const { whereSql, parameters } = buildSavedNetworkWhere(filter);\n const selectRecords = database.prepare(\n `\n SELECT r.record_id\n FROM saved_network_records r\n ${whereSql}\n `,\n );\n const insertTag = database.prepare(`\n INSERT OR IGNORE INTO saved_network_tags (record_id, tag)\n VALUES (@record_id, @tag)\n `);\n\n return withSqliteTransaction(database, () => {\n let taggedCount = 0;\n const rows = selectRecords.all(\n ...(parameters as readonly (string | number | null | Uint8Array)[]),\n );\n for (const row of rows) {\n const recordId = row.record_id;\n if (typeof recordId !== \"string\") {\n continue;\n }\n const result = insertTag.run({\n record_id: recordId,\n tag,\n }) as { readonly changes?: number };\n taggedCount += result.changes ?? 0;\n }\n return taggedCount;\n });\n }\n\n async query(input: SavedNetworkQueryInput = {}): Promise<readonly NetworkQueryRecord[]> {\n const database = await this.requireDatabase();\n const limit = Math.max(1, Math.min(input.limit ?? 50, 1000));\n const { whereSql, parameters } = buildSavedNetworkWhere(input);\n const rows = database\n .prepare(\n `\n SELECT\n r.*,\n GROUP_CONCAT(t.tag, '${TAG_DELIMITER}') AS tags\n FROM saved_network_records r\n LEFT JOIN saved_network_tags t\n ON t.record_id = r.record_id\n ${whereSql}\n GROUP BY r.record_id\n ORDER BY r.saved_at DESC, r.record_id ASC\n LIMIT ?\n `,\n )\n .all(\n ...(parameters as readonly (string | number | null | Uint8Array)[]),\n limit,\n ) as SavedNetworkRow[];\n\n return rows.map((row) => inflateSavedNetworkRow(row, input.includeBodies ?? false));\n }\n\n async getByRecordId(\n recordId: string,\n options: { readonly includeBodies?: boolean } = {},\n ): Promise<NetworkQueryRecord | undefined> {\n const [record] = await this.query({\n recordId,\n ...(options.includeBodies === undefined ? {} : { includeBodies: options.includeBodies }),\n limit: 1,\n });\n return record;\n }\n\n async clear(input: { readonly capture?: string; readonly tag?: string } = {}): Promise<number> {\n const database = await this.requireDatabase();\n const countAll = database.prepare(`SELECT COUNT(*) AS cleared FROM saved_network_records`);\n const deleteAllRecords = database.prepare(`DELETE FROM saved_network_records`);\n const { whereSql, parameters } = buildSavedNetworkWhere(input);\n const countFiltered = database.prepare(`\n SELECT COUNT(*) AS cleared\n FROM saved_network_records r\n ${whereSql}\n `);\n const deleteFiltered = database.prepare(`\n DELETE FROM saved_network_records\n WHERE record_id IN (\n SELECT r.record_id\n FROM saved_network_records r\n ${whereSql}\n )\n `);\n\n return withSqliteTransaction(database, () => {\n if (input.capture === undefined && input.tag === undefined) {\n const cleared = (countAll.get() as { readonly cleared: number }).cleared;\n deleteAllRecords.run();\n return cleared;\n }\n const args = parameters as readonly (string | number | null | Uint8Array)[];\n const cleared = (countFiltered.get(...args) as { readonly cleared: number }).cleared;\n deleteFiltered.run(...args);\n return cleared;\n });\n }\n\n async *iterateBatches(\n options: IterateSavedNetworkRecordBatchesOptions = {},\n ): AsyncGenerator<readonly NetworkQueryRecord[]> {\n const database = await this.requireDatabase();\n const batchSize = Math.max(1, Math.min(options.batchSize ?? 500, 1000));\n let cursor:\n | {\n readonly savedAt: number;\n readonly recordId: string;\n }\n | undefined;\n\n while (true) {\n const rows = database\n .prepare(\n `\n SELECT\n r.*,\n GROUP_CONCAT(t.tag, '${TAG_DELIMITER}') AS tags\n FROM saved_network_records r\n LEFT JOIN saved_network_tags t\n ON t.record_id = r.record_id\n ${cursor === undefined ? \"\" : \"WHERE r.saved_at > ? OR (r.saved_at = ? AND r.record_id > ?)\"}\n GROUP BY r.record_id\n ORDER BY r.saved_at ASC, r.record_id ASC\n LIMIT ?\n `,\n )\n .all(\n ...(cursor === undefined ? [] : [cursor.savedAt, cursor.savedAt, cursor.recordId]),\n batchSize,\n ) as SavedNetworkRow[];\n\n if (rows.length === 0) {\n return;\n }\n\n yield rows.map((row) => inflateSavedNetworkRow(row, options.includeBodies ?? true));\n\n const lastRow = rows.at(-1);\n if (lastRow === undefined) {\n return;\n }\n cursor = {\n savedAt: lastRow.saved_at,\n recordId: lastRow.record_id,\n };\n }\n }\n\n close(): void {\n if (this.database !== undefined) {\n closeSqliteDatabase(this.database);\n this.database = undefined;\n this.databaseInitialization = undefined;\n }\n }\n\n private async requireDatabase(): Promise<NodeSqliteDatabaseSync> {\n if (this.database) {\n return this.database;\n }\n this.databaseInitialization ??= this.openDatabase();\n try {\n return await this.databaseInitialization;\n } catch (error) {\n this.databaseInitialization = undefined;\n throw error;\n }\n }\n\n private async openDatabase(): Promise<NodeSqliteDatabaseSync> {\n await this.ensureDatabaseDirectory();\n\n let DatabaseSync: typeof import(\"node:sqlite\").DatabaseSync;\n try {\n ({ DatabaseSync } = await import(NODE_SQLITE_SPECIFIER));\n } catch (error) {\n throw normalizeSqliteImportError(error);\n }\n\n const database = new DatabaseSync(this.databasePath);\n try {\n this.configureDatabase(database);\n this.database = database;\n return database;\n } catch (error) {\n closeSqliteDatabase(database);\n throw error;\n }\n }\n\n private async ensureDatabaseDirectory(): Promise<void> {\n this.directoryInitialization ??= ensureDirectory(path.dirname(this.databasePath)).catch(\n (error) => {\n this.directoryInitialization = undefined;\n throw error;\n },\n );\n await this.directoryInitialization;\n }\n\n private configureDatabase(database: NodeSqliteDatabaseSync): void {\n database.exec(\"PRAGMA journal_mode = WAL\");\n database.exec(\"PRAGMA foreign_keys = ON\");\n database.exec(`\n CREATE TABLE IF NOT EXISTS saved_network_records (\n record_id TEXT PRIMARY KEY,\n request_id TEXT NOT NULL,\n session_ref TEXT NOT NULL,\n page_ref TEXT,\n page_ref_key TEXT NOT NULL,\n frame_ref TEXT,\n document_ref TEXT,\n capture TEXT,\n method TEXT NOT NULL,\n method_lc TEXT NOT NULL,\n url TEXT NOT NULL,\n url_lc TEXT NOT NULL,\n hostname TEXT NOT NULL,\n hostname_lc TEXT NOT NULL,\n path TEXT NOT NULL,\n path_lc TEXT NOT NULL,\n status INTEGER,\n status_text TEXT,\n resource_type TEXT NOT NULL,\n navigation_request INTEGER NOT NULL,\n request_headers_json TEXT NOT NULL,\n response_headers_json TEXT NOT NULL,\n request_body_json TEXT,\n response_body_json TEXT,\n initiator_json TEXT,\n timing_json TEXT,\n transfer_json TEXT,\n source_json TEXT,\n capture_state TEXT NOT NULL,\n request_body_state TEXT NOT NULL,\n response_body_state TEXT NOT NULL,\n request_body_skip_reason TEXT,\n response_body_skip_reason TEXT,\n request_body_error TEXT,\n response_body_error TEXT,\n redirect_from_request_id TEXT,\n redirect_to_request_id TEXT,\n saved_at INTEGER NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS saved_network_tags (\n record_id TEXT NOT NULL REFERENCES saved_network_records(record_id) ON DELETE CASCADE,\n tag TEXT NOT NULL,\n PRIMARY KEY (record_id, tag)\n );\n\n CREATE INDEX IF NOT EXISTS saved_network_tags_tag\n ON saved_network_tags (tag);\n `);\n database.exec(`DROP INDEX IF EXISTS saved_network_records_scope_request`);\n database.exec(`\n CREATE INDEX IF NOT EXISTS saved_network_records_scope_request\n ON saved_network_records (session_ref, page_ref_key, request_id)\n `);\n database.exec(`\n CREATE INDEX IF NOT EXISTS saved_network_records_saved_at\n ON saved_network_records (saved_at DESC)\n `);\n database.exec(`\n CREATE INDEX IF NOT EXISTS saved_network_records_capture\n ON saved_network_records (capture)\n `);\n this.ensureColumn(\n database,\n \"saved_network_records\",\n \"capture_state\",\n \"TEXT NOT NULL DEFAULT 'complete'\",\n );\n this.ensureColumn(database, \"saved_network_records\", \"capture\", \"TEXT\");\n this.ensureColumn(\n database,\n \"saved_network_records\",\n \"request_body_state\",\n \"TEXT NOT NULL DEFAULT 'skipped'\",\n );\n this.ensureColumn(\n database,\n \"saved_network_records\",\n \"response_body_state\",\n \"TEXT NOT NULL DEFAULT 'skipped'\",\n );\n this.ensureColumn(database, \"saved_network_records\", \"request_body_skip_reason\", \"TEXT\");\n this.ensureColumn(database, \"saved_network_records\", \"response_body_skip_reason\", \"TEXT\");\n this.ensureColumn(database, \"saved_network_records\", \"request_body_error\", \"TEXT\");\n this.ensureColumn(database, \"saved_network_records\", \"response_body_error\", \"TEXT\");\n }\n\n private ensureColumn(\n database: NodeSqliteDatabaseSync,\n table: string,\n column: string,\n definition: string,\n ): void {\n const rows = database.prepare(`PRAGMA table_info(${table})`).all() as ReadonlyArray<{\n readonly name?: string;\n }>;\n if (rows.some((row) => row.name === column)) {\n return;\n }\n database.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);\n }\n}\n\nfunction buildSavedNetworkWhere(input: SavedNetworkQueryInput): {\n readonly whereSql: string;\n readonly parameters: readonly unknown[];\n} {\n const clauses: string[] = [];\n const parameters: unknown[] = [];\n\n if (input.pageRef !== undefined) {\n clauses.push(\"r.page_ref_key = ?\");\n parameters.push(input.pageRef);\n }\n if (input.recordId !== undefined) {\n clauses.push(\"r.record_id = ?\");\n parameters.push(input.recordId);\n }\n if (input.requestId !== undefined) {\n clauses.push(\"r.request_id = ?\");\n parameters.push(input.requestId);\n }\n if (input.capture !== undefined) {\n clauses.push(\"r.capture = ?\");\n parameters.push(input.capture);\n }\n if (input.tag !== undefined) {\n clauses.push(`\n EXISTS (\n SELECT 1\n FROM saved_network_tags exact_tag\n WHERE exact_tag.record_id = r.record_id\n AND exact_tag.tag = ?\n )\n `);\n parameters.push(input.tag);\n }\n if (input.url !== undefined) {\n clauses.push(\"instr(r.url_lc, ?) > 0\");\n parameters.push(input.url.toLowerCase());\n }\n if (input.hostname !== undefined) {\n clauses.push(\"instr(r.hostname_lc, ?) > 0\");\n parameters.push(input.hostname.toLowerCase());\n }\n if (input.path !== undefined) {\n clauses.push(\"instr(r.path_lc, ?) > 0\");\n parameters.push(input.path.toLowerCase());\n }\n if (input.method !== undefined) {\n clauses.push(\"instr(r.method_lc, ?) > 0\");\n parameters.push(input.method.toLowerCase());\n }\n if (input.status !== undefined) {\n clauses.push(\"instr(lower(COALESCE(CAST(r.status AS TEXT), '')), ?) > 0\");\n parameters.push(String(input.status).toLowerCase());\n }\n if (input.resourceType !== undefined) {\n clauses.push(\"r.resource_type = ?\");\n parameters.push(input.resourceType);\n }\n\n return {\n whereSql: clauses.length === 0 ? \"\" : `WHERE ${clauses.join(\" AND \")}`,\n parameters,\n };\n}\n\nfunction buildSavedNetworkUpsertSql(bodyWriteMode: SavedNetworkBodyWriteMode): string {\n const bodyUpdateSql =\n bodyWriteMode === \"authoritative\"\n ? `\n request_body_json = excluded.request_body_json,\n response_body_json = excluded.response_body_json,\n request_body_state = excluded.request_body_state,\n response_body_state = excluded.response_body_state,\n request_body_skip_reason = excluded.request_body_skip_reason,\n response_body_skip_reason = excluded.response_body_skip_reason,\n request_body_error = excluded.request_body_error,\n response_body_error = excluded.response_body_error,\n`\n : \"\";\n\n return `\n INSERT INTO saved_network_records (\n record_id,\n request_id,\n session_ref,\n page_ref,\n page_ref_key,\n frame_ref,\n document_ref,\n capture,\n method,\n method_lc,\n url,\n url_lc,\n hostname,\n hostname_lc,\n path,\n path_lc,\n status,\n status_text,\n resource_type,\n navigation_request,\n request_headers_json,\n response_headers_json,\n request_body_json,\n response_body_json,\n initiator_json,\n timing_json,\n transfer_json,\n source_json,\n capture_state,\n request_body_state,\n response_body_state,\n request_body_skip_reason,\n response_body_skip_reason,\n request_body_error,\n response_body_error,\n redirect_from_request_id,\n redirect_to_request_id,\n saved_at\n ) VALUES (\n @record_id,\n @request_id,\n @session_ref,\n @page_ref,\n @page_ref_key,\n @frame_ref,\n @document_ref,\n @capture,\n @method,\n @method_lc,\n @url,\n @url_lc,\n @hostname,\n @hostname_lc,\n @path,\n @path_lc,\n @status,\n @status_text,\n @resource_type,\n @navigation_request,\n @request_headers_json,\n @response_headers_json,\n @request_body_json,\n @response_body_json,\n @initiator_json,\n @timing_json,\n @transfer_json,\n @source_json,\n @capture_state,\n @request_body_state,\n @response_body_state,\n @request_body_skip_reason,\n @response_body_skip_reason,\n @request_body_error,\n @response_body_error,\n @redirect_from_request_id,\n @redirect_to_request_id,\n @saved_at\n )\n ON CONFLICT(record_id) DO UPDATE SET\n page_ref = excluded.page_ref,\n page_ref_key = excluded.page_ref_key,\n frame_ref = excluded.frame_ref,\n document_ref = excluded.document_ref,\n capture = excluded.capture,\n method = excluded.method,\n method_lc = excluded.method_lc,\n url = excluded.url,\n url_lc = excluded.url_lc,\n hostname = excluded.hostname,\n hostname_lc = excluded.hostname_lc,\n path = excluded.path,\n path_lc = excluded.path_lc,\n status = excluded.status,\n status_text = excluded.status_text,\n resource_type = excluded.resource_type,\n navigation_request = excluded.navigation_request,\n request_headers_json = excluded.request_headers_json,\n response_headers_json = excluded.response_headers_json,\n${bodyUpdateSql} initiator_json = excluded.initiator_json,\n timing_json = excluded.timing_json,\n transfer_json = excluded.transfer_json,\n source_json = excluded.source_json,\n capture_state = excluded.capture_state,\n redirect_from_request_id = excluded.redirect_from_request_id,\n redirect_to_request_id = excluded.redirect_to_request_id,\n saved_at = MIN(saved_network_records.saved_at, excluded.saved_at)\n `;\n}\n\nfunction inflateSavedNetworkRow(row: SavedNetworkRow, includeBodies: boolean): NetworkQueryRecord {\n const requestBody =\n includeBodies && row.request_body_json !== null ? JSON.parse(row.request_body_json) : undefined;\n const responseBody =\n includeBodies && row.response_body_json !== null\n ? JSON.parse(row.response_body_json)\n : undefined;\n\n const record = {\n kind: \"http\",\n requestId: row.request_id as NetworkQueryRecord[\"record\"][\"requestId\"],\n sessionRef: row.session_ref as NetworkQueryRecord[\"record\"][\"sessionRef\"],\n method: row.method,\n url: row.url,\n requestHeaders: JSON.parse(row.request_headers_json),\n responseHeaders: JSON.parse(row.response_headers_json),\n resourceType: row.resource_type as NetworkResourceType,\n navigationRequest: row.navigation_request === 1,\n captureState: row.capture_state as NetworkQueryRecord[\"record\"][\"captureState\"],\n requestBodyState: row.request_body_state as NetworkQueryRecord[\"record\"][\"requestBodyState\"],\n responseBodyState: row.response_body_state as NetworkQueryRecord[\"record\"][\"responseBodyState\"],\n } as Mutable<NetworkQueryRecord[\"record\"]>;\n if (row.page_ref !== null) {\n record.pageRef = row.page_ref as NonNullable<NetworkQueryRecord[\"record\"][\"pageRef\"]>;\n }\n if (row.frame_ref !== null) {\n record.frameRef = row.frame_ref as NonNullable<NetworkQueryRecord[\"record\"][\"frameRef\"]>;\n }\n if (row.document_ref !== null) {\n record.documentRef = row.document_ref as NonNullable<\n NetworkQueryRecord[\"record\"][\"documentRef\"]\n >;\n }\n if (row.status !== null) {\n record.status = row.status;\n }\n if (row.status_text !== null) {\n record.statusText = row.status_text;\n }\n if (row.redirect_from_request_id !== null) {\n record.redirectFromRequestId =\n row.redirect_from_request_id as NetworkQueryRecord[\"record\"][\"requestId\"];\n }\n if (row.redirect_to_request_id !== null) {\n record.redirectToRequestId =\n row.redirect_to_request_id as NetworkQueryRecord[\"record\"][\"requestId\"];\n }\n if (row.initiator_json !== null) {\n record.initiator = JSON.parse(row.initiator_json);\n }\n if (row.timing_json !== null) {\n record.timing = JSON.parse(row.timing_json);\n }\n if (row.transfer_json !== null) {\n record.transfer = JSON.parse(row.transfer_json);\n }\n if (row.source_json !== null) {\n record.source = JSON.parse(row.source_json);\n }\n if (row.request_body_skip_reason !== null) {\n record.requestBodySkipReason = row.request_body_skip_reason;\n }\n if (row.response_body_skip_reason !== null) {\n record.responseBodySkipReason = row.response_body_skip_reason;\n }\n if (row.request_body_error !== null) {\n record.requestBodyError = row.request_body_error;\n }\n if (row.response_body_error !== null) {\n record.responseBodyError = row.response_body_error;\n }\n if (requestBody !== undefined) {\n record.requestBody = requestBody;\n }\n if (responseBody !== undefined) {\n record.responseBody = responseBody;\n }\n\n return {\n recordId: row.record_id,\n ...(row.capture === null ? {} : { capture: row.capture }),\n ...(row.tags === null || row.tags.length === 0\n ? {}\n : { tags: row.tags.split(TAG_DELIMITER).filter((tag) => tag.length > 0) }),\n savedAt: row.saved_at,\n record: record as NetworkQueryRecord[\"record\"],\n };\n}\n\nfunction stringifyOptional(value: unknown): string | null {\n return value === undefined ? null : JSON.stringify(value);\n}\n\nfunction normalizeSqliteImportError(error: unknown): Error {\n if (\n error instanceof Error &&\n (error as NodeJS.ErrnoException).code === \"ERR_UNKNOWN_BUILTIN_MODULE\" &&\n error.message.includes(NODE_SQLITE_SPECIFIER)\n ) {\n return new Error(SAVED_NETWORK_SQLITE_SUPPORT_ERROR, {\n cause: error,\n });\n }\n\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction closeSqliteDatabase(database: NodeSqliteDatabaseSync): void {\n try {\n database.close();\n } catch {}\n}\n\ntype Mutable<T> = {\n -readonly [K in keyof T]: T[K];\n};\n\nfunction withSqliteTransaction<T>(database: NodeSqliteDatabaseSync, task: () => T): T {\n database.exec(\"BEGIN IMMEDIATE\");\n try {\n const result = task();\n database.exec(\"COMMIT\");\n return result;\n } catch (error) {\n database.exec(\"ROLLBACK\");\n throw error;\n }\n}\n\nexport function createSavedNetworkStore(rootPath: string): SavedNetworkStore {\n return new SqliteSavedNetworkStore(rootPath);\n}\n\nexport async function* iterateSavedNetworkRecordBatches(\n rootPath: string,\n options: IterateSavedNetworkRecordBatchesOptions = {},\n): AsyncGenerator<readonly NetworkQueryRecord[]> {\n const store = new SqliteSavedNetworkStore(rootPath);\n try {\n yield* store.iterateBatches(options);\n } finally {\n store.close();\n }\n}\n","import path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\nimport type {\n ArtifactReference,\n OpensteerError,\n OpensteerEvent,\n TraceBundle,\n TraceContext,\n TraceOutcome,\n TraceRecord,\n} from \"@opensteer/protocol\";\n\nimport type { OpensteerArtifactStore, ProtocolArtifactDelivery } from \"./artifacts.js\";\nimport {\n ensureDirectory,\n isAlreadyExistsError,\n listJsonFiles,\n normalizeNonEmptyString,\n normalizeTimestamp,\n pathExists,\n readJsonFile,\n writeJsonFileAtomic,\n writeJsonFileExclusive,\n withFilesystemLock,\n} from \"./internal/filesystem.js\";\nimport type { JsonValue } from \"./json.js\";\n\nexport interface TraceRunManifest {\n readonly runId: string;\n readonly createdAt: number;\n readonly updatedAt: number;\n readonly entryCount: number;\n}\n\nexport interface CreateTraceRunInput {\n readonly runId?: string;\n readonly createdAt?: number;\n}\n\nexport interface AppendTraceEntryInput<TData extends JsonValue = JsonValue> {\n readonly traceId?: string;\n readonly stepId?: string;\n readonly operation: string;\n readonly outcome: TraceOutcome;\n readonly startedAt: number;\n readonly completedAt: number;\n readonly context?: TraceContext;\n readonly events?: readonly OpensteerEvent[];\n readonly artifacts?: readonly ArtifactReference[];\n readonly data?: TData;\n readonly error?: OpensteerError;\n}\n\nexport interface TraceEntryRecord<TData extends JsonValue = JsonValue> {\n readonly runId: string;\n readonly sequence: number;\n readonly traceId: string;\n readonly stepId: string;\n readonly operation: string;\n readonly outcome: TraceOutcome;\n readonly startedAt: number;\n readonly completedAt: number;\n readonly durationMs: number;\n readonly context: TraceContext;\n readonly events: readonly OpensteerEvent[];\n readonly artifacts?: readonly ArtifactReference[];\n readonly data?: TData;\n readonly error?: OpensteerError;\n}\n\nexport interface OpensteerTraceStore {\n readonly runsDirectory: string;\n\n createRun(input?: CreateTraceRunInput): Promise<TraceRunManifest>;\n getRun(runId: string): Promise<TraceRunManifest | undefined>;\n append<TData extends JsonValue>(\n runId: string,\n input: AppendTraceEntryInput<TData>,\n ): Promise<TraceEntryRecord<TData>>;\n listEntries(runId: string): Promise<readonly TraceEntryRecord[]>;\n getEntry(runId: string, traceId: string): Promise<TraceEntryRecord | undefined>;\n toProtocolTraceRecord<TData extends JsonValue>(\n entry: TraceEntryRecord<TData>,\n ): TraceRecord<TData>;\n readProtocolTraceBundle(\n runId: string,\n traceId: string,\n options?: {\n readonly artifactDelivery?: ProtocolArtifactDelivery;\n },\n ): Promise<TraceBundle | undefined>;\n}\n\nfunction normalizeContext(context: TraceContext | undefined): TraceContext {\n return {\n ...(context?.sessionRef === undefined ? {} : { sessionRef: context.sessionRef }),\n ...(context?.pageRef === undefined ? {} : { pageRef: context.pageRef }),\n ...(context?.frameRef === undefined ? {} : { frameRef: context.frameRef }),\n ...(context?.documentRef === undefined ? {} : { documentRef: context.documentRef }),\n ...(context?.documentEpoch === undefined ? {} : { documentEpoch: context.documentEpoch }),\n };\n}\n\nfunction sequenceFileName(sequence: number): string {\n return `${String(sequence).padStart(12, \"0\")}.json`;\n}\n\nexport class FilesystemTraceStore implements OpensteerTraceStore {\n readonly runsDirectory: string;\n\n constructor(\n private readonly rootPath: string,\n private readonly artifacts: OpensteerArtifactStore,\n ) {\n this.runsDirectory = path.join(this.rootPath, \"traces\", \"runs\");\n }\n\n async initialize(): Promise<void> {\n await ensureDirectory(this.runsDirectory);\n }\n\n async createRun(input: CreateTraceRunInput = {}): Promise<TraceRunManifest> {\n const runId = normalizeNonEmptyString(\"runId\", input.runId ?? `run:${randomUUID()}`);\n const manifestPath = this.runManifestPath(runId);\n const createdAt = normalizeTimestamp(\"createdAt\", input.createdAt ?? Date.now());\n const manifest: TraceRunManifest = {\n runId,\n createdAt,\n updatedAt: createdAt,\n entryCount: 0,\n };\n\n await ensureDirectory(this.runEntriesDirectory(runId));\n try {\n await writeJsonFileExclusive(manifestPath, manifest);\n } catch (error) {\n if (isAlreadyExistsError(error)) {\n throw new Error(`trace run ${runId} already exists`);\n }\n\n throw error;\n }\n\n return manifest;\n }\n\n async getRun(runId: string): Promise<TraceRunManifest | undefined> {\n const manifestPath = this.runManifestPath(runId);\n if (!(await pathExists(manifestPath))) {\n return undefined;\n }\n\n return readJsonFile<TraceRunManifest>(manifestPath);\n }\n\n async append<TData extends JsonValue>(\n runId: string,\n input: AppendTraceEntryInput<TData>,\n ): Promise<TraceEntryRecord<TData>> {\n const startedAt = normalizeTimestamp(\"startedAt\", input.startedAt);\n const completedAt = normalizeTimestamp(\"completedAt\", input.completedAt);\n if (completedAt < startedAt) {\n throw new RangeError(\"completedAt must be greater than or equal to startedAt\");\n }\n\n if (input.outcome === \"error\" && input.error === undefined) {\n throw new TypeError(\"error traces must include an error payload\");\n }\n if (input.outcome === \"ok\" && input.error !== undefined) {\n throw new TypeError(\"successful traces must not include an error payload\");\n }\n\n return withFilesystemLock(this.runWriteLockPath(runId), async () => {\n const manifest = await this.getRun(runId);\n if (manifest === undefined) {\n throw new Error(`trace run ${runId} was not found`);\n }\n\n const sequence = manifest.entryCount + 1;\n const traceId = normalizeNonEmptyString(\n \"traceId\",\n input.traceId ?? `trace:${runId}:${String(sequence).padStart(12, \"0\")}`,\n );\n const stepId = normalizeNonEmptyString(\n \"stepId\",\n input.stepId ?? `step:${runId}:${String(sequence).padStart(12, \"0\")}`,\n );\n\n const entry: TraceEntryRecord<TData> = {\n runId,\n sequence,\n traceId,\n stepId,\n operation: normalizeNonEmptyString(\"operation\", input.operation),\n outcome: input.outcome,\n startedAt,\n completedAt,\n durationMs: completedAt - startedAt,\n context: normalizeContext(input.context),\n events: [...(input.events ?? [])],\n ...(input.artifacts === undefined || input.artifacts.length === 0\n ? {}\n : { artifacts: [...input.artifacts] }),\n ...(input.data === undefined ? {} : { data: input.data }),\n ...(input.error === undefined ? {} : { error: input.error }),\n };\n\n await writeJsonFileExclusive(\n path.join(this.runEntriesDirectory(runId), sequenceFileName(sequence)),\n entry,\n );\n await writeJsonFileAtomic(this.runManifestPath(runId), {\n ...manifest,\n updatedAt: Math.max(manifest.updatedAt, completedAt),\n entryCount: sequence,\n } satisfies TraceRunManifest);\n\n return entry;\n });\n }\n\n async listEntries(runId: string): Promise<readonly TraceEntryRecord[]> {\n const entriesDirectory = this.runEntriesDirectory(runId);\n if (!(await pathExists(entriesDirectory))) {\n return [];\n }\n\n const files = await listJsonFiles(entriesDirectory);\n return Promise.all(\n files.map((fileName) =>\n readJsonFile<TraceEntryRecord>(path.join(entriesDirectory, fileName)),\n ),\n );\n }\n\n async getEntry(runId: string, traceId: string): Promise<TraceEntryRecord | undefined> {\n return (await this.listEntries(runId)).find((entry) => entry.traceId === traceId);\n }\n\n toProtocolTraceRecord<TData extends JsonValue>(\n entry: TraceEntryRecord<TData>,\n ): TraceRecord<TData> {\n return {\n traceId: entry.traceId,\n stepId: entry.stepId,\n operation: entry.operation,\n outcome: entry.outcome,\n startedAt: entry.startedAt,\n completedAt: entry.completedAt,\n durationMs: entry.durationMs,\n context: entry.context,\n events: entry.events,\n ...(entry.artifacts === undefined ? {} : { artifacts: entry.artifacts }),\n ...(entry.data === undefined ? {} : { data: entry.data }),\n ...(entry.error === undefined ? {} : { error: entry.error }),\n };\n }\n\n async readProtocolTraceBundle(\n runId: string,\n traceId: string,\n options: {\n readonly artifactDelivery?: ProtocolArtifactDelivery;\n } = {},\n ): Promise<TraceBundle | undefined> {\n const entry = await this.getEntry(runId, traceId);\n if (entry === undefined) {\n return undefined;\n }\n\n const trace = this.toProtocolTraceRecord(entry);\n if (entry.artifacts === undefined || entry.artifacts.length === 0) {\n return { trace };\n }\n\n const artifacts = [];\n for (const reference of entry.artifacts) {\n const artifact = await this.artifacts.toProtocolArtifact(\n reference.artifactId,\n options.artifactDelivery === undefined ? {} : { delivery: options.artifactDelivery },\n );\n if (artifact === undefined) {\n throw new Error(`trace ${traceId} references missing artifact ${reference.artifactId}`);\n }\n\n artifacts.push(artifact);\n }\n\n return { trace, artifacts };\n }\n\n private runDirectory(runId: string): string {\n return path.join(this.runsDirectory, encodeURIComponent(runId));\n }\n\n private runEntriesDirectory(runId: string): string {\n return path.join(this.runDirectory(runId), \"entries\");\n }\n\n private runManifestPath(runId: string): string {\n return path.join(this.runDirectory(runId), \"manifest.json\");\n }\n\n private runWriteLockPath(runId: string): string {\n return path.join(this.runDirectory(runId), \".append.lock\");\n }\n}\n\nexport function createTraceStore(\n rootPath: string,\n artifacts: OpensteerArtifactStore,\n): FilesystemTraceStore {\n return new FilesystemTraceStore(rootPath, artifacts);\n}\n","import path from \"node:path\";\n\nimport { createArtifactStore, type OpensteerArtifactStore } from \"./artifacts.js\";\nimport {\n encodePathSegment,\n ensureDirectory,\n normalizeTimestamp,\n pathExists,\n readJsonFile,\n withFilesystemLock,\n writeJsonFileAtomic,\n} from \"./internal/filesystem.js\";\nimport {\n createDescriptorRegistry,\n createInteractionTraceRegistry,\n createRequestPlanRegistry,\n type DescriptorRegistryStore,\n type InteractionTraceRegistryStore,\n type RequestPlanRegistryStore,\n} from \"./registry.js\";\nimport { createSavedNetworkStore, type SavedNetworkStore } from \"./network/saved-store.js\";\nimport { createObservationStore, type FilesystemObservationStore } from \"./observations.js\";\nimport { createTraceStore, type OpensteerTraceStore } from \"./traces.js\";\n\nexport const OPENSTEER_FILESYSTEM_WORKSPACE_LAYOUT = \"opensteer-workspace\";\nexport const OPENSTEER_FILESYSTEM_WORKSPACE_VERSION = 2;\n\nexport interface OpensteerWorkspaceManifest {\n readonly layout: typeof OPENSTEER_FILESYSTEM_WORKSPACE_LAYOUT;\n readonly version: typeof OPENSTEER_FILESYSTEM_WORKSPACE_VERSION;\n readonly scope: \"workspace\" | \"temporary\";\n readonly workspace?: string;\n readonly createdAt: number;\n readonly updatedAt: number;\n readonly paths: {\n readonly browser: \"browser\";\n readonly live: \"live\";\n readonly artifacts: \"artifacts\";\n readonly traces: \"traces\";\n readonly observations: \"observations\";\n readonly registry: \"registry\";\n };\n}\n\nexport interface CreateFilesystemOpensteerWorkspaceOptions {\n readonly rootPath: string;\n readonly workspace?: string;\n readonly scope?: \"workspace\" | \"temporary\";\n readonly createdAt?: number;\n}\n\nexport interface FilesystemOpensteerWorkspace {\n readonly rootPath: string;\n readonly manifestPath: string;\n readonly manifest: OpensteerWorkspaceManifest;\n readonly browserPath: string;\n readonly browserManifestPath: string;\n readonly browserUserDataDir: string;\n readonly livePath: string;\n readonly liveLocalPath: string;\n readonly liveCloudPath: string;\n readonly artifactsPath: string;\n readonly tracesPath: string;\n readonly observationsPath: string;\n readonly registryPath: string;\n readonly lockPath: string;\n readonly artifacts: OpensteerArtifactStore;\n readonly traces: OpensteerTraceStore;\n readonly observations: FilesystemObservationStore;\n readonly registry: {\n readonly descriptors: DescriptorRegistryStore;\n readonly requestPlans: RequestPlanRegistryStore;\n readonly savedNetwork: SavedNetworkStore;\n readonly interactionTraces: InteractionTraceRegistryStore;\n };\n lock<T>(task: () => Promise<T>): Promise<T>;\n}\n\nexport function normalizeWorkspaceId(workspace: string): string {\n return encodePathSegment(workspace);\n}\n\nexport function resolveFilesystemWorkspacePath(input: {\n readonly rootDir: string;\n readonly workspace: string;\n}): string {\n return path.join(\n input.rootDir,\n \".opensteer\",\n \"workspaces\",\n normalizeWorkspaceId(input.workspace),\n );\n}\n\nexport async function createFilesystemOpensteerWorkspace(\n options: CreateFilesystemOpensteerWorkspaceOptions,\n): Promise<FilesystemOpensteerWorkspace> {\n await ensureDirectory(options.rootPath);\n\n const manifestPath = path.join(options.rootPath, \"workspace.json\");\n const browserPath = path.join(options.rootPath, \"browser\");\n const browserManifestPath = path.join(browserPath, \"manifest.json\");\n const browserUserDataDir = path.join(browserPath, \"user-data\");\n const livePath = path.join(options.rootPath, \"live\");\n const liveLocalPath = path.join(livePath, \"local.json\");\n const liveCloudPath = path.join(livePath, \"cloud.json\");\n const artifactsPath = path.join(options.rootPath, \"artifacts\");\n const tracesPath = path.join(options.rootPath, \"traces\");\n const observationsPath = path.join(options.rootPath, \"observations\");\n const registryPath = path.join(options.rootPath, \"registry\");\n const lockPath = path.join(options.rootPath, \".lock\");\n\n let manifest: OpensteerWorkspaceManifest;\n if (await pathExists(manifestPath)) {\n manifest = await readJsonFile<OpensteerWorkspaceManifest>(manifestPath);\n if (manifest.layout !== OPENSTEER_FILESYSTEM_WORKSPACE_LAYOUT) {\n throw new Error(\n `workspace ${options.rootPath} is not an ${OPENSTEER_FILESYSTEM_WORKSPACE_LAYOUT} layout`,\n );\n }\n if (manifest.version !== OPENSTEER_FILESYSTEM_WORKSPACE_VERSION) {\n throw new Error(\n `workspace ${options.rootPath} uses unsupported version ${String(manifest.version)}`,\n );\n }\n if (manifest.paths.observations === undefined) {\n manifest = {\n ...manifest,\n updatedAt: Date.now(),\n paths: {\n ...manifest.paths,\n observations: \"observations\",\n },\n };\n await writeJsonFileAtomic(manifestPath, manifest);\n }\n } else {\n const createdAt = normalizeTimestamp(\"createdAt\", options.createdAt ?? Date.now());\n manifest = {\n layout: OPENSTEER_FILESYSTEM_WORKSPACE_LAYOUT,\n version: OPENSTEER_FILESYSTEM_WORKSPACE_VERSION,\n scope: options.scope ?? (options.workspace === undefined ? \"temporary\" : \"workspace\"),\n ...(options.workspace === undefined ? {} : { workspace: options.workspace }),\n createdAt,\n updatedAt: createdAt,\n paths: {\n browser: \"browser\",\n live: \"live\",\n artifacts: \"artifacts\",\n traces: \"traces\",\n observations: \"observations\",\n registry: \"registry\",\n },\n };\n await writeJsonFileAtomic(manifestPath, manifest);\n }\n\n await Promise.all([\n ensureDirectory(browserPath),\n ensureDirectory(browserUserDataDir),\n ensureDirectory(livePath),\n ensureDirectory(artifactsPath),\n ensureDirectory(tracesPath),\n ensureDirectory(observationsPath),\n ensureDirectory(registryPath),\n ]);\n\n const artifacts = createArtifactStore(options.rootPath);\n await artifacts.initialize();\n\n const descriptors = createDescriptorRegistry(options.rootPath);\n await descriptors.initialize();\n\n const requestPlans = createRequestPlanRegistry(options.rootPath);\n await requestPlans.initialize();\n\n const savedNetwork = createSavedNetworkStore(options.rootPath);\n await savedNetwork.initialize();\n\n const interactionTraces = createInteractionTraceRegistry(options.rootPath);\n await interactionTraces.initialize();\n\n const traces = createTraceStore(options.rootPath, artifacts);\n await traces.initialize();\n\n const observations = createObservationStore(options.rootPath, artifacts);\n await observations.initialize();\n\n return {\n rootPath: options.rootPath,\n manifestPath,\n manifest,\n browserPath,\n browserManifestPath,\n browserUserDataDir,\n livePath,\n liveLocalPath,\n liveCloudPath,\n artifactsPath,\n tracesPath,\n observationsPath,\n registryPath,\n lockPath,\n artifacts,\n traces,\n observations,\n registry: {\n descriptors,\n requestPlans,\n savedNetwork,\n interactionTraces,\n },\n lock<T>(task: () => Promise<T>): Promise<T> {\n return withFilesystemLock(lockPath, task);\n },\n };\n}\n","import type {\n OpensteerBrowserContextOptions,\n OpensteerBrowserLaunchOptions,\n OpensteerBrowserOptions,\n} from \"@opensteer/protocol\";\n\nexport const OPENSTEER_ENGINE_NAMES = [\"playwright\", \"abp\"] as const;\nexport type OpensteerEngineName = (typeof OPENSTEER_ENGINE_NAMES)[number];\n\nexport const DEFAULT_OPENSTEER_ENGINE: OpensteerEngineName = \"playwright\";\n\nexport interface ResolvedAbpLaunchOptions {\n readonly headless?: boolean;\n readonly args?: readonly string[];\n readonly browserExecutablePath?: string;\n readonly userDataDir?: string;\n readonly sessionDir?: string;\n}\n\nexport function resolveOpensteerEngineName(\n input: {\n readonly requested?: string;\n readonly environment?: string;\n } = {},\n): OpensteerEngineName {\n if (input.requested !== undefined) {\n return normalizeOpensteerEngineName(input.requested, \"--engine\");\n }\n\n if (input.environment !== undefined) {\n return normalizeOpensteerEngineName(input.environment, \"OPENSTEER_ENGINE\");\n }\n\n return DEFAULT_OPENSTEER_ENGINE;\n}\n\nexport function normalizeOpensteerEngineName(\n value: string,\n source = \"engine\",\n): OpensteerEngineName {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"playwright\" || normalized === \"abp\") {\n return normalized;\n }\n\n throw new Error(\n `${source} must be one of ${OPENSTEER_ENGINE_NAMES.join(\", \")}; received \"${value}\".`,\n );\n}\n\nexport function assertSupportedEngineOptions(input: {\n readonly engineName: OpensteerEngineName;\n readonly browser?: OpensteerBrowserOptions;\n readonly context?: OpensteerBrowserContextOptions;\n}): void {\n if (input.engineName !== \"abp\") {\n return;\n }\n\n if (\n typeof input.browser === \"object\" &&\n input.browser !== null &&\n input.browser.mode === \"attach\"\n ) {\n throw new Error(\n 'ABP engine does not support browser.mode=\"attach\". Use the Playwright engine for attach flows.',\n );\n }\n\n const unsupportedContextOptionNames = listUnsupportedContextOptionNames(input.context);\n if (unsupportedContextOptionNames.length === 0) {\n return;\n }\n\n throw new Error(\n `ABP engine does not support ${unsupportedContextOptionNames.join(\", \")}. Supported ABP context options: context.viewport.`,\n );\n}\n\nexport function toAbpLaunchOptions(input: {\n readonly launch?: OpensteerBrowserLaunchOptions;\n readonly context?: OpensteerBrowserContextOptions;\n readonly userDataDir?: string;\n readonly sessionDir?: string;\n}): ResolvedAbpLaunchOptions | undefined {\n const mapped: {\n headless?: boolean;\n args?: readonly string[];\n browserExecutablePath?: string;\n userDataDir?: string;\n sessionDir?: string;\n } = {};\n\n if (input.launch?.headless !== undefined) {\n mapped.headless = input.launch.headless;\n }\n\n const args = mergeManagedLaunchArgs(input.launch?.args, input.context?.viewport);\n if (args !== undefined) {\n mapped.args = args;\n }\n\n if (input.launch?.executablePath !== undefined) {\n mapped.browserExecutablePath = input.launch.executablePath;\n }\n\n if (input.userDataDir !== undefined) {\n mapped.userDataDir = input.userDataDir;\n }\n\n if (input.sessionDir !== undefined) {\n mapped.sessionDir = input.sessionDir;\n }\n\n return Object.keys(mapped).length === 0 ? undefined : mapped;\n}\n\nfunction listUnsupportedContextOptionNames(\n options: OpensteerBrowserContextOptions | undefined,\n): readonly string[] {\n if (options === undefined) {\n return [];\n }\n\n return Object.entries(options)\n .filter(([key, value]) => value !== undefined && key !== \"viewport\")\n .map(([key]) => `context.${key}`);\n}\n\nfunction mergeManagedLaunchArgs(\n args: readonly string[] | undefined,\n viewport:\n | {\n readonly width: number;\n readonly height: number;\n }\n | null\n | undefined,\n): readonly string[] | undefined {\n const filtered = stripWindowSizeArgs(args);\n if (viewport === undefined || viewport === null) {\n return filtered.length === 0 ? undefined : filtered;\n }\n\n return [...filtered, `--window-size=${viewport.width},${viewport.height}`];\n}\n\nfunction stripWindowSizeArgs(args: readonly string[] | undefined): readonly string[] {\n if (args === undefined) {\n return [];\n }\n\n const filtered: string[] = [];\n for (let index = 0; index < args.length; index += 1) {\n const argument = args[index]!;\n if (argument === \"--window-size\") {\n index += 1;\n continue;\n }\n if (argument.startsWith(\"--window-size=\")) {\n continue;\n }\n filtered.push(argument);\n }\n\n return filtered;\n}\n","import { readFile, readdir, rm, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport const CHROME_SINGLETON_ARTIFACTS = [\n \"SingletonCookie\",\n \"SingletonLock\",\n \"SingletonSocket\",\n \"DevToolsActivePort\",\n \"lockfile\",\n] as const;\n\nexport type ChromeSingletonArtifact = (typeof CHROME_SINGLETON_ARTIFACTS)[number];\n\nexport async function clearChromeSingletonEntries(userDataDir: string): Promise<void> {\n await Promise.all(\n CHROME_SINGLETON_ARTIFACTS.map((entry) =>\n rm(join(userDataDir, entry), {\n recursive: true,\n force: true,\n }).catch(() => undefined),\n ),\n );\n}\n\n/**\n * Fix Chrome profile state so the browser does not show \"something is wrong\n * with the profile\" on the next launch.\n *\n * Chrome writes `exit_type: \"Crashed\"` (or leaves it empty) in the\n * per-profile `Preferences` file when it does not shut down cleanly. On the\n * next launch it detects this and shows a recovery/error dialog. For cloned\n * profiles the problem is even more common because the source browser was\n * still running when the copy was made.\n *\n * We reset `exit_type` to `\"Normal\"` and `exited_cleanly` to `true`.\n * Because Chrome also validates the HMAC stored in `Secure Preferences`, we\n * remove that file so Chrome regenerates it from the corrected Preferences.\n */\nexport async function sanitizeChromeProfile(userDataDir: string): Promise<void> {\n const entries = await readdir(userDataDir).catch(() => []);\n const profileDirs = entries.filter(\n (entry) => entry === \"Default\" || /^Profile \\d+$/i.test(entry),\n );\n\n await Promise.all(profileDirs.map((dir) => sanitizeProfilePreferences(userDataDir, dir)));\n}\n\nasync function sanitizeProfilePreferences(userDataDir: string, profileDir: string): Promise<void> {\n const prefsPath = join(userDataDir, profileDir, \"Preferences\");\n try {\n const raw = await readFile(prefsPath, \"utf8\");\n const prefs = JSON.parse(raw) as Record<string, unknown>;\n const profile = (prefs.profile ?? {}) as Record<string, unknown>;\n\n if (profile.exit_type === \"Normal\" && profile.exited_cleanly === true) {\n return;\n }\n\n profile.exit_type = \"Normal\";\n profile.exited_cleanly = true;\n prefs.profile = profile;\n await writeFile(prefsPath, JSON.stringify(prefs), \"utf8\");\n\n // Remove Secure Preferences — its HMAC no longer matches the modified\n // Preferences file. Chrome will silently regenerate it on startup.\n await rm(join(userDataDir, profileDir, \"Secure Preferences\"), { force: true }).catch(\n () => undefined,\n );\n } catch {\n // Preferences file may be missing or malformed — skip silently.\n }\n}\n","import { copyFile, cp, mkdir, readdir, stat } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { join, relative, resolve } from \"node:path\";\n\nimport { expandHome } from \"./chrome-discovery.js\";\nimport {\n CHROME_SINGLETON_ARTIFACTS,\n clearChromeSingletonEntries,\n sanitizeChromeProfile,\n} from \"./chrome-singletons.js\";\n\nconst CHROME_SINGLETON_ENTRIES = new Set<string>(CHROME_SINGLETON_ARTIFACTS);\n\nconst SKIPPED_ROOT_DIRECTORIES = new Set([\n \"Crash Reports\",\n \"Crashpad\",\n \"BrowserMetrics\",\n \"GrShaderCache\",\n \"ShaderCache\",\n \"GraphiteDawnCache\",\n \"component_crx_cache\",\n \"Crowd Deny\",\n \"hyphen-data\",\n \"OnDeviceHeadSuggestModel\",\n \"OptimizationGuidePredictionModels\",\n \"Segmentation Platform\",\n \"SmartCardDeviceNames\",\n \"WidevineCdm\",\n \"pnacl\",\n]);\n\nconst SESSION_ROOT_FILES = new Set([\"Local State\"]);\n\nconst SESSION_SKIPPED_PROFILE_DIRECTORIES = new Set([\n \"Cache\",\n \"Code Cache\",\n \"GPUCache\",\n \"Service Worker\",\n \"File System\",\n \"blob_storage\",\n \"Network\",\n]);\n\nexport async function createBrowserProfileSnapshot(input: {\n readonly sourceUserDataDir: string;\n readonly targetUserDataDir: string;\n readonly profileDirectory?: string;\n readonly copyMode?: \"full\" | \"session\";\n}): Promise<void> {\n const sourceUserDataDir = resolve(expandHome(input.sourceUserDataDir));\n const targetUserDataDir = resolve(expandHome(input.targetUserDataDir));\n const profileDirectory = input.profileDirectory?.trim();\n const copyMode = input.copyMode ?? \"full\";\n\n await mkdir(targetUserDataDir, { recursive: true });\n await clearChromeSingletonEntries(targetUserDataDir);\n\n if (profileDirectory) {\n const sourceProfileDir = join(sourceUserDataDir, profileDirectory);\n if (!existsSync(sourceProfileDir)) {\n throw new Error(\n `Chrome profile \"${profileDirectory}\" was not found in \"${sourceUserDataDir}\".`,\n );\n }\n\n await cp(sourceProfileDir, join(targetUserDataDir, profileDirectory), {\n recursive: true,\n filter: (candidate) =>\n shouldCopyEntry({\n candidatePath: candidate,\n copyMode,\n rootPath: sourceProfileDir,\n }),\n });\n }\n\n await copyRootLevelEntries({\n copyMode,\n sourceUserDataDir,\n targetUserDataDir,\n ...(profileDirectory === undefined ? {} : { selectedProfileDirectory: profileDirectory }),\n });\n await clearChromeSingletonEntries(targetUserDataDir);\n await sanitizeChromeProfile(targetUserDataDir);\n}\n\nasync function copyRootLevelEntries(input: {\n readonly copyMode: \"full\" | \"session\";\n readonly sourceUserDataDir: string;\n readonly targetUserDataDir: string;\n readonly selectedProfileDirectory?: string;\n}): Promise<void> {\n const entries = await readdir(input.sourceUserDataDir).catch(() => []);\n\n for (const entry of entries) {\n if (CHROME_SINGLETON_ENTRIES.has(entry) || entry === input.selectedProfileDirectory) {\n continue;\n }\n\n const sourcePath = join(input.sourceUserDataDir, entry);\n const targetPath = join(input.targetUserDataDir, entry);\n\n const entryStat = await stat(sourcePath).catch(() => null);\n if (!entryStat) {\n continue;\n }\n\n if (entryStat.isFile()) {\n if (input.copyMode === \"session\" && !SESSION_ROOT_FILES.has(entry)) {\n continue;\n }\n await copyFile(sourcePath, targetPath).catch(() => undefined);\n continue;\n }\n\n if (!entryStat.isDirectory()) {\n continue;\n }\n\n if (SKIPPED_ROOT_DIRECTORIES.has(entry)) {\n continue;\n }\n\n const profileDirectory = isProfileDirectory(input.sourceUserDataDir, entry);\n if (input.copyMode === \"session\" && !profileDirectory) {\n continue;\n }\n\n await cp(sourcePath, targetPath, {\n recursive: true,\n filter: (candidate) =>\n shouldCopyEntry({\n candidatePath: candidate,\n copyMode: input.copyMode,\n rootPath: sourcePath,\n }),\n }).catch(() => undefined);\n }\n}\n\nfunction isProfileDirectory(userDataDir: string, entry: string): boolean {\n return existsSync(join(userDataDir, entry, \"Preferences\"));\n}\n\nfunction shouldCopyEntry(input: {\n readonly candidatePath: string;\n readonly copyMode: \"full\" | \"session\";\n readonly rootPath: string;\n}): boolean {\n const entryName =\n input.candidatePath.split(\"/\").at(-1)?.split(\"\\\\\").at(-1) ?? input.candidatePath;\n if (CHROME_SINGLETON_ENTRIES.has(entryName)) {\n return false;\n }\n\n if (input.copyMode !== \"session\") {\n return true;\n }\n\n const relativePath = relative(input.rootPath, input.candidatePath);\n if (relativePath.length === 0) {\n return true;\n }\n\n const firstSegment = relativePath.split(\"/\").at(0)?.split(\"\\\\\").at(0) ?? relativePath;\n return !SESSION_SKIPPED_PROFILE_DIRECTORIES.has(firstSegment);\n}\n","import type { StealthProfile } from \"./stealth-profiles.js\";\n\n/**\n * Generate a per-profile init script that handles fingerprint evasion defenses\n * for every new document in the context.\n *\n * CDP remains the preferred path for the current page because it updates\n * Chromium's internal state natively. This init script mirrors the same\n * navigator/screen values onto every new document so popups and later pages\n * stay consistent before their page-scoped CDP session attaches. It also covers:\n *\n * - Canvas fingerprint noise\n * - WebGL vendor/renderer spoofing\n * - AudioBuffer fingerprint noise\n * - Font availability spoofing\n * - CDP Runtime.enable leak defense\n */\nexport function generateStealthInitScript(profile: StealthProfile): string {\n const encodedProfile = JSON.stringify({\n ...profile,\n platformString: getPlatformString(profile.platform),\n userAgentData: buildUserAgentData(profile),\n });\n return `(() => {\n const profile = ${encodedProfile};\n var define = function(target, key, value) {\n Object.defineProperty(target, key, {\n configurable: true,\n get: typeof value === 'function' ? value : function() { return value; },\n });\n };\n\n // --- navigator / screen mirrors for future pages ---\n if (navigator.webdriver === true) {\n Object.defineProperty(Navigator.prototype, 'webdriver', {\n configurable: true,\n get: function() { return false; },\n });\n }\n define(Navigator.prototype, 'platform', profile.platformString);\n define(Navigator.prototype, 'userAgent', profile.userAgent);\n define(Navigator.prototype, 'language', profile.locale);\n define(Navigator.prototype, 'languages', [profile.locale, 'en']);\n define(Navigator.prototype, 'maxTouchPoints', profile.maxTouchPoints);\n define(window, 'devicePixelRatio', profile.devicePixelRatio);\n define(window.screen, 'width', profile.screenResolution.width);\n define(window.screen, 'height', profile.screenResolution.height);\n define(window.screen, 'availWidth', profile.screenResolution.width);\n define(window.screen, 'availHeight', profile.screenResolution.height - 40);\n define(window.screen, 'colorDepth', 24);\n define(window.screen, 'pixelDepth', 24);\n define(Navigator.prototype, 'userAgentData', {\n brands: profile.userAgentData.brands,\n mobile: false,\n platform: profile.userAgentData.platform,\n toJSON: function() {\n return {\n brands: this.brands,\n mobile: this.mobile,\n platform: this.platform,\n };\n },\n getHighEntropyValues: async function(hints) {\n var source = {\n architecture: profile.userAgentData.architecture,\n bitness: profile.userAgentData.bitness,\n brands: profile.userAgentData.brands,\n fullVersionList: profile.userAgentData.fullVersionList,\n mobile: false,\n model: '',\n platform: profile.userAgentData.platform,\n platformVersion: profile.userAgentData.platformVersion,\n uaFullVersion: profile.browserVersion,\n wow64: false,\n };\n var values = {};\n for (var i = 0; i < hints.length; i++) {\n var hint = hints[i];\n if (Object.prototype.hasOwnProperty.call(source, hint)) {\n values[hint] = source[hint];\n }\n }\n return values;\n },\n });\n\n if (typeof Intl !== 'undefined' && Intl.DateTimeFormat) {\n var originalResolvedOptions = Intl.DateTimeFormat.prototype.resolvedOptions;\n Intl.DateTimeFormat.prototype.resolvedOptions = function() {\n var options = originalResolvedOptions.call(this);\n options.timeZone = profile.timezoneId;\n return options;\n };\n }\n\n if (Date.prototype.getTimezoneOffset) {\n var originalGetTimezoneOffset = Date.prototype.getTimezoneOffset;\n var calculateTimezoneOffset = function(date) {\n try {\n var formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: profile.timezoneId,\n hour12: false,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n });\n var parts = formatter.formatToParts(date);\n var values = {};\n for (var i = 0; i < parts.length; i++) {\n if (parts[i].type !== 'literal') {\n values[parts[i].type] = Number(parts[i].value);\n }\n }\n var utcTime = Date.UTC(\n values.year,\n values.month - 1,\n values.day,\n values.hour,\n values.minute,\n values.second,\n );\n return Math.round((date.getTime() - utcTime) / 60000);\n } catch {\n return originalGetTimezoneOffset.call(date);\n }\n };\n Date.prototype.getTimezoneOffset = function() {\n return calculateTimezoneOffset(this);\n };\n }\n\n // --- CDP Runtime.enable leak defense ---\n var _wrap = function(name) {\n var orig = console[name];\n if (typeof orig !== 'function') return;\n console[name] = new Proxy(orig, {\n apply: function(target, thisArg, args) {\n for (var i = 0; i < args.length; i++) {\n if (args[i] instanceof Error) {\n var d = Object.getOwnPropertyDescriptor(args[i], 'stack');\n if (d && typeof d.get === 'function') return undefined;\n }\n }\n return Reflect.apply(target, thisArg, args);\n },\n });\n };\n ['debug', 'log', 'info', 'error', 'warn', 'trace', 'dir'].forEach(_wrap);\n\n // --- Canvas fingerprint noise ---\n var seedNoise = function(seed, input) {\n var value = Math.sin(seed + input * 12.9898) * 43758.5453;\n return value - Math.floor(value);\n };\n if (HTMLCanvasElement.prototype.toDataURL) {\n var originalToDataURL = HTMLCanvasElement.prototype.toDataURL;\n HTMLCanvasElement.prototype.toDataURL = function() {\n var context = this.getContext('2d');\n if (context) {\n var x = Math.min(1, Math.max(0, this.width - 1));\n var y = Math.min(1, Math.max(0, this.height - 1));\n var imageData = context.getImageData(x, y, 1, 1);\n imageData.data[0] = Math.max(0, Math.min(255, imageData.data[0] + Math.floor(seedNoise(profile.canvasNoiseSeed, 1) * 2)));\n context.putImageData(imageData, x, y);\n }\n return originalToDataURL.apply(this, arguments);\n };\n }\n\n // --- WebGL vendor/renderer spoofing ---\n if (typeof WebGLRenderingContext !== 'undefined') {\n var originalGetParameter = WebGLRenderingContext.prototype.getParameter;\n WebGLRenderingContext.prototype.getParameter = function(parameter) {\n if (parameter === 37445) return profile.webglVendor;\n if (parameter === 37446) return profile.webglRenderer;\n return originalGetParameter.call(this, parameter);\n };\n }\n\n // --- AudioBuffer fingerprint noise ---\n if (typeof AudioBuffer !== 'undefined' && typeof AnalyserNode !== 'undefined') {\n var originalGetFloatFrequencyData = AnalyserNode.prototype.getFloatFrequencyData;\n AnalyserNode.prototype.getFloatFrequencyData = function(array) {\n originalGetFloatFrequencyData.call(this, array);\n for (var index = 0; index < array.length; index += 16) {\n array[index] += (seedNoise(profile.audioNoiseSeed, index) - 0.5) * 0.0001;\n }\n };\n }\n\n // --- Font availability spoofing ---\n if (document.fonts && typeof document.fonts.check === 'function') {\n var originalCheck = document.fonts.check.bind(document.fonts);\n document.fonts.check = function(font, text) {\n var family = String(font).match(/[\"']([^\"']+)[\"']/)?.[1] || String(font).split(/\\\\s+/).at(-1);\n if (family && profile.fonts.includes(family)) {\n return true;\n }\n return originalCheck(font, text);\n };\n }\n})();`;\n}\n\nfunction buildUserAgentData(profile: StealthProfile) {\n const majorVersion = profile.browserVersion.split(\".\")[0] ?? \"136\";\n const platformData = {\n macos: { platform: \"macOS\", platformVersion: \"14.4.0\", architecture: \"arm\" },\n windows: { platform: \"Windows\", platformVersion: \"15.0.0\", architecture: \"x86\" },\n linux: { platform: \"Linux\", platformVersion: \"6.5.0\", architecture: \"x86\" },\n } as const;\n const platformInfo = platformData[profile.platform];\n\n return {\n architecture: platformInfo.architecture,\n bitness: \"64\",\n brands: [\n { brand: \"Chromium\", version: majorVersion },\n ...(profile.browserBrand === \"edge\"\n ? [{ brand: \"Microsoft Edge\", version: majorVersion }]\n : [{ brand: \"Google Chrome\", version: majorVersion }]),\n { brand: \"Not-A.Brand\", version: \"99\" },\n ],\n fullVersionList: [\n { brand: \"Chromium\", version: profile.browserVersion },\n ...(profile.browserBrand === \"edge\"\n ? [{ brand: \"Microsoft Edge\", version: profile.browserVersion }]\n : [{ brand: \"Google Chrome\", version: profile.browserVersion }]),\n { brand: \"Not-A.Brand\", version: \"99.0.0.0\" },\n ],\n platform: platformInfo.platform,\n platformVersion: platformInfo.platformVersion,\n };\n}\n\nfunction getPlatformString(platform: StealthProfile[\"platform\"]): string {\n return platform === \"macos\" ? \"MacIntel\" : platform === \"windows\" ? \"Win32\" : \"Linux x86_64\";\n}\n","import { generateStealthInitScript } from \"./stealth-init-script.js\";\nimport type { StealthProfile } from \"./stealth-profiles.js\";\nimport type { ConnectedCdpBrowserContext, ConnectedCdpPage } from \"./types.js\";\n\n/**\n * JavaScript source injected before any page scripts via\n * Page.addScriptToEvaluateOnNewDocument to mask automation signals\n * that bot-detection systems (Cloudflare Turnstile, DataDome, etc.) check.\n *\n * Runs in the main world of every new document before page-originating scripts.\n *\n * This script only handles defenses that cannot be achieved via CDP protocol\n * commands: the CDP Runtime.enable leak detection neutralization.\n * Navigator / screen / viewport overrides are handled at the CDP protocol\n * level by {@link applyCdpStealthOverrides}, which is undetectable by page JS.\n */\nconst STEALTH_INIT_SCRIPT = `(() => {\n // Override navigator.webdriver only if Chrome reports automation.\n // --disable-blink-features=AutomationControlled should prevent this, but some\n // Chrome builds still set webdriver=true when --remote-debugging-port is active.\n if (navigator.webdriver === true) {\n Object.defineProperty(Navigator.prototype, 'webdriver', {\n get: function() { return false; },\n configurable: true,\n });\n }\n\n // Neutralize CDP Runtime.enable leak detection.\n //\n // Playwright enables the CDP Runtime domain for page.evaluate(). Bot detectors\n // exploit this: they create an Error with a user-defined getter on its 'stack'\n // property, then pass that Error to a console method. When Runtime.enable is\n // active, Chrome serializes the Error for the Runtime.consoleAPICalled event,\n // which triggers the getter — proving CDP is present.\n //\n // Defense: wrap console methods in a Proxy that detects this specific pattern\n // (an Error whose 'stack' is an accessor, not a data property) and suppresses\n // the call. Normal Errors have a plain data-property 'stack', so legitimate\n // console usage is unaffected.\n var _wrap = function(name) {\n var orig = console[name];\n if (typeof orig !== 'function') return;\n console[name] = new Proxy(orig, {\n apply: function(target, thisArg, args) {\n for (var i = 0; i < args.length; i++) {\n if (args[i] instanceof Error) {\n var d = Object.getOwnPropertyDescriptor(args[i], 'stack');\n if (d && typeof d.get === 'function') return undefined;\n }\n }\n return Reflect.apply(target, thisArg, args);\n },\n });\n };\n ['debug', 'log', 'info', 'error', 'warn', 'trace', 'dir'].forEach(_wrap);\n})();`;\n\n/**\n * Inject stealth init scripts into a browser context so that every page\n * opened in that context masks common automation-detection signals.\n *\n * When a {@link StealthProfile} is provided, this function installs context-wide\n * request headers for future navigations and popups, applies CDP protocol-level\n * overrides to all current pages in the context, and registers the same CDP\n * overrides for pages opened later in that context. The init script also mirrors\n * the spoofed navigator/screen values onto every new document so popup pages stay\n * consistent before their per-page CDP session attaches.\n *\n * When the context does not support init scripts (e.g. the ABP engine),\n * this is a silent no-op for the init-script portion.\n */\nexport async function injectBrowserStealthScripts(\n context: ConnectedCdpBrowserContext,\n input: {\n readonly profile?: StealthProfile;\n readonly page?: ConnectedCdpPage;\n } = {},\n): Promise<void> {\n if (input.profile !== undefined) {\n await installContextNetworkHeaders(context, input.profile);\n await installCdpStealthOverrides(context, input.profile, input.page);\n }\n\n if (typeof context.addInitScript === \"function\") {\n await context.addInitScript({\n content:\n input.profile === undefined\n ? STEALTH_INIT_SCRIPT\n : generateStealthInitScript(input.profile),\n });\n }\n}\n\n/**\n * Build the User-Agent Client Hints metadata object from a stealth profile.\n *\n * Modern bot detectors compare `navigator.userAgentData.getHighEntropyValues()`\n * against the User-Agent header to detect automation. Setting these values at\n * the CDP level ensures both the JS API and HTTP headers are internally\n * consistent — something JS injection alone cannot achieve.\n */\nfunction buildUserAgentMetadata(profile: StealthProfile): Record<string, unknown> {\n const majorVersion = profile.browserVersion.split(\".\")[0] ?? \"136\";\n\n const brands = [\n { brand: \"Chromium\", version: majorVersion },\n ...(profile.browserBrand === \"edge\"\n ? [{ brand: \"Microsoft Edge\", version: majorVersion }]\n : [{ brand: \"Google Chrome\", version: majorVersion }]),\n { brand: \"Not-A.Brand\", version: \"99\" },\n ];\n\n const fullVersionList = [\n { brand: \"Chromium\", version: profile.browserVersion },\n ...(profile.browserBrand === \"edge\"\n ? [{ brand: \"Microsoft Edge\", version: profile.browserVersion }]\n : [{ brand: \"Google Chrome\", version: profile.browserVersion }]),\n { brand: \"Not-A.Brand\", version: \"99.0.0.0\" },\n ];\n\n const platformMap: Record<\n StealthProfile[\"platform\"],\n { platform: string; platformVersion: string; architecture: string }\n > = {\n // Chromium keeps the reduced macOS UA token frozen to Intel even on Apple Silicon.\n macos: { platform: \"macOS\", platformVersion: \"14.4.0\", architecture: \"arm\" },\n windows: { platform: \"Windows\", platformVersion: \"15.0.0\", architecture: \"x86\" },\n linux: { platform: \"Linux\", platformVersion: \"6.5.0\", architecture: \"x86\" },\n };\n\n const platformInfo = platformMap[profile.platform];\n\n return {\n brands,\n fullVersionList,\n platform: platformInfo.platform,\n platformVersion: platformInfo.platformVersion,\n architecture: platformInfo.architecture,\n model: \"\",\n mobile: false,\n bitness: \"64\",\n wow64: false,\n };\n}\n\n/**\n * Apply stealth overrides at the Chrome DevTools Protocol level.\n *\n * Unlike JavaScript init-script injection, CDP commands modify Chrome's\n * internal state directly. This means:\n *\n * - `navigator.userAgent` returns the spoofed value as a native string, not\n * via a getter override that bot detectors can fingerprint.\n * - `navigator.userAgentData.getHighEntropyValues()` returns correct Client\n * Hints metadata — impossible to achieve via JS injection alone.\n * - `screen.width`, `screen.height`, `devicePixelRatio`, and viewport\n * dimensions are set at the rendering-engine level.\n * - `navigator.language` / `navigator.languages` reflect the spoofed locale.\n *\n * This function is best-effort: if the context does not expose a CDP session\n * factory (e.g. non-Playwright engines), it silently returns without error.\n */\nasync function installCdpStealthOverrides(\n context: ConnectedCdpBrowserContext,\n profile: StealthProfile,\n initialPage?: ConnectedCdpPage,\n): Promise<void> {\n const pages =\n initialPage === undefined\n ? context.pages()\n : Array.from(new Set([initialPage, ...context.pages()]));\n\n await Promise.all(pages.map((page) => applyPageOverrides(context, page, profile)));\n\n const appliedPages = new WeakSet<ConnectedCdpPage>();\n const applyFuturePageOverrides = async (page: ConnectedCdpPage): Promise<void> => {\n if (appliedPages.has(page)) {\n return;\n }\n appliedPages.add(page);\n await applyPageOverrides(context, page, profile);\n };\n\n if (typeof context.on === \"function\") {\n context.on(\"page\", applyFuturePageOverrides);\n }\n}\n\nasync function installContextNetworkHeaders(\n context: ConnectedCdpBrowserContext,\n profile: StealthProfile,\n): Promise<void> {\n if (typeof context.setExtraHTTPHeaders !== \"function\") {\n return;\n }\n\n await context.setExtraHTTPHeaders(buildStealthRequestHeaders(profile)).catch(() => undefined);\n}\n\nasync function applyPageOverrides(\n context: ConnectedCdpBrowserContext,\n page: ConnectedCdpPage,\n profile: StealthProfile,\n): Promise<void> {\n // Access the Playwright-specific newCDPSession method via runtime check.\n // The ConnectedCdpBrowserContext interface is engine-neutral and does not\n // expose it, but the actual Playwright BrowserContext object does.\n const contextWithCdp = context as { newCDPSession?: (page: unknown) => Promise<CdpSessionLike> };\n if (typeof contextWithCdp.newCDPSession !== \"function\") {\n return;\n }\n\n let cdp: CdpSessionLike;\n try {\n cdp = await contextWithCdp.newCDPSession(page);\n } catch {\n return;\n }\n\n try {\n await applyCdpStealthCommands((method, params) => cdp.send(method, params), profile);\n } catch {\n // CDP-level overrides are best-effort. Unsupported commands are ignored so\n // stealth setup does not fail when a Chromium build lacks one of them.\n } finally {\n await cdp.detach().catch(() => undefined);\n }\n}\n\nasync function applyCdpStealthCommands(\n send: (method: string, params?: Record<string, unknown>) => Promise<unknown>,\n profile: StealthProfile,\n): Promise<void> {\n await send(\"Network.setUserAgentOverride\", {\n userAgent: profile.userAgent,\n acceptLanguage: `${profile.locale},en;q=0.9`,\n platform: getPlatformString(profile.platform),\n userAgentMetadata: buildUserAgentMetadata(profile),\n });\n\n await send(\"Emulation.setDeviceMetricsOverride\", {\n width: profile.viewport.width,\n height: profile.viewport.height,\n deviceScaleFactor: profile.devicePixelRatio,\n mobile: false,\n screenWidth: profile.screenResolution.width,\n screenHeight: profile.screenResolution.height,\n });\n\n await send(\"Emulation.setLocaleOverride\", {\n locale: profile.locale,\n }).catch(() => undefined);\n\n await send(\"Emulation.setTimezoneOverride\", {\n timezoneId: profile.timezoneId,\n }).catch(() => undefined);\n}\n\nfunction buildStealthRequestHeaders(profile: StealthProfile): Record<string, string> {\n const metadata = buildUserAgentMetadata(profile) as {\n readonly brands: ReadonlyArray<{ readonly brand: string; readonly version: string }>;\n readonly platform: string;\n };\n\n return {\n \"Accept-Language\": `${profile.locale},en;q=0.9`,\n \"Sec-CH-UA\": metadata.brands.map(formatClientHintBrand).join(\", \"),\n \"Sec-CH-UA-Mobile\": \"?0\",\n \"Sec-CH-UA-Platform\": `\"${metadata.platform}\"`,\n \"User-Agent\": profile.userAgent,\n };\n}\n\nfunction formatClientHintBrand(brand: {\n readonly brand: string;\n readonly version: string;\n}): string {\n return `\"${brand.brand}\";v=\"${brand.version}\"`;\n}\n\nfunction getPlatformString(platform: StealthProfile[\"platform\"]): string {\n return platform === \"macos\" ? \"MacIntel\" : platform === \"windows\" ? \"Win32\" : \"Linux x86_64\";\n}\n\ninterface CdpSessionLike {\n readonly send: (method: string, params?: Record<string, unknown>) => Promise<unknown>;\n readonly detach: () => Promise<unknown>;\n}\n","export interface StealthProfile {\n readonly id: string;\n readonly platform: \"macos\" | \"windows\" | \"linux\";\n readonly browserBrand: \"chrome\" | \"edge\";\n readonly browserVersion: string;\n readonly userAgent: string;\n readonly viewport: { readonly width: number; readonly height: number };\n readonly screenResolution: { readonly width: number; readonly height: number };\n readonly devicePixelRatio: number;\n readonly maxTouchPoints: number;\n readonly webglVendor: string;\n readonly webglRenderer: string;\n readonly fonts: readonly string[];\n readonly canvasNoiseSeed: number;\n readonly audioNoiseSeed: number;\n readonly locale: string;\n readonly timezoneId: string;\n}\n\nexport type StealthProfileOverrides = Partial<StealthProfile>;\n\nconst PROFILE_PRESETS = [\n {\n platform: \"macos\" as const,\n browserBrand: \"chrome\" as const,\n browserVersion: \"136.0.7103.93\",\n userAgent:\n \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36\",\n viewport: { width: 1440, height: 900 },\n screenResolution: { width: 1512, height: 982 },\n devicePixelRatio: 2,\n maxTouchPoints: 0,\n webglVendor: \"Apple\",\n webglRenderer: \"Apple M2\",\n fonts: [\"SF Pro Text\", \"Helvetica Neue\", \"Arial\", \"Menlo\", \"Apple Color Emoji\"],\n locale: \"en-US\",\n timezoneId: \"America/Los_Angeles\",\n },\n {\n platform: \"windows\" as const,\n browserBrand: \"chrome\" as const,\n browserVersion: \"136.0.7103.93\",\n userAgent:\n \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36\",\n viewport: { width: 1536, height: 864 },\n screenResolution: { width: 1920, height: 1080 },\n devicePixelRatio: 1.25,\n maxTouchPoints: 0,\n webglVendor: \"Google Inc. (Intel)\",\n webglRenderer: \"ANGLE (Intel, Intel(R) Iris(R) Xe Graphics Direct3D11 vs_5_0 ps_5_0, D3D11)\",\n fonts: [\"Segoe UI\", \"Arial\", \"Calibri\", \"Consolas\", \"Segoe UI Emoji\"],\n locale: \"en-US\",\n timezoneId: \"America/New_York\",\n },\n {\n platform: \"windows\" as const,\n browserBrand: \"edge\" as const,\n browserVersion: \"136.0.3240.50\",\n userAgent:\n \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.3240.50\",\n viewport: { width: 1536, height: 864 },\n screenResolution: { width: 1920, height: 1080 },\n devicePixelRatio: 1.25,\n maxTouchPoints: 0,\n webglVendor: \"Google Inc. (Intel)\",\n webglRenderer: \"ANGLE (Intel, Intel(R) UHD Graphics Direct3D11 vs_5_0 ps_5_0, D3D11)\",\n fonts: [\"Segoe UI\", \"Arial\", \"Calibri\", \"Consolas\", \"Segoe UI Emoji\"],\n locale: \"en-US\",\n timezoneId: \"America/Chicago\",\n },\n {\n platform: \"linux\" as const,\n browserBrand: \"chrome\" as const,\n browserVersion: \"136.0.7103.93\",\n userAgent:\n \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36\",\n viewport: { width: 1366, height: 768 },\n screenResolution: { width: 1366, height: 768 },\n devicePixelRatio: 1,\n maxTouchPoints: 0,\n webglVendor: \"Google Inc. (Mesa)\",\n webglRenderer: \"ANGLE (AMD, AMD Radeon Graphics, OpenGL 4.6)\",\n fonts: [\"Noto Sans\", \"Ubuntu\", \"DejaVu Sans\", \"Liberation Sans\", \"Noto Color Emoji\"],\n locale: \"en-US\",\n timezoneId: \"UTC\",\n },\n] as const;\n\nexport function generateStealthProfile(overrides: StealthProfileOverrides = {}): StealthProfile {\n const preset = pickStealthProfilePreset(overrides);\n return {\n id:\n overrides.id ??\n `stealth:${preset.platform}:${preset.browserBrand}:${Math.random().toString(36).slice(2, 10)}`,\n platform: overrides.platform ?? preset.platform,\n browserBrand: overrides.browserBrand ?? preset.browserBrand,\n browserVersion: overrides.browserVersion ?? preset.browserVersion,\n userAgent: overrides.userAgent ?? preset.userAgent,\n viewport: overrides.viewport ?? preset.viewport,\n screenResolution: overrides.screenResolution ?? preset.screenResolution,\n devicePixelRatio: overrides.devicePixelRatio ?? preset.devicePixelRatio,\n maxTouchPoints: overrides.maxTouchPoints ?? preset.maxTouchPoints,\n webglVendor: overrides.webglVendor ?? preset.webglVendor,\n webglRenderer: overrides.webglRenderer ?? preset.webglRenderer,\n fonts: overrides.fonts ?? preset.fonts,\n canvasNoiseSeed: overrides.canvasNoiseSeed ?? Math.floor(Math.random() * 1_000_000),\n audioNoiseSeed: overrides.audioNoiseSeed ?? Math.floor(Math.random() * 1_000_000),\n locale: overrides.locale ?? preset.locale,\n timezoneId: overrides.timezoneId ?? preset.timezoneId,\n };\n}\n\nfunction pickStealthProfilePreset(overrides: StealthProfileOverrides) {\n const candidates = PROFILE_PRESETS.filter(\n (preset) =>\n (overrides.platform === undefined || preset.platform === overrides.platform) &&\n (overrides.browserBrand === undefined || preset.browserBrand === overrides.browserBrand),\n );\n const pool = candidates.length > 0 ? candidates : PROFILE_PRESETS;\n return pool[Math.floor(Math.random() * pool.length)]!;\n}\n","import { pathExists, readJsonFile, writeJsonFileAtomic } from \"../internal/filesystem.js\";\nimport { resolveLocalViewPreferencesPath } from \"./runtime-dir.js\";\n\nexport const OPENSTEER_LOCAL_VIEW_PREFERENCES_LAYOUT = \"opensteer-local-view-preferences\";\nexport const OPENSTEER_LOCAL_VIEW_PREFERENCES_VERSION = 1;\n\nexport type OpensteerLocalViewMode = \"auto\" | \"manual\";\n\nexport interface PersistedLocalViewPreferences {\n readonly layout: typeof OPENSTEER_LOCAL_VIEW_PREFERENCES_LAYOUT;\n readonly version: typeof OPENSTEER_LOCAL_VIEW_PREFERENCES_VERSION;\n readonly mode: OpensteerLocalViewMode;\n readonly updatedAt: number;\n}\n\nexport async function resolveLocalViewMode(): Promise<OpensteerLocalViewMode> {\n const preferences = await readLocalViewPreferences();\n return preferences?.mode ?? \"auto\";\n}\n\nexport async function setLocalViewMode(\n mode: OpensteerLocalViewMode,\n): Promise<PersistedLocalViewPreferences> {\n return writeLocalViewPreferences(mode);\n}\n\nexport async function readLocalViewPreferences(): Promise<\n PersistedLocalViewPreferences | undefined\n> {\n const preferencesPath = resolveLocalViewPreferencesPath();\n if (!(await pathExists(preferencesPath))) {\n return undefined;\n }\n\n const parsed = await readJsonFile<Partial<PersistedLocalViewPreferences>>(preferencesPath);\n return isPersistedLocalViewPreferences(parsed) ? parsed : undefined;\n}\n\nasync function writeLocalViewPreferences(\n mode: OpensteerLocalViewMode,\n): Promise<PersistedLocalViewPreferences> {\n const preferences: PersistedLocalViewPreferences = {\n layout: OPENSTEER_LOCAL_VIEW_PREFERENCES_LAYOUT,\n version: OPENSTEER_LOCAL_VIEW_PREFERENCES_VERSION,\n mode,\n updatedAt: Date.now(),\n };\n await writeJsonFileAtomic(resolveLocalViewPreferencesPath(), preferences);\n return preferences;\n}\n\nfunction isPersistedLocalViewPreferences(\n value: Partial<PersistedLocalViewPreferences> | null | undefined,\n): value is PersistedLocalViewPreferences {\n return (\n value?.layout === OPENSTEER_LOCAL_VIEW_PREFERENCES_LAYOUT &&\n value.version === OPENSTEER_LOCAL_VIEW_PREFERENCES_VERSION &&\n (value.mode === \"auto\" || value.mode === \"manual\") &&\n typeof value.updatedAt === \"number\" &&\n Number.isFinite(value.updatedAt)\n );\n}\n","import { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nimport {\n CURRENT_PROCESS_OWNER,\n getProcessLiveness,\n parseProcessOwner,\n processOwnersEqual,\n type ProcessOwner,\n} from \"./process-owner.js\";\n\nconst LOCK_OWNER_FILE = \"owner.json\";\nconst LOCK_RECLAIMER_DIR = \"reclaimer\";\nconst LOCK_RETRY_DELAY_MS = 50;\n\ninterface ProcessParticipantRecord {\n readonly exists: boolean;\n readonly owner: ProcessOwner | null;\n}\n\nexport type LockRelease = () => Promise<void>;\n\nexport async function withDirLock<T>(lockDirPath: string, action: () => Promise<T>): Promise<T> {\n const releaseLock = await acquireDirLock(lockDirPath);\n\n try {\n return await action();\n } finally {\n await releaseLock();\n }\n}\n\nexport async function acquireDirLock(lockDirPath: string): Promise<LockRelease> {\n while (true) {\n const releaseLock = await tryAcquireDirLock(lockDirPath);\n if (releaseLock) {\n return releaseLock;\n }\n\n await sleep(LOCK_RETRY_DELAY_MS);\n }\n}\n\nexport async function tryAcquireDirLock(lockDirPath: string): Promise<LockRelease | null> {\n await mkdir(dirname(lockDirPath), { recursive: true });\n\n while (true) {\n const tempLockDirPath = `${lockDirPath}-${String(process.pid)}-${String(CURRENT_PROCESS_OWNER.processStartedAtMs)}-${randomUUID()}`;\n\n try {\n await mkdir(tempLockDirPath);\n await writeLockOwner(tempLockDirPath, CURRENT_PROCESS_OWNER);\n\n try {\n await rename(tempLockDirPath, lockDirPath);\n break;\n } catch (error) {\n if (!wasDirPublishedByAnotherProcess(error, lockDirPath)) {\n throw error;\n }\n }\n } finally {\n await rm(tempLockDirPath, {\n recursive: true,\n force: true,\n }).catch(() => undefined);\n }\n\n const owner = await readLockOwner(lockDirPath);\n if (\n (!owner || (await getProcessLiveness(owner)) === \"dead\") &&\n (await tryReclaimStaleLock(lockDirPath, owner))\n ) {\n continue;\n }\n\n return null;\n }\n\n return async () => {\n await rm(lockDirPath, {\n recursive: true,\n force: true,\n }).catch(() => undefined);\n };\n}\n\nexport async function isDirLockHeld(lockDirPath: string): Promise<boolean> {\n if (!existsSync(lockDirPath)) {\n return false;\n }\n\n const owner = await readLockOwner(lockDirPath);\n if (\n (!owner || (await getProcessLiveness(owner)) === \"dead\") &&\n (await tryReclaimStaleLock(lockDirPath, owner))\n ) {\n return false;\n }\n\n return existsSync(lockDirPath);\n}\n\nfunction getErrorCode(error: unknown): string | undefined {\n return typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n typeof error.code === \"string\"\n ? error.code\n : undefined;\n}\n\nfunction wasDirPublishedByAnotherProcess(error: unknown, targetDirPath: string): boolean {\n const code = getErrorCode(error);\n return (\n existsSync(targetDirPath) && (code === \"EEXIST\" || code === \"ENOTEMPTY\" || code === \"EPERM\")\n );\n}\n\nasync function writeLockOwner(lockDirPath: string, owner: ProcessOwner): Promise<void> {\n await writeFile(join(lockDirPath, LOCK_OWNER_FILE), JSON.stringify(owner));\n}\n\nasync function readLockOwner(lockDirPath: string): Promise<ProcessOwner | null> {\n return readLockParticipant(join(lockDirPath, LOCK_OWNER_FILE));\n}\n\nasync function readLockParticipant(filePath: string): Promise<ProcessOwner | null> {\n return (await readLockParticipantRecord(filePath)).owner;\n}\n\nasync function readLockParticipantRecord(filePath: string): Promise<ProcessParticipantRecord> {\n try {\n const raw = await readFile(filePath, \"utf8\");\n return {\n exists: true,\n owner: parseProcessOwner(JSON.parse(raw)),\n };\n } catch (error) {\n return {\n exists: getErrorCode(error) !== \"ENOENT\",\n owner: null,\n };\n }\n}\n\nasync function readLockReclaimerRecord(lockDirPath: string): Promise<ProcessParticipantRecord> {\n return readLockParticipantRecord(join(buildLockReclaimerDirPath(lockDirPath), LOCK_OWNER_FILE));\n}\n\nasync function tryReclaimStaleLock(\n lockDirPath: string,\n expectedOwner: ProcessOwner | null,\n): Promise<boolean> {\n if (!(await tryAcquireLockReclaimer(lockDirPath))) {\n return false;\n }\n\n let reclaimed = false;\n try {\n const owner = await readLockOwner(lockDirPath);\n if (!processOwnersEqual(owner, expectedOwner)) {\n return false;\n }\n if (owner && (await getProcessLiveness(owner)) !== \"dead\") {\n return false;\n }\n\n await rm(lockDirPath, {\n recursive: true,\n force: true,\n }).catch(() => undefined);\n reclaimed = !existsSync(lockDirPath);\n return reclaimed;\n } finally {\n if (!reclaimed) {\n await rm(buildLockReclaimerDirPath(lockDirPath), {\n recursive: true,\n force: true,\n }).catch(() => undefined);\n }\n }\n}\n\nasync function tryAcquireLockReclaimer(lockDirPath: string): Promise<boolean> {\n const reclaimerDirPath = buildLockReclaimerDirPath(lockDirPath);\n\n while (true) {\n const tempReclaimerDirPath = `${reclaimerDirPath}-${String(process.pid)}-${String(CURRENT_PROCESS_OWNER.processStartedAtMs)}-${randomUUID()}`;\n\n try {\n await mkdir(tempReclaimerDirPath);\n await writeLockOwner(tempReclaimerDirPath, CURRENT_PROCESS_OWNER);\n\n try {\n await rename(tempReclaimerDirPath, reclaimerDirPath);\n return true;\n } catch (error) {\n if (getErrorCode(error) === \"ENOENT\") {\n return false;\n }\n if (!wasDirPublishedByAnotherProcess(error, reclaimerDirPath)) {\n throw error;\n }\n }\n } catch (error) {\n if (getErrorCode(error) === \"ENOENT\") {\n return false;\n }\n throw error;\n } finally {\n await rm(tempReclaimerDirPath, {\n recursive: true,\n force: true,\n }).catch(() => undefined);\n }\n\n const reclaimerRecord = await readLockReclaimerRecord(lockDirPath);\n if (!reclaimerRecord.exists || !reclaimerRecord.owner) {\n return false;\n }\n if ((await getProcessLiveness(reclaimerRecord.owner)) !== \"dead\") {\n return false;\n }\n\n await rm(reclaimerDirPath, {\n recursive: true,\n force: true,\n }).catch(() => undefined);\n }\n}\n\nfunction buildLockReclaimerDirPath(lockDirPath: string): string {\n return join(lockDirPath, LOCK_RECLAIMER_DIR);\n}\n\nasync function sleep(ms: number): Promise<void> {\n await new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { spawn } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { acquireDirLock } from \"../local-browser/dir-lock.js\";\nimport {\n clearLocalViewServiceState,\n getLocalViewServiceStateLiveness,\n isLocalViewServiceStateLive,\n readLocalViewServiceState,\n type PersistedLocalViewServiceState,\n} from \"./service-state.js\";\nimport { resolveLocalViewServiceLockDir } from \"./runtime-dir.js\";\n\nconst LOCAL_VIEW_STARTUP_TIMEOUT_MS = 10_000;\nconst LOCAL_VIEW_STARTUP_POLL_MS = 100;\nconst LOCAL_VIEW_STOP_TIMEOUT_MS = 10_000;\n\nexport async function ensureLocalViewServiceRunning(): Promise<{\n readonly url: string;\n readonly token: string;\n}> {\n const current = await readReachableLocalViewServiceState();\n if (current !== undefined) {\n return current;\n }\n\n const releaseLock = await acquireDirLock(resolveLocalViewServiceLockDir());\n try {\n const lockedState = await readReachableLocalViewServiceState();\n if (lockedState !== undefined) {\n return lockedState;\n }\n\n await spawnLocalViewService();\n const started = await waitForLocalViewService();\n if (!started) {\n throw new Error(\"Timed out while starting the local view service.\");\n }\n return started;\n } finally {\n await releaseLock();\n }\n}\n\nexport async function stopLocalViewService(): Promise<boolean> {\n const state = await readLocalViewServiceState();\n if (state === undefined || !(await isLocalViewServiceStateLive(state))) {\n await clearLocalViewServiceState(\n state === undefined ? undefined : { pid: state.pid, token: state.token },\n );\n return false;\n }\n\n const liveState = state;\n const stopRequested = await requestLocalViewServiceStop(liveState).catch(() => false);\n if (!stopRequested && (await getLocalViewServiceStateLiveness(liveState)) !== \"dead\") {\n process.kill(liveState.pid);\n }\n\n await waitForLocalViewServiceStop(liveState);\n await clearLocalViewServiceState({ pid: liveState.pid, token: liveState.token });\n return true;\n}\n\nexport async function readLocalViewDashboardUrl(): Promise<string | undefined> {\n return (await readReachableLocalViewServiceState())?.url;\n}\n\nexport function buildLocalViewSessionUrl(args: {\n readonly baseUrl: string;\n readonly sessionId?: string;\n}): string {\n if (!args.sessionId) {\n return args.baseUrl;\n }\n return `${args.baseUrl}#session=${encodeURIComponent(args.sessionId)}`;\n}\n\nasync function requestLocalViewServiceStop(\n state: PersistedLocalViewServiceState,\n): Promise<boolean> {\n const response = await fetch(new URL(\"/api/service/stop\", state.url), {\n method: \"POST\",\n headers: {\n \"x-opensteer-local-token\": state.token,\n },\n });\n return response.ok;\n}\n\nasync function waitForLocalViewServiceStop(state: PersistedLocalViewServiceState): Promise<void> {\n const deadline = Date.now() + LOCAL_VIEW_STOP_TIMEOUT_MS;\n while (Date.now() < deadline) {\n if ((await getLocalViewServiceStateLiveness(state)) === \"dead\") {\n return;\n }\n await delay(LOCAL_VIEW_STARTUP_POLL_MS);\n }\n\n throw new Error(\"Timed out while stopping the local view service.\");\n}\n\nfunction spawnLocalViewService(): void {\n const command = resolveLocalViewSpawnCommand();\n const child = spawn(command.executable, command.args, {\n cwd: process.cwd(),\n env: {\n ...process.env,\n ...(command.env ?? {}),\n OPENSTEER_LOCAL_VIEW_BOOT_TOKEN:\n process.env.OPENSTEER_LOCAL_VIEW_BOOT_TOKEN ?? randomBytes(24).toString(\"hex\"),\n },\n detached: process.platform !== \"win32\",\n stdio: \"ignore\",\n });\n child.unref();\n}\n\nasync function waitForLocalViewService(): Promise<\n | {\n readonly url: string;\n readonly token: string;\n }\n | undefined\n> {\n const deadline = Date.now() + LOCAL_VIEW_STARTUP_TIMEOUT_MS;\n while (Date.now() < deadline) {\n const state = await readReachableLocalViewServiceState();\n if (state !== undefined) {\n return state;\n }\n await delay(LOCAL_VIEW_STARTUP_POLL_MS);\n }\n return undefined;\n}\n\nasync function readReachableLocalViewServiceState(): Promise<\n PersistedLocalViewServiceState | undefined\n> {\n const state = await readLocalViewServiceState();\n if (state === undefined || !(await isLocalViewServiceStateLive(state))) {\n return undefined;\n }\n return (await isLocalViewServiceReachable(state.url, state.token)) ? state : undefined;\n}\n\nasync function isLocalViewServiceReachable(baseUrl: string, token: string): Promise<boolean> {\n try {\n const response = await fetch(new URL(\"/api/health\", baseUrl), {\n headers: {\n \"x-opensteer-local-token\": token,\n },\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n\nfunction resolveLocalViewSpawnCommand(): {\n readonly executable: string;\n readonly args: readonly string[];\n readonly env?: Readonly<Record<string, string>>;\n} {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const distServicePath = findExistingPath([\n path.join(moduleDir, \"local-view\", \"serve-entry.js\"),\n path.join(moduleDir, \"serve-entry.js\"),\n path.join(moduleDir, \"..\", \"local-view\", \"serve-entry.js\"),\n ]);\n if (distServicePath) {\n return {\n executable: process.execPath,\n args: [distServicePath],\n };\n }\n\n const distCliPath = findExistingPath([\n path.join(moduleDir, \"cli\", \"bin.js\"),\n path.join(moduleDir, \"..\", \"cli\", \"bin.js\"),\n ]);\n if (distCliPath) {\n return {\n executable: process.execPath,\n args: [distCliPath, \"view\", \"serve\"],\n };\n }\n\n const srcServicePath = findExistingPath([\n path.join(moduleDir, \"serve-entry.ts\"),\n path.join(moduleDir, \"..\", \"local-view\", \"serve-entry.ts\"),\n path.join(moduleDir, \"..\", \"src\", \"local-view\", \"serve-entry.ts\"),\n ]);\n if (srcServicePath) {\n const require = createRequire(import.meta.url);\n const tsxLoaderPath = require.resolve(\"tsx\");\n const tsconfigPath = findNearestTsconfig(path.resolve(moduleDir, \"..\", \"..\", \"..\"));\n return {\n executable: process.execPath,\n args: [\"--import\", tsxLoaderPath, srcServicePath],\n ...(tsconfigPath ? { env: { TSX_TSCONFIG_PATH: tsconfigPath } } : {}),\n };\n }\n\n const srcCliPath = findExistingPath([\n path.join(moduleDir, \"..\", \"cli\", \"bin.ts\"),\n path.join(moduleDir, \"..\", \"src\", \"cli\", \"bin.ts\"),\n ]);\n if (srcCliPath) {\n const require = createRequire(import.meta.url);\n const tsxLoaderPath = require.resolve(\"tsx\");\n const tsconfigPath = findNearestTsconfig(path.resolve(moduleDir, \"..\", \"..\", \"..\"));\n return {\n executable: process.execPath,\n args: [\"--import\", tsxLoaderPath, srcCliPath, \"view\", \"serve\"],\n ...(tsconfigPath ? { env: { TSX_TSCONFIG_PATH: tsconfigPath } } : {}),\n };\n }\n\n throw new Error(`Could not resolve the Opensteer CLI entrypoint from ${moduleDir}.`);\n}\n\nfunction findExistingPath(candidates: readonly string[]): string | undefined {\n return candidates.find((candidate) => existsSync(candidate));\n}\n\nfunction findNearestTsconfig(startDir: string): string | undefined {\n let currentDir = startDir;\n while (true) {\n const candidate = path.join(currentDir, \"tsconfig.json\");\n if (existsSync(candidate)) {\n return candidate;\n }\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n return undefined;\n }\n currentDir = parentDir;\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n","import type { PersistedLocalBrowserSessionRecord } from \"../live-session.js\";\nimport { resolveLocalViewMode } from \"./preferences.js\";\nimport { ensureLocalViewServiceRunning } from \"./service.js\";\nimport {\n createLocalViewSessionManifest,\n deleteLocalViewSessionManifest,\n type PersistedLocalViewSessionManifest,\n writeLocalViewSessionManifest,\n} from \"./session-manifest.js\";\n\nexport async function bestEffortRegisterLocalViewSession(input: {\n readonly rootPath: string;\n readonly workspace?: string;\n readonly live: PersistedLocalBrowserSessionRecord;\n readonly ownership: \"owned\" | \"attached\" | \"managed\";\n}): Promise<PersistedLocalViewSessionManifest | undefined> {\n try {\n const manifest = createLocalViewSessionManifest(input);\n await writeLocalViewSessionManifest(manifest);\n if ((await resolveLocalViewMode()) === \"auto\") {\n void ensureLocalViewServiceRunning().catch(() => undefined);\n }\n return manifest;\n } catch {\n return undefined;\n }\n}\n\nexport async function bestEffortUnregisterLocalViewSession(\n sessionId: string | undefined,\n): Promise<void> {\n if (!sessionId) {\n return;\n }\n await deleteLocalViewSessionManifest(sessionId).catch(() => undefined);\n}\n","import { spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { mkdtemp, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\n\nimport type { BrowserCoreEngine } from \"@opensteer/browser-core\";\nimport {\n connectPlaywrightChromiumBrowser,\n createPlaywrightBrowserCoreEngine,\n disconnectPlaywrightChromiumBrowser,\n} from \"@opensteer/engine-playwright\";\nimport type {\n OpensteerAttachBrowserOptions,\n OpensteerBrowserContextOptions,\n OpensteerBrowserLaunchOptions,\n OpensteerBrowserOptions,\n} from \"@opensteer/protocol\";\n\nimport { isProcessRunning } from \"./local-browser/process-owner.js\";\nimport {\n clearChromeSingletonEntries,\n sanitizeChromeProfile,\n} from \"./local-browser/chrome-singletons.js\";\nimport {\n readDevToolsActivePort,\n resolveChromeExecutablePath,\n} from \"./local-browser/chrome-discovery.js\";\nimport { inspectCdpEndpoint, selectAttachBrowserCandidate } from \"./local-browser/cdp-discovery.js\";\nimport { createBrowserProfileSnapshot } from \"./local-browser/profile-clone.js\";\nimport { injectBrowserStealthScripts } from \"./local-browser/stealth.js\";\nimport type { ConnectedCdpPage } from \"./local-browser/types.js\";\nimport { generateStealthProfile, type StealthProfile } from \"./local-browser/stealth-profiles.js\";\nimport {\n createFilesystemOpensteerWorkspace,\n resolveFilesystemWorkspacePath,\n type FilesystemOpensteerWorkspace,\n} from \"./root.js\";\nimport {\n clearPersistedSessionRecord,\n readPersistedLocalBrowserSessionRecord,\n writePersistedSessionRecord,\n type PersistedLocalBrowserSessionRecord,\n} from \"./live-session.js\";\nimport type { OpensteerEnvironment } from \"./env.js\";\nimport {\n bestEffortRegisterLocalViewSession,\n bestEffortUnregisterLocalViewSession,\n} from \"./local-view/registration.js\";\nimport { buildLocalViewSessionId } from \"./local-view/session-manifest.js\";\nimport {\n ensureDirectory,\n pathExists,\n readJsonFile,\n writeJsonFileAtomic,\n} from \"./internal/filesystem.js\";\nimport {\n assertSupportedEngineOptions,\n DEFAULT_OPENSTEER_ENGINE,\n toAbpLaunchOptions,\n type OpensteerEngineName,\n} from \"./internal/engine-selection.js\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEVTOOLS_POLL_INTERVAL_MS = 50;\nconst TEMPORARY_WORKSPACE_PREFIX = \"opensteer-temporary-workspace-\";\nconst BROWSER_CLOSE_TIMEOUT_MS = 5_000;\n\ntype DisposableBrowserCoreEngine = BrowserCoreEngine & {\n dispose?: () => Promise<void>;\n [Symbol.asyncDispose]?: () => Promise<void>;\n};\n\nexport interface WorkspaceBrowserBootstrap {\n readonly kind: \"empty\" | \"cloneLocalProfile\";\n readonly sourceUserDataDir?: string;\n readonly sourceProfileDirectory?: string;\n}\n\nexport interface WorkspaceBrowserManifest {\n readonly mode: \"persistent\";\n readonly createdAt: number;\n readonly updatedAt: number;\n readonly userDataDir: \"browser/user-data\";\n readonly bootstrap: WorkspaceBrowserBootstrap;\n}\n\nexport interface WorkspaceLiveBrowserRecord {\n readonly mode: \"persistent\";\n readonly engine: OpensteerEngineName;\n readonly endpoint?: string;\n readonly baseUrl?: string;\n readonly remoteDebuggingUrl?: string;\n readonly sessionDir?: string;\n readonly pid: number;\n readonly startedAt: number;\n readonly executablePath?: string;\n readonly userDataDir: string;\n}\n\nexport interface OpensteerBrowserStatus {\n readonly mode: \"temporary\" | \"persistent\" | \"attach\";\n readonly engine: OpensteerEngineName;\n readonly workspace?: string;\n readonly live: boolean;\n}\n\nexport interface OpensteerBrowserManagerOptions {\n readonly rootDir?: string;\n readonly rootPath?: string;\n readonly workspace?: string;\n readonly engineName?: OpensteerEngineName;\n readonly environment?: OpensteerEnvironment;\n readonly browser?: OpensteerBrowserOptions;\n readonly launch?: OpensteerBrowserLaunchOptions;\n readonly context?: OpensteerBrowserContextOptions;\n}\n\nexport class OpensteerBrowserManager {\n readonly mode: \"temporary\" | \"persistent\" | \"attach\";\n readonly engineName: OpensteerEngineName;\n readonly rootPath: string;\n readonly workspace: string | undefined;\n readonly cleanupRootOnDisconnect: boolean;\n\n private readonly browserOptions: OpensteerAttachBrowserOptions | undefined;\n private readonly launchOptions: OpensteerBrowserLaunchOptions | undefined;\n private readonly contextOptions: OpensteerBrowserContextOptions | undefined;\n private workspaceStore: FilesystemOpensteerWorkspace | undefined;\n\n constructor(options: OpensteerBrowserManagerOptions = {}) {\n this.workspace = normalizeWorkspace(options.workspace);\n this.mode = resolveBrowserMode(this.workspace, options.browser);\n this.browserOptions = isAttachBrowserOptions(options.browser) ? options.browser : undefined;\n this.launchOptions = resolveLaunchOptions(options.launch, options.environment ?? process.env);\n this.engineName = options.engineName ?? DEFAULT_OPENSTEER_ENGINE;\n this.contextOptions = normalizeBrowserContextOptions(\n options.context,\n options.environment ?? process.env,\n this.engineName,\n );\n assertSupportedEngineOptions({\n engineName: this.engineName,\n ...(options.browser === undefined ? {} : { browser: options.browser }),\n ...(this.contextOptions === undefined ? {} : { context: this.contextOptions }),\n });\n this.rootPath =\n options.rootPath ??\n (this.workspace === undefined\n ? path.join(tmpdir(), `${TEMPORARY_WORKSPACE_PREFIX}${randomUUID()}`)\n : resolveFilesystemWorkspacePath({\n rootDir: path.resolve(options.rootDir ?? process.cwd()),\n workspace: this.workspace,\n }));\n this.cleanupRootOnDisconnect = this.workspace === undefined;\n }\n\n async createEngine(): Promise<DisposableBrowserCoreEngine> {\n if (this.mode === \"persistent\") {\n const effectiveEngine = (await this.resolveLivePersistentEngineName()) ?? this.engineName;\n if (effectiveEngine === \"abp\") {\n return this.createAbpEngine();\n }\n return this.createPersistentEngine();\n }\n\n if (this.engineName === \"abp\") {\n return this.createAbpEngine();\n }\n if (this.mode === \"temporary\") {\n return this.createTemporaryEngine();\n }\n if (this.mode === \"attach\") {\n return this.createAttachEngine();\n }\n return this.createPersistentEngine();\n }\n\n async status(): Promise<OpensteerBrowserStatus> {\n if (this.mode === \"temporary\") {\n return {\n mode: \"temporary\",\n engine: this.engineName,\n live: false,\n };\n }\n\n const liveRecord = await this.readLivePersistentBrowser(await this.ensureWorkspaceStore());\n return {\n mode: this.mode,\n engine: liveRecord?.engine ?? this.engineName,\n ...(this.workspace === undefined ? {} : { workspace: this.workspace }),\n live: liveRecord !== undefined,\n };\n }\n\n async clonePersistentBrowser(input: {\n readonly sourceUserDataDir: string;\n readonly sourceProfileDirectory?: string;\n }): Promise<WorkspaceBrowserManifest> {\n this.requirePersistentMode(\"clone\");\n const workspace = await this.ensureWorkspaceStore();\n return workspace.lock(async () => {\n await this.assertPersistentBrowserClosed(workspace);\n await rm(workspace.browserPath, { recursive: true, force: true });\n await ensureDirectory(workspace.browserUserDataDir);\n await clearChromeSingletonEntries(workspace.browserUserDataDir);\n await createBrowserProfileSnapshot({\n sourceUserDataDir: input.sourceUserDataDir,\n targetUserDataDir: workspace.browserUserDataDir,\n ...(input.sourceProfileDirectory === undefined\n ? {}\n : { profileDirectory: input.sourceProfileDirectory }),\n copyMode: \"full\",\n });\n const manifest: WorkspaceBrowserManifest = {\n mode: \"persistent\",\n createdAt: Date.now(),\n updatedAt: Date.now(),\n userDataDir: \"browser/user-data\",\n bootstrap: {\n kind: \"cloneLocalProfile\",\n sourceUserDataDir: path.resolve(input.sourceUserDataDir),\n ...(input.sourceProfileDirectory === undefined\n ? {}\n : { sourceProfileDirectory: input.sourceProfileDirectory }),\n },\n };\n await writeJsonFileAtomic(workspace.browserManifestPath, manifest);\n return manifest;\n });\n }\n\n async reset(): Promise<void> {\n this.requirePersistentMode(\"reset\");\n const workspace = await this.ensureWorkspaceStore();\n await workspace.lock(async () => {\n await this.closePersistentBrowser(workspace);\n await rm(resolveAbpSessionDir(workspace), { recursive: true, force: true });\n await rm(workspace.browserPath, { recursive: true, force: true });\n await clearPersistedSessionRecord(workspace.rootPath, \"local\");\n await ensureDirectory(workspace.browserUserDataDir);\n });\n }\n\n async delete(): Promise<void> {\n this.requirePersistentMode(\"delete\");\n const workspace = await this.ensureWorkspaceStore();\n await workspace.lock(async () => {\n await this.closePersistentBrowser(workspace);\n await rm(resolveAbpSessionDir(workspace), { recursive: true, force: true });\n await rm(workspace.browserPath, { recursive: true, force: true });\n await clearPersistedSessionRecord(workspace.rootPath, \"local\");\n });\n }\n\n async close(): Promise<void> {\n if (this.mode !== \"persistent\") {\n return;\n }\n\n const workspace = await this.ensureWorkspaceStore();\n await workspace.lock(async () => {\n await this.closePersistentBrowser(workspace);\n });\n }\n\n private async createAbpEngine(): Promise<DisposableBrowserCoreEngine> {\n if (this.mode === \"attach\") {\n throw new Error(\n 'ABP engine does not support browser.mode=\"attach\". Use the Playwright engine for attach flows.',\n );\n }\n if (this.mode === \"temporary\") {\n return this.createTemporaryAbpEngine();\n }\n return this.createPersistentAbpEngine();\n }\n\n private async createTemporaryAbpEngine(): Promise<DisposableBrowserCoreEngine> {\n const workspace = await this.ensureWorkspaceStore();\n await clearChromeSingletonEntries(workspace.browserUserDataDir);\n const { createAbpBrowserCoreEngine } = await loadAbpModule();\n const launch = toAbpLaunchOptions({\n ...(this.launchOptions === undefined ? {} : { launch: this.launchOptions }),\n ...(this.contextOptions === undefined ? {} : { context: this.contextOptions }),\n userDataDir: workspace.browserUserDataDir,\n sessionDir: resolveAbpSessionDir(workspace),\n });\n return (await createAbpBrowserCoreEngine(\n launch === undefined ? {} : { launch },\n )) as DisposableBrowserCoreEngine;\n }\n\n private async createPersistentAbpEngine(): Promise<DisposableBrowserCoreEngine> {\n const workspace = await this.ensureWorkspaceStore();\n return workspace.lock(async () => {\n const live = await this.readLivePersistentBrowser(workspace);\n if (live !== undefined) {\n if (live.engine !== \"abp\") {\n throw new Error(\n `workspace \"${this.workspace}\" already has a live ${live.engine} browser. Close it before reopening with engine \"abp\".`,\n );\n }\n await bestEffortRegisterLocalViewSession({\n rootPath: workspace.rootPath,\n ...(this.workspace === undefined ? {} : { workspace: this.workspace }),\n live: toPersistedLocalBrowserSessionRecord(this.workspace, live),\n ownership: \"owned\",\n });\n return this.createAdoptedAbpEngine(live);\n }\n\n await this.ensurePersistentBrowserManifest(workspace);\n await clearChromeSingletonEntries(workspace.browserUserDataDir);\n const { launchAbpProcess } = await loadAbpModule();\n const launch = toAbpLaunchOptions({\n ...(this.launchOptions === undefined ? {} : { launch: this.launchOptions }),\n ...(this.contextOptions === undefined ? {} : { context: this.contextOptions }),\n userDataDir: workspace.browserUserDataDir,\n sessionDir: resolveAbpSessionDir(workspace),\n });\n const launched = await launchAbpProcess({\n port: await allocateEphemeralPort(),\n userDataDir: workspace.browserUserDataDir,\n sessionDir: resolveAbpSessionDir(workspace),\n headless: launch?.headless ?? true,\n args: launch?.args ?? [],\n verbose: false,\n ...(launch?.browserExecutablePath === undefined\n ? {}\n : { browserExecutablePath: launch.browserExecutablePath }),\n });\n const liveRecord: WorkspaceLiveBrowserRecord = {\n mode: \"persistent\",\n engine: \"abp\",\n baseUrl: launched.baseUrl,\n remoteDebuggingUrl: launched.remoteDebuggingUrl,\n pid: launched.process.pid ?? 0,\n startedAt: Date.now(),\n userDataDir: workspace.browserUserDataDir,\n sessionDir: resolveAbpSessionDir(workspace),\n ...(launch?.browserExecutablePath === undefined\n ? {}\n : { executablePath: launch.browserExecutablePath }),\n };\n await this.writeLivePersistentBrowser(workspace, liveRecord);\n const persistedLiveRecord = toPersistedLocalBrowserSessionRecord(this.workspace, liveRecord);\n await bestEffortRegisterLocalViewSession({\n rootPath: workspace.rootPath,\n ...(this.workspace === undefined ? {} : { workspace: this.workspace }),\n live: persistedLiveRecord,\n ownership: \"owned\",\n });\n\n try {\n return await this.createAdoptedAbpEngine(liveRecord);\n } catch (error) {\n await this.unregisterLocalViewSessionForRecord(workspace.rootPath, persistedLiveRecord);\n await terminateProcess(launched.process.pid ?? 0).catch(() => undefined);\n await clearPersistedSessionRecord(workspace.rootPath, \"local\").catch(() => undefined);\n throw error;\n }\n });\n }\n\n private async createAdoptedAbpEngine(\n live: WorkspaceLiveBrowserRecord,\n ): Promise<DisposableBrowserCoreEngine> {\n if (live.baseUrl === undefined || live.remoteDebuggingUrl === undefined) {\n throw new Error(\"workspace live browser record is missing ABP connection metadata.\");\n }\n\n const { createAbpBrowserCoreEngine } = await loadAbpModule();\n return (await createAbpBrowserCoreEngine({\n browser: {\n baseUrl: live.baseUrl,\n remoteDebuggingUrl: live.remoteDebuggingUrl,\n },\n })) as DisposableBrowserCoreEngine;\n }\n\n private async createTemporaryEngine(): Promise<DisposableBrowserCoreEngine> {\n const userDataDir = await mkdtemp(path.join(tmpdir(), \"opensteer-temporary-browser-\"));\n await clearChromeSingletonEntries(userDataDir);\n const launched = await launchOwnedBrowser({\n userDataDir,\n cleanupUserDataDir: userDataDir,\n ...(this.launchOptions === undefined ? {} : { launch: this.launchOptions }),\n ...(this.contextOptions?.viewport === undefined\n ? {}\n : { viewport: this.contextOptions.viewport }),\n });\n const temporaryLiveRecord: PersistedLocalBrowserSessionRecord = {\n layout: \"opensteer-session\",\n version: 1,\n provider: \"local\",\n engine: \"playwright\",\n endpoint: launched.endpoint,\n pid: launched.pid,\n startedAt: Date.now(),\n updatedAt: Date.now(),\n executablePath: launched.executablePath,\n userDataDir,\n };\n await writePersistedSessionRecord(this.rootPath, temporaryLiveRecord);\n const localViewManifest = await bestEffortRegisterLocalViewSession({\n rootPath: this.rootPath,\n live: temporaryLiveRecord,\n ownership: \"owned\",\n });\n try {\n return await this.createAttachedEngine({\n endpoint: launched.endpoint,\n freshTab: false,\n onDispose: async () => {\n await bestEffortUnregisterLocalViewSession(localViewManifest?.sessionId);\n await clearPersistedSessionRecord(this.rootPath, \"local\").catch(() => undefined);\n await terminateProcess(launched.pid).catch(() => undefined);\n await rm(userDataDir, { recursive: true, force: true }).catch(() => undefined);\n },\n });\n } catch (error) {\n await bestEffortUnregisterLocalViewSession(localViewManifest?.sessionId);\n await clearPersistedSessionRecord(this.rootPath, \"local\").catch(() => undefined);\n await terminateProcess(launched.pid).catch(() => undefined);\n await rm(userDataDir, { recursive: true, force: true }).catch(() => undefined);\n throw error;\n }\n }\n\n private async createAttachEngine(): Promise<DisposableBrowserCoreEngine> {\n const endpoint = await resolveAttachEndpoint(this.browserOptions);\n return this.createAttachedEngine({\n endpoint,\n ...(this.browserOptions?.headers === undefined\n ? {}\n : { headers: this.browserOptions.headers }),\n freshTab: this.browserOptions?.freshTab ?? true,\n onDispose: async () => undefined,\n });\n }\n\n private async createPersistentEngine(): Promise<DisposableBrowserCoreEngine> {\n const workspace = await this.ensureWorkspaceStore();\n return workspace.lock(async () => {\n const live = await this.readLivePersistentBrowser(workspace);\n if (live) {\n if (live.engine !== \"playwright\") {\n throw new Error(\n `workspace \"${this.workspace}\" already has a live ${live.engine} browser. Close it before reopening with engine \"playwright\".`,\n );\n }\n if (live.endpoint === undefined) {\n throw new Error(\"workspace live browser record is missing a DevTools endpoint.\");\n }\n await bestEffortRegisterLocalViewSession({\n rootPath: workspace.rootPath,\n ...(this.workspace === undefined ? {} : { workspace: this.workspace }),\n live: toPersistedLocalBrowserSessionRecord(this.workspace, live),\n ownership: \"owned\",\n });\n return this.createAttachedEngine({\n endpoint: live.endpoint,\n freshTab: false,\n onDispose: async () => undefined,\n });\n }\n\n await this.ensurePersistentBrowserManifest(workspace);\n const launched = await launchOwnedBrowser({\n userDataDir: workspace.browserUserDataDir,\n ...(this.launchOptions === undefined ? {} : { launch: this.launchOptions }),\n ...(this.contextOptions?.viewport === undefined\n ? {}\n : { viewport: this.contextOptions.viewport }),\n });\n const liveRecord: WorkspaceLiveBrowserRecord = {\n mode: \"persistent\",\n engine: \"playwright\",\n endpoint: launched.endpoint,\n pid: launched.pid,\n startedAt: Date.now(),\n executablePath: launched.executablePath,\n userDataDir: workspace.browserUserDataDir,\n };\n await this.writeLivePersistentBrowser(workspace, liveRecord);\n const persistedLiveRecord = toPersistedLocalBrowserSessionRecord(this.workspace, liveRecord);\n await bestEffortRegisterLocalViewSession({\n rootPath: workspace.rootPath,\n ...(this.workspace === undefined ? {} : { workspace: this.workspace }),\n live: persistedLiveRecord,\n ownership: \"owned\",\n });\n\n try {\n return await this.createAttachedEngine({\n endpoint: launched.endpoint,\n freshTab: false,\n onDispose: async () => undefined,\n });\n } catch (error) {\n await this.unregisterLocalViewSessionForRecord(workspace.rootPath, persistedLiveRecord);\n await terminateProcess(launched.pid).catch(() => undefined);\n await clearPersistedSessionRecord(workspace.rootPath, \"local\").catch(() => undefined);\n throw error;\n }\n });\n }\n\n private async createAttachedEngine(input: {\n readonly endpoint: string;\n readonly headers?: Readonly<Record<string, string>>;\n readonly freshTab: boolean;\n readonly onDispose: () => Promise<void>;\n }): Promise<DisposableBrowserCoreEngine> {\n const browser = await connectPlaywrightChromiumBrowser({\n url: input.endpoint,\n ...(input.headers === undefined ? {} : { headers: input.headers }),\n });\n try {\n const context = browser.contexts()[0];\n if (!context) {\n throw new Error(\"Connected browser did not expose a Chromium browser context.\");\n }\n\n const page =\n input.freshTab || context.pages()[0] === undefined\n ? await context.newPage()\n : context.pages()[0]!;\n await page.bringToFront?.();\n\n const stealthProfile = resolveStealthProfile(this.contextOptions?.stealthProfile);\n await injectBrowserStealthScripts(\n context as Parameters<typeof injectBrowserStealthScripts>[0],\n stealthProfile === undefined\n ? {}\n : {\n profile: stealthProfile,\n page: page as ConnectedCdpPage,\n },\n );\n\n const engine = (await createPlaywrightBrowserCoreEngine({\n browser: browser as never,\n attachedContext: context,\n attachedPage: page,\n closeAttachedContextOnSessionClose: false,\n closeBrowserOnDispose: false,\n ...(this.contextOptions === undefined\n ? {}\n : { context: toEngineBrowserContextOptions(this.contextOptions) }),\n })) as DisposableBrowserCoreEngine;\n\n const originalDispose = engine.dispose?.bind(engine);\n const originalAsyncDispose = engine[Symbol.asyncDispose]?.bind(engine);\n let disposed = false;\n const disposeConnection = async () => {\n if (disposed) {\n return;\n }\n disposed = true;\n try {\n await originalDispose?.();\n } finally {\n await disconnectPlaywrightChromiumBrowser(browser).catch(() => undefined);\n await input.onDispose().catch(() => undefined);\n }\n };\n\n engine.dispose = disposeConnection;\n engine[Symbol.asyncDispose] = async () => {\n if (disposed) {\n return;\n }\n disposed = true;\n try {\n await originalAsyncDispose?.();\n } finally {\n await disconnectPlaywrightChromiumBrowser(browser).catch(() => undefined);\n await input.onDispose().catch(() => undefined);\n }\n };\n return engine;\n } catch (error) {\n await disconnectPlaywrightChromiumBrowser(browser).catch(() => undefined);\n throw error;\n }\n }\n\n private async ensureWorkspaceStore(): Promise<FilesystemOpensteerWorkspace> {\n this.workspaceStore ??= await createFilesystemOpensteerWorkspace({\n rootPath: this.rootPath,\n ...(this.workspace === undefined ? {} : { workspace: this.workspace }),\n scope: this.workspace === undefined ? \"temporary\" : \"workspace\",\n });\n return this.workspaceStore;\n }\n\n private async ensurePersistentBrowserManifest(\n workspace: FilesystemOpensteerWorkspace,\n ): Promise<WorkspaceBrowserManifest> {\n const existing = await this.readBrowserManifest(workspace);\n if (existing) {\n return existing;\n }\n\n const now = Date.now();\n const manifest: WorkspaceBrowserManifest = {\n mode: \"persistent\",\n createdAt: now,\n updatedAt: now,\n userDataDir: \"browser/user-data\",\n bootstrap: {\n kind: \"empty\",\n },\n };\n await ensureDirectory(workspace.browserUserDataDir);\n await writeJsonFileAtomic(workspace.browserManifestPath, manifest);\n return manifest;\n }\n\n private async readBrowserManifest(\n workspace: FilesystemOpensteerWorkspace,\n ): Promise<WorkspaceBrowserManifest | undefined> {\n if (!(await pathExists(workspace.browserManifestPath))) {\n return undefined;\n }\n return readJsonFile<WorkspaceBrowserManifest>(workspace.browserManifestPath);\n }\n\n private async readLivePersistentBrowser(\n workspace: FilesystemOpensteerWorkspace,\n ): Promise<WorkspaceLiveBrowserRecord | undefined> {\n const live = await this.readStoredLiveBrowser(workspace);\n if (live === undefined) {\n return undefined;\n }\n if (!isProcessRunning(live.pid)) {\n await clearPersistedSessionRecord(workspace.rootPath, \"local\").catch(() => undefined);\n return undefined;\n }\n if (live.engine === \"playwright\") {\n if (live.endpoint === undefined || !(await isEndpointReachable(live.endpoint))) {\n throw new Error(\n `workspace \"${this.workspace}\" browser process ${String(live.pid)} is still running, but its DevTools endpoint is unavailable`,\n );\n }\n return live;\n }\n\n if (live.baseUrl === undefined || !(await isAbpBaseUrlReachable(live.baseUrl))) {\n throw new Error(\n `workspace \"${this.workspace}\" browser process ${String(live.pid)} is still running, but its ABP endpoint is unavailable`,\n );\n }\n return live;\n }\n\n private async readStoredLiveBrowser(\n workspace: FilesystemOpensteerWorkspace,\n ): Promise<WorkspaceLiveBrowserRecord | undefined> {\n const live = await readPersistedLocalBrowserSessionRecord(workspace.rootPath);\n return live === undefined ? undefined : toWorkspaceLiveBrowserRecord(live);\n }\n\n private async resolveLivePersistentEngineName(): Promise<OpensteerEngineName | undefined> {\n if (this.mode !== \"persistent\") {\n return undefined;\n }\n\n const workspace = await this.ensureWorkspaceStore();\n const live = await this.readStoredLiveBrowser(workspace);\n return live?.engine;\n }\n\n private async assertPersistentBrowserClosed(\n workspace: FilesystemOpensteerWorkspace,\n ): Promise<void> {\n if ((await this.readLivePersistentBrowser(workspace)) !== undefined) {\n throw new Error(\n `workspace \"${this.workspace}\" already has a live browser. Close it before changing the saved profile.`,\n );\n }\n }\n\n private async closePersistentBrowser(workspace: FilesystemOpensteerWorkspace): Promise<void> {\n const live = await this.readStoredLiveBrowser(workspace);\n if (!live) {\n await clearPersistedSessionRecord(workspace.rootPath, \"local\").catch(() => undefined);\n return;\n }\n await this.unregisterLocalViewSessionForRecord(\n workspace.rootPath,\n toPersistedLocalBrowserSessionRecord(this.workspace, live),\n );\n\n if (live.engine === \"playwright\") {\n if (live.endpoint !== undefined) {\n await requestBrowserClose(live.endpoint).catch(() => undefined);\n }\n if (await waitForProcessExit(live.pid, BROWSER_CLOSE_TIMEOUT_MS)) {\n await clearPersistedSessionRecord(workspace.rootPath, \"local\").catch(() => undefined);\n return;\n }\n await terminateProcess(live.pid).catch(() => undefined);\n await clearPersistedSessionRecord(workspace.rootPath, \"local\").catch(() => undefined);\n return;\n }\n\n await terminateProcess(live.pid).catch(() => undefined);\n await clearPersistedSessionRecord(workspace.rootPath, \"local\").catch(() => undefined);\n }\n\n private async writeLivePersistentBrowser(\n workspace: FilesystemOpensteerWorkspace,\n live: WorkspaceLiveBrowserRecord,\n ): Promise<void> {\n await writePersistedSessionRecord(\n workspace.rootPath,\n toPersistedLocalBrowserSessionRecord(this.workspace, live),\n );\n }\n\n private requirePersistentMode(method: \"clone\" | \"reset\" | \"delete\"): void {\n if (this.mode !== \"persistent\" || this.workspace === undefined) {\n throw new Error(`browser.${method}() requires a persistent workspace browser.`);\n }\n }\n\n private async unregisterLocalViewSessionForRecord(\n rootPath: string,\n record: PersistedLocalBrowserSessionRecord,\n ): Promise<void> {\n await bestEffortUnregisterLocalViewSession(\n buildLocalViewSessionId({\n rootPath,\n pid: record.pid,\n startedAt: record.startedAt,\n }),\n );\n }\n}\n\nfunction normalizeWorkspace(workspace: string | undefined): string | undefined {\n const normalized = workspace?.trim();\n return normalized === undefined || normalized.length === 0 ? undefined : normalized;\n}\n\nfunction resolveLaunchOptions(\n launch: OpensteerBrowserLaunchOptions | undefined,\n environment: OpensteerEnvironment,\n): OpensteerBrowserLaunchOptions | undefined {\n if (launch?.executablePath !== undefined) {\n return launch;\n }\n\n const executablePath = normalizeConfiguredExecutablePath(environment.OPENSTEER_EXECUTABLE_PATH);\n if (executablePath === undefined) {\n return launch;\n }\n\n return {\n ...(launch ?? {}),\n executablePath,\n };\n}\n\nfunction normalizeConfiguredExecutablePath(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length === 0 ? undefined : trimmed;\n}\n\nfunction toPersistedLocalBrowserSessionRecord(\n workspace: string | undefined,\n live: WorkspaceLiveBrowserRecord,\n): PersistedLocalBrowserSessionRecord {\n return {\n layout: \"opensteer-session\",\n version: 1,\n provider: \"local\",\n ...(workspace === undefined ? {} : { workspace }),\n engine: live.engine,\n ...(live.endpoint === undefined ? {} : { endpoint: live.endpoint }),\n ...(live.baseUrl === undefined ? {} : { baseUrl: live.baseUrl }),\n ...(live.remoteDebuggingUrl === undefined\n ? {}\n : { remoteDebuggingUrl: live.remoteDebuggingUrl }),\n ...(live.sessionDir === undefined ? {} : { sessionDir: live.sessionDir }),\n pid: live.pid,\n startedAt: live.startedAt,\n updatedAt: Date.now(),\n ...(live.executablePath === undefined ? {} : { executablePath: live.executablePath }),\n userDataDir: live.userDataDir,\n };\n}\n\nfunction toWorkspaceLiveBrowserRecord(\n record: PersistedLocalBrowserSessionRecord,\n): WorkspaceLiveBrowserRecord {\n return {\n mode: \"persistent\",\n engine: record.engine,\n ...(record.endpoint === undefined ? {} : { endpoint: record.endpoint }),\n ...(record.baseUrl === undefined ? {} : { baseUrl: record.baseUrl }),\n ...(record.remoteDebuggingUrl === undefined\n ? {}\n : { remoteDebuggingUrl: record.remoteDebuggingUrl }),\n ...(record.sessionDir === undefined ? {} : { sessionDir: record.sessionDir }),\n pid: record.pid,\n startedAt: record.startedAt,\n ...(record.executablePath === undefined ? {} : { executablePath: record.executablePath }),\n userDataDir: record.userDataDir,\n };\n}\n\nfunction resolveBrowserMode(\n workspace: string | undefined,\n browser: OpensteerBrowserOptions | undefined,\n): \"temporary\" | \"persistent\" | \"attach\" {\n if (browser === undefined) {\n return workspace === undefined ? \"temporary\" : \"persistent\";\n }\n if (browser === \"temporary\" || browser === \"persistent\") {\n return browser;\n }\n return \"attach\";\n}\n\nfunction isAttachBrowserOptions(\n browser: OpensteerBrowserOptions | undefined,\n): browser is OpensteerAttachBrowserOptions {\n return typeof browser === \"object\" && browser !== null && browser.mode === \"attach\";\n}\n\nasync function resolveAttachEndpoint(\n browser: OpensteerAttachBrowserOptions | undefined,\n): Promise<string> {\n const endpoint = browser?.endpoint?.trim();\n if (endpoint && endpoint.length > 0) {\n return endpoint;\n }\n const selection = await selectAttachBrowserCandidate({\n timeoutMs: DEFAULT_TIMEOUT_MS,\n });\n return selection.endpoint;\n}\n\nasync function launchOwnedBrowser(input: {\n readonly userDataDir: string;\n readonly cleanupUserDataDir?: string;\n readonly launch?: OpensteerBrowserLaunchOptions;\n readonly viewport?: { readonly width: number; readonly height: number } | null;\n}): Promise<{\n readonly endpoint: string;\n readonly pid: number;\n readonly executablePath: string;\n}> {\n await ensureDirectory(input.userDataDir);\n await clearChromeSingletonEntries(input.userDataDir);\n await sanitizeChromeProfile(input.userDataDir);\n\n const requestedRemoteDebuggingPort = readRequestedRemoteDebuggingPort(input.launch?.args);\n const executablePath = resolveChromeExecutablePath(input.launch?.executablePath);\n const args = buildChromeArgs(\n input.userDataDir,\n input.launch,\n input.viewport,\n requestedRemoteDebuggingPort,\n );\n const child = spawn(executablePath, args, {\n stdio: [\"ignore\", \"ignore\", \"pipe\"],\n detached: process.platform !== \"win32\",\n });\n\n child.unref();\n const stderrLines: string[] = [];\n child.stderr?.setEncoding(\"utf8\");\n child.stderr?.on(\"data\", (chunk) => {\n stderrLines.push(String(chunk));\n });\n (\n child.stderr as\n | (NodeJS.ReadableStream & {\n unref?: () => void;\n })\n | undefined\n )?.unref?.();\n\n const endpoint = await waitForDevToolsEndpoint({\n userDataDir: input.userDataDir,\n timeoutMs: input.launch?.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n childExited: async () => child.exitCode,\n stderrLines,\n ...(requestedRemoteDebuggingPort !== undefined && requestedRemoteDebuggingPort > 0\n ? { requestedRemoteDebuggingPort }\n : {}),\n }).catch(async (error) => {\n child.kill(\"SIGKILL\");\n throw error;\n });\n\n return {\n endpoint,\n pid: child.pid ?? 0,\n executablePath,\n };\n}\n\nfunction buildChromeArgs(\n userDataDir: string,\n launch: OpensteerBrowserLaunchOptions | undefined,\n viewport?: { readonly width: number; readonly height: number } | null,\n requestedRemoteDebuggingPort?: number,\n): readonly string[] {\n const isHeadless = launch?.headless ?? true;\n\n // Headful mode: minimal flags to avoid creating detectable behavioral\n // differences vs. a normal user-launched Chrome. Every extra --disable-*\n // flag changes Chrome's runtime behaviour in ways bot-detection systems\n // can fingerprint (missing SafeBrowsing requests, popups never blocked,\n // background networking absent, etc.).\n //\n // Headless mode: keep the full convenience set because the browser is not\n // visible to the user and the extra flags improve stability.\n const args = isHeadless\n ? [\n ...(requestedRemoteDebuggingPort === undefined ? [\"--remote-debugging-port=0\"] : []),\n \"--no-first-run\",\n \"--no-default-browser-check\",\n \"--disable-blink-features=AutomationControlled\",\n \"--disable-background-networking\",\n \"--disable-backgrounding-occluded-windows\",\n \"--disable-component-update\",\n \"--disable-default-apps\",\n \"--disable-hang-monitor\",\n \"--disable-popup-blocking\",\n \"--disable-prompt-on-repost\",\n \"--disable-sync\",\n \"--disable-infobars\",\n \"--disable-features=Translate\",\n \"--enable-features=NetworkService,NetworkServiceInProcess\",\n \"--password-store=basic\",\n \"--use-mock-keychain\",\n `--user-data-dir=${userDataDir}`,\n ]\n : [\n ...(requestedRemoteDebuggingPort === undefined ? [\"--remote-debugging-port=0\"] : []),\n \"--no-first-run\",\n \"--no-default-browser-check\",\n \"--disable-blink-features=AutomationControlled\",\n `--user-data-dir=${userDataDir}`,\n ];\n\n if (isHeadless) {\n args.push(\"--headless=new\");\n }\n\n // Always set --window-size to match the intended viewport so Chrome starts\n // with correct dimensions. In headful mode add padding for Chrome UI\n // (title bar + tab strip + toolbar ≈ 150 px).\n const hasUserWindowSize = (launch?.args ?? []).some((entry) => entry.startsWith(\"--window-size\"));\n if (!hasUserWindowSize) {\n const width = viewport?.width ?? 1440;\n const height = viewport?.height ?? 900;\n args.push(\n isHeadless\n ? `--window-size=${String(width)},${String(height)}`\n : `--window-size=${String(width)},${String(height + 150)}`,\n );\n }\n\n args.push(...(launch?.args ?? []));\n if (!(launch?.args ?? []).some((entry) => !entry.startsWith(\"-\"))) {\n args.push(\"about:blank\");\n }\n return args;\n}\n\nasync function waitForDevToolsEndpoint(input: {\n readonly userDataDir: string;\n readonly timeoutMs: number;\n readonly childExited: () => Promise<number | null>;\n readonly stderrLines: readonly string[];\n readonly requestedRemoteDebuggingPort?: number;\n}): Promise<string> {\n const deadline = Date.now() + input.timeoutMs;\n while (Date.now() < deadline) {\n const activePort = readDevToolsActivePort(input.userDataDir);\n if (activePort) {\n try {\n const inspected = await inspectCdpEndpoint({\n endpoint: `http://127.0.0.1:${String(activePort.port)}`,\n timeoutMs: Math.min(2_000, input.timeoutMs),\n });\n return inspected.endpoint;\n } catch {\n return `ws://127.0.0.1:${String(activePort.port)}${activePort.webSocketPath}`;\n }\n }\n\n if (input.requestedRemoteDebuggingPort !== undefined) {\n const endpoint = await tryInspectRemoteDebuggingPort(\n input.requestedRemoteDebuggingPort,\n input.timeoutMs,\n );\n if (endpoint !== undefined) {\n return endpoint;\n }\n }\n\n const exitCode = await input.childExited();\n if (exitCode !== null) {\n throw new Error(formatChromeLaunchError(input.stderrLines));\n }\n\n await sleep(DEVTOOLS_POLL_INTERVAL_MS);\n }\n\n throw new Error(formatChromeLaunchError(input.stderrLines));\n}\n\nfunction readRequestedRemoteDebuggingPort(args: readonly string[] | undefined): number | undefined {\n if (args === undefined || args.length === 0) {\n return undefined;\n }\n\n let explicitFlagFound = false;\n let port: number | undefined;\n for (let index = 0; index < args.length; index += 1) {\n const entry = args[index]!;\n if (entry === \"--remote-debugging-port\") {\n explicitFlagFound = true;\n const next = args[index + 1];\n if (next !== undefined) {\n port = parseRemoteDebuggingPort(next);\n index += 1;\n }\n continue;\n }\n\n if (entry.startsWith(\"--remote-debugging-port=\")) {\n explicitFlagFound = true;\n port = parseRemoteDebuggingPort(entry.slice(\"--remote-debugging-port=\".length));\n }\n }\n\n return explicitFlagFound ? port : undefined;\n}\n\nfunction parseRemoteDebuggingPort(value: string): number | undefined {\n const trimmed = value.trim();\n if (!/^\\d+$/.test(trimmed)) {\n return undefined;\n }\n\n const parsed = Number.parseInt(trimmed, 10);\n if (!Number.isInteger(parsed) || parsed < 0) {\n return undefined;\n }\n return parsed;\n}\n\nasync function tryInspectRemoteDebuggingPort(\n port: number,\n timeoutMs: number,\n): Promise<string | undefined> {\n try {\n const inspected = await inspectCdpEndpoint({\n endpoint: `http://127.0.0.1:${String(port)}`,\n timeoutMs: Math.min(2_000, timeoutMs),\n });\n return inspected.endpoint;\n } catch {\n return undefined;\n }\n}\n\nfunction formatChromeLaunchError(stderrLines: readonly string[]): string {\n const collapsed = stderrLines\n .join(\"\")\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (collapsed.length === 0) {\n return \"Chrome failed to launch before exposing a DevTools endpoint.\";\n }\n return `Chrome failed to launch before exposing a DevTools endpoint.\\n${collapsed.slice(-5).join(\"\\n\")}`;\n}\n\nasync function isEndpointReachable(endpoint: string): Promise<boolean> {\n try {\n await inspectCdpEndpoint({\n endpoint,\n timeoutMs: 1_500,\n });\n return true;\n } catch {\n return false;\n }\n}\n\nasync function isAbpBaseUrlReachable(baseUrl: string): Promise<boolean> {\n try {\n const response = await fetch(`${baseUrl}/browser/status`, {\n signal: AbortSignal.timeout(1_500),\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n\nasync function terminateProcess(pid: number): Promise<void> {\n if (!Number.isInteger(pid) || pid <= 0) {\n return;\n }\n\n try {\n process.kill(pid, \"SIGTERM\");\n } catch {\n return;\n }\n\n if (await waitForProcessExit(pid, BROWSER_CLOSE_TIMEOUT_MS)) {\n return;\n }\n\n try {\n process.kill(pid, \"SIGKILL\");\n } catch {\n return;\n }\n}\n\nasync function requestBrowserClose(endpoint: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const socket = new WebSocket(endpoint);\n const timeout = setTimeout(() => {\n socket.close();\n reject(new Error(\"Timed out waiting for Browser.close.\"));\n }, BROWSER_CLOSE_TIMEOUT_MS);\n let settled = false;\n\n const finish = (error?: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n if (error) {\n reject(error);\n return;\n }\n resolve();\n };\n\n socket.addEventListener(\"open\", () => {\n socket.send(JSON.stringify({ id: 1, method: \"Browser.close\" }));\n });\n\n socket.addEventListener(\"message\", (event) => {\n try {\n const message = JSON.parse(String(event.data)) as {\n readonly id?: number;\n readonly error?: { readonly message?: string };\n };\n if (message.id !== 1) {\n return;\n }\n finish(message.error?.message === undefined ? undefined : new Error(message.error.message));\n } catch (error) {\n finish(error instanceof Error ? error : new Error(String(error)));\n }\n });\n\n socket.addEventListener(\"close\", () => {\n finish();\n });\n\n socket.addEventListener(\"error\", () => {\n finish(new Error(\"Failed to send Browser.close.\"));\n });\n });\n}\n\nasync function waitForProcessExit(pid: number, timeoutMs: number): Promise<boolean> {\n if (!Number.isInteger(pid) || pid <= 0) {\n return true;\n }\n\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n if (!isProcessRunning(pid)) {\n return true;\n }\n await sleep(50);\n }\n\n return !isProcessRunning(pid);\n}\n\nfunction resolveAbpSessionDir(workspace: FilesystemOpensteerWorkspace): string {\n return path.join(workspace.livePath, \"abp-session\");\n}\n\nasync function allocateEphemeralPort(): Promise<number> {\n const { allocatePort } = await loadAbpModule();\n return allocatePort();\n}\n\nasync function loadAbpModule() {\n try {\n return await import(\"@opensteer/engine-abp\");\n } catch (error) {\n if (isMissingPackageError(error, \"@opensteer/engine-abp\")) {\n throw new Error(\n 'ABP engine selected but \"@opensteer/engine-abp\" is not installed. Install it to use --engine abp or OPENSTEER_ENGINE=abp.',\n );\n }\n throw error;\n }\n}\n\nfunction isMissingPackageError(error: unknown, packageName: string): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return (\n error.message.includes(`Cannot find package '${packageName}'`) ||\n error.message.includes(`Cannot find module '${packageName}'`) ||\n error.message.includes(`Cannot find module \"${packageName}\"`)\n );\n}\n\nfunction normalizeBrowserContextOptions(\n context: OpensteerBrowserContextOptions | undefined,\n environment?: OpensteerEnvironment,\n engineName: OpensteerEngineName = DEFAULT_OPENSTEER_ENGINE,\n): OpensteerBrowserContextOptions | undefined {\n const stealthProfile = resolveStealthProfile(context?.stealthProfile);\n const locale = context?.locale ?? stealthProfile?.locale;\n const timezoneId = context?.timezoneId ?? stealthProfile?.timezoneId;\n const userAgent = context?.userAgent ?? stealthProfile?.userAgent;\n const humanize =\n engineName === \"abp\" && context?.humanize === undefined\n ? undefined\n : resolveHumanizeOption(context?.humanize, environment);\n return {\n ...(context ?? {}),\n ...(stealthProfile === undefined ? {} : { stealthProfile }),\n ...(locale === undefined ? {} : { locale }),\n ...(timezoneId === undefined ? {} : { timezoneId }),\n ...(userAgent === undefined ? {} : { userAgent }),\n ...(humanize === undefined ? {} : { humanize }),\n viewport: context?.viewport ??\n stealthProfile?.viewport ?? {\n width: 1440,\n height: 900,\n },\n };\n}\n\nfunction resolveHumanizeOption(\n explicit: OpensteerBrowserContextOptions[\"humanize\"],\n environment?: OpensteerEnvironment,\n): boolean | import(\"@opensteer/protocol\").OpensteerHumanizeOptions | undefined {\n if (explicit !== undefined) {\n return explicit;\n }\n const envValue = environment?.OPENSTEER_HUMANIZE;\n if (envValue !== undefined) {\n const normalized = envValue.trim().toLowerCase();\n return normalized !== \"false\" && normalized !== \"0\";\n }\n return undefined;\n}\n\nfunction toEngineBrowserContextOptions(\n context: OpensteerBrowserContextOptions,\n): Omit<OpensteerBrowserContextOptions, \"stealthProfile\"> {\n const { stealthProfile: _stealthProfile, ...engineContext } = context;\n return engineContext;\n}\n\nfunction resolveStealthProfile(\n input: OpensteerBrowserContextOptions[\"stealthProfile\"] | undefined,\n): StealthProfile | undefined {\n if (input === undefined) {\n return undefined;\n }\n if (isStealthProfile(input)) {\n return input;\n }\n return generateStealthProfile(input);\n}\n\nfunction isStealthProfile(\n input: NonNullable<OpensteerBrowserContextOptions[\"stealthProfile\"]>,\n): input is StealthProfile {\n return (\n input.id !== undefined &&\n input.platform !== undefined &&\n input.browserBrand !== undefined &&\n input.browserVersion !== undefined &&\n input.userAgent !== undefined &&\n input.viewport !== undefined &&\n input.screenResolution !== undefined &&\n input.devicePixelRatio !== undefined &&\n input.maxTouchPoints !== undefined &&\n input.webglVendor !== undefined &&\n input.webglRenderer !== undefined &&\n input.fonts !== undefined &&\n input.canvasNoiseSeed !== undefined &&\n input.audioNoiseSeed !== undefined &&\n input.locale !== undefined &&\n input.timezoneId !== undefined\n );\n}\n\nasync function sleep(ms: number): Promise<void> {\n await new Promise((resolve) => setTimeout(resolve, ms));\n}\n"]}