Auto-derive session cookie domain; AI prompt page = formula builder hub

Session (no env needed):
- SESSION_COOKIE_DOMAIN env removed. Config.SessionCookieParentDomain()
  derives the cookie Domain from WEB_ORIGIN + PUBLIC_API_URL, which the
  API already requires: sibling hosts of one parent (descrybe.io +
  api.descrybe.io) share the parent domain so SvelteKit SSR (/admin
  gate, user switching) receives the session cookie; localhost, IPs,
  same-host, and unrelated hosts stay host-only. Deploying the new build
  is the whole fix — nothing to configure.

AI generation prompt page:
- Each section now embeds its formula editor next to the per-language
  prompt instructions: Title = full title formula builder (preview,
  elements, separator, variable selector, custom variables), Description
  = description formula sections editor (type + instructions + export
  id, drag reorder), Meta = meta title / meta description formula
  fields. One Save writes categories.prompt + title_template +
  description_template together; Assign copies all three to the
  selected categories.
- New $lib/categories/formula-variables.ts loads every usable field for
  the builder: custom variables (/api/variables), company attributes
  (/api/attributes — attribute_key, name, unit, example), and standard
  fields (/api/standard-fields). Used by both the prompt page and the
  title-formula page (which previously ignored attributes).

Verified locally: svelte-check clean for changed files, unit tests pass,
and the full save contract exercised over HTTP as the page does it
(login → load variables/attributes/standard-fields → PATCH prompt +
title-formula + description-formula → round-trip read), then the test
category restored via repair-category-prompts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-18 01:12:23 +02:00
co-authored by Claude Fable 5
parent 9a839d6d13
commit d03c2a5c57
7 changed files with 657 additions and 62 deletions
+3 -6
View File
@@ -105,12 +105,9 @@ APP_ENCRYPTION_KEY=
# Optional RATE_LIMIT_REPLICAS divides HTTP middleware caps only (not lockout/StartLimiter/AI/email)
# — not a shared store. RATE_LIMIT_BACKEND=redis|postgres is docs-only and forced to memory.
# SESSION_COOKIE_NAME=descrybe_session
# Session cookie Domain attribute. Empty = host-only (localhost / same-host).
# REQUIRED when web + api run on sibling subdomains (descrybe.io + api.descrybe.io):
# set the parent domain so the browser also sends the session cookie to the web
# host — SvelteKit SSR gates (/admin) forward it to /api/auth/me and otherwise
# always see 401 (login loops back to /login?next=...).
# SESSION_COOKIE_DOMAIN=descrybe.io
# Session cookie Domain is derived automatically from WEB_ORIGIN + PUBLIC_API_URL:
# sibling hosts of one parent (descrybe.io + api.descrybe.io) share the parent
# domain so SvelteKit SSR receives the session cookie; localhost stays host-only.
# CSRF_COOKIE_NAME=descrybe_csrf
# PUBLIC_CSRF_COOKIE_NAME=descrybe_csrf
# SESSION_IDLE_HOURS=24