xiaotime 0.2.1 → 0.4.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.
- package/dist/__tests__/approval_menu.test.d.ts +15 -0
- package/dist/__tests__/approval_menu.test.d.ts.map +1 -0
- package/dist/__tests__/approval_menu.test.js +107 -0
- package/dist/__tests__/approval_menu.test.js.map +1 -0
- package/dist/__tests__/legacy_compat.test.d.ts +2 -0
- package/dist/__tests__/legacy_compat.test.d.ts.map +1 -0
- package/dist/__tests__/legacy_compat.test.js +36 -0
- package/dist/__tests__/legacy_compat.test.js.map +1 -0
- package/dist/__tests__/server_tool_render.test.d.ts +17 -0
- package/dist/__tests__/server_tool_render.test.d.ts.map +1 -0
- package/dist/__tests__/server_tool_render.test.js +74 -0
- package/dist/__tests__/server_tool_render.test.js.map +1 -0
- package/dist/__tests__/settings.test.d.ts +16 -0
- package/dist/__tests__/settings.test.d.ts.map +1 -0
- package/dist/__tests__/settings.test.js +289 -0
- package/dist/__tests__/settings.test.js.map +1 -0
- package/dist/__tests__/tool_result_client.test.d.ts +20 -0
- package/dist/__tests__/tool_result_client.test.d.ts.map +1 -0
- package/dist/__tests__/tool_result_client.test.js +142 -0
- package/dist/__tests__/tool_result_client.test.js.map +1 -0
- package/dist/__tests__/tools.test.d.ts +17 -0
- package/dist/__tests__/tools.test.d.ts.map +1 -0
- package/dist/__tests__/tools.test.js +381 -0
- package/dist/__tests__/tools.test.js.map +1 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -1
- package/dist/config.js.map +1 -1
- package/dist/display.d.ts +19 -0
- package/dist/display.d.ts.map +1 -1
- package/dist/display.js +23 -0
- package/dist/display.js.map +1 -1
- package/dist/settings.d.ts +109 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +332 -0
- package/dist/settings.js.map +1 -0
- package/dist/tool_result_client.d.ts +72 -0
- package/dist/tool_result_client.d.ts.map +1 -0
- package/dist/tool_result_client.js +123 -0
- package/dist/tool_result_client.js.map +1 -0
- package/dist/tools.d.ts +11 -3
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +96 -33
- package/dist/tools.js.map +1 -1
- package/dist/ui_state.d.ts +134 -0
- package/dist/ui_state.d.ts.map +1 -0
- package/dist/ui_state.js +460 -0
- package/dist/ui_state.js.map +1 -0
- package/dist/ws.d.ts +15 -0
- package/dist/ws.d.ts.map +1 -1
- package/dist/ws.js +180 -75
- package/dist/ws.js.map +1 -1
- package/package.json +6 -3
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Approval-menu rendering + selection tests.
|
|
3
|
+
*
|
|
4
|
+
* SPRINT-CLI-APPROVAL-MENU-1 (#6509) PR1.
|
|
5
|
+
*
|
|
6
|
+
* The full echo-bug fix is structural: the rl is closed (its keypress
|
|
7
|
+
* echo handler detached from stdin) for the duration of the menu, so
|
|
8
|
+
* the bug is physically unreachable during promptApprovalMenu. These
|
|
9
|
+
* tests verify the structure + the no-TTY fallback path. Full
|
|
10
|
+
* keystroke-emission tests are in the manual PR-body walkthrough
|
|
11
|
+
* because they require driving a real TTY (vitest's stdin is not a
|
|
12
|
+
* TTY, so setRawMode throws — which we test).
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=approval_menu.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval_menu.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/approval_menu.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Approval-menu rendering + selection tests.
|
|
4
|
+
*
|
|
5
|
+
* SPRINT-CLI-APPROVAL-MENU-1 (#6509) PR1.
|
|
6
|
+
*
|
|
7
|
+
* The full echo-bug fix is structural: the rl is closed (its keypress
|
|
8
|
+
* echo handler detached from stdin) for the duration of the menu, so
|
|
9
|
+
* the bug is physically unreachable during promptApprovalMenu. These
|
|
10
|
+
* tests verify the structure + the no-TTY fallback path. Full
|
|
11
|
+
* keystroke-emission tests are in the manual PR-body walkthrough
|
|
12
|
+
* because they require driving a real TTY (vitest's stdin is not a
|
|
13
|
+
* TTY, so setRawMode throws — which we test).
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
const vitest_1 = require("vitest");
|
|
17
|
+
const ui_state_js_1 = require("../ui_state.js");
|
|
18
|
+
let writes;
|
|
19
|
+
(0, vitest_1.beforeEach)(() => {
|
|
20
|
+
writes = [];
|
|
21
|
+
vitest_1.vi.spyOn(process.stdout, "write").mockImplementation((chunk) => {
|
|
22
|
+
writes.push(typeof chunk === "string" ? chunk : chunk.toString());
|
|
23
|
+
return true;
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
(0, vitest_1.afterEach)(() => {
|
|
27
|
+
vitest_1.vi.restoreAllMocks();
|
|
28
|
+
});
|
|
29
|
+
(0, vitest_1.describe)("SessionUI public surface", () => {
|
|
30
|
+
(0, vitest_1.test)("exposes promptApprovalMenu", () => {
|
|
31
|
+
const ui = new ui_state_js_1.SessionUI();
|
|
32
|
+
(0, vitest_1.expect)(typeof ui.promptApprovalMenu).toBe("function");
|
|
33
|
+
ui.getRl().close();
|
|
34
|
+
});
|
|
35
|
+
(0, vitest_1.test)("exposes onRlClose for persistent close-listener registration", () => {
|
|
36
|
+
const ui = new ui_state_js_1.SessionUI();
|
|
37
|
+
(0, vitest_1.expect)(typeof ui.onRlClose).toBe("function");
|
|
38
|
+
ui.getRl().close();
|
|
39
|
+
});
|
|
40
|
+
(0, vitest_1.test)("no longer exposes promptApproval (pre-#6509 API)", () => {
|
|
41
|
+
const ui = new ui_state_js_1.SessionUI();
|
|
42
|
+
(0, vitest_1.expect)(ui.promptApproval).toBeUndefined();
|
|
43
|
+
ui.getRl().close();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
(0, vitest_1.describe)("no-TTY fallback (vitest's stdin is not a TTY)", () => {
|
|
47
|
+
(0, vitest_1.test)("returns reject result when setRawMode throws", async () => {
|
|
48
|
+
// vitest's process.stdin.setRawMode throws because stdin is not a
|
|
49
|
+
// TTY. promptApprovalMenu should catch + return reject (option 3)
|
|
50
|
+
// with rejectReason "(no TTY)" rather than crash.
|
|
51
|
+
const ui = new ui_state_js_1.SessionUI();
|
|
52
|
+
const result = await ui.promptApprovalMenu();
|
|
53
|
+
(0, vitest_1.expect)(result.approved).toBe(false);
|
|
54
|
+
if (!result.approved) {
|
|
55
|
+
// The rejection-reason prompt also fails in no-TTY mode (rl.once
|
|
56
|
+
// line never fires); we don't run that path under vitest. The
|
|
57
|
+
// important invariant is the fall-through returns a structurally
|
|
58
|
+
// valid reject.
|
|
59
|
+
(0, vitest_1.expect)(result.rejectReason).toBeDefined();
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
(0, vitest_1.describe)("rl close-and-recreate (structural echo-bug fix)", () => {
|
|
64
|
+
(0, vitest_1.test)("getRl() returns a different rl object after promptApprovalMenu", async () => {
|
|
65
|
+
const ui = new ui_state_js_1.SessionUI();
|
|
66
|
+
const before = ui.getRl();
|
|
67
|
+
await ui.promptApprovalMenu();
|
|
68
|
+
const after = ui.getRl();
|
|
69
|
+
// The rl was closed + recreated by promptApprovalMenu, so the
|
|
70
|
+
// identity should differ. This is the structural guarantee that
|
|
71
|
+
// readline's keypress echo cannot fire during the menu — the rl
|
|
72
|
+
// object that owned the echo handler is gone.
|
|
73
|
+
(0, vitest_1.expect)(after).not.toBe(before);
|
|
74
|
+
});
|
|
75
|
+
(0, vitest_1.test)("onRlClose listener is re-attached to the recreated rl", async () => {
|
|
76
|
+
const ui = new ui_state_js_1.SessionUI();
|
|
77
|
+
let fireCount = 0;
|
|
78
|
+
ui.onRlClose(() => {
|
|
79
|
+
fireCount++;
|
|
80
|
+
});
|
|
81
|
+
// First menu invocation closes + recreates the rl. The intra-menu
|
|
82
|
+
// close is suppressed (removeAllListeners before close), so
|
|
83
|
+
// fireCount should stay at 0 across the menu render.
|
|
84
|
+
await ui.promptApprovalMenu();
|
|
85
|
+
(0, vitest_1.expect)(fireCount).toBe(0);
|
|
86
|
+
// After the menu, the recreated rl has the listener re-attached.
|
|
87
|
+
// Closing it now should fire the listener exactly once.
|
|
88
|
+
ui.getRl().close();
|
|
89
|
+
(0, vitest_1.expect)(fireCount).toBe(1);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
(0, vitest_1.describe)("ApprovalMenuResult shape", () => {
|
|
93
|
+
(0, vitest_1.test)("approved-result carries allowlistRequested bool", async () => {
|
|
94
|
+
// Result shape is checked at the type level + the no-TTY fallback
|
|
95
|
+
// already returns an instance — verify it satisfies the
|
|
96
|
+
// discriminated union we exported.
|
|
97
|
+
const ui = new ui_state_js_1.SessionUI();
|
|
98
|
+
const result = await ui.promptApprovalMenu();
|
|
99
|
+
if (result.approved) {
|
|
100
|
+
(0, vitest_1.expect)(typeof result.allowlistRequested).toBe("boolean");
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
(0, vitest_1.expect)(typeof result.rejectReason).toBe("string");
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
//# sourceMappingURL=approval_menu.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approval_menu.test.js","sourceRoot":"","sources":["../../src/__tests__/approval_menu.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy_compat.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/legacy_compat.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* Legacy-compatibility / version-cutover tests.
|
|
5
|
+
*
|
|
6
|
+
* SPRINT-TERMINAL-CLIENT-OWNED-DISPATCH-1 (#6565) PR5.
|
|
7
|
+
*
|
|
8
|
+
* The hard cutover (decision D2) rejects CLI <0.4.0 at the WS auth
|
|
9
|
+
* handshake: the CLI sends its `version`, the server gates on it.
|
|
10
|
+
* These tests guard the CLI half of that contract — the version the
|
|
11
|
+
* CLI advertises must be its real package version and at/above the
|
|
12
|
+
* 0.4.0 client-owned-dispatch floor. The server-side rejection logic
|
|
13
|
+
* is covered by tests/test_terminal_orchestrator_cli_version.py.
|
|
14
|
+
*/
|
|
15
|
+
const vitest_1 = require("vitest");
|
|
16
|
+
const config_js_1 = require("../config.js");
|
|
17
|
+
// `require` (not `import`) so the tsc build doesn't flag package.json
|
|
18
|
+
// as outside rootDir (TS6059); vitest resolves it fine at runtime.
|
|
19
|
+
const pkg = require("../../package.json");
|
|
20
|
+
(0, vitest_1.describe)("CLI version cutover (#6565 PR5)", () => {
|
|
21
|
+
(0, vitest_1.test)("CLI_VERSION matches package.json — no drift", () => {
|
|
22
|
+
// The server gates the WS handshake on the version the CLI sends.
|
|
23
|
+
// If CLI_VERSION drifts from package.json the CLI would advertise
|
|
24
|
+
// a version it isn't, silently defeating the cutover gate.
|
|
25
|
+
(0, vitest_1.expect)(config_js_1.CLI_VERSION).toBe(pkg.version);
|
|
26
|
+
});
|
|
27
|
+
(0, vitest_1.test)("CLI_VERSION is a 3-part semver at or above the 0.4.0 floor", () => {
|
|
28
|
+
const parts = config_js_1.CLI_VERSION.split(".").map((p) => Number.parseInt(p, 10));
|
|
29
|
+
(0, vitest_1.expect)(parts).toHaveLength(3);
|
|
30
|
+
(0, vitest_1.expect)(parts.every((n) => Number.isInteger(n))).toBe(true);
|
|
31
|
+
const [major, minor] = parts;
|
|
32
|
+
// >= 0.4.0 — the client-owned-dispatch cutover floor.
|
|
33
|
+
(0, vitest_1.expect)(major > 0 || (major === 0 && minor >= 4)).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=legacy_compat.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy_compat.test.js","sourceRoot":"","sources":["../../src/__tests__/legacy_compat.test.ts"],"names":[],"mappings":";;AAAA;;;;;;;;;;;GAWG;AACH,mCAAgD;AAChD,4CAA2C;AAE3C,sEAAsE;AACtE,mEAAmE;AACnE,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEjE,IAAA,iBAAQ,EAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,IAAA,aAAI,EAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,kEAAkE;QAClE,kEAAkE;QAClE,2DAA2D;QAC3D,IAAA,eAAM,EAAC,uBAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAA,aAAI,EAAC,4DAA4D,EAAE,GAAG,EAAE;QACtE,MAAM,KAAK,GAAG,uBAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACxE,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAA,eAAM,EAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;QAC7B,sDAAsD;QACtD,IAAA,eAAM,EAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-tool-call visibility rendering.
|
|
3
|
+
*
|
|
4
|
+
* SPRINT-CLI-APPROVAL-MENU-1 (#6509) PR3.
|
|
5
|
+
*
|
|
6
|
+
* Tests the CLI side of the `server_tool_call` WS event: the
|
|
7
|
+
* `printServerToolCall` helper writes a single dim log line matching
|
|
8
|
+
* the visual style of the existing client-tool inline logs in
|
|
9
|
+
* `cli/src/tools.ts`. The server-side payload-building logic (input
|
|
10
|
+
* summary truncation, preferred-key selection per tool, newline
|
|
11
|
+
* stripping) is tested in
|
|
12
|
+
* `tests/test_terminal_orchestrator_main.py` — those tests
|
|
13
|
+
* collectively validate the wire-shape of the `server_tool_call`
|
|
14
|
+
* event (ISC-6509-009 + ISC-6509-010 emission contract).
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=server_tool_render.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server_tool_render.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/server_tool_render.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Server-tool-call visibility rendering.
|
|
4
|
+
*
|
|
5
|
+
* SPRINT-CLI-APPROVAL-MENU-1 (#6509) PR3.
|
|
6
|
+
*
|
|
7
|
+
* Tests the CLI side of the `server_tool_call` WS event: the
|
|
8
|
+
* `printServerToolCall` helper writes a single dim log line matching
|
|
9
|
+
* the visual style of the existing client-tool inline logs in
|
|
10
|
+
* `cli/src/tools.ts`. The server-side payload-building logic (input
|
|
11
|
+
* summary truncation, preferred-key selection per tool, newline
|
|
12
|
+
* stripping) is tested in
|
|
13
|
+
* `tests/test_terminal_orchestrator_main.py` — those tests
|
|
14
|
+
* collectively validate the wire-shape of the `server_tool_call`
|
|
15
|
+
* event (ISC-6509-009 + ISC-6509-010 emission contract).
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const vitest_1 = require("vitest");
|
|
19
|
+
const display_js_1 = require("../display.js");
|
|
20
|
+
let logs;
|
|
21
|
+
(0, vitest_1.beforeEach)(() => {
|
|
22
|
+
logs = [];
|
|
23
|
+
vitest_1.vi.spyOn(console, "log").mockImplementation((msg) => {
|
|
24
|
+
logs.push(typeof msg === "string" ? msg : String(msg));
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
(0, vitest_1.afterEach)(() => {
|
|
28
|
+
vitest_1.vi.restoreAllMocks();
|
|
29
|
+
});
|
|
30
|
+
(0, vitest_1.describe)("printServerToolCall (ISC-6509-009)", () => {
|
|
31
|
+
(0, vitest_1.test)("renders ` [server:<name>] <input_summary>` for a typical call", () => {
|
|
32
|
+
(0, display_js_1.printServerToolCall)("query_knowledge_base", "query=halock voice");
|
|
33
|
+
(0, vitest_1.expect)(logs).toHaveLength(1);
|
|
34
|
+
(0, vitest_1.expect)(logs[0]).toContain("[server:query_knowledge_base]");
|
|
35
|
+
(0, vitest_1.expect)(logs[0]).toContain("query=halock voice");
|
|
36
|
+
});
|
|
37
|
+
(0, vitest_1.test)("drops the trailing space when inputSummary is empty", () => {
|
|
38
|
+
// `librarian_list_collections` has no meaningful input to render
|
|
39
|
+
// — the server returns "" for its summary, and the line should
|
|
40
|
+
// collapse to just `[server:<name>]` with no trailing whitespace.
|
|
41
|
+
(0, display_js_1.printServerToolCall)("librarian_list_collections", "");
|
|
42
|
+
(0, vitest_1.expect)(logs).toHaveLength(1);
|
|
43
|
+
// Strip ANSI escape codes (chalk wraps the text) for the suffix
|
|
44
|
+
// check. The dim wrapper adds reset codes after the content.
|
|
45
|
+
const stripped = logs[0].replace(/\x1b\[[^m]*m/g, "");
|
|
46
|
+
(0, vitest_1.expect)(stripped).toBe(" [server:librarian_list_collections]");
|
|
47
|
+
});
|
|
48
|
+
(0, vitest_1.test)("each call produces exactly one log line", () => {
|
|
49
|
+
(0, display_js_1.printServerToolCall)("search_entities", "query=foo");
|
|
50
|
+
(0, display_js_1.printServerToolCall)("read_register", "register_type=control");
|
|
51
|
+
(0, vitest_1.expect)(logs).toHaveLength(2);
|
|
52
|
+
});
|
|
53
|
+
(0, vitest_1.test)("renders the literal text regardless of chalk's TTY detection", () => {
|
|
54
|
+
// chalk strips ANSI codes when stdout isn't detected as a TTY
|
|
55
|
+
// (which is the case under vitest). The dim styling is a
|
|
56
|
+
// visual-only concern verified via the manual walkthrough; the
|
|
57
|
+
// load-bearing contract — the text content — is asserted here.
|
|
58
|
+
(0, display_js_1.printServerToolCall)("task_create", "name=test, command=echo hi");
|
|
59
|
+
const stripped = logs[0].replace(/\x1b\[[^m]*m/g, "");
|
|
60
|
+
(0, vitest_1.expect)(stripped).toBe(" [server:task_create] name=test, command=echo hi");
|
|
61
|
+
});
|
|
62
|
+
(0, vitest_1.test)("handles special characters in tool name (#6550 CR-r1)", () => {
|
|
63
|
+
// Tool names are server-controlled (defined by
|
|
64
|
+
// terminal_orchestrator/tools.py TERMINAL_TOOLS) and won't
|
|
65
|
+
// contain shell metacharacters in practice — but the render
|
|
66
|
+
// helper shouldn't mangle the bytes if a future tool name
|
|
67
|
+
// does contain `<>&` or similar. Pin the passthrough.
|
|
68
|
+
(0, display_js_1.printServerToolCall)("tool<>&", "query=test");
|
|
69
|
+
(0, vitest_1.expect)(logs).toHaveLength(1);
|
|
70
|
+
const stripped = logs[0].replace(/\x1b\[[^m]*m/g, "");
|
|
71
|
+
(0, vitest_1.expect)(stripped).toBe(" [server:tool<>&] query=test");
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=server_tool_render.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server_tool_render.test.js","sourceRoot":"","sources":["../../src/__tests__/server_tool_render.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/settings.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -0,0 +1,289 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.test.js","sourceRoot":"","sources":["../../src/__tests__/settings.test.ts"],"names":[],"mappings":"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"}
|