@chances-ai/ui-core 17.0.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.
@@ -0,0 +1,224 @@
1
+ /**
2
+ * (5.9 / v14) Terminal syntax highlighting, pi-style: drive highlight.js
3
+ * directly (NOT `cli-highlight`, which drags in `parse5` + `yargs` — codex R1
4
+ * UNVERIFIABLE-2), then map its `<span class="hljs-…">` HTML to flat, themed
5
+ * segments with a tiny stack scanner. Pure `(code, lang) → Segment[]`, so it is
6
+ * fully unit-testable without Ink and degrades to a single plain segment on
7
+ * unknown language / highlighter throw.
8
+ *
9
+ * Only a curated language set is registered (via `highlight.js/lib/core`) to
10
+ * keep the `bun build --compile` binary small.
11
+ */
12
+ import hljs from "highlight.js/lib/core";
13
+ // -- curated language registration ------------------------------------------
14
+ import bash from "highlight.js/lib/languages/bash";
15
+ import c from "highlight.js/lib/languages/c";
16
+ import cpp from "highlight.js/lib/languages/cpp";
17
+ import css from "highlight.js/lib/languages/css";
18
+ import diff from "highlight.js/lib/languages/diff";
19
+ import dockerfile from "highlight.js/lib/languages/dockerfile";
20
+ import go from "highlight.js/lib/languages/go";
21
+ import java from "highlight.js/lib/languages/java";
22
+ import javascript from "highlight.js/lib/languages/javascript";
23
+ import json from "highlight.js/lib/languages/json";
24
+ import markdown from "highlight.js/lib/languages/markdown";
25
+ import python from "highlight.js/lib/languages/python";
26
+ import ruby from "highlight.js/lib/languages/ruby";
27
+ import rust from "highlight.js/lib/languages/rust";
28
+ import sql from "highlight.js/lib/languages/sql";
29
+ import toml from "highlight.js/lib/languages/ini";
30
+ import typescript from "highlight.js/lib/languages/typescript";
31
+ import xml from "highlight.js/lib/languages/xml";
32
+ import yaml from "highlight.js/lib/languages/yaml";
33
+ let registered = false;
34
+ function ensureRegistered() {
35
+ if (registered)
36
+ return;
37
+ registered = true;
38
+ const langs = {
39
+ bash,
40
+ c,
41
+ cpp,
42
+ css,
43
+ diff,
44
+ dockerfile,
45
+ go,
46
+ java,
47
+ javascript,
48
+ json,
49
+ markdown,
50
+ python,
51
+ ruby,
52
+ rust,
53
+ sql,
54
+ toml,
55
+ typescript,
56
+ xml,
57
+ yaml,
58
+ };
59
+ for (const [name, def] of Object.entries(langs))
60
+ hljs.registerLanguage(name, def);
61
+ }
62
+ /** Common aliases highlight.js's curated set doesn't auto-register for us. */
63
+ const ALIASES = {
64
+ ts: "typescript",
65
+ tsx: "typescript",
66
+ js: "javascript",
67
+ jsx: "javascript",
68
+ mjs: "javascript",
69
+ cjs: "javascript",
70
+ py: "python",
71
+ rb: "ruby",
72
+ rs: "rust",
73
+ sh: "bash",
74
+ shell: "bash",
75
+ zsh: "bash",
76
+ yml: "yaml",
77
+ html: "xml",
78
+ htm: "xml",
79
+ svg: "xml",
80
+ golang: "go",
81
+ "c++": "cpp",
82
+ ini: "toml",
83
+ dockerfile: "dockerfile",
84
+ md: "markdown",
85
+ };
86
+ /** hljs class (without the `hljs-` prefix) → our scope. Unmapped → "plain". */
87
+ function classToScope(cls) {
88
+ // A span class may be multi-token, e.g. "hljs-title function_"; check each.
89
+ const tokens = cls.split(/\s+/);
90
+ for (const raw of tokens) {
91
+ const t = raw.replace(/^hljs-/, "");
92
+ switch (t) {
93
+ case "keyword":
94
+ return "keyword";
95
+ case "string":
96
+ case "regexp":
97
+ case "char":
98
+ case "char.escape":
99
+ case "subst":
100
+ return "string";
101
+ case "comment":
102
+ case "quote":
103
+ return "comment";
104
+ case "number":
105
+ return "number";
106
+ case "title":
107
+ case "built_in":
108
+ return "function";
109
+ case "type":
110
+ case "class":
111
+ case "title.class":
112
+ return "type";
113
+ case "literal":
114
+ return "literal";
115
+ case "attr":
116
+ case "attribute":
117
+ case "property":
118
+ case "selector-tag":
119
+ case "selector-class":
120
+ case "name":
121
+ return "attr";
122
+ default:
123
+ continue;
124
+ }
125
+ }
126
+ return "plain";
127
+ }
128
+ /** scope → theme color role (used by views to pick the `<Text color>`). */
129
+ export const SCOPE_TO_THEME = {
130
+ plain: undefined,
131
+ keyword: "synKeyword",
132
+ string: "synString",
133
+ comment: "synComment",
134
+ number: "synNumber",
135
+ function: "synFunction",
136
+ type: "synType",
137
+ literal: "synLiteral",
138
+ attr: "synAttr",
139
+ };
140
+ const ENTITIES = {
141
+ "&amp;": "&",
142
+ "&lt;": "<",
143
+ "&gt;": ">",
144
+ "&quot;": '"',
145
+ "&#x27;": "'",
146
+ "&#39;": "'",
147
+ "&apos;": "'",
148
+ };
149
+ function decodeEntities(s) {
150
+ return s.replace(/&(?:amp|lt|gt|quot|apos|#x27|#39);/g, (m) => ENTITIES[m] ?? m);
151
+ }
152
+ /** Resolve a user-supplied language label to a registered grammar, or null. */
153
+ export function resolveLanguage(lang) {
154
+ if (!lang)
155
+ return null;
156
+ ensureRegistered();
157
+ const norm = lang.trim().toLowerCase();
158
+ const aliased = ALIASES[norm] ?? norm;
159
+ return hljs.getLanguage(aliased) ? aliased : null;
160
+ }
161
+ /**
162
+ * Highlight `code` as `lang` into themed segments. Unknown/absent language or
163
+ * any highlighter error → a single `"plain"` segment with the original code
164
+ * (callers render it as plain text).
165
+ */
166
+ export function highlightToSegments(code, lang) {
167
+ const resolved = resolveLanguage(lang);
168
+ if (!resolved)
169
+ return [{ text: code, scope: "plain" }];
170
+ let html;
171
+ try {
172
+ html = hljs.highlight(code, { language: resolved, ignoreIllegals: true }).value;
173
+ }
174
+ catch {
175
+ return [{ text: code, scope: "plain" }];
176
+ }
177
+ return scanHtml(html);
178
+ }
179
+ /**
180
+ * Flatten highlight.js HTML into segments. Maintains a scope stack; the
181
+ * innermost open span wins for the text between tags. Closing more spans than
182
+ * are open (defensive) is ignored.
183
+ */
184
+ function scanHtml(html) {
185
+ const segs = [];
186
+ const stack = [];
187
+ // The final `(<)` alternative captures a stray `<` that starts neither a
188
+ // recognized span open/close — emitted as literal text so no source char is
189
+ // silently dropped if highlight.js ever produces unexpected markup (codex R2
190
+ // SHOULD-5). highlight.js escapes real `<` in source to `&lt;`, so this only
191
+ // fires defensively.
192
+ const re = /<span class="([^"]*)">|<\/span>|([^<]+)|(<)/g;
193
+ const push = (raw) => {
194
+ const text = decodeEntities(raw);
195
+ if (text.length > 0)
196
+ segs.push({ text, scope: stack[stack.length - 1] ?? "plain" });
197
+ };
198
+ let m = re.exec(html);
199
+ while (m !== null) {
200
+ if (m[1] !== undefined)
201
+ stack.push(classToScope(m[1]));
202
+ else if (m[2] !== undefined)
203
+ push(m[2]);
204
+ else if (m[3] !== undefined)
205
+ push(m[3]); // stray "<"
206
+ else
207
+ stack.pop();
208
+ m = re.exec(html);
209
+ }
210
+ return coalesce(segs);
211
+ }
212
+ /** Merge adjacent same-scope segments so the renderer emits fewer `<Text>`. */
213
+ function coalesce(segs) {
214
+ const out = [];
215
+ for (const s of segs) {
216
+ const last = out[out.length - 1];
217
+ if (last && last.scope === s.scope)
218
+ last.text += s.text;
219
+ else
220
+ out.push({ ...s });
221
+ }
222
+ return out;
223
+ }
224
+ //# sourceMappingURL=highlight-to-segments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"highlight-to-segments.js","sourceRoot":"","sources":["../src/highlight-to-segments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `@chances-ai/ui-core` — surface-agnostic VIEW logic, **browser-safe** (no
3
+ * `node:*`, no `process.*`, no Ink/React). Extracted from `@chances-ai/tui`
4
+ * (v17 M0 / docs/6.1 §4) so the TUI, the web/desktop client, and the
5
+ * server-side highlight path all share one source of truth for:
6
+ * - the chat transcript view-model (`ChatViewModel` + `Line`)
7
+ * - diff parsing/word-segmentation (`parseDiff`, `wordSegs`)
8
+ * - tool-call labels (`formatToolCall`, `toolDisplayName`)
9
+ * - syntax-highlight → themed segments (`highlightToSegments`)
10
+ * - the visual-language tokens (`Theme`, `makeGlyphs`, `SPINNER_*`)
11
+ * - the frame-coalescing scheduler (`FrameScheduler`)
12
+ *
13
+ * Node-bound conveniences (env-reading defaults, `process.platform` glyphs)
14
+ * live in the TUI's `theme.ts` shim, which injects `process.*` here.
15
+ */
16
+ export { type Theme, type ThemeSetting, type Glyphs, type NoColorEnv, makeGlyphs, isNoColor, resolveTheme, SPINNER_FRAMES, SPINNER_STATIC, } from "./theme.js";
17
+ export { type HlScope, type Segment, SCOPE_TO_THEME, highlightToSegments, resolveLanguage, } from "./highlight-to-segments.js";
18
+ export { type WordSeg, type DiffRow, type ParsedDiff, CHANGE_THRESHOLD, looksLikeDiff, parseDiff, wordSegs, } from "./diff-model.js";
19
+ export { type FrameHandle, type FrameScheduler, defaultFrameScheduler, ManualFrameScheduler, } from "./frame-scheduler.js";
20
+ export { homeRelative, toolDisplayName, parseMcpName, formatToolCall } from "./tool-line.js";
21
+ export { ChatViewModel, type ChatViewModelOptions, type Line, type LineKind, extractDiff, } from "./view-model.js";
22
+ export { type AppEventBus, LocalEventBus } from "./event-bus.js";
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EACL,KAAK,KAAK,EACV,KAAK,YAAY,EACjB,KAAK,MAAM,EACX,KAAK,UAAU,EACf,UAAU,EACV,SAAS,EACT,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,cAAc,EACd,mBAAmB,EACnB,eAAe,GAChB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,QAAQ,GACT,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE7F,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,IAAI,EACT,KAAK,QAAQ,EACb,WAAW,GACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,KAAK,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,23 @@
1
+ /**
2
+ * `@chances-ai/ui-core` — surface-agnostic VIEW logic, **browser-safe** (no
3
+ * `node:*`, no `process.*`, no Ink/React). Extracted from `@chances-ai/tui`
4
+ * (v17 M0 / docs/6.1 §4) so the TUI, the web/desktop client, and the
5
+ * server-side highlight path all share one source of truth for:
6
+ * - the chat transcript view-model (`ChatViewModel` + `Line`)
7
+ * - diff parsing/word-segmentation (`parseDiff`, `wordSegs`)
8
+ * - tool-call labels (`formatToolCall`, `toolDisplayName`)
9
+ * - syntax-highlight → themed segments (`highlightToSegments`)
10
+ * - the visual-language tokens (`Theme`, `makeGlyphs`, `SPINNER_*`)
11
+ * - the frame-coalescing scheduler (`FrameScheduler`)
12
+ *
13
+ * Node-bound conveniences (env-reading defaults, `process.platform` glyphs)
14
+ * live in the TUI's `theme.ts` shim, which injects `process.*` here.
15
+ */
16
+ export { makeGlyphs, isNoColor, resolveTheme, SPINNER_FRAMES, SPINNER_STATIC, } from "./theme.js";
17
+ export { SCOPE_TO_THEME, highlightToSegments, resolveLanguage, } from "./highlight-to-segments.js";
18
+ export { CHANGE_THRESHOLD, looksLikeDiff, parseDiff, wordSegs, } from "./diff-model.js";
19
+ export { defaultFrameScheduler, ManualFrameScheduler, } from "./frame-scheduler.js";
20
+ export { homeRelative, toolDisplayName, parseMcpName, formatToolCall } from "./tool-line.js";
21
+ export { ChatViewModel, extractDiff, } from "./view-model.js";
22
+ export { LocalEventBus } from "./event-bus.js";
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAKL,UAAU,EACV,SAAS,EACT,YAAY,EACZ,cAAc,EACd,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAGL,cAAc,EACd,mBAAmB,EACnB,eAAe,GAChB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAIL,gBAAgB,EAChB,aAAa,EACb,SAAS,EACT,QAAQ,GACT,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAGL,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE7F,OAAO,EACL,aAAa,EAIb,WAAW,GACZ,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAoB,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * (5.9 / v14; v17 ui-core) The single home for the visual-language literals:
3
+ * glyphs + color palettes. Pure module — NO React, NO Ink, **NO `node:*` / no
4
+ * `process.*`** — so it is browser-safe and shared verbatim across the TUI, the
5
+ * web/desktop client, and the server-side highlight path. The Node-bound
6
+ * conveniences (env-reading `isNoColor`/`resolveTheme` defaults + the
7
+ * `process.platform`-derived `GLYPHS` constant) live in the TUI's `theme.ts`
8
+ * shim, which injects `process.*` into these pure functions.
9
+ *
10
+ * Colors are emitted as `rgb(r,g,b)` strings; the TUI renders them through Ink +
11
+ * chalk (truecolor → 256/16 downsample by terminal level), the web renders them
12
+ * as CSS — one truecolor palette per mode, consumers degrade. There is no
13
+ * hand-rolled 16-ANSI fallback table (5.9 §0).
14
+ *
15
+ * `NO_COLOR` (https://no-color.org) is honored via {@link isNoColor}: when set,
16
+ * `resolveTheme` returns a palette whose every color is `undefined`, so consumers
17
+ * emit no `color`/`backgroundColor` and meaning is carried by glyphs + sigils
18
+ * alone (the diff `+`/`-`, the `⏺`/`⎿` shapes).
19
+ *
20
+ * Dark RGB values are the facts of claude-code's `darkTheme` visual language;
21
+ * light values track its `lightTheme`. Syntax colors are an OneDark-ish set
22
+ * legible on the respective background.
23
+ */
24
+ /** A resolved palette. Every field optional: `undefined` ⇒ emit no color for
25
+ * that role (terminal default fg / no bg). The NO_COLOR palette is all-undefined. */
26
+ export interface Theme {
27
+ /** Claude accent (orange). Running tool dot, top-level headings, links, spinner glyph. */
28
+ accent?: string;
29
+ /** Successful tool / ok states. */
30
+ success?: string;
31
+ /** Errors (dot, message body). */
32
+ error?: string;
33
+ /** Amber warnings. */
34
+ warning?: string;
35
+ /** Permission dialog rule + title. */
36
+ permission?: string;
37
+ /** Plan-mode badge. */
38
+ planMode?: string;
39
+ /** auto-edit / yolo badge (violet). */
40
+ autoAccept?: string;
41
+ /** Bash tool accent (pink). */
42
+ bashPink?: string;
43
+ /** Full-line diff backgrounds. */
44
+ diffAddedBg?: string;
45
+ diffRemovedBg?: string;
46
+ /** Word-level (intra-line) diff backgrounds — brighter than the line bg. */
47
+ diffAddedWordBg?: string;
48
+ diffRemovedWordBg?: string;
49
+ /** User-message bubble background. */
50
+ userMessageBg?: string;
51
+ /** Stalled-spinner red (interpolation target when no token for ~3s). */
52
+ stall?: string;
53
+ synKeyword?: string;
54
+ synString?: string;
55
+ synComment?: string;
56
+ synNumber?: string;
57
+ synFunction?: string;
58
+ synType?: string;
59
+ synLiteral?: string;
60
+ synTitle?: string;
61
+ synAttr?: string;
62
+ }
63
+ /** Theme selection as it arrives from config. `'auto'` resolves to `'dark'` in
64
+ * v14 (terminal-background detection is a later lever). */
65
+ export type ThemeSetting = "dark" | "light" | "auto";
66
+ /** The minimal env shape {@link isNoColor} reads. Browser-safe: NOT
67
+ * `NodeJS.ProcessEnv` (that drags `@types/node` into the ui-core graph). A
68
+ * `process.env` satisfies it structurally; so does `{}` or `{ NO_COLOR: "1" }`. */
69
+ export interface NoColorEnv {
70
+ readonly NO_COLOR?: string;
71
+ }
72
+ /** `NO_COLOR` (https://no-color.org): present and NON-EMPTY ⇒ disable color,
73
+ * regardless of value. An empty string does NOT disable (per the spec). `env`
74
+ * is injected (the TUI shim passes `process.env`); no `process.*` here. */
75
+ export declare function isNoColor(env: NoColorEnv): boolean;
76
+ /**
77
+ * Resolve a palette. `NO_COLOR` wins over any setting; otherwise `'light'` →
78
+ * the light palette and `'dark'`/`'auto'`/undefined → dark. `env` is injected.
79
+ */
80
+ export declare function resolveTheme(setting: ThemeSetting | undefined, env: NoColorEnv): Theme;
81
+ export interface Glyphs {
82
+ /** Tool/turn status dot. `⏺` aligns well only on macOS terminals; `●`
83
+ * elsewhere (matches claude-code `figures.ts` BLACK_CIRCLE). */
84
+ dot: string;
85
+ /** Result continuation L-branch. */
86
+ branch: string;
87
+ /** Input + selection prompt caret. */
88
+ prompt: string;
89
+ /** Blockquote bar. */
90
+ blockquote: string;
91
+ /** Plan-mode badge symbol. */
92
+ plan: string;
93
+ /** Accept-edits / auto badge symbol. */
94
+ accept: string;
95
+ /** Success tick. */
96
+ tick: string;
97
+ /** Horizontal rule fill. */
98
+ hr: string;
99
+ /** Unordered-list bullet. */
100
+ bullet: string;
101
+ /** Progress "thinking" glyph (also the brightest spinner frame). */
102
+ thinking: string;
103
+ arrowDown: string;
104
+ arrowUp: string;
105
+ }
106
+ /** Build the glyph set for a platform. `platform` is injected (the TUI shim
107
+ * passes `process.platform`); only the `dot` differs (`darwin` → `⏺`, else
108
+ * `●`). A plain `string` param keeps this off `NodeJS.Platform` / `@types/node`. */
109
+ export declare function makeGlyphs(platform: string): Glyphs;
110
+ export declare const SPINNER_FRAMES: readonly string[];
111
+ /** Static glyph shown instead of the animation under reduced-motion / NO_COLOR. */
112
+ export declare const SPINNER_STATIC = "\u25CF";
113
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH;sFACsF;AACtF,MAAM,WAAW,KAAK;IACpB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;4DAC4D;AAC5D,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAErD;;oFAEoF;AACpF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAyDD;;4EAE4E;AAC5E,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAGlD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,EAAE,GAAG,EAAE,UAAU,GAAG,KAAK,CAGtF;AAED,MAAM,WAAW,MAAM;IACrB;qEACiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;qFAEqF;AACrF,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAenD;AAKD,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAAsD,CAAC;AAEnG,mFAAmF;AACnF,eAAO,MAAM,cAAc,WAAM,CAAC"}
package/dist/theme.js ADDED
@@ -0,0 +1,117 @@
1
+ /**
2
+ * (5.9 / v14; v17 ui-core) The single home for the visual-language literals:
3
+ * glyphs + color palettes. Pure module — NO React, NO Ink, **NO `node:*` / no
4
+ * `process.*`** — so it is browser-safe and shared verbatim across the TUI, the
5
+ * web/desktop client, and the server-side highlight path. The Node-bound
6
+ * conveniences (env-reading `isNoColor`/`resolveTheme` defaults + the
7
+ * `process.platform`-derived `GLYPHS` constant) live in the TUI's `theme.ts`
8
+ * shim, which injects `process.*` into these pure functions.
9
+ *
10
+ * Colors are emitted as `rgb(r,g,b)` strings; the TUI renders them through Ink +
11
+ * chalk (truecolor → 256/16 downsample by terminal level), the web renders them
12
+ * as CSS — one truecolor palette per mode, consumers degrade. There is no
13
+ * hand-rolled 16-ANSI fallback table (5.9 §0).
14
+ *
15
+ * `NO_COLOR` (https://no-color.org) is honored via {@link isNoColor}: when set,
16
+ * `resolveTheme` returns a palette whose every color is `undefined`, so consumers
17
+ * emit no `color`/`backgroundColor` and meaning is carried by glyphs + sigils
18
+ * alone (the diff `+`/`-`, the `⏺`/`⎿` shapes).
19
+ *
20
+ * Dark RGB values are the facts of claude-code's `darkTheme` visual language;
21
+ * light values track its `lightTheme`. Syntax colors are an OneDark-ish set
22
+ * legible on the respective background.
23
+ */
24
+ const darkTheme = {
25
+ accent: "rgb(215,119,87)",
26
+ success: "rgb(78,186,101)",
27
+ error: "rgb(255,107,128)",
28
+ warning: "rgb(255,193,7)",
29
+ permission: "rgb(177,185,249)",
30
+ planMode: "rgb(72,150,140)",
31
+ autoAccept: "rgb(175,135,255)",
32
+ bashPink: "rgb(253,93,177)",
33
+ diffAddedBg: "rgb(34,92,43)",
34
+ diffRemovedBg: "rgb(122,41,54)",
35
+ diffAddedWordBg: "rgb(56,166,96)",
36
+ diffRemovedWordBg: "rgb(179,89,107)",
37
+ userMessageBg: "rgb(55,55,55)",
38
+ stall: "rgb(171,43,63)",
39
+ synKeyword: "rgb(198,120,221)",
40
+ synString: "rgb(152,195,121)",
41
+ synComment: "rgb(106,115,125)",
42
+ synNumber: "rgb(209,154,102)",
43
+ synFunction: "rgb(97,175,239)",
44
+ synType: "rgb(229,192,123)",
45
+ synLiteral: "rgb(86,182,194)",
46
+ synTitle: "rgb(97,175,239)",
47
+ synAttr: "rgb(209,154,102)",
48
+ };
49
+ const lightTheme = {
50
+ accent: "rgb(215,119,87)",
51
+ success: "rgb(44,122,57)",
52
+ error: "rgb(171,43,63)",
53
+ warning: "rgb(150,108,30)",
54
+ permission: "rgb(87,105,247)",
55
+ planMode: "rgb(0,102,102)",
56
+ autoAccept: "rgb(135,0,255)",
57
+ bashPink: "rgb(255,0,135)",
58
+ diffAddedBg: "rgb(105,219,124)",
59
+ diffRemovedBg: "rgb(255,168,180)",
60
+ diffAddedWordBg: "rgb(47,157,68)",
61
+ diffRemovedWordBg: "rgb(209,69,75)",
62
+ userMessageBg: "rgb(240,240,240)",
63
+ stall: "rgb(171,43,63)",
64
+ synKeyword: "rgb(166,38,164)",
65
+ synString: "rgb(80,161,79)",
66
+ synComment: "rgb(160,161,167)",
67
+ synNumber: "rgb(152,104,1)",
68
+ synFunction: "rgb(64,120,242)",
69
+ synType: "rgb(193,132,1)",
70
+ synLiteral: "rgb(1,132,188)",
71
+ synTitle: "rgb(64,120,242)",
72
+ synAttr: "rgb(152,104,1)",
73
+ };
74
+ /** Every color undefined ⇒ no color props emitted (glyphs/sigils carry meaning). */
75
+ const noColorTheme = {};
76
+ /** `NO_COLOR` (https://no-color.org): present and NON-EMPTY ⇒ disable color,
77
+ * regardless of value. An empty string does NOT disable (per the spec). `env`
78
+ * is injected (the TUI shim passes `process.env`); no `process.*` here. */
79
+ export function isNoColor(env) {
80
+ const v = env.NO_COLOR;
81
+ return typeof v === "string" && v.length > 0;
82
+ }
83
+ /**
84
+ * Resolve a palette. `NO_COLOR` wins over any setting; otherwise `'light'` →
85
+ * the light palette and `'dark'`/`'auto'`/undefined → dark. `env` is injected.
86
+ */
87
+ export function resolveTheme(setting, env) {
88
+ if (isNoColor(env))
89
+ return noColorTheme;
90
+ return setting === "light" ? lightTheme : darkTheme;
91
+ }
92
+ /** Build the glyph set for a platform. `platform` is injected (the TUI shim
93
+ * passes `process.platform`); only the `dot` differs (`darwin` → `⏺`, else
94
+ * `●`). A plain `string` param keeps this off `NodeJS.Platform` / `@types/node`. */
95
+ export function makeGlyphs(platform) {
96
+ return {
97
+ dot: platform === "darwin" ? "⏺" : "●",
98
+ branch: "⎿",
99
+ prompt: "❯",
100
+ blockquote: "▎",
101
+ plan: "⏸",
102
+ accept: "⏵⏵",
103
+ tick: "✓",
104
+ hr: "─",
105
+ bullet: "•",
106
+ thinking: "✻",
107
+ arrowDown: "↓",
108
+ arrowUp: "↑",
109
+ };
110
+ }
111
+ /** Spinner pulse: 6 frames then their reverse = a 12-step in/out pulse
112
+ * (claude-code `Spinner.tsx` `[...frames, ...reversed]`). Tick ~120 ms. */
113
+ const SPINNER_BASE = ["·", "✢", "✱", "✶", "✻", "✽"];
114
+ export const SPINNER_FRAMES = [...SPINNER_BASE, ...[...SPINNER_BASE].reverse()];
115
+ /** Static glyph shown instead of the animation under reduced-motion / NO_COLOR. */
116
+ export const SPINNER_STATIC = "●";
117
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * (5.9 / v14) Pure view-side tool-call label. Renders `⏺ Name(argSummary)` —
3
+ * see `tool-message.tsx`. This is a MINIMAL, NON-AUTHORITATIVE label (codex R1
4
+ * SHOULD-1): it only echoes the call's own args (available on the `tool:call`
5
+ * bus event, which carries no `ToolContext`). It deliberately does NOT claim
6
+ * create-vs-overwrite, byte counts, or diffs — that fidelity comes only from
7
+ * the richer permission summary (`tool:permission`), which the view stashes
8
+ * and renders under the `⎿` branch (see `view-model.ts`).
9
+ *
10
+ * Pure `(name, args) => string`, so it is fully unit-testable without Ink.
11
+ *
12
+ * (v17 ui-core) NO `node:*`: `home` is always injected by the caller (the TUI
13
+ * passes `homedir()`; the web/server passes the engine's reported home or
14
+ * nothing). When `home` is absent, paths are shown verbatim (no `~` fold) —
15
+ * the browser-safe degradation.
16
+ */
17
+ /** Collapse a leading home-dir to `~`. `home` is injected by the caller; when
18
+ * absent (browser/no-home) the path is returned verbatim. Handles both POSIX
19
+ * (`/`) and Windows (`\`) separators after the home prefix (codex R2 NICE-8). */
20
+ export declare function homeRelative(path: string, home?: string): string;
21
+ /** Display name for a tool: builtin names verbatim; `mcp__<server>__<tool>`
22
+ * shown as `<server›>`. Edit/write get a claude-code-style verb. */
23
+ export declare function toolDisplayName(name: string): string;
24
+ /** `mcp__<server>__<tool>` → `{server, tool}`; null for non-MCP or malformed
25
+ * names (empty server — codex R2 NICE-9). A `mcp__<server>` with no `__tool`
26
+ * is allowed (server-level), but an empty server component is rejected. */
27
+ export declare function parseMcpName(name: string): {
28
+ server: string;
29
+ tool: string;
30
+ } | null;
31
+ /**
32
+ * The parenthesized argument summary for the header. Empty string ⇒ the header
33
+ * renders just `⏺ Name` with no parens.
34
+ */
35
+ export declare function formatToolCall(name: string, args: unknown, opts?: {
36
+ home?: string;
37
+ }): string;
38
+ //# sourceMappingURL=tool-line.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-line.d.ts","sourceRoot":"","sources":["../src/tool-line.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAYH;;kFAEkF;AAClF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAOhE;AAQD;qEACqE;AACrE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmCpD;AAED;;4EAE4E;AAC5E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOlF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAsD5F"}