@termwright/probe-ink 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -414,7 +414,7 @@ function unobservableFor(node, hasGeometry, hasText) {
|
|
|
414
414
|
}
|
|
415
415
|
|
|
416
416
|
// src/version.ts
|
|
417
|
-
var PACKAGE_VERSION = "0.3.
|
|
417
|
+
var PACKAGE_VERSION = "0.3.1";
|
|
418
418
|
|
|
419
419
|
// src/probe-info.ts
|
|
420
420
|
function probeInfo(frameworkVersion = instrumentationSentinel()?.frameworkVersion ?? INK_VERSION) {
|
|
@@ -646,4 +646,4 @@ export {
|
|
|
646
646
|
createInkSession,
|
|
647
647
|
createInkMarkerWriter
|
|
648
648
|
};
|
|
649
|
-
//# sourceMappingURL=chunk-
|
|
649
|
+
//# sourceMappingURL=chunk-Q75BSILO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react-commit-bridge.ts","../src/annotations.ts","../src/observe.ts","../src/version.ts","../src/probe-info.ts","../src/session.ts"],"sourcesContent":["/** Minimal React renderer instrumentation observer used by the Ink probe spike. */\n\nimport type { InkDomElement } from './observe.js';\n\nconst BRIDGE = Symbol.for('@termwright/probe-ink/react-commit-bridge.v1');\n\ninterface RendererMetadata {\n readonly rendererPackageName?: unknown;\n readonly rendererVersion?: unknown;\n}\n\ninterface FiberRootLike {\n readonly containerInfo?: unknown;\n readonly current?: FiberLike;\n}\n\ninterface FiberLike {\n readonly stateNode?: unknown;\n readonly memoizedProps?: unknown;\n readonly child?: FiberLike | null;\n readonly sibling?: FiberLike | null;\n}\n\ninterface DevToolsHookLike {\n readonly supportsFiber?: boolean;\n inject?(renderer: RendererMetadata): unknown;\n onCommitFiberRoot?(rendererId: unknown, root: FiberRootLike, ...rest: readonly unknown[]): void;\n onCommitFiberUnmount?(rendererId: unknown, fiber: unknown): void;\n [BRIDGE]?: ReactCommitBridge;\n [key: PropertyKey]: unknown;\n}\n\nexport interface InkRendererRegistration {\n readonly rendererId: unknown;\n readonly packageName: 'ink';\n readonly version?: string;\n}\n\nexport type InkCommitEvent =\n | {\n readonly type: 'commit';\n readonly renderer: InkRendererRegistration;\n readonly fiberRoot: FiberRootLike;\n readonly root: InkDomElement;\n }\n | {\n readonly type: 'unmount';\n readonly renderer: InkRendererRegistration;\n readonly fiber: unknown;\n }\n | {\n readonly type: 'invalid-root';\n readonly renderer: InkRendererRegistration;\n readonly fiberRoot: FiberRootLike;\n readonly containerInfo: unknown;\n };\n\nexport interface InkReconcilerInstrumentation {\n injectIntoDevTools(): unknown;\n}\n\nexport interface ReactCommitBridgeLease {\n readonly bridge: ReactCommitBridge;\n release(): void;\n}\n\n/**\n * Experimental, deliberately Fiber-dependent correlation used to measure\n * which source accessibility props Ink drops from its committed host DOM.\n * It is not used by the production observer or accepted as a stable seam.\n */\nexport interface InkHostPropCorrelation {\n readonly hostProps?: Readonly<Record<string, unknown>>;\n readonly sourceProps?: Readonly<Record<string, unknown>>;\n readonly accessibleName?: string;\n readonly ariaHidden?: boolean;\n}\n\ntype Listener = (event: InkCommitEvent) => void;\n\n/**\n * A process-global observer which composes with an already-installed hook.\n * Renderer ids are always the ids returned to React by that hook.\n */\nexport class ReactCommitBridge {\n readonly #renderers = new Map<unknown, InkRendererRegistration>();\n readonly #roots = new Map<object, InkDomElement>();\n readonly #listeners = new Set<Listener>();\n #nextRendererId = 1;\n\n register(renderer: RendererMetadata, delegatedId?: unknown): unknown {\n const rendererId = delegatedId === undefined ? this.#nextRendererId++ : delegatedId;\n if (typeof rendererId === 'number' && Number.isInteger(rendererId)) {\n this.#nextRendererId = Math.max(this.#nextRendererId, rendererId + 1);\n }\n if (renderer.rendererPackageName === 'ink') {\n this.#renderers.set(rendererId, {\n rendererId,\n packageName: 'ink',\n ...(typeof renderer.rendererVersion === 'string'\n ? { version: renderer.rendererVersion }\n : {}),\n });\n }\n return rendererId;\n }\n\n commit(rendererId: unknown, fiberRoot: FiberRootLike): void {\n const renderer = this.#renderers.get(rendererId);\n if (renderer === undefined) return;\n const containerInfo = fiberRoot.containerInfo;\n if (!isInkRoot(containerInfo)) {\n this.#emit({ type: 'invalid-root', renderer, fiberRoot, containerInfo });\n return;\n }\n this.#roots.set(fiberRoot as object, containerInfo);\n this.#emit({ type: 'commit', renderer, fiberRoot, root: containerInfo });\n }\n\n unmount(rendererId: unknown, fiber: unknown): void {\n const renderer = this.#renderers.get(rendererId);\n if (renderer !== undefined) this.#emit({ type: 'unmount', renderer, fiber });\n }\n\n subscribe(listener: Listener): () => void {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n }\n\n roots(): readonly InkDomElement[] {\n return [...this.#roots.values()];\n }\n\n hasInkRenderer(): boolean {\n return this.#renderers.size > 0;\n }\n\n #emit(event: InkCommitEvent): void {\n for (const listener of this.#listeners) {\n try {\n listener(event);\n } catch {\n // Instrumentation observers must never break React's commit callback.\n }\n }\n }\n}\n\n/** Install or reuse the bridge without replacing the user's hook behavior. */\nexport function installReactCommitBridge(\n target: typeof globalThis = globalThis,\n): ReactCommitBridge {\n const holder = target as typeof globalThis & {\n __REACT_DEVTOOLS_GLOBAL_HOOK__?: DevToolsHookLike;\n };\n const existing = holder.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n const installed = existing?.[BRIDGE];\n if (installed !== undefined) return installed;\n\n const bridge = new ReactCommitBridge();\n const hook = Object.create(existing ?? null) as DevToolsHookLike;\n Object.defineProperties(hook, {\n supportsFiber: { value: true, enumerable: true, configurable: true },\n inject: {\n configurable: true,\n value(renderer: RendererMetadata): unknown {\n const delegatedId = existing?.inject?.call(existing, renderer);\n return bridge.register(renderer, delegatedId);\n },\n },\n onCommitFiberRoot: {\n configurable: true,\n value(rendererId: unknown, root: FiberRootLike, ...rest: readonly unknown[]): void {\n try {\n existing?.onCommitFiberRoot?.call(existing, rendererId, root, ...rest);\n } finally {\n bridge.commit(rendererId, root);\n }\n },\n },\n onCommitFiberUnmount: {\n configurable: true,\n value(rendererId: unknown, fiber: unknown): void {\n try {\n existing?.onCommitFiberUnmount?.call(existing, rendererId, fiber);\n } finally {\n bridge.unmount(rendererId, fiber);\n }\n },\n },\n [BRIDGE]: { value: bridge },\n });\n try {\n const descriptor = Object.getOwnPropertyDescriptor(holder, '__REACT_DEVTOOLS_GLOBAL_HOOK__');\n if (\n descriptor?.configurable === true &&\n (('writable' in descriptor && descriptor.writable === false) ||\n (!('writable' in descriptor) && descriptor.set === undefined))\n ) {\n Object.defineProperty(holder, '__REACT_DEVTOOLS_GLOBAL_HOOK__', {\n value: hook,\n writable: true,\n enumerable: descriptor.enumerable ?? false,\n configurable: true,\n });\n } else {\n holder.__REACT_DEVTOOLS_GLOBAL_HOOK__ = hook;\n }\n } catch (cause) {\n throw new Error(\n 'Ink semantic probe unavailable: the existing React renderer instrumentation hook cannot be composed.',\n { cause },\n );\n }\n return bridge;\n}\n\ninterface BridgeLeaseRecord {\n readonly bridge: ReactCommitBridge;\n readonly hook: DevToolsHookLike;\n readonly priorDescriptor?: PropertyDescriptor;\n references: number;\n}\n\nconst bridgeLeases = new WeakMap<object, BridgeLeaseRecord>();\n\n/**\n * Acquire a process-hook lease for transactional adapter setup. The final\n * release restores the exact prior property descriptor, but only while our\n * hook is still current. A bridge installed independently is never removed.\n */\nexport function acquireReactCommitBridge(\n target: typeof globalThis = globalThis,\n): ReactCommitBridgeLease {\n const holder = target as typeof globalThis & {\n __REACT_DEVTOOLS_GLOBAL_HOOK__?: DevToolsHookLike;\n };\n const currentRecord = bridgeLeases.get(target);\n if (currentRecord !== undefined && holder.__REACT_DEVTOOLS_GLOBAL_HOOK__ === currentRecord.hook) {\n currentRecord.references += 1;\n return leaseFor(target, currentRecord);\n }\n\n const existingBridge = holder.__REACT_DEVTOOLS_GLOBAL_HOOK__?.[BRIDGE];\n const priorDescriptor = Object.getOwnPropertyDescriptor(holder, '__REACT_DEVTOOLS_GLOBAL_HOOK__');\n const bridge = installReactCommitBridge(target);\n const hook = holder.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n if (hook === undefined) {\n throw new Error(\n 'Ink semantic probe unavailable: React renderer instrumentation hook installation disappeared.',\n );\n }\n // If another subsystem installed this bridge, this adapter may subscribe to\n // it but must not claim ownership of the process-global hook.\n if (existingBridge !== undefined) return { bridge, release() {} };\n const record: BridgeLeaseRecord = {\n bridge,\n hook,\n ...(priorDescriptor === undefined ? {} : { priorDescriptor }),\n references: 1,\n };\n bridgeLeases.set(target, record);\n return leaseFor(target, record);\n}\n\nfunction leaseFor(target: typeof globalThis, record: BridgeLeaseRecord): ReactCommitBridgeLease {\n let released = false;\n return {\n bridge: record.bridge,\n release() {\n if (released) return;\n released = true;\n record.references -= 1;\n if (record.references > 0) return;\n bridgeLeases.delete(target);\n const holder = target as typeof globalThis & {\n __REACT_DEVTOOLS_GLOBAL_HOOK__?: DevToolsHookLike;\n };\n if (holder.__REACT_DEVTOOLS_GLOBAL_HOOK__ !== record.hook) return;\n if (record.priorDescriptor === undefined) {\n delete holder.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n } else {\n Object.defineProperty(holder, '__REACT_DEVTOOLS_GLOBAL_HOOK__', record.priorDescriptor);\n }\n },\n };\n}\n\nconst activatedReconcilers = new WeakMap<object, WeakSet<object>>();\n\n/**\n * Enable Ink's existing reconciler seam directly. This intentionally does not\n * set DEV and therefore cannot load the DevTools UI/backend or open a socket.\n */\nexport function activateInkRendererObservation(\n reconciler: InkReconcilerInstrumentation,\n target: typeof globalThis = globalThis,\n): ReactCommitBridge {\n const bridge = installReactCommitBridge(target);\n let bridges = activatedReconcilers.get(reconciler);\n if (bridges === undefined) {\n bridges = new WeakSet<object>();\n activatedReconcilers.set(reconciler, bridges);\n }\n if (!bridges.has(bridge)) {\n // React 19's reconciler currently returns false even after synchronously\n // calling hook.inject(). Registration, not that implementation-detail\n // return value, is the capability proof.\n reconciler.injectIntoDevTools();\n if (!bridge.hasInkRenderer())\n throw new Error(\n 'Ink semantic probe unavailable: React renderer instrumentation did not register Ink.',\n );\n bridges.add(bridge);\n }\n return bridge;\n}\n\n/**\n * Correlate committed Ink host objects with the nearest source component\n * props. This POC proves that `aria-label`/`aria-hidden`, which Ink omits from\n * normal-mode host DOM, remain recoverable through Fiber. The returned map is\n * a measurement aid, not a production contract: every field is structural\n * React internals and must fail absent rather than fabricate data.\n */\nexport function correlateInkHostProps(\n fiberRoot: FiberRootLike,\n options: { readonly maxFibers?: number } = {},\n): ReadonlyMap<InkDomElement, InkHostPropCorrelation> {\n const correlations = new Map<InkDomElement, InkHostPropCorrelation>();\n const maxFibers = options.maxFibers ?? 100_000;\n let visitedFibers = 0;\n const walk = (\n fiber: FiberLike | null | undefined,\n candidateSourceProps?: Readonly<Record<string, unknown>>,\n ): void => {\n for (\n let current = fiber;\n current !== null && current !== undefined;\n current = current.sibling\n ) {\n visitedFibers += 1;\n if (visitedFibers > maxFibers) {\n throw new Error(\n 'Ink Fiber accessibility correlation exceeded its bounded traversal limit.',\n );\n }\n const props = record(current.memoizedProps);\n const sourceProps = hasAccessibilitySourceProps(props) ? props : candidateSourceProps;\n if (isInkElement(current.stateNode)) {\n correlations.set(current.stateNode, {\n ...(props === undefined ? {} : { hostProps: props }),\n ...(sourceProps === undefined ? {} : { sourceProps }),\n ...(typeof sourceProps?.['aria-label'] === 'string'\n ? { accessibleName: sourceProps['aria-label'] }\n : {}),\n ...(typeof sourceProps?.['aria-hidden'] === 'boolean'\n ? { ariaHidden: sourceProps['aria-hidden'] }\n : {}),\n });\n walk(current.child, undefined);\n } else {\n walk(current.child, sourceProps);\n }\n }\n };\n walk(fiberRoot.current?.child);\n return correlations;\n}\n\n/** Fail closed instead of accepting a foreign or incomplete committed root. */\nexport function requireCommittedInkRoot(event: InkCommitEvent): InkDomElement {\n if (event.type !== 'commit') {\n throw new Error(\n 'Ink semantic probe unavailable: React renderer instrumentation did not expose expected committed Ink root.',\n );\n }\n return event.root;\n}\n\nfunction isInkRoot(value: unknown): value is InkDomElement {\n if (typeof value !== 'object' || value === null) return false;\n const candidate = value as {\n readonly nodeName?: unknown;\n readonly childNodes?: unknown;\n };\n return candidate.nodeName === 'ink-root' && Array.isArray(candidate.childNodes);\n}\n\nfunction isInkElement(value: unknown): value is InkDomElement {\n if (typeof value !== 'object' || value === null) return false;\n const nodeName = (value as { readonly nodeName?: unknown }).nodeName;\n return (\n nodeName === 'ink-root' ||\n nodeName === 'ink-box' ||\n nodeName === 'ink-text' ||\n nodeName === 'ink-virtual-text'\n );\n}\n\nfunction record(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === 'object' && value !== null\n ? (value as Readonly<Record<string, unknown>>)\n : undefined;\n}\n\nfunction hasAccessibilitySourceProps(\n props: Readonly<Record<string, unknown>> | undefined,\n): boolean {\n return (\n props !== undefined &&\n (Object.hasOwn(props, 'aria-label') ||\n Object.hasOwn(props, 'aria-hidden') ||\n Object.hasOwn(props, 'aria-role') ||\n Object.hasOwn(props, 'aria-state'))\n );\n}\n","import type { ProbeAnnotations, ProtocolLimits } from '@termwright/protocol';\nimport { validateProbeAnnotations } from '@termwright/protocol';\n\nconst REGISTRY = Symbol.for('termwright.annotation.ink.v1');\n\ninterface StoredAnnotation {\n readonly role?: unknown;\n readonly name?: unknown;\n readonly description?: unknown;\n readonly testId?: unknown;\n readonly extended?: unknown;\n readonly actions?: unknown;\n readonly labelledBy?: readonly WeakRef<object>[];\n readonly describedBy?: readonly WeakRef<object>[];\n}\n\ninterface AnnotationSlot {\n readonly current?: StoredAnnotation;\n}\n\ninterface AnnotationChannel {\n readonly entries: WeakMap<object, AnnotationSlot>;\n readonly listeners: Set<() => void>;\n}\n\nfunction channel(): AnnotationChannel {\n const scope = globalThis as Record<PropertyKey, unknown>;\n const present = scope[REGISTRY] as Partial<AnnotationChannel> | undefined;\n if (present?.entries instanceof WeakMap && present.listeners instanceof Set) {\n return present as AnnotationChannel;\n }\n const created: AnnotationChannel = {\n entries: new WeakMap<object, AnnotationSlot>(),\n listeners: new Set<() => void>(),\n };\n Object.defineProperty(scope, REGISTRY, { configurable: true, value: created });\n return created;\n}\n\n/** Re-capture after an annotation attaches to a newly reconciled host. */\nexport function onInkAnnotationChange(handler: () => void): () => void {\n const listeners = channel().listeners;\n listeners.add(handler);\n return () => listeners.delete(handler);\n}\n\nfunction strings(\n refs: unknown,\n idFor: (node: object) => string,\n maxTargets: number,\n): string[] | null | undefined {\n if (refs === undefined) return undefined;\n if (!Array.isArray(refs)) return null;\n const length = Object.getOwnPropertyDescriptor(refs, 'length')?.value;\n if (!Number.isSafeInteger(length) || length < 0 || length > maxTargets) return null;\n const ids: string[] = [];\n for (let index = 0; index < length; index += 1) {\n try {\n const descriptor = Object.getOwnPropertyDescriptor(refs, String(index));\n if (descriptor === undefined || !('value' in descriptor)) return null;\n const ref = descriptor.value;\n if (!(ref instanceof WeakRef)) return null;\n const target = WeakRef.prototype.deref.call(ref) as object | undefined;\n if (target !== undefined) ids.push(idFor(target));\n } catch {\n return null;\n }\n }\n return ids.length === 0 ? undefined : ids;\n}\n\nfunction ownData(value: object, key: keyof StoredAnnotation): unknown {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n return descriptor !== undefined && 'value' in descriptor ? descriptor.value : undefined;\n}\n\n/** Read author intent without taking a runtime dependency on the optional SDK. */\nexport function annotationForInkNode(\n node: object,\n idFor: (node: object) => string,\n limits: ProtocolLimits,\n): ProbeAnnotations | undefined {\n try {\n const slot = channel().entries.get(node);\n const value = slot?.current;\n if (value === undefined) return undefined;\n const role = ownData(value, 'role');\n const name = ownData(value, 'name');\n const description = ownData(value, 'description');\n const testId = ownData(value, 'testId');\n const extended = ownData(value, 'extended');\n const actions = ownData(value, 'actions');\n const labelledBy = strings(ownData(value, 'labelledBy'), idFor, limits.maxRelationTargets);\n const describedBy = strings(ownData(value, 'describedBy'), idFor, limits.maxRelationTargets);\n const candidate = {\n ...(role === undefined ? {} : { role }),\n ...(name === undefined ? {} : { name }),\n ...(description === undefined ? {} : { description }),\n ...(testId === undefined ? {} : { testId }),\n ...(extended === undefined ? {} : { extended }),\n ...(actions === undefined ? {} : { actions }),\n ...(labelledBy === undefined ? {} : { labelledBy }),\n ...(describedBy === undefined ? {} : { describedBy }),\n };\n if (Object.keys(candidate).length === 0) return undefined;\n const validated = validateProbeAnnotations(candidate, limits);\n return validated.ok ? validated.annotations : undefined;\n } catch {\n return undefined;\n }\n}\n","/** Ink's retained host tree to framework-neutral Probe IR. */\n\nimport type {\n ProbeAccessibilityHints,\n ProbeFrame,\n ProbeObject,\n ProbeObservedState,\n ProbeRect,\n ProbeUnobservableField,\n ProtocolLimits,\n} from '@termwright/protocol';\nimport { annotationForInkNode } from './annotations.js';\nimport type { RelativeGeometry } from './frame-capture.js';\n\n/** Structural subset of Ink's DOM node. No runtime import from `ink`. */\nexport interface InkDomElement {\n readonly nodeName: 'ink-root' | 'ink-box' | 'ink-text' | 'ink-virtual-text';\n readonly childNodes: readonly InkDomNode[];\n readonly parentNode?: InkDomElement;\n readonly style?: Readonly<Record<string, unknown>> & { readonly display?: string };\n readonly internal_static?: boolean;\n readonly staticNode?: InkDomElement;\n readonly internal_accessibility?: {\n readonly role?: string;\n readonly state?: {\n readonly checked?: boolean;\n readonly disabled?: boolean;\n readonly expanded?: boolean;\n readonly readonly?: boolean;\n readonly selected?: boolean;\n readonly busy?: boolean;\n readonly multiline?: boolean;\n readonly required?: boolean;\n readonly multiselectable?: boolean;\n };\n };\n}\n\nexport interface InkTextNode {\n readonly nodeName: '#text';\n readonly nodeValue: string;\n readonly parentNode?: InkDomElement;\n}\n\nexport type InkDomNode = InkDomElement | InkTextNode;\n\n/** Public Ink measurement function, kept injectable for tests and isolation. */\nexport type MeasureElement = (node: InkDomElement) => {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n};\n\nexport interface ObserveInkOptions {\n readonly frame: number;\n readonly limits: ProtocolLimits;\n /** The probe's own hidden Box. It is the sole injected node and is omitted. */\n readonly excluded?: InkDomElement | null;\n /** Renderer-retained roots (notably committed <Static>) detached by Ink later. */\n readonly retainedRoots?: readonly InkDomElement[];\n readonly retainedChildren?: ReadonlyMap<InkDomElement, readonly InkDomNode[]>;\n readonly measureElement?: MeasureElement;\n /** Geometry frozen by the certified 7.1.1 renderer instrumentation. */\n readonly geometry?: ReadonlyMap<InkDomElement, RelativeGeometry>;\n}\n\nexport interface InkObservation {\n readonly frame: ProbeFrame;\n readonly truncated: boolean;\n readonly geometryRegions: ReadonlyMap<string, 'live' | 'static'>;\n}\n\nconst isElement = (node: InkDomNode): node is InkDomElement => node.nodeName !== '#text';\n\n/**\n * Observe every Ink host element, including plain unannotated layout boxes.\n *\n * Source component names do not survive Ink's reconciler. `frameworkType` is\n * therefore deliberately one of Ink's four host kinds; inventing `Button` or\n * a component stack here would be false provenance.\n */\nexport function observeInkTree(root: InkDomElement, options: ObserveInkOptions): InkObservation {\n const objects: ProbeObject[] = [];\n const ids = identityStore(root);\n let truncated = false;\n const geometryRegions = new Map<string, 'live' | 'static'>();\n const visited = new Set<InkDomElement>();\n\n const visit = (\n node: InkDomElement,\n parent: InkDomElement | undefined,\n depth: number,\n ancestorHidden: boolean,\n ): void => {\n if (node === options.excluded || visited.has(node)) return;\n visited.add(node);\n if (depth > options.limits.maxDepth || objects.length >= options.limits.maxNodes) {\n truncated = true;\n return;\n }\n\n const hidden = ancestorHidden || node.style?.display === 'none';\n const state = observedState(node, !hidden);\n const annotations = annotationForInkNode(\n node,\n (target) => ids.idFor(target as InkDomElement),\n options.limits,\n );\n const accessibility = observedAccessibility(node);\n const geometry = geometryOf(node, options);\n const identity = ids.idFor(node);\n const region = options.geometry?.get(node)?.region;\n if (region !== undefined) geometryRegions.set(identity, region);\n // Probe IR's `text` is the object's own text, never a descendant-derived\n // accessible name. The recognizer applies name-from-content over the tree.\n const children = options.retainedChildren?.get(node) ?? node.childNodes;\n const text = isTextHost(node) ? textOf(children, options.limits.maxStringBytes) : undefined;\n const unobservable = unobservableFor(\n node,\n geometry?.intendedRect !== undefined,\n text !== undefined,\n );\n\n objects.push({\n identity: { kind: 'stable', value: identity },\n frameworkType: node.nodeName,\n ...(parent === undefined ? {} : { parent: ids.idFor(parent) }),\n ...(geometry === undefined ? {} : { geometry }),\n ...(state === undefined ? {} : { state }),\n ...(text === undefined ? {} : { text }),\n ...(accessibility === undefined ? {} : { accessibility }),\n ...(annotations === undefined ? {} : { annotations }),\n unobservable,\n });\n\n for (const child of children) {\n // Raw `#text` values are payload owned by their `ink-text` host, not a\n // fifth host kind. The text is retained on that host above.\n if (isElement(child)) visit(child, node, depth + 1, hidden);\n }\n };\n\n visit(root, undefined, 0, false);\n // Ink removes committed <Static> children from the live root but retains the\n // exact host subtree in root.staticNode for the separately rendered static\n // output. Observe that retained subtree as a root child when it is no longer\n // reachable through childNodes; the identity and captured layout stay exact.\n if (root.staticNode !== undefined) visit(root.staticNode, root, 1, false);\n for (const retained of options.retainedRoots ?? []) visit(retained, root, 1, false);\n return { frame: { frame: options.frame, objects }, truncated, geometryRegions };\n}\n\n/** Weak identity is stable for exactly the lifetime of Ink's host object. */\nconst stores = new WeakMap<InkDomElement, IdentityStore>();\n\ninterface IdentityStore {\n idFor(node: InkDomElement): string;\n}\n\nfunction identityStore(root: InkDomElement): IdentityStore {\n let store = stores.get(root);\n if (store !== undefined) return store;\n const ids = new WeakMap<InkDomElement, string>();\n let nextId = 0;\n store = {\n idFor(node) {\n const existing = ids.get(node);\n if (existing !== undefined) return existing;\n nextId += 1;\n const id = String(nextId);\n ids.set(node, id);\n return id;\n },\n };\n stores.set(root, store);\n return store;\n}\n\nfunction isTextHost(node: InkDomElement): boolean {\n return node.nodeName === 'ink-text' || node.nodeName === 'ink-virtual-text';\n}\n\nfunction observedAccessibility(node: InkDomElement): ProbeAccessibilityHints | undefined {\n const role = node.internal_accessibility?.role;\n return role === undefined ? undefined : { role };\n}\n\nfunction observedState(node: InkDomElement, displayed: boolean): ProbeObservedState | undefined {\n const accessibility = node.internal_accessibility?.state;\n const state: ProbeObservedState = {\n displayed,\n ...(accessibility?.checked === undefined ? {} : { checked: accessibility.checked }),\n ...(accessibility?.disabled === undefined ? {} : { disabled: accessibility.disabled }),\n ...(accessibility?.expanded === undefined ? {} : { expanded: accessibility.expanded }),\n ...(accessibility?.readonly === undefined ? {} : { readonly: accessibility.readonly }),\n ...(accessibility?.selected === undefined ? {} : { selected: accessibility.selected }),\n ...(accessibility?.busy === undefined ? {} : { busy: accessibility.busy }),\n ...(accessibility?.multiline === undefined ? {} : { multiline: accessibility.multiline }),\n ...(accessibility?.required === undefined ? {} : { required: accessibility.required }),\n ...(accessibility?.multiselectable === undefined\n ? {}\n : { multiselectable: accessibility.multiselectable }),\n };\n return state;\n}\n\nfunction geometryOf(\n node: InkDomElement,\n options: ObserveInkOptions,\n): { readonly intendedRect: ProbeRect; readonly visibleRect: ProbeRect } | undefined {\n const geometry = options.geometry?.get(node);\n return geometry === undefined\n ? undefined\n : { intendedRect: geometry.intended, visibleRect: geometry.visible };\n}\n\nfunction textOf(children: readonly InkDomNode[], maxBytes: number): string | undefined {\n const parts: string[] = [];\n let bytes = 0;\n\n const append = (value: string): void => {\n for (const codePoint of value) {\n const size = Buffer.byteLength(codePoint, 'utf8');\n if (bytes + size > maxBytes) return;\n parts.push(codePoint);\n bytes += size;\n }\n };\n\n // Raw #text children are this host's payload. Nested host elements retain\n // their own ProbeObjects, so folding them in here would violate the IR's\n // own-text contract and duplicate them during name-from-content inference.\n for (const child of children) {\n if (bytes >= maxBytes) break;\n if (!isElement(child)) append(child.nodeValue);\n }\n const text = parts.join('').replace(/\\s+/gu, ' ').trim();\n return text.length === 0 ? undefined : text;\n}\n\nfunction unobservableFor(\n node: InkDomElement,\n hasGeometry: boolean,\n hasText: boolean,\n): readonly ProbeUnobservableField[] {\n const result: ProbeUnobservableField[] = [\n 'focused',\n 'value',\n 'selectedIndex',\n 'textSelection',\n 'scroll',\n 'scrollExtent',\n 'paintOrder',\n ];\n const state = node.internal_accessibility?.state;\n if (state?.disabled === undefined) result.push('disabled');\n if (state?.checked === undefined) result.push('checked');\n if (state?.expanded === undefined) result.push('expanded');\n if (state?.readonly === undefined) result.push('readonly');\n if (state?.selected === undefined) result.push('selected');\n if (state?.busy === undefined) result.push('busy');\n if (state?.multiline === undefined) result.push('multiline');\n if (!hasGeometry) result.push('intendedRect', 'visibleRect');\n if (!hasText && isTextHost(node)) result.push('text');\n return result;\n}\n","/** Synchronized from package.json by scripts/sync-protocol-version.mjs. */\nexport const PACKAGE_VERSION = '0.3.0';\n","import type { ProbeInfo } from '@termwright/protocol';\nimport { instrumentationSentinel, INK_VERSION } from './instrumentation.js';\nimport { PACKAGE_VERSION } from './version.js';\n\n/** Static probe identity, kept independent from the render-session runtime. */\nexport function probeInfo(\n frameworkVersion = instrumentationSentinel()?.frameworkVersion ?? INK_VERSION,\n): ProbeInfo {\n return {\n framework: 'ink',\n frameworkVersion,\n probeVersion: PACKAGE_VERSION,\n identityKind: 'stable',\n capabilities: ['stable-identity', 'intended-rect', 'visible-rect', 'annotations'],\n instrumentation: {\n highestTier: 'T3',\n semanticClass: 'A',\n degradedCapabilities: [],\n },\n };\n}\n","/** Certified Ink render capture to revision-paired semantic snapshots. */\n\nimport type { ProbeFrame, ProtocolLimits, SemanticSnapshot } from '@termwright/protocol';\nimport { writeWindowsConsoleMarker } from '@termwright/pty';\nimport { recognize } from '@termwright/recognizers';\nimport type { ProbeChannel } from '@termwright/probe-runtime';\nimport { observeInkTree, type InkDomElement } from './observe.js';\nimport type { InkFrameCapture } from './frame-capture.js';\nimport type { InkTerminalTracker, TerminalPosition } from './terminal-tracker.js';\nexport { probeInfo } from './probe-info.js';\n\nexport interface InkSessionOptions {\n readonly channel: ProbeChannel;\n readonly resolveRoot: () => InkDomElement | null;\n readonly resolveExcluded?: () => InkDomElement | null;\n readonly resolveCapture: (root: InkDomElement) => InkFrameCapture | undefined;\n /** Resolves after Ink has enqueued and flushed every stdout write for the captured render. */\n readonly waitForRenderFlush: () => Promise<void>;\n readonly stdout: NodeJS.WriteStream;\n /** Writes the authenticated marker through the same ordered transport as the frame. */\n readonly writeMarker: (marker: string) => Promise<void>;\n readonly tracker: InkTerminalTracker;\n readonly onGuaranteeViolation?: (error: Error) => void;\n}\n\nexport interface InkProbeSession {\n readonly revision: number;\n readonly frames: number;\n /** Freeze a renderer commit; refresh-only calls wait when the host tree is ahead of its capture. */\n notifyRender(options?: {\n readonly allowUnsettled?: boolean;\n /** Resolve with the first publication at or causally after this frame. */\n readonly awaitPublication?: boolean;\n }): Promise<number | null>;\n flush(): Promise<void>;\n stop(): void;\n}\n\ninterface FrozenFrame {\n readonly number: number;\n readonly capture: InkFrameCapture;\n readonly observation: ReturnType<typeof observeInkTree>;\n}\n\nexport function createInkSession(options: InkSessionOptions): InkProbeSession {\n let revision = 0;\n let frames = 0;\n let latestFrame = 0;\n let stopped = false;\n let queue: Promise<void> = Promise.resolve();\n const publicationWaiters: Array<{\n readonly targetFrame: number;\n readonly resolve: (revision: number) => void;\n readonly reject: (error: Error) => void;\n }> = [];\n\n const fail = (error: unknown): void => {\n if (stopped) return;\n stopped = true;\n const failure = error instanceof Error ? error : new Error(String(error));\n for (const waiter of publicationWaiters.splice(0)) waiter.reject(failure);\n options.onGuaranteeViolation?.(failure);\n options.channel.close();\n };\n\n const stop = (): void => {\n if (stopped) return;\n stopped = true;\n const failure = new Error('Ink probe stopped');\n for (const waiter of publicationWaiters.splice(0)) waiter.reject(failure);\n // A normal application exit or explicit cleanup is not a semantic\n // guarantee violation. Keep the typed failure callback exclusively for\n // capture/publication/marker faults, while graceful teardown simply\n // closes the producer after rejecting its owned causal waiters.\n options.channel.close();\n };\n\n const resolvePublications = (frame: number, publishedRevision: number): void => {\n for (let index = publicationWaiters.length - 1; index >= 0; index -= 1) {\n const waiter = publicationWaiters[index];\n if (waiter === undefined || waiter.targetFrame > frame) continue;\n publicationWaiters.splice(index, 1);\n waiter.resolve(publishedRevision);\n }\n };\n\n const publish = async (frozen: FrozenFrame): Promise<number | null> => {\n await nextMacrotask();\n // A marker authenticates the terminal bytes for this render, so it must\n // follow Ink's own stdout flush boundary, not just the probe's shadow drain.\n await options.waitForRenderFlush();\n await options.tracker.drain();\n if (stopped) return null;\n if (!options.channel.isOpen) {\n fail(new Error('Ink semantic channel closed before publication'));\n return null;\n }\n if (frozen.number !== latestFrame) {\n options.channel.recordCoalescedEvent();\n return null;\n }\n const context = frozen.capture.context;\n if (context === undefined) throw new Error('certified Ink frame context is unavailable');\n if (frozen.capture.screenReader) {\n throw new Error('Ink screen-reader output has no authoritative per-node cell geometry');\n }\n const position = options.tracker.position();\n if ((context.alternateScreen ? 'alternate' : 'normal') !== position.buffer) {\n throw new Error('Ink render mode and committed VT buffer disagree');\n }\n const columns = options.stdout.columns ?? 80;\n const rows = options.stdout.rows ?? 24;\n const qualified = qualifyFrame(frozen, position, columns, rows);\n revision += 1;\n const snapshot: SemanticSnapshot = recognize(qualified, {\n sessionId: options.channel.session.sessionId,\n revision,\n columns,\n rows,\n framework: 'ink',\n paintOrderKnown: false,\n maxStringBytes: options.channel.session.limits.maxStringBytes,\n });\n const marker = options.channel.publish(snapshot, {\n probeEvents: qualified.objects.length + (qualified.operations?.length ?? 0),\n });\n if (marker === undefined) throw new Error('Ink semantic publication was refused');\n // There must be no async gap between the final frame check and enqueueing\n // its marker: a newer Ink render could otherwise write in between them.\n // The selected transport establishes FRAME -> MARKER; awaiting it makes\n // `flush()` an actual publication boundary for teardown.\n await options.writeMarker(marker);\n resolvePublications(frozen.number, revision);\n return revision;\n };\n\n return {\n get revision() {\n return revision;\n },\n get frames() {\n return frames;\n },\n notifyRender(notifyOptions = {}) {\n if (stopped) return Promise.resolve(null);\n try {\n const root = options.resolveRoot();\n if (root === null) throw new Error('Ink committed frame has no retained root');\n const capture = options.resolveCapture(root);\n if (capture === undefined || capture.root !== root) {\n throw new Error('Ink committed frame has no matching certified renderer capture');\n }\n const excluded = options.resolveExcluded?.();\n const observation = observeInkTree(root, {\n frame: frames,\n limits: options.channel.session.limits as ProtocolLimits,\n ...(excluded === undefined ? {} : { excluded }),\n ...(capture.staticRoots.length === 0 ? {} : { retainedRoots: capture.staticRoots }),\n ...(capture.staticChildren.size === 0\n ? {}\n : { retainedChildren: capture.staticChildren }),\n geometry: capture.geometry,\n });\n // Layout effects can register annotations after React mutates the host\n // tree but before Ink's throttled renderer has produced the matching\n // capture. That is a transient refresh state, not a committed frame\n // whose guaranteed geometry may be downgraded. The subsequent real\n // onRender call freezes it. Renderer-originated calls remain strict.\n if (hasDisplayedNodeWithoutGeometry(observation.frame)) {\n if (notifyOptions.allowUnsettled === true) return Promise.resolve(null);\n throw new Error(\n 'certified Ink renderer capture is missing geometry for a displayed host node',\n );\n }\n frames += 1;\n latestFrame = frames;\n const frozen = { number: frames, capture, observation };\n const boundary =\n notifyOptions.awaitPublication === true\n ? new Promise<number>((resolve, reject) => {\n publicationWaiters.push({ targetFrame: frozen.number, resolve, reject });\n })\n : null;\n const publication = queue\n .then(() => publish(frozen))\n .catch((error) => {\n fail(error);\n return null;\n });\n queue = publication.then(() => undefined);\n return boundary ?? publication;\n } catch (error) {\n fail(error);\n return Promise.resolve(null);\n }\n },\n async flush() {\n await queue.catch(() => undefined);\n },\n stop,\n };\n}\n\nfunction hasDisplayedNodeWithoutGeometry(frame: ProbeFrame): boolean {\n return frame.objects.some(\n (object) => object.state?.displayed !== false && object.geometry?.intendedRect === undefined,\n );\n}\n\nfunction qualifyFrame(\n frozen: FrozenFrame,\n position: TerminalPosition,\n columns: number,\n rows: number,\n): ProbeFrame {\n const { capture, observation } = frozen;\n const context = capture.context as NonNullable<InkFrameCapture['context']>;\n const fullscreen = context.stdoutIsTTY && capture.liveRows >= context.rows;\n const liveOrigin = context.alternateScreen\n ? 0\n : !context.interactive\n ? position.row\n : context.debug || fullscreen\n ? position.row - Math.max(0, capture.liveRows - 1)\n : position.row - capture.liveRows;\n const staticOrigin = liveOrigin - capture.staticRows;\n\n return {\n ...observation.frame,\n objects: observation.frame.objects.map((object) => {\n const region = observation.geometryRegions.get(object.identity.value);\n const geometry = object.geometry;\n if (\n geometry?.intendedRect === undefined ||\n geometry.visibleRect === undefined ||\n region === undefined\n )\n return object;\n const origin = region === 'live' ? liveOrigin : staticOrigin;\n const intendedRect = shift(geometry.intendedRect, origin);\n const visibleRect =\n context.interactive || region === 'static' || context.debug\n ? viewportIntersection(shift(geometry.visibleRect, origin), columns, rows)\n : { row: Math.min(Math.max(origin, 0), rows), column: 0, width: 0, height: 0 };\n return { ...object, geometry: { intendedRect, visibleRect } };\n }),\n };\n}\n\nfunction shift(\n rect: import('@termwright/protocol').ProbeRect,\n rows: number,\n): import('@termwright/protocol').ProbeRect {\n return { ...rect, row: rect.row + rows };\n}\n\nfunction viewportIntersection(\n rect: import('@termwright/protocol').ProbeRect,\n columns: number,\n rows: number,\n): import('@termwright/protocol').ProbeRect {\n const column = Math.max(0, rect.column);\n const row = Math.max(0, rect.row);\n const right = Math.max(column, Math.min(columns, rect.column + rect.width));\n const bottom = Math.max(row, Math.min(rows, rect.row + rect.height));\n return { row, column, width: right - column, height: bottom - row };\n}\n\nfunction nextMacrotask(): Promise<void> {\n return new Promise((resolve) => setImmediate(resolve));\n}\n\nexport function createInkMarkerWriter(\n stream: NodeJS.WriteStream,\n options: {\n readonly certifiedHarness: boolean;\n readonly platform?: NodeJS.Platform;\n readonly writeWindowsMarker?: (fd: number, marker: string) => void;\n },\n): (marker: string) => Promise<void> {\n const platform = options.platform ?? process.platform;\n if (!options.certifiedHarness && platform === 'win32' && stream.isTTY === true) {\n const fd = (stream as NodeJS.WriteStream & { readonly fd?: unknown }).fd;\n if (typeof fd !== 'number' || !Number.isInteger(fd) || fd < 0) {\n return () =>\n Promise.reject(new Error('Ink stdout has no certifiable Windows console handle'));\n }\n const writeNative = options.writeWindowsMarker ?? writeWindowsConsoleMarker;\n return (marker) => {\n try {\n writeNative(fd, marker);\n return Promise.resolve();\n } catch (error) {\n return Promise.reject(error instanceof Error ? error : new Error(String(error)));\n }\n };\n }\n return (marker) =>\n new Promise((resolve, reject) => {\n if (stream.writableEnded || stream.destroyed) {\n reject(new Error('Ink stdout closed before the semantic render marker could be written'));\n return;\n }\n try {\n stream.write(marker, (error?: Error | null) => {\n if (error instanceof Error) reject(error);\n else resolve();\n });\n } catch (error) {\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/react-commit-bridge.ts","../src/annotations.ts","../src/observe.ts","../src/version.ts","../src/probe-info.ts","../src/session.ts"],"sourcesContent":["/** Minimal React renderer instrumentation observer used by the Ink probe spike. */\n\nimport type { InkDomElement } from './observe.js';\n\nconst BRIDGE = Symbol.for('@termwright/probe-ink/react-commit-bridge.v1');\n\ninterface RendererMetadata {\n readonly rendererPackageName?: unknown;\n readonly rendererVersion?: unknown;\n}\n\ninterface FiberRootLike {\n readonly containerInfo?: unknown;\n readonly current?: FiberLike;\n}\n\ninterface FiberLike {\n readonly stateNode?: unknown;\n readonly memoizedProps?: unknown;\n readonly child?: FiberLike | null;\n readonly sibling?: FiberLike | null;\n}\n\ninterface DevToolsHookLike {\n readonly supportsFiber?: boolean;\n inject?(renderer: RendererMetadata): unknown;\n onCommitFiberRoot?(rendererId: unknown, root: FiberRootLike, ...rest: readonly unknown[]): void;\n onCommitFiberUnmount?(rendererId: unknown, fiber: unknown): void;\n [BRIDGE]?: ReactCommitBridge;\n [key: PropertyKey]: unknown;\n}\n\nexport interface InkRendererRegistration {\n readonly rendererId: unknown;\n readonly packageName: 'ink';\n readonly version?: string;\n}\n\nexport type InkCommitEvent =\n | {\n readonly type: 'commit';\n readonly renderer: InkRendererRegistration;\n readonly fiberRoot: FiberRootLike;\n readonly root: InkDomElement;\n }\n | {\n readonly type: 'unmount';\n readonly renderer: InkRendererRegistration;\n readonly fiber: unknown;\n }\n | {\n readonly type: 'invalid-root';\n readonly renderer: InkRendererRegistration;\n readonly fiberRoot: FiberRootLike;\n readonly containerInfo: unknown;\n };\n\nexport interface InkReconcilerInstrumentation {\n injectIntoDevTools(): unknown;\n}\n\nexport interface ReactCommitBridgeLease {\n readonly bridge: ReactCommitBridge;\n release(): void;\n}\n\n/**\n * Experimental, deliberately Fiber-dependent correlation used to measure\n * which source accessibility props Ink drops from its committed host DOM.\n * It is not used by the production observer or accepted as a stable seam.\n */\nexport interface InkHostPropCorrelation {\n readonly hostProps?: Readonly<Record<string, unknown>>;\n readonly sourceProps?: Readonly<Record<string, unknown>>;\n readonly accessibleName?: string;\n readonly ariaHidden?: boolean;\n}\n\ntype Listener = (event: InkCommitEvent) => void;\n\n/**\n * A process-global observer which composes with an already-installed hook.\n * Renderer ids are always the ids returned to React by that hook.\n */\nexport class ReactCommitBridge {\n readonly #renderers = new Map<unknown, InkRendererRegistration>();\n readonly #roots = new Map<object, InkDomElement>();\n readonly #listeners = new Set<Listener>();\n #nextRendererId = 1;\n\n register(renderer: RendererMetadata, delegatedId?: unknown): unknown {\n const rendererId = delegatedId === undefined ? this.#nextRendererId++ : delegatedId;\n if (typeof rendererId === 'number' && Number.isInteger(rendererId)) {\n this.#nextRendererId = Math.max(this.#nextRendererId, rendererId + 1);\n }\n if (renderer.rendererPackageName === 'ink') {\n this.#renderers.set(rendererId, {\n rendererId,\n packageName: 'ink',\n ...(typeof renderer.rendererVersion === 'string'\n ? { version: renderer.rendererVersion }\n : {}),\n });\n }\n return rendererId;\n }\n\n commit(rendererId: unknown, fiberRoot: FiberRootLike): void {\n const renderer = this.#renderers.get(rendererId);\n if (renderer === undefined) return;\n const containerInfo = fiberRoot.containerInfo;\n if (!isInkRoot(containerInfo)) {\n this.#emit({ type: 'invalid-root', renderer, fiberRoot, containerInfo });\n return;\n }\n this.#roots.set(fiberRoot as object, containerInfo);\n this.#emit({ type: 'commit', renderer, fiberRoot, root: containerInfo });\n }\n\n unmount(rendererId: unknown, fiber: unknown): void {\n const renderer = this.#renderers.get(rendererId);\n if (renderer !== undefined) this.#emit({ type: 'unmount', renderer, fiber });\n }\n\n subscribe(listener: Listener): () => void {\n this.#listeners.add(listener);\n return () => this.#listeners.delete(listener);\n }\n\n roots(): readonly InkDomElement[] {\n return [...this.#roots.values()];\n }\n\n hasInkRenderer(): boolean {\n return this.#renderers.size > 0;\n }\n\n #emit(event: InkCommitEvent): void {\n for (const listener of this.#listeners) {\n try {\n listener(event);\n } catch {\n // Instrumentation observers must never break React's commit callback.\n }\n }\n }\n}\n\n/** Install or reuse the bridge without replacing the user's hook behavior. */\nexport function installReactCommitBridge(\n target: typeof globalThis = globalThis,\n): ReactCommitBridge {\n const holder = target as typeof globalThis & {\n __REACT_DEVTOOLS_GLOBAL_HOOK__?: DevToolsHookLike;\n };\n const existing = holder.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n const installed = existing?.[BRIDGE];\n if (installed !== undefined) return installed;\n\n const bridge = new ReactCommitBridge();\n const hook = Object.create(existing ?? null) as DevToolsHookLike;\n Object.defineProperties(hook, {\n supportsFiber: { value: true, enumerable: true, configurable: true },\n inject: {\n configurable: true,\n value(renderer: RendererMetadata): unknown {\n const delegatedId = existing?.inject?.call(existing, renderer);\n return bridge.register(renderer, delegatedId);\n },\n },\n onCommitFiberRoot: {\n configurable: true,\n value(rendererId: unknown, root: FiberRootLike, ...rest: readonly unknown[]): void {\n try {\n existing?.onCommitFiberRoot?.call(existing, rendererId, root, ...rest);\n } finally {\n bridge.commit(rendererId, root);\n }\n },\n },\n onCommitFiberUnmount: {\n configurable: true,\n value(rendererId: unknown, fiber: unknown): void {\n try {\n existing?.onCommitFiberUnmount?.call(existing, rendererId, fiber);\n } finally {\n bridge.unmount(rendererId, fiber);\n }\n },\n },\n [BRIDGE]: { value: bridge },\n });\n try {\n const descriptor = Object.getOwnPropertyDescriptor(holder, '__REACT_DEVTOOLS_GLOBAL_HOOK__');\n if (\n descriptor?.configurable === true &&\n (('writable' in descriptor && descriptor.writable === false) ||\n (!('writable' in descriptor) && descriptor.set === undefined))\n ) {\n Object.defineProperty(holder, '__REACT_DEVTOOLS_GLOBAL_HOOK__', {\n value: hook,\n writable: true,\n enumerable: descriptor.enumerable ?? false,\n configurable: true,\n });\n } else {\n holder.__REACT_DEVTOOLS_GLOBAL_HOOK__ = hook;\n }\n } catch (cause) {\n throw new Error(\n 'Ink semantic probe unavailable: the existing React renderer instrumentation hook cannot be composed.',\n { cause },\n );\n }\n return bridge;\n}\n\ninterface BridgeLeaseRecord {\n readonly bridge: ReactCommitBridge;\n readonly hook: DevToolsHookLike;\n readonly priorDescriptor?: PropertyDescriptor;\n references: number;\n}\n\nconst bridgeLeases = new WeakMap<object, BridgeLeaseRecord>();\n\n/**\n * Acquire a process-hook lease for transactional adapter setup. The final\n * release restores the exact prior property descriptor, but only while our\n * hook is still current. A bridge installed independently is never removed.\n */\nexport function acquireReactCommitBridge(\n target: typeof globalThis = globalThis,\n): ReactCommitBridgeLease {\n const holder = target as typeof globalThis & {\n __REACT_DEVTOOLS_GLOBAL_HOOK__?: DevToolsHookLike;\n };\n const currentRecord = bridgeLeases.get(target);\n if (currentRecord !== undefined && holder.__REACT_DEVTOOLS_GLOBAL_HOOK__ === currentRecord.hook) {\n currentRecord.references += 1;\n return leaseFor(target, currentRecord);\n }\n\n const existingBridge = holder.__REACT_DEVTOOLS_GLOBAL_HOOK__?.[BRIDGE];\n const priorDescriptor = Object.getOwnPropertyDescriptor(holder, '__REACT_DEVTOOLS_GLOBAL_HOOK__');\n const bridge = installReactCommitBridge(target);\n const hook = holder.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n if (hook === undefined) {\n throw new Error(\n 'Ink semantic probe unavailable: React renderer instrumentation hook installation disappeared.',\n );\n }\n // If another subsystem installed this bridge, this adapter may subscribe to\n // it but must not claim ownership of the process-global hook.\n if (existingBridge !== undefined) return { bridge, release() {} };\n const record: BridgeLeaseRecord = {\n bridge,\n hook,\n ...(priorDescriptor === undefined ? {} : { priorDescriptor }),\n references: 1,\n };\n bridgeLeases.set(target, record);\n return leaseFor(target, record);\n}\n\nfunction leaseFor(target: typeof globalThis, record: BridgeLeaseRecord): ReactCommitBridgeLease {\n let released = false;\n return {\n bridge: record.bridge,\n release() {\n if (released) return;\n released = true;\n record.references -= 1;\n if (record.references > 0) return;\n bridgeLeases.delete(target);\n const holder = target as typeof globalThis & {\n __REACT_DEVTOOLS_GLOBAL_HOOK__?: DevToolsHookLike;\n };\n if (holder.__REACT_DEVTOOLS_GLOBAL_HOOK__ !== record.hook) return;\n if (record.priorDescriptor === undefined) {\n delete holder.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n } else {\n Object.defineProperty(holder, '__REACT_DEVTOOLS_GLOBAL_HOOK__', record.priorDescriptor);\n }\n },\n };\n}\n\nconst activatedReconcilers = new WeakMap<object, WeakSet<object>>();\n\n/**\n * Enable Ink's existing reconciler seam directly. This intentionally does not\n * set DEV and therefore cannot load the DevTools UI/backend or open a socket.\n */\nexport function activateInkRendererObservation(\n reconciler: InkReconcilerInstrumentation,\n target: typeof globalThis = globalThis,\n): ReactCommitBridge {\n const bridge = installReactCommitBridge(target);\n let bridges = activatedReconcilers.get(reconciler);\n if (bridges === undefined) {\n bridges = new WeakSet<object>();\n activatedReconcilers.set(reconciler, bridges);\n }\n if (!bridges.has(bridge)) {\n // React 19's reconciler currently returns false even after synchronously\n // calling hook.inject(). Registration, not that implementation-detail\n // return value, is the capability proof.\n reconciler.injectIntoDevTools();\n if (!bridge.hasInkRenderer())\n throw new Error(\n 'Ink semantic probe unavailable: React renderer instrumentation did not register Ink.',\n );\n bridges.add(bridge);\n }\n return bridge;\n}\n\n/**\n * Correlate committed Ink host objects with the nearest source component\n * props. This POC proves that `aria-label`/`aria-hidden`, which Ink omits from\n * normal-mode host DOM, remain recoverable through Fiber. The returned map is\n * a measurement aid, not a production contract: every field is structural\n * React internals and must fail absent rather than fabricate data.\n */\nexport function correlateInkHostProps(\n fiberRoot: FiberRootLike,\n options: { readonly maxFibers?: number } = {},\n): ReadonlyMap<InkDomElement, InkHostPropCorrelation> {\n const correlations = new Map<InkDomElement, InkHostPropCorrelation>();\n const maxFibers = options.maxFibers ?? 100_000;\n let visitedFibers = 0;\n const walk = (\n fiber: FiberLike | null | undefined,\n candidateSourceProps?: Readonly<Record<string, unknown>>,\n ): void => {\n for (\n let current = fiber;\n current !== null && current !== undefined;\n current = current.sibling\n ) {\n visitedFibers += 1;\n if (visitedFibers > maxFibers) {\n throw new Error(\n 'Ink Fiber accessibility correlation exceeded its bounded traversal limit.',\n );\n }\n const props = record(current.memoizedProps);\n const sourceProps = hasAccessibilitySourceProps(props) ? props : candidateSourceProps;\n if (isInkElement(current.stateNode)) {\n correlations.set(current.stateNode, {\n ...(props === undefined ? {} : { hostProps: props }),\n ...(sourceProps === undefined ? {} : { sourceProps }),\n ...(typeof sourceProps?.['aria-label'] === 'string'\n ? { accessibleName: sourceProps['aria-label'] }\n : {}),\n ...(typeof sourceProps?.['aria-hidden'] === 'boolean'\n ? { ariaHidden: sourceProps['aria-hidden'] }\n : {}),\n });\n walk(current.child, undefined);\n } else {\n walk(current.child, sourceProps);\n }\n }\n };\n walk(fiberRoot.current?.child);\n return correlations;\n}\n\n/** Fail closed instead of accepting a foreign or incomplete committed root. */\nexport function requireCommittedInkRoot(event: InkCommitEvent): InkDomElement {\n if (event.type !== 'commit') {\n throw new Error(\n 'Ink semantic probe unavailable: React renderer instrumentation did not expose expected committed Ink root.',\n );\n }\n return event.root;\n}\n\nfunction isInkRoot(value: unknown): value is InkDomElement {\n if (typeof value !== 'object' || value === null) return false;\n const candidate = value as {\n readonly nodeName?: unknown;\n readonly childNodes?: unknown;\n };\n return candidate.nodeName === 'ink-root' && Array.isArray(candidate.childNodes);\n}\n\nfunction isInkElement(value: unknown): value is InkDomElement {\n if (typeof value !== 'object' || value === null) return false;\n const nodeName = (value as { readonly nodeName?: unknown }).nodeName;\n return (\n nodeName === 'ink-root' ||\n nodeName === 'ink-box' ||\n nodeName === 'ink-text' ||\n nodeName === 'ink-virtual-text'\n );\n}\n\nfunction record(value: unknown): Readonly<Record<string, unknown>> | undefined {\n return typeof value === 'object' && value !== null\n ? (value as Readonly<Record<string, unknown>>)\n : undefined;\n}\n\nfunction hasAccessibilitySourceProps(\n props: Readonly<Record<string, unknown>> | undefined,\n): boolean {\n return (\n props !== undefined &&\n (Object.hasOwn(props, 'aria-label') ||\n Object.hasOwn(props, 'aria-hidden') ||\n Object.hasOwn(props, 'aria-role') ||\n Object.hasOwn(props, 'aria-state'))\n );\n}\n","import type { ProbeAnnotations, ProtocolLimits } from '@termwright/protocol';\nimport { validateProbeAnnotations } from '@termwright/protocol';\n\nconst REGISTRY = Symbol.for('termwright.annotation.ink.v1');\n\ninterface StoredAnnotation {\n readonly role?: unknown;\n readonly name?: unknown;\n readonly description?: unknown;\n readonly testId?: unknown;\n readonly extended?: unknown;\n readonly actions?: unknown;\n readonly labelledBy?: readonly WeakRef<object>[];\n readonly describedBy?: readonly WeakRef<object>[];\n}\n\ninterface AnnotationSlot {\n readonly current?: StoredAnnotation;\n}\n\ninterface AnnotationChannel {\n readonly entries: WeakMap<object, AnnotationSlot>;\n readonly listeners: Set<() => void>;\n}\n\nfunction channel(): AnnotationChannel {\n const scope = globalThis as Record<PropertyKey, unknown>;\n const present = scope[REGISTRY] as Partial<AnnotationChannel> | undefined;\n if (present?.entries instanceof WeakMap && present.listeners instanceof Set) {\n return present as AnnotationChannel;\n }\n const created: AnnotationChannel = {\n entries: new WeakMap<object, AnnotationSlot>(),\n listeners: new Set<() => void>(),\n };\n Object.defineProperty(scope, REGISTRY, { configurable: true, value: created });\n return created;\n}\n\n/** Re-capture after an annotation attaches to a newly reconciled host. */\nexport function onInkAnnotationChange(handler: () => void): () => void {\n const listeners = channel().listeners;\n listeners.add(handler);\n return () => listeners.delete(handler);\n}\n\nfunction strings(\n refs: unknown,\n idFor: (node: object) => string,\n maxTargets: number,\n): string[] | null | undefined {\n if (refs === undefined) return undefined;\n if (!Array.isArray(refs)) return null;\n const length = Object.getOwnPropertyDescriptor(refs, 'length')?.value;\n if (!Number.isSafeInteger(length) || length < 0 || length > maxTargets) return null;\n const ids: string[] = [];\n for (let index = 0; index < length; index += 1) {\n try {\n const descriptor = Object.getOwnPropertyDescriptor(refs, String(index));\n if (descriptor === undefined || !('value' in descriptor)) return null;\n const ref = descriptor.value;\n if (!(ref instanceof WeakRef)) return null;\n const target = WeakRef.prototype.deref.call(ref) as object | undefined;\n if (target !== undefined) ids.push(idFor(target));\n } catch {\n return null;\n }\n }\n return ids.length === 0 ? undefined : ids;\n}\n\nfunction ownData(value: object, key: keyof StoredAnnotation): unknown {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n return descriptor !== undefined && 'value' in descriptor ? descriptor.value : undefined;\n}\n\n/** Read author intent without taking a runtime dependency on the optional SDK. */\nexport function annotationForInkNode(\n node: object,\n idFor: (node: object) => string,\n limits: ProtocolLimits,\n): ProbeAnnotations | undefined {\n try {\n const slot = channel().entries.get(node);\n const value = slot?.current;\n if (value === undefined) return undefined;\n const role = ownData(value, 'role');\n const name = ownData(value, 'name');\n const description = ownData(value, 'description');\n const testId = ownData(value, 'testId');\n const extended = ownData(value, 'extended');\n const actions = ownData(value, 'actions');\n const labelledBy = strings(ownData(value, 'labelledBy'), idFor, limits.maxRelationTargets);\n const describedBy = strings(ownData(value, 'describedBy'), idFor, limits.maxRelationTargets);\n const candidate = {\n ...(role === undefined ? {} : { role }),\n ...(name === undefined ? {} : { name }),\n ...(description === undefined ? {} : { description }),\n ...(testId === undefined ? {} : { testId }),\n ...(extended === undefined ? {} : { extended }),\n ...(actions === undefined ? {} : { actions }),\n ...(labelledBy === undefined ? {} : { labelledBy }),\n ...(describedBy === undefined ? {} : { describedBy }),\n };\n if (Object.keys(candidate).length === 0) return undefined;\n const validated = validateProbeAnnotations(candidate, limits);\n return validated.ok ? validated.annotations : undefined;\n } catch {\n return undefined;\n }\n}\n","/** Ink's retained host tree to framework-neutral Probe IR. */\n\nimport type {\n ProbeAccessibilityHints,\n ProbeFrame,\n ProbeObject,\n ProbeObservedState,\n ProbeRect,\n ProbeUnobservableField,\n ProtocolLimits,\n} from '@termwright/protocol';\nimport { annotationForInkNode } from './annotations.js';\nimport type { RelativeGeometry } from './frame-capture.js';\n\n/** Structural subset of Ink's DOM node. No runtime import from `ink`. */\nexport interface InkDomElement {\n readonly nodeName: 'ink-root' | 'ink-box' | 'ink-text' | 'ink-virtual-text';\n readonly childNodes: readonly InkDomNode[];\n readonly parentNode?: InkDomElement;\n readonly style?: Readonly<Record<string, unknown>> & { readonly display?: string };\n readonly internal_static?: boolean;\n readonly staticNode?: InkDomElement;\n readonly internal_accessibility?: {\n readonly role?: string;\n readonly state?: {\n readonly checked?: boolean;\n readonly disabled?: boolean;\n readonly expanded?: boolean;\n readonly readonly?: boolean;\n readonly selected?: boolean;\n readonly busy?: boolean;\n readonly multiline?: boolean;\n readonly required?: boolean;\n readonly multiselectable?: boolean;\n };\n };\n}\n\nexport interface InkTextNode {\n readonly nodeName: '#text';\n readonly nodeValue: string;\n readonly parentNode?: InkDomElement;\n}\n\nexport type InkDomNode = InkDomElement | InkTextNode;\n\n/** Public Ink measurement function, kept injectable for tests and isolation. */\nexport type MeasureElement = (node: InkDomElement) => {\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n};\n\nexport interface ObserveInkOptions {\n readonly frame: number;\n readonly limits: ProtocolLimits;\n /** The probe's own hidden Box. It is the sole injected node and is omitted. */\n readonly excluded?: InkDomElement | null;\n /** Renderer-retained roots (notably committed <Static>) detached by Ink later. */\n readonly retainedRoots?: readonly InkDomElement[];\n readonly retainedChildren?: ReadonlyMap<InkDomElement, readonly InkDomNode[]>;\n readonly measureElement?: MeasureElement;\n /** Geometry frozen by the certified 7.1.1 renderer instrumentation. */\n readonly geometry?: ReadonlyMap<InkDomElement, RelativeGeometry>;\n}\n\nexport interface InkObservation {\n readonly frame: ProbeFrame;\n readonly truncated: boolean;\n readonly geometryRegions: ReadonlyMap<string, 'live' | 'static'>;\n}\n\nconst isElement = (node: InkDomNode): node is InkDomElement => node.nodeName !== '#text';\n\n/**\n * Observe every Ink host element, including plain unannotated layout boxes.\n *\n * Source component names do not survive Ink's reconciler. `frameworkType` is\n * therefore deliberately one of Ink's four host kinds; inventing `Button` or\n * a component stack here would be false provenance.\n */\nexport function observeInkTree(root: InkDomElement, options: ObserveInkOptions): InkObservation {\n const objects: ProbeObject[] = [];\n const ids = identityStore(root);\n let truncated = false;\n const geometryRegions = new Map<string, 'live' | 'static'>();\n const visited = new Set<InkDomElement>();\n\n const visit = (\n node: InkDomElement,\n parent: InkDomElement | undefined,\n depth: number,\n ancestorHidden: boolean,\n ): void => {\n if (node === options.excluded || visited.has(node)) return;\n visited.add(node);\n if (depth > options.limits.maxDepth || objects.length >= options.limits.maxNodes) {\n truncated = true;\n return;\n }\n\n const hidden = ancestorHidden || node.style?.display === 'none';\n const state = observedState(node, !hidden);\n const annotations = annotationForInkNode(\n node,\n (target) => ids.idFor(target as InkDomElement),\n options.limits,\n );\n const accessibility = observedAccessibility(node);\n const geometry = geometryOf(node, options);\n const identity = ids.idFor(node);\n const region = options.geometry?.get(node)?.region;\n if (region !== undefined) geometryRegions.set(identity, region);\n // Probe IR's `text` is the object's own text, never a descendant-derived\n // accessible name. The recognizer applies name-from-content over the tree.\n const children = options.retainedChildren?.get(node) ?? node.childNodes;\n const text = isTextHost(node) ? textOf(children, options.limits.maxStringBytes) : undefined;\n const unobservable = unobservableFor(\n node,\n geometry?.intendedRect !== undefined,\n text !== undefined,\n );\n\n objects.push({\n identity: { kind: 'stable', value: identity },\n frameworkType: node.nodeName,\n ...(parent === undefined ? {} : { parent: ids.idFor(parent) }),\n ...(geometry === undefined ? {} : { geometry }),\n ...(state === undefined ? {} : { state }),\n ...(text === undefined ? {} : { text }),\n ...(accessibility === undefined ? {} : { accessibility }),\n ...(annotations === undefined ? {} : { annotations }),\n unobservable,\n });\n\n for (const child of children) {\n // Raw `#text` values are payload owned by their `ink-text` host, not a\n // fifth host kind. The text is retained on that host above.\n if (isElement(child)) visit(child, node, depth + 1, hidden);\n }\n };\n\n visit(root, undefined, 0, false);\n // Ink removes committed <Static> children from the live root but retains the\n // exact host subtree in root.staticNode for the separately rendered static\n // output. Observe that retained subtree as a root child when it is no longer\n // reachable through childNodes; the identity and captured layout stay exact.\n if (root.staticNode !== undefined) visit(root.staticNode, root, 1, false);\n for (const retained of options.retainedRoots ?? []) visit(retained, root, 1, false);\n return { frame: { frame: options.frame, objects }, truncated, geometryRegions };\n}\n\n/** Weak identity is stable for exactly the lifetime of Ink's host object. */\nconst stores = new WeakMap<InkDomElement, IdentityStore>();\n\ninterface IdentityStore {\n idFor(node: InkDomElement): string;\n}\n\nfunction identityStore(root: InkDomElement): IdentityStore {\n let store = stores.get(root);\n if (store !== undefined) return store;\n const ids = new WeakMap<InkDomElement, string>();\n let nextId = 0;\n store = {\n idFor(node) {\n const existing = ids.get(node);\n if (existing !== undefined) return existing;\n nextId += 1;\n const id = String(nextId);\n ids.set(node, id);\n return id;\n },\n };\n stores.set(root, store);\n return store;\n}\n\nfunction isTextHost(node: InkDomElement): boolean {\n return node.nodeName === 'ink-text' || node.nodeName === 'ink-virtual-text';\n}\n\nfunction observedAccessibility(node: InkDomElement): ProbeAccessibilityHints | undefined {\n const role = node.internal_accessibility?.role;\n return role === undefined ? undefined : { role };\n}\n\nfunction observedState(node: InkDomElement, displayed: boolean): ProbeObservedState | undefined {\n const accessibility = node.internal_accessibility?.state;\n const state: ProbeObservedState = {\n displayed,\n ...(accessibility?.checked === undefined ? {} : { checked: accessibility.checked }),\n ...(accessibility?.disabled === undefined ? {} : { disabled: accessibility.disabled }),\n ...(accessibility?.expanded === undefined ? {} : { expanded: accessibility.expanded }),\n ...(accessibility?.readonly === undefined ? {} : { readonly: accessibility.readonly }),\n ...(accessibility?.selected === undefined ? {} : { selected: accessibility.selected }),\n ...(accessibility?.busy === undefined ? {} : { busy: accessibility.busy }),\n ...(accessibility?.multiline === undefined ? {} : { multiline: accessibility.multiline }),\n ...(accessibility?.required === undefined ? {} : { required: accessibility.required }),\n ...(accessibility?.multiselectable === undefined\n ? {}\n : { multiselectable: accessibility.multiselectable }),\n };\n return state;\n}\n\nfunction geometryOf(\n node: InkDomElement,\n options: ObserveInkOptions,\n): { readonly intendedRect: ProbeRect; readonly visibleRect: ProbeRect } | undefined {\n const geometry = options.geometry?.get(node);\n return geometry === undefined\n ? undefined\n : { intendedRect: geometry.intended, visibleRect: geometry.visible };\n}\n\nfunction textOf(children: readonly InkDomNode[], maxBytes: number): string | undefined {\n const parts: string[] = [];\n let bytes = 0;\n\n const append = (value: string): void => {\n for (const codePoint of value) {\n const size = Buffer.byteLength(codePoint, 'utf8');\n if (bytes + size > maxBytes) return;\n parts.push(codePoint);\n bytes += size;\n }\n };\n\n // Raw #text children are this host's payload. Nested host elements retain\n // their own ProbeObjects, so folding them in here would violate the IR's\n // own-text contract and duplicate them during name-from-content inference.\n for (const child of children) {\n if (bytes >= maxBytes) break;\n if (!isElement(child)) append(child.nodeValue);\n }\n const text = parts.join('').replace(/\\s+/gu, ' ').trim();\n return text.length === 0 ? undefined : text;\n}\n\nfunction unobservableFor(\n node: InkDomElement,\n hasGeometry: boolean,\n hasText: boolean,\n): readonly ProbeUnobservableField[] {\n const result: ProbeUnobservableField[] = [\n 'focused',\n 'value',\n 'selectedIndex',\n 'textSelection',\n 'scroll',\n 'scrollExtent',\n 'paintOrder',\n ];\n const state = node.internal_accessibility?.state;\n if (state?.disabled === undefined) result.push('disabled');\n if (state?.checked === undefined) result.push('checked');\n if (state?.expanded === undefined) result.push('expanded');\n if (state?.readonly === undefined) result.push('readonly');\n if (state?.selected === undefined) result.push('selected');\n if (state?.busy === undefined) result.push('busy');\n if (state?.multiline === undefined) result.push('multiline');\n if (!hasGeometry) result.push('intendedRect', 'visibleRect');\n if (!hasText && isTextHost(node)) result.push('text');\n return result;\n}\n","/** Synchronized from package.json by scripts/sync-protocol-version.mjs. */\nexport const PACKAGE_VERSION = '0.3.1';\n","import type { ProbeInfo } from '@termwright/protocol';\nimport { instrumentationSentinel, INK_VERSION } from './instrumentation.js';\nimport { PACKAGE_VERSION } from './version.js';\n\n/** Static probe identity, kept independent from the render-session runtime. */\nexport function probeInfo(\n frameworkVersion = instrumentationSentinel()?.frameworkVersion ?? INK_VERSION,\n): ProbeInfo {\n return {\n framework: 'ink',\n frameworkVersion,\n probeVersion: PACKAGE_VERSION,\n identityKind: 'stable',\n capabilities: ['stable-identity', 'intended-rect', 'visible-rect', 'annotations'],\n instrumentation: {\n highestTier: 'T3',\n semanticClass: 'A',\n degradedCapabilities: [],\n },\n };\n}\n","/** Certified Ink render capture to revision-paired semantic snapshots. */\n\nimport type { ProbeFrame, ProtocolLimits, SemanticSnapshot } from '@termwright/protocol';\nimport { writeWindowsConsoleMarker } from '@termwright/pty';\nimport { recognize } from '@termwright/recognizers';\nimport type { ProbeChannel } from '@termwright/probe-runtime';\nimport { observeInkTree, type InkDomElement } from './observe.js';\nimport type { InkFrameCapture } from './frame-capture.js';\nimport type { InkTerminalTracker, TerminalPosition } from './terminal-tracker.js';\nexport { probeInfo } from './probe-info.js';\n\nexport interface InkSessionOptions {\n readonly channel: ProbeChannel;\n readonly resolveRoot: () => InkDomElement | null;\n readonly resolveExcluded?: () => InkDomElement | null;\n readonly resolveCapture: (root: InkDomElement) => InkFrameCapture | undefined;\n /** Resolves after Ink has enqueued and flushed every stdout write for the captured render. */\n readonly waitForRenderFlush: () => Promise<void>;\n readonly stdout: NodeJS.WriteStream;\n /** Writes the authenticated marker through the same ordered transport as the frame. */\n readonly writeMarker: (marker: string) => Promise<void>;\n readonly tracker: InkTerminalTracker;\n readonly onGuaranteeViolation?: (error: Error) => void;\n}\n\nexport interface InkProbeSession {\n readonly revision: number;\n readonly frames: number;\n /** Freeze a renderer commit; refresh-only calls wait when the host tree is ahead of its capture. */\n notifyRender(options?: {\n readonly allowUnsettled?: boolean;\n /** Resolve with the first publication at or causally after this frame. */\n readonly awaitPublication?: boolean;\n }): Promise<number | null>;\n flush(): Promise<void>;\n stop(): void;\n}\n\ninterface FrozenFrame {\n readonly number: number;\n readonly capture: InkFrameCapture;\n readonly observation: ReturnType<typeof observeInkTree>;\n}\n\nexport function createInkSession(options: InkSessionOptions): InkProbeSession {\n let revision = 0;\n let frames = 0;\n let latestFrame = 0;\n let stopped = false;\n let queue: Promise<void> = Promise.resolve();\n const publicationWaiters: Array<{\n readonly targetFrame: number;\n readonly resolve: (revision: number) => void;\n readonly reject: (error: Error) => void;\n }> = [];\n\n const fail = (error: unknown): void => {\n if (stopped) return;\n stopped = true;\n const failure = error instanceof Error ? error : new Error(String(error));\n for (const waiter of publicationWaiters.splice(0)) waiter.reject(failure);\n options.onGuaranteeViolation?.(failure);\n options.channel.close();\n };\n\n const stop = (): void => {\n if (stopped) return;\n stopped = true;\n const failure = new Error('Ink probe stopped');\n for (const waiter of publicationWaiters.splice(0)) waiter.reject(failure);\n // A normal application exit or explicit cleanup is not a semantic\n // guarantee violation. Keep the typed failure callback exclusively for\n // capture/publication/marker faults, while graceful teardown simply\n // closes the producer after rejecting its owned causal waiters.\n options.channel.close();\n };\n\n const resolvePublications = (frame: number, publishedRevision: number): void => {\n for (let index = publicationWaiters.length - 1; index >= 0; index -= 1) {\n const waiter = publicationWaiters[index];\n if (waiter === undefined || waiter.targetFrame > frame) continue;\n publicationWaiters.splice(index, 1);\n waiter.resolve(publishedRevision);\n }\n };\n\n const publish = async (frozen: FrozenFrame): Promise<number | null> => {\n await nextMacrotask();\n // A marker authenticates the terminal bytes for this render, so it must\n // follow Ink's own stdout flush boundary, not just the probe's shadow drain.\n await options.waitForRenderFlush();\n await options.tracker.drain();\n if (stopped) return null;\n if (!options.channel.isOpen) {\n fail(new Error('Ink semantic channel closed before publication'));\n return null;\n }\n if (frozen.number !== latestFrame) {\n options.channel.recordCoalescedEvent();\n return null;\n }\n const context = frozen.capture.context;\n if (context === undefined) throw new Error('certified Ink frame context is unavailable');\n if (frozen.capture.screenReader) {\n throw new Error('Ink screen-reader output has no authoritative per-node cell geometry');\n }\n const position = options.tracker.position();\n if ((context.alternateScreen ? 'alternate' : 'normal') !== position.buffer) {\n throw new Error('Ink render mode and committed VT buffer disagree');\n }\n const columns = options.stdout.columns ?? 80;\n const rows = options.stdout.rows ?? 24;\n const qualified = qualifyFrame(frozen, position, columns, rows);\n revision += 1;\n const snapshot: SemanticSnapshot = recognize(qualified, {\n sessionId: options.channel.session.sessionId,\n revision,\n columns,\n rows,\n framework: 'ink',\n paintOrderKnown: false,\n maxStringBytes: options.channel.session.limits.maxStringBytes,\n });\n const marker = options.channel.publish(snapshot, {\n probeEvents: qualified.objects.length + (qualified.operations?.length ?? 0),\n });\n if (marker === undefined) throw new Error('Ink semantic publication was refused');\n // There must be no async gap between the final frame check and enqueueing\n // its marker: a newer Ink render could otherwise write in between them.\n // The selected transport establishes FRAME -> MARKER; awaiting it makes\n // `flush()` an actual publication boundary for teardown.\n await options.writeMarker(marker);\n resolvePublications(frozen.number, revision);\n return revision;\n };\n\n return {\n get revision() {\n return revision;\n },\n get frames() {\n return frames;\n },\n notifyRender(notifyOptions = {}) {\n if (stopped) return Promise.resolve(null);\n try {\n const root = options.resolveRoot();\n if (root === null) throw new Error('Ink committed frame has no retained root');\n const capture = options.resolveCapture(root);\n if (capture === undefined || capture.root !== root) {\n throw new Error('Ink committed frame has no matching certified renderer capture');\n }\n const excluded = options.resolveExcluded?.();\n const observation = observeInkTree(root, {\n frame: frames,\n limits: options.channel.session.limits as ProtocolLimits,\n ...(excluded === undefined ? {} : { excluded }),\n ...(capture.staticRoots.length === 0 ? {} : { retainedRoots: capture.staticRoots }),\n ...(capture.staticChildren.size === 0\n ? {}\n : { retainedChildren: capture.staticChildren }),\n geometry: capture.geometry,\n });\n // Layout effects can register annotations after React mutates the host\n // tree but before Ink's throttled renderer has produced the matching\n // capture. That is a transient refresh state, not a committed frame\n // whose guaranteed geometry may be downgraded. The subsequent real\n // onRender call freezes it. Renderer-originated calls remain strict.\n if (hasDisplayedNodeWithoutGeometry(observation.frame)) {\n if (notifyOptions.allowUnsettled === true) return Promise.resolve(null);\n throw new Error(\n 'certified Ink renderer capture is missing geometry for a displayed host node',\n );\n }\n frames += 1;\n latestFrame = frames;\n const frozen = { number: frames, capture, observation };\n const boundary =\n notifyOptions.awaitPublication === true\n ? new Promise<number>((resolve, reject) => {\n publicationWaiters.push({ targetFrame: frozen.number, resolve, reject });\n })\n : null;\n const publication = queue\n .then(() => publish(frozen))\n .catch((error) => {\n fail(error);\n return null;\n });\n queue = publication.then(() => undefined);\n return boundary ?? publication;\n } catch (error) {\n fail(error);\n return Promise.resolve(null);\n }\n },\n async flush() {\n await queue.catch(() => undefined);\n },\n stop,\n };\n}\n\nfunction hasDisplayedNodeWithoutGeometry(frame: ProbeFrame): boolean {\n return frame.objects.some(\n (object) => object.state?.displayed !== false && object.geometry?.intendedRect === undefined,\n );\n}\n\nfunction qualifyFrame(\n frozen: FrozenFrame,\n position: TerminalPosition,\n columns: number,\n rows: number,\n): ProbeFrame {\n const { capture, observation } = frozen;\n const context = capture.context as NonNullable<InkFrameCapture['context']>;\n const fullscreen = context.stdoutIsTTY && capture.liveRows >= context.rows;\n const liveOrigin = context.alternateScreen\n ? 0\n : !context.interactive\n ? position.row\n : context.debug || fullscreen\n ? position.row - Math.max(0, capture.liveRows - 1)\n : position.row - capture.liveRows;\n const staticOrigin = liveOrigin - capture.staticRows;\n\n return {\n ...observation.frame,\n objects: observation.frame.objects.map((object) => {\n const region = observation.geometryRegions.get(object.identity.value);\n const geometry = object.geometry;\n if (\n geometry?.intendedRect === undefined ||\n geometry.visibleRect === undefined ||\n region === undefined\n )\n return object;\n const origin = region === 'live' ? liveOrigin : staticOrigin;\n const intendedRect = shift(geometry.intendedRect, origin);\n const visibleRect =\n context.interactive || region === 'static' || context.debug\n ? viewportIntersection(shift(geometry.visibleRect, origin), columns, rows)\n : { row: Math.min(Math.max(origin, 0), rows), column: 0, width: 0, height: 0 };\n return { ...object, geometry: { intendedRect, visibleRect } };\n }),\n };\n}\n\nfunction shift(\n rect: import('@termwright/protocol').ProbeRect,\n rows: number,\n): import('@termwright/protocol').ProbeRect {\n return { ...rect, row: rect.row + rows };\n}\n\nfunction viewportIntersection(\n rect: import('@termwright/protocol').ProbeRect,\n columns: number,\n rows: number,\n): import('@termwright/protocol').ProbeRect {\n const column = Math.max(0, rect.column);\n const row = Math.max(0, rect.row);\n const right = Math.max(column, Math.min(columns, rect.column + rect.width));\n const bottom = Math.max(row, Math.min(rows, rect.row + rect.height));\n return { row, column, width: right - column, height: bottom - row };\n}\n\nfunction nextMacrotask(): Promise<void> {\n return new Promise((resolve) => setImmediate(resolve));\n}\n\nexport function createInkMarkerWriter(\n stream: NodeJS.WriteStream,\n options: {\n readonly certifiedHarness: boolean;\n readonly platform?: NodeJS.Platform;\n readonly writeWindowsMarker?: (fd: number, marker: string) => void;\n },\n): (marker: string) => Promise<void> {\n const platform = options.platform ?? process.platform;\n if (!options.certifiedHarness && platform === 'win32' && stream.isTTY === true) {\n const fd = (stream as NodeJS.WriteStream & { readonly fd?: unknown }).fd;\n if (typeof fd !== 'number' || !Number.isInteger(fd) || fd < 0) {\n return () =>\n Promise.reject(new Error('Ink stdout has no certifiable Windows console handle'));\n }\n const writeNative = options.writeWindowsMarker ?? writeWindowsConsoleMarker;\n return (marker) => {\n try {\n writeNative(fd, marker);\n return Promise.resolve();\n } catch (error) {\n return Promise.reject(error instanceof Error ? error : new Error(String(error)));\n }\n };\n }\n return (marker) =>\n new Promise((resolve, reject) => {\n if (stream.writableEnded || stream.destroyed) {\n reject(new Error('Ink stdout closed before the semantic render marker could be written'));\n return;\n }\n try {\n stream.write(marker, (error?: Error | null) => {\n if (error instanceof Error) reject(error);\n else resolve();\n });\n } catch (error) {\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.js
CHANGED
package/dist/instrument.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@termwright/probe-ink",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Ink application instrumentation for Termwright end-to-end semantic tests",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -34,12 +34,12 @@
|
|
|
34
34
|
"dist"
|
|
35
35
|
],
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@termwright/evidence-provider": "0.3.
|
|
38
|
-
"@termwright/protocol": "0.3.
|
|
39
|
-
"@termwright/probe-runtime": "0.3.
|
|
40
|
-
"@termwright/
|
|
41
|
-
"@termwright/
|
|
42
|
-
"@termwright/
|
|
37
|
+
"@termwright/evidence-provider": "0.3.1",
|
|
38
|
+
"@termwright/protocol": "0.3.1",
|
|
39
|
+
"@termwright/probe-runtime": "0.3.1",
|
|
40
|
+
"@termwright/recognizers": "^0.3.1",
|
|
41
|
+
"@termwright/pty": "0.3.1",
|
|
42
|
+
"@termwright/vt": "0.3.1"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
45
|
"ink": "7.1.1",
|
|
@@ -49,8 +49,8 @@
|
|
|
49
49
|
"@types/react": "^19.2.18",
|
|
50
50
|
"ink": "7.1.1",
|
|
51
51
|
"react": "^19.2.8",
|
|
52
|
-
"@termwright/driver": "0.3.
|
|
53
|
-
"@termwright/resource-broker": "0.3.
|
|
52
|
+
"@termwright/driver": "0.3.1",
|
|
53
|
+
"@termwright/resource-broker": "0.3.1"
|
|
54
54
|
},
|
|
55
55
|
"scripts": {
|
|
56
56
|
"build": "tsup src/index.ts src/node-hook.ts src/bun-preload.ts src/instrument.ts src/instrumentation.ts --format esm --dts --sourcemap --clean",
|