@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.
@@ -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: { team: "team", profile: "profile", limits: "limits", scope: "scope", intent: "intent", mode: "mode", duration_hours: "duration_hours", title: "title" } }
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 rawTeam = typeof args.team === "string" ? args.team.trim() : "";
8255
- const workspace = rawTeam && rawTeam.toLowerCase() !== "personal" ? rawTeam : "Personal";
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}