@qontinui/ui-bridge-native 0.1.5 → 0.1.6

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 (92) hide show
  1. package/dist/control/{index.d.mts → action-executor.d.ts} +6 -10
  2. package/dist/control/action-executor.d.ts.map +1 -0
  3. package/dist/control/index.d.ts +5 -91
  4. package/dist/control/index.d.ts.map +1 -0
  5. package/dist/control/index.js +1 -1
  6. package/dist/control/index.js.map +1 -1
  7. package/dist/control/index.mjs +1 -1
  8. package/dist/control/index.mjs.map +1 -1
  9. package/dist/{types-BCYWwyVy.d.ts → control/types.d.ts} +17 -18
  10. package/dist/control/types.d.ts.map +1 -0
  11. package/dist/core/element-identifier.d.ts +41 -0
  12. package/dist/core/element-identifier.d.ts.map +1 -0
  13. package/dist/core/index.d.ts +6 -43
  14. package/dist/core/index.d.ts.map +1 -0
  15. package/dist/{registry-B8A_EoxS.d.ts → core/registry.d.ts} +10 -13
  16. package/dist/core/registry.d.ts.map +1 -0
  17. package/dist/{types-BPNuYxDx.d.ts → core/types.d.ts} +30 -30
  18. package/dist/core/types.d.ts.map +1 -0
  19. package/dist/debug/index.d.ts +4 -44
  20. package/dist/debug/index.d.ts.map +1 -0
  21. package/dist/debug/index.js.map +1 -1
  22. package/dist/debug/index.mjs.map +1 -1
  23. package/dist/debug/{index.d.mts → inspector.d.ts} +3 -6
  24. package/dist/debug/inspector.d.ts.map +1 -0
  25. package/dist/design/{index.d.mts → design-inspector-native.d.ts} +7 -11
  26. package/dist/design/design-inspector-native.d.ts.map +1 -0
  27. package/dist/{design-types-BHr6Q1FX.d.ts → design/design-types.d.ts} +10 -11
  28. package/dist/design/design-types.d.ts.map +1 -0
  29. package/dist/design/index.d.ts +5 -60
  30. package/dist/design/index.d.ts.map +1 -0
  31. package/dist/index.d.ts +28 -86
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +107 -4
  34. package/dist/index.js.map +1 -1
  35. package/dist/index.mjs +107 -4
  36. package/dist/index.mjs.map +1 -1
  37. package/dist/react/UIBridgeNativeProvider.d.ts +147 -0
  38. package/dist/react/UIBridgeNativeProvider.d.ts.map +1 -0
  39. package/dist/react/index.d.ts +8 -69
  40. package/dist/react/index.d.ts.map +1 -0
  41. package/dist/react/index.js +116 -4
  42. package/dist/react/index.js.map +1 -1
  43. package/dist/react/index.mjs +116 -4
  44. package/dist/react/index.mjs.map +1 -1
  45. package/dist/react/{index.d.mts → useAutoRegister.d.ts} +7 -15
  46. package/dist/react/useAutoRegister.d.ts.map +1 -0
  47. package/dist/react/useUIBridge.d.ts +103 -0
  48. package/dist/react/useUIBridge.d.ts.map +1 -0
  49. package/dist/react/useUIComponent.d.ts +112 -0
  50. package/dist/react/useUIComponent.d.ts.map +1 -0
  51. package/dist/react/useUIElement.d.ts +162 -0
  52. package/dist/react/useUIElement.d.ts.map +1 -0
  53. package/dist/server/design-handlers.d.ts +47 -0
  54. package/dist/server/design-handlers.d.ts.map +1 -0
  55. package/dist/server/handlers.d.ts +20 -0
  56. package/dist/server/handlers.d.ts.map +1 -0
  57. package/dist/server/http-server.d.ts +247 -0
  58. package/dist/server/http-server.d.ts.map +1 -0
  59. package/dist/server/index.d.ts +13 -117
  60. package/dist/server/index.d.ts.map +1 -0
  61. package/dist/server/index.js +102 -1
  62. package/dist/server/index.js.map +1 -1
  63. package/dist/server/index.mjs +102 -1
  64. package/dist/server/index.mjs.map +1 -1
  65. package/dist/server/types.d.ts +200 -0
  66. package/dist/server/types.d.ts.map +1 -0
  67. package/dist/server/ws-connection.d.ts +48 -0
  68. package/dist/server/ws-connection.d.ts.map +1 -0
  69. package/dist/server/ws-event-bridge.d.ts +113 -0
  70. package/dist/server/ws-event-bridge.d.ts.map +1 -0
  71. package/dist/server/ws-protocol.d.ts +48 -0
  72. package/dist/server/ws-protocol.d.ts.map +1 -0
  73. package/dist/server/ws-types.d.ts +65 -0
  74. package/dist/server/ws-types.d.ts.map +1 -0
  75. package/dist/transport/CloudRelayClient.d.ts +51 -0
  76. package/dist/transport/CloudRelayClient.d.ts.map +1 -0
  77. package/dist/transport/DeviceAnnouncer.d.ts +75 -0
  78. package/dist/transport/DeviceAnnouncer.d.ts.map +1 -0
  79. package/dist/transport/index.d.ts +3 -0
  80. package/dist/transport/index.d.ts.map +1 -0
  81. package/package.json +1 -1
  82. package/dist/core/index.d.mts +0 -46
  83. package/dist/design-types-BHr6Q1FX.d.mts +0 -205
  84. package/dist/http-server-B7KudcYJ.d.ts +0 -622
  85. package/dist/http-server-D7uVANBU.d.mts +0 -622
  86. package/dist/index.d.mts +0 -89
  87. package/dist/registry-DhbGbl9c.d.mts +0 -215
  88. package/dist/server/index.d.mts +0 -119
  89. package/dist/types-BPNuYxDx.d.mts +0 -383
  90. package/dist/types-Bcj7ji97.d.mts +0 -177
  91. package/dist/useUIBridge-CDZbWxII.d.ts +0 -571
  92. package/dist/useUIBridge-DfIEq9EQ.d.mts +0 -571
@@ -687,7 +687,7 @@ var DefaultNativeActionExecutor = class {
687
687
  if (!params?.text) {
688
688
  throw new Error("Type action requires text parameter");
689
689
  }
690
- if (params.clearFirst) {
690
+ if (params.clearFirst || params.clear) {
691
691
  await this.performClear(element, props);
692
692
  }
693
693
  if (params.delay && params.delay > 0) {
@@ -1873,6 +1873,15 @@ function createServerHandlers(registry, executor, config) {
1873
1873
  timestamp: Date.now(),
1874
1874
  ...stats
1875
1875
  };
1876
+ if (config?.appInfo) {
1877
+ response.uiBridge = {
1878
+ version: "0.3.0",
1879
+ ...config.appInfo,
1880
+ capabilities: ["elements", "components", "actions", "design"],
1881
+ elementCount: stats.elements,
1882
+ componentCount: stats.components
1883
+ };
1884
+ }
1876
1885
  return success2(response);
1877
1886
  }
1878
1887
  };
@@ -1911,6 +1920,10 @@ var WS_ROUTES = [
1911
1920
  { pattern: "health", handler: "health", httpMethods: ["GET"] },
1912
1921
  // Elements
1913
1922
  { pattern: "control/elements", handler: "getElements", httpMethods: ["GET"] },
1923
+ // Flat alias — matches the runner UI Bridge's `/ui-bridge/elements` path so
1924
+ // agents can use the same URL across runner + mobile without remembering
1925
+ // the `control/` prefix. Delegates to the same handler.
1926
+ { pattern: "elements", handler: "getElements", httpMethods: ["GET"] },
1914
1927
  { pattern: "control/element/:id", handler: "getElement", httpMethods: ["GET"] },
1915
1928
  { pattern: "control/element/:id/state", handler: "getElementState", httpMethods: ["GET"] },
1916
1929
  { pattern: "control/element/:id/action", handler: "executeAction", httpMethods: ["POST"] },
@@ -1961,6 +1974,87 @@ var WS_ROUTES = [
1961
1974
  // Meta / Introspection
1962
1975
  { pattern: "meta/methods", handler: "getMethods", httpMethods: ["GET"] }
1963
1976
  ];
1977
+ var HANDLER_DESCRIPTIONS = {
1978
+ health: "Liveness probe; returns app metadata + element count",
1979
+ getElements: "Flat list of registered UI elements",
1980
+ getElement: "Single element by id",
1981
+ getElementState: "Dynamic state (value, focused, checked) for one element",
1982
+ executeAction: 'Run an action on an element (see "actions" below for names)',
1983
+ getComponents: "Higher-level components with action schemas",
1984
+ getComponent: "Component detail + per-action paramSchema",
1985
+ executeComponentAction: "Invoke a component action directly (preferred over button clicks)",
1986
+ find: "AI-powered element search by natural-language query",
1987
+ getSnapshot: "Full snapshot: elements + route + state. Supports ?visibleOnly=true and ?currentRouteOnly=true",
1988
+ getWorkflows: "List registered workflows",
1989
+ runWorkflow: "Trigger a workflow by id",
1990
+ pageRefresh: "Reload the current route",
1991
+ pageNavigate: "Imperative router.push(url) \u2014 preferred over tapping tab buttons",
1992
+ pageReplace: "router.replace(url)",
1993
+ pageGoBack: "router.back()",
1994
+ pageGoForward: "router.forward()",
1995
+ getScreenshot: "PNG screenshot of the current screen",
1996
+ getElementStyles: "Computed styles for an element (design review)",
1997
+ getElementStateStyles: "Computed styles per interaction state (hover/focus/disabled)",
1998
+ getDesignSnapshot: "Visual + style snapshot for design review",
1999
+ getResponsiveSnapshots: "Screenshots at multiple viewport widths",
2000
+ runDesignAudit: "Accessibility + visual audit",
2001
+ loadStyleGuide: "Load a design system style guide",
2002
+ getStyleGuide: "Fetch the currently loaded style guide",
2003
+ clearStyleGuide: "Unload the style guide",
2004
+ evaluateQuality: "Score the current UI against a quality context",
2005
+ getQualityContexts: "List available quality evaluation contexts",
2006
+ saveBaseline: "Save a quality baseline snapshot",
2007
+ diffBaseline: "Diff current UI against a saved baseline",
2008
+ getMethods: "List every handler name (legacy introspection)"
2009
+ };
2010
+ var ACTION_REFERENCE = [
2011
+ { name: "press", aliases: ["click"], params: "PressActionParams (optional position)" },
2012
+ { name: "longPress", params: "PressActionParams (optional position)" },
2013
+ { name: "doubleTap", params: "none" },
2014
+ {
2015
+ name: "type",
2016
+ params: "TypeActionParams { text, delay?, clear? | clearFirst? } \u2014 `clear:true` replaces content atomically"
2017
+ },
2018
+ { name: "clear", params: "none \u2014 empties the input" },
2019
+ { name: "focus", params: "none" },
2020
+ { name: "blur", params: "none" },
2021
+ { name: "scroll", params: "ScrollActionParams { offset? {x,y}, to? }" },
2022
+ { name: "swipe", params: "SwipeActionParams { direction, distance }" },
2023
+ { name: "toggle", params: "none \u2014 flips boolean controls" }
2024
+ ];
2025
+ function buildRoutesPayload() {
2026
+ const entries = [];
2027
+ for (const r of WS_ROUTES) {
2028
+ if (!r.httpMethods) continue;
2029
+ for (const m of r.httpMethods) {
2030
+ entries.push({ method: m, path: `/ui-bridge/${r.pattern}` });
2031
+ }
2032
+ }
2033
+ entries.push({ method: "GET", path: "/ui-bridge/_help" });
2034
+ entries.push({ method: "GET", path: "/ui-bridge/_routes" });
2035
+ entries.sort((a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method));
2036
+ return { routes: entries, count: entries.length };
2037
+ }
2038
+ function buildHelpPayload() {
2039
+ return {
2040
+ version: 1,
2041
+ description: "UI Bridge Native HTTP surface. Prefix every path with /ui-bridge/.",
2042
+ routes: WS_ROUTES.map((r) => ({
2043
+ pattern: r.pattern,
2044
+ httpMethods: r.httpMethods ?? [],
2045
+ wsOnly: !r.httpMethods,
2046
+ handler: r.handler,
2047
+ description: HANDLER_DESCRIPTIONS[r.handler] ?? ""
2048
+ })),
2049
+ actions: ACTION_REFERENCE,
2050
+ tips: [
2051
+ "Start with `GET /ui-bridge/control/snapshot?visibleOnly=true` to see what the user actually sees.",
2052
+ "Prefer `control/component/:id/action/:actionId` over button presses \u2014 typed paramSchema, no button-id guessing.",
2053
+ "Use `pageNavigate` for tab switches instead of pressing tab buttons; gesture state often swallows clicks.",
2054
+ "The `type` action supports `clear:true` to replace existing text atomically in one call."
2055
+ ]
2056
+ };
2057
+ }
1964
2058
  var NativeUIBridgeServer = class {
1965
2059
  constructor(registry, executor, config = {}) {
1966
2060
  this.registry = registry;
@@ -1977,7 +2071,9 @@ var NativeUIBridgeServer = class {
1977
2071
  cors: true,
1978
2072
  ...config
1979
2073
  };
1980
- this.handlers = createServerHandlers(registry, executor);
2074
+ this.handlers = createServerHandlers(registry, executor, {
2075
+ appInfo: this.config.appInfo
2076
+ });
1981
2077
  this.handlers.getMethods = async () => {
1982
2078
  const methods = WS_ROUTES.map((r) => ({
1983
2079
  method: r.pattern,
@@ -2781,6 +2877,20 @@ var NativeUIBridgeServer = class {
2781
2877
  };
2782
2878
  }
2783
2879
  const stripped = path.slice(PREFIX.length);
2880
+ if (method === "GET" && stripped === "_help") {
2881
+ return {
2882
+ success: true,
2883
+ data: buildHelpPayload(),
2884
+ timestamp: Date.now()
2885
+ };
2886
+ }
2887
+ if (method === "GET" && stripped === "_routes") {
2888
+ return {
2889
+ success: true,
2890
+ data: buildRoutesPayload(),
2891
+ timestamp: Date.now()
2892
+ };
2893
+ }
2784
2894
  let patternMatchedButWrongVerb = false;
2785
2895
  for (const route of WS_ROUTES) {
2786
2896
  const pathParams = parsePath(route.pattern, stripped);
@@ -3445,7 +3555,8 @@ function UIBridgeNativeProvider({
3445
3555
  }
3446
3556
  const server = createNativeServer(registry, executor, {
3447
3557
  serverPort: config.serverPort || 8087,
3448
- cors: true
3558
+ cors: true,
3559
+ appInfo: config.appInfo
3449
3560
  });
3450
3561
  server.setAdapter(serverAdapter);
3451
3562
  if (navigationProvider) {
@@ -3532,7 +3643,8 @@ function UIBridgeNativeProvider({
3532
3643
  try {
3533
3644
  const bareServer = createNativeServer(registry, executor, {
3534
3645
  serverPort: config.serverPort || 8087,
3535
- cors: true
3646
+ cors: true,
3647
+ appInfo: config.appInfo
3536
3648
  });
3537
3649
  if (navigationProvider) bareServer.setNavigationProvider(navigationProvider);
3538
3650
  if (screenshotProvider) bareServer.setScreenshotProvider(screenshotProvider);