/**
 * Compose-decision pipeline (M8 — see `.cursor/plans/m8-design.md` § 3).
 *
 * Pure function: given a decision request, the host's tools config,
 * an optional PNP policy source, and the registered custom sources, returns
 * a `ToolPolicyDecision`. The function performs no I/O, holds no
 * mutable state, and never reaches into Svelte / DOM — that is the
 * `ToolPolicyEngine` class's job.
 *
 * The six steps below mirror the design doc exactly. The tests in
 * `tests/policy/compose-decision.test.ts` lock the orchestration in.
 */
import type { AssessmentEntity, AssessmentItemRef } from "@pie-players/pie-players-shared/types";
import { type CanonicalToolsConfig } from "../../services/tools-config-normalizer.js";
import type { ToolPolicyDecision, ToolPolicyDecisionRequest } from "./decision-types.js";
import type { PolicySource } from "./PolicySource.js";
import type { PnpPolicySource } from "../sources/PnpPolicySource.js";
export interface ComposeDecisionInputs {
    request: ToolPolicyDecisionRequest;
    tools: CanonicalToolsConfig;
    pnpPolicy: {
        source: PnpPolicySource | null;
        assessment?: AssessmentEntity;
        currentItemRef?: AssessmentItemRef;
        /**
         * "on" applies the PNP/profile precedence rules; "off" skips step 5
         * entirely. Defaults to "on" when an assessment is present
         * and the source is non-null (see M8 design Q5).
         */
        enforcement: "on" | "off";
    };
    customSources: readonly PolicySource[];
    /** Stable identifier used as the provenance `contextId`. */
    contextId: string;
}
export declare function composeDecision(inputs: ComposeDecisionInputs): ToolPolicyDecision;
