@typescript-agent-harness/cli 0.29.1 → 0.30.1
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/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/env.d.ts +1 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +4 -2
- package/dist/env.js.map +1 -1
- package/dist/host.d.ts +2 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +13 -6
- package/dist/host.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/prompt.d.ts +2 -0
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +8 -0
- package/dist/prompt.js.map +1 -1
- package/dist/runtime.d.ts +3 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +44 -16
- package/dist/runtime.js.map +1 -1
- package/dist/serve/choose.d.ts +17 -0
- package/dist/serve/choose.d.ts.map +1 -0
- package/dist/serve/choose.js +48 -0
- package/dist/serve/choose.js.map +1 -0
- package/dist/serve/fs.d.ts +5 -0
- package/dist/serve/fs.d.ts.map +1 -0
- package/dist/serve/fs.js +47 -0
- package/dist/serve/fs.js.map +1 -0
- package/dist/serve/http.d.ts +6 -2
- package/dist/serve/http.d.ts.map +1 -1
- package/dist/serve/http.js +149 -21
- package/dist/serve/http.js.map +1 -1
- package/dist/serve/hub.d.ts +3 -1
- package/dist/serve/hub.d.ts.map +1 -1
- package/dist/serve/hub.js +24 -3
- package/dist/serve/hub.js.map +1 -1
- package/dist/serve/protocol.d.ts +94 -1
- package/dist/serve/protocol.d.ts.map +1 -1
- package/dist/serve/run.d.ts +4 -1
- package/dist/serve/run.d.ts.map +1 -1
- package/dist/serve/run.js +38 -21
- package/dist/serve/run.js.map +1 -1
- package/dist/serve/workspaces.d.ts +32 -0
- package/dist/serve/workspaces.d.ts.map +1 -0
- package/dist/serve/workspaces.js +137 -0
- package/dist/serve/workspaces.js.map +1 -0
- package/dist/settings.d.ts +26 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +69 -0
- package/dist/settings.js.map +1 -0
- package/dist/skills/discover.d.ts +0 -1
- package/dist/skills/discover.d.ts.map +1 -1
- package/dist/skills/discover.js +5 -6
- package/dist/skills/discover.js.map +1 -1
- package/dist/skills/install.d.ts +12 -0
- package/dist/skills/install.d.ts.map +1 -0
- package/dist/skills/install.js +60 -0
- package/dist/skills/install.js.map +1 -0
- package/dist/watch.d.ts +2 -0
- package/dist/watch.d.ts.map +1 -1
- package/dist/watch.js +5 -3
- package/dist/watch.js.map +1 -1
- package/dist/web/assets/index-WRCh4A0t.css +1 -0
- package/dist/web/assets/{index-By2PRbDq.js → index-gOZCYfzp.js} +4 -4
- package/dist/web/index.html +2 -2
- package/dist/workspaces.d.ts +8 -0
- package/dist/workspaces.d.ts.map +1 -0
- package/dist/workspaces.js +53 -0
- package/dist/workspaces.js.map +1 -0
- package/package.json +9 -9
- package/dist/web/assets/index-CW-h-0xR.css +0 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copies one skill folder (it has a SKILL.md) into `~/.tah/skills`, or every skill folder directly
|
|
3
|
+
* inside `from` (e.g. `~/.cursor/skills`). Names already installed are skipped, never overwritten.
|
|
4
|
+
* Symlinked skills are copied as files, since a relative link would break in the new place.
|
|
5
|
+
*/
|
|
6
|
+
export declare function importSkills(homeDir: string, from: string): {
|
|
7
|
+
imported: string[];
|
|
8
|
+
skipped: string[];
|
|
9
|
+
};
|
|
10
|
+
/** Removes a skill from `~/.tah/skills` (folder or flat `<name>.md`). Skills inside a work folder are left alone. */
|
|
11
|
+
export declare function removeSkill(homeDir: string, name: string): void;
|
|
12
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/skills/install.ts"],"names":[],"mappings":"AAeA;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BrG;AAED,qHAAqH;AACrH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAM/D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { cpSync, existsSync, readdirSync, readFileSync, rmSync, statSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { parseSkillMarkdown } from "./parse.js";
|
|
4
|
+
import { SKILL_NAME_RE } from "./types.js";
|
|
5
|
+
const homeSkills = (homeDir) => path.join(homeDir, ".tah", "skills");
|
|
6
|
+
const isSkillDir = (dir) => {
|
|
7
|
+
try {
|
|
8
|
+
return statSync(dir).isDirectory() && existsSync(path.join(dir, "SKILL.md"));
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Copies one skill folder (it has a SKILL.md) into `~/.tah/skills`, or every skill folder directly
|
|
16
|
+
* inside `from` (e.g. `~/.cursor/skills`). Names already installed are skipped, never overwritten.
|
|
17
|
+
* Symlinked skills are copied as files, since a relative link would break in the new place.
|
|
18
|
+
*/
|
|
19
|
+
export function importSkills(homeDir, from) {
|
|
20
|
+
const src = path.resolve(from);
|
|
21
|
+
const dirs = isSkillDir(src)
|
|
22
|
+
? [src]
|
|
23
|
+
: readdirSync(src)
|
|
24
|
+
.map((entry) => path.join(src, entry))
|
|
25
|
+
.filter(isSkillDir);
|
|
26
|
+
if (dirs.length === 0)
|
|
27
|
+
throw new Error(`no SKILL.md in ${src} or the folders directly inside it`);
|
|
28
|
+
const root = homeSkills(homeDir);
|
|
29
|
+
const imported = [];
|
|
30
|
+
const skipped = [];
|
|
31
|
+
for (const dir of dirs) {
|
|
32
|
+
const name = path.basename(dir);
|
|
33
|
+
const parsed = parseSkillMarkdown(readFileSync(path.join(dir, "SKILL.md"), "utf8"), name);
|
|
34
|
+
if (!parsed.ok) {
|
|
35
|
+
skipped.push(`${name}: ${parsed.warning}`);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const dest = path.join(root, name);
|
|
39
|
+
if (existsSync(dest) || existsSync(`${dest}.md`)) {
|
|
40
|
+
skipped.push(`${name}: already installed`);
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
cpSync(dir, dest, { recursive: true, dereference: true });
|
|
44
|
+
imported.push(name);
|
|
45
|
+
}
|
|
46
|
+
return { imported, skipped };
|
|
47
|
+
}
|
|
48
|
+
/** Removes a skill from `~/.tah/skills` (folder or flat `<name>.md`). Skills inside a work folder are left alone. */
|
|
49
|
+
export function removeSkill(homeDir, name) {
|
|
50
|
+
if (!SKILL_NAME_RE.test(name))
|
|
51
|
+
throw new Error(`invalid skill name: ${name}`);
|
|
52
|
+
const dir = path.join(homeSkills(homeDir), name);
|
|
53
|
+
if (existsSync(dir))
|
|
54
|
+
rmSync(dir, { recursive: true, force: true });
|
|
55
|
+
else if (existsSync(`${dir}.md`))
|
|
56
|
+
rmSync(`${dir}.md`);
|
|
57
|
+
else
|
|
58
|
+
throw new Error(`no skill "${name}" in ~/.tah/skills`);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/skills/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAE7E,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,EAAE;IACjC,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,IAAY;IACxD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC;QAC1B,CAAC,CAAC,CAAC,GAAG,CAAC;QACP,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC;aACb,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;aACrC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,oCAAoC,CAAC,CAAC;IAClG,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,kBAAkB,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1F,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3C,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,qBAAqB,CAAC,CAAC;YAC3C,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,qHAAqH;AACrH,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,IAAY;IACvD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;IACjD,IAAI,UAAU,CAAC,GAAG,CAAC;QAAE,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;SAC9D,IAAI,UAAU,CAAC,GAAG,GAAG,KAAK,CAAC;QAAE,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;;QACjD,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,oBAAoB,CAAC,CAAC;AAC9D,CAAC"}
|
package/dist/watch.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export type WatchProjectOptions = {
|
|
2
2
|
/** Home directory. When set, also watch `<homeSkillsDir>/.tah/skills` (reported as `.tah/skills/...`). */
|
|
3
3
|
homeSkillsDir?: string;
|
|
4
|
+
/** A plain folder (not a tah project): only skill folders count, so edits to its `lib/` etc. never reload. */
|
|
5
|
+
skillsOnly?: boolean;
|
|
4
6
|
};
|
|
5
7
|
/**
|
|
6
8
|
* Calls `onChange` with the project-relative paths (`/`-separated) that changed in the last
|
package/dist/watch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,mBAAmB,GAAG;IAChC,0GAA0G;IAC1G,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,mBAAmB,GAAG;IAChC,0GAA0G;IAC1G,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8GAA8G;IAC9G,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,EACnC,UAAU,SAAM,EAChB,IAAI,GAAE,mBAAwB,GAC7B,MAAM,IAAI,CAqGZ"}
|
package/dist/watch.js
CHANGED
|
@@ -11,6 +11,8 @@ const SKILL_PARENTS = [".agents", ".cursor"];
|
|
|
11
11
|
* is watched without recursion so `node_modules` is never scanned. Returns a function that stops watching.
|
|
12
12
|
*/
|
|
13
13
|
export function watchProject(cwd, onChange, debounceMs = 200, opts = {}) {
|
|
14
|
+
const dirs = opts.skillsOnly ? ["skills"] : DIRS;
|
|
15
|
+
const rootFiles = opts.skillsOnly ? new Set() : ROOT_FILES;
|
|
14
16
|
const changed = new Set();
|
|
15
17
|
let timer;
|
|
16
18
|
const report = (file) => {
|
|
@@ -76,7 +78,7 @@ export function watchProject(cwd, onChange, debounceMs = 200, opts = {}) {
|
|
|
76
78
|
const root = watch(cwd, (_event, file) => {
|
|
77
79
|
if (!file)
|
|
78
80
|
return;
|
|
79
|
-
if (
|
|
81
|
+
if (dirs.includes(file)) {
|
|
80
82
|
syncTree(file, path.join(cwd, file));
|
|
81
83
|
report(file);
|
|
82
84
|
}
|
|
@@ -85,12 +87,12 @@ export function watchProject(cwd, onChange, debounceMs = 200, opts = {}) {
|
|
|
85
87
|
if (existsSync(path.join(cwd, file, "skills")))
|
|
86
88
|
report(`${file}/skills`);
|
|
87
89
|
}
|
|
88
|
-
else if (
|
|
90
|
+
else if (rootFiles.has(file)) {
|
|
89
91
|
report(file);
|
|
90
92
|
}
|
|
91
93
|
});
|
|
92
94
|
root.on("error", () => root.close());
|
|
93
|
-
for (const name of
|
|
95
|
+
for (const name of dirs)
|
|
94
96
|
syncTree(name, path.join(cwd, name));
|
|
95
97
|
for (const name of SKILL_PARENTS)
|
|
96
98
|
syncSkillParent(name);
|
package/dist/watch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAkB,MAAM,SAAS,CAAC;AAC5D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAC1C,wGAAwG;AACxG,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AACnD,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,SAAS,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--bg:#fff;--panel:#f6f7f9;--border:#e3e5e8;--text:#1f2328;--muted:#6b7280;--accent:#0e7490;--accent-text:#fff;--ok:#15803d;--fail:#b91c1c;--warn:#b45309;--code-bg:#f3f4f6;--hl-keyword:#cf222e;--hl-string:#0a3069;--hl-comment:#6e7781;--hl-number:#0550ae;--hl-title:#8250df;--hl-attr:#953800;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;color:var(--text);background:var(--bg);font-family:ui-sans-serif,system-ui,-apple-system,Segoe UI,PingFang SC,Microsoft YaHei,sans-serif;font-size:15px;line-height:1.6}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial;--bg:#0f1115;--panel:#161a20;--border:#2a2f37;--text:#e6e6e6;--muted:#9aa1ab;--accent:#22a6c4;--accent-text:#0f1115;--ok:#4ade80;--fail:#f87171;--warn:#fbbf24;--code-bg:#1c2028;--hl-keyword:#ff7b72;--hl-string:#a5d6ff;--hl-comment:#8b949e;--hl-number:#79c0ff;--hl-title:#d2a8ff;--hl-attr:#ffa657}}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}button{font:inherit;color:var(--text);background:var(--panel);border:1px solid var(--border);cursor:pointer;border-radius:6px;padding:4px 12px}button:disabled{opacity:.5;cursor:default}button.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-text)}button.danger{color:var(--fail)}code,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px}.app{height:100%;display:flex}.sidebar{border-right:1px solid var(--border);background:var(--panel);flex-direction:column;flex-shrink:0;width:260px;display:flex}.sidebar-actions{gap:6px;padding:12px;display:flex}.sidebar-actions button{white-space:nowrap;padding:4px 8px;font-size:13px}.ws-header{color:var(--muted);justify-content:space-between;align-items:center;padding:0 12px 4px 14px;font-size:13px;display:flex}.icon-btn{color:var(--muted);background:0 0;border:none;padding:3px;display:flex}.icon-btn:not(:disabled):hover{background:var(--panel);color:var(--text)}.sidebar-note{color:var(--muted);padding:0 12px 8px;font-size:13px}.sessions{padding:0 8px 12px;overflow-y:auto}.sessions ul{margin:0;padding:0;list-style:none}.ws>ul{padding-left:16px}.sessions-heading{color:var(--muted);padding:8px 8px 4px;font-size:12px}.session-item{border-radius:6px;margin-bottom:2px}.session-item:hover{background:var(--bg)}.session-item.current{background:var(--bg);box-shadow:inset 2px 0 0 var(--accent)}.session{align-items:center;gap:4px;width:100%;padding:2px 4px 2px 8px;display:flex}.session-pick{text-align:left;min-width:0;color:inherit;font:inherit;background:0 0;border:none;flex:1;padding:2px 0;display:flex}.session .preview{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.session-time{color:var(--muted);flex:none;font-size:12px}.session-tools{flex:none;gap:2px;display:none}.session-item:hover .session-time{display:none}.session-item:hover .session-tools{display:flex}.session-tools button{color:var(--muted);background:0 0;border:none;border-radius:4px;padding:3px;display:flex}.session-tools button:hover,.session-tools button.on{color:var(--text)}.session-tools button:hover{background:var(--panel)}.context-menu{z-index:10;border:1px solid var(--border);background:var(--bg);border-radius:8px;min-width:160px;margin:0;padding:4px;list-style:none;position:fixed;box-shadow:0 6px 20px #00000026}.context-menu button{text-align:left;background:0 0;border:none;width:100%;padding:4px 10px;font-size:14px}.context-menu button:not(:disabled):hover{background:var(--panel)}.ws-head{color:var(--muted);align-items:center;gap:4px;padding:6px 4px 2px 2px;font-size:12px;display:flex}.ws-head.active .ws-name{color:var(--text);font-weight:600}.ws-head.missing{opacity:.6}.ws-toggle{min-width:0;color:inherit;text-align:left;background:0 0;border:none;flex:1;align-items:center;gap:4px;padding:0 4px;font-size:12px;display:flex}.ws-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.ws-note{flex:none}.ws-tools{flex:none;gap:2px;display:none}.ws-head:hover .ws-tools{display:flex}.ws-tools button{color:var(--muted);background:0 0;border:none;padding:3px;display:flex}.ws-chevron{flex:none;display:flex}.ws-tools button:hover{background:var(--panel);color:var(--text)}.session-folder{text-overflow:ellipsis;white-space:nowrap;max-width:72px;color:var(--muted);flex:none;font-size:12px;overflow:hidden}.session-item:hover .session-folder{display:none}.modal-backdrop{z-index:20;background:#0000004d;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal{border:1px solid var(--border);background:var(--bg);border-radius:10px;flex-direction:column;gap:8px;width:min(520px,90vw);max-height:70vh;padding:12px;display:flex}.crumbs{flex-wrap:wrap;display:flex}.crumbs button,.dirs button{text-align:left;background:0 0;border:none;padding:2px 4px}.dirs{border:1px solid var(--border);border-radius:6px;min-height:160px;margin:0;padding:0;list-style:none;overflow-y:auto}.dirs button{width:100%;padding:4px 8px}.dirs button:hover,.crumbs button:hover{background:var(--panel)}.modal-title{font-weight:600}.recent button{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.dir-path{color:var(--muted);margin-left:8px;font-size:12px}.new-folder-where{align-items:center;gap:8px;font-size:13px;display:flex}.where-path{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--muted);flex:1;overflow:hidden}.modal-error{color:var(--fail);font-size:13px}.sidebar-user{align-items:center;gap:8px;margin:auto 8px 8px;padding:6px 4px 6px 8px;display:flex}.avatar{background:var(--accent);width:24px;height:24px;color:var(--accent-text);border-radius:50%;flex:none;justify-content:center;align-items:center;font-size:12px;font-weight:600;display:flex}.user-name{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:13px;overflow:hidden}.settings{border:1px solid var(--border);background:var(--bg);border-radius:12px;width:min(860px,94vw);height:min(600px,86vh);display:flex;overflow:hidden;box-shadow:0 16px 48px #0003}.settings-nav{border-right:1px solid var(--border);background:var(--panel);flex-direction:column;flex:none;gap:2px;width:180px;padding:16px 8px;display:flex}.settings-nav-title{color:var(--muted);padding:0 8px 10px;font-size:13px}.settings-nav button{text-align:left;background:0 0;border:none;border-radius:6px;padding:6px 8px;font-size:14px}.settings-nav button.active{background:var(--bg);font-weight:600}.settings-body{flex-direction:column;flex:1;gap:14px;min-width:0;padding:20px 28px;display:flex;overflow-y:auto}.settings-head{justify-content:space-between;align-items:center;display:flex}.settings-head h2{margin:0;font-size:18px}.settings-desc{color:var(--muted);margin:-6px 0 0;font-size:13px}.model-cards{border:1px solid var(--border);border-radius:8px;margin:0;padding:0;list-style:none}.model-card{align-items:center;gap:10px;padding:10px 12px;display:flex}.model-card+.model-card{border-top:1px solid var(--border)}.model-main{flex:1;min-width:0}.model-name{font-weight:600}.model-meta{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.model-card>button:not(.icon-btn){padding:3px 12px;font-size:13px}.badge{background:color-mix(in srgb, var(--accent) 15%, transparent);color:var(--accent);border-radius:999px;padding:2px 8px;font-size:12px;font-weight:600}.settings-subhead{color:var(--muted);margin-top:6px;font-size:12px;font-weight:600}.skill-desc{-webkit-line-clamp:2;color:var(--muted);-webkit-box-orient:vertical;font-size:12px;display:-webkit-box;overflow:hidden}.settings-empty,.settings-note{color:var(--muted);font-size:13px}.add-model{align-self:flex-start}.model-form{border:1px solid var(--border);border-radius:8px;flex-direction:column;gap:12px;padding:14px;display:flex}.model-form label{flex-direction:column;gap:4px;font-size:13px;display:flex}.model-form label em{color:var(--muted);font-style:normal;font-weight:400}.model-form input{border:1px solid var(--border);font:inherit;background:var(--bg);color:inherit;border-radius:6px;padding:6px 8px}.model-form small{color:var(--muted);font-size:12px}button.link{color:var(--accent);font-size:inherit;cursor:pointer;background:0 0;border:none;padding:0}button.link:not(:disabled):hover{text-decoration:underline}.spacer{flex:1}.session-rename{border:1px solid var(--border);width:100%;font:inherit;background:var(--panel);color:var(--fg);border-radius:4px;padding:4px 6px}.user-attach-fallback{color:var(--muted);font-size:13px}main{flex-direction:column;flex:1;min-width:0;display:flex}.banner{color:var(--warn);border-bottom:1px solid var(--border);padding:6px 16px;font-size:13px}.messages{flex:1;padding:16px max(16px,50% - 430px);overflow-y:auto}.empty{text-align:center;flex-direction:column;justify-content:center;align-items:center;min-height:min(52vh,420px);padding:24px 16px;display:flex}.empty-title{letter-spacing:-.02em;color:var(--text);font-size:1.25rem;font-weight:600}.empty-hint{max-width:28rem;color:var(--muted);margin:8px 0 0;font-size:14px}.user{background:var(--panel);white-space:pre-wrap;word-break:break-word;border-radius:8px;margin:20px 0 8px;padding:8px 12px}.user-attach{flex-wrap:wrap;gap:6px;margin-bottom:6px;display:flex}.user-attach-chip{background:var(--bg);border:1px solid var(--border);color:var(--muted);white-space:nowrap;border-radius:999px;padding:2px 8px;font-size:12px}.reply{word-break:break-word}.reply pre{background:var(--code-bg);border-radius:6px;padding:10px 12px;overflow-x:auto}.reply :not(pre)>code{background:var(--code-bg);border-radius:4px;padding:1px 4px}.reply table{border-collapse:collapse}.reply th,.reply td{border:1px solid var(--border);padding:4px 8px}.hljs-keyword,.hljs-selector-tag,.hljs-literal{color:var(--hl-keyword)}.hljs-string,.hljs-regexp{color:var(--hl-string)}.hljs-comment,.hljs-quote{color:var(--hl-comment);font-style:italic}.hljs-number,.hljs-variable{color:var(--hl-number)}.hljs-title,.hljs-section,.hljs-function{color:var(--hl-title)}.hljs-attr,.hljs-attribute,.hljs-built_in,.hljs-type{color:var(--hl-attr)}.tool{white-space:nowrap;align-items:center;gap:8px;margin:4px 0;font-size:14px;display:flex;overflow:hidden}.tool .dot{color:var(--accent)}.tool.failed .dot,.tool.failed .result{color:var(--fail)}.tool .name{font-weight:600}.tool .summary{color:var(--muted);text-overflow:ellipsis;overflow:hidden}.tool.ok .result{color:var(--ok)}.steps{margin:6px 0}.steps-head{max-width:100%;color:var(--muted);white-space:nowrap;background:0 0;border:none;align-items:center;gap:6px;padding:2px 4px 2px 0;font-size:13px;display:flex;overflow:hidden}.steps-head:hover{color:var(--text)}.steps-title{font-weight:600}.steps-detail{text-overflow:ellipsis;overflow:hidden}.steps-failed{color:var(--fail)}.steps-body{border-left:1px solid var(--border);margin-left:6px;padding-left:12px}.notice{color:var(--muted);margin:4px 0;font-size:13px}.notice.error{color:var(--fail)}.thinking{color:var(--muted);align-items:center;gap:8px;margin:8px 0;display:flex}.spinner{border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;width:12px;height:12px;animation:.8s linear infinite spin;display:inline-block}@keyframes spin{to{transform:rotate(360deg)}}.card{border:1px solid var(--warn);border-radius:8px;margin:12px 0;padding:12px}.card-title{margin-bottom:8px;font-weight:600}.card-body{background:var(--code-bg);white-space:pre-wrap;border-radius:6px;max-height:240px;margin:0 0 12px;padding:8px;overflow:auto}.card-actions{gap:8px;display:flex}.composer-wrap{padding:8px max(16px,50% - 430px)}.attach-rail{gap:8px;padding-bottom:8px;display:flex;overflow-x:auto}.attach-card{border:1px solid var(--border);background:var(--panel);border-radius:12px;flex:none;align-items:center;gap:8px;min-width:180px;max-width:240px;height:64px;padding:6px 8px;display:flex;position:relative}.attach-card img{object-fit:cover;border-radius:6px;width:48px;height:48px}.attach-ext{width:48px;height:48px;color:var(--muted);background:var(--bg);border-radius:6px;place-items:center;font-size:11px;font-weight:600;display:grid}.attach-meta{flex:1;min-width:0}.attach-name{text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.attach-sub{color:var(--muted);font-size:11px}.attach-card.error .attach-sub{color:var(--fail)}.attach-remove{width:22px;line-height:1;position:absolute;top:2px;right:2px;border-radius:11px!important;height:22px!important;padding:0!important}.composer{align-items:flex-end;gap:8px;display:flex}.composer textarea{resize:none;font:inherit;color:var(--text);background:var(--bg);border:1px solid var(--border);border-radius:8px;outline:none;flex:1;min-height:42px;padding:8px 12px}.composer textarea:focus{border-color:var(--accent)}.composer button{border-radius:8px;height:42px;padding:0 16px}.composer .attach-btn{width:42px;padding:0;font-size:20px;line-height:1}.status{color:var(--muted);padding:4px max(16px,50% - 430px) 10px;font-size:12px}.signed-out{text-align:center;max-width:480px;color:var(--muted);margin:20vh auto}
|