tracer-sh 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/tracer.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import { spawnSync } from "node:child_process";
4
- import { existsSync, readdirSync, statSync } from "node:fs";
4
+ import { existsSync, readdirSync, statSync, readFileSync } from "node:fs";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { dirname, join, resolve } from "node:path";
7
7
 
@@ -12,14 +12,68 @@ const serverPath = resolve(repoRoot, "packages/server/dist/index.js");
12
12
  // Must match RESTART_EXIT_CODE in packages/server/src/updater.ts
13
13
  const RESTART_EXIT_CODE = 75;
14
14
 
15
+ const cmd = process.argv[2];
16
+
17
+ // `tracer-sh --help` / `-h` / `help` — usage for every subcommand.
18
+ if (cmd === "--help" || cmd === "-h" || cmd === "help") {
19
+ printHelp();
20
+ process.exit(0);
21
+ }
22
+
23
+ // `tracer-sh --version` / `-v` — print the installed version.
24
+ if (cmd === "--version" || cmd === "-v" || cmd === "version") {
25
+ process.stdout.write(getVersion() + "\n");
26
+ process.exit(0);
27
+ }
28
+
15
29
  // `tracer analyze "<message>" [--session <id>] [--provider <name>] [--json]`
16
30
  // Runs the investigation agent on the already-running local server and prints
17
31
  // the final analysis. Lets other local agents (e.g. Claude Code) drive Tracer.
18
- if (process.argv[2] === "analyze") {
32
+ if (cmd === "analyze") {
19
33
  await runAnalyze(process.argv.slice(3));
20
34
  process.exit(0);
21
35
  }
22
36
 
37
+ /** Read the package version (best-effort; "unknown" if package.json is unreadable). */
38
+ function getVersion() {
39
+ try {
40
+ return JSON.parse(readFileSync(join(repoRoot, "package.json"), "utf8")).version ?? "unknown";
41
+ } catch {
42
+ return "unknown";
43
+ }
44
+ }
45
+
46
+ function printHelp() {
47
+ process.stdout.write(`Tracer ${getVersion()} — local-first AI observability agent
48
+
49
+ Usage:
50
+ tracer-sh Start the Tracer server (default http://127.0.0.1:3579)
51
+ tracer-sh analyze "<message>" [options] Run a headless investigation on a running server
52
+ tracer-sh --help Show this help
53
+ tracer-sh --version Print the version
54
+
55
+ analyze options:
56
+ -s, --session <id> Resume an existing session by id (preserves full context)
57
+ -p, --provider <name> Scope to one provider (newrelic, gcp, posthog); omit for unified mode
58
+ --json Print the full JSON envelope:
59
+ { sessionId, status, analysis, queries, usage, model }.
60
+ The "queries" array holds the FULL raw rows and can be very
61
+ large. Without --json, stdout is just the analysis prose and the
62
+ line "session <id> · <model>" is written to stderr.
63
+
64
+ Environment:
65
+ TRACER_PORT Server port (default 3579)
66
+ TRACER_HOST Bind/target host (default 127.0.0.1)
67
+ TRACER_SKIP_BUILD Skip the source-checkout rebuild-on-launch check
68
+
69
+ Examples:
70
+ tracer-sh
71
+ tracer-sh analyze "Why did checkout error rate spike after 14:00 UTC?"
72
+ tracer-sh analyze "Now break that down by service." --session <id>
73
+ tracer-sh analyze "Top 5 slowest GCP Cloud Run requests." --provider gcp
74
+ `);
75
+ }
76
+
23
77
  async function runAnalyze(args) {
24
78
  let message;
25
79
  let sessionId;
@@ -28,7 +82,8 @@ async function runAnalyze(args) {
28
82
 
29
83
  for (let i = 0; i < args.length; i++) {
30
84
  const a = args[i];
31
- if (a === "--json") asJson = true;
85
+ if (a === "--help" || a === "-h") { printHelp(); process.exit(0); }
86
+ else if (a === "--json") asJson = true;
32
87
  else if (a === "--session" || a === "-s") sessionId = args[++i];
33
88
  else if (a === "--provider" || a === "-p") provider = args[++i];
34
89
  else if (message === undefined) message = a;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tracer-sh",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "type": "module",
5
5
  "description": "Local-first debugging & analysis platform",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -74621,6 +74621,7 @@ var updateRouter = router({
74621
74621
  });
74622
74622
 
74623
74623
  // src/integrations/jira/jira.client.ts
74624
+ var ISSUE_FIELDS = "summary,description,status,issuetype,priority,assignee,reporter,labels,components,fixVersions,created,updated,duedate,resolution,comment";
74624
74625
  function normalizeJiraDomain(raw2) {
74625
74626
  return raw2.trim().replace(/^https?:\/\//i, "").replace(/\/+$/, "").replace(/\.atlassian\.net$/i, "");
74626
74627
  }
@@ -74670,19 +74671,41 @@ var JiraClient = class {
74670
74671
  return { ok: false, error: err instanceof Error ? err.message : String(err) };
74671
74672
  }
74672
74673
  }
74674
+ /** Read a single issue's details (summary, description, status, and the Details
74675
+ * panel fields: type, priority, assignee, reporter, labels, etc.) plus its
74676
+ * comment thread. Read-only. */
74673
74677
  async getIssue(key) {
74674
74678
  const res = await this.request(
74675
- `/rest/api/2/issue/${encodeURIComponent(key)}?fields=summary,description,status`
74679
+ `/rest/api/2/issue/${encodeURIComponent(key)}?fields=${ISSUE_FIELDS}`
74676
74680
  );
74677
74681
  const data = await res.json();
74678
- const fields = data.fields ?? {};
74682
+ const f = data.fields ?? {};
74683
+ const names = (arr) => (arr ?? []).map((x) => x.name).filter((n) => !!n);
74679
74684
  return {
74680
74685
  key: data.key ?? key,
74681
- summary: fields.summary ?? "",
74682
- description: toPlainText(fields.description),
74683
- status: fields.status?.name ?? "Unknown"
74686
+ summary: f.summary ?? "",
74687
+ description: toPlainText(f.description),
74688
+ status: f.status?.name ?? "Unknown",
74689
+ issueType: f.issuetype?.name ?? null,
74690
+ priority: f.priority?.name ?? null,
74691
+ assignee: f.assignee?.displayName ?? null,
74692
+ reporter: f.reporter?.displayName ?? null,
74693
+ labels: f.labels ?? [],
74694
+ components: names(f.components),
74695
+ fixVersions: names(f.fixVersions),
74696
+ created: f.created ?? null,
74697
+ updated: f.updated ?? null,
74698
+ dueDate: f.duedate ?? null,
74699
+ resolution: f.resolution?.name ?? null,
74700
+ comments: (f.comment?.comments ?? []).map((c) => ({
74701
+ id: c.id ?? null,
74702
+ author: c.author?.displayName ?? null,
74703
+ body: toPlainText(c.body),
74704
+ created: c.created ?? null
74705
+ }))
74684
74706
  };
74685
74707
  }
74708
+ /** Post a single plain-text comment to an issue. The only write operation. */
74686
74709
  async addComment(key, body) {
74687
74710
  const res = await this.request(`/rest/api/2/issue/${encodeURIComponent(key)}/comment`, {
74688
74711
  method: "POST",
@@ -74726,6 +74749,10 @@ var integrationsRouter = router({
74726
74749
  }
74727
74750
  };
74728
74751
  }),
74752
+ // Accepts a classic Atlassian API token (email + token). The token authenticates
74753
+ // against the site host with the account's permissions; Tracer constrains what it
74754
+ // can do at the code/tool layer (read one issue, post one comment). Validated with
74755
+ // a /myself call before persisting.
74729
74756
  saveJira: publicProcedure.input(
74730
74757
  external_exports.object({
74731
74758
  domain: external_exports.string().min(1),
@@ -75448,7 +75475,7 @@ function getJiraChatTools(db2) {
75448
75475
  const client = new JiraClient(config2);
75449
75476
  const tools = {
75450
75477
  get_jira_issue: tool({
75451
- description: "Read a Jira issue's summary, description, and status by its issue key (e.g. PROJ-123).",
75478
+ description: "Read a Jira issue's details by its issue key (e.g. PROJ-123): summary, description, status, type, priority, assignee, reporter, labels, components, fix versions, resolution, created/updated/due dates, and its comment thread.",
75452
75479
  inputSchema: external_exports.object({
75453
75480
  issueKey: external_exports.string().describe("Jira issue key, e.g. PROJ-123")
75454
75481
  }),
@@ -76334,10 +76361,25 @@ var MAX_RESULT_CHARS = 4e3;
76334
76361
  function renderToolPart(p, queries) {
76335
76362
  const tool3 = p.type.replace(/^tool-/, "");
76336
76363
  const queryParts = (p.output?.parts ?? []).filter((x) => typeof x?.query === "string");
76364
+ for (const qp of queryParts) {
76365
+ queries.push({ tool: tool3, query: qp.query ?? p.input?.query ?? "", results: qp.results });
76366
+ }
76367
+ const queryText = queryParts.map((qp) => qp.query ?? p.input?.query ?? "").filter((q) => !!q).join("\n---\n");
76368
+ if (p.output?.analysis) {
76369
+ if (queryParts.length === 0 && p.input?.query) {
76370
+ queries.push({ tool: tool3, query: p.input.query, results: p.output.analysis });
76371
+ }
76372
+ const displayQuery = queryText || p.input?.query || "";
76373
+ return `Query (${tool3}):${displayQuery ? `
76374
+ \`\`\`
76375
+ ${displayQuery}
76376
+ \`\`\`` : ""}
76377
+ Result:
76378
+ ${p.output.analysis}`;
76379
+ }
76337
76380
  const blocks = [];
76338
76381
  for (const qp of queryParts) {
76339
76382
  const query = qp.query ?? p.input?.query ?? "";
76340
- queries.push({ tool: tool3, query, results: qp.results });
76341
76383
  let resultStr;
76342
76384
  try {
76343
76385
  resultStr = JSON.stringify(qp.results);
@@ -76355,16 +76397,6 @@ Result:
76355
76397
  \`\`\`json
76356
76398
  ${resultStr}
76357
76399
  \`\`\``);
76358
- }
76359
- if (queryParts.length === 0 && p.output?.analysis) {
76360
- const query = p.input?.query;
76361
- if (query) queries.push({ tool: tool3, query, results: p.output.analysis });
76362
- blocks.push(`Query (${tool3}):${query ? `
76363
- \`\`\`
76364
- ${query}
76365
- \`\`\`` : ""}
76366
- Result:
76367
- ${p.output.analysis}`);
76368
76400
  }
76369
76401
  return blocks.join("\n\n");
76370
76402
  }
@@ -1 +1 @@
1
- import{a as q,r as s,j as r}from"./index-BrLT4CJt.js";var P=q();function $(c){const n=c?`tracer:starred:${c}`:null,[i,S]=s.useState(()=>{if(!n)return new Set;try{const a=localStorage.getItem(n);return a?new Set(JSON.parse(a)):new Set}catch{return new Set}});return[i,a=>{S(u=>{const t=new Set(u);return t.has(a)?t.delete(a):t.add(a),n&&localStorage.setItem(n,JSON.stringify([...t])),t})}]}function I({options:c,value:n,onChange:i,placeholder:S="Select...",storageKey:v,fitContent:a,disabled:u}){const[t,l]=s.useState(!1),[w,y]=s.useState(""),f=s.useRef(null),j=s.useRef(null),N=s.useRef(null),g=s.useRef(null),[x,C]=$(v),[m,L]=s.useState({top:0,left:0,minWidth:0});s.useEffect(()=>{if(!t)return;const e=d=>{f.current?.contains(d.target)||j.current?.contains(d.target)||l(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[t]);const R=s.useCallback(()=>{if(!f.current)return;const e=f.current.getBoundingClientRect();L({top:e.bottom+4,left:e.left,minWidth:e.width})},[]);s.useEffect(()=>{t&&(R(),y(""),requestAnimationFrame(()=>N.current?.focus()))},[t,R]);const h=c.find(e=>e.value===n),p=s.useMemo(()=>{const e=w.toLowerCase();return[...e?c.filter(o=>o.label.toLowerCase().includes(e)||o.value.toLowerCase().includes(e)):c].sort((o,b)=>{const k=x.has(o.value)?0:1,E=x.has(b.value)?0:1;return k!==E?k-E:o.label.localeCompare(b.label)})},[c,w,x]);s.useEffect(()=>{if(t&&n&&g.current){const e=g.current.querySelector(`[data-value="${CSS.escape(n)}"]`);e&&e.scrollIntoView({block:"nearest"})}},[t,n]);const W=t?P.createPortal(r.jsxs("div",{ref:j,className:"fixed z-[100] bg-white border border-[#d4d2cd] rounded shadow-lg",style:{top:m.top,left:m.left,minWidth:m.minWidth,width:a?"max-content":m.minWidth},children:[r.jsx("div",{className:"p-1.5 border-b border-[#e8e6e1]",children:r.jsx("input",{ref:N,type:"text",value:w,onChange:e=>y(e.target.value),placeholder:"Search...",className:"w-full px-2 py-1.5 text-xs text-[#2c2c2c] font-sans bg-[#f5f4f0] border border-[#e8e6e1] rounded focus:outline-none focus:border-[#2b5ea7] placeholder:text-[#9c9890]",onKeyDown:e=>{e.key==="Escape"&&l(!1),e.key==="Enter"&&p.length>0&&(i(p[0].value),l(!1))}})}),r.jsx("div",{ref:g,className:"max-h-[280px] overflow-y-auto",children:p.length===0?r.jsx("div",{className:"px-3 py-3 text-xs text-[#9c9890] text-center",children:"No projects found"}):p.map(e=>{const d=e.value===n,o=x.has(e.value);return r.jsxs("div",{"data-value":e.value,className:`flex items-center gap-1.5 px-2 py-1.5 text-xs font-sans cursor-pointer transition-colors ${d?"bg-[#2b5ea7]/10 text-[#2b5ea7]":"text-[#2c2c2c] hover:bg-[#f5f4f0]"}`,onClick:()=>{i(e.value),l(!1)},children:[r.jsx("button",{type:"button",onClick:b=>{b.stopPropagation(),C(e.value)},className:`shrink-0 w-4 h-4 flex items-center justify-center text-[10px] transition-colors ${o?"text-[#d4a017]":"text-[#d4d2cd] hover:text-[#9c9890]"}`,title:o?"Unstar":"Star to pin to top",children:o?"★":"☆"}),r.jsx("span",{className:a?"whitespace-nowrap":"truncate flex-1",children:e.label})]},e.value)})})]}),document.body):null;return r.jsxs(r.Fragment,{children:[r.jsxs("button",{ref:f,type:"button",onClick:()=>!u&&l(!t),disabled:u,className:"w-full bg-white border border-[#d4d2cd] rounded px-3 py-2 text-xs text-[#2c2c2c] font-sans text-left flex items-center justify-between focus:outline-none focus:border-[#2b5ea7] hover:border-[#b0ada6] transition-colors disabled:opacity-50 disabled:cursor-not-allowed",children:[r.jsx("span",{className:h?"text-[#2c2c2c] truncate":"text-[#9c9890]",children:h?h.displayLabel??h.label:S}),r.jsx("span",{className:"text-[#9c9890] text-[10px] ml-2 shrink-0 transition-transform duration-200",style:{transform:t?"rotate(180deg)":"rotate(0deg)"},children:"▾"})]}),W]})}export{I as S,P as r,$ as u};
1
+ import{a as q,r as s,j as r}from"./index-D555Ai5J.js";var P=q();function $(c){const n=c?`tracer:starred:${c}`:null,[i,S]=s.useState(()=>{if(!n)return new Set;try{const a=localStorage.getItem(n);return a?new Set(JSON.parse(a)):new Set}catch{return new Set}});return[i,a=>{S(u=>{const t=new Set(u);return t.has(a)?t.delete(a):t.add(a),n&&localStorage.setItem(n,JSON.stringify([...t])),t})}]}function I({options:c,value:n,onChange:i,placeholder:S="Select...",storageKey:v,fitContent:a,disabled:u}){const[t,l]=s.useState(!1),[w,y]=s.useState(""),f=s.useRef(null),j=s.useRef(null),N=s.useRef(null),g=s.useRef(null),[x,C]=$(v),[m,L]=s.useState({top:0,left:0,minWidth:0});s.useEffect(()=>{if(!t)return;const e=d=>{f.current?.contains(d.target)||j.current?.contains(d.target)||l(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[t]);const R=s.useCallback(()=>{if(!f.current)return;const e=f.current.getBoundingClientRect();L({top:e.bottom+4,left:e.left,minWidth:e.width})},[]);s.useEffect(()=>{t&&(R(),y(""),requestAnimationFrame(()=>N.current?.focus()))},[t,R]);const h=c.find(e=>e.value===n),p=s.useMemo(()=>{const e=w.toLowerCase();return[...e?c.filter(o=>o.label.toLowerCase().includes(e)||o.value.toLowerCase().includes(e)):c].sort((o,b)=>{const k=x.has(o.value)?0:1,E=x.has(b.value)?0:1;return k!==E?k-E:o.label.localeCompare(b.label)})},[c,w,x]);s.useEffect(()=>{if(t&&n&&g.current){const e=g.current.querySelector(`[data-value="${CSS.escape(n)}"]`);e&&e.scrollIntoView({block:"nearest"})}},[t,n]);const W=t?P.createPortal(r.jsxs("div",{ref:j,className:"fixed z-[100] bg-white border border-[#d4d2cd] rounded shadow-lg",style:{top:m.top,left:m.left,minWidth:m.minWidth,width:a?"max-content":m.minWidth},children:[r.jsx("div",{className:"p-1.5 border-b border-[#e8e6e1]",children:r.jsx("input",{ref:N,type:"text",value:w,onChange:e=>y(e.target.value),placeholder:"Search...",className:"w-full px-2 py-1.5 text-xs text-[#2c2c2c] font-sans bg-[#f5f4f0] border border-[#e8e6e1] rounded focus:outline-none focus:border-[#2b5ea7] placeholder:text-[#9c9890]",onKeyDown:e=>{e.key==="Escape"&&l(!1),e.key==="Enter"&&p.length>0&&(i(p[0].value),l(!1))}})}),r.jsx("div",{ref:g,className:"max-h-[280px] overflow-y-auto",children:p.length===0?r.jsx("div",{className:"px-3 py-3 text-xs text-[#9c9890] text-center",children:"No projects found"}):p.map(e=>{const d=e.value===n,o=x.has(e.value);return r.jsxs("div",{"data-value":e.value,className:`flex items-center gap-1.5 px-2 py-1.5 text-xs font-sans cursor-pointer transition-colors ${d?"bg-[#2b5ea7]/10 text-[#2b5ea7]":"text-[#2c2c2c] hover:bg-[#f5f4f0]"}`,onClick:()=>{i(e.value),l(!1)},children:[r.jsx("button",{type:"button",onClick:b=>{b.stopPropagation(),C(e.value)},className:`shrink-0 w-4 h-4 flex items-center justify-center text-[10px] transition-colors ${o?"text-[#d4a017]":"text-[#d4d2cd] hover:text-[#9c9890]"}`,title:o?"Unstar":"Star to pin to top",children:o?"★":"☆"}),r.jsx("span",{className:a?"whitespace-nowrap":"truncate flex-1",children:e.label})]},e.value)})})]}),document.body):null;return r.jsxs(r.Fragment,{children:[r.jsxs("button",{ref:f,type:"button",onClick:()=>!u&&l(!t),disabled:u,className:"w-full bg-white border border-[#d4d2cd] rounded px-3 py-2 text-xs text-[#2c2c2c] font-sans text-left flex items-center justify-between focus:outline-none focus:border-[#2b5ea7] hover:border-[#b0ada6] transition-colors disabled:opacity-50 disabled:cursor-not-allowed",children:[r.jsx("span",{className:h?"text-[#2c2c2c] truncate":"text-[#9c9890]",children:h?h.displayLabel??h.label:S}),r.jsx("span",{className:"text-[#9c9890] text-[10px] ml-2 shrink-0 transition-transform duration-200",style:{transform:t?"rotate(180deg)":"rotate(0deg)"},children:"▾"})]}),W]})}export{I as S,P as r,$ as u};
@@ -0,0 +1 @@
1
+ import{t as m,r as f,j as e,S as I,c as _,b as a,C as E,u as X,W as V,A as ee,d as de,g as ue,m as O,p as G,e as se,M as me}from"./index-D555Ai5J.js";import{S as te}from"./SearchableSelect-BGG4ZQsh.js";function W({type:s,label:t,note:l}){const i=m.useUtils(),{data:o,isLoading:x}=m.settings.getApiKey.useQuery(s),p=m.settings.saveApiKey.useMutation({onSuccess:()=>i.settings.getApiKey.invalidate(s)}),d=m.settings.removeApiKey.useMutation({onSuccess:()=>i.settings.getApiKey.invalidate(s)}),[h,r]=f.useState(!1),[g,u]=f.useState(""),[v,b]=f.useState(!1);async function C(){await p.mutateAsync({type:s,apiKey:g}),u(""),r(!1)}async function c(){await d.mutateAsync(s),r(!1),b(!1)}return x?e.jsx("div",{className:"px-4 py-3",children:e.jsx(I,{size:"sm"})}):e.jsxs("div",{className:"px-4 py-3",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("span",{className:"text-sm font-medium w-24 shrink-0",children:t}),e.jsx("span",{className:a.maskedKey+" flex-1 truncate",style:o?{color:_.success}:void 0,children:o?o.maskedApiKey:"Not configured"}),!h&&e.jsx("button",{onClick:()=>{u(""),r(!0)},className:a.secondaryBtn+" text-xs px-3 py-1",children:o?"Edit":"Add"})]}),h&&e.jsxs("div",{className:"mt-3 pt-3 border-t border-[#e8e6e1] space-y-2",children:[l&&e.jsx("div",{children:l}),e.jsx("input",{type:g?"password":"text",value:g,onChange:N=>u(N.target.value),placeholder:o?.maskedApiKey??"Enter API key",className:a.input}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{onClick:C,disabled:!g||p.isPending,className:a.primaryBtn+" text-xs px-3 py-1",children:p.isPending?e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx(I,{size:"sm"})," Saving..."]}):"Save"}),e.jsx("button",{onClick:()=>r(!1),disabled:p.isPending,className:a.secondaryBtn+" text-xs px-3 py-1",children:"Cancel"}),o&&e.jsx("button",{onClick:()=>b(!0),disabled:d.isPending,className:a.dangerBtn+" text-xs px-3 py-1",children:"Remove"})]})]}),e.jsx(E,{open:v,title:"Remove API key",message:`Remove the ${t} API key?`,confirmLabel:"Remove",onConfirm:c,onCancel:()=>b(!1)})]})}function J({checked:s,onChange:t,disabled:l,"aria-label":i}){return e.jsx("button",{type:"button",role:"switch","aria-checked":s,"aria-label":i,disabled:l,onClick:()=>t(!s),className:`relative inline-flex h-5 w-9 items-center rounded-full transition-colors ${s?"bg-[#2b5ea7]":"bg-[#d4d2cd]"} ${l?"opacity-50 cursor-not-allowed":"cursor-pointer"}`,children:e.jsx("span",{className:`inline-block h-3.5 w-3.5 rounded-full bg-white transition-transform ${s?"translate-x-[18px]":"translate-x-[3px]"}`})})}function H({status:s,label:t}){return e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`inline-block h-2 w-2 rounded-full ${a.statusDot[s]}`}),t&&e.jsx("span",{className:a.statusLabel,children:t})]})}function xe(){const s=m.useUtils(),{data:t,isLoading:l}=m.settings.getVertexConfig.useQuery(),i=X(),o=!!t,x=i.data,p=x?.ok??!1,d=o&&p,h=()=>{s.settings.getVertexConfig.invalidate(),s.provider.listVertexModels.invalidate()},r=m.settings.saveVertexConfig.useMutation({onSuccess:h}),g=m.settings.removeVertexConfig.useMutation({onSuccess:h}),u=r.isPending||g.isPending,[v,b]=f.useState(!1),{data:C,isLoading:c}=m.provider.listGcpProjects.useQuery(void 0,{staleTime:V.updateCheckStaleTimeMs,enabled:d}),N=f.useMemo(()=>(C??[]).map(y=>({value:y.projectId,label:y.name?`${y.name} (${y.projectId})`:y.projectId,displayLabel:y.name||y.projectId})),[C]);function S(y){y?r.mutate({}):b(!0)}function k(){g.mutate(),b(!1)}function j(y){y!==t?.projectId&&r.mutate({projectId:y})}return l?e.jsx("div",{className:"px-4 py-3",children:e.jsx(I,{size:"sm"})}):e.jsxs("div",{className:"px-4 py-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx(J,{checked:o,onChange:S,disabled:u,"aria-label":"Enable Vertex AI"}),e.jsx("span",{className:"text-sm font-medium",children:"Vertex AI"}),o?e.jsx(H,{status:d?"connected":"disconnected"}):e.jsx("span",{className:"text-xs opacity-40",children:"Not configured"})]}),o&&e.jsx("div",{className:"mt-3 pt-3 border-t border-[#e8e6e1]",children:i.isLoading?e.jsxs("div",{className:"flex items-center gap-2 text-xs text-[#666666]",children:[e.jsx(I,{size:"sm"})," Checking authentication…"]}):p?e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-xs text-[#666666] whitespace-nowrap w-14",children:"Project"}),e.jsx("div",{className:"flex-1",children:e.jsx(te,{options:N,value:t?.projectId??"",onChange:j,placeholder:c?"Loading...":"Select project...",storageKey:"gcp-projectId",fitContent:!0,disabled:c||u})})]}),e.jsx(pe,{value:t?.location??"global",onCommit:y=>{const P=y.trim()||"global";P!==t?.location&&r.mutate({location:P})},disabled:u})]}):e.jsx("p",{className:a.warnText,children:x&&!x.ok?x.message:"Not authenticated. Run: gcloud auth application-default login"})}),e.jsx(E,{open:v,title:"Disable Vertex AI",message:"Disable Vertex AI? Your project selection will be removed.",confirmLabel:"Disable",onConfirm:k,onCancel:()=>b(!1)})]})}function pe({value:s,onCommit:t,disabled:l}){const[i,o]=f.useState(s);return f.useEffect(()=>o(s),[s]),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("span",{className:"text-xs text-[#666666] whitespace-nowrap w-14",children:"Location"}),e.jsx("input",{type:"text",value:i,onChange:x=>o(x.target.value),onBlur:()=>t(i),onKeyDown:x=>{x.key==="Enter"&&x.currentTarget.blur()},placeholder:"global",disabled:l,className:a.input})]})}function ge({configuredProviders:s}){return e.jsx("div",{className:"border-t border-[#e8e6e1]",children:e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{children:e.jsxs("tr",{className:a.tableHeaderRow,children:[e.jsx("th",{className:a.tableHeaderCell+" text-xs py-2",children:"Model"}),e.jsx("th",{className:a.tableHeaderCell+" text-xs py-2",children:"Provider"}),e.jsx("th",{className:a.tableHeaderCell+" text-xs py-2 text-right",children:"Input ($/M)"}),e.jsx("th",{className:a.tableHeaderCell+" text-xs py-2 text-right",children:"Output ($/M)"})]})}),e.jsx("tbody",{className:"divide-y divide-[#e8e6e1]",children:ee.map(t=>{const l=s.has(t.provider);return e.jsxs("tr",{style:l?{color:_.success}:{color:_.inkFaint},children:[e.jsx("td",{className:"px-4 py-2 font-mono text-xs",children:t.modelId}),e.jsx("td",{className:"px-4 py-2 capitalize",children:t.provider}),e.jsxs("td",{className:"px-4 py-2 text-right font-mono text-xs",children:["$",t.inputPrice.toFixed(2)]}),e.jsxs("td",{className:"px-4 py-2 text-right font-mono text-xs",children:["$",t.outputPrice.toFixed(2)]})]},t.modelId)})})]})})}function $({children:s}){return e.jsx("div",{className:"text-xs leading-relaxed rounded border border-[#d4d2cd] bg-[#f5f4f1] p-3 space-y-2",children:s})}const Z="underline break-all text-[#0052cc]",he=e.jsxs($,{children:[e.jsxs("div",{children:["Create a Gemini API key at:",e.jsx("br",{}),e.jsx("a",{href:"https://aistudio.google.com/api-keys",target:"_blank",rel:"noopener noreferrer",className:Z,children:"https://aistudio.google.com/api-keys"})]}),e.jsx("div",{className:"opacity-80",children:"This key powers the Gemini models Tracer uses to run chats and analyze your data — it is the model provider, not a data source. Tracer sends your prompts and the data it has already fetched to Google's Gemini API for inference; it grants no access back into your Google account."})]});function fe(){const[s,t]=f.useState(!1),l=de();return e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"max-w-lg bg-white border border-[#d4d2cd] rounded divide-y divide-[#e8e6e1] overflow-hidden",children:[e.jsx(W,{type:"anthropic",label:"Anthropic"}),e.jsx(W,{type:"google",label:"Google AI",note:he}),e.jsx(xe,{})]}),e.jsxs("div",{className:"bg-white border border-[#d4d2cd] rounded overflow-hidden",children:[e.jsxs("button",{onClick:()=>t(!s),className:"w-full flex items-center justify-between px-4 py-3 text-sm text-[#666666] hover:bg-[#f5f4f0] transition-colors font-sans",children:[e.jsx("span",{className:"font-medium",children:"Model Pricing"}),e.jsx("span",{className:"text-xs transition-transform duration-200",style:{transform:s?"rotate(180deg)":"rotate(0deg)"},children:"▾"})]}),s&&e.jsx(ge,{configuredProviders:l})]})]})}function ne({value:s,models:t,onChange:l,loading:i,disabled:o,label:x="Model"}){const p=ue(t),d=O(s),r=!t.some(u=>O(u)===d)&&!i;function g(u){const v=u.indexOf(":");l({provider:u.slice(0,v),modelId:u.slice(v+1)})}return e.jsxs("div",{className:"flex items-start gap-3 mt-3 pt-3 border-t border-[#d4d2cd]",children:[e.jsx("span",{className:"text-xs text-[#666666] whitespace-nowrap w-14 mt-2",children:x}),e.jsxs("div",{className:"flex-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"shrink-0 inline-flex items-center rounded px-1.5 py-0.5 text-[10px] font-medium bg-[#f0eee9] text-[#666666] border border-[#d4d2cd]",children:G(s.provider)}),e.jsxs("div",{className:"relative flex-1",children:[e.jsxs("select",{value:d,onChange:u=>g(u.target.value),disabled:o,className:"w-full appearance-none bg-white border border-[#d4d2cd] rounded px-3 py-2 pr-7 text-xs text-[#2c2c2c] focus:outline-none focus:border-[#2b5ea7] font-sans disabled:opacity-50 disabled:cursor-not-allowed",children:[r&&e.jsx("optgroup",{label:"Unavailable",children:e.jsxs("option",{value:d,children:[G(s.provider)," · ",s.modelId]})}),p.map(u=>e.jsx("optgroup",{label:u.label,children:u.models.map(v=>e.jsx("option",{value:O(v),children:v.modelId},O(v)))},u.provider))]}),e.jsx("span",{className:"pointer-events-none absolute right-2 top-1/2 -translate-y-1/2 text-[#9c9890] text-[10px]",children:"▾"})]})]}),r&&e.jsxs("p",{className:a.warnText+" mt-1.5",children:[G(s.provider)," · ",s.modelId," isn’t available. Configure its provider or pick another model."]})]})]})}const je=ee[0];function ve({providerType:s}){const t=m.useUtils(),{data:l,isLoading:i}=m.settings.getSubAgentModel.useQuery(s),o=m.settings.saveSubAgentModel.useMutation({onSuccess:()=>t.settings.getSubAgentModel.invalidate(s)}),{models:x,isLoading:p}=se();if(i)return null;const d=l??je;return e.jsx(ne,{value:d,models:x,loading:p,disabled:o.isPending,onChange:h=>o.mutate({providerType:s,model:{provider:h.provider,modelId:h.modelId}})})}function be({existingConfig:s}){const t=m.useUtils(),l=X(),{data:i,isLoading:o}=m.provider.listGcpProjects.useQuery(void 0,{staleTime:V.updateCheckStaleTimeMs}),x=m.provider.saveConfig.useMutation({onSuccess:()=>{t.provider.getConfigs.invalidate(),t.provider.list.invalidate()}}),p=f.useMemo(()=>(i??[]).map(r=>({value:r.projectId,label:r.name?`${r.name} (${r.projectId})`:r.projectId,displayLabel:r.name||r.projectId})),[i]),d=s.projectId??"";if(l.data&&!l.data.ok)return null;function h(r){r!==d&&x.mutate({type:"gcp",config:{...s,projectId:r}})}return e.jsxs("div",{className:"flex items-center gap-3 mt-3 pt-3 border-t border-[#d4d2cd]",children:[e.jsx("span",{className:"text-xs text-[#666666] whitespace-nowrap w-14",children:"Project"}),e.jsx("div",{className:"flex-1",children:e.jsx(te,{options:p,value:d,onChange:h,placeholder:o?"Loading...":"Select project...",storageKey:"gcp-projectId",fitContent:!0,disabled:o||x.isPending})})]})}function ye({type:s,label:t,connected:l,configured:i,onConfigure:o,onToggle:x,togglePending:p,toggleError:d,pingError:h,hasConfigFields:r,existingConfig:g}){const u=i||l;return e.jsxs("div",{className:a.settingsCard+" w-80",children:[e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(J,{checked:i,onChange:v=>{v&&r?o():x(v)},disabled:p}),e.jsx("span",{className:"font-medium",children:t}),u?e.jsx(H,{status:l?"connected":"disconnected"}):e.jsx("span",{className:"text-xs opacity-40",children:"Not configured"})]}),e.jsx("button",{onClick:o,className:`${a.secondaryBtn} ${i&&r?"":"invisible"}`,children:"Edit"})]}),u&&e.jsx(ve,{providerType:s}),u&&s==="gcp"&&g&&e.jsx(be,{existingConfig:g}),h&&!l&&e.jsx("p",{className:a.warnText+" mt-2",children:h}),d&&e.jsx("p",{className:a.errorText+" mt-2",children:d})]})}function Y(s,t){return!!s&&!!t&&s===t}function ae({open:s,label:t,configFields:l,formValues:i,onFormChange:o,existingConfig:x,saveResult:p,savePending:d,configured:h,note:r,onSave:g,onClose:u,onRemove:v}){const b=l.some(c=>c.required!==!1&&c.type==="password"&&Y(i[c.key],x?.[c.key])),C=l.some(c=>c.required!==!1&&!i[c.key]);return e.jsxs(me,{open:s,onClose:u,children:[e.jsxs("div",{className:a.dialogTitle+" text-base mb-4",children:["Configure ",t]}),r&&e.jsx("div",{className:"mb-4",children:r}),e.jsx("div",{className:"space-y-3",children:l.map(c=>{const N=c.type==="password"&&Y(i[c.key],x?.[c.key]);return e.jsxs("div",{children:[e.jsxs("label",{className:a.sectionTitle,children:[c.label,c.required===!1&&e.jsx("span",{className:"text-xs opacity-40 ml-1",children:"(optional)"})]}),e.jsx("input",{type:c.type==="password"&&i[c.key]&&!N?"password":"text",value:i[c.key]??"",onChange:S=>o(c.key,S.target.value),onFocus:S=>{N&&S.target.select()},placeholder:`Enter ${c.label.toLowerCase()}`,className:`${a.input} ${N?"!text-[#999] !border-l-2 !border-l-amber-400":""}`})]},c.key)})}),e.jsxs("div",{className:"flex items-center gap-2 mt-4 pt-4 border-t border-[#d4d2cd]",children:[e.jsx("button",{onClick:g,disabled:C||b||d,className:a.primaryBtn,children:d?e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx(I,{size:"sm"})," Saving..."]}):"Save & Test"}),e.jsx("button",{onClick:u,disabled:d,className:a.secondaryBtn,children:"Cancel"}),h&&e.jsx("button",{onClick:v,disabled:d,className:a.dangerBtn,children:"Remove"})]}),b&&!d&&!p&&e.jsx("p",{className:"mt-2 text-xs text-amber-600",children:"Re-enter highlighted fields to save"}),p&&e.jsx("div",{className:`mt-3 ${p.success?a.successText:a.errorText}`,children:p.success?"Connected successfully":p.error||"Connection failed"})]})}const Ne={newrelic:e.jsxs($,{children:[e.jsxs("div",{children:["Create a ",e.jsx("span",{className:"font-medium",children:"User key"})," at:",e.jsx("br",{}),e.jsx("a",{href:"https://one.newrelic.com/admin-portal/api-keys/home",target:"_blank",rel:"noopener noreferrer",className:Z,children:"https://one.newrelic.com/admin-portal/api-keys/home"}),e.jsx("br",{}),"Your numeric Account ID is shown on the same page."]}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium",children:"What Tracer can do with it"}),e.jsx("ul",{className:"list-disc ml-4 mt-1 space-y-0.5",children:e.jsxs("li",{children:[e.jsx("span",{className:"font-medium",children:"Run read-only NRQL queries"})," against your account — to inspect metrics, logs, traces, and errors while investigating."]})})]}),e.jsx("div",{className:"opacity-80",children:"It only reads via NRQL. It cannot write, modify, deploy, or delete anything. A New Relic User key inherits your role, so for least privilege use a user scoped to read-only access."})]}),posthog:e.jsxs($,{children:[e.jsxs("div",{children:["Create a ",e.jsx("span",{className:"font-medium",children:"Personal API key"})," in your PostHog instance at:",e.jsx("br",{}),e.jsx("span",{className:"font-mono",children:"/settings/user-api-keys"}),e.jsx("br",{}),"Grant it the single scope ",e.jsx("span",{className:"font-medium",children:"Query → Read"}),". The Project ID is in Settings → Project. Set Host only if you are not on US cloud (e.g.",e.jsx("span",{className:"font-mono",children:" eu.posthog.com"})," or a self-hosted URL)."]}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium",children:"What Tracer can do with it"}),e.jsx("ul",{className:"list-disc ml-4 mt-1 space-y-0.5",children:e.jsxs("li",{children:[e.jsx("span",{className:"font-medium",children:"Run read-only HogQL queries"})," against the project — to inspect events, persons, and analytics while investigating."]})})]}),e.jsxs("div",{className:"opacity-80",children:["With only the ",e.jsx("span",{className:"font-medium",children:"Query → Read"})," scope it cannot create, modify, or delete anything in PostHog, and it reaches only the project you configure."]})]})};function Ce(s,t){const l={};for(const i of s)l[i.key]=t?.[i.key]??"";return l}function we(){const s=m.useUtils(),{data:t,isLoading:l}=m.provider.list.useQuery(),{data:i,isLoading:o}=m.provider.getConfigs.useQuery(),{data:x,isLoading:p}=m.provider.getRegisteredTypes.useQuery(),{data:d}=m.provider.ping.useQuery(void 0,{staleTime:V.sessionStaleTimeMs,refetchOnMount:"always"}),h=m.provider.saveConfig.useMutation({onSuccess:()=>{s.provider.list.invalidate(),s.provider.getConfigs.invalidate(),s.provider.ping.invalidate()}}),r=m.provider.removeConfig.useMutation({onSuccess:()=>{s.provider.list.invalidate(),s.provider.getConfigs.invalidate(),s.provider.ping.invalidate()}}),[g,u]=f.useState(null),[v,b]=f.useState({}),[C,c]=f.useState(null),[N,S]=f.useState(null),[k,j]=f.useState({});function y(n){const w=i?.find(M=>M.type===n),A=x?.find(M=>M.type===n);b(Ce(A?.configFields??[],w?.config)),c(null),u(n)}function P(){u(null),b({}),c(null)}async function U(n){c(null);try{const w=await h.mutateAsync({type:n,config:v});c(w),w.success&&(u(null),b({}))}catch{c({success:!1,error:"Failed to save configuration"})}}async function F(n,w){if(w){j(A=>{const M={...A};return delete M[n],M});try{const A=await h.mutateAsync({type:n,config:{}});A.success||j(M=>({...M,[n]:A.error??"Connection failed"}))}catch{j(A=>({...A,[n]:"Failed to save configuration"}))}}else S(n)}async function K(n){await r.mutateAsync(n),u(null),b({}),c(null),S(null)}const z=l||o||p,R=x??[];if(z)return e.jsx(I,{size:"lg",centered:!0});const T=g?R.find(n=>n.type===g):null,B=g?i?.find(n=>n.type===g):null;return e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"flex flex-wrap gap-3",children:R.map(({type:n,label:w,configFields:A})=>{const M=t?.find(L=>L.type===n),q=i?.find(L=>L.type===n),oe=!!q,D=d?.find(L=>L.type===n),le=D?D.ok:!!M?.connected,re=A.length>0,ce=D&&!D.ok?D.error:void 0;return e.jsx(ye,{type:n,label:w,connected:le,configured:oe,onConfigure:()=>y(n),onToggle:L=>F(n,L),togglePending:h.isPending||r.isPending,toggleError:k[n],pingError:ce,hasConfigFields:re,existingConfig:q?.config},n)})}),g&&T&&e.jsx(ae,{open:!0,label:T.label,configFields:T.configFields,formValues:v,onFormChange:(n,w)=>b(A=>({...A,[n]:w})),existingConfig:B?.config??null,saveResult:C,savePending:h.isPending,configured:!!B,note:Ne[g],onSave:()=>U(g),onClose:P,onRemove:()=>S(g)}),e.jsx(E,{open:N!==null,title:"Disable provider",message:`Disable ${R.find(n=>n.type===N)?.label??N}?`,confirmLabel:"Disable",onConfirm:()=>{N&&K(N)},onCancel:()=>S(null)})]})}const Se=[{key:"domain",label:"Domain (yourco → yourco.atlassian.net)",type:"text"},{key:"email",label:"Email",type:"text"},{key:"apiToken",label:"API Token",type:"password"}],ke=e.jsxs($,{children:[e.jsxs("div",{children:["Create a token (use the plain ",e.jsx("span",{className:"font-medium",children:"Create API token"}),', not "with scopes") at:',e.jsx("br",{}),e.jsx("a",{href:"https://id.atlassian.com/manage-profile/security/api-tokens",target:"_blank",rel:"noopener noreferrer",className:Z,children:"https://id.atlassian.com/manage-profile/security/api-tokens"})]}),e.jsxs("div",{children:[e.jsx("div",{className:"font-medium",children:"What Tracer can do with it"}),e.jsxs("ul",{className:"list-disc ml-4 mt-1 space-y-0.5",children:[e.jsxs("li",{children:[e.jsx("span",{className:"font-medium",children:"Read an issue"})," — summary, description, status, type, priority, assignee, reporter, labels, components, fix versions, resolution, dates, and its comment thread"]}),e.jsxs("li",{children:[e.jsx("span",{className:"font-medium",children:"Post a comment"})," — plain text, only when you ask"]})]})]}),e.jsx("div",{className:"opacity-80",children:"It cannot edit, transition, delete, bulk-read, or administer anything else. The token uses its account's permissions, so for least privilege point it at a Jira account limited to the projects Tracer should touch."})]});function Ae(){const s=m.useUtils(),{data:t,isLoading:l}=m.integrations.getJira.useQuery(),i=m.integrations.saveJira.useMutation({onSuccess:()=>s.integrations.getJira.invalidate()}),o=m.integrations.removeJira.useMutation({onSuccess:()=>s.integrations.getJira.invalidate()}),[x,p]=f.useState(!1),[d,h]=f.useState({}),[r,g]=f.useState(null),[u,v]=f.useState(!1),b=!!t?.configured,C=t?.config??null;function c(){h({domain:C?.domain??"",email:C?.email??"",apiToken:C?.apiToken??""}),g(null),p(!0)}function N(){p(!1),h({}),g(null)}async function S(){g(null);try{const j=await i.mutateAsync({domain:d.domain??"",email:d.email??"",apiToken:d.apiToken??""});g(j),j.success&&N()}catch{g({success:!1,error:"Failed to save configuration"})}}async function k(){await o.mutateAsync(),v(!1),N()}return l?e.jsx(I,{size:"lg",centered:!0}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"flex flex-wrap gap-3",children:e.jsx("div",{className:a.settingsCard+" w-80",children:e.jsxs("div",{className:"flex items-center justify-between gap-4",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(J,{checked:b,onChange:j=>{j?c():v(!0)},disabled:i.isPending||o.isPending}),e.jsx("span",{className:"font-medium",children:"Jira"}),b?e.jsx(H,{status:"connected"}):e.jsx("span",{className:"text-xs opacity-40",children:"Not configured"})]}),e.jsx("button",{onClick:c,className:`${a.secondaryBtn} ${b?"":"invisible"}`,children:"Edit"})]})})}),x&&e.jsx(ae,{open:!0,label:"Jira",configFields:Se,formValues:d,onFormChange:(j,y)=>h(P=>({...P,[j]:y})),existingConfig:C,saveResult:r,savePending:i.isPending,configured:b,note:ke,onSave:S,onClose:N,onRemove:()=>v(!0)}),e.jsx(E,{open:u,title:"Disable Jira",message:"Disable the Jira integration?",confirmLabel:"Disable",onConfirm:k,onCancel:()=>v(!1)})]})}function Me({memory:s,editingId:t,editNote:l,setEditNote:i,onUpdate:o,onCancelEdit:x,onStartEdit:p,onDelete:d,updatePending:h,removePending:r}){return e.jsxs("li",{className:"flex items-start justify-between gap-3 py-1.5 border-b border-[#d4d2cd] last:border-b-0",children:[e.jsx("div",{className:"flex-1 min-w-0",children:t===s.id?e.jsxs("div",{className:"space-y-2",children:[e.jsx("input",{type:"text",value:l,onChange:g=>i(g.target.value),className:a.input}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{onClick:()=>o(s.id),disabled:!l||h,className:a.primaryBtn,children:"Save"}),e.jsx("button",{onClick:x,disabled:h,className:a.secondaryBtn,children:"Cancel"})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"text-sm text-[#444444]",children:s.note}),s.reviewNote&&e.jsx("p",{className:"text-xs text-[#9c9890] italic mt-0.5",children:s.reviewNote}),e.jsx("p",{className:"text-xs text-[#666666] mt-0.5",children:new Date(s.createdAt*1e3).toLocaleDateString()})]})}),t!==s.id&&e.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[e.jsx("button",{onClick:()=>p(s.id,s.note),className:a.secondaryBtn,children:"Edit"}),e.jsx("button",{onClick:()=>d(s.id),disabled:r,className:a.dangerBtn,children:"Delete"})]})]})}function Pe(){const s=m.useUtils(),{data:t,isLoading:l}=m.memory.list.useQuery(),{data:i}=m.provider.getRegisteredTypes.useQuery(),o=m.memory.create.useMutation({onSuccess:()=>{s.memory.list.invalidate(),P(""),j("unified"),S(!1)}}),x=m.memory.update.useMutation({onSuccess:()=>s.memory.list.invalidate()}),p=m.memory.remove.useMutation({onSuccess:()=>s.memory.list.invalidate()}),[d,h]=f.useState(null),r=m.memory.optimize.useMutation({onSuccess:n=>{s.memory.list.invalidate(),h(n.stats)}}),[g,u]=f.useState(null),[v,b]=f.useState(""),[C,c]=f.useState(null),[N,S]=f.useState(!1),[k,j]=f.useState("unified"),[y,P]=f.useState("");function U(n,w){u(n),b(w)}async function F(n){await x.mutateAsync({id:n,note:v}),u(null),b("")}function K(){u(null),b("")}const z=[{value:"unified",label:"Unified"},...(i??[]).map(n=>({value:n.type,label:n.label}))],R=5;if(l)return e.jsx(I,{size:"lg",centered:!0});const T=new Map;if(t)for(const n of t){const w=T.get(n.toolName)??[];w.push(n),T.set(n.toolName,w)}const B={editingId:g,editNote:v,setEditNote:b,onUpdate:F,onCancelEdit:K,onStartEdit:U,onDelete:n=>c(n),updatePending:x.isPending,removePending:p.isPending};return e.jsxs("div",{className:"space-y-4",children:[N?e.jsxs("div",{className:a.settingsCard+" space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("label",{className:"text-sm font-medium text-[#666666] font-sans",children:"Provider"}),e.jsx("select",{value:k,onChange:n=>{j(n.target.value),n.target.blur()},className:"bg-white border border-[#d4d2cd] rounded px-3 py-2 pr-8 text-sm text-[#2c2c2c] focus:outline-none focus:border-[#2b5ea7] font-sans appearance-none bg-[length:16px_16px] bg-[right_8px_center] bg-no-repeat",style:{backgroundImage:`url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23666666' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E")`},children:z.map(n=>e.jsx("option",{value:n.value,children:n.label},n.value))})]}),e.jsxs("div",{children:[e.jsx("label",{className:a.sectionTitle,children:"Note"}),e.jsx("input",{type:"text",value:y,onChange:n=>P(n.target.value),onKeyDown:n=>{n.key==="Enter"&&y.trim()&&!o.isPending&&o.mutate({toolName:k,note:y})},placeholder:"Reusable lesson or pattern...",className:a.input})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("button",{onClick:()=>o.mutate({toolName:k,note:y}),disabled:!y.trim()||o.isPending,className:a.primaryBtn,children:o.isPending?e.jsxs("span",{className:"flex items-center gap-2",children:[e.jsx(I,{size:"sm"})," Saving..."]}):"Save"}),e.jsx("button",{onClick:()=>{S(!1),P(""),j("unified")},disabled:o.isPending,className:a.secondaryBtn,children:"Cancel"})]})]}):e.jsx("button",{onClick:()=>S(!0),className:a.secondaryBtn,children:"+ Add Memory"}),T.size===0&&e.jsx("div",{className:a.settingsCard,children:e.jsx("p",{className:"text-sm text-[#666666]",children:"No memories yet. The agent will save notes here as it learns from tool usage."})}),[...T.entries()].map(([n,w])=>{const A=w.length>R;return e.jsxs("div",{className:a.settingsCard,children:[e.jsxs("div",{className:"mb-3 flex items-center gap-2",children:[e.jsx("span",{className:`${a.badge} ${a.badgeVariants.info}`,children:n}),A&&e.jsxs("span",{className:"text-xs text-[#666666]",children:[w.length," memories"]}),e.jsx("button",{onClick:()=>r.mutate({toolName:n}),disabled:r.isPending||w.length===0,className:`ml-auto ${a.outlineBtn}`,title:"Optimize memories with AI",children:r.isPending&&r.variables?.toolName===n?e.jsxs("span",{className:"flex items-center gap-1",children:[e.jsx(I,{size:"sm"})," Optimizing..."]}):"Optimize"})]}),e.jsx("ul",{className:`space-y-2${A?" max-h-64 overflow-y-auto":""}`,children:w.map(M=>e.jsx(Me,{memory:M,...B},M.id))})]},n)}),e.jsx(E,{open:C!==null,title:"Delete memory",message:"Delete this agent memory?",onConfirm:()=>{C!==null&&p.mutate({id:C}),c(null)},onCancel:()=>c(null)}),e.jsx(E,{open:d!==null,title:"Optimization Complete",message:d&&e.jsxs("div",{className:"space-y-1.5 text-sm text-[#444444]",children:[e.jsxs("p",{children:["Kept: ",e.jsx("span",{className:"font-medium",children:d.kept})]}),e.jsxs("p",{children:["Updated: ",e.jsx("span",{className:"font-medium",children:d.updated})]}),e.jsxs("p",{children:["Deleted: ",e.jsx("span",{className:"font-medium",children:d.deleted})]})]}),confirmLabel:"OK",cancelLabel:null,confirmStyle:"primary",onConfirm:()=>h(null),onCancel:()=>h(null)})]})}function Ie(){const s=m.useUtils(),{data:t,isLoading:l}=m.settings.getChatModel.useQuery(),i=m.settings.saveChatModel.useMutation({onSuccess:()=>s.settings.getChatModel.invalidate()}),{models:o,isLoading:x}=se();return l||!t?null:e.jsx(ne,{value:t,models:o,loading:x,disabled:i.isPending,onChange:p=>i.mutate({provider:p.provider,modelId:p.modelId})})}const Q=["Pacific/Auckland","Australia/Sydney","Asia/Tokyo","Asia/Shanghai","Asia/Kolkata","Asia/Dubai","Europe/Moscow","Europe/Berlin","UTC","Europe/London","America/Sao_Paulo","America/New_York","America/Chicago","America/Denver","America/Los_Angeles","Pacific/Honolulu"];function ie(s){try{const t=new Intl.DateTimeFormat("en-US",{timeZone:s,timeZoneName:"short"}).formatToParts(new Date).find(i=>i.type==="timeZoneName")?.value??"",l=new Intl.DateTimeFormat("en-US",{timeZone:s,timeZoneName:"shortOffset"}).formatToParts(new Date).find(i=>i.type==="timeZoneName")?.value??"";return`${t} (${l})`}catch{return s}}const Te=new Map(Q.map(s=>[s,ie(s)]));function Le(){const s=m.useUtils(),{data:t,isLoading:l}=m.settings.getAgentConfig.useQuery(),i=m.settings.saveAgentConfig.useMutation({onSuccess:()=>{s.settings.getAgentConfig.invalidate(),c(!1)}}),[o,x]=f.useState(""),[p,d]=f.useState(100),[h,r]=f.useState(50),[g,u]=f.useState(1024),[v,b]=f.useState(1e4),[C,c]=f.useState(!1);if(f.useEffect(()=>{t&&(x(t.timezone),d(t.directModeMaxSteps),r(t.subAgentMaxSteps),u(t.thinkingBudgetGoogle),b(t.thinkingBudgetAnthropic),c(!1))},[t]),l||!t)return null;const N=C&&(o!==t.timezone||p!==t.directModeMaxSteps||h!==t.subAgentMaxSteps||g!==t.thinkingBudgetGoogle||v!==t.thinkingBudgetAnthropic);function S(){i.mutate({timezone:o,directModeMaxSteps:p,subAgentMaxSteps:h,thinkingBudgetGoogle:g,thinkingBudgetAnthropic:v})}function k(){c(!0)}return e.jsxs("div",{className:"max-w-lg space-y-3",children:[e.jsxs("div",{className:a.settingsCard,children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"text-sm font-medium",children:"Unified mode model"}),e.jsx("span",{className:"text-xs opacity-40",children:"used when chat scope is “ALL”"})]}),e.jsx(Ie,{})]}),e.jsxs("div",{className:a.settingsCard,children:[e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("label",{className:"text-xs text-[#666666] w-44 shrink-0",children:"Timezone"}),e.jsxs("select",{value:o,onChange:j=>{x(j.target.value),k()},className:"appearance-none bg-white border border-[#d4d2cd] rounded px-3 py-1.5 text-xs text-[#2c2c2c] focus:outline-none focus:border-[#2b5ea7] font-sans",children:[Q.map(j=>e.jsx("option",{value:j,children:Te.get(j)??j},j)),!Q.includes(o)&&e.jsx("option",{value:o,children:ie(o)})]})]}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("label",{className:"text-xs text-[#666666] w-44 shrink-0",children:"Direct mode max steps"}),e.jsx("input",{type:"number",min:1,max:500,value:p,onChange:j=>{d(Number(j.target.value)),k()},className:"w-20 bg-white border border-[#d4d2cd] rounded px-3 py-1.5 text-xs text-[#2c2c2c] focus:outline-none focus:border-[#2b5ea7] font-mono"})]}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("label",{className:"text-xs text-[#666666] w-44 shrink-0",children:"Sub-agent max steps"}),e.jsx("input",{type:"number",min:1,max:500,value:h,onChange:j=>{r(Number(j.target.value)),k()},className:"w-20 bg-white border border-[#d4d2cd] rounded px-3 py-1.5 text-xs text-[#2c2c2c] focus:outline-none focus:border-[#2b5ea7] font-mono"})]}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("label",{className:"text-xs text-[#666666] w-44 shrink-0",children:"Google thinking budget"}),e.jsx("input",{type:"number",min:0,max:1e5,step:256,value:g,onChange:j=>{u(Number(j.target.value)),k()},className:"w-24 bg-white border border-[#d4d2cd] rounded px-3 py-1.5 text-xs text-[#2c2c2c] focus:outline-none focus:border-[#2b5ea7] font-mono"}),e.jsx("span",{className:"text-[10px] text-[#9c9890]",children:"tokens"})]}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("label",{className:"text-xs text-[#666666] w-44 shrink-0",children:"Anthropic thinking budget"}),e.jsx("input",{type:"number",min:0,max:1e5,step:1e3,value:v,onChange:j=>{b(Number(j.target.value)),k()},className:"w-24 bg-white border border-[#d4d2cd] rounded px-3 py-1.5 text-xs text-[#2c2c2c] focus:outline-none focus:border-[#2b5ea7] font-mono"}),e.jsx("span",{className:"text-[10px] text-[#9c9890]",children:"tokens"})]})]}),e.jsxs("div",{className:"flex items-center gap-3 mt-4 pt-3 border-t border-[#e8e6e1]",children:[e.jsx("button",{onClick:S,disabled:!N||i.isPending,className:a.primaryBtn,children:i.isPending?"Saving...":"Save"}),i.isSuccess&&!C&&e.jsx("span",{className:a.successText,children:"Saved"})]})]})]})}function De(){return e.jsxs("div",{className:a.page,children:[e.jsxs("div",{children:[e.jsx("h3",{className:a.sectionTitle,children:"LLM API Keys"}),e.jsx(fe,{})]}),e.jsxs("div",{children:[e.jsx("h3",{className:a.sectionTitle,children:"Data Providers"}),e.jsx(we,{})]}),e.jsxs("div",{children:[e.jsx("h3",{className:a.sectionTitle,children:"Integrations"}),e.jsx(Ae,{})]}),e.jsxs("div",{children:[e.jsx("h3",{className:a.sectionTitle,children:"Agent Configuration"}),e.jsx(Le,{})]}),e.jsxs("div",{children:[e.jsx("h3",{className:a.sectionTitle,children:"Agent Memory"}),e.jsx(Pe,{})]})]})}export{De as Settings};
@@ -1 +1 @@
1
- import{R as p,L as x,A as d}from"./mermaid-GHXKKRXX-fHfNJrVx.js";import{r,j as f}from"./index-BrLT4CJt.js";import"./SearchableSelect-cW8CAuj_.js";var j=({code:i,language:e,raw:t,className:m,startLine:u,lineNumbers:n,...g})=>{let{shikiTheme:o}=r.useContext(p),a=x(),[h,s]=r.useState(t);return r.useEffect(()=>{if(!a){s(t);return}let l=a.highlight({code:i,language:e,themes:o},c=>{s(c)});l&&s(l)},[i,e,o,a,t]),f.jsx(d,{className:m,language:e,lineNumbers:n,result:h,startLine:u,...g})};export{j as HighlightedCodeBlockBody};
1
+ import{R as p,L as x,A as d}from"./mermaid-GHXKKRXX-B2DXmpLw.js";import{r,j as f}from"./index-D555Ai5J.js";import"./SearchableSelect-BGG4ZQsh.js";var j=({code:i,language:e,raw:t,className:m,startLine:u,lineNumbers:n,...g})=>{let{shikiTheme:o}=r.useContext(p),a=x(),[h,s]=r.useState(t);return r.useEffect(()=>{if(!a){s(t);return}let l=a.highlight({code:i,language:e,themes:o},c=>{s(c)});l&&s(l)},[i,e,o,a,t]),f.jsx(d,{className:m,language:e,lineNumbers:n,result:h,startLine:u,...g})};export{j as HighlightedCodeBlockBody};
@@ -0,0 +1 @@
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--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-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--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-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;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-serif:Charter, "Bitstream Charter", Georgia, serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-600:oklch(66.6% .179 58.318);--color-emerald-500:oklch(69.6% .17 162.48);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--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)}}@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,ui-sans-serif, system-ui, 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;text-decoration:inherit}b,strong{font-weight:bolder}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{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)}}}textarea{resize:vertical}::-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}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-4{top:calc(var(--spacing) * 4)}.top-full{top:100%}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-4{bottom:calc(var(--spacing) * 4)}.bottom-full{bottom:100%}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing) * 2)}.left-4{left:calc(var(--spacing) * 4)}.left-10{left:calc(var(--spacing) * 10)}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-4{margin-inline:calc(var(--spacing) * 4)}.my-1{margin-block:calc(var(--spacing) * 1)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-3{margin-block:calc(var(--spacing) * 3)}.my-4{margin-block:calc(var(--spacing) * 4)}.my-6{margin-block:calc(var(--spacing) * 6)}.-mt-10{margin-top:calc(var(--spacing) * -10)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.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)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-0{margin-bottom:calc(var(--spacing) * 0)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.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}.list-item{display:list-item}.table{display:table}.table-cell{display:table-cell}.table-row{display:table-row}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-full{width:100%;height:100%}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-12{height:calc(var(--spacing) * 12)}.h-\[46px\]{height:46px}.h-full{height:100%}.h-screen{height:100vh}.max-h-24{max-height:calc(var(--spacing) * 24)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-\[85vh\]{max-height:85vh}.max-h-\[240px\]{max-height:240px}.max-h-\[280px\]{max-height:280px}.max-h-\[300px\]{max-height:300px}.max-h-\[440px\]{max-height:440px}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-28{min-height:calc(var(--spacing) * 28)}.min-h-\[200px\]{min-height:200px}.min-h-full{min-height:100%}.w-1{width:calc(var(--spacing) * 1)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-44{width:calc(var(--spacing) * 44)}.w-48{width:calc(var(--spacing) * 48)}.w-52{width:calc(var(--spacing) * 52)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-\[340px\]{width:340px}.w-\[480px\]{width:480px}.w-full{width:100%}.max-w-\[16ch\]{max-width:16ch}.max-w-\[300px\]{max-width:300px}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[5\.5rem\]{min-width:5.5rem}.min-w-\[16px\]{min-width:16px}.min-w-\[120px\]{min-width:120px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.origin-center{transform-origin:50%}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[3px\]{--tw-translate-x:3px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[18px\]{--tw-translate-x:18px;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.appearance-none{appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,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}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}: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(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * 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)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-4{column-gap:calc(var(--spacing) * 4)}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}.gap-y-1{row-gap:calc(var(--spacing) * 1)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-\[\#e8e6e1\]>:not(:last-child)){border-color:#e8e6e1}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[1px\]{border-radius:1px}.rounded-full{border-radius:3.40282e38px}.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-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.\!border-l-2{border-left-style:var(--tw-border-style)!important;border-left-width:2px!important}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[\#2a7a4a\]{border-color:#2a7a4a}.border-\[\#2b5ea7\]{border-color:#2b5ea7}.border-\[\#2b5ea7\]\/20{border-color:#2b5ea733}.border-\[\#7c3aed\]{border-color:#7c3aed}.border-\[\#8a6d3b\]\/25{border-color:#8a6d3b40}.border-\[\#0052cc\]{border-color:#0052cc}.border-\[\#b33a2a\]\/20{border-color:#b33a2a33}.border-\[\#c4c0b8\]{border-color:#c4c0b8}.border-\[\#c8e0d2\]{border-color:#c8e0d2}.border-\[\#d4d2cd\]{border-color:#d4d2cd}.border-\[\#e0dbd3\]{border-color:#e0dbd3}.border-\[\#e5e3de\]{border-color:#e5e3de}.border-\[\#e8e3da\]{border-color:#e8e3da}.border-\[\#e8e3da\]\/30{border-color:#e8e3da4d}.border-\[\#e8e6e1\]{border-color:#e8e6e1}.border-\[\#f7a501\]{border-color:#f7a501}.border-current{border-color:currentColor}.border-transparent{border-color:#0000}.border-t-\[\#2b5ea7\]{border-top-color:#2b5ea7}.border-t-transparent{border-top-color:#0000}.\!border-l-amber-400{border-left-color:var(--color-amber-400)!important}.bg-\[\#1a1a1a\]{background-color:#1a1a1a}.bg-\[\#2a7a4a\]{background-color:#2a7a4a}.bg-\[\#2a7a4a\]\/10{background-color:#2a7a4a1a}.bg-\[\#2b5ea7\]{background-color:#2b5ea7}.bg-\[\#2b5ea7\]\/10{background-color:#2b5ea71a}.bg-\[\#a07020\]{background-color:#a07020}.bg-\[\#a07020\]\/10{background-color:#a070201a}.bg-\[\#b9c4d4\]{background-color:#b9c4d4}.bg-\[\#b33a2a\]{background-color:#b33a2a}.bg-\[\#b33a2a\]\/5{background-color:#b33a2a0d}.bg-\[\#b33a2a\]\/10{background-color:#b33a2a1a}.bg-\[\#d4d0c8\]{background-color:#d4d0c8}.bg-\[\#d4d2cd\]{background-color:#d4d2cd}.bg-\[\#e6eefc\]{background-color:#e6eefc}.bg-\[\#e8e3da\]\/30{background-color:#e8e3da4d}.bg-\[\#eaf0f8\]{background-color:#eaf0f8}.bg-\[\#ede9e3\]{background-color:#ede9e3}.bg-\[\#f0eee9\]{background-color:#f0eee9}.bg-\[\#f2f8f5\]{background-color:#f2f8f5}.bg-\[\#f5f1e6\]{background-color:#f5f1e6}.bg-\[\#f5f4f0\]{background-color:#f5f4f0}.bg-\[\#f5f4f1\]{background-color:#f5f4f1}.bg-\[\#f7f6f3\]{background-color:#f7f6f3}.bg-\[\#faf8f4\]{background-color:#faf8f4}.bg-\[\#fafaf8\]{background-color:#fafaf8}.bg-\[var\(--sdm-tbg\)\]{background-color:var(--sdm-tbg)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black) 10%,transparent)}}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab,red,red)){.bg-black\/20{background-color:color-mix(in oklab,var(--color-black) 20%,transparent)}}.bg-current{background-color:currentColor}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/90{background-color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.bg-white\/90{background-color:color-mix(in oklab,var(--color-white) 90%,transparent)}}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-\[\#f7f6f3\]{--tw-gradient-from:#f7f6f3;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-\[length\:16px_16px\]{background-size:16px 16px}.bg-\[right_8px_center\]{background-position:right 8px center}.bg-no-repeat{background-repeat:no-repeat}.p-1{padding:calc(var(--spacing) * 1)}.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-0{padding-inline:calc(var(--spacing) * 0)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-10{padding-inline:calc(var(--spacing) * 10)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-0{padding-top:calc(var(--spacing) * 0)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-7{padding-right:calc(var(--spacing) * 7)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-1{padding-bottom:calc(var(--spacing) * 1)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-9{padding-left:calc(var(--spacing) * 9)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-\[1\.8\]{--tw-leading:1.8;line-height:1.8}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.15em\]{--tw-tracking:.15em;letter-spacing:.15em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.\[overflow-wrap\:break-word\]{overflow-wrap:break-word}.wrap-anywhere{overflow-wrap:anywhere}.break-all{word-break:break-all}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.\!text-\[\#999\]{color:#999!important}.text-\[\#2a7a4a\]{color:#2a7a4a}.text-\[\#2b5ea7\]{color:#2b5ea7}.text-\[\#2c2c2c\]{color:#2c2c2c}.text-\[\#4a4540\]{color:#4a4540}.text-\[\#6b6560\]{color:#6b6560}.text-\[\#7c3aed\]{color:#7c3aed}.text-\[\#8a6d3b\]{color:#8a6d3b}.text-\[\#9c9890\]{color:#9c9890}.text-\[\#9c9890\]\/60{color:#9c989099}.text-\[\#0052cc\]{color:#0052cc}.text-\[\#333\]{color:#333}.text-\[\#555\]{color:#555}.text-\[\#444444\]{color:#444}.text-\[\#666666\]{color:#666}.text-\[\#a07020\]{color:#a07020}.text-\[\#b0a89f\]{color:#b0a89f}.text-\[\#b0a898\]{color:#b0a898}.text-\[\#b8b5af\]{color:#b8b5af}.text-\[\#b33a2a\]{color:#b33a2a}.text-\[\#b3261e\]{color:#b3261e}.text-\[\#d4a017\]{color:#d4a017}.text-\[\#d4d2cd\]{color:#d4d2cd}.text-\[\#e0e0e0\]{color:#e0e0e0}.text-\[\#f7a501\]{color:#f7a501}.text-\[var\(--sdm-c\,inherit\)\]{color:var(--sdm-c,inherit)}.text-amber-600{color:var(--color-amber-600)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.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,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.placeholder-\[\#9c9890\]::placeholder{color:#9c9890}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-100{opacity:1}.shadow-\[inset_0_1px_2px_rgba\(0\,0\,0\,0\.1\)\]{--tw-shadow:inset 0 1px 2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.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,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.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-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;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))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[counter-increment\:line_0\]{counter-increment:line 0}.\[counter-reset\:line\]{counter-reset:line}@media(hover:hover){.group-hover\:block:is(:where(.group):hover *){display:block}.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/analysis\:opacity-100:is(:where(.group\/analysis):hover *),.group-hover\/summary\:opacity-100:is(:where(.group\/summary):hover *){opacity:1}}.placeholder\:text-\[\#9c9890\]::placeholder{color:#9c9890}.before\:mr-4:before{content:var(--tw-content);margin-right:calc(var(--spacing) * 4)}.before\:inline-block:before{content:var(--tw-content);display:inline-block}.before\:w-6:before{content:var(--tw-content);width:calc(var(--spacing) * 6)}.before\:text-right:before{content:var(--tw-content);text-align:right}.before\:font-mono:before{content:var(--tw-content);font-family:var(--font-mono)}.before\:text-\[13px\]:before{content:var(--tw-content);font-size:13px}.before\:content-\[counter\(line\)\]:before{--tw-content:counter(line);content:var(--tw-content)}.before\:select-none:before{content:var(--tw-content);-webkit-user-select:none;user-select:none}.before\:\[counter-increment\:line\]:before{content:var(--tw-content);counter-increment:line}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media(hover:hover){.hover\:border-\[\#b0ada6\]:hover{border-color:#b0ada6}.hover\:border-\[\#c4c0b8\]:hover{border-color:#c4c0b8}.hover\:bg-\[\#1e4a8a\]:hover{background-color:#1e4a8a}.hover\:bg-\[\#2b5ea7\]:hover{background-color:#2b5ea7}.hover\:bg-\[\#2b5ea7\]\/20:hover{background-color:#2b5ea733}.hover\:bg-\[\#234d8a\]:hover{background-color:#234d8a}.hover\:bg-\[\#b33a2a\]\/20:hover{background-color:#b33a2a33}.hover\:bg-\[\#eaf0f8\]:hover{background-color:#eaf0f8}.hover\:bg-\[\#eeece7\]:hover{background-color:#eeece7}.hover\:bg-\[\#efe8d5\]:hover{background-color:#efe8d5}.hover\:bg-\[\#f5f4f0\]:hover{background-color:#f5f4f0}.hover\:bg-\[\#f5f4f0\]\/50:hover{background-color:#f5f4f080}.hover\:text-\[\#2b5ea7\]:hover{color:#2b5ea7}.hover\:text-\[\#6b6560\]:hover{color:#6b6560}.hover\:text-\[\#9c9890\]:hover{color:#9c9890}.hover\:text-\[\#234d8a\]:hover{color:#234d8a}.hover\:text-\[\#b33a2a\]:hover{color:#b33a2a}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}}.focus\:border-\[\#2b5ea7\]:focus{border-color:#2b5ea7}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media(hover:hover){.disabled\:hover\:bg-transparent:disabled:hover{background-color:#0000}.disabled\:hover\:text-\[\#2b5ea7\]:disabled:hover{color:#2b5ea7}}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.supports-\[backdrop-filter\]\:backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.supports-\[backdrop-filter\]\:backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}}@media(prefers-color-scheme:dark){.dark\:bg-\[var\(--shiki-dark-bg\,var\(--sdm-tbg\)\)\]{background-color:var(--shiki-dark-bg,var(--sdm-tbg))}.dark\:text-\[var\(--shiki-dark\,var\(--sdm-c\,inherit\)\)\]{color:var(--shiki-dark,var(--sdm-c,inherit))}}.\[\&_svg\]\:h-auto svg{height:auto}.\[\&_svg\]\:w-auto svg{width:auto}.\[\&_thead\]\:sticky thead{position:sticky}.\[\&_thead\]\:top-0 thead{top:calc(var(--spacing) * 0)}.\[\&_thead\]\:z-10 thead{z-index:10}.\[\&\>\*\:first-child\]\:mt-0>:first-child{margin-top:calc(var(--spacing) * 0)}.\[\&\>\*\:last-child\]\:mb-0>:last-child{margin-bottom:calc(var(--spacing) * 0)}.\[\&\>\*\:last-child\]\:after\:inline>:last-child:after{content:var(--tw-content);display:inline}.\[\&\>\*\:last-child\]\:after\:align-baseline>:last-child:after{content:var(--tw-content);vertical-align:baseline}.\[\&\>\*\:last-child\]\:after\:content-\[var\(--streamdown-caret\)\]>:last-child:after{--tw-content:var(--streamdown-caret);content:var(--tw-content)}.\[\&\>p\]\:inline>p{display:inline}li .\[li_\&\]\:pl-6{padding-left:calc(var(--spacing) * 6)}}@keyframes dot-bounce{0%,80%,to{opacity:.4;transform:translateY(0)}40%{opacity:1;transform:translateY(-4px)}}@keyframes fill-up-down{0%,10%{clip-path:inset(0 100% 0 0)}45%,55%{clip-path:inset(0)}90%,to{clip-path:inset(0 0 0 100%)}}.react-grid-placeholder{opacity:.2!important;background:#d4d2cd!important}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value: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-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@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-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}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}