xiaotime 0.5.5 → 0.5.6

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 (50) hide show
  1. package/dist/session.d.ts.map +1 -1
  2. package/dist/session.js +5 -1
  3. package/dist/session.js.map +1 -1
  4. package/dist/sidebar.js +1 -1
  5. package/dist/sidebar.js.map +1 -1
  6. package/package.json +4 -4
  7. package/dist/__tests__/ansi_tags.test.d.ts +0 -9
  8. package/dist/__tests__/ansi_tags.test.d.ts.map +0 -1
  9. package/dist/__tests__/ansi_tags.test.js +0 -58
  10. package/dist/__tests__/ansi_tags.test.js.map +0 -1
  11. package/dist/__tests__/approval_menu.test.d.ts +0 -15
  12. package/dist/__tests__/approval_menu.test.d.ts.map +0 -1
  13. package/dist/__tests__/approval_menu.test.js +0 -107
  14. package/dist/__tests__/approval_menu.test.js.map +0 -1
  15. package/dist/__tests__/bot_name.test.d.ts +0 -2
  16. package/dist/__tests__/bot_name.test.d.ts.map +0 -1
  17. package/dist/__tests__/bot_name.test.js +0 -43
  18. package/dist/__tests__/bot_name.test.js.map +0 -1
  19. package/dist/__tests__/legacy_compat.test.d.ts +0 -2
  20. package/dist/__tests__/legacy_compat.test.d.ts.map +0 -1
  21. package/dist/__tests__/legacy_compat.test.js +0 -36
  22. package/dist/__tests__/legacy_compat.test.js.map +0 -1
  23. package/dist/__tests__/paste_transform_submit.test.d.ts +0 -2
  24. package/dist/__tests__/paste_transform_submit.test.d.ts.map +0 -1
  25. package/dist/__tests__/paste_transform_submit.test.js +0 -74
  26. package/dist/__tests__/paste_transform_submit.test.js.map +0 -1
  27. package/dist/__tests__/server_tool_render.test.d.ts +0 -17
  28. package/dist/__tests__/server_tool_render.test.d.ts.map +0 -1
  29. package/dist/__tests__/server_tool_render.test.js +0 -74
  30. package/dist/__tests__/server_tool_render.test.js.map +0 -1
  31. package/dist/__tests__/session_match.test.d.ts +0 -10
  32. package/dist/__tests__/session_match.test.d.ts.map +0 -1
  33. package/dist/__tests__/session_match.test.js +0 -55
  34. package/dist/__tests__/session_match.test.js.map +0 -1
  35. package/dist/__tests__/settings.test.d.ts +0 -16
  36. package/dist/__tests__/settings.test.d.ts.map +0 -1
  37. package/dist/__tests__/settings.test.js +0 -289
  38. package/dist/__tests__/settings.test.js.map +0 -1
  39. package/dist/__tests__/tool_result_client.test.d.ts +0 -20
  40. package/dist/__tests__/tool_result_client.test.d.ts.map +0 -1
  41. package/dist/__tests__/tool_result_client.test.js +0 -142
  42. package/dist/__tests__/tool_result_client.test.js.map +0 -1
  43. package/dist/__tests__/tools.test.d.ts +0 -17
  44. package/dist/__tests__/tools.test.d.ts.map +0 -1
  45. package/dist/__tests__/tools.test.js +0 -546
  46. package/dist/__tests__/tools.test.js.map +0 -1
  47. package/dist/__tests__/ui_state_listener_lifecycle.test.d.ts +0 -2
  48. package/dist/__tests__/ui_state_listener_lifecycle.test.d.ts.map +0 -1
  49. package/dist/__tests__/ui_state_listener_lifecycle.test.js +0 -152
  50. package/dist/__tests__/ui_state_listener_lifecycle.test.js.map +0 -1
@@ -1,152 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- /**
4
- * Stdin keypress listener lifecycle tests.
5
- *
6
- * SPRINT-CLI-INPUT-AND-TOOL-HARDENING-1 (#7299) PR2.
7
- *
8
- * The bug being guarded: each `_makeRl` call attaches a fresh readline
9
- * `Interface` with `terminal: true`, which in turn registers a keypress
10
- * listener on `process.stdin`. Node's `rl.close()` is documented to
11
- * detach that listener, but the cleanup is unreliable when stdin's raw
12
- * mode was toggled mid-cycle (the approval-menu path does that). The
13
- * pre-fix accumulation: every `promptApprovalMenu` cycle left one extra
14
- * keypress listener attached, and every active listener echoes
15
- * keystrokes independently. Stephan observed 6-8x character
16
- * multiplication after a session with several approval-required tool
17
- * calls 2026-05-25.
18
- *
19
- * The fix in `_makeRl` strips leftover `keypress` listeners before
20
- * `readline.createInterface` attaches the new one — Node's
21
- * `emitKeypressEvents` re-bootstraps on the next createInterface, so
22
- * the keypress event infrastructure is preserved.
23
- *
24
- * These tests pin the listener-count contract: after any number of rl
25
- * recreations, the count of `keypress` listeners on `process.stdin`
26
- * stays at exactly 1 (the live rl's). Each test drives at least one
27
- * full approval-menu cycle via the no-TTY fall-through path that
28
- * `approval_menu.test.ts` already exercises (vitest's stdin is not a
29
- * TTY, so `setRawMode` throws and the menu returns `(no TTY)` —
30
- * `_makeRl` still fires in the `finally` block, which is the
31
- * load-bearing path for this guard).
32
- */
33
- const vitest_1 = require("vitest");
34
- const ui_state_js_1 = require("../ui_state.js");
35
- /** Listener types `_makeRl` strips, by stream. Each
36
- * readline.createInterface({ terminal: true }) registers one of each
37
- * on the indicated stream. `resize` lives on stdout (readline tracks
38
- * terminal width from the output stream); the other three on stdin.
39
- * Keep these in sync with `_makeRl`. */
40
- const STDIN_EVENTS = ["keypress", "end", "error"];
41
- const STDOUT_EVENTS = ["resize"];
42
- function _stripAll() {
43
- for (const ev of STDIN_EVENTS)
44
- process.stdin.removeAllListeners(ev);
45
- for (const ev of STDOUT_EVENTS)
46
- process.stdout.removeAllListeners(ev);
47
- }
48
- (0, vitest_1.beforeEach)(() => {
49
- // Suppress menu output; we only care about listener counts.
50
- vitest_1.vi.spyOn(process.stdout, "write").mockImplementation(() => true);
51
- });
52
- (0, vitest_1.afterEach)(() => {
53
- vitest_1.vi.restoreAllMocks();
54
- // Clean slate for the next test — otherwise an accidental leak
55
- // here would surface as a failure in an unrelated downstream test.
56
- _stripAll();
57
- });
58
- (0, vitest_1.describe)("stdin keypress listener lifecycle — ISC-7299-003", () => {
59
- (0, vitest_1.test)("single SessionUI instantiation attaches exactly one keypress listener", () => {
60
- process.stdin.removeAllListeners("keypress");
61
- const ui = new ui_state_js_1.SessionUI();
62
- // _makeRl ran once in the constructor → one new keypress listener.
63
- (0, vitest_1.expect)(process.stdin.listenerCount("keypress")).toBe(1);
64
- ui.getRl().close();
65
- });
66
- (0, vitest_1.test)("count stays at 1 after one approval-menu cycle", async () => {
67
- process.stdin.removeAllListeners("keypress");
68
- const ui = new ui_state_js_1.SessionUI();
69
- (0, vitest_1.expect)(process.stdin.listenerCount("keypress")).toBe(1);
70
- // promptApprovalMenu bails on no-TTY but the finally block still
71
- // runs `_makeRl`, so this exercises the recreate path. Pre-fix,
72
- // this would leave the previous rl's keypress listener attached
73
- // and the count would jump to 2.
74
- await ui.promptApprovalMenu();
75
- (0, vitest_1.expect)(process.stdin.listenerCount("keypress")).toBe(1);
76
- ui.getRl().close();
77
- });
78
- (0, vitest_1.test)("count stays at 1 after five sequential approval-menu cycles", async () => {
79
- // The user-observed bug: 6-8x character echo after several tool
80
- // calls. This test replays the exact accumulation path and asserts
81
- // it does not grow.
82
- process.stdin.removeAllListeners("keypress");
83
- const ui = new ui_state_js_1.SessionUI();
84
- for (let i = 0; i < 5; i++) {
85
- await ui.promptApprovalMenu();
86
- // After EACH cycle the count must still be 1 — not 2, not 6.
87
- (0, vitest_1.expect)(process.stdin.listenerCount("keypress")).toBe(1);
88
- }
89
- ui.getRl().close();
90
- });
91
- (0, vitest_1.test)("end / error / resize listeners also stay bounded across cycles", async () => {
92
- // Adjacent leaks — same root cause as the keypress leak
93
- // (rl.close() doesn't reliably detach on setRawMode-toggled
94
- // stdin), different event types. `end` / `error` accumulate on
95
- // stdin; `resize` accumulates on stdout (readline tracks terminal
96
- // width from the output stream). Pre-fix these crossed Node's
97
- // default MaxListeners (10) after ~11 recreations and logged
98
- // MaxListenersExceededWarning to stderr. Post-fix the strip in
99
- // `_makeRl` keeps each at ≤ a single-digit ceiling across an
100
- // unbounded number of cycles.
101
- _stripAll();
102
- const ui = new ui_state_js_1.SessionUI();
103
- for (let i = 0; i < 15; i++) {
104
- await ui.promptApprovalMenu();
105
- }
106
- // Each event type ends up with the live rl's single listener.
107
- // Cap the assertion at 2 to leave headroom for Node-version-
108
- // specific listener-shape changes — the bug was unbounded growth,
109
- // not a precise count. Pre-fix this would be ~16 per event type.
110
- for (const ev of STDIN_EVENTS) {
111
- (0, vitest_1.expect)(process.stdin.listenerCount(ev)).toBeLessThanOrEqual(2);
112
- }
113
- for (const ev of STDOUT_EVENTS) {
114
- (0, vitest_1.expect)(process.stdout.listenerCount(ev)).toBeLessThanOrEqual(2);
115
- }
116
- ui.getRl().close();
117
- });
118
- (0, vitest_1.test)("count returns to 0 after the live rl closes", () => {
119
- process.stdin.removeAllListeners("keypress");
120
- const ui = new ui_state_js_1.SessionUI();
121
- (0, vitest_1.expect)(process.stdin.listenerCount("keypress")).toBe(1);
122
- ui.getRl().close();
123
- // Node's rl.close() detaches its own keypress listener cleanly in
124
- // the normal (no-raw-mode-toggle) shutdown path. This is the
125
- // baseline that the bug breaks — keypress count should land at 0
126
- // after close in normal teardown.
127
- (0, vitest_1.expect)(process.stdin.listenerCount("keypress")).toBe(0);
128
- });
129
- });
130
- (0, vitest_1.describe)("character-multiplication regression — ISC-7299-004", () => {
131
- // Direct integration of the multiplication scenario: drive 5
132
- // approval cycles, then assert that a single emitted keypress would
133
- // be handled by exactly one listener. We can't observe stdout-echo
134
- // counts directly under vitest (no real TTY), but the listener
135
- // count IS the proximate cause — N listeners produces N+1 echo.
136
- // This test wraps the listener-count guarantee in the user-visible
137
- // failure-mode framing so a future regression is read as the
138
- // multiplication bug it would surface as in production.
139
- (0, vitest_1.test)("after 5 simulated failed tool-approval cycles, exactly one keypress handler is active", async () => {
140
- process.stdin.removeAllListeners("keypress");
141
- const ui = new ui_state_js_1.SessionUI();
142
- for (let i = 0; i < 5; i++) {
143
- await ui.promptApprovalMenu();
144
- }
145
- // Pre-fix observed at this point: 6 listeners → user types 'a',
146
- // terminal renders 'aaaaaa'. Post-fix: 1 listener → 'a' renders
147
- // exactly once.
148
- (0, vitest_1.expect)(process.stdin.listenerCount("keypress")).toBe(1);
149
- ui.getRl().close();
150
- });
151
- });
152
- //# sourceMappingURL=ui_state_listener_lifecycle.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ui_state_listener_lifecycle.test.js","sourceRoot":"","sources":["../../src/__tests__/ui_state_listener_lifecycle.test.ts"],"names":[],"mappings":"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"}