import { type ValidatorEnv } from "../lib/schema-validator.js";
interface ProfileUpdateParams {
    accountId: string;
    userId: string;
    category: string;
    key: string;
    value: string;
    source?: "explicit" | "behavioural";
    mode?: "reinforce" | "update" | "contradict" | "merge";
    sessionId?: string;
    profileFields?: Record<string, unknown>;
    /**
     * first-class "this field doesn't apply to me" signal.
     *
     * When `true`, writes a Preference with `notApplicable: true` and
     * `confidence: 1.0`. The field is then counted as covered in the
     * sparse-state observability log (computeAbsentFields) so the agent
     * stops re-eliciting it, and the row is filtered from the user-facing
     * prose body produced by `formatProfileSummary` (no value to render).
     *
     * Validation:
     *   - Mutually exclusive with non-empty `value` (rejects loudly — a
     *     declination has no value to record).
     *   - Rejects `mode: "merge"` and `mode: "contradict"` — declination
     *     is immutable once set; the agent must call `profile-delete` if
     *     the user reverses themselves later.
     *   - Forces `confidence: 1.0` regardless of caller-supplied value,
     *     and bypasses the reinforcement-curve update on existing rows.
     */
    notApplicable?: boolean;
    /**
     * open Person properties for personal-profile elicitation.
     * The agent decides which Person properties best help it serve the
     * operator (identity, contact, context); the schema validator (synonym
     * pass + forbidden-property pass) is the central enforcement.
     * No allow-list, no enumeration. Writes route to the operator's
     * personal-profile Person via `(au:AdminUser)-[:OWNS]->(p:Person)`.
     *
     * Validation runs in `mode: "update"`: synonym + forbidden
     * checks fire (so `phone` rejects with "use telephone", `name` rejects
     * with the Forbidden Properties rationale), but the required-property
     * loop is skipped (the personal-profile Person was created with
     * givenName/familyName at PIN setup; partial SET should not re-validate
     * those).
     */
    personFields?: Record<string, unknown>;
    /** For mode: "merge" — preferenceIds of sources to merge into this preference */
    mergeSourceIds?: string[];
    /**
     * Schema validator environment — passed in by the MCP server (built once
     * at startup, see `index.ts`). Required when `personFields` is non-empty
     * so the central validator can enforce synonym + forbidden-property
     * rules on operator-identity writes.
     */
    validator?: ValidatorEnv;
}
interface ProfileUpdateResult {
    preferenceId: string;
    action: "created" | "reinforced" | "updated" | "contradicted" | "merged";
    confidence: number;
    mergedCount?: number;
}
export declare function profileUpdate(params: ProfileUpdateParams): Promise<ProfileUpdateResult>;
export {};
//# sourceMappingURL=profile-update.d.ts.map