A short, human-readable summary of the problem.
A human-readable explanation specific to this occurrence of the problem.
A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced.
A URI reference that identifies the problem type
Retrieves a ConstraintViolation resource.
Marker class for the API Platform `AdminOverview` resource. The actual response shape is built by {@see \KeyVue\Admin\Application\Service\AdminOverviewService::overview()} and serialised as a flat JSON object — this class only exists so AP4 has a `class` attribute to anchor the route on.
Legacy per-agent owner. Null for rows created via the brand-scoped agenda surface (phase 5e onwards); ChatService and ToolFactory both read appointment types via `$brand` + `ChannelScope::applies()` now, so this field is only kept for the legacy per-agent surface.
Channel scope. Empty list = applies to every channel of the brand.
The agent's name is its brand's ONE agent name, shared by every channel ({@see Brand::getEffectiveAgentName()}) — there is no per-channel persona name. Resolving it here means every consumer is automatically correct: the prompt role block, the phone switchboard, the email sign-off and from-name, the webhook {agent_name}, and — because API serialization reads this getter — the widget/phone greetings (which substitute {agent.name} client-side) and the agent lists in the app.
Retrieves a BulkStatisticsRequest resource.
Per-field channel scope. Keyed by field name (predefined `GoalFieldName` value or a custom slug), value is the list of `BrandChannel`s on which the agent should ask for that field.
User-defined custom fields surfaced as required. Each entry is a slug (lowercase + non-alphanumeric -> `_`) that doesn't match a predefined `GoalFieldName` value. The slug is the persisted value; the customer-visible label lives in `$customFieldLabels`.
User-defined custom fields surfaced as optional. Same shape as `$customRequiredFields`.
Slug -> customer-typed display label map. Only contains entries for slugs that appear in `$customRequiredFields` or `$customOptionalFields`. Predefined `GoalFieldName` values get their labels from the global i18n catalogue, not from here.
Natural-language gate appended to the rendered prose; not regen input.
Natural-language anti-gate; not regen input.
Include conversation summary in the firing email (default: fields only).
Legacy per-agent owner. Null for goals created via the brand-scoped surface (phase 4f onwards); ChatService + ToolFactory read goals via `$brand` + `ChannelScope::applies()` now. Kept for the legacy per-agent create surface.
Subdomain-aware sender blocklist. Distinct from {@see $knownDomains}: knownDomains is exact-match (security gate — implicit subdomain match would re-open lookalike attacks), blockedDomains is subdomain-aware (ergonomics — one entry per vendor covers every transactional sub-host).
Set when ops disables the agent for this brand — typically because the customer reported bad-quality drafts or asked to opt out of beta. Distinct from removing the brand from `email_beta.yaml`: the allowlist controls FUTURE create/change calls; this timestamp is the durable "this brand churned out of beta" record used by the opt-out metric (plan §"Beta-exit metrics").
Optional broker-authored greeting prepended verbatim above the AI's reply by {@see \KeyVue\AI\Assistent\Application\Service\EmailBodyHtmlRenderer}.
Optional broker-authored sign-off block appended verbatim below the AI's reply. Multi-line allowed (typically 3-4 lines: "Met vriendelijke groet,\n\nMaxemailian\nDe Koning Wonen"). The renderer's existing paragraph logic turns `\n\n`-separated blocks into ` ` tags.
AI agent for inbound email handling on a brand-connected Gmail/Outlook/IMAP mailbox via Unipile. Replies are created as drafts in beta (`draftMode=true`); customer reviews and sends manually. NOTE: not to be confused with {@see EmailRouting}, which is a legacy per-Assistent outbound-notification config (function/goal trigger emails) used by web/phone/messaging Assistents. EmailAssistent is the email channel itself; EmailRouting is operational notifications.
Retrieves a InstagramAssistent resource.
i18n keys for rejection reasons, set from Twilio webhook when rejected
Brand-scoped knowledge document. Uploaded once per brand, fanned out to every agent's effective vector store via `LinkOpenAIBrandDocumentCommandHandler`. Parallels the legacy per-agent `KeyVue\AI\Assistent\Domain\Assistent\Document`; FAQs stay per-agent.
One row per draft created via the email channel. Captures the AI-generated draft at the moment it's handed to Unipile, then a reconciliation cron fills in {@see $sentAt} / {@see $sentBody} / similarity metrics by walking the Unipile sent folder periodically. The four beta-exit metrics derive from this table (plan §"Beta-exit metrics"): - Send rate = COUNT(sentAt IS NOT NULL) / COUNT(*) - Time-to-send = sentAt - draftCreatedAt (median + p90 over a window) - Edit distance = levenshteinDistance + similarityPercent (two views) - Opt-out = EmailAssistent.disabledAt count, joined separately Brand and assistent IDs are denormalised as strings (no Doctrine association) so per-brand aggregation queries don't pay a join cost. Foreign-key integrity is enforced at the DB layer via the migration — deleting a Chat / Assistent / Brand cascades to the metrics, keeping the table self-pruning without manual cleanup logic. draftBody stores the PLAIN-PROSE AI reply (the assistant Interaction's raw content), NOT the rendered HTML. Levenshtein/similarity against Unipile's `body_plain` is the comparison we actually want; comparing HTML-tagged output to plain text would balloon the distance with markup noise that has nothing to do with what the customer changed.
Retrieves a GreetingAvailabilityRule resource.
Retrieves a GreetingExceptionRule resource.
Retrieves a InstructionElement resource.
Deletes the InstructionElement resource.
Retrieves a StatisticsForAssistent resource.
Legacy per-agent owner. `null` for brand-level webhooks created via the new brand-scoped CRUD. Kept nullable so existing per-agent rows preserve their explicit agent affinity until the per-agent UI is removed.
Channel scope. Empty list = "applies to every channel of the brand".
Static key-value properties merged into the CRM payload.
Persists every webhook dispatch attempt for the user-facing delivery log. Lifecycle: created PENDING by an entry point (TriggerWebhookCommandHandler or a domain-event listener), then loaded and updated by DispatchWebhookCommandHandler. Never created by the dispatch handler itself, so a single logical dispatch always maps to exactly one row regardless of how many inline + async retry attempts it goes through.
Non-sensitive configuration (e.g. Shopify shop domain, API version).
A customer-configured external service integration that exposes one or more AI tool functions at chat time. Credentials are stored encrypted-at-rest; only the ToolIntegrationCredentialsResolver may decrypt them.
Default language for every channel agent created from this brand.
Customer-facing name used for every channel agent created from this brand. Set during onboarding (defaults to "Noa" in the UI) and read by `AutoCreateChannelAssistentsForBrandEventHandler`. Null on brands created before this field existed — the handler falls back to `brand.name` (the company name) in that case.
Retrieves a TimeBasedResourceLimit resource.
Retrieves a CumulativeUsagePerAssistentPerDay resource.
Retrieves a CumulativeUsagePerPeriod resource.
Retrieves a GenerateCustomerPortalLinkResponse resource.
The message associated with the violation