@sagmans/dsh-tui 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/README.md +84 -10
  2. package/cordis.patch.yml +4 -2
  3. package/lib/agent/host.d.ts +14 -0
  4. package/lib/agent/host.d.ts.map +1 -1
  5. package/lib/agent/host.js +20 -4
  6. package/lib/agent/host.js.map +1 -1
  7. package/lib/agent/model.d.ts +24 -0
  8. package/lib/agent/model.d.ts.map +1 -1
  9. package/lib/agent/model.js +46 -1
  10. package/lib/agent/model.js.map +1 -1
  11. package/lib/agent/present.d.ts +7 -1
  12. package/lib/agent/present.d.ts.map +1 -1
  13. package/lib/agent/present.js +33 -4
  14. package/lib/agent/present.js.map +1 -1
  15. package/lib/agent/presets.d.ts +7 -1
  16. package/lib/agent/presets.d.ts.map +1 -1
  17. package/lib/agent/presets.js +7 -3
  18. package/lib/agent/presets.js.map +1 -1
  19. package/lib/cards.d.ts +127 -7
  20. package/lib/cards.d.ts.map +1 -1
  21. package/lib/cards.js +380 -52
  22. package/lib/cards.js.map +1 -1
  23. package/lib/export.d.ts +5 -4
  24. package/lib/export.d.ts.map +1 -1
  25. package/lib/export.js +62 -13
  26. package/lib/export.js.map +1 -1
  27. package/lib/fold-cursor.d.ts +23 -0
  28. package/lib/fold-cursor.d.ts.map +1 -0
  29. package/lib/fold-cursor.js +31 -0
  30. package/lib/fold-cursor.js.map +1 -0
  31. package/lib/index.d.ts +7 -1
  32. package/lib/index.d.ts.map +1 -1
  33. package/lib/index.js +310 -32
  34. package/lib/index.js.map +1 -1
  35. package/lib/input/submission.d.ts +3 -1
  36. package/lib/input/submission.d.ts.map +1 -1
  37. package/lib/input/submission.js +5 -2
  38. package/lib/input/submission.js.map +1 -1
  39. package/lib/terminal/warning-screen.d.ts +8 -0
  40. package/lib/terminal/warning-screen.d.ts.map +1 -0
  41. package/lib/terminal/warning-screen.js +66 -0
  42. package/lib/terminal/warning-screen.js.map +1 -0
  43. package/lib/theme-capability.d.ts +36 -0
  44. package/lib/theme-capability.d.ts.map +1 -0
  45. package/lib/theme-capability.js +190 -0
  46. package/lib/theme-capability.js.map +1 -0
  47. package/lib/theme-command.d.ts +10 -0
  48. package/lib/theme-command.d.ts.map +1 -0
  49. package/lib/theme-command.js +61 -0
  50. package/lib/theme-command.js.map +1 -0
  51. package/lib/theme-settings.d.ts +161 -0
  52. package/lib/theme-settings.d.ts.map +1 -0
  53. package/lib/theme-settings.js +166 -0
  54. package/lib/theme-settings.js.map +1 -0
  55. package/lib/theme-tokens.d.ts +110 -0
  56. package/lib/theme-tokens.d.ts.map +1 -0
  57. package/lib/theme-tokens.js +401 -0
  58. package/lib/theme-tokens.js.map +1 -0
  59. package/lib/theme.d.ts +32 -35
  60. package/lib/theme.d.ts.map +1 -1
  61. package/lib/theme.js +112 -63
  62. package/lib/theme.js.map +1 -1
  63. package/lib/tokens.d.ts +15 -0
  64. package/lib/tokens.d.ts.map +1 -0
  65. package/lib/tokens.js +29 -0
  66. package/lib/tokens.js.map +1 -0
  67. package/lib/transcript.d.ts +26 -1
  68. package/lib/transcript.d.ts.map +1 -1
  69. package/lib/transcript.js +153 -25
  70. package/lib/transcript.js.map +1 -1
  71. package/lib/ui/dock.d.ts.map +1 -1
  72. package/lib/ui/dock.js +67 -28
  73. package/lib/ui/dock.js.map +1 -1
  74. package/lib/ui/editor.d.ts +34 -0
  75. package/lib/ui/editor.d.ts.map +1 -0
  76. package/lib/ui/editor.js +98 -0
  77. package/lib/ui/editor.js.map +1 -0
  78. package/lib/ui/markdown.d.ts +8 -0
  79. package/lib/ui/markdown.d.ts.map +1 -1
  80. package/lib/ui/markdown.js +12 -0
  81. package/lib/ui/markdown.js.map +1 -1
  82. package/lib/ui/picker.d.ts +37 -0
  83. package/lib/ui/picker.d.ts.map +1 -1
  84. package/lib/ui/picker.js +53 -0
  85. package/lib/ui/picker.js.map +1 -1
  86. package/lib/ui/status.d.ts +3 -1
  87. package/lib/ui/status.d.ts.map +1 -1
  88. package/lib/ui/status.js +76 -24
  89. package/lib/ui/status.js.map +1 -1
  90. package/lib/ui/view.d.ts +43 -0
  91. package/lib/ui/view.d.ts.map +1 -1
  92. package/lib/ui/view.js +254 -54
  93. package/lib/ui/view.js.map +1 -1
  94. package/package.json +3 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-command.d.ts","sourceRoot":"","sources":["../src/theme-command.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAwCzD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,cAAc,GAAG,MAAM,EAAE,CAepE"}
@@ -0,0 +1,61 @@
1
+ import { mergeTokenSpec, PALETTE_NAMES, TUI_TOKENS } from "./theme-tokens.js";
2
+ /** A colour as the reader would see it applied, with a palette name resolved. */
3
+ function showColour(spec, palette) {
4
+ if (typeof spec === 'string' && PALETTE_NAMES.includes(spec)) {
5
+ return palette[spec];
6
+ }
7
+ return String(spec);
8
+ }
9
+ /**
10
+ * Describe one token's effective value and its origin.
11
+ *
12
+ * A settings file that does nothing looks exactly like one that works, so the
13
+ * reader needs to see which layer won: an override they wrote, the palette it
14
+ * named, or the shipped default it never touched. The value is the merged one a
15
+ * renderer would apply, not the fragment the reader happened to write.
16
+ */
17
+ function describeToken(token, overrides) {
18
+ const spec = mergeTokenSpec(token, overrides.tokens);
19
+ const fields = [];
20
+ if (spec.fg !== undefined)
21
+ fields.push(showColour(spec.fg, overrides.palette));
22
+ if (spec.bg !== undefined)
23
+ fields.push(`bg ${showColour(spec.bg, overrides.palette)}`);
24
+ for (const attribute of ['bold', 'dim', 'italic', 'underline', 'strike']) {
25
+ if (spec[attribute] === true)
26
+ fields.push(attribute);
27
+ }
28
+ if (spec.glyph !== undefined && spec.glyph !== '')
29
+ fields.push(`glyph ${JSON.stringify(spec.glyph)}`);
30
+ if (spec.hidden === true)
31
+ fields.push('hidden');
32
+ const named = typeof spec.fg === 'string' && PALETTE_NAMES.includes(spec.fg);
33
+ const source = overrides.tokens.has(token) ? 'override' : named ? 'palette' : 'default';
34
+ return { text: fields.length === 0 ? 'plain' : fields.join(' '), source };
35
+ }
36
+ /** Where the reader edits the section; the home is a variable, not a fixed path. */
37
+ const SETTINGS_HINT = 'edit $DSH_HOME/settings.yaml (default ~/.dsh/settings.yaml) under "dsh-tui:" · /theme shows the result';
38
+ /**
39
+ * The effective table, one line per element.
40
+ *
41
+ * The token name comes first because it is what the reader types into
42
+ * settings.yaml; the origin comes last because it is what explains the value
43
+ * when the value is not what they expected.
44
+ */
45
+ export function renderThemeTable(overrides) {
46
+ const lines = [`theme · ${TUI_TOKENS.length} elements`, ''];
47
+ let group = '';
48
+ for (const token of TUI_TOKENS) {
49
+ const head = token.split('.')[0] ?? token;
50
+ if (head !== group) {
51
+ group = head;
52
+ lines.push(`${group}:`);
53
+ }
54
+ const { text, source } = describeToken(token, overrides);
55
+ lines.push(` ${token} = ${text} (${source})`);
56
+ }
57
+ lines.push('', `palette: ${Object.entries(overrides.palette).map(([name, value]) => `${name} ${value}`).join(' · ')}`);
58
+ lines.push('', SETTINGS_HINT);
59
+ return lines;
60
+ }
61
+ //# sourceMappingURL=theme-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-command.js","sourceRoot":"","sources":["../src/theme-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,161 @@
1
+ import z from '@deepseek-ai/schemastery';
2
+ import { type PaletteName, type StyleSpec, type TuiToken } from './theme-tokens.ts';
3
+ /** Settings namespace owned by the terminal surface. */
4
+ export declare const TUI_SETTINGS_NAMESPACE = "dsh-tui";
5
+ /** How nested PTC calls draw: nothing beyond the card, or one indented line per dispatched call. */
6
+ export type SubCallDisplay = 'collapsed' | 'inline';
7
+ /**
8
+ * The schema the harness registers.
9
+ *
10
+ * Exported alongside the parser because registration needs a real schemastery
11
+ * schema, while reading needs the unknown-token check that a schemastery object
12
+ * cannot express.
13
+ */
14
+ export declare const TuiSettingsSchema: z<Schemastery.ObjectS<{
15
+ palette: z<Schemastery.ObjectS<{
16
+ [k: string]: z<string | number, string | number>;
17
+ }>, Schemastery.ObjectT<{
18
+ [k: string]: z<string | number, string | number>;
19
+ }>>;
20
+ tokens: z<Schemastery.ObjectS<{
21
+ [k: string]: z<Schemastery.ObjectS<{
22
+ fg: z<string | number, string | number>;
23
+ bg: z<string | number, string | number>;
24
+ bold: z<boolean, boolean>;
25
+ dim: z<boolean, boolean>;
26
+ italic: z<boolean, boolean>;
27
+ underline: z<boolean, boolean>;
28
+ strike: z<boolean, boolean>;
29
+ glyph: z<string, string>;
30
+ hidden: z<boolean, boolean>;
31
+ inherit: z<"transcript.user" | "transcript.notice" | "transcript.marker" | "transcript.reasoning.summary" | "transcript.reasoning.body" | "transcript.reasoning.hint" | "tool.title" | "tool.glyph" | "tool.args" | "tool.stat.added" | "tool.stat.changed" | "tool.stat.removed" | "tool.stat.size" | "tool.stat.separator" | "tool.detail" | "tool.hint" | "tool.failed.title" | "tool.failed.glyph" | "tool.subcall.title" | "tool.subcall.args" | "tool.diff.header" | "tool.diff.hunk" | "tool.diff.added" | "tool.diff.removed" | "tool.read.header" | "tool.read.lineNumber" | "tool.read.line" | "tool.search.path" | "tool.search.lineNumber" | "tool.search.match" | "tool.search.truncated" | "tool.terminal.cwd" | "tool.terminal.status" | "tool.terminal.output" | "tool.web.url" | "tool.web.source" | "tool.web.truncated" | "tool.generic.detail" | "markdown.heading" | "markdown.link" | "markdown.linkUrl" | "markdown.code" | "markdown.codeBlock" | "markdown.codeBlockBorder" | "markdown.quote" | "markdown.quoteBorder" | "markdown.hr" | "markdown.listBullet" | "markdown.bold" | "markdown.italic" | "markdown.strikethrough" | "markdown.underline" | "picker.title" | "picker.glyph" | "picker.note" | "picker.filter" | "picker.row" | "picker.rowCurrent" | "picker.scrollNewer" | "picker.scrollOlder" | "picker.hint" | "picker.cursor" | "gate.title" | "gate.glyphApproval" | "gate.glyphQuestion" | "gate.detail" | "gate.option" | "gate.optionCurrent" | "gate.cursor" | "gate.hint" | "dock.goal" | "dock.planMode" | "dock.todos.heading" | "dock.todos.pending" | "dock.todos.inProgress" | "dock.todos.overflow" | "dock.subagents.heading" | "dock.subagents.running" | "dock.subagents.overflow" | "dock.jobs.heading" | "dock.jobs.running" | "dock.jobs.overflow" | "status.activity.working" | "status.activity.ready" | "status.elapsed" | "status.agentPreset" | "status.model" | "status.effort" | "status.permission" | "status.context" | "status.cache" | "status.cwd" | "status.separator" | "editor.border" | "editor.selectList.selectedPrefix" | "editor.selectList.selectedText" | "editor.selectList.description" | "editor.selectList.scrollInfo" | "editor.selectList.noMatch", "transcript.user" | "transcript.notice" | "transcript.marker" | "transcript.reasoning.summary" | "transcript.reasoning.body" | "transcript.reasoning.hint" | "tool.title" | "tool.glyph" | "tool.args" | "tool.stat.added" | "tool.stat.changed" | "tool.stat.removed" | "tool.stat.size" | "tool.stat.separator" | "tool.detail" | "tool.hint" | "tool.failed.title" | "tool.failed.glyph" | "tool.subcall.title" | "tool.subcall.args" | "tool.diff.header" | "tool.diff.hunk" | "tool.diff.added" | "tool.diff.removed" | "tool.read.header" | "tool.read.lineNumber" | "tool.read.line" | "tool.search.path" | "tool.search.lineNumber" | "tool.search.match" | "tool.search.truncated" | "tool.terminal.cwd" | "tool.terminal.status" | "tool.terminal.output" | "tool.web.url" | "tool.web.source" | "tool.web.truncated" | "tool.generic.detail" | "markdown.heading" | "markdown.link" | "markdown.linkUrl" | "markdown.code" | "markdown.codeBlock" | "markdown.codeBlockBorder" | "markdown.quote" | "markdown.quoteBorder" | "markdown.hr" | "markdown.listBullet" | "markdown.bold" | "markdown.italic" | "markdown.strikethrough" | "markdown.underline" | "picker.title" | "picker.glyph" | "picker.note" | "picker.filter" | "picker.row" | "picker.rowCurrent" | "picker.scrollNewer" | "picker.scrollOlder" | "picker.hint" | "picker.cursor" | "gate.title" | "gate.glyphApproval" | "gate.glyphQuestion" | "gate.detail" | "gate.option" | "gate.optionCurrent" | "gate.cursor" | "gate.hint" | "dock.goal" | "dock.planMode" | "dock.todos.heading" | "dock.todos.pending" | "dock.todos.inProgress" | "dock.todos.overflow" | "dock.subagents.heading" | "dock.subagents.running" | "dock.subagents.overflow" | "dock.jobs.heading" | "dock.jobs.running" | "dock.jobs.overflow" | "status.activity.working" | "status.activity.ready" | "status.elapsed" | "status.agentPreset" | "status.model" | "status.effort" | "status.permission" | "status.context" | "status.cache" | "status.cwd" | "status.separator" | "editor.border" | "editor.selectList.selectedPrefix" | "editor.selectList.selectedText" | "editor.selectList.description" | "editor.selectList.scrollInfo" | "editor.selectList.noMatch">;
32
+ }>, Schemastery.ObjectT<{
33
+ fg: z<string | number, string | number>;
34
+ bg: z<string | number, string | number>;
35
+ bold: z<boolean, boolean>;
36
+ dim: z<boolean, boolean>;
37
+ italic: z<boolean, boolean>;
38
+ underline: z<boolean, boolean>;
39
+ strike: z<boolean, boolean>;
40
+ glyph: z<string, string>;
41
+ hidden: z<boolean, boolean>;
42
+ inherit: z<"transcript.user" | "transcript.notice" | "transcript.marker" | "transcript.reasoning.summary" | "transcript.reasoning.body" | "transcript.reasoning.hint" | "tool.title" | "tool.glyph" | "tool.args" | "tool.stat.added" | "tool.stat.changed" | "tool.stat.removed" | "tool.stat.size" | "tool.stat.separator" | "tool.detail" | "tool.hint" | "tool.failed.title" | "tool.failed.glyph" | "tool.subcall.title" | "tool.subcall.args" | "tool.diff.header" | "tool.diff.hunk" | "tool.diff.added" | "tool.diff.removed" | "tool.read.header" | "tool.read.lineNumber" | "tool.read.line" | "tool.search.path" | "tool.search.lineNumber" | "tool.search.match" | "tool.search.truncated" | "tool.terminal.cwd" | "tool.terminal.status" | "tool.terminal.output" | "tool.web.url" | "tool.web.source" | "tool.web.truncated" | "tool.generic.detail" | "markdown.heading" | "markdown.link" | "markdown.linkUrl" | "markdown.code" | "markdown.codeBlock" | "markdown.codeBlockBorder" | "markdown.quote" | "markdown.quoteBorder" | "markdown.hr" | "markdown.listBullet" | "markdown.bold" | "markdown.italic" | "markdown.strikethrough" | "markdown.underline" | "picker.title" | "picker.glyph" | "picker.note" | "picker.filter" | "picker.row" | "picker.rowCurrent" | "picker.scrollNewer" | "picker.scrollOlder" | "picker.hint" | "picker.cursor" | "gate.title" | "gate.glyphApproval" | "gate.glyphQuestion" | "gate.detail" | "gate.option" | "gate.optionCurrent" | "gate.cursor" | "gate.hint" | "dock.goal" | "dock.planMode" | "dock.todos.heading" | "dock.todos.pending" | "dock.todos.inProgress" | "dock.todos.overflow" | "dock.subagents.heading" | "dock.subagents.running" | "dock.subagents.overflow" | "dock.jobs.heading" | "dock.jobs.running" | "dock.jobs.overflow" | "status.activity.working" | "status.activity.ready" | "status.elapsed" | "status.agentPreset" | "status.model" | "status.effort" | "status.permission" | "status.context" | "status.cache" | "status.cwd" | "status.separator" | "editor.border" | "editor.selectList.selectedPrefix" | "editor.selectList.selectedText" | "editor.selectList.description" | "editor.selectList.scrollInfo" | "editor.selectList.noMatch", "transcript.user" | "transcript.notice" | "transcript.marker" | "transcript.reasoning.summary" | "transcript.reasoning.body" | "transcript.reasoning.hint" | "tool.title" | "tool.glyph" | "tool.args" | "tool.stat.added" | "tool.stat.changed" | "tool.stat.removed" | "tool.stat.size" | "tool.stat.separator" | "tool.detail" | "tool.hint" | "tool.failed.title" | "tool.failed.glyph" | "tool.subcall.title" | "tool.subcall.args" | "tool.diff.header" | "tool.diff.hunk" | "tool.diff.added" | "tool.diff.removed" | "tool.read.header" | "tool.read.lineNumber" | "tool.read.line" | "tool.search.path" | "tool.search.lineNumber" | "tool.search.match" | "tool.search.truncated" | "tool.terminal.cwd" | "tool.terminal.status" | "tool.terminal.output" | "tool.web.url" | "tool.web.source" | "tool.web.truncated" | "tool.generic.detail" | "markdown.heading" | "markdown.link" | "markdown.linkUrl" | "markdown.code" | "markdown.codeBlock" | "markdown.codeBlockBorder" | "markdown.quote" | "markdown.quoteBorder" | "markdown.hr" | "markdown.listBullet" | "markdown.bold" | "markdown.italic" | "markdown.strikethrough" | "markdown.underline" | "picker.title" | "picker.glyph" | "picker.note" | "picker.filter" | "picker.row" | "picker.rowCurrent" | "picker.scrollNewer" | "picker.scrollOlder" | "picker.hint" | "picker.cursor" | "gate.title" | "gate.glyphApproval" | "gate.glyphQuestion" | "gate.detail" | "gate.option" | "gate.optionCurrent" | "gate.cursor" | "gate.hint" | "dock.goal" | "dock.planMode" | "dock.todos.heading" | "dock.todos.pending" | "dock.todos.inProgress" | "dock.todos.overflow" | "dock.subagents.heading" | "dock.subagents.running" | "dock.subagents.overflow" | "dock.jobs.heading" | "dock.jobs.running" | "dock.jobs.overflow" | "status.activity.working" | "status.activity.ready" | "status.elapsed" | "status.agentPreset" | "status.model" | "status.effort" | "status.permission" | "status.context" | "status.cache" | "status.cwd" | "status.separator" | "editor.border" | "editor.selectList.selectedPrefix" | "editor.selectList.selectedText" | "editor.selectList.description" | "editor.selectList.scrollInfo" | "editor.selectList.noMatch">;
43
+ }>>;
44
+ }>, Schemastery.ObjectT<{
45
+ [k: string]: z<Schemastery.ObjectS<{
46
+ fg: z<string | number, string | number>;
47
+ bg: z<string | number, string | number>;
48
+ bold: z<boolean, boolean>;
49
+ dim: z<boolean, boolean>;
50
+ italic: z<boolean, boolean>;
51
+ underline: z<boolean, boolean>;
52
+ strike: z<boolean, boolean>;
53
+ glyph: z<string, string>;
54
+ hidden: z<boolean, boolean>;
55
+ inherit: z<"transcript.user" | "transcript.notice" | "transcript.marker" | "transcript.reasoning.summary" | "transcript.reasoning.body" | "transcript.reasoning.hint" | "tool.title" | "tool.glyph" | "tool.args" | "tool.stat.added" | "tool.stat.changed" | "tool.stat.removed" | "tool.stat.size" | "tool.stat.separator" | "tool.detail" | "tool.hint" | "tool.failed.title" | "tool.failed.glyph" | "tool.subcall.title" | "tool.subcall.args" | "tool.diff.header" | "tool.diff.hunk" | "tool.diff.added" | "tool.diff.removed" | "tool.read.header" | "tool.read.lineNumber" | "tool.read.line" | "tool.search.path" | "tool.search.lineNumber" | "tool.search.match" | "tool.search.truncated" | "tool.terminal.cwd" | "tool.terminal.status" | "tool.terminal.output" | "tool.web.url" | "tool.web.source" | "tool.web.truncated" | "tool.generic.detail" | "markdown.heading" | "markdown.link" | "markdown.linkUrl" | "markdown.code" | "markdown.codeBlock" | "markdown.codeBlockBorder" | "markdown.quote" | "markdown.quoteBorder" | "markdown.hr" | "markdown.listBullet" | "markdown.bold" | "markdown.italic" | "markdown.strikethrough" | "markdown.underline" | "picker.title" | "picker.glyph" | "picker.note" | "picker.filter" | "picker.row" | "picker.rowCurrent" | "picker.scrollNewer" | "picker.scrollOlder" | "picker.hint" | "picker.cursor" | "gate.title" | "gate.glyphApproval" | "gate.glyphQuestion" | "gate.detail" | "gate.option" | "gate.optionCurrent" | "gate.cursor" | "gate.hint" | "dock.goal" | "dock.planMode" | "dock.todos.heading" | "dock.todos.pending" | "dock.todos.inProgress" | "dock.todos.overflow" | "dock.subagents.heading" | "dock.subagents.running" | "dock.subagents.overflow" | "dock.jobs.heading" | "dock.jobs.running" | "dock.jobs.overflow" | "status.activity.working" | "status.activity.ready" | "status.elapsed" | "status.agentPreset" | "status.model" | "status.effort" | "status.permission" | "status.context" | "status.cache" | "status.cwd" | "status.separator" | "editor.border" | "editor.selectList.selectedPrefix" | "editor.selectList.selectedText" | "editor.selectList.description" | "editor.selectList.scrollInfo" | "editor.selectList.noMatch", "transcript.user" | "transcript.notice" | "transcript.marker" | "transcript.reasoning.summary" | "transcript.reasoning.body" | "transcript.reasoning.hint" | "tool.title" | "tool.glyph" | "tool.args" | "tool.stat.added" | "tool.stat.changed" | "tool.stat.removed" | "tool.stat.size" | "tool.stat.separator" | "tool.detail" | "tool.hint" | "tool.failed.title" | "tool.failed.glyph" | "tool.subcall.title" | "tool.subcall.args" | "tool.diff.header" | "tool.diff.hunk" | "tool.diff.added" | "tool.diff.removed" | "tool.read.header" | "tool.read.lineNumber" | "tool.read.line" | "tool.search.path" | "tool.search.lineNumber" | "tool.search.match" | "tool.search.truncated" | "tool.terminal.cwd" | "tool.terminal.status" | "tool.terminal.output" | "tool.web.url" | "tool.web.source" | "tool.web.truncated" | "tool.generic.detail" | "markdown.heading" | "markdown.link" | "markdown.linkUrl" | "markdown.code" | "markdown.codeBlock" | "markdown.codeBlockBorder" | "markdown.quote" | "markdown.quoteBorder" | "markdown.hr" | "markdown.listBullet" | "markdown.bold" | "markdown.italic" | "markdown.strikethrough" | "markdown.underline" | "picker.title" | "picker.glyph" | "picker.note" | "picker.filter" | "picker.row" | "picker.rowCurrent" | "picker.scrollNewer" | "picker.scrollOlder" | "picker.hint" | "picker.cursor" | "gate.title" | "gate.glyphApproval" | "gate.glyphQuestion" | "gate.detail" | "gate.option" | "gate.optionCurrent" | "gate.cursor" | "gate.hint" | "dock.goal" | "dock.planMode" | "dock.todos.heading" | "dock.todos.pending" | "dock.todos.inProgress" | "dock.todos.overflow" | "dock.subagents.heading" | "dock.subagents.running" | "dock.subagents.overflow" | "dock.jobs.heading" | "dock.jobs.running" | "dock.jobs.overflow" | "status.activity.working" | "status.activity.ready" | "status.elapsed" | "status.agentPreset" | "status.model" | "status.effort" | "status.permission" | "status.context" | "status.cache" | "status.cwd" | "status.separator" | "editor.border" | "editor.selectList.selectedPrefix" | "editor.selectList.selectedText" | "editor.selectList.description" | "editor.selectList.scrollInfo" | "editor.selectList.noMatch">;
56
+ }>, Schemastery.ObjectT<{
57
+ fg: z<string | number, string | number>;
58
+ bg: z<string | number, string | number>;
59
+ bold: z<boolean, boolean>;
60
+ dim: z<boolean, boolean>;
61
+ italic: z<boolean, boolean>;
62
+ underline: z<boolean, boolean>;
63
+ strike: z<boolean, boolean>;
64
+ glyph: z<string, string>;
65
+ hidden: z<boolean, boolean>;
66
+ inherit: z<"transcript.user" | "transcript.notice" | "transcript.marker" | "transcript.reasoning.summary" | "transcript.reasoning.body" | "transcript.reasoning.hint" | "tool.title" | "tool.glyph" | "tool.args" | "tool.stat.added" | "tool.stat.changed" | "tool.stat.removed" | "tool.stat.size" | "tool.stat.separator" | "tool.detail" | "tool.hint" | "tool.failed.title" | "tool.failed.glyph" | "tool.subcall.title" | "tool.subcall.args" | "tool.diff.header" | "tool.diff.hunk" | "tool.diff.added" | "tool.diff.removed" | "tool.read.header" | "tool.read.lineNumber" | "tool.read.line" | "tool.search.path" | "tool.search.lineNumber" | "tool.search.match" | "tool.search.truncated" | "tool.terminal.cwd" | "tool.terminal.status" | "tool.terminal.output" | "tool.web.url" | "tool.web.source" | "tool.web.truncated" | "tool.generic.detail" | "markdown.heading" | "markdown.link" | "markdown.linkUrl" | "markdown.code" | "markdown.codeBlock" | "markdown.codeBlockBorder" | "markdown.quote" | "markdown.quoteBorder" | "markdown.hr" | "markdown.listBullet" | "markdown.bold" | "markdown.italic" | "markdown.strikethrough" | "markdown.underline" | "picker.title" | "picker.glyph" | "picker.note" | "picker.filter" | "picker.row" | "picker.rowCurrent" | "picker.scrollNewer" | "picker.scrollOlder" | "picker.hint" | "picker.cursor" | "gate.title" | "gate.glyphApproval" | "gate.glyphQuestion" | "gate.detail" | "gate.option" | "gate.optionCurrent" | "gate.cursor" | "gate.hint" | "dock.goal" | "dock.planMode" | "dock.todos.heading" | "dock.todos.pending" | "dock.todos.inProgress" | "dock.todos.overflow" | "dock.subagents.heading" | "dock.subagents.running" | "dock.subagents.overflow" | "dock.jobs.heading" | "dock.jobs.running" | "dock.jobs.overflow" | "status.activity.working" | "status.activity.ready" | "status.elapsed" | "status.agentPreset" | "status.model" | "status.effort" | "status.permission" | "status.context" | "status.cache" | "status.cwd" | "status.separator" | "editor.border" | "editor.selectList.selectedPrefix" | "editor.selectList.selectedText" | "editor.selectList.description" | "editor.selectList.scrollInfo" | "editor.selectList.noMatch", "transcript.user" | "transcript.notice" | "transcript.marker" | "transcript.reasoning.summary" | "transcript.reasoning.body" | "transcript.reasoning.hint" | "tool.title" | "tool.glyph" | "tool.args" | "tool.stat.added" | "tool.stat.changed" | "tool.stat.removed" | "tool.stat.size" | "tool.stat.separator" | "tool.detail" | "tool.hint" | "tool.failed.title" | "tool.failed.glyph" | "tool.subcall.title" | "tool.subcall.args" | "tool.diff.header" | "tool.diff.hunk" | "tool.diff.added" | "tool.diff.removed" | "tool.read.header" | "tool.read.lineNumber" | "tool.read.line" | "tool.search.path" | "tool.search.lineNumber" | "tool.search.match" | "tool.search.truncated" | "tool.terminal.cwd" | "tool.terminal.status" | "tool.terminal.output" | "tool.web.url" | "tool.web.source" | "tool.web.truncated" | "tool.generic.detail" | "markdown.heading" | "markdown.link" | "markdown.linkUrl" | "markdown.code" | "markdown.codeBlock" | "markdown.codeBlockBorder" | "markdown.quote" | "markdown.quoteBorder" | "markdown.hr" | "markdown.listBullet" | "markdown.bold" | "markdown.italic" | "markdown.strikethrough" | "markdown.underline" | "picker.title" | "picker.glyph" | "picker.note" | "picker.filter" | "picker.row" | "picker.rowCurrent" | "picker.scrollNewer" | "picker.scrollOlder" | "picker.hint" | "picker.cursor" | "gate.title" | "gate.glyphApproval" | "gate.glyphQuestion" | "gate.detail" | "gate.option" | "gate.optionCurrent" | "gate.cursor" | "gate.hint" | "dock.goal" | "dock.planMode" | "dock.todos.heading" | "dock.todos.pending" | "dock.todos.inProgress" | "dock.todos.overflow" | "dock.subagents.heading" | "dock.subagents.running" | "dock.subagents.overflow" | "dock.jobs.heading" | "dock.jobs.running" | "dock.jobs.overflow" | "status.activity.working" | "status.activity.ready" | "status.elapsed" | "status.agentPreset" | "status.model" | "status.effort" | "status.permission" | "status.context" | "status.cache" | "status.cwd" | "status.separator" | "editor.border" | "editor.selectList.selectedPrefix" | "editor.selectList.selectedText" | "editor.selectList.description" | "editor.selectList.scrollInfo" | "editor.selectList.noMatch">;
67
+ }>>;
68
+ }>>;
69
+ subcalls: z<"collapsed" | "inline", "collapsed" | "inline">;
70
+ }>, Schemastery.ObjectT<{
71
+ palette: z<Schemastery.ObjectS<{
72
+ [k: string]: z<string | number, string | number>;
73
+ }>, Schemastery.ObjectT<{
74
+ [k: string]: z<string | number, string | number>;
75
+ }>>;
76
+ tokens: z<Schemastery.ObjectS<{
77
+ [k: string]: z<Schemastery.ObjectS<{
78
+ fg: z<string | number, string | number>;
79
+ bg: z<string | number, string | number>;
80
+ bold: z<boolean, boolean>;
81
+ dim: z<boolean, boolean>;
82
+ italic: z<boolean, boolean>;
83
+ underline: z<boolean, boolean>;
84
+ strike: z<boolean, boolean>;
85
+ glyph: z<string, string>;
86
+ hidden: z<boolean, boolean>;
87
+ inherit: z<"transcript.user" | "transcript.notice" | "transcript.marker" | "transcript.reasoning.summary" | "transcript.reasoning.body" | "transcript.reasoning.hint" | "tool.title" | "tool.glyph" | "tool.args" | "tool.stat.added" | "tool.stat.changed" | "tool.stat.removed" | "tool.stat.size" | "tool.stat.separator" | "tool.detail" | "tool.hint" | "tool.failed.title" | "tool.failed.glyph" | "tool.subcall.title" | "tool.subcall.args" | "tool.diff.header" | "tool.diff.hunk" | "tool.diff.added" | "tool.diff.removed" | "tool.read.header" | "tool.read.lineNumber" | "tool.read.line" | "tool.search.path" | "tool.search.lineNumber" | "tool.search.match" | "tool.search.truncated" | "tool.terminal.cwd" | "tool.terminal.status" | "tool.terminal.output" | "tool.web.url" | "tool.web.source" | "tool.web.truncated" | "tool.generic.detail" | "markdown.heading" | "markdown.link" | "markdown.linkUrl" | "markdown.code" | "markdown.codeBlock" | "markdown.codeBlockBorder" | "markdown.quote" | "markdown.quoteBorder" | "markdown.hr" | "markdown.listBullet" | "markdown.bold" | "markdown.italic" | "markdown.strikethrough" | "markdown.underline" | "picker.title" | "picker.glyph" | "picker.note" | "picker.filter" | "picker.row" | "picker.rowCurrent" | "picker.scrollNewer" | "picker.scrollOlder" | "picker.hint" | "picker.cursor" | "gate.title" | "gate.glyphApproval" | "gate.glyphQuestion" | "gate.detail" | "gate.option" | "gate.optionCurrent" | "gate.cursor" | "gate.hint" | "dock.goal" | "dock.planMode" | "dock.todos.heading" | "dock.todos.pending" | "dock.todos.inProgress" | "dock.todos.overflow" | "dock.subagents.heading" | "dock.subagents.running" | "dock.subagents.overflow" | "dock.jobs.heading" | "dock.jobs.running" | "dock.jobs.overflow" | "status.activity.working" | "status.activity.ready" | "status.elapsed" | "status.agentPreset" | "status.model" | "status.effort" | "status.permission" | "status.context" | "status.cache" | "status.cwd" | "status.separator" | "editor.border" | "editor.selectList.selectedPrefix" | "editor.selectList.selectedText" | "editor.selectList.description" | "editor.selectList.scrollInfo" | "editor.selectList.noMatch", "transcript.user" | "transcript.notice" | "transcript.marker" | "transcript.reasoning.summary" | "transcript.reasoning.body" | "transcript.reasoning.hint" | "tool.title" | "tool.glyph" | "tool.args" | "tool.stat.added" | "tool.stat.changed" | "tool.stat.removed" | "tool.stat.size" | "tool.stat.separator" | "tool.detail" | "tool.hint" | "tool.failed.title" | "tool.failed.glyph" | "tool.subcall.title" | "tool.subcall.args" | "tool.diff.header" | "tool.diff.hunk" | "tool.diff.added" | "tool.diff.removed" | "tool.read.header" | "tool.read.lineNumber" | "tool.read.line" | "tool.search.path" | "tool.search.lineNumber" | "tool.search.match" | "tool.search.truncated" | "tool.terminal.cwd" | "tool.terminal.status" | "tool.terminal.output" | "tool.web.url" | "tool.web.source" | "tool.web.truncated" | "tool.generic.detail" | "markdown.heading" | "markdown.link" | "markdown.linkUrl" | "markdown.code" | "markdown.codeBlock" | "markdown.codeBlockBorder" | "markdown.quote" | "markdown.quoteBorder" | "markdown.hr" | "markdown.listBullet" | "markdown.bold" | "markdown.italic" | "markdown.strikethrough" | "markdown.underline" | "picker.title" | "picker.glyph" | "picker.note" | "picker.filter" | "picker.row" | "picker.rowCurrent" | "picker.scrollNewer" | "picker.scrollOlder" | "picker.hint" | "picker.cursor" | "gate.title" | "gate.glyphApproval" | "gate.glyphQuestion" | "gate.detail" | "gate.option" | "gate.optionCurrent" | "gate.cursor" | "gate.hint" | "dock.goal" | "dock.planMode" | "dock.todos.heading" | "dock.todos.pending" | "dock.todos.inProgress" | "dock.todos.overflow" | "dock.subagents.heading" | "dock.subagents.running" | "dock.subagents.overflow" | "dock.jobs.heading" | "dock.jobs.running" | "dock.jobs.overflow" | "status.activity.working" | "status.activity.ready" | "status.elapsed" | "status.agentPreset" | "status.model" | "status.effort" | "status.permission" | "status.context" | "status.cache" | "status.cwd" | "status.separator" | "editor.border" | "editor.selectList.selectedPrefix" | "editor.selectList.selectedText" | "editor.selectList.description" | "editor.selectList.scrollInfo" | "editor.selectList.noMatch">;
88
+ }>, Schemastery.ObjectT<{
89
+ fg: z<string | number, string | number>;
90
+ bg: z<string | number, string | number>;
91
+ bold: z<boolean, boolean>;
92
+ dim: z<boolean, boolean>;
93
+ italic: z<boolean, boolean>;
94
+ underline: z<boolean, boolean>;
95
+ strike: z<boolean, boolean>;
96
+ glyph: z<string, string>;
97
+ hidden: z<boolean, boolean>;
98
+ inherit: z<"transcript.user" | "transcript.notice" | "transcript.marker" | "transcript.reasoning.summary" | "transcript.reasoning.body" | "transcript.reasoning.hint" | "tool.title" | "tool.glyph" | "tool.args" | "tool.stat.added" | "tool.stat.changed" | "tool.stat.removed" | "tool.stat.size" | "tool.stat.separator" | "tool.detail" | "tool.hint" | "tool.failed.title" | "tool.failed.glyph" | "tool.subcall.title" | "tool.subcall.args" | "tool.diff.header" | "tool.diff.hunk" | "tool.diff.added" | "tool.diff.removed" | "tool.read.header" | "tool.read.lineNumber" | "tool.read.line" | "tool.search.path" | "tool.search.lineNumber" | "tool.search.match" | "tool.search.truncated" | "tool.terminal.cwd" | "tool.terminal.status" | "tool.terminal.output" | "tool.web.url" | "tool.web.source" | "tool.web.truncated" | "tool.generic.detail" | "markdown.heading" | "markdown.link" | "markdown.linkUrl" | "markdown.code" | "markdown.codeBlock" | "markdown.codeBlockBorder" | "markdown.quote" | "markdown.quoteBorder" | "markdown.hr" | "markdown.listBullet" | "markdown.bold" | "markdown.italic" | "markdown.strikethrough" | "markdown.underline" | "picker.title" | "picker.glyph" | "picker.note" | "picker.filter" | "picker.row" | "picker.rowCurrent" | "picker.scrollNewer" | "picker.scrollOlder" | "picker.hint" | "picker.cursor" | "gate.title" | "gate.glyphApproval" | "gate.glyphQuestion" | "gate.detail" | "gate.option" | "gate.optionCurrent" | "gate.cursor" | "gate.hint" | "dock.goal" | "dock.planMode" | "dock.todos.heading" | "dock.todos.pending" | "dock.todos.inProgress" | "dock.todos.overflow" | "dock.subagents.heading" | "dock.subagents.running" | "dock.subagents.overflow" | "dock.jobs.heading" | "dock.jobs.running" | "dock.jobs.overflow" | "status.activity.working" | "status.activity.ready" | "status.elapsed" | "status.agentPreset" | "status.model" | "status.effort" | "status.permission" | "status.context" | "status.cache" | "status.cwd" | "status.separator" | "editor.border" | "editor.selectList.selectedPrefix" | "editor.selectList.selectedText" | "editor.selectList.description" | "editor.selectList.scrollInfo" | "editor.selectList.noMatch", "transcript.user" | "transcript.notice" | "transcript.marker" | "transcript.reasoning.summary" | "transcript.reasoning.body" | "transcript.reasoning.hint" | "tool.title" | "tool.glyph" | "tool.args" | "tool.stat.added" | "tool.stat.changed" | "tool.stat.removed" | "tool.stat.size" | "tool.stat.separator" | "tool.detail" | "tool.hint" | "tool.failed.title" | "tool.failed.glyph" | "tool.subcall.title" | "tool.subcall.args" | "tool.diff.header" | "tool.diff.hunk" | "tool.diff.added" | "tool.diff.removed" | "tool.read.header" | "tool.read.lineNumber" | "tool.read.line" | "tool.search.path" | "tool.search.lineNumber" | "tool.search.match" | "tool.search.truncated" | "tool.terminal.cwd" | "tool.terminal.status" | "tool.terminal.output" | "tool.web.url" | "tool.web.source" | "tool.web.truncated" | "tool.generic.detail" | "markdown.heading" | "markdown.link" | "markdown.linkUrl" | "markdown.code" | "markdown.codeBlock" | "markdown.codeBlockBorder" | "markdown.quote" | "markdown.quoteBorder" | "markdown.hr" | "markdown.listBullet" | "markdown.bold" | "markdown.italic" | "markdown.strikethrough" | "markdown.underline" | "picker.title" | "picker.glyph" | "picker.note" | "picker.filter" | "picker.row" | "picker.rowCurrent" | "picker.scrollNewer" | "picker.scrollOlder" | "picker.hint" | "picker.cursor" | "gate.title" | "gate.glyphApproval" | "gate.glyphQuestion" | "gate.detail" | "gate.option" | "gate.optionCurrent" | "gate.cursor" | "gate.hint" | "dock.goal" | "dock.planMode" | "dock.todos.heading" | "dock.todos.pending" | "dock.todos.inProgress" | "dock.todos.overflow" | "dock.subagents.heading" | "dock.subagents.running" | "dock.subagents.overflow" | "dock.jobs.heading" | "dock.jobs.running" | "dock.jobs.overflow" | "status.activity.working" | "status.activity.ready" | "status.elapsed" | "status.agentPreset" | "status.model" | "status.effort" | "status.permission" | "status.context" | "status.cache" | "status.cwd" | "status.separator" | "editor.border" | "editor.selectList.selectedPrefix" | "editor.selectList.selectedText" | "editor.selectList.description" | "editor.selectList.scrollInfo" | "editor.selectList.noMatch">;
99
+ }>>;
100
+ }>, Schemastery.ObjectT<{
101
+ [k: string]: z<Schemastery.ObjectS<{
102
+ fg: z<string | number, string | number>;
103
+ bg: z<string | number, string | number>;
104
+ bold: z<boolean, boolean>;
105
+ dim: z<boolean, boolean>;
106
+ italic: z<boolean, boolean>;
107
+ underline: z<boolean, boolean>;
108
+ strike: z<boolean, boolean>;
109
+ glyph: z<string, string>;
110
+ hidden: z<boolean, boolean>;
111
+ inherit: z<"transcript.user" | "transcript.notice" | "transcript.marker" | "transcript.reasoning.summary" | "transcript.reasoning.body" | "transcript.reasoning.hint" | "tool.title" | "tool.glyph" | "tool.args" | "tool.stat.added" | "tool.stat.changed" | "tool.stat.removed" | "tool.stat.size" | "tool.stat.separator" | "tool.detail" | "tool.hint" | "tool.failed.title" | "tool.failed.glyph" | "tool.subcall.title" | "tool.subcall.args" | "tool.diff.header" | "tool.diff.hunk" | "tool.diff.added" | "tool.diff.removed" | "tool.read.header" | "tool.read.lineNumber" | "tool.read.line" | "tool.search.path" | "tool.search.lineNumber" | "tool.search.match" | "tool.search.truncated" | "tool.terminal.cwd" | "tool.terminal.status" | "tool.terminal.output" | "tool.web.url" | "tool.web.source" | "tool.web.truncated" | "tool.generic.detail" | "markdown.heading" | "markdown.link" | "markdown.linkUrl" | "markdown.code" | "markdown.codeBlock" | "markdown.codeBlockBorder" | "markdown.quote" | "markdown.quoteBorder" | "markdown.hr" | "markdown.listBullet" | "markdown.bold" | "markdown.italic" | "markdown.strikethrough" | "markdown.underline" | "picker.title" | "picker.glyph" | "picker.note" | "picker.filter" | "picker.row" | "picker.rowCurrent" | "picker.scrollNewer" | "picker.scrollOlder" | "picker.hint" | "picker.cursor" | "gate.title" | "gate.glyphApproval" | "gate.glyphQuestion" | "gate.detail" | "gate.option" | "gate.optionCurrent" | "gate.cursor" | "gate.hint" | "dock.goal" | "dock.planMode" | "dock.todos.heading" | "dock.todos.pending" | "dock.todos.inProgress" | "dock.todos.overflow" | "dock.subagents.heading" | "dock.subagents.running" | "dock.subagents.overflow" | "dock.jobs.heading" | "dock.jobs.running" | "dock.jobs.overflow" | "status.activity.working" | "status.activity.ready" | "status.elapsed" | "status.agentPreset" | "status.model" | "status.effort" | "status.permission" | "status.context" | "status.cache" | "status.cwd" | "status.separator" | "editor.border" | "editor.selectList.selectedPrefix" | "editor.selectList.selectedText" | "editor.selectList.description" | "editor.selectList.scrollInfo" | "editor.selectList.noMatch", "transcript.user" | "transcript.notice" | "transcript.marker" | "transcript.reasoning.summary" | "transcript.reasoning.body" | "transcript.reasoning.hint" | "tool.title" | "tool.glyph" | "tool.args" | "tool.stat.added" | "tool.stat.changed" | "tool.stat.removed" | "tool.stat.size" | "tool.stat.separator" | "tool.detail" | "tool.hint" | "tool.failed.title" | "tool.failed.glyph" | "tool.subcall.title" | "tool.subcall.args" | "tool.diff.header" | "tool.diff.hunk" | "tool.diff.added" | "tool.diff.removed" | "tool.read.header" | "tool.read.lineNumber" | "tool.read.line" | "tool.search.path" | "tool.search.lineNumber" | "tool.search.match" | "tool.search.truncated" | "tool.terminal.cwd" | "tool.terminal.status" | "tool.terminal.output" | "tool.web.url" | "tool.web.source" | "tool.web.truncated" | "tool.generic.detail" | "markdown.heading" | "markdown.link" | "markdown.linkUrl" | "markdown.code" | "markdown.codeBlock" | "markdown.codeBlockBorder" | "markdown.quote" | "markdown.quoteBorder" | "markdown.hr" | "markdown.listBullet" | "markdown.bold" | "markdown.italic" | "markdown.strikethrough" | "markdown.underline" | "picker.title" | "picker.glyph" | "picker.note" | "picker.filter" | "picker.row" | "picker.rowCurrent" | "picker.scrollNewer" | "picker.scrollOlder" | "picker.hint" | "picker.cursor" | "gate.title" | "gate.glyphApproval" | "gate.glyphQuestion" | "gate.detail" | "gate.option" | "gate.optionCurrent" | "gate.cursor" | "gate.hint" | "dock.goal" | "dock.planMode" | "dock.todos.heading" | "dock.todos.pending" | "dock.todos.inProgress" | "dock.todos.overflow" | "dock.subagents.heading" | "dock.subagents.running" | "dock.subagents.overflow" | "dock.jobs.heading" | "dock.jobs.running" | "dock.jobs.overflow" | "status.activity.working" | "status.activity.ready" | "status.elapsed" | "status.agentPreset" | "status.model" | "status.effort" | "status.permission" | "status.context" | "status.cache" | "status.cwd" | "status.separator" | "editor.border" | "editor.selectList.selectedPrefix" | "editor.selectList.selectedText" | "editor.selectList.description" | "editor.selectList.scrollInfo" | "editor.selectList.noMatch">;
112
+ }>, Schemastery.ObjectT<{
113
+ fg: z<string | number, string | number>;
114
+ bg: z<string | number, string | number>;
115
+ bold: z<boolean, boolean>;
116
+ dim: z<boolean, boolean>;
117
+ italic: z<boolean, boolean>;
118
+ underline: z<boolean, boolean>;
119
+ strike: z<boolean, boolean>;
120
+ glyph: z<string, string>;
121
+ hidden: z<boolean, boolean>;
122
+ inherit: z<"transcript.user" | "transcript.notice" | "transcript.marker" | "transcript.reasoning.summary" | "transcript.reasoning.body" | "transcript.reasoning.hint" | "tool.title" | "tool.glyph" | "tool.args" | "tool.stat.added" | "tool.stat.changed" | "tool.stat.removed" | "tool.stat.size" | "tool.stat.separator" | "tool.detail" | "tool.hint" | "tool.failed.title" | "tool.failed.glyph" | "tool.subcall.title" | "tool.subcall.args" | "tool.diff.header" | "tool.diff.hunk" | "tool.diff.added" | "tool.diff.removed" | "tool.read.header" | "tool.read.lineNumber" | "tool.read.line" | "tool.search.path" | "tool.search.lineNumber" | "tool.search.match" | "tool.search.truncated" | "tool.terminal.cwd" | "tool.terminal.status" | "tool.terminal.output" | "tool.web.url" | "tool.web.source" | "tool.web.truncated" | "tool.generic.detail" | "markdown.heading" | "markdown.link" | "markdown.linkUrl" | "markdown.code" | "markdown.codeBlock" | "markdown.codeBlockBorder" | "markdown.quote" | "markdown.quoteBorder" | "markdown.hr" | "markdown.listBullet" | "markdown.bold" | "markdown.italic" | "markdown.strikethrough" | "markdown.underline" | "picker.title" | "picker.glyph" | "picker.note" | "picker.filter" | "picker.row" | "picker.rowCurrent" | "picker.scrollNewer" | "picker.scrollOlder" | "picker.hint" | "picker.cursor" | "gate.title" | "gate.glyphApproval" | "gate.glyphQuestion" | "gate.detail" | "gate.option" | "gate.optionCurrent" | "gate.cursor" | "gate.hint" | "dock.goal" | "dock.planMode" | "dock.todos.heading" | "dock.todos.pending" | "dock.todos.inProgress" | "dock.todos.overflow" | "dock.subagents.heading" | "dock.subagents.running" | "dock.subagents.overflow" | "dock.jobs.heading" | "dock.jobs.running" | "dock.jobs.overflow" | "status.activity.working" | "status.activity.ready" | "status.elapsed" | "status.agentPreset" | "status.model" | "status.effort" | "status.permission" | "status.context" | "status.cache" | "status.cwd" | "status.separator" | "editor.border" | "editor.selectList.selectedPrefix" | "editor.selectList.selectedText" | "editor.selectList.description" | "editor.selectList.scrollInfo" | "editor.selectList.noMatch", "transcript.user" | "transcript.notice" | "transcript.marker" | "transcript.reasoning.summary" | "transcript.reasoning.body" | "transcript.reasoning.hint" | "tool.title" | "tool.glyph" | "tool.args" | "tool.stat.added" | "tool.stat.changed" | "tool.stat.removed" | "tool.stat.size" | "tool.stat.separator" | "tool.detail" | "tool.hint" | "tool.failed.title" | "tool.failed.glyph" | "tool.subcall.title" | "tool.subcall.args" | "tool.diff.header" | "tool.diff.hunk" | "tool.diff.added" | "tool.diff.removed" | "tool.read.header" | "tool.read.lineNumber" | "tool.read.line" | "tool.search.path" | "tool.search.lineNumber" | "tool.search.match" | "tool.search.truncated" | "tool.terminal.cwd" | "tool.terminal.status" | "tool.terminal.output" | "tool.web.url" | "tool.web.source" | "tool.web.truncated" | "tool.generic.detail" | "markdown.heading" | "markdown.link" | "markdown.linkUrl" | "markdown.code" | "markdown.codeBlock" | "markdown.codeBlockBorder" | "markdown.quote" | "markdown.quoteBorder" | "markdown.hr" | "markdown.listBullet" | "markdown.bold" | "markdown.italic" | "markdown.strikethrough" | "markdown.underline" | "picker.title" | "picker.glyph" | "picker.note" | "picker.filter" | "picker.row" | "picker.rowCurrent" | "picker.scrollNewer" | "picker.scrollOlder" | "picker.hint" | "picker.cursor" | "gate.title" | "gate.glyphApproval" | "gate.glyphQuestion" | "gate.detail" | "gate.option" | "gate.optionCurrent" | "gate.cursor" | "gate.hint" | "dock.goal" | "dock.planMode" | "dock.todos.heading" | "dock.todos.pending" | "dock.todos.inProgress" | "dock.todos.overflow" | "dock.subagents.heading" | "dock.subagents.running" | "dock.subagents.overflow" | "dock.jobs.heading" | "dock.jobs.running" | "dock.jobs.overflow" | "status.activity.working" | "status.activity.ready" | "status.elapsed" | "status.agentPreset" | "status.model" | "status.effort" | "status.permission" | "status.context" | "status.cache" | "status.cwd" | "status.separator" | "editor.border" | "editor.selectList.selectedPrefix" | "editor.selectList.selectedText" | "editor.selectList.description" | "editor.selectList.scrollInfo" | "editor.selectList.noMatch">;
123
+ }>>;
124
+ }>>;
125
+ subcalls: z<"collapsed" | "inline", "collapsed" | "inline">;
126
+ }>>;
127
+ /** The reader-facing shape of the `dsh-tui:` section. */
128
+ export declare function parseSettings(raw: unknown): TuiSettings;
129
+ /** What the section holds once parsed: only what the reader wrote. */
130
+ export interface TuiSettings {
131
+ readonly palette: Readonly<Partial<Record<PaletteName, string>>>;
132
+ readonly tokens: Readonly<Partial<Record<TuiToken, StyleSpec>>>;
133
+ readonly subcalls: SubCallDisplay;
134
+ }
135
+ /** The section as it reads when the reader has written nothing. */
136
+ export declare function defaultSettings(): TuiSettings;
137
+ /** The theme inputs a parsed section implies. */
138
+ export interface ThemeOverrides {
139
+ readonly palette: Readonly<Record<PaletteName, string>>;
140
+ readonly tokens: ReadonlyMap<TuiToken, StyleSpec>;
141
+ }
142
+ /**
143
+ * Read a registered scope's section, or nothing when it cannot be read.
144
+ *
145
+ * A malformed section must not cost the reader their session: an unreadable
146
+ * one falls back to the shipped table, which is the appearance the surface had
147
+ * before any of this existed. The caller is told on the way past, because a
148
+ * silently ignored typo is the exact failure this section is meant to prevent;
149
+ * stderr alone is invisible under the alternate screen.
150
+ */
151
+ export declare function readScope(scope: {
152
+ get(): unknown;
153
+ }, onProblem?: (message: string) => void): TuiSettings;
154
+ /**
155
+ * Turn a parsed section into the inputs the resolver takes.
156
+ *
157
+ * Shipped defaults fill anything the reader left out, so a partial section is
158
+ * the normal case rather than something the resolver has to guard against.
159
+ */
160
+ export declare function toOverrides(settings: TuiSettings): ThemeOverrides;
161
+ //# sourceMappingURL=theme-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-settings.d.ts","sourceRoot":"","sources":["../src/theme-settings.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAExC,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAA;AAE1B,wDAAwD;AACxD,eAAO,MAAM,sBAAsB,YAAY,CAAA;AA4C/C,oGAAoG;AACpG,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,QAAQ,CAAA;AAWnD;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAU,CAAA;AAqCxC,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,CA8BvD;AAQD,sEAAsE;AACtE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;IAChE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;IAC/D,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAA;CAClC;AAED,mEAAmE;AACnE,wBAAgB,eAAe,IAAI,WAAW,CAE7C;AAED,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAA;IACvD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;CAClD;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAAE,GAAG,IAAI,OAAO,CAAA;CAAE,EAAE,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,WAAW,CASvG;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,WAAW,GAAG,cAAc,CAMjE"}
@@ -0,0 +1,166 @@
1
+ import z from '@deepseek-ai/schemastery';
2
+ import { DEFAULT_PALETTE, PALETTE_NAMES, TUI_TOKENS, } from "./theme-tokens.js";
3
+ /** Settings namespace owned by the terminal surface. */
4
+ export const TUI_SETTINGS_NAMESPACE = 'dsh-tui';
5
+ /**
6
+ * A colour the reader may write.
7
+ *
8
+ * Enumerated rather than a free string: a misspelled colour must fail at load
9
+ * with the offending token named, not silently paint nothing for the rest of
10
+ * the session.
11
+ */
12
+ const ColourSchema = z.union([
13
+ z.string().pattern(/^#[0-9a-fA-F]{6}$/u),
14
+ z.union([...PALETTE_NAMES]),
15
+ z.number().min(0).max(255),
16
+ ]);
17
+ /** One element's override; every field optional so a reader sets only what they mean. */
18
+ const StyleSpecSchema = z.object({
19
+ fg: ColourSchema,
20
+ bg: ColourSchema,
21
+ bold: z.boolean(),
22
+ dim: z.boolean(),
23
+ italic: z.boolean(),
24
+ underline: z.boolean(),
25
+ strike: z.boolean(),
26
+ glyph: z.string(),
27
+ hidden: z.boolean(),
28
+ inherit: z.union([...TUI_TOKENS]),
29
+ });
30
+ /** The palette half: every entry optional, each defaulting to the shipped shade. */
31
+ const PaletteSchema = z.object(Object.fromEntries(PALETTE_NAMES.map(name => [name, ColourSchema.default(DEFAULT_PALETTE[name])])));
32
+ /**
33
+ * The token half: every token optional, but an unknown name rejected.
34
+ *
35
+ * Spelled out rather than `z.dict` because `dict` would accept any key, which
36
+ * is exactly the silent-typo failure this section has to prevent.
37
+ */
38
+ const TokensSchema = z.object(Object.fromEntries(TUI_TOKENS.map(token => [token, StyleSpecSchema])));
39
+ /** The values the `subcalls` key accepts, declared once for the schema and the refusal message. */
40
+ const SUBCALL_DISPLAYS = ['collapsed', 'inline'];
41
+ const SECTION = z.object({
42
+ palette: PaletteSchema.default({}),
43
+ tokens: TokensSchema.default({}),
44
+ subcalls: z.union([...SUBCALL_DISPLAYS]).default('inline'),
45
+ });
46
+ /**
47
+ * The schema the harness registers.
48
+ *
49
+ * Exported alongside the parser because registration needs a real schemastery
50
+ * schema, while reading needs the unknown-token check that a schemastery object
51
+ * cannot express.
52
+ */
53
+ export const TuiSettingsSchema = SECTION;
54
+ const TOKEN_NAMES = new Set(TUI_TOKENS);
55
+ const PALETTE_NAME_SET = new Set(PALETTE_NAMES);
56
+ /** The section's own keys: schemastery keeps what it does not declare, so a misspelling has to be refused here. */
57
+ const SECTION_KEYS = new Set(['palette', 'tokens', 'subcalls']);
58
+ /**
59
+ * Validate the raw section, refusing a name the surface does not have.
60
+ *
61
+ * Schemastery's object schema ignores undeclared keys, so a misspelled token,
62
+ * palette entry, or key would otherwise parse cleanly and do nothing at all —
63
+ * the one outcome a reader could not debug from the screen. Every level is
64
+ * therefore checked against its declared names before validation.
65
+ */
66
+ function rejectUnknownKeys(raw) {
67
+ const section = asRecord(raw);
68
+ if (section === undefined)
69
+ return;
70
+ const unknownKeys = Object.keys(section).filter(name => !SECTION_KEYS.has(name));
71
+ if (unknownKeys.length > 0) {
72
+ throw new Error(`unknown ${TUI_SETTINGS_NAMESPACE} key${unknownKeys.length === 1 ? '' : 's'}: ${unknownKeys.join(', ')}`);
73
+ }
74
+ const unknownTokens = Object.keys(asRecord(section.tokens) ?? {}).filter(name => !TOKEN_NAMES.has(name));
75
+ if (unknownTokens.length > 0) {
76
+ throw new Error(`unknown ${TUI_SETTINGS_NAMESPACE} token${unknownTokens.length === 1 ? '' : 's'}: ${unknownTokens.join(', ')}`);
77
+ }
78
+ const unknownPalette = Object.keys(asRecord(section.palette) ?? {}).filter(name => !PALETTE_NAME_SET.has(name));
79
+ if (unknownPalette.length > 0) {
80
+ throw new Error(`unknown ${TUI_SETTINGS_NAMESPACE} palette entr${unknownPalette.length === 1 ? 'y' : 'ies'}: ${unknownPalette.join(', ')}`);
81
+ }
82
+ }
83
+ function asRecord(value) {
84
+ return typeof value === 'object' && value !== null ? value : undefined;
85
+ }
86
+ /** The reader-facing shape of the `dsh-tui:` section. */
87
+ export function parseSettings(raw) {
88
+ rejectUnknownKeys(raw);
89
+ const section = asRecord(raw) ?? {};
90
+ const parsed = SECTION(section);
91
+ // Only what the reader actually wrote is an override: the schema fills every
92
+ // field so validation can see a whole section, but returning those fills
93
+ // would turn a one-line override into a table of empty entries.
94
+ const writtenPalette = asRecord(section.palette) ?? {};
95
+ const palette = {};
96
+ for (const [name, value] of Object.entries(writtenPalette)) {
97
+ // Same fill-in problem as the tokens: the schema supplies a default for
98
+ // every entry, so only a value the reader chose is an override.
99
+ if (value === undefined || value === DEFAULT_PALETTE[name])
100
+ continue;
101
+ palette[name] = parsed.palette[name];
102
+ }
103
+ const writtenTokens = asRecord(section.tokens) ?? {};
104
+ const tokens = {};
105
+ for (const [name, value] of Object.entries(writtenTokens)) {
106
+ // A registered scope hands back every key the schema declares, with an
107
+ // empty spec for the ones nobody wrote. An empty spec cannot change an
108
+ // appearance, so keeping it would let the schema's own fill-in shadow the
109
+ // shipped default and report every element as overridden.
110
+ if (value === undefined || !hasAnyField(parsed.tokens[name]))
111
+ continue;
112
+ tokens[name] = parsed.tokens[name] ?? {};
113
+ }
114
+ return {
115
+ palette: palette,
116
+ tokens: tokens,
117
+ subcalls: parsed.subcalls,
118
+ };
119
+ }
120
+ /** Whether a resolved spec actually asks for anything. */
121
+ function hasAnyField(spec) {
122
+ if (spec === undefined)
123
+ return false;
124
+ return Object.values(spec).some(value => value !== undefined);
125
+ }
126
+ /** The section as it reads when the reader has written nothing. */
127
+ export function defaultSettings() {
128
+ return { palette: {}, tokens: {}, subcalls: 'inline' };
129
+ }
130
+ /**
131
+ * Read a registered scope's section, or nothing when it cannot be read.
132
+ *
133
+ * A malformed section must not cost the reader their session: an unreadable
134
+ * one falls back to the shipped table, which is the appearance the surface had
135
+ * before any of this existed. The caller is told on the way past, because a
136
+ * silently ignored typo is the exact failure this section is meant to prevent;
137
+ * stderr alone is invisible under the alternate screen.
138
+ */
139
+ export function readScope(scope, onProblem) {
140
+ try {
141
+ return parseSettings(scope.get() ?? {});
142
+ }
143
+ catch (error) {
144
+ const message = `ignoring ${TUI_SETTINGS_NAMESPACE} settings: ${error instanceof Error ? error.message : String(error)}`;
145
+ if (onProblem === undefined)
146
+ process.stderr.write(`dsh-tui: ${message}\n`);
147
+ else
148
+ onProblem(message);
149
+ return defaultSettings();
150
+ }
151
+ }
152
+ /**
153
+ * Turn a parsed section into the inputs the resolver takes.
154
+ *
155
+ * Shipped defaults fill anything the reader left out, so a partial section is
156
+ * the normal case rather than something the resolver has to guard against.
157
+ */
158
+ export function toOverrides(settings) {
159
+ const tokens = new Map();
160
+ for (const [token, spec] of Object.entries(settings.tokens)) {
161
+ if (spec !== undefined)
162
+ tokens.set(token, spec);
163
+ }
164
+ return { palette: { ...DEFAULT_PALETTE, ...settings.palette }, tokens };
165
+ }
166
+ //# sourceMappingURL=theme-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-settings.js","sourceRoot":"","sources":["../src/theme-settings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ import { type ColourMode } from './theme-capability.ts';
2
+ /**
3
+ * The reset sequence, for the code that has to recognise one.
4
+ *
5
+ * pi-tui closes a truncated row with a reset whether or not it opened a style,
6
+ * so a renderer that turns styling off still has to remove the ones it did not
7
+ * ask for.
8
+ */
9
+ export declare function resetSequence(): string;
10
+ /**
11
+ * The muted shade every receding element shares.
12
+ *
13
+ * An explicit grey rather than a palette slot: slot 8 is whatever the reader's
14
+ * terminal maps it to, which on the reader's own phone was close enough to
15
+ * ordinary text that dimming looked like it had not been applied at all.
16
+ */
17
+ export declare const MUTED_GREY = "#8a8a8a";
18
+ /**
19
+ * The shade a tool's argument takes.
20
+ *
21
+ * A call's argument is the one part of a card the reader scans for, and it must
22
+ * read as neither the tool's own label (warn) nor ordinary output (the default
23
+ * foreground); a pale blue sits between them without competing for attention.
24
+ */
25
+ export declare const ARGUMENT_BLUE = "#8db3d9";
26
+ /**
27
+ * The shade a submitted prompt takes.
28
+ *
29
+ * A reader's own turns and the assistant's reply both shipped on the default
30
+ * foreground, so telling the two apart meant reading them; a rose separates
31
+ * them at a glance while staying quieter than the warn-coloured tool label.
32
+ */
33
+ export declare const USER_PROMPT_ROSE = "#FCCAF0";
34
+ /** Palette entries a token may name instead of a literal colour. */
35
+ export declare const PALETTE_NAMES: readonly ["default", "muted", "accent", "arg", "warn", "added", "removed", "user", "assistant"];
36
+ /** A named palette entry. */
37
+ export type PaletteName = (typeof PALETTE_NAMES)[number];
38
+ /** A colour: an explicit hex value, or a palette entry. */
39
+ export type ColourSpec = string | number | PaletteName;
40
+ /** One element's appearance, every field optional so a reader sets only what they mean. */
41
+ export interface StyleSpec {
42
+ readonly fg?: ColourSpec;
43
+ readonly bg?: ColourSpec;
44
+ readonly bold?: boolean;
45
+ readonly dim?: boolean;
46
+ readonly italic?: boolean;
47
+ readonly underline?: boolean;
48
+ readonly strike?: boolean;
49
+ /** Rendered before the element when set; empty ships nothing. */
50
+ readonly glyph?: string;
51
+ /** The element renders nothing at all when true. */
52
+ readonly hidden?: boolean;
53
+ /** Start from another token's fields instead of this token's own defaults. */
54
+ readonly inherit?: TuiToken;
55
+ }
56
+ /** The resolved escape pair and marks one element needs. */
57
+ export interface ResolvedStyle {
58
+ readonly prefix: string;
59
+ readonly suffix: string;
60
+ readonly glyph: string;
61
+ readonly hidden: boolean;
62
+ }
63
+ /** A row class a tool card can carry, so styling follows what the row means. */
64
+ export declare const CARD_ROW_CLASSES: readonly ["header", "hunk", "added", "removed", "line", "lineNumber", "path", "match", "truncated", "output", "cwd", "status", "source", "url", "detail"];
65
+ /** What a tool card row is, which is what decides how it is drawn. */
66
+ export type CardRowClass = (typeof CARD_ROW_CLASSES)[number];
67
+ /**
68
+ * Every styled element on the surface, grouped by the region that draws it.
69
+ *
70
+ * The list is the contract: a renderer names a token, and the coverage sweep
71
+ * fails if a token loses its default, so "every element" cannot quietly drift
72
+ * as the surface grows.
73
+ */
74
+ export declare const TUI_TOKENS: readonly ["transcript.user", "transcript.notice", "transcript.marker", "transcript.reasoning.summary", "transcript.reasoning.body", "transcript.reasoning.hint", "tool.title", "tool.glyph", "tool.args", "tool.stat.added", "tool.stat.changed", "tool.stat.removed", "tool.stat.size", "tool.stat.separator", "tool.detail", "tool.hint", "tool.failed.title", "tool.failed.glyph", "tool.subcall.title", "tool.subcall.args", "tool.diff.header", "tool.diff.hunk", "tool.diff.added", "tool.diff.removed", "tool.read.header", "tool.read.lineNumber", "tool.read.line", "tool.search.path", "tool.search.lineNumber", "tool.search.match", "tool.search.truncated", "tool.terminal.cwd", "tool.terminal.status", "tool.terminal.output", "tool.web.url", "tool.web.source", "tool.web.truncated", "tool.generic.detail", "markdown.heading", "markdown.link", "markdown.linkUrl", "markdown.code", "markdown.codeBlock", "markdown.codeBlockBorder", "markdown.quote", "markdown.quoteBorder", "markdown.hr", "markdown.listBullet", "markdown.bold", "markdown.italic", "markdown.strikethrough", "markdown.underline", "picker.title", "picker.glyph", "picker.note", "picker.filter", "picker.row", "picker.rowCurrent", "picker.scrollNewer", "picker.scrollOlder", "picker.hint", "picker.cursor", "gate.title", "gate.glyphApproval", "gate.glyphQuestion", "gate.detail", "gate.option", "gate.optionCurrent", "gate.cursor", "gate.hint", "dock.goal", "dock.planMode", "dock.todos.heading", "dock.todos.pending", "dock.todos.inProgress", "dock.todos.overflow", "dock.subagents.heading", "dock.subagents.running", "dock.subagents.overflow", "dock.jobs.heading", "dock.jobs.running", "dock.jobs.overflow", "status.activity.working", "status.activity.ready", "status.elapsed", "status.agentPreset", "status.model", "status.effort", "status.permission", "status.context", "status.cache", "status.cwd", "status.separator", "editor.border", "editor.selectList.selectedPrefix", "editor.selectList.selectedText", "editor.selectList.description", "editor.selectList.scrollInfo", "editor.selectList.noMatch"];
75
+ /** A name for one styled element on the surface. */
76
+ export type TuiToken = (typeof TUI_TOKENS)[number];
77
+ /**
78
+ * Which token draws a card row, by the card's kind and the row's class.
79
+ *
80
+ * Two lookups rather than one because `header` means a different element on a
81
+ * diff than on a read: the kind is half of what a row is.
82
+ */
83
+ export declare const CARD_ROW_TOKEN: Readonly<Record<string, Readonly<Partial<Record<CardRowClass, TuiToken>>>>>;
84
+ /** The colours a token can name, so a shade is changed in one place. */
85
+ export declare const DEFAULT_PALETTE: Readonly<Record<PaletteName, string>>;
86
+ /**
87
+ * The shipped appearance of every token.
88
+ *
89
+ * Defaults reproduce the surface as it looked before tokens existed, except the
90
+ * muted family, which moves from faint-on-a-palette-slot to an explicit grey.
91
+ * A test asserts every token in {@link TUI_TOKENS} appears here.
92
+ */
93
+ export declare const DEFAULT_TOKENS: Readonly<Record<TuiToken, StyleSpec>>;
94
+ /**
95
+ * Merge one token's default, its `inherit` target, and the reader's override.
96
+ *
97
+ * The inherited token's fields replace this token's defaults, because that is
98
+ * what "start from another token" means; the reader's own fields still win.
99
+ * A path-scoped set turns a cycle into a stop, and still lets two branches
100
+ * inherit one token rather than sharing a single visit.
101
+ */
102
+ export declare function mergeTokenSpec(token: TuiToken, overrides: ReadonlyMap<TuiToken, StyleSpec>): StyleSpec;
103
+ /**
104
+ * Resolve one token into the escapes a renderer needs.
105
+ *
106
+ * Faint is dropped once a colour is chosen: stacking it on a deliberate grey is
107
+ * what made the old output differ per terminal.
108
+ */
109
+ export declare function resolveToken(token: TuiToken, overrides: ReadonlyMap<TuiToken, StyleSpec>, palette: Readonly<Record<PaletteName, string>>, mode: ColourMode): ResolvedStyle;
110
+ //# sourceMappingURL=theme-tokens.d.ts.map