@browserstack/mcp-server 2.3.0-beta.7 → 2.3.0-beta.9
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/capability/devicecontrol.capability-index.json +25 -16
- package/capability/loadtesting.capability-index.json +2934 -2933
- package/capability/mobiledevicecontrol.capability-index.json +60 -61
- package/capability/tm.capability-index.json +49977 -49971
- package/capability/tra.capability-index.json +31584 -31583
- package/dist/tools/applive.js +1 -1
- package/dist/tools/capability-registry/register.js +9 -2
- package/dist/tools/capability-registry/types.d.ts +8 -0
- package/package.json +1 -1
package/dist/tools/applive.js
CHANGED
|
@@ -59,7 +59,7 @@ export default function addAppLiveTools(server, config) {
|
|
|
59
59
|
// screenshot in it, and every eval where an agent was asked to operate an app and chose
|
|
60
60
|
// this tool ended with "my tools can start it but can't tap anything in it". The
|
|
61
61
|
// description says so, and names the surface that can — only when that surface is on.
|
|
62
|
-
const description = "Open a manual App Live session for the user to operate by hand. It cannot be driven by the agent." +
|
|
62
|
+
const description = "Open a manual App Live session for the user to operate by hand. It cannot be driven by the agent, and it uploads the app to App Live's own store, which agent-driven device sessions cannot use." +
|
|
63
63
|
(capabilityRegistryEnabled()
|
|
64
64
|
? " To tap, type or read the app yourself, use a mobiledevicecontrol session via invokeCapability."
|
|
65
65
|
: "");
|
|
@@ -248,11 +248,13 @@ export function addCapabilityRegistryTools(server, deps, config) {
|
|
|
248
248
|
? { verdict: "blank" }
|
|
249
249
|
: { verdict: "settled", product: ambiguity.settled })
|
|
250
250
|
: undefined;
|
|
251
|
+
/** The product's title for the question put to a person; the key stays the handle. */
|
|
252
|
+
const label = (name) => registry.index.products[name]?.title ?? name;
|
|
251
253
|
const routing = ambiguity.products.length > 1
|
|
252
254
|
? {
|
|
253
255
|
verdict: "products_clash",
|
|
254
256
|
note: `These products clash over ${ambiguity.terms.map((t) => `'${t}'`).join(", ")} — ` +
|
|
255
|
-
`the same word means something different in ${ambiguity.products.join(" and ")}. ` +
|
|
257
|
+
`the same word means something different in ${ambiguity.products.map(label).join(" and ")}. ` +
|
|
256
258
|
"ASK THE USER which they mean before searching or invoking anything; do not " +
|
|
257
259
|
"search each product in turn and merge the results. Searching before you " +
|
|
258
260
|
"ask will be refused: send the user's answer in `user_words` with this " +
|
|
@@ -260,9 +262,10 @@ export function addCapabilityRegistryTools(server, deps, config) {
|
|
|
260
262
|
routing_token: listingToken,
|
|
261
263
|
shared_terms: ambiguity.terms,
|
|
262
264
|
products: ambiguity.products,
|
|
263
|
-
question: `Which product do you mean — ${ambiguity.products.join(" or ")}?`,
|
|
265
|
+
question: `Which product do you mean — ${ambiguity.products.map(label).join(" or ")}?`,
|
|
264
266
|
senses: ambiguity.products.map((name) => ({
|
|
265
267
|
product: name,
|
|
268
|
+
title: label(name),
|
|
266
269
|
means: ambiguity.terms
|
|
267
270
|
.map((term) => {
|
|
268
271
|
const entities = registry.index.products[name]?.entities ?? {};
|
|
@@ -293,6 +296,7 @@ export function addCapabilityRegistryTools(server, deps, config) {
|
|
|
293
296
|
routing_token: listingToken,
|
|
294
297
|
question: `Which product do you mean — ${registry
|
|
295
298
|
.productNames()
|
|
299
|
+
.map(label)
|
|
296
300
|
.join(" or ")}?`,
|
|
297
301
|
}
|
|
298
302
|
: query
|
|
@@ -318,6 +322,9 @@ export function addCapabilityRegistryTools(server, deps, config) {
|
|
|
318
322
|
...(routing ? { routing } : {}),
|
|
319
323
|
products: registry.productNames().map((name) => ({
|
|
320
324
|
name,
|
|
325
|
+
...(registry.index.products[name].title
|
|
326
|
+
? { title: registry.index.products[name].title }
|
|
327
|
+
: {}),
|
|
321
328
|
summary: registry.index.products[name].summary,
|
|
322
329
|
// THE ENTITIES AND WHAT EACH ONE IS. Routing is this tool's whole job, and a
|
|
323
330
|
// product summary alone does not do it: "add a tag to xyz test" reads as
|
|
@@ -415,6 +415,14 @@ export interface AuthScheme {
|
|
|
415
415
|
scopes?: string[];
|
|
416
416
|
}
|
|
417
417
|
export interface ProductIndex {
|
|
418
|
+
/**
|
|
419
|
+
* The product's name as a person would say it — "Mobile Device Control", not the key.
|
|
420
|
+
*
|
|
421
|
+
* The key stays the handle every call takes; this is what the routing question and
|
|
422
|
+
* the product listing show, because "which do you mean — mobiledevicecontrol or tm?"
|
|
423
|
+
* is a question asked in our vocabulary rather than the user's.
|
|
424
|
+
*/
|
|
425
|
+
title?: string;
|
|
418
426
|
summary: string;
|
|
419
427
|
/**
|
|
420
428
|
* Words that route to this product but are not the name of anything in it.
|