@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.
- package/.agents/skills/glass-dsi/scripts/_connect.mjs +21 -2
- package/.agents/skills/glass-url/scripts/_connect.mjs +4 -2
- package/README.md +34 -26
- package/bin/dsi.mjs +23 -12
- package/bin/lib/glass-browser-bootstrap.mjs +19 -2
- package/bin/lib/plugin-chain.mjs +6 -5
- package/bin/lib/zai-patch.mjs +3 -1
- package/build/client/_app/immutable/assets/0.Bjw4vcZl.css +2 -0
- package/build/client/_app/immutable/assets/2.glyfXGzi.css +1 -0
- package/build/client/_app/immutable/chunks/Dj8AK3pr.js +1 -0
- package/build/client/_app/immutable/chunks/UPlr67N1.js +2 -0
- package/build/client/_app/immutable/chunks/WySTHi46.js +1 -0
- package/build/client/_app/immutable/chunks/{UcxQDPMg.js → e-3PBXxJ.js} +1 -1
- package/build/client/_app/immutable/entry/{app.GxH1nznH.js → app.ezxtVZch.js} +2 -2
- package/build/client/_app/immutable/entry/start.DdPLwPDt.js +1 -0
- package/build/client/_app/immutable/nodes/{1.BVvBJtMj.js → 1.CGppLUrN.js} +1 -1
- package/build/client/_app/immutable/nodes/{2.D0JzdegJ.js → 2.9BE7-E5x.js} +197 -199
- package/build/client/_app/version.json +1 -1
- package/build/handler.js +5 -5
- package/build/index.js +5 -5
- package/build/server/chunks/chunks/{db.js-f2PmBjyD.js → db.js-BGSxIVb3.js} +2 -2
- package/build/server/chunks/chunks/{db2.js-DkwY64WO.js → db2.js-vQNFcVO7.js} +2 -2
- package/build/server/chunks/chunks/{dsh-connection.js-BW07Aicl.js → dsh-connection.js-Dcdxqp52.js} +27 -7
- package/build/server/chunks/chunks/{exports.js-DH_tjtdv.js → exports.js-D5zA1U7A.js} +42 -4
- package/build/server/chunks/chunks/{git-probe.js-CQqTV7XX.js → git-probe.js-BIieYqLU.js} +2 -2
- package/build/server/chunks/chunks/{insight-config.js-C5-Rhh5A.js → insight-config.js-ylYA2CXm.js} +2 -2
- package/build/server/chunks/chunks/{internal2.js-BRzR_ZGp.js → internal2.js-Cu5N8_4R.js} +3 -3
- package/build/server/chunks/chunks/{registry.js-6St5Biiy.js → registry.js-Bwc2MNSZ.js} +53 -50
- package/build/server/chunks/chunks/{registry2.js-CFzpvj9c.js → registry2.js-BZfrwsOy.js} +20 -1
- package/build/server/chunks/chunks/{settings-document.js-DxKURfc_.js → settings-document.js-BIxaivJ1.js} +23 -8
- package/build/server/chunks/chunks/{state.js-Ct6h8rMl.js → state.js-CRPhnJJH.js} +3 -3
- package/build/server/chunks/chunks/{watcher.js-DvlNn8X0.js → watcher.js-Bcm29AuA.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/a2a/_id_/{_server.ts.js-DItDXV23.js → _server.ts.js-BbIEpZB5.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/a2a/{_server.ts.js-Hor8QZb1.js → _server.ts.js-Daho1I-l.js} +6 -6
- package/build/server/chunks/entries/endpoints/api/a2a/register/{_server.ts.js-CEvvsa8B.js → _server.ts.js-C5X77Uef.js} +6 -6
- package/build/server/chunks/entries/endpoints/api/browser/_id_/activate/{_server.ts.js-DYvCel9L.js → _server.ts.js-BxfB-QXT.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/browser/_id_/close/{_server.ts.js-CDNbpOqu.js → _server.ts.js-DT6rU-EU.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/browser/_id_/closetab/{_server.ts.js-C8UZMTcb.js → _server.ts.js-Cwu4C98Y.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/browser/_id_/element/{_server.ts.js-CERwttQS.js → _server.ts.js-B55tx3-S.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/browser/_id_/history/{_server.ts.js-DtVkS-mH.js → _server.ts.js-D2ft7u0s.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/browser/_id_/input/{_server.ts.js-C85umKKr.js → _server.ts.js-BO1uO6i3.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/browser/_id_/mcp/{_server.ts.js-CrTtygPQ.js → _server.ts.js-zOccgfJZ.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/browser/_id_/navigate/{_server.ts.js-DgJ6DXVr.js → _server.ts.js-DgyR0sLf.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/browser/_id_/opentab/{_server.ts.js-Bj9bKEEv.js → _server.ts.js-CPCIL2MG.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/browser/_id_/page/{_server.ts.js--1WTGEfT.js → _server.ts.js-Cjvr5nEt.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/browser/_id_/stream/{_server.ts.js-D8hQe810.js → _server.ts.js-Bb3DkB-H.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/browser/_id_/tabs/{_server.ts.js-CSYYFlm2.js → _server.ts.js-DVcq1pYf.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/browser/_id_/viewport/{_server.ts.js-KJjT8zXH.js → _server.ts.js-D1xgkwTO.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/browser/_id_/zoom/{_server.ts.js-DQtzgPeG.js → _server.ts.js-DFo94fTq.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/browser/{_server.ts.js-DSkCBGRA.js → _server.ts.js-0Gye8oLN.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/config/{_server.ts.js-C_9kwANR.js → _server.ts.js-DqPIv-gn.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/directory/{_server.ts.js-h1OTHcL4.js → _server.ts.js-DzFVVhO_.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/jobs/{_server.ts.js-B6nih9Sd.js → _server.ts.js-DvuZUgbK.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/jobs/follow/{_server.ts.js-Cf17SVmD.js → _server.ts.js-D6brRlYZ.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/pick-directory/{_server.ts.js-DjNwMbdS.js → _server.ts.js-8nNlcikK.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/presets/{_server.ts.js-Cz5aaEhC.js → _server.ts.js-C8AZBt63.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/attachment/{_server.ts.js-BFBy5O9Y.js → _server.ts.js-BFfr6uJh.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/cancel/{_server.ts.js-CgEdCo3T.js → _server.ts.js-DSSgbD87.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/catalog/{_server.ts.js-Bo_aEnHh.js → _server.ts.js-DYtrYC2P.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/changes/{_server.ts.js-Bd2G_GaH.js → _server.ts.js-HxI5M4jg.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/command/{_server.ts.js-DL64FyRw.js → _server.ts.js-Ch0dMm33.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/events/{_server.ts.js-MhOGB66D.js → _server.ts.js-BG5C--Ok.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/fork/{_server.ts.js-MjPgXgGO.js → _server.ts.js-B64YyaFI.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/goal/{_server.ts.js-BUjDae5H.js → _server.ts.js-0RtL-9Zr.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/history/{_server.ts.js-dTKd7Hsv.js → _server.ts.js-C4k-RTIw.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/models/{_server.ts.js-B82rvKoI.js → _server.ts.js-CU38DxMt.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/path/{_server.ts.js-Cqijsi-c.js → _server.ts.js-BXphf5ux.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/permission/{_server.ts.js-CL_vVv2p.js → _server.ts.js-DQ5FG9Pc.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/prompt/{_server.ts.js-WS4W9Ly4.js → _server.ts.js-In3bXhUO.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/rename/{_server.ts.js-B72KGRGh.js → _server.ts.js-Bd0KF8Qm.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/respond/{_server.ts.js-DK5xb2b5.js → _server.ts.js-4Y-KAw2r.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/select-model/{_server.ts.js-lhT87EQu.js → _server.ts.js-zXYA1AJD.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/sessions/{_server.ts.js-CMhfhbkN.js → _server.ts.js-vh7lFV0n.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/subagents/{_server.ts.js-BLvcFsg6.js → _server.ts.js-DH7OEWm0.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/workspace-file/{_server.ts.js-D_rw2Uq6.js → _server.ts.js-CDwgBp7D.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/workspace-tree/{_server.ts.js-DfXpMMpw.js → _server.ts.js-CtFxC_yV.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/workspaces/{_server.ts.js-2mJCJVxk.js → _server.ts.js-DRNzGdAj.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/workspaces/_workspaceId_/delete/{_server.ts.js-BCx0Lzjf.js → _server.ts.js-DIjNfN0d.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/dsh/workspaces/_workspaceId_/rename/{_server.ts.js-DECaSjwp.js → _server.ts.js-CtV7JhrK.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/prompts/_id_/{_server.ts.js-i_ciJzlb.js → _server.ts.js-Cg9zHbUP.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/prompts/{_server.ts.js-BO1pScn7.js → _server.ts.js-DOHmlKvl.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/prompts/use/{_server.ts.js-Buhpf7WE.js → _server.ts.js-COVyy224.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/settings/{_server.ts.js-DngUQzcT.js → _server.ts.js-HjpfRAaT.js} +3 -3
- package/build/server/chunks/entries/endpoints/api/terminal/_id_/delete/_server.ts.js-D9UU6xR6.js +42 -0
- package/build/server/chunks/entries/endpoints/api/terminal/_id_/output/{_server.ts.js-DLETP4yQ.js → _server.ts.js-BqJRMRsb.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/terminal/_id_/reattach/{_server.ts.js-uWl6oxPS.js → _server.ts.js-D6bMXeOk.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/terminal/_id_/send/{_server.ts.js-DYNmXaAd.js → _server.ts.js-BRgsqPFM.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/terminal/_id_/stream/{_server.ts.js-C5m3Ktho.js → _server.ts.js-EWo4sSmg.js} +2 -2
- package/build/server/chunks/entries/endpoints/api/terminal/{_server.ts.js-DoTNvcOa.js → _server.ts.js-v1ixRdpN.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/terminal/stream/_server.ts.js-BQOQyT7o.js +185 -0
- package/build/server/chunks/entries/endpoints/api/workspace/file-write/{_server.ts.js-BzYOJSkI.js → _server.ts.js-CjU6bLOf.js} +5 -5
- package/build/server/chunks/entries/endpoints/api/workspace/git-events/{_server.ts.js-xcNesei9.js → _server.ts.js-CYU0btiH.js} +5 -5
- package/build/server/chunks/entries/endpoints/api/workspace/git-file-head/{_server.ts.js-DsJWYdxt.js → _server.ts.js-Du9YcwLw.js} +5 -5
- package/build/server/chunks/entries/endpoints/api/workspace/git-map/{_server.ts.js-CNCku9BR.js → _server.ts.js-BdV_KDjb.js} +5 -5
- package/build/server/chunks/entries/endpoints/api/workspace/git-status/{_server.ts.js-nLsNjOxj.js → _server.ts.js-C-C84Yzu.js} +5 -5
- package/build/server/chunks/entries/endpoints/api/workspace/write-gate/{_server.ts.js-urQk2-ds.js → _server.ts.js-D9uFvZya.js} +5 -5
- package/build/server/chunks/entries/{hooks.server.js-CU2RE5vs.js → hooks.server.js-YJQlamhk.js} +2 -2
- package/build/server/chunks/entries/pages/{_error.svelte.js-BXD7Pthk.js → _error.svelte.js-CJ9RHd_3.js} +4 -4
- package/build/server/chunks/entries/pages/{_page.server.ts.js-BK3Y6eff.js → _page.server.ts.js-BFDPRDEm.js} +2 -2
- package/build/server/chunks/entries/pages/{_page.svelte.js-DaZfwP76.js → _page.svelte.js-DlLAziUY.js} +477 -139
- package/build/server/chunks/{handler-C5_-AjlT.js → handler-BRlzTcii.js} +3 -3
- package/build/server/chunks/{index.js-BECscw6k.js → index.js-D2umW-Cg.js} +3 -44
- package/build/server/chunks/{manifest.js-aksIjogg.js → manifest.js-CaT4HRXz.js} +81 -67
- package/build/server/chunks/nodes/{0.js-xX4GZsu5.js → 0.js-B8ciwPSu.js} +3 -3
- package/build/server/chunks/nodes/1.js-cXTCbvze.js +9 -0
- package/build/server/chunks/nodes/{2.js-CBdFoBFK.js → 2.js-CF_m1q-z.js} +8 -8
- package/package.json +1 -1
- package/skills/dsi-drive-terminal/SKILL.md +23 -1
- package/skills/dsi-spec/SKILL.md +8 -0
- package/skills/dsi-task/SKILL.md +34 -0
- package/skills/dsi-token-spent/SKILL.md +122 -0
- package/template/.dsi/prompts.sqlite +0 -0
- package/template/.dsi/prompts.sqlite-shm +0 -0
- package/template/.dsi/prompts.sqlite-wal +0 -0
- package/build/client/_app/immutable/assets/0.CxUWwepa.css +0 -2
- package/build/client/_app/immutable/assets/2.CSFboNRO.css +0 -1
- package/build/client/_app/immutable/chunks/C4M9oU_3.js +0 -1
- package/build/client/_app/immutable/chunks/CNT-CapI.js +0 -1
- package/build/client/_app/immutable/chunks/DttyJZuo.js +0 -2
- package/build/client/_app/immutable/entry/start.P-LmBYpD.js +0 -1
- package/build/server/chunks/nodes/1.js-BaNGyV1A.js +0 -9
- /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
|
-
|
|
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
|
-
>
|
|
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
|
-
|
|
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
|
-
>
|
|
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
|
-
##
|
|
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` | `
|
|
76
|
-
| Browser brain | `9515` | `
|
|
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
|
-
|
|
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
|
|
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`
|
|
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 (
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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, ...
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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) {
|
package/bin/lib/plugin-chain.mjs
CHANGED
|
@@ -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:
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
* command), so unit tests pin
|
|
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]);
|
package/bin/lib/zai-patch.mjs
CHANGED
|
@@ -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
|
-
|
|
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}}
|