xiaotime 0.5.1 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/ansi_tags.test.d.ts +9 -0
- package/dist/__tests__/ansi_tags.test.d.ts.map +1 -0
- package/dist/__tests__/ansi_tags.test.js +58 -0
- package/dist/__tests__/ansi_tags.test.js.map +1 -0
- package/dist/__tests__/paste_transform_submit.test.d.ts +2 -0
- package/dist/__tests__/paste_transform_submit.test.d.ts.map +1 -0
- package/dist/__tests__/paste_transform_submit.test.js +74 -0
- package/dist/__tests__/paste_transform_submit.test.js.map +1 -0
- package/dist/__tests__/session_match.test.d.ts +10 -0
- package/dist/__tests__/session_match.test.d.ts.map +1 -0
- package/dist/__tests__/session_match.test.js +55 -0
- package/dist/__tests__/session_match.test.js.map +1 -0
- package/dist/ansi_tags.d.ts +20 -0
- package/dist/ansi_tags.d.ts.map +1 -0
- package/dist/ansi_tags.js +38 -0
- package/dist/ansi_tags.js.map +1 -0
- package/dist/config.d.ts +1 -1
- package/dist/config.js +1 -1
- package/dist/display.d.ts +53 -22
- package/dist/display.d.ts.map +1 -1
- package/dist/display.js +750 -47
- package/dist/display.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -3
- package/dist/index.js.map +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +5 -2
- package/dist/session.js.map +1 -1
- package/dist/session_match.d.ts +19 -0
- package/dist/session_match.d.ts.map +1 -0
- package/dist/session_match.js +9 -0
- package/dist/session_match.js.map +1 -0
- package/dist/sidebar.d.ts +84 -0
- package/dist/sidebar.d.ts.map +1 -0
- package/dist/sidebar.js +310 -0
- package/dist/sidebar.js.map +1 -0
- package/dist/tools.d.ts +4 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +25 -66
- package/dist/tools.js.map +1 -1
- package/dist/ui_state.d.ts +41 -96
- package/dist/ui_state.d.ts.map +1 -1
- package/dist/ui_state.js +226 -213
- package/dist/ui_state.js.map +1 -1
- package/dist/ws.d.ts +10 -14
- package/dist/ws.d.ts.map +1 -1
- package/dist/ws.js +240 -119
- package/dist/ws.js.map +1 -1
- package/package.json +10 -5
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for the ANSI → blessed {tags} converter.
|
|
3
|
+
*
|
|
4
|
+
* SPRINT-CLI-GRANDMA-UX (#8191 CodeReview follow-up):
|
|
5
|
+
* - Pins the supported chalk palette mapping and asserts unrecognized escape
|
|
6
|
+
* runs are stripped (never leaked as raw bytes into the blessed buffer).
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=ansi_tags.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ansi_tags.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ansi_tags.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for the ANSI → blessed {tags} converter.
|
|
4
|
+
*
|
|
5
|
+
* SPRINT-CLI-GRANDMA-UX (#8191 CodeReview follow-up):
|
|
6
|
+
* - Pins the supported chalk palette mapping and asserts unrecognized escape
|
|
7
|
+
* runs are stripped (never leaked as raw bytes into the blessed buffer).
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
const vitest_1 = require("vitest");
|
|
11
|
+
const ansi_tags_js_1 = require("../ansi_tags.js");
|
|
12
|
+
(0, vitest_1.describe)("ansiToBlessedTags", () => {
|
|
13
|
+
(0, vitest_1.test)("translates the SGR reset", () => {
|
|
14
|
+
(0, vitest_1.expect)((0, ansi_tags_js_1.ansiToBlessedTags)("hi\x1b[0m")).toBe("hi{/}");
|
|
15
|
+
});
|
|
16
|
+
(0, vitest_1.test)("translates bold and italic", () => {
|
|
17
|
+
(0, vitest_1.expect)((0, ansi_tags_js_1.ansiToBlessedTags)("\x1b[1mb\x1b[0m")).toBe("{bold}b{/}");
|
|
18
|
+
(0, vitest_1.expect)((0, ansi_tags_js_1.ansiToBlessedTags)("\x1b[3mi\x1b[0m")).toBe("{italic}i{/}");
|
|
19
|
+
});
|
|
20
|
+
(0, vitest_1.test)("translates dim to the muted grey", () => {
|
|
21
|
+
(0, vitest_1.expect)((0, ansi_tags_js_1.ansiToBlessedTags)("\x1b[2mdim")).toBe("{#45475a-fg}dim");
|
|
22
|
+
});
|
|
23
|
+
(0, vitest_1.test)("translates the brand red truecolour", () => {
|
|
24
|
+
(0, vitest_1.expect)((0, ansi_tags_js_1.ansiToBlessedTags)("\x1b[38;2;192;56;75mX\x1b[0m")).toBe("{#c0384b-fg}X{/}");
|
|
25
|
+
});
|
|
26
|
+
(0, vitest_1.test)("translates each supported truecolour foreground", () => {
|
|
27
|
+
const cases = [
|
|
28
|
+
["\x1b[38;2;137;180;250m", "{#89b4fa-fg}"],
|
|
29
|
+
["\x1b[38;2;166;227;161m", "{#a6e3a1-fg}"],
|
|
30
|
+
["\x1b[38;2;243;139;168m", "{#f38ba8-fg}"],
|
|
31
|
+
["\x1b[38;2;148;226;213m", "{#94e2d5-fg}"],
|
|
32
|
+
["\x1b[38;2;249;226;175m", "{#f9e2af-fg}"],
|
|
33
|
+
["\x1b[38;2;205;214;244m", "{#cdd6f4-fg}"],
|
|
34
|
+
["\x1b[38;2;108;112;134m", "{#6c7086-fg}"],
|
|
35
|
+
];
|
|
36
|
+
for (const [ansi, tag] of cases) {
|
|
37
|
+
(0, vitest_1.expect)((0, ansi_tags_js_1.ansiToBlessedTags)(`${ansi}z`)).toBe(`${tag}z`);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
(0, vitest_1.test)("strips unrecognized SGR codes rather than leaking raw escapes", () => {
|
|
41
|
+
// \x1b[22m (no-bold) is not mapped — it must be removed, not passed through.
|
|
42
|
+
(0, vitest_1.expect)((0, ansi_tags_js_1.ansiToBlessedTags)("a\x1b[22mb")).toBe("ab");
|
|
43
|
+
(0, vitest_1.expect)((0, ansi_tags_js_1.ansiToBlessedTags)("\x1b[38;5;200mq")).toBe("q");
|
|
44
|
+
});
|
|
45
|
+
(0, vitest_1.test)("leaves plain text untouched", () => {
|
|
46
|
+
(0, vitest_1.expect)((0, ansi_tags_js_1.ansiToBlessedTags)("just words")).toBe("just words");
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.test)("pins the current behavior for nested/overlapping sequences", () => {
|
|
49
|
+
// The converter does NOT model nesting (documented in ansi_tags.ts) — each
|
|
50
|
+
// recognized code maps independently. This locks in the observed output so
|
|
51
|
+
// a future change to the mapping order surfaces in review.
|
|
52
|
+
(0, vitest_1.expect)((0, ansi_tags_js_1.ansiToBlessedTags)("\x1b[1m\x1b[3mbold+italic\x1b[0m")).toBe("{bold}{italic}bold+italic{/}");
|
|
53
|
+
// Partial reset (\x1b[22m no-bold) is unrecognized → stripped, leaving the
|
|
54
|
+
// opening {bold} tag unclosed. This is a known limitation, pinned here.
|
|
55
|
+
(0, vitest_1.expect)((0, ansi_tags_js_1.ansiToBlessedTags)("\x1b[1mbold\x1b[22mplain")).toBe("{bold}boldplain");
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=ansi_tags.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ansi_tags.test.js","sourceRoot":"","sources":["../../src/__tests__/ansi_tags.test.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAEH,mCAAgD;AAChD,kDAAoD;AAEpD,IAAA,iBAAQ,EAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAA,aAAI,EAAC,0BAA0B,EAAE,GAAG,EAAE;QACpC,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,4BAA4B,EAAE,GAAG,EAAE;QACtC,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAChE,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,kCAAkC,EAAE,GAAG,EAAE;QAC5C,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,iDAAiD,EAAE,GAAG,EAAE;QAC3D,MAAM,KAAK,GAA4B;YACrC,CAAC,wBAAwB,EAAE,cAAc,CAAC;YAC1C,CAAC,wBAAwB,EAAE,cAAc,CAAC;YAC1C,CAAC,wBAAwB,EAAE,cAAc,CAAC;YAC1C,CAAC,wBAAwB,EAAE,cAAc,CAAC;YAC1C,CAAC,wBAAwB,EAAE,cAAc,CAAC;YAC1C,CAAC,wBAAwB,EAAE,cAAc,CAAC;YAC1C,CAAC,wBAAwB,EAAE,cAAc,CAAC;SAC3C,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;YAChC,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,+DAA+D,EAAE,GAAG,EAAE;QACzE,6EAA6E;QAC7E,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,6BAA6B,EAAE,GAAG,EAAE;QACvC,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,4DAA4D,EAAE,GAAG,EAAE;QACtE,2EAA2E;QAC3E,2EAA2E;QAC3E,2DAA2D;QAC3D,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAChE,8BAA8B,CAC/B,CAAC;QACF,2EAA2E;QAC3E,wEAAwE;QACxE,IAAA,eAAM,EAAC,IAAA,gCAAiB,EAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paste_transform_submit.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/paste_transform_submit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* PasteTransform submission + paste-collapsing tests.
|
|
5
|
+
*
|
|
6
|
+
* SPRINT-CLI-INPUT-ENTER-SUBMIT-FIX:
|
|
7
|
+
* Guards the regression where a deliberate Enter (a lone CR/LF chunk) was
|
|
8
|
+
* routed into the rapid-paste buffer and collapsed to a space by
|
|
9
|
+
* _scheduleRapidFlush. readline never saw a line terminator, so NO prompt
|
|
10
|
+
* ever submitted — every message in `xiaotime dev` hung at "ready".
|
|
11
|
+
*
|
|
12
|
+
* The contract pinned here:
|
|
13
|
+
* - a bare Enter passes through unchanged → readline gets a line terminator
|
|
14
|
+
* - a multi-line paste (one chunk or a fast burst) still collapses to a
|
|
15
|
+
* single line with no embedded terminator
|
|
16
|
+
*/
|
|
17
|
+
const vitest_1 = require("vitest");
|
|
18
|
+
const ui_state_js_1 = require("../ui_state.js");
|
|
19
|
+
/** Write each chunk into a fresh PasteTransform and resolve with everything
|
|
20
|
+
* its `sink` emitted, after the rapid-flush idle window (60ms) has elapsed. */
|
|
21
|
+
function feed(chunks, waitMs = 150) {
|
|
22
|
+
return new Promise((resolve) => {
|
|
23
|
+
const pt = new ui_state_js_1.PasteTransform();
|
|
24
|
+
let out = "";
|
|
25
|
+
pt.sink.on("data", (b) => {
|
|
26
|
+
out += b.toString();
|
|
27
|
+
});
|
|
28
|
+
for (const c of chunks)
|
|
29
|
+
pt.write(Buffer.from(c));
|
|
30
|
+
setTimeout(() => resolve(out), waitMs);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
const hasTerminator = (s) => /[\r\n]/.test(s);
|
|
34
|
+
(0, vitest_1.describe)("PasteTransform — Enter submits, pastes collapse", () => {
|
|
35
|
+
(0, vitest_1.test)("a typed line followed by Enter passes a line terminator through", async () => {
|
|
36
|
+
const out = await feed(["h", "e", "y", "\r"]);
|
|
37
|
+
(0, vitest_1.expect)(out).toBe("hey\r");
|
|
38
|
+
(0, vitest_1.expect)(hasTerminator(out)).toBe(true); // readline would emit `line` → submit
|
|
39
|
+
});
|
|
40
|
+
(0, vitest_1.test)("a lone Enter on an empty prompt still submits", async () => {
|
|
41
|
+
const out = await feed(["\r"]);
|
|
42
|
+
(0, vitest_1.expect)(hasTerminator(out)).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.test)("a bare LF (\\n) also passes through", async () => {
|
|
45
|
+
const out = await feed(["\n"]);
|
|
46
|
+
(0, vitest_1.expect)(hasTerminator(out)).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.test)("a multi-line paste in one chunk collapses to a single line", async () => {
|
|
49
|
+
const out = await feed(["line1\nline2\n"]);
|
|
50
|
+
(0, vitest_1.expect)(hasTerminator(out)).toBe(false); // newlines replaced with spaces
|
|
51
|
+
(0, vitest_1.expect)(out).toBe("line1 line2 ");
|
|
52
|
+
});
|
|
53
|
+
(0, vitest_1.test)("a fast-typed line + Enter batched into ONE chunk submits on the first Enter", async () => {
|
|
54
|
+
// SSH clients (Termius/mosh) batch the line and its trailing Enter into a
|
|
55
|
+
// single read. The trailing \r must survive as a line terminator, or the
|
|
56
|
+
// first Enter does nothing and you have to press Enter twice.
|
|
57
|
+
const out = await feed(["hey junior\r"]);
|
|
58
|
+
(0, vitest_1.expect)(out).toBe("hey junior\r");
|
|
59
|
+
(0, vitest_1.expect)(hasTerminator(out)).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
(0, vitest_1.test)("a multi-line paste WITH a trailing newline still does NOT submit", async () => {
|
|
62
|
+
// An internal newline marks a genuine paste — it must collapse for review,
|
|
63
|
+
// never auto-submit, even though it ends in a newline.
|
|
64
|
+
const out = await feed(["alpha\nbeta\n"]);
|
|
65
|
+
(0, vitest_1.expect)(hasTerminator(out)).toBe(false);
|
|
66
|
+
(0, vitest_1.expect)(out).toBe("alpha beta ");
|
|
67
|
+
});
|
|
68
|
+
(0, vitest_1.test)("plain typed characters with no Enter pass straight through", async () => {
|
|
69
|
+
const out = await feed(["h", "i"]);
|
|
70
|
+
(0, vitest_1.expect)(out).toBe("hi");
|
|
71
|
+
(0, vitest_1.expect)(hasTerminator(out)).toBe(false); // nothing submits until Enter
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=paste_transform_submit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paste_transform_submit.test.js","sourceRoot":"","sources":["../../src/__tests__/paste_transform_submit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Precedence tests for the `xiaotime replay` session matcher.
|
|
3
|
+
*
|
|
4
|
+
* SPRINT-CLI-GRANDMA-UX (#8191 CodeReview follow-up):
|
|
5
|
+
* - Locks the exact-name → exact-id → prefix-id ordering so the original
|
|
6
|
+
* bug (a session name that is a prefix of another session's id shadowing
|
|
7
|
+
* the exact-id match) can't regress.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=session_match.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session_match.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/session_match.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Precedence tests for the `xiaotime replay` session matcher.
|
|
4
|
+
*
|
|
5
|
+
* SPRINT-CLI-GRANDMA-UX (#8191 CodeReview follow-up):
|
|
6
|
+
* - Locks the exact-name → exact-id → prefix-id ordering so the original
|
|
7
|
+
* bug (a session name that is a prefix of another session's id shadowing
|
|
8
|
+
* the exact-id match) can't regress.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
const vitest_1 = require("vitest");
|
|
12
|
+
const session_match_js_1 = require("../session_match.js");
|
|
13
|
+
const mk = (id, session_name) => ({
|
|
14
|
+
id,
|
|
15
|
+
session_name,
|
|
16
|
+
});
|
|
17
|
+
(0, vitest_1.describe)("matchSession", () => {
|
|
18
|
+
(0, vitest_1.test)("matches by exact session_name", () => {
|
|
19
|
+
const sessions = [mk("abc123", "morning"), mk("def456", "evening")];
|
|
20
|
+
(0, vitest_1.expect)((0, session_match_js_1.matchSession)(sessions, "evening")?.id).toBe("def456");
|
|
21
|
+
});
|
|
22
|
+
(0, vitest_1.test)("matches by exact id", () => {
|
|
23
|
+
const sessions = [mk("abc123", "morning"), mk("def456", "evening")];
|
|
24
|
+
(0, vitest_1.expect)((0, session_match_js_1.matchSession)(sessions, "def456")?.session_name).toBe("evening");
|
|
25
|
+
});
|
|
26
|
+
(0, vitest_1.test)("matches by id prefix when no exact match exists", () => {
|
|
27
|
+
const sessions = [mk("abc123def", "morning"), mk("xyz789", "evening")];
|
|
28
|
+
(0, vitest_1.expect)((0, session_match_js_1.matchSession)(sessions, "abc")?.id).toBe("abc123def");
|
|
29
|
+
});
|
|
30
|
+
(0, vitest_1.test)("exact name wins over an id prefix collision", () => {
|
|
31
|
+
// "abc" is BOTH a real session name AND a prefix of another session's id.
|
|
32
|
+
// Exact-name must win — the original ordering returned the id-prefix match.
|
|
33
|
+
const sessions = [mk("zzz000", "abc"), mk("abc123", "other")];
|
|
34
|
+
(0, vitest_1.expect)((0, session_match_js_1.matchSession)(sessions, "abc")?.id).toBe("zzz000");
|
|
35
|
+
});
|
|
36
|
+
(0, vitest_1.test)("exact id wins over an id-prefix match (the regression)", () => {
|
|
37
|
+
// "abc" exactly identifies one session and is a prefix of another. The
|
|
38
|
+
// exact id must win — the pre-fix ordering put prefix before exact id.
|
|
39
|
+
const sessions = [mk("abc123", "longer"), mk("abc", "exact")];
|
|
40
|
+
(0, vitest_1.expect)((0, session_match_js_1.matchSession)(sessions, "abc")?.session_name).toBe("exact");
|
|
41
|
+
});
|
|
42
|
+
(0, vitest_1.test)("returns undefined when nothing matches", () => {
|
|
43
|
+
const sessions = [mk("abc123", "morning")];
|
|
44
|
+
(0, vitest_1.expect)((0, session_match_js_1.matchSession)(sessions, "nope")).toBeUndefined();
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.test)("returns undefined for an empty session list", () => {
|
|
47
|
+
(0, vitest_1.expect)((0, session_match_js_1.matchSession)([], "anything")).toBeUndefined();
|
|
48
|
+
});
|
|
49
|
+
(0, vitest_1.test)("does not match a null session_name against an empty-ish query", () => {
|
|
50
|
+
const sessions = [mk("abc123", null)];
|
|
51
|
+
(0, vitest_1.expect)((0, session_match_js_1.matchSession)(sessions, "")?.id).toBe("abc123"); // "" is a prefix of every id
|
|
52
|
+
(0, vitest_1.expect)((0, session_match_js_1.matchSession)([mk("abc123", null)], "morning")).toBeUndefined();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=session_match.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session_match.test.js","sourceRoot":"","sources":["../../src/__tests__/session_match.test.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAEH,mCAAgD;AAChD,0DAA0E;AAE1E,MAAM,EAAE,GAAG,CAAC,EAAU,EAAE,YAA2B,EAAyB,EAAE,CAAC,CAAC;IAC9E,EAAE;IACF,YAAY;CACb,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAA,aAAI,EAAC,+BAA+B,EAAE,GAAG,EAAE;QACzC,MAAM,QAAQ,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;QACpE,IAAA,eAAM,EAAC,IAAA,+BAAY,EAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,qBAAqB,EAAE,GAAG,EAAE;QAC/B,MAAM,QAAQ,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;QACpE,IAAA,eAAM,EAAC,IAAA,+BAAY,EAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,iDAAiD,EAAE,GAAG,EAAE;QAC3D,MAAM,QAAQ,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;QACvE,IAAA,eAAM,EAAC,IAAA,+BAAY,EAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,0EAA0E;QAC1E,4EAA4E;QAC5E,MAAM,QAAQ,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9D,IAAA,eAAM,EAAC,IAAA,+BAAY,EAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,wDAAwD,EAAE,GAAG,EAAE;QAClE,uEAAuE;QACvE,uEAAuE;QACvE,MAAM,QAAQ,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9D,IAAA,eAAM,EAAC,IAAA,+BAAY,EAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,wCAAwC,EAAE,GAAG,EAAE;QAClD,MAAM,QAAQ,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;QAC3C,IAAA,eAAM,EAAC,IAAA,+BAAY,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,IAAA,eAAM,EAAC,IAAA,+BAAY,EAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,+DAA+D,EAAE,GAAG,EAAE;QACzE,MAAM,QAAQ,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QACtC,IAAA,eAAM,EAAC,IAAA,+BAAY,EAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,6BAA6B;QACpF,IAAA,eAAM,EAAC,IAAA,+BAAY,EAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal ANSI → blessed {tags} converter.
|
|
3
|
+
*
|
|
4
|
+
* Pure, dependency-free, and unit-tested (see __tests__/ansi_tags.test.ts) so
|
|
5
|
+
* regressions surface when the chalk palette in display.ts changes.
|
|
6
|
+
*
|
|
7
|
+
* Supported subset (only the codes display.ts actually emits):
|
|
8
|
+
* - SGR reset \x1b[0m → {/}
|
|
9
|
+
* - dim \x1b[2m → {#45475a-fg}
|
|
10
|
+
* - bold \x1b[1m → {bold}
|
|
11
|
+
* - italic \x1b[3m → {italic}
|
|
12
|
+
* - 24-bit fg (the eight chalk truecolours below)
|
|
13
|
+
*
|
|
14
|
+
* Anything else (other SGR codes, nested/overlapping sequences, partial resets
|
|
15
|
+
* like \x1b[22m) is NOT translated — the trailing catch-all strips unrecognized
|
|
16
|
+
* `\x1b[…m` runs so raw escape bytes never leak into the blessed buffer. If a
|
|
17
|
+
* new style is added to display.ts, add its mapping here AND a test case.
|
|
18
|
+
*/
|
|
19
|
+
export declare function ansiToBlessedTags(text: string): string;
|
|
20
|
+
//# sourceMappingURL=ansi_tags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ansi_tags.d.ts","sourceRoot":"","sources":["../src/ansi_tags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAetD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ansiToBlessedTags = ansiToBlessedTags;
|
|
4
|
+
/**
|
|
5
|
+
* Minimal ANSI → blessed {tags} converter.
|
|
6
|
+
*
|
|
7
|
+
* Pure, dependency-free, and unit-tested (see __tests__/ansi_tags.test.ts) so
|
|
8
|
+
* regressions surface when the chalk palette in display.ts changes.
|
|
9
|
+
*
|
|
10
|
+
* Supported subset (only the codes display.ts actually emits):
|
|
11
|
+
* - SGR reset \x1b[0m → {/}
|
|
12
|
+
* - dim \x1b[2m → {#45475a-fg}
|
|
13
|
+
* - bold \x1b[1m → {bold}
|
|
14
|
+
* - italic \x1b[3m → {italic}
|
|
15
|
+
* - 24-bit fg (the eight chalk truecolours below)
|
|
16
|
+
*
|
|
17
|
+
* Anything else (other SGR codes, nested/overlapping sequences, partial resets
|
|
18
|
+
* like \x1b[22m) is NOT translated — the trailing catch-all strips unrecognized
|
|
19
|
+
* `\x1b[…m` runs so raw escape bytes never leak into the blessed buffer. If a
|
|
20
|
+
* new style is added to display.ts, add its mapping here AND a test case.
|
|
21
|
+
*/
|
|
22
|
+
function ansiToBlessedTags(text) {
|
|
23
|
+
return text
|
|
24
|
+
.replace(/\x1b\[0m/g, "{/}")
|
|
25
|
+
.replace(/\x1b\[2m/g, "{#45475a-fg}")
|
|
26
|
+
.replace(/\x1b\[1m/g, "{bold}")
|
|
27
|
+
.replace(/\x1b\[3m/g, "{italic}")
|
|
28
|
+
.replace(/\x1b\[38;2;192;56;75m/g, "{#c0384b-fg}")
|
|
29
|
+
.replace(/\x1b\[38;2;137;180;250m/g, "{#89b4fa-fg}")
|
|
30
|
+
.replace(/\x1b\[38;2;166;227;161m/g, "{#a6e3a1-fg}")
|
|
31
|
+
.replace(/\x1b\[38;2;243;139;168m/g, "{#f38ba8-fg}")
|
|
32
|
+
.replace(/\x1b\[38;2;148;226;213m/g, "{#94e2d5-fg}")
|
|
33
|
+
.replace(/\x1b\[38;2;249;226;175m/g, "{#f9e2af-fg}")
|
|
34
|
+
.replace(/\x1b\[38;2;205;214;244m/g, "{#cdd6f4-fg}")
|
|
35
|
+
.replace(/\x1b\[38;2;108;112;134m/g, "{#6c7086-fg}")
|
|
36
|
+
.replace(/\x1b\[[0-9;]*m/g, "");
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=ansi_tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ansi_tags.js","sourceRoot":"","sources":["../src/ansi_tags.ts"],"names":[],"mappings":";;AAkBA,8CAeC;AAjCD;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,iBAAiB,CAAC,IAAY;IAC5C,OAAO,IAAI;SACR,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC;SAC3B,OAAO,CAAC,WAAW,EAAE,cAAc,CAAC;SACpC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC;SAC9B,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC;SAChC,OAAO,CAAC,wBAAwB,EAAE,cAAc,CAAC;SACjD,OAAO,CAAC,0BAA0B,EAAE,cAAc,CAAC;SACnD,OAAO,CAAC,0BAA0B,EAAE,cAAc,CAAC;SACnD,OAAO,CAAC,0BAA0B,EAAE,cAAc,CAAC;SACnD,OAAO,CAAC,0BAA0B,EAAE,cAAc,CAAC;SACnD,OAAO,CAAC,0BAA0B,EAAE,cAAc,CAAC;SACnD,OAAO,CAAC,0BAA0B,EAAE,cAAc,CAAC;SACnD,OAAO,CAAC,0BAA0B,EAAE,cAAc,CAAC;SACnD,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -30,5 +30,5 @@ export declare const WS_URL: string;
|
|
|
30
30
|
* MUST stay in sync with `version` in package.json; the drift-guard
|
|
31
31
|
* test in `__tests__/legacy_compat.test.ts` enforces it.
|
|
32
32
|
*/
|
|
33
|
-
export declare const CLI_VERSION = "0.5.
|
|
33
|
+
export declare const CLI_VERSION = "0.5.2";
|
|
34
34
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.js
CHANGED
|
@@ -42,5 +42,5 @@ exports.WS_URL = toWsUrl(exports.ORCHESTRATOR_URL);
|
|
|
42
42
|
* MUST stay in sync with `version` in package.json; the drift-guard
|
|
43
43
|
* test in `__tests__/legacy_compat.test.ts` enforces it.
|
|
44
44
|
*/
|
|
45
|
-
exports.CLI_VERSION = "0.5.
|
|
45
|
+
exports.CLI_VERSION = "0.5.2";
|
|
46
46
|
//# sourceMappingURL=config.js.map
|
package/dist/display.d.ts
CHANGED
|
@@ -1,30 +1,61 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Output formatting — streaming text, session list,
|
|
2
|
+
* Output formatting — streaming text, session list, status bar, tool lines.
|
|
3
|
+
*
|
|
4
|
+
* SPRINT-CLI-UX-POLISH-5:
|
|
5
|
+
* - Thinking spinner (animates between submit and first token)
|
|
6
|
+
* - Animated tool lines (spinner → ✓ with elapsed on completion)
|
|
7
|
+
* - Diff view for write_file tool calls
|
|
8
|
+
* - Approval prompt styled as yellow bordered box
|
|
9
|
+
* - Keyboard shortcut bar shown ONCE on welcome only
|
|
10
|
+
* - Session resume shows last message preview
|
|
11
|
+
* - "Xiaotime Labs" wordmark in status bar
|
|
12
|
+
* - Word-wrap at terminal width (no mid-word cuts)
|
|
13
|
+
* - Code fence double-render fix
|
|
14
|
+
* - Sticky bottom status bar (no bg, connected dot, turn counter, last tool)
|
|
15
|
+
* - No cost in status bar
|
|
16
|
+
* - Double-border input box (╭─╮ top, you › inside, ╰─╯ on submit)
|
|
17
|
+
* - Red user/Junior text (#c0384b)
|
|
18
|
+
* - Claude Code-style turn headers (Junior ›)
|
|
19
|
+
* - Code blocks with full-width border + language tag
|
|
20
|
+
* - Turn separators between responses
|
|
21
|
+
* - Tool call lines with elapsed time + icons
|
|
22
|
+
*
|
|
23
|
+
* SPRINT-CLI-UX-POLISH-6:
|
|
24
|
+
* - Restored "Junior is thinking..." label.
|
|
25
|
+
* - Inline code backtick spans get subtle background tint
|
|
26
|
+
* - Auto-detect file paths in output — underlined + OSC 8 hyperlinks (iTerm2/Termius)
|
|
27
|
+
* - Tool call errors render as red-bordered box instead of inline text
|
|
28
|
+
* - Removed "Junior is thinking..." spinner label
|
|
3
29
|
*/
|
|
4
30
|
import type { Session } from "./session.js";
|
|
5
|
-
export declare function
|
|
31
|
+
export declare function initStatusBar(sessionId: string, sessionName: string | null, tenant?: string): void;
|
|
32
|
+
export declare function setConnected(connected: boolean): void;
|
|
33
|
+
export declare function incrementTurn(): void;
|
|
34
|
+
export declare function setLastTool(toolName: string): void;
|
|
35
|
+
export declare function updateStatusBarCost(_turnCostUsd: number): void;
|
|
36
|
+
export declare function startSpinner(label: string): void;
|
|
37
|
+
export declare function stopSpinner(finalLabel?: string, success?: boolean): void;
|
|
38
|
+
export declare function startToolLine(name: string, detail: string): void;
|
|
39
|
+
export declare function finishToolLine(success?: boolean, errorMessage?: string): void;
|
|
40
|
+
export declare function printToolError(toolName: string, errorMessage: string, durationMs?: number): void;
|
|
41
|
+
export declare function printFileDiff(path: string, before: string | null, after: string): void;
|
|
42
|
+
export declare function printApprovalPrompt(title: string, body: string): void;
|
|
6
43
|
export declare function printTextDelta(text: string): void;
|
|
44
|
+
export declare function printTurnStart(): void;
|
|
45
|
+
export declare function printThinkingStart(): void;
|
|
46
|
+
export declare function printThinkingStop(): void;
|
|
7
47
|
export declare function printTurnEnd(costUsd: number): void;
|
|
48
|
+
export declare function consumeFirstPrompt(): boolean;
|
|
49
|
+
export declare function printPrompt(_showHint?: boolean): void;
|
|
50
|
+
export declare function printPromptEnd(): void;
|
|
51
|
+
export declare function printWelcome(sessionId: string, sessionName: string | null, resumed: boolean, messageCount: number, lastMessagePreview?: string): void;
|
|
8
52
|
export declare function printError(message: string): void;
|
|
9
53
|
export declare function printSessionList(sessions: Session[]): void;
|
|
10
|
-
export declare function
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
* `server_tool_call` WS event the orchestrator now emits before each
|
|
18
|
-
* server-side dispatch, matching the visual style of the existing
|
|
19
|
-
* client-tool inline logs in cli/src/tools.ts (`[read_file] /path
|
|
20
|
-
* (N lines)`, `[git_status]`, etc.).
|
|
21
|
-
*
|
|
22
|
-
* `inputSummary` is built server-side (see
|
|
23
|
-
* `terminal_orchestrator/main.py::_build_server_tool_input_summary`)
|
|
24
|
-
* — ≤120 chars, preferred-keys-per-tool, middle-truncated values,
|
|
25
|
-
* no newlines. Empty inputSummary (e.g. librarian_list_collections,
|
|
26
|
-
* which has no meaningful input to render) drops to just the
|
|
27
|
-
* `[server:<name>]` prefix.
|
|
28
|
-
*/
|
|
29
|
-
export declare function printServerToolCall(name: string, inputSummary: string): void;
|
|
54
|
+
export declare function friendlyToolLabel(name: string): string;
|
|
55
|
+
export declare function friendlyError(raw: string): string;
|
|
56
|
+
export declare function printHelp(): void;
|
|
57
|
+
export declare function printDisconnectBanner(reconnecting?: boolean): void;
|
|
58
|
+
export declare function printExitConfirmation(): void;
|
|
59
|
+
export declare function printToolCallLine(name: string, detail: string, durationMs?: number, success?: boolean): void;
|
|
60
|
+
export declare function printServerToolCall(name: string, inputSummary: string, durationMs?: number): void;
|
|
30
61
|
//# sourceMappingURL=display.d.ts.map
|
package/dist/display.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../src/display.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../src/display.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAqN5C,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,MAAM,CAAC,EAAE,MAAM,QAOhB;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,OAAO,QAG9C;AAED,wBAAgB,aAAa,SAG5B;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,QAG3C;AAED,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,QAEvD;AAgBD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAYhD;AAED,wBAAgB,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,UAAO,GAAG,IAAI,CAWrE;AAgBD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAoBhE;AAED,wBAAgB,cAAc,CAAC,OAAO,UAAO,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAoB1E;AAMD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAuBhG;AAMD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,KAAK,EAAE,MAAM,GACZ,IAAI,CA4CN;AAMD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,IAAI,CAsBN;AAYD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,QAc1C;AA2DD,wBAAgB,cAAc,SAS7B;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,QAkB3C;AAYD,wBAAgB,kBAAkB,IAAI,OAAO,CAI5C;AAED,wBAAgB,WAAW,CAAC,SAAS,UAAQ,QAmB5C;AAED,wBAAgB,cAAc,SAO7B;AAMD,wBAAgB,YAAY,CAC1B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,MAAM,EACpB,kBAAkB,CAAC,EAAE,MAAM,QA6C5B;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,QAOzC;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,QAmCnD;AAyED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAkBD,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOjD;AAMD,wBAAgB,SAAS,IAAI,IAAI,CAmChC;AAMD,wBAAgB,qBAAqB,CAAC,YAAY,UAAO,GAAG,IAAI,CAK/D;AAMD,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,UAAO,QASf;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI,CAQN"}
|