vibefortress 0.1.52 → 0.1.55

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.
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "name": "vibefortress",
3
- "version": "0.1.52"
3
+ "version": "0.1.55"
4
4
  }
@@ -1,7 +1,7 @@
1
1
  43acc2492adebae8e98d838a0f0b4b6e8e1d12073385b67306c123287a6051ad THIRD_PARTY_LICENSES.txt
2
- f1f23262dcf2fe49120dcc50d8d5c228d3c4ccd34976931c06bb9b1ec1ad44d2 cli.js
3
- b5647dd61e739195912a5132d55b671dba78e1a100de72af11951ba8a0983306 hook.js
4
- 501dc52451ad036d7345b1cdf152b0e9ab6ecaaee718b13459983356f97ce43f panel.html
5
- cb454e01aa8690db6a4589c97d9d683b866d93fae4163b516951ae1cc27774a8 rules/vibefort.yaml
2
+ 8fefe91c2fb2db29ca083c2cc39cc79b1965699000f321f048166967c1d2866e cli.js
3
+ a62646a0b7b6e6888a60ac6694a01a9140ffe3130698c58f90daa70a29ec79dd hook.js
4
+ 1139bc695cb606040ae3dca7d63fe4087de593c36a1c8a4683ec3b461b8cbbbb panel.html
5
+ cb454e01aa8690db6a4589c97d9d683b866d93fae4163b516951ae1cc27774a8 rules/vibefortress.yaml
6
6
  86821fb93d339d54a9a5a1488128ec2bb313d04ec0213a6b88a58f9d6e94068c scanners.lock.json
7
- 9d9301fe27919ce338c60d78568155888f305da98fa04b1e45ddb350426b36c6 server.js
7
+ 25054b27dfa93de39332fa5ea096367191745928fa6e8dee5dd7ab6c64b27eda server.js
package/dist/cli.js CHANGED
@@ -519,8 +519,8 @@ async function main(argv) {
519
519
  console.error("vibefortress: server.js is missing from this install.");
520
520
  return 1;
521
521
  }
522
- process.env.VIBEFORT_ENTRY = cmd;
523
- process.env.VIBEFORT_COLLECT_ARGS = JSON.stringify(rest);
522
+ process.env.VIBEFORTRESS_ENTRY = cmd;
523
+ process.env.VIBEFORTRESS_COLLECT_ARGS = JSON.stringify(rest);
524
524
  await import(pathToFileURL(entry).href);
525
525
  return -1;
526
526
  }
package/dist/hook.js CHANGED
@@ -20255,7 +20255,11 @@ var stateSchema = external_exports.object({
20255
20255
  });
20256
20256
 
20257
20257
  // src/local/state.ts
20258
- var home = () => process.env.VIBEFORT_HOME || process.env.CLAUDE_PLUGIN_DATA || join(homedir(), ".vibefort");
20258
+ var home = () => {
20259
+ const set2 = process.env.VIBEFORTRESS_HOME || process.env.CLAUDE_PLUGIN_DATA;
20260
+ if (set2) return set2;
20261
+ return join(homedir(), ".vibefortress");
20262
+ };
20259
20263
  function projectRoot(projectPath) {
20260
20264
  const abs = resolve(projectPath);
20261
20265
  let real = abs;
@@ -20531,7 +20535,7 @@ var msg = {
20531
20535
  nodeMissing: () => "Vibe Fortress needs Node 20 or newer to scan. Install it from nodejs.org, then restart Claude Code."
20532
20536
  };
20533
20537
  var context = {
20534
- offer: () => "Vibe Fortress already showed the user a one-sentence offer for a quick security check (this project, another folder, or a GitHub repo). If the local_offer tool is available, call it once to show the offer card (buttons Yes / No thanks / Remind me later) and do not ask the same question again in text. If they say yes or name the current project, call the local_scan tool with the project folder as path; for another folder, ask for its path; for a GitHub repo, say you will download a copy into ~/vibefort-work (outside their projects), run `gh repo clone OWNER/NAME ~/vibefort-work/NAME` only after they confirm, then scan that folder. Nothing here needs a login. Present the results with the vibefort skill. If they say no or not now, call local_nudges with action dismiss and type first_run_offer.",
20538
+ offer: () => "Vibe Fortress already showed the user a one-sentence offer for a quick security check (this project, another folder, or a GitHub repo). If the local_offer tool is available, call it once to show the offer card (buttons Yes / No thanks / Remind me later) and do not ask the same question again in text. If they say yes or name the current project, call the local_scan tool with the project folder as path; for another folder, ask for its path; for a GitHub repo, say you will download a copy into ~/vibefortress-work (outside their projects), run `gh repo clone OWNER/NAME ~/vibefortress-work/NAME` only after they confirm, then scan that folder. Nothing here needs a login. Present the results with the vibefortress skill. If they say no or not now, call local_nudges with action dismiss and type first_run_offer.",
20535
20539
  postCommit: (refs) => `Vibe Fortress already showed the user a short notice about new findings (${refs.join(", ")}) in the files just committed. Do not repeat it. If the user says yes, use the vibefortress-fixer agent for those refs. If they say not now, call local_nudges with action dismiss and type post_commit_finding.`,
20536
20540
  liveSecret: (refs) => `Vibe Fortress already warned the user that this push would publish a secret that looks live (${refs.join(", ")}). Do not repeat it and do not stop the push yourself. If asked, explain that the key must be rotated first.`
20537
20541
  };
@@ -20655,7 +20659,7 @@ async function repoVisibility(root, remote, d = {}) {
20655
20659
  } catch {
20656
20660
  }
20657
20661
  try {
20658
- const res2 = await (d.fetch ?? fetch)(`https://api.github.com/repos/${gr.owner}/${gr.repo}`, { headers: { accept: "application/vnd.github+json", "user-agent": "vibefort" }, signal: AbortSignal.timeout(2e3) });
20662
+ const res2 = await (d.fetch ?? fetch)(`https://api.github.com/repos/${gr.owner}/${gr.repo}`, { headers: { accept: "application/vnd.github+json", "user-agent": "vibefortress" }, signal: AbortSignal.timeout(2e3) });
20659
20663
  if (res2.ok && (await res2.json()).private === false) return "public";
20660
20664
  } catch {
20661
20665
  }
@@ -21050,7 +21054,7 @@ import { fileURLToPath } from "node:url";
21050
21054
  var here = dirname(fileURLToPath(import.meta.url));
21051
21055
  function assetPath(name) {
21052
21056
  const candidates = [
21053
- process.env.VIBEFORT_ASSETS_DIR ? join6(process.env.VIBEFORT_ASSETS_DIR, name) : "",
21057
+ process.env.VIBEFORTRESS_ASSETS_DIR ? join6(process.env.VIBEFORTRESS_ASSETS_DIR, name) : "",
21054
21058
  join6(here, name),
21055
21059
  join6(here, "..", "..", name)
21056
21060
  ].filter(Boolean);
@@ -21925,13 +21929,13 @@ var entryTrust = () => entry ? trustNow(entry) : null;
21925
21929
  function scanGate(env2 = process.env) {
21926
21930
  const t = entryTrust();
21927
21931
  if (!t || t.status !== "tampered") return null;
21928
- if (env2.VIBEFORT_ALLOW_UNVERIFIED === "1") return null;
21932
+ if (env2.VIBEFORTRESS_ALLOW_UNVERIFIED === "1") return null;
21929
21933
  return `${t.message} To fix this, remove the Vibe Fortress plugin and install it again from the marketplace. Your work is not affected; nothing was scanned.`;
21930
21934
  }
21931
21935
  function trustWarning(env2 = process.env) {
21932
21936
  const t = entryTrust();
21933
21937
  if (!t || t.status === "verified" || t.status === "unsigned") return null;
21934
- if (t.status === "tampered" && env2.VIBEFORT_ALLOW_UNVERIFIED === "1") return `Warning: ${t.message} (continuing because VIBEFORT_ALLOW_UNVERIFIED=1).`;
21938
+ if (t.status === "tampered" && env2.VIBEFORTRESS_ALLOW_UNVERIFIED === "1") return `Warning: ${t.message} (continuing because VIBEFORTRESS_ALLOW_UNVERIFIED=1).`;
21935
21939
  return t.message;
21936
21940
  }
21937
21941
  function appliedEffects(home2, now, keys = publicKeys()) {
@@ -22226,7 +22230,7 @@ async function criticalSecretsInRange(dir2, range, opts = {}) {
22226
22230
  import { resolve as resolve4, isAbsolute as isAbsolute2 } from "node:path";
22227
22231
  import { execFileSync as execFileSync5 } from "node:child_process";
22228
22232
  var hookDeps = {};
22229
- var NUDGE_BUDGET_MS = Number(process.env.VIBEFORT_HOOK_BUDGET_MS) || 4e3;
22233
+ var NUDGE_BUDGET_MS = Number(process.env.VIBEFORTRESS_HOOK_BUDGET_MS) || 4e3;
22230
22234
  var notice = (project, text) => takeSkipNotice(project) ? { systemMessage: text } : null;
22231
22235
  function resolveDir(cwd, dir2) {
22232
22236
  return !dir2 ? cwd : isAbsolute2(dir2) ? dir2 : resolve4(cwd, dir2);
@@ -22324,13 +22328,13 @@ async function runHook(name, raw) {
22324
22328
  for (const k of Object.keys(out)) if (!ALLOWED.has(k)) delete out[k];
22325
22329
  return Object.keys(out).length ? JSON.stringify(out) : "";
22326
22330
  } catch (e) {
22327
- if (process.env.VIBEFORT_DEBUG) console.error(`vibefort hook ${name}: ${e.message}`);
22331
+ if (process.env.VIBEFORTRESS_DEBUG) console.error(`vibefortress hook ${name}: ${e.message}`);
22328
22332
  return "";
22329
22333
  }
22330
22334
  }
22331
22335
  if (process.argv[1] && /hook\.(?:ts|js)$/.test(process.argv[1])) {
22332
22336
  const name = process.argv[2] ?? "";
22333
- const hard = setTimeout(() => process.exit(0), Number(process.env.VIBEFORT_HOOK_HARD_MS) || 9e3);
22337
+ const hard = setTimeout(() => process.exit(0), Number(process.env.VIBEFORTRESS_HOOK_HARD_MS) || 9e3);
22334
22338
  let raw = "";
22335
22339
  try {
22336
22340
  const dir2 = bundleDirOf(import.meta.url);
package/dist/panel.html CHANGED
@@ -112,7 +112,7 @@ Boolean requesting whether a visible border and background is provided by the ho
112
112
  - omitted: host decides border`)}),z({method:W(`ui/request-display-mode`),params:z({mode:Dg.describe(`The display mode being requested.`)})});var Wg=z({mode:Dg.describe(`The display mode that was actually set. May differ from requested if not supported.`)}).passthrough(),Gg=V([W(`model`),W(`app`)]).describe(`Tool visibility scope - who can access the tool.`);z({resourceUri:P().optional(),visibility:R(Gg).optional().describe(`Who can access this tool. Default: ["model", "app"]
113
113
  - "model": Tool visible to and callable by the agent
114
114
  - "app": Tool callable by the app from this server only`),csp:yl().optional(),permissions:yl().optional()}),z({mimeTypes:R(P()).optional().describe('Array of supported MIME types for UI resources.\nMust include `"text/html;profile=mcp-app"` for MCP Apps support.')}),z({method:W(`ui/download-file`),params:z({contents:R(V([Hd,Ud])).describe(`Resource contents to download — embedded (inline data) or linked (host fetches). Uses standard MCP resource types.`)})}),z({method:W(`ui/message`),params:z({role:W(`user`).describe(`Message role, currently only "user" is supported.`),content:R(Wd).describe(`Message content blocks (text, image, etc.).`)})}),z({method:W(`ui/notifications/sandbox-resource-ready`),params:z({html:P().describe(`HTML content to load into the inner iframe.`),sandbox:P().optional().describe(`Optional override for the inner iframe's sandbox attribute.`),csp:Mg.optional().describe(`CSP configuration from resource metadata.`),permissions:Ng.optional().describe(`Sandbox permissions from resource metadata.`)})});var Kg=z({method:W(`ui/notifications/tool-result`),params:$d.describe(`Standard MCP tool execution result.`)}),qg=z({toolInfo:z({id:Ou.optional().describe(`JSON-RPC id of the tools/call request.`),tool:Xd.describe(`Tool definition including name, inputSchema, etc.`)}).optional().describe(`Metadata of the tool call that instantiated this App.`),theme:Eg.optional().describe(`Current color theme preference.`),styles:Rg.optional().describe(`Style configuration for theming the app.`),displayMode:Dg.optional().describe(`How the UI is currently displayed.`),availableDisplayModes:R(Dg).optional().describe(`Display modes the host supports.`),containerDimensions:V([z({height:F().describe(`Fixed container height in pixels.`)}),z({maxHeight:V([F(),fl()]).optional().describe(`Maximum container height in pixels.`)})]).and(V([z({width:F().describe(`Fixed container width in pixels.`)}),z({maxWidth:V([F(),fl()]).optional().describe(`Maximum container width in pixels.`)})])).optional().describe(`Container dimensions. Represents the dimensions of the iframe or other
115
- container holding the app. Specify either width or maxWidth, and either height or maxHeight.`),locale:P().optional().describe(`User's language and region preference in BCP 47 format.`),timeZone:P().optional().describe(`User's timezone in IANA format.`),userAgent:P().optional().describe(`Host application identifier.`),platform:V([W(`web`),W(`desktop`),W(`mobile`)]).optional().describe(`Platform type for responsive design decisions.`),deviceCapabilities:z({touch:I().optional().describe(`Whether the device supports touch input.`),hover:I().optional().describe(`Whether the device supports hover interactions.`)}).optional().describe(`Device input capabilities.`),safeAreaInsets:z({top:F().describe(`Top safe area inset in pixels.`),right:F().describe(`Right safe area inset in pixels.`),bottom:F().describe(`Bottom safe area inset in pixels.`),left:F().describe(`Left safe area inset in pixels.`)}).optional().describe(`Mobile safe area boundaries in pixels.`)}).passthrough(),Jg=z({method:W(`ui/notifications/host-context-changed`),params:qg.describe(`Partial context update containing only changed fields.`)});z({method:W(`ui/update-model-context`),params:z({content:R(Wd).optional().describe(`Context content blocks (text, image, etc.).`),structuredContent:H(P(),L().describe(`Structured content for machine-readable context data.`)).optional().describe(`Structured content for machine-readable context data.`)})}),z({method:W(`ui/initialize`),params:z({appInfo:Vu.describe(`App identification (name and version).`),appCapabilities:Ug.describe(`Features and capabilities this app provides.`),protocolVersion:P().describe(`Protocol version this app supports.`)})});var Yg=z({protocolVersion:P().describe(`Negotiated protocol version string (e.g., "2025-11-21").`),hostInfo:Vu.describe(`Host application identification and version.`),hostCapabilities:Hg.describe(`Features and capabilities provided by the host.`),hostContext:qg.describe(`Rich context about the host environment.`)}).passthrough(),Xg={target:`draft-2020-12`};async function Zg(e,t){let n=e[`~standard`];if(n.jsonSchema)return n.jsonSchema[t](Xg);throw Error(`Schema (vendor: ${n.vendor}) does not implement Standard JSON Schema (~standard.jsonSchema). Use a library that does (zod v4, ArkType, Valibot) or wrap your schema accordingly.`)}async function Qg(e,t,n=``){let r=await e[`~standard`].validate(t);if(r.issues){let e=r.issues.map(e=>{let t=e.path?.map(e=>typeof e==`object`?e.key:e).join(`.`);return t?`${t}: ${e.message}`:e.message}).join(`; `);throw Error(n+e)}return r.value}function $g(e,t){let n={...e,...t};return t.experimental!==void 0&&(n.experimental={...e.experimental,...t.experimental}),t.tools!==void 0&&(n.tools={...e.tools,...t.tools}),n}var e_=class e extends eg{_appInfo;_appCapabilities;options;_hostCapabilities;_hostInfo;_hostContext;_registeredTools={};_initializedSent=!1;_registeredEvents=new Set;_events=new yg;_methods=new bg;setRequestHandler=(...e)=>{let[t,...n]=Sg(`request`,e)??e;this._methods.claim(t,`setRequestHandler`),super.setRequestHandler.call(this,t,...n)};setNotificationHandler=(...e)=>{let[t,...n]=Sg(`notification`,e)??e;this._methods.claim(t,`setNotificationHandler`),super.setNotificationHandler.call(this,t,...n)};removeRequestHandler=e=>{this._methods.release(e),super.removeRequestHandler(e)};removeNotificationHandler=e=>{this._methods.release(e),super.removeNotificationHandler(e)};replaceRequestHandler=(e,...t)=>{this._methods.replace(e),super.setRequestHandler.call(this,e,...t)};_assertInitialized(e){if(this._initializedSent)return;let t=`[ext-apps] App.${e}() called before connect() completed the ui/initialize handshake. Await app.connect() before calling this method, or move data loading to an ontoolresult handler.`;if(this.options?.strict)throw Error(t);console.warn(`${t}. This will throw in a future release.`)}eventSchemas={toolinput:Pg,toolinputpartial:Fg,toolresult:Kg,toolcancelled:Ig,hostcontextchanged:Jg};static ONE_SHOT_EVENTS=new Set([`toolinput`,`toolinputpartial`,`toolresult`,`toolcancelled`]);_everHadListener=new Set;_assertHandlerTiming(t){if(!e.ONE_SHOT_EVENTS.has(t)||this._everHadListener.has(t)||(this._everHadListener.add(t),!this._initializedSent))return;let n=`[ext-apps] "${String(t)}" handler registered after connect() completed the ui/initialize handshake. The host may have already sent this notification. Register handlers before calling app.connect().`;if(this.options?.strict)throw Error(n);console.warn(n)}setEventHandler(e,t){t&&this._assertHandlerTiming(e),this._ensureEventSlot(e),this._events.setHandler(e,t)}addEventListener(e,t){this._assertHandlerTiming(e),this._ensureEventSlot(e),this._events.addEventListener(e,t)}removeEventListener(e,t){this._events.removeEventListener(e,t)}_ensureEventSlot(e){if(this._registeredEvents.has(e))return;let t=this.eventSchemas[e];if(!t)throw Error(`Unknown event: ${String(e)}`);this.setNotificationHandler(t.shape.method.value,{params:t.shape.params},t=>{let n=t;e===`hostcontextchanged`&&(this._hostContext={...this._hostContext,...n}),this._events.dispatch(e,n)}),this._registeredEvents.add(e)}getEventHandler(e){return this._events.getHandler(e)}warnIfRequestHandlerReplaced(e,t,n){t&&n&&console.warn(`[MCP Apps] ${e} handler replaced. Previous handler will no longer be called.`)}constructor(e,t={},n={autoResize:!0}){super(n),this._appInfo=e,this._appCapabilities=t,this.options=n,this._methods.replace(`notifications/cancelled`),this._methods.replace(`notifications/progress`),n.allowUnsafeEval||nn({jitless:!0}),this.replaceRequestHandler(`ping`,e=>(console.log(`Received ping:`,e.params),{})),this.setEventHandler(`hostcontextchanged`,void 0)}buildContext(e){return e}registerAppCapabilities(e){if(this.transport)throw Error(`Cannot register capabilities after transport is established`);this._appCapabilities=$g(this._appCapabilities,e)}registerTool(e,t,n){if(this._registeredTools[e])throw Error(`Tool ${e} is already registered`);let r=this,i=()=>{r._initializedSent&&r._appCapabilities.tools?.listChanged&&r.sendToolListChanged()},a=t.inputSchema!==void 0,o={title:t.title,description:t.description,inputSchema:t.inputSchema,outputSchema:t.outputSchema,annotations:t.annotations,_meta:t._meta,enabled:!0,enable(){this.enabled=!0,i()},disable(){this.enabled=!1,i()},update(e){Object.assign(this,e),i()},remove(){r._registeredTools[e]===o&&(delete r._registeredTools[e],i())},handler:async(t,r)=>{if(!o.enabled)throw Error(`Tool ${e} is disabled`);let i;if(a){let a=o.inputSchema;i=await n(a?await Qg(a,t??{},`Invalid input for tool ${e}: `):t??{},r)}else i=await n(r);return o.outputSchema&&!i.isError&&(i.structuredContent=await Qg(o.outputSchema,i.structuredContent,`Invalid output for tool ${e}: `)),i}};return this._registeredTools[e]=o,!this._appCapabilities.tools&&!this.transport&&this.registerAppCapabilities({tools:{listChanged:!0}}),this.ensureToolHandlersInitialized(),i(),o}_toolHandlersInitialized=!1;ensureToolHandlersInitialized(){this._toolHandlersInitialized||(this._toolHandlersInitialized=!0,this.oncalltool=async(e,t)=>{let n=this._registeredTools[e.name];if(!n)throw Error(`Tool ${e.name} not found`);return n.handler(e.arguments,t)},this.onlisttools=async(e,t)=>({tools:await Promise.all(Object.entries(this._registeredTools).filter(([e,t])=>t.enabled).map(async([e,t])=>{let n={name:e,title:t.title,description:t.description,inputSchema:t.inputSchema?await Zg(t.inputSchema,`input`):{type:`object`,properties:{}}};return t.outputSchema&&(n.outputSchema=await Zg(t.outputSchema,`output`)),t.annotations&&(n.annotations=t.annotations),t._meta&&(n._meta=t._meta),n}))}))}async sendToolListChanged(e={}){this._assertInitialized(`sendToolListChanged`),await this.notification({method:`notifications/tools/list_changed`,params:e})}getHostCapabilities(){return this._hostCapabilities}getHostVersion(){return this._hostInfo}getHostContext(){return this._hostContext}get ontoolinput(){return this.getEventHandler(`toolinput`)}set ontoolinput(e){this.setEventHandler(`toolinput`,e)}get ontoolinputpartial(){return this.getEventHandler(`toolinputpartial`)}set ontoolinputpartial(e){this.setEventHandler(`toolinputpartial`,e)}get ontoolresult(){return this.getEventHandler(`toolresult`)}set ontoolresult(e){this.setEventHandler(`toolresult`,e)}get ontoolcancelled(){return this.getEventHandler(`toolcancelled`)}set ontoolcancelled(e){this.setEventHandler(`toolcancelled`,e)}get onhostcontextchanged(){return this.getEventHandler(`hostcontextchanged`)}set onhostcontextchanged(e){this.setEventHandler(`hostcontextchanged`,e)}_onteardown;get onteardown(){return this._onteardown}set onteardown(e){this.warnIfRequestHandlerReplaced(`onteardown`,this._onteardown,e),this._onteardown=e,this.replaceRequestHandler(`ui/resource-teardown`,{params:zg.shape.params,result:Bg},(e,t)=>{if(!this._onteardown)throw Error(`No onteardown handler set`);return this._onteardown(e,t)})}_oncalltool;get oncalltool(){return this._oncalltool}set oncalltool(e){this.warnIfRequestHandlerReplaced(`oncalltool`,this._oncalltool,e),this._oncalltool=e,this.replaceRequestHandler(`tools/call`,(e,t)=>{if(!this._oncalltool)throw Error(`No oncalltool handler set`);return this._oncalltool(e.params,t)})}_onlisttools;get onlisttools(){return this._onlisttools}set onlisttools(e){this.warnIfRequestHandlerReplaced(`onlisttools`,this._onlisttools,e),this._onlisttools=e,this.replaceRequestHandler(`tools/list`,(e,t)=>{if(!this._onlisttools)throw Error(`No onlisttools handler set`);return this._onlisttools(e.params,t)})}assertCapabilityForMethod(e){if(e===`sampling/createMessage`&&!this._hostCapabilities?.sampling)throw Error(`Host does not support sampling (required for ${e})`)}assertRequestHandlerCapability(e){switch(e){case`tools/call`:case`tools/list`:if(!this._appCapabilities.tools)throw Error(`Client does not support tool capability (required for ${e})`);return;default:return}}assertNotificationCapability(e){}async callServerTool(e,t){if(this._assertInitialized(`callServerTool`),typeof e==`string`)throw Error(`callServerTool() expects an object as its first argument, but received a string ("${e}"). Did you mean: callServerTool({ name: "${e}", arguments: { ... } })?`);return await this.request({method:`tools/call`,params:e},{onprogress:()=>{},resetTimeoutOnProgress:!0,...t})}async readServerResource(e,t){return this._assertInitialized(`readServerResource`),await this.request({method:`resources/read`,params:e},t)}async listServerResources(e,t){return this._assertInitialized(`listServerResources`),await this.request({method:`resources/list`,params:e},t)}async createSamplingMessage(e,t){return this._assertInitialized(`createSamplingMessage`),await this.request({method:`sampling/createMessage`,params:e},t)}sendMessage(e,t){return this._assertInitialized(`sendMessage`),this.request({method:`ui/message`,params:e},jg,t)}sendLog(e){return this.notification({method:`notifications/message`,params:e})}updateModelContext(e,t){return this._assertInitialized(`updateModelContext`),this.request({method:`ui/update-model-context`,params:e},Fu,t)}openLink(e,t){return this._assertInitialized(`openLink`),this.request({method:`ui/open-link`,params:e},kg,t)}sendOpenLink=this.openLink;downloadFile(e,t){return this._assertInitialized(`downloadFile`),this.request({method:`ui/download-file`,params:e},Ag,t)}requestTeardown(e={}){return this.notification({method:`ui/notifications/request-teardown`,params:e})}requestDisplayMode(e,t){return this._assertInitialized(`requestDisplayMode`),this.request({method:`ui/request-display-mode`,params:e},Wg,t)}sendSizeChanged(e){return this.notification({method:`ui/notifications/size-changed`,params:e})}setupSizeChangedNotifications(){let e=!1,t=0,n=0,r=()=>{e||(e=!0,requestAnimationFrame(()=>{e=!1;let r=document.documentElement,i=r.style.height;r.style.height=`max-content`;let a=Math.ceil(r.getBoundingClientRect().height);r.style.height=i;let o=Math.ceil(window.innerWidth);(o!==t||a!==n)&&(t=o,n=a,this.sendSizeChanged({width:o,height:a}))}))};r();let i=new ResizeObserver(r);return i.observe(document.documentElement),i.observe(document.body),()=>i.disconnect()}async connect(e=new Tg(window.parent,window.parent),t){if(this.transport)throw Error(`App is already connected. Call close() before connecting again.`);this._initializedSent=!1;try{await super.connect(e);let n=await this.request({method:`ui/initialize`,params:{appCapabilities:this._appCapabilities,appInfo:this._appInfo,protocolVersion:wg}},Yg,t);if(n===void 0)throw Error(`Server sent invalid initialize result: ${n}`);this._hostCapabilities=n.hostCapabilities,this._hostInfo=n.hostInfo,this._hostContext=n.hostContext,await this.notification({method:`ui/notifications/initialized`}),this._initializedSent=!0,this.options?.autoResize&&this.setupSizeChangedNotifications()}catch(e){throw this.close(),e}}},t_=null,n_=new Set,r_=window.parent===window,i_=e=>e?.view&&n_.forEach(t=>t(e));function a_(e){return n_.add(e),()=>n_.delete(e)}async function o_(){if(r_)return;t_=new e_({name:`vibefort-panel`,version:`0.1.0`},{}),t_.ontoolresult=e=>i_(e.structuredContent),t_.onhostcontextchanged=e=>{e.theme&&document.documentElement.setAttribute(`data-theme`,e.theme)},await t_.connect();let e=t_.getHostContext()?.theme;e&&document.documentElement.setAttribute(`data-theme`,e)}async function s_(e,t){return(await(await fetch(`/mcp`,{method:`POST`,headers:{"content-type":`application/json`,accept:`application/json, text/event-stream`,authorization:`Bearer vf_dev_token`},body:JSON.stringify({jsonrpc:`2.0`,id:1,method:`tools/call`,params:{name:e,arguments:t}})})).json()).result}async function c_(e,t={}){let n=r_?await s_(e,t):await t_.callServerTool({name:e,arguments:t});if(n?.isError)throw Error(n.content?.[0]?.text??`Request failed`);return n?.structuredContent}async function l_(e){r_?window.dispatchEvent(new CustomEvent(`vf-toast`,{detail:`Would ask Claude: “${e}”`})):await t_.sendMessage({role:`user`,content:[{type:`text`,text:e}]})}function u_(e){r_||!t_?window.open(e,`_blank`,`noopener`):t_.openLink({url:e})}async function d_(e){let t=await c_(`get_results`,e?{repo:e}:{});return i_(t),t}var f_=[`critical`,`high`,`medium`,`low`],p_={critical:`danger`,high:`warning`,medium:`info`,low:`secondary`},m_={critical:`bg-danger-solid`,high:`bg-warning-solid`,medium:`bg-info-solid`,low:`bg-secondary-solid`},h_={A:`#16a34a`,B:`#65a30d`,C:`#ca8a04`,D:`#ea580c`,F:`#dc2626`},g_={A:`Looking solid`,B:`Pretty good`,C:`Needs work`,D:`Risky`,F:`Not safe to launch`},__={open:`Open`,fix_proposed:`Fix proposed`,fixed:`Fixed`,false_positive:`False positive`,accepted_risk:`Accepted risk`},v_=[`fixed`,`false_positive`,`accepted_risk`],y_=e=>{if(!e)return`never`;let t=Math.round((Date.now()-new Date(e).getTime())/6e4);return t<1?`just now`:t<60?`${t} min ago`:t<1440?`${Math.round(t/60)} h ago`:`${Math.round(t/1440)} d ago`};function b_(){return(0,p.jsxs)(`svg`,{width:`22`,height:`22`,viewBox:`0 0 24 24`,fill:`none`,"aria-hidden":`true`,children:[(0,p.jsx)(`path`,{d:`M12 2.5 4.5 5.4v5.6c0 4.5 3 8.3 7.5 10.5 4.5-2.2 7.5-6 7.5-10.5V5.4L12 2.5Z`,fill:`currentColor`,opacity:`.15`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinejoin:`round`}),(0,p.jsx)(`path`,{d:`m8.8 11.9 2.2 2.2 4.3-4.5`,stroke:`currentColor`,strokeWidth:`1.9`,strokeLinecap:`round`,strokeLinejoin:`round`})]})}function x_({grade:e,score:t}){let n=2*Math.PI*38;return(0,p.jsxs)(`div`,{className:`relative size-[104px] shrink-0`,role:`img`,"aria-label":`Security grade ${e}, score ${t} out of 100`,children:[(0,p.jsxs)(`svg`,{viewBox:`0 0 96 96`,className:`size-full -rotate-90`,children:[(0,p.jsx)(`circle`,{cx:`48`,cy:`48`,r:38,fill:`none`,strokeWidth:`8`,className:`stroke-[var(--color-border-subtle)]`}),(0,p.jsx)(`circle`,{cx:`48`,cy:`48`,r:38,fill:`none`,strokeWidth:`8`,strokeLinecap:`round`,stroke:h_[e],strokeDasharray:n,strokeDashoffset:n*(1-t/100),style:{transition:`stroke-dashoffset .6s ease`}})]}),(0,p.jsxs)(`div`,{className:`absolute inset-0 flex flex-col items-center justify-center`,children:[(0,p.jsx)(`span`,{className:`text-4xl font-semibold leading-none`,style:{color:h_[e]},children:e}),(0,p.jsxs)(`span`,{className:`mt-1 text-xs text-tertiary`,children:[t,`/100`]})]})]})}function S_({f:e,repo:t,onChange:n}){let[r,i]=(0,m.useState)(!1),[a,o]=(0,m.useState)(!1),[s,c]=(0,m.useState)(null),l=v_.includes(e.status),u=async t=>{o(!0),c(null);try{await c_(`update_finding`,{finding_id:e.id,status:t}),await n()}catch(e){c(e.message)}finally{o(!1)}};return(0,p.jsxs)(`li`,{className:`rounded-xl border border-default bg-surface ${l?`opacity-60`:``}`,children:[(0,p.jsxs)(`button`,{className:`flex w-full items-start gap-3 p-3 text-left`,"aria-expanded":r,onClick:()=>i(!r),children:[(0,p.jsx)(ae,{color:p_[e.severity],variant:`soft`,size:`sm`,className:`mt-0.5 shrink-0 uppercase`,children:e.severity}),(0,p.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,p.jsx)(`span`,{className:`block break-words text-sm font-medium text-default`,children:e.title}),(0,p.jsxs)(`span`,{className:`mt-0.5 block truncate text-xs text-tertiary`,children:[(0,p.jsx)(`span`,{className:`font-medium text-secondary`,children:e.ref}),` · `,e.file,`:`,e.line]})]}),e.status!==`open`&&(0,p.jsx)(ae,{color:e.status===`fixed`?`success`:`secondary`,variant:`outline`,size:`sm`,className:`shrink-0`,children:__[e.status]}),(0,p.jsx)(`span`,{"aria-hidden":!0,className:`mt-1 text-tertiary transition-transform ${r?`rotate-90`:``}`,children:`›`})]}),r&&(0,p.jsxs)(`div`,{className:`space-y-3 border-t border-subtle p-3 text-sm`,children:[(0,p.jsxs)(`section`,{children:[(0,p.jsx)(`h4`,{className:`mb-1 text-xs font-semibold uppercase tracking-wide text-tertiary`,children:`What’s wrong`}),(0,p.jsx)(`p`,{className:`break-words text-secondary`,children:e.explanation})]}),(0,p.jsxs)(`section`,{children:[(0,p.jsx)(`h4`,{className:`mb-1 text-xs font-semibold uppercase tracking-wide text-tertiary`,children:`What an attacker could do`}),(0,p.jsx)(`p`,{className:`break-words text-secondary`,children:e.attack_scenario})]}),e.excerpt&&(0,p.jsx)(`pre`,{className:`overflow-x-auto rounded-lg bg-surface-secondary p-3 text-xs text-default`,children:(0,p.jsx)(`code`,{children:e.excerpt})}),(0,p.jsxs)(`section`,{children:[(0,p.jsx)(`h4`,{className:`mb-1 text-xs font-semibold uppercase tracking-wide text-tertiary`,children:`How to fix`}),(0,p.jsx)(`p`,{className:`break-words text-secondary`,children:e.fix_guidance})]}),(0,p.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:[e.owasp,e.cwe,e.rule_id,`${e.confidence} confidence`,...e.review_label?[e.review_label]:[]].map(e=>(0,p.jsx)(ae,{variant:`outline`,color:`secondary`,size:`sm`,children:e},e))}),e.counter_check&&(0,p.jsxs)(`p`,{className:`break-words text-xs text-tertiary`,children:[`Counter-check, as reported by the agent: `,e.counter_check.claim,` (`,e.counter_check.file,`:`,e.counter_check.line,`)`]}),s&&(0,p.jsx)(`p`,{role:`alert`,className:`text-xs text-danger`,children:s}),(0,p.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 pt-1`,children:[e.status===`open`&&(0,p.jsx)(E,{color:`primary`,size:`sm`,onClick:()=>l_(`Fix Vibe Fortress finding ${e.ref} ("${e.title}") in ${t}: call start_scan with repo "${t}", kind "fix" and finding_id "${e.ref}", follow its instructions, and open a pull request on a new branch (never push to main).`),children:`Fix this`}),e.pr_url&&(0,p.jsx)(E,{variant:`outline`,color:`secondary`,size:`sm`,onClick:()=>u_(e.pr_url),children:`View pull request`}),e.status===`open`&&(0,p.jsx)(E,{variant:`ghost`,color:`secondary`,size:`sm`,disabled:a,onClick:()=>u(`false_positive`),children:`False positive`}),e.status===`open`&&(0,p.jsx)(E,{variant:`ghost`,color:`secondary`,size:`sm`,disabled:a,onClick:()=>u(`accepted_risk`),children:`Accept risk`}),(e.status===`false_positive`||e.status===`accepted_risk`)&&(0,p.jsx)(E,{variant:`ghost`,color:`secondary`,size:`sm`,disabled:a,onClick:()=>u(`open`),children:`Reopen`})]})]})]})}function C_({label:e,used:t,max:n}){let r=n<0?8:Math.min(100,t/Math.max(1,n)*100);return(0,p.jsxs)(`div`,{children:[(0,p.jsxs)(`div`,{className:`mb-1 flex justify-between text-sm`,children:[(0,p.jsx)(`span`,{className:`text-secondary`,children:e}),(0,p.jsxs)(`span`,{className:`text-default`,children:[t,` / `,n<0?`unlimited`:n]})]}),(0,p.jsx)(`div`,{className:`h-2 overflow-hidden rounded-full bg-surface-tertiary`,role:`progressbar`,"aria-label":e,"aria-valuenow":t,"aria-valuemin":0,"aria-valuemax":n<0?void 0:n,children:(0,p.jsx)(`div`,{className:`h-full rounded-full bg-primary-solid`,style:{width:`${r}%`}})})]})}var w_=e=>{let t=e.entitlement,n=e=>e?e.slice(0,10):``;return t.source===`trial`?`Free trial: ${t.trial_days_left} day${t.trial_days_left===1?``:`s`} left (ends ${n(t.trial_ends_at)}). No card needed.`:t.source===`subscription`?t.subscription?.cancelling?`Cancelled: you keep Pro until ${n(t.subscription.paid_through)}.`:t.subscription?.payment_issue?`The last payment failed: update your card in billing.`:`Pro${t.subscription?.interval===`year`?`, annual`:t.subscription?.interval===`month`?`, monthly`:``}${t.subscription?.paid_through?`, paid through ${n(t.subscription.paid_through)}`:``}.`:t.trial_ends_at?`Free. Your trial ended ${n(t.trial_ends_at)}.`:`Free plan.`},T_=e=>e<0?`Unlimited`:String(e);function E_({yes:e,label:t}){return(0,p.jsxs)(`span`,{className:`inline-flex items-center gap-1 ${e?`text-success`:`text-danger`}`,children:[(0,p.jsx)(`span`,{"aria-hidden":!0,className:`font-semibold`,children:e?`✓`:`✗`}),t?(0,p.jsx)(`span`,{className:`text-default`,children:t}):null,(0,p.jsxs)(`span`,{className:`sr-only`,children:[e?`Included`:`Not included`,t?`: ${t}`:``]})]})}var D_=[{label:`Projects`,cell:e=>({yes:e.repos!==0,label:T_(e.repos)})},{label:`Deep scans a month`,cell:e=>({yes:e.deepScans!==0,label:e.deepScans===0?void 0:T_(e.deepScans)})},{label:`Check-again scans a month`,cell:e=>({yes:e.diffScans!==0,label:e.diffScans===0?void 0:T_(e.diffScans)})},{label:`Fix pull requests a month`,cell:e=>({yes:e.fixPrs!==0,label:e.fixPrs===0?void 0:T_(e.fixPrs)})},{label:`Live config checks`,cell:e=>({yes:e.liveChecks})},{label:`Team workspaces`,cell:e=>({yes:e.team})},{label:`README badge`,cell:e=>({yes:e.badge})}];function O_({a:e}){if(!e.plans)return null;let t=[[`free`,`Free`],[`pro`,`Pro`]],n=e.entitlement.source===`trial`;return(0,p.jsx)(`div`,{className:`overflow-hidden rounded-xl border border-default bg-surface`,"data-testid":`plan-compare`,children:(0,p.jsxs)(`table`,{className:`w-full table-fixed border-collapse text-sm`,children:[(0,p.jsx)(`caption`,{className:`sr-only`,children:`Free compared with Pro`}),(0,p.jsx)(`thead`,{children:(0,p.jsxs)(`tr`,{children:[(0,p.jsx)(`th`,{scope:`col`,className:`w-[44%] p-2 text-left text-xs font-medium text-tertiary`,children:(0,p.jsx)(`span`,{className:`sr-only`,children:`Feature`})}),t.map(([t,r])=>(0,p.jsxs)(`th`,{scope:`col`,"data-current":e.plan===t,className:`p-2 text-left font-semibold ${e.plan===t?`bg-primary-surface text-default`:`text-secondary`}`,children:[r,e.plan===t&&(0,p.jsxs)(`span`,{className:`mt-0.5 block text-[11px] font-medium text-primary`,children:[`Your plan`,n?` (trial)`:``]})]},t))]})}),(0,p.jsx)(`tbody`,{children:D_.map(n=>(0,p.jsxs)(`tr`,{className:`border-t border-subtle`,children:[(0,p.jsx)(`th`,{scope:`row`,className:`p-2 text-left text-xs font-normal text-secondary`,children:n.label}),t.map(([t])=>{let r=n.cell(e.plans[t]);return(0,p.jsx)(`td`,{className:`p-2 align-top ${e.plan===t?`bg-primary-surface`:``}`,children:(0,p.jsx)(E_,{yes:r.yes,label:r.label})},t)})]},n.label))})]})})}function k_({a:e,go:t}){let n=e.badge??null,[r,i]=(0,m.useState)(!1),[a,o]=(0,m.useState)(null),s=async()=>{i(!0),o(null);try{t(await c_(`billing_options`))}catch(e){o(e.message)}finally{i(!1)}},c=n?`[![Scanned by Vibe Fortress](${n.image})](${n.page})`:null;return(0,p.jsxs)(`div`,{className:`space-y-4`,children:[(0,p.jsxs)(`div`,{className:`rounded-xl border border-default bg-surface p-4`,children:[(0,p.jsxs)(`div`,{className:`mb-3 flex items-center justify-between`,children:[(0,p.jsx)(`div`,{className:`font-medium text-default`,children:`Your plan`}),(0,p.jsx)(ae,{color:e.plan===`pro`?`success`:`secondary`,variant:`soft`,children:e.entitlement.source===`trial`?`Pro trial`:e.plan===`pro`?`Pro`:`Free`})]}),(0,p.jsx)(`p`,{className:`mb-3 text-sm text-secondary`,children:w_(e)}),(0,p.jsxs)(`div`,{className:`space-y-3`,children:[(0,p.jsx)(C_,{label:`Repos`,used:e.usage.repos,max:e.limits.repos}),(0,p.jsx)(C_,{label:`Deep scans this month`,used:e.usage.deep,max:e.limits.deepScans}),(0,p.jsx)(C_,{label:`Check-again scans this month`,used:e.usage.diff,max:e.limits.diffScans}),(0,p.jsx)(C_,{label:`Fix pull requests this month`,used:e.usage.fix,max:e.limits.fixPrs})]}),(0,p.jsxs)(`p`,{className:`mt-3 text-xs text-tertiary`,children:[`Monthly counts start again on `,e.resets_at.slice(0,10),`.`]})]}),(0,p.jsx)(O_,{a:e}),e.upgrade_url?(0,p.jsxs)(`div`,{className:`rounded-xl border border-primary-surface bg-primary-surface p-4`,children:[(0,p.jsxs)(`h3`,{className:`font-medium text-default`,children:[`Vibe Fortress Pro, €`,e.price_eur.month,`/month or €`,e.price_eur.year,`/year`]}),(0,p.jsx)(`p`,{className:`mt-1 text-sm text-secondary`,children:`Cancel anytime. VAT added where it applies.`}),(0,p.jsxs)(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:[(0,p.jsx)(E,{color:`primary`,onClick:()=>u_(e.upgrade_url_month??e.upgrade_url),children:e.entitlement.source===`trial`?`Keep Pro, monthly`:`Upgrade, monthly`}),e.upgrade_url_year?(0,p.jsx)(E,{variant:`outline`,color:`secondary`,onClick:()=>u_(e.upgrade_url_year),children:`Annual, save €${e.price_eur.month*12-e.price_eur.year}`}):null]})]}):e.portal_url?(0,p.jsxs)(`div`,{children:[(0,p.jsx)(E,{variant:`outline`,color:`secondary`,disabled:r,onClick:s,children:`Manage billing`}),a&&(0,p.jsx)(`p`,{role:`alert`,className:`mt-1 text-xs text-danger`,children:a}),(0,p.jsx)(`p`,{className:`mt-1 text-xs text-tertiary`,children:`Billing opens in your browser. Cancel anytime.`})]}):null,e.live_checks&&(0,p.jsxs)(`details`,{className:`rounded-xl border border-default bg-surface p-4`,"data-testid":`live-connections`,children:[(0,p.jsxs)(`summary`,{className:`flex cursor-pointer items-center justify-between gap-2`,children:[(0,p.jsx)(`span`,{className:`text-sm font-medium`,children:`See what is included in live config checks`}),(0,p.jsx)(ae,{color:e.live_checks.included?`success`:`secondary`,variant:`soft`,children:e.live_checks.included?`In your plan`:`Trial and Pro`})]}),(0,p.jsx)(`p`,{className:`my-2 text-sm text-secondary`,children:`Your own Claude reads the real settings of your services, read-only, through connectors you already have. Connect these:`}),(0,p.jsx)(`ul`,{className:`space-y-2 text-sm`,children:e.live_checks.connections.map(e=>(0,p.jsxs)(`li`,{children:[(0,p.jsx)(`b`,{className:`text-default`,children:e.label}),` `,(0,p.jsxs)(`span`,{className:`text-tertiary`,children:[`via `,e.connectors.join(` or `)]}),(0,p.jsx)(`div`,{className:`text-secondary`,children:e.access})]},e.service))}),(0,p.jsx)(`p`,{className:`mt-2 text-xs text-tertiary`,children:`Never paste a token into chat, and never let Claude run a call that can change something.`})]}),c&&(0,p.jsxs)(`div`,{className:`rounded-xl border border-default bg-surface p-4`,children:[(0,p.jsx)(`h3`,{className:`mb-2 text-sm font-medium`,children:`README badge`}),(0,p.jsx)(`pre`,{className:`overflow-x-auto rounded-lg bg-surface-secondary p-2 text-xs`,children:(0,p.jsx)(`code`,{children:c})}),(0,p.jsx)(E,{className:`mt-2`,size:`sm`,variant:`outline`,color:`secondary`,onClick:()=>navigator.clipboard?.writeText(c),children:`Copy markdown`})]}),(0,p.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,p.jsx)(E,{size:`sm`,variant:`ghost`,color:`secondary`,onClick:()=>u_(e.export_url),children:`Export my data`}),(0,p.jsx)(E,{size:`sm`,variant:`ghost`,color:`danger`,onClick:()=>u_(e.delete_url),children:`Delete my account`}),(0,p.jsx)(E,{size:`sm`,variant:`ghost`,color:`secondary`,onClick:()=>u_(e.privacy_url),children:`Privacy`})]}),(0,p.jsx)(`p`,{className:`text-xs text-tertiary`,children:`Secrets and dependency alerts stay free on every plan, with no account. Vibe Fortress never stores your source code.`})]})}var A_={gitleaks:`Secret search`,opengrep:`Code rules`,"vibefort-config":`Configuration checks`};function j_({lt:e}){if(!e)return null;if(!e.used||!e.facts)return(0,p.jsxs)(`div`,{className:`mt-3 rounded-lg border border-subtle bg-surface-secondary p-2 text-xs`,role:`note`,"data-testid":`local-tools`,children:[(0,p.jsx)(`span`,{className:`font-semibold text-warning`,children:`Without local tools, lower confidence.`}),` The file list, the package list and the search for secrets rest on what the agent reported. Run the scan where the project is checked out to use the local tools.`]});let t=e.facts;return(0,p.jsxs)(`div`,{className:`mt-3 rounded-lg border border-subtle p-2 text-xs`,role:`note`,"data-testid":`local-tools`,children:[(0,p.jsxs)(`div`,{children:[(0,p.jsx)(`span`,{className:`font-semibold`,children:`Local tools ran on your machine`}),` `,(0,p.jsxs)(`span`,{className:`text-secondary`,children:[`at commit `,t.commit.slice(0,7)]})]}),(0,p.jsxs)(`ul`,{className:`mt-1 flex flex-col gap-0.5 text-secondary`,children:[(0,p.jsxs)(`li`,{children:[`File list from git: `,t.files.toLocaleString(`en-US`),` files, `,t.review.toLocaleString(`en-US`),` need review`,t.github===`agrees`?`; agrees with GitHub`:(t.github,``)]}),t.github===`differs`&&(0,p.jsxs)(`li`,{className:`text-warning`,children:[`The file list differs from GitHub's for this commit in `,t.github_diff,` file(s).`]}),(0,p.jsxs)(`li`,{children:[`Packages from the lockfile: `,t.packages.toLocaleString(`en-US`)]}),t.tools.map(e=>(0,p.jsxs)(`li`,{className:e.status===`ok`?``:`text-warning`,children:[A_[e.tool]??e.tool,`: `,e.status===`ok`?`ran${e.version?` (${e.tool===`vibefort-config`?`rules`:e.tool} ${e.version})`:``}`:`NOT run${e.reason?`: ${e.reason}`:``}`]},e.tool)),e.tool_findings>0&&(0,p.jsxs)(`li`,{children:[e.tool_findings,` finding`,e.tool_findings===1?``:`s`,` came from these tools`]}),t.dirty_files>0&&(0,p.jsxs)(`li`,{className:`text-warning`,children:[t.dirty_files,` tracked file(s) differed from the commit when the tools ran.`]}),e.proof_line&&(0,p.jsx)(`li`,{"data-testid":`proof-line`,className:e.proof?.state===`checked`&&!(e.proof.counts.no_match+e.proof.counts.no_line+e.proof.counts.no_file)?``:`text-warning`,children:e.proof_line}),(e.outside_review??0)>0&&(0,p.jsxs)(`li`,{"data-testid":`outside-review`,children:[e.outside_review,` tool result`,e.outside_review===1?` is`:`s are`,` in test, fixture or vendored code: shown at low, not triaged`]}),e.stable_line&&(0,p.jsx)(`li`,{"data-testid":`stable-line`,children:e.stable_line})]})]})}function M_({s:e,c:t,v:n,nt:r,lt:i}){if(!e)return null;let a=e.mode===`check-again`?`reviewable changed files`:`reviewable files`,o=e.percent!==null&&e.percent<50;return(0,p.jsxs)(`div`,{className:`mt-4 rounded-xl border border-subtle p-3`,"aria-label":`Scan coverage`,children:[(0,p.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2 text-sm`,children:[(0,p.jsx)(`span`,{className:`font-medium`,children:`Coverage`}),(0,p.jsx)(`span`,{className:o?`font-semibold text-warning`:`font-semibold`,children:e.recorded?e.percent===null?`n/a`:`${e.percent}%`:`not recorded`})]}),e.recorded?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`div`,{className:`mt-1 text-sm`,children:[`Reviewed `,(0,p.jsx)(`span`,{className:`font-semibold`,children:e.reviewed.toLocaleString(`en-US`)}),` of `,(0,p.jsx)(`span`,{className:`font-semibold`,children:e.reviewable.toLocaleString(`en-US`)}),` `,a]}),e.percent!==null&&(0,p.jsx)(`div`,{className:`mt-2 h-1.5 overflow-hidden rounded-full bg-surface-tertiary`,role:`img`,"aria-label":`${e.percent}% of ${a} reviewed`,children:(0,p.jsx)(`div`,{className:`h-full rounded-full ${o?`bg-warning-solid`:`bg-primary-solid`}`,style:{width:`${Math.max(1,e.percent)}%`}})}),(0,p.jsx)(`p`,{className:`mt-2 text-xs ${e.not_covered?`text-warning`:`text-secondary`}`,children:e.mode===`check-again`?`${e.not_covered} changed file(s) not reviewed; ${e.unchanged} unchanged files were not re-read by design.`:`${e.not_covered.toLocaleString(`en-US`)} not covered: no review step read them.`}),e.mode===`full`&&(0,p.jsxs)(`p`,{className:`mt-1 text-xs text-secondary`,children:[e.excluded.toLocaleString(`en-US`),` of `,e.listed.toLocaleString(`en-US`),` listed files excluded as not reviewable`,Object.keys(e.excluded_by_reason).length?` (${Object.entries(e.excluded_by_reason).map(([e,t])=>`${t} ${e}`).join(`, `)})`:``,`.`]}),!!e.tests&&(0,p.jsxs)(`p`,{className:`mt-1 text-xs text-secondary`,children:[e.tests.toLocaleString(`en-US`),` test and fixture files are counted separately: searched for secrets, not reviewed line by line.`]}),!!e.shipped&&(0,p.jsxs)(`p`,{className:`mt-1 text-xs text-secondary`,children:[e.shipped.toLocaleString(`en-US`),` committed build files were not reviewed and not verified against the source.`]}),!!e.partly_read&&(0,p.jsxs)(`p`,{className:`mt-1 text-xs text-warning`,children:[e.partly_read.toLocaleString(`en-US`),` files were only partly read and are not counted as reviewed.`]}),r&&r.dropped_steps.length>0&&(0,p.jsxs)(`p`,{className:`mt-1 text-xs text-warning`,children:[r.dropped_steps.length,` review step(s) did not run (no file in the branch): `,r.dropped_steps.slice(0,3).map(e=>e.title).join(`; `),`.`]}),r&&r.budget_left_out.length>0&&(0,p.jsxs)(`p`,{className:`mt-1 text-xs text-warning`,children:[`High-risk files not reached: `,r.budget_left_out.map(e=>`${e.label} ${e.files}`).join(`, `),`.`]}),r&&r.map_warnings.length>0&&(0,p.jsxs)(`p`,{className:`mt-1 text-xs text-secondary`,children:[r.map_warnings.length,` app map path(s) were not files in the branch.`]}),(e.unlisted>0||e.tree_truncated)&&(0,p.jsxs)(`p`,{className:`mt-1 text-xs text-warning`,children:[`Covers the `,e.listed.toLocaleString(`en-US`),` listed files only`,e.unlisted?`: ${e.unlisted.toLocaleString(`en-US`)} more files in the branch are not in the list`:`: GitHub truncated the file tree`,`.`]})]}):(0,p.jsx)(`p`,{className:`mt-1 text-xs text-secondary`,children:`This scan did not list the files in the branch, so no share can be given.`}),(0,p.jsx)(j_,{lt:i}),n&&(0,p.jsxs)(`details`,{className:`mt-2 text-xs text-secondary`,children:[(0,p.jsx)(`summary`,{className:`cursor-pointer`,children:`What is verified and what is reported`}),(0,p.jsxs)(`p`,{className:`mt-1`,children:[(0,p.jsx)(`span`,{className:`font-medium`,children:`Verified by Vibe Fortress:`}),` `,n.verified.join(`; `),`.`]}),!!n.collected?.length&&(0,p.jsxs)(`p`,{className:`mt-1`,children:[(0,p.jsx)(`span`,{className:`font-medium`,children:`Collected on your machine (taken as sent, not checked again by the server):`}),` `,n.collected.join(`; `),`.`]}),(0,p.jsxs)(`p`,{className:`mt-1`,children:[(0,p.jsx)(`span`,{className:`font-medium`,children:`Reported by the agent, not verified:`}),` `,n.reported.join(`; `),`.`]})]}),n&&(0,p.jsx)(`p`,{className:`mt-2 text-xs text-secondary`,children:n.grade_basis}),t?.recorded&&(0,p.jsxs)(`details`,{className:`mt-2 text-xs text-secondary`,children:[(0,p.jsxs)(`summary`,{className:`cursor-pointer`,children:[`Plan diagnostic: `,t.reviewed,` of the `,t.planned,` planned files reported as read`]}),(0,p.jsxs)(`p`,{className:`mt-1 text-tertiary`,children:[`Counts only. The plan is chosen during the scan, so it says nothing about the rest of the branch. `,t.steps.reported,`/`,t.steps.total,` steps reported.`]}),t.empty_steps.length>0&&(0,p.jsxs)(`p`,{className:`mt-1 text-warning`,children:[`Reviewed nothing: `,t.empty_steps.join(`; `)]}),t.not_reviewed.length>0&&(0,p.jsx)(`ul`,{className:`mt-1 space-y-0.5`,children:t.not_reviewed.map(e=>(0,p.jsxs)(`li`,{className:`break-all font-mono`,children:[e.file,e.reason?(0,p.jsxs)(`span`,{className:`font-sans text-tertiary`,children:[` — `,e.reason]}):null]},e.file))})]})]})}function N_({inv:e,spot:t,commit:n}){if(!e)return(0,p.jsx)(`p`,{className:`mt-3 text-xs text-tertiary`,children:`File inventory not recorded for this scan.`});let r=e.mode===`check-again`?e.changed?.not_reviewed.length??0:e.not_covered,i=[[`reviewed`,e.reviewed],[`excluded`,e.excluded],[e.mode===`check-again`?`unchanged`:`not covered`,e.mode===`check-again`?e.unchanged:e.not_covered]];return(0,p.jsxs)(`div`,{className:`mt-4 rounded-xl border border-subtle p-3`,"aria-label":`File inventory`,children:[(0,p.jsxs)(`div`,{className:`flex items-baseline justify-between text-sm`,children:[(0,p.jsx)(`span`,{className:`font-medium`,children:`Files in the branch`}),(0,p.jsxs)(`span`,{className:`font-semibold`,children:[e.total,e.cut?` (list covers ${e.listed})`:``]})]}),(0,p.jsx)(`div`,{className:`mt-2 grid grid-cols-3 gap-2 text-center text-xs`,children:i.map(([e,t])=>(0,p.jsxs)(`div`,{className:`rounded-lg border border-subtle p-2 ${e===`not covered`&&t>0?`text-warning`:``}`,children:[(0,p.jsx)(`div`,{className:`text-base font-semibold`,children:t}),(0,p.jsx)(`div`,{className:`text-tertiary`,children:e})]},e))}),e.mode===`check-again`&&e.changed&&(0,p.jsxs)(`p`,{className:`mt-2 text-xs text-secondary`,children:[`Check-again: `,e.changed.total,` changed, `,e.changed.reviewable,` reviewable, `,e.changed.reviewed,` reviewed.`]}),Object.keys(e.excluded_by_reason).length>0&&(0,p.jsxs)(`p`,{className:`mt-2 text-xs text-secondary`,children:[`Excluded: `,Object.entries(e.excluded_by_reason).map(([e,t])=>`${t} ${e}`).join(`, `)]}),r>0&&(0,p.jsxs)(`details`,{className:`mt-2 text-xs text-secondary`,open:!0,children:[(0,p.jsxs)(`summary`,{className:`cursor-pointer font-medium text-warning`,children:[r,` `,e.mode===`check-again`?`changed files not reviewed`:`not covered, highest risk first (by path and name)`]}),(0,p.jsx)(`ul`,{className:`mt-1 space-y-0.5`,children:(e.mode===`check-again`?(e.changed?.not_reviewed??[]).map(e=>({file:e,note:void 0})):e.not_covered_files).map(e=>(0,p.jsxs)(`li`,{className:`break-all font-mono`,children:[e.file,`risk`in e&&e.risk===`high`?(0,p.jsx)(`span`,{className:`font-sans font-medium text-warning`,children:` high risk`}):null,e.note?(0,p.jsxs)(`span`,{className:`font-sans text-tertiary`,children:[` — `,e.note]}):null]},e.file))}),e.not_covered_more>0&&(0,p.jsxs)(`p`,{className:`mt-1 text-tertiary`,children:[`…and `,e.not_covered_more,` more. The dashboard lists every file, with search; the data export has them too.`]})]}),e.reviewed_by_step.length>0&&(0,p.jsxs)(`details`,{className:`mt-2 text-xs text-secondary`,children:[(0,p.jsx)(`summary`,{className:`cursor-pointer`,children:`Why files were reviewed`}),(0,p.jsx)(`ul`,{className:`mt-1 space-y-0.5`,children:e.reviewed_by_step.map(e=>(0,p.jsxs)(`li`,{children:[e.step,` `,(0,p.jsxs)(`span`,{className:`text-tertiary`,children:[`(`,e.files,`)`]})]},e.step))})]}),(e.risk_areas?.length??0)>0&&(0,p.jsxs)(`details`,{className:`mt-2 text-xs text-secondary`,children:[(0,p.jsx)(`summary`,{className:`cursor-pointer`,children:`High-risk areas (by path and name)`}),(0,p.jsx)(`ul`,{className:`mt-1 space-y-0.5`,children:e.risk_areas.map(e=>(0,p.jsxs)(`li`,{children:[e.label,`: `,(0,p.jsxs)(`span`,{className:e.reviewed<e.files?`text-warning`:``,children:[e.reviewed,` of `,e.files,` reviewed`]}),`, `,e.steps,` step`,e.steps===1?``:`s`]},e.area))})]}),e.unknown_refs.length>0&&(0,p.jsxs)(`p`,{className:`mt-2 text-xs text-warning`,children:[e.unknown_refs.length,` file(s) named in the app map are not in the branch and were ignored.`]}),t&&t.answers.length>0&&(0,p.jsxs)(`details`,{className:`mt-2 text-xs text-secondary`,children:[(0,p.jsxs)(`summary`,{className:`cursor-pointer`,children:[`Spot checks (`,t.answers.length,`, seed `,t.seed,`)`]}),(0,p.jsxs)(`p`,{className:`mt-1 text-tertiary`,children:[`Vibe Fortress cannot verify the quoted text. Open each file at `,n??`the scanned commit`,` and compare the lines yourself.`]}),(0,p.jsx)(`ul`,{className:`mt-1 space-y-1`,children:t.answers.map(e=>(0,p.jsxs)(`li`,{children:[(0,p.jsxs)(`span`,{className:`break-all font-mono`,children:[e.file,`:`,e.start_line,`-`,e.end_line]}),e.why===`finding`?` (finding ${e.ref??``})`:e.why===`risk`?` (high-risk area)`:``,` `,(0,p.jsxs)(`span`,{className:e.sha_matches?`text-tertiary`:`font-semibold text-warning`,children:[`sha `,e.blob_sha,e.sha_matches?` matches`:` DIFFERS`]}),(0,p.jsx)(`pre`,{className:`mt-0.5 overflow-x-auto rounded bg-surface-tertiary p-1.5 font-mono`,children:e.text})]},e.file+e.start_line))})]})]})}var P_={view:`local`,project:`acme/shop`,scanned_at:new Date().toISOString(),deep_reviewed:0,grade:`D`,score:55,kind:`quick`,engines:[],remaining:1,counts:{critical:1,high:1,medium:1,low:0},findings:[{ref:`VF-L-1`,severity:`critical`,title:`Live Stripe key in code`,file:`src/config.js`,line:2,reason:`Anyone who can read the repository can charge or refund customers with this key.`,owasp:`A02:2021`,cwe:`CWE-798`,status:`open`},{ref:`VF-L-2`,severity:`high`,title:`SQL built from user input`,file:`src/db.js`,line:2,reason:`An attacker can read or change every row by crafting the name.`,owasp:`A03:2021`,cwe:`CWE-89`,status:`open`,review:{verdict:`confirmed`,reason:`The name comes straight from the request.`}}]};function F_({a:e}){let t=e.state??(e.pending?`pending`:e.linked?`linked`:`none`),n=e.next_steps??[];return(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4`,"aria-label":`Vibe Fortress account`,"data-testid":`link-status`,"data-state":t,children:[t===`pending`&&(0,p.jsxs)(`div`,{children:[(0,p.jsx)(`div`,{className:`text-sm font-medium`,children:`Approve this code in your browser`}),e.code&&(0,p.jsx)(`div`,{className:`mt-1 font-mono text-3xl font-semibold tracking-widest`,"aria-label":`Link code ${e.code}`,children:e.code}),(0,p.jsx)(`p`,{className:`mt-1 text-xs text-secondary`,children:`Check that the same code shows on the page, then approve. You never copy a token.`}),e.url&&(0,p.jsxs)(`p`,{className:`mt-2 break-all text-xs text-tertiary`,children:[`Address: `,(0,p.jsx)(`span`,{className:`select-all font-mono`,children:e.url})]}),(0,p.jsxs)(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:[e.url&&(0,p.jsx)(E,{size:`sm`,color:`primary`,onClick:()=>u_(e.url),children:`Open Vibe Fortress in the browser`}),(0,p.jsx)(E,{size:`sm`,variant:`outline`,color:`secondary`,onClick:()=>l_(`I approved the Vibe Fortress link. Please confirm it.`),children:`I approved it`})]})]}),t===`linked`&&(0,p.jsxs)(`div`,{children:[(0,p.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,p.jsx)(`div`,{className:`text-sm font-medium`,children:`Account linked`}),(0,p.jsx)(ae,{color:e.plan===`pro`?`success`:`secondary`,variant:`soft`,children:e.source===`trial`?`Pro trial`:e.plan===`pro`?`Pro`:e.plan===`free`?`Free`:`Linked`})]}),e.workspace&&(0,p.jsxs)(`p`,{className:`mt-1 text-sm text-secondary`,children:[`Workspace: `,e.workspace]}),e.source===`trial`&&typeof e.trial_days_left==`number`&&(0,p.jsxs)(`p`,{className:`mt-1 text-sm text-secondary`,children:[`Free trial: `,e.trial_days_left,` day`,e.trial_days_left===1?``:`s`,` left. No card needed.`]}),e.source===`subscription`&&(0,p.jsx)(`p`,{className:`mt-1 text-sm text-secondary`,children:`Your subscription is active.`}),e.reachable===!1&&(0,p.jsx)(`p`,{className:`mt-1 text-xs text-warning`,children:`The server could not be reached, so the plan shown may be out of date.`}),(0,p.jsxs)(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:[e.web_url&&(0,p.jsx)(E,{size:`sm`,variant:`outline`,color:`secondary`,onClick:()=>u_(e.web_url),children:`Open Vibe Fortress`}),e.plan!==`pro`&&e.upgrade_url&&(0,p.jsx)(E,{size:`sm`,color:`primary`,onClick:()=>u_(e.upgrade_url),children:e.source===`trial`?`Keep Pro after the trial`:`See plans`})]}),e.plan!==`pro`&&e.upgrade_url&&(0,p.jsxs)(`p`,{className:`mt-2 break-all text-xs text-tertiary`,children:[`Plans: `,(0,p.jsx)(`span`,{className:`select-all font-mono`,children:e.upgrade_url})]})]}),t===`none`&&(0,p.jsxs)(`div`,{children:[(0,p.jsx)(`div`,{className:`text-sm font-medium`,children:`No account linked`}),(0,p.jsx)(`p`,{className:`mt-1 text-sm text-secondary`,children:`Vibe Fortress works without one: secrets, dependency alerts and quick code checks stay free. A free 30-day trial adds deep review, live checks and a web dashboard. Your code never leaves your computer.`}),(0,p.jsx)(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:(0,p.jsx)(E,{size:`sm`,color:`primary`,onClick:()=>l_(`Link my Vibe Fortress account.`),children:`Link my account`})})]}),n.length>0&&(0,p.jsxs)(`div`,{className:`mt-4 border-t border-subtle pt-3`,children:[(0,p.jsx)(`div`,{className:`text-sm font-medium`,children:`Suggested next steps`}),(0,p.jsx)(`ul`,{className:`mt-1 list-disc space-y-1 pl-5 text-sm text-secondary`,children:n.map(e=>(0,p.jsx)(`li`,{children:e},e))})]})]})}var I_={none:{view:`local-account`,state:`none`,linked:!1},pending:{view:`local-account`,state:`pending`,pending:!0,code:`K7M2-QX9P`,url:`http://localhost:8793/app/link?code=K7M2-QX9P`},trial:{view:`local-account`,state:`linked`,linked:!0,workspace:`Ada's workspace`,plan:`pro`,source:`trial`,trial_days_left:27,web_url:`http://localhost:8793/app/`,upgrade_url:`http://localhost:8793/app/plan`,next_steps:[`Run a deep review of your open findings.`]},pro:{view:`local-account`,state:`linked`,linked:!0,workspace:`Ada's workspace`,plan:`pro`,source:`subscription`,web_url:`http://localhost:8793/app/`}};function L_({o:e}){return e.state===`scanned`?(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4`,"aria-label":`Vibe Fortress check`,"data-testid":`offer`,"data-state":`scanned`,children:[(0,p.jsxs)(`div`,{className:`text-sm font-medium`,children:[e.project,` is already checked`]}),(0,p.jsx)(`p`,{className:`mt-1 text-sm text-secondary`,children:`Nothing more to start here.`}),(0,p.jsx)(`div`,{className:`mt-3`,children:(0,p.jsx)(E,{size:`sm`,color:`primary`,onClick:()=>l_(`Show my Vibe Fortress security results.`),children:`Show the results`})})]}):e.state===`snoozed`?(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4`,"aria-label":`Vibe Fortress check`,"data-testid":`offer`,"data-state":`snoozed`,children:[(0,p.jsx)(`div`,{className:`text-sm font-medium`,children:`Okay, I will remind you later`}),(0,p.jsxs)(`p`,{className:`mt-1 text-sm text-secondary`,children:[`Vibe Fortress stays quiet about `,e.project,` until `,e.quiet_until?.slice(0,10),`. `,e.type_hint]}),(0,p.jsx)(`div`,{className:`mt-3`,children:(0,p.jsx)(E,{size:`sm`,variant:`outline`,color:`secondary`,onClick:()=>l_(`Yes, run the Vibe Fortress quick check on this project (${e.project}).`),children:`Start the check now`})})]}):(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4`,"aria-label":`Vibe Fortress check`,"data-testid":`offer`,"data-state":`offer`,children:[(0,p.jsx)(`div`,{className:`text-xs font-semibold uppercase tracking-wide text-tertiary`,children:`Quick security check`}),(0,p.jsxs)(`h2`,{className:`mt-1 break-words text-lg font-semibold`,children:[`Check `,e.project,` for security problems?`]}),(0,p.jsx)(`p`,{className:`mt-1 text-sm text-secondary`,children:`Vibe Fortress looks for leaked passwords, risky packages and common mistakes in apps built with AI.`}),(0,p.jsx)(`h3`,{className:`mt-4 text-sm font-medium`,children:`What I will do now`}),(0,p.jsx)(`ul`,{className:`mt-1 space-y-1.5 text-sm text-secondary`,children:e.checklist.map(e=>(0,p.jsxs)(`li`,{className:`flex gap-2`,children:[(0,p.jsx)(`span`,{"aria-hidden":!0,className:`text-success`,children:`✓`}),(0,p.jsx)(`span`,{className:`min-w-0 break-words`,children:e})]},e))}),(0,p.jsxs)(`div`,{className:`mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2`,children:[(0,p.jsxs)(`div`,{className:`rounded-xl border border-subtle p-3`,children:[(0,p.jsx)(`h3`,{className:`text-sm font-medium`,children:`Free, no account`}),(0,p.jsx)(`ul`,{className:`mt-1 list-disc space-y-0.5 pl-4 text-xs text-secondary`,children:e.free.map(e=>(0,p.jsx)(`li`,{children:e},e))})]}),(0,p.jsxs)(`div`,{className:`rounded-xl border border-subtle p-3`,children:[(0,p.jsx)(`h3`,{className:`text-sm font-medium`,children:`An account adds`}),(0,p.jsx)(`ul`,{className:`mt-1 list-disc space-y-0.5 pl-4 text-xs text-secondary`,children:e.account.map(e=>(0,p.jsx)(`li`,{children:e},e))})]})]}),(0,p.jsx)(`div`,{className:`mt-4 flex flex-wrap gap-2`,children:e.buttons.map(e=>(0,p.jsx)(E,{size:`sm`,color:e.id===`yes`?`primary`:`secondary`,variant:e.id===`yes`?`solid`:e.id===`no`?`outline`:`ghost`,onClick:()=>l_(e.message),children:e.label},e.id))}),(0,p.jsx)(`p`,{className:`mt-3 text-xs text-secondary`,children:e.type_hint}),(0,p.jsxs)(`details`,{className:`mt-2 text-xs text-tertiary`,children:[(0,p.jsx)(`summary`,{className:`cursor-pointer`,children:`What each button tells Claude`}),(0,p.jsx)(`ul`,{className:`mt-1 space-y-1`,children:e.buttons.map(e=>(0,p.jsxs)(`li`,{children:[(0,p.jsxs)(`span`,{className:`font-medium text-secondary`,children:[e.label,`:`]}),` `,(0,p.jsx)(`span`,{className:`select-all`,children:e.message})]},e.id))})]})]})}function R_({r:e,go:t}){let[n,r]=(0,m.useState)(e.reason),[i,a]=(0,m.useState)(null),o=async()=>{a(null);try{t(await c_(`account`))}catch(e){a(e.message)}},s=e.reasons.find(e=>e.id===n);return e.state===`none`?(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4`,"aria-label":`Billing`,"data-testid":`retention`,"data-state":`none`,children:[(0,p.jsx)(`div`,{className:`text-sm font-medium`,children:`You have no subscription`}),(0,p.jsx)(`p`,{className:`mt-1 text-sm text-secondary`,children:`There is nothing to cancel.`}),(0,p.jsx)(`div`,{className:`mt-3`,children:(0,p.jsx)(E,{size:`sm`,variant:`outline`,color:`secondary`,onClick:o,children:`Back to my plan`})}),i&&(0,p.jsx)(`p`,{role:`alert`,className:`mt-1 text-xs text-danger`,children:i})]}):(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4`,"aria-label":`Before you go to billing`,"data-testid":`retention`,"data-state":`subscriber`,children:[(0,p.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Before you go to billing`}),(0,p.jsx)(`p`,{className:`mt-1 text-sm text-secondary`,children:`What is wrong? Pick one if you like. You do not have to.`}),(0,p.jsx)(`div`,{role:`group`,"aria-label":`What is wrong`,className:`mt-3 flex flex-wrap gap-2`,children:e.reasons.map(e=>(0,p.jsx)(E,{size:`sm`,variant:n===e.id?`solid`:`outline`,color:n===e.id?`primary`:`secondary`,"aria-pressed":n===e.id,onClick:()=>r(n===e.id?null:e.id),children:e.label},e.id))}),s&&(0,p.jsx)(`ul`,{className:`mt-3 space-y-2`,"aria-label":`What could help`,children:s.options.map(e=>(0,p.jsxs)(`li`,{className:`rounded-xl border border-subtle p-3`,children:[(0,p.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,p.jsx)(`span`,{className:`text-sm font-medium`,children:e.label}),!e.real&&(0,p.jsx)(ae,{color:`secondary`,variant:`outline`,size:`sm`,children:`Placeholder, not available yet`})]}),(0,p.jsx)(`p`,{className:`mt-0.5 break-words text-xs text-secondary`,children:e.detail}),(0,p.jsx)(`div`,{className:`mt-2`,children:(0,p.jsx)(E,{size:`sm`,variant:`outline`,color:`secondary`,onClick:()=>e.kind===`link`?u_(e.url):l_(e.message),children:e.kind===`link`?`Open in billing`:`Ask Claude`})}),(0,p.jsx)(`p`,{className:`mt-1 break-words text-xs text-tertiary`,children:e.kind===`link`?(0,p.jsxs)(p.Fragment,{children:[`Opens: `,(0,p.jsx)(`span`,{className:`select-all font-mono break-all`,children:e.url})]}):(0,p.jsxs)(p.Fragment,{children:[`Sends: `,(0,p.jsx)(`span`,{className:`select-all`,children:e.message})]})})]},e.id))}),(0,p.jsxs)(`div`,{className:`mt-4 flex flex-wrap items-center gap-2 border-t border-subtle pt-3`,children:[e.portal_url?(0,p.jsx)(E,{size:`sm`,color:`primary`,onClick:()=>u_(e.portal_url),children:`Continue to billing`}):(0,p.jsx)(`span`,{className:`text-sm text-secondary`,children:`Billing is not available on this server.`}),(0,p.jsx)(E,{size:`sm`,variant:`ghost`,color:`secondary`,onClick:o,children:`Back to my plan`})]}),e.portal_url&&(0,p.jsxs)(`p`,{className:`mt-2 break-all text-xs text-tertiary`,children:[`Billing address: `,(0,p.jsx)(`span`,{className:`select-all font-mono`,children:e.portal_url})]}),e.fake&&(0,p.jsx)(`p`,{className:`mt-1 text-xs text-tertiary`,children:`Test billing: no real money.`}),i&&(0,p.jsx)(`p`,{role:`alert`,className:`mt-1 text-xs text-danger`,children:i})]})}function z_(){return(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4 text-center`,"data-testid":`fallback`,children:[(0,p.jsx)(`div`,{className:`text-sm font-medium`,children:`The answer is in the text above`}),(0,p.jsx)(`p`,{className:`mt-1 text-sm text-secondary`,children:`Tell Claude “check my app” to scan, or “what is my plan” to see your account.`})]})}function B_({d:e}){let t=e.findings.map(e=>e.ref).join(`, `);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4`,children:[(0,p.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,p.jsx)(x_,{grade:e.grade,score:e.score}),(0,p.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,p.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.project}),(0,p.jsx)(`div`,{className:`mt-1 text-xl font-semibold`,children:g_[e.grade]}),(0,p.jsxs)(`div`,{className:`mt-0.5 text-xs text-tertiary`,children:[e.base?`Branch check against ${e.base}`:`Quick check`,` · `,y_(e.scanned_at),` · your code stayed on this computer`]})]})]}),(0,p.jsx)(`div`,{className:`mt-4 grid grid-cols-4 gap-2`,children:f_.map(t=>(0,p.jsxs)(`div`,{"aria-label":`${e.counts[t]} ${t} findings`,className:`rounded-lg border border-default p-2`,children:[(0,p.jsx)(`div`,{className:`text-xl font-semibold leading-none`,children:e.counts[t]}),(0,p.jsx)(`div`,{className:`mt-1 text-[11px] capitalize text-tertiary`,children:t}),(0,p.jsx)(`div`,{className:`mt-1.5 h-1 rounded-full bg-surface-tertiary`,children:(0,p.jsx)(`div`,{className:`h-full rounded-full ${m_[t]}`,style:{width:`${Math.min(100,e.counts[t]*25)}%`}})})]},t))}),(0,p.jsxs)(`div`,{className:`mt-4 flex flex-wrap gap-2`,children:[e.findings.length>0&&(0,p.jsx)(E,{size:`sm`,color:`primary`,onClick:()=>l_(`Yes, fix these Vibe Fortress findings on a new branch (${t}). Do not open a pull request until I say so.`),children:`Fix these on a branch`}),e.findings.length>0&&(0,p.jsx)(E,{size:`sm`,variant:`outline`,color:`secondary`,onClick:()=>l_(`Yes, run a Vibe Fortress deep review of these findings.`),children:`Deep review`}),(0,p.jsx)(E,{size:`sm`,variant:`ghost`,color:`secondary`,onClick:()=>l_(`What does a Vibe Fortress account give me? Show my plan.`),children:`Get protection`})]})]}),e.findings.length===0?(0,p.jsxs)(`div`,{className:`rounded-xl border border-default bg-surface p-6 text-center`,children:[(0,p.jsx)(`div`,{className:`text-2xl`,"aria-hidden":!0,children:`🛡️`}),(0,p.jsx)(`div`,{className:`mt-1 font-medium`,children:`Nothing urgent found`}),(0,p.jsx)(`div`,{className:`text-sm text-secondary`,children:`This quick check matches known patterns; a deep review reads the code for the rest.`})]}):(0,p.jsx)(`ul`,{className:`space-y-2`,"aria-label":`Findings, worst first`,children:e.findings.map(e=>(0,p.jsx)(`li`,{className:`rounded-xl border border-default bg-surface p-3`,children:(0,p.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,p.jsx)(ae,{color:p_[e.severity],variant:`soft`,size:`sm`,className:`mt-0.5 shrink-0 uppercase`,children:e.severity}),(0,p.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,p.jsxs)(`div`,{className:`break-words text-sm font-medium`,children:[e.title,e.branchNew?` · new on this branch`:``]}),(0,p.jsxs)(`div`,{className:`mt-0.5 break-all text-xs text-tertiary`,children:[(0,p.jsx)(`span`,{className:`font-medium text-secondary`,children:e.ref}),` · `,e.file,e.line?`:${e.line}`:``]}),(0,p.jsx)(`p`,{className:`mt-1.5 break-words text-sm text-secondary`,children:e.reason}),e.review&&e.review.verdict!==`false_positive`&&(0,p.jsxs)(`p`,{className:`mt-1.5 break-words text-xs text-secondary`,children:[(0,p.jsxs)(`span`,{className:`font-medium`,children:[`Deep review: `,e.review.verdict===`confirmed`?`confirmed`:`unsure`,`.`]}),` `,e.review.reason]})]})]})},e.ref))}),e.remaining>0&&(0,p.jsxs)(`p`,{className:`text-center text-xs text-tertiary`,children:[e.remaining,` more: ask Claude “show the rest”.`]})]})}function V_({data:e,setError:t}){let[n,r]=(0,m.useState)(`all`),[i,a]=(0,m.useState)(!1),o=async()=>{try{await d_(e.repo.full_name)}catch(e){t(String(e))}},s=(0,m.useMemo)(()=>e.findings.filter(e=>(i||!v_.includes(e.status))&&(n===`all`||e.severity===n)),[e,n,i]),c=e.findings.filter(e=>v_.includes(e.status)).length;return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4`,children:[(0,p.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,p.jsx)(x_,{grade:e.grade.grade,score:e.grade.score}),(0,p.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[e.repos.length>1?(0,p.jsx)(`select`,{"aria-label":`Repository`,className:`w-full rounded-md border border-default bg-surface px-2 py-1 text-sm font-medium text-default`,value:e.repo.full_name,onChange:e=>d_(e.target.value).catch(e=>t(String(e))),children:e.repos.map(e=>(0,p.jsxs)(`option`,{value:e.full_name,children:[e.full_name,e.grade?` · ${e.grade}`:``]},e.full_name))}):(0,p.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.repo.full_name}),(0,p.jsx)(`div`,{className:`mt-1 text-xl font-semibold`,children:g_[e.grade.grade]}),(0,p.jsxs)(`div`,{className:`mt-0.5 text-xs text-tertiary`,children:[`Last scan `,y_(e.repo.last_scan_at),e.repo.last_scanned_commit?` · ${e.repo.last_scanned_commit.slice(0,7)}`:``]})]})]}),e.progress&&(0,p.jsxs)(`div`,{className:`mt-3`,role:`status`,children:[(0,p.jsxs)(`div`,{className:`mb-1 flex justify-between text-xs text-secondary`,children:[(0,p.jsx)(`span`,{children:`Scan in progress…`}),(0,p.jsxs)(`span`,{children:[e.progress.done,`/`,e.progress.total,` steps`]})]}),(0,p.jsx)(`div`,{className:`h-1.5 overflow-hidden rounded-full bg-surface-tertiary`,children:(0,p.jsx)(`div`,{className:`h-full rounded-full bg-primary-solid transition-all`,style:{width:`${e.progress.done/Math.max(1,e.progress.total)*100}%`}})})]}),(0,p.jsx)(`div`,{className:`mt-4 grid grid-cols-4 gap-2`,children:f_.map(t=>(0,p.jsxs)(`button`,{"aria-pressed":n===t,"aria-label":`${e.grade.counts[t]} ${t} findings`,onClick:()=>r(n===t?`all`:t),className:`rounded-lg border p-2 text-left transition ${n===t?`border-strong bg-surface-secondary`:`border-subtle hover:bg-surface-secondary`}`,children:[(0,p.jsx)(`div`,{className:`text-xl font-semibold leading-none`,children:e.grade.counts[t]}),(0,p.jsx)(`div`,{className:`mt-1 text-[11px] capitalize text-tertiary`,children:t}),(0,p.jsx)(`div`,{className:`mt-1.5 h-1 rounded-full bg-surface-tertiary`,children:(0,p.jsx)(`div`,{className:`h-full rounded-full ${m_[t]}`,style:{width:`${Math.min(100,e.grade.counts[t]*25)}%`}})})]},t))}),(0,p.jsxs)(`div`,{className:`mt-4 flex flex-wrap gap-2`,children:[(0,p.jsx)(E,{size:`sm`,color:`primary`,onClick:()=>l_(`Check again: call start_scan with kind "diff" for ${e.repo.full_name} and review only what changed since the last scan.`),children:`Check again`}),c>0&&(0,p.jsxs)(E,{size:`sm`,variant:`ghost`,color:`secondary`,onClick:()=>a(!i),children:[i?`Hide`:`Show`,` `,c,` closed`]}),n!==`all`&&(0,p.jsx)(E,{size:`sm`,variant:`ghost`,color:`secondary`,onClick:()=>r(`all`),children:`Clear filter`})]}),(0,p.jsx)(M_,{s:e.coverage_summary??null,c:e.scan_coverage??null,v:e.verification??null,nt:e.notices??null,lt:e.local_tools??null}),e.triage&&e.triage.triaged>0&&(0,p.jsxs)(`div`,{className:`mt-3 rounded-xl border border-subtle p-3 text-xs`,"aria-label":`Triage`,children:[e.triage.notice&&(0,p.jsxs)(`p`,{className:`mb-1 font-semibold text-warning`,role:`note`,children:[`Triage kept all `,e.triage.triaged,` findings and was not independent. Treat the verdicts as unchecked.`]}),(0,p.jsx)(`p`,{className:`text-secondary`,children:e.triage.line}),e.dependencies&&(0,p.jsx)(`p`,{className:`mt-1 text-secondary`,children:e.dependencies.line})]}),(e.unconfirmed?.length??0)>0&&(0,p.jsxs)(`p`,{className:`mt-3 text-xs text-warning`,children:[`Not confirmed either way (still open): `,e.unconfirmed.map(e=>`${e.ref} (${e.file}:${e.line})`).join(`, `)]}),(0,p.jsx)(N_,{inv:e.scan_inventory??null,spot:e.spot_checks??null,commit:e.scan?.head_commit}),e.coverage&&(0,p.jsx)(`p`,{className:`mt-3 text-xs text-tertiary`,children:e.coverage}),(0,p.jsx)(`p`,{className:`mt-3 text-xs text-secondary`,children:`Next: the dashboard shows every finding and every file that was not covered. “Check again” re-reads what changed. A fix is opened as a pull request when you ask for one on a finding.`})]}),s.length===0?(0,p.jsxs)(`div`,{className:`rounded-xl border border-default bg-surface p-6 text-center`,children:[(0,p.jsx)(`div`,{className:`text-2xl`,"aria-hidden":!0,children:`🛡️`}),(0,p.jsx)(`div`,{className:`mt-1 font-medium`,children:`Nothing to fix here`}),(0,p.jsx)(`div`,{className:`text-sm text-secondary`,children:n===`all`?`No open findings. Say “check again” after your next changes.`:`No open ${n} findings.`})]}):(0,p.jsx)(`ul`,{className:`space-y-2`,"aria-label":`Findings, worst first`,children:s.map(t=>(0,p.jsx)(S_,{f:t,repo:e.repo.full_name,onChange:o},t.id))}),(e.findings_more??0)>0&&(0,p.jsxs)(`p`,{className:`mt-2 text-xs text-secondary`,children:[`…and `,e.findings_more,` more findings, less severe than these. The dashboard lists all of them.`]})]})}function H_(){let e=new URLSearchParams(location.search),[t,n]=(0,m.useState)(e.has(`local`)?P_:I_[e.get(`link`)??``]??null),[r,i]=(0,m.useState)(null),[a,o]=(0,m.useState)(null),[s,c]=(0,m.useState)(!1);if((0,m.useEffect)(()=>{if(!window.matchMedia)return;let e=window.matchMedia(`(prefers-color-scheme: dark)`),t=()=>{(r_||!document.documentElement.getAttribute(`data-theme`))&&document.documentElement.setAttribute(`data-theme`,e.matches?`dark`:`light`)};return t(),e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]),(0,m.useEffect)(()=>{let r=a_(e=>n(e)),a=e.get(`view`),s={account:`account`,retention:`billing_options`,results:`get_results`};o_().then(async()=>{r_&&!t&&(a&&s[a]?n(await c_(s[a])):await d_()),c(!0)}).catch(e=>{o(String(e)),c(!0)});let l=e=>{i(e.detail),setTimeout(()=>i(null),4e3)};return window.addEventListener(`vf-toast`,l),()=>{r(),window.removeEventListener(`vf-toast`,l)}},[]),a)return(0,p.jsxs)(`div`,{role:`alert`,className:`p-4 text-sm text-danger`,children:[`Something went wrong: `,a]});if(!s)return(0,p.jsx)(`div`,{className:`p-6 text-sm text-tertiary`,role:`status`,children:`Loading Vibe Fortress…`});let l=e=>n(e),u=t?.view;return(0,p.jsxs)(`main`,{className:`mx-auto max-w-2xl space-y-4 p-4 text-default`,"data-view":u??`none`,children:[(0,p.jsxs)(`header`,{className:`flex items-center gap-2 text-primary`,children:[(0,p.jsx)(b_,{}),(0,p.jsx)(`span`,{className:`text-lg font-semibold tracking-tight text-default`,children:`Vibe Fortress`})]}),u===`results`?(0,p.jsx)(V_,{data:t,setError:o}):u===`account`?(0,p.jsx)(k_,{a:t,go:l}):u===`retention`?(0,p.jsx)(R_,{r:t,go:l},JSON.stringify(t.reason)):u===`offer`?(0,p.jsx)(L_,{o:t}):u===`local`?(0,p.jsx)(B_,{d:t}):u===`local-account`?(0,p.jsx)(F_,{a:t}):(0,p.jsx)(z_,{}),r&&(0,p.jsx)(`div`,{role:`status`,className:`fixed inset-x-4 bottom-4 mx-auto max-w-md rounded-xl bg-surface-elevated p-3 text-sm shadow-lg ring-1 ring-[var(--color-border-default)]`,children:r})]})}(0,te.createRoot)(document.getElementById(`root`)).render((0,p.jsx)(m.StrictMode,{children:(0,p.jsx)(g,{linkComponent:`a`,children:(0,p.jsx)(H_,{})})}));</script>
115
+ container holding the app. Specify either width or maxWidth, and either height or maxHeight.`),locale:P().optional().describe(`User's language and region preference in BCP 47 format.`),timeZone:P().optional().describe(`User's timezone in IANA format.`),userAgent:P().optional().describe(`Host application identifier.`),platform:V([W(`web`),W(`desktop`),W(`mobile`)]).optional().describe(`Platform type for responsive design decisions.`),deviceCapabilities:z({touch:I().optional().describe(`Whether the device supports touch input.`),hover:I().optional().describe(`Whether the device supports hover interactions.`)}).optional().describe(`Device input capabilities.`),safeAreaInsets:z({top:F().describe(`Top safe area inset in pixels.`),right:F().describe(`Right safe area inset in pixels.`),bottom:F().describe(`Bottom safe area inset in pixels.`),left:F().describe(`Left safe area inset in pixels.`)}).optional().describe(`Mobile safe area boundaries in pixels.`)}).passthrough(),Jg=z({method:W(`ui/notifications/host-context-changed`),params:qg.describe(`Partial context update containing only changed fields.`)});z({method:W(`ui/update-model-context`),params:z({content:R(Wd).optional().describe(`Context content blocks (text, image, etc.).`),structuredContent:H(P(),L().describe(`Structured content for machine-readable context data.`)).optional().describe(`Structured content for machine-readable context data.`)})}),z({method:W(`ui/initialize`),params:z({appInfo:Vu.describe(`App identification (name and version).`),appCapabilities:Ug.describe(`Features and capabilities this app provides.`),protocolVersion:P().describe(`Protocol version this app supports.`)})});var Yg=z({protocolVersion:P().describe(`Negotiated protocol version string (e.g., "2025-11-21").`),hostInfo:Vu.describe(`Host application identification and version.`),hostCapabilities:Hg.describe(`Features and capabilities provided by the host.`),hostContext:qg.describe(`Rich context about the host environment.`)}).passthrough(),Xg={target:`draft-2020-12`};async function Zg(e,t){let n=e[`~standard`];if(n.jsonSchema)return n.jsonSchema[t](Xg);throw Error(`Schema (vendor: ${n.vendor}) does not implement Standard JSON Schema (~standard.jsonSchema). Use a library that does (zod v4, ArkType, Valibot) or wrap your schema accordingly.`)}async function Qg(e,t,n=``){let r=await e[`~standard`].validate(t);if(r.issues){let e=r.issues.map(e=>{let t=e.path?.map(e=>typeof e==`object`?e.key:e).join(`.`);return t?`${t}: ${e.message}`:e.message}).join(`; `);throw Error(n+e)}return r.value}function $g(e,t){let n={...e,...t};return t.experimental!==void 0&&(n.experimental={...e.experimental,...t.experimental}),t.tools!==void 0&&(n.tools={...e.tools,...t.tools}),n}var e_=class e extends eg{_appInfo;_appCapabilities;options;_hostCapabilities;_hostInfo;_hostContext;_registeredTools={};_initializedSent=!1;_registeredEvents=new Set;_events=new yg;_methods=new bg;setRequestHandler=(...e)=>{let[t,...n]=Sg(`request`,e)??e;this._methods.claim(t,`setRequestHandler`),super.setRequestHandler.call(this,t,...n)};setNotificationHandler=(...e)=>{let[t,...n]=Sg(`notification`,e)??e;this._methods.claim(t,`setNotificationHandler`),super.setNotificationHandler.call(this,t,...n)};removeRequestHandler=e=>{this._methods.release(e),super.removeRequestHandler(e)};removeNotificationHandler=e=>{this._methods.release(e),super.removeNotificationHandler(e)};replaceRequestHandler=(e,...t)=>{this._methods.replace(e),super.setRequestHandler.call(this,e,...t)};_assertInitialized(e){if(this._initializedSent)return;let t=`[ext-apps] App.${e}() called before connect() completed the ui/initialize handshake. Await app.connect() before calling this method, or move data loading to an ontoolresult handler.`;if(this.options?.strict)throw Error(t);console.warn(`${t}. This will throw in a future release.`)}eventSchemas={toolinput:Pg,toolinputpartial:Fg,toolresult:Kg,toolcancelled:Ig,hostcontextchanged:Jg};static ONE_SHOT_EVENTS=new Set([`toolinput`,`toolinputpartial`,`toolresult`,`toolcancelled`]);_everHadListener=new Set;_assertHandlerTiming(t){if(!e.ONE_SHOT_EVENTS.has(t)||this._everHadListener.has(t)||(this._everHadListener.add(t),!this._initializedSent))return;let n=`[ext-apps] "${String(t)}" handler registered after connect() completed the ui/initialize handshake. The host may have already sent this notification. Register handlers before calling app.connect().`;if(this.options?.strict)throw Error(n);console.warn(n)}setEventHandler(e,t){t&&this._assertHandlerTiming(e),this._ensureEventSlot(e),this._events.setHandler(e,t)}addEventListener(e,t){this._assertHandlerTiming(e),this._ensureEventSlot(e),this._events.addEventListener(e,t)}removeEventListener(e,t){this._events.removeEventListener(e,t)}_ensureEventSlot(e){if(this._registeredEvents.has(e))return;let t=this.eventSchemas[e];if(!t)throw Error(`Unknown event: ${String(e)}`);this.setNotificationHandler(t.shape.method.value,{params:t.shape.params},t=>{let n=t;e===`hostcontextchanged`&&(this._hostContext={...this._hostContext,...n}),this._events.dispatch(e,n)}),this._registeredEvents.add(e)}getEventHandler(e){return this._events.getHandler(e)}warnIfRequestHandlerReplaced(e,t,n){t&&n&&console.warn(`[MCP Apps] ${e} handler replaced. Previous handler will no longer be called.`)}constructor(e,t={},n={autoResize:!0}){super(n),this._appInfo=e,this._appCapabilities=t,this.options=n,this._methods.replace(`notifications/cancelled`),this._methods.replace(`notifications/progress`),n.allowUnsafeEval||nn({jitless:!0}),this.replaceRequestHandler(`ping`,e=>(console.log(`Received ping:`,e.params),{})),this.setEventHandler(`hostcontextchanged`,void 0)}buildContext(e){return e}registerAppCapabilities(e){if(this.transport)throw Error(`Cannot register capabilities after transport is established`);this._appCapabilities=$g(this._appCapabilities,e)}registerTool(e,t,n){if(this._registeredTools[e])throw Error(`Tool ${e} is already registered`);let r=this,i=()=>{r._initializedSent&&r._appCapabilities.tools?.listChanged&&r.sendToolListChanged()},a=t.inputSchema!==void 0,o={title:t.title,description:t.description,inputSchema:t.inputSchema,outputSchema:t.outputSchema,annotations:t.annotations,_meta:t._meta,enabled:!0,enable(){this.enabled=!0,i()},disable(){this.enabled=!1,i()},update(e){Object.assign(this,e),i()},remove(){r._registeredTools[e]===o&&(delete r._registeredTools[e],i())},handler:async(t,r)=>{if(!o.enabled)throw Error(`Tool ${e} is disabled`);let i;if(a){let a=o.inputSchema;i=await n(a?await Qg(a,t??{},`Invalid input for tool ${e}: `):t??{},r)}else i=await n(r);return o.outputSchema&&!i.isError&&(i.structuredContent=await Qg(o.outputSchema,i.structuredContent,`Invalid output for tool ${e}: `)),i}};return this._registeredTools[e]=o,!this._appCapabilities.tools&&!this.transport&&this.registerAppCapabilities({tools:{listChanged:!0}}),this.ensureToolHandlersInitialized(),i(),o}_toolHandlersInitialized=!1;ensureToolHandlersInitialized(){this._toolHandlersInitialized||(this._toolHandlersInitialized=!0,this.oncalltool=async(e,t)=>{let n=this._registeredTools[e.name];if(!n)throw Error(`Tool ${e.name} not found`);return n.handler(e.arguments,t)},this.onlisttools=async(e,t)=>({tools:await Promise.all(Object.entries(this._registeredTools).filter(([e,t])=>t.enabled).map(async([e,t])=>{let n={name:e,title:t.title,description:t.description,inputSchema:t.inputSchema?await Zg(t.inputSchema,`input`):{type:`object`,properties:{}}};return t.outputSchema&&(n.outputSchema=await Zg(t.outputSchema,`output`)),t.annotations&&(n.annotations=t.annotations),t._meta&&(n._meta=t._meta),n}))}))}async sendToolListChanged(e={}){this._assertInitialized(`sendToolListChanged`),await this.notification({method:`notifications/tools/list_changed`,params:e})}getHostCapabilities(){return this._hostCapabilities}getHostVersion(){return this._hostInfo}getHostContext(){return this._hostContext}get ontoolinput(){return this.getEventHandler(`toolinput`)}set ontoolinput(e){this.setEventHandler(`toolinput`,e)}get ontoolinputpartial(){return this.getEventHandler(`toolinputpartial`)}set ontoolinputpartial(e){this.setEventHandler(`toolinputpartial`,e)}get ontoolresult(){return this.getEventHandler(`toolresult`)}set ontoolresult(e){this.setEventHandler(`toolresult`,e)}get ontoolcancelled(){return this.getEventHandler(`toolcancelled`)}set ontoolcancelled(e){this.setEventHandler(`toolcancelled`,e)}get onhostcontextchanged(){return this.getEventHandler(`hostcontextchanged`)}set onhostcontextchanged(e){this.setEventHandler(`hostcontextchanged`,e)}_onteardown;get onteardown(){return this._onteardown}set onteardown(e){this.warnIfRequestHandlerReplaced(`onteardown`,this._onteardown,e),this._onteardown=e,this.replaceRequestHandler(`ui/resource-teardown`,{params:zg.shape.params,result:Bg},(e,t)=>{if(!this._onteardown)throw Error(`No onteardown handler set`);return this._onteardown(e,t)})}_oncalltool;get oncalltool(){return this._oncalltool}set oncalltool(e){this.warnIfRequestHandlerReplaced(`oncalltool`,this._oncalltool,e),this._oncalltool=e,this.replaceRequestHandler(`tools/call`,(e,t)=>{if(!this._oncalltool)throw Error(`No oncalltool handler set`);return this._oncalltool(e.params,t)})}_onlisttools;get onlisttools(){return this._onlisttools}set onlisttools(e){this.warnIfRequestHandlerReplaced(`onlisttools`,this._onlisttools,e),this._onlisttools=e,this.replaceRequestHandler(`tools/list`,(e,t)=>{if(!this._onlisttools)throw Error(`No onlisttools handler set`);return this._onlisttools(e.params,t)})}assertCapabilityForMethod(e){if(e===`sampling/createMessage`&&!this._hostCapabilities?.sampling)throw Error(`Host does not support sampling (required for ${e})`)}assertRequestHandlerCapability(e){switch(e){case`tools/call`:case`tools/list`:if(!this._appCapabilities.tools)throw Error(`Client does not support tool capability (required for ${e})`);return;default:return}}assertNotificationCapability(e){}async callServerTool(e,t){if(this._assertInitialized(`callServerTool`),typeof e==`string`)throw Error(`callServerTool() expects an object as its first argument, but received a string ("${e}"). Did you mean: callServerTool({ name: "${e}", arguments: { ... } })?`);return await this.request({method:`tools/call`,params:e},{onprogress:()=>{},resetTimeoutOnProgress:!0,...t})}async readServerResource(e,t){return this._assertInitialized(`readServerResource`),await this.request({method:`resources/read`,params:e},t)}async listServerResources(e,t){return this._assertInitialized(`listServerResources`),await this.request({method:`resources/list`,params:e},t)}async createSamplingMessage(e,t){return this._assertInitialized(`createSamplingMessage`),await this.request({method:`sampling/createMessage`,params:e},t)}sendMessage(e,t){return this._assertInitialized(`sendMessage`),this.request({method:`ui/message`,params:e},jg,t)}sendLog(e){return this.notification({method:`notifications/message`,params:e})}updateModelContext(e,t){return this._assertInitialized(`updateModelContext`),this.request({method:`ui/update-model-context`,params:e},Fu,t)}openLink(e,t){return this._assertInitialized(`openLink`),this.request({method:`ui/open-link`,params:e},kg,t)}sendOpenLink=this.openLink;downloadFile(e,t){return this._assertInitialized(`downloadFile`),this.request({method:`ui/download-file`,params:e},Ag,t)}requestTeardown(e={}){return this.notification({method:`ui/notifications/request-teardown`,params:e})}requestDisplayMode(e,t){return this._assertInitialized(`requestDisplayMode`),this.request({method:`ui/request-display-mode`,params:e},Wg,t)}sendSizeChanged(e){return this.notification({method:`ui/notifications/size-changed`,params:e})}setupSizeChangedNotifications(){let e=!1,t=0,n=0,r=()=>{e||(e=!0,requestAnimationFrame(()=>{e=!1;let r=document.documentElement,i=r.style.height;r.style.height=`max-content`;let a=Math.ceil(r.getBoundingClientRect().height);r.style.height=i;let o=Math.ceil(window.innerWidth);(o!==t||a!==n)&&(t=o,n=a,this.sendSizeChanged({width:o,height:a}))}))};r();let i=new ResizeObserver(r);return i.observe(document.documentElement),i.observe(document.body),()=>i.disconnect()}async connect(e=new Tg(window.parent,window.parent),t){if(this.transport)throw Error(`App is already connected. Call close() before connecting again.`);this._initializedSent=!1;try{await super.connect(e);let n=await this.request({method:`ui/initialize`,params:{appCapabilities:this._appCapabilities,appInfo:this._appInfo,protocolVersion:wg}},Yg,t);if(n===void 0)throw Error(`Server sent invalid initialize result: ${n}`);this._hostCapabilities=n.hostCapabilities,this._hostInfo=n.hostInfo,this._hostContext=n.hostContext,await this.notification({method:`ui/notifications/initialized`}),this._initializedSent=!0,this.options?.autoResize&&this.setupSizeChangedNotifications()}catch(e){throw this.close(),e}}},t_=null,n_=new Set,r_=window.parent===window,i_=e=>e?.view&&n_.forEach(t=>t(e));function a_(e){return n_.add(e),()=>n_.delete(e)}async function o_(){if(r_)return;t_=new e_({name:`vibefortress-panel`,version:`0.1.0`},{}),t_.ontoolresult=e=>i_(e.structuredContent),t_.onhostcontextchanged=e=>{e.theme&&document.documentElement.setAttribute(`data-theme`,e.theme)},await t_.connect();let e=t_.getHostContext()?.theme;e&&document.documentElement.setAttribute(`data-theme`,e)}async function s_(e,t){return(await(await fetch(`/mcp`,{method:`POST`,headers:{"content-type":`application/json`,accept:`application/json, text/event-stream`,authorization:`Bearer vf_dev_token`},body:JSON.stringify({jsonrpc:`2.0`,id:1,method:`tools/call`,params:{name:e,arguments:t}})})).json()).result}async function c_(e,t={}){let n=r_?await s_(e,t):await t_.callServerTool({name:e,arguments:t});if(n?.isError)throw Error(n.content?.[0]?.text??`Request failed`);return n?.structuredContent}async function l_(e){r_?window.dispatchEvent(new CustomEvent(`vf-toast`,{detail:`Would ask Claude: “${e}”`})):await t_.sendMessage({role:`user`,content:[{type:`text`,text:e}]})}function u_(e){r_||!t_?window.open(e,`_blank`,`noopener`):t_.openLink({url:e})}async function d_(e){let t=await c_(`get_results`,e?{repo:e}:{});return i_(t),t}var f_=[`critical`,`high`,`medium`,`low`],p_={critical:`danger`,high:`warning`,medium:`info`,low:`secondary`},m_={critical:`bg-danger-solid`,high:`bg-warning-solid`,medium:`bg-info-solid`,low:`bg-secondary-solid`},h_={A:`#16a34a`,B:`#65a30d`,C:`#ca8a04`,D:`#ea580c`,F:`#dc2626`},g_={A:`Looking solid`,B:`Pretty good`,C:`Needs work`,D:`Risky`,F:`Not safe to launch`},__={open:`Open`,fix_proposed:`Fix proposed`,fixed:`Fixed`,false_positive:`False positive`,accepted_risk:`Accepted risk`},v_=[`fixed`,`false_positive`,`accepted_risk`],y_=e=>{if(!e)return`never`;let t=Math.round((Date.now()-new Date(e).getTime())/6e4);return t<1?`just now`:t<60?`${t} min ago`:t<1440?`${Math.round(t/60)} h ago`:`${Math.round(t/1440)} d ago`};function b_(){return(0,p.jsxs)(`svg`,{width:`22`,height:`22`,viewBox:`0 0 24 24`,fill:`none`,"aria-hidden":`true`,children:[(0,p.jsx)(`path`,{d:`M12 2.5 4.5 5.4v5.6c0 4.5 3 8.3 7.5 10.5 4.5-2.2 7.5-6 7.5-10.5V5.4L12 2.5Z`,fill:`currentColor`,opacity:`.15`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinejoin:`round`}),(0,p.jsx)(`path`,{d:`m8.8 11.9 2.2 2.2 4.3-4.5`,stroke:`currentColor`,strokeWidth:`1.9`,strokeLinecap:`round`,strokeLinejoin:`round`})]})}function x_({grade:e,score:t}){let n=2*Math.PI*38;return(0,p.jsxs)(`div`,{className:`relative size-[104px] shrink-0`,role:`img`,"aria-label":`Security grade ${e}, score ${t} out of 100`,children:[(0,p.jsxs)(`svg`,{viewBox:`0 0 96 96`,className:`size-full -rotate-90`,children:[(0,p.jsx)(`circle`,{cx:`48`,cy:`48`,r:38,fill:`none`,strokeWidth:`8`,className:`stroke-[var(--color-border-subtle)]`}),(0,p.jsx)(`circle`,{cx:`48`,cy:`48`,r:38,fill:`none`,strokeWidth:`8`,strokeLinecap:`round`,stroke:h_[e],strokeDasharray:n,strokeDashoffset:n*(1-t/100),style:{transition:`stroke-dashoffset .6s ease`}})]}),(0,p.jsxs)(`div`,{className:`absolute inset-0 flex flex-col items-center justify-center`,children:[(0,p.jsx)(`span`,{className:`text-4xl font-semibold leading-none`,style:{color:h_[e]},children:e}),(0,p.jsxs)(`span`,{className:`mt-1 text-xs text-tertiary`,children:[t,`/100`]})]})]})}function S_({f:e,repo:t,onChange:n}){let[r,i]=(0,m.useState)(!1),[a,o]=(0,m.useState)(!1),[s,c]=(0,m.useState)(null),l=v_.includes(e.status),u=async t=>{o(!0),c(null);try{await c_(`update_finding`,{finding_id:e.id,status:t}),await n()}catch(e){c(e.message)}finally{o(!1)}};return(0,p.jsxs)(`li`,{className:`rounded-xl border border-default bg-surface ${l?`opacity-60`:``}`,children:[(0,p.jsxs)(`button`,{className:`flex w-full items-start gap-3 p-3 text-left`,"aria-expanded":r,onClick:()=>i(!r),children:[(0,p.jsx)(ae,{color:p_[e.severity],variant:`soft`,size:`sm`,className:`mt-0.5 shrink-0 uppercase`,children:e.severity}),(0,p.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,p.jsx)(`span`,{className:`block break-words text-sm font-medium text-default`,children:e.title}),(0,p.jsxs)(`span`,{className:`mt-0.5 block truncate text-xs text-tertiary`,children:[(0,p.jsx)(`span`,{className:`font-medium text-secondary`,children:e.ref}),` · `,e.file,`:`,e.line]})]}),e.status!==`open`&&(0,p.jsx)(ae,{color:e.status===`fixed`?`success`:`secondary`,variant:`outline`,size:`sm`,className:`shrink-0`,children:__[e.status]}),(0,p.jsx)(`span`,{"aria-hidden":!0,className:`mt-1 text-tertiary transition-transform ${r?`rotate-90`:``}`,children:`›`})]}),r&&(0,p.jsxs)(`div`,{className:`space-y-3 border-t border-subtle p-3 text-sm`,children:[(0,p.jsxs)(`section`,{children:[(0,p.jsx)(`h4`,{className:`mb-1 text-xs font-semibold uppercase tracking-wide text-tertiary`,children:`What’s wrong`}),(0,p.jsx)(`p`,{className:`break-words text-secondary`,children:e.explanation})]}),(0,p.jsxs)(`section`,{children:[(0,p.jsx)(`h4`,{className:`mb-1 text-xs font-semibold uppercase tracking-wide text-tertiary`,children:`What an attacker could do`}),(0,p.jsx)(`p`,{className:`break-words text-secondary`,children:e.attack_scenario})]}),e.excerpt&&(0,p.jsx)(`pre`,{className:`overflow-x-auto rounded-lg bg-surface-secondary p-3 text-xs text-default`,children:(0,p.jsx)(`code`,{children:e.excerpt})}),(0,p.jsxs)(`section`,{children:[(0,p.jsx)(`h4`,{className:`mb-1 text-xs font-semibold uppercase tracking-wide text-tertiary`,children:`How to fix`}),(0,p.jsx)(`p`,{className:`break-words text-secondary`,children:e.fix_guidance})]}),(0,p.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:[e.owasp,e.cwe,e.rule_id,`${e.confidence} confidence`,...e.review_label?[e.review_label]:[]].map(e=>(0,p.jsx)(ae,{variant:`outline`,color:`secondary`,size:`sm`,children:e},e))}),e.counter_check&&(0,p.jsxs)(`p`,{className:`break-words text-xs text-tertiary`,children:[`Counter-check, as reported by the agent: `,e.counter_check.claim,` (`,e.counter_check.file,`:`,e.counter_check.line,`)`]}),s&&(0,p.jsx)(`p`,{role:`alert`,className:`text-xs text-danger`,children:s}),(0,p.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 pt-1`,children:[e.status===`open`&&(0,p.jsx)(E,{color:`primary`,size:`sm`,onClick:()=>l_(`Fix Vibe Fortress finding ${e.ref} ("${e.title}") in ${t}: call start_scan with repo "${t}", kind "fix" and finding_id "${e.ref}", follow its instructions, and open a pull request on a new branch (never push to main).`),children:`Fix this`}),e.pr_url&&(0,p.jsx)(E,{variant:`outline`,color:`secondary`,size:`sm`,onClick:()=>u_(e.pr_url),children:`View pull request`}),e.status===`open`&&(0,p.jsx)(E,{variant:`ghost`,color:`secondary`,size:`sm`,disabled:a,onClick:()=>u(`false_positive`),children:`False positive`}),e.status===`open`&&(0,p.jsx)(E,{variant:`ghost`,color:`secondary`,size:`sm`,disabled:a,onClick:()=>u(`accepted_risk`),children:`Accept risk`}),(e.status===`false_positive`||e.status===`accepted_risk`)&&(0,p.jsx)(E,{variant:`ghost`,color:`secondary`,size:`sm`,disabled:a,onClick:()=>u(`open`),children:`Reopen`})]})]})]})}function C_({label:e,used:t,max:n}){let r=n<0?8:Math.min(100,t/Math.max(1,n)*100);return(0,p.jsxs)(`div`,{children:[(0,p.jsxs)(`div`,{className:`mb-1 flex justify-between text-sm`,children:[(0,p.jsx)(`span`,{className:`text-secondary`,children:e}),(0,p.jsxs)(`span`,{className:`text-default`,children:[t,` / `,n<0?`unlimited`:n]})]}),(0,p.jsx)(`div`,{className:`h-2 overflow-hidden rounded-full bg-surface-tertiary`,role:`progressbar`,"aria-label":e,"aria-valuenow":t,"aria-valuemin":0,"aria-valuemax":n<0?void 0:n,children:(0,p.jsx)(`div`,{className:`h-full rounded-full bg-primary-solid`,style:{width:`${r}%`}})})]})}var w_=e=>{let t=e.entitlement,n=e=>e?e.slice(0,10):``;return t.source===`trial`?`Free trial: ${t.trial_days_left} day${t.trial_days_left===1?``:`s`} left (ends ${n(t.trial_ends_at)}). No card needed.`:t.source===`subscription`?t.subscription?.cancelling?`Cancelled: you keep Pro until ${n(t.subscription.paid_through)}.`:t.subscription?.payment_issue?`The last payment failed: update your card in billing.`:`Pro${t.subscription?.interval===`year`?`, annual`:t.subscription?.interval===`month`?`, monthly`:``}${t.subscription?.paid_through?`, paid through ${n(t.subscription.paid_through)}`:``}.`:t.trial_ends_at?`Free. Your trial ended ${n(t.trial_ends_at)}.`:`Free plan.`},T_=e=>e<0?`Unlimited`:String(e);function E_({yes:e,label:t}){return(0,p.jsxs)(`span`,{className:`inline-flex items-center gap-1 ${e?`text-success`:`text-danger`}`,children:[(0,p.jsx)(`span`,{"aria-hidden":!0,className:`font-semibold`,children:e?`✓`:`✗`}),t?(0,p.jsx)(`span`,{className:`text-default`,children:t}):null,(0,p.jsxs)(`span`,{className:`sr-only`,children:[e?`Included`:`Not included`,t?`: ${t}`:``]})]})}var D_=[{label:`Projects`,cell:e=>({yes:e.repos!==0,label:T_(e.repos)})},{label:`Deep scans a month`,cell:e=>({yes:e.deepScans!==0,label:e.deepScans===0?void 0:T_(e.deepScans)})},{label:`Check-again scans a month`,cell:e=>({yes:e.diffScans!==0,label:e.diffScans===0?void 0:T_(e.diffScans)})},{label:`Fix pull requests a month`,cell:e=>({yes:e.fixPrs!==0,label:e.fixPrs===0?void 0:T_(e.fixPrs)})},{label:`Live config checks`,cell:e=>({yes:e.liveChecks})},{label:`Team workspaces`,cell:e=>({yes:e.team})},{label:`README badge`,cell:e=>({yes:e.badge})}];function O_({a:e}){if(!e.plans)return null;let t=[[`free`,`Free`],[`pro`,`Pro`]],n=e.entitlement.source===`trial`;return(0,p.jsx)(`div`,{className:`overflow-hidden rounded-xl border border-default bg-surface`,"data-testid":`plan-compare`,children:(0,p.jsxs)(`table`,{className:`w-full table-fixed border-collapse text-sm`,children:[(0,p.jsx)(`caption`,{className:`sr-only`,children:`Free compared with Pro`}),(0,p.jsx)(`thead`,{children:(0,p.jsxs)(`tr`,{children:[(0,p.jsx)(`th`,{scope:`col`,className:`w-[44%] p-2 text-left text-xs font-medium text-tertiary`,children:(0,p.jsx)(`span`,{className:`sr-only`,children:`Feature`})}),t.map(([t,r])=>(0,p.jsxs)(`th`,{scope:`col`,"data-current":e.plan===t,className:`p-2 text-left font-semibold ${e.plan===t?`bg-primary-surface text-default`:`text-secondary`}`,children:[r,e.plan===t&&(0,p.jsxs)(`span`,{className:`mt-0.5 block text-[11px] font-medium text-primary`,children:[`Your plan`,n?` (trial)`:``]})]},t))]})}),(0,p.jsx)(`tbody`,{children:D_.map(n=>(0,p.jsxs)(`tr`,{className:`border-t border-subtle`,children:[(0,p.jsx)(`th`,{scope:`row`,className:`p-2 text-left text-xs font-normal text-secondary`,children:n.label}),t.map(([t])=>{let r=n.cell(e.plans[t]);return(0,p.jsx)(`td`,{className:`p-2 align-top ${e.plan===t?`bg-primary-surface`:``}`,children:(0,p.jsx)(E_,{yes:r.yes,label:r.label})},t)})]},n.label))})]})})}function k_({a:e,go:t}){let n=e.badge??null,[r,i]=(0,m.useState)(!1),[a,o]=(0,m.useState)(null),s=async()=>{i(!0),o(null);try{t(await c_(`billing_options`))}catch(e){o(e.message)}finally{i(!1)}},c=n?`[![Scanned by Vibe Fortress](${n.image})](${n.page})`:null;return(0,p.jsxs)(`div`,{className:`space-y-4`,children:[(0,p.jsxs)(`div`,{className:`rounded-xl border border-default bg-surface p-4`,children:[(0,p.jsxs)(`div`,{className:`mb-3 flex items-center justify-between`,children:[(0,p.jsx)(`div`,{className:`font-medium text-default`,children:`Your plan`}),(0,p.jsx)(ae,{color:e.plan===`pro`?`success`:`secondary`,variant:`soft`,children:e.entitlement.source===`trial`?`Pro trial`:e.plan===`pro`?`Pro`:`Free`})]}),(0,p.jsx)(`p`,{className:`mb-3 text-sm text-secondary`,children:w_(e)}),(0,p.jsxs)(`div`,{className:`space-y-3`,children:[(0,p.jsx)(C_,{label:`Repos`,used:e.usage.repos,max:e.limits.repos}),(0,p.jsx)(C_,{label:`Deep scans this month`,used:e.usage.deep,max:e.limits.deepScans}),(0,p.jsx)(C_,{label:`Check-again scans this month`,used:e.usage.diff,max:e.limits.diffScans}),(0,p.jsx)(C_,{label:`Fix pull requests this month`,used:e.usage.fix,max:e.limits.fixPrs})]}),(0,p.jsxs)(`p`,{className:`mt-3 text-xs text-tertiary`,children:[`Monthly counts start again on `,e.resets_at.slice(0,10),`.`]})]}),(0,p.jsx)(O_,{a:e}),e.upgrade_url?(0,p.jsxs)(`div`,{className:`rounded-xl border border-primary-surface bg-primary-surface p-4`,children:[(0,p.jsxs)(`h3`,{className:`font-medium text-default`,children:[`Vibe Fortress Pro, €`,e.price_eur.month,`/month or €`,e.price_eur.year,`/year`]}),(0,p.jsx)(`p`,{className:`mt-1 text-sm text-secondary`,children:`Cancel anytime. VAT added where it applies.`}),(0,p.jsxs)(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:[(0,p.jsx)(E,{color:`primary`,onClick:()=>u_(e.upgrade_url_month??e.upgrade_url),children:e.entitlement.source===`trial`?`Keep Pro, monthly`:`Upgrade, monthly`}),e.upgrade_url_year?(0,p.jsx)(E,{variant:`outline`,color:`secondary`,onClick:()=>u_(e.upgrade_url_year),children:`Annual, save €${e.price_eur.month*12-e.price_eur.year}`}):null]})]}):e.portal_url?(0,p.jsxs)(`div`,{children:[(0,p.jsx)(E,{variant:`outline`,color:`secondary`,disabled:r,onClick:s,children:`Manage billing`}),a&&(0,p.jsx)(`p`,{role:`alert`,className:`mt-1 text-xs text-danger`,children:a}),(0,p.jsx)(`p`,{className:`mt-1 text-xs text-tertiary`,children:`Billing opens in your browser. Cancel anytime.`})]}):null,e.live_checks&&(0,p.jsxs)(`details`,{className:`rounded-xl border border-default bg-surface p-4`,"data-testid":`live-connections`,children:[(0,p.jsxs)(`summary`,{className:`flex cursor-pointer items-center justify-between gap-2`,children:[(0,p.jsx)(`span`,{className:`text-sm font-medium`,children:`See what is included in live config checks`}),(0,p.jsx)(ae,{color:e.live_checks.included?`success`:`secondary`,variant:`soft`,children:e.live_checks.included?`In your plan`:`Trial and Pro`})]}),(0,p.jsx)(`p`,{className:`my-2 text-sm text-secondary`,children:`Your own Claude reads the real settings of your services, read-only, through connectors you already have. Connect these:`}),(0,p.jsx)(`ul`,{className:`space-y-2 text-sm`,children:e.live_checks.connections.map(e=>(0,p.jsxs)(`li`,{children:[(0,p.jsx)(`b`,{className:`text-default`,children:e.label}),` `,(0,p.jsxs)(`span`,{className:`text-tertiary`,children:[`via `,e.connectors.join(` or `)]}),(0,p.jsx)(`div`,{className:`text-secondary`,children:e.access})]},e.service))}),(0,p.jsx)(`p`,{className:`mt-2 text-xs text-tertiary`,children:`Never paste a token into chat, and never let Claude run a call that can change something.`})]}),c&&(0,p.jsxs)(`div`,{className:`rounded-xl border border-default bg-surface p-4`,children:[(0,p.jsx)(`h3`,{className:`mb-2 text-sm font-medium`,children:`README badge`}),(0,p.jsx)(`pre`,{className:`overflow-x-auto rounded-lg bg-surface-secondary p-2 text-xs`,children:(0,p.jsx)(`code`,{children:c})}),(0,p.jsx)(E,{className:`mt-2`,size:`sm`,variant:`outline`,color:`secondary`,onClick:()=>navigator.clipboard?.writeText(c),children:`Copy markdown`})]}),(0,p.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,p.jsx)(E,{size:`sm`,variant:`ghost`,color:`secondary`,onClick:()=>u_(e.export_url),children:`Export my data`}),(0,p.jsx)(E,{size:`sm`,variant:`ghost`,color:`danger`,onClick:()=>u_(e.delete_url),children:`Delete my account`}),(0,p.jsx)(E,{size:`sm`,variant:`ghost`,color:`secondary`,onClick:()=>u_(e.privacy_url),children:`Privacy`})]}),(0,p.jsx)(`p`,{className:`text-xs text-tertiary`,children:`Secrets and dependency alerts stay free on every plan, with no account. Vibe Fortress never stores your source code.`})]})}var A_={gitleaks:`Secret search`,opengrep:`Code rules`,"vibefort-config":`Configuration checks`};function j_({lt:e}){if(!e)return null;if(!e.used||!e.facts)return(0,p.jsxs)(`div`,{className:`mt-3 rounded-lg border border-subtle bg-surface-secondary p-2 text-xs`,role:`note`,"data-testid":`local-tools`,children:[(0,p.jsx)(`span`,{className:`font-semibold text-warning`,children:`Without local tools, lower confidence.`}),` The file list, the package list and the search for secrets rest on what the agent reported. Run the scan where the project is checked out to use the local tools.`]});let t=e.facts;return(0,p.jsxs)(`div`,{className:`mt-3 rounded-lg border border-subtle p-2 text-xs`,role:`note`,"data-testid":`local-tools`,children:[(0,p.jsxs)(`div`,{children:[(0,p.jsx)(`span`,{className:`font-semibold`,children:`Local tools ran on your machine`}),` `,(0,p.jsxs)(`span`,{className:`text-secondary`,children:[`at commit `,t.commit.slice(0,7)]})]}),(0,p.jsxs)(`ul`,{className:`mt-1 flex flex-col gap-0.5 text-secondary`,children:[(0,p.jsxs)(`li`,{children:[`File list from git: `,t.files.toLocaleString(`en-US`),` files, `,t.review.toLocaleString(`en-US`),` need review`,t.github===`agrees`?`; agrees with GitHub`:(t.github,``)]}),t.github===`differs`&&(0,p.jsxs)(`li`,{className:`text-warning`,children:[`The file list differs from GitHub's for this commit in `,t.github_diff,` file(s).`]}),(0,p.jsxs)(`li`,{children:[`Packages from the lockfile: `,t.packages.toLocaleString(`en-US`)]}),t.tools.map(e=>(0,p.jsxs)(`li`,{className:e.status===`ok`?``:`text-warning`,children:[A_[e.tool]??e.tool,`: `,e.status===`ok`?`ran${e.version?` (${e.tool===`vibefort-config`?`rules`:e.tool} ${e.version})`:``}`:`NOT run${e.reason?`: ${e.reason}`:``}`]},e.tool)),e.tool_findings>0&&(0,p.jsxs)(`li`,{children:[e.tool_findings,` finding`,e.tool_findings===1?``:`s`,` came from these tools`]}),t.dirty_files>0&&(0,p.jsxs)(`li`,{className:`text-warning`,children:[t.dirty_files,` tracked file(s) differed from the commit when the tools ran.`]}),e.proof_line&&(0,p.jsx)(`li`,{"data-testid":`proof-line`,className:e.proof?.state===`checked`&&!(e.proof.counts.no_match+e.proof.counts.no_line+e.proof.counts.no_file)?``:`text-warning`,children:e.proof_line}),(e.outside_review??0)>0&&(0,p.jsxs)(`li`,{"data-testid":`outside-review`,children:[e.outside_review,` tool result`,e.outside_review===1?` is`:`s are`,` in test, fixture or vendored code: shown at low, not triaged`]}),e.stable_line&&(0,p.jsx)(`li`,{"data-testid":`stable-line`,children:e.stable_line})]})]})}function M_({s:e,c:t,v:n,nt:r,lt:i}){if(!e)return null;let a=e.mode===`check-again`?`reviewable changed files`:`reviewable files`,o=e.percent!==null&&e.percent<50;return(0,p.jsxs)(`div`,{className:`mt-4 rounded-xl border border-subtle p-3`,"aria-label":`Scan coverage`,children:[(0,p.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2 text-sm`,children:[(0,p.jsx)(`span`,{className:`font-medium`,children:`Coverage`}),(0,p.jsx)(`span`,{className:o?`font-semibold text-warning`:`font-semibold`,children:e.recorded?e.percent===null?`n/a`:`${e.percent}%`:`not recorded`})]}),e.recorded?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`div`,{className:`mt-1 text-sm`,children:[`Reviewed `,(0,p.jsx)(`span`,{className:`font-semibold`,children:e.reviewed.toLocaleString(`en-US`)}),` of `,(0,p.jsx)(`span`,{className:`font-semibold`,children:e.reviewable.toLocaleString(`en-US`)}),` `,a]}),e.percent!==null&&(0,p.jsx)(`div`,{className:`mt-2 h-1.5 overflow-hidden rounded-full bg-surface-tertiary`,role:`img`,"aria-label":`${e.percent}% of ${a} reviewed`,children:(0,p.jsx)(`div`,{className:`h-full rounded-full ${o?`bg-warning-solid`:`bg-primary-solid`}`,style:{width:`${Math.max(1,e.percent)}%`}})}),(0,p.jsx)(`p`,{className:`mt-2 text-xs ${e.not_covered?`text-warning`:`text-secondary`}`,children:e.mode===`check-again`?`${e.not_covered} changed file(s) not reviewed; ${e.unchanged} unchanged files were not re-read by design.`:`${e.not_covered.toLocaleString(`en-US`)} not covered: no review step read them.`}),e.mode===`full`&&(0,p.jsxs)(`p`,{className:`mt-1 text-xs text-secondary`,children:[e.excluded.toLocaleString(`en-US`),` of `,e.listed.toLocaleString(`en-US`),` listed files excluded as not reviewable`,Object.keys(e.excluded_by_reason).length?` (${Object.entries(e.excluded_by_reason).map(([e,t])=>`${t} ${e}`).join(`, `)})`:``,`.`]}),!!e.tests&&(0,p.jsxs)(`p`,{className:`mt-1 text-xs text-secondary`,children:[e.tests.toLocaleString(`en-US`),` test and fixture files are counted separately: searched for secrets, not reviewed line by line.`]}),!!e.shipped&&(0,p.jsxs)(`p`,{className:`mt-1 text-xs text-secondary`,children:[e.shipped.toLocaleString(`en-US`),` committed build files were not reviewed and not verified against the source.`]}),!!e.partly_read&&(0,p.jsxs)(`p`,{className:`mt-1 text-xs text-warning`,children:[e.partly_read.toLocaleString(`en-US`),` files were only partly read and are not counted as reviewed.`]}),r&&r.dropped_steps.length>0&&(0,p.jsxs)(`p`,{className:`mt-1 text-xs text-warning`,children:[r.dropped_steps.length,` review step(s) did not run (no file in the branch): `,r.dropped_steps.slice(0,3).map(e=>e.title).join(`; `),`.`]}),r&&r.budget_left_out.length>0&&(0,p.jsxs)(`p`,{className:`mt-1 text-xs text-warning`,children:[`High-risk files not reached: `,r.budget_left_out.map(e=>`${e.label} ${e.files}`).join(`, `),`.`]}),r&&r.map_warnings.length>0&&(0,p.jsxs)(`p`,{className:`mt-1 text-xs text-secondary`,children:[r.map_warnings.length,` app map path(s) were not files in the branch.`]}),(e.unlisted>0||e.tree_truncated)&&(0,p.jsxs)(`p`,{className:`mt-1 text-xs text-warning`,children:[`Covers the `,e.listed.toLocaleString(`en-US`),` listed files only`,e.unlisted?`: ${e.unlisted.toLocaleString(`en-US`)} more files in the branch are not in the list`:`: GitHub truncated the file tree`,`.`]})]}):(0,p.jsx)(`p`,{className:`mt-1 text-xs text-secondary`,children:`This scan did not list the files in the branch, so no share can be given.`}),(0,p.jsx)(j_,{lt:i}),n&&(0,p.jsxs)(`details`,{className:`mt-2 text-xs text-secondary`,children:[(0,p.jsx)(`summary`,{className:`cursor-pointer`,children:`What is verified and what is reported`}),(0,p.jsxs)(`p`,{className:`mt-1`,children:[(0,p.jsx)(`span`,{className:`font-medium`,children:`Verified by Vibe Fortress:`}),` `,n.verified.join(`; `),`.`]}),!!n.collected?.length&&(0,p.jsxs)(`p`,{className:`mt-1`,children:[(0,p.jsx)(`span`,{className:`font-medium`,children:`Collected on your machine (taken as sent, not checked again by the server):`}),` `,n.collected.join(`; `),`.`]}),(0,p.jsxs)(`p`,{className:`mt-1`,children:[(0,p.jsx)(`span`,{className:`font-medium`,children:`Reported by the agent, not verified:`}),` `,n.reported.join(`; `),`.`]})]}),n&&(0,p.jsx)(`p`,{className:`mt-2 text-xs text-secondary`,children:n.grade_basis}),t?.recorded&&(0,p.jsxs)(`details`,{className:`mt-2 text-xs text-secondary`,children:[(0,p.jsxs)(`summary`,{className:`cursor-pointer`,children:[`Plan diagnostic: `,t.reviewed,` of the `,t.planned,` planned files reported as read`]}),(0,p.jsxs)(`p`,{className:`mt-1 text-tertiary`,children:[`Counts only. The plan is chosen during the scan, so it says nothing about the rest of the branch. `,t.steps.reported,`/`,t.steps.total,` steps reported.`]}),t.empty_steps.length>0&&(0,p.jsxs)(`p`,{className:`mt-1 text-warning`,children:[`Reviewed nothing: `,t.empty_steps.join(`; `)]}),t.not_reviewed.length>0&&(0,p.jsx)(`ul`,{className:`mt-1 space-y-0.5`,children:t.not_reviewed.map(e=>(0,p.jsxs)(`li`,{className:`break-all font-mono`,children:[e.file,e.reason?(0,p.jsxs)(`span`,{className:`font-sans text-tertiary`,children:[` — `,e.reason]}):null]},e.file))})]})]})}function N_({inv:e,spot:t,commit:n}){if(!e)return(0,p.jsx)(`p`,{className:`mt-3 text-xs text-tertiary`,children:`File inventory not recorded for this scan.`});let r=e.mode===`check-again`?e.changed?.not_reviewed.length??0:e.not_covered,i=[[`reviewed`,e.reviewed],[`excluded`,e.excluded],[e.mode===`check-again`?`unchanged`:`not covered`,e.mode===`check-again`?e.unchanged:e.not_covered]];return(0,p.jsxs)(`div`,{className:`mt-4 rounded-xl border border-subtle p-3`,"aria-label":`File inventory`,children:[(0,p.jsxs)(`div`,{className:`flex items-baseline justify-between text-sm`,children:[(0,p.jsx)(`span`,{className:`font-medium`,children:`Files in the branch`}),(0,p.jsxs)(`span`,{className:`font-semibold`,children:[e.total,e.cut?` (list covers ${e.listed})`:``]})]}),(0,p.jsx)(`div`,{className:`mt-2 grid grid-cols-3 gap-2 text-center text-xs`,children:i.map(([e,t])=>(0,p.jsxs)(`div`,{className:`rounded-lg border border-subtle p-2 ${e===`not covered`&&t>0?`text-warning`:``}`,children:[(0,p.jsx)(`div`,{className:`text-base font-semibold`,children:t}),(0,p.jsx)(`div`,{className:`text-tertiary`,children:e})]},e))}),e.mode===`check-again`&&e.changed&&(0,p.jsxs)(`p`,{className:`mt-2 text-xs text-secondary`,children:[`Check-again: `,e.changed.total,` changed, `,e.changed.reviewable,` reviewable, `,e.changed.reviewed,` reviewed.`]}),Object.keys(e.excluded_by_reason).length>0&&(0,p.jsxs)(`p`,{className:`mt-2 text-xs text-secondary`,children:[`Excluded: `,Object.entries(e.excluded_by_reason).map(([e,t])=>`${t} ${e}`).join(`, `)]}),r>0&&(0,p.jsxs)(`details`,{className:`mt-2 text-xs text-secondary`,open:!0,children:[(0,p.jsxs)(`summary`,{className:`cursor-pointer font-medium text-warning`,children:[r,` `,e.mode===`check-again`?`changed files not reviewed`:`not covered, highest risk first (by path and name)`]}),(0,p.jsx)(`ul`,{className:`mt-1 space-y-0.5`,children:(e.mode===`check-again`?(e.changed?.not_reviewed??[]).map(e=>({file:e,note:void 0})):e.not_covered_files).map(e=>(0,p.jsxs)(`li`,{className:`break-all font-mono`,children:[e.file,`risk`in e&&e.risk===`high`?(0,p.jsx)(`span`,{className:`font-sans font-medium text-warning`,children:` high risk`}):null,e.note?(0,p.jsxs)(`span`,{className:`font-sans text-tertiary`,children:[` — `,e.note]}):null]},e.file))}),e.not_covered_more>0&&(0,p.jsxs)(`p`,{className:`mt-1 text-tertiary`,children:[`…and `,e.not_covered_more,` more. The dashboard lists every file, with search; the data export has them too.`]})]}),e.reviewed_by_step.length>0&&(0,p.jsxs)(`details`,{className:`mt-2 text-xs text-secondary`,children:[(0,p.jsx)(`summary`,{className:`cursor-pointer`,children:`Why files were reviewed`}),(0,p.jsx)(`ul`,{className:`mt-1 space-y-0.5`,children:e.reviewed_by_step.map(e=>(0,p.jsxs)(`li`,{children:[e.step,` `,(0,p.jsxs)(`span`,{className:`text-tertiary`,children:[`(`,e.files,`)`]})]},e.step))})]}),(e.risk_areas?.length??0)>0&&(0,p.jsxs)(`details`,{className:`mt-2 text-xs text-secondary`,children:[(0,p.jsx)(`summary`,{className:`cursor-pointer`,children:`High-risk areas (by path and name)`}),(0,p.jsx)(`ul`,{className:`mt-1 space-y-0.5`,children:e.risk_areas.map(e=>(0,p.jsxs)(`li`,{children:[e.label,`: `,(0,p.jsxs)(`span`,{className:e.reviewed<e.files?`text-warning`:``,children:[e.reviewed,` of `,e.files,` reviewed`]}),`, `,e.steps,` step`,e.steps===1?``:`s`]},e.area))})]}),e.unknown_refs.length>0&&(0,p.jsxs)(`p`,{className:`mt-2 text-xs text-warning`,children:[e.unknown_refs.length,` file(s) named in the app map are not in the branch and were ignored.`]}),t&&t.answers.length>0&&(0,p.jsxs)(`details`,{className:`mt-2 text-xs text-secondary`,children:[(0,p.jsxs)(`summary`,{className:`cursor-pointer`,children:[`Spot checks (`,t.answers.length,`, seed `,t.seed,`)`]}),(0,p.jsxs)(`p`,{className:`mt-1 text-tertiary`,children:[`Vibe Fortress cannot verify the quoted text. Open each file at `,n??`the scanned commit`,` and compare the lines yourself.`]}),(0,p.jsx)(`ul`,{className:`mt-1 space-y-1`,children:t.answers.map(e=>(0,p.jsxs)(`li`,{children:[(0,p.jsxs)(`span`,{className:`break-all font-mono`,children:[e.file,`:`,e.start_line,`-`,e.end_line]}),e.why===`finding`?` (finding ${e.ref??``})`:e.why===`risk`?` (high-risk area)`:``,` `,(0,p.jsxs)(`span`,{className:e.sha_matches?`text-tertiary`:`font-semibold text-warning`,children:[`sha `,e.blob_sha,e.sha_matches?` matches`:` DIFFERS`]}),(0,p.jsx)(`pre`,{className:`mt-0.5 overflow-x-auto rounded bg-surface-tertiary p-1.5 font-mono`,children:e.text})]},e.file+e.start_line))})]})]})}var P_={view:`local`,project:`acme/shop`,scanned_at:new Date().toISOString(),deep_reviewed:0,grade:`D`,score:55,kind:`quick`,engines:[],remaining:1,counts:{critical:1,high:1,medium:1,low:0},findings:[{ref:`VF-L-1`,severity:`critical`,title:`Live Stripe key in code`,file:`src/config.js`,line:2,reason:`Anyone who can read the repository can charge or refund customers with this key.`,owasp:`A02:2021`,cwe:`CWE-798`,status:`open`},{ref:`VF-L-2`,severity:`high`,title:`SQL built from user input`,file:`src/db.js`,line:2,reason:`An attacker can read or change every row by crafting the name.`,owasp:`A03:2021`,cwe:`CWE-89`,status:`open`,review:{verdict:`confirmed`,reason:`The name comes straight from the request.`}}]};function F_({a:e}){let t=e.state??(e.pending?`pending`:e.linked?`linked`:`none`),n=e.next_steps??[];return(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4`,"aria-label":`Vibe Fortress account`,"data-testid":`link-status`,"data-state":t,children:[t===`pending`&&(0,p.jsxs)(`div`,{children:[(0,p.jsx)(`div`,{className:`text-sm font-medium`,children:`Approve this code in your browser`}),e.code&&(0,p.jsx)(`div`,{className:`mt-1 font-mono text-3xl font-semibold tracking-widest`,"aria-label":`Link code ${e.code}`,children:e.code}),(0,p.jsx)(`p`,{className:`mt-1 text-xs text-secondary`,children:`Check that the same code shows on the page, then approve. You never copy a token.`}),e.url&&(0,p.jsxs)(`p`,{className:`mt-2 break-all text-xs text-tertiary`,children:[`Address: `,(0,p.jsx)(`span`,{className:`select-all font-mono`,children:e.url})]}),(0,p.jsxs)(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:[e.url&&(0,p.jsx)(E,{size:`sm`,color:`primary`,onClick:()=>u_(e.url),children:`Open Vibe Fortress in the browser`}),(0,p.jsx)(E,{size:`sm`,variant:`outline`,color:`secondary`,onClick:()=>l_(`I approved the Vibe Fortress link. Please confirm it.`),children:`I approved it`})]})]}),t===`linked`&&(0,p.jsxs)(`div`,{children:[(0,p.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,p.jsx)(`div`,{className:`text-sm font-medium`,children:`Account linked`}),(0,p.jsx)(ae,{color:e.plan===`pro`?`success`:`secondary`,variant:`soft`,children:e.source===`trial`?`Pro trial`:e.plan===`pro`?`Pro`:e.plan===`free`?`Free`:`Linked`})]}),e.workspace&&(0,p.jsxs)(`p`,{className:`mt-1 text-sm text-secondary`,children:[`Workspace: `,e.workspace]}),e.source===`trial`&&typeof e.trial_days_left==`number`&&(0,p.jsxs)(`p`,{className:`mt-1 text-sm text-secondary`,children:[`Free trial: `,e.trial_days_left,` day`,e.trial_days_left===1?``:`s`,` left. No card needed.`]}),e.source===`subscription`&&(0,p.jsx)(`p`,{className:`mt-1 text-sm text-secondary`,children:`Your subscription is active.`}),e.reachable===!1&&(0,p.jsx)(`p`,{className:`mt-1 text-xs text-warning`,children:`The server could not be reached, so the plan shown may be out of date.`}),(0,p.jsxs)(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:[e.web_url&&(0,p.jsx)(E,{size:`sm`,variant:`outline`,color:`secondary`,onClick:()=>u_(e.web_url),children:`Open Vibe Fortress`}),e.plan!==`pro`&&e.upgrade_url&&(0,p.jsx)(E,{size:`sm`,color:`primary`,onClick:()=>u_(e.upgrade_url),children:e.source===`trial`?`Keep Pro after the trial`:`See plans`})]}),e.plan!==`pro`&&e.upgrade_url&&(0,p.jsxs)(`p`,{className:`mt-2 break-all text-xs text-tertiary`,children:[`Plans: `,(0,p.jsx)(`span`,{className:`select-all font-mono`,children:e.upgrade_url})]})]}),t===`none`&&(0,p.jsxs)(`div`,{children:[(0,p.jsx)(`div`,{className:`text-sm font-medium`,children:`No account linked`}),(0,p.jsx)(`p`,{className:`mt-1 text-sm text-secondary`,children:`Vibe Fortress works without one: secrets, dependency alerts and quick code checks stay free. A free 30-day trial adds deep review, live checks and a web dashboard. Your code never leaves your computer.`}),(0,p.jsx)(`div`,{className:`mt-3 flex flex-wrap gap-2`,children:(0,p.jsx)(E,{size:`sm`,color:`primary`,onClick:()=>l_(`Link my Vibe Fortress account.`),children:`Link my account`})})]}),n.length>0&&(0,p.jsxs)(`div`,{className:`mt-4 border-t border-subtle pt-3`,children:[(0,p.jsx)(`div`,{className:`text-sm font-medium`,children:`Suggested next steps`}),(0,p.jsx)(`ul`,{className:`mt-1 list-disc space-y-1 pl-5 text-sm text-secondary`,children:n.map(e=>(0,p.jsx)(`li`,{children:e},e))})]})]})}var I_={none:{view:`local-account`,state:`none`,linked:!1},pending:{view:`local-account`,state:`pending`,pending:!0,code:`K7M2-QX9P`,url:`http://localhost:8793/app/link?code=K7M2-QX9P`},trial:{view:`local-account`,state:`linked`,linked:!0,workspace:`Ada's workspace`,plan:`pro`,source:`trial`,trial_days_left:27,web_url:`http://localhost:8793/app/`,upgrade_url:`http://localhost:8793/app/plan`,next_steps:[`Run a deep review of your open findings.`]},pro:{view:`local-account`,state:`linked`,linked:!0,workspace:`Ada's workspace`,plan:`pro`,source:`subscription`,web_url:`http://localhost:8793/app/`}};function L_({o:e}){return e.state===`scanned`?(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4`,"aria-label":`Vibe Fortress check`,"data-testid":`offer`,"data-state":`scanned`,children:[(0,p.jsxs)(`div`,{className:`text-sm font-medium`,children:[e.project,` is already checked`]}),(0,p.jsx)(`p`,{className:`mt-1 text-sm text-secondary`,children:`Nothing more to start here.`}),(0,p.jsx)(`div`,{className:`mt-3`,children:(0,p.jsx)(E,{size:`sm`,color:`primary`,onClick:()=>l_(`Show my Vibe Fortress security results.`),children:`Show the results`})})]}):e.state===`snoozed`?(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4`,"aria-label":`Vibe Fortress check`,"data-testid":`offer`,"data-state":`snoozed`,children:[(0,p.jsx)(`div`,{className:`text-sm font-medium`,children:`Okay, I will remind you later`}),(0,p.jsxs)(`p`,{className:`mt-1 text-sm text-secondary`,children:[`Vibe Fortress stays quiet about `,e.project,` until `,e.quiet_until?.slice(0,10),`. `,e.type_hint]}),(0,p.jsx)(`div`,{className:`mt-3`,children:(0,p.jsx)(E,{size:`sm`,variant:`outline`,color:`secondary`,onClick:()=>l_(`Yes, run the Vibe Fortress quick check on this project (${e.project}).`),children:`Start the check now`})})]}):(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4`,"aria-label":`Vibe Fortress check`,"data-testid":`offer`,"data-state":`offer`,children:[(0,p.jsx)(`div`,{className:`text-xs font-semibold uppercase tracking-wide text-tertiary`,children:`Quick security check`}),(0,p.jsxs)(`h2`,{className:`mt-1 break-words text-lg font-semibold`,children:[`Check `,e.project,` for security problems?`]}),(0,p.jsx)(`p`,{className:`mt-1 text-sm text-secondary`,children:`Vibe Fortress looks for leaked passwords, risky packages and common mistakes in apps built with AI.`}),(0,p.jsx)(`h3`,{className:`mt-4 text-sm font-medium`,children:`What I will do now`}),(0,p.jsx)(`ul`,{className:`mt-1 space-y-1.5 text-sm text-secondary`,children:e.checklist.map(e=>(0,p.jsxs)(`li`,{className:`flex gap-2`,children:[(0,p.jsx)(`span`,{"aria-hidden":!0,className:`text-success`,children:`✓`}),(0,p.jsx)(`span`,{className:`min-w-0 break-words`,children:e})]},e))}),(0,p.jsxs)(`div`,{className:`mt-4 grid grid-cols-1 gap-3 sm:grid-cols-2`,children:[(0,p.jsxs)(`div`,{className:`rounded-xl border border-subtle p-3`,children:[(0,p.jsx)(`h3`,{className:`text-sm font-medium`,children:`Free, no account`}),(0,p.jsx)(`ul`,{className:`mt-1 list-disc space-y-0.5 pl-4 text-xs text-secondary`,children:e.free.map(e=>(0,p.jsx)(`li`,{children:e},e))})]}),(0,p.jsxs)(`div`,{className:`rounded-xl border border-subtle p-3`,children:[(0,p.jsx)(`h3`,{className:`text-sm font-medium`,children:`An account adds`}),(0,p.jsx)(`ul`,{className:`mt-1 list-disc space-y-0.5 pl-4 text-xs text-secondary`,children:e.account.map(e=>(0,p.jsx)(`li`,{children:e},e))})]})]}),(0,p.jsx)(`div`,{className:`mt-4 flex flex-wrap gap-2`,children:e.buttons.map(e=>(0,p.jsx)(E,{size:`sm`,color:e.id===`yes`?`primary`:`secondary`,variant:e.id===`yes`?`solid`:e.id===`no`?`outline`:`ghost`,onClick:()=>l_(e.message),children:e.label},e.id))}),(0,p.jsx)(`p`,{className:`mt-3 text-xs text-secondary`,children:e.type_hint}),(0,p.jsxs)(`details`,{className:`mt-2 text-xs text-tertiary`,children:[(0,p.jsx)(`summary`,{className:`cursor-pointer`,children:`What each button tells Claude`}),(0,p.jsx)(`ul`,{className:`mt-1 space-y-1`,children:e.buttons.map(e=>(0,p.jsxs)(`li`,{children:[(0,p.jsxs)(`span`,{className:`font-medium text-secondary`,children:[e.label,`:`]}),` `,(0,p.jsx)(`span`,{className:`select-all`,children:e.message})]},e.id))})]})]})}function R_({r:e,go:t}){let[n,r]=(0,m.useState)(e.reason),[i,a]=(0,m.useState)(null),o=async()=>{a(null);try{t(await c_(`account`))}catch(e){a(e.message)}},s=e.reasons.find(e=>e.id===n);return e.state===`none`?(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4`,"aria-label":`Billing`,"data-testid":`retention`,"data-state":`none`,children:[(0,p.jsx)(`div`,{className:`text-sm font-medium`,children:`You have no subscription`}),(0,p.jsx)(`p`,{className:`mt-1 text-sm text-secondary`,children:`There is nothing to cancel.`}),(0,p.jsx)(`div`,{className:`mt-3`,children:(0,p.jsx)(E,{size:`sm`,variant:`outline`,color:`secondary`,onClick:o,children:`Back to my plan`})}),i&&(0,p.jsx)(`p`,{role:`alert`,className:`mt-1 text-xs text-danger`,children:i})]}):(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4`,"aria-label":`Before you go to billing`,"data-testid":`retention`,"data-state":`subscriber`,children:[(0,p.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Before you go to billing`}),(0,p.jsx)(`p`,{className:`mt-1 text-sm text-secondary`,children:`What is wrong? Pick one if you like. You do not have to.`}),(0,p.jsx)(`div`,{role:`group`,"aria-label":`What is wrong`,className:`mt-3 flex flex-wrap gap-2`,children:e.reasons.map(e=>(0,p.jsx)(E,{size:`sm`,variant:n===e.id?`solid`:`outline`,color:n===e.id?`primary`:`secondary`,"aria-pressed":n===e.id,onClick:()=>r(n===e.id?null:e.id),children:e.label},e.id))}),s&&(0,p.jsx)(`ul`,{className:`mt-3 space-y-2`,"aria-label":`What could help`,children:s.options.map(e=>(0,p.jsxs)(`li`,{className:`rounded-xl border border-subtle p-3`,children:[(0,p.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,p.jsx)(`span`,{className:`text-sm font-medium`,children:e.label}),!e.real&&(0,p.jsx)(ae,{color:`secondary`,variant:`outline`,size:`sm`,children:`Placeholder, not available yet`})]}),(0,p.jsx)(`p`,{className:`mt-0.5 break-words text-xs text-secondary`,children:e.detail}),(0,p.jsx)(`div`,{className:`mt-2`,children:(0,p.jsx)(E,{size:`sm`,variant:`outline`,color:`secondary`,onClick:()=>e.kind===`link`?u_(e.url):l_(e.message),children:e.kind===`link`?`Open in billing`:`Ask Claude`})}),(0,p.jsx)(`p`,{className:`mt-1 break-words text-xs text-tertiary`,children:e.kind===`link`?(0,p.jsxs)(p.Fragment,{children:[`Opens: `,(0,p.jsx)(`span`,{className:`select-all font-mono break-all`,children:e.url})]}):(0,p.jsxs)(p.Fragment,{children:[`Sends: `,(0,p.jsx)(`span`,{className:`select-all`,children:e.message})]})})]},e.id))}),(0,p.jsxs)(`div`,{className:`mt-4 flex flex-wrap items-center gap-2 border-t border-subtle pt-3`,children:[e.portal_url?(0,p.jsx)(E,{size:`sm`,color:`primary`,onClick:()=>u_(e.portal_url),children:`Continue to billing`}):(0,p.jsx)(`span`,{className:`text-sm text-secondary`,children:`Billing is not available on this server.`}),(0,p.jsx)(E,{size:`sm`,variant:`ghost`,color:`secondary`,onClick:o,children:`Back to my plan`})]}),e.portal_url&&(0,p.jsxs)(`p`,{className:`mt-2 break-all text-xs text-tertiary`,children:[`Billing address: `,(0,p.jsx)(`span`,{className:`select-all font-mono`,children:e.portal_url})]}),e.fake&&(0,p.jsx)(`p`,{className:`mt-1 text-xs text-tertiary`,children:`Test billing: no real money.`}),i&&(0,p.jsx)(`p`,{role:`alert`,className:`mt-1 text-xs text-danger`,children:i})]})}function z_(){return(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4 text-center`,"data-testid":`fallback`,children:[(0,p.jsx)(`div`,{className:`text-sm font-medium`,children:`The answer is in the text above`}),(0,p.jsx)(`p`,{className:`mt-1 text-sm text-secondary`,children:`Tell Claude “check my app” to scan, or “what is my plan” to see your account.`})]})}function B_({d:e}){let t=e.findings.map(e=>e.ref).join(`, `);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4`,children:[(0,p.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,p.jsx)(x_,{grade:e.grade,score:e.score}),(0,p.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,p.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.project}),(0,p.jsx)(`div`,{className:`mt-1 text-xl font-semibold`,children:g_[e.grade]}),(0,p.jsxs)(`div`,{className:`mt-0.5 text-xs text-tertiary`,children:[e.base?`Branch check against ${e.base}`:`Quick check`,` · `,y_(e.scanned_at),` · your code stayed on this computer`]})]})]}),(0,p.jsx)(`div`,{className:`mt-4 grid grid-cols-4 gap-2`,children:f_.map(t=>(0,p.jsxs)(`div`,{"aria-label":`${e.counts[t]} ${t} findings`,className:`rounded-lg border border-default p-2`,children:[(0,p.jsx)(`div`,{className:`text-xl font-semibold leading-none`,children:e.counts[t]}),(0,p.jsx)(`div`,{className:`mt-1 text-[11px] capitalize text-tertiary`,children:t}),(0,p.jsx)(`div`,{className:`mt-1.5 h-1 rounded-full bg-surface-tertiary`,children:(0,p.jsx)(`div`,{className:`h-full rounded-full ${m_[t]}`,style:{width:`${Math.min(100,e.counts[t]*25)}%`}})})]},t))}),(0,p.jsxs)(`div`,{className:`mt-4 flex flex-wrap gap-2`,children:[e.findings.length>0&&(0,p.jsx)(E,{size:`sm`,color:`primary`,onClick:()=>l_(`Yes, fix these Vibe Fortress findings on a new branch (${t}). Do not open a pull request until I say so.`),children:`Fix these on a branch`}),e.findings.length>0&&(0,p.jsx)(E,{size:`sm`,variant:`outline`,color:`secondary`,onClick:()=>l_(`Yes, run a Vibe Fortress deep review of these findings.`),children:`Deep review`}),(0,p.jsx)(E,{size:`sm`,variant:`ghost`,color:`secondary`,onClick:()=>l_(`What does a Vibe Fortress account give me? Show my plan.`),children:`Get protection`})]})]}),e.findings.length===0?(0,p.jsxs)(`div`,{className:`rounded-xl border border-default bg-surface p-6 text-center`,children:[(0,p.jsx)(`div`,{className:`text-2xl`,"aria-hidden":!0,children:`🛡️`}),(0,p.jsx)(`div`,{className:`mt-1 font-medium`,children:`Nothing urgent found`}),(0,p.jsx)(`div`,{className:`text-sm text-secondary`,children:`This quick check matches known patterns; a deep review reads the code for the rest.`})]}):(0,p.jsx)(`ul`,{className:`space-y-2`,"aria-label":`Findings, worst first`,children:e.findings.map(e=>(0,p.jsx)(`li`,{className:`rounded-xl border border-default bg-surface p-3`,children:(0,p.jsxs)(`div`,{className:`flex items-start gap-3`,children:[(0,p.jsx)(ae,{color:p_[e.severity],variant:`soft`,size:`sm`,className:`mt-0.5 shrink-0 uppercase`,children:e.severity}),(0,p.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,p.jsxs)(`div`,{className:`break-words text-sm font-medium`,children:[e.title,e.branchNew?` · new on this branch`:``]}),(0,p.jsxs)(`div`,{className:`mt-0.5 break-all text-xs text-tertiary`,children:[(0,p.jsx)(`span`,{className:`font-medium text-secondary`,children:e.ref}),` · `,e.file,e.line?`:${e.line}`:``]}),(0,p.jsx)(`p`,{className:`mt-1.5 break-words text-sm text-secondary`,children:e.reason}),e.review&&e.review.verdict!==`false_positive`&&(0,p.jsxs)(`p`,{className:`mt-1.5 break-words text-xs text-secondary`,children:[(0,p.jsxs)(`span`,{className:`font-medium`,children:[`Deep review: `,e.review.verdict===`confirmed`?`confirmed`:`unsure`,`.`]}),` `,e.review.reason]})]})]})},e.ref))}),e.remaining>0&&(0,p.jsxs)(`p`,{className:`text-center text-xs text-tertiary`,children:[e.remaining,` more: ask Claude “show the rest”.`]})]})}function V_({data:e,setError:t}){let[n,r]=(0,m.useState)(`all`),[i,a]=(0,m.useState)(!1),o=async()=>{try{await d_(e.repo.full_name)}catch(e){t(String(e))}},s=(0,m.useMemo)(()=>e.findings.filter(e=>(i||!v_.includes(e.status))&&(n===`all`||e.severity===n)),[e,n,i]),c=e.findings.filter(e=>v_.includes(e.status)).length;return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`section`,{className:`rounded-2xl border border-default bg-surface p-4`,children:[(0,p.jsxs)(`div`,{className:`flex items-center gap-4`,children:[(0,p.jsx)(x_,{grade:e.grade.grade,score:e.grade.score}),(0,p.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[e.repos.length>1?(0,p.jsx)(`select`,{"aria-label":`Repository`,className:`w-full rounded-md border border-default bg-surface px-2 py-1 text-sm font-medium text-default`,value:e.repo.full_name,onChange:e=>d_(e.target.value).catch(e=>t(String(e))),children:e.repos.map(e=>(0,p.jsxs)(`option`,{value:e.full_name,children:[e.full_name,e.grade?` · ${e.grade}`:``]},e.full_name))}):(0,p.jsx)(`div`,{className:`truncate text-sm font-medium`,children:e.repo.full_name}),(0,p.jsx)(`div`,{className:`mt-1 text-xl font-semibold`,children:g_[e.grade.grade]}),(0,p.jsxs)(`div`,{className:`mt-0.5 text-xs text-tertiary`,children:[`Last scan `,y_(e.repo.last_scan_at),e.repo.last_scanned_commit?` · ${e.repo.last_scanned_commit.slice(0,7)}`:``]})]})]}),e.progress&&(0,p.jsxs)(`div`,{className:`mt-3`,role:`status`,children:[(0,p.jsxs)(`div`,{className:`mb-1 flex justify-between text-xs text-secondary`,children:[(0,p.jsx)(`span`,{children:`Scan in progress…`}),(0,p.jsxs)(`span`,{children:[e.progress.done,`/`,e.progress.total,` steps`]})]}),(0,p.jsx)(`div`,{className:`h-1.5 overflow-hidden rounded-full bg-surface-tertiary`,children:(0,p.jsx)(`div`,{className:`h-full rounded-full bg-primary-solid transition-all`,style:{width:`${e.progress.done/Math.max(1,e.progress.total)*100}%`}})})]}),(0,p.jsx)(`div`,{className:`mt-4 grid grid-cols-4 gap-2`,children:f_.map(t=>(0,p.jsxs)(`button`,{"aria-pressed":n===t,"aria-label":`${e.grade.counts[t]} ${t} findings`,onClick:()=>r(n===t?`all`:t),className:`rounded-lg border p-2 text-left transition ${n===t?`border-strong bg-surface-secondary`:`border-subtle hover:bg-surface-secondary`}`,children:[(0,p.jsx)(`div`,{className:`text-xl font-semibold leading-none`,children:e.grade.counts[t]}),(0,p.jsx)(`div`,{className:`mt-1 text-[11px] capitalize text-tertiary`,children:t}),(0,p.jsx)(`div`,{className:`mt-1.5 h-1 rounded-full bg-surface-tertiary`,children:(0,p.jsx)(`div`,{className:`h-full rounded-full ${m_[t]}`,style:{width:`${Math.min(100,e.grade.counts[t]*25)}%`}})})]},t))}),(0,p.jsxs)(`div`,{className:`mt-4 flex flex-wrap gap-2`,children:[(0,p.jsx)(E,{size:`sm`,color:`primary`,onClick:()=>l_(`Check again: call start_scan with kind "diff" for ${e.repo.full_name} and review only what changed since the last scan.`),children:`Check again`}),c>0&&(0,p.jsxs)(E,{size:`sm`,variant:`ghost`,color:`secondary`,onClick:()=>a(!i),children:[i?`Hide`:`Show`,` `,c,` closed`]}),n!==`all`&&(0,p.jsx)(E,{size:`sm`,variant:`ghost`,color:`secondary`,onClick:()=>r(`all`),children:`Clear filter`})]}),(0,p.jsx)(M_,{s:e.coverage_summary??null,c:e.scan_coverage??null,v:e.verification??null,nt:e.notices??null,lt:e.local_tools??null}),e.triage&&e.triage.triaged>0&&(0,p.jsxs)(`div`,{className:`mt-3 rounded-xl border border-subtle p-3 text-xs`,"aria-label":`Triage`,children:[e.triage.notice&&(0,p.jsxs)(`p`,{className:`mb-1 font-semibold text-warning`,role:`note`,children:[`Triage kept all `,e.triage.triaged,` findings and was not independent. Treat the verdicts as unchecked.`]}),(0,p.jsx)(`p`,{className:`text-secondary`,children:e.triage.line}),e.dependencies&&(0,p.jsx)(`p`,{className:`mt-1 text-secondary`,children:e.dependencies.line})]}),(e.unconfirmed?.length??0)>0&&(0,p.jsxs)(`p`,{className:`mt-3 text-xs text-warning`,children:[`Not confirmed either way (still open): `,e.unconfirmed.map(e=>`${e.ref} (${e.file}:${e.line})`).join(`, `)]}),(0,p.jsx)(N_,{inv:e.scan_inventory??null,spot:e.spot_checks??null,commit:e.scan?.head_commit}),e.coverage&&(0,p.jsx)(`p`,{className:`mt-3 text-xs text-tertiary`,children:e.coverage}),(0,p.jsx)(`p`,{className:`mt-3 text-xs text-secondary`,children:`Next: the dashboard shows every finding and every file that was not covered. “Check again” re-reads what changed. A fix is opened as a pull request when you ask for one on a finding.`})]}),s.length===0?(0,p.jsxs)(`div`,{className:`rounded-xl border border-default bg-surface p-6 text-center`,children:[(0,p.jsx)(`div`,{className:`text-2xl`,"aria-hidden":!0,children:`🛡️`}),(0,p.jsx)(`div`,{className:`mt-1 font-medium`,children:`Nothing to fix here`}),(0,p.jsx)(`div`,{className:`text-sm text-secondary`,children:n===`all`?`No open findings. Say “check again” after your next changes.`:`No open ${n} findings.`})]}):(0,p.jsx)(`ul`,{className:`space-y-2`,"aria-label":`Findings, worst first`,children:s.map(t=>(0,p.jsx)(S_,{f:t,repo:e.repo.full_name,onChange:o},t.id))}),(e.findings_more??0)>0&&(0,p.jsxs)(`p`,{className:`mt-2 text-xs text-secondary`,children:[`…and `,e.findings_more,` more findings, less severe than these. The dashboard lists all of them.`]})]})}function H_(){let e=new URLSearchParams(location.search),[t,n]=(0,m.useState)(e.has(`local`)?P_:I_[e.get(`link`)??``]??null),[r,i]=(0,m.useState)(null),[a,o]=(0,m.useState)(null),[s,c]=(0,m.useState)(!1);if((0,m.useEffect)(()=>{if(!window.matchMedia)return;let e=window.matchMedia(`(prefers-color-scheme: dark)`),t=()=>{(r_||!document.documentElement.getAttribute(`data-theme`))&&document.documentElement.setAttribute(`data-theme`,e.matches?`dark`:`light`)};return t(),e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]),(0,m.useEffect)(()=>{let r=a_(e=>n(e)),a=e.get(`view`),s={account:`account`,retention:`billing_options`,results:`get_results`};o_().then(async()=>{r_&&!t&&(a&&s[a]?n(await c_(s[a])):await d_()),c(!0)}).catch(e=>{o(String(e)),c(!0)});let l=e=>{i(e.detail),setTimeout(()=>i(null),4e3)};return window.addEventListener(`vf-toast`,l),()=>{r(),window.removeEventListener(`vf-toast`,l)}},[]),a)return(0,p.jsxs)(`div`,{role:`alert`,className:`p-4 text-sm text-danger`,children:[`Something went wrong: `,a]});if(!s)return(0,p.jsx)(`div`,{className:`p-6 text-sm text-tertiary`,role:`status`,children:`Loading Vibe Fortress…`});let l=e=>n(e),u=t?.view;return(0,p.jsxs)(`main`,{className:`mx-auto max-w-2xl space-y-4 p-4 text-default`,"data-view":u??`none`,children:[(0,p.jsxs)(`header`,{className:`flex items-center gap-2 text-primary`,children:[(0,p.jsx)(b_,{}),(0,p.jsx)(`span`,{className:`text-lg font-semibold tracking-tight text-default`,children:`Vibe Fortress`})]}),u===`results`?(0,p.jsx)(V_,{data:t,setError:o}):u===`account`?(0,p.jsx)(k_,{a:t,go:l}):u===`retention`?(0,p.jsx)(R_,{r:t,go:l},JSON.stringify(t.reason)):u===`offer`?(0,p.jsx)(L_,{o:t}):u===`local`?(0,p.jsx)(B_,{d:t}):u===`local-account`?(0,p.jsx)(F_,{a:t}):(0,p.jsx)(z_,{}),r&&(0,p.jsx)(`div`,{role:`status`,className:`fixed inset-x-4 bottom-4 mx-auto max-w-md rounded-xl bg-surface-elevated p-3 text-sm shadow-lg ring-1 ring-[var(--color-border-default)]`,children:r})]})}(0,te.createRoot)(document.getElementById(`root`)).render((0,p.jsx)(m.StrictMode,{children:(0,p.jsx)(g,{linkComponent:`a`,children:(0,p.jsx)(H_,{})})}));</script>
116
116
  <style rel="stylesheet" crossorigin>/*! tailwindcss v4.3.4 | MIT License | https://tailwindcss.com */
117
117
  @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, -apple-system, system-ui, "Segoe UI", "Noto Sans", "Helvetica", "Arial", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif;--font-mono:ui-monospace, "SFMono-Regular", "SF Mono", "Menlo", "Monaco", "Consolas", "Liberation Mono", "DejaVu Sans Mono", "Courier New", monospace;--spacing:.25rem;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:1024px;--breakpoint-xl:1280px;--breakpoint-2xl:1536px;--container-sm:24rem;--container-md:28rem;--container-2xl:42rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--breakpoint-xs:380px;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--radius-2xs:.125rem;--radius-xs:.25rem;--radius-sm:.375rem;--radius-md:.5rem;--radius-lg:.625rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.25rem;--radius-4xl:1.5rem;--radius-full:9999px;--text-lg:var(--font-text-lg-size);--text-lg--line-height:var(--font-text-lg-line-height);--text-lg--font-weight:var(--font-text-lg-weight);--text-lg--letter-spacing:var(--font-text-lg-tracking);--text-base:var(--font-text-md-size);--text-base--line-height:var(--font-text-md-line-height);--text-base--font-weight:var(--font-text-md-weight);--text-base--letter-spacing:var(--font-text-md-tracking);--text-sm:var(--font-text-sm-size);--text-sm--line-height:var(--font-text-sm-line-height);--text-sm--font-weight:var(--font-text-sm-weight);--text-sm--letter-spacing:var(--font-text-sm-tracking);--text-xs:var(--font-text-xs-size);--text-xs--line-height:var(--font-text-xs-line-height);--text-xs--font-weight:var(--font-text-xs-weight);--text-xs--letter-spacing:var(--font-text-xs-tracking);--text-xl:var(--font-heading-md-size);--text-xl--line-height:var(--font-heading-md-line-height);--text-xl--font-weight:var(--font-text-lg-weight);--text-xl--letter-spacing:var(--font-heading-md-tracking);--text-2xl:var(--font-heading-lg-size);--text-2xl--line-height:var(--font-heading-lg-line-height);--text-2xl--font-weight:var(--font-text-lg-weight);--text-2xl--letter-spacing:var(--font-heading-lg-tracking);--text-3xl:var(--font-heading-xl-size);--text-3xl--line-height:var(--font-heading-xl-line-height);--text-3xl--font-weight:var(--font-text-lg-weight);--text-3xl--letter-spacing:var(--font-heading-xl-tracking);--text-4xl:var(--font-heading-2xl-size);--text-4xl--line-height:var(--font-heading-2xl-line-height);--text-4xl--font-weight:var(--font-text-lg-weight);--text-4xl--letter-spacing:var(--font-heading-2xl-tracking);--tracking-wide:var(--font-tracking-wide);--tracking-normal:var(--font-tracking-normal);--tracking-tight:var(--font-tracking-tight);--shadow-hairline:var(--shadow-hairline)}:root,:where([data-theme]){--gray-500:#5d5d5d;--alpha-0:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-0:color-mix(in oklab, var(--alpha-base) 0%, transparent)}}:root,:where([data-theme]){--alpha-02:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-02:color-mix(in oklab, var(--alpha-base) 2%, transparent)}}:root,:where([data-theme]){--alpha-04:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-04:color-mix(in oklab, var(--alpha-base) 4%, transparent)}}:root,:where([data-theme]){--alpha-05:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-05:color-mix(in oklab, var(--alpha-base) 5%, transparent)}}:root,:where([data-theme]){--alpha-06:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-06:color-mix(in oklab, var(--alpha-base) 6%, transparent)}}:root,:where([data-theme]){--alpha-08:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-08:color-mix(in oklab, var(--alpha-base) 8%, transparent)}}:root,:where([data-theme]){--alpha-10:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-10:color-mix(in oklab, var(--alpha-base) 10%, transparent)}}:root,:where([data-theme]){--alpha-12:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-12:color-mix(in oklab, var(--alpha-base) 12%, transparent)}}:root,:where([data-theme]){--alpha-15:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-15:color-mix(in oklab, var(--alpha-base) 15%, transparent)}}:root,:where([data-theme]){--alpha-16:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-16:color-mix(in oklab, var(--alpha-base) 16%, transparent)}}:root,:where([data-theme]){--alpha-20:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-20:color-mix(in oklab, var(--alpha-base) 20%, transparent)}}:root,:where([data-theme]){--alpha-25:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-25:color-mix(in oklab, var(--alpha-base) 25%, transparent)}}:root,:where([data-theme]){--alpha-30:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-30:color-mix(in oklab, var(--alpha-base) 30%, transparent)}}:root,:where([data-theme]){--alpha-35:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-35:color-mix(in oklab, var(--alpha-base) 35%, transparent)}}:root,:where([data-theme]){--alpha-40:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-40:color-mix(in oklab, var(--alpha-base) 40%, transparent)}}:root,:where([data-theme]){--alpha-50:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-50:color-mix(in oklab, var(--alpha-base) 50%, transparent)}}:root,:where([data-theme]){--alpha-60:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-60:color-mix(in oklab, var(--alpha-base) 60%, transparent)}}:root,:where([data-theme]){--alpha-70:var(--alpha-base)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--alpha-70:color-mix(in oklab, var(--alpha-base) 70%, transparent)}}:root,:where([data-theme]){--white:#fff;--black:#000;--green-25:#edfaf2;--green-50:#d9f4e4;--green-75:#b8ebcc;--green-100:#8cdfad;--green-200:#66d492;--green-300:#40c977;--green-400:#04b84c;--green-500:#00a240;--green-600:#008635;--green-700:#00692a;--green-800:#004f1f;--green-900:#003716;--green-950:#011c0b;--green-1000:#001207;--green-a25:var(--green-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--green-a25:color-mix(in oklab, var(--green-400) 8%, transparent)}}:root,:where([data-theme]){--green-a50:var(--green-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--green-a50:color-mix(in oklab, var(--green-400) 15%, transparent)}}:root,:where([data-theme]){--green-a75:var(--green-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--green-a75:color-mix(in oklab, var(--green-400) 29%, transparent)}}:root,:where([data-theme]){--green-a100:var(--green-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--green-a100:color-mix(in oklab, var(--green-400) 45%, transparent)}}:root,:where([data-theme]){--green-a200:var(--green-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--green-a200:color-mix(in oklab, var(--green-400) 60%, transparent)}}:root,:where([data-theme]){--green-a300:var(--green-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--green-a300:color-mix(in oklab, var(--green-400) 75%, transparent)}}:root,:where([data-theme]){--red-25:#fff0f0;--red-50:#ffd9d9;--red-75:#ffc6c5;--red-100:#ffa4a2;--red-200:#ff8583;--red-300:#ff6764;--red-400:#fa423e;--red-500:#e02e2a;--red-600:#ba2623;--red-700:#911e1b;--red-800:#6e1615;--red-900:#4d100e;--red-950:#280b0a;--red-1000:#1f0909;--red-a25:var(--red-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--red-a25:color-mix(in oklab, var(--red-400) 8%, transparent)}}:root,:where([data-theme]){--red-a50:var(--red-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--red-a50:color-mix(in oklab, var(--red-400) 16%, transparent)}}:root,:where([data-theme]){--red-a75:var(--red-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--red-a75:color-mix(in oklab, var(--red-400) 30%, transparent)}}:root,:where([data-theme]){--red-a100:var(--red-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--red-a100:color-mix(in oklab, var(--red-400) 48%, transparent)}}:root,:where([data-theme]){--red-a200:var(--red-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--red-a200:color-mix(in oklab, var(--red-400) 64%, transparent)}}:root,:where([data-theme]){--red-a300:var(--red-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--red-a300:color-mix(in oklab, var(--red-400) 79%, transparent)}}:root,:where([data-theme]){--pink-25:#fff4f9;--pink-50:#ffe8f3;--pink-75:#ffd4e8;--pink-100:#ffbada;--pink-200:#ffa3ce;--pink-300:#ff8cc1;--pink-400:#ff66ad;--pink-500:#e04c91;--pink-600:#ba437a;--pink-700:#963c67;--pink-800:#6e2c4a;--pink-900:#4d1f34;--pink-950:#29101c;--pink-1000:#1a0a11;--pink-a25:var(--pink-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--pink-a25:color-mix(in oklab, var(--pink-400) 8%, transparent)}}:root,:where([data-theme]){--pink-a50:var(--pink-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--pink-a50:color-mix(in oklab, var(--pink-400) 16%, transparent)}}:root,:where([data-theme]){--pink-a75:var(--pink-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--pink-a75:color-mix(in oklab, var(--pink-400) 28%, transparent)}}:root,:where([data-theme]){--pink-a100:var(--pink-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--pink-a100:color-mix(in oklab, var(--pink-400) 45%, transparent)}}:root,:where([data-theme]){--pink-a200:var(--pink-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--pink-a200:color-mix(in oklab, var(--pink-400) 60%, transparent)}}:root,:where([data-theme]){--pink-a300:var(--pink-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--pink-a300:color-mix(in oklab, var(--pink-400) 76%, transparent)}}:root,:where([data-theme]){--orange-25:#fff5f0;--orange-50:#ffe7d9;--orange-75:#ffcfb4;--orange-100:#ffb790;--orange-200:#ff9e6c;--orange-300:#ff8549;--orange-400:#fb6a22;--orange-500:#e25507;--orange-600:#b9480d;--orange-700:#923b0f;--orange-800:#6d2e0f;--orange-900:#4a2206;--orange-950:#281105;--orange-1000:#211107;--orange-a25:var(--orange-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--orange-a25:color-mix(in oklab, var(--orange-400) 7%, transparent)}}:root,:where([data-theme]){--orange-a50:var(--orange-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--orange-a50:color-mix(in oklab, var(--orange-400) 16%, transparent)}}:root,:where([data-theme]){--orange-a75:var(--orange-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--orange-a75:color-mix(in oklab, var(--orange-400) 33%, transparent)}}:root,:where([data-theme]){--orange-a100:var(--orange-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--orange-a100:color-mix(in oklab, var(--orange-400) 48%, transparent)}}:root,:where([data-theme]){--orange-a200:var(--orange-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--orange-a200:color-mix(in oklab, var(--orange-400) 65%, transparent)}}:root,:where([data-theme]){--orange-a300:var(--orange-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--orange-a300:color-mix(in oklab, var(--orange-400) 81%, transparent)}}:root,:where([data-theme]){--yellow-25:#fffbed;--yellow-50:#fff6d9;--yellow-75:#ffeeb8;--yellow-100:#ffe48c;--yellow-200:#ffdb66;--yellow-300:#ffd240;--yellow-400:#ffc300;--yellow-500:#e0ac00;--yellow-600:#ba8e00;--yellow-700:#916f00;--yellow-800:#6e5400;--yellow-900:#4d3b00;--yellow-950:#261d00;--yellow-1000:#1a1400;--yellow-a25:var(--yellow-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--yellow-a25:color-mix(in oklab, var(--yellow-400) 8%, transparent)}}:root,:where([data-theme]){--yellow-a50:var(--yellow-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--yellow-a50:color-mix(in oklab, var(--yellow-400) 15%, transparent)}}:root,:where([data-theme]){--yellow-a75:var(--yellow-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--yellow-a75:color-mix(in oklab, var(--yellow-400) 27%, transparent)}}:root,:where([data-theme]){--yellow-a100:var(--yellow-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--yellow-a100:color-mix(in oklab, var(--yellow-400) 45%, transparent)}}:root,:where([data-theme]){--yellow-a200:var(--yellow-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--yellow-a200:color-mix(in oklab, var(--yellow-400) 59%, transparent)}}:root,:where([data-theme]){--yellow-a300:var(--yellow-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--yellow-a300:color-mix(in oklab, var(--yellow-400) 74%, transparent)}}:root,:where([data-theme]){--purple-25:#f9f5fe;--purple-50:#efe5fe;--purple-75:#e0cefd;--purple-100:#ceb0fb;--purple-200:#be95fa;--purple-300:#ad7bf9;--purple-400:#924ff7;--purple-500:#8046d9;--purple-600:#6b3ab4;--purple-700:#532d8d;--purple-800:#3f226a;--purple-900:#2c184a;--purple-950:#160c25;--purple-1000:#100a19;--purple-a25:var(--purple-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--purple-a25:color-mix(in oklab, var(--purple-400) 6%, transparent)}}:root,:where([data-theme]){--purple-a50:var(--purple-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--purple-a50:color-mix(in oklab, var(--purple-400) 15%, transparent)}}:root,:where([data-theme]){--purple-a75:var(--purple-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--purple-a75:color-mix(in oklab, var(--purple-400) 28%, transparent)}}:root,:where([data-theme]){--purple-a100:var(--purple-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--purple-a100:color-mix(in oklab, var(--purple-400) 45%, transparent)}}:root,:where([data-theme]){--purple-a200:var(--purple-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--purple-a200:color-mix(in oklab, var(--purple-400) 60%, transparent)}}:root,:where([data-theme]){--purple-a300:var(--purple-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--purple-a300:color-mix(in oklab, var(--purple-400) 75%, transparent)}}:root,:where([data-theme]){--blue-25:#f5faff;--blue-50:#e5f3ff;--blue-75:#cce6ff;--blue-100:#99ceff;--blue-200:#66b5ff;--blue-300:#339cff;--blue-400:#0285ff;--blue-500:#0169cc;--blue-600:#004f99;--blue-700:#003f7a;--blue-800:#013566;--blue-900:#00284d;--blue-950:#000e1a;--blue-1000:#000d19;--blue-a25:var(--blue-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--blue-a25:color-mix(in oklab, var(--blue-400) 4%, transparent)}}:root,:where([data-theme]){--blue-a50:var(--blue-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--blue-a50:color-mix(in oklab, var(--blue-400) 13%, transparent)}}:root,:where([data-theme]){--blue-a75:var(--blue-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--blue-a75:color-mix(in oklab, var(--blue-400) 25%, transparent)}}:root,:where([data-theme]){--blue-a100:var(--blue-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--blue-a100:color-mix(in oklab, var(--blue-400) 40%, transparent)}}:root,:where([data-theme]){--blue-a200:var(--blue-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--blue-a200:color-mix(in oklab, var(--blue-400) 60%, transparent)}}:root,:where([data-theme]){--blue-a300:var(--blue-400)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--blue-a300:color-mix(in oklab, var(--blue-400) 80%, transparent)}}:root,:where([data-theme]){--hairline:1px}:where(:root),:where([data-theme=light]){--gray-0:#fff;--gray-25:#fcfcfc;--gray-50:#f9f9f9;--gray-75:#f3f3f3;--gray-100:#ededed;--gray-150:#dfdfdf;--gray-200:#cdcdcd;--gray-250:#b9b9b9;--gray-300:#afafaf;--gray-350:#9f9f9f;--gray-400:#8f8f8f;--gray-450:#767676;--gray-550:#4f4f4f;--gray-600:#414141;--gray-650:#393939;--gray-700:#303030;--gray-750:#282828;--gray-800:#212121;--gray-850:#1c1c1c;--gray-900:#181818;--gray-925:#161616;--gray-950:#131313;--gray-975:#101010;--gray-1000:#0d0d0d;--alpha-base:#0d0d0d}:where([data-theme=dark]){--gray-0:#0d0d0d;--gray-25:#101010;--gray-50:#131313;--gray-75:#161616;--gray-100:#181818;--gray-150:#1c1c1c;--gray-200:#212121;--gray-250:#282828;--gray-300:#303030;--gray-350:#393939;--gray-400:#414141;--gray-450:#4f4f4f;--gray-550:#767676;--gray-600:#8f8f8f;--gray-650:#9f9f9f;--gray-700:#afafaf;--gray-750:#b9b9b9;--gray-800:#cdcdcd;--gray-850:#dcdcdc;--gray-900:#ededed;--gray-925:#f3f3f3;--gray-950:#f3f3f3;--gray-975:#f9f9f9;--gray-1000:#fff;--alpha-base:#fff}@media (resolution>=150dpi),(resolution>=1.5x){:root,:where([data-theme]){--hairline:.5px}}:root,:where([data-theme]){--shadow-color:0 0 0;--elevation-100-geo:0 1px 2px -1px;--elevation-200-geo:0 2px 4px -1px;--elevation-300-geo:0 4px 8px -2px;--elevation-400-geo:0 8px 16px -4px}:where(:root),:where([data-theme=light]){--shadow-alpha-100:.08;--shadow-alpha-200:.08;--shadow-alpha-300:.1;--shadow-alpha-400:.12;--shadow-hairline-width:1px;--shadow-hairline-color:#00000014}@media (resolution>=150dpi),(resolution>=1.5x){:where(:root),:where([data-theme=light]){--shadow-hairline-width:.5px;--shadow-hairline-color:#0000001a}}:where([data-theme=dark]){--shadow-alpha-100:.2;--shadow-alpha-200:.2;--shadow-alpha-300:.36;--shadow-alpha-400:.3;--shadow-hairline-width:1px;--shadow-hairline-color:#ffffff1a}@media (resolution>=150dpi),(resolution>=1.5x){:where([data-theme=dark]){--shadow-hairline-width:.5px;--shadow-hairline-color:#ffffff1f}}:where([data-theme=dark]) [data-surface=elevated]{--shadow-hairline:0 0 #0000}:root,:where([data-theme]){--color-text:var(--gray-1000);--color-text-inverse:var(--gray-0);--color-text-primary:var(--color-text);--color-text-primary-soft:var(--color-text);--color-background-primary-soft-alt:var(--alpha-02);--color-border-primary-soft-alt:var(--alpha-06);--color-text-primary-soft-alt:var(--color-text);--color-text-primary-surface:var(--color-text);--color-text-primary-solid:var(--color-text-inverse);--color-text-primary-outline:var(--color-text);--color-text-primary-outline-hover:var(--color-text);--color-text-primary-ghost:var(--color-text);--color-text-primary-ghost-hover:var(--color-text);--color-ring-primary:var(--color-ring);--color-ring-primary-soft:var(--color-ring-primary);--color-ring-primary-solid:var(--color-ring-primary);--color-ring-primary-outline:var(--color-ring-primary);--color-ring-primary-ghost:var(--color-ring-primary);--color-text-secondary-soft:var(--color-text);--color-background-secondary-soft-alt:var(--alpha-02);--color-border-secondary-soft-alt:var(--alpha-06);--color-text-secondary-soft-alt:var(--color-text);--color-text-secondary-solid:var(--white);--color-text-secondary-outline:var(--color-text-secondary);--color-text-secondary-outline-hover:var(--color-text);--color-text-secondary-ghost:var(--color-text-secondary);--color-text-secondary-ghost-hover:var(--color-text);--color-ring-secondary:var(--color-ring);--color-ring-secondary-soft:var(--color-ring-secondary);--color-ring-secondary-solid:var(--color-ring-secondary);--color-ring-secondary-outline:var(--color-ring-secondary);--color-ring-secondary-ghost:var(--color-ring-secondary);--color-background-info-soft:var(--blue-50);--color-background-info-soft-hover:var(--blue-75);--color-background-info-soft-active:var(--blue-75);--color-background-info-soft-alpha:var(--blue-a50);--color-background-info-soft-alpha-hover:var(--blue-a75);--color-background-info-soft-alpha-active:var(--blue-a75);--color-background-info-solid:var(--blue-400);--color-background-info-solid-hover:var(--blue-500);--color-background-info-solid-active:var(--blue-500);--color-text-info-solid:var(--white);--color-background-info-outline-hover:var(--blue-a25);--color-background-info-outline-active:var(--blue-a25);--color-border-info-outline:var(--blue-500);--color-border-info-outline-hover:var(--blue-500);--color-text-info-outline:var(--blue-500);--color-text-info-outline-hover:var(--blue-500);--color-background-info-ghost-hover:var(--blue-a50);--color-background-info-ghost-active:var(--blue-a50);--color-ring-info:var(--color-ring);--color-ring-info-soft:var(--color-ring-info);--color-ring-info-solid:var(--color-ring-info);--color-ring-info-outline:var(--color-ring-info);--color-ring-info-ghost:var(--color-ring-info);--color-background-warning-soft:var(--orange-50);--color-background-warning-soft-hover:var(--orange-75);--color-background-warning-soft-active:var(--orange-75);--color-background-warning-soft-alpha:var(--orange-a50);--color-background-warning-soft-alpha-hover:var(--orange-a75);--color-background-warning-soft-alpha-active:var(--orange-a75);--color-background-warning-solid:var(--orange-500);--color-background-warning-solid-hover:var(--orange-600);--color-background-warning-solid-active:var(--orange-600);--color-text-warning-solid:var(--white);--color-background-warning-outline-hover:var(--orange-a25);--color-background-warning-outline-active:var(--orange-a25);--color-border-warning-outline:var(--orange-500);--color-border-warning-outline-hover:var(--orange-500);--color-text-warning-outline:var(--orange-500);--color-text-warning-outline-hover:var(--orange-500);--color-background-warning-ghost-hover:var(--orange-a50);--color-background-warning-ghost-active:var(--orange-a50);--color-text-warning-ghost:var(--orange-500);--color-text-warning-ghost-hover:var(--orange-500);--color-ring-warning:var(--color-ring);--color-ring-warning-soft:var(--color-ring-warning);--color-ring-warning-solid:var(--color-ring-warning);--color-ring-warning-outline:var(--color-ring-warning);--color-ring-warning-ghost:var(--color-ring-warning);--color-text-caution-hover:var(--yellow-800);--color-background-caution-soft:var(--yellow-50);--color-background-caution-soft-hover:var(--yellow-75);--color-background-caution-soft-active:var(--yellow-75);--color-background-caution-soft-alpha:var(--yellow-a50);--color-background-caution-soft-alpha-hover:var(--yellow-a75);--color-background-caution-soft-alpha-active:var(--yellow-a75);--color-background-caution-solid:var(--yellow-600);--color-background-caution-solid-hover:var(--yellow-700);--color-background-caution-solid-active:var(--yellow-700);--color-text-caution-solid:var(--white);--color-background-caution-outline-hover:var(--yellow-a25);--color-background-caution-outline-active:var(--yellow-a25);--color-border-caution-outline:var(--yellow-700);--color-border-caution-outline-hover:var(--yellow-700);--color-text-caution-outline:var(--yellow-700);--color-text-caution-outline-hover:var(--yellow-700);--color-background-caution-ghost-hover:var(--yellow-a50);--color-background-caution-ghost-active:var(--yellow-a50);--color-text-caution-ghost:var(--yellow-700);--color-text-caution-ghost-hover:var(--yellow-700);--color-ring-caution:var(--color-ring);--color-ring-caution-soft:var(--color-ring-caution);--color-ring-caution-solid:var(--color-ring-caution);--color-ring-caution-outline:var(--color-ring-caution);--color-ring-caution-ghost:var(--color-ring-caution);--color-background-danger-soft:var(--red-50);--color-background-danger-soft-hover:var(--red-75);--color-background-danger-soft-active:var(--red-75);--color-background-danger-soft-alpha:var(--red-a50);--color-background-danger-soft-alpha-hover:var(--red-a75);--color-background-danger-soft-alpha-active:var(--red-a75);--color-background-danger-solid:var(--red-500);--color-background-danger-solid-hover:var(--red-600);--color-background-danger-solid-active:var(--red-600);--color-text-danger-solid:var(--white);--color-background-danger-outline-hover:var(--red-a25);--color-background-danger-outline-active:var(--red-a25);--color-border-danger-outline:var(--red-500);--color-border-danger-outline-hover:var(--red-500);--color-text-danger-outline:var(--red-500);--color-text-danger-outline-hover:var(--red-500);--color-background-danger-ghost-hover:var(--red-a50);--color-background-danger-ghost-active:var(--red-a50);--color-text-danger-ghost:var(--red-500);--color-text-danger-ghost-hover:var(--red-500);--color-ring-danger:var(--red-200);--color-ring-danger-soft:var(--color-ring-danger);--color-ring-danger-solid:var(--color-ring-danger);--color-ring-danger-outline:var(--color-ring-danger);--color-ring-danger-ghost:var(--color-ring-danger);--color-background-success-soft:var(--green-50);--color-background-success-soft-hover:var(--green-75);--color-background-success-soft-active:var(--green-75);--color-background-success-soft-alpha:var(--green-a50);--color-background-success-soft-alpha-hover:var(--green-a75);--color-background-success-soft-alpha-active:var(--green-a75);--color-text-success-solid:var(--white);--color-background-success-outline-hover:var(--green-a25);--color-background-success-outline-active:var(--green-a25);--color-text-success-outline:var(--green-500);--color-text-success-outline-hover:var(--green-500);--color-background-success-ghost-hover:var(--green-a50);--color-background-success-ghost-active:var(--green-a50);--color-text-success-ghost:var(--green-500);--color-text-success-ghost-hover:var(--green-500);--color-ring-success:var(--color-ring);--color-ring-success-soft:var(--color-ring-info);--color-ring-success-solid:var(--color-ring-info);--color-ring-success-outline:var(--color-ring-info);--color-ring-success-ghost:var(--color-ring-info);--color-background-discovery-soft:var(--purple-50);--color-background-discovery-soft-hover:var(--purple-75);--color-background-discovery-soft-active:var(--purple-75);--color-background-discovery-soft-alpha:var(--purple-a50);--color-background-discovery-soft-alpha-hover:var(--purple-a75);--color-background-discovery-soft-alpha-active:var(--purple-a75);--color-background-discovery-solid:var(--purple-400);--color-background-discovery-solid-hover:var(--purple-500);--color-background-discovery-solid-active:var(--purple-500);--color-text-discovery-solid:var(--white);--color-background-discovery-outline-hover:var(--purple-a25);--color-background-discovery-outline-active:var(--purple-a25);--color-border-discovery-outline:var(--purple-500);--color-border-discovery-outline-hover:var(--purple-500);--color-background-discovery-ghost-hover:var(--purple-a50);--color-background-discovery-ghost-active:var(--purple-a50);--color-text-discovery-ghost:var(--purple-500);--color-text-discovery-ghost-hover:var(--purple-500);--color-ring-discovery:var(--color-ring);--color-ring-discovery-soft:var(--color-ring);--color-ring-discovery-solid:var(--color-ring);--color-ring-discovery-outline:var(--color-ring);--color-ring-discovery-ghost:var(--color-ring);--color-background-disabled:var(--alpha-05);--color-border-disabled:var(--alpha-06);--font-tracking-wide:0em;--font-tracking-normal:0em;--font-tracking-tight:0em;--font-heading-5xl-size:4.5rem;--font-heading-5xl-line-height:4.5rem;--font-heading-5xl-weight:var(--font-weight-semibold);--font-heading-5xl-tracking:var(--tracking-tight);--font-heading-4xl-size:3.75rem;--font-heading-4xl-line-height:3.75rem;--font-heading-4xl-weight:var(--font-weight-semibold);--font-heading-4xl-tracking:var(--tracking-tight);--font-heading-3xl-size:3rem;--font-heading-3xl-line-height:3rem;--font-heading-3xl-weight:var(--font-weight-semibold);--font-heading-3xl-tracking:var(--tracking-tight);--font-heading-2xl-size:2.25rem;--font-heading-2xl-line-height:2.625rem;--font-heading-2xl-weight:var(--font-weight-semibold);--font-heading-2xl-tracking:var(--tracking-tight);--font-heading-xl-size:2rem;--font-heading-xl-line-height:2.375rem;--font-heading-xl-weight:var(--font-weight-semibold);--font-heading-xl-tracking:var(--tracking-tight);--font-heading-lg-size:1.5rem;--font-heading-lg-line-height:1.75rem;--font-heading-lg-weight:var(--font-weight-semibold);--font-heading-lg-tracking:var(--tracking-normal);--font-heading-md-size:1.25rem;--font-heading-md-line-height:1.625rem;--font-heading-md-weight:var(--font-weight-semibold);--font-heading-md-tracking:var(--tracking-normal);--font-heading-sm-size:1.125rem;--font-heading-sm-line-height:1.625rem;--font-heading-sm-weight:var(--font-weight-semibold);--font-heading-sm-tracking:var(--tracking-normal);--font-heading-xs-size:1rem;--font-heading-xs-line-height:1.5rem;--font-heading-xs-weight:var(--font-weight-semibold);--font-heading-xs-tracking:var(--tracking-normal);--font-text-lg-size:1.125rem;--font-text-lg-line-height:1.8125rem;--font-text-lg-weight:var(--font-weight-normal);--font-text-lg-tracking:var(--tracking-normal);--font-text-md-size:1rem;--font-text-md-line-height:1.5rem;--font-text-md-weight:var(--font-weight-normal);--font-text-md-tracking:var(--tracking-normal);--font-text-sm-size:.875rem;--font-text-sm-line-height:1.25rem;--font-text-sm-weight:var(--font-weight-normal);--font-text-sm-tracking:var(--tracking-normal);--font-text-xs-size:.75rem;--font-text-xs-line-height:1.125rem;--font-text-xs-weight:var(--font-weight-normal);--font-text-xs-tracking:var(--tracking-wide);--font-text-2xs-size:.625rem;--font-text-2xs-line-height:.875rem;--font-text-2xs-weight:var(--font-weight-normal);--font-text-2xs-tracking:var(--tracking-wide);--font-text-3xs-size:.5rem;--font-text-3xs-line-height:.75rem;--font-text-3xs-weight:var(--font-weight-normal);--font-text-3xs-tracking:var(--tracking-wide);--control-size-3xs:1.375rem;--control-size-2xs:1.5rem;--control-size-xs:1.625rem;--control-size-sm:1.75rem;--control-size-md:2rem;--control-size-lg:2.25rem;--control-size-xl:2.5rem;--control-size-2xl:2.75rem;--control-size-3xl:3rem;--control-gutter-2xs:.375rem;--control-gutter-xs:.5rem;--control-gutter-sm:.625rem;--control-gutter-md:.75rem;--control-gutter-lg:.875rem;--control-gutter-xl:1rem;--control-gutter-pill-scaling:1.33;--control-radius-sm:var(--radius-sm);--control-radius-md:var(--radius-md);--control-radius-lg:var(--radius-lg);--control-radius-xl:var(--radius-xl);--control-font-size-sm:var(--font-text-xs-size);--control-font-size-md:var(--font-text-sm-size);--control-font-size-lg:var(--font-text-md-size);--control-icon-size-xs:.875rem;--control-icon-size-sm:1rem;--control-icon-size-md:1.125rem;--control-icon-size-lg:1.25rem;--control-icon-size-xl:1.375rem;--control-icon-size-2xl:1.5rem;--cubic-enter:cubic-bezier(.19, 1, .22, 1);--cubic-exit:cubic-bezier(.8, 0, .4, 1);--cubic-exit-snappy:cubic-bezier(.65, 0, .4, 1);--cubic-move:cubic-bezier(.65, 0, .35, 1);--transition-duration-basic:.15s;--transition-ease-basic:ease;--scrollbar-color:var(--alpha-30);--shadow-hairline:0 0 0 var(--shadow-hairline-width) var(--shadow-hairline-color);--shadow-100:var(--elevation-100-geo) rgb(var(--shadow-color) / var(--shadow-alpha-100));--shadow-100-strong:var(--elevation-100-geo) rgb(var(--shadow-color) / calc(var(--shadow-alpha-100) * 1.25));--shadow-100-stronger:var(--elevation-100-geo) rgb(var(--shadow-color) / calc(var(--shadow-alpha-100) * 1.6));--shadow-200:var(--elevation-200-geo) rgb(var(--shadow-color) / var(--shadow-alpha-200));--shadow-200-strong:var(--elevation-200-geo) rgb(var(--shadow-color) / calc(var(--shadow-alpha-200) * 1.25));--shadow-200-stronger:var(--elevation-200-geo) rgb(var(--shadow-color) / calc(var(--shadow-alpha-200) * 1.6));--shadow-300:var(--elevation-300-geo) rgb(var(--shadow-color) / var(--shadow-alpha-300));--shadow-300-strong:var(--elevation-300-geo) rgb(var(--shadow-color) / calc(var(--shadow-alpha-300) * 1.25));--shadow-300-stronger:var(--elevation-300-geo) rgb(var(--shadow-color) / calc(var(--shadow-alpha-300) * 1.6));--shadow-400:var(--elevation-400-geo) rgb(var(--shadow-color) / var(--shadow-alpha-400));--shadow-400-strong:var(--elevation-400-geo) rgb(var(--shadow-color) / calc(var(--shadow-alpha-400) * 1.25));--shadow-400-stronger:var(--elevation-400-geo) rgb(var(--shadow-color) / calc(var(--shadow-alpha-400) * 1.6))}:where(:root),:where([data-theme=light]){--color-text-secondary:var(--gray-500);--color-text-tertiary:var(--gray-400);--color-ring:var(--blue-500);--color-background-primary-soft:var(--gray-100);--color-background-primary-soft-hover:var(--gray-150);--color-background-primary-soft-active:var(--gray-200);--color-background-primary-soft-alpha:var(--alpha-08);--color-background-primary-soft-alpha-hover:var(--alpha-12);--color-background-primary-soft-alpha-active:var(--alpha-16);--color-background-primary-surface:var(--alpha-05);--color-border-primary-surface:var(--alpha-05);--color-background-primary-solid:var(--gray-900);--color-background-primary-solid-hover:var(--gray-700);--color-background-primary-solid-active:var(--gray-600);--color-background-primary-outline-hover:var(--alpha-02);--color-background-primary-outline-active:var(--alpha-04);--color-border-primary-outline:var(--alpha-16);--color-border-primary-outline-hover:var(--alpha-20);--color-background-primary-ghost-hover:var(--alpha-08);--color-background-primary-ghost-active:var(--alpha-12);--color-background-secondary-soft:var(--gray-100);--color-background-secondary-soft-hover:var(--gray-150);--color-background-secondary-soft-active:var(--gray-200);--color-background-secondary-soft-alpha:var(--alpha-08);--color-background-secondary-soft-alpha-hover:var(--alpha-12);--color-background-secondary-soft-alpha-active:var(--alpha-16);--color-background-secondary-solid:var(--gray-500);--color-background-secondary-solid-hover:var(--gray-600);--color-background-secondary-solid-active:var(--gray-700);--color-background-secondary-outline-hover:var(--alpha-02);--color-background-secondary-outline-active:var(--alpha-04);--color-border-secondary-outline:var(--alpha-16);--color-border-secondary-outline-hover:var(--alpha-20);--color-background-secondary-ghost-hover:var(--alpha-08);--color-background-secondary-ghost-active:var(--alpha-12);--color-text-info:var(--blue-500);--color-text-info-soft:var(--blue-600);--color-background-info-surface:var(--blue-a25);--color-border-info-surface:var(--blue-a25);--color-text-info-surface:var(--blue-600);--color-text-info-ghost:var(--blue-500);--color-text-info-ghost-hover:var(--blue-500);--color-text-warning:var(--orange-700);--color-text-warning-soft:var(--orange-700);--color-background-warning-surface:var(--orange-a25);--color-border-warning-surface:var(--orange-a25);--color-text-warning-surface:var(--orange-700);--color-text-caution:var(--yellow-700);--color-text-caution-soft:var(--yellow-800);--color-background-caution-surface:var(--yellow-a25);--color-border-caution-surface:var(--yellow-a25);--color-text-caution-surface:var(--yellow-800);--color-text-danger:var(--red-700);--color-text-danger-soft:var(--red-600);--color-background-danger-surface:var(--red-a25);--color-border-danger-surface:var(--red-a25);--color-text-danger-surface:var(--red-600);--color-text-success:var(--green-700);--color-text-success-soft:var(--green-600);--color-background-success-surface:var(--green-a25);--color-border-success-surface:var(--green-a25);--color-text-success-surface:var(--green-600);--color-background-success-solid:var(--green-500);--color-background-success-solid-hover:var(--green-500);--color-background-success-solid-active:var(--green-500);--color-border-success-outline:var(--green-500);--color-border-success-outline-hover:var(--green-500);--color-text-discovery:var(--purple-700);--color-text-discovery-soft:var(--purple-600);--color-background-discovery-surface:var(--purple-a25);--color-border-discovery-surface:var(--purple-a25);--color-text-discovery-surface:var(--purple-600);--color-text-discovery-outline:var(--purple-500);--color-text-discovery-outline-hover:var(--purple-500);--color-text-disabled:var(--gray-400);--color-border-subtle:var(--alpha-05);--color-border:var(--alpha-10);--color-border-strong:var(--alpha-15);--shadow:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--color-surface:var(--gray-0);--color-surface-secondary:var(--gray-50);--color-surface-tertiary:var(--gray-75);--color-surface-elevated:var(--gray-0);--color-surface-elevated-secondary:var(--gray-50)}:where([data-theme=dark]){--color-text-secondary:var(--gray-700);--color-text-tertiary:var(--gray-600);--color-ring:var(--blue-400);--color-background-primary-soft:var(--gray-300);--color-background-primary-soft-hover:var(--gray-350);--color-background-primary-soft-active:var(--gray-400);--color-background-primary-soft-alpha:var(--alpha-12);--color-background-primary-soft-alpha-hover:var(--alpha-16);--color-background-primary-soft-alpha-active:var(--alpha-20);--color-background-primary-surface:var(--alpha-08);--color-border-primary-surface:var(--alpha-08);--color-background-primary-solid:var(--gray-950);--color-background-primary-solid-hover:var(--gray-900);--color-background-primary-solid-active:var(--gray-850);--color-background-primary-outline-hover:var(--alpha-04);--color-background-primary-outline-active:var(--alpha-06);--color-border-primary-outline:var(--alpha-25);--color-border-primary-outline-hover:var(--alpha-30);--color-background-primary-ghost-hover:var(--alpha-12);--color-background-primary-ghost-active:var(--alpha-16);--color-background-secondary-soft:var(--gray-300);--color-background-secondary-soft-hover:var(--gray-350);--color-background-secondary-soft-active:var(--gray-400);--color-background-secondary-soft-alpha:var(--alpha-12);--color-background-secondary-soft-alpha-hover:var(--alpha-16);--color-background-secondary-soft-alpha-active:var(--alpha-20);--color-background-secondary-solid:var(--gray-400);--color-background-secondary-solid-hover:var(--gray-450);--color-background-secondary-solid-active:var(--gray-500);--color-background-secondary-outline-hover:var(--alpha-04);--color-background-secondary-outline-active:var(--alpha-06);--color-border-secondary-outline:var(--alpha-25);--color-border-secondary-outline-hover:var(--alpha-30);--color-background-secondary-ghost-hover:var(--alpha-12);--color-background-secondary-ghost-active:var(--alpha-16);--color-text-info:var(--blue-200);--color-text-info-soft:var(--blue-300);--color-background-info-surface:var(--blue-a50);--color-border-info-surface:var(--blue-a50);--color-text-info-surface:var(--blue-300);--color-text-info-ghost:var(--blue-200);--color-text-info-ghost-hover:var(--blue-200);--color-text-warning:var(--orange-500);--color-text-warning-soft:var(--orange-400);--color-background-warning-surface:var(--orange-a50);--color-border-warning-surface:var(--orange-a50);--color-text-warning-surface:var(--orange-400);--color-text-caution:var(--yellow-500);--color-text-caution-soft:var(--yellow-400);--color-background-caution-surface:var(--yellow-a50);--color-border-caution-surface:var(--yellow-a50);--color-text-caution-surface:var(--yellow-400);--color-text-danger:var(--red-500);--color-text-danger-soft:var(--red-400);--color-background-danger-surface:var(--red-a50);--color-border-danger-surface:var(--red-a50);--color-text-danger-surface:var(--red-400);--color-text-success:var(--green-400);--color-text-success-soft:var(--green-400);--color-background-success-surface:var(--green-a50);--color-border-success-surface:var(--green-a50);--color-text-success-surface:var(--green-400);--color-background-success-solid:var(--green-600);--color-background-success-solid-hover:var(--green-600);--color-background-success-solid-active:var(--green-600);--color-border-success-outline:var(--green-600);--color-border-success-outline-hover:var(--green-600);--color-text-discovery:var(--purple-500);--color-text-discovery-soft:var(--purple-200);--color-background-discovery-surface:var(--purple-a50);--color-border-discovery-surface:var(--purple-a50);--color-text-discovery-surface:var(--purple-200);--color-text-discovery-outline:var(--purple-400);--color-text-discovery-outline-hover:var(--purple-400);--color-text-disabled:var(--gray-500);--color-border-subtle:var(--alpha-06);--color-border:var(--alpha-12);--color-border-strong:var(--alpha-20);--shadow:0 10px 15px -3px #0003, 0 4px 6px -4px #0003;--color-surface:var(--gray-200);--color-surface-secondary:var(--gray-100);--color-surface-tertiary:var(--gray-50);--color-surface-elevated:var(--gray-300);--color-surface-elevated-secondary:var(--gray-400)}:root,:where([data-theme]){--alert-border-radius:var(--radius-xl);--alert-gap:calc(var(--spacing) * 3);--alert-gutter:calc(var(--spacing) * 4);--alert-font-size:var(--font-text-sm-size);--alert-line-height:var(--font-text-sm-line-height);--alert-title-font-weight:var(--font-weight-semibold);--avatar-radius:var(--radius-full);--avatar-size:28px;--avatar-font-size-scaling:.5;--avatar-overflow-font-size-scaling-one:.45;--avatar-overflow-font-size-scaling-two:.37;--avatar-overflow-font-size-scaling-three:.3;--avatar-group-cutout-width:3px;--avatar-group-cutout-color:var(--color-surface);--avatar-group-spacing:-8px;--badge-gutter-sm:calc(var(--control-gutter-2xs) - 1px);--badge-gutter-md:var(--control-gutter-2xs);--badge-gutter-lg:var(--control-gutter-xs);--badge-size-sm:calc(var(--control-size-3xs) - 2px);--badge-size-md:var(--control-size-3xs);--badge-size-lg:var(--control-size-2xs);--badge-radius-sm:var(--radius-xs);--badge-radius-md:var(--radius-xs);--badge-radius-lg:var(--radius-sm);--badge-font-size-sm:var(--font-text-xs-size);--badge-font-size-md:var(--font-text-sm-size);--badge-font-size-lg:var(--font-text-sm-size);--badge-tracking-sm:var(--tracking-wide);--badge-tracking-md:var(--tracking-normal);--badge-tracking-lg:var(--tracking-normal);--badge-font-weight-sm:var(--font-weight-semibold);--badge-font-weight-md:var(--font-weight-semibold);--badge-font-weight-lg:var(--font-weight-semibold);--badge-icon-font-size-sm:var(--font-text-xs-size);--badge-icon-font-size-md:var(--font-text-md-size);--badge-icon-font-size-lg:var(--font-text-md-size);--badge-indicator-size-sm:var(--font-text-xs-size);--badge-indicator-size-md:var(--font-text-xs-size);--badge-indicator-size-lg:var(--font-text-sm-size);--button-gap-sm:3px;--button-gap-md:4px;--button-gap-lg:6px;--button-font-weight:var(--font-weight-medium);--input-gap-xs:4px;--input-gap-sm:6px;--input-gap-md:8px;--input-gap-lg:10px;--input-text-color:var(--color-text);--input-placeholder-text-color:var(--color-text-tertiary);--input-outline-border-color:var(--color-border-primary-outline);--input-outline-border-color-focus:var(--alpha-50);--input-soft-background-color:var(--color-background-primary-soft-alpha);--input-soft-border-color-focus:var(--alpha-20);--link-font-weight:inherit;--link-gap:calc(var(--spacing) * .5);--link-radius:var(--radius-sm);--link-underline-decoration-offset:.1em;--chat-max-width:800px;--chat-gutter:calc(var(--spacing) * 5);--chat-background-color:var(--color-surface);--thread-gutter:calc(var(--spacing) * 4);--composer-gutter:calc(var(--spacing) * 3);--composer-compact-gutter:calc(var(--spacing) * 2);--composer-radius:var(--radius-4xl);--composer-background-color:var(--color-surface-elevated);--smoothing-background-color:var(--color-surface);--user-message-text-color:var(--color-text);--source-list-gutter:var(--thread-gutter);--codeblock-background-color:var(--gray-25);--codeblock-syntax-4:var(--pink-500);--dialog-min-width:250px;--dialog-max-width:450px;--dialog-container-inner-padding:calc(var(--spacing) * 5);--dialog-backdrop-fade-background:var(--color-surface-elevated)}@supports (color:color-mix(in lab, red, red)){:root,:where([data-theme]){--dialog-backdrop-fade-background:color-mix(in oklab, var(--color-surface-elevated) 60%, transparent)}}:root,:where([data-theme]){--menu-gutter:calc(var(--spacing) * 1.5);--menu-radius:var(--radius-xl);--menu-font-size:var(--font-text-sm-size);--menu-line-height:var(--font-text-sm-line-height);--menu-item-padding:calc(var(--spacing) * 1.5) calc(var(--spacing) * 2);--menu-item-gap:calc(var(--spacing) * 1.5);--menu-separator-gutter:var(--menu-gutter) calc(-1 * var(--menu-gutter));--menu-separator-background-color:var(--color-border);--menu-radio-indicator-size:var(--font-text-lg-size);--menu-radio-indicator-hole-size:var(--font-text-3xs-size);--menu-checkbox-indicator-size:var(--font-text-lg-size);--modal-container-inner-padding:calc(var(--spacing) * 5);--popover-radius:var(--radius-xl);--radio-group-col-gap:calc(var(--spacing) * 2.5);--radio-group-row-gap:calc(var(--spacing) * 5);--radio-group-item-gap:calc(var(--spacing) * 1.5);--radio-group-item-font-size:var(--font-text-sm-size);--radio-group-item-line-height:var(--font-text-sm-line-height);--radio-group-indicator-size:var(--font-text-md-size);--radio-group-indicator-border-color:var(--color-border-primary-outline);--radio-group-indicator-border-color-hover:var(--alpha-25);--radio-group-indicator-background-color:var(--color-background-primary-solid);--radio-group-indicator-hole-size:.375rem;--radio-group-indicator-hole-background-color:var(--color-text-primary-solid);--segmented-control-gap:2px;--segmented-control-gutter:2px;--segmented-control-font-weight:var(--font-weight-semibold);--segmented-control-thumb-shadow:0 1px 4px -1px #0003;--segmented-control-option-highlight-gutter:1px;--select-control-font-weight:var(--font-weight-medium);--switch-track-width:32px;--switch-track-height:19px;--switch-thumb-offset:3px;--switch-thumb-size:calc(var(--switch-track-height) - 2 * var(--switch-thumb-offset));--switch-thumb-shadow:0 1px 2px #0003;--switch-label-gap:calc(var(--spacing) * 2)}:where(:root),:where([data-theme=light]){--avatar-image-border-color:var(--alpha-04);--input-outline-border-color-hover:var(--alpha-25);--input-border-color-invalid:var(--red-500);--link-primary-text-color:var(--blue-500);--link-primary-text-color-hover:var(--blue-800);--user-message-background-color:var(--alpha-05);--codeblock-syntax-1:#c0660d;--codeblock-syntax-2:var(--blue-500);--codeblock-syntax-3:var(--green-600);--codeblock-syntax-5:var(--purple-500);--dialog-backdrop-dim-background:#0000004d;--menu-item-background-color:var(--alpha-08);--modal-backdrop-background:#0000004d;--segmented-control-background:var(--gray-100);--segmented-control-thumb-background:var(--gray-0);--segmented-control-option-highlight-background-color:var(--gray-200);--slider-track-color:var(--gray-150);--slider-range-color:var(--gray-450);--switch-track-color:var(--gray-150);--switch-track-color-hover:var(--gray-200);--switch-track-color-checked:var(--gray-900);--switch-track-color-checked-disabled:var(--gray-300);--switch-track-color-disabled:var(--gray-100);--switch-thumb-color:var(--gray-0);--switch-thumb-color-disabled:var(--gray-0)}:where([data-theme=dark]){--avatar-image-border-color:var(--alpha-15);--input-outline-border-color-hover:var(--alpha-30);--input-border-color-invalid:var(--red-600);--link-primary-text-color:var(--blue-300);--link-primary-text-color-hover:var(--blue-400);--user-message-background-color:var(--alpha-08);--codeblock-syntax-1:var(--yellow-100);--codeblock-syntax-2:var(--blue-200);--codeblock-syntax-3:var(--green-300);--codeblock-syntax-5:var(--purple-300);--dialog-backdrop-dim-background:#00000080;--menu-item-background-color:var(--alpha-10);--modal-backdrop-background:#00000080;--segmented-control-background:var(--gray-0);--segmented-control-thumb-background:var(--gray-300);--segmented-control-option-highlight-background-color:var(--gray-300);--slider-track-color:var(--gray-400);--slider-range-color:var(--gray-600);--switch-track-color:var(--gray-400);--switch-track-color-hover:var(--gray-450);--switch-track-color-checked:var(--blue-400);--switch-track-color-checked-disabled:var(--blue-700);--switch-track-color-disabled:var(--gray-300);--switch-thumb-color:var(--gray-1000);--switch-thumb-color-disabled:var(--gray-800)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html,:host{font-synthesis-weight:none}textarea{resize:none}img,svg{flex-grow:0;flex-shrink:0}input,textarea,select,optgroup{appearance:none;box-shadow:none;filter:none;outline-offset:0;outline-width:2px}a,button,input,label,select,textarea,:where([aria-role=button]){touch-action:manipulation}button{text-transform:none;vertical-align:middle}button:not(:disabled),[role=button]:not(:disabled){cursor:pointer}pre{white-space:pre-wrap}table{border-spacing:0}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:none}html,:host{color:var(--color-text);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;letter-spacing:var(--tracking-normal)}[data-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{scrollbar-color:var(--scrollbar-color) transparent;scrollbar-width:thin}[data-exiting]{pointer-events:none}::placeholder{color:var(--color-text-tertiary)}b,strong{font-weight:var(--font-weight-semibold)}@font-face{font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_AMS-Regular.woff2)format("woff2")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Caligraphic-Bold.woff2)format("woff2")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Caligraphic-Regular.woff2)format("woff2")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Fraktur-Bold.woff2)format("woff2")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Fraktur-Regular.woff2)format("woff2")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Main-Bold.woff2)format("woff2")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Main-BoldItalic.woff2)format("woff2")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Main-Italic.woff2)format("woff2")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Main-Regular.woff2)format("woff2")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Math-BoldItalic.woff2)format("woff2")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Math-Italic.woff2)format("woff2")}@font-face{font-family:KaTeX_SansSerif;font-style:normal;font-weight:700;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_SansSerif-Bold.woff2)format("woff2")}@font-face{font-family:KaTeX_SansSerif;font-style:italic;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_SansSerif-Italic.woff2)format("woff2")}@font-face{font-family:KaTeX_SansSerif;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_SansSerif-Regular.woff2)format("woff2")}@font-face{font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Script-Regular.woff2)format("woff2")}@font-face{font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Size1-Regular.woff2)format("woff2")}@font-face{font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Size2-Regular.woff2)format("woff2")}@font-face{font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Size3-Regular.woff2)format("woff2")}@font-face{font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Size4-Regular.woff2)format("woff2")}@font-face{font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(https://cdn.openai.com/common/fonts/katex/KaTeX_Typewriter-Regular.woff2)format("woff2")}.katex{text-indent:0;text-rendering:auto;font:1.21em/1.2 KaTeX_Main,Times New Roman,serif}.katex *{border-color:currentColor;-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:"0.16.0"}.katex .katex-mathml{clip:rect(1px, 1px, 1px, 1px);border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{white-space:nowrap;width:min-content;position:relative}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;table-layout:fixed;display:inline-table}.katex .vlist-r{display:table-row}.katex .vlist{vertical-align:bottom;display:table-cell;position:relative}.katex .vlist>span{height:0;display:block;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{width:0;overflow:hidden}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{vertical-align:bottom;width:2px;min-width:2px;font-size:1px;display:table-cell}.katex .vbox{flex-direction:column;align-items:baseline;display:inline-flex}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{flex-direction:row;display:inline-flex}.katex .thinbox{width:0;max-width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;width:100%;display:inline-block}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;width:100%;display:inline-block}.katex .hdashline{border-bottom-style:dashed;width:100%;display:inline-block}.katex .sqrt>.root{margin-left:.277778em;margin-right:-.555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.833333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.714286em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.857143em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14286em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71429em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96286em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55429em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.416667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.583333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.833333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.347222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.416667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.486111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.694444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.833333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44028em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.289352em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.347222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.405093em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.462963em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.520833em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.578704em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.694444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.833333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.289296em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.337512em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.385728em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.433944em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.578592em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.694311em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.833173em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.200965em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.241158em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.281351em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.321543em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.361736em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.401929em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.482315em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.578778em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.694534em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.833601em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{width:.12em;display:inline-block}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{min-width:1px;display:inline-block}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{width:100%;height:inherit;fill:currentColor;fill-opacity:1;fill-rule:nonzero;stroke:currentColor;stroke-dasharray:none;stroke-dashoffset:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-width:1px;display:block;position:absolute}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;max-width:none;min-height:0;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{width:50.2%;position:absolute;left:0;overflow:hidden}.katex .halfarrow-right{width:50.2%;position:absolute;right:0;overflow:hidden}.katex .brace-left{width:25.1%;position:absolute;left:0;overflow:hidden}.katex .brace-center{width:50%;position:absolute;left:25%;overflow:hidden}.katex .brace-right{width:25.1%;position:absolute;right:0;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{box-sizing:border-box;border-top:.049em solid;border-right:.049em solid;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{text-align:left;display:inline-block;position:absolute;right:calc(50% + .3em)}.katex .cd-label-right{text-align:right;display:inline-block;position:absolute;left:calc(50% + .3em)}.katex-display{text-align:center;margin:1em 0;display:block}.katex-display>.katex{text-align:center;white-space:nowrap;display:block}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left;padding-left:2em}body{counter-reset:katexEqnNo mmlEqnNo}}@layer components{._Badge_1viyg_1{--indicator-size:var(--badge-indicator-size);align-items:center;gap:calc(var(--spacing) * 1);height:var(--badge-size);padding:0 var(--badge-gutter);border-radius:var(--badge-radius);font-size:var(--badge-font-size);font-weight:var(--badge-font-weight);letter-spacing:var(--badge-tracking);white-space:nowrap;display:inline-flex}._Badge_1viyg_1 svg{font-size:var(--badge-icon-font-size)}:where(._Badge_1viyg_1 svg:first-child:not(:only-child)){margin-left:var(--badge-icon-offset,-1px)}:where(._Badge_1viyg_1 svg:last-child:not(:only-child)){margin-right:var(--badge-icon-offset,-1px)}._Badge_1viyg_1[data-variant=soft]{background-color:var(--badge-background-color);color:var(--badge-text-color)}._Badge_1viyg_1[data-variant=soft]:where([data-color=secondary]){--badge-background-color:var(--color-background-secondary-soft-alpha);--badge-text-color:var(--color-text-secondary-soft)}._Badge_1viyg_1[data-variant=soft]:where([data-color=success]){--badge-background-color:var(--color-background-success-soft-alpha);--badge-text-color:var(--color-text-success-soft)}._Badge_1viyg_1[data-variant=soft]:where([data-color=warning]){--badge-background-color:var(--color-background-warning-soft-alpha);--badge-text-color:var(--color-text-warning-soft)}._Badge_1viyg_1[data-variant=soft]:where([data-color=danger]){--badge-background-color:var(--color-background-danger-soft-alpha);--badge-text-color:var(--color-text-danger-soft)}._Badge_1viyg_1[data-variant=soft]:where([data-color=info]){--badge-background-color:var(--color-background-info-soft-alpha);--badge-text-color:var(--color-text-info-soft)}._Badge_1viyg_1[data-variant=soft]:where([data-color=discovery]){--badge-background-color:var(--color-background-discovery-soft-alpha);--badge-text-color:var(--color-text-discovery-soft)}._Badge_1viyg_1[data-variant=solid]{background-color:var(--badge-background-color);color:var(--badge-text-color)}._Badge_1viyg_1[data-variant=solid]:where([data-color=secondary]){--badge-background-color:var(--color-background-secondary-solid);--badge-text-color:var(--color-text-secondary-solid)}._Badge_1viyg_1[data-variant=solid]:where([data-color=success]){--badge-background-color:var(--color-background-success-solid);--badge-text-color:var(--color-text-success-solid)}._Badge_1viyg_1[data-variant=solid]:where([data-color=warning]){--badge-background-color:var(--color-background-warning-solid);--badge-text-color:var(--color-text-warning-solid)}._Badge_1viyg_1[data-variant=solid]:where([data-color=danger]){--badge-background-color:var(--color-background-danger-solid);--badge-text-color:var(--color-text-danger-solid)}._Badge_1viyg_1[data-variant=solid]:where([data-color=info]){--badge-background-color:var(--color-background-info-solid);--badge-text-color:var(--color-text-info-solid)}._Badge_1viyg_1[data-variant=solid]:where([data-color=discovery]){--badge-background-color:var(--color-background-discovery-solid);--badge-text-color:var(--color-text-discovery-solid)}._Badge_1viyg_1[data-variant=outline]{box-shadow:0 0 0 1px var(--badge-border-color) inset;color:var(--badge-text-color)}._Badge_1viyg_1[data-variant=outline]:where([data-color=secondary]){--badge-border-color:var(--color-border-secondary-outline);--badge-text-color:var(--color-text-secondary-outline)}._Badge_1viyg_1[data-variant=outline]:where([data-color=success]){--badge-border-color:var(--color-border-success-outline);--badge-text-color:var(--color-text-success-outline)}._Badge_1viyg_1[data-variant=outline]:where([data-color=warning]){--badge-border-color:var(--color-border-warning-outline);--badge-text-color:var(--color-text-warning-outline)}._Badge_1viyg_1[data-variant=outline]:where([data-color=danger]){--badge-border-color:var(--color-border-danger-outline);--badge-text-color:var(--color-text-danger-outline)}._Badge_1viyg_1[data-variant=outline]:where([data-color=info]){--badge-border-color:var(--color-border-info-outline);--badge-text-color:var(--color-text-info-outline)}._Badge_1viyg_1[data-variant=outline]:where([data-color=discovery]){--badge-border-color:var(--color-border-discovery-outline);--badge-text-color:var(--color-text-discovery-outline)}._Badge_1viyg_1:where([data-size=sm]){--badge-size:var(--badge-size-sm);--badge-gutter:var(--badge-gutter-sm);--badge-font-size:var(--badge-font-size-sm);--badge-font-weight:var(--badge-font-weight-sm);--badge-tracking:var(--badge-tracking-sm);--badge-radius:var(--badge-radius-sm);--badge-icon-font-size:var(--badge-icon-font-size-sm);--badge-indicator-size:var(--badge-indicator-size-sm)}._Badge_1viyg_1:where([data-size=md]){--badge-size:var(--badge-size-md);--badge-gutter:var(--badge-gutter-md);--badge-font-size:var(--badge-font-size-md);--badge-font-weight:var(--badge-font-weight-md);--badge-tracking:var(--badge-tracking-md);--badge-radius:var(--badge-radius-md);--badge-icon-font-size:var(--badge-icon-font-size-md);--badge-indicator-size:var(--badge-indicator-size-md)}._Badge_1viyg_1:where([data-size=lg]){--badge-size:var(--badge-size-lg);--badge-gutter:var(--badge-gutter-lg);--badge-font-size:var(--badge-font-size-lg);--badge-font-weight:var(--badge-font-weight-lg);--badge-tracking:var(--badge-tracking-lg);--badge-radius:var(--badge-radius-lg);--badge-icon-font-size:var(--badge-icon-font-size-lg);--badge-indicator-size:var(--badge-indicator-size-lg)}._Badge_1viyg_1:where([data-pill]){--badge-radius:var(--radius-full);padding:0 calc(var(--badge-gutter) * var(--control-gutter-pill-scaling))}._LoadingIndicator_7yl6f_1{width:var(--indicator-size,1em);height:var(--indicator-size,1em);animation:_rotate_7yl6f_1 var(--indicator-rotate-duration,.8s) linear infinite;transition:opacity .15s;position:relative}._LoadingIndicator_7yl6f_1:before{border:var(--indicator-stroke,2px) solid var(--indicator-color,currentcolor);content:"";border-radius:50%;display:block;position:absolute;inset:0;-webkit-mask-image:conic-gradient(#0000,#000);mask-image:conic-gradient(#0000,#000)}._LoadingIndicator_7yl6f_1:after{width:var(--indicator-stroke,2px);height:var(--indicator-stroke,2px);margin-left:calc(var(--indicator-stroke,2px) * -1 / 2);background-color:var(--indicator-color,currentcolor);content:"";border-radius:100%;display:block;position:absolute;top:0;left:50%}@keyframes _rotate_7yl6f_1{0%{transform:rotate(0)}to{transform:rotate(1turn)}}._TransitionGroupChild_1hv1z_1{display:block}._Button_1864l_1{gap:var(--button-gap);height:var(--button-size);padding:0 var(--button-gutter);border-radius:var(--button-radius);cursor:pointer;font-size:var(--button-font-size);font-weight:var(--button-font-weight);transition-duration:var(--transition-duration-basic);transition-property:opacity,color;transition-timing-function:var(--transition-ease-basic);-webkit-user-select:none;user-select:none;white-space:nowrap;flex-shrink:0;line-height:1;display:inline-block;position:relative}._Button_1864l_1:before{border-radius:inherit;content:"";transition-duration:var(--transition-duration-basic);transition-property:opacity,background-color,transform,box-shadow,border-color;transition-timing-function:var(--transition-ease-basic);will-change:transform;display:block;position:absolute;inset:0}._Button_1864l_1:after{border-radius:inherit;content:"";pointer-events:none;transition-duration:var(--transition-duration-basic);transition-property:transform;transition-timing-function:var(--transition-ease-basic);will-change:transform;display:block;position:absolute;inset:0}._Button_1864l_1:focus{outline:none}._Button_1864l_1:focus-visible:after{outline:2px solid var(--button-ring-color,var(--color-ring));outline-offset:var(--button-ring-offset,2px)}._Button_1864l_1 svg:where(:not([data-no-autosize])){width:var(--button-icon-size);height:var(--button-icon-size)}:where(._Button_1864l_1 svg:where(:not([data-no-autosize])):first-child:not(:only-child)){margin-left:var(--button-icon-offset,-1px)}:where(._Button_1864l_1 svg:where(:not([data-no-autosize])):last-child:not(:only-child)){margin-right:var(--button-icon-offset,-1px)}._Button_1864l_1:where([data-optically-align=start]){margin-inline-start:calc(var(--button-gutter) * -1)}._Button_1864l_1:where([data-optically-align=end]){margin-inline-end:calc(var(--button-gutter) * -1)}._Button_1864l_1:where([data-optically-align=start][data-uniform]){margin-inline-start:calc(((var(--button-size) - var(--button-icon-size)) / 2) * -1)}._Button_1864l_1:where([data-optically-align=end][data-uniform]){margin-inline-end:calc(((var(--button-size) - var(--button-icon-size)) / 2) * -1)}._Button_1864l_1:where([data-size="3xs"]){--button-size:var(--control-size-3xs);--button-gutter:var(--control-gutter-2xs);--button-font-size:var(--control-font-size-sm);--button-icon-size:var(--control-icon-size-xs);--button-gap:var(--button-gap-sm);--button-radius:var(--control-radius-sm);--button-icon-offset:-1px;--indicator-size:11px;--circular-progress-size:11px}._Button_1864l_1:where([data-size="2xs"]){--button-size:var(--control-size-2xs);--button-gutter:var(--control-gutter-xs);--button-font-size:var(--control-font-size-sm);--button-icon-size:var(--control-icon-size-sm);--button-gap:var(--button-gap-md);--button-radius:var(--control-radius-sm);--button-icon-offset:-1px;--indicator-size:12px;--circular-progress-size:12px}._Button_1864l_1:where([data-size=xs]){--button-size:var(--control-size-xs);--button-gutter:var(--control-gutter-xs);--button-font-size:var(--control-font-size-md);--button-icon-size:var(--control-icon-size-sm);--button-gap:var(--button-gap-md);--button-radius:var(--control-radius-sm);--button-icon-offset:-1px;--indicator-size:13px;--circular-progress-size:14px}._Button_1864l_1:where([data-size=sm]){--button-size:var(--control-size-sm);--button-gutter:var(--control-gutter-sm);--button-font-size:var(--control-font-size-md);--button-icon-size:var(--control-icon-size-md);--button-gap:var(--button-gap-md);--button-radius:var(--control-radius-sm);--button-icon-offset:-1px;--indicator-size:15px;--circular-progress-size:15px}._Button_1864l_1:where([data-size=md]){--button-size:var(--control-size-md);--button-gutter:var(--control-gutter-md);--button-font-size:var(--control-font-size-md);--button-icon-size:var(--control-icon-size-md);--button-gap:var(--button-gap-lg);--button-radius:var(--control-radius-md);--button-icon-offset:-1px;--indicator-size:16px;--circular-progress-size:16px}._Button_1864l_1:where([data-size=lg]){--button-size:var(--control-size-lg);--button-gutter:var(--control-gutter-md);--button-font-size:var(--control-font-size-md);--button-icon-size:var(--control-icon-size-md);--button-gap:var(--button-gap-lg);--button-radius:var(--control-radius-md);--button-icon-offset:-1px;--indicator-size:16px;--circular-progress-size:16px}._Button_1864l_1:where([data-size=xl]){--button-size:var(--control-size-xl);--button-gutter:var(--control-gutter-lg);--button-font-size:var(--control-font-size-md);--button-icon-size:var(--control-icon-size-md);--button-gap:var(--button-gap-lg);--button-radius:var(--control-radius-lg);--button-icon-offset:-1px;--indicator-size:18px;--circular-progress-size:18px}._Button_1864l_1:where([data-size="2xl"]){--button-size:var(--control-size-2xl);--button-gutter:var(--control-gutter-lg);--button-font-size:var(--control-font-size-lg);--button-icon-size:var(--control-icon-size-lg);--button-gap:var(--button-gap-lg);--button-radius:var(--control-radius-xl);--button-icon-offset:-2px;--indicator-size:18px;--circular-progress-size:18px}._Button_1864l_1:where([data-size="3xl"]){--button-size:var(--control-size-3xl);--button-gutter:var(--control-gutter-xl);--button-font-size:var(--control-font-size-lg);--button-icon-size:var(--control-icon-size-lg);--button-gap:var(--button-gap-lg);--button-radius:var(--control-radius-xl);--button-icon-offset:-2px;--indicator-size:20px;--circular-progress-size:20px}._Button_1864l_1:where([data-gutter-size="2xs"]){--button-gutter:var(--control-gutter-2xs)}._Button_1864l_1:where([data-gutter-size=xs]){--button-gutter:var(--control-gutter-xs)}._Button_1864l_1:where([data-gutter-size=sm]){--button-gutter:var(--control-gutter-sm)}._Button_1864l_1:where([data-gutter-size=md]){--button-gutter:var(--control-gutter-md)}._Button_1864l_1:where([data-gutter-size=lg]){--button-gutter:var(--control-gutter-lg)}._Button_1864l_1:where([data-gutter-size=xl]){--button-gutter:var(--control-gutter-xl)}._Button_1864l_1:where([data-icon-size=sm]){--button-icon-size:var(--control-icon-size-sm)}._Button_1864l_1:where([data-icon-size=md]){--button-icon-size:var(--control-icon-size-md)}._Button_1864l_1:where([data-icon-size=lg]){--button-icon-size:var(--control-icon-size-lg)}._Button_1864l_1:where([data-icon-size=xl]){--button-icon-size:var(--control-icon-size-xl)}._Button_1864l_1:where([data-icon-size="2xl"]){--button-icon-size:var(--control-icon-size-2xl)}._Button_1864l_1:where([data-pill]){--button-radius:var(--radius-full);padding:0 calc(var(--button-gutter) * var(--control-gutter-pill-scaling))}._Button_1864l_1:where([data-block]){width:100%}._Button_1864l_1[data-uniform]{--button-gutter:0;width:var(--button-size)}._Button_1864l_1[data-variant=ghost]{--button-ring-offset:-1px;color:var(--button-text-color)}._Button_1864l_1[data-variant=ghost]:before{background-color:var(--button-background-color);opacity:0;transform:scale(var(--scale))}._Button_1864l_1[data-variant=ghost][aria-expanded=true],._Button_1864l_1[data-variant=ghost][data-state=open]{color:var(--button-text-color-hover)}._Button_1864l_1[data-variant=ghost][aria-expanded=true]:before,._Button_1864l_1[data-variant=ghost][data-state=open]:before{opacity:.6;transform:scale(1)}._Button_1864l_1[data-variant=ghost][data-selected]{color:var(--button-text-color-hover)}._Button_1864l_1[data-variant=ghost][data-selected]:before{opacity:1;transform:scale(1)}@media (hover:hover) and (pointer:fine){._Button_1864l_1[data-variant=ghost]:where(:not([data-disabled])):hover{color:var(--button-text-color-hover)}._Button_1864l_1[data-variant=ghost]:where(:not([data-disabled])):hover:before{opacity:1;transform:scale(1)}}._Button_1864l_1[data-variant=ghost]:where(:not([data-disabled])):active:before{background-color:var(--button-background-color-active);opacity:1;transform:scale(var(--scale))}._Button_1864l_1[data-variant=ghost]:where(:not([data-disabled])):active:after{transform:scale(var(--scale))}._Button_1864l_1[data-variant=ghost]:where([data-color=primary]){--button-background-color:var(--color-background-primary-ghost-hover);--button-background-color-active:var(--color-background-primary-ghost-active);--button-text-color:var(--color-text-primary-ghost);--button-text-color-hover:var(--color-text-primary-ghost-hover);--button-ring-color:var(--color-ring-primary-ghost)}._Button_1864l_1[data-variant=ghost]:where([data-color=secondary]){--button-background-color:var(--color-background-secondary-ghost-hover);--button-background-color-active:var(--color-background-secondary-ghost-active);--button-text-color:var(--color-text-secondary-ghost);--button-text-color-hover:var(--color-text-secondary-ghost-hover);--button-ring-color:var(--color-ring-secondary-ghost)}._Button_1864l_1[data-variant=ghost]:where([data-color=danger]){--button-background-color:var(--color-background-danger-ghost-hover);--button-background-color-active:var(--color-background-danger-ghost-active);--button-text-color:var(--color-text-danger-ghost);--button-text-color-hover:var(--color-text-danger-ghost-hover);--button-ring-color:var(--color-ring-danger-ghost)}._Button_1864l_1[data-variant=ghost]:where([data-color=success]){--button-background-color:var(--color-background-success-ghost-hover);--button-background-color-active:var(--color-background-success-ghost-active);--button-text-color:var(--color-text-success-ghost);--button-text-color-hover:var(--color-text-success-ghost-hover);--button-ring-color:var(--color-ring-success-ghost)}._Button_1864l_1[data-variant=ghost]:where([data-color=warning]){--button-background-color:var(--color-background-warning-ghost-hover);--button-background-color-active:var(--color-background-warning-ghost-active);--button-text-color:var(--color-text-warning-ghost);--button-text-color-hover:var(--color-text-warning-ghost-hover);--button-ring-color:var(--color-ring-warning-ghost)}._Button_1864l_1[data-variant=ghost]:where([data-color=caution]){--button-background-color:var(--color-background-caution-ghost-hover);--button-background-color-active:var(--color-background-caution-ghost-active);--button-text-color:var(--color-text-caution-ghost);--button-text-color-hover:var(--color-text-caution-ghost-hover);--button-ring-color:var(--color-ring-caution-ghost)}._Button_1864l_1[data-variant=ghost]:where([data-color=info]){--button-background-color:var(--color-background-info-ghost-hover);--button-background-color-active:var(--color-background-info-ghost-active);--button-text-color:var(--color-text-info-ghost);--button-text-color-hover:var(--color-text-info-ghost-hover);--button-ring-color:var(--color-ring-info-ghost)}._Button_1864l_1[data-variant=ghost]:where([data-color=discovery]){--button-background-color:var(--color-background-discovery-ghost-hover);--button-background-color-active:var(--color-background-discovery-ghost-active);--button-text-color:var(--color-text-discovery-ghost);--button-text-color-hover:var(--color-text-discovery-ghost-hover);--button-ring-color:var(--color-ring-discovery-ghost)}._Button_1864l_1[data-variant=solid]{color:var(--button-text-color)}._Button_1864l_1[data-variant=solid]:before{background-color:var(--button-background-color)}._Button_1864l_1[data-variant=solid][aria-expanded=true]:before,._Button_1864l_1[data-variant=solid][data-state=open]:before,._Button_1864l_1[data-variant=solid][data-selected]:before{background-color:var(--button-background-color-hover)}@media (hover:hover) and (pointer:fine){._Button_1864l_1[data-variant=solid]:where(:not([data-disabled])):hover:before{background-color:var(--button-background-color-hover)}}._Button_1864l_1[data-variant=solid]:where(:not([data-disabled])):active:before{background-color:var(--button-background-color-active)}._Button_1864l_1[data-variant=solid]:where(:not([data-disabled])):active:before,._Button_1864l_1[data-variant=solid]:where(:not([data-disabled])):active:after{transform:scale(var(--scale))}._Button_1864l_1[data-variant=solid]:where([data-color=primary]){--button-background-color:var(--color-background-primary-solid);--button-background-color-hover:var(--color-background-primary-solid-hover);--button-background-color-active:var(--color-background-primary-solid-active);--button-text-color:var(--color-text-primary-solid);--button-ring-color:var(--color-ring-primary-solid)}._Button_1864l_1[data-variant=solid]:where([data-color=secondary]){--button-background-color:var(--color-background-secondary-solid);--button-background-color-hover:var(--color-background-secondary-solid-hover);--button-background-color-active:var(--color-background-secondary-solid-active);--button-text-color:var(--color-text-secondary-solid);--button-ring-color:var(--color-ring-secondary-solid)}._Button_1864l_1[data-variant=solid]:where([data-color=success]){--button-background-color:var(--color-background-success-solid);--button-background-color-hover:var(--color-background-success-solid-hover);--button-background-color-active:var(--color-background-success-solid-active);--button-text-color:var(--color-text-success-solid);--button-ring-color:var(--color-ring-success-solid)}._Button_1864l_1[data-variant=solid]:where([data-color=danger]){--button-background-color:var(--color-background-danger-solid);--button-background-color-hover:var(--color-background-danger-solid-hover);--button-background-color-active:var(--color-background-danger-solid-active);--button-text-color:var(--color-text-danger-solid);--button-ring-color:var(--color-ring-danger-solid)}._Button_1864l_1[data-variant=solid]:where([data-color=warning]){--button-background-color:var(--color-background-warning-solid);--button-background-color-hover:var(--color-background-warning-solid-hover);--button-background-color-active:var(--color-background-warning-solid-active);--button-text-color:var(--color-text-warning-solid);--button-ring-color:var(--color-ring-warning-solid)}._Button_1864l_1[data-variant=solid]:where([data-color=caution]){--button-background-color:var(--color-background-caution-solid);--button-background-color-hover:var(--color-background-caution-solid-hover);--button-background-color-active:var(--color-background-caution-solid-active);--button-text-color:var(--color-text-caution-solid);--button-ring-color:var(--color-ring-caution-solid)}._Button_1864l_1[data-variant=solid]:where([data-color=info]){--button-background-color:var(--color-background-info-solid);--button-background-color-hover:var(--color-background-info-solid-hover);--button-background-color-active:var(--color-background-info-solid-active);--button-text-color:var(--color-text-info-solid);--button-ring-color:var(--color-ring-info-solid)}._Button_1864l_1[data-variant=solid]:where([data-color=discovery]){--button-background-color:var(--color-background-discovery-solid);--button-background-color-hover:var(--color-background-discovery-solid-hover);--button-background-color-active:var(--color-background-discovery-solid-active);--button-text-color:var(--color-text-discovery-solid);--button-ring-color:var(--color-ring-discovery-solid)}._Button_1864l_1[data-variant=soft]{color:var(--button-text-color)}._Button_1864l_1[data-variant=soft]:before{background-color:var(--button-background-color)}._Button_1864l_1[data-variant=soft][aria-expanded=true]:before,._Button_1864l_1[data-variant=soft][data-state=open]:before,._Button_1864l_1[data-variant=soft][data-selected]:before{background-color:var(--button-background-color-hover)}@media (hover:hover) and (pointer:fine){._Button_1864l_1[data-variant=soft]:where(:not([data-disabled])):hover:before{background-color:var(--button-background-color-hover)}}._Button_1864l_1[data-variant=soft]:where(:not([data-disabled])):active:before{background-color:var(--button-background-color-active)}._Button_1864l_1[data-variant=soft]:where(:not([data-disabled])):active:before,._Button_1864l_1[data-variant=soft]:where(:not([data-disabled])):active:after{transform:scale(var(--scale))}._Button_1864l_1[data-variant=soft]:where([data-color=primary]){--button-background-color:var(--color-background-primary-soft-alpha);--button-background-color-hover:var(--color-background-primary-soft-alpha-hover);--button-background-color-active:var(--color-background-primary-soft-alpha-active);--button-text-color:var(--color-text-primary-soft);--button-ring-color:var(--color-ring-primary-soft)}._Button_1864l_1[data-variant=soft]:where([data-color=secondary]){--button-background-color:var(--color-background-secondary-soft-alpha);--button-background-color-hover:var(--color-background-secondary-soft-alpha-hover);--button-background-color-active:var(--color-background-secondary-soft-alpha-active);--button-text-color:var(--color-text-secondary-soft);--button-ring-color:var(--color-ring-secondary-soft)}._Button_1864l_1[data-variant=soft]:where([data-color=success]){--button-background-color:var(--color-background-success-soft-alpha);--button-background-color-hover:var(--color-background-success-soft-alpha-hover);--button-background-color-active:var(--color-background-success-soft-alpha-active);--button-text-color:var(--color-text-success-soft);--button-ring-color:var(--color-ring-success-soft)}._Button_1864l_1[data-variant=soft]:where([data-color=danger]){--button-background-color:var(--color-background-danger-soft-alpha);--button-background-color-hover:var(--color-background-danger-soft-alpha-hover);--button-background-color-active:var(--color-background-danger-soft-alpha-active);--button-text-color:var(--color-text-danger-soft);--button-ring-color:var(--color-ring-danger-soft)}._Button_1864l_1[data-variant=soft]:where([data-color=warning]){--button-background-color:var(--color-background-warning-soft-alpha);--button-background-color-hover:var(--color-background-warning-soft-alpha-hover);--button-background-color-active:var(--color-background-warning-soft-alpha-active);--button-text-color:var(--color-text-warning-soft);--button-ring-color:var(--color-ring-warning-soft)}._Button_1864l_1[data-variant=soft]:where([data-color=caution]){--button-background-color:var(--color-background-caution-soft-alpha);--button-background-color-hover:var(--color-background-caution-soft-alpha-hover);--button-background-color-active:var(--color-background-caution-soft-alpha-active);--button-text-color:var(--color-text-caution-soft);--button-ring-color:var(--color-ring-caution-soft)}._Button_1864l_1[data-variant=soft]:where([data-color=info]){--button-background-color:var(--color-background-info-soft-alpha);--button-background-color-hover:var(--color-background-info-soft-alpha-hover);--button-background-color-active:var(--color-background-info-soft-alpha-active);--button-text-color:var(--color-text-info-soft);--button-ring-color:var(--color-ring-info-soft)}._Button_1864l_1[data-variant=soft]:where([data-color=discovery]){--button-background-color:var(--color-background-discovery-soft-alpha);--button-background-color-hover:var(--color-background-discovery-soft-alpha-hover);--button-background-color-active:var(--color-background-discovery-soft-alpha-active);--button-text-color:var(--color-text-discovery-soft);--button-ring-color:var(--color-ring-discovery-soft)}._Button_1864l_1[data-variant=outline]{--button-ring-offset:-1px;color:var(--button-text-color)}._Button_1864l_1[data-variant=outline]:before{box-shadow:0 0 0 1px var(--button-border-color) inset, var(--button-shadow-custom,0 0 #0000);background-color:#0000}._Button_1864l_1[data-variant=outline][aria-expanded=true],._Button_1864l_1[data-variant=outline][data-state=open],._Button_1864l_1[data-variant=outline][data-selected]{color:var(--button-text-color-hover)}._Button_1864l_1[data-variant=outline][aria-expanded=true]:before,._Button_1864l_1[data-variant=outline][data-state=open]:before,._Button_1864l_1[data-variant=outline][data-selected]:before{background-color:var(--button-background-color-hover);box-shadow:0 0 0 1px var(--button-border-color-hover) inset, var(--button-shadow-custom,0 0 #0000)}@media (hover:hover) and (pointer:fine){._Button_1864l_1[data-variant=outline]:where(:not([data-disabled])):hover{color:var(--button-text-color-hover)}._Button_1864l_1[data-variant=outline]:where(:not([data-disabled])):hover:before{background-color:var(--button-background-color-hover);box-shadow:0 0 0 1px var(--button-border-color-hover) inset, var(--button-shadow-custom,0 0 #0000)}}._Button_1864l_1[data-variant=outline]:where(:not([data-disabled])):active:before{background-color:var(--button-background-color-active);transform:scale(var(--scale))}._Button_1864l_1[data-variant=outline]:where(:not([data-disabled])):active:after{transform:scale(var(--scale))}._Button_1864l_1[data-variant=outline]:where([data-color=primary]){--button-background-color-hover:var(--color-background-primary-outline-hover);--button-background-color-active:var(--color-background-primary-outline-active);--button-border-color:var(--color-border-primary-outline);--button-border-color-hover:var(--color-border-primary-outline-hover);--button-text-color:var(--color-text-primary-outline);--button-text-color-hover:var(--color-text-primary-outline-hover);--button-ring-color:var(--color-ring-primary-outline)}._Button_1864l_1[data-variant=outline]:where([data-color=secondary]){--button-background-color-hover:var(--color-background-secondary-outline-hover);--button-background-color-active:var(--color-background-secondary-outline-active);--button-border-color:var(--color-border-secondary-outline);--button-border-color-hover:var(--color-border-secondary-outline-hover);--button-text-color:var(--color-text-secondary-outline);--button-text-color-hover:var(--color-text-secondary-outline-hover);--button-ring-color:var(--color-ring-secondary-outline)}._Button_1864l_1[data-variant=outline]:where([data-color=danger]){--button-background-color-hover:var(--color-background-danger-outline-hover);--button-background-color-active:var(--color-background-danger-outline-active);--button-border-color:var(--color-border-danger-outline);--button-border-color-hover:var(--color-border-danger-outline-hover);--button-text-color:var(--color-text-danger-outline);--button-text-color-hover:var(--color-text-danger-outline-hover);--button-ring-color:var(--color-ring-danger-outline)}._Button_1864l_1[data-variant=outline]:where([data-color=success]){--button-background-color-hover:var(--color-background-success-outline-hover);--button-background-color-active:var(--color-background-success-outline-active);--button-border-color:var(--color-border-success-outline);--button-border-color-hover:var(--color-border-success-outline-hover);--button-text-color:var(--color-text-success-outline);--button-text-color-hover:var(--color-text-success-outline-hover);--button-ring-color:var(--color-ring-success-outline)}._Button_1864l_1[data-variant=outline]:where([data-color=warning]){--button-background-color-hover:var(--color-background-warning-outline-hover);--button-background-color-active:var(--color-background-warning-outline-active);--button-border-color:var(--color-border-warning-outline);--button-border-color-hover:var(--color-border-warning-outline-hover);--button-text-color:var(--color-text-warning-outline);--button-text-color-hover:var(--color-text-warning-outline-hover);--button-ring-color:var(--color-ring-warning-outline)}._Button_1864l_1[data-variant=outline]:where([data-color=caution]){--button-background-color-hover:var(--color-background-caution-outline-hover);--button-background-color-active:var(--color-background-caution-outline-active);--button-border-color:var(--color-border-caution-outline);--button-border-color-hover:var(--color-border-caution-outline-hover);--button-text-color:var(--color-text-caution-outline);--button-text-color-hover:var(--color-text-caution-outline-hover);--button-ring-color:var(--color-ring-caution-outline)}._Button_1864l_1[data-variant=outline]:where([data-color=info]){--button-background-color-hover:var(--color-background-info-outline-hover);--button-background-color-active:var(--color-background-info-outline-active);--button-border-color:var(--color-border-info-outline);--button-border-color-hover:var(--color-border-info-outline-hover);--button-text-color:var(--color-text-info-outline);--button-text-color-hover:var(--color-text-info-outline-hover);--button-ring-color:var(--color-ring-info-outline)}._Button_1864l_1[data-variant=outline]:where([data-color=discovery]){--button-background-color-hover:var(--color-background-discovery-outline-hover);--button-background-color-active:var(--color-background-discovery-outline-active);--button-border-color:var(--color-border-discovery-outline);--button-border-color-hover:var(--color-border-discovery-outline-hover);--button-text-color:var(--color-text-discovery-outline);--button-text-color-hover:var(--color-text-discovery-outline-hover);--button-ring-color:var(--color-ring-discovery-outline)}._Button_1864l_1[disabled]{pointer-events:none}._Button_1864l_1[data-disabled][data-variant]{--button-background-color:var(--color-background-disabled);--button-border-color:var(--color-border-disabled);--button-text-color:var(--color-text-disabled);cursor:not-allowed;pointer-events:auto}._Button_1864l_1[data-disabled][data-variant]:active:before{transform:scale(1)}._Button_1864l_1[data-disabled][data-variant][data-disabled-tone=relaxed]{cursor:default}._ButtonInner_1864l_4{flex-direction:inherit;justify-content:center;align-items:center;gap:inherit;width:100%;height:100%;transition:opacity .15s .1s;display:flex;position:relative}[data-loading] ._ButtonInner_1864l_4{opacity:0;transition:opacity .3s}._ButtonLoader_1864l_749{z-index:3;pointer-events:none;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}._ButtonLoader_1864l_749[data-entering]{opacity:0}._ButtonLoader_1864l_749[data-exiting]{opacity:1}._ButtonLoader_1864l_749[data-entering-active],._ButtonLoader_1864l_749[data-entering][data-interrupted]{opacity:1;transition:opacity .15s .1s}._ButtonLoader_1864l_749[data-exiting-active],._ButtonLoader_1864l_749[data-exiting][data-interrupted]{opacity:0;transition:opacity .15s}}@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.inset-x-4{inset-inline:calc(var(--spacing) * 4)}.bottom-0{bottom:0}.bottom-4{bottom:calc(var(--spacing) * 4)}.left-0{left:0}.container{width:100%}@media (width>=380px){.container{max-width:380px}}@media (width>=576px){.container{max-width:576px}}@media (width>=768px){.container{max-width:768px}}@media (width>=1024px){.container{max-width:1024px}}@media (width>=1280px){.container{max-width:1280px}}@media (width>=1536px){.container{max-width:1536px}}.mx-auto{margin-inline:auto}.mx-px{margin-inline:1px}.my-2{margin-block:calc(var(--spacing) * 2)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-\[104px\]{width:104px;height:104px}.size-full{width:100%;height:100%}.h-0{height:0}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-\[var\(--button-icon-size\)\]{height:var(--button-icon-size)}.h-full{height:100%}.w-\[44\%\]{width:44%}.w-\[var\(--button-icon-size\)\]{width:var(--button-icon-size)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.min-w-\[120px\]{min-width:120px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.-rotate-90{rotate:-90deg}.rotate-90{rotate:90deg}.transform{transform:var(--tw-rotate-x, ) var(--tw-rotate-y, ) var(--tw-rotate-z, ) var(--tw-skew-x, ) var(--tw-skew-y, )}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:var(--radius-full)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-default{border-color:var(--color-border)}.border-primary-surface{border-color:var(--color-border-primary-surface)}.border-strong{border-color:var(--color-border-strong)}.border-subtle{border-color:var(--color-border-subtle)}.bg-danger-solid{background-color:var(--color-background-danger-solid)}.bg-info-solid{background-color:var(--color-background-info-solid)}.bg-primary-solid{background-color:var(--color-background-primary-solid)}.bg-primary-surface{background-color:var(--color-background-primary-surface)}.bg-secondary-solid{background-color:var(--color-background-secondary-solid)}.bg-surface{background-color:var(--color-surface)}.bg-surface-elevated{background-color:var(--color-surface-elevated)}.bg-surface-secondary{background-color:var(--color-surface-secondary)}.bg-surface-tertiary{background-color:var(--color-surface-tertiary)}.bg-warning-solid{background-color:var(--color-background-warning-solid)}.fill-secondary{fill:var(--color-text-secondary)}.stroke-\[var\(--color-border-subtle\)\]{stroke:var(--color-border-subtle)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.py-1{padding-block:var(--spacing)}.pt-1{padding-top:var(--spacing)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.heading-lg{font-size:var(--font-heading-lg-size);font-weight:var(--font-heading-lg-weight);letter-spacing:var(--font-heading-lg-tracking);line-height:var(--font-heading-lg-line-height)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height));letter-spacing:var(--tw-tracking,var(--text-2xl--letter-spacing));font-weight:var(--tw-font-weight,var(--text-2xl--font-weight))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height));letter-spacing:var(--tw-tracking,var(--text-3xl--letter-spacing));font-weight:var(--tw-font-weight,var(--text-3xl--font-weight))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height));letter-spacing:var(--tw-tracking,var(--text-4xl--letter-spacing));font-weight:var(--tw-font-weight,var(--text-4xl--font-weight))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));letter-spacing:var(--tw-tracking,var(--text-base--letter-spacing));font-weight:var(--tw-font-weight,var(--text-base--font-weight))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));letter-spacing:var(--tw-tracking,var(--text-lg--letter-spacing));font-weight:var(--tw-font-weight,var(--text-lg--font-weight))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));letter-spacing:var(--tw-tracking,var(--text-sm--letter-spacing));font-weight:var(--tw-font-weight,var(--text-sm--font-weight))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height));letter-spacing:var(--tw-tracking,var(--text-xl--letter-spacing));font-weight:var(--tw-font-weight,var(--text-xl--font-weight))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));letter-spacing:var(--tw-tracking,var(--text-xs--letter-spacing));font-weight:var(--tw-font-weight,var(--text-xs--font-weight))}.text-\[11px\]{font-size:11px}.leading-none{--tw-leading:1;line-height:1}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.text-ellipsis{text-overflow:ellipsis}.text-danger{color:var(--color-text-danger)}.text-default{color:var(--color-text)}.text-primary{color:var(--color-text-primary)}.text-secondary{color:var(--color-text-secondary)}.text-success{color:var(--color-text-success)}.text-tertiary{color:var(--color-text-tertiary)}.text-warning{color:var(--color-text-warning)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal, ) var(--tw-slashed-zero, ) var(--tw-numeric-figure, ) var(--tw-numeric-spacing, ) var(--tw-numeric-fraction, )}.underline{text-decoration-line:underline}.opacity-60{opacity:.6}.shadow-lg{--tw-shadow:var(--shadow-300);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-\[var\(--color-border-default\)\]{--tw-ring-color:var(--color-border-default)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, )}.filter{filter:var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, )}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.select-all{-webkit-user-select:all;user-select:all}@media (hover:hover) and (pointer:fine){.hover\:bg-surface-secondary:hover{background-color:var(--color-surface-secondary)}}@media (width>=576px){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}}body{background:0 0;margin:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}
118
118
  /*$vite$:1*/</style>
package/dist/release.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "schema": 1,
3
3
  "product": "vibefort-plugin",
4
- "version": "0.1.52",
5
- "seq": 29910109,
6
- "issuedAt": "2026-11-13T21:49:04.049Z",
7
- "expiresAt": "2027-12-18T21:49:04.049Z",
4
+ "version": "0.1.55",
5
+ "seq": 29911363,
6
+ "issuedAt": "2026-11-14T18:43:06.882Z",
7
+ "expiresAt": "2027-12-19T18:43:06.882Z",
8
8
  "keyId": "7c19bfe68d9fa025",
9
9
  "files": {
10
- "MANIFEST.sha256": "9523e685300a3a0cf9179f98b863eb6c2b1f3d6057dd8952383160b807dda213",
10
+ "MANIFEST.sha256": "ce05bb5879b029f7c788dd0714f8e7be55583876b31b7047fafa1dea4c31f0ef",
11
11
  "THIRD_PARTY_LICENSES.txt": "43acc2492adebae8e98d838a0f0b4b6e8e1d12073385b67306c123287a6051ad",
12
- "cli.js": "f1f23262dcf2fe49120dcc50d8d5c228d3c4ccd34976931c06bb9b1ec1ad44d2",
13
- "hook.js": "b5647dd61e739195912a5132d55b671dba78e1a100de72af11951ba8a0983306",
14
- "panel.html": "501dc52451ad036d7345b1cdf152b0e9ab6ecaaee718b13459983356f97ce43f",
15
- "rules/vibefort.yaml": "cb454e01aa8690db6a4589c97d9d683b866d93fae4163b516951ae1cc27774a8",
12
+ "cli.js": "8fefe91c2fb2db29ca083c2cc39cc79b1965699000f321f048166967c1d2866e",
13
+ "hook.js": "a62646a0b7b6e6888a60ac6694a01a9140ffe3130698c58f90daa70a29ec79dd",
14
+ "panel.html": "1139bc695cb606040ae3dca7d63fe4087de593c36a1c8a4683ec3b461b8cbbbb",
15
+ "rules/vibefortress.yaml": "cb454e01aa8690db6a4589c97d9d683b866d93fae4163b516951ae1cc27774a8",
16
16
  "scanners.lock.json": "86821fb93d339d54a9a5a1488128ec2bb313d04ec0213a6b88a58f9d6e94068c",
17
- "server.js": "9d9301fe27919ce338c60d78568155888f305da98fa04b1e45ddb350426b36c6"
17
+ "server.js": "25054b27dfa93de39332fa5ea096367191745928fa6e8dee5dd7ab6c64b27eda"
18
18
  }
19
19
  }
package/dist/release.sig CHANGED
@@ -1 +1 @@
1
- tnC7b0uTU8XO20botm7Od7kTO5sDHMI7Xxuiqu3WYiQaceKkGGcGqBH09mydnNkl9AUHkwXtwNARK3cCpYDHCw==
1
+ C4htl4PqMMFEFSAIdpSrSIMWrxXW9GapEbg4sorxQ7V6eQvyGtJQMkya8gnOi1iPT2WG1a64DwPGKISGb1dQDw==
package/dist/server.js CHANGED
@@ -37550,7 +37550,11 @@ var stateSchema = external_exports.object({
37550
37550
  });
37551
37551
 
37552
37552
  // src/local/state.ts
37553
- var home = () => process.env.VIBEFORT_HOME || process.env.CLAUDE_PLUGIN_DATA || join3(homedir(), ".vibefort");
37553
+ var home = () => {
37554
+ const set3 = process.env.VIBEFORTRESS_HOME || process.env.CLAUDE_PLUGIN_DATA;
37555
+ if (set3) return set3;
37556
+ return join3(homedir(), ".vibefortress");
37557
+ };
37554
37558
  function projectRoot(projectPath) {
37555
37559
  const abs = resolve(projectPath);
37556
37560
  let real = abs;
@@ -37958,7 +37962,7 @@ import { fileURLToPath } from "node:url";
37958
37962
  var here = dirname(fileURLToPath(import.meta.url));
37959
37963
  function assetPath(name) {
37960
37964
  const candidates = [
37961
- process.env.VIBEFORT_ASSETS_DIR ? join4(process.env.VIBEFORT_ASSETS_DIR, name) : "",
37965
+ process.env.VIBEFORTRESS_ASSETS_DIR ? join4(process.env.VIBEFORTRESS_ASSETS_DIR, name) : "",
37962
37966
  join4(here, name),
37963
37967
  join4(here, "..", "..", name)
37964
37968
  ].filter(Boolean);
@@ -38848,13 +38852,13 @@ var entryTrust = () => entry ? trustNow(entry) : null;
38848
38852
  function scanGate(env2 = process.env) {
38849
38853
  const t = entryTrust();
38850
38854
  if (!t || t.status !== "tampered") return null;
38851
- if (env2.VIBEFORT_ALLOW_UNVERIFIED === "1") return null;
38855
+ if (env2.VIBEFORTRESS_ALLOW_UNVERIFIED === "1") return null;
38852
38856
  return `${t.message} To fix this, remove the Vibe Fortress plugin and install it again from the marketplace. Your work is not affected; nothing was scanned.`;
38853
38857
  }
38854
38858
  function trustWarning(env2 = process.env) {
38855
38859
  const t = entryTrust();
38856
38860
  if (!t || t.status === "verified" || t.status === "unsigned") return null;
38857
- if (t.status === "tampered" && env2.VIBEFORT_ALLOW_UNVERIFIED === "1") return `Warning: ${t.message} (continuing because VIBEFORT_ALLOW_UNVERIFIED=1).`;
38861
+ if (t.status === "tampered" && env2.VIBEFORTRESS_ALLOW_UNVERIFIED === "1") return `Warning: ${t.message} (continuing because VIBEFORTRESS_ALLOW_UNVERIFIED=1).`;
38858
38862
  return t.message;
38859
38863
  }
38860
38864
  function appliedEffects(home2, now, keys = publicKeys()) {
@@ -39825,19 +39829,19 @@ var localHost = (h) => ["localhost", "127.0.0.1", "[::1]"].includes(h);
39825
39829
  function resolveConn(env2 = process.env) {
39826
39830
  const problems = [];
39827
39831
  let url2 = null;
39828
- const raw = env2.VIBEFORT_SERVER_URL?.trim() || serverFromFile();
39832
+ const raw = env2.VIBEFORTRESS_SERVER_URL?.trim() || serverFromFile();
39829
39833
  if (raw) {
39830
39834
  try {
39831
39835
  const u = new URL(raw);
39832
39836
  if (u.protocol === "https:" || u.protocol === "http:" && localHost(u.hostname)) url2 = u.origin;
39833
- else problems.push("VIBEFORT_SERVER_URL must be https (plain http is allowed only for localhost).");
39837
+ else problems.push("VIBEFORTRESS_SERVER_URL must be https (plain http is allowed only for localhost).");
39834
39838
  } catch {
39835
- problems.push("VIBEFORT_SERVER_URL is not a valid address.");
39839
+ problems.push("VIBEFORTRESS_SERVER_URL is not a valid address.");
39836
39840
  }
39837
- } else problems.push('VIBEFORT_SERVER_URL is not set (the address of your Vibe Fortress server, for example https://app.vibefort.example; set it in the environment or in ~/.vibefort/server.json as {"url": "..."}).');
39841
+ } else problems.push('VIBEFORTRESS_SERVER_URL is not set (the address of your Vibe Fortress server, for example https://app.vibefort.example; set it in the environment or in ~/.vibefortress/server.json as {"url": "..."}).');
39838
39842
  let token = null, tokenSource = null;
39839
- if (env2.VIBEFORT_SYNC_TOKEN?.trim()) {
39840
- token = env2.VIBEFORT_SYNC_TOKEN.trim();
39843
+ if (env2.VIBEFORTRESS_SYNC_TOKEN?.trim()) {
39844
+ token = env2.VIBEFORTRESS_SYNC_TOKEN.trim();
39841
39845
  tokenSource = "env";
39842
39846
  } else {
39843
39847
  const f2 = join14(home(), "sync-token");
@@ -39851,7 +39855,7 @@ function resolveConn(env2 = process.env) {
39851
39855
  }
39852
39856
  }
39853
39857
  }
39854
- if (!token) problems.push("No sync token: create one in the web app under Account > Sync tokens, then put it in the file ~/.vibefort/sync-token or the VIBEFORT_SYNC_TOKEN variable (not in chat).");
39858
+ if (!token) problems.push("No sync token: create one in the web app under Account > Sync tokens, then put it in the file ~/.vibefortress/sync-token or the VIBEFORTRESS_SYNC_TOKEN variable (not in chat).");
39855
39859
  else if (!token.startsWith("vft_")) {
39856
39860
  problems.push("The sync token does not look right (it starts with vft_).");
39857
39861
  token = null;
@@ -39934,7 +39938,7 @@ function statusText(state) {
39934
39938
  const on = state.settings.syncEnabled;
39935
39939
  return [
39936
39940
  `Sync is ${on ? "ON" : "OFF"} for this project (${projectName(state.project)}).`,
39937
- `Server: ${c.url ? new URL(c.url).host : "not set"}. Token: ${c.token ? `set (from ${c.tokenSource === "env" ? "VIBEFORT_SYNC_TOKEN" : "~/.vibefort/sync-token"})` : "not set"}.`,
39941
+ `Server: ${c.url ? new URL(c.url).host : "not set"}. Token: ${c.token ? `set (from ${c.tokenSource === "env" ? "VIBEFORTRESS_SYNC_TOKEN" : "~/.vibefortress/sync-token"})` : "not set"}.`,
39938
39942
  ...on && c.problems.length ? [`Not ready: ${c.problems.join(" ")}`] : [],
39939
39943
  on ? "Each finished scan sends a summary." : "Nothing is sent until you turn it on (local_sync enable).",
39940
39944
  SYNC_DISCLOSURE
@@ -39960,7 +39964,7 @@ function allowedServer(requested, env2 = process.env) {
39960
39964
  }
39961
39965
  if (LOCAL.has(u.hostname) && (u.protocol === "http:" || u.protocol === "https:")) return { url: u.origin };
39962
39966
  if (u.protocol === "https:" && (u.origin === configured || u.origin === PUBLIC_SERVER)) return { url: u.origin };
39963
- return { error: `The collector only sends to ${fallback}${configured && configured !== PUBLIC_SERVER ? ` or ${PUBLIC_SERVER}` : ""} or to this machine, and was asked to send to ${u.host}. Nothing was sent. If that is your own Vibe Fortress server, set VIBEFORT_SERVER_URL (or ~/.vibefort/server.json) to it.` };
39967
+ return { error: `The collector only sends to ${fallback}${configured && configured !== PUBLIC_SERVER ? ` or ${PUBLIC_SERVER}` : ""} or to this machine, and was asked to send to ${u.host}. Nothing was sent. If that is your own Vibe Fortress server, set VIBEFORTRESS_SERVER_URL (or ~/.vibefortress/server.json) to it.` };
39964
39968
  }
39965
39969
  var describe3 = (c) => {
39966
39970
  const b = c.bundle, review = b.files.filter((f2) => f2[3] !== null).length;
@@ -40811,7 +40815,7 @@ async function checkUpdates(o) {
40811
40815
  return r;
40812
40816
  };
40813
40817
  try {
40814
- const raw = env2.VIBEFORT_SERVER_URL?.trim();
40818
+ const raw = env2.VIBEFORTRESS_SERVER_URL?.trim();
40815
40819
  let base2 = null;
40816
40820
  if (raw) {
40817
40821
  try {
@@ -40820,7 +40824,7 @@ async function checkUpdates(o) {
40820
40824
  } catch {
40821
40825
  }
40822
40826
  }
40823
- if (!base2) return { outcome: "no_server", message: "No Vibe Fortress server address is set (VIBEFORT_SERVER_URL), so there is nothing to check. Rules keep working as they are." };
40827
+ if (!base2) return { outcome: "no_server", message: "No Vibe Fortress server address is set (VIBEFORTRESS_SERVER_URL), so there is nothing to check. Rules keep working as they are." };
40824
40828
  const st = readTrustState(o.home);
40825
40829
  if (!o.force && st.lastCheckAt && now.getTime() - Date.parse(st.lastCheckAt) < DAY2 && st.lastCheckOutcome !== "unreachable") return { outcome: "cached", message: `Checked less than a day ago (${st.lastCheckOutcome}); update ${st.updateSeq} is in force.` };
40826
40830
  let body;
@@ -40853,7 +40857,7 @@ import { resolve as resolve8 } from "node:path";
40853
40857
 
40854
40858
  // src/local/live/access.ts
40855
40859
  import { createHash as createHash9 } from "node:crypto";
40856
- var TRIAL_SENTENCE = "Live checks are part of the 30-day trial and the Pro plan. Start the trial by signing in to the Vibe Fortress web app (it needs no card); then create a sync token under Account and put it in ~/.vibefort/sync-token.";
40860
+ var TRIAL_SENTENCE = "Live checks are part of the 30-day trial and the Pro plan. Start the trial by signing in to the Vibe Fortress web app (it needs no card); then create a sync token under Account and put it in ~/.vibefortress/sync-token.";
40857
40861
  var cache = /* @__PURE__ */ new Map();
40858
40862
  function clearAccessCache() {
40859
40863
  cache.clear();
@@ -40873,7 +40877,7 @@ async function liveAccess(opts = {}) {
40873
40877
  const j = await res2.json().catch(() => null);
40874
40878
  if (res2.status === 401) value = { state: "locked", reason: "error", message: "Live checks are locked: the sync token was refused or has expired. Create a new one in the web app under Account." };
40875
40879
  else if (res2.ok && j?.ok && typeof j.data?.enabled === "boolean") {
40876
- value = j.data.enabled ? { state: "enabled", reason: "ok", message: "Live checks are included in your plan.", plan: String(j.data.plan ?? "") } : { state: "locked", reason: "free", message: `Live checks are locked on the free plan. ${TRIAL_SENTENCE.replace("Start the trial by signing in to the Vibe Fortress web app (it needs no card); then create a sync token under Account and put it in ~/.vibefort/sync-token.", "Upgrade to Pro in the web app under Plan to turn them on.")}`, plan: String(j.data.plan ?? "free") };
40880
+ value = j.data.enabled ? { state: "enabled", reason: "ok", message: "Live checks are included in your plan.", plan: String(j.data.plan ?? "") } : { state: "locked", reason: "free", message: `Live checks are locked on the free plan. ${TRIAL_SENTENCE.replace("Start the trial by signing in to the Vibe Fortress web app (it needs no card); then create a sync token under Account and put it in ~/.vibefortress/sync-token.", "Upgrade to Pro in the web app under Plan to turn them on.")}`, plan: String(j.data.plan ?? "free") };
40877
40881
  } else value = { state: "locked", reason: "error", message: "Live checks are locked for now: Vibe Fortress could not confirm your plan (the server gave an unexpected answer). Try again in a minute." };
40878
40882
  } catch (e) {
40879
40883
  value = { state: "locked", reason: "unreachable", message: `Live checks are locked for now: Vibe Fortress could not confirm your plan (${e.name === "TimeoutError" ? "the server did not answer in time" : "the server could not be reached"}). Try again in a minute. Nothing else is affected.` };
@@ -41708,7 +41712,7 @@ var CONNECTIONS = [
41708
41712
  }),
41709
41713
  mk2("stripe", ["The Stripe MCP server", "The Stripe command line (stripe)"], "Create a RESTRICTED key (Live mode) with read permission for Webhook Endpoints only and no other permission. Never use the full secret key. Delete the key when you stop using it.", {
41710
41714
  presence: { tools: "Stripe tools that list webhook endpoints", cli: "stripe --version" },
41711
- setup: ["In the Stripe dashboard switch to Live mode, open Developers, API keys, Create restricted key. Name it vibefort-readonly, set Webhook Endpoints to Read and leave every other permission on None.", "In your OWN terminal (not in chat) run: read -rs STRIPE_API_KEY && export STRIPE_API_KEY then type the key and press Enter, so nothing is shown or saved.", "Start Claude Code from that same terminal. Claude must never print the variable."],
41715
+ setup: ["In the Stripe dashboard switch to Live mode, open Developers, API keys, Create restricted key. Name it vibefortress-readonly, set Webhook Endpoints to Read and leave every other permission on None.", "In your OWN terminal (not in chat) run: read -rs STRIPE_API_KEY && export STRIPE_API_KEY then type the key and press Enter, so nothing is shown or saved.", "Start Claude Code from that same terminal. Claude must never print the variable."],
41712
41716
  tooPrivileged: "A full secret key, or a restricted key with any Write permission or with permissions beyond Webhook Endpoints Read. Create the narrow key above instead and delete the broad one from any connector.",
41713
41717
  verify: "stripe webhook_endpoints list --limit 1"
41714
41718
  }, ["Never read, list or print API keys or webhook signing secrets."]),
@@ -41757,9 +41761,9 @@ var CONNECTIONS = [
41757
41761
  // Feature 021: cloud accounts through the user's own, already signed-in CLI (D-154..D-156). The steps below CHANGE the user's account (they create a read-only identity): the user runs them in their own terminal.
41758
41762
  mk2("aws", ["The AWS command line (aws), already signed in on your machine"], "A profile that holds only the AWS managed policies SecurityAudit and ViewOnlyAccess (read-only). Never use the root account or an administrator profile for the check.", {
41759
41763
  presence: { tools: "No connector needed: Claude uses your own command line", cli: "aws --version" },
41760
- setup: ["In the AWS console open IAM, Roles, Create role. Trusted entity: your own account. Attach the AWS managed policies SecurityAudit and ViewOnlyAccess. Name the role vibefort-readonly. (With IAM Identity Center, create a permission set with the same two policies instead.)", "In your own terminal add a profile that uses it: aws configure set role_arn arn:aws:iam::<account-id>:role/vibefort-readonly --profile vibefort-readonly then aws configure set source_profile default --profile vibefort-readonly (with Identity Center: aws configure sso --profile vibefort-readonly, then aws sso login --profile vibefort-readonly). No key is typed into chat.", "Start Claude Code from a terminal where that profile is active: AWS_PROFILE=vibefort-readonly claude"],
41761
- tooPrivileged: "The root account, AdministratorAccess, PowerUserAccess or any profile whose name says admin. Switch to the vibefort-readonly profile; the check still runs with a bigger identity, but you are warned.",
41762
- verify: "aws sts get-caller-identity --profile vibefort-readonly"
41764
+ setup: ["In the AWS console open IAM, Roles, Create role. Trusted entity: your own account. Attach the AWS managed policies SecurityAudit and ViewOnlyAccess. Name the role vibefortress-readonly. (With IAM Identity Center, create a permission set with the same two policies instead.)", "In your own terminal add a profile that uses it: aws configure set role_arn arn:aws:iam::<account-id>:role/vibefortress-readonly --profile vibefortress-readonly then aws configure set source_profile default --profile vibefortress-readonly (with Identity Center: aws configure sso --profile vibefortress-readonly, then aws sso login --profile vibefortress-readonly). No key is typed into chat.", "Start Claude Code from a terminal where that profile is active: AWS_PROFILE=vibefortress-readonly claude"],
41765
+ tooPrivileged: "The root account, AdministratorAccess, PowerUserAccess or any profile whose name says admin. Switch to the vibefortress-readonly profile; the check still runs with a bigger identity, but you are warned.",
41766
+ verify: "aws sts get-caller-identity --profile vibefortress-readonly"
41763
41767
  }, ["Never run aws secretsmanager, aws ssm get-parameter with decryption, aws iam create-access-key or any command that prints a key or secret.", "Never run a command that is not marked READ-ONLY in the playbook."]),
41764
41768
  mk2("azure", ["The Azure command line (az), already signed in on your machine"], "A user or service principal that holds only the read-only Reader and Security Reader roles on the subscription. Never Owner or Contributor for the check.", {
41765
41769
  presence: { tools: "No connector needed: Claude uses your own command line", cli: "az --version" },
@@ -41769,13 +41773,13 @@ var CONNECTIONS = [
41769
41773
  }, ["Never run az storage account keys list, az keyvault secret show or list, az account get-access-token or any command that prints a key, secret or token.", "Never run a command that is not marked READ-ONLY in the playbook."]),
41770
41774
  mk2("gcloud", ["The Google Cloud command line (gcloud), already signed in on your machine"], "A separate Google account (or service account) with only read roles on the project: Security Reviewer, Compute Viewer, Cloud SQL Viewer and API Keys Viewer. Never Owner or Editor for the check.", {
41771
41775
  presence: { tools: "No connector needed: Claude uses your own command line", cli: "gcloud --version" },
41772
- setup: ["As an owner, in your own terminal, give the read-only account these roles: gcloud projects add-iam-policy-binding <project> --member=user:<readonly-account> --role=roles/iam.securityReviewer and the same for roles/compute.viewer, roles/cloudsql.viewer and roles/serviceusage.apiKeysViewer. (Role names change: check the current documentation.)", "Make a separate gcloud configuration and sign in: gcloud config configurations create vibefort-readonly then gcloud auth login then gcloud config set project <project>", "Start Claude Code from a terminal where it is active: CLOUDSDK_ACTIVE_CONFIG_NAME=vibefort-readonly claude"],
41776
+ setup: ["As an owner, in your own terminal, give the read-only account these roles: gcloud projects add-iam-policy-binding <project> --member=user:<readonly-account> --role=roles/iam.securityReviewer and the same for roles/compute.viewer, roles/cloudsql.viewer and roles/serviceusage.apiKeysViewer. (Role names change: check the current documentation.)", "Make a separate gcloud configuration and sign in: gcloud config configurations create vibefortress-readonly then gcloud auth login then gcloud config set project <project>", "Start Claude Code from a terminal where it is active: CLOUDSDK_ACTIVE_CONFIG_NAME=vibefortress-readonly claude"],
41773
41777
  tooPrivileged: "roles/owner or roles/editor on the project. Use the separate read-only account; the check still runs with a bigger one, but you are warned.",
41774
41778
  verify: "gcloud config list"
41775
41779
  }, ["Never run gcloud auth print-access-token, gcloud secrets versions access, gcloud services api-keys get-key-string or any command that prints a token, key or secret.", "Never run a command that is not marked READ-ONLY in the playbook."]),
41776
41780
  mk2("kubernetes", ["kubectl, already pointed at your cluster"], "A context whose user can only get and list pods, services, namespaces and cluster role bindings. No access to secrets, no write verbs.", {
41777
41781
  presence: { tools: "No connector needed: Claude uses your own command line", cli: "kubectl version --client" },
41778
- setup: ["As a cluster admin, in your own terminal create a read-only role: kubectl create clusterrole vibefort-readonly --verb=get,list --resource=pods,services,namespaces,clusterrolebindings.rbac.authorization.k8s.io (no secrets, no write verbs).", "Bind it to a separate user: kubectl create clusterrolebinding vibefort-readonly --clusterrole=vibefort-readonly --user=<readonly-user> (on EKS, GKE and AKS map that user through your cloud's IAM-to-Kubernetes mapping).", "Add a context for it: kubectl config set-context vibefort-readonly --cluster=<cluster> --user=<readonly-user> then kubectl config use-context vibefort-readonly and start Claude Code from that terminal."],
41782
+ setup: ["As a cluster admin, in your own terminal create a read-only role: kubectl create clusterrole vibefortress-readonly --verb=get,list --resource=pods,services,namespaces,clusterrolebindings.rbac.authorization.k8s.io (no secrets, no write verbs).", "Bind it to a separate user: kubectl create clusterrolebinding vibefortress-readonly --clusterrole=vibefortress-readonly --user=<readonly-user> (on EKS, GKE and AKS map that user through your cloud's IAM-to-Kubernetes mapping).", "Add a context for it: kubectl config set-context vibefortress-readonly --cluster=<cluster> --user=<readonly-user> then kubectl config use-context vibefortress-readonly and start Claude Code from that terminal."],
41779
41783
  tooPrivileged: "A context that is cluster-admin (kubectl auth can-i --list shows * for everything) or that points at production. Use the read-only context; the check still runs with a bigger one, but you are warned.",
41780
41784
  verify: "kubectl config current-context"
41781
41785
  }, ["Never run kubectl get secrets, kubectl config view with credentials, kubectl exec or any command that is not marked READ-ONLY in the playbook."])
@@ -42469,7 +42473,7 @@ function changedAgainst(root, base2) {
42469
42473
 
42470
42474
  // src/local/deep.ts
42471
42475
  var tasteLimit = (env2 = process.env) => {
42472
- const n = Number(env2.VIBEFORT_TASTE_FINDINGS);
42476
+ const n = Number(env2.VIBEFORTRESS_TASTE_FINDINGS);
42473
42477
  return Number.isInteger(n) && n >= 0 && n <= 20 ? n : 2;
42474
42478
  };
42475
42479
  var BATCH = 10;
@@ -42608,7 +42612,7 @@ function readPending() {
42608
42612
  }
42609
42613
  }
42610
42614
  var clearPending = () => rmSync6(pendingFile(), { force: true });
42611
- var noServerMessage = (problems) => `Vibe Fortress cannot reach a server to link with: ${problems[0] ?? "no server address is set"}. Set VIBEFORT_SERVER_URL in the terminal you start Claude from, or put {"url": "https://..."} in ${join18(home(), "server.json")}, then ask again. Scanning keeps working without it.`;
42615
+ var noServerMessage = (problems) => `Vibe Fortress cannot reach a server to link with: ${problems[0] ?? "no server address is set"}. Set VIBEFORTRESS_SERVER_URL in the terminal you start Claude from, or put {"url": "https://..."} in ${join18(home(), "server.json")}, then ask again. Scanning keeps working without it.`;
42612
42616
  async function post(url2, path, body, fetchImpl) {
42613
42617
  const res2 = await fetchImpl(`${url2}${path}`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(body), signal: AbortSignal.timeout(6e3) });
42614
42618
  const j = await res2.json().catch(() => null);
@@ -42739,7 +42743,7 @@ async function statusText2(path, opts = {}) {
42739
42743
  import { existsSync as existsSync16, readFileSync as readFileSync17 } from "node:fs";
42740
42744
  import { dirname as dirname5, join as join19 } from "node:path";
42741
42745
  import { fileURLToPath as fileURLToPath3 } from "node:url";
42742
- var LOCAL_URI = "ui://vibefort/local.html";
42746
+ var LOCAL_URI = "ui://vibefortress/local.html";
42743
42747
  var APP_MIME = "text/html;profile=mcp-app";
42744
42748
  var LOCAL_META = { ui: { resourceUri: LOCAL_URI }, "ui/resourceUri": LOCAL_URI };
42745
42749
  var here2 = dirname5(fileURLToPath3(import.meta.url));
@@ -43866,7 +43870,7 @@ ${r.text}`, { view: "local-account", state: "linked", linked: true, workspace: d
43866
43870
  });
43867
43871
  server.registerTool("local_sync", {
43868
43872
  title: "Show findings on the Vibe Fortress web dashboard (optional sync)",
43869
- description: 'CALL ONLY when the user asks to sync, upload or show their local scan results in the Vibe Fortress web app or dashboard, or asks whether sync is on. Sync is OFF by default and is per project. action "status" explains the state; "enable" turns it on for this project and states exactly what is sent (a short summary per finding, never code or secrets): read that text to the user; "disable" turns it off; "push" sends the latest scan now; "updates" checks for a signed Vibe Fortress rule update and says whether this install is verified (also use it when the user asks whether Vibe Fortress itself is genuine or up to date). NEVER ask the user to paste a token into chat: it comes from the file ~/.vibefort/sync-token or the VIBEFORT_SYNC_TOKEN variable, which the user sets in their own terminal.',
43873
+ description: 'CALL ONLY when the user asks to sync, upload or show their local scan results in the Vibe Fortress web app or dashboard, or asks whether sync is on. Sync is OFF by default and is per project. action "status" explains the state; "enable" turns it on for this project and states exactly what is sent (a short summary per finding, never code or secrets): read that text to the user; "disable" turns it off; "push" sends the latest scan now; "updates" checks for a signed Vibe Fortress rule update and says whether this install is verified (also use it when the user asks whether Vibe Fortress itself is genuine or up to date). NEVER ask the user to paste a token into chat: it comes from the file ~/.vibefortress/sync-token or the VIBEFORTRESS_SYNC_TOKEN variable, which the user sets in their own terminal.',
43870
43874
  inputSchema: { path: external_exports.string().max(1e3).optional().describe("project folder; defaults to the current folder"), action: external_exports.enum(["status", "enable", "disable", "push", "updates"]) },
43871
43875
  annotations: { readOnlyHint: false, openWorldHint: true }
43872
43876
  }, async (a) => {
@@ -44073,15 +44077,15 @@ try {
44073
44077
  if (t.status !== "verified" && t.status !== "unsigned") console.error(`vibefortress-local: ${t.message}`);
44074
44078
  } catch {
44075
44079
  }
44076
- if (process.env.VIBEFORT_ENTRY === "collect" || process.env.VIBEFORT_ENTRY === "check") {
44080
+ if (process.env.VIBEFORTRESS_ENTRY === "collect" || process.env.VIBEFORTRESS_ENTRY === "check") {
44077
44081
  let args = [];
44078
44082
  try {
44079
- const a = JSON.parse(process.env.VIBEFORT_COLLECT_ARGS ?? "[]");
44083
+ const a = JSON.parse(process.env.VIBEFORTRESS_COLLECT_ARGS ?? "[]");
44080
44084
  if (Array.isArray(a)) args = a.map(String);
44081
44085
  } catch {
44082
44086
  }
44083
- process.exit(await (process.env.VIBEFORT_ENTRY === "check" ? runCheckCli(args) : runCollect(args)));
44087
+ process.exit(await (process.env.VIBEFORTRESS_ENTRY === "check" ? runCheckCli(args) : runCollect(args)));
44084
44088
  }
44085
44089
  await buildLocalServer().connect(new StdioServerTransport());
44086
44090
  console.error("vibefortress-local ready");
44087
- if (process.env.VIBEFORT_UPDATES !== "off" && process.env.VIBEFORT_SERVER_URL) void checkUpdates({ home: home() }).catch(() => void 0);
44091
+ if (process.env.VIBEFORTRESS_UPDATES !== "off" && process.env.VIBEFORTRESS_SERVER_URL) void checkUpdates({ home: home() }).catch(() => void 0);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibefortress",
3
- "version": "0.1.52",
3
+ "version": "0.1.55",
4
4
  "description": "Security that keeps up with vibe coding: scans your project on your own machine, explains findings in plain language, and fixes them on a branch. Never blocks a commit or push.",
5
5
  "type": "module",
6
6
  "bin": {
File without changes