craftdriver 0.0.3 → 0.2.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/CHANGELOG.md +104 -0
- package/README.md +186 -10
- package/bin/craftdriver.mjs +26 -0
- package/dist/cli/client.d.ts +17 -0
- package/dist/cli/client.d.ts.map +1 -0
- package/dist/cli/client.js +88 -0
- package/dist/cli/client.js.map +1 -0
- package/dist/cli/daemon.d.ts +15 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +145 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/defaults.d.ts +10 -0
- package/dist/cli/defaults.d.ts.map +1 -0
- package/dist/cli/defaults.js +42 -0
- package/dist/cli/defaults.js.map +1 -0
- package/dist/cli/dispatcher.d.ts +28 -0
- package/dist/cli/dispatcher.d.ts.map +1 -0
- package/dist/cli/dispatcher.js +319 -0
- package/dist/cli/dispatcher.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +404 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +24 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +192 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/mcp/artifacts.d.ts +43 -0
- package/dist/cli/mcp/artifacts.d.ts.map +1 -0
- package/dist/cli/mcp/artifacts.js +104 -0
- package/dist/cli/mcp/artifacts.js.map +1 -0
- package/dist/cli/mcp/server.d.ts +34 -0
- package/dist/cli/mcp/server.d.ts.map +1 -0
- package/dist/cli/mcp/server.js +214 -0
- package/dist/cli/mcp/server.js.map +1 -0
- package/dist/cli/mcp/tools.d.ts +34 -0
- package/dist/cli/mcp/tools.d.ts.map +1 -0
- package/dist/cli/mcp/tools.js +236 -0
- package/dist/cli/mcp/tools.js.map +1 -0
- package/dist/cli/parseArgs.d.ts +37 -0
- package/dist/cli/parseArgs.d.ts.map +1 -0
- package/dist/cli/parseArgs.js +215 -0
- package/dist/cli/parseArgs.js.map +1 -0
- package/dist/cli/protocol.d.ts +34 -0
- package/dist/cli/protocol.d.ts.map +1 -0
- package/dist/cli/protocol.js +2 -0
- package/dist/cli/protocol.js.map +1 -0
- package/dist/cli/selector.d.ts +29 -0
- package/dist/cli/selector.d.ts.map +1 -0
- package/dist/cli/selector.js +100 -0
- package/dist/cli/selector.js.map +1 -0
- package/dist/cli/snapshot.d.ts +48 -0
- package/dist/cli/snapshot.d.ts.map +1 -0
- package/dist/cli/snapshot.js +179 -0
- package/dist/cli/snapshot.js.map +1 -0
- package/dist/index.d.ts +14 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/a11y.d.ts +81 -0
- package/dist/lib/a11y.d.ts.map +1 -0
- package/dist/lib/a11y.js +171 -0
- package/dist/lib/a11y.js.map +1 -0
- package/dist/lib/bidi/connection.d.ts +62 -0
- package/dist/lib/bidi/connection.d.ts.map +1 -0
- package/dist/lib/bidi/connection.js +227 -0
- package/dist/lib/bidi/connection.js.map +1 -0
- package/dist/lib/bidi/index.d.ts +101 -0
- package/dist/lib/bidi/index.d.ts.map +1 -0
- package/dist/lib/bidi/index.js +163 -0
- package/dist/lib/bidi/index.js.map +1 -0
- package/dist/lib/bidi/logs.d.ts +104 -0
- package/dist/lib/bidi/logs.d.ts.map +1 -0
- package/dist/lib/bidi/logs.js +273 -0
- package/dist/lib/bidi/logs.js.map +1 -0
- package/dist/lib/bidi/network.d.ts +165 -0
- package/dist/lib/bidi/network.d.ts.map +1 -0
- package/dist/lib/bidi/network.js +477 -0
- package/dist/lib/bidi/network.js.map +1 -0
- package/dist/lib/bidi/storage.d.ts +83 -0
- package/dist/lib/bidi/storage.d.ts.map +1 -0
- package/dist/lib/bidi/storage.js +299 -0
- package/dist/lib/bidi/storage.js.map +1 -0
- package/dist/lib/bidi/types.d.ts +323 -0
- package/dist/lib/bidi/types.d.ts.map +1 -0
- package/dist/lib/bidi/types.js +6 -0
- package/dist/lib/bidi/types.js.map +1 -0
- package/dist/lib/browser.d.ts +776 -13
- package/dist/lib/browser.d.ts.map +1 -1
- package/dist/lib/browser.js +1547 -70
- package/dist/lib/browser.js.map +1 -1
- package/dist/lib/browserContext.d.ts +486 -0
- package/dist/lib/browserContext.d.ts.map +1 -0
- package/dist/lib/browserContext.js +937 -0
- package/dist/lib/browserContext.js.map +1 -0
- package/dist/lib/builder.d.ts +3 -0
- package/dist/lib/builder.d.ts.map +1 -1
- package/dist/lib/builder.js +31 -4
- package/dist/lib/builder.js.map +1 -1
- package/dist/lib/by.d.ts +18 -2
- package/dist/lib/by.d.ts.map +1 -1
- package/dist/lib/by.js +20 -2
- package/dist/lib/by.js.map +1 -1
- package/dist/lib/chrome.d.ts +13 -1
- package/dist/lib/chrome.d.ts.map +1 -1
- package/dist/lib/chrome.js +13 -17
- package/dist/lib/chrome.js.map +1 -1
- package/dist/lib/clock.d.ts +115 -0
- package/dist/lib/clock.d.ts.map +1 -0
- package/dist/lib/clock.js +407 -0
- package/dist/lib/clock.js.map +1 -0
- package/dist/lib/driver.d.ts +45 -0
- package/dist/lib/driver.d.ts.map +1 -1
- package/dist/lib/driver.js +129 -1
- package/dist/lib/driver.js.map +1 -1
- package/dist/lib/driverManager.d.ts +25 -0
- package/dist/lib/driverManager.d.ts.map +1 -0
- package/dist/lib/driverManager.js +399 -0
- package/dist/lib/driverManager.js.map +1 -0
- package/dist/lib/elementHandle.d.ts +69 -2
- package/dist/lib/elementHandle.d.ts.map +1 -1
- package/dist/lib/elementHandle.js +215 -40
- package/dist/lib/elementHandle.js.map +1 -1
- package/dist/lib/errors.d.ts +71 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +73 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/expect.d.ts +6 -1
- package/dist/lib/expect.d.ts.map +1 -1
- package/dist/lib/expect.js +55 -37
- package/dist/lib/expect.js.map +1 -1
- package/dist/lib/firefox.d.ts +18 -0
- package/dist/lib/firefox.d.ts.map +1 -0
- package/dist/lib/firefox.js +33 -0
- package/dist/lib/firefox.js.map +1 -0
- package/dist/lib/frame.d.ts +57 -0
- package/dist/lib/frame.d.ts.map +1 -0
- package/dist/lib/frame.js +277 -0
- package/dist/lib/frame.js.map +1 -0
- package/dist/lib/keyboard.d.ts +1 -1
- package/dist/lib/keyboard.d.ts.map +1 -1
- package/dist/lib/keyboard.js +1 -1
- package/dist/lib/keyboard.js.map +1 -1
- package/dist/lib/locator.d.ts +71 -2
- package/dist/lib/locator.d.ts.map +1 -1
- package/dist/lib/locator.js +289 -31
- package/dist/lib/locator.js.map +1 -1
- package/dist/lib/mouse.d.ts +1 -1
- package/dist/lib/mouse.d.ts.map +1 -1
- package/dist/lib/mouse.js +1 -1
- package/dist/lib/mouse.js.map +1 -1
- package/dist/lib/page.d.ts +107 -0
- package/dist/lib/page.d.ts.map +1 -0
- package/dist/lib/page.js +388 -0
- package/dist/lib/page.js.map +1 -0
- package/dist/lib/tracing.d.ts +128 -0
- package/dist/lib/tracing.d.ts.map +1 -0
- package/dist/lib/tracing.js +272 -0
- package/dist/lib/tracing.js.map +1 -0
- package/dist/lib/wait.d.ts.map +1 -1
- package/dist/lib/wait.js +14 -1
- package/dist/lib/wait.js.map +1 -1
- package/dist/lib/webelement.d.ts +2 -0
- package/dist/lib/webelement.d.ts.map +1 -1
- package/dist/lib/webelement.js +18 -0
- package/dist/lib/webelement.js.map +1 -1
- package/docs/accessibility.md +177 -0
- package/docs/api-reference.md +71 -0
- package/docs/assertions.md +182 -0
- package/docs/bidi-features.md +462 -0
- package/docs/browser-api.md +673 -0
- package/docs/browser-context.md +522 -0
- package/docs/cli.md +233 -0
- package/docs/clock.md +245 -0
- package/docs/dialogs.md +143 -0
- package/docs/driver-configuration.md +64 -0
- package/docs/element-api.md +219 -0
- package/docs/emulation.md +155 -0
- package/docs/error-codes.md +67 -0
- package/docs/getting-started.md +168 -0
- package/docs/keyboard-mouse.md +250 -0
- package/docs/mcp.md +250 -0
- package/docs/mobile-emulation.md +194 -0
- package/docs/screenshots.md +146 -0
- package/docs/selectors.md +382 -0
- package/docs/session-management.md +229 -0
- package/docs/tracing.md +282 -0
- package/package.json +25 -5
- package/skills/craftdriver/SKILL.md +84 -0
- package/skills/craftdriver/cheatsheet.md +194 -0
- package/skills/craftdriver/cli.md +104 -0
- package/skills/craftdriver/patterns.md +139 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { dispatch } from '../dispatcher.js';
|
|
2
|
+
const STRING_SELECTOR = {
|
|
3
|
+
type: 'string',
|
|
4
|
+
description: "CSS by default. Switch kind with a prefix: 'role=button[name=Submit]', " +
|
|
5
|
+
"'text=Sign In', 'text*=Sign', 'label=Email', 'placeholder=...', " +
|
|
6
|
+
"'testid=...', 'xpath=...', 'id=...', 'name=...'.",
|
|
7
|
+
};
|
|
8
|
+
export const TOOLS = [
|
|
9
|
+
{
|
|
10
|
+
name: 'browser_navigate',
|
|
11
|
+
description: 'Navigate the active page to a URL. Waits for load.',
|
|
12
|
+
inputSchema: {
|
|
13
|
+
type: 'object',
|
|
14
|
+
properties: { url: { type: 'string' } },
|
|
15
|
+
required: ['url'],
|
|
16
|
+
},
|
|
17
|
+
mutating: true,
|
|
18
|
+
toDispatch: (a) => ({ cmd: 'go', args: { url: a.url } }),
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: 'browser_click',
|
|
22
|
+
description: 'Click an element. Auto-waits for visible+enabled. Returns NO_MATCH immediately ' +
|
|
23
|
+
'when the selector matches zero elements at t=0.',
|
|
24
|
+
inputSchema: {
|
|
25
|
+
type: 'object',
|
|
26
|
+
properties: { selector: STRING_SELECTOR, timeout_ms: { type: 'number' } },
|
|
27
|
+
required: ['selector'],
|
|
28
|
+
},
|
|
29
|
+
mutating: true,
|
|
30
|
+
toDispatch: (a) => ({ cmd: 'click', args: { selector: a.selector, timeout: a.timeout_ms } }),
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'browser_fill',
|
|
34
|
+
description: 'Fill an input/textarea/select. The library auto-clears before typing. ' +
|
|
35
|
+
'For checkboxes prefer browser_click with the matching label.',
|
|
36
|
+
inputSchema: {
|
|
37
|
+
type: 'object',
|
|
38
|
+
properties: {
|
|
39
|
+
selector: STRING_SELECTOR,
|
|
40
|
+
value: { type: 'string' },
|
|
41
|
+
timeout_ms: { type: 'number' },
|
|
42
|
+
},
|
|
43
|
+
required: ['selector', 'value'],
|
|
44
|
+
},
|
|
45
|
+
mutating: true,
|
|
46
|
+
toDispatch: (a) => ({
|
|
47
|
+
cmd: 'fill',
|
|
48
|
+
args: { selector: a.selector, value: a.value, timeout: a.timeout_ms },
|
|
49
|
+
}),
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'browser_press',
|
|
53
|
+
description: 'Press a keyboard key (e.g. "Enter", "Tab", "Control+A"). Optional selector ' +
|
|
54
|
+
'focuses an element first.',
|
|
55
|
+
inputSchema: {
|
|
56
|
+
type: 'object',
|
|
57
|
+
properties: { key: { type: 'string' }, selector: STRING_SELECTOR },
|
|
58
|
+
required: ['key'],
|
|
59
|
+
},
|
|
60
|
+
mutating: true,
|
|
61
|
+
toDispatch: (a) => ({
|
|
62
|
+
cmd: 'press',
|
|
63
|
+
args: { key: a.key, ...(a.selector ? { selector: a.selector } : {}) },
|
|
64
|
+
}),
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'browser_hover',
|
|
68
|
+
description: 'Hover over an element.',
|
|
69
|
+
inputSchema: {
|
|
70
|
+
type: 'object',
|
|
71
|
+
properties: { selector: STRING_SELECTOR, timeout_ms: { type: 'number' } },
|
|
72
|
+
required: ['selector'],
|
|
73
|
+
},
|
|
74
|
+
mutating: true,
|
|
75
|
+
toDispatch: (a) => ({ cmd: 'hover', args: { selector: a.selector, timeout: a.timeout_ms } }),
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
name: 'browser_find',
|
|
79
|
+
description: 'Locate elements without acting on them. Returns up to `limit` matches with ' +
|
|
80
|
+
'tag, text snippet, and visibility. Use `all: true` to enumerate.',
|
|
81
|
+
inputSchema: {
|
|
82
|
+
type: 'object',
|
|
83
|
+
properties: {
|
|
84
|
+
selector: STRING_SELECTOR,
|
|
85
|
+
all: { type: 'boolean' },
|
|
86
|
+
limit: { type: 'number' },
|
|
87
|
+
offset: { type: 'number' },
|
|
88
|
+
},
|
|
89
|
+
required: ['selector'],
|
|
90
|
+
},
|
|
91
|
+
mutating: false,
|
|
92
|
+
toDispatch: (a) => ({
|
|
93
|
+
cmd: 'find',
|
|
94
|
+
args: { selector: a.selector, all: a.all, limit: a.limit, offset: a.offset },
|
|
95
|
+
}),
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: 'browser_exists',
|
|
99
|
+
description: 'Zero-wait probe: returns { exists, count } immediately. Call this BEFORE ' +
|
|
100
|
+
'browser_click/wait when you are guessing a selector — it costs one BiDi ' +
|
|
101
|
+
"roundtrip instead of the full 5 s timeout.",
|
|
102
|
+
inputSchema: {
|
|
103
|
+
type: 'object',
|
|
104
|
+
properties: { selector: STRING_SELECTOR },
|
|
105
|
+
required: ['selector'],
|
|
106
|
+
},
|
|
107
|
+
mutating: false,
|
|
108
|
+
toDispatch: (a) => ({ cmd: 'exists', args: { selector: a.selector } }),
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
name: 'browser_wait',
|
|
112
|
+
description: 'Wait for a condition: selector to become visible/hidden/attached/detached, ' +
|
|
113
|
+
'or a load state (load|domcontentloaded|networkidle).',
|
|
114
|
+
inputSchema: {
|
|
115
|
+
type: 'object',
|
|
116
|
+
properties: {
|
|
117
|
+
target: { type: 'string' },
|
|
118
|
+
kind: { type: 'string', enum: ['selector', 'load'] },
|
|
119
|
+
state: { type: 'string' },
|
|
120
|
+
timeout_ms: { type: 'number' },
|
|
121
|
+
},
|
|
122
|
+
required: ['target'],
|
|
123
|
+
},
|
|
124
|
+
mutating: false,
|
|
125
|
+
toDispatch: (a) => ({
|
|
126
|
+
cmd: 'wait',
|
|
127
|
+
args: { target: a.target, kind: a.kind ?? 'selector', state: a.state, timeout: a.timeout_ms },
|
|
128
|
+
}),
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
name: 'browser_read',
|
|
132
|
+
description: 'Read text/attr/value/is-state from an element, or page body text when no ' +
|
|
133
|
+
'selector is given. `kind` defaults to "text".',
|
|
134
|
+
inputSchema: {
|
|
135
|
+
type: 'object',
|
|
136
|
+
properties: {
|
|
137
|
+
selector: STRING_SELECTOR,
|
|
138
|
+
kind: { type: 'string', enum: ['text', 'attr', 'value', 'is'] },
|
|
139
|
+
name: { type: 'string', description: 'attribute name when kind=attr' },
|
|
140
|
+
what: {
|
|
141
|
+
type: 'string',
|
|
142
|
+
enum: ['visible', 'enabled', 'checked'],
|
|
143
|
+
description: 'state when kind=is',
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
mutating: false,
|
|
148
|
+
toDispatch: (a) => {
|
|
149
|
+
const kind = a.kind ?? 'text';
|
|
150
|
+
if (kind === 'attr')
|
|
151
|
+
return { cmd: 'attr', args: { selector: a.selector, name: a.name } };
|
|
152
|
+
if (kind === 'value')
|
|
153
|
+
return { cmd: 'value', args: { selector: a.selector } };
|
|
154
|
+
if (kind === 'is')
|
|
155
|
+
return { cmd: 'is', args: { selector: a.selector, what: a.what } };
|
|
156
|
+
return { cmd: 'text', args: { ...(a.selector ? { selector: a.selector } : {}) } };
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: 'browser_pages',
|
|
161
|
+
description: 'List open pages with id/url/title. Use for tab/popup-aware flows.',
|
|
162
|
+
inputSchema: { type: 'object', properties: {} },
|
|
163
|
+
mutating: false,
|
|
164
|
+
toDispatch: () => ({ cmd: 'pages', args: {} }),
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
name: 'browser_snapshot',
|
|
168
|
+
description: 'Sanitized accessibility-tree summary of the active page: one line ' +
|
|
169
|
+
'per visible interactive element with role, accessible name, and a ' +
|
|
170
|
+
'stable ref (`e1`, `e2`, …). Use `ref=eN` as the selector for ' +
|
|
171
|
+
'subsequent tool calls — refs are auto-resolved without DOM hunting ' +
|
|
172
|
+
'and invalidate on the next snapshot or navigation. Cheaper and ' +
|
|
173
|
+
'more reliable than browser_screenshot for understanding the page.',
|
|
174
|
+
inputSchema: { type: 'object', properties: {} },
|
|
175
|
+
mutating: false,
|
|
176
|
+
toDispatch: () => ({ cmd: 'snapshot', args: {} }),
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
name: 'browser_screenshot',
|
|
180
|
+
description: 'Capture a PNG of the active page or a specific element. Always written ' +
|
|
181
|
+
'to disk under the per-session artifact directory; the response carries ' +
|
|
182
|
+
'the absolute path and byte count (zero image tokens). Pass `path` to ' +
|
|
183
|
+
'choose your own destination.',
|
|
184
|
+
inputSchema: {
|
|
185
|
+
type: 'object',
|
|
186
|
+
properties: {
|
|
187
|
+
selector: STRING_SELECTOR,
|
|
188
|
+
full_page: { type: 'boolean' },
|
|
189
|
+
path: {
|
|
190
|
+
type: 'string',
|
|
191
|
+
description: 'Absolute path to write the PNG to. If omitted, an artifact ' +
|
|
192
|
+
'path is auto-allocated.',
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
mutating: false,
|
|
197
|
+
returnsImage: true,
|
|
198
|
+
toDispatch: (a) => ({
|
|
199
|
+
cmd: 'screenshot',
|
|
200
|
+
args: {
|
|
201
|
+
...(a.selector ? { selector: a.selector } : {}),
|
|
202
|
+
fullPage: a.full_page,
|
|
203
|
+
...(a.path ? { path: a.path } : {}),
|
|
204
|
+
},
|
|
205
|
+
}),
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
name: 'browser_status',
|
|
209
|
+
description: 'Report whether a browser is up and which URL is active.',
|
|
210
|
+
inputSchema: { type: 'object', properties: {} },
|
|
211
|
+
mutating: false,
|
|
212
|
+
toDispatch: () => ({ cmd: 'status', args: {} }),
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
name: 'browser_advanced_eval',
|
|
216
|
+
description: 'Evaluate arbitrary JavaScript in the page. LAST RESORT — prefer ' +
|
|
217
|
+
'browser_find/click/fill when possible. Costs tokens and bypasses auto-wait.',
|
|
218
|
+
inputSchema: {
|
|
219
|
+
type: 'object',
|
|
220
|
+
properties: { js: { type: 'string' } },
|
|
221
|
+
required: ['js'],
|
|
222
|
+
},
|
|
223
|
+
mutating: true,
|
|
224
|
+
toDispatch: (a) => ({ cmd: 'eval', args: { js: a.js } }),
|
|
225
|
+
},
|
|
226
|
+
];
|
|
227
|
+
const BY_NAME = new Map(TOOLS.map((t) => [t.name, t]));
|
|
228
|
+
export function getTool(name) {
|
|
229
|
+
return BY_NAME.get(name);
|
|
230
|
+
}
|
|
231
|
+
/** Run a tool against the dispatcher. Throws CraftdriverError on failure. */
|
|
232
|
+
export async function runTool(ctx, tool, args) {
|
|
233
|
+
const mapped = tool.toDispatch(args);
|
|
234
|
+
return dispatch(ctx, mapped.cmd, mapped.args);
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/cli/mcp/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Translate raw `argv` into a `(cmd, args)` pair that the dispatcher
|
|
3
|
+
* understands. Hand-rolled because v1 has ~20 commands; pulling in
|
|
4
|
+
* `commander`/`yargs` would dwarf the library footprint.
|
|
5
|
+
*
|
|
6
|
+
* Recognised global flags (anywhere on the command line):
|
|
7
|
+
* --timeout <ms> per-call timeout override
|
|
8
|
+
* --json force JSON output even on a TTY
|
|
9
|
+
* --pretty force pretty output even when piped
|
|
10
|
+
* --explain include one-line BiDi step log (placeholder)
|
|
11
|
+
* --headless / --headed launch option (only honoured for ephemeral / first daemon start)
|
|
12
|
+
* --browser <name> chrome|chromium|firefox
|
|
13
|
+
* --ephemeral run from stdin, don't talk to daemon
|
|
14
|
+
*
|
|
15
|
+
* Returns `null` when the user only asked for help / version.
|
|
16
|
+
*/
|
|
17
|
+
import type { LaunchOptions } from '../lib/browser.js';
|
|
18
|
+
export interface GlobalFlags {
|
|
19
|
+
json?: boolean;
|
|
20
|
+
pretty?: boolean;
|
|
21
|
+
explain?: boolean;
|
|
22
|
+
ephemeral?: boolean;
|
|
23
|
+
help?: boolean;
|
|
24
|
+
version?: boolean;
|
|
25
|
+
launch: LaunchOptions;
|
|
26
|
+
/** When set, `craftdriver` should set `process.env.HEADLESS` before launch. */
|
|
27
|
+
headless?: boolean;
|
|
28
|
+
timeout?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface ParsedCommand {
|
|
31
|
+
cmd: string;
|
|
32
|
+
args: Record<string, unknown>;
|
|
33
|
+
flags: GlobalFlags;
|
|
34
|
+
}
|
|
35
|
+
export declare const HELP_TEXT = "craftdriver \u2014 agent-first WebDriver CLI\n\nUSAGE\n craftdriver <command> [args...] [flags]\n\nCOMMON COMMANDS\n go <url> navigate the active page\n find <selector> [--all] [--limit N] [--offset M]\n click <selector>\n fill <selector> <value>\n press <key> [selector]\n hover <selector>\n text [selector] [--limit N]\n attr <selector> <name>\n value <selector>\n is visible|enabled|checked <selector>\n wait <selector> [--state visible|hidden|attached|detached] [--timeout ms]\n wait load [--state load|domcontentloaded|networkidle]\n exists <selector> 0-wait probe; exit 0 if any match\n pages list open pages\n snapshot sanitized DOM summary with refs\n (use ref=eN as a selector)\n screenshot [-o file.png] [--full-page] [--selector S]\n eval <js> advanced; evaluate JS on active page\n back | forward | reload | status | quit\n\nDAEMON\n daemon start launch background browser (Unix socket)\n daemon status PID, browser, active page URL\n daemon stop graceful shutdown\n\nINIT (agent guide files for the current project)\n init <flavor> [--force] [--dry-run]\n flavors: agents | copilot | claude | cursor | gemini | all\n writes a short rules file under the path each tool expects:\n agents \u2192 AGENTS.md\n copilot \u2192 .github/copilot-instructions.md\n claude \u2192 CLAUDE.md\n cursor \u2192 .cursor/rules/craftdriver.mdc\n gemini \u2192 GEMINI.md\n all \u2192 every file above\n\nMCP SERVER (for hosted / sandboxed AI agents)\n mcp speak Model Context Protocol on stdio\n install snippet (Claude Code):\n claude mcp add craftdriver -- npx -y craftdriver mcp\n install snippet (Cursor / Windsurf / Zed):\n { \"mcpServers\": { \"craftdriver\": {\n \"command\": \"npx\", \"args\": [\"-y\", \"craftdriver\", \"mcp\"] } } }\n\nEPHEMERAL MODE (sandboxed agents)\n craftdriver --ephemeral < script.txt\n (one command per line; same syntax as on the CLI)\n\nSELECTOR SYNTAX\n CSS by default. Prefix to switch kind:\n role=button[name=Submit] text=Sign In label=Email\n placeholder=Search\u2026 testid=login-btn xpath=//div[1]\n\nFLAGS\n --timeout <ms> per-call timeout (default 5000ms)\n --json | --pretty force output format\n --headless / --headed override headless mode (first launch only)\n --browser <chrome|chromium|firefox>\n --ephemeral no daemon; read commands from stdin\n\nEXIT CODES\n 0 success 1 assertion/timeout/no-match 2 usage error\n";
|
|
36
|
+
export declare function parseArgv(argv: string[]): ParsedCommand | null;
|
|
37
|
+
//# sourceMappingURL=parseArgs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseArgs.d.ts","sourceRoot":"","sources":["../../src/cli/parseArgs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,eAAO,MAAM,SAAS,2vFAoErB,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,aAAa,GAAG,IAAI,CA2I9D"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
export const HELP_TEXT = `craftdriver — agent-first WebDriver CLI
|
|
2
|
+
|
|
3
|
+
USAGE
|
|
4
|
+
craftdriver <command> [args...] [flags]
|
|
5
|
+
|
|
6
|
+
COMMON COMMANDS
|
|
7
|
+
go <url> navigate the active page
|
|
8
|
+
find <selector> [--all] [--limit N] [--offset M]
|
|
9
|
+
click <selector>
|
|
10
|
+
fill <selector> <value>
|
|
11
|
+
press <key> [selector]
|
|
12
|
+
hover <selector>
|
|
13
|
+
text [selector] [--limit N]
|
|
14
|
+
attr <selector> <name>
|
|
15
|
+
value <selector>
|
|
16
|
+
is visible|enabled|checked <selector>
|
|
17
|
+
wait <selector> [--state visible|hidden|attached|detached] [--timeout ms]
|
|
18
|
+
wait load [--state load|domcontentloaded|networkidle]
|
|
19
|
+
exists <selector> 0-wait probe; exit 0 if any match
|
|
20
|
+
pages list open pages
|
|
21
|
+
snapshot sanitized DOM summary with refs
|
|
22
|
+
(use ref=eN as a selector)
|
|
23
|
+
screenshot [-o file.png] [--full-page] [--selector S]
|
|
24
|
+
eval <js> advanced; evaluate JS on active page
|
|
25
|
+
back | forward | reload | status | quit
|
|
26
|
+
|
|
27
|
+
DAEMON
|
|
28
|
+
daemon start launch background browser (Unix socket)
|
|
29
|
+
daemon status PID, browser, active page URL
|
|
30
|
+
daemon stop graceful shutdown
|
|
31
|
+
|
|
32
|
+
INIT (agent guide files for the current project)
|
|
33
|
+
init <flavor> [--force] [--dry-run]
|
|
34
|
+
flavors: agents | copilot | claude | cursor | gemini | all
|
|
35
|
+
writes a short rules file under the path each tool expects:
|
|
36
|
+
agents → AGENTS.md
|
|
37
|
+
copilot → .github/copilot-instructions.md
|
|
38
|
+
claude → CLAUDE.md
|
|
39
|
+
cursor → .cursor/rules/craftdriver.mdc
|
|
40
|
+
gemini → GEMINI.md
|
|
41
|
+
all → every file above
|
|
42
|
+
|
|
43
|
+
MCP SERVER (for hosted / sandboxed AI agents)
|
|
44
|
+
mcp speak Model Context Protocol on stdio
|
|
45
|
+
install snippet (Claude Code):
|
|
46
|
+
claude mcp add craftdriver -- npx -y craftdriver mcp
|
|
47
|
+
install snippet (Cursor / Windsurf / Zed):
|
|
48
|
+
{ "mcpServers": { "craftdriver": {
|
|
49
|
+
"command": "npx", "args": ["-y", "craftdriver", "mcp"] } } }
|
|
50
|
+
|
|
51
|
+
EPHEMERAL MODE (sandboxed agents)
|
|
52
|
+
craftdriver --ephemeral < script.txt
|
|
53
|
+
(one command per line; same syntax as on the CLI)
|
|
54
|
+
|
|
55
|
+
SELECTOR SYNTAX
|
|
56
|
+
CSS by default. Prefix to switch kind:
|
|
57
|
+
role=button[name=Submit] text=Sign In label=Email
|
|
58
|
+
placeholder=Search… testid=login-btn xpath=//div[1]
|
|
59
|
+
|
|
60
|
+
FLAGS
|
|
61
|
+
--timeout <ms> per-call timeout (default ${5000}ms)
|
|
62
|
+
--json | --pretty force output format
|
|
63
|
+
--headless / --headed override headless mode (first launch only)
|
|
64
|
+
--browser <chrome|chromium|firefox>
|
|
65
|
+
--ephemeral no daemon; read commands from stdin
|
|
66
|
+
|
|
67
|
+
EXIT CODES
|
|
68
|
+
0 success 1 assertion/timeout/no-match 2 usage error
|
|
69
|
+
`;
|
|
70
|
+
export function parseArgv(argv) {
|
|
71
|
+
const flags = { launch: {} };
|
|
72
|
+
const positional = [];
|
|
73
|
+
const opts = {};
|
|
74
|
+
for (let i = 0; i < argv.length; i++) {
|
|
75
|
+
const a = argv[i];
|
|
76
|
+
if (a === '--help' || a === '-h')
|
|
77
|
+
flags.help = true;
|
|
78
|
+
else if (a === '--version' || a === '-V')
|
|
79
|
+
flags.version = true;
|
|
80
|
+
else if (a === '--json')
|
|
81
|
+
flags.json = true;
|
|
82
|
+
else if (a === '--pretty')
|
|
83
|
+
flags.pretty = true;
|
|
84
|
+
else if (a === '--explain')
|
|
85
|
+
flags.explain = true;
|
|
86
|
+
else if (a === '--ephemeral')
|
|
87
|
+
flags.ephemeral = true;
|
|
88
|
+
else if (a === '--headless')
|
|
89
|
+
flags.headless = true;
|
|
90
|
+
else if (a === '--headed')
|
|
91
|
+
flags.headless = false;
|
|
92
|
+
else if (a === '--browser')
|
|
93
|
+
flags.launch.browserName = argv[++i];
|
|
94
|
+
else if (a === '--timeout') {
|
|
95
|
+
const n = Number(argv[++i]);
|
|
96
|
+
if (Number.isFinite(n)) {
|
|
97
|
+
flags.timeout = n;
|
|
98
|
+
opts.timeout = n;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else if (a === '--limit')
|
|
102
|
+
opts.limit = Number(argv[++i]);
|
|
103
|
+
else if (a === '--offset')
|
|
104
|
+
opts.offset = Number(argv[++i]);
|
|
105
|
+
else if (a === '--all')
|
|
106
|
+
opts.all = true;
|
|
107
|
+
else if (a === '--full-page' || a === '--fullPage')
|
|
108
|
+
opts.fullPage = true;
|
|
109
|
+
else if (a === '--state')
|
|
110
|
+
opts.state = argv[++i];
|
|
111
|
+
else if (a === '--selector')
|
|
112
|
+
opts.selector = argv[++i];
|
|
113
|
+
else if (a === '-o' || a === '--output')
|
|
114
|
+
opts.path = argv[++i];
|
|
115
|
+
else if (a === '--name')
|
|
116
|
+
opts.name = argv[++i];
|
|
117
|
+
else if (a.startsWith('--')) {
|
|
118
|
+
// Unknown long flag: take a value if next token is not another flag.
|
|
119
|
+
const key = a.slice(2);
|
|
120
|
+
const next = argv[i + 1];
|
|
121
|
+
if (next !== undefined && !next.startsWith('--')) {
|
|
122
|
+
opts[key] = next;
|
|
123
|
+
i++;
|
|
124
|
+
}
|
|
125
|
+
else
|
|
126
|
+
opts[key] = true;
|
|
127
|
+
}
|
|
128
|
+
else
|
|
129
|
+
positional.push(a);
|
|
130
|
+
}
|
|
131
|
+
if (flags.version)
|
|
132
|
+
return { cmd: '__version__', args: {}, flags };
|
|
133
|
+
if (flags.help && positional.length === 0)
|
|
134
|
+
return null;
|
|
135
|
+
if (positional.length === 0) {
|
|
136
|
+
if (flags.help)
|
|
137
|
+
return null;
|
|
138
|
+
// No command — special-case: --ephemeral with no command means "read
|
|
139
|
+
// commands from stdin". Otherwise fall through to help.
|
|
140
|
+
if (flags.ephemeral)
|
|
141
|
+
return { cmd: '__stdin__', args: {}, flags };
|
|
142
|
+
flags.help = true;
|
|
143
|
+
return { cmd: '__help__', args: {}, flags };
|
|
144
|
+
}
|
|
145
|
+
const [cmd0, ...rest] = positional;
|
|
146
|
+
const lower = cmd0.toLowerCase();
|
|
147
|
+
// Map surface command → dispatcher command + collect args.
|
|
148
|
+
switch (lower) {
|
|
149
|
+
case 'go':
|
|
150
|
+
case 'goto':
|
|
151
|
+
case 'navigate':
|
|
152
|
+
return { cmd: 'go', args: { url: rest[0], ...opts }, flags };
|
|
153
|
+
case 'click':
|
|
154
|
+
return { cmd: 'click', args: { selector: rest[0], ...opts }, flags };
|
|
155
|
+
case 'fill':
|
|
156
|
+
case 'type':
|
|
157
|
+
return { cmd: 'fill', args: { selector: rest[0], value: rest.slice(1).join(' '), ...opts }, flags };
|
|
158
|
+
case 'press':
|
|
159
|
+
// craftdriver press <key> [selector]
|
|
160
|
+
return { cmd: 'press', args: { key: rest[0], ...(rest[1] ? { selector: rest[1] } : {}), ...opts }, flags };
|
|
161
|
+
case 'hover':
|
|
162
|
+
return { cmd: 'hover', args: { selector: rest[0], ...opts }, flags };
|
|
163
|
+
case 'find':
|
|
164
|
+
return { cmd: 'find', args: { selector: rest[0], ...opts }, flags };
|
|
165
|
+
case 'exists':
|
|
166
|
+
return { cmd: 'exists', args: { selector: rest[0], ...opts }, flags };
|
|
167
|
+
case 'text':
|
|
168
|
+
return { cmd: 'text', args: { ...(rest[0] ? { selector: rest[0] } : {}), ...opts }, flags };
|
|
169
|
+
case 'attr':
|
|
170
|
+
case 'attribute':
|
|
171
|
+
return { cmd: 'attr', args: { selector: rest[0], name: rest[1], ...opts }, flags };
|
|
172
|
+
case 'value':
|
|
173
|
+
return { cmd: 'value', args: { selector: rest[0], ...opts }, flags };
|
|
174
|
+
case 'is':
|
|
175
|
+
// craftdriver is visible|enabled|checked <selector>
|
|
176
|
+
return { cmd: 'is', args: { what: rest[0], selector: rest[1], ...opts }, flags };
|
|
177
|
+
case 'wait': {
|
|
178
|
+
// craftdriver wait <selector> [--state X] OR craftdriver wait load
|
|
179
|
+
if (rest[0] === 'load') {
|
|
180
|
+
return { cmd: 'wait', args: { target: 'load', kind: 'load', ...opts }, flags };
|
|
181
|
+
}
|
|
182
|
+
return { cmd: 'wait', args: { target: rest[0], kind: 'selector', ...opts }, flags };
|
|
183
|
+
}
|
|
184
|
+
case 'pages':
|
|
185
|
+
return { cmd: 'pages', args: { ...opts }, flags };
|
|
186
|
+
case 'screenshot':
|
|
187
|
+
case 'shot':
|
|
188
|
+
return { cmd: 'screenshot', args: { ...opts }, flags };
|
|
189
|
+
case 'snapshot':
|
|
190
|
+
// craftdriver snapshot — sanitized DOM summary for locator building
|
|
191
|
+
return { cmd: 'snapshot', args: { ...opts }, flags };
|
|
192
|
+
case 'eval':
|
|
193
|
+
return { cmd: 'eval', args: { js: rest.join(' '), ...opts }, flags };
|
|
194
|
+
case 'back':
|
|
195
|
+
case 'forward':
|
|
196
|
+
case 'reload':
|
|
197
|
+
case 'status':
|
|
198
|
+
case 'quit':
|
|
199
|
+
return { cmd: lower, args: { ...opts }, flags };
|
|
200
|
+
case 'daemon': {
|
|
201
|
+
const sub = (rest[0] ?? 'status').toLowerCase();
|
|
202
|
+
return { cmd: `daemon:${sub}`, args: { ...opts }, flags };
|
|
203
|
+
}
|
|
204
|
+
case 'init': {
|
|
205
|
+
// craftdriver init <flavor> [--force] [--dry-run]
|
|
206
|
+
const flavor = (rest[0] ?? '').toLowerCase();
|
|
207
|
+
return { cmd: 'init', args: { flavor, ...opts }, flags };
|
|
208
|
+
}
|
|
209
|
+
case 'mcp':
|
|
210
|
+
return { cmd: 'mcp', args: { ...opts }, flags };
|
|
211
|
+
default:
|
|
212
|
+
return { cmd: '__unknown__', args: { cmd: cmd0 }, flags };
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=parseArgs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseArgs.js","sourceRoot":"","sources":["../../src/cli/parseArgs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire protocol for the craftdriver daemon.
|
|
3
|
+
*
|
|
4
|
+
* Line-delimited JSON over a Unix domain socket. Each line is a
|
|
5
|
+
* single JSON object terminated by `\n`. Requests carry an `id`;
|
|
6
|
+
* the daemon mirrors it back on the matching response.
|
|
7
|
+
*
|
|
8
|
+
* v1 deliberately uses a hand-rolled framing rather than JSON-RPC
|
|
9
|
+
* to keep the surface tiny. If the MCP server later wants to reuse
|
|
10
|
+
* the dispatcher we can upgrade to JSON-RPC behind the same
|
|
11
|
+
* `Request`/`Response` shape — agents don't see the wire format.
|
|
12
|
+
*/
|
|
13
|
+
export interface Request {
|
|
14
|
+
id: number;
|
|
15
|
+
cmd: string;
|
|
16
|
+
args?: Record<string, unknown>;
|
|
17
|
+
}
|
|
18
|
+
export interface OkResponse {
|
|
19
|
+
id: number;
|
|
20
|
+
ok: true;
|
|
21
|
+
result: unknown;
|
|
22
|
+
}
|
|
23
|
+
export interface ErrResponse {
|
|
24
|
+
id: number;
|
|
25
|
+
ok: false;
|
|
26
|
+
error: {
|
|
27
|
+
code: string;
|
|
28
|
+
message: string;
|
|
29
|
+
hint?: string;
|
|
30
|
+
detail?: Record<string, unknown>;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export type Response = OkResponse | ErrResponse;
|
|
34
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/cli/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,CAAC;CACH;AAED,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/cli/protocol.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Selector syntax for the CLI / agent surface.
|
|
3
|
+
*
|
|
4
|
+
* Agents pick a "kind" by prefixing the selector with one of the
|
|
5
|
+
* known schemes; otherwise the value is treated as a CSS selector
|
|
6
|
+
* (the default everywhere in craftdriver). Examples:
|
|
7
|
+
*
|
|
8
|
+
* #submit → By.css('#submit')
|
|
9
|
+
* css=button.primary → By.css('button.primary')
|
|
10
|
+
* xpath=//button[1] → By.xpath('//button[1]')
|
|
11
|
+
* text=Sign In → By.text('Sign In')
|
|
12
|
+
* text*=Sign → By.partialText('Sign')
|
|
13
|
+
* role=button → By.role('button')
|
|
14
|
+
* role=button[name=Submit] → By.role('button', { name: 'Submit' })
|
|
15
|
+
* label=Email → By.labelText('Email')
|
|
16
|
+
* testid=login-btn → By.testId('login-btn')
|
|
17
|
+
* placeholder=Search… → By.placeholder('Search…')
|
|
18
|
+
* alt=Logo → By.altText('Logo')
|
|
19
|
+
* title=Help → By.title('Help')
|
|
20
|
+
* ref=e5 → By.css('[data-craftdriver-ref="e5"]')
|
|
21
|
+
* (refs come from `craftdriver snapshot` /
|
|
22
|
+
* browser_snapshot; invalidated by the next
|
|
23
|
+
* snapshot or navigation)
|
|
24
|
+
*/
|
|
25
|
+
import { By } from '../lib/by.js';
|
|
26
|
+
export declare function parseSelector(input: string): By;
|
|
27
|
+
/** Short, log-friendly description of a By for error messages. */
|
|
28
|
+
export declare function describeSelector(by: By): string;
|
|
29
|
+
//# sourceMappingURL=selector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selector.d.ts","sourceRoot":"","sources":["../../src/cli/selector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAKlC,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,CA8E/C;AAED,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAE/C"}
|