@midscene/playground 1.12.8 → 1.12.9-beta-20260917120835.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.
@@ -1,4 +1,4 @@
1
- import { normalizePinchParam } from "@midscene/core/device";
1
+ import { normalizePinchParam, resolveSwipeInputPrimitive } from "@midscene/core/device";
2
2
  function _define_property(obj, key, value) {
3
3
  if (key in obj) Object.defineProperty(obj, key, {
4
4
  value: value,
@@ -78,8 +78,8 @@ async function dispatchPointer(input, body, getScreenSize) {
78
78
  }
79
79
  case 'Swipe':
80
80
  {
81
- const touch = getTouchInput(input);
82
- return ensureCapability(touch.swipe, 'Swipe')(requirePoint(body), requirePoint(body, 'endX', 'endY'), {
81
+ const swipe = resolveSwipeInputPrimitive(input);
82
+ return ensureCapability(swipe?.swipe, 'Swipe')(requirePoint(body), requirePoint(body, 'endX', 'endY'), {
83
83
  duration: optionalNumber(body.duration, 'duration'),
84
84
  repeat: optionalNumber(body.repeat, 'repeat')
85
85
  });
@@ -1 +1 @@
1
- {"version":3,"file":"pointer-dispatch.mjs","sources":["../../src/pointer-dispatch.ts"],"sourcesContent":["import type {\n InputPrimitives,\n KeyboardInputPrimitives,\n PointerInputPrimitives,\n PointerPoint,\n TouchInputPrimitives,\n} from '@midscene/core/device';\nimport { normalizePinchParam } from '@midscene/core/device';\n\n/**\n * Thrown when an /interact request is malformed (missing field, wrong type)\n * or names an action / capability that the connected device does not support.\n * The route handler maps {400, 404} onto the HTTP response.\n */\nexport class PointerInputError extends Error {\n constructor(\n message: string,\n public statusCode: 400 | 404,\n ) {\n super(message);\n this.name = 'PointerInputError';\n }\n}\n\nfunction requireNumber(value: unknown, field: string): number {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n throw new PointerInputError(`${field} must be a number`, 400);\n }\n return value;\n}\n\nfunction optionalNumber(value: unknown, field: string): number | undefined {\n if (value === undefined) return undefined;\n return requireNumber(value, field);\n}\n\nfunction requireString(value: unknown, field: string): string {\n if (typeof value !== 'string') {\n throw new PointerInputError(`${field} must be a string`, 400);\n }\n return value;\n}\n\nfunction requirePoint(\n body: Record<string, unknown>,\n xField: 'x' | 'endX' = 'x',\n yField: 'y' | 'endY' = 'y',\n): PointerPoint {\n return {\n x: requireNumber(body[xField], xField),\n y: requireNumber(body[yField], yField),\n };\n}\n\nfunction ensureCapability<T>(\n fn: T | undefined,\n actionType: string,\n): NonNullable<T> {\n if (typeof fn !== 'function') {\n throw new PointerInputError(\n `${actionType} is not supported on this device`,\n 404,\n );\n }\n return fn as NonNullable<T>;\n}\n\nfunction getPointerInput(input: InputPrimitives): PointerInputPrimitives {\n if (!input.pointer) {\n throw new PointerInputError(\n 'Pointer input is not supported on this device',\n 404,\n );\n }\n return input.pointer;\n}\n\nfunction getKeyboardInput(input: InputPrimitives): KeyboardInputPrimitives {\n if (!input.keyboard) {\n throw new PointerInputError(\n 'Keyboard input is not supported on this device',\n 404,\n );\n }\n return input.keyboard;\n}\n\nfunction getTouchInput(input: InputPrimitives): TouchInputPrimitives {\n if (!input.touch) {\n throw new PointerInputError(\n 'Touch input is not supported on this device',\n 404,\n );\n }\n return input.touch;\n}\n\nfunction getScrollInput(input: InputPrimitives) {\n if (!input.scroll) {\n throw new PointerInputError(\n 'Scroll input is not supported on this device',\n 404,\n );\n }\n return input.scroll;\n}\n\n/**\n * Translate an `/interact` request body into device input primitive calls.\n *\n * The dispatcher is deliberately a flat switch: each case is HTTP-protocol\n * adaptation (parse + range-check fields, hand them to the typed primitive),\n * not platform business logic.\n */\nexport async function dispatchPointer(\n input: InputPrimitives,\n body: Record<string, unknown>,\n getScreenSize: () => Promise<{ width: number; height: number }>,\n): Promise<void> {\n const { actionType } = body;\n if (typeof actionType !== 'string' || !actionType) {\n throw new PointerInputError('actionType is required', 400);\n }\n\n switch (actionType) {\n case 'Tap': {\n const pointer = getPointerInput(input);\n return ensureCapability(pointer.tap, 'Tap')(requirePoint(body), {\n duration: optionalNumber(body.duration, 'duration'),\n });\n }\n\n case 'DoubleClick': {\n const pointer = getPointerInput(input);\n return ensureCapability(\n pointer.doubleClick,\n 'DoubleClick',\n )(requirePoint(body));\n }\n\n case 'LongPress': {\n const pointer = getPointerInput(input);\n return ensureCapability(pointer.longPress, 'LongPress')(\n requirePoint(body),\n {\n duration: optionalNumber(body.duration, 'duration'),\n },\n );\n }\n\n case 'Swipe': {\n const touch = getTouchInput(input);\n return ensureCapability(touch.swipe, 'Swipe')(\n requirePoint(body),\n requirePoint(body, 'endX', 'endY'),\n {\n duration: optionalNumber(body.duration, 'duration'),\n repeat: optionalNumber(body.repeat, 'repeat'),\n },\n );\n }\n\n case 'DragAndDrop': {\n const pointer = getPointerInput(input);\n return ensureCapability(pointer.dragAndDrop, 'DragAndDrop')(\n requirePoint(body),\n requirePoint(body, 'endX', 'endY'),\n );\n }\n\n case 'KeyboardPress': {\n const keyboard = getKeyboardInput(input);\n return ensureCapability(\n keyboard.keyboardPress,\n 'KeyboardPress',\n )(requireString(body.keyName, 'keyName'));\n }\n\n case 'Input': {\n const keyboard = getKeyboardInput(input);\n const value = requireString(body.value, 'value');\n const at =\n typeof body.x === 'number' && typeof body.y === 'number'\n ? requirePoint(body)\n : undefined;\n const mode =\n typeof body.mode === 'string'\n ? (body.mode as 'replace' | 'clear' | 'typeOnly')\n : undefined;\n const autoDismissKeyboard =\n typeof body.autoDismissKeyboard === 'boolean'\n ? body.autoDismissKeyboard\n : undefined;\n const target = at\n ? {\n center: [at.x, at.y] as [number, number],\n rect: { left: at.x, top: at.y, width: 1, height: 1 },\n description: 'manual input target',\n }\n : undefined;\n if (mode === 'clear') {\n await ensureCapability(keyboard.clearInput, 'ClearInput')(target);\n return;\n }\n if (!value) return;\n return ensureCapability(keyboard.typeText, 'Input')(value, {\n autoDismissKeyboard,\n target,\n replace: mode !== 'typeOnly',\n });\n }\n\n case 'Scroll': {\n const scroll = getScrollInput(input);\n const x =\n typeof body.x === 'number' ? requireNumber(body.x, 'x') : undefined;\n const y =\n typeof body.y === 'number' ? requireNumber(body.y, 'y') : undefined;\n const direction =\n body.direction === 'up' ||\n body.direction === 'down' ||\n body.direction === 'left' ||\n body.direction === 'right'\n ? body.direction\n : 'down';\n const scrollType =\n body.scrollType === 'scrollToBottom' ||\n body.scrollType === 'scrollToTop' ||\n body.scrollType === 'scrollToLeft' ||\n body.scrollType === 'scrollToRight' ||\n body.scrollType === 'singleAction'\n ? body.scrollType\n : 'singleAction';\n const distance =\n typeof body.distance === 'number'\n ? requireNumber(body.distance, 'distance')\n : undefined;\n return ensureCapability(\n scroll.scroll,\n 'Scroll',\n )({\n direction,\n scrollType,\n distance,\n locate:\n x !== undefined && y !== undefined\n ? {\n center: [x, y],\n\n description: 'manual scroll target',\n }\n : undefined,\n });\n }\n\n case 'Pinch': {\n const center = requirePoint(body);\n const direction = ((): 'in' | 'out' => {\n const d = body.direction;\n if (d !== 'in' && d !== 'out') {\n throw new PointerInputError('direction must be \"in\" or \"out\"', 400);\n }\n return d;\n })();\n const touch = getTouchInput(input);\n const { startDistance, endDistance, duration } = normalizePinchParam(\n {\n locate: {\n center: [center.x, center.y],\n description: 'manual pinch target',\n },\n direction,\n distance: optionalNumber(body.distance, 'distance'),\n duration: optionalNumber(body.duration, 'duration'),\n },\n await getScreenSize(),\n );\n return ensureCapability(touch.pinch, 'Pinch')(center, {\n startDistance,\n endDistance,\n duration,\n });\n }\n\n default:\n throw new PointerInputError(`Unknown actionType \"${actionType}\"`, 404);\n }\n}\n"],"names":["PointerInputError","Error","message","statusCode","requireNumber","value","field","Number","optionalNumber","undefined","requireString","requirePoint","body","xField","yField","ensureCapability","fn","actionType","getPointerInput","input","getKeyboardInput","getTouchInput","getScrollInput","dispatchPointer","getScreenSize","pointer","touch","keyboard","at","mode","autoDismissKeyboard","target","scroll","x","y","direction","scrollType","distance","center","d","startDistance","endDistance","duration","normalizePinchParam"],"mappings":";;;;;;;;;;;AAcO,MAAMA,0BAA0BC;IACrC,YACEC,OAAe,EACRC,UAAqB,CAC5B;QACA,KAAK,CAACD,UAAAA,iBAAAA,IAAAA,EAAAA,cAAAA,KAAAA,IAAAA,IAAAA,CAFCC,UAAU,GAAVA;QAGP,IAAI,CAAC,IAAI,GAAG;IACd;AACF;AAEA,SAASC,cAAcC,KAAc,EAAEC,KAAa;IAClD,IAAI,AAAiB,YAAjB,OAAOD,SAAsBE,OAAO,KAAK,CAACF,QAC5C,MAAM,IAAIL,kBAAkB,GAAGM,MAAM,iBAAiB,CAAC,EAAE;IAE3D,OAAOD;AACT;AAEA,SAASG,eAAeH,KAAc,EAAEC,KAAa;IACnD,IAAID,AAAUI,WAAVJ,OAAqB;IACzB,OAAOD,cAAcC,OAAOC;AAC9B;AAEA,SAASI,cAAcL,KAAc,EAAEC,KAAa;IAClD,IAAI,AAAiB,YAAjB,OAAOD,OACT,MAAM,IAAIL,kBAAkB,GAAGM,MAAM,iBAAiB,CAAC,EAAE;IAE3D,OAAOD;AACT;AAEA,SAASM,aACPC,IAA6B,EAC7BC,SAAuB,GAAG,EAC1BC,SAAuB,GAAG;IAE1B,OAAO;QACL,GAAGV,cAAcQ,IAAI,CAACC,OAAO,EAAEA;QAC/B,GAAGT,cAAcQ,IAAI,CAACE,OAAO,EAAEA;IACjC;AACF;AAEA,SAASC,iBACPC,EAAiB,EACjBC,UAAkB;IAElB,IAAI,AAAc,cAAd,OAAOD,IACT,MAAM,IAAIhB,kBACR,GAAGiB,WAAW,gCAAgC,CAAC,EAC/C;IAGJ,OAAOD;AACT;AAEA,SAASE,gBAAgBC,KAAsB;IAC7C,IAAI,CAACA,MAAM,OAAO,EAChB,MAAM,IAAInB,kBACR,iDACA;IAGJ,OAAOmB,MAAM,OAAO;AACtB;AAEA,SAASC,iBAAiBD,KAAsB;IAC9C,IAAI,CAACA,MAAM,QAAQ,EACjB,MAAM,IAAInB,kBACR,kDACA;IAGJ,OAAOmB,MAAM,QAAQ;AACvB;AAEA,SAASE,cAAcF,KAAsB;IAC3C,IAAI,CAACA,MAAM,KAAK,EACd,MAAM,IAAInB,kBACR,+CACA;IAGJ,OAAOmB,MAAM,KAAK;AACpB;AAEA,SAASG,eAAeH,KAAsB;IAC5C,IAAI,CAACA,MAAM,MAAM,EACf,MAAM,IAAInB,kBACR,gDACA;IAGJ,OAAOmB,MAAM,MAAM;AACrB;AASO,eAAeI,gBACpBJ,KAAsB,EACtBP,IAA6B,EAC7BY,aAA+D;IAE/D,MAAM,EAAEP,UAAU,EAAE,GAAGL;IACvB,IAAI,AAAsB,YAAtB,OAAOK,cAA2B,CAACA,YACrC,MAAM,IAAIjB,kBAAkB,0BAA0B;IAGxD,OAAQiB;QACN,KAAK;YAAO;gBACV,MAAMQ,UAAUP,gBAAgBC;gBAChC,OAAOJ,iBAAiBU,QAAQ,GAAG,EAAE,OAAOd,aAAaC,OAAO;oBAC9D,UAAUJ,eAAeI,KAAK,QAAQ,EAAE;gBAC1C;YACF;QAEA,KAAK;YAAe;gBAClB,MAAMa,UAAUP,gBAAgBC;gBAChC,OAAOJ,iBACLU,QAAQ,WAAW,EACnB,eACAd,aAAaC;YACjB;QAEA,KAAK;YAAa;gBAChB,MAAMa,UAAUP,gBAAgBC;gBAChC,OAAOJ,iBAAiBU,QAAQ,SAAS,EAAE,aACzCd,aAAaC,OACb;oBACE,UAAUJ,eAAeI,KAAK,QAAQ,EAAE;gBAC1C;YAEJ;QAEA,KAAK;YAAS;gBACZ,MAAMc,QAAQL,cAAcF;gBAC5B,OAAOJ,iBAAiBW,MAAM,KAAK,EAAE,SACnCf,aAAaC,OACbD,aAAaC,MAAM,QAAQ,SAC3B;oBACE,UAAUJ,eAAeI,KAAK,QAAQ,EAAE;oBACxC,QAAQJ,eAAeI,KAAK,MAAM,EAAE;gBACtC;YAEJ;QAEA,KAAK;YAAe;gBAClB,MAAMa,UAAUP,gBAAgBC;gBAChC,OAAOJ,iBAAiBU,QAAQ,WAAW,EAAE,eAC3Cd,aAAaC,OACbD,aAAaC,MAAM,QAAQ;YAE/B;QAEA,KAAK;YAAiB;gBACpB,MAAMe,WAAWP,iBAAiBD;gBAClC,OAAOJ,iBACLY,SAAS,aAAa,EACtB,iBACAjB,cAAcE,KAAK,OAAO,EAAE;YAChC;QAEA,KAAK;YAAS;gBACZ,MAAMe,WAAWP,iBAAiBD;gBAClC,MAAMd,QAAQK,cAAcE,KAAK,KAAK,EAAE;gBACxC,MAAMgB,KACJ,AAAkB,YAAlB,OAAOhB,KAAK,CAAC,IAAiB,AAAkB,YAAlB,OAAOA,KAAK,CAAC,GACvCD,aAAaC,QACbH;gBACN,MAAMoB,OACJ,AAAqB,YAArB,OAAOjB,KAAK,IAAI,GACXA,KAAK,IAAI,GACVH;gBACN,MAAMqB,sBACJ,AAAoC,aAApC,OAAOlB,KAAK,mBAAmB,GAC3BA,KAAK,mBAAmB,GACxBH;gBACN,MAAMsB,SAASH,KACX;oBACE,QAAQ;wBAACA,GAAG,CAAC;wBAAEA,GAAG,CAAC;qBAAC;oBACpB,MAAM;wBAAE,MAAMA,GAAG,CAAC;wBAAE,KAAKA,GAAG,CAAC;wBAAE,OAAO;wBAAG,QAAQ;oBAAE;oBACnD,aAAa;gBACf,IACAnB;gBACJ,IAAIoB,AAAS,YAATA,MAAkB,YACpB,MAAMd,iBAAiBY,SAAS,UAAU,EAAE,cAAcI;gBAG5D,IAAI,CAAC1B,OAAO;gBACZ,OAAOU,iBAAiBY,SAAS,QAAQ,EAAE,SAAStB,OAAO;oBACzDyB;oBACAC;oBACA,SAASF,AAAS,eAATA;gBACX;YACF;QAEA,KAAK;YAAU;gBACb,MAAMG,SAASV,eAAeH;gBAC9B,MAAMc,IACJ,AAAkB,YAAlB,OAAOrB,KAAK,CAAC,GAAgBR,cAAcQ,KAAK,CAAC,EAAE,OAAOH;gBAC5D,MAAMyB,IACJ,AAAkB,YAAlB,OAAOtB,KAAK,CAAC,GAAgBR,cAAcQ,KAAK,CAAC,EAAE,OAAOH;gBAC5D,MAAM0B,YACJvB,AAAmB,SAAnBA,KAAK,SAAS,IACdA,AAAmB,WAAnBA,KAAK,SAAS,IACdA,AAAmB,WAAnBA,KAAK,SAAS,IACdA,AAAmB,YAAnBA,KAAK,SAAS,GACVA,KAAK,SAAS,GACd;gBACN,MAAMwB,aACJxB,AAAoB,qBAApBA,KAAK,UAAU,IACfA,AAAoB,kBAApBA,KAAK,UAAU,IACfA,AAAoB,mBAApBA,KAAK,UAAU,IACfA,AAAoB,oBAApBA,KAAK,UAAU,IACfA,AAAoB,mBAApBA,KAAK,UAAU,GACXA,KAAK,UAAU,GACf;gBACN,MAAMyB,WACJ,AAAyB,YAAzB,OAAOzB,KAAK,QAAQ,GAChBR,cAAcQ,KAAK,QAAQ,EAAE,cAC7BH;gBACN,OAAOM,iBACLiB,OAAO,MAAM,EACb,UACA;oBACAG;oBACAC;oBACAC;oBACA,QACEJ,AAAMxB,WAANwB,KAAmBC,AAAMzB,WAANyB,IACf;wBACE,QAAQ;4BAACD;4BAAGC;yBAAE;wBAEd,aAAa;oBACf,IACAzB;gBACR;YACF;QAEA,KAAK;YAAS;gBACZ,MAAM6B,SAAS3B,aAAaC;gBAC5B,MAAMuB,YAAa,AAAC;oBAClB,MAAMI,IAAI3B,KAAK,SAAS;oBACxB,IAAI2B,AAAM,SAANA,KAAcA,AAAM,UAANA,GAChB,MAAM,IAAIvC,kBAAkB,mCAAmC;oBAEjE,OAAOuC;gBACT;gBACA,MAAMb,QAAQL,cAAcF;gBAC5B,MAAM,EAAEqB,aAAa,EAAEC,WAAW,EAAEC,QAAQ,EAAE,GAAGC,oBAC/C;oBACE,QAAQ;wBACN,QAAQ;4BAACL,OAAO,CAAC;4BAAEA,OAAO,CAAC;yBAAC;wBAC5B,aAAa;oBACf;oBACAH;oBACA,UAAU3B,eAAeI,KAAK,QAAQ,EAAE;oBACxC,UAAUJ,eAAeI,KAAK,QAAQ,EAAE;gBAC1C,GACA,MAAMY;gBAER,OAAOT,iBAAiBW,MAAM,KAAK,EAAE,SAASY,QAAQ;oBACpDE;oBACAC;oBACAC;gBACF;YACF;QAEA;YACE,MAAM,IAAI1C,kBAAkB,CAAC,oBAAoB,EAAEiB,WAAW,CAAC,CAAC,EAAE;IACtE;AACF"}
1
+ {"version":3,"file":"pointer-dispatch.mjs","sources":["../../src/pointer-dispatch.ts"],"sourcesContent":["import type {\n InputPrimitives,\n KeyboardInputPrimitives,\n PointerInputPrimitives,\n PointerPoint,\n TouchInputPrimitives,\n} from '@midscene/core/device';\nimport {\n normalizePinchParam,\n resolveSwipeInputPrimitive,\n} from '@midscene/core/device';\n\n/**\n * Thrown when an /interact request is malformed (missing field, wrong type)\n * or names an action / capability that the connected device does not support.\n * The route handler maps {400, 404} onto the HTTP response.\n */\nexport class PointerInputError extends Error {\n constructor(\n message: string,\n public statusCode: 400 | 404,\n ) {\n super(message);\n this.name = 'PointerInputError';\n }\n}\n\nfunction requireNumber(value: unknown, field: string): number {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n throw new PointerInputError(`${field} must be a number`, 400);\n }\n return value;\n}\n\nfunction optionalNumber(value: unknown, field: string): number | undefined {\n if (value === undefined) return undefined;\n return requireNumber(value, field);\n}\n\nfunction requireString(value: unknown, field: string): string {\n if (typeof value !== 'string') {\n throw new PointerInputError(`${field} must be a string`, 400);\n }\n return value;\n}\n\nfunction requirePoint(\n body: Record<string, unknown>,\n xField: 'x' | 'endX' = 'x',\n yField: 'y' | 'endY' = 'y',\n): PointerPoint {\n return {\n x: requireNumber(body[xField], xField),\n y: requireNumber(body[yField], yField),\n };\n}\n\nfunction ensureCapability<T>(\n fn: T | undefined,\n actionType: string,\n): NonNullable<T> {\n if (typeof fn !== 'function') {\n throw new PointerInputError(\n `${actionType} is not supported on this device`,\n 404,\n );\n }\n return fn as NonNullable<T>;\n}\n\nfunction getPointerInput(input: InputPrimitives): PointerInputPrimitives {\n if (!input.pointer) {\n throw new PointerInputError(\n 'Pointer input is not supported on this device',\n 404,\n );\n }\n return input.pointer;\n}\n\nfunction getKeyboardInput(input: InputPrimitives): KeyboardInputPrimitives {\n if (!input.keyboard) {\n throw new PointerInputError(\n 'Keyboard input is not supported on this device',\n 404,\n );\n }\n return input.keyboard;\n}\n\nfunction getTouchInput(input: InputPrimitives): TouchInputPrimitives {\n if (!input.touch) {\n throw new PointerInputError(\n 'Touch input is not supported on this device',\n 404,\n );\n }\n return input.touch;\n}\n\nfunction getScrollInput(input: InputPrimitives) {\n if (!input.scroll) {\n throw new PointerInputError(\n 'Scroll input is not supported on this device',\n 404,\n );\n }\n return input.scroll;\n}\n\n/**\n * Translate an `/interact` request body into device input primitive calls.\n *\n * The dispatcher is deliberately a flat switch: each case is HTTP-protocol\n * adaptation (parse + range-check fields, hand them to the typed primitive),\n * not platform business logic.\n */\nexport async function dispatchPointer(\n input: InputPrimitives,\n body: Record<string, unknown>,\n getScreenSize: () => Promise<{ width: number; height: number }>,\n): Promise<void> {\n const { actionType } = body;\n if (typeof actionType !== 'string' || !actionType) {\n throw new PointerInputError('actionType is required', 400);\n }\n\n switch (actionType) {\n case 'Tap': {\n const pointer = getPointerInput(input);\n return ensureCapability(pointer.tap, 'Tap')(requirePoint(body), {\n duration: optionalNumber(body.duration, 'duration'),\n });\n }\n\n case 'DoubleClick': {\n const pointer = getPointerInput(input);\n return ensureCapability(\n pointer.doubleClick,\n 'DoubleClick',\n )(requirePoint(body));\n }\n\n case 'LongPress': {\n const pointer = getPointerInput(input);\n return ensureCapability(pointer.longPress, 'LongPress')(\n requirePoint(body),\n {\n duration: optionalNumber(body.duration, 'duration'),\n },\n );\n }\n\n case 'Swipe': {\n const swipe = resolveSwipeInputPrimitive(input);\n return ensureCapability(swipe?.swipe, 'Swipe')(\n requirePoint(body),\n requirePoint(body, 'endX', 'endY'),\n {\n duration: optionalNumber(body.duration, 'duration'),\n repeat: optionalNumber(body.repeat, 'repeat'),\n },\n );\n }\n\n case 'DragAndDrop': {\n const pointer = getPointerInput(input);\n return ensureCapability(pointer.dragAndDrop, 'DragAndDrop')(\n requirePoint(body),\n requirePoint(body, 'endX', 'endY'),\n );\n }\n\n case 'KeyboardPress': {\n const keyboard = getKeyboardInput(input);\n return ensureCapability(\n keyboard.keyboardPress,\n 'KeyboardPress',\n )(requireString(body.keyName, 'keyName'));\n }\n\n case 'Input': {\n const keyboard = getKeyboardInput(input);\n const value = requireString(body.value, 'value');\n const at =\n typeof body.x === 'number' && typeof body.y === 'number'\n ? requirePoint(body)\n : undefined;\n const mode =\n typeof body.mode === 'string'\n ? (body.mode as 'replace' | 'clear' | 'typeOnly')\n : undefined;\n const autoDismissKeyboard =\n typeof body.autoDismissKeyboard === 'boolean'\n ? body.autoDismissKeyboard\n : undefined;\n const target = at\n ? {\n center: [at.x, at.y] as [number, number],\n rect: { left: at.x, top: at.y, width: 1, height: 1 },\n description: 'manual input target',\n }\n : undefined;\n if (mode === 'clear') {\n await ensureCapability(keyboard.clearInput, 'ClearInput')(target);\n return;\n }\n if (!value) return;\n return ensureCapability(keyboard.typeText, 'Input')(value, {\n autoDismissKeyboard,\n target,\n replace: mode !== 'typeOnly',\n });\n }\n\n case 'Scroll': {\n const scroll = getScrollInput(input);\n const x =\n typeof body.x === 'number' ? requireNumber(body.x, 'x') : undefined;\n const y =\n typeof body.y === 'number' ? requireNumber(body.y, 'y') : undefined;\n const direction =\n body.direction === 'up' ||\n body.direction === 'down' ||\n body.direction === 'left' ||\n body.direction === 'right'\n ? body.direction\n : 'down';\n const scrollType =\n body.scrollType === 'scrollToBottom' ||\n body.scrollType === 'scrollToTop' ||\n body.scrollType === 'scrollToLeft' ||\n body.scrollType === 'scrollToRight' ||\n body.scrollType === 'singleAction'\n ? body.scrollType\n : 'singleAction';\n const distance =\n typeof body.distance === 'number'\n ? requireNumber(body.distance, 'distance')\n : undefined;\n return ensureCapability(\n scroll.scroll,\n 'Scroll',\n )({\n direction,\n scrollType,\n distance,\n locate:\n x !== undefined && y !== undefined\n ? {\n center: [x, y],\n\n description: 'manual scroll target',\n }\n : undefined,\n });\n }\n\n case 'Pinch': {\n const center = requirePoint(body);\n const direction = ((): 'in' | 'out' => {\n const d = body.direction;\n if (d !== 'in' && d !== 'out') {\n throw new PointerInputError('direction must be \"in\" or \"out\"', 400);\n }\n return d;\n })();\n const touch = getTouchInput(input);\n const { startDistance, endDistance, duration } = normalizePinchParam(\n {\n locate: {\n center: [center.x, center.y],\n description: 'manual pinch target',\n },\n direction,\n distance: optionalNumber(body.distance, 'distance'),\n duration: optionalNumber(body.duration, 'duration'),\n },\n await getScreenSize(),\n );\n return ensureCapability(touch.pinch, 'Pinch')(center, {\n startDistance,\n endDistance,\n duration,\n });\n }\n\n default:\n throw new PointerInputError(`Unknown actionType \"${actionType}\"`, 404);\n }\n}\n"],"names":["PointerInputError","Error","message","statusCode","requireNumber","value","field","Number","optionalNumber","undefined","requireString","requirePoint","body","xField","yField","ensureCapability","fn","actionType","getPointerInput","input","getKeyboardInput","getTouchInput","getScrollInput","dispatchPointer","getScreenSize","pointer","swipe","resolveSwipeInputPrimitive","keyboard","at","mode","autoDismissKeyboard","target","scroll","x","y","direction","scrollType","distance","center","d","touch","startDistance","endDistance","duration","normalizePinchParam"],"mappings":"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"}
@@ -107,8 +107,8 @@ async function dispatchPointer(input, body, getScreenSize) {
107
107
  }
108
108
  case 'Swipe':
109
109
  {
110
- const touch = getTouchInput(input);
111
- return ensureCapability(touch.swipe, 'Swipe')(requirePoint(body), requirePoint(body, 'endX', 'endY'), {
110
+ const swipe = (0, device_namespaceObject.resolveSwipeInputPrimitive)(input);
111
+ return ensureCapability(swipe?.swipe, 'Swipe')(requirePoint(body), requirePoint(body, 'endX', 'endY'), {
112
112
  duration: optionalNumber(body.duration, 'duration'),
113
113
  repeat: optionalNumber(body.repeat, 'repeat')
114
114
  });
@@ -1 +1 @@
1
- {"version":3,"file":"pointer-dispatch.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/pointer-dispatch.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type {\n InputPrimitives,\n KeyboardInputPrimitives,\n PointerInputPrimitives,\n PointerPoint,\n TouchInputPrimitives,\n} from '@midscene/core/device';\nimport { normalizePinchParam } from '@midscene/core/device';\n\n/**\n * Thrown when an /interact request is malformed (missing field, wrong type)\n * or names an action / capability that the connected device does not support.\n * The route handler maps {400, 404} onto the HTTP response.\n */\nexport class PointerInputError extends Error {\n constructor(\n message: string,\n public statusCode: 400 | 404,\n ) {\n super(message);\n this.name = 'PointerInputError';\n }\n}\n\nfunction requireNumber(value: unknown, field: string): number {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n throw new PointerInputError(`${field} must be a number`, 400);\n }\n return value;\n}\n\nfunction optionalNumber(value: unknown, field: string): number | undefined {\n if (value === undefined) return undefined;\n return requireNumber(value, field);\n}\n\nfunction requireString(value: unknown, field: string): string {\n if (typeof value !== 'string') {\n throw new PointerInputError(`${field} must be a string`, 400);\n }\n return value;\n}\n\nfunction requirePoint(\n body: Record<string, unknown>,\n xField: 'x' | 'endX' = 'x',\n yField: 'y' | 'endY' = 'y',\n): PointerPoint {\n return {\n x: requireNumber(body[xField], xField),\n y: requireNumber(body[yField], yField),\n };\n}\n\nfunction ensureCapability<T>(\n fn: T | undefined,\n actionType: string,\n): NonNullable<T> {\n if (typeof fn !== 'function') {\n throw new PointerInputError(\n `${actionType} is not supported on this device`,\n 404,\n );\n }\n return fn as NonNullable<T>;\n}\n\nfunction getPointerInput(input: InputPrimitives): PointerInputPrimitives {\n if (!input.pointer) {\n throw new PointerInputError(\n 'Pointer input is not supported on this device',\n 404,\n );\n }\n return input.pointer;\n}\n\nfunction getKeyboardInput(input: InputPrimitives): KeyboardInputPrimitives {\n if (!input.keyboard) {\n throw new PointerInputError(\n 'Keyboard input is not supported on this device',\n 404,\n );\n }\n return input.keyboard;\n}\n\nfunction getTouchInput(input: InputPrimitives): TouchInputPrimitives {\n if (!input.touch) {\n throw new PointerInputError(\n 'Touch input is not supported on this device',\n 404,\n );\n }\n return input.touch;\n}\n\nfunction getScrollInput(input: InputPrimitives) {\n if (!input.scroll) {\n throw new PointerInputError(\n 'Scroll input is not supported on this device',\n 404,\n );\n }\n return input.scroll;\n}\n\n/**\n * Translate an `/interact` request body into device input primitive calls.\n *\n * The dispatcher is deliberately a flat switch: each case is HTTP-protocol\n * adaptation (parse + range-check fields, hand them to the typed primitive),\n * not platform business logic.\n */\nexport async function dispatchPointer(\n input: InputPrimitives,\n body: Record<string, unknown>,\n getScreenSize: () => Promise<{ width: number; height: number }>,\n): Promise<void> {\n const { actionType } = body;\n if (typeof actionType !== 'string' || !actionType) {\n throw new PointerInputError('actionType is required', 400);\n }\n\n switch (actionType) {\n case 'Tap': {\n const pointer = getPointerInput(input);\n return ensureCapability(pointer.tap, 'Tap')(requirePoint(body), {\n duration: optionalNumber(body.duration, 'duration'),\n });\n }\n\n case 'DoubleClick': {\n const pointer = getPointerInput(input);\n return ensureCapability(\n pointer.doubleClick,\n 'DoubleClick',\n )(requirePoint(body));\n }\n\n case 'LongPress': {\n const pointer = getPointerInput(input);\n return ensureCapability(pointer.longPress, 'LongPress')(\n requirePoint(body),\n {\n duration: optionalNumber(body.duration, 'duration'),\n },\n );\n }\n\n case 'Swipe': {\n const touch = getTouchInput(input);\n return ensureCapability(touch.swipe, 'Swipe')(\n requirePoint(body),\n requirePoint(body, 'endX', 'endY'),\n {\n duration: optionalNumber(body.duration, 'duration'),\n repeat: optionalNumber(body.repeat, 'repeat'),\n },\n );\n }\n\n case 'DragAndDrop': {\n const pointer = getPointerInput(input);\n return ensureCapability(pointer.dragAndDrop, 'DragAndDrop')(\n requirePoint(body),\n requirePoint(body, 'endX', 'endY'),\n );\n }\n\n case 'KeyboardPress': {\n const keyboard = getKeyboardInput(input);\n return ensureCapability(\n keyboard.keyboardPress,\n 'KeyboardPress',\n )(requireString(body.keyName, 'keyName'));\n }\n\n case 'Input': {\n const keyboard = getKeyboardInput(input);\n const value = requireString(body.value, 'value');\n const at =\n typeof body.x === 'number' && typeof body.y === 'number'\n ? requirePoint(body)\n : undefined;\n const mode =\n typeof body.mode === 'string'\n ? (body.mode as 'replace' | 'clear' | 'typeOnly')\n : undefined;\n const autoDismissKeyboard =\n typeof body.autoDismissKeyboard === 'boolean'\n ? body.autoDismissKeyboard\n : undefined;\n const target = at\n ? {\n center: [at.x, at.y] as [number, number],\n rect: { left: at.x, top: at.y, width: 1, height: 1 },\n description: 'manual input target',\n }\n : undefined;\n if (mode === 'clear') {\n await ensureCapability(keyboard.clearInput, 'ClearInput')(target);\n return;\n }\n if (!value) return;\n return ensureCapability(keyboard.typeText, 'Input')(value, {\n autoDismissKeyboard,\n target,\n replace: mode !== 'typeOnly',\n });\n }\n\n case 'Scroll': {\n const scroll = getScrollInput(input);\n const x =\n typeof body.x === 'number' ? requireNumber(body.x, 'x') : undefined;\n const y =\n typeof body.y === 'number' ? requireNumber(body.y, 'y') : undefined;\n const direction =\n body.direction === 'up' ||\n body.direction === 'down' ||\n body.direction === 'left' ||\n body.direction === 'right'\n ? body.direction\n : 'down';\n const scrollType =\n body.scrollType === 'scrollToBottom' ||\n body.scrollType === 'scrollToTop' ||\n body.scrollType === 'scrollToLeft' ||\n body.scrollType === 'scrollToRight' ||\n body.scrollType === 'singleAction'\n ? body.scrollType\n : 'singleAction';\n const distance =\n typeof body.distance === 'number'\n ? requireNumber(body.distance, 'distance')\n : undefined;\n return ensureCapability(\n scroll.scroll,\n 'Scroll',\n )({\n direction,\n scrollType,\n distance,\n locate:\n x !== undefined && y !== undefined\n ? {\n center: [x, y],\n\n description: 'manual scroll target',\n }\n : undefined,\n });\n }\n\n case 'Pinch': {\n const center = requirePoint(body);\n const direction = ((): 'in' | 'out' => {\n const d = body.direction;\n if (d !== 'in' && d !== 'out') {\n throw new PointerInputError('direction must be \"in\" or \"out\"', 400);\n }\n return d;\n })();\n const touch = getTouchInput(input);\n const { startDistance, endDistance, duration } = normalizePinchParam(\n {\n locate: {\n center: [center.x, center.y],\n description: 'manual pinch target',\n },\n direction,\n distance: optionalNumber(body.distance, 'distance'),\n duration: optionalNumber(body.duration, 'duration'),\n },\n await getScreenSize(),\n );\n return ensureCapability(touch.pinch, 'Pinch')(center, {\n startDistance,\n endDistance,\n duration,\n });\n }\n\n default:\n throw new PointerInputError(`Unknown actionType \"${actionType}\"`, 404);\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","PointerInputError","Error","message","statusCode","requireNumber","value","field","Number","optionalNumber","undefined","requireString","requirePoint","body","xField","yField","ensureCapability","fn","actionType","getPointerInput","input","getKeyboardInput","getTouchInput","getScrollInput","dispatchPointer","getScreenSize","pointer","touch","keyboard","at","mode","autoDismissKeyboard","target","scroll","x","y","direction","scrollType","distance","center","d","startDistance","endDistance","duration","normalizePinchParam"],"mappings":"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"}
1
+ {"version":3,"file":"pointer-dispatch.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/pointer-dispatch.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type {\n InputPrimitives,\n KeyboardInputPrimitives,\n PointerInputPrimitives,\n PointerPoint,\n TouchInputPrimitives,\n} from '@midscene/core/device';\nimport {\n normalizePinchParam,\n resolveSwipeInputPrimitive,\n} from '@midscene/core/device';\n\n/**\n * Thrown when an /interact request is malformed (missing field, wrong type)\n * or names an action / capability that the connected device does not support.\n * The route handler maps {400, 404} onto the HTTP response.\n */\nexport class PointerInputError extends Error {\n constructor(\n message: string,\n public statusCode: 400 | 404,\n ) {\n super(message);\n this.name = 'PointerInputError';\n }\n}\n\nfunction requireNumber(value: unknown, field: string): number {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n throw new PointerInputError(`${field} must be a number`, 400);\n }\n return value;\n}\n\nfunction optionalNumber(value: unknown, field: string): number | undefined {\n if (value === undefined) return undefined;\n return requireNumber(value, field);\n}\n\nfunction requireString(value: unknown, field: string): string {\n if (typeof value !== 'string') {\n throw new PointerInputError(`${field} must be a string`, 400);\n }\n return value;\n}\n\nfunction requirePoint(\n body: Record<string, unknown>,\n xField: 'x' | 'endX' = 'x',\n yField: 'y' | 'endY' = 'y',\n): PointerPoint {\n return {\n x: requireNumber(body[xField], xField),\n y: requireNumber(body[yField], yField),\n };\n}\n\nfunction ensureCapability<T>(\n fn: T | undefined,\n actionType: string,\n): NonNullable<T> {\n if (typeof fn !== 'function') {\n throw new PointerInputError(\n `${actionType} is not supported on this device`,\n 404,\n );\n }\n return fn as NonNullable<T>;\n}\n\nfunction getPointerInput(input: InputPrimitives): PointerInputPrimitives {\n if (!input.pointer) {\n throw new PointerInputError(\n 'Pointer input is not supported on this device',\n 404,\n );\n }\n return input.pointer;\n}\n\nfunction getKeyboardInput(input: InputPrimitives): KeyboardInputPrimitives {\n if (!input.keyboard) {\n throw new PointerInputError(\n 'Keyboard input is not supported on this device',\n 404,\n );\n }\n return input.keyboard;\n}\n\nfunction getTouchInput(input: InputPrimitives): TouchInputPrimitives {\n if (!input.touch) {\n throw new PointerInputError(\n 'Touch input is not supported on this device',\n 404,\n );\n }\n return input.touch;\n}\n\nfunction getScrollInput(input: InputPrimitives) {\n if (!input.scroll) {\n throw new PointerInputError(\n 'Scroll input is not supported on this device',\n 404,\n );\n }\n return input.scroll;\n}\n\n/**\n * Translate an `/interact` request body into device input primitive calls.\n *\n * The dispatcher is deliberately a flat switch: each case is HTTP-protocol\n * adaptation (parse + range-check fields, hand them to the typed primitive),\n * not platform business logic.\n */\nexport async function dispatchPointer(\n input: InputPrimitives,\n body: Record<string, unknown>,\n getScreenSize: () => Promise<{ width: number; height: number }>,\n): Promise<void> {\n const { actionType } = body;\n if (typeof actionType !== 'string' || !actionType) {\n throw new PointerInputError('actionType is required', 400);\n }\n\n switch (actionType) {\n case 'Tap': {\n const pointer = getPointerInput(input);\n return ensureCapability(pointer.tap, 'Tap')(requirePoint(body), {\n duration: optionalNumber(body.duration, 'duration'),\n });\n }\n\n case 'DoubleClick': {\n const pointer = getPointerInput(input);\n return ensureCapability(\n pointer.doubleClick,\n 'DoubleClick',\n )(requirePoint(body));\n }\n\n case 'LongPress': {\n const pointer = getPointerInput(input);\n return ensureCapability(pointer.longPress, 'LongPress')(\n requirePoint(body),\n {\n duration: optionalNumber(body.duration, 'duration'),\n },\n );\n }\n\n case 'Swipe': {\n const swipe = resolveSwipeInputPrimitive(input);\n return ensureCapability(swipe?.swipe, 'Swipe')(\n requirePoint(body),\n requirePoint(body, 'endX', 'endY'),\n {\n duration: optionalNumber(body.duration, 'duration'),\n repeat: optionalNumber(body.repeat, 'repeat'),\n },\n );\n }\n\n case 'DragAndDrop': {\n const pointer = getPointerInput(input);\n return ensureCapability(pointer.dragAndDrop, 'DragAndDrop')(\n requirePoint(body),\n requirePoint(body, 'endX', 'endY'),\n );\n }\n\n case 'KeyboardPress': {\n const keyboard = getKeyboardInput(input);\n return ensureCapability(\n keyboard.keyboardPress,\n 'KeyboardPress',\n )(requireString(body.keyName, 'keyName'));\n }\n\n case 'Input': {\n const keyboard = getKeyboardInput(input);\n const value = requireString(body.value, 'value');\n const at =\n typeof body.x === 'number' && typeof body.y === 'number'\n ? requirePoint(body)\n : undefined;\n const mode =\n typeof body.mode === 'string'\n ? (body.mode as 'replace' | 'clear' | 'typeOnly')\n : undefined;\n const autoDismissKeyboard =\n typeof body.autoDismissKeyboard === 'boolean'\n ? body.autoDismissKeyboard\n : undefined;\n const target = at\n ? {\n center: [at.x, at.y] as [number, number],\n rect: { left: at.x, top: at.y, width: 1, height: 1 },\n description: 'manual input target',\n }\n : undefined;\n if (mode === 'clear') {\n await ensureCapability(keyboard.clearInput, 'ClearInput')(target);\n return;\n }\n if (!value) return;\n return ensureCapability(keyboard.typeText, 'Input')(value, {\n autoDismissKeyboard,\n target,\n replace: mode !== 'typeOnly',\n });\n }\n\n case 'Scroll': {\n const scroll = getScrollInput(input);\n const x =\n typeof body.x === 'number' ? requireNumber(body.x, 'x') : undefined;\n const y =\n typeof body.y === 'number' ? requireNumber(body.y, 'y') : undefined;\n const direction =\n body.direction === 'up' ||\n body.direction === 'down' ||\n body.direction === 'left' ||\n body.direction === 'right'\n ? body.direction\n : 'down';\n const scrollType =\n body.scrollType === 'scrollToBottom' ||\n body.scrollType === 'scrollToTop' ||\n body.scrollType === 'scrollToLeft' ||\n body.scrollType === 'scrollToRight' ||\n body.scrollType === 'singleAction'\n ? body.scrollType\n : 'singleAction';\n const distance =\n typeof body.distance === 'number'\n ? requireNumber(body.distance, 'distance')\n : undefined;\n return ensureCapability(\n scroll.scroll,\n 'Scroll',\n )({\n direction,\n scrollType,\n distance,\n locate:\n x !== undefined && y !== undefined\n ? {\n center: [x, y],\n\n description: 'manual scroll target',\n }\n : undefined,\n });\n }\n\n case 'Pinch': {\n const center = requirePoint(body);\n const direction = ((): 'in' | 'out' => {\n const d = body.direction;\n if (d !== 'in' && d !== 'out') {\n throw new PointerInputError('direction must be \"in\" or \"out\"', 400);\n }\n return d;\n })();\n const touch = getTouchInput(input);\n const { startDistance, endDistance, duration } = normalizePinchParam(\n {\n locate: {\n center: [center.x, center.y],\n description: 'manual pinch target',\n },\n direction,\n distance: optionalNumber(body.distance, 'distance'),\n duration: optionalNumber(body.duration, 'duration'),\n },\n await getScreenSize(),\n );\n return ensureCapability(touch.pinch, 'Pinch')(center, {\n startDistance,\n endDistance,\n duration,\n });\n }\n\n default:\n throw new PointerInputError(`Unknown actionType \"${actionType}\"`, 404);\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","PointerInputError","Error","message","statusCode","requireNumber","value","field","Number","optionalNumber","undefined","requireString","requirePoint","body","xField","yField","ensureCapability","fn","actionType","getPointerInput","input","getKeyboardInput","getTouchInput","getScrollInput","dispatchPointer","getScreenSize","pointer","swipe","resolveSwipeInputPrimitive","keyboard","at","mode","autoDismissKeyboard","target","scroll","x","y","direction","scrollType","distance","center","d","touch","startDistance","endDistance","duration","normalizePinchParam"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;;;;;;ACWO,MAAMI,0BAA0BC;IACrC,YACEC,OAAe,EACRC,UAAqB,CAC5B;QACA,KAAK,CAACD,UAAAA,iBAAAA,IAAAA,EAAAA,cAAAA,KAAAA,IAAAA,IAAAA,CAFCC,UAAU,GAAVA;QAGP,IAAI,CAAC,IAAI,GAAG;IACd;AACF;AAEA,SAASC,cAAcC,KAAc,EAAEC,KAAa;IAClD,IAAI,AAAiB,YAAjB,OAAOD,SAAsBE,OAAO,KAAK,CAACF,QAC5C,MAAM,IAAIL,kBAAkB,GAAGM,MAAM,iBAAiB,CAAC,EAAE;IAE3D,OAAOD;AACT;AAEA,SAASG,eAAeH,KAAc,EAAEC,KAAa;IACnD,IAAID,AAAUI,WAAVJ,OAAqB;IACzB,OAAOD,cAAcC,OAAOC;AAC9B;AAEA,SAASI,cAAcL,KAAc,EAAEC,KAAa;IAClD,IAAI,AAAiB,YAAjB,OAAOD,OACT,MAAM,IAAIL,kBAAkB,GAAGM,MAAM,iBAAiB,CAAC,EAAE;IAE3D,OAAOD;AACT;AAEA,SAASM,aACPC,IAA6B,EAC7BC,SAAuB,GAAG,EAC1BC,SAAuB,GAAG;IAE1B,OAAO;QACL,GAAGV,cAAcQ,IAAI,CAACC,OAAO,EAAEA;QAC/B,GAAGT,cAAcQ,IAAI,CAACE,OAAO,EAAEA;IACjC;AACF;AAEA,SAASC,iBACPC,EAAiB,EACjBC,UAAkB;IAElB,IAAI,AAAc,cAAd,OAAOD,IACT,MAAM,IAAIhB,kBACR,GAAGiB,WAAW,gCAAgC,CAAC,EAC/C;IAGJ,OAAOD;AACT;AAEA,SAASE,gBAAgBC,KAAsB;IAC7C,IAAI,CAACA,MAAM,OAAO,EAChB,MAAM,IAAInB,kBACR,iDACA;IAGJ,OAAOmB,MAAM,OAAO;AACtB;AAEA,SAASC,iBAAiBD,KAAsB;IAC9C,IAAI,CAACA,MAAM,QAAQ,EACjB,MAAM,IAAInB,kBACR,kDACA;IAGJ,OAAOmB,MAAM,QAAQ;AACvB;AAEA,SAASE,cAAcF,KAAsB;IAC3C,IAAI,CAACA,MAAM,KAAK,EACd,MAAM,IAAInB,kBACR,+CACA;IAGJ,OAAOmB,MAAM,KAAK;AACpB;AAEA,SAASG,eAAeH,KAAsB;IAC5C,IAAI,CAACA,MAAM,MAAM,EACf,MAAM,IAAInB,kBACR,gDACA;IAGJ,OAAOmB,MAAM,MAAM;AACrB;AASO,eAAeI,gBACpBJ,KAAsB,EACtBP,IAA6B,EAC7BY,aAA+D;IAE/D,MAAM,EAAEP,UAAU,EAAE,GAAGL;IACvB,IAAI,AAAsB,YAAtB,OAAOK,cAA2B,CAACA,YACrC,MAAM,IAAIjB,kBAAkB,0BAA0B;IAGxD,OAAQiB;QACN,KAAK;YAAO;gBACV,MAAMQ,UAAUP,gBAAgBC;gBAChC,OAAOJ,iBAAiBU,QAAQ,GAAG,EAAE,OAAOd,aAAaC,OAAO;oBAC9D,UAAUJ,eAAeI,KAAK,QAAQ,EAAE;gBAC1C;YACF;QAEA,KAAK;YAAe;gBAClB,MAAMa,UAAUP,gBAAgBC;gBAChC,OAAOJ,iBACLU,QAAQ,WAAW,EACnB,eACAd,aAAaC;YACjB;QAEA,KAAK;YAAa;gBAChB,MAAMa,UAAUP,gBAAgBC;gBAChC,OAAOJ,iBAAiBU,QAAQ,SAAS,EAAE,aACzCd,aAAaC,OACb;oBACE,UAAUJ,eAAeI,KAAK,QAAQ,EAAE;gBAC1C;YAEJ;QAEA,KAAK;YAAS;gBACZ,MAAMc,QAAQC,AAAAA,IAAAA,uBAAAA,0BAAAA,AAAAA,EAA2BR;gBACzC,OAAOJ,iBAAiBW,OAAO,OAAO,SACpCf,aAAaC,OACbD,aAAaC,MAAM,QAAQ,SAC3B;oBACE,UAAUJ,eAAeI,KAAK,QAAQ,EAAE;oBACxC,QAAQJ,eAAeI,KAAK,MAAM,EAAE;gBACtC;YAEJ;QAEA,KAAK;YAAe;gBAClB,MAAMa,UAAUP,gBAAgBC;gBAChC,OAAOJ,iBAAiBU,QAAQ,WAAW,EAAE,eAC3Cd,aAAaC,OACbD,aAAaC,MAAM,QAAQ;YAE/B;QAEA,KAAK;YAAiB;gBACpB,MAAMgB,WAAWR,iBAAiBD;gBAClC,OAAOJ,iBACLa,SAAS,aAAa,EACtB,iBACAlB,cAAcE,KAAK,OAAO,EAAE;YAChC;QAEA,KAAK;YAAS;gBACZ,MAAMgB,WAAWR,iBAAiBD;gBAClC,MAAMd,QAAQK,cAAcE,KAAK,KAAK,EAAE;gBACxC,MAAMiB,KACJ,AAAkB,YAAlB,OAAOjB,KAAK,CAAC,IAAiB,AAAkB,YAAlB,OAAOA,KAAK,CAAC,GACvCD,aAAaC,QACbH;gBACN,MAAMqB,OACJ,AAAqB,YAArB,OAAOlB,KAAK,IAAI,GACXA,KAAK,IAAI,GACVH;gBACN,MAAMsB,sBACJ,AAAoC,aAApC,OAAOnB,KAAK,mBAAmB,GAC3BA,KAAK,mBAAmB,GACxBH;gBACN,MAAMuB,SAASH,KACX;oBACE,QAAQ;wBAACA,GAAG,CAAC;wBAAEA,GAAG,CAAC;qBAAC;oBACpB,MAAM;wBAAE,MAAMA,GAAG,CAAC;wBAAE,KAAKA,GAAG,CAAC;wBAAE,OAAO;wBAAG,QAAQ;oBAAE;oBACnD,aAAa;gBACf,IACApB;gBACJ,IAAIqB,AAAS,YAATA,MAAkB,YACpB,MAAMf,iBAAiBa,SAAS,UAAU,EAAE,cAAcI;gBAG5D,IAAI,CAAC3B,OAAO;gBACZ,OAAOU,iBAAiBa,SAAS,QAAQ,EAAE,SAASvB,OAAO;oBACzD0B;oBACAC;oBACA,SAASF,AAAS,eAATA;gBACX;YACF;QAEA,KAAK;YAAU;gBACb,MAAMG,SAASX,eAAeH;gBAC9B,MAAMe,IACJ,AAAkB,YAAlB,OAAOtB,KAAK,CAAC,GAAgBR,cAAcQ,KAAK,CAAC,EAAE,OAAOH;gBAC5D,MAAM0B,IACJ,AAAkB,YAAlB,OAAOvB,KAAK,CAAC,GAAgBR,cAAcQ,KAAK,CAAC,EAAE,OAAOH;gBAC5D,MAAM2B,YACJxB,AAAmB,SAAnBA,KAAK,SAAS,IACdA,AAAmB,WAAnBA,KAAK,SAAS,IACdA,AAAmB,WAAnBA,KAAK,SAAS,IACdA,AAAmB,YAAnBA,KAAK,SAAS,GACVA,KAAK,SAAS,GACd;gBACN,MAAMyB,aACJzB,AAAoB,qBAApBA,KAAK,UAAU,IACfA,AAAoB,kBAApBA,KAAK,UAAU,IACfA,AAAoB,mBAApBA,KAAK,UAAU,IACfA,AAAoB,oBAApBA,KAAK,UAAU,IACfA,AAAoB,mBAApBA,KAAK,UAAU,GACXA,KAAK,UAAU,GACf;gBACN,MAAM0B,WACJ,AAAyB,YAAzB,OAAO1B,KAAK,QAAQ,GAChBR,cAAcQ,KAAK,QAAQ,EAAE,cAC7BH;gBACN,OAAOM,iBACLkB,OAAO,MAAM,EACb,UACA;oBACAG;oBACAC;oBACAC;oBACA,QACEJ,AAAMzB,WAANyB,KAAmBC,AAAM1B,WAAN0B,IACf;wBACE,QAAQ;4BAACD;4BAAGC;yBAAE;wBAEd,aAAa;oBACf,IACA1B;gBACR;YACF;QAEA,KAAK;YAAS;gBACZ,MAAM8B,SAAS5B,aAAaC;gBAC5B,MAAMwB,YAAa,AAAC;oBAClB,MAAMI,IAAI5B,KAAK,SAAS;oBACxB,IAAI4B,AAAM,SAANA,KAAcA,AAAM,UAANA,GAChB,MAAM,IAAIxC,kBAAkB,mCAAmC;oBAEjE,OAAOwC;gBACT;gBACA,MAAMC,QAAQpB,cAAcF;gBAC5B,MAAM,EAAEuB,aAAa,EAAEC,WAAW,EAAEC,QAAQ,EAAE,GAAGC,AAAAA,IAAAA,uBAAAA,mBAAAA,AAAAA,EAC/C;oBACE,QAAQ;wBACN,QAAQ;4BAACN,OAAO,CAAC;4BAAEA,OAAO,CAAC;yBAAC;wBAC5B,aAAa;oBACf;oBACAH;oBACA,UAAU5B,eAAeI,KAAK,QAAQ,EAAE;oBACxC,UAAUJ,eAAeI,KAAK,QAAQ,EAAE;gBAC1C,GACA,MAAMY;gBAER,OAAOT,iBAAiB0B,MAAM,KAAK,EAAE,SAASF,QAAQ;oBACpDG;oBACAC;oBACAC;gBACF;YACF;QAEA;YACE,MAAM,IAAI5C,kBAAkB,CAAC,oBAAoB,EAAEiB,WAAW,CAAC,CAAC,EAAE;IACtE;AACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@midscene/playground",
3
- "version": "1.12.8",
3
+ "version": "1.12.9-beta-20260917120835.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/web-infra-dev/midscene.git",
@@ -38,8 +38,8 @@
38
38
  "express": "^4.21.2",
39
39
  "open": "10.1.0",
40
40
  "uuid": "11.1.0",
41
- "@midscene/core": "1.12.8",
42
- "@midscene/shared": "1.12.8"
41
+ "@midscene/core": "1.12.9-beta-20260917120835.0",
42
+ "@midscene/shared": "1.12.9-beta-20260917120835.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@rslib/core": "^0.18.3",
package/static/index.html CHANGED
@@ -1 +1 @@
1
- <!doctype html><html><head><link rel="icon" href="/favicon.ico"><title>Midscene Playground</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script defer src="/static/js/lib-react.8bb5dc6e.js"></script><script defer src="/static/js/652.68c9d764.js"></script><script defer src="/static/js/index.2e700293.js"></script><link href="/static/css/index.67caac18.css" rel="stylesheet"></head><body><div id="root"></div></body></html>
1
+ <!doctype html><html><head><link rel="icon" href="/favicon.ico"><title>Midscene Playground</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script defer src="/static/js/lib-react.8bb5dc6e.js"></script><script defer src="/static/js/652.68c9d764.js"></script><script defer src="/static/js/index.2f2ca5c6.js"></script><link href="/static/css/index.67caac18.css" rel="stylesheet"></head><body><div id="root"></div></body></html>
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkplayground=self.webpackChunkplayground||[]).push([["466"],{86033(n,e,r){function u(){throw Error("proxy dependencies are unavailable in browser builds")}function o(){return u()}function a(){return u()}r.d(e,{loadFetchSocks:()=>a,loadUndici:()=>o})}}]);
2
- //# sourceMappingURL=466.42c0aeb1.js.map
1
+ "use strict";(self.webpackChunkplayground=self.webpackChunkplayground||[]).push([["749"],{17964(n,e,r){function u(){throw Error("proxy dependencies are unavailable in browser builds")}function o(){return u()}function a(){return u()}r.d(e,{loadFetchSocks:()=>a,loadUndici:()=>o})}}]);
2
+ //# sourceMappingURL=749.921ee4fd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/js/async/749.921ee4fd.js","sources":["../../../../../../packages/core/src/ai-model/service-caller/proxy/proxy-deps.stub.ts"],"sourcesContent":["function unavailable(): never {\n throw new Error('proxy dependencies are unavailable in browser builds');\n}\n\nexport function loadUndici(): Promise<typeof import('undici')> {\n return unavailable();\n}\n\nexport function loadFetchSocks(): Promise<typeof import('fetch-socks')> {\n return unavailable();\n}\n"],"names":["unavailable","Error","loadUndici","loadFetchSocks"],"mappings":"uGAAA,SAASA,IACP,MAAM,AAAIC,MAAM,uDAClB,CAEO,SAASC,IACd,OAAOF,GACT,CAEO,SAASG,IACd,OAAOH,GACT,C"}