@pedropaulovc/playwright 1.59.0-next

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/ThirdPartyNotices.txt +5042 -0
  2. package/cli.js +19 -0
  3. package/index.d.ts +17 -0
  4. package/index.js +17 -0
  5. package/index.mjs +18 -0
  6. package/jsx-runtime.js +42 -0
  7. package/jsx-runtime.mjs +21 -0
  8. package/lib/agents/agentParser.js +89 -0
  9. package/lib/agents/copilot-setup-steps.yml +34 -0
  10. package/lib/agents/generateAgents.js +348 -0
  11. package/lib/agents/playwright-test-coverage.prompt.md +31 -0
  12. package/lib/agents/playwright-test-generate.prompt.md +8 -0
  13. package/lib/agents/playwright-test-generator.agent.md +88 -0
  14. package/lib/agents/playwright-test-heal.prompt.md +6 -0
  15. package/lib/agents/playwright-test-healer.agent.md +55 -0
  16. package/lib/agents/playwright-test-plan.prompt.md +9 -0
  17. package/lib/agents/playwright-test-planner.agent.md +73 -0
  18. package/lib/common/config.js +282 -0
  19. package/lib/common/configLoader.js +344 -0
  20. package/lib/common/esmLoaderHost.js +104 -0
  21. package/lib/common/expectBundle.js +28 -0
  22. package/lib/common/expectBundleImpl.js +407 -0
  23. package/lib/common/fixtures.js +302 -0
  24. package/lib/common/globals.js +58 -0
  25. package/lib/common/ipc.js +60 -0
  26. package/lib/common/poolBuilder.js +85 -0
  27. package/lib/common/process.js +132 -0
  28. package/lib/common/suiteUtils.js +140 -0
  29. package/lib/common/test.js +321 -0
  30. package/lib/common/testLoader.js +101 -0
  31. package/lib/common/testType.js +298 -0
  32. package/lib/common/validators.js +68 -0
  33. package/lib/fsWatcher.js +67 -0
  34. package/lib/index.js +726 -0
  35. package/lib/internalsForTest.js +42 -0
  36. package/lib/isomorphic/events.js +77 -0
  37. package/lib/isomorphic/folders.js +30 -0
  38. package/lib/isomorphic/stringInternPool.js +69 -0
  39. package/lib/isomorphic/teleReceiver.js +521 -0
  40. package/lib/isomorphic/teleSuiteUpdater.js +157 -0
  41. package/lib/isomorphic/testServerConnection.js +225 -0
  42. package/lib/isomorphic/testServerInterface.js +16 -0
  43. package/lib/isomorphic/testTree.js +329 -0
  44. package/lib/isomorphic/types.d.js +16 -0
  45. package/lib/loader/loaderMain.js +59 -0
  46. package/lib/matchers/expect.js +311 -0
  47. package/lib/matchers/matcherHint.js +44 -0
  48. package/lib/matchers/matchers.js +383 -0
  49. package/lib/matchers/toBeTruthy.js +75 -0
  50. package/lib/matchers/toEqual.js +100 -0
  51. package/lib/matchers/toHaveURL.js +101 -0
  52. package/lib/matchers/toMatchAriaSnapshot.js +159 -0
  53. package/lib/matchers/toMatchSnapshot.js +342 -0
  54. package/lib/matchers/toMatchText.js +99 -0
  55. package/lib/mcp/browser/actions.d.js +16 -0
  56. package/lib/mcp/browser/browserContextFactory.js +329 -0
  57. package/lib/mcp/browser/browserServerBackend.js +84 -0
  58. package/lib/mcp/browser/config.js +421 -0
  59. package/lib/mcp/browser/context.js +244 -0
  60. package/lib/mcp/browser/response.js +278 -0
  61. package/lib/mcp/browser/sessionLog.js +75 -0
  62. package/lib/mcp/browser/tab.js +351 -0
  63. package/lib/mcp/browser/tools/common.js +65 -0
  64. package/lib/mcp/browser/tools/console.js +61 -0
  65. package/lib/mcp/browser/tools/dialogs.js +60 -0
  66. package/lib/mcp/browser/tools/evaluate.js +61 -0
  67. package/lib/mcp/browser/tools/files.js +58 -0
  68. package/lib/mcp/browser/tools/form.js +63 -0
  69. package/lib/mcp/browser/tools/install.js +72 -0
  70. package/lib/mcp/browser/tools/keyboard.js +144 -0
  71. package/lib/mcp/browser/tools/mouse.js +159 -0
  72. package/lib/mcp/browser/tools/navigate.js +136 -0
  73. package/lib/mcp/browser/tools/navigateAndWait.js +66 -0
  74. package/lib/mcp/browser/tools/network.js +78 -0
  75. package/lib/mcp/browser/tools/pdf.js +49 -0
  76. package/lib/mcp/browser/tools/runCode.js +78 -0
  77. package/lib/mcp/browser/tools/screenshot.js +93 -0
  78. package/lib/mcp/browser/tools/snapshot.js +205 -0
  79. package/lib/mcp/browser/tools/snapshotViewport.js +63 -0
  80. package/lib/mcp/browser/tools/tabs.js +67 -0
  81. package/lib/mcp/browser/tools/tool.js +47 -0
  82. package/lib/mcp/browser/tools/tracing.js +74 -0
  83. package/lib/mcp/browser/tools/utils.js +94 -0
  84. package/lib/mcp/browser/tools/verify.js +143 -0
  85. package/lib/mcp/browser/tools/wait.js +63 -0
  86. package/lib/mcp/browser/tools.js +82 -0
  87. package/lib/mcp/browser/watchdog.js +44 -0
  88. package/lib/mcp/config.d.js +16 -0
  89. package/lib/mcp/extension/cdpRelay.js +351 -0
  90. package/lib/mcp/extension/extensionContextFactory.js +76 -0
  91. package/lib/mcp/extension/protocol.js +28 -0
  92. package/lib/mcp/index.js +61 -0
  93. package/lib/mcp/log.js +35 -0
  94. package/lib/mcp/program.js +110 -0
  95. package/lib/mcp/sdk/exports.js +28 -0
  96. package/lib/mcp/sdk/http.js +152 -0
  97. package/lib/mcp/sdk/inProcessTransport.js +71 -0
  98. package/lib/mcp/sdk/server.js +223 -0
  99. package/lib/mcp/sdk/tool.js +47 -0
  100. package/lib/mcp/terminal/cli.js +296 -0
  101. package/lib/mcp/terminal/command.js +56 -0
  102. package/lib/mcp/terminal/commands.js +519 -0
  103. package/lib/mcp/terminal/daemon.js +135 -0
  104. package/lib/mcp/terminal/help.json +47 -0
  105. package/lib/mcp/terminal/helpGenerator.js +115 -0
  106. package/lib/mcp/terminal/socketConnection.js +80 -0
  107. package/lib/mcp/test/browserBackend.js +98 -0
  108. package/lib/mcp/test/generatorTools.js +122 -0
  109. package/lib/mcp/test/plannerTools.js +145 -0
  110. package/lib/mcp/test/seed.js +82 -0
  111. package/lib/mcp/test/streams.js +44 -0
  112. package/lib/mcp/test/testBackend.js +99 -0
  113. package/lib/mcp/test/testContext.js +285 -0
  114. package/lib/mcp/test/testTool.js +30 -0
  115. package/lib/mcp/test/testTools.js +108 -0
  116. package/lib/plugins/gitCommitInfoPlugin.js +198 -0
  117. package/lib/plugins/index.js +28 -0
  118. package/lib/plugins/webServerPlugin.js +237 -0
  119. package/lib/program.js +417 -0
  120. package/lib/reporters/base.js +634 -0
  121. package/lib/reporters/blob.js +138 -0
  122. package/lib/reporters/dot.js +99 -0
  123. package/lib/reporters/empty.js +32 -0
  124. package/lib/reporters/github.js +128 -0
  125. package/lib/reporters/html.js +633 -0
  126. package/lib/reporters/internalReporter.js +138 -0
  127. package/lib/reporters/json.js +254 -0
  128. package/lib/reporters/junit.js +232 -0
  129. package/lib/reporters/line.js +131 -0
  130. package/lib/reporters/list.js +253 -0
  131. package/lib/reporters/listModeReporter.js +69 -0
  132. package/lib/reporters/markdown.js +144 -0
  133. package/lib/reporters/merge.js +558 -0
  134. package/lib/reporters/multiplexer.js +112 -0
  135. package/lib/reporters/reporterV2.js +102 -0
  136. package/lib/reporters/teleEmitter.js +317 -0
  137. package/lib/reporters/versions/blobV1.js +16 -0
  138. package/lib/runner/dispatcher.js +530 -0
  139. package/lib/runner/failureTracker.js +72 -0
  140. package/lib/runner/lastRun.js +77 -0
  141. package/lib/runner/loadUtils.js +334 -0
  142. package/lib/runner/loaderHost.js +89 -0
  143. package/lib/runner/processHost.js +180 -0
  144. package/lib/runner/projectUtils.js +241 -0
  145. package/lib/runner/rebase.js +189 -0
  146. package/lib/runner/reporters.js +138 -0
  147. package/lib/runner/sigIntWatcher.js +96 -0
  148. package/lib/runner/storage.js +91 -0
  149. package/lib/runner/taskRunner.js +127 -0
  150. package/lib/runner/tasks.js +410 -0
  151. package/lib/runner/testGroups.js +125 -0
  152. package/lib/runner/testRunner.js +398 -0
  153. package/lib/runner/testServer.js +269 -0
  154. package/lib/runner/uiModeReporter.js +30 -0
  155. package/lib/runner/vcs.js +72 -0
  156. package/lib/runner/watchMode.js +396 -0
  157. package/lib/runner/workerHost.js +104 -0
  158. package/lib/third_party/pirates.js +62 -0
  159. package/lib/third_party/tsconfig-loader.js +103 -0
  160. package/lib/transform/babelBundle.js +46 -0
  161. package/lib/transform/babelBundleImpl.js +461 -0
  162. package/lib/transform/compilationCache.js +274 -0
  163. package/lib/transform/esmLoader.js +103 -0
  164. package/lib/transform/md.js +221 -0
  165. package/lib/transform/portTransport.js +67 -0
  166. package/lib/transform/transform.js +303 -0
  167. package/lib/util.js +400 -0
  168. package/lib/utilsBundle.js +50 -0
  169. package/lib/utilsBundleImpl.js +103 -0
  170. package/lib/worker/fixtureRunner.js +262 -0
  171. package/lib/worker/testInfo.js +536 -0
  172. package/lib/worker/testTracing.js +345 -0
  173. package/lib/worker/timeoutManager.js +174 -0
  174. package/lib/worker/util.js +31 -0
  175. package/lib/worker/workerMain.js +530 -0
  176. package/package.json +72 -0
  177. package/test.d.ts +18 -0
  178. package/test.js +24 -0
  179. package/test.mjs +34 -0
  180. package/types/test.d.ts +10251 -0
  181. package/types/testReporter.d.ts +822 -0
@@ -0,0 +1,296 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __copyProps = (to, from, except, desc) => {
9
+ if (from && typeof from === "object" || typeof from === "function") {
10
+ for (let key of __getOwnPropNames(from))
11
+ if (!__hasOwnProp.call(to, key) && key !== except)
12
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
13
+ }
14
+ return to;
15
+ };
16
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
17
+ // If the importer is in node compatibility mode or this is not an ESM
18
+ // file that has been converted to a CommonJS file using a Babel-
19
+ // compatible transform (i.e. "__esModule" has not been set), then set
20
+ // "default" to the CommonJS "module.exports" for node compatibility.
21
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
+ mod
23
+ ));
24
+ var import_child_process = require("child_process");
25
+ var import_crypto = __toESM(require("crypto"));
26
+ var import_fs = __toESM(require("fs"));
27
+ var import_net = __toESM(require("net"));
28
+ var import_os = __toESM(require("os"));
29
+ var import_path = __toESM(require("path"));
30
+ var import_utilsBundle = require("playwright-core/lib/utilsBundle");
31
+ var import_socketConnection = require("./socketConnection");
32
+ const debugCli = (0, import_utilsBundle.debug)("pw:cli");
33
+ const packageJSON = require("../../../package.json");
34
+ class Session {
35
+ constructor(name, connection) {
36
+ this._nextMessageId = 1;
37
+ this._callbacks = /* @__PURE__ */ new Map();
38
+ this.name = name;
39
+ this._connection = connection;
40
+ this._connection.onmessage = (message) => this._onMessage(message);
41
+ this._connection.onclose = () => this.close();
42
+ }
43
+ async run(args) {
44
+ return await this._send("run", { args });
45
+ }
46
+ async stop() {
47
+ await this._send("stop");
48
+ this.close();
49
+ }
50
+ async _send(method, params = {}) {
51
+ const messageId = this._nextMessageId++;
52
+ const message = {
53
+ id: messageId,
54
+ method,
55
+ params
56
+ };
57
+ await this._connection.send(message);
58
+ return new Promise((resolve, reject) => {
59
+ this._callbacks.set(messageId, { resolve, reject });
60
+ });
61
+ }
62
+ close() {
63
+ for (const callback of this._callbacks.values())
64
+ callback.reject(new Error("Session closed"));
65
+ this._callbacks.clear();
66
+ this._connection.close();
67
+ }
68
+ _onMessage(object) {
69
+ if (object.id && this._callbacks.has(object.id)) {
70
+ const callback = this._callbacks.get(object.id);
71
+ this._callbacks.delete(object.id);
72
+ if (object.error)
73
+ callback.reject(new Error(object.error));
74
+ else
75
+ callback.resolve(object.result);
76
+ } else if (object.id) {
77
+ throw new Error(`Unexpected message id: ${object.id}`);
78
+ } else {
79
+ throw new Error(`Unexpected message without id: ${JSON.stringify(object)}`);
80
+ }
81
+ }
82
+ }
83
+ class SessionManager {
84
+ async list() {
85
+ const dir = daemonSocketDir;
86
+ try {
87
+ const files = await import_fs.default.promises.readdir(dir);
88
+ const sessions = [];
89
+ for (const file of files) {
90
+ if (file.endsWith("-user-data")) {
91
+ const sessionName = file.slice(0, -"-user-data".length);
92
+ const live = await this._canConnect(sessionName);
93
+ sessions.push({ name: sessionName, live });
94
+ }
95
+ }
96
+ return sessions;
97
+ } catch {
98
+ return [];
99
+ }
100
+ }
101
+ async run(args) {
102
+ const sessionName = this._resolveSessionName(args.session);
103
+ const session = await this._connect(sessionName);
104
+ const result = await session.run(args);
105
+ console.log(result);
106
+ session.close();
107
+ }
108
+ async stop(sessionName) {
109
+ sessionName = this._resolveSessionName(sessionName);
110
+ if (!await this._canConnect(sessionName)) {
111
+ console.log(`Session '${sessionName}' is not running.`);
112
+ return;
113
+ }
114
+ const session = await this._connect(sessionName);
115
+ await session.stop();
116
+ console.log(`Session '${sessionName}' stopped.`);
117
+ }
118
+ async delete(sessionName) {
119
+ sessionName = this._resolveSessionName(sessionName);
120
+ if (await this._canConnect(sessionName)) {
121
+ const session = await this._connect(sessionName);
122
+ await session.stop();
123
+ }
124
+ const userDataDir = import_path.default.resolve(daemonSocketDir, `${sessionName}-user-data`);
125
+ try {
126
+ await import_fs.default.promises.rm(userDataDir, { recursive: true });
127
+ console.log(`Deleted user data for session '${sessionName}'.`);
128
+ } catch (e) {
129
+ if (e.code === "ENOENT")
130
+ console.log(`No user data found for session '${sessionName}'.`);
131
+ else
132
+ throw e;
133
+ }
134
+ if (import_os.default.platform() !== "win32") {
135
+ const socketPath = this._daemonSocketPath(sessionName);
136
+ await import_fs.default.promises.unlink(socketPath).catch(() => {
137
+ });
138
+ }
139
+ }
140
+ async _connect(sessionName) {
141
+ const socketPath = this._daemonSocketPath(sessionName);
142
+ debugCli(`Connecting to daemon at ${socketPath}`);
143
+ const socketExists = await import_fs.default.promises.stat(socketPath).then((stat) => stat?.isSocket() ?? false).catch(() => false);
144
+ if (socketExists) {
145
+ debugCli(`Socket file exists, attempting to connect...`);
146
+ try {
147
+ return await this._connectToSocket(sessionName, socketPath);
148
+ } catch (e) {
149
+ if (import_os.default.platform() !== "win32")
150
+ await import_fs.default.promises.unlink(socketPath).catch(() => {
151
+ });
152
+ }
153
+ }
154
+ const cliPath = import_path.default.join(__dirname, "../../../cli.js");
155
+ debugCli(`Will launch daemon process: ${cliPath}`);
156
+ const userDataDir = import_path.default.resolve(daemonSocketDir, `${sessionName}-user-data`);
157
+ const child = (0, import_child_process.spawn)(process.execPath, [cliPath, "run-mcp-server", `--daemon=${socketPath}`, `--user-data-dir=${userDataDir}`], {
158
+ detached: true,
159
+ stdio: "ignore",
160
+ cwd: process.cwd()
161
+ // Will be used as root.
162
+ });
163
+ child.unref();
164
+ const maxRetries = 50;
165
+ const retryDelay = 100;
166
+ for (let i = 0; i < maxRetries; i++) {
167
+ await new Promise((resolve) => setTimeout(resolve, 100));
168
+ try {
169
+ return await this._connectToSocket(sessionName, socketPath);
170
+ } catch (e) {
171
+ if (e.code !== "ENOENT")
172
+ throw e;
173
+ debugCli(`Retrying to connect to daemon at ${socketPath} (${i + 1}/${maxRetries})`);
174
+ }
175
+ }
176
+ throw new Error(`Failed to connect to daemon at ${socketPath} after ${maxRetries * retryDelay}ms`);
177
+ }
178
+ async _connectToSocket(sessionName, socketPath) {
179
+ const socket = await new Promise((resolve, reject) => {
180
+ const socket2 = import_net.default.createConnection(socketPath, () => {
181
+ debugCli(`Connected to daemon at ${socketPath}`);
182
+ resolve(socket2);
183
+ });
184
+ socket2.on("error", reject);
185
+ });
186
+ return new Session(sessionName, new import_socketConnection.SocketConnection(socket));
187
+ }
188
+ async _canConnect(sessionName) {
189
+ const socketPath = this._daemonSocketPath(sessionName);
190
+ return new Promise((resolve) => {
191
+ const socket = import_net.default.createConnection(socketPath, () => {
192
+ socket.destroy();
193
+ resolve(true);
194
+ });
195
+ socket.on("error", () => {
196
+ resolve(false);
197
+ });
198
+ });
199
+ }
200
+ _resolveSessionName(sessionName) {
201
+ if (sessionName)
202
+ return sessionName;
203
+ if (process.env.PLAYWRIGHT_CLI_SESSION)
204
+ return process.env.PLAYWRIGHT_CLI_SESSION;
205
+ return "default";
206
+ }
207
+ _daemonSocketPath(sessionName) {
208
+ const socketName = `${sessionName}.sock`;
209
+ if (import_os.default.platform() === "win32")
210
+ return `\\\\.\\pipe\\${socketDirHash}-${socketName}`;
211
+ return import_path.default.join(daemonSocketDir, socketName);
212
+ }
213
+ }
214
+ async function handleSessionCommand(sessionManager, args) {
215
+ const subcommand = args._[0].split("-").slice(1).join("-");
216
+ if (subcommand === "list") {
217
+ const sessions = await sessionManager.list();
218
+ console.log("Sessions:");
219
+ for (const session of sessions) {
220
+ const liveMarker = session.live ? " (live)" : "";
221
+ console.log(` ${session.name}${liveMarker}`);
222
+ }
223
+ if (sessions.length === 0)
224
+ console.log(" (no sessions)");
225
+ return;
226
+ }
227
+ if (subcommand === "stop") {
228
+ await sessionManager.stop(args._[1]);
229
+ return;
230
+ }
231
+ if (subcommand === "stop-all") {
232
+ const sessions = await sessionManager.list();
233
+ for (const session of sessions)
234
+ await sessionManager.stop(session.name);
235
+ return;
236
+ }
237
+ if (subcommand === "delete") {
238
+ await sessionManager.delete(args._[1]);
239
+ return;
240
+ }
241
+ console.error(`Unknown session subcommand: ${subcommand}`);
242
+ process.exit(1);
243
+ }
244
+ const socketDirHash = (() => {
245
+ const hash = import_crypto.default.createHash("sha1");
246
+ hash.update(require.resolve("../../../package.json"));
247
+ return hash.digest("hex");
248
+ })();
249
+ const daemonSocketDir = (() => {
250
+ let localCacheDir;
251
+ if (process.platform === "linux")
252
+ localCacheDir = process.env.XDG_CACHE_HOME || import_path.default.join(import_os.default.homedir(), ".cache");
253
+ if (process.platform === "darwin")
254
+ localCacheDir = import_path.default.join(import_os.default.homedir(), "Library", "Caches");
255
+ if (process.platform === "win32")
256
+ localCacheDir = process.env.LOCALAPPDATA || import_path.default.join(import_os.default.homedir(), "AppData", "Local");
257
+ if (!localCacheDir)
258
+ throw new Error("Unsupported platform: " + process.platform);
259
+ return import_path.default.join(localCacheDir, "ms-playwright", "daemon", "daemon", socketDirHash);
260
+ })();
261
+ async function main() {
262
+ const argv = process.argv.slice(2);
263
+ const args = require("minimist")(argv);
264
+ const help = require("./help.json");
265
+ const commandName = args._[0];
266
+ if (args.version || args.v) {
267
+ console.log(packageJSON.version);
268
+ process.exit(0);
269
+ }
270
+ const command = help.commands[commandName];
271
+ if (args.help || args.h) {
272
+ if (command) {
273
+ console.log(command);
274
+ } else {
275
+ console.log("playwright-cli - run playwright mcp commands from terminal\n");
276
+ console.log(help.global);
277
+ }
278
+ process.exit(0);
279
+ }
280
+ if (!command) {
281
+ console.error(`Unknown command: ${commandName}
282
+ `);
283
+ console.log(help.global);
284
+ process.exit(1);
285
+ }
286
+ const sessionManager = new SessionManager();
287
+ if (commandName.startsWith("session")) {
288
+ await handleSessionCommand(sessionManager, args);
289
+ return;
290
+ }
291
+ await sessionManager.run(args);
292
+ }
293
+ main().catch((e) => {
294
+ console.error(e.message);
295
+ process.exit(1);
296
+ });
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var command_exports = {};
20
+ __export(command_exports, {
21
+ declareCommand: () => declareCommand,
22
+ parseCommand: () => parseCommand
23
+ });
24
+ module.exports = __toCommonJS(command_exports);
25
+ function declareCommand(command) {
26
+ return command;
27
+ }
28
+ function parseCommand(command, args) {
29
+ const shape = command.args ? command.args.shape : {};
30
+ const argv = args["_"];
31
+ const options = command.options?.parse({ ...args, _: void 0 }) ?? {};
32
+ const argsObject = {};
33
+ let i = 0;
34
+ for (const name of Object.keys(shape))
35
+ argsObject[name] = argv[++i];
36
+ let parsedArgsObject = {};
37
+ try {
38
+ parsedArgsObject = command.args?.parse(argsObject) ?? {};
39
+ } catch (e) {
40
+ throw new Error(formatZodError(e));
41
+ }
42
+ const toolName = typeof command.toolName === "function" ? command.toolName(parsedArgsObject, options) : command.toolName;
43
+ const toolParams = command.toolParams({ ...parsedArgsObject, ...options });
44
+ return { toolName, toolParams };
45
+ }
46
+ function formatZodError(error) {
47
+ const issue = error.issues[0];
48
+ if (issue.code === "invalid_type")
49
+ return `${issue.message} in <${issue.path.join(".")}>`;
50
+ return error.issues.map((i) => i.message).join("\n");
51
+ }
52
+ // Annotate the CommonJS export names for ESM import in node:
53
+ 0 && (module.exports = {
54
+ declareCommand,
55
+ parseCommand
56
+ });