@mudah-cli/testing 0.9.2 → 0.9.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/agent.d.ts +143 -0
- package/dist/agent.js +262 -0
- package/dist/agent.js.map +1 -0
- package/dist/fs-mock.d.ts +0 -11
- package/dist/fs-mock.js +21 -4
- package/dist/fs-mock.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/snapshot-assert.js +6 -2
- package/dist/snapshot-assert.js.map +1 -1
- package/dist/test-tui.d.ts +1 -1
- package/dist/test-tui.js +2 -2
- package/dist/test-tui.js.map +1 -1
- package/package.json +7 -7
package/dist/agent.d.ts
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import type { Layout } from '@mudah-cli/tui';
|
|
2
|
+
import { TestTui, type TestTuiOptions } from './test-tui.js';
|
|
3
|
+
/**
|
|
4
|
+
* Agentic TUI testing: let an AI model (or any decision function) drive a
|
|
5
|
+
* Mudah interface headlessly — no PTY, no terminal — observing the screen and
|
|
6
|
+
* choosing actions until a goal is met.
|
|
7
|
+
*
|
|
8
|
+
* The loop is model-agnostic. You bring `decide`: a function that takes an
|
|
9
|
+
* {@link AgentObservation} (plus a ready-made LLM prompt) and returns an
|
|
10
|
+
* {@link AgentAction}. `AgentTui` applies the action, re-observes, and
|
|
11
|
+
* records every step as a JSON-serializable trace for replay and debugging.
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* const agent = AgentTui.mount(new Column().add(new List(['alpha', 'beta'])));
|
|
15
|
+
* const result = await agent.run({
|
|
16
|
+
* goal: 'Select "beta"',
|
|
17
|
+
* decide: async (observation, prompt) => parseAgentAction(await model(prompt)),
|
|
18
|
+
* isComplete: (obs) => obs.screen.includes('▸ beta'),
|
|
19
|
+
* });
|
|
20
|
+
* expect(result.completed).toBe(true);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
/** One interactable node on screen, addressable by an AI model. */
|
|
24
|
+
export interface AgentElement {
|
|
25
|
+
/** Stable index-path id, e.g. `e0`, `e1.2`. Valid until the tree reshapes. */
|
|
26
|
+
id: string;
|
|
27
|
+
role: string;
|
|
28
|
+
label: string;
|
|
29
|
+
x: number;
|
|
30
|
+
y: number;
|
|
31
|
+
width: number;
|
|
32
|
+
height: number;
|
|
33
|
+
focused: boolean;
|
|
34
|
+
}
|
|
35
|
+
/** Everything a model needs to decide the next move. */
|
|
36
|
+
export interface AgentObservation {
|
|
37
|
+
/** Zero-based step counter. */
|
|
38
|
+
step: number;
|
|
39
|
+
/** ASCII snapshot of the screen, like {@link TestTui.snapshot}. */
|
|
40
|
+
screen: string;
|
|
41
|
+
/** Interactable elements, in tree order. */
|
|
42
|
+
elements: AgentElement[];
|
|
43
|
+
/** Id of the focused element, if any. */
|
|
44
|
+
focusedId: string | null;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The model's action space. Every variant is plain JSON, so a model can emit
|
|
48
|
+
* it directly and {@link parseAgentAction} validates it.
|
|
49
|
+
*/
|
|
50
|
+
export type AgentAction =
|
|
51
|
+
/** Press a key: a single character, or `enter`, `escape`, `tab`, `up`, `down`, `left`, `right`, `home`, `end`, `pageup`, `pagedown`, `backspace`, `delete`, `space`. */
|
|
52
|
+
{
|
|
53
|
+
kind: 'press';
|
|
54
|
+
key: string;
|
|
55
|
+
}
|
|
56
|
+
/** Type text into the focused input, character by character. */
|
|
57
|
+
| {
|
|
58
|
+
kind: 'type';
|
|
59
|
+
text: string;
|
|
60
|
+
}
|
|
61
|
+
/** Click the center of an element by its {@link AgentElement.id}. */
|
|
62
|
+
| {
|
|
63
|
+
kind: 'click';
|
|
64
|
+
id: string;
|
|
65
|
+
}
|
|
66
|
+
/** Click raw screen coordinates. */
|
|
67
|
+
| {
|
|
68
|
+
kind: 'clickAt';
|
|
69
|
+
x: number;
|
|
70
|
+
y: number;
|
|
71
|
+
}
|
|
72
|
+
/** Advance widget timers deterministically (no real sleeping). */
|
|
73
|
+
| {
|
|
74
|
+
kind: 'wait';
|
|
75
|
+
ms: number;
|
|
76
|
+
}
|
|
77
|
+
/** Declare the goal achieved. */
|
|
78
|
+
| {
|
|
79
|
+
kind: 'done';
|
|
80
|
+
note?: string;
|
|
81
|
+
};
|
|
82
|
+
/** One loop iteration: what the model saw and what it did. */
|
|
83
|
+
export interface AgentStep {
|
|
84
|
+
index: number;
|
|
85
|
+
observation: AgentObservation;
|
|
86
|
+
action: AgentAction;
|
|
87
|
+
}
|
|
88
|
+
export interface AgentRunOptions {
|
|
89
|
+
/** Plain-language goal, shown to the model in its prompt. */
|
|
90
|
+
goal: string;
|
|
91
|
+
/**
|
|
92
|
+
* The model (or script). Receives the observation and a pre-formatted
|
|
93
|
+
* prompt; returns the next action. Throw to abort the run with
|
|
94
|
+
* `reason: 'error'`.
|
|
95
|
+
*/
|
|
96
|
+
decide: (observation: AgentObservation, prompt: string) => AgentAction | Promise<AgentAction>;
|
|
97
|
+
/** Optional goal check evaluated before each decision. */
|
|
98
|
+
isComplete?: (observation: AgentObservation) => boolean;
|
|
99
|
+
/** Safety budget. Default 30. */
|
|
100
|
+
maxSteps?: number;
|
|
101
|
+
/** Called after every applied action. */
|
|
102
|
+
onStep?: (step: AgentStep) => void;
|
|
103
|
+
}
|
|
104
|
+
export interface AgentResult {
|
|
105
|
+
completed: boolean;
|
|
106
|
+
reason: 'done' | 'goal-met' | 'max-steps' | 'error';
|
|
107
|
+
steps: AgentStep[];
|
|
108
|
+
final: AgentObservation;
|
|
109
|
+
error?: unknown;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Format an observation as a compact LLM prompt: goal, screen, element list,
|
|
113
|
+
* and the exact JSON action schema the model must reply with.
|
|
114
|
+
*/
|
|
115
|
+
export declare function formatAgentPrompt(goal: string, observation: AgentObservation): string;
|
|
116
|
+
/**
|
|
117
|
+
* Parse and validate model output into an {@link AgentAction}.
|
|
118
|
+
* Accepts raw JSON or JSON wrapped in ```json fences. Throws a descriptive
|
|
119
|
+
* error on anything else — feed the message back to the model and retry.
|
|
120
|
+
*/
|
|
121
|
+
export declare function parseAgentAction(input: string): AgentAction;
|
|
122
|
+
/**
|
|
123
|
+
* Headless agent driver. Wraps {@link TestTui}'s synchronous, PTY-free
|
|
124
|
+
* harness with an observation/action loop a model can run.
|
|
125
|
+
*/
|
|
126
|
+
export declare class AgentTui {
|
|
127
|
+
/** The underlying scripted harness — still available for assertions. */
|
|
128
|
+
readonly tui: TestTui;
|
|
129
|
+
private stepCount;
|
|
130
|
+
private constructor();
|
|
131
|
+
static mount(root: Layout, options?: TestTuiOptions): AgentTui;
|
|
132
|
+
/** Current screen + interactive elements. */
|
|
133
|
+
observe(): AgentObservation;
|
|
134
|
+
/** Format the current observation as an LLM prompt for `goal`. */
|
|
135
|
+
prompt(goal: string): string;
|
|
136
|
+
/** Apply one action to the harness. */
|
|
137
|
+
act(action: AgentAction): Promise<void>;
|
|
138
|
+
/**
|
|
139
|
+
* Run the agent loop: observe → decide → act, until the model says `done`,
|
|
140
|
+
* `isComplete` passes, `maxSteps` is hit, or something throws.
|
|
141
|
+
*/
|
|
142
|
+
run(options: AgentRunOptions): Promise<AgentResult>;
|
|
143
|
+
}
|
package/dist/agent.js
ADDED
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
import { TestTui } from './test-tui.js';
|
|
2
|
+
const INTERACTIVE_ROLES = [
|
|
3
|
+
'button',
|
|
4
|
+
'input',
|
|
5
|
+
'textinput',
|
|
6
|
+
'textarea',
|
|
7
|
+
'checkbox',
|
|
8
|
+
'radio',
|
|
9
|
+
'select',
|
|
10
|
+
'list',
|
|
11
|
+
'menu',
|
|
12
|
+
'tab',
|
|
13
|
+
'link',
|
|
14
|
+
'slider',
|
|
15
|
+
'switch',
|
|
16
|
+
'toggle',
|
|
17
|
+
'fuzzy',
|
|
18
|
+
'combobox',
|
|
19
|
+
'datepicker',
|
|
20
|
+
'filebrowser',
|
|
21
|
+
'pager',
|
|
22
|
+
'search',
|
|
23
|
+
];
|
|
24
|
+
function isInteractive(node) {
|
|
25
|
+
const role = node.role.toLowerCase();
|
|
26
|
+
if (INTERACTIVE_ROLES.some((r) => role.includes(r)))
|
|
27
|
+
return true;
|
|
28
|
+
if (node.name !== undefined || node.href !== undefined)
|
|
29
|
+
return true;
|
|
30
|
+
if (typeof node.value === 'string' && node.value.length > 0)
|
|
31
|
+
return true;
|
|
32
|
+
return node.focused === true;
|
|
33
|
+
}
|
|
34
|
+
function labelOf(node) {
|
|
35
|
+
if (node.name !== undefined)
|
|
36
|
+
return String(node.name);
|
|
37
|
+
if (typeof node.value === 'string' && node.value.length > 0)
|
|
38
|
+
return node.value;
|
|
39
|
+
if (node.href !== undefined)
|
|
40
|
+
return String(node.href);
|
|
41
|
+
return node.role;
|
|
42
|
+
}
|
|
43
|
+
function collectElements(tree) {
|
|
44
|
+
const elements = [];
|
|
45
|
+
let focusedId = null;
|
|
46
|
+
const visit = (node, path) => {
|
|
47
|
+
if (isInteractive(node)) {
|
|
48
|
+
const id = `e${path}`;
|
|
49
|
+
const bounds = node.bounds;
|
|
50
|
+
const focused = node.focused === true;
|
|
51
|
+
elements.push({
|
|
52
|
+
id,
|
|
53
|
+
role: node.role,
|
|
54
|
+
label: labelOf(node),
|
|
55
|
+
x: bounds?.x ?? 0,
|
|
56
|
+
y: bounds?.y ?? 0,
|
|
57
|
+
width: bounds?.width ?? 0,
|
|
58
|
+
height: bounds?.height ?? 0,
|
|
59
|
+
focused,
|
|
60
|
+
});
|
|
61
|
+
if (focused)
|
|
62
|
+
focusedId = id;
|
|
63
|
+
}
|
|
64
|
+
node.children?.forEach((child, index) => {
|
|
65
|
+
visit(child, path === '' ? `${index}` : `${path}.${index}`);
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
tree.children?.forEach((child, index) => {
|
|
69
|
+
visit(child, `${index}`);
|
|
70
|
+
});
|
|
71
|
+
return { elements, focusedId };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Format an observation as a compact LLM prompt: goal, screen, element list,
|
|
75
|
+
* and the exact JSON action schema the model must reply with.
|
|
76
|
+
*/
|
|
77
|
+
export function formatAgentPrompt(goal, observation) {
|
|
78
|
+
const lines = [
|
|
79
|
+
`Goal: ${goal}`,
|
|
80
|
+
``,
|
|
81
|
+
`Screen:`,
|
|
82
|
+
'```',
|
|
83
|
+
observation.screen,
|
|
84
|
+
'```',
|
|
85
|
+
``,
|
|
86
|
+
`Interactive elements:`,
|
|
87
|
+
];
|
|
88
|
+
if (observation.elements.length === 0) {
|
|
89
|
+
lines.push('(none)');
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
for (const el of observation.elements) {
|
|
93
|
+
lines.push(`- [${el.id}] ${el.role} "${el.label}" at (${el.x},${el.y}) ${el.width}x${el.height}${el.focused ? ' FOCUSED' : ''}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
lines.push(``, `Reply with exactly one JSON action and nothing else:`, `{"kind":"press","key":"down"} | {"kind":"type","text":"hello"} | {"kind":"click","id":"e0"} | {"kind":"clickAt","x":10,"y":3} | {"kind":"wait","ms":500} | {"kind":"done","note":"why the goal is met"}`, `press keys: single characters, or enter, escape, tab, up, down, left, right, home, end, pageup, pagedown, backspace, delete, space.`);
|
|
97
|
+
return lines.join('\n');
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Parse and validate model output into an {@link AgentAction}.
|
|
101
|
+
* Accepts raw JSON or JSON wrapped in ```json fences. Throws a descriptive
|
|
102
|
+
* error on anything else — feed the message back to the model and retry.
|
|
103
|
+
*/
|
|
104
|
+
export function parseAgentAction(input) {
|
|
105
|
+
const stripped = input
|
|
106
|
+
.replace(/^```(?:json)?\s*/i, '')
|
|
107
|
+
.replace(/\s*```\s*$/, '')
|
|
108
|
+
.trim();
|
|
109
|
+
let parsed;
|
|
110
|
+
try {
|
|
111
|
+
parsed = JSON.parse(stripped);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
throw new Error(`[agent] Model output is not JSON: ${JSON.stringify(input.slice(0, 120))}`);
|
|
115
|
+
}
|
|
116
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
117
|
+
throw new Error('[agent] Action must be a JSON object.');
|
|
118
|
+
}
|
|
119
|
+
const action = parsed;
|
|
120
|
+
switch (action['kind']) {
|
|
121
|
+
case 'press':
|
|
122
|
+
if (typeof action['key'] !== 'string' || action['key'] === '') {
|
|
123
|
+
throw new Error('[agent] press action needs a non-empty string "key".');
|
|
124
|
+
}
|
|
125
|
+
return { kind: 'press', key: action['key'] };
|
|
126
|
+
case 'type':
|
|
127
|
+
if (typeof action['text'] !== 'string') {
|
|
128
|
+
throw new Error('[agent] type action needs a string "text".');
|
|
129
|
+
}
|
|
130
|
+
return { kind: 'type', text: action['text'] };
|
|
131
|
+
case 'click':
|
|
132
|
+
if (typeof action['id'] !== 'string' || action['id'] === '') {
|
|
133
|
+
throw new Error('[agent] click action needs a non-empty string "id".');
|
|
134
|
+
}
|
|
135
|
+
return { kind: 'click', id: action['id'] };
|
|
136
|
+
case 'clickAt': {
|
|
137
|
+
const x = action['x'];
|
|
138
|
+
const y = action['y'];
|
|
139
|
+
if (typeof x !== 'number' || typeof y !== 'number') {
|
|
140
|
+
throw new Error('[agent] clickAt action needs numeric "x" and "y".');
|
|
141
|
+
}
|
|
142
|
+
return { kind: 'clickAt', x, y };
|
|
143
|
+
}
|
|
144
|
+
case 'wait': {
|
|
145
|
+
const ms = action['ms'];
|
|
146
|
+
if (typeof ms !== 'number' || ms < 0) {
|
|
147
|
+
throw new Error('[agent] wait action needs a non-negative numeric "ms".');
|
|
148
|
+
}
|
|
149
|
+
return { kind: 'wait', ms };
|
|
150
|
+
}
|
|
151
|
+
case 'done':
|
|
152
|
+
return {
|
|
153
|
+
kind: 'done',
|
|
154
|
+
...(typeof action['note'] === 'string' ? { note: action['note'] } : {}),
|
|
155
|
+
};
|
|
156
|
+
default:
|
|
157
|
+
throw new Error(`[agent] Unknown action kind: ${JSON.stringify(action['kind'])}. ` +
|
|
158
|
+
'Expected one of: press, type, click, clickAt, wait, done.');
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Headless agent driver. Wraps {@link TestTui}'s synchronous, PTY-free
|
|
163
|
+
* harness with an observation/action loop a model can run.
|
|
164
|
+
*/
|
|
165
|
+
export class AgentTui {
|
|
166
|
+
/** The underlying scripted harness — still available for assertions. */
|
|
167
|
+
tui;
|
|
168
|
+
stepCount = 0;
|
|
169
|
+
constructor(tui) {
|
|
170
|
+
this.tui = tui;
|
|
171
|
+
}
|
|
172
|
+
static mount(root, options = {}) {
|
|
173
|
+
return new AgentTui(TestTui.mount(root, options));
|
|
174
|
+
}
|
|
175
|
+
/** Current screen + interactive elements. */
|
|
176
|
+
observe() {
|
|
177
|
+
const { elements, focusedId } = collectElements(this.tui.tree());
|
|
178
|
+
return {
|
|
179
|
+
step: this.stepCount,
|
|
180
|
+
screen: this.tui.snapshot(),
|
|
181
|
+
elements,
|
|
182
|
+
focusedId,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/** Format the current observation as an LLM prompt for `goal`. */
|
|
186
|
+
prompt(goal) {
|
|
187
|
+
return formatAgentPrompt(goal, this.observe());
|
|
188
|
+
}
|
|
189
|
+
/** Apply one action to the harness. */
|
|
190
|
+
async act(action) {
|
|
191
|
+
switch (action.kind) {
|
|
192
|
+
case 'press':
|
|
193
|
+
this.tui.send(action.key);
|
|
194
|
+
break;
|
|
195
|
+
case 'type':
|
|
196
|
+
for (const ch of action.text)
|
|
197
|
+
this.tui.send(ch);
|
|
198
|
+
break;
|
|
199
|
+
case 'click': {
|
|
200
|
+
const { elements } = this.observe();
|
|
201
|
+
const el = elements.find((candidate) => candidate.id === action.id);
|
|
202
|
+
if (!el) {
|
|
203
|
+
throw new Error(`[agent] Unknown element id "${action.id}". Known ids: ${elements.map((candidate) => candidate.id).join(', ') || '(none)'}`);
|
|
204
|
+
}
|
|
205
|
+
this.tui.click(el.x + Math.floor(el.width / 2), el.y + Math.floor(el.height / 2));
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
case 'clickAt':
|
|
209
|
+
this.tui.click(action.x, action.y);
|
|
210
|
+
break;
|
|
211
|
+
case 'wait':
|
|
212
|
+
// Deterministic time travel: advance widget timers without sleeping.
|
|
213
|
+
this.tui.root.tick(action.ms);
|
|
214
|
+
break;
|
|
215
|
+
case 'done':
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
this.stepCount += 1;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Run the agent loop: observe → decide → act, until the model says `done`,
|
|
222
|
+
* `isComplete` passes, `maxSteps` is hit, or something throws.
|
|
223
|
+
*/
|
|
224
|
+
async run(options) {
|
|
225
|
+
const maxSteps = options.maxSteps ?? 30;
|
|
226
|
+
const steps = [];
|
|
227
|
+
const initial = this.observe();
|
|
228
|
+
if (options.isComplete?.(initial) === true) {
|
|
229
|
+
return { completed: true, reason: 'goal-met', steps, final: initial };
|
|
230
|
+
}
|
|
231
|
+
for (let index = 0; index < maxSteps; index++) {
|
|
232
|
+
const observation = this.observe();
|
|
233
|
+
if (options.isComplete?.(observation) === true) {
|
|
234
|
+
return { completed: true, reason: 'goal-met', steps, final: observation };
|
|
235
|
+
}
|
|
236
|
+
let action;
|
|
237
|
+
try {
|
|
238
|
+
action = await options.decide(observation, formatAgentPrompt(options.goal, observation));
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
return { completed: false, reason: 'error', steps, final: observation, error };
|
|
242
|
+
}
|
|
243
|
+
steps.push({ index, observation, action });
|
|
244
|
+
options.onStep?.(steps[steps.length - 1]);
|
|
245
|
+
if (action.kind === 'done') {
|
|
246
|
+
return { completed: true, reason: 'done', steps, final: observation };
|
|
247
|
+
}
|
|
248
|
+
try {
|
|
249
|
+
await this.act(action);
|
|
250
|
+
}
|
|
251
|
+
catch (error) {
|
|
252
|
+
return { completed: false, reason: 'error', steps, final: observation, error };
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
const final = this.observe();
|
|
256
|
+
if (options.isComplete?.(final) === true) {
|
|
257
|
+
return { completed: true, reason: 'goal-met', steps, final };
|
|
258
|
+
}
|
|
259
|
+
return { completed: false, reason: 'max-steps', steps, final };
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/fs-mock.d.ts
CHANGED
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* In-memory virtual filesystem for testing.
|
|
3
|
-
* No disk I/O — everything stays in memory.
|
|
4
|
-
*
|
|
5
|
-
* ```ts
|
|
6
|
-
* const fs = new FsMock();
|
|
7
|
-
* fs.write('/etc/config.json', '{}');
|
|
8
|
-
* const text = fs.read('/etc/config.json');
|
|
9
|
-
* expect(text).toBe('{}');
|
|
10
|
-
* ```
|
|
11
|
-
*/
|
|
12
1
|
export declare class FsMock {
|
|
13
2
|
private root;
|
|
14
3
|
write(path: string, content: string): void;
|
package/dist/fs-mock.js
CHANGED
|
@@ -12,10 +12,25 @@ const fs = require('node:fs');
|
|
|
12
12
|
* expect(text).toBe('{}');
|
|
13
13
|
* ```
|
|
14
14
|
*/
|
|
15
|
+
function normalizeParts(path) {
|
|
16
|
+
const parts = [];
|
|
17
|
+
for (const part of path.split('/')) {
|
|
18
|
+
if (part === '' || part === '.')
|
|
19
|
+
continue;
|
|
20
|
+
if (part === '..') {
|
|
21
|
+
parts.pop();
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
parts.push(part);
|
|
25
|
+
}
|
|
26
|
+
return parts;
|
|
27
|
+
}
|
|
15
28
|
export class FsMock {
|
|
16
29
|
root = { type: 'dir', children: new Map() };
|
|
17
30
|
write(path, content) {
|
|
18
|
-
const parts = path
|
|
31
|
+
const parts = normalizeParts(path);
|
|
32
|
+
if (parts.length === 0)
|
|
33
|
+
throw new Error('[fs-mock] write() requires a non-empty path');
|
|
19
34
|
let node = this.root;
|
|
20
35
|
for (let i = 0; i < parts.length - 1; i++) {
|
|
21
36
|
if (!node.children)
|
|
@@ -63,7 +78,9 @@ export class FsMock {
|
|
|
63
78
|
return out.sort();
|
|
64
79
|
}
|
|
65
80
|
rm(path) {
|
|
66
|
-
const parts = path
|
|
81
|
+
const parts = normalizeParts(path);
|
|
82
|
+
if (parts.length === 0)
|
|
83
|
+
return false;
|
|
67
84
|
let node = this.root;
|
|
68
85
|
for (let i = 0; i < parts.length - 1; i++) {
|
|
69
86
|
const child = node.children?.get(parts[i]);
|
|
@@ -74,7 +91,7 @@ export class FsMock {
|
|
|
74
91
|
return node.children?.delete(parts[parts.length - 1]) ?? false;
|
|
75
92
|
}
|
|
76
93
|
mkdir(path) {
|
|
77
|
-
const parts = path
|
|
94
|
+
const parts = normalizeParts(path);
|
|
78
95
|
let node = this.root;
|
|
79
96
|
for (const part of parts) {
|
|
80
97
|
if (!node.children)
|
|
@@ -88,7 +105,7 @@ export class FsMock {
|
|
|
88
105
|
}
|
|
89
106
|
}
|
|
90
107
|
resolve(path) {
|
|
91
|
-
const parts = path
|
|
108
|
+
const parts = normalizeParts(path);
|
|
92
109
|
let node = this.root;
|
|
93
110
|
for (const part of parts) {
|
|
94
111
|
const next = node.children?.get(part);
|
package/dist/fs-mock.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-mock.js","sourceRoot":"","sources":["../src/fs-mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAA6B,CAAC;AAQ1D;;;;;;;;;;GAUG;AACH,MAAM,OAAO,MAAM;IACT,IAAI,GAAW,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IAE5D,KAAK,CAAC,IAAY,EAAE,OAAe;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"fs-mock.js","sourceRoot":"","sources":["../src/fs-mock.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { type ReplayHandle, type SessionAction, SessionRecorder } from '@mudah-cli/tui';
|
|
2
|
+
export { type AgentAction, type AgentElement, type AgentObservation, type AgentResult, type AgentRunOptions, type AgentStep, AgentTui, formatAgentPrompt, parseAgentAction, } from './agent.js';
|
|
2
3
|
export { FsMock, mockFs } from './fs-mock.js';
|
|
3
4
|
export { NetworkMock, type NetworkMockResponse } from './network-mock.js';
|
|
4
5
|
export { createMockPlugin, type MockPlugin, type MockPluginOptions, MockPluginRegistry, } from './plugin-mock.js';
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { SessionRecorder } from '@mudah-cli/tui';
|
|
2
|
+
export { AgentTui, formatAgentPrompt, parseAgentAction, } from './agent.js';
|
|
2
3
|
export { FsMock, mockFs } from './fs-mock.js';
|
|
3
4
|
export { NetworkMock } from './network-mock.js';
|
|
4
5
|
export { createMockPlugin, MockPluginRegistry, } from './plugin-mock.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAA4B,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EACL,gBAAgB,EAGhB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAyB,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,OAAO,EAAuB,UAAU,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EACL,UAAU,EACV,OAAO,GAIR,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAOL,QAAQ,EACR,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAA4B,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EACL,gBAAgB,EAGhB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAyB,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,OAAO,EAAuB,UAAU,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EACL,UAAU,EACV,OAAO,GAIR,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/snapshot-assert.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* in `expect(() => assertHasColor(...)).not.toThrow()` or similar.
|
|
7
7
|
*/
|
|
8
8
|
import { stripAnsi } from '@mudah-cli/ui';
|
|
9
|
-
const ANSI_SGR_FOREGROUND = /\x1b\[(?:38;2;(\d+);(\d+);(\d+)|38;5;(\d+)|3[0-8])m/g;
|
|
9
|
+
const ANSI_SGR_FOREGROUND = /\x1b\[(?:38;2;(\d+);(\d+);(\d+)|38;5;(\d+)|3[0-8]|0|39)m/g;
|
|
10
10
|
function hexFromRgb(r, g, b) {
|
|
11
11
|
return `#${[r, g, b].map((n) => Number(n).toString(16).padStart(2, '0')).join('')}`;
|
|
12
12
|
}
|
|
@@ -25,7 +25,8 @@ function styledRuns(text) {
|
|
|
25
25
|
const r = match[1];
|
|
26
26
|
const g = match[2];
|
|
27
27
|
const b = match[3];
|
|
28
|
-
|
|
28
|
+
const isReset = match[0] === '\x1b[0m' || match[0] === '\x1b[39m';
|
|
29
|
+
current = !isReset && r && g && b ? { text: '', hex: hexFromRgb(r, g, b) } : { text: '' };
|
|
29
30
|
last = start + match[0].length;
|
|
30
31
|
}
|
|
31
32
|
current.text += text.slice(last);
|
|
@@ -35,6 +36,9 @@ function styledRuns(text) {
|
|
|
35
36
|
}
|
|
36
37
|
function hexToRgb(hex) {
|
|
37
38
|
const v = hex.replace('#', '');
|
|
39
|
+
if (!/^[0-9a-fA-F]{3}$/.test(v) && !/^[0-9a-fA-F]{6}$/.test(v)) {
|
|
40
|
+
throw new Error(`[testing] Invalid hex color: ${hex}`);
|
|
41
|
+
}
|
|
38
42
|
const full = v.length === 3
|
|
39
43
|
? v
|
|
40
44
|
.split('')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot-assert.js","sourceRoot":"","sources":["../src/snapshot-assert.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAS1C,MAAM,mBAAmB,GAAG,
|
|
1
|
+
{"version":3,"file":"snapshot-assert.js","sourceRoot":"","sources":["../src/snapshot-assert.ts"],"names":[],"mappings":"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"}
|
package/dist/test-tui.d.ts
CHANGED
|
@@ -63,7 +63,7 @@ export declare class TestTui {
|
|
|
63
63
|
send(name: string, ch?: string): this;
|
|
64
64
|
paste(text: string): this;
|
|
65
65
|
click(x: number, y: number): this;
|
|
66
|
-
wheel(direction: 'up' | 'down'): this;
|
|
66
|
+
wheel(direction: 'up' | 'down', x?: number, y?: number): this;
|
|
67
67
|
resize(cols: number, rows: number): this;
|
|
68
68
|
/**
|
|
69
69
|
* Step back one recorded visual frame. `snapshot()` / `frame()` then
|
package/dist/test-tui.js
CHANGED
|
@@ -55,10 +55,10 @@ export class TestTui {
|
|
|
55
55
|
this.root.handleMouse(click(x, y));
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
|
-
wheel(direction) {
|
|
58
|
+
wheel(direction, x = 0, y = 0) {
|
|
59
59
|
return this.record({ kind: 'wheel', direction }, () => {
|
|
60
60
|
this.root.handleMouse({
|
|
61
|
-
...click(
|
|
61
|
+
...click(x, y),
|
|
62
62
|
buttons: { left: false, middle: false, right: false, extra: false },
|
|
63
63
|
wheel: direction,
|
|
64
64
|
});
|
package/dist/test-tui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-tui.js","sourceRoot":"","sources":["../src/test-tui.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"test-tui.js","sourceRoot":"","sources":["../src/test-tui.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mudah-cli/testing",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.4",
|
|
4
4
|
"description": "In-process command test runner with captured output, mocked prompts, and JSON assertions.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -33,12 +33,12 @@
|
|
|
33
33
|
],
|
|
34
34
|
"sideEffects": false,
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@mudah-cli/animation": "^0.9.
|
|
37
|
-
"@mudah-cli/console": "^0.9.
|
|
38
|
-
"@mudah-cli/core": "^0.9.
|
|
39
|
-
"@mudah-cli/terminal": "^0.9.
|
|
40
|
-
"@mudah-cli/tui": "^0.9.
|
|
41
|
-
"@mudah-cli/ui": "^0.9.
|
|
36
|
+
"@mudah-cli/animation": "^0.9.4",
|
|
37
|
+
"@mudah-cli/console": "^0.9.4",
|
|
38
|
+
"@mudah-cli/core": "^0.9.4",
|
|
39
|
+
"@mudah-cli/terminal": "^0.9.4",
|
|
40
|
+
"@mudah-cli/tui": "^0.9.4",
|
|
41
|
+
"@mudah-cli/ui": "^0.9.4"
|
|
42
42
|
},
|
|
43
43
|
"publishConfig": {
|
|
44
44
|
"access": "public"
|