@suveren/gateway 0.25.1 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/suveren-gateway.js +10 -1
- package/content/guides/3-mandates.md +1 -1
- package/dist/control-plane/index.mjs +368 -247
- package/dist/mcp-server/http.mjs +112 -10
- package/dist/ui/assets/index-46UkxmPE.css +1 -0
- package/dist/ui/assets/index-BC5hwcsC.js +120 -0
- package/dist/ui/index.html +2 -2
- package/lib/policy.d.mts +3 -1
- package/lib/policy.mjs +28 -2
- package/node_modules/ip-address/README.md +70 -70
- package/node_modules/ip-address/dist/ipv6.js +7 -4
- package/node_modules/ip-address/dist/ipv6.js.map +1 -1
- package/node_modules/ip-address/dist/v6/constants.d.ts +3 -0
- package/node_modules/ip-address/dist/v6/constants.js +3 -0
- package/node_modules/ip-address/dist/v6/constants.js.map +1 -1
- package/node_modules/ip-address/package.json +2 -1
- package/package.json +1 -1
- package/dist/ui/assets/index-Ccst5MQ7.css +0 -1
- package/dist/ui/assets/index-CxVyYf7C.js +0 -120
package/dist/mcp-server/http.mjs
CHANGED
|
@@ -154,7 +154,7 @@ import { dirname, join as join3 } from "path";
|
|
|
154
154
|
import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
|
|
155
155
|
import { join as join2 } from "path";
|
|
156
156
|
import { spawnSync } from "child_process";
|
|
157
|
-
var POLICY_KEYS = ["AsUrl", "CaFile", "PinTls", "Proxy", "NoProxy", "Simulation", "InstallMethod"];
|
|
157
|
+
var POLICY_KEYS = ["AsUrl", "CaFile", "PinTls", "Proxy", "NoProxy", "Simulation", "InstallMethod", "Team"];
|
|
158
158
|
var DEFAULT_REGISTRY_BASE_KEY = "SOFTWARE\\Policies\\Suveren\\Gateway";
|
|
159
159
|
function registryKeyPath(hive) {
|
|
160
160
|
const baseKey = process.env.SUVEREN_POLICY_REGISTRY_KEY || DEFAULT_REGISTRY_BASE_KEY;
|
|
@@ -190,6 +190,11 @@ function validateCaFile(candidate) {
|
|
|
190
190
|
if (!existsSync2(trimmed)) return { ok: false, error: `No file at "${trimmed}".` };
|
|
191
191
|
return { ok: true, path: trimmed };
|
|
192
192
|
}
|
|
193
|
+
function validateTeamId(candidate) {
|
|
194
|
+
const trimmed = candidate.trim();
|
|
195
|
+
if (!trimmed) return { ok: false, error: "The team id is empty." };
|
|
196
|
+
return { ok: true, id: trimmed };
|
|
197
|
+
}
|
|
193
198
|
function validateProxyUrl(candidate) {
|
|
194
199
|
const trimmed = candidate.trim();
|
|
195
200
|
if (!trimmed) return { ok: false, error: "The proxy URL is empty." };
|
|
@@ -363,6 +368,14 @@ function readPolicy() {
|
|
|
363
368
|
policy.installMethod = "managed";
|
|
364
369
|
locked.add("installMethod");
|
|
365
370
|
}
|
|
371
|
+
if (merged.Team !== void 0) {
|
|
372
|
+
const v = validateTeamId(String(merged.Team));
|
|
373
|
+
if (!v.ok) {
|
|
374
|
+
throw new Error(`Invalid policy Team ("${String(merged.Team)}") from ${sourceOf.Team}: ${v.error}`);
|
|
375
|
+
}
|
|
376
|
+
policy.team = v.id;
|
|
377
|
+
locked.add("team");
|
|
378
|
+
}
|
|
366
379
|
cached = { policy, locked };
|
|
367
380
|
return cached;
|
|
368
381
|
}
|
|
@@ -861,6 +874,32 @@ var SPClient = class {
|
|
|
861
874
|
if (!res.ok) throw new Error(`SP compat request failed: ${res.status}`);
|
|
862
875
|
return res.json();
|
|
863
876
|
}
|
|
877
|
+
/**
|
|
878
|
+
* WS3 defence-in-depth (work-plan "Added 2026-10-11 — an account is
|
|
879
|
+
* Personal OR in one team"): the account's active TEAM id, or null when
|
|
880
|
+
* it currently has none (Personal mode) — `GET /api/groups/me`. Used only
|
|
881
|
+
* by AttestationCache.refreshActiveWorkspace, never on the hot tool-call
|
|
882
|
+
* path (it makes a live AS call).
|
|
883
|
+
*/
|
|
884
|
+
async getActiveTeamGroupId() {
|
|
885
|
+
const res = await this.fetch("/api/groups/me");
|
|
886
|
+
if (!res.ok) throw new Error(`SP groups/me request failed: ${res.status}`);
|
|
887
|
+
const data = await res.json();
|
|
888
|
+
return data.group?.id ?? null;
|
|
889
|
+
}
|
|
890
|
+
/**
|
|
891
|
+
* The account's own Personal group id — `GET /api/groups`, the entry
|
|
892
|
+
* with `isPersonal`. Same caller/purpose as {@link getActiveTeamGroupId}:
|
|
893
|
+
* together they resolve "the active workspace" (the active team if any,
|
|
894
|
+
* else Personal) without the gateway ever guessing at an id shape.
|
|
895
|
+
*/
|
|
896
|
+
async getPersonalGroupId() {
|
|
897
|
+
const res = await this.fetch("/api/groups");
|
|
898
|
+
if (!res.ok) throw new Error(`SP groups request failed: ${res.status}`);
|
|
899
|
+
const data = await res.json();
|
|
900
|
+
const personal = (data.groups ?? []).find((g) => g.isPersonal);
|
|
901
|
+
return personal?.id ?? null;
|
|
902
|
+
}
|
|
864
903
|
/**
|
|
865
904
|
* Get all mandates for an authorization id.
|
|
866
905
|
*
|
|
@@ -1066,6 +1105,48 @@ var AttestationCache = class {
|
|
|
1066
1105
|
* this fact to begin with.
|
|
1067
1106
|
*/
|
|
1068
1107
|
reapprovalNeeded = /* @__PURE__ */ new Set();
|
|
1108
|
+
/**
|
|
1109
|
+
* WS3 defence-in-depth (work-plan "Added 2026-10-11 — an account is
|
|
1110
|
+
* Personal OR in one team"): the account's current active workspace's
|
|
1111
|
+
* group id — its active team, else its Personal group. `null` = not yet
|
|
1112
|
+
* known (before the first {@link refreshActiveWorkspace}, or every
|
|
1113
|
+
* lookup it tried failed) — filtering is then SKIPPED rather than
|
|
1114
|
+
* refusing everything, because the Authority Server itself is the
|
|
1115
|
+
* fail-closed authority at ticket time (decision 6, WS2); this is a
|
|
1116
|
+
* second, narrower check for a window a buggy/stale cache entry could
|
|
1117
|
+
* otherwise slip through in, not a replacement for that enforcement.
|
|
1118
|
+
*/
|
|
1119
|
+
activeWorkspaceGroupId = null;
|
|
1120
|
+
/**
|
|
1121
|
+
* Re-resolve {@link activeWorkspaceGroupId} from the Authority Server.
|
|
1122
|
+
* Called by the resync-gates flow (http.ts's `/internal/resync-gates`),
|
|
1123
|
+
* never on the hot tool-call path — it makes up to two AS calls. Leaves
|
|
1124
|
+
* the previous value in place on any failure (network error, unexpected
|
|
1125
|
+
* shape): losing a known-good value on a transient blip would turn this
|
|
1126
|
+
* defence-in-depth check into a false refusal of every cached mandate,
|
|
1127
|
+
* which is worse than leaving it momentarily stale.
|
|
1128
|
+
*/
|
|
1129
|
+
async refreshActiveWorkspace() {
|
|
1130
|
+
try {
|
|
1131
|
+
const activeTeam = await this.spClient.getActiveTeamGroupId();
|
|
1132
|
+
if (activeTeam) {
|
|
1133
|
+
this.activeWorkspaceGroupId = activeTeam;
|
|
1134
|
+
return;
|
|
1135
|
+
}
|
|
1136
|
+
const personalId = await this.spClient.getPersonalGroupId();
|
|
1137
|
+
if (personalId) this.activeWorkspaceGroupId = personalId;
|
|
1138
|
+
} catch {
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
/**
|
|
1142
|
+
* True only when `groupId` is KNOWN (not undefined) and the active
|
|
1143
|
+
* workspace is ALSO known (not null) and they differ. Either side
|
|
1144
|
+
* unknown ⇒ false: this check only ever narrows what gets selected, it
|
|
1145
|
+
* never substitutes for the Authority Server's own enforcement.
|
|
1146
|
+
*/
|
|
1147
|
+
isForeignWorkspace(groupId) {
|
|
1148
|
+
return groupId !== void 0 && this.activeWorkspaceGroupId !== null && groupId !== this.activeWorkspaceGroupId;
|
|
1149
|
+
}
|
|
1069
1150
|
/**
|
|
1070
1151
|
* Get the SP public key, fetching from SP if not cached or expired, then —
|
|
1071
1152
|
* when a pin exists for this exact AS URL — verifying the live key still
|
|
@@ -1114,6 +1195,10 @@ var AttestationCache = class {
|
|
|
1114
1195
|
getAuthorization(path) {
|
|
1115
1196
|
const auth = this.authorizations.get(path);
|
|
1116
1197
|
if (!auth) return null;
|
|
1198
|
+
if (this.isForeignWorkspace(auth.groupId)) {
|
|
1199
|
+
this.authorizations.delete(path);
|
|
1200
|
+
return null;
|
|
1201
|
+
}
|
|
1117
1202
|
const now = Math.floor(Date.now() / 1e3);
|
|
1118
1203
|
const hasValid = auth.attestations.some((a) => a.expiresAt > now);
|
|
1119
1204
|
if (!hasValid) {
|
|
@@ -1138,6 +1223,13 @@ var AttestationCache = class {
|
|
|
1138
1223
|
);
|
|
1139
1224
|
}
|
|
1140
1225
|
const bounds = result.bounds ?? result.frame ?? {};
|
|
1226
|
+
let groupId;
|
|
1227
|
+
try {
|
|
1228
|
+
const summary = await this.spClient.getAuthorizationSummary(authorizationId);
|
|
1229
|
+
groupId = summary?.group_id ?? void 0;
|
|
1230
|
+
} catch {
|
|
1231
|
+
groupId = void 0;
|
|
1232
|
+
}
|
|
1141
1233
|
let signedCommitmentMode;
|
|
1142
1234
|
let subjects;
|
|
1143
1235
|
const firstBlob = result.attestations[0]?.blob;
|
|
@@ -1172,7 +1264,8 @@ var AttestationCache = class {
|
|
|
1172
1264
|
deferredCommitmentDomains: result.deferred_commitment_domains ?? [],
|
|
1173
1265
|
signedCommitmentMode,
|
|
1174
1266
|
subjects,
|
|
1175
|
-
complete: result.complete
|
|
1267
|
+
complete: result.complete,
|
|
1268
|
+
groupId
|
|
1176
1269
|
};
|
|
1177
1270
|
this.authorizations.set(auth.authorizationId, auth);
|
|
1178
1271
|
return auth;
|
|
@@ -1184,6 +1277,10 @@ var AttestationCache = class {
|
|
|
1184
1277
|
const now = Math.floor(Date.now() / 1e3);
|
|
1185
1278
|
const results = [];
|
|
1186
1279
|
for (const [path, auth] of this.authorizations) {
|
|
1280
|
+
if (this.isForeignWorkspace(auth.groupId)) {
|
|
1281
|
+
this.authorizations.delete(path);
|
|
1282
|
+
continue;
|
|
1283
|
+
}
|
|
1187
1284
|
const hasValid = auth.attestations.some((a) => a.expiresAt > now);
|
|
1188
1285
|
if (hasValid) {
|
|
1189
1286
|
results.push(auth);
|
|
@@ -3179,6 +3276,11 @@ function asUrlChangedNotice(what) {
|
|
|
3179
3276
|
|
|
3180
3277
|
TELL THE USER: open ${uiUrl()} and sign in again to pair with the new Authority Server.`;
|
|
3181
3278
|
}
|
|
3279
|
+
function managedWrongTeamNotice(what) {
|
|
3280
|
+
return `${what} Suveren gateway is LOCKED because it is set up by IT for one specific team, and the signed-in account is no longer in that team (it left, or was removed). This is NOT an ended sign-in \u2014 signing in again will be refused until the account is back in that team.
|
|
3281
|
+
|
|
3282
|
+
TELL THE USER: ask your IT administrator, or sign in with an account that is in the team this gateway is set up for, at ${uiUrl()}. Nothing ran while unsigned.`;
|
|
3283
|
+
}
|
|
3182
3284
|
function lockedNotice(action, reason = "restart") {
|
|
3183
3285
|
const what = action ? `Cannot ${action}: the` : "The";
|
|
3184
3286
|
switch (reason) {
|
|
@@ -3190,6 +3292,8 @@ function lockedNotice(action, reason = "restart") {
|
|
|
3190
3292
|
return asTlsMismatchNotice(what);
|
|
3191
3293
|
case "as-url-changed":
|
|
3192
3294
|
return asUrlChangedNotice(what);
|
|
3295
|
+
case "managed-wrong-team":
|
|
3296
|
+
return managedWrongTeamNotice(what);
|
|
3193
3297
|
default:
|
|
3194
3298
|
return bootLockedNotice(what);
|
|
3195
3299
|
}
|
|
@@ -8033,7 +8137,6 @@ function resolveTargetProfile(input) {
|
|
|
8033
8137
|
var CREATE_MANDATE_INPUT_SCHEMA = {
|
|
8034
8138
|
type: "object",
|
|
8035
8139
|
properties: {
|
|
8036
|
-
team: { type: "string", description: 'Team name or id, or "personal". Omit to use the workspace of your Delegation mandate.' },
|
|
8037
8140
|
// Short name only (e.g. "sales") — a full profile id is refused here, at input
|
|
8038
8141
|
// validation, before the tool ever runs (DL1 Interface contract).
|
|
8039
8142
|
profile: { type: "string", pattern: "^[a-z][a-z0-9-]*$", description: 'Profile short name, e.g. "sales" (newest version).' },
|
|
@@ -8123,7 +8226,6 @@ function setupBuiltin(deps) {
|
|
|
8123
8226
|
hideUnlessAuthorized: true,
|
|
8124
8227
|
// Shown like the mandate screen: limits and scope by the profile's own names.
|
|
8125
8228
|
approvalView: {
|
|
8126
|
-
team: { label: "Team" },
|
|
8127
8229
|
profile: { label: "Profile", kind: "profile" },
|
|
8128
8230
|
limits: { label: "Limits", kind: "profile-limits", profileArg: "profile" },
|
|
8129
8231
|
scope: { label: "Scope", kind: "profile-scope", profileArg: "profile" },
|
|
@@ -8132,7 +8234,7 @@ function setupBuiltin(deps) {
|
|
|
8132
8234
|
duration_hours: { label: "Valid for (hours)" },
|
|
8133
8235
|
title: { label: "Title" }
|
|
8134
8236
|
},
|
|
8135
|
-
preview: { tool: "describe_mandate_proposal", args: {
|
|
8237
|
+
preview: { tool: "describe_mandate_proposal", args: { profile: "profile", limits: "limits", scope: "scope", intent: "intent", mode: "mode", duration_hours: "duration_hours", title: "title" } }
|
|
8136
8238
|
},
|
|
8137
8239
|
// Internal preview tools (DL1): never listed, never callable by an
|
|
8138
8240
|
// agent (BuiltinTool.internal — enforced in index.ts and
|
|
@@ -8205,7 +8307,7 @@ ${body}`);
|
|
|
8205
8307
|
},
|
|
8206
8308
|
{
|
|
8207
8309
|
name: "create_mandate",
|
|
8208
|
-
description: "Propose a new mandate for the person running this gateway \u2014 the authority another tool needs (e.g. sales quotes up to a value). A person approves or rejects the proposal; only after approval is the mandate created, exactly as if they had signed it on the mandate screen. Checked against the profile before the proposal: unknown limits, a mode the profile does not allow, or a team where the person may not give this mandate are refused at once. Outside simulation mode, the profile and mode you may propose are themselves limited by your Delegation mandate's scope \u2014 Delegation itself can never be proposed. Create only.",
|
|
8310
|
+
description: "Propose a new mandate for the person running this gateway \u2014 the authority another tool needs (e.g. sales quotes up to a value). Always goes to the person's current workspace (their team, or Personal if they are not in one) \u2014 there is no way to name a different one. A person approves or rejects the proposal; only after approval is the mandate created, exactly as if they had signed it on the mandate screen. Checked against the profile before the proposal: unknown limits, a mode the profile does not allow, or a team where the person may not give this mandate are refused at once. Outside simulation mode, the profile and mode you may propose are themselves limited by your Delegation mandate's scope \u2014 Delegation itself can never be proposed. Create only.",
|
|
8209
8311
|
inputSchema: CREATE_MANDATE_INPUT_SCHEMA,
|
|
8210
8312
|
validate: async (args) => {
|
|
8211
8313
|
const fixed = delegationItselfRefusal(args);
|
|
@@ -8251,8 +8353,8 @@ ${body}`);
|
|
|
8251
8353
|
}
|
|
8252
8354
|
const { profile, shortName: targetShortName } = resolved;
|
|
8253
8355
|
const displayName = profile.name ?? targetShortName;
|
|
8254
|
-
const
|
|
8255
|
-
const workspace =
|
|
8356
|
+
const check = await controlPlaneMandate(true, mandateRequest(args));
|
|
8357
|
+
const workspace = check.ok && check.groupName ? check.groupName : "Personal";
|
|
8256
8358
|
const mode = typeof args.mode === "string" ? args.mode : "";
|
|
8257
8359
|
const structured = {
|
|
8258
8360
|
proposal: `New mandate \xB7 ${displayName}`,
|
|
@@ -8291,7 +8393,6 @@ ${body}`);
|
|
|
8291
8393
|
}
|
|
8292
8394
|
function mandateRequest(args) {
|
|
8293
8395
|
return {
|
|
8294
|
-
team: typeof args.team === "string" && args.team.trim() ? args.team.trim() : void 0,
|
|
8295
8396
|
profile: args.profile,
|
|
8296
8397
|
limits: args.limits,
|
|
8297
8398
|
scope: args.scope,
|
|
@@ -8524,7 +8625,7 @@ app.post("/internal/configure", internalOnly, (req, res) => {
|
|
|
8524
8625
|
});
|
|
8525
8626
|
app.post("/internal/clear-session", internalOnly, (req, res) => {
|
|
8526
8627
|
const reason = req.body?.reason;
|
|
8527
|
-
const validReason = reason === "as-key-mismatch" || reason === "as-tls-mismatch" || reason === "as-url-changed" ? reason : void 0;
|
|
8628
|
+
const validReason = reason === "as-key-mismatch" || reason === "as-tls-mismatch" || reason === "as-url-changed" || reason === "managed-wrong-team" ? reason : void 0;
|
|
8528
8629
|
state.spClient.clearSession(validReason);
|
|
8529
8630
|
console.error(`[Suveren MCP] Session cleared by control-plane (${validReason ?? "expired"})`);
|
|
8530
8631
|
res.json({ ok: true });
|
|
@@ -8598,6 +8699,7 @@ app.post("/internal/run-committed", internalOnly, (_req, res) => {
|
|
|
8598
8699
|
res.json({ ok: true });
|
|
8599
8700
|
});
|
|
8600
8701
|
app.post("/internal/resync-gates", internalOnly, async (_req, res) => {
|
|
8702
|
+
await state.cache.refreshActiveWorkspace();
|
|
8601
8703
|
const gates = state.gateStore.getAll();
|
|
8602
8704
|
if (gates.length === 0) {
|
|
8603
8705
|
res.json({ ok: true, synced: 0 });
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@font-face{font-family:Inter;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/Inter-Regular.woff2) format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:500;font-display:swap;src:url(/fonts/Inter-Medium.woff2) format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:600;font-display:swap;src:url(/fonts/Inter-SemiBold.woff2) format("woff2")}@font-face{font-family:Inter;font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/Inter-Bold.woff2) format("woff2")}*,*:before,*:after{margin:0;padding:0;box-sizing:border-box}:root{--text-primary: #111111;--text-secondary: #111111;--text-tertiary: #111111;--text-muted: #888888;--bg-main: #fafafa;--bg-elevated: #ffffff;--bg-input: #ffffff;--accent: #888888;--accent-subtle: #f0f0f0;--accent-hover: #555555;--border: #e5e5e5;--edit-border: #c7c7c7;--danger: #dc2626;--danger-subtle: #fef2f2;--success: #16a34a;--success-subtle: #f0fdf4;--warning: #d97706;--btn-primary-bg: #111111;--btn-primary-fg: #ffffff;--btn-primary-bg-hover: #000000;--btn-primary-bg-active: #2a2a2a;--icon-filter: brightness(0) invert(1);--primary-glow: rgba(0, 0, 0, .2);--primary-focus-ring: rgba(0, 0, 0, .15);--bg-field: #111111;--text-field: #ffffff;--border-field: #111111;--placeholder-field: rgba(255, 255, 255, .55);--field-focus-ring: rgba(0, 0, 0, .18);--nav-height: 3.5rem;--sidebar-width: 15rem;--content-width: 75rem;--content-padding: 2rem}:root[data-theme=dark]{--text-primary: #ffffff;--text-secondary: #ffffff;--text-tertiary: #ffffff;--text-muted: #888888;--bg-main: #0a0a0a;--bg-elevated: #1a1a1a;--bg-input: #141414;--accent: #888888;--accent-subtle: #1f1f1f;--accent-hover: #bbbbbb;--border: #2a2a2a;--edit-border: #4a4a4a;--danger-subtle: #2a0a0a;--success-subtle: #0a2a0a;--btn-primary-bg: #ffffff;--btn-primary-fg: #000000;--btn-primary-bg-hover: #e5e5e5;--btn-primary-bg-active: #c4c4c4;--icon-filter: brightness(0);--primary-glow: rgba(255, 255, 255, .25);--primary-focus-ring: rgba(255, 255, 255, .2);--bg-field: #ffffff;--text-field: #111111;--border-field: #ffffff;--placeholder-field: rgba(0, 0, 0, .5);--field-focus-ring: rgba(255, 255, 255, .25)}html{scroll-behavior:smooth}body{font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-feature-settings:"cv11","ss01","ss03";font-size:16px;line-height:1.6;color:var(--text-primary);background:var(--bg-main);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media (min-width: 1900px){body{font-size:17.5px}}@media (min-width: 2800px){body{font-size:19px}}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}h1,h2,h3,h4{font-weight:700;letter-spacing:-.02em;line-height:1.2;color:var(--text-primary)}code{background:var(--bg-elevated);border:1px solid var(--border);padding:.15rem .4rem;border-radius:.25rem;font-size:.875em;font-family:SF Mono,Monaco,Cascadia Code,Courier New,monospace}.top-nav{position:fixed;top:0;width:100%;height:var(--nav-height);background:#fafafaeb;backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);border-bottom:1px solid var(--border);z-index:1000}[data-theme=dark] .top-nav{background:#0a0a0aeb}.top-nav-inner{max-width:100%;margin:0 auto;padding:0 1.5rem;height:100%;display:flex;align-items:center;gap:1rem}.logo-group{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.logo-group svg{flex-shrink:0}.logo{font-weight:700;font-size:.95rem;color:var(--text-primary);text-decoration:none}.logo:hover{text-decoration:none}.version-badge{font-size:.65rem;font-weight:600;padding:.15rem .4rem;background:var(--btn-primary-bg);color:var(--btn-primary-fg);border-radius:.25rem}.gw-version{font-size:.7rem;padding:.15rem .4rem;border-radius:.25rem;color:var(--text-muted);background:var(--accent-subtle);font-variant-numeric:tabular-nums;white-space:nowrap}.gw-version[data-stale=true]{color:var(--warning);background:transparent;border:1px solid var(--warning)}.nav-spacer{flex:1}.nav-actions{display:flex;align-items:center;gap:.75rem}.workspace-pill{display:inline-flex;align-items:center;font-size:.75rem;font-weight:600;padding:.2rem .65rem;border-radius:9999px;border:1px solid var(--text-primary);color:var(--text-primary);white-space:nowrap}.workspace-pill[data-managed=true]{border-color:var(--accent);color:var(--accent)}.workspace-pill-it{font-weight:400}.user-chip{display:flex;align-items:center;gap:.5rem;font-size:.8rem;color:var(--text-secondary)}.user-chip strong{color:var(--text-primary)}.user-chip .dot{width:3px;height:3px;border-radius:50%;background:var(--text-tertiary)}.theme-toggle{width:2rem;height:2rem;background:none;border:1px solid var(--border);border-radius:.375rem;cursor:pointer;color:var(--text-secondary);font-size:1rem;display:flex;align-items:center;justify-content:center}.theme-toggle:hover{color:var(--accent);border-color:var(--accent)}.nav-logout{font-size:.8rem;color:var(--text-tertiary);cursor:pointer;background:none;border:none;font-family:inherit}.nav-logout:hover{color:var(--text-primary)}.domain-switcher{position:relative}.domain-switcher-btn{background:none;border:none;font-family:inherit;font-size:.8rem;color:var(--text-secondary);cursor:pointer;display:flex;align-items:center;gap:.25rem;padding:.125rem .25rem;border-radius:.25rem}.domain-switcher-btn:hover{color:var(--accent)}.domain-switcher-arrow{font-size:.6rem;color:var(--text-tertiary)}.domain-switcher-menu{position:absolute;top:calc(100% + .375rem);right:0;min-width:10rem;background:var(--bg-elevated);border:1px solid var(--border);border-radius:.5rem;box-shadow:0 4px 12px #0000001a;z-index:200;padding:.25rem}.domain-switcher-item{display:block;width:100%;text-align:left;background:none;border:none;font-family:inherit;font-size:.8rem;color:var(--text-secondary);padding:.5rem .75rem;border-radius:.375rem;cursor:pointer;white-space:nowrap}.domain-switcher-item:hover{background:var(--accent-subtle);color:var(--text-primary)}.domain-switcher-item.active{color:var(--accent);font-weight:600}.sidebar{position:fixed;top:calc(var(--nav-height) + var(--update-banner-h, 0px) + var(--sim-banner-h, 0px));left:0;width:var(--sidebar-width);height:calc(100vh - var(--nav-height) - var(--update-banner-h, 0px) - var(--sim-banner-h, 0px));background:var(--bg-elevated);border-right:1px solid var(--border);padding:1rem 0;z-index:900;display:flex;flex-direction:column}.sidebar-nav{list-style:none;padding:0 .5rem;flex:1}.sidebar-item{display:flex;align-items:center;gap:.625rem;padding:.5rem .75rem;margin-bottom:.125rem;border-radius:.5rem;font-size:.85rem;font-weight:500;color:var(--text-secondary);cursor:pointer;transition:background .15s,color .15s;text-decoration:none}.sidebar-item:hover{background:var(--accent-subtle);color:var(--text-primary);text-decoration:none}.sidebar-item.active{background:var(--accent-subtle);color:var(--accent);font-weight:600}.sidebar-item .icon{width:1.125rem;text-align:center;font-size:.9rem;flex-shrink:0}.sidebar-section-label{font-size:.65rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--text-tertiary);padding:1rem .75rem .375rem}.sidebar-context{padding:.75rem 1rem;border-top:1px solid var(--border);font-size:.75rem;color:var(--text-tertiary)}.sidebar-context .ctx-label{font-weight:600;color:var(--text-secondary);margin-bottom:.125rem}.sidebar-context .ctx-value{color:var(--text-primary);font-weight:500}.main-content{margin-left:var(--sidebar-width);margin-top:calc(var(--nav-height) + var(--update-banner-h, 0px) + var(--sim-banner-h, 0px));padding:2rem;min-height:calc(100vh - var(--nav-height))}.main-content.no-sidebar{margin-left:0}.page-inner{max-width:56rem;margin:0 auto}.page-inner:has(.intent-layout){max-width:none}.page-header{margin-bottom:1.5rem}.page-title{font-size:1.5rem;margin-bottom:.25rem}.page-subtitle{font-size:.9rem;color:var(--text-secondary)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;padding:.625rem 1.25rem;font-size:.9rem;font-weight:500;font-family:inherit;border-radius:.5rem;border:none;cursor:pointer;transition:all .2s;text-decoration:none;line-height:1.4}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background:var(--btn-primary-bg);color:var(--btn-primary-fg);border:2px solid var(--btn-primary-bg)}.btn-primary:hover:not(:disabled){background:var(--btn-primary-bg-hover);border-color:var(--btn-primary-bg-hover);color:var(--btn-primary-fg);transform:translateY(-1px);box-shadow:0 4px 12px var(--primary-glow)}.btn-primary:active:not(:disabled){background:var(--btn-primary-bg-active);border-color:var(--btn-primary-bg-active)}.btn-secondary{background:transparent;color:var(--text-primary);border:1px solid var(--border)}.btn-secondary:hover:not(:disabled){border-color:var(--btn-primary-bg);color:var(--text-primary);background:var(--accent-subtle)}.btn-ghost{background:transparent;color:var(--text-secondary);border:none;padding:.5rem .75rem}.btn-ghost:hover:not(:disabled){color:var(--text-primary);background:var(--accent-subtle)}.btn-full{width:100%}.btn-sm{padding:.375rem .75rem;font-size:.8rem}.btn-lg{padding:.875rem 2rem;font-size:1rem;font-weight:600}.form-group{margin-bottom:1.25rem}.form-label{display:block;font-size:.875rem;font-weight:600;color:var(--text-primary);margin-bottom:.375rem}.form-input,.form-select,.form-textarea{width:100%;padding:.625rem .75rem;font-size:.9rem;font-family:inherit;color:var(--text-field);background:var(--bg-field);border:1px solid var(--border-field);border-radius:.5rem;outline:none;transition:box-shadow .2s,border-color .2s}.form-input::placeholder,.form-textarea::placeholder{color:var(--placeholder-field);opacity:1}.form-input:focus,.form-textarea:focus,.form-select:focus{box-shadow:0 0 0 3px var(--field-focus-ring)}.form-input:disabled,.form-textarea:disabled,.form-select:disabled{opacity:.55;cursor:not-allowed}.form-input-invalid,.form-input-invalid:focus{border-color:var(--danger);box-shadow:0 0 0 3px #dc26262e}.form-textarea{resize:vertical;min-height:120px;line-height:1.5}.form-hint{font-size:.8rem;color:var(--text-tertiary);margin-top:.375rem}.form-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23ffffff' d='M6 8L1 3h10z'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .75rem center;padding-right:2.25rem}[data-theme=dark] .form-select{background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23111111' d='M6 8L1 3h10z'/%3E%3C/svg%3E")}.card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:1.5rem}.card+.card{margin-top:1rem}.card-highlight{animation:hap-card-highlight 2.4s ease-out 1}@keyframes hap-card-highlight{0%{box-shadow:0 0 0 2px var(--accent),0 0 24px var(--accent-subtle);border-color:var(--accent)}60%{box-shadow:0 0 0 2px var(--accent),0 0 24px var(--accent-subtle);border-color:var(--accent)}to{box-shadow:0 0 0 0 transparent,0 0 0 transparent;border-color:var(--border)}}@media (prefers-reduced-motion: reduce){.card-highlight{animation:none;border-color:var(--accent)}}.card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:1rem}.card-title{font-size:1rem;font-weight:600;margin:0}.auth-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:1.25rem;transition:opacity .2s,border-color .2s;cursor:pointer}.auth-card:hover{border-color:var(--accent)}.auth-card+.auth-card{margin-top:.75rem}.auth-card.expired{opacity:.5}.auth-card-header{display:flex;align-items:center;gap:.75rem;margin-bottom:.5rem;flex-wrap:wrap}.auth-card-path{font-weight:600;font-size:.95rem}.auth-card-time{font-size:.8rem;color:var(--text-tertiary);margin-left:auto}.success-card{background:var(--accent-subtle);border:1px solid var(--accent);border-radius:.75rem;padding:1.5rem;text-align:center}.success-card-title{font-size:1.1rem;font-weight:700;color:var(--accent);margin-bottom:.5rem}.success-card-hash{font-family:SF Mono,Monaco,monospace;font-size:.8rem;color:var(--text-secondary);word-break:break-all;margin-bottom:.5rem}.status-badge{display:inline-block;padding:.2rem .6rem;border-radius:9999px;font-size:.7rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase}.status-active{background:var(--accent-subtle);color:var(--accent)}.status-pending{background:var(--danger-subtle);color:var(--danger)}.status-expired{background:var(--bg-elevated);color:var(--text-tertiary)}.status-revoked{background:var(--danger-subtle);color:var(--danger)}.status-change-needed{background:color-mix(in srgb,var(--warning) 14%,transparent);color:var(--warning)}.status-replaced{background:var(--success-subtle);color:var(--success)}.int-chip{display:inline-flex;align-items:center;gap:.4rem;padding:.2rem .6rem;border-radius:9999px;font-size:.7rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase}.int-chip .int-dot{width:6px;height:6px;border-radius:50%;flex:none}.int-chip-ok{background:var(--success-subtle);color:var(--success)}.int-chip-ok .int-dot{background:var(--success)}.int-chip-bad{background:var(--danger-subtle);color:var(--danger)}.int-chip-bad .int-dot{background:var(--danger)}.int-chip-idle{background:var(--accent-subtle);color:var(--accent)}.int-chip-idle .int-dot{background:#bbb}.int-chip-sim{background:color-mix(in srgb,var(--warning) 14%,transparent);color:var(--warning)}.int-chip-sim .int-dot{background:var(--warning)}.int-chip-paused{background:var(--bg-main);color:var(--text-muted);border:1px solid var(--border)}.int-chip-paused .int-dot{background:var(--text-muted)}.int-details{border-top:1px solid var(--border);padding-top:.7rem;margin-top:.25rem}.int-details>summary{cursor:pointer;font-size:.78rem;color:var(--text-muted);list-style:none;display:flex;align-items:center;gap:.35rem;-webkit-user-select:none;user-select:none}.int-details>summary::-webkit-details-marker{display:none}.int-details>summary:before{content:"▸";font-size:.7rem;transition:transform .15s}.int-details[open]>summary:before{transform:rotate(90deg)}.int-meta{display:grid;grid-template-columns:auto 1fr;gap:.4rem 1rem;font-size:.8rem;margin-top:.7rem}.int-meta .int-k{color:var(--text-muted)}.int-account{font-size:.85rem;display:flex;align-items:center;gap:.5rem}.int-account .int-none{color:var(--text-muted);font-style:italic}.domain-badge{display:inline-block;padding:.2rem .5rem;font-size:.8rem;font-family:SF Mono,Monaco,monospace;background:var(--bg-main);border:1px solid var(--border);border-radius:.25rem;color:var(--text-secondary)}.domain-attested{color:var(--accent);border-color:var(--accent)}.domain-missing{color:var(--text-tertiary)}.profile-badge{display:inline-block;padding:.15rem .5rem;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.03em;background:var(--accent-subtle);color:var(--accent);border-radius:.25rem}.id-card{display:flex;align-items:stretch;padding:0;overflow:hidden}.id-rail{flex:0 0 5.5rem;width:5.5rem;box-sizing:border-box;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.4rem;padding:1rem .4rem;text-align:center}.id-rail-icon{width:1.6rem;height:1.6rem;color:var(--text-secondary);flex:none}.id-rail-name{max-width:100%;overflow-wrap:normal;word-break:keep-all;-webkit-hyphens:manual;hyphens:manual;font-size:.65rem;font-weight:700;color:var(--text-muted);line-height:1.25;text-transform:uppercase;letter-spacing:.02em}.id-sep{flex:0 0 1px;background:var(--border)}.id-body{flex:1 1 auto;min-width:0;padding:1rem 1.25rem}.id-body .auth-card-header,.id-body .receipt-head{margin-bottom:.25rem}@media (max-width: 460px){.id-rail{flex-basis:4.25rem;width:4.25rem;padding:.75rem .25rem;gap:.2rem}.id-rail-icon{width:1.2rem;height:1.2rem}.id-rail-name{font-size:.5rem;letter-spacing:0}.id-body{padding:.85rem .9rem}}.profile-chip{display:inline-flex;align-items:center;gap:.45rem}.profile-chip-icon{width:1.15rem;height:1.15rem;flex:none;color:var(--text-secondary)}.sim-mark{display:inline-flex;align-items:center;gap:.3rem;font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:.15rem .45rem;border-radius:.25rem;background:color-mix(in srgb,var(--warning) 14%,transparent);color:var(--warning);border:1px solid color-mix(in srgb,var(--warning) 35%,transparent)}.wizard-progress{display:flex;align-items:flex-start;gap:.75rem;margin-bottom:2.5rem}.wizard-steps{list-style:none;margin:0;padding:0;display:flex;flex:1;max-width:28rem}.wizard-step{flex:1;display:flex;flex-direction:column;align-items:center;position:relative;min-width:0}.wizard-step:not(:first-child):before{content:"";position:absolute;top:calc(1rem - 1px);height:2px;left:calc(-50% + 1.4rem);right:calc(50% + 1.4rem);background:var(--border)}.wizard-step.reached:before{background:var(--accent)}.step-circle{width:2rem;height:2rem;border-radius:50%;display:flex;align-items:center;justify-content:center;padding:0;font-family:inherit;font-size:.75rem;font-weight:600;border:2px solid var(--border);color:var(--text-tertiary);background:var(--bg-main);flex-shrink:0;transition:all .2s;cursor:default}.step-circle.completed{background:var(--accent);border-color:var(--accent);color:#fff;cursor:pointer}.step-circle:disabled{cursor:default}.step-circle.current{border-color:var(--accent);color:var(--accent);box-shadow:0 0 0 3px var(--primary-focus-ring)}.step-label-text{margin-top:.4rem;font-size:.65rem;line-height:1.2;text-align:center;color:var(--text-tertiary)}.step-label-text.completed{color:var(--text-secondary)}.step-label-text.current{color:var(--accent);font-weight:600}.wizard-cancel{flex-shrink:0;font-size:.8rem;margin-top:.15rem;margin-left:auto}.alert{padding:.75rem 1rem;border-radius:.5rem;font-size:.875rem;margin-bottom:1rem;color:#fff}.alert-error{background:var(--danger)}.alert-info{background:var(--accent)}.alert-success{background:#1a7f37}.nav-tabs{display:flex;gap:0;border-bottom:1px solid var(--border);margin-bottom:1.5rem}.nav-tab{padding:.75rem 1.25rem;font-size:.9rem;font-weight:500;color:var(--text-tertiary);background:none;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:color .2s;margin-bottom:-1px;font-family:inherit}.nav-tab:hover{color:var(--text-primary)}.nav-tab.active{color:var(--accent);border-bottom-color:var(--accent);font-weight:600}.review-grid{display:grid;grid-template-columns:auto 1fr;gap:.5rem 1rem;font-size:.9rem;margin-bottom:1.5rem}.review-grid dt{font-weight:600;color:var(--text-secondary);padding:.25rem 0}.review-grid dd{color:var(--text-primary);padding:.25rem 0}.gate-content-block{background:var(--bg-main);border:1px solid var(--border);border-radius:.5rem;padding:1rem;font-size:.875rem;margin-bottom:1.5rem}.gate-content-item{margin-bottom:.5rem}.gate-content-item:last-child{margin-bottom:0}.gate-content-label{font-weight:600;color:var(--text-secondary);font-size:.75rem;text-transform:uppercase;letter-spacing:.04em;margin-bottom:.125rem}.gate-content-text{color:var(--text-primary);line-height:1.5}.empty-state{text-align:center;padding:3rem 1.5rem;color:var(--text-tertiary)}.empty-state-icon{font-size:2.5rem;margin-bottom:.75rem;opacity:.5}.empty-state-title{font-size:1rem;font-weight:600;color:var(--text-secondary);margin-bottom:.25rem}.empty-state-text{font-size:.875rem;color:var(--text-tertiary);margin-bottom:1rem;max-width:28rem;margin-left:auto;margin-right:auto}.login-split{margin-top:var(--nav-height);display:flex;min-height:calc(100vh - var(--nav-height))}.login-split-left{flex:1;background:var(--bg-main);display:flex;align-items:center;justify-content:center;padding:4rem 3rem}.login-split-right{flex:1;background:var(--bg-elevated);border-left:1px solid var(--border);display:flex;align-items:center;justify-content:center;padding:4rem 3rem}.login-page{display:flex;align-items:center;justify-content:center;min-height:calc(100vh - var(--nav-height));padding:2rem}.login-card{width:100%;max-width:420px}.login-header{text-align:center;margin-bottom:2rem}.login-title{font-size:1.5rem;font-weight:700;margin-bottom:.5rem}.login-subtitle{font-size:.9rem;color:var(--text-secondary);line-height:1.5}.login-divider{display:flex;align-items:center;gap:.75rem;margin:1.5rem 0;font-size:.8rem;color:var(--text-tertiary)}.login-divider:before,.login-divider:after{content:"";flex:1;height:1px;background:var(--border)}.onboarding-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:2rem;max-width:32rem;margin:0 auto}.onboarding-step{display:flex;gap:1rem;margin-bottom:1.25rem}.onboarding-step:last-child{margin-bottom:0}.onboarding-num{width:1.75rem;height:1.75rem;border-radius:50%;background:var(--accent);color:#fff;display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:700;flex-shrink:0;margin-top:.1rem}.onboarding-num.done{background:var(--accent)}.onboarding-text h4{font-size:.9rem;margin-bottom:.125rem}.onboarding-text p{font-size:.825rem;color:var(--text-secondary);line-height:1.5}.selection-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(14rem,1fr));gap:.75rem;margin-bottom:1.5rem}.selection-card{background:var(--bg-elevated);border:2px solid var(--border);border-radius:.75rem;padding:1.25rem;cursor:pointer;transition:all .15s}.selection-card:hover{border-color:var(--accent);transform:translateY(-1px);box-shadow:0 4px 12px #0000000f}.selection-card.selected{border-color:var(--accent);background:var(--accent-subtle)}.selection-card-title{font-size:1rem;font-weight:600;margin-bottom:.25rem}.selection-card-subtitle{font-size:.8rem;color:var(--text-secondary);margin-bottom:.5rem}.selection-card-id{font-size:.7rem;color:var(--text-tertiary);margin-bottom:.375rem;word-break:break-all}.selection-card-meta{display:flex;gap:.375rem;flex-wrap:wrap}.dashboard-section{margin-bottom:2rem}.section-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.section-title{font-size:1rem;font-weight:600}.section-count{font-size:.8rem;color:var(--text-tertiary)}.ttl-badge{display:inline-flex;align-items:center;gap:.25rem;font-size:.75rem;font-weight:600;padding:.2rem .5rem;border-radius:.25rem;font-family:SF Mono,Monaco,monospace}.ttl-ok{background:var(--accent-subtle);color:var(--accent)}.ttl-warn{background:var(--danger-subtle);color:var(--danger)}.quick-actions{display:grid;grid-template-columns:repeat(auto-fill,minmax(16rem,1fr));gap:.75rem;margin-bottom:2rem}.quick-action-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:1.25rem;cursor:pointer;transition:all .15s;display:flex;align-items:flex-start;gap:.875rem;text-decoration:none;color:inherit}.quick-action-card:hover{border-color:var(--accent);transform:translateY(-1px);box-shadow:0 4px 12px #0000000f;text-decoration:none}.quick-action-icon{width:2.5rem;height:2.5rem;border-radius:.5rem;background:var(--accent-subtle);color:var(--accent);display:flex;align-items:center;justify-content:center;font-size:1.25rem;flex-shrink:0}.quick-action-title{font-size:.9rem;font-weight:600;margin-bottom:.125rem}.quick-action-desc{font-size:.8rem;color:var(--text-secondary)}.pr-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:1.25rem;cursor:pointer;transition:border-color .15s}.pr-card:hover{border-color:var(--accent)}.pr-card+.pr-card{margin-top:.75rem}.pr-card-header{display:flex;align-items:center;gap:.5rem;margin-bottom:.375rem}.pr-card-repo{font-size:.75rem;color:var(--text-tertiary);font-family:SF Mono,Monaco,monospace}.pr-card-title{font-weight:600;font-size:.95rem}.pr-card-footer{display:flex;align-items:center;gap:.75rem;margin-top:.5rem;flex-wrap:wrap}.member-row{display:flex;align-items:center;gap:.75rem;padding:.75rem 0;border-bottom:1px solid var(--border)}.member-row:last-child{border-bottom:none}.member-avatar{width:2rem;height:2rem;border-radius:50%;background:var(--accent-subtle);color:var(--accent);display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:700;flex-shrink:0}.member-info{flex:1}.member-name{font-size:.9rem;font-weight:600}.member-email{font-size:.75rem;color:var(--text-tertiary)}.member-domains{display:flex;gap:.25rem;flex-wrap:wrap}.char-counter{text-align:right;font-size:.75rem;color:var(--text-tertiary);margin-top:.25rem}.invite-input-row{display:flex;gap:.5rem}.invite-input-row .form-input{flex:1}.service-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:1.25rem;display:flex;align-items:center;gap:1rem;transition:border-color .15s}.service-card:hover{border-color:var(--accent)}.service-card+.service-card{margin-top:.75rem}.service-icon{width:2.75rem;height:2.75rem;border-radius:.625rem;display:flex;align-items:center;justify-content:center;font-size:1.25rem;flex-shrink:0}.service-icon-configured{background:var(--success-subtle);color:var(--success)}.service-icon-missing{background:var(--bg-main);color:var(--text-tertiary);border:1px dashed var(--border)}.service-icon-error{background:var(--danger-subtle);color:var(--danger)}.service-info{flex:1}.service-name{font-size:.95rem;font-weight:600;margin-bottom:.125rem}.service-desc{font-size:.8rem;color:var(--text-secondary);margin-bottom:.375rem}.service-status{display:inline-flex;align-items:center;gap:.375rem;font-size:.75rem;font-weight:600}.service-status-dot{width:6px;height:6px;border-radius:50%}.service-status-connected .service-status-dot{background:var(--success)}.service-status-connected{color:var(--success)}.service-status-missing .service-status-dot{background:var(--text-tertiary)}.service-status-missing{color:var(--text-tertiary)}.service-status-error .service-status-dot{background:var(--danger)}.service-status-error{color:var(--danger)}.service-tools{display:flex;gap:.25rem;flex-wrap:wrap;margin-top:.25rem}.service-tool-badge{display:inline-block;padding:.1rem .4rem;font-size:.65rem;font-family:SF Mono,Monaco,monospace;background:var(--bg-main);border:1px solid var(--border);border-radius:.25rem;color:var(--text-tertiary)}.modal-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;z-index:1500;display:flex;align-items:center;justify-content:center}.modal{background:var(--bg-elevated);border-radius:.75rem;width:100%;max-width:32rem;max-height:calc(100vh - 4rem);overflow-y:auto;box-shadow:0 16px 48px #00000026}.modal-header{padding:1.5rem 1.5rem 0;display:flex;justify-content:space-between;align-items:flex-start}.modal-title{font-size:1.125rem;font-weight:700}.modal-close{width:2rem;height:2rem;background:none;border:none;cursor:pointer;color:var(--text-tertiary);font-size:1.25rem;display:flex;align-items:center;justify-content:center;border-radius:.375rem}.modal-close:hover{background:var(--bg-main);color:var(--text-primary)}.modal-body{padding:1.25rem 1.5rem}.modal-footer{padding:0 1.5rem 1.5rem;display:flex;gap:.5rem;justify-content:flex-end}.status-banner{padding:.625rem 1rem;font-size:.8rem;display:flex;align-items:center;gap:.5rem;border-radius:.5rem;margin-bottom:1rem}.status-banner-warn{background:var(--accent-subtle);color:var(--accent-hover);border:1px solid var(--accent)}.status-banner-error{background:var(--danger-subtle);color:var(--danger);border:1px solid var(--danger)}.status-banner-success{background:var(--success-subtle);color:var(--success);border:1px solid var(--success)}.status-banner-icon{font-size:1rem;flex-shrink:0}.status-banner-text{flex:1}.status-banner a{font-weight:600}.vault-progress{display:flex;flex-direction:column;align-items:center;gap:.75rem;padding:1.5rem 0}.vault-spinner{width:2rem;height:2rem;border:3px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.vault-progress-text{font-size:.875rem;color:var(--text-secondary)}.service-health-row{display:flex;align-items:center;gap:.75rem;padding:.625rem 0;border-bottom:1px solid var(--border);font-size:.85rem}.service-health-row:last-child{border-bottom:none}.service-health-indicator{width:8px;height:8px;border-radius:50%;flex-shrink:0}.service-health-indicator.connected{background:var(--success)}.service-health-indicator.missing{background:var(--text-tertiary)}.service-health-indicator.error{background:var(--danger)}.service-health-name{font-weight:600;flex:1}.service-health-detail{font-size:.75rem;color:var(--text-tertiary)}.cred-field{position:relative}.cred-field .form-input{padding-right:3rem}.cred-toggle{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);background:none;border:none;font-size:.75rem;color:var(--text-tertiary);cursor:pointer;padding:.25rem}.cred-toggle:hover{color:var(--accent)}.context-strip{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.5rem;padding:.625rem 1rem;margin-bottom:1.5rem;display:flex;align-items:center;gap:.75rem;font-size:.8rem}.context-strip-label{font-weight:600;color:var(--text-secondary)}.timeline{position:relative;padding-left:2rem}.timeline:before{content:"";position:absolute;left:.5rem;top:0;bottom:0;width:2px;background:var(--border)}.timeline-event{position:relative;margin-bottom:1.5rem}.timeline-event:before{content:"";position:absolute;left:-1.625rem;top:.5rem;width:10px;height:10px;border-radius:50%;background:var(--accent);border:2px solid var(--bg-main)}.timeline-event.expired:before{background:var(--text-tertiary)}.error-message{padding:.75rem 1rem;background:#dc262614;border:1px solid var(--danger);border-radius:.5rem;color:var(--danger);font-size:.875rem;margin-bottom:1rem}.mobile-menu-btn{display:none;width:2.25rem;height:2.25rem;background:none;border:1px solid var(--border);border-radius:.375rem;cursor:pointer;color:var(--text-secondary);font-size:1.1rem;align-items:center;justify-content:center;font-family:inherit}.mobile-menu-btn:hover{color:var(--accent);border-color:var(--accent)}.mobile-menu-backdrop{display:none;position:fixed;top:0;right:0;bottom:0;left:0;background:#0006;z-index:2000}.mobile-menu-panel{display:none;position:fixed;top:0;right:0;bottom:0;width:16rem;background:var(--bg-elevated);border-left:1px solid var(--border);z-index:2001;flex-direction:column;overflow-y:auto}.mobile-menu-header{padding:1.25rem 1rem;border-bottom:1px solid var(--border);display:flex;flex-direction:column;gap:.25rem}.mobile-menu-nav{flex:1;padding:.5rem;display:flex;flex-direction:column}.mobile-menu-item{display:flex;align-items:center;gap:.625rem;padding:.5rem .75rem;margin-bottom:.125rem;border-radius:.375rem;font-size:.85rem;color:var(--text-secondary);text-decoration:none;transition:background .15s,color .15s}.mobile-menu-item:hover{background:var(--accent-subtle);color:var(--text-primary)}.mobile-menu-item.active{background:var(--accent-subtle);color:var(--accent);font-weight:600}.mobile-menu-item .icon{width:1.125rem;text-align:center;font-size:.9rem;flex-shrink:0}.mobile-menu-footer{padding:.75rem 1rem;border-top:1px solid var(--border);display:flex;flex-direction:column;gap:.25rem}.mobile-menu-action{display:flex;align-items:center;gap:.625rem;padding:.5rem .75rem;border-radius:.375rem;font-size:.85rem;color:var(--text-secondary);background:none;border:none;cursor:pointer;font-family:inherit;text-align:left}.mobile-menu-action:hover{background:var(--accent-subtle);color:var(--text-primary)}.mobile-menu-action .icon{width:1.125rem;text-align:center;font-size:.9rem;flex-shrink:0}@media (max-width: 768px){.sidebar{display:none}.main-content{margin-left:0}.quick-actions,.selection-grid{grid-template-columns:1fr}.nav-actions-desktop,.step-label-text{display:none}.mobile-menu-btn{display:flex}.mobile-menu-backdrop{display:block}.mobile-menu-panel{display:flex}.login-split{flex-direction:column;min-height:auto}.login-split-left{padding:3rem 1.5rem;align-items:flex-start}.login-split-right{max-width:none;border-left:none;border-top:1px solid var(--border);padding:2.5rem 1.5rem}}.update-banner{position:fixed;top:var(--nav-height);left:0;right:0;z-index:900;background:#c0392b;color:#fff;border-top:1px solid rgba(0,0,0,.2);border-bottom:1px solid rgba(0,0,0,.2);padding:.6rem 1.25rem;display:flex;flex-direction:column;gap:.6rem}.update-banner-row{display:flex;align-items:center;justify-content:space-between;gap:1rem;min-width:0}.update-banner-cmd-row{flex-wrap:wrap}.update-banner-text{font-size:.9rem;font-weight:600;color:#fff}.update-banner-cmd{display:block;flex:1;min-width:0;font-size:.78rem;padding:.5rem .75rem;word-break:break-all;white-space:pre-wrap;background:#0003;border:1px solid rgba(255,255,255,.65);border-radius:.375rem;font-family:SF Mono,Fira Code,Fira Mono,Menlo,Consolas,monospace;color:#fff;-webkit-user-select:all;user-select:all}.update-banner-hint{margin:0;font-size:.8rem;color:#ffffffe6}.update-banner .btn-secondary{color:#fff;border-color:#ffffffa6;background:transparent}.update-banner .btn-secondary:hover:not(:disabled){background:#ffffff26;color:#fff;border-color:#fff}.update-banner-x{background:transparent;border:none;color:#ffffffd9;cursor:pointer;font-size:1.15rem;line-height:1;padding:0 .25rem}.update-banner-x:hover{color:#fff}.update-banner.is-managed{background:var(--bg-elevated);color:var(--text-primary);border-top:1px solid var(--border);border-bottom:1px solid var(--border)}.update-banner.is-managed .update-banner-text{color:var(--text-primary)}.update-banner.is-managed .update-banner-hint,.update-banner.is-managed .update-banner-x{color:var(--text-muted)}.update-banner.is-managed .update-banner-x:hover{color:var(--text-primary)}.update-banner.is-live{background:var(--success)}.simulation-banner{position:fixed;top:calc(var(--nav-height) + var(--update-banner-h, 0px));left:0;right:0;z-index:899;background:var(--warning);color:#fff;border-top:1px solid rgba(0,0,0,.2);border-bottom:1px solid rgba(0,0,0,.2);padding:.6rem 1.25rem;text-align:center}.simulation-banner-text{font-size:.9rem;font-weight:600}.it-locked-badge{display:inline-flex;align-items:center;gap:.3rem;font-size:.68rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--text-secondary);background:var(--accent-subtle);border:1px solid var(--border);border-radius:999px;padding:.2rem .55rem;white-space:nowrap}.it-locked-badge .lock-icon{font-size:.75rem}body.is-updating .top-nav,body.is-updating .sidebar,body.is-updating .main-content,body.is-updating .update-banner,body.is-updating .simulation-banner{filter:blur(5px);pointer-events:none;-webkit-user-select:none;user-select:none}.update-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:2000;display:flex;align-items:center;justify-content:center;background:#11111159;padding:1rem}.update-overlay-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:1rem;padding:2rem 2.25rem;max-width:460px;width:100%;text-align:center;box-shadow:0 20px 60px #00000040}.update-overlay-card h2{margin:0 0 .6rem;font-size:1.15rem}.update-overlay-card p{margin:0 0 .5rem;font-size:.88rem;color:var(--text-muted);line-height:1.55}.update-spinner{width:2.25rem;height:2.25rem;border:3px solid var(--border);border-top-color:var(--text-primary);border-radius:50%;margin:0 auto 1.1rem;animation:update-spin 1s linear infinite}@keyframes update-spin{to{transform:rotate(360deg)}}.update-cmd-row{display:flex;gap:.5rem;align-items:flex-start;margin:.9rem 0;text-align:left}.update-cmd{flex:1;min-width:0;font-size:.78rem;padding:.6rem .75rem;background:#111;color:#fff;border-radius:.45rem;font-family:SF Mono,Fira Code,Fira Mono,Menlo,Consolas,monospace;word-break:break-all;white-space:pre-wrap}.update-status{font-size:.8rem;color:var(--text-muted);margin:.4rem 0 1.1rem;display:flex;align-items:center;justify-content:center;gap:.4rem}.update-pulse{width:.55rem;height:.55rem;border-radius:50%;background:var(--success);animation:update-pulse 1.2s ease infinite}@keyframes update-pulse{0%,to{opacity:.3}50%{opacity:1}}.update-overlay-actions{display:flex;gap:.6rem;justify-content:center}.search-filter-bar{display:flex;gap:.5rem;margin-bottom:.75rem}.search-input-wrap{flex:1;position:relative}.search-icon{position:absolute;left:.75rem;top:50%;transform:translateY(-50%);color:var(--text-tertiary);font-size:1rem;pointer-events:none}.search-input{padding-left:2.25rem!important;padding-right:2rem!important}.search-clear{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);background:none;border:none;color:var(--text-tertiary);font-size:1.1rem;cursor:pointer;padding:.25rem;line-height:1}.search-clear:hover{color:var(--text-primary)}.filter-panel{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.5rem;padding:1rem;margin-bottom:.75rem;display:flex;flex-direction:column;gap:.75rem}.filter-section{display:flex;align-items:baseline;gap:.75rem}.filter-label{font-size:.75rem;font-weight:600;color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.04em;min-width:5rem;flex-shrink:0}.filter-chips{display:flex;flex-wrap:wrap;gap:.375rem}.filter-chip{font-family:inherit;font-size:.8rem;padding:.3rem .625rem;border-radius:1rem;border:1px solid var(--border);background:var(--bg-main);color:var(--text-secondary);cursor:pointer;transition:all .15s}.filter-chip:hover{border-color:var(--accent);color:var(--text-primary)}.filter-chip.selected{background:var(--accent-subtle);border-color:var(--accent);color:var(--accent);font-weight:600}.active-filters{display:flex;flex-wrap:wrap;align-items:center;gap:.375rem;margin-bottom:.75rem}.active-chip{display:inline-flex;align-items:center;gap:.25rem;font-size:.75rem;padding:.2rem .5rem;border-radius:1rem;background:var(--accent-subtle);color:var(--accent);cursor:pointer;transition:background .15s}.active-chip:hover{background:var(--accent);color:var(--bg-elevated)}.chip-remove{font-size:.85rem;line-height:1}.clear-filters{font-family:inherit;font-size:.75rem;color:var(--text-tertiary);background:none;border:none;cursor:pointer;padding:.2rem 0}.clear-filters:hover{color:var(--text-primary)}.receipt-action{display:inline-block;font-size:.75rem;font-weight:600;padding:.15rem .5rem;border-radius:1rem;background:var(--bg-main);border:1px solid var(--border);color:var(--text-secondary);font-family:SF Mono,Monaco,monospace}.bounds-section,.context-section{background:var(--bg-elevated);border:2px solid var(--edit-border);border-radius:.75rem;padding:1.25rem;margin-bottom:1.25rem;transition:border-color .15s}.bounds-section:hover,.bounds-section:focus-within,.context-section:hover,.context-section:focus-within{border-color:var(--accent-hover)}.bounds-section-header{display:flex;align-items:flex-start;gap:.625rem;margin-bottom:1rem}.bounds-section-icon{font-size:1.1rem;flex-shrink:0;margin-top:.1rem}.bounds-section-title{font-size:.9rem;font-weight:700;color:var(--text-primary)}.bounds-section-subtitle{font-size:.75rem;color:var(--text-tertiary)}.bounds-fields-grid{display:flex;flex-direction:column;gap:.75rem}.bounds-field-row{display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:1rem;width:100%}.bounds-field-label{flex:1;min-width:0}.bounds-field-label .form-label{display:inline;margin-bottom:0}.bounds-field-input{flex-shrink:0;display:flex;flex-direction:column;align-items:flex-end}.bounds-field-input .bounded-input{align-items:flex-end}.bounds-field-input .bounded-input-presets{justify-content:flex-end}.bounds-field-label-inline{display:flex;align-items:center;gap:.375rem;margin-bottom:.375rem}.bounds-field-label-inline .form-label{margin-bottom:0}.field-info-toggle{display:inline-flex;align-items:center;justify-content:center;width:1.125rem;height:1.125rem;border-radius:50%;border:1px solid var(--border);background:var(--bg-main);color:var(--text-tertiary);font-size:.65rem;font-weight:700;cursor:pointer;flex-shrink:0;transition:color .15s,border-color .15s;font-family:inherit;line-height:1;padding:0}.field-info-toggle:hover{color:var(--accent);border-color:var(--accent)}.field-description{margin-top:.25rem;margin-bottom:.25rem}@media (max-width: 768px){.bounds-field-row{flex-direction:column;gap:.375rem}}.bounded-input{display:flex;flex-direction:column;align-items:flex-start;gap:.375rem}.bounded-input-field{display:inline-flex;align-items:stretch;border:1px solid var(--border-field);border-radius:.5rem;overflow:hidden;background:var(--bg-field);color:var(--text-field)}.stepper-btn{display:flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;background:transparent;border:none;cursor:pointer;font-size:1.1rem;font-weight:600;color:var(--text-field);font-family:inherit;flex-shrink:0;transition:background .15s}.stepper-btn:hover:not(:disabled){background:var(--placeholder-field)}.stepper-btn:disabled{opacity:.35;cursor:not-allowed}.stepper-input{width:4.5rem;text-align:center;border:none;border-left:1px solid var(--placeholder-field);border-right:1px solid var(--placeholder-field);padding:.5rem .25rem;font-size:.9rem;font-family:inherit;color:var(--text-field);background:var(--bg-field);outline:none;-moz-appearance:textfield}.stepper-input::-webkit-outer-spin-button,.stepper-input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.stepper-input:focus{box-shadow:inset 0 0 0 2px var(--field-focus-ring)}.bounded-input-unit{display:inline-flex;align-items:center;padding:0 .75rem;font-size:.8rem;color:var(--text-field);opacity:.7;white-space:nowrap;-webkit-user-select:none;user-select:none;background:transparent}.bounded-input-presets{display:flex;flex-wrap:wrap;gap:.25rem}.preset-chip{font-family:inherit;font-size:.75rem;padding:.2rem .625rem;border:1px solid var(--border);border-radius:999px;background:transparent;color:var(--text-secondary);cursor:pointer;transition:background .15s,color .15s,border-color .15s}.preset-chip:hover{background:var(--accent-subtle);color:var(--accent);border-color:var(--accent)}.preset-chip-selected{background:var(--accent);color:var(--bg-main);border-color:var(--accent)}.bounded-input-echo{font-size:.75rem;color:var(--text-secondary);font-style:italic}.field-label-with-tip{display:inline-flex;align-items:center;gap:.375rem;position:relative}.field-tip-trigger{display:inline-flex;align-items:center;justify-content:center;width:1.125rem;height:1.125rem;border-radius:999px;border:1px solid var(--border);background:transparent;color:var(--text-secondary);font-size:.7rem;font-style:italic;font-family:serif;font-weight:600;line-height:1;cursor:help;padding:0}.field-tip-trigger:hover,.field-tip-trigger[aria-expanded=true]{border-color:var(--accent);color:var(--accent)}.field-tip-bubble{position:absolute;top:calc(100% + .375rem);left:0;z-index:10;width:max-content;max-width:22rem;padding:.5rem .75rem;background:var(--bg-elevated);border:1px solid var(--border);border-radius:.375rem;font-size:.8rem;color:var(--text-primary);line-height:1.45;box-shadow:0 4px 12px #00000040;pointer-events:none}.tag-input{display:flex;flex-wrap:wrap;align-items:center;gap:.375rem;padding:.375rem .5rem;background:var(--bg-field);border:1px solid var(--border-field);border-radius:.5rem;cursor:text;min-height:2.5rem;transition:box-shadow .2s,border-color .2s;color:var(--text-field)}.tag-input:focus-within{box-shadow:0 0 0 3px var(--field-focus-ring)}.tag-input-invalid{border-color:var(--danger)}.tag-input-invalid:focus-within{box-shadow:0 0 0 3px #dc26262e}.tag-pill{display:inline-flex;align-items:center;gap:.25rem;font-size:.8rem;padding:.2rem .5rem;border-radius:1rem;background:var(--placeholder-field);color:var(--text-field);font-weight:500;white-space:nowrap}.tag-remove{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;font-size:.9rem;line-height:1;color:var(--text-field);cursor:pointer;padding:0;margin-left:.125rem;opacity:.7;transition:opacity .15s}.tag-remove:hover{opacity:1}.tag-input-field{flex:1;min-width:8rem;border:none;outline:none;background:transparent;font-size:.875rem;font-family:inherit;color:var(--text-field);padding:.2rem 0}.tag-input-field::placeholder{color:var(--placeholder-field);opacity:1}.checkbox-group{display:flex;flex-wrap:wrap;gap:.5rem}.checkbox-pill{display:inline-flex;align-items:center;gap:.35rem;font-size:.85rem;padding:.35rem .75rem;border-radius:1rem;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-secondary);cursor:pointer;transition:all .15s;-webkit-user-select:none;user-select:none}.checkbox-pill input[type=checkbox]{display:none}.checkbox-pill:hover{border-color:var(--accent);color:var(--text-primary)}.checkbox-pill-selected{background:var(--btn-primary-bg);border-color:var(--btn-primary-bg);color:var(--btn-primary-fg);font-weight:500}.checkbox-pill-selected:hover{background:var(--btn-primary-bg-hover);border-color:var(--btn-primary-bg-hover);color:var(--btn-primary-fg)}@keyframes hap-skeleton-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton{display:block;position:relative;border-radius:.375rem;background-color:var(--bg-main);background-image:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.06) 20%,rgba(255,255,255,.16) 50%,rgba(255,255,255,.06) 80%,transparent 100%);background-size:200% 100%;background-repeat:no-repeat;animation:hap-skeleton-shimmer 1.6s ease-in-out infinite;will-change:background-position}[data-theme=light] .skeleton,:root:not([data-theme=dark]) .skeleton{background-image:linear-gradient(90deg,transparent 0%,rgba(0,0,0,.03) 20%,rgba(0,0,0,.08) 50%,rgba(0,0,0,.03) 80%,transparent 100%)}.skeleton-title{height:1.5rem;width:3rem;margin:0 auto}.skeleton-line{height:.75rem;width:100%}.skeleton-line-sm{height:.65rem;width:60%}.skeleton-card{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.5rem;padding:.75rem 1rem;box-shadow:0 1px 2px #0000000a;display:flex;align-items:center;gap:.75rem}.skeleton-dot{width:.5rem;height:.5rem;border-radius:50%;flex-shrink:0}@media (prefers-reduced-motion: reduce){.skeleton{animation:none;background-image:none}}.intent-layout{display:grid;grid-template-columns:minmax(320px,1fr) minmax(420px,1.4fr);gap:1.25rem;align-items:start}.intent-layout.no-chat{grid-template-columns:minmax(0,1fr);max-width:56rem}.intent-ai-hint{margin:.5rem 0 0;font-size:.8rem;color:var(--text-tertiary)}.intent-pane.chat{display:flex;flex-direction:column;gap:.75rem;position:sticky;top:1rem;align-self:start;max-height:calc(100vh - 4rem)}.intent-pane.document{display:flex;flex-direction:column;gap:.875rem}.intent-pane .card-title{font-size:1.25rem;margin:0 0 1rem}.intent-textarea{width:100%;background:var(--bg-field);border:1px solid var(--border-field);border-radius:.5rem;padding:.625rem .75rem;color:var(--text-field);font-size:.9rem;line-height:1.5;resize:vertical;min-height:22rem;outline:none;font-family:inherit;transition:box-shadow .15s}.intent-textarea:focus{box-shadow:0 0 0 3px var(--field-focus-ring)}.intent-textarea::placeholder{color:var(--placeholder-field);opacity:1}.intent-footer{display:flex;align-items:center;gap:.625rem;margin-top:.5rem}.intent-continue-btn{flex:1}.intent-chat{display:flex;flex-direction:column;gap:.75rem;flex:1;min-height:0}.intent-chat .chat-header{font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--text-muted)}.intent-chat .chat-messages{flex:1;overflow-y:auto;position:relative;display:flex;flex-direction:column;gap:1rem;padding:.25rem 0;min-height:14rem;max-height:32rem}.intent-chat .chat-msg{display:flex;max-width:100%}.intent-chat .chat-msg.assistant{justify-content:flex-start}.intent-chat .chat-msg.assistant .chat-msg-body{max-width:100%;color:var(--text-primary);font-size:.9rem;line-height:1.65;white-space:pre-wrap;word-break:break-word}.intent-chat .chat-msg.user{justify-content:flex-end}.intent-chat .chat-msg.user .chat-msg-body{max-width:85%;background:var(--bg-main);border:1px solid var(--border);border-radius:1.125rem;padding:.55rem .875rem;color:var(--text-primary);font-size:.9rem;line-height:1.55;white-space:pre-wrap;word-break:break-word}.intent-chat .chat-msg-prose{white-space:pre-wrap;word-break:break-word}.intent-chat .chat-msg-thinking{color:var(--text-muted);font-style:italic}.intent-chat .chat-fenced-block{display:block;background:var(--bg-elevated);border:1px solid var(--border);border-radius:.5rem;padding:.625rem .75rem;margin:.5rem 0;font-family:SF Mono,Monaco,Cascadia Code,monospace;font-size:.8rem;white-space:pre-wrap;color:var(--text-primary);line-height:1.55}.intent-chat .chat-apply-btn{margin-top:.5rem}.intent-chat .chat-composer{display:flex;flex-direction:column;gap:.375rem}.intent-chat .chat-composer-pill{display:flex;align-items:center;gap:.5rem;background:var(--bg-field);border:1px solid var(--border-field);border-radius:1.5rem;padding:.25rem .25rem .25rem 1rem;transition:box-shadow .15s;color:var(--text-field)}.intent-chat .chat-composer-pill:focus-within{box-shadow:0 0 0 3px var(--field-focus-ring)}.intent-chat .chat-input{flex:1;resize:none;background:transparent;border:none;padding:.5rem 0;color:var(--text-field);font-size:.9rem;line-height:1.4;outline:none;font-family:inherit;max-height:8rem;align-self:stretch}.intent-chat .chat-input::placeholder{color:var(--placeholder-field);opacity:1}.intent-chat .chat-send-btn{flex-shrink:0;width:2rem;height:2rem;border-radius:999px;background:var(--text-field);color:var(--bg-field);border:none;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:1rem;font-weight:700;line-height:1;align-self:center;transition:opacity .15s,transform .1s}.intent-chat .chat-send-btn:hover:not(:disabled){opacity:.85}.intent-chat .chat-send-btn:active:not(:disabled){transform:scale(.95)}.intent-chat .chat-send-btn:disabled{opacity:.35;cursor:not-allowed}.intent-chat .chat-composer-hint{font-size:.72rem;color:var(--text-muted);padding-left:.5rem}.hint-box{display:flex;gap:.625rem;padding:.75rem .875rem;background:var(--bg-main);border:1px solid var(--border);border-left:3px solid var(--accent);border-radius:.5rem;font-size:.85rem;color:var(--text-primary);line-height:1.55;margin-top:.25rem}.hint-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;width:1.125rem;height:1.125rem;border-radius:999px;border:1px solid var(--accent);color:var(--accent);font-size:.7rem;font-style:italic;font-family:serif;font-weight:700;line-height:1;margin-top:.125rem}.hint-body{flex:1;min-width:0}.hint-head{font-weight:600;margin-bottom:.25rem}@media (max-width: 1024px){.intent-layout{grid-template-columns:1fr}.intent-pane.chat{position:static;max-height:none}}@media (max-width: 768px){.intent-layout>.intent-pane.chat{display:none}.floating-help{display:inline-flex}}.floating-help{display:none;align-items:center;gap:.5rem;position:fixed;bottom:1rem;right:1rem;z-index:5;background:var(--btn-primary-bg);color:var(--btn-primary-fg);border:2px solid var(--btn-primary-bg);border-radius:999px;padding:.625rem 1.125rem;font-weight:700;font-size:.85rem;cursor:pointer;font-family:inherit;box-shadow:0 6px 18px var(--primary-glow)}.floating-help:hover{background:var(--btn-primary-bg-hover);border-color:var(--btn-primary-bg-hover)}.bottom-sheet{position:fixed;left:0;right:0;bottom:0;height:88vh;background:var(--bg-elevated);border-top:1px solid var(--border);border-radius:.75rem .75rem 0 0;z-index:11;padding:1rem 1rem 1.25rem;overflow-y:auto;display:flex;flex-direction:column;gap:.75rem;transform:translateY(100%);transition:transform .25s ease-out;box-shadow:0 -8px 32px #0009;outline:none}.bottom-sheet.is-open{transform:translateY(0)}.bottom-sheet-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#0000008c;z-index:10;opacity:0;pointer-events:none;transition:opacity .2s}.bottom-sheet-backdrop.is-open{opacity:1;pointer-events:auto}.bottom-sheet-handle{width:2.5rem;height:.25rem;background:var(--text-muted);border-radius:999px;margin:0 auto .5rem;flex-shrink:0}.bottom-sheet-close{position:absolute;top:.5rem;right:.875rem;background:transparent;border:none;color:var(--text-primary);cursor:pointer;font-size:1.5rem;line-height:1;font-family:inherit}@media (prefers-reduced-motion: reduce){.bottom-sheet,.bottom-sheet-backdrop{transition:none}}.field-editable{background:var(--bg-elevated);border:2px solid var(--edit-border);border-radius:.5rem;padding:.875rem 1rem;margin-bottom:1rem;transition:border-color .15s}.field-editable:hover,.field-editable:focus-within{border-color:var(--accent-hover)}.field-label{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-tertiary);margin-bottom:.5rem;display:flex;align-items:center;gap:.35rem}.field-label .pen{opacity:.7;font-size:.75rem}.info-block{background:var(--bg-main);border-left:3px solid var(--border);border-radius:0 .375rem .375rem 0;padding:.75rem 1rem;margin-bottom:.75rem;font-size:.85rem;color:var(--text-secondary)}.info-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:.4rem}.info-title{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-tertiary)}.info-edit{font-size:.72rem;color:var(--text-tertiary);text-decoration:underline;cursor:pointer;background:none;border:none;font-family:inherit;padding:0}.info-edit:hover{color:var(--accent-hover)}.info-kv{display:grid;grid-template-columns:max-content 1fr;gap:.15rem 1rem;margin:0}.info-kv dt{color:var(--text-tertiary)}.info-kv dd{margin:0;color:var(--text-secondary);word-break:break-word}.info-section-label{margin:1.25rem 0 .5rem;font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text-tertiary)}.intent-pane.chat.tool{background:var(--bg-main);border:1px dashed var(--border)}.recent-blocks .card-header{margin-bottom:.35rem}.recent-blocks .rb-sub{color:var(--text-muted);font-size:.8rem;margin:0 0 1.1rem;line-height:1.45;max-width:36ch}.recent-blocks .rb-count,.attention .rb-count{flex:none;min-width:1.6rem;height:1.6rem;padding:0 .45rem;display:inline-flex;align-items:center;justify-content:center;font-size:.8rem;font-weight:600;font-variant-numeric:tabular-nums;background:color-mix(in srgb,var(--warning) 14%,transparent);color:var(--warning);border:1px solid color-mix(in srgb,var(--warning) 35%,transparent);border-radius:999px}.recent-blocks .rb-rows{display:flex;flex-direction:column}.recent-blocks .rb-row{display:grid;grid-template-columns:auto 1fr auto;gap:.75rem .85rem;align-items:start;padding:.85rem 0;border-top:1px solid var(--border)}.recent-blocks .rb-row:first-child{border-top:none}.recent-blocks .rb-dot{width:.5rem;height:.5rem;border-radius:999px;margin-top:.35rem;background:var(--warning)}.recent-blocks .rb-dot.act{background:var(--danger)}.recent-blocks .rb-dot.info{background:var(--text-muted)}.recent-blocks .rb-body{min-width:0}.recent-blocks .rb-line{font-size:.86rem;line-height:1.4;color:var(--text-primary)}.recent-blocks .rb-line b{font-weight:600}.recent-blocks .rb-meta{display:flex;align-items:center;gap:.5rem;margin-top:.3rem;flex-wrap:wrap}.recent-blocks .rb-chip{font-size:.64rem;letter-spacing:.06em;text-transform:uppercase;font-weight:600;padding:.12rem .44rem;border-radius:.35rem;background:var(--accent-subtle);color:var(--text-muted)}.recent-blocks .rb-chip.warn{background:color-mix(in srgb,var(--warning) 14%,transparent);color:var(--warning)}.recent-blocks .rb-chip.act{background:var(--danger-subtle);color:var(--danger)}.recent-blocks .rb-via{font-size:.72rem;color:var(--text-muted)}.recent-blocks .rb-when{font-size:.74rem;color:var(--text-muted);font-variant-numeric:tabular-nums;white-space:nowrap;text-align:right}.recent-blocks .rb-fix{display:inline-block;margin-top:.4rem;font-size:.76rem;color:var(--text-primary);text-underline-offset:2px}.recent-blocks .rb-foot{margin-top:1rem;padding-top:.9rem;border-top:1px solid var(--border)}.recent-blocks .rb-viewall{font:inherit;font-size:.8rem;color:var(--text-primary);background:none;border:none;padding:0;cursor:pointer;text-decoration:underline;text-underline-offset:3px}.recent-blocks .rb-empty,.all-clear{text-align:center;padding:1.25rem 1rem .25rem}.blocked-header{display:flex;align-items:baseline;justify-content:space-between;gap:1rem}.blocked-today{font-size:.85rem;color:var(--text-muted);white-space:nowrap}.blocked-list{display:flex;flex-direction:column}.blocked-row{display:grid;grid-template-columns:auto 1fr auto;gap:.75rem .85rem;align-items:start;padding:.9rem 0;border-top:1px solid var(--border)}.blocked-row:first-child{border-top:none}.blocked-dot{width:.5rem;height:.5rem;border-radius:999px;margin-top:.4rem;background:var(--danger)}.blocked-dot-cumulative,.blocked-dot-not_authorized{background:var(--warning)}.blocked-dot-simulation{background:var(--text-muted)}.blocked-row-main{min-width:0}.blocked-title{font-weight:600;font-size:.92rem;margin-bottom:.2rem}.blocked-sentence{font-size:.86rem;color:var(--text-primary);line-height:1.4}.blocked-source{font-size:.74rem;color:var(--text-muted);margin-top:.3rem}.blocked-row details{margin-top:.4rem;font-size:.8rem}.blocked-row summary{cursor:pointer;color:var(--text-muted)}.blocked-advice{margin-top:.3rem;color:var(--text-secondary)}.blocked-when{font-size:.74rem;color:var(--text-muted);white-space:nowrap}.attention .card-header{margin-bottom:.5rem}.attention-rows{display:flex;flex-direction:column}.attention-row{display:flex;align-items:center;gap:.75rem;padding:.7rem 0;border-top:1px solid var(--border);text-decoration:none;color:inherit}.attention-row:first-child{border-top:none}.attention-row:hover{background:var(--accent-subtle)}.attention-row:focus-visible{outline:2px solid var(--primary-focus-ring);outline-offset:2px}.attention-dot{width:.5rem;height:.5rem;border-radius:50%;flex-shrink:0}.recent-blocks .rb-mark,.all-clear .rb-mark{width:2.25rem;height:2.25rem;border-radius:999px;background:var(--success-subtle);color:var(--success);display:inline-flex;align-items:center;justify-content:center;margin-bottom:.75rem}.recent-blocks .rb-empty h3,.all-clear h3{font-size:.9rem;margin:0 0 .3rem}.recent-blocks .rb-empty p,.all-clear p{font-size:.8rem;color:var(--text-muted);margin:0 auto;max-width:30ch;line-height:1.45}.sim-paused-summary{display:flex;align-items:flex-start;gap:.6rem;color:var(--text-secondary);background:var(--bg-elevated);border:1px dashed var(--border);border-radius:.625rem;padding:.75rem 1rem;font-size:.82rem;line-height:1.5;margin-bottom:1.5rem}.sim-paused-summary-icon{flex-shrink:0}.sim-paused-summary b{color:var(--text-primary)}.int-group-label{font-size:.7rem;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--text-muted);margin:1.5rem 0 .6rem}.int-group-label:first-child{margin-top:0}.int-paused-group{background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:.85rem 1rem 1rem;margin-bottom:1rem}.int-paused-group>summary{cursor:pointer;font-weight:600;font-size:.85rem;color:var(--text-primary);list-style:none;display:flex;align-items:center;gap:.35rem;-webkit-user-select:none;user-select:none}.int-paused-group>summary::-webkit-details-marker{display:none}.int-paused-group>summary:before{content:"▸";color:var(--text-muted)}.int-paused-group[open]>summary:before{content:"▾"}.int-paused-group-note{color:var(--text-muted);font-size:.78rem;margin:.55rem 0 .2rem;line-height:1.55}.int-paused-group-note code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.76rem}.int-paused-row{display:flex;align-items:center;gap:.7rem;padding:.55rem 0;border-top:1px solid var(--border)}.int-paused-row:first-of-type{border-top:0;margin-top:.3rem}.int-paused-row .int-paused-name{font-weight:500;flex:1;font-size:.85rem;min-width:0}.receipt-head{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap}.receipt-what{font-size:.95rem;font-weight:600;letter-spacing:-.01em;color:var(--text-primary)}.receipt-tag{font-size:.68rem;padding:.12rem .4rem;border-radius:4px;border:1px solid var(--border);color:var(--text-muted);white-space:nowrap}.receipt-tag-bound{color:var(--success);border-color:var(--success)}.receipt-scope{font-size:.82rem;color:var(--text-muted);margin-top:.2rem}.receipt-foot{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap;margin-top:.55rem;padding-top:.55rem;border-top:1px solid var(--border)}.receipt-link{font-size:.78rem;color:var(--text-secondary);text-decoration:none;border-bottom:1px solid var(--border)}.receipt-link:hover{color:var(--accent-hover);border-color:var(--accent-hover)}.receipt-id{font-family:SF Mono,Monaco,monospace;font-size:.7rem;color:var(--text-muted)}.receipt-more{margin-top:.5rem}.receipt-more summary{cursor:pointer;font-size:.75rem;color:var(--text-muted);list-style:none}.receipt-more summary::-webkit-details-marker{display:none}.receipt-more summary:before{content:"▸"}.receipt-more[open] summary:before{content:"▾"}.receipt-kv{font-size:.72rem;color:var(--text-muted);margin-top:.4rem;line-height:1.7;font-family:SF Mono,Monaco,monospace;word-break:break-all}.receipt-rows{display:grid;grid-template-columns:7.5rem 1fr;row-gap:.35rem;column-gap:1rem;font-size:.8rem;margin:.8rem 0 0;padding-top:.7rem;border-top:1px solid var(--border)}.receipt-row-label{color:var(--text-muted);margin:0}.receipt-row-value{margin:0;overflow-wrap:anywhere}.receipt-num{font-variant-numeric:tabular-nums}.receipt-intent{font-style:italic;line-height:1.55}.receipt-absent{color:var(--text-muted)}@media (max-width: 480px){.receipt-rows{grid-template-columns:1fr;row-gap:.15rem}.receipt-row-label{margin-top:.35rem}}.receipt-evidence-link{font-size:.78rem;font-weight:500;color:var(--text-primary);background:none;border:none;border-bottom:1px solid var(--border);padding:0;cursor:pointer;font-family:inherit}.receipt-evidence-link:hover{border-color:var(--text-primary)}.receipt-public{margin-left:auto;font-size:.76rem;color:var(--text-muted)}.receipt-verified{font-size:.76rem;font-weight:500;color:var(--success)}.receipt-tamper{font-size:.76rem;font-weight:600;color:var(--danger)}.page-inner:has(.reports-layout){max-width:none}.reports-bar{display:flex;justify-content:space-between;align-items:flex-start;gap:1rem;flex-wrap:wrap;margin-bottom:1rem}.reports-bar-actions{display:flex;gap:.5rem;align-items:center;flex-shrink:0}.reports-grid{display:grid;grid-template-columns:1fr 320px;gap:1.5rem;align-items:start}.reports-side>*+*{margin-top:.75rem}.reports-row{display:flex;justify-content:space-between;gap:.75rem;padding:.3rem 0;border-bottom:1px solid var(--border);font-size:.85rem}.reports-row:last-child{border-bottom:none}.reports-missing{margin-top:.5rem;padding:.5rem .75rem;background:var(--accent-subtle);border-radius:.5rem;font-size:.8rem;color:var(--text-primary)}.reports-error{margin:.3rem 0;padding:.5rem .75rem;background:var(--danger-subtle);border:1px solid var(--danger);border-radius:.5rem;font-size:.8rem;color:var(--danger)}.reports-note{margin-top:.4rem;font-size:.78rem;color:var(--text-muted)}.reports-checked-values .reports-row{font-size:.78rem}.reports-row-button{width:100%;background:none;border:none;border-bottom:1px solid var(--border);text-align:left;color:inherit;font:inherit;cursor:pointer;border-radius:0;align-items:center}.reports-checked-values .reports-row-button{font-size:.78rem}.reports-row-button:hover,.reports-row-button:focus-visible{text-decoration:underline}.reports-row-button.reports-row-selected{box-shadow:inset 3px 0 0 var(--text-primary);padding-left:.5rem;font-weight:600}.reports-row-bad{color:var(--danger);font-size:.78rem}.reports-detail .reports-case-steps{display:flex;flex-wrap:wrap;gap:.35rem;margin:.25rem 0 .5rem}.reports-legend{margin-bottom:.5rem;padding:.5rem .75rem;background:var(--bg-elevated);border:1px solid var(--border);border-left:4px solid var(--text-muted);border-radius:.5rem;font-size:.8rem;color:var(--text-primary)}.reports-legend{display:flex;flex-wrap:wrap;gap:.25rem 1rem;align-items:center}.reports-legend-chip{display:inline-flex;align-items:center;gap:.4rem}.reports-sw{width:11px;height:11px;border-radius:3px;display:inline-block;flex:none}.reports-sw-v{background:var(--success-subtle);border:2px solid #15803d}.reports-sw-a{border:2px dashed #9a9a9a}.reports-gloss-swatch{color:var(--text-muted);border-bottom:1px dotted var(--text-muted)}.reports-gloss-switch{display:inline-flex;align-items:center;gap:.6rem;margin:0 0 .5rem;font-size:.82rem;font-weight:600;cursor:pointer;-webkit-user-select:none;user-select:none}.reports-gloss-switch input{position:absolute;opacity:0;width:1px;height:1px}.reports-gloss-track{width:34px;height:18px;border-radius:999px;background:var(--border);position:relative;flex:none;transition:background .15s ease}.reports-gloss-thumb{position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:#fff;box-shadow:0 1px 2px #00000040;transition:transform .15s ease}.reports-gloss-switch input:checked+.reports-gloss-track{background:var(--text-primary)}.reports-gloss-switch input:checked+.reports-gloss-track .reports-gloss-thumb{transform:translate(16px)}.reports-gloss-switch input:focus-visible+.reports-gloss-track{outline:2px solid var(--text-primary);outline-offset:2px}.reports-iframe{width:100%;height:70vh;min-height:420px;border:1px solid var(--border);border-radius:.75rem;background:#fff}.reports-summary-chip{display:none}@media (max-width: 480px){.reports-grid{grid-template-columns:1fr}.reports-summary-chip{display:flex;justify-content:space-between;align-items:center;gap:.75rem;background:var(--bg-elevated);border:1px solid var(--border);border-radius:.75rem;padding:.5rem .75rem;font-size:.8rem;margin-bottom:.75rem}.reports-side{display:none}.reports-side.reports-side-open{display:block}}.mcp-endpoint{font-family:SF Mono,Monaco,monospace;font-size:.85rem;padding:.5rem .75rem;background:var(--bg-elevated);border:1px solid var(--border);border-radius:.375rem;margin-bottom:.75rem;word-break:break-all}.mcp-tabs{display:flex;gap:.25rem;margin-bottom:.75rem;flex-wrap:wrap}.mcp-tab{padding:.375rem .75rem;font-size:.75rem;font-weight:500;font-family:inherit;background:transparent;color:var(--text-secondary);border:1px solid var(--border);border-radius:.375rem;cursor:pointer}.mcp-tab.active{font-weight:600;background:var(--accent-subtle);color:var(--accent);border-color:var(--accent)}.mcp-snippet{font-family:SF Mono,Monaco,monospace;font-size:.78rem;line-height:1.6;padding:.75rem;background:var(--bg-elevated);border:1px solid var(--border);border-radius:.375rem;overflow:auto;white-space:pre-wrap;margin:0 0 .75rem}.setup-card{border:2px solid var(--accent);border-radius:.75rem;padding:1.5rem 1.75rem}.setup-intro{font-size:.88rem;color:var(--text-secondary);line-height:1.6;max-width:40rem;margin-bottom:1.5rem}.flow-step{border-top:1px solid var(--border);padding:1.125rem 0}.flow-step:first-of-type{border-top:none;padding-top:0}.flow-step-head{display:flex;align-items:flex-start;gap:.75rem}.flow-step-marker{width:1.625rem;height:1.625rem;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.75rem;font-weight:700;flex-shrink:0;margin-top:.05rem}.flow-step-marker.flow-open{border:2px solid var(--accent);color:var(--accent);background:var(--bg-main)}.flow-step-marker.flow-todo{border:2px solid var(--border);color:var(--text-tertiary);background:var(--bg-main)}.flow-step-marker.flow-done{background:var(--success);color:#fff;border:2px solid var(--success);font-size:.85rem}.flow-step-title{font-size:.95rem;font-weight:700;color:var(--text-primary);margin-top:.1rem}.flow-step-title.flow-todo-title{font-weight:500;color:var(--text-tertiary)}.flow-step-open-btn{background:none;border:0;padding:0;font:inherit;text-align:left;cursor:pointer}.flow-step-open-btn:hover{color:var(--text-primary);text-decoration:underline;text-underline-offset:3px}.flow-step-title.flow-done-title{font-weight:500;color:var(--text-secondary)}.flow-step-title.flow-done-title a{color:var(--text-secondary)}.flow-step-title.flow-done-title a:hover{color:var(--accent)}.flow-step-body{margin:.875rem 0 0 2.375rem;max-width:36rem}.flow-step-body p{font-size:.85rem;color:var(--text-secondary);line-height:1.6;margin-bottom:.75rem}.flow-step-body p:last-child{margin-bottom:0}.bound-list{list-style:none;margin:0 0 .875rem;padding:0;display:flex;flex-direction:column;gap:.375rem}.bound-list li{font-size:.83rem;color:var(--text-secondary);padding-left:1.1rem;position:relative;line-height:1.5}.bound-list li:before{content:"–";position:absolute;left:0;color:var(--text-muted)}.cta-helper{font-size:.76rem;color:var(--text-tertiary);margin-top:.5rem}.managed-note{font-size:.78rem;color:var(--text-tertiary);margin-top:.75rem}.quote-box{display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}.quote-text{font-size:.95rem;font-weight:600;font-style:italic;color:var(--text-primary)}@media (max-width: 768px){.setup-card{padding:1.25rem}.flow-step-body{margin-left:0;margin-top:.75rem}.quote-box{flex-direction:column;align-items:stretch}}.human-only-note{margin:.75rem 0 1rem;padding:.6rem .8rem;border-left:3px solid var(--warning);background:var(--bg-elevated);font-size:.85rem;line-height:1.45;color:var(--text-secondary)}.human-only-note strong{color:var(--text-primary)}.approval-headline{font-size:1.05rem;font-weight:600;color:var(--text-primary);margin-bottom:.6rem}.preview-box{background:var(--bg-main);border:1px solid var(--border);border-left:3px solid var(--accent);border-radius:.5rem;padding:.75rem .875rem;margin-bottom:.75rem;font-size:.85rem}.preview-box h4{font-size:.72rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-tertiary);margin-bottom:.3rem}.preview-box-loading{color:var(--text-tertiary);font-size:.82rem}.preview-box-unavailable,.preview-box-not_found{border-left-color:var(--text-muted)}.preview-box-stale{border-left-color:var(--danger);background:var(--danger-subtle)}.preview-note{font-size:.78rem;color:var(--text-tertiary);margin-top:.4rem;line-height:1.45}.preview-stale{margin-top:.6rem;padding-top:.6rem;border-top:1px solid var(--border)}.preview-stale h5{font-size:.85rem;font-weight:600;margin-bottom:.3rem}.limit-checks{background:var(--bg-main);border:1px solid var(--border);border-radius:.5rem;padding:.75rem .875rem;margin-bottom:.75rem}.limit-checks h4{font-size:.72rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-tertiary);margin-bottom:.35rem}.limit-check-list{list-style:none;margin:0;padding:0;font-size:.85rem;display:flex;flex-direction:column;gap:.2rem}.limit-check-list li{display:flex;gap:.45rem}.limit-check-icon{font-weight:700;flex-shrink:0}.limit-check-list li.ok .limit-check-icon{color:var(--success)}.limit-check-list li.bad .limit-check-icon{color:var(--danger)}.outcome-box{border:1px solid var(--danger);background:var(--danger-subtle);border-radius:.5rem;padding:.75rem .875rem;margin:.5rem 0 .75rem}.outcome-box h4{font-size:.85rem;font-weight:600;color:var(--text-primary);margin-bottom:.3rem}.outcome-note{font-size:.83rem;color:var(--text-secondary);line-height:1.45;margin:0}.mandate-intent{margin-bottom:.75rem;font-size:.85rem}.mandate-intent dl{display:grid;grid-template-columns:max-content 1fr;gap:.35rem .75rem;margin:0 0 .5rem}.mandate-intent dt{color:var(--text-tertiary);white-space:nowrap;align-self:start}.mandate-intent dd{margin:0}.src-tag{font-size:.65rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;border-radius:.25rem;padding:.05rem .3rem;margin-left:.35rem}.src-tag-local{color:var(--text-muted);border:1px solid var(--border)}.src-tag-sealed{color:var(--success);border:1px solid var(--success)}.intent-text{font-style:italic;color:var(--text-secondary);margin:0}.intent-text.intent-clamped{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.intent-toggle{margin-top:.3rem}.ticket-done-box{background:var(--bg-elevated);border:1px solid var(--success);border-radius:.5rem;padding:.75rem .875rem;margin-bottom:.75rem;font-size:.85rem}.ticket-done-box h4{font-size:.72rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-tertiary);margin-bottom:.3rem}.ticket-done-loading{border-color:var(--border);color:var(--text-tertiary);font-size:.82rem}.ticket-done-off-device,.ticket-done-box[data-bound=none]{border-color:var(--border);background:var(--bg-main)}.ticket-done-mismatch{border-color:var(--danger);background:var(--danger-subtle)}.ticket-done-unchecked{border-color:var(--border);background:var(--bg-main)}.ticket-done-note{font-size:.78rem;color:var(--text-tertiary);margin:.4rem 0 0;line-height:1.45}.ticket-done-note-ok{color:var(--success)}.ticket-done-note-bad{color:var(--danger);font-weight:600}.ticket-done-note-neutral{color:var(--text-tertiary)}.ticket-done-fields{display:grid;grid-template-columns:max-content 1fr;gap:.3rem .75rem;margin:.4rem 0 0}.ticket-done-field-row{display:contents}.ticket-done-field-row dt{color:var(--text-tertiary);white-space:nowrap;align-self:start}.ticket-done-field-row dd{margin:0;word-break:break-word}
|