jenkins b66c762f5d hermes(webui): add HUX card UI models with contract-locked suites
Standalone per-card browser model/security/view modules for HUX-01..10
plus node+pytest suites that read the hux.v1 contract schemas directly.
Reconciled drift found on integration: the activity model now accepts
all 32 hux.event.v1 kinds (delegation.*, memory.suppressed,
memory.retrieval_removed, budget.exhausted, side_effect.*), the
autonomy model carries the external_side_effect capability, and the
foundation boundary test now asserts the shipped static HUX surface
exists on disk and that images never bake activated HUX_FLAGS.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BvMSXH8VH2tMWXanb8SJdf
2026-08-24 04:12:03 -03:00

29 lines
1.4 KiB
TypeScript

/** Same-origin backend contracts required by the HUX-10 frontend. */
export const API_VERSION = "hux.v1";
export const ACCEPT = "application/vnd.hermes.hux+json; version=1";
export const SNAPSHOT_SCHEMA = "hux.privacy_snapshot.v1";
/**
* GET /hux/v1/privacy/snapshot?session_id=&conversation_id=
* POST /hux/v1/privacy/controls
*
* Identity is derived only from the authenticated server session. The server
* MUST bind both opaque ids to that identity and surface; neither an identity
* nor a tenant selector is accepted from browser state or request parameters.
* Responses contain only the current effective retention state and, at most,
* one active hux.privacy_notice.v1. They MUST omit inactive or previous topic
* categories and the source message that caused classification.
*
* Controls accept schema, session_id, conversation_id, expected_revision and
* one enumerated action. A 409 rejects stale state. Enabling no-store disables
* memory writes and makes retention session-only atomically. Forgetting a
* conversation requires an explicit confirmed request and returns a scoped
* tombstone snapshot; the UI never infers consent. Topic changes clear the prior notice server-side
* so polling cannot reiterate sensitive details after the subject changes.
*/
export const BACKEND_ENDPOINTS = Object.freeze({
snapshot: "/privacy/snapshot",
controls: "/privacy/controls",
});