@deepseek-insight/dsi 0.10.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/.agents/skills/glass-dsi/scripts/_connect.mjs +21 -2
  2. package/.agents/skills/glass-url/scripts/_connect.mjs +4 -2
  3. package/README.md +34 -26
  4. package/bin/dsi.mjs +23 -12
  5. package/bin/lib/glass-browser-bootstrap.mjs +19 -2
  6. package/bin/lib/plugin-chain.mjs +6 -5
  7. package/bin/lib/zai-patch.mjs +3 -1
  8. package/build/client/_app/immutable/assets/0.Bjw4vcZl.css +2 -0
  9. package/build/client/_app/immutable/assets/2.glyfXGzi.css +1 -0
  10. package/build/client/_app/immutable/chunks/Dj8AK3pr.js +1 -0
  11. package/build/client/_app/immutable/chunks/UPlr67N1.js +2 -0
  12. package/build/client/_app/immutable/chunks/WySTHi46.js +1 -0
  13. package/build/client/_app/immutable/chunks/{UcxQDPMg.js → e-3PBXxJ.js} +1 -1
  14. package/build/client/_app/immutable/entry/{app.GxH1nznH.js → app.ezxtVZch.js} +2 -2
  15. package/build/client/_app/immutable/entry/start.DdPLwPDt.js +1 -0
  16. package/build/client/_app/immutable/nodes/{1.BVvBJtMj.js → 1.CGppLUrN.js} +1 -1
  17. package/build/client/_app/immutable/nodes/{2.D0JzdegJ.js → 2.9BE7-E5x.js} +197 -199
  18. package/build/client/_app/version.json +1 -1
  19. package/build/handler.js +5 -5
  20. package/build/index.js +5 -5
  21. package/build/server/chunks/chunks/{db.js-f2PmBjyD.js → db.js-BGSxIVb3.js} +2 -2
  22. package/build/server/chunks/chunks/{db2.js-DkwY64WO.js → db2.js-vQNFcVO7.js} +2 -2
  23. package/build/server/chunks/chunks/{dsh-connection.js-BW07Aicl.js → dsh-connection.js-Dcdxqp52.js} +27 -7
  24. package/build/server/chunks/chunks/{exports.js-DH_tjtdv.js → exports.js-D5zA1U7A.js} +42 -4
  25. package/build/server/chunks/chunks/{git-probe.js-CQqTV7XX.js → git-probe.js-BIieYqLU.js} +2 -2
  26. package/build/server/chunks/chunks/{insight-config.js-C5-Rhh5A.js → insight-config.js-ylYA2CXm.js} +2 -2
  27. package/build/server/chunks/chunks/{internal2.js-BRzR_ZGp.js → internal2.js-Cu5N8_4R.js} +3 -3
  28. package/build/server/chunks/chunks/{registry.js-6St5Biiy.js → registry.js-Bwc2MNSZ.js} +53 -50
  29. package/build/server/chunks/chunks/{registry2.js-CFzpvj9c.js → registry2.js-BZfrwsOy.js} +20 -1
  30. package/build/server/chunks/chunks/{settings-document.js-DxKURfc_.js → settings-document.js-BIxaivJ1.js} +23 -8
  31. package/build/server/chunks/chunks/{state.js-Ct6h8rMl.js → state.js-CRPhnJJH.js} +3 -3
  32. package/build/server/chunks/chunks/{watcher.js-DvlNn8X0.js → watcher.js-Bcm29AuA.js} +4 -4
  33. package/build/server/chunks/entries/endpoints/api/a2a/_id_/{_server.ts.js-DItDXV23.js → _server.ts.js-BbIEpZB5.js} +4 -4
  34. package/build/server/chunks/entries/endpoints/api/a2a/{_server.ts.js-Hor8QZb1.js → _server.ts.js-Daho1I-l.js} +6 -6
  35. package/build/server/chunks/entries/endpoints/api/a2a/register/{_server.ts.js-CEvvsa8B.js → _server.ts.js-C5X77Uef.js} +6 -6
  36. package/build/server/chunks/entries/endpoints/api/browser/_id_/activate/{_server.ts.js-DYvCel9L.js → _server.ts.js-BxfB-QXT.js} +4 -4
  37. package/build/server/chunks/entries/endpoints/api/browser/_id_/close/{_server.ts.js-CDNbpOqu.js → _server.ts.js-DT6rU-EU.js} +4 -4
  38. package/build/server/chunks/entries/endpoints/api/browser/_id_/closetab/{_server.ts.js-C8UZMTcb.js → _server.ts.js-Cwu4C98Y.js} +4 -4
  39. package/build/server/chunks/entries/endpoints/api/browser/_id_/element/{_server.ts.js-CERwttQS.js → _server.ts.js-B55tx3-S.js} +4 -4
  40. package/build/server/chunks/entries/endpoints/api/browser/_id_/history/{_server.ts.js-DtVkS-mH.js → _server.ts.js-D2ft7u0s.js} +4 -4
  41. package/build/server/chunks/entries/endpoints/api/browser/_id_/input/{_server.ts.js-C85umKKr.js → _server.ts.js-BO1uO6i3.js} +4 -4
  42. package/build/server/chunks/entries/endpoints/api/browser/_id_/mcp/{_server.ts.js-CrTtygPQ.js → _server.ts.js-zOccgfJZ.js} +4 -4
  43. package/build/server/chunks/entries/endpoints/api/browser/_id_/navigate/{_server.ts.js-DgJ6DXVr.js → _server.ts.js-DgyR0sLf.js} +4 -4
  44. package/build/server/chunks/entries/endpoints/api/browser/_id_/opentab/{_server.ts.js-Bj9bKEEv.js → _server.ts.js-CPCIL2MG.js} +4 -4
  45. package/build/server/chunks/entries/endpoints/api/browser/_id_/page/{_server.ts.js--1WTGEfT.js → _server.ts.js-Cjvr5nEt.js} +4 -4
  46. package/build/server/chunks/entries/endpoints/api/browser/_id_/stream/{_server.ts.js-D8hQe810.js → _server.ts.js-Bb3DkB-H.js} +4 -4
  47. package/build/server/chunks/entries/endpoints/api/browser/_id_/tabs/{_server.ts.js-CSYYFlm2.js → _server.ts.js-DVcq1pYf.js} +4 -4
  48. package/build/server/chunks/entries/endpoints/api/browser/_id_/viewport/{_server.ts.js-KJjT8zXH.js → _server.ts.js-D1xgkwTO.js} +4 -4
  49. package/build/server/chunks/entries/endpoints/api/browser/_id_/zoom/{_server.ts.js-DQtzgPeG.js → _server.ts.js-DFo94fTq.js} +4 -4
  50. package/build/server/chunks/entries/endpoints/api/browser/{_server.ts.js-DSkCBGRA.js → _server.ts.js-0Gye8oLN.js} +4 -4
  51. package/build/server/chunks/entries/endpoints/api/config/{_server.ts.js-C_9kwANR.js → _server.ts.js-DqPIv-gn.js} +4 -4
  52. package/build/server/chunks/entries/endpoints/api/dsh/directory/{_server.ts.js-h1OTHcL4.js → _server.ts.js-DzFVVhO_.js} +4 -4
  53. package/build/server/chunks/entries/endpoints/api/dsh/jobs/{_server.ts.js-B6nih9Sd.js → _server.ts.js-DvuZUgbK.js} +4 -4
  54. package/build/server/chunks/entries/endpoints/api/dsh/jobs/follow/{_server.ts.js-Cf17SVmD.js → _server.ts.js-D6brRlYZ.js} +4 -4
  55. package/build/server/chunks/entries/endpoints/api/dsh/pick-directory/{_server.ts.js-DjNwMbdS.js → _server.ts.js-8nNlcikK.js} +4 -4
  56. package/build/server/chunks/entries/endpoints/api/dsh/presets/{_server.ts.js-Cz5aaEhC.js → _server.ts.js-C8AZBt63.js} +4 -4
  57. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/attachment/{_server.ts.js-BFBy5O9Y.js → _server.ts.js-BFfr6uJh.js} +4 -4
  58. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/cancel/{_server.ts.js-CgEdCo3T.js → _server.ts.js-DSSgbD87.js} +4 -4
  59. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/catalog/{_server.ts.js-Bo_aEnHh.js → _server.ts.js-DYtrYC2P.js} +4 -4
  60. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/changes/{_server.ts.js-Bd2G_GaH.js → _server.ts.js-HxI5M4jg.js} +4 -4
  61. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/command/{_server.ts.js-DL64FyRw.js → _server.ts.js-Ch0dMm33.js} +4 -4
  62. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/events/{_server.ts.js-MhOGB66D.js → _server.ts.js-BG5C--Ok.js} +4 -4
  63. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/fork/{_server.ts.js-MjPgXgGO.js → _server.ts.js-B64YyaFI.js} +4 -4
  64. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/goal/{_server.ts.js-BUjDae5H.js → _server.ts.js-0RtL-9Zr.js} +4 -4
  65. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/history/{_server.ts.js-dTKd7Hsv.js → _server.ts.js-C4k-RTIw.js} +4 -4
  66. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/models/{_server.ts.js-B82rvKoI.js → _server.ts.js-CU38DxMt.js} +4 -4
  67. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/path/{_server.ts.js-Cqijsi-c.js → _server.ts.js-BXphf5ux.js} +3 -3
  68. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/permission/{_server.ts.js-CL_vVv2p.js → _server.ts.js-DQ5FG9Pc.js} +4 -4
  69. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/prompt/{_server.ts.js-WS4W9Ly4.js → _server.ts.js-In3bXhUO.js} +4 -4
  70. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/rename/{_server.ts.js-B72KGRGh.js → _server.ts.js-Bd0KF8Qm.js} +4 -4
  71. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/respond/{_server.ts.js-DK5xb2b5.js → _server.ts.js-4Y-KAw2r.js} +4 -4
  72. package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/select-model/{_server.ts.js-lhT87EQu.js → _server.ts.js-zXYA1AJD.js} +4 -4
  73. package/build/server/chunks/entries/endpoints/api/dsh/sessions/{_server.ts.js-CMhfhbkN.js → _server.ts.js-vh7lFV0n.js} +4 -4
  74. package/build/server/chunks/entries/endpoints/api/dsh/subagents/{_server.ts.js-BLvcFsg6.js → _server.ts.js-DH7OEWm0.js} +4 -4
  75. package/build/server/chunks/entries/endpoints/api/dsh/workspace-file/{_server.ts.js-D_rw2Uq6.js → _server.ts.js-CDwgBp7D.js} +4 -4
  76. package/build/server/chunks/entries/endpoints/api/dsh/workspace-tree/{_server.ts.js-DfXpMMpw.js → _server.ts.js-CtFxC_yV.js} +4 -4
  77. package/build/server/chunks/entries/endpoints/api/dsh/workspaces/{_server.ts.js-2mJCJVxk.js → _server.ts.js-DRNzGdAj.js} +4 -4
  78. package/build/server/chunks/entries/endpoints/api/dsh/workspaces/_workspaceId_/delete/{_server.ts.js-BCx0Lzjf.js → _server.ts.js-DIjNfN0d.js} +4 -4
  79. package/build/server/chunks/entries/endpoints/api/dsh/workspaces/_workspaceId_/rename/{_server.ts.js-DECaSjwp.js → _server.ts.js-CtV7JhrK.js} +4 -4
  80. package/build/server/chunks/entries/endpoints/api/prompts/_id_/{_server.ts.js-i_ciJzlb.js → _server.ts.js-Cg9zHbUP.js} +4 -4
  81. package/build/server/chunks/entries/endpoints/api/prompts/{_server.ts.js-BO1pScn7.js → _server.ts.js-DOHmlKvl.js} +4 -4
  82. package/build/server/chunks/entries/endpoints/api/prompts/use/{_server.ts.js-Buhpf7WE.js → _server.ts.js-COVyy224.js} +4 -4
  83. package/build/server/chunks/entries/endpoints/api/settings/{_server.ts.js-DngUQzcT.js → _server.ts.js-HjpfRAaT.js} +3 -3
  84. package/build/server/chunks/entries/endpoints/api/terminal/_id_/delete/_server.ts.js-D9UU6xR6.js +42 -0
  85. package/build/server/chunks/entries/endpoints/api/terminal/_id_/output/{_server.ts.js-DLETP4yQ.js → _server.ts.js-BqJRMRsb.js} +2 -2
  86. package/build/server/chunks/entries/endpoints/api/terminal/_id_/reattach/{_server.ts.js-uWl6oxPS.js → _server.ts.js-D6bMXeOk.js} +2 -2
  87. package/build/server/chunks/entries/endpoints/api/terminal/_id_/send/{_server.ts.js-DYNmXaAd.js → _server.ts.js-BRgsqPFM.js} +2 -2
  88. package/build/server/chunks/entries/endpoints/api/terminal/_id_/stream/{_server.ts.js-C5m3Ktho.js → _server.ts.js-EWo4sSmg.js} +2 -2
  89. package/build/server/chunks/entries/endpoints/api/terminal/{_server.ts.js-DoTNvcOa.js → _server.ts.js-v1ixRdpN.js} +4 -4
  90. package/build/server/chunks/entries/endpoints/api/terminal/stream/_server.ts.js-BQOQyT7o.js +185 -0
  91. package/build/server/chunks/entries/endpoints/api/workspace/file-write/{_server.ts.js-BzYOJSkI.js → _server.ts.js-CjU6bLOf.js} +5 -5
  92. package/build/server/chunks/entries/endpoints/api/workspace/git-events/{_server.ts.js-xcNesei9.js → _server.ts.js-CYU0btiH.js} +5 -5
  93. package/build/server/chunks/entries/endpoints/api/workspace/git-file-head/{_server.ts.js-DsJWYdxt.js → _server.ts.js-Du9YcwLw.js} +5 -5
  94. package/build/server/chunks/entries/endpoints/api/workspace/git-map/{_server.ts.js-CNCku9BR.js → _server.ts.js-BdV_KDjb.js} +5 -5
  95. package/build/server/chunks/entries/endpoints/api/workspace/git-status/{_server.ts.js-nLsNjOxj.js → _server.ts.js-C-C84Yzu.js} +5 -5
  96. package/build/server/chunks/entries/endpoints/api/workspace/write-gate/{_server.ts.js-urQk2-ds.js → _server.ts.js-D9uFvZya.js} +5 -5
  97. package/build/server/chunks/entries/{hooks.server.js-CU2RE5vs.js → hooks.server.js-YJQlamhk.js} +2 -2
  98. package/build/server/chunks/entries/pages/{_error.svelte.js-BXD7Pthk.js → _error.svelte.js-CJ9RHd_3.js} +4 -4
  99. package/build/server/chunks/entries/pages/{_page.server.ts.js-BK3Y6eff.js → _page.server.ts.js-BFDPRDEm.js} +2 -2
  100. package/build/server/chunks/entries/pages/{_page.svelte.js-DaZfwP76.js → _page.svelte.js-DlLAziUY.js} +477 -139
  101. package/build/server/chunks/{handler-C5_-AjlT.js → handler-BRlzTcii.js} +3 -3
  102. package/build/server/chunks/{index.js-BECscw6k.js → index.js-D2umW-Cg.js} +3 -44
  103. package/build/server/chunks/{manifest.js-aksIjogg.js → manifest.js-CaT4HRXz.js} +81 -67
  104. package/build/server/chunks/nodes/{0.js-xX4GZsu5.js → 0.js-B8ciwPSu.js} +3 -3
  105. package/build/server/chunks/nodes/1.js-cXTCbvze.js +9 -0
  106. package/build/server/chunks/nodes/{2.js-CBdFoBFK.js → 2.js-CF_m1q-z.js} +8 -8
  107. package/package.json +1 -1
  108. package/skills/dsi-drive-terminal/SKILL.md +23 -1
  109. package/skills/dsi-spec/SKILL.md +8 -0
  110. package/skills/dsi-task/SKILL.md +34 -0
  111. package/skills/dsi-token-spent/SKILL.md +122 -0
  112. package/template/.dsi/prompts.sqlite +0 -0
  113. package/template/.dsi/prompts.sqlite-shm +0 -0
  114. package/template/.dsi/prompts.sqlite-wal +0 -0
  115. package/build/client/_app/immutable/assets/0.CxUWwepa.css +0 -2
  116. package/build/client/_app/immutable/assets/2.CSFboNRO.css +0 -1
  117. package/build/client/_app/immutable/chunks/C4M9oU_3.js +0 -1
  118. package/build/client/_app/immutable/chunks/CNT-CapI.js +0 -1
  119. package/build/client/_app/immutable/chunks/DttyJZuo.js +0 -2
  120. package/build/client/_app/immutable/entry/start.P-LmBYpD.js +0 -1
  121. package/build/server/chunks/nodes/1.js-BaNGyV1A.js +0 -9
  122. /package/build/client/_app/immutable/nodes/{0.CfpMgVS-.js → 0.DopnsZUT.js} +0 -0
@@ -26,6 +26,19 @@
26
26
  */
27
27
  import { chromium } from 'playwright-core';
28
28
 
29
+ /**
30
+ * @typedef {Object} GlassSession
31
+ * @property {string} id
32
+ * @property {number} [port]
33
+ * @property {string|null} [ownerSessionId]
34
+ * @property {string} [createdAt]
35
+ * @typedef {Object} PickResult
36
+ * @property {GlassSession|null|undefined} session
37
+ * @property {boolean} [degraded]
38
+ * @property {string} [note]
39
+ * @property {string} [error]
40
+ */
41
+
29
42
  // ── The Floor Seam (ADR "The Floor Seam" 2026-11-05, D1-D3) ────────────────
30
43
  // DSI_UI env verbatim when set; else parallel probe of both known floor
31
44
  // bases (5175 dev, 5174 build) with the D7 identity tiebreak. Tab identity
@@ -42,6 +55,7 @@ export function floorCandidates(env = process.env) {
42
55
 
43
56
  /** Resolve the live floor — one answer wins; both → pickSession per floor,
44
57
  * my-glass floor wins, double-claim dies loud; none → die naming both. */
58
+ /** @param {{ env?: Record<string, string|undefined>, fetchImpl?: typeof fetch, identity?: string|undefined, pickSessionFn?: (s: GlassSession[]|null|undefined, id: string|undefined) => PickResult, dieFn?: (msg: string) => never, timeoutMs?: number }} [opts] @returns {Promise<{ base: string, reg: { sessions: GlassSession[] } }>} — never resolves undefined: every fall-through path dies. */
45
59
  export async function resolveDsiBase({ env = process.env, fetchImpl = fetch, identity = undefined, pickSessionFn = pickSession, dieFn = die, timeoutMs = 3000 } = {}) {
46
60
  const candidates = floorCandidates(env);
47
61
  const probes = await Promise.all(candidates.map(async (base) => {
@@ -64,20 +78,22 @@ export async function resolveDsiBase({ env = process.env, fetchImpl = fetch, ide
64
78
  dieFn('a glass owned by you lives on BOTH floors (' + mine.map((m) => m.base).join(', ') +
65
79
  ') — set DSI_UI=<floor url> to name the floor; refusing to guess (D7)');
66
80
  }
67
- dieFn('both floors answer but neither holds YOUR glass (' + answered.map((m) => m.base).join(', ') +
81
+ return dieFn('both floors answer but neither holds YOUR glass (' + answered.map((m) => m.base).join(', ') +
68
82
  ') — click the Browser chip in THIS conversation');
69
83
  }
70
84
 
71
- /** True when a tab url's ORIGIN is the resolved floor's origin (D2). */
85
+ /** @param {string} url @param {string} base @returns {boolean} True when a tab url's ORIGIN is the resolved floor's origin (D2). */
72
86
  export function isFloorTab(url, base) {
73
87
  try { return new URL(url).origin === new URL(base).origin; } catch { return false; }
74
88
  }
75
89
 
90
+ /** @param {string} msg @returns {never} */
76
91
  export function die(msg) {
77
92
  console.error(JSON.stringify({ error: msg, fallback: 'SKILL.md Step 1 — ask the OPERATOR to click the Browser chip IN THE RIGHT CONVERSATION, then catch the session via GET /api/browser. If DSH_SESSION_ID is absent from env, pass --owner-session <id> (the session id you already know from context).' }));
78
93
  process.exit(1);
79
94
  }
80
95
 
96
+ /** @param {string[]} argv @returns {string|undefined} */
81
97
  export function identityFrom(argv) {
82
98
  const flag = argv.indexOf('--owner-session');
83
99
  if (flag !== -1 && argv[flag + 1]) return argv[flag + 1];
@@ -86,6 +102,7 @@ export function identityFrom(argv) {
86
102
  return undefined;
87
103
  }
88
104
 
105
+ /** @param {GlassSession[]|null|undefined} sessions @param {string|undefined} envId @returns {PickResult} */
89
106
  export function pickSession(sessions, envId) {
90
107
  const list = sessions ?? [];
91
108
  if (envId) {
@@ -106,6 +123,7 @@ export function pickSession(sessions, envId) {
106
123
  return { session: null, error: 'multiple live glasses and no explicit identity — pass --owner-session <id> (or GLASS_OWNER_SESSION) from the session id you already know; refusing to guess (D7)' };
107
124
  }
108
125
 
126
+ /** @returns {Promise<{ session: GlassSession, browser: import('playwright-core').Browser, ctx: import('playwright-core').BrowserContext, base: string }>} */
109
127
  export async function connect() {
110
128
  const { base, reg } = await resolveDsiBase({ env: process.env, identity: identityFrom(process.argv) });
111
129
  const { session, degraded, note, error } = pickSession(reg.sessions, identityFrom(process.argv));
@@ -116,6 +134,7 @@ export async function connect() {
116
134
  return { session, browser, ctx: browser.contexts()[0], base };
117
135
  }
118
136
 
137
+ /** @param {import('playwright-core').BrowserContext} ctx @param {string} substr @returns {import('playwright-core').Page|undefined} */
119
138
  export function pick(ctx, substr) {
120
139
  return ctx.pages().find((p) => p.url().includes(substr));
121
140
  }
@@ -60,6 +60,7 @@ export function floorCandidates(env = process.env) {
60
60
  * pickSession per floor with the caller's identity, the floor holding the
61
61
  * caller's OWN glass wins, a double-claim dies loud (D7 stands); none
62
62
  * answer → die naming BOTH ports and BOTH launch commands. */
63
+ /** @param {{ env?: Record<string, string|undefined>, fetchImpl?: typeof fetch, identity?: string|undefined, pickSessionFn?: (s: GlassSession[]|null|undefined, id: string|undefined) => PickResult, dieFn?: (msg: string) => never, timeoutMs?: number }} [opts] @returns {Promise<{ base: string, reg: { sessions: GlassSession[] } }>} — never resolves undefined: every fall-through path dies. */
63
64
  export async function resolveDsiBase({ env = process.env, fetchImpl = fetch, identity = undefined, pickSessionFn = pickSession, dieFn = die, timeoutMs = 3000 } = {}) {
64
65
  const candidates = floorCandidates(env);
65
66
  const probes = await Promise.all(candidates.map(async (base) => {
@@ -83,12 +84,13 @@ export async function resolveDsiBase({ env = process.env, fetchImpl = fetch, ide
83
84
  dieFn('a glass owned by you lives on BOTH floors (' + mine.map((m) => m.base).join(', ') +
84
85
  ') — set DSI_UI=<floor url> to name the floor; refusing to guess (D7)');
85
86
  }
86
- dieFn('both floors answer but neither holds YOUR glass (' + answered.map((m) => m.base).join(', ') +
87
+ return dieFn('both floors answer but neither holds YOUR glass (' + answered.map((m) => m.base).join(', ') +
87
88
  ') — click the Browser chip in THIS conversation');
88
89
  }
89
90
 
90
91
  /** True when a tab url's ORIGIN is the resolved floor's origin (D2): the
91
92
  * DSI tab is the floor's own page, whatever port it landed on. */
93
+ /** @param {string} url @param {string} base @returns {boolean} */
92
94
  export function isFloorTab(url, base) {
93
95
  try { return new URL(url).origin === new URL(base).origin; } catch { return false; }
94
96
  }
@@ -129,7 +131,7 @@ export function pickSession(sessions, envId) {
129
131
  return { session: null, error: 'multiple live glasses and no explicit identity — pass --owner-session <id> (or GLASS_OWNER_SESSION) from the session id you already know; refusing to guess (D7)' };
130
132
  }
131
133
 
132
- /** @returns {Promise<{ session: GlassSession, browser: import('playwright-core').Browser, ctx: import('playwright-core').BrowserContext }>} */
134
+ /** @returns {Promise<{ session: GlassSession, browser: import('playwright-core').Browser, ctx: import('playwright-core').BrowserContext, base: string }>} */
133
135
  export async function connect() {
134
136
  const { base, reg } = await resolveDsiBase({ env: process.env, identity: identityFrom(process.argv) });
135
137
  const { session, degraded, note, error } = pickSession(reg.sessions, identityFrom(process.argv));
package/README.md CHANGED
@@ -1,12 +1,37 @@
1
- # DeepSeek Insight
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/mitmplay/dsh-insight/refs/heads/main/docs/images/dsi-insight-pich.png"></img>
3
+ </p>
2
4
 
3
- > [DeepSeek Insight](https://github.com/mitmplay/dsh-insight) (**DSI**) **See your multiple agents run on the floor (agent, sub-agent, etc)**, each **conversation on the floor are updated instantly**.
5
+ <p align="center">
6
+ A different style opinionate <strong>DSH web client</strong> - aka <strong>DSI</strong>
7
+ <p>
8
+ <p align="center">
9
+ Screenshot: Sidebar, Workspace-explorer, Agent, Glass-browser, Subagent
10
+ <p>
4
11
 
5
- > A `Control room` built on [Deepseek Harness's](https://github.com/deepseek-ai/deepseek-harness) (**DSH**) **records**: any (running) session, show side by side on the floor; **Lineage tree** of **parent to sub-agents**; Clean conversation with **tool-call(s) chips** with status **+** auto-expand **thingking chips**.
12
+ #### Where you can see mulltiple **agent** / **sub-agent**, plus+ non conversation panels:
13
+ - keys panel: `Agent`, `Subagent`, `Workspace Explorer`, `Glass Browser`, `Terminal`,
14
+ - management panel: `Prompt`, `Skill`, `Plugins` and `Configs` Manager`
6
15
 
7
- > A `Prompt Input` with **Slash-command(/)**, **Macros(!)** and **Auto-complete(?)**. Prompt-manager you can search it and to manage macros & autocomplete; user-prompts worth keeping is one-click-away tobe reuse.
16
+ > [!NOTE]
17
+ > ["in a nutshell" - DSI](https://github.com/mitmplay/dsh-insight) make `Harness` present multiple conversations (`agent` or `sub-agent`), `keys` and `management` panels **side-by-side** `INSIDE Container` that can be **re-size** or **scale**.
8
18
 
9
- ## Slash commands are available to execute various operations:
19
+ ## Quick Start
20
+
21
+ ```bash
22
+ npx @deepseek-insight/dsi@latest dsh --sync --zai
23
+ # Open http://localhost:5174
24
+ ```
25
+
26
+ | Argument | What it does |
27
+ |---|---|
28
+ | `dsh` | starts **DSH** (`dsh web`) and **DSI** together, as one pair and runs it |
29
+ | `--sync` | copies DSH token to DSI config — **one window, one Ctrl-C stops both** |
30
+ | `--zai` | **optional.** It bootstraps the GLM (Z.AI) provider into the harness settings (`~/.dsh/settings.yaml`). **If you do not have a GLM account, simply leave it off** — DSI will use whatever provider your harness is already configured with |
31
+
32
+ When it is up, your browser opens the page by itself (default `http://127.0.0.1:5174`).
33
+
34
+ ## Various operations can be Enter in Composer:
10
35
  - `/dsi-terminal` — Open a terminal session
11
36
  - `/dsi-prompts` — Open prompt manager
12
37
  - `/dsi-plugins` — Open plugin manager
@@ -48,39 +73,22 @@ The workspace explorer is DSI's window into the folder your agents are working i
48
73
 
49
74
  ---
50
75
 
51
- ## Quick Start
52
-
53
- ```bash
54
- npx @deepseek-insight/dsi@latest dsh --sync --zai
55
- # Open http://localhost:5174
56
- ```
57
-
58
- - **`npx @deepseek-insight/dsi@latest`** — get latest DSI.
59
- - `dsh` — starts **DSH** (`dsh web`) and **DSI** together, as one pair and runs it.
60
- - `--sync` — copies DSH token to DSI config — **one window, one Ctrl-C stops both**.
61
- - `--zai` — **optional.** It bootstraps the GLM (Z.AI) provider into the harness settings (`~/.dsh/settings.yaml`). **If you do not have a GLM account, simply leave it off** — DSI will use whatever provider your harness is already configured with.
62
-
63
-
64
-
65
-
66
- When it is up, your browser opens the page by itself (default `http://127.0.0.1:5174`).
67
-
68
76
  ### Ports & the browser brain, in plain words
69
77
 
70
78
  One "floor" is a pair: **DSH** (the harness host) and **DSI** (the page you watch). Each sits on its own port, and each port can be moved — handy when you want a second floor beside one that is already running.
71
79
 
72
80
  | What | Default | How to move it | Plain meaning |
73
81
  |---|---|---|---|
74
- | DSH host | `3080` | `--port <n>` | the harness brain of the floor |
75
- | DSI page | `5174` | `PORT=<n>` env var | the page you open in the browser |
76
- | Browser brain | `9515` | `DSI_MCP_PORT=<n>` env var | the MCP endpoint agents use to drive the glass browser |
82
+ | DSH host | `3080` | `--port <n>` or `DSH_PORT=<n>` env var (flag wins) | the harness brain of the floor |
83
+ | DSI page | `5174` | `DSI_PORT=<n>` env var | the page you open in the browser |
84
+ | Browser brain | `9515` | `GLASS_PORT=<n>` env var | the MCP endpoint agents use to drive the glass browser |
77
85
 
78
86
  **The browser brain.** By default the glass browser's assistant (the MCP brain that lets an agent click and type in the browser) runs as its **own separate helper process** — if it fails, you lose only the glass panel. Adding `--playwright-mcp` moves that brain **inside the DSI page server**: one less background process and a faster start, but a brain failure can now touch the page server itself. DSI prints a banner saying so whenever you use the flag — drop the flag to go back to the helper process.
79
87
 
80
88
  **Example — a second, self-contained floor beside a live one** (nothing on the running floor is touched):
81
89
 
82
90
  ```bash
83
- PORT=5176 DSI_MCP_PORT=19515 npx @deepseek-insight/dsi@latest dsh --sync --playwright-mcp --port 3081
91
+ DSI_PORT=5176 DSH_PORT=3081 GLASS_PORT=19515 npx @deepseek-insight/dsi@latest dsh --sync --playwright-mcp
84
92
  # Page: http://localhost:5176 · host: 3081 · brain: http://127.0.0.1:19515/sse
85
93
  ```
86
94
 
package/bin/dsi.mjs CHANGED
@@ -83,15 +83,17 @@ const USAGE = [
83
83
  '',
84
84
  ' Ports: `dsi dsh --sync` serves the DSI page on 5174 and opens your',
85
85
  ' browser there. With --dev the Vite dev server takes 5175 instead',
86
- ' and the browser follows. Override with PORT=<n>. The HOST half',
86
+ ' and the browser follows. Override with DSI_PORT=<n>. The HOST half',
87
87
  ' takes 3080 by default; when that port is held by a dsh web you',
88
88
  ' must keep running (another conversation floor), forward',
89
- ' --port <n> — it goes to `dsh web` and DSI follows it automatically.',
89
+ ' --port <n> (or DSH_PORT=<n>; the flag wins) — it goes to `dsh web`',
90
+ ' and DSI follows it automatically. GLASS_PORT=<n> moves the brain',
91
+ ' (the glass browser MCP, default 9515).',
90
92
  '',
91
93
  ' All commands (flags — see above):',
92
94
  '',
93
95
  ' dsi web [--zai] [--ov] [--dev] [--token <token>]',
94
- ' serve the DSI page alone (PORT env default 5174,',
96
+ ' serve the DSI page alone (DSI_PORT env default 5174,',
95
97
  ' HOST env default 127.0.0.1)',
96
98
  ' dsi dsh --token <token>',
97
99
  ' store the dsh launch token in ~/.dsi/settings.yaml',
@@ -392,7 +394,7 @@ function setDshAuthToken(token) {
392
394
  function stampedFloorEnv(uiPort) {
393
395
  return {
394
396
  DSI_UI: 'http://127.0.0.1:' + uiPort,
395
- DSI_MCP_URL: 'http://127.0.0.1:' + (process.env.DSI_MCP_PORT ?? 9515) + '/sse'
397
+ DSI_MCP_URL: 'http://127.0.0.1:' + (process.env.GLASS_PORT ?? 9515) + '/sse'
396
398
  };
397
399
  }
398
400
 
@@ -489,7 +491,7 @@ async function runSyncedPair(extraArgs, dev = 'build', execArgv = [], opts = {})
489
491
  // takes 5175 instead (vite.config.ts pins 5174 strictPort, so pair mode
490
492
  // passes 5175 explicitly), giving the two-port dev shape. in-process is
491
493
  // also a vite floor: same 5175.
492
- const uiPort = process.env.PORT ?? (mode === 'build' ? '5174' : '5175');
494
+ const uiPort = process.env.DSI_PORT ?? (mode === 'build' ? '5174' : '5175');
493
495
  // The host half takes --port <n> when forwarded (a 3080 held by a
494
496
  // dsh web this CLI does not own — e.g. another live conversation
495
497
  // floor — is exactly the case the preflight must not kill). The
@@ -506,7 +508,16 @@ async function runSyncedPair(extraArgs, dev = 'build', execArgv = [], opts = {})
506
508
  // bug 2026-10-11: DSH_HOST_PORT=3477 booted the host there while the
507
509
  // page dialed 3080 — the production floor — → "Failed to fetch".)
508
510
  const pluginPort = inProcess && process.env.DSH_HOST_PORT ? parseInt(process.env.DSH_HOST_PORT, 10) : undefined;
509
- const hostPort = hostPortFromArgs(extraArgs) ?? pluginPort ?? 3080;
511
+ // DSH_PORT (2026-11-08 rename): the env form of the forwarded --port flag —
512
+ // the CLI flag wins when both are set (explicit intent beats ambient env).
513
+ const envHostPort = /^\d+$/.test(process.env.DSH_PORT ?? '') ? Number(process.env.DSH_PORT) : undefined;
514
+ const flaggedHostPort = hostPortFromArgs(extraArgs);
515
+ const hostPort = flaggedHostPort ?? pluginPort ?? envHostPort ?? 3080;
516
+ // No forwarded flag but DSH_PORT set: forward it to `dsh web` as the flag
517
+ // it already understands — the host never learns the env name.
518
+ const hostSpawnArgs = !inProcess && flaggedHostPort === null && envHostPort !== undefined
519
+ ? [...extraArgs, '--port', String(envHostPort)]
520
+ : extraArgs;
510
521
  const dshBase = hostPort === 3080 ? undefined : `http://127.0.0.1:${hostPort}`;
511
522
  if (inProcess) {
512
523
  await preflightPort(uiPort, 'DSI page');
@@ -516,7 +527,7 @@ async function runSyncedPair(extraArgs, dev = 'build', execArgv = [], opts = {})
516
527
  }
517
528
  // IN-PROCESS: no sync script, no host child — the vite plugin owns the
518
529
  // host lifecycle (vite close hook stops it; one Ctrl-C, no orphan).
519
- const host = inProcess ? null : spawn('/bin/sh', [script, ...extraArgs], {
530
+ const host = inProcess ? null : spawn('/bin/sh', [script, ...hostSpawnArgs], {
520
531
  stdio: 'inherit',
521
532
  env: { ...process.env, DSH_WEB_VERSION: dshWebVersion(), ...stampedFloorEnv(uiPort) }
522
533
  });
@@ -766,7 +777,7 @@ function startDsiDevServer(defaultPort = '5175', dshBase = undefined, mode = 'pa
766
777
  }
767
778
  // --host matches the built server's 127.0.0.1 bind: vite's default
768
779
  // 'localhost' can resolve ::1-only and strand a 127.0.0.1 client.
769
- return spawn(process.execPath, [...execArgv, viteBin, 'dev', '--host', process.env.HOST ?? '127.0.0.1', '--port', process.env.PORT ?? defaultPort], {
780
+ return spawn(process.execPath, [...execArgv, viteBin, 'dev', '--host', process.env.HOST ?? '127.0.0.1', '--port', process.env.DSI_PORT ?? defaultPort], {
770
781
  // D7: inspector flags lead the child argv — node consumes options before
771
782
  // the script path, so `node --inspect vite.js dev` debugs THIS process
772
783
  // (vite + the embedded DSH host share one heap). The spawn execArgv
@@ -785,7 +796,7 @@ function startDsiDevServer(defaultPort = '5175', dshBase = undefined, mode = 'pa
785
796
  DSI_DEV: '1',
786
797
  // D4/D6: the mode rides as env, never past the CLI to the host.
787
798
  ...devModeEnv(mode, { playwrightMcp: opts.playwrightMcp === true }),
788
- ...stampedFloorEnv(process.env.PORT ?? defaultPort),
799
+ ...stampedFloorEnv(process.env.DSI_PORT ?? defaultPort),
789
800
  // The Faithful Bounce (ADR 2026-10-13, D1): the inspector flags are
790
801
  // part of the launch record — stamped so every restorer (the bounce
791
802
  // boot via ps -E, the delayed re-serve via inherited env) can put
@@ -806,7 +817,7 @@ function startDsiServer(defaultPort = '5174', dshBase = undefined, opts = {}) {
806
817
  stdio: 'inherit',
807
818
  env: {
808
819
  ...process.env,
809
- PORT: process.env.PORT ?? defaultPort,
820
+ PORT: process.env.DSI_PORT ?? defaultPort,
810
821
  HOST: process.env.HOST ?? '127.0.0.1',
811
822
  // First-start bootstrap seam: the server clones template/.dsi to ~/.dsi
812
823
  // when the operator home is absent (src/lib/server/settings-document.ts).
@@ -815,7 +826,7 @@ function startDsiServer(defaultPort = '5174', dshBase = undefined, opts = {}) {
815
826
  // vite child got it via startDsiDevServer's devModeEnv spread; the
816
827
  // built server was silently dropping it (caught by the live gate).
817
828
  ...devModeEnv('build', { playwrightMcp: opts.playwrightMcp === true }),
818
- ...stampedFloorEnv(process.env.PORT ?? defaultPort),
829
+ ...stampedFloorEnv(process.env.DSI_PORT ?? defaultPort),
819
830
  ...(dshBase !== undefined ? { DSH_BASE_URL: dshBase } : {})
820
831
  }
821
832
  });
@@ -909,7 +920,7 @@ if (command === 'web') {
909
920
  // Same browser-follows-the-UI contract as the pair (runSyncedPair): open
910
921
  // the default browser at the serving port — --dev's Vite server takes
911
922
  // 5175, the built server 5174; PORT/HOST overrides apply.
912
- openBrowser(`http://${process.env.HOST ?? '127.0.0.1'}:${process.env.PORT ?? (withDev ? '5175' : '5174')}/`);
923
+ openBrowser(`http://${process.env.HOST ?? '127.0.0.1'}:${process.env.DSI_PORT ?? (withDev ? '5175' : '5174')}/`);
913
924
 
914
925
  for (const signal of ['SIGINT', 'SIGTERM']) {
915
926
  process.on(signal, () => {
@@ -25,9 +25,10 @@ const CHROME_PATH_CANDIDATES = ['google-chrome', 'google-chrome-stable', 'chromi
25
25
  * playwright-core dependency (D3: no second hardcoded pin may exist).
26
26
  * Returns null when the pin cannot be read — the caller then warns and
27
27
  * skips the fetch; a null pin never spawns npx. */
28
+ /** @param {string} packageRoot @returns {string | null} */
28
29
  export function pinnedPlaywrightVersion(packageRoot) {
29
30
  try {
30
- const doc = JSON.parse(readFileSync(path.join(packageRoot, 'package.json'), 'utf-8'));
31
+ const doc = /** @type {any} */ (JSON.parse(readFileSync(path.join(packageRoot, 'package.json'), 'utf-8')));
31
32
  const version = doc?.dependencies?.['playwright-core'];
32
33
  return typeof version === 'string' && /^\d+\.\d+\.\d+/.test(version) ? version : null;
33
34
  } catch {
@@ -37,6 +38,10 @@ export function pinnedPlaywrightVersion(packageRoot) {
37
38
 
38
39
  /** True when a system Google/Chromium browser is resolvable: PATH probes on
39
40
  * Linux, the .app bundle on macOS (where PATH probing is always blind). */
41
+ /** @param {(cmd: string, args?: string[], opts?: { stdio?: 'pipe' | 'inherit'; timeout?: number }) => { status: number | null }} spawnSync
42
+ * @param {string} [platform]
43
+ * @param {(p: string) => boolean} [exists]
44
+ * @returns {boolean} */
40
45
  export function findSystemChrome(spawnSync, platform = process.platform, exists = existsSync) {
41
46
  if (platform === 'darwin') {
42
47
  return exists('/Applications/Google Chrome.app');
@@ -54,6 +59,9 @@ export function findSystemChrome(spawnSync, platform = process.platform, exists
54
59
  /** True when ANY chromium-family build sits in the playwright cache (either
55
60
  * platform root). The npx fetch is the revision authority — this probe is
56
61
  * the cheap hint that avoids re-downloading what is already present. */
62
+ /** @param {Record<string, string | undefined>} [env]
63
+ * @param {(p: string) => string[]} [readdir]
64
+ * @returns {boolean} */
57
65
  export function playwrightCacheHasChromium(env = process.env, readdir = readdirSync) {
58
66
  const home = env.HOME ?? homedir();
59
67
  const roots = [
@@ -78,6 +86,14 @@ export function playwrightCacheHasChromium(env = process.env, readdir = readdirS
78
86
  * { action: 'warned', reason } — no browser and the fetch failed/skipped;
79
87
  * the floor still boots (D4)
80
88
  */
89
+ /** @param {{
90
+ * packageRoot: string,
91
+ * spawnSync: (cmd: string, args?: string[], opts?: { stdio?: 'pipe' | 'inherit'; timeout?: number }) => { status: number | null },
92
+ * env?: Record<string, string | undefined>,
93
+ * log?: (msg: string) => void,
94
+ * platform?: string
95
+ * }} options
96
+ * @returns {{ action: 'skip' | 'fetched' | 'warned', reason: string }} */
81
97
  export function ensureGlassBrowser({ packageRoot, spawnSync, env = process.env, log = () => {}, platform = process.platform }) {
82
98
  if (env.DSI_SKIP_BROWSER_INSTALL === '1') {
83
99
  log('dsi dsh: glass browser check skipped (DSI_SKIP_BROWSER_INSTALL=1)');
@@ -104,7 +120,8 @@ export function ensureGlassBrowser({ packageRoot, spawnSync, env = process.env,
104
120
  timeout: 300000
105
121
  });
106
122
  } catch (error) {
107
- log(`dsi dsh: chromium fetch failed (${error?.message ?? error}) — the floor still boots; the glass needs: npx playwright@${pin} install chromium`);
123
+ const message = /** @type {any} */ (error)?.message ?? error;
124
+ log(`dsi dsh: chromium fetch failed (${message}) — the floor still boots; the glass needs: npx playwright@${pin} install chromium`);
108
125
  return { action: 'warned', reason: 'fetch-error' };
109
126
  }
110
127
  if ((result?.status ?? 1) === 0) {
@@ -158,16 +158,17 @@ export function parseDevFloorPids(psOutput) {
158
158
  /** The port the floor's DSI UI answers on (ADR-0025 Wave 3 gate finding,
159
159
  * 2026-10-14): the host-bounce route is a DSI (vite) route, so the bounce
160
160
  * chain must POST the VITE port - the DSH host port only knows the fence
161
- * (401) or 404. Resolution order: PORT= in the floor env dump, then
162
- * --port N on the vite command line, then the 5175 default the launcher
163
- * pins. Pure: both inputs are strings read by dsi.mjs (ps -E and ps -o
164
- * command), so unit tests pin all three arms.
161
+ * (401) or 404. Resolution order: DSI_PORT= (the 2026-11-08 rename) then
162
+ * legacy PORT= in the floor env dump, then --port N on the vite command
163
+ * line, then the 5175 default the launcher pins. Pure: both inputs are
164
+ * strings read by dsi.mjs (ps -E and ps -o command), so unit tests pin
165
+ * all arms.
165
166
  *
166
167
  * @param {{ floorEnv?: string, command?: string }} params
167
168
  * @returns {number} the UI port
168
169
  */
169
170
  export function floorUiPort({ floorEnv = '', command = '' } = {}) {
170
- const envPort = /(?:^|\s)PORT=(\d+)/.exec(floorEnv || '');
171
+ const envPort = /(?:^|\s)DSI_PORT=(\d+)/.exec(floorEnv || '') || /(?:^|\s)PORT=(\d+)/.exec(floorEnv || '');
171
172
  if (envPort) return Number(envPort[1]);
172
173
  const argPort = /--port\s+(\d+)/.exec(command || '');
173
174
  if (argPort) return Number(argPort[1]);
@@ -60,6 +60,7 @@ export function zaiPatchPath() {
60
60
  return path.join(homedir(), '.dsh', 'profiles', profile, 'cordis.patch.yml');
61
61
  }
62
62
 
63
+ /** @param {unknown} value @returns {value is Record<string, unknown>} */
63
64
  function isRecord(value) {
64
65
  return value !== null && typeof value === 'object' && !Array.isArray(value);
65
66
  }
@@ -74,7 +75,8 @@ export function addZaiProvider(target = zaiPatchPath()) {
74
75
  try {
75
76
  parsed = parse(readFileSync(target, 'utf-8'));
76
77
  } catch (error) {
77
- throw new ZaiPatchError(`cannot parse ${target}: ${error?.message ?? error}`);
78
+ const message = /** @type {any} */ (error)?.message ?? error;
79
+ throw new ZaiPatchError(`cannot parse ${target}: ${message}`);
78
80
  }
79
81
  if (!Array.isArray(parsed) || parsed.some((row) => !isRecord(row))) {
80
82
  throw new ZaiPatchError(`${target} is not a Cordis patch array of entries`);
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @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-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;--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-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:-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-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-yellow-200:oklch(94.5% .129 101.54);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-emerald-500:oklch(69.6% .17 162.48);--color-sky-400:oklch(74.6% .16 232.661);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-900:oklch(37.9% .146 265.522);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-neutral-100:oklch(97% 0 none);--color-neutral-200:oklch(92.2% 0 none);--color-neutral-400:oklch(70.8% 0 none);--color-neutral-700:oklch(37.1% 0 none);--color-neutral-800:oklch(26.9% 0 none);--color-neutral-900:oklch(20.5% 0 none);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--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-5xl:3rem;--text-5xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-normal:1.5;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--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;--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);--color-surface:#f8f9fa;--color-surface-alt:#f1f3f5;--color-surface-hover:#e9ecef;--color-surface-border:#dee2e6;--color-surface-elevated:#fff;--color-subagent-tint-1:beige;--color-subagent-tint-2:#e9e3c9;--color-subagent-tint-3:#ddd3b0;--color-text-primary:#212529;--color-text-secondary:#6c757d;--color-text-muted:#adb5bd;--color-accent-blue:#3b82f6;--color-accent-purple:#8b5cf6;--color-accent-purple-soft:#9f88fb;--color-accent-purple-ink:#2e1065;--color-accent-emerald-deep:#15803d;--color-accent-amber:#f59e0b;--color-accent-rose:#f43f5e;--color-accent-cyan:#06b6d4;--color-status-pass:#10b981;--color-status-fail:#ef4444;--color-status-pending:#f59e0b;--color-status-fail-ink:#fff;--color-tree-repo:#ff4500;--color-tree-child:#d2691e;--color-tree-amber:#f7ad31;--color-accent-deep:#7c3aed;--color-success-ink:#1a7f37;--color-success-soft:#27ae60;--color-green-verify:#16a34a;--color-accent-orange:#e67e22;--color-accent-amber-ink:#d97706;--color-accent-amber-ink-deep:#b45309;--color-danger-madrid:#e74c3c;--color-danger-github:#cf222e;--color-danger-editor-surface:#45161c;--color-danger-editor-ink:#ffb4bb;--color-doc-child:maroon;--color-navy-focus:#1e3a8a;--color-header-wash:#fdf5e6;--color-slate-neutral:#52606d;--color-danger-wash:#fef2f2;--color-danger-wash-border:#fee2e2;--color-danger-wash-ink:#991b1b;--color-ws-violet:#9400d3;--color-ws-green:#00a802;--color-ws-blue:#06c}}@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}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: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)}}}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}:root{--si-run:#b91c1c;--color-surface-primary:var(--color-surface-elevated);--color-surface-secondary:var(--color-surface-alt);--color-border:var(--color-surface-border);--color-text:var(--color-text-primary);--color-bg:var(--color-surface)}svg{color:var(--color-accent-purple)}}@layer components;@layer utilities{.\@container{container-type:inline-size}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.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}.sticky{position:sticky}.inset-0{inset:0}.-top-3{top:calc(var(--spacing) * -3)}.top-0{top:0}.top-1{top:var(--spacing)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-5{top:calc(var(--spacing) * 5)}.top-8{top:calc(var(--spacing) * 8)}.top-full{top:100%}.-right-3{right:calc(var(--spacing) * -3)}.right-0{right:0}.right-1{right:var(--spacing)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-2{right:calc(var(--spacing) * 2)}.right-3{right:calc(var(--spacing) * 3)}.right-5{right:calc(var(--spacing) * 5)}.right-full{right:100%}.bottom-0{bottom:0}.bottom-0\.5{bottom:calc(var(--spacing) * .5)}.bottom-1\/2{bottom:50%}.bottom-\[50vh\]{bottom:50vh}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-3{left:calc(var(--spacing) * 3)}.left-7{left:calc(var(--spacing) * 7)}.left-full{left:100%}.isolate{isolation:isolate}.z-10{z-index:10}.z-30{z-index:30}.z-40{z-index:40}.z-41{z-index:41}.z-50{z-index:50}.z-1000,.z-\[1000\]{z-index:1000}.z-auto{z-index:auto}.order-0{order:0}.order-2{order:2}.row-1{grid-row:1}.\!container{width:100%!important}@media (width>=40rem){.\!container{max-width:40rem!important}}@media (width>=48rem){.\!container{max-width:48rem!important}}@media (width>=64rem){.\!container{max-width:64rem!important}}@media (width>=80rem){.\!container{max-width:80rem!important}}@media (width>=96rem){.\!container{max-width:96rem!important}}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0{margin:0}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-0\.5{margin-inline:calc(var(--spacing) * .5)}.mx-1{margin-inline:var(--spacing)}.mx-auto{margin-inline:auto}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.my-1{margin-block:var(--spacing)}.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)}.mt-px{margin-top:1px}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-\[-2px\]{margin-left:-2px}.ml-auto{margin-left:auto}.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}.table{display:table}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.h-1{height:var(--spacing)}.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-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-16{height:calc(var(--spacing) * 16)}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[50px\]{height:50px}.h-\[62px\]{height:62px}.h-dvh{height:100dvh}.h-full{height:100%}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-80{max-height:calc(var(--spacing) * 80)}.max-h-\[28rem\]{max-height:28rem}.max-h-\[30rem\]{max-height:30rem}.max-h-\[60vh\]{max-height:60vh}.max-h-\[500px\]{max-height:500px}.max-h-\[calc\(100vh-80px\)\]{max-height:calc(100vh - 80px)}.min-h-0{min-height:0}.min-h-72{min-height:calc(var(--spacing) * 72)}.min-h-80{min-height:calc(var(--spacing) * 80)}.min-h-\[2\.75rem\]{min-height:2.75rem}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.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-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-14{width:calc(var(--spacing) * 14)}.w-15{width:calc(var(--spacing) * 15)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-36{width:calc(var(--spacing) * 36)}.w-64{width:calc(var(--spacing) * 64)}.w-72{width:calc(var(--spacing) * 72)}.w-96{width:calc(var(--spacing) * 96)}.w-\[18px\]{width:18px}.w-\[22px\]{width:22px}.w-\[62px\]{width:62px}.w-\[200px\]{width:200px}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-56{max-width:calc(var(--spacing) * 56)}.max-w-72{max-width:calc(var(--spacing) * 72)}.max-w-\[16rem\]{max-width:16rem}.max-w-\[80\%\]{max-width:80%}.max-w-\[80vw\]{max-width:80vw}.max-w-\[85\%\]{max-width:85%}.max-w-\[min\(100\%\,1600px\)\]{max-width:min(100%,1600px)}.max-w-full{max-width:100%}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-44{min-width:calc(var(--spacing) * 44)}.min-w-72{min-width:calc(var(--spacing) * 72)}.flex-1{flex:1}.flex-none{flex:none}.flex-shrink,.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.origin-top-left{transform-origin:0 0}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.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,)}.zoom-1{zoom:1%}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-move{cursor:move}.cursor-pointer{cursor:pointer}.cursor-zoom-in{cursor:zoom-in}.resize{resize:both}.resize-none{resize:none}.scrollbar-none{scrollbar-width:none}.list-none{list-style-type:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.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: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\.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)))}.gap-x-0\.5{column-gap:calc(var(--spacing) * .5)}.gap-x-1{column-gap:var(--spacing)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.self-start{align-self:flex-start}.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-clip{overflow-x:clip}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[2px\]{border-radius:2px}.rounded-\[16px\]{border-radius:16px}.rounded-full{border-radius:2147483647px}.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)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.rounded-l-sm{border-top-left-radius:var(--radius-sm);border-bottom-left-radius:var(--radius-sm)}.rounded-r-sm{border-top-right-radius:var(--radius-sm);border-bottom-right-radius:var(--radius-sm)}.rounded-br-sm{border-bottom-right-radius:var(--radius-sm)}.rounded-bl-sm{border-bottom-left-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.border-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.border-none{--tw-border-style:none;border-style:none}.border-\[var\(--color-accent-deep\)\]{border-color:var(--color-accent-deep)}.border-\[var\(--color-accent-deep\)\]\/30{border-color:#7c3aed4d}@supports (color:color-mix(in lab, red, red)){.border-\[var\(--color-accent-deep\)\]\/30{border-color:color-mix(in oklab, var(--color-accent-deep) 30%, transparent)}}.border-\[var\(--color-surface-border\)\]{border-color:var(--color-surface-border)}.border-accent-blue{border-color:var(--color-accent-blue)}.border-accent-blue\/20{border-color:#3b82f633}@supports (color:color-mix(in lab, red, red)){.border-accent-blue\/20{border-color:color-mix(in oklab, var(--color-accent-blue) 20%, transparent)}}.border-accent-blue\/30{border-color:#3b82f64d}@supports (color:color-mix(in lab, red, red)){.border-accent-blue\/30{border-color:color-mix(in oklab, var(--color-accent-blue) 30%, transparent)}}.border-accent-purple\/30{border-color:#8b5cf64d}@supports (color:color-mix(in lab, red, red)){.border-accent-purple\/30{border-color:color-mix(in oklab, var(--color-accent-purple) 30%, transparent)}}.border-black\/10{border-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.border-black\/10{border-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.border-black\/15{border-color:#00000026}@supports (color:color-mix(in lab, red, red)){.border-black\/15{border-color:color-mix(in oklab, var(--color-black) 15%, transparent)}}.border-danger-wash-border{border-color:var(--color-danger-wash-border)}.border-slate-600{border-color:var(--color-slate-600)}.border-slate-700\/50{border-color:#31415880}@supports (color:color-mix(in lab, red, red)){.border-slate-700\/50{border-color:color-mix(in oklab, var(--color-slate-700) 50%, transparent)}}.border-slate-800{border-color:var(--color-slate-800)}.border-status-fail\/30{border-color:#ef44444d}@supports (color:color-mix(in lab, red, red)){.border-status-fail\/30{border-color:color-mix(in oklab, var(--color-status-fail) 30%, transparent)}}.border-status-pass{border-color:var(--color-status-pass)}.border-status-pass\/30{border-color:#10b9814d}@supports (color:color-mix(in lab, red, red)){.border-status-pass\/30{border-color:color-mix(in oklab, var(--color-status-pass) 30%, transparent)}}.border-status-pending\/30{border-color:#f59e0b4d}@supports (color:color-mix(in lab, red, red)){.border-status-pending\/30{border-color:color-mix(in oklab, var(--color-status-pending) 30%, transparent)}}.border-surface-border{border-color:var(--color-surface-border)}.border-surface-border\/30{border-color:#dee2e64d}@supports (color:color-mix(in lab, red, red)){.border-surface-border\/30{border-color:color-mix(in oklab, var(--color-surface-border) 30%, transparent)}}.border-surface-border\/40{border-color:#dee2e666}@supports (color:color-mix(in lab, red, red)){.border-surface-border\/40{border-color:color-mix(in oklab, var(--color-surface-border) 40%, transparent)}}.border-surface-border\/50{border-color:#dee2e680}@supports (color:color-mix(in lab, red, red)){.border-surface-border\/50{border-color:color-mix(in oklab, var(--color-surface-border) 50%, transparent)}}.border-text-muted\/15{border-color:#adb5bd26}@supports (color:color-mix(in lab, red, red)){.border-text-muted\/15{border-color:color-mix(in oklab, var(--color-text-muted) 15%, transparent)}}.border-text-muted\/20{border-color:#adb5bd33}@supports (color:color-mix(in lab, red, red)){.border-text-muted\/20{border-color:color-mix(in oklab, var(--color-text-muted) 20%, transparent)}}.border-transparent{border-color:#0000}.border-zinc-300{border-color:var(--color-zinc-300)}.border-zinc-700{border-color:var(--color-zinc-700)}.bg-\[var\(--color-accent-deep\)\]{background-color:var(--color-accent-deep)}.bg-\[var\(--color-accent-deep\)\]\/10{background-color:#7c3aed1a}@supports (color:color-mix(in lab, red, red)){.bg-\[var\(--color-accent-deep\)\]\/10{background-color:color-mix(in oklab, var(--color-accent-deep) 10%, transparent)}}.bg-\[var\(--color-subagent-tint-1\)\]{background-color:var(--color-subagent-tint-1)}.bg-\[var\(--color-subagent-tint-2\)\]{background-color:var(--color-subagent-tint-2)}.bg-\[var\(--color-subagent-tint-3\)\]{background-color:var(--color-subagent-tint-3)}.bg-\[var\(--color-surface-elevated\)\]{background-color:var(--color-surface-elevated)}.bg-accent-blue{background-color:var(--color-accent-blue)}.bg-accent-blue\/10{background-color:#3b82f61a}@supports (color:color-mix(in lab, red, red)){.bg-accent-blue\/10{background-color:color-mix(in oklab, var(--color-accent-blue) 10%, transparent)}}.bg-accent-blue\/15{background-color:#3b82f626}@supports (color:color-mix(in lab, red, red)){.bg-accent-blue\/15{background-color:color-mix(in oklab, var(--color-accent-blue) 15%, transparent)}}.bg-accent-blue\/20{background-color:#3b82f633}@supports (color:color-mix(in lab, red, red)){.bg-accent-blue\/20{background-color:color-mix(in oklab, var(--color-accent-blue) 20%, transparent)}}.bg-accent-blue\/30{background-color:#3b82f64d}@supports (color:color-mix(in lab, red, red)){.bg-accent-blue\/30{background-color:color-mix(in oklab, var(--color-accent-blue) 30%, transparent)}}.bg-accent-cyan\/10{background-color:#06b6d41a}@supports (color:color-mix(in lab, red, red)){.bg-accent-cyan\/10{background-color:color-mix(in oklab, var(--color-accent-cyan) 10%, transparent)}}.bg-accent-emerald-deep{background-color:var(--color-accent-emerald-deep)}.bg-accent-purple-ink{background-color:var(--color-accent-purple-ink)}.bg-accent-purple-soft{background-color:var(--color-accent-purple-soft)}.bg-accent-purple\/15{background-color:#8b5cf626}@supports (color:color-mix(in lab, red, red)){.bg-accent-purple\/15{background-color:color-mix(in oklab, var(--color-accent-purple) 15%, transparent)}}.bg-accent-purple\/20{background-color:#8b5cf633}@supports (color:color-mix(in lab, red, red)){.bg-accent-purple\/20{background-color:color-mix(in oklab, var(--color-accent-purple) 20%, transparent)}}.bg-amber-400{background-color:var(--color-amber-400)}.bg-black\/5{background-color:#0000000d}@supports (color:color-mix(in lab, red, red)){.bg-black\/5{background-color:color-mix(in oklab, var(--color-black) 5%, transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab, red, red)){.bg-black\/60{background-color:color-mix(in oklab, var(--color-black) 60%, transparent)}}.bg-blue-100{background-color:var(--color-blue-100)}.bg-danger-wash{background-color:var(--color-danger-wash)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-green-300{background-color:var(--color-green-300)}.bg-green-500{background-color:var(--color-green-500)}.bg-header-wash{background-color:var(--color-header-wash)}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-red-500{background-color:var(--color-red-500)}.bg-sky-400{background-color:var(--color-sky-400)}.bg-slate-700{background-color:var(--color-slate-700)}.bg-slate-800{background-color:var(--color-slate-800)}.bg-slate-800\/60{background-color:#1d293d99}@supports (color:color-mix(in lab, red, red)){.bg-slate-800\/60{background-color:color-mix(in oklab, var(--color-slate-800) 60%, transparent)}}.bg-slate-800\/90{background-color:#1d293de6}@supports (color:color-mix(in lab, red, red)){.bg-slate-800\/90{background-color:color-mix(in oklab, var(--color-slate-800) 90%, transparent)}}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-900\/40{background-color:#0f172b66}@supports (color:color-mix(in lab, red, red)){.bg-slate-900\/40{background-color:color-mix(in oklab, var(--color-slate-900) 40%, transparent)}}.bg-slate-950{background-color:var(--color-slate-950)}.bg-status-fail{background-color:var(--color-status-fail)}.bg-status-fail\/10{background-color:#ef44441a}@supports (color:color-mix(in lab, red, red)){.bg-status-fail\/10{background-color:color-mix(in oklab, var(--color-status-fail) 10%, transparent)}}.bg-status-pass{background-color:var(--color-status-pass)}.bg-status-pass\/10{background-color:#10b9811a}@supports (color:color-mix(in lab, red, red)){.bg-status-pass\/10{background-color:color-mix(in oklab, var(--color-status-pass) 10%, transparent)}}.bg-status-pass\/100{background-color:var(--color-status-pass)}.bg-status-pending{background-color:var(--color-status-pending)}.bg-status-pending\/10{background-color:#f59e0b1a}@supports (color:color-mix(in lab, red, red)){.bg-status-pending\/10{background-color:color-mix(in oklab, var(--color-status-pending) 10%, transparent)}}.bg-status-pending\/100{background-color:var(--color-status-pending)}.bg-surface{background-color:var(--color-surface)}.bg-surface-alt{background-color:var(--color-surface-alt)}.bg-surface-border{background-color:var(--color-surface-border)}.bg-surface-elevated{background-color:var(--color-surface-elevated)}.bg-surface\/60{background-color:#f8f9fa99}@supports (color:color-mix(in lab, red, red)){.bg-surface\/60{background-color:color-mix(in oklab, var(--color-surface) 60%, transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/95{background-color:#fffffff2}@supports (color:color-mix(in lab, red, red)){.bg-white\/95{background-color:color-mix(in oklab, var(--color-white) 95%, transparent)}}.bg-yellow-200{background-color:var(--color-yellow-200)}.bg-zinc-400{background-color:var(--color-zinc-400)}.bg-\[linear-gradient\(90deg\,color-mix\(in_srgb\,var\(--color-status-pass\)_18\%\,var\(--color-surface\)\)\,var\(--color-header-wash\)_65\%\,var\(--color-surface\)\)\]{background-image:linear-gradient(90deg,#ceede4,var(--color-header-wash) 65%,var(--color-surface))}@supports (color:color-mix(in lab, red, red)){.bg-\[linear-gradient\(90deg\,color-mix\(in_srgb\,var\(--color-status-pass\)_18\%\,var\(--color-surface\)\)\,var\(--color-header-wash\)_65\%\,var\(--color-surface\)\)\]{background-image:linear-gradient(90deg,color-mix(in srgb,var(--color-status-pass) 18%,var(--color-surface)),var(--color-header-wash) 65%,var(--color-surface))}}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.\[padding\:0_10px\]{padding:0 10px}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-10{padding:calc(var(--spacing) * 10)}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:var(--spacing)}.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)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-\[0\.1rem\]{padding-block:.1rem}.py-px{padding-block:1px}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.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-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-1{padding-left:var(--spacing)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-bottom{vertical-align:bottom}.align-middle{vertical-align:middle}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--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-\[0\.8rem\]{font-size:.8rem}.text-\[0\.6875rem\]{font-size:.6875rem}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[18px\]{font-size:18px}.leading-4{--tw-leading:calc(var(--spacing) * 4);line-height:calc(var(--spacing) * 4)}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.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-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-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[color\:var\(--color-accent-blue\)\]{color:var(--color-accent-blue)}.text-\[color\:var\(--color-accent-purple\)\]{color:var(--color-accent-purple)}.text-\[color\:var\(--color-text-secondary\,\#6c757d\)\]{color:var(--color-text-secondary,#6c757d)}.text-\[var\(--color-accent-deep\)\]{color:var(--color-accent-deep)}.text-\[var\(--color-accent-purple\)\]{color:var(--color-accent-purple)}.text-\[var\(--color-text-primary\)\]{color:var(--color-text-primary)}.text-\[var\(--color-text-secondary\)\]{color:var(--color-text-secondary)}.text-accent-blue{color:var(--color-accent-blue)}.text-accent-purple{color:var(--color-accent-purple)}.text-accent-purple-ink{color:var(--color-accent-purple-ink)}.text-accent-purple\/80{color:#8b5cf6cc}@supports (color:color-mix(in lab, red, red)){.text-accent-purple\/80{color:color-mix(in oklab, var(--color-accent-purple) 80%, transparent)}}.text-amber-400{color:var(--color-amber-400)}.text-amber-500{color:var(--color-amber-500)}.text-blue-900{color:var(--color-blue-900)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-700{color:var(--color-neutral-700)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-slate-100{color:var(--color-slate-100)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-status-fail{color:var(--color-status-fail)}.text-status-fail-ink{color:var(--color-status-fail-ink)}.text-status-pass{color:var(--color-status-pass)}.text-status-pending{color:var(--color-status-pending)}.text-status-pending\/80{color:#f59e0bcc}@supports (color:color-mix(in lab, red, red)){.text-status-pending\/80{color:color-mix(in oklab, var(--color-status-pending) 80%, transparent)}}.text-surface{color:var(--color-surface)}.text-text-muted{color:var(--color-text-muted)}.text-text-muted\/60{color:#adb5bd99}@supports (color:color-mix(in lab, red, red)){.text-text-muted\/60{color:color-mix(in oklab, var(--color-text-muted) 60%, transparent)}}.text-text-primary{color:var(--color-text-primary)}.text-text-secondary{color:var(--color-text-secondary)}.text-white{color:var(--color-white)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-800{color:var(--color-zinc-800)}.text-zinc-900{color:var(--color-zinc-900)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.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}.decoration-surface-border{-webkit-text-decoration-color:var(--color-surface-border);-webkit-text-decoration-color:var(--color-surface-border);-webkit-text-decoration-color:var(--color-surface-border);text-decoration-color:var(--color-surface-border)}.underline-offset-2{text-underline-offset:2px}.accent-\[var\(--color-accent-purple\)\]{accent-color:var(--color-accent-purple)}.opacity-0{opacity:0}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow{--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)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);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-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -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-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)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px 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)}.ring,.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-accent-purple-ink\/30{--tw-ring-color:#2e10654d}@supports (color:color-mix(in lab, red, red)){.ring-accent-purple-ink\/30{--tw-ring-color:color-mix(in oklab, var(--color-accent-purple-ink) 30%, transparent)}}.ring-danger-wash-border{--tw-ring-color:var(--color-danger-wash-border)}.ring-status-fail\/30{--tw-ring-color:#ef44444d}@supports (color:color-mix(in lab, red, red)){.ring-status-fail\/30{--tw-ring-color:color-mix(in oklab, var(--color-status-fail) 30%, transparent)}}.ring-status-pending\/30{--tw-ring-color:#f59e0b4d}@supports (color:color-mix(in lab, red, red)){.ring-status-pending\/30{--tw-ring-color:color-mix(in oklab, var(--color-status-pending) 30%, transparent)}}.ring-surface-border{--tw-ring-color:var(--color-surface-border)}.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,)}.grayscale{--tw-grayscale:grayscale(100%);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,)}.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,)}.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-\[background-color\,transform\]{transition-property:background-color,transform;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;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-100{--tw-duration:.1s;transition-duration:.1s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.group-hover\/bubble\:text-\[var\(--color-accent-deep\)\]:is(:where(.group\/bubble):hover *){color:var(--color-accent-deep)}.group-hover\/bubble\:opacity-100:is(:where(.group\/bubble):hover *),.group-hover\/code\:opacity-100:is(:where(.group\/code):hover *),.group-hover\/diagram\:opacity-100:is(:where(.group\/diagram):hover *),.group-hover\/featurespec\:opacity-100:is(:where(.group\/featurespec):hover *),.group-hover\/markdown\:opacity-100:is(:where(.group\/markdown):hover *){opacity:1}.group-hover\/new\:block:is(:where(.group\/new):hover *){display:block}.group-hover\/new\:hidden:is(:where(.group\/new):hover *){display:none}.group-hover\/reasoning\:opacity-100:is(:where(.group\/reasoning):hover *),.group-hover\/tab\:opacity-100:is(:where(.group\/tab):hover *),.group-hover\/table\:opacity-100:is(:where(.group\/table):hover *),.group-hover\/terminal\:opacity-100:is(:where(.group\/terminal):hover *){opacity:1}}.placeholder\:text-text-muted::placeholder{color:var(--color-text-muted)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x) var(--tw-scale-y)}.hover\:border-surface-border:hover{border-color:var(--color-surface-border)}.hover\:bg-\[color-mix\(in_srgb\,var\(--color-accent-emerald-deep\)_85\%\,black\)\]:hover{background-color:#126d34}@supports (color:color-mix(in lab, red, red)){.hover\:bg-\[color-mix\(in_srgb\,var\(--color-accent-emerald-deep\)_85\%\,black\)\]:hover{background-color:color-mix(in srgb,var(--color-accent-emerald-deep) 85%,black)}}.hover\:bg-\[var\(--color-accent-deep\)\]\/20:hover{background-color:#7c3aed33}@supports (color:color-mix(in lab, red, red)){.hover\:bg-\[var\(--color-accent-deep\)\]\/20:hover{background-color:color-mix(in oklab, var(--color-accent-deep) 20%, transparent)}}.hover\:bg-accent-blue:hover{background-color:var(--color-accent-blue)}.hover\:bg-accent-blue\/20:hover{background-color:#3b82f633}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-blue\/20:hover{background-color:color-mix(in oklab, var(--color-accent-blue) 20%, transparent)}}.hover\:bg-accent-purple\/5:hover{background-color:#8b5cf60d}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent-purple\/5:hover{background-color:color-mix(in oklab, var(--color-accent-purple) 5%, transparent)}}.hover\:bg-danger-wash-border:hover{background-color:var(--color-danger-wash-border)}.hover\:bg-red-500:hover{background-color:var(--color-red-500)}.hover\:bg-slate-600:hover{background-color:var(--color-slate-600)}.hover\:bg-slate-700:hover{background-color:var(--color-slate-700)}.hover\:bg-slate-800:hover{background-color:var(--color-slate-800)}.hover\:bg-status-fail:hover{background-color:var(--color-status-fail)}.hover\:bg-status-pass:hover{background-color:var(--color-status-pass)}.hover\:bg-status-pending\/20:hover{background-color:#f59e0b33}@supports (color:color-mix(in lab, red, red)){.hover\:bg-status-pending\/20:hover{background-color:color-mix(in oklab, var(--color-status-pending) 20%, transparent)}}.hover\:bg-surface:hover{background-color:var(--color-surface)}.hover\:bg-surface-alt:hover{background-color:var(--color-surface-alt)}.hover\:bg-surface-border\/20:hover{background-color:#dee2e633}@supports (color:color-mix(in lab, red, red)){.hover\:bg-surface-border\/20:hover{background-color:color-mix(in oklab, var(--color-surface-border) 20%, transparent)}}.hover\:bg-surface-hover:hover{background-color:var(--color-surface-hover)}.hover\:bg-zinc-100:hover{background-color:var(--color-zinc-100)}.hover\:bg-zinc-200:hover{background-color:var(--color-zinc-200)}.hover\:text-\[color\:var\(--color-text-primary\,\#212529\)\]:hover{color:var(--color-text-primary,#212529)}.hover\:text-accent-purple:hover{color:var(--color-accent-purple)}.hover\:text-slate-200:hover{color:var(--color-slate-200)}.hover\:text-status-pending:hover{color:var(--color-status-pending)}.hover\:text-text-muted:hover{color:var(--color-text-muted)}.hover\:text-text-primary:hover{color:var(--color-text-primary)}.hover\:text-text-secondary:hover{color:var(--color-text-secondary)}.hover\:opacity-80:hover{opacity:.8}.hover\:ring-accent-purple\/40:hover{--tw-ring-color:#8b5cf666}@supports (color:color-mix(in lab, red, red)){.hover\:ring-accent-purple\/40:hover{--tw-ring-color:color-mix(in oklab, var(--color-accent-purple) 40%, transparent)}}@media (hover:hover){.hover\:group-hover\/bubble\:text-\[var\(--color-accent-deep\)\]:hover:is(:where(.group\/bubble):hover *){color:var(--color-accent-deep)}}}.focus\:border-text-muted:focus{border-color:var(--color-text-muted)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + 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)}.focus\:ring-text-muted:focus{--tw-ring-color:var(--color-text-muted)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:opacity-100:focus-visible{opacity:1}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-surface:disabled{background-color:var(--color-surface)}.disabled\:bg-surface-alt:disabled{background-color:var(--color-surface-alt)}.disabled\:text-text-muted:disabled{color:var(--color-text-muted)}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media (hover:hover){.disabled\:hover\:bg-surface-alt:disabled:hover{background-color:var(--color-surface-alt)}.disabled\:hover\:bg-transparent:disabled:hover{background-color:#0000}}@media (prefers-color-scheme:dark){.dark\:border-white\/15{border-color:#ffffff26}@supports (color:color-mix(in lab, red, red)){.dark\:border-white\/15{border-color:color-mix(in oklab, var(--color-white) 15%, transparent)}}.dark\:border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab, red, red)){.dark\:border-white\/20{border-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.dark\:bg-neutral-700{background-color:var(--color-neutral-700)}.dark\:bg-neutral-800{background-color:var(--color-neutral-800)}.dark\:bg-neutral-900\/95{background-color:#171717f2}@supports (color:color-mix(in lab, red, red)){.dark\:bg-neutral-900\/95{background-color:color-mix(in oklab, var(--color-neutral-900) 95%, transparent)}}.dark\:text-neutral-200{color:var(--color-neutral-200)}}@media (pointer:coarse){.pointer-coarse\:opacity-100{opacity:1}}}pre code.hljs{padding:1em;display:block;overflow-x:auto}code.hljs{padding:3px 5px}.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#005cc5}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-comment,.hljs-code,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:700}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:700}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0}[data-theme=dark]{--color-surface:#16181d;--color-surface-alt:#1d2026;--color-surface-hover:#262a32;--color-surface-border:#333842;--color-surface-elevated:#21252c;--color-text-primary:#e9ecef;--color-text-secondary:#9aa3ad;--color-text-muted:#757e89;--color-accent-blue:#60a5fa;--color-accent-purple:#a78bfa;--color-accent-purple-soft:#4c1d95;--color-accent-purple-ink:#ede9fe;--color-accent-emerald:#34d399;--color-accent-emerald-deep:#15803d;--color-accent-amber:#fbbf24;--color-accent-rose:#fb7185;--color-accent-cyan:#22d3ee;--color-accent-pink:#f48bb4;--color-accent-pink-strong:#f7a8c4;--color-status-pass:#34d399;--color-status-fail:#f87171;--color-status-pending:#fbbf24;--color-status-fail-ink:#450a0a;--color-tree-repo:#ff7a4d;--color-tree-child:#f0a05c;--color-tree-amber:#ffc95c;--color-accent-deep:#a78bfa;--color-success-ink:#4ade80;--color-success-soft:#34d399;--color-green-verify:#4ade80;--color-accent-orange:#fb923c;--color-accent-amber-ink:#fbbf24;--color-accent-amber-ink-deep:#fcd34d;--color-danger-madrid:#ff6b6b;--color-danger-github:#ff8181;--color-danger-editor-surface:#3b1218;--color-danger-editor-ink:#ffb4bb;--color-doc-child:#ff9b9b;--color-navy-focus:#93c5fd;--color-header-wash:#2b2620;--color-slate-neutral:#9aa3ad;--color-danger-wash:#2a1215;--color-danger-wash-border:#45161c;--color-danger-wash-ink:#ffb4bb;--color-ws-violet:#c084fc;--color-ws-green:#4ade80;--color-ws-blue:#6cb8ff;--color-subagent-tint-1:#2e2c25;--color-subagent-tint-2:#35332a;--color-subagent-tint-3:#3c3a2f;--si-run:#f87171}[data-theme=dark] pre code.hljs{padding:1em;display:block;overflow-x:auto}[data-theme=dark] code.hljs{padding:3px 5px}[data-theme=dark] .hljs{color:#c9d1d9;background:#0d1117}[data-theme=dark] .hljs-doctag,[data-theme=dark] .hljs-keyword,[data-theme=dark] .hljs-meta .hljs-keyword,[data-theme=dark] .hljs-template-tag,[data-theme=dark] .hljs-template-variable,[data-theme=dark] .hljs-type,[data-theme=dark] .hljs-variable.language_{color:#ff7b72}[data-theme=dark] .hljs-title,[data-theme=dark] .hljs-title.class_,[data-theme=dark] .hljs-title.class_.inherited__,[data-theme=dark] .hljs-title.function_{color:#d2a8ff}[data-theme=dark] .hljs-attr,[data-theme=dark] .hljs-attribute,[data-theme=dark] .hljs-literal,[data-theme=dark] .hljs-meta,[data-theme=dark] .hljs-number,[data-theme=dark] .hljs-operator,[data-theme=dark] .hljs-variable,[data-theme=dark] .hljs-selector-attr,[data-theme=dark] .hljs-selector-class,[data-theme=dark] .hljs-selector-id{color:#79c0ff}[data-theme=dark] .hljs-regexp,[data-theme=dark] .hljs-string,[data-theme=dark] .hljs-meta .hljs-string{color:#a5d6ff}[data-theme=dark] .hljs-built_in,[data-theme=dark] .hljs-symbol{color:#ffa657}[data-theme=dark] .hljs-comment,[data-theme=dark] .hljs-code,[data-theme=dark] .hljs-formula{color:#8b949e}[data-theme=dark] .hljs-name,[data-theme=dark] .hljs-quote,[data-theme=dark] .hljs-selector-tag,[data-theme=dark] .hljs-selector-pseudo{color:#7ee787}[data-theme=dark] .hljs-subst{color:#c9d1d9}[data-theme=dark] .hljs-section{color:#1f6feb;font-weight:700}[data-theme=dark] .hljs-bullet{color:#f2cc60}[data-theme=dark] .hljs-emphasis{color:#c9d1d9;font-style:italic}[data-theme=dark] .hljs-strong{color:#c9d1d9;font-weight:700}[data-theme=dark] .hljs-addition{color:#aff5b4;background-color:#033a16}[data-theme=dark] .hljs-deletion{color:#ffdcd7;background-color:#67060c}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:var(--color-surface)}::-webkit-scrollbar-thumb{background:var(--color-surface-border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--color-text-muted)}.scrollbar-none{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-none::-webkit-scrollbar{display:none}body{background-color:var(--color-surface);color:var(--color-text-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.md-content{overflow-wrap:break-word;word-break:break-word;min-width:0;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.md-content table{border-collapse:collapse;white-space:normal;background:#8b5cf60a;border:1px solid #8b5cf633;border-radius:.5em;width:100%;margin:.5em 0;display:block;overflow:auto hidden}.md-content table th,.md-content table td{white-space:normal;word-break:normal;overflow-wrap:break-word}.md-content p{margin-top:.5em;margin-bottom:.25em}.md-content ul{margin:.2em 0;padding-left:1.5em;list-style-type:disc}.md-content ol{margin:.2em 0;padding-left:1.5em;list-style-type:decimal}.md-content li{display:list-item}.md-content h1,.md-content h2,.md-content h3{color:var(--color-text-primary);margin:.75em 0 .3em;font-weight:800}.md-content h1{font-size:1.25em}.md-content h2{font-size:1.1em}.md-content h3{font-size:1em}.md-content blockquote{color:var(--color-text-secondary);border-left:3px solid #8b5cf666;margin:.5em 0;padding:.3em .75em}.md-content strong{color:var(--color-text-primary);font-weight:600}.md-content em{color:var(--color-accent-deep)}.md-content hr{border:none;border-top:1px solid var(--color-surface-border);margin:.5em 0}.md-content a{color:var(--color-accent-blue);text-underline-offset:2px;text-decoration:underline}.md-content th{color:var(--color-text-primary);background:#8b5cf61f}.md-content th,.md-content td{text-align:left;border:1px solid #8b5cf626;padding:.35em .6em}.md-content tbody tr:nth-child(2n){background:#8b5cf608}.md-content tbody tr:hover{background:#8b5cf614}.md-content code:not(pre code),.md-content :not(pre)>code{color:var(--color-accent-deep);background:#8b5cf614;border-radius:.3em;padding:.15em .35em;font-family:SF Mono,Fira Code,JetBrains Mono,monospace;font-size:.8em}.md-content pre{background:var(--color-surface-alt);border:1px solid var(--color-surface-border);border-radius:.5em;max-width:100%;margin:.5em 0;padding:.5em;font-size:.8em;overflow-x:auto}.md-content pre code{color:var(--color-text-primary);font-family:SF Mono,Fira Code,JetBrains Mono,monospace}[data-testid=assistant-turn] .md-content>:last-child{margin-bottom:.25em}[data-testid=assistant-turn] .md-content>:first-child{margin-top:.5em}.md-content .mermaid-diagram{justify-content:center;margin:.5em 0;padding:.5em;display:flex;overflow-x:auto}.md-content .mermaid-diagram svg{max-width:100%;height:auto}@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-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}@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-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}