@lofcz/embedpdf-plugin-actions 3.0.0-next.11

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["DocumentsToken","originOf","eventOf","ActionsToken"],"sources":["../src/capability.ts","../src/reducer.ts","../src/actions.plugin.ts"],"sourcesContent":["import {\n createEventHook,\n createSerialQueue,\n DocumentsToken,\n type PluginContext,\n type Unsubscribe,\n} from '@embedpdf/core';\nimport {\n createScriptHost,\n javaScriptProgramFromActionTree,\n resolveScriptIdentity,\n scriptFieldsFromSnapshot,\n seedFrom,\n} from '@embedpdf/core-acrojs';\nimport type {\n ScriptAnnotInput,\n ScriptColorArray,\n ScriptDiagnostic,\n ScriptEventInput,\n ScriptExecutionError,\n ScriptOutput,\n ScriptUiEffect,\n ScriptWorldInput,\n} from '@embedpdf/core-acrojs';\nimport type {\n AnnotationRef,\n DocumentActionsSnapshot,\n FormSnapshot,\n FormSubmissionRequest,\n PageObjectNumber,\n PdfActionNode,\n PdfActionTree,\n PdfActionType,\n PdfAnnotationActions,\n PdfPageActions,\n SubmitFormPayload,\n} from '@embedpdf/engine-core/runtime';\n\nimport { eventOf, originOf } from './types';\nimport type {\n ActionContext,\n ActionDiagnostic,\n ActionDispatchResult,\n ActionExecutor,\n ActionNodeResult,\n ActionNodeStatus,\n ActionOrigin,\n ActionPolicy,\n ActionPolicyDecision,\n ActionPolicyRow,\n ActionsAction,\n ActionsCapability,\n ActionsHostCapability,\n ActionsPluginConfig,\n ActionsState,\n ActionSource,\n ActionStepResult,\n ActionSubmitHandler,\n ActionSubmitRequest,\n ActionTrigger,\n ActionTriggerResult,\n ActionUiAdapter,\n AnnotCommitEntry,\n AnnotCommitSink,\n DocumentTriggerEvent,\n FormCommitSink,\n PageStateReport,\n ScriptSurfaceResult,\n SubmitIntent,\n SubmitResolver,\n} from './types';\n\nconst ALLOW_ALL: ActionPolicyRow = { user: 'allow', hover: 'allow', lifecycle: 'allow' };\n\nconst DEFAULT_POLICY: ActionPolicy = {\n goto: ALLOW_ALL,\n named: ALLOW_ALL,\n hide: ALLOW_ALL,\n 'reset-form': ALLOW_ALL,\n javascript: ALLOW_ALL,\n // No auto-opened tabs: only a real user activation reaches the adapter.\n uri: { user: 'adapter', hover: 'report', lifecycle: 'report' },\n // The Named Print verb: adapter on user gestures, blocked otherwise.\n print: { user: 'adapter', hover: 'block', lifecycle: 'block' },\n // The sink chain (handler → the document's home → blocked) on user\n // gestures only; hover/lifecycle submits never leave the viewer.\n 'submit-form': { user: 'adapter', hover: 'block', lifecycle: 'block' },\n};\n\n/** Never executable, not configurable — diagnostics only. */\nconst NEVER_TYPES: ReadonlySet<PdfActionType> = new Set([\n 'launch',\n 'goto-remote',\n 'goto-embedded',\n 'sound',\n 'movie',\n 'import-data',\n]);\n\n/** Recognized types with no Phase-1 interpreter. */\nconst UNSUPPORTED_TYPES: ReadonlySet<PdfActionType> = new Set([\n 'rendition',\n 'thread',\n 'set-ocg-state',\n 'transition',\n 'goto-3d-view',\n 'unknown',\n]);\n\n/** Document-lifetime node types: engine mutations, committed in walk order. */\nconst DOCUMENT_TYPES: ReadonlySet<PdfActionType> = new Set(['reset-form', 'javascript']);\n\nconst sameRef = (left: AnnotationRef, right: AnnotationRef): boolean => {\n if (left.kind === 'objectNumber' && right.kind === 'objectNumber') {\n return left.annotObjectNumber === right.annotObjectNumber;\n }\n if (left.kind === 'nm' && right.kind === 'nm') {\n return left.pageObjectNumber === right.pageObjectNumber && left.nm === right.nm;\n }\n if (left.kind === 'index' && right.kind === 'index') {\n return left.pageObjectNumber === right.pageObjectNumber && left.index === right.index;\n }\n return false;\n};\n\nconst isPrintVerb = (node: PdfActionNode): boolean =>\n node.type === 'named' && node.name === 'Print';\n\nexport function createActionsCapability(\n ctx: PluginContext<ActionsState, ActionsAction>,\n config: ActionsPluginConfig = {},\n): ActionsHostCapability {\n const policy: ActionPolicy = { ...DEFAULT_POLICY, ...config.policy };\n const enqueue = createSerialQueue();\n const executors = new Map<PdfActionType, ActionExecutor>();\n let annotCommitSink: AnnotCommitSink | null = null;\n let formCommitSink: FormCommitSink | null = null;\n let uiAdapter: ActionUiAdapter | null = null;\n /** Sink 1 of the submit chain (consent = installation). */\n let submitHandler: ActionSubmitHandler | null = null;\n /** The form plugin's dataset resolver (D7's one door). */\n let submitResolver: SubmitResolver | null = null;\n /** D3's document-print latch: while a print event wrapper is active, a\n * nested print request is SUPPRESSED (`reentrant-print`) — the adapter\n * opens exactly one dialog per outer request. */\n let docPrintEventActive = false;\n /** D11's deterministic aggregate: JS nodes run in the CURRENT dispatch. */\n let jsNodesThisDispatch = 0;\n\n const actionHook = createEventHook<import('./types').ActionDispatchEvent>((error) =>\n globalThis.console?.error('[actions] onAction observer failed:', error),\n );\n const diagnosticHook = createEventHook<ActionDiagnostic>((error) =>\n globalThis.console?.error('[actions] onDiagnostic observer failed:', error),\n );\n const scriptDiagnosticHook = createEventHook<ScriptDiagnostic>((error) =>\n globalThis.console?.error('[actions] onScriptDiagnostic observer failed:', error),\n );\n const scriptErrorHook = createEventHook<ScriptExecutionError>((error) =>\n globalThis.console?.error('[actions] onScriptError observer failed:', error),\n );\n ctx.cleanup(() => {\n actionHook.dispose();\n diagnosticHook.dispose();\n scriptDiagnosticHook.dispose();\n scriptErrorHook.dispose();\n });\n\n /** Policy lookup — `null` means \"recognized, no interpreter\" (inert). */\n const decisionFor = (\n node: PdfActionNode,\n origin: ActionOrigin,\n ): ActionPolicyDecision | 'never' | 'unsupported' => {\n if (NEVER_TYPES.has(node.type)) return 'never';\n if (UNSUPPORTED_TYPES.has(node.type)) return 'unsupported';\n if (isPrintVerb(node)) return policy.print[origin];\n const row = policy[node.type as keyof ActionPolicy] as ActionPolicyRow | undefined;\n return row ? row[origin] : 'unsupported';\n };\n\n const allowsPrint = (): boolean =>\n ctx.tryGet(DocumentsToken)?.allows('doc.print', ctx.documentId ?? undefined) ?? true;\n\n // ── the ONE catalog-actions read (D11) ──────────────────────────────────\n // The catalog /AA is immutable in-session (no writer exists in the\n // stack), so the open sequence, boot sources, and the five document\n // events share one memoized read. A REJECTED read is evicted so a\n // transient failure cannot poison every future lifecycle event.\n let actionsSnapshotPromise: Promise<DocumentActionsSnapshot | null> | null = null;\n const readDocumentActions = (): Promise<DocumentActionsSnapshot | null> => {\n if (!actionsSnapshotPromise) {\n const doc = ctx.doc;\n const read: Promise<DocumentActionsSnapshot | null> = doc?.actions\n ? Promise.resolve(doc.actions.read())\n : Promise.resolve(null);\n const memo: Promise<DocumentActionsSnapshot | null> = read.catch((error: unknown) => {\n if (actionsSnapshotPromise === memo) actionsSnapshotPromise = null;\n throw error;\n });\n actionsSnapshotPromise = memo;\n }\n return actionsSnapshotPromise;\n };\n\n /** The Table-200 key for each verb-shaped document trigger event. */\n const DOC_EVENT_TREES = {\n 'will-save': 'willSave',\n 'did-save': 'didSave',\n 'will-print': 'willPrint',\n 'did-print': 'didPrint',\n 'will-close': 'willClose',\n } as const;\n\n // ── the submit pipeline (D7): one intent, one resolver, one sink chain ──\n const nowMs = (): number => js?.now?.() ?? Date.now();\n\n const intentOfPayload = (payload: SubmitFormPayload): SubmitIntent => ({\n url: payload.url,\n fields: payload.fields,\n exclude: payload.flags.exclude,\n includeNoValueFields: payload.flags.includeNoValueFields,\n format: payload.flags.format,\n method: payload.flags.method,\n flagsRaw: payload.flags.raw,\n ...(payload.charSet === undefined ? {} : { charSet: payload.charSet }),\n });\n\n const toFormSubmissionRequest = (request: ActionSubmitRequest): FormSubmissionRequest => ({\n entries: request.entries,\n intent: {\n url: request.url,\n format: request.format,\n method: request.method,\n flagsRaw: request.flagsRaw,\n ...(request.charSet === undefined ? {} : { charSet: request.charSet }),\n },\n origin: request.origin,\n clientTimeMs: nowMs(),\n });\n\n /**\n * The ONE submit door — both sources land here after policy. Sink order:\n * embedder handler (explicit beats ambient; detached-promise contract) →\n * the document's home (`doc.forms.submit`, engine-asserted, AWAITED — a\n * real op with a real receipt) → blocked with `no-submit-sink`. Never a\n * network call from this plugin.\n */\n const performSubmit = async (\n intent: SubmitIntent,\n actionCtx: ActionContext,\n diagnose: (diagnostic: ActionDiagnostic) => void,\n ): Promise<{ status: ActionNodeStatus; detail?: string }> => {\n const decision = policy['submit-form'][actionCtx.origin];\n if (decision !== 'adapter' && decision !== 'allow') {\n diagnose({\n code: 'blocked',\n message: `submit-form: policy '${decision}' for origin '${actionCtx.origin}'`,\n });\n return { status: 'blocked' };\n }\n if (!submitResolver) {\n diagnose({\n code: 'no-submit-resolver',\n message: 'submit-form: no dataset resolver registered (form plugin missing?)',\n });\n return { status: 'blocked', detail: 'no dataset resolver' };\n }\n let request: ActionSubmitRequest;\n try {\n request = await submitResolver(intent, actionCtx, diagnose);\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n diagnose({ code: 'executor-failed', message: `submit-form: dataset resolution: ${detail}` });\n return { status: 'failed', detail };\n }\n const doc = ctx.doc;\n const homeSubmit =\n doc && typeof doc.forms.submit === 'function'\n ? () => Promise.resolve(doc.forms.submit!(toFormSubmissionRequest(request)))\n : null;\n if (submitHandler) {\n try {\n const outcome = submitHandler(request, { submitToDocumentHome: homeSubmit });\n if (outcome && typeof (outcome as Promise<void>).then === 'function') {\n // DETACHED by contract: `executed` means \"handed to the embedder\";\n // a later rejection is observability, never a node-result rewrite.\n void (outcome as Promise<void>).catch((error: unknown) => {\n diagnosticHook.emit({\n code: 'executor-failed',\n message: `submit handler rejected (detached): ${\n error instanceof Error ? error.message : String(error)\n }`,\n });\n });\n }\n return { status: 'executed' };\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n diagnose({ code: 'executor-failed', message: `submit handler threw: ${detail}` });\n return { status: 'failed', detail };\n }\n }\n if (homeSubmit) {\n try {\n await homeSubmit();\n return { status: 'executed' };\n } catch (error) {\n // The engine's refusal (authority, transport) surfaced on the node —\n // enforcement lives at the home's boundary, we just report it.\n const detail = error instanceof Error ? error.message : String(error);\n diagnose({ code: 'executor-failed', message: `document home refused submit: ${detail}` });\n return { status: 'failed', detail };\n }\n }\n diagnose({\n code: 'no-submit-sink',\n message: 'submit-form: no handler installed and the document has no submit-capable home',\n });\n return { status: 'blocked', detail: 'no submit sink' };\n };\n\n // ── the ONE per-document ScriptHost (D8) ────────────────────────────────\n const js = config.javascript;\n const scriptHost =\n js?.enabled && ctx.doc\n ? createScriptHost({\n sandboxFactory:\n js.sandboxFactory ??\n (() =>\n import('@embedpdf/core-js-sandbox').then(({ createQuickJsSandbox }) =>\n createQuickJsSandbox(),\n )),\n document: () => {\n const meta = ctx.document();\n return {\n id: ctx.documentId ?? 'document',\n fileName: js.fileName?.() ?? meta?.name ?? 'document.pdf',\n pageCount: meta?.pageCount ?? 0,\n pageNumber: 0,\n };\n },\n identity: () =>\n ctx.doc\n ? resolveScriptIdentity(ctx.doc, js.identity)\n : { name: '', loginName: '', corporation: '', email: '' },\n environment: (sequence) => {\n const nowMs = js.now?.() ?? Date.now();\n return {\n nowMs,\n utcOffsetMinutes: js.utcOffsetMinutes?.() ?? -new Date(nowMs).getTimezoneOffset(),\n randomSeed: js.randomSeed?.() ?? seedFrom(ctx.documentId ?? 'document', sequence),\n };\n },\n bootSources: async () => {\n const snapshot = await readDocumentActions();\n return (snapshot?.nameTreeScripts ?? []).map(({ action }) =>\n javaScriptProgramFromActionTree(action),\n );\n },\n ...(js.budget ? { budget: js.budget } : {}),\n })\n : null;\n if (scriptHost) ctx.cleanup(() => scriptHost.dispose());\n\n // ── surface door (D9): the ONE UI/diagnostic port for script results ────\n // Print and submitForm effects arriving from the ACTIONS plane never\n // reach this door (the js executor extracts them and routes through\n // `firePrintThroughAdapter` / `performSubmit` post-transaction — the\n // WP/DP wrap and the post-commit dataset need to run outside the host\n // transaction). Effects here come from the FORM pipeline's K/V/C/F path.\n const surfaceScriptResult = (result: ScriptSurfaceResult): void => {\n const uiContext = { origin: result.origin, phase: result.phase };\n for (const effect of result.uiEffects) {\n if (effect.kind === 'submitForm') {\n // Form-pipeline scripted submit: same door, DETACHED (the form\n // queue must not await into submit sinks). Policy + sinks +\n // diagnostics all live inside performSubmit.\n void performSubmit(\n intentOfSubmitEffect(effect),\n {\n origin: result.origin,\n source: { kind: 'api' },\n event: { scope: 'activate' },\n },\n (diagnostic) => diagnosticHook.emit(diagnostic),\n );\n continue;\n }\n // PERMISSION, not preference: a print request without doc.print\n // authority reaches no adapter — non-overridable, observable.\n if (effect.kind === 'print' && !allowsPrint()) {\n scriptDiagnosticHook.emit({\n code: 'ui-effect-suppressed',\n message: 'script print request withheld: doc.print is not allowed',\n });\n continue;\n }\n // D3's latch: a WillPrint/DidPrint script (or anything running while\n // a print wrapper is active) printing again is suppressed — one\n // dialog per outer request.\n if (effect.kind === 'print' && docPrintEventActive) {\n scriptDiagnosticHook.emit({\n code: 'ui-effect-suppressed',\n message: 'script print request during a document print event — suppressed (reentrant)',\n });\n continue;\n }\n if (!uiAdapter) {\n diagnosticHook.emit({\n code: 'no-adapter',\n message: `script ${effect.kind}: no UI adapter installed`,\n });\n continue;\n }\n if (effect.kind === 'alert') {\n uiAdapter.alert?.(effect.message, {\n ...uiContext,\n icon: effect.icon,\n ...(effect.title !== undefined ? { title: effect.title } : {}),\n });\n } else if (effect.kind === 'gotoPage') {\n uiAdapter.gotoPage?.(effect.page, uiContext);\n } else {\n uiAdapter.print(uiContext);\n }\n }\n for (const diagnostic of result.diagnostics) scriptDiagnosticHook.emit(diagnostic);\n if (result.error) scriptErrorHook.emit(result.error);\n };\n\n /** Script `doc.submitForm(...)` → the one normalized intent. Script field\n * names are include-mode by definition (Acrobat's aFields). */\n const intentOfSubmitEffect = (\n effect: Extract<ScriptUiEffect, { kind: 'submitForm' }>,\n ): SubmitIntent => {\n const format = effect.format ?? 'fdf';\n return {\n url: effect.url,\n fields: effect.fieldNames?.map((name) => ({ kind: 'name' as const, name })) ?? null,\n exclude: false,\n includeNoValueFields: effect.includeEmpty,\n format,\n method: effect.method ?? 'post',\n flagsRaw: 0,\n };\n };\n\n // ── script world building (D6: page-scoped prefetch) ────────────────────\n const engineColorToArray = (\n color: { r: number; g: number; b: number } | null | undefined,\n ): ScriptColorArray => (color ? ['RGB', color.r / 255, color.g / 255, color.b / 255] : ['T']);\n\n const pageIndexOf = (pon: PageObjectNumber): number =>\n ctx.document()?.pages.findIndex((page) => page.pageObjectNumber === pon) ?? -1;\n\n const scriptWorldFor = async (\n pon: PageObjectNumber,\n ): Promise<{ snapshot: FormSnapshot; world: Omit<ScriptWorldInput, 'event'> }> => {\n const doc = ctx.doc!;\n const snapshot = await doc.forms.list();\n const pageIndex = Math.max(0, pageIndexOf(pon));\n const { annotations } = await doc.page(pon).annotations.list();\n const annots: ScriptAnnotInput[] = annotations\n // Script-addressable = everything EXCEPT link and widget (they are\n // Link/Field objects in Acrobat and separate planes here).\n .filter((a) => a.subtype !== 'link' && !a.subtype.startsWith('widget'))\n .map((a) => {\n const styled = a as unknown as {\n color?: { r: number; g: number; b: number };\n interiorColor?: { r: number; g: number; b: number } | null;\n opacity?: number;\n strokeWidth?: number;\n borderStyle?: string;\n dashArray?: number[];\n };\n return {\n ref: a.ref,\n name: a.nm ?? '',\n subtype: a.subtype,\n page: pageIndex,\n rect: [a.rect.left, a.rect.bottom, a.rect.right, a.rect.top] as [\n number,\n number,\n number,\n number,\n ],\n contents: a.contents ?? '',\n author: a.author ?? '',\n subject: a.subject ?? '',\n strokeColor: engineColorToArray(styled.color),\n fillColor: engineColorToArray(styled.interiorColor),\n opacity: styled.opacity ?? 1,\n width: styled.strokeWidth ?? 1,\n borderStyle: styled.borderStyle === 'dashed' ? ('D' as const) : ('S' as const),\n dash: styled.dashArray ?? [],\n hidden: a.flags.hidden,\n print: a.flags.print,\n readOnly: a.flags.readOnly,\n locked: a.flags.locked,\n noView: a.flags.noView,\n toggleNoView: a.flags.toggleNoView,\n opaqueBody: a.subtype === 'stamp',\n };\n });\n return {\n snapshot,\n world: {\n fields: scriptFieldsFromSnapshot(snapshot),\n annots,\n annotPages: [pageIndex],\n annotsCoverDocument: (ctx.document()?.pageCount ?? 0) <= 1,\n },\n };\n };\n\n const ANNOTATION_EVENT_NAMES: Record<string, string> = {\n cursorEnter: 'Mouse Enter',\n cursorExit: 'Mouse Exit',\n mouseDown: 'Mouse Down',\n mouseUp: 'Mouse Up',\n focus: 'Focus',\n blur: 'Blur',\n };\n const PAGE_EVENT_NAMES: Record<string, string> = {\n open: 'Open',\n close: 'Close',\n // No Acrobat equivalent for the PV/PI names — EmbedPDF extension.\n visible: 'Visible',\n invisible: 'Invisible',\n };\n // The two-standard bridge (D5): the /AA keys are ISO 32000-2 Table 200;\n // the camelCase event names live in the JS API layer (ISO 21757-1 /\n // Acrobat) — only the key half is verifiable against the in-repo spec.\n const DOC_EVENT_NAMES: Record<string, string> = {\n open: 'Open',\n 'will-save': 'WillSave',\n 'did-save': 'DidSave',\n 'will-print': 'WillPrint',\n 'did-print': 'DidPrint',\n 'will-close': 'WillClose',\n };\n\n const scriptEventFor = (actionCtx: ActionContext, snapshot: FormSnapshot): ScriptEventInput => {\n const provenance = actionCtx.event;\n const type =\n provenance.scope === 'page'\n ? 'Page'\n : provenance.scope === 'document'\n ? 'Doc'\n : actionCtx.source.kind === 'widget'\n ? 'Field'\n : actionCtx.source.kind === 'link'\n ? 'Link'\n : 'Annot'; // EmbedPDF extension — Acrobat has no plain-annot type\n const name =\n provenance.scope === 'activate'\n ? 'Mouse Up'\n : provenance.scope === 'annotation'\n ? (ANNOTATION_EVENT_NAMES[provenance.name] ?? 'Mouse Up')\n : provenance.scope === 'page'\n ? (PAGE_EVENT_NAMES[provenance.name] ?? 'Open')\n : (DOC_EVENT_NAMES[provenance.name] ?? 'Open');\n const targetRef = actionCtx.source.kind === 'widget' ? actionCtx.source.field : undefined;\n const targetField = targetRef\n ? snapshot.fields.find((field) =>\n targetRef.kind === 'objectNumber' && field.ref.kind === 'objectNumber'\n ? field.ref.fieldObjectNumber === targetRef.fieldObjectNumber\n : targetRef.kind === 'fqn' && field.name === targetRef.name,\n )\n : undefined;\n return {\n kind: 'widget-activate',\n type,\n name,\n ...(targetRef ? { target: targetRef, source: targetRef } : {}),\n ...(targetField && targetField.valueEntry.kind === 'scalar'\n ? { value: targetField.valueEntry.value }\n : {}),\n };\n };\n\n /** Commit one run's document effects through the owner sinks in the\n * DECLARED order (form first, then annot); the first failure skips the\n * rest across BOTH streams. Returns the failure summary, if any. */\n const commitScriptOutput = async (\n output: ScriptOutput,\n diagnose: (diagnostic: ActionDiagnostic) => void,\n ): Promise<string | null> => {\n let failure: string | null = null;\n if (output.formEffects.length > 0) {\n if (!formCommitSink) {\n diagnose({\n code: 'no-commit-sink',\n message: `script form effects dropped: no form commit sink registered (${output.formEffects.length})`,\n });\n } else {\n const result = await formCommitSink(output.formEffects);\n const bad = result.results.find(\n (entry) => entry.status === 'failed' || entry.status === 'rejected',\n );\n if (bad) failure = `form effect ${bad.index}: ${bad.error?.message ?? bad.status}`;\n }\n }\n if (output.annotEffects.length > 0) {\n if (failure) {\n diagnose({\n code: 'executor-failed',\n message: `script annot effects skipped after form failure (${output.annotEffects.length})`,\n });\n } else if (!annotCommitSink) {\n diagnose({\n code: 'no-commit-sink',\n message: `script annot effects dropped: no annotation commit sink registered (${output.annotEffects.length})`,\n });\n } else {\n const entries: AnnotCommitEntry[] = output.annotEffects.map((effect) => ({\n annotObjectNumber:\n effect.ref.kind === 'objectNumber' ? effect.ref.annotObjectNumber : -1,\n ...(effect.ref.kind === 'objectNumber'\n ? { pageObjectNumber: effect.ref.pageObjectNumber }\n : {}),\n patch: effect.patch,\n }));\n const result = await annotCommitSink(entries);\n const bad = result.results.find((entry) => entry.status === 'failed');\n if (bad) failure = `annotation ${bad.annotObjectNumber}: ${bad.error ?? 'failed'}`;\n }\n }\n if (failure) diagnose({ code: 'executor-failed', message: `script commit: ${failure}` });\n return failure;\n };\n\n // ── the REAL `javascript` executor: one node = one host transaction with\n // prefetch → boot? → run → commit → surface INSIDE the boundary ───────\n if (scriptHost) {\n const nodeCap = js?.maxScriptNodesPerDispatch ?? 16;\n executors.set('javascript', async (node, actionCtx) => {\n if (node.type !== 'javascript') return { status: 'inert', reason: 'not a JS node' };\n const doc = ctx.doc;\n if (!doc) return { status: 'inert', reason: 'no document' };\n if (jsNodesThisDispatch >= nodeCap) {\n return {\n status: 'inert',\n reason: `dispatch script budget exhausted (${nodeCap} JS nodes)`,\n };\n }\n jsNodesThisDispatch += 1;\n const source = actionCtx.source;\n const pon =\n source.kind === 'widget'\n ? source.pon\n : source.kind === 'link' || source.kind === 'annotation'\n ? (source.pon ?? ctx.document()?.pages[0]?.pageObjectNumber)\n : source.kind === 'page'\n ? source.pon\n : ctx.document()?.pages[0]?.pageObjectNumber;\n if (pon === undefined) return { status: 'inert', reason: 'no page to anchor the world on' };\n const diagnose = (diagnostic: ActionDiagnostic): void => diagnosticHook.emit(diagnostic);\n // Print/submit effects are EXTERNAL: the WP/DP wrap runs action trees\n // (which may need their own host transactions) and the submit dataset\n // must be resolved from POST-COMMIT truth — both must run after the\n // transaction releases, still inside this queued dispatch op.\n const pendingExternal: Array<{\n effect: Extract<ScriptUiEffect, { kind: 'print' | 'submitForm' }>;\n phase: 'boot' | 'user';\n }> = [];\n const splitExternal = (output: ScriptOutput, phase: 'boot' | 'user'): ScriptUiEffect[] =>\n output.uiEffects.filter((effect) => {\n if (effect.kind === 'print' || effect.kind === 'submitForm') {\n pendingExternal.push({ effect, phase });\n return false;\n }\n return true;\n });\n const outcome = await scriptHost.transaction<\n { status: 'executed' } | { status: 'failed'; error: string }\n >(async (txn) => {\n let built = await scriptWorldFor(pon);\n const boot = await txn.boot({\n ...built.world,\n event: { kind: 'name-tree-boot', type: 'Doc', name: 'Open' },\n });\n if (boot) {\n // Boot effects belong to this first transaction; a boot fault only\n // degrades (never bricks). Refetch the world afterwards so the run\n // sees post-boot truth.\n await commitScriptOutput(boot, diagnose);\n surfaceScriptResult({\n uiEffects: splitExternal(boot, 'boot'),\n diagnostics: boot.diagnostics,\n ...(boot.error ? { error: boot.error } : {}),\n origin: actionCtx.origin,\n phase: 'boot',\n });\n if (boot.formEffects.length || boot.annotEffects.length) {\n built = await scriptWorldFor(pon);\n }\n }\n const output = await txn.run(node.script, {\n ...built.world,\n event: scriptEventFor(actionCtx, built.snapshot),\n });\n surfaceScriptResult({\n uiEffects: splitExternal(output, 'user'),\n diagnostics: output.diagnostics,\n ...(output.error ? { error: output.error } : {}),\n origin: actionCtx.origin,\n phase: 'user',\n });\n if (output.error) return { status: 'failed', error: output.error.message };\n const failure = await commitScriptOutput(output, diagnose);\n return failure ? { status: 'failed', error: failure } : { status: 'executed' };\n });\n for (const entry of pendingExternal) {\n if (entry.effect.kind === 'print') {\n await firePrintThroughAdapter({ origin: actionCtx.origin, phase: entry.phase }, diagnose);\n } else {\n await performSubmit(intentOfSubmitEffect(entry.effect), actionCtx, diagnose);\n }\n }\n return outcome;\n });\n }\n\n async function run(tree: PdfActionTree, actionCtx: ActionContext): Promise<ActionDispatchResult> {\n const diagnostics: ActionDiagnostic[] = [];\n const diagnose = (diagnostic: ActionDiagnostic): void => {\n diagnostics.push(diagnostic);\n diagnosticHook.emit(diagnostic);\n };\n\n // The law: never execute an incomplete tree — not even its root.\n if (tree.incomplete) {\n diagnose({ code: 'incomplete-tree', message: 'refused: the action tree is incomplete' });\n return { status: 'refused', nodes: [], diagnostics };\n }\n if (!tree.root) return { status: 'inert', nodes: [], diagnostics };\n\n const nodes: ActionNodeResult[] = [];\n // Navigation and external effects are DEFERRED thunks — fired only after\n // every document-lifetime node succeeded, in node order, so navigation\n // can never yank the user away from a failed write.\n const deferred: Array<{ result: ActionNodeResult; fire: () => Promise<void> | void }> = [];\n let documentFailed = false;\n\n const settle = (\n result: ActionNodeResult,\n outcome: import('./types').ActionExecutorResult,\n ): void => {\n if (outcome.status === 'executed') result.status = 'executed';\n else if (outcome.status === 'inert') {\n result.status = 'inert';\n result.detail = outcome.reason;\n diagnose({ code: 'executor-inert', message: `${result.type}: ${outcome.reason}` });\n } else {\n result.status = 'failed';\n result.detail = outcome.error;\n diagnose({ code: 'executor-failed', message: `${result.type}: ${outcome.error}` });\n }\n };\n\n // Full ISO (D7): a Hide action SETS/CLEARS the document Hidden state\n // (12.6.4.11) — a real mutation through the OWNING plane's commit sink,\n // authority-gated by the engine like every other write. Widgets are the\n // FORMS plane's visibility (the engine's field-level `setDisplay` —\n // Acrobat's `field.display`; there is no per-widget annotation patch);\n // plain annotations are flag patches through the annotation sink.\n const interpretHide = async (\n node: Extract<PdfActionNode, { type: 'hide' }>,\n ): Promise<{ status: ActionNodeStatus; detail?: string }> => {\n const doc = ctx.doc;\n const display = node.hide ? ('hidden' as const) : ('visible' as const);\n const fieldRefs: Array<{ kind: 'objectNumber'; fieldObjectNumber: number }> = [];\n const annotEntries: AnnotCommitEntry[] = [];\n const names: string[] = [];\n const bareObjectNumbers: number[] = [];\n for (const target of node.targets) {\n if (target.kind === 'objectNumber') bareObjectNumbers.push(target.objectNumber);\n else names.push(target.name);\n }\n if ((names.length || bareObjectNumbers.length) && doc) {\n const snapshot = names.length || bareObjectNumbers.length ? await doc.forms.list() : null;\n for (const name of names) {\n const field = snapshot?.fields.find((candidate) => candidate.name === name);\n if (!field) {\n diagnose({ code: 'unresolved-target', message: `hide: no field named '${name}'` });\n continue;\n }\n fieldRefs.push({ kind: 'objectNumber', fieldObjectNumber: field.fieldObjectNumber });\n }\n for (const objectNumber of bareObjectNumbers) {\n // A bare object number may be a WIDGET (its field's display) or a\n // plain annotation (its own flags) — the forms snapshot decides.\n const owner = snapshot?.fields.find((field) =>\n field.widgets.some((widget) => widget.annotObjectNumber === objectNumber),\n );\n if (owner) {\n fieldRefs.push({ kind: 'objectNumber', fieldObjectNumber: owner.fieldObjectNumber });\n } else {\n annotEntries.push({\n annotObjectNumber: objectNumber,\n patch: { flags: { hidden: node.hide } },\n });\n }\n }\n }\n let failedDetail: string | undefined;\n if (fieldRefs.length) {\n if (!formCommitSink) {\n diagnose({\n code: 'no-commit-sink',\n message: 'hide: no form commit sink registered (form plugin absent)',\n });\n return { status: 'no-executor' };\n }\n const result = await formCommitSink(\n fieldRefs.map((ref) => ({ kind: 'setDisplay', ref, display })),\n );\n const bad = result.results.find(\n (entry) => entry.status === 'failed' || entry.status === 'rejected',\n );\n if (bad) {\n failedDetail = bad.error?.message ?? bad.status;\n diagnose({ code: 'executor-failed', message: `hide: ${failedDetail}` });\n }\n }\n if (annotEntries.length && !failedDetail) {\n if (!annotCommitSink) {\n diagnose({\n code: 'no-commit-sink',\n message: 'hide: no annotation commit sink registered (annotation plugin absent)',\n });\n return { status: 'no-executor' };\n }\n const committed = await annotCommitSink(annotEntries);\n const failed = committed.results.filter((entry) => entry.status === 'failed');\n for (const failure of failed) {\n diagnose({\n code: 'executor-failed',\n message: `hide: annotation ${failure.annotObjectNumber}: ${failure.error ?? 'failed'}`,\n });\n }\n if (failed.length === committed.results.length && failed.length > 0) {\n failedDetail = failed[0]?.error;\n }\n }\n if (failedDetail) return { status: 'failed', detail: failedDetail };\n return { status: 'executed' };\n };\n\n const interpret = async (node: PdfActionNode, path: number[]): Promise<void> => {\n const result: ActionNodeResult = { path, type: node.type, status: 'blocked' };\n nodes.push(result);\n const decision = decisionFor(node, actionCtx.origin);\n\n if (decision === 'never' || decision === 'block' || decision === 'report') {\n result.status = 'blocked';\n diagnose({\n code: 'blocked',\n message: `${node.type}: ${decision === 'never' ? 'never executable' : `policy '${decision}' for origin '${actionCtx.origin}'`}`,\n });\n return;\n }\n if (decision === 'unsupported') {\n result.status = 'no-executor';\n return;\n }\n\n if (node.type === 'hide') {\n // A document mutation now: an earlier document failure skips it, and\n // its failure stops later document work (the §3.9 ordering law).\n if (documentFailed) {\n result.status = 'skipped';\n return;\n }\n const outcome = await interpretHide(node);\n result.status = outcome.status;\n if (outcome.detail) result.detail = outcome.detail;\n if (outcome.status === 'failed') documentFailed = true;\n return;\n }\n\n if (DOCUMENT_TYPES.has(node.type)) {\n if (documentFailed) {\n result.status = 'skipped';\n return;\n }\n const executor = executors.get(node.type);\n if (!executor) {\n result.status = node.type === 'javascript' ? 'inert' : 'no-executor';\n diagnose({\n code: 'no-executor',\n message: `${node.type}: no executor registered${node.type === 'javascript' ? ' (scripting unavailable)' : ''}`,\n });\n return;\n }\n try {\n settle(result, await executor(node, actionCtx));\n } catch (error) {\n settle(result, {\n status: 'failed',\n error: error instanceof Error ? error.message : String(error),\n });\n }\n if (result.status === 'failed') documentFailed = true;\n return;\n }\n\n if (node.type === 'submit-form') {\n if (!node.payload) {\n // Older-runtime extraction (pin lag): exactly the pre-payload\n // behavior — recognized-inert, honestly diagnosed.\n result.status = 'inert';\n result.detail = 'submit payload unavailable (older runtime extraction)';\n diagnose({\n code: 'submit-payload-unavailable',\n message: 'submit-form: payload unavailable (older runtime extraction) — node inert',\n });\n return;\n }\n const payload = node.payload;\n // External like print/uri: deferred until every document-lifetime\n // node succeeded — a submission must never carry a half-failed\n // form state.\n result.status = 'skipped'; // provisional until fired\n deferred.push({\n result,\n fire: async () => {\n const outcome = await performSubmit(intentOfPayload(payload), actionCtx, diagnose);\n result.status = outcome.status;\n if (outcome.detail) result.detail = outcome.detail;\n },\n });\n return;\n }\n\n if (isPrintVerb(node) || node.type === 'uri') {\n // External: adapter-routed, deferred.\n result.status = 'skipped'; // provisional until fired\n deferred.push({\n result,\n fire: async () => {\n if (node.type === 'uri') {\n if (!uiAdapter) {\n result.status = 'no-executor';\n diagnose({ code: 'no-adapter', message: `${node.type}: no UI adapter installed` });\n return;\n }\n uiAdapter.openUri(node.uri, { isMap: node.isMap, origin: actionCtx.origin });\n result.status = 'executed';\n return;\n }\n // The Print verb: WP → adapter (exactly once) → DP, one latch\n // (D3). Authority/adapter/reentrancy verdicts come back as the\n // node's status.\n const outcome = await firePrintThroughAdapter(undefined, diagnose);\n result.status = outcome.status;\n if (outcome.detail) result.detail = outcome.detail;\n },\n });\n return;\n }\n\n // goto + named page verbs: navigation, executor-routed, deferred.\n result.status = 'skipped'; // provisional until fired\n deferred.push({\n result,\n fire: async () => {\n const executor = executors.get(node.type);\n if (!executor) {\n result.status = 'no-executor';\n diagnose({ code: 'no-executor', message: `${node.type}: no executor registered` });\n return;\n }\n try {\n settle(result, await executor(node, actionCtx));\n } catch (error) {\n settle(result, {\n status: 'failed',\n error: error instanceof Error ? error.message : String(error),\n });\n }\n },\n });\n };\n\n const walk = async (node: PdfActionNode, path: number[]): Promise<void> => {\n await interpret(node, path);\n for (let index = 0; index < node.next.length; index++) {\n await walk(node.next[index], [...path, index]);\n }\n };\n await walk(tree.root, []);\n\n if (!documentFailed) {\n for (const entry of deferred) await entry.fire();\n }\n\n const anyExecuted = nodes.some((node) => node.status === 'executed');\n const anyFailedOrSkipped = nodes.some(\n (node) => node.status === 'failed' || node.status === 'skipped',\n );\n const status: ActionDispatchResult['status'] = anyExecuted\n ? anyFailedOrSkipped\n ? 'partial'\n : 'executed'\n : anyFailedOrSkipped\n ? 'partial'\n : 'inert';\n return { status, nodes, diagnostics };\n }\n\n /** run + seq + event — the shared per-tree unit (queued by execute; called\n * inline per step by the queued trigger resolver). */\n const runAndEmit = async (\n tree: PdfActionTree,\n actionCtx: ActionContext,\n ): Promise<ActionDispatchResult> => {\n const result = await run(tree, actionCtx);\n ctx.dispatch({ type: 'ACTIONS_DISPATCHED' });\n actionHook.emit({ ctx: actionCtx, tree, result });\n return result;\n };\n\n const execute = (tree: PdfActionTree, actionCtx: ActionContext): Promise<ActionDispatchResult> => {\n // BEFORE enqueueing: a real user gesture arms the open-sequence latch\n // (its barrier op then lands ahead of this action in the queue) and\n // resets the cascade budget.\n if (actionCtx.origin === 'user') noteUserActivity();\n return enqueue(() => {\n jsNodesThisDispatch = 0; // D11: one aggregate per dispatch\n return runAndEmit(tree, actionCtx);\n });\n };\n\n const canExecute = (tree: PdfActionTree, actionCtx: ActionContext): boolean => {\n if (tree.incomplete || !tree.root) return false;\n const decision = decisionFor(tree.root, actionCtx.origin);\n return decision === 'allow' || decision === 'adapter';\n };\n\n // ── trigger machinery ─────────────────────────────────────────────────\n\n const triggerEnabled = (trigger: ActionTrigger): boolean => {\n switch (trigger.scope) {\n case 'activate':\n return true; // the Phase-1 core door — never gated\n case 'annotation':\n return config.triggers?.annotation !== false;\n case 'page':\n return config.triggers?.page !== false;\n case 'document':\n return config.triggers?.document !== false;\n }\n };\n\n /**\n * Per-pon cache of annotations bearing page-lifecycle trees (PO/PC/PV/PI)\n * — the fan-out's read amplifier. Invalidated wholesale on any\n * `annotation.*` document event and on `stream.desynced` (gap events never\n * arrive, so every cached page may be stale); rebuilt lazily per pon.\n */\n type LifecycleAnnot = { ref: AnnotationRef; actions: PdfAnnotationActions };\n const lifecycleCache = new Map<PageObjectNumber, LifecycleAnnot[]>();\n const lifecycleTreesFor = async (pon: PageObjectNumber): Promise<LifecycleAnnot[]> => {\n const hit = lifecycleCache.get(pon);\n if (hit) return hit;\n const doc = ctx.doc;\n if (!doc) return [];\n const { annotations } = await doc.page(pon).annotations.list();\n const bearing = annotations\n .filter(\n (a) =>\n a.actions &&\n (a.actions.pageOpen?.root ||\n a.actions.pageClose?.root ||\n a.actions.pageVisible?.root ||\n a.actions.pageInvisible?.root),\n )\n .map((a) => ({ ref: a.ref, actions: a.actions! }));\n lifecycleCache.set(pon, bearing);\n return bearing;\n };\n {\n // Optional-chained end to end: unit harnesses fake `ctx.doc` without an\n // event stream; a real DocumentHandle always carries one.\n const unsubscribe = ctx.doc?.events?.subscribe((event) => {\n if (event.type.startsWith('annotation.') || event.type === 'stream.desynced') {\n lifecycleCache.clear();\n }\n });\n if (unsubscribe) ctx.cleanup(unsubscribe);\n }\n\n /**\n * ISO order, verified against 32000-2 Table 197 (2026-09-02): PO \"shall be\n * executed after the O action … and the OpenAction entry\"; PC \"shall be\n * executed before the C action\". Rootless trees are skipped (a\n * budget-degraded tree with no root has nothing to walk).\n */\n const planPageSteps = (\n event: 'open' | 'close' | 'visible' | 'invisible',\n pon: PageObjectNumber,\n pageActions: PdfPageActions | undefined,\n lifecycle: LifecycleAnnot[],\n ): Array<{ source: ActionSource; tree: PdfActionTree }> => {\n const pageSource: ActionSource = { kind: 'page', pon };\n const annotSteps = (key: 'pageOpen' | 'pageClose' | 'pageVisible' | 'pageInvisible') =>\n lifecycle\n .filter((a) => a.actions[key]?.root)\n .map((a) => ({\n source: { kind: 'annotation', annotation: a.ref, pon } as ActionSource,\n tree: a.actions[key]!,\n }));\n switch (event) {\n case 'open':\n return [\n ...(pageActions?.open?.root ? [{ source: pageSource, tree: pageActions.open }] : []),\n ...annotSteps('pageOpen'),\n ];\n case 'close':\n return [\n ...annotSteps('pageClose'),\n ...(pageActions?.close?.root ? [{ source: pageSource, tree: pageActions.close }] : []),\n ];\n case 'visible':\n return annotSteps('pageVisible');\n case 'invisible':\n return annotSteps('pageInvisible');\n }\n };\n\n /** Aggregate step statuses. A step failure never skips its siblings; this\n * only FOLDS what each step reported. */\n const foldSteps = (\n steps: ActionStepResult[],\n diagnostics: ActionDiagnostic[],\n ): ActionTriggerResult => {\n const statuses = steps.map((s) => s.result.status);\n const status: ActionTriggerResult['status'] =\n steps.length === 0\n ? 'inert'\n : statuses.every((s) => s === 'refused')\n ? 'refused'\n : statuses.every((s) => s === 'inert')\n ? 'inert'\n : statuses.every((s) => s === 'executed')\n ? 'executed'\n : 'partial';\n return { status, steps, diagnostics };\n };\n\n const runSteps = async (\n steps: Array<{ source: ActionSource; tree: PdfActionTree }>,\n origin: ActionOrigin,\n event: import('./types').ActionTriggerEvent,\n diagnostics: ActionDiagnostic[],\n ): Promise<ActionTriggerResult> => {\n const results: ActionStepResult[] = [];\n for (const step of steps) {\n const result = await runAndEmit(step.tree, { origin, source: step.source, event });\n results.push({ source: step.source, tree: step.tree, result });\n }\n return foldSteps(results, diagnostics);\n };\n\n /** Everything a trigger needs — reads included — INSIDE the queued op:\n * submission order is execution order. Never throws. */\n const resolveAndRun = async (trigger: ActionTrigger): Promise<ActionTriggerResult> => {\n const diagnostics: ActionDiagnostic[] = [];\n const diagnose = (diagnostic: ActionDiagnostic): void => {\n diagnostics.push(diagnostic);\n diagnosticHook.emit(diagnostic);\n };\n try {\n const doc = ctx.doc;\n if (!doc) return { status: 'inert', steps: [], diagnostics };\n if (!triggerEnabled(trigger)) {\n diagnose({\n code: 'trigger-disabled',\n message: `${trigger.scope}: trigger family disabled by config`,\n });\n return { status: 'inert', steps: [], diagnostics };\n }\n const origin = originOf(trigger);\n switch (trigger.scope) {\n case 'activate':\n case 'annotation': {\n const event = trigger.scope === 'activate' ? 'activate' : trigger.event;\n const { annotations } = await doc.page(trigger.pon).annotations.list();\n const annotation = annotations.find((candidate) => sameRef(candidate.ref, trigger.ref));\n // ISO Table 197 (verified 2026-09-02): \"the A entry, if present,\n // takes precedence over [the /AA U entry]\" — a shadowed U tree is\n // silently inert, exactly like an absent one.\n if (event === 'mouseUp' && annotation?.actions?.activate) {\n return { status: 'inert', steps: [], diagnostics };\n }\n const tree = annotation?.actions?.[event];\n if (!tree?.root && !tree?.incomplete) return { status: 'inert', steps: [], diagnostics };\n const source: ActionSource =\n trigger.source ?? { kind: 'annotation', annotation: trigger.ref, pon: trigger.pon };\n return await runSteps([{ source, tree }], origin, eventOf(trigger), diagnostics);\n }\n case 'page': {\n const layout = ctx\n .document()\n ?.pages.find((page) => page.pageObjectNumber === trigger.pon);\n const lifecycle = await lifecycleTreesFor(trigger.pon);\n const steps = planPageSteps(trigger.event, trigger.pon, layout?.actions, lifecycle);\n return await runSteps(steps, origin, eventOf(trigger), diagnostics);\n }\n case 'document': {\n if (trigger.event !== 'open') {\n return await runDocumentEventOp(trigger.event, diagnostics, diagnose);\n }\n if (openFired) {\n diagnose({\n code: 'open-sequence-replayed',\n message: 'document open sequence already fired for this document',\n });\n return { status: 'inert', steps: [], diagnostics };\n }\n openFired = true;\n return await runOpenSequenceOp();\n }\n }\n } catch (error) {\n diagnose({\n code: 'trigger-failed',\n message: `trigger resolution failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n return { status: 'refused', steps: [], diagnostics };\n }\n };\n\n const dispatch = (trigger: ActionTrigger): Promise<ActionTriggerResult> => {\n // A user-origin trigger is user activity (latch + cascade reset) — noted\n // BEFORE taking the queue slot, so an armed open sequence runs first.\n if (originOf(trigger) === 'user') noteUserActivity();\n return enqueue(() => {\n jsNodesThisDispatch = 0; // D11: one aggregate per dispatch\n return resolveAndRun(trigger);\n });\n };\n\n // ── the lifecycle coordinator (document-open barrier + cascade budget) ──\n // Stage owns page truth (reports through reportPageState); this owns WHEN\n // page-lifecycle triggers fire: nothing emits before the §3.9 open\n // sequence has run (or been declared off/headless), and emission is a diff\n // against the last-emitted state — pre-open motion collapses to one open,\n // with no phantom close.\n const CASCADE_CAP = 8;\n let barrierOpen = false;\n let bufferedReport: PageStateReport | null = null;\n let lastEmitted: { currentPon: PageObjectNumber | null; visible: Set<PageObjectNumber> } = {\n currentPon: null,\n visible: new Set(),\n };\n let cascadeRounds = 0;\n let openFired = false;\n let sawUserActivity = false;\n\n const emitForReport = (report: PageStateReport): void => {\n if (report.cause === 'user') cascadeRounds = 0;\n const nextVisible = new Set(report.visiblePons);\n const changedCurrent = report.currentPon !== lastEmitted.currentPon;\n const leaving = [...lastEmitted.visible].filter((pon) => !nextVisible.has(pon));\n const entering = [...nextVisible].filter((pon) => !lastEmitted.visible.has(pon));\n if (!changedCurrent && leaving.length === 0 && entering.length === 0) return;\n const previousCurrent = lastEmitted.currentPon;\n // Track truth even when suppressed — the budget bounds EMISSION, not state.\n lastEmitted = { currentPon: report.currentPon, visible: nextVisible };\n if (report.cause === 'programmatic') {\n cascadeRounds += 1;\n if (cascadeRounds > CASCADE_CAP) {\n diagnosticHook.emit({\n code: 'cascade-budget',\n message: `page-lifecycle emission suppressed: ${cascadeRounds} consecutive programmatic rounds (cap ${CASCADE_CAP})`,\n });\n return;\n }\n }\n // Canonical order (cross-page order is unspecified by ISO; within a page\n // planPageSteps holds Table 197's PO-after-O / PC-before-C):\n // close(old) → invisible set → visible set → open(new).\n if (changedCurrent && previousCurrent !== null) {\n void dispatch({ scope: 'page', event: 'close', pon: previousCurrent });\n }\n for (const pon of leaving) void dispatch({ scope: 'page', event: 'invisible', pon });\n for (const pon of entering) void dispatch({ scope: 'page', event: 'visible', pon });\n if (changedCurrent && report.currentPon !== null) {\n void dispatch({ scope: 'page', event: 'open', pon: report.currentPon });\n }\n };\n\n const reportPageState = (report: PageStateReport): void => {\n if (!report.placed) return;\n if (report.cause === 'user') cascadeRounds = 0;\n if (!barrierOpen) {\n bufferedReport = report; // coalesce: only the LATEST pre-open state matters\n return;\n }\n emitForReport(report);\n };\n\n const releaseBarrier = (fireFallback: boolean): void => {\n barrierOpen = true;\n const report = bufferedReport;\n bufferedReport = null;\n try {\n if (report) {\n emitForReport(report);\n } else if (fireFallback && config.openSequence === 'headless') {\n // §3.9's initial page open falls back to the document's first page\n // ONLY in declared-headless mode (no stage will ever report). In\n // 'auto', the stage report owns the initial open — firing a\n // first-page /O before a restored view reports would be exactly the\n // phantom open the coordinator exists to prevent; a stage-less\n // 'auto' embedder drives page triggers itself or declares headless.\n const first = ctx.document()?.pages[0]?.pageObjectNumber;\n if (first !== undefined) {\n lastEmitted = { currentPon: first, visible: lastEmitted.visible };\n void dispatch({ scope: 'page', event: 'open', pon: first });\n }\n }\n } catch (error) {\n // The barrier is OPEN either way — feeds must never stay buffered.\n diagnosticHook.emit({\n code: 'trigger-failed',\n message: `barrier release failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n };\n\n /** The §3.9 sequence body — runs INSIDE the queue (via dispatch or the\n * latch's own enqueue; callers guarantee openFired was set). */\n const runOpenSequenceOp = async (): Promise<ActionTriggerResult> => {\n const diagnostics: ActionDiagnostic[] = [];\n const steps: ActionStepResult[] = [];\n const lifecycleCtx: ActionContext = {\n origin: 'lifecycle',\n source: { kind: 'document' },\n event: { scope: 'document', name: 'open' },\n };\n try {\n const snapshot = await readDocumentActions();\n if (snapshot?.openDestination) {\n // The initial view reuses the whole spine (stage's goto executor,\n // policy included) as a synthesized lifecycle goto.\n const tree: PdfActionTree = {\n root: {\n type: 'goto',\n subtype: 'GoTo',\n destination: snapshot.openDestination,\n next: [],\n },\n incomplete: false,\n warningFlags: 0,\n warnings: [],\n };\n steps.push({\n source: { kind: 'document' },\n tree,\n result: await runAndEmit(tree, lifecycleCtx),\n });\n }\n if (snapshot?.openAction?.root || snapshot?.openAction?.incomplete) {\n steps.push({\n source: { kind: 'document' },\n tree: snapshot.openAction,\n result: await runAndEmit(snapshot.openAction, lifecycleCtx),\n });\n }\n } catch (error) {\n const diagnostic: ActionDiagnostic = {\n code: 'trigger-failed',\n message: `open sequence failed: ${error instanceof Error ? error.message : String(error)}`,\n };\n diagnostics.push(diagnostic);\n diagnosticHook.emit(diagnostic);\n } finally {\n // Release AFTER the document steps, on EVERY path; page-open emission\n // enqueues BEHIND this op (never awaited here — awaiting our own\n // queue self-deadlocks).\n releaseBarrier(true);\n }\n return foldSteps(steps, diagnostics);\n };\n\n // ── document lifecycle events (Phase 4: WC/WS/DS/WP/DP) ─────────────────\n\n /**\n * D1's open-ordering law: catalog `OpenAction` may never run AFTER a\n * WillSave/WillPrint/WillClose script. Before the first verb-shaped\n * document event, an armed-but-unfired open sequence runs inline (we are\n * already inside the queue; `runOpenSequenceOp` never enqueues). It does\n * NOT wait for the initial page `/O` — the guarantee is catalog-level.\n */\n const ensureOpenSequenceBeforeDocEvent = async (): Promise<void> => {\n if (openFired || config.openSequence === 'off') return;\n openFired = true;\n await runOpenSequenceOp();\n };\n\n /**\n * Run ONE catalog lifecycle tree inside the current queue operation —\n * shared by the dispatch path, `runDocumentVerb`, and the print wrapper.\n * Never throws: a read/resolution failure degrades to a diagnostic (a\n * broken script must not cancel the user's save/print — D2).\n */\n const runDocEventTreeSafe = async (\n event: Exclude<DocumentTriggerEvent, 'open'>,\n diagnose: (diagnostic: ActionDiagnostic) => void,\n ): Promise<ActionStepResult | null> => {\n if (config.triggers?.document === false) return null;\n try {\n await ensureOpenSequenceBeforeDocEvent();\n const snapshot = await readDocumentActions();\n const tree = snapshot?.[DOC_EVENT_TREES[event]];\n if (!tree?.root && !tree?.incomplete) return null;\n const actionCtx: ActionContext = {\n origin: 'lifecycle',\n source: { kind: 'document' },\n event: { scope: 'document', name: event },\n };\n return { source: { kind: 'document' }, tree, result: await runAndEmit(tree, actionCtx) };\n } catch (error) {\n diagnose({\n code: 'trigger-failed',\n message: `${event}: ${error instanceof Error ? error.message : String(error)}`,\n });\n return null;\n }\n };\n\n /** The dispatch-path body for a verb-shaped document event. */\n const runDocumentEventOp = async (\n event: Exclude<DocumentTriggerEvent, 'open'>,\n diagnostics: ActionDiagnostic[],\n diagnose: (diagnostic: ActionDiagnostic) => void,\n ): Promise<ActionTriggerResult> => {\n const step = await runDocEventTreeSafe(event, diagnose);\n return foldSteps(step ? [step] : [], diagnostics);\n };\n\n /**\n * D3: BOTH adapter print invocations (the Named Print verb; script\n * `doc.print()` effects from the actions plane) go through here — WP →\n * `uiAdapter.print` exactly once → DP, latch reset in `finally`. While\n * the latch is held (including `runDocumentVerb('print')`'s body) a\n * nested request is suppressed with `reentrant-print`. An adapter throw\n * skips DP (the latch still resets) — named deviation: DP otherwise\n * fires when the adapter call RETURNS, since a browser cannot observe\n * dialog completion.\n */\n const firePrintThroughAdapter = async (\n uiContext: { origin: ActionOrigin; phase: 'boot' | 'user' } | undefined,\n diagnose: (diagnostic: ActionDiagnostic) => void,\n ): Promise<{ status: ActionNodeStatus; detail?: string }> => {\n if (docPrintEventActive) {\n diagnose({\n code: 'reentrant-print',\n message: 'print request during a document print event — suppressed (one dialog per request)',\n });\n return { status: 'blocked', detail: 'reentrant print suppressed' };\n }\n if (!allowsPrint()) {\n diagnose({ code: 'blocked', message: 'print: doc.print is not allowed' });\n return { status: 'blocked', detail: 'doc.print is not allowed' };\n }\n if (!uiAdapter) {\n diagnose({ code: 'no-adapter', message: 'print: no UI adapter installed' });\n return { status: 'no-executor', detail: 'no UI adapter installed' };\n }\n docPrintEventActive = true;\n try {\n await runDocEventTreeSafe('will-print', diagnose);\n const adapter = uiAdapter;\n if (!adapter) return { status: 'no-executor', detail: 'UI adapter uninstalled mid-print' };\n if (uiContext) adapter.print(uiContext);\n else adapter.print();\n await runDocEventTreeSafe('did-print', diagnose);\n return { status: 'executed' };\n } finally {\n docPrintEventActive = false;\n }\n };\n\n const maybeFireOpenSequence = (): void => {\n if (openFired) return;\n if (config.openSequence === 'off') {\n // The sequence never runs, but feeds must not buffer forever.\n openFired = true;\n releaseBarrier(false);\n return;\n }\n if (!uiAdapter && config.openSequence !== 'headless' && !sawUserActivity) return;\n openFired = true;\n void enqueue(() => runOpenSequenceOp());\n };\n\n const noteUserActivity = (): void => {\n cascadeRounds = 0;\n if (!sawUserActivity) {\n sawUserActivity = true;\n maybeFireOpenSequence();\n }\n };\n\n // Arm the latch at bringup: fires immediately for 'headless', releases the\n // barrier for 'off', waits for an adapter or user activity for 'auto'.\n maybeFireOpenSequence();\n\n return {\n execute,\n canExecute,\n dispatch,\n // Sync twin: family enabled ∧ document present (per-tree truth stays\n // per-step in results — resolution is async and never previewed here).\n canDispatch: (trigger) => triggerEnabled(trigger) && ctx.doc !== null,\n setUiAdapter: (adapter): Unsubscribe => {\n uiAdapter = adapter;\n // An adapter arriving is the §3.9 latch's usual release.\n if (adapter) maybeFireOpenSequence();\n return () => {\n // Identity-safe: never wipe a successor installed after us.\n if (uiAdapter === adapter) uiAdapter = null;\n };\n },\n runDocumentVerb: <T>(\n verb: 'save' | 'print',\n operation: () => Promise<T> | T,\n ): Promise<T> =>\n enqueue(async () => {\n jsNodesThisDispatch = 0; // one D11 aggregate for the whole verb op\n const diagnose = (diagnostic: ActionDiagnostic): void => diagnosticHook.emit(diagnostic);\n const before = verb === 'save' ? ('will-save' as const) : ('will-print' as const);\n const after = verb === 'save' ? ('did-save' as const) : ('did-print' as const);\n const body = async (): Promise<T> => {\n // A before-event failure never cancels the user's verb (D2);\n // runDocEventTreeSafe already degrades to diagnostics.\n await runDocEventTreeSafe(before, diagnose);\n // `operation()` throwing skips the after-event and rethrows —\n // no DidSave for a failed save.\n const value = await operation();\n await runDocEventTreeSafe(after, diagnose);\n return value;\n };\n if (verb !== 'print') return body();\n // The print verb holds the D3 latch for its WHOLE body, so a\n // WillPrint/DidPrint script calling doc.print() is suppressed\n // instead of opening a second dialog.\n docPrintEventActive = true;\n try {\n return await body();\n } finally {\n docPrintEventActive = false;\n }\n }),\n prepareClose: (): Promise<ActionTriggerResult> =>\n dispatch({ scope: 'document', event: 'will-close' }),\n setSubmitHandler: (handler): Unsubscribe => {\n submitHandler = handler;\n // Deliberately NOT an open-latch release — that stays the UI\n // adapter's role.\n return () => {\n if (submitHandler === handler) submitHandler = null;\n };\n },\n onAction: actionHook.on,\n onDiagnostic: diagnosticHook.on,\n onScriptDiagnostic: scriptDiagnosticHook.on,\n onScriptError: scriptErrorHook.on,\n\n registerExecutor: (type, executor): Unsubscribe => {\n if (executors.has(type)) {\n diagnosticHook.emit({\n code: 'duplicate-executor',\n message: `executor for '${type}' replaced (last-wins)`,\n });\n }\n executors.set(type, executor);\n return () => {\n if (executors.get(type) === executor) executors.delete(type);\n };\n },\n registerAnnotCommitSink: (sink): Unsubscribe => {\n annotCommitSink = sink;\n return () => {\n if (annotCommitSink === sink) annotCommitSink = null;\n };\n },\n registerFormCommitSink: (sink): Unsubscribe => {\n formCommitSink = sink;\n return () => {\n if (formCommitSink === sink) formCommitSink = null;\n };\n },\n ...(scriptHost\n ? {\n scriptTransaction: <T>(\n body: (txn: import('@embedpdf/core-acrojs').ScriptTransaction) => Promise<T>,\n ) => scriptHost.transaction(body),\n }\n : {}),\n surfaceScriptResult,\n reportPageState,\n registerSubmitResolver: (resolver): Unsubscribe => {\n submitResolver = resolver;\n return () => {\n if (submitResolver === resolver) submitResolver = null;\n };\n },\n };\n}\n","import type { ActionsAction, ActionsState } from './types';\n\nexport const initialActionsState = (): ActionsState => ({ seq: 0 });\n\nexport function actionsReducer(state: ActionsState, action: ActionsAction): ActionsState {\n switch (action.type) {\n case 'ACTIONS_DISPATCHED':\n return { seq: state.seq + 1 };\n default:\n return state;\n }\n}\n","import { definePlugin } from '@embedpdf/core';\n\nimport { createActionsCapability } from './capability';\nimport { actionsReducer, initialActionsState } from './reducer';\nimport { ActionsToken } from './types';\nimport type { ActionsAction, ActionsCapability, ActionsPluginConfig, ActionsState } from './types';\n\n/**\n * The action engine: the DEPENDENCY ROOT of the action architecture. It\n * interprets extracted /A and /AA trees; it never detects triggers and never\n * imports another plugin's token — stage, annotation, link, and form\n * optionally depend on ActionsToken and register their executors and sinks\n * at init (the kernel's topological order guarantees this plugin initializes\n * first). JavaScript is one registered interpreter among many: Hide,\n * ResetForm, GoTo, and Named work with scripting off.\n */\nexport const actionsPlugin = (config?: ActionsPluginConfig) =>\n definePlugin<ActionsState, ActionsAction, ActionsCapability>({\n id: 'actions',\n token: ActionsToken,\n scope: 'document',\n initialState: initialActionsState,\n reduce: actionsReducer,\n capability: (ctx) => createActionsCapability(ctx, config),\n });\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { A as DocumentTriggerEvent, E as ActionsToken, F as SubmitIntent, L as originOf, N as PdfAnnotationEventKind, S as ActionsCapability, T as ActionsState, _ as ActionTrigger, b as ActionUiContext, c as ActionNodeStatus, d as ActionPolicyDecision, f as ActionPolicyRow, g as ActionSubmitRequest, h as ActionSubmitHandler, i as ActionDispatchResult, l as ActionOrigin, m as ActionStepResult, n as ActionDiagnostic, p as ActionSource, r as ActionDispatchEvent, s as ActionNodeResult, t as ActionContext, u as ActionPolicy, v as ActionTriggerResult, w as ActionsPluginConfig, x as ActionsAction, y as ActionUiAdapter } from "./types-DRQReAuO.cjs";
2
+ import { i as createHoverPump, n as HoverPump, r as HoverTarget, t as submitEntriesToUrlEncoded } from "./contract-KaJQWh67.cjs";
3
+ //#region src/actions.plugin.d.ts
4
+ /**
5
+ * The action engine: the DEPENDENCY ROOT of the action architecture. It
6
+ * interprets extracted /A and /AA trees; it never detects triggers and never
7
+ * imports another plugin's token — stage, annotation, link, and form
8
+ * optionally depend on ActionsToken and register their executors and sinks
9
+ * at init (the kernel's topological order guarantees this plugin initializes
10
+ * first). JavaScript is one registered interpreter among many: Hide,
11
+ * ResetForm, GoTo, and Named work with scripting off.
12
+ */
13
+ declare const actionsPlugin: (config?: ActionsPluginConfig) => import("@embedpdf/core").PluginDef<ActionsState, ActionsAction, ActionsCapability>;
14
+ //#endregion
15
+ export { type ActionContext, type ActionDiagnostic, type ActionDispatchEvent, type ActionDispatchResult, type ActionNodeResult, type ActionNodeStatus, type ActionOrigin, type ActionPolicy, type ActionPolicyDecision, type ActionPolicyRow, type ActionSource, type ActionStepResult, type ActionSubmitHandler, type ActionSubmitRequest, type ActionTrigger, type ActionTriggerResult, type ActionUiAdapter, type ActionUiContext, type ActionsCapability, type ActionsPluginConfig, ActionsToken, type DocumentTriggerEvent, type HoverPump, type HoverTarget, type PdfAnnotationEventKind, type SubmitIntent, actionsPlugin, createHoverPump, originOf, submitEntriesToUrlEncoded };
16
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1,16 @@
1
+ import { A as DocumentTriggerEvent, E as ActionsToken, F as SubmitIntent, L as originOf, N as PdfAnnotationEventKind, S as ActionsCapability, T as ActionsState, _ as ActionTrigger, b as ActionUiContext, c as ActionNodeStatus, d as ActionPolicyDecision, f as ActionPolicyRow, g as ActionSubmitRequest, h as ActionSubmitHandler, i as ActionDispatchResult, l as ActionOrigin, m as ActionStepResult, n as ActionDiagnostic, p as ActionSource, r as ActionDispatchEvent, s as ActionNodeResult, t as ActionContext, u as ActionPolicy, v as ActionTriggerResult, w as ActionsPluginConfig, x as ActionsAction, y as ActionUiAdapter } from "./types-DRQReAuO.js";
2
+ import { i as createHoverPump, n as HoverPump, r as HoverTarget, t as submitEntriesToUrlEncoded } from "./contract-Cl-f3d61.js";
3
+ //#region src/actions.plugin.d.ts
4
+ /**
5
+ * The action engine: the DEPENDENCY ROOT of the action architecture. It
6
+ * interprets extracted /A and /AA trees; it never detects triggers and never
7
+ * imports another plugin's token — stage, annotation, link, and form
8
+ * optionally depend on ActionsToken and register their executors and sinks
9
+ * at init (the kernel's topological order guarantees this plugin initializes
10
+ * first). JavaScript is one registered interpreter among many: Hide,
11
+ * ResetForm, GoTo, and Named work with scripting off.
12
+ */
13
+ declare const actionsPlugin: (config?: ActionsPluginConfig) => import("@embedpdf/core").PluginDef<ActionsState, ActionsAction, ActionsCapability>;
14
+ //#endregion
15
+ export { type ActionContext, type ActionDiagnostic, type ActionDispatchEvent, type ActionDispatchResult, type ActionNodeResult, type ActionNodeStatus, type ActionOrigin, type ActionPolicy, type ActionPolicyDecision, type ActionPolicyRow, type ActionSource, type ActionStepResult, type ActionSubmitHandler, type ActionSubmitRequest, type ActionTrigger, type ActionTriggerResult, type ActionUiAdapter, type ActionUiContext, type ActionsCapability, type ActionsPluginConfig, ActionsToken, type DocumentTriggerEvent, type HoverPump, type HoverTarget, type PdfAnnotationEventKind, type SubmitIntent, actionsPlugin, createHoverPump, originOf, submitEntriesToUrlEncoded };
16
+ //# sourceMappingURL=index.d.ts.map