xiaotime 0.5.5 → 0.5.7

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 (61) hide show
  1. package/dist/display.d.ts.map +1 -1
  2. package/dist/display.js +27 -19
  3. package/dist/display.js.map +1 -1
  4. package/dist/input_box.d.ts +73 -0
  5. package/dist/input_box.d.ts.map +1 -0
  6. package/dist/input_box.js +167 -0
  7. package/dist/input_box.js.map +1 -0
  8. package/dist/session.d.ts.map +1 -1
  9. package/dist/session.js +5 -1
  10. package/dist/session.js.map +1 -1
  11. package/dist/sidebar.js +1 -1
  12. package/dist/sidebar.js.map +1 -1
  13. package/dist/ui_state.d.ts +1 -0
  14. package/dist/ui_state.d.ts.map +1 -1
  15. package/dist/ui_state.js +12 -0
  16. package/dist/ui_state.js.map +1 -1
  17. package/package.json +4 -4
  18. package/dist/__tests__/ansi_tags.test.d.ts +0 -9
  19. package/dist/__tests__/ansi_tags.test.d.ts.map +0 -1
  20. package/dist/__tests__/ansi_tags.test.js +0 -58
  21. package/dist/__tests__/ansi_tags.test.js.map +0 -1
  22. package/dist/__tests__/approval_menu.test.d.ts +0 -15
  23. package/dist/__tests__/approval_menu.test.d.ts.map +0 -1
  24. package/dist/__tests__/approval_menu.test.js +0 -107
  25. package/dist/__tests__/approval_menu.test.js.map +0 -1
  26. package/dist/__tests__/bot_name.test.d.ts +0 -2
  27. package/dist/__tests__/bot_name.test.d.ts.map +0 -1
  28. package/dist/__tests__/bot_name.test.js +0 -43
  29. package/dist/__tests__/bot_name.test.js.map +0 -1
  30. package/dist/__tests__/legacy_compat.test.d.ts +0 -2
  31. package/dist/__tests__/legacy_compat.test.d.ts.map +0 -1
  32. package/dist/__tests__/legacy_compat.test.js +0 -36
  33. package/dist/__tests__/legacy_compat.test.js.map +0 -1
  34. package/dist/__tests__/paste_transform_submit.test.d.ts +0 -2
  35. package/dist/__tests__/paste_transform_submit.test.d.ts.map +0 -1
  36. package/dist/__tests__/paste_transform_submit.test.js +0 -74
  37. package/dist/__tests__/paste_transform_submit.test.js.map +0 -1
  38. package/dist/__tests__/server_tool_render.test.d.ts +0 -17
  39. package/dist/__tests__/server_tool_render.test.d.ts.map +0 -1
  40. package/dist/__tests__/server_tool_render.test.js +0 -74
  41. package/dist/__tests__/server_tool_render.test.js.map +0 -1
  42. package/dist/__tests__/session_match.test.d.ts +0 -10
  43. package/dist/__tests__/session_match.test.d.ts.map +0 -1
  44. package/dist/__tests__/session_match.test.js +0 -55
  45. package/dist/__tests__/session_match.test.js.map +0 -1
  46. package/dist/__tests__/settings.test.d.ts +0 -16
  47. package/dist/__tests__/settings.test.d.ts.map +0 -1
  48. package/dist/__tests__/settings.test.js +0 -289
  49. package/dist/__tests__/settings.test.js.map +0 -1
  50. package/dist/__tests__/tool_result_client.test.d.ts +0 -20
  51. package/dist/__tests__/tool_result_client.test.d.ts.map +0 -1
  52. package/dist/__tests__/tool_result_client.test.js +0 -142
  53. package/dist/__tests__/tool_result_client.test.js.map +0 -1
  54. package/dist/__tests__/tools.test.d.ts +0 -17
  55. package/dist/__tests__/tools.test.d.ts.map +0 -1
  56. package/dist/__tests__/tools.test.js +0 -546
  57. package/dist/__tests__/tools.test.js.map +0 -1
  58. package/dist/__tests__/ui_state_listener_lifecycle.test.d.ts +0 -2
  59. package/dist/__tests__/ui_state_listener_lifecycle.test.d.ts.map +0 -1
  60. package/dist/__tests__/ui_state_listener_lifecycle.test.js +0 -152
  61. package/dist/__tests__/ui_state_listener_lifecycle.test.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"session_match.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/session_match.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -1,55 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"session_match.test.js","sourceRoot":"","sources":["../../src/__tests__/session_match.test.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- /**
2
- * Settings + allowlist tests.
3
- *
4
- * SPRINT-CLI-APPROVAL-MENU-1 (#6509) PR2.
5
- *
6
- * Tests:
7
- * - ISC-6509-003: pattern derivation per tool
8
- * - ISC-6509-004: matchAllowlist semantics + cross-tool isolation
9
- * - ISC-6509-007: load tolerance (missing / malformed / unknown
10
- * version) + mode 0600 on first write + on overwrite
11
- *
12
- * Tests redirect `XIAOTIME_SETTINGS_PATH` to a per-test tmpdir so
13
- * the real `~/.xiaotime/settings.json` is never touched.
14
- */
15
- export {};
16
- //# sourceMappingURL=settings.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/settings.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
@@ -1,289 +0,0 @@
1
- "use strict";
2
- /**
3
- * Settings + allowlist tests.
4
- *
5
- * SPRINT-CLI-APPROVAL-MENU-1 (#6509) PR2.
6
- *
7
- * Tests:
8
- * - ISC-6509-003: pattern derivation per tool
9
- * - ISC-6509-004: matchAllowlist semantics + cross-tool isolation
10
- * - ISC-6509-007: load tolerance (missing / malformed / unknown
11
- * version) + mode 0600 on first write + on overwrite
12
- *
13
- * Tests redirect `XIAOTIME_SETTINGS_PATH` to a per-test tmpdir so
14
- * the real `~/.xiaotime/settings.json` is never touched.
15
- */
16
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
- if (k2 === undefined) k2 = k;
18
- var desc = Object.getOwnPropertyDescriptor(m, k);
19
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
- desc = { enumerable: true, get: function() { return m[k]; } };
21
- }
22
- Object.defineProperty(o, k2, desc);
23
- }) : (function(o, m, k, k2) {
24
- if (k2 === undefined) k2 = k;
25
- o[k2] = m[k];
26
- }));
27
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
- Object.defineProperty(o, "default", { enumerable: true, value: v });
29
- }) : function(o, v) {
30
- o["default"] = v;
31
- });
32
- var __importStar = (this && this.__importStar) || (function () {
33
- var ownKeys = function(o) {
34
- ownKeys = Object.getOwnPropertyNames || function (o) {
35
- var ar = [];
36
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
37
- return ar;
38
- };
39
- return ownKeys(o);
40
- };
41
- return function (mod) {
42
- if (mod && mod.__esModule) return mod;
43
- var result = {};
44
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
45
- __setModuleDefault(result, mod);
46
- return result;
47
- };
48
- })();
49
- Object.defineProperty(exports, "__esModule", { value: true });
50
- const vitest_1 = require("vitest");
51
- const fs = __importStar(require("fs"));
52
- const path = __importStar(require("path"));
53
- const os = __importStar(require("os"));
54
- const settings_js_1 = require("../settings.js");
55
- let tmpDir;
56
- let settingsPath;
57
- let origEnv;
58
- (0, vitest_1.beforeEach)(() => {
59
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "xiaotime-settings-test-"));
60
- settingsPath = path.join(tmpDir, "settings.json");
61
- origEnv = process.env.XIAOTIME_SETTINGS_PATH;
62
- process.env.XIAOTIME_SETTINGS_PATH = settingsPath;
63
- });
64
- (0, vitest_1.afterEach)(() => {
65
- if (origEnv === undefined) {
66
- delete process.env.XIAOTIME_SETTINGS_PATH;
67
- }
68
- else {
69
- process.env.XIAOTIME_SETTINGS_PATH = origEnv;
70
- }
71
- fs.rmSync(tmpDir, { recursive: true, force: true });
72
- vitest_1.vi.restoreAllMocks();
73
- });
74
- (0, vitest_1.describe)("_settingsPath honors XIAOTIME_SETTINGS_PATH env override", () => {
75
- (0, vitest_1.test)("returns the env-var path when set", () => {
76
- (0, vitest_1.expect)((0, settings_js_1._settingsPath)()).toBe(settingsPath);
77
- });
78
- (0, vitest_1.test)("returns ~/.xiaotime/settings.json when env unset", () => {
79
- delete process.env.XIAOTIME_SETTINGS_PATH;
80
- const resolved = (0, settings_js_1._settingsPath)();
81
- (0, vitest_1.expect)(resolved).toBe(path.join(os.homedir(), ".xiaotime", "settings.json"));
82
- });
83
- });
84
- (0, vitest_1.describe)("loadAllowlist tolerance (ISC-6509-007)", () => {
85
- (0, vitest_1.test)("missing file returns empty array (first-run is not an error)", () => {
86
- (0, vitest_1.expect)((0, settings_js_1.loadAllowlist)()).toEqual([]);
87
- });
88
- (0, vitest_1.test)("malformed JSON returns empty + writes stderr warning", () => {
89
- fs.writeFileSync(settingsPath, "not json {");
90
- const stderrSpy = vitest_1.vi
91
- .spyOn(process.stderr, "write")
92
- .mockImplementation(() => true);
93
- (0, vitest_1.expect)((0, settings_js_1.loadAllowlist)()).toEqual([]);
94
- (0, vitest_1.expect)(stderrSpy).toHaveBeenCalledWith(vitest_1.expect.stringContaining("malformed JSON"));
95
- });
96
- (0, vitest_1.test)("unknown schema version returns empty + writes stderr warning", () => {
97
- fs.writeFileSync(settingsPath, JSON.stringify({ version: 99 }));
98
- const stderrSpy = vitest_1.vi
99
- .spyOn(process.stderr, "write")
100
- .mockImplementation(() => true);
101
- (0, vitest_1.expect)((0, settings_js_1.loadAllowlist)()).toEqual([]);
102
- (0, vitest_1.expect)(stderrSpy).toHaveBeenCalledWith(vitest_1.expect.stringContaining("unrecognized schema version"));
103
- });
104
- (0, vitest_1.test)("non-object root returns empty silently", () => {
105
- fs.writeFileSync(settingsPath, JSON.stringify(null));
106
- (0, vitest_1.expect)((0, settings_js_1.loadAllowlist)()).toEqual([]);
107
- });
108
- (0, vitest_1.test)("missing permissions.allow array returns empty silently", () => {
109
- fs.writeFileSync(settingsPath, JSON.stringify({ version: 1 }));
110
- (0, vitest_1.expect)((0, settings_js_1.loadAllowlist)()).toEqual([]);
111
- });
112
- (0, vitest_1.test)("invalid entries are filtered out, valid ones retained", () => {
113
- fs.writeFileSync(settingsPath, JSON.stringify({
114
- version: 1,
115
- permissions: {
116
- allow: [
117
- {
118
- tool: "shell_command",
119
- pattern: "npm install",
120
- added_at: "2026-05-20T00:00:00Z",
121
- },
122
- { tool: "invalid_tool", pattern: "x", added_at: "2026-05-20" },
123
- { tool: "write_file" },
124
- null,
125
- "string entry",
126
- ],
127
- },
128
- }));
129
- const result = (0, settings_js_1.loadAllowlist)();
130
- (0, vitest_1.expect)(result).toHaveLength(1);
131
- (0, vitest_1.expect)(result[0].tool).toBe("shell_command");
132
- });
133
- });
134
- (0, vitest_1.describe)("appendAllowlist write + mode (ISC-6509-007 + ISC-6509-003)", () => {
135
- (0, vitest_1.test)("creates settings.json with mode 0600 on first write", () => {
136
- (0, settings_js_1.appendAllowlist)({ tool: "shell_command", pattern: "npm install" });
137
- (0, vitest_1.expect)(fs.existsSync(settingsPath)).toBe(true);
138
- const stat = fs.statSync(settingsPath);
139
- (0, vitest_1.expect)(stat.mode & 0o777).toBe(0o600);
140
- });
141
- (0, vitest_1.test)("creates parent directory with mode 0700 if absent", () => {
142
- const nested = path.join(tmpDir, "deep", "settings.json");
143
- process.env.XIAOTIME_SETTINGS_PATH = nested;
144
- (0, settings_js_1.appendAllowlist)({ tool: "git_commit", pattern: "*" });
145
- (0, vitest_1.expect)(fs.existsSync(nested)).toBe(true);
146
- const dirStat = fs.statSync(path.dirname(nested));
147
- (0, vitest_1.expect)(dirStat.mode & 0o777).toBe(0o700);
148
- });
149
- (0, vitest_1.test)("appends entry with ISO timestamp", () => {
150
- (0, settings_js_1.appendAllowlist)({ tool: "git_commit", pattern: "*" });
151
- const loaded = (0, settings_js_1.loadAllowlist)();
152
- (0, vitest_1.expect)(loaded).toHaveLength(1);
153
- (0, vitest_1.expect)(loaded[0]).toMatchObject({ tool: "git_commit", pattern: "*" });
154
- (0, vitest_1.expect)(loaded[0].added_at).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/);
155
- });
156
- (0, vitest_1.test)("idempotent on duplicate (tool, pattern) — no second entry written", () => {
157
- (0, settings_js_1.appendAllowlist)({ tool: "shell_command", pattern: "npm install" });
158
- (0, settings_js_1.appendAllowlist)({ tool: "shell_command", pattern: "npm install" });
159
- (0, settings_js_1.appendAllowlist)({ tool: "shell_command", pattern: "npm install" });
160
- (0, vitest_1.expect)((0, settings_js_1.loadAllowlist)()).toHaveLength(1);
161
- });
162
- (0, vitest_1.test)("re-write preserves mode 0600 even if user chmod'd up", () => {
163
- (0, settings_js_1.appendAllowlist)({ tool: "shell_command", pattern: "npm install" });
164
- // User accidentally chmod'd to 0644; next write must reset.
165
- fs.chmodSync(settingsPath, 0o644);
166
- (0, settings_js_1.appendAllowlist)({ tool: "shell_command", pattern: "git push" });
167
- const stat = fs.statSync(settingsPath);
168
- (0, vitest_1.expect)(stat.mode & 0o777).toBe(0o600);
169
- });
170
- (0, vitest_1.test)("file payload conforms to SettingsV1 shape", () => {
171
- (0, settings_js_1.appendAllowlist)({ tool: "git_commit", pattern: "*" });
172
- const raw = fs.readFileSync(settingsPath, "utf-8");
173
- const parsed = JSON.parse(raw);
174
- (0, vitest_1.expect)(parsed.version).toBe(1);
175
- (0, vitest_1.expect)(parsed.permissions.allow).toHaveLength(1);
176
- (0, vitest_1.expect)(raw.endsWith("\n")).toBe(true);
177
- });
178
- });
179
- (0, vitest_1.describe)("derivePattern (ISC-6509-003)", () => {
180
- (0, vitest_1.test)("shell_command: 'npm install --no-save lodash' → 'npm install'", () => {
181
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("shell_command", {
182
- command: "npm install --no-save lodash",
183
- })).toBe("npm install");
184
- });
185
- (0, vitest_1.test)("shell_command: 'git push origin dev' → 'git push'", () => {
186
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("shell_command", { command: "git push origin dev" })).toBe("git push");
187
- });
188
- (0, vitest_1.test)("shell_command: 'ls -la /tmp' → 'ls -la' (stops at first non-flag past argv[1])", () => {
189
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("shell_command", { command: "ls -la /tmp" })).toBe("ls -la");
190
- });
191
- (0, vitest_1.test)("shell_command: 'ls -la -h /tmp' → 'ls -la -h' (multiple leading flags)", () => {
192
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("shell_command", { command: "ls -la -h /tmp" })).toBe("ls -la -h");
193
- });
194
- (0, vitest_1.test)("shell_command: 'pwd' → 'pwd' (single token)", () => {
195
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("shell_command", { command: "pwd" })).toBe("pwd");
196
- });
197
- (0, vitest_1.test)("shell_command: 'gh issue list' → 'gh issue' (multi-level grammar collapses to 2-token prefix)", () => {
198
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("shell_command", { command: "gh issue list" })).toBe("gh issue");
199
- });
200
- (0, vitest_1.test)("shell_command: empty / whitespace / missing → null", () => {
201
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("shell_command", { command: "" })).toBeNull();
202
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("shell_command", { command: " " })).toBeNull();
203
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("shell_command", {})).toBeNull();
204
- });
205
- (0, vitest_1.test)("shell_command: flag-only input → null (#6538 CR-r1)", () => {
206
- // Pre-CR-r1 these produced nonsense patterns like "-la -h"
207
- // which would persist as broken allowlist entries with no
208
- // argv[0]. Guard rejects them up front.
209
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("shell_command", { command: "-la -h" })).toBeNull();
210
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("shell_command", { command: "--version" })).toBeNull();
211
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("shell_command", { command: "-x" })).toBeNull();
212
- });
213
- (0, vitest_1.test)("write_file: relative path with traversal is normalized (#6538 CR-r1)", () => {
214
- // Pre-CR-r1, `"../../etc/passwd"` would derive
215
- // `"../../etc/**"` and persist as a literal traversal-relative
216
- // entry, which subsequent legitimate writes through the same
217
- // (or other) cwd could accidentally match. path.resolve
218
- // anchors against process.cwd before dirname, producing the
219
- // absolute canonical form. The traversal segments collapse.
220
- const result = (0, settings_js_1.derivePattern)("write_file", { path: "../foo.txt" });
221
- (0, vitest_1.expect)(result).not.toBeNull();
222
- // The exact value depends on process.cwd at test time, but it
223
- // must (a) be absolute and (b) NOT contain ".." segments.
224
- (0, vitest_1.expect)(path.isAbsolute(result)).toBe(true);
225
- (0, vitest_1.expect)(result).not.toContain("..");
226
- (0, vitest_1.expect)(result.endsWith(path.sep + "**")).toBe(true);
227
- });
228
- (0, vitest_1.test)("write_file: existing absolute paths still round-trip cleanly", () => {
229
- // Existing tests above assume the storage shape; pin it
230
- // explicitly post-normalization.
231
- const out = (0, settings_js_1.derivePattern)("write_file", {
232
- path: "/home/haeyoon/Desktop/foo.txt",
233
- });
234
- (0, vitest_1.expect)(out).toBe("/home/haeyoon/Desktop" + path.sep + "**");
235
- });
236
- (0, vitest_1.test)("write_file: dirname + /** glob", () => {
237
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("write_file", { path: "/home/haeyoon/Desktop/foo.txt" })).toBe("/home/haeyoon/Desktop/**");
238
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("write_file", { path: "/repo/src/sub/x.ts" })).toBe("/repo/src/sub/**");
239
- });
240
- (0, vitest_1.test)("write_file: empty / missing path → null", () => {
241
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("write_file", { path: "" })).toBeNull();
242
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("write_file", {})).toBeNull();
243
- });
244
- (0, vitest_1.test)("git_commit: always '*'", () => {
245
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("git_commit", { message: "feat: x" })).toBe("*");
246
- (0, vitest_1.expect)((0, settings_js_1.derivePattern)("git_commit", {})).toBe("*");
247
- });
248
- });
249
- (0, vitest_1.describe)("matchAllowlist (ISC-6509-004)", () => {
250
- const entry = (tool, pattern) => ({
251
- tool,
252
- pattern,
253
- added_at: "2026-05-20T00:00:00Z",
254
- });
255
- (0, vitest_1.test)("shell_command: derived pattern equality match", () => {
256
- const allowlist = [entry("shell_command", "npm install")];
257
- (0, vitest_1.expect)((0, settings_js_1.matchAllowlist)("shell_command", { command: "npm install --save lodash" }, allowlist)).not.toBeNull();
258
- });
259
- (0, vitest_1.test)("shell_command: divergent derived pattern → no match", () => {
260
- const allowlist = [entry("shell_command", "npm install")];
261
- (0, vitest_1.expect)((0, settings_js_1.matchAllowlist)("shell_command", { command: "npm uninstall lodash" }, allowlist)).toBeNull();
262
- });
263
- (0, vitest_1.test)("write_file: directory glob match (exact dir + deep subpath)", () => {
264
- const allowlist = [entry("write_file", "/repo/src/**")];
265
- (0, vitest_1.expect)((0, settings_js_1.matchAllowlist)("write_file", { path: "/repo/src/foo.ts" }, allowlist)).not.toBeNull();
266
- (0, vitest_1.expect)((0, settings_js_1.matchAllowlist)("write_file", { path: "/repo/src/sub/deep/bar.ts" }, allowlist)).not.toBeNull();
267
- });
268
- (0, vitest_1.test)("write_file: sibling directory → no match", () => {
269
- const allowlist = [entry("write_file", "/repo/src/**")];
270
- (0, vitest_1.expect)((0, settings_js_1.matchAllowlist)("write_file", { path: "/repo/test/baz.ts" }, allowlist)).toBeNull();
271
- });
272
- (0, vitest_1.test)("git_commit: any entry matches", () => {
273
- const allowlist = [entry("git_commit", "*")];
274
- (0, vitest_1.expect)((0, settings_js_1.matchAllowlist)("git_commit", { message: "anything" }, allowlist)).not.toBeNull();
275
- });
276
- (0, vitest_1.test)("cross-tool isolation: shell_command entry cannot authorize write_file (PR3 invariant)", () => {
277
- // Adversarial: an entry stored as shell_command whose pattern
278
- // coincidentally matches a write_file glob. Must NOT authorize a
279
- // write_file call — the tool field is the load-bearing scope key.
280
- const allowlist = [entry("shell_command", "/tmp/**")];
281
- (0, vitest_1.expect)((0, settings_js_1.matchAllowlist)("write_file", { path: "/tmp/foo.txt" }, allowlist)).toBeNull();
282
- });
283
- (0, vitest_1.test)("empty allowlist never matches", () => {
284
- (0, vitest_1.expect)((0, settings_js_1.matchAllowlist)("shell_command", { command: "npm install" }, [])).toBeNull();
285
- (0, vitest_1.expect)((0, settings_js_1.matchAllowlist)("write_file", { path: "/repo/x.ts" }, [])).toBeNull();
286
- (0, vitest_1.expect)((0, settings_js_1.matchAllowlist)("git_commit", {}, [])).toBeNull();
287
- });
288
- });
289
- //# sourceMappingURL=settings.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings.test.js","sourceRoot":"","sources":["../../src/__tests__/settings.test.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- /**
2
- * REST POST client tests.
3
- *
4
- * SPRINT-TERMINAL-CLIENT-OWNED-DISPATCH-1 (#6565) PR3.
5
- *
6
- * Verifies the contract between the CLI's drain queue (in ws.ts)
7
- * and the server's POST /tool_results endpoint (added in PR1,
8
- * consumed by PR2's dispatch refactor):
9
- *
10
- * - Happy path: 200 OK returns parsed body (completed,
11
- * all_completed, resume_signaled).
12
- * - Retry policy: 5xx + network errors retry with exponential
13
- * backoff (100ms → 200ms → 400ms, 3 attempts total).
14
- * - 4xx is durable — throws immediately, no retry.
15
- * - Auth header (x-api-key with the cli_token) on every attempt.
16
- * - Request body shape matches the server's PostToolResultsRequest
17
- * Pydantic model.
18
- */
19
- export {};
20
- //# sourceMappingURL=tool_result_client.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool_result_client.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tool_result_client.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}
@@ -1,142 +0,0 @@
1
- "use strict";
2
- /**
3
- * REST POST client tests.
4
- *
5
- * SPRINT-TERMINAL-CLIENT-OWNED-DISPATCH-1 (#6565) PR3.
6
- *
7
- * Verifies the contract between the CLI's drain queue (in ws.ts)
8
- * and the server's POST /tool_results endpoint (added in PR1,
9
- * consumed by PR2's dispatch refactor):
10
- *
11
- * - Happy path: 200 OK returns parsed body (completed,
12
- * all_completed, resume_signaled).
13
- * - Retry policy: 5xx + network errors retry with exponential
14
- * backoff (100ms → 200ms → 400ms, 3 attempts total).
15
- * - 4xx is durable — throws immediately, no retry.
16
- * - Auth header (x-api-key with the cli_token) on every attempt.
17
- * - Request body shape matches the server's PostToolResultsRequest
18
- * Pydantic model.
19
- */
20
- Object.defineProperty(exports, "__esModule", { value: true });
21
- const vitest_1 = require("vitest");
22
- const tool_result_client_js_1 = require("../tool_result_client.js");
23
- // Mock the auth module so we don't read a real token from
24
- // ~/.xiaotime/cli_token.json during tests.
25
- vitest_1.vi.mock("../auth.js", () => ({
26
- getToken: () => "fake-cli-token-for-tests",
27
- }));
28
- // Mock the config so the URL is deterministic.
29
- vitest_1.vi.mock("../config.js", () => ({
30
- ORCHESTRATOR_URL: "https://terminal.xiaotime.test",
31
- }));
32
- let fetchMock;
33
- let origFetch;
34
- (0, vitest_1.beforeEach)(() => {
35
- fetchMock = vitest_1.vi.fn();
36
- origFetch = globalThis.fetch;
37
- globalThis.fetch = fetchMock;
38
- });
39
- (0, vitest_1.afterEach)(() => {
40
- globalThis.fetch = origFetch;
41
- vitest_1.vi.restoreAllMocks();
42
- });
43
- function _okResponse(body) {
44
- return new Response(JSON.stringify(body), {
45
- status: 200,
46
- headers: { "content-type": "application/json" },
47
- });
48
- }
49
- function _errorResponse(status, body) {
50
- return new Response(body, { status });
51
- }
52
- (0, vitest_1.describe)("postToolResults happy path", () => {
53
- (0, vitest_1.test)("posts to correct URL with auth header + JSON body", async () => {
54
- fetchMock.mockResolvedValue(_okResponse({ completed: ["toolu_a"], all_completed: true, resume_signaled: true }));
55
- const result = await (0, tool_result_client_js_1.postToolResults)("session-abc", [
56
- { tool_use_id: "toolu_a", content: "ok", is_error: false },
57
- ]);
58
- (0, vitest_1.expect)(result).toEqual({
59
- completed: ["toolu_a"],
60
- all_completed: true,
61
- resume_signaled: true,
62
- });
63
- (0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(1);
64
- const [url, init] = fetchMock.mock.calls[0];
65
- (0, vitest_1.expect)(url).toBe("https://terminal.xiaotime.test/terminal/sessions/session-abc/tool_results");
66
- (0, vitest_1.expect)(init.method).toBe("POST");
67
- (0, vitest_1.expect)(init.headers["x-api-key"]).toBe("fake-cli-token-for-tests");
68
- (0, vitest_1.expect)(init.headers["Content-Type"]).toBe("application/json");
69
- const body = JSON.parse(init.body);
70
- (0, vitest_1.expect)(body).toEqual({
71
- results: [{ tool_use_id: "toolu_a", content: "ok", is_error: false }],
72
- });
73
- });
74
- (0, vitest_1.test)("supports multi-result batches", async () => {
75
- fetchMock.mockResolvedValue(_okResponse({
76
- completed: ["toolu_a", "toolu_b"],
77
- all_completed: false,
78
- resume_signaled: false,
79
- }));
80
- await (0, tool_result_client_js_1.postToolResults)("sess", [
81
- { tool_use_id: "toolu_a", content: "1", is_error: false },
82
- { tool_use_id: "toolu_b", content: "2", is_error: true },
83
- ]);
84
- const body = JSON.parse(fetchMock.mock.calls[0][1].body);
85
- (0, vitest_1.expect)(body.results).toHaveLength(2);
86
- (0, vitest_1.expect)(body.results[1].is_error).toBe(true);
87
- });
88
- });
89
- (0, vitest_1.describe)("postToolResults retry behavior", () => {
90
- (0, vitest_1.test)("4xx error throws immediately without retrying", async () => {
91
- // Use mockImplementation (fresh Response per call) instead of
92
- // mockResolvedValue (single Response instance) — the latter's
93
- // body stream gets consumed on the first .text() read and
94
- // subsequent reads fail with "Body is unusable".
95
- fetchMock.mockImplementation(() => Promise.resolve(_errorResponse(400, "unknown_tool_use_id")));
96
- await (0, vitest_1.expect)((0, tool_result_client_js_1.postToolResults)("sess", [
97
- { tool_use_id: "toolu_a", content: "x", is_error: false },
98
- ])).rejects.toThrow(/rejected \(400\)/);
99
- (0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(1);
100
- });
101
- (0, vitest_1.test)("4xx error includes server body in the thrown message", async () => {
102
- fetchMock.mockImplementation(() => Promise.resolve(_errorResponse(400, '{"code":"unknown_tool_use_id","unknown":["toolu_x"]}')));
103
- await (0, vitest_1.expect)((0, tool_result_client_js_1.postToolResults)("sess", [
104
- { tool_use_id: "toolu_x", content: "x", is_error: false },
105
- ])).rejects.toThrow(/unknown_tool_use_id/);
106
- });
107
- (0, vitest_1.test)("5xx error retries up to 3 attempts then throws", async () => {
108
- fetchMock.mockImplementation(() => Promise.resolve(_errorResponse(503, "service unavailable")));
109
- await (0, vitest_1.expect)((0, tool_result_client_js_1.postToolResults)("sess", [
110
- { tool_use_id: "toolu_a", content: "x", is_error: false },
111
- ])).rejects.toThrow(/503/);
112
- (0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(3);
113
- });
114
- (0, vitest_1.test)("5xx then success on retry → returns success", async () => {
115
- fetchMock
116
- .mockResolvedValueOnce(_errorResponse(500, "internal"))
117
- .mockResolvedValueOnce(_okResponse({ completed: ["a"], all_completed: true, resume_signaled: true }));
118
- const result = await (0, tool_result_client_js_1.postToolResults)("sess", [
119
- { tool_use_id: "a", content: "x", is_error: false },
120
- ]);
121
- (0, vitest_1.expect)(result.all_completed).toBe(true);
122
- (0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(2);
123
- });
124
- (0, vitest_1.test)("network error retries up to 3 attempts then throws", async () => {
125
- fetchMock.mockRejectedValue(new Error("ECONNRESET"));
126
- await (0, vitest_1.expect)((0, tool_result_client_js_1.postToolResults)("sess", [
127
- { tool_use_id: "a", content: "x", is_error: false },
128
- ])).rejects.toThrow(/ECONNRESET/);
129
- (0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(3);
130
- });
131
- (0, vitest_1.test)("network error then success on retry → returns success", async () => {
132
- fetchMock
133
- .mockRejectedValueOnce(new Error("ECONNRESET"))
134
- .mockResolvedValueOnce(_okResponse({ completed: ["a"], all_completed: false, resume_signaled: false }));
135
- const result = await (0, tool_result_client_js_1.postToolResults)("sess", [
136
- { tool_use_id: "a", content: "x", is_error: false },
137
- ]);
138
- (0, vitest_1.expect)(result.completed).toEqual(["a"]);
139
- (0, vitest_1.expect)(fetchMock).toHaveBeenCalledTimes(2);
140
- });
141
- });
142
- //# sourceMappingURL=tool_result_client.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool_result_client.test.js","sourceRoot":"","sources":["../../src/__tests__/tool_result_client.test.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Tool-execution surface tests.
3
- *
4
- * SPRINT-CLI-APPROVAL-MENU-1 (#6509):
5
- * - PR1: ISC-6509-006 (read-only tools never prompt)
6
- * + write_file approval integration (#6532 CR-r1)
7
- * - PR2: ISC-6509-004 (allowlist match skips promptApprovalMenu +
8
- * auto-approved suffix)
9
- * + option-2 selection writes the derived pattern to
10
- * ~/.xiaotime/settings.json
11
- *
12
- * Tests redirect XIAOTIME_SETTINGS_PATH to a per-test tmpdir so
13
- * the user's real ~/.xiaotime/settings.json is never read or
14
- * written.
15
- */
16
- export {};
17
- //# sourceMappingURL=tools.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/tools.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}