@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
package/dist/index.mjs CHANGED
@@ -739,7 +739,7 @@ var DefaultNativeActionExecutor = class {
739
739
  if (!params?.text) {
740
740
  throw new Error("Type action requires text parameter");
741
741
  }
742
- if (params.clearFirst) {
742
+ if (params.clearFirst || params.clear) {
743
743
  await this.performClear(element, props);
744
744
  }
745
745
  if (params.delay && params.delay > 0) {
@@ -1972,6 +1972,10 @@ var WS_ROUTES = [
1972
1972
  { pattern: "health", handler: "health", httpMethods: ["GET"] },
1973
1973
  // Elements
1974
1974
  { pattern: "control/elements", handler: "getElements", httpMethods: ["GET"] },
1975
+ // Flat alias — matches the runner UI Bridge's `/ui-bridge/elements` path so
1976
+ // agents can use the same URL across runner + mobile without remembering
1977
+ // the `control/` prefix. Delegates to the same handler.
1978
+ { pattern: "elements", handler: "getElements", httpMethods: ["GET"] },
1975
1979
  { pattern: "control/element/:id", handler: "getElement", httpMethods: ["GET"] },
1976
1980
  { pattern: "control/element/:id/state", handler: "getElementState", httpMethods: ["GET"] },
1977
1981
  { pattern: "control/element/:id/action", handler: "executeAction", httpMethods: ["POST"] },
@@ -2022,6 +2026,87 @@ var WS_ROUTES = [
2022
2026
  // Meta / Introspection
2023
2027
  { pattern: "meta/methods", handler: "getMethods", httpMethods: ["GET"] }
2024
2028
  ];
2029
+ var HANDLER_DESCRIPTIONS = {
2030
+ health: "Liveness probe; returns app metadata + element count",
2031
+ getElements: "Flat list of registered UI elements",
2032
+ getElement: "Single element by id",
2033
+ getElementState: "Dynamic state (value, focused, checked) for one element",
2034
+ executeAction: 'Run an action on an element (see "actions" below for names)',
2035
+ getComponents: "Higher-level components with action schemas",
2036
+ getComponent: "Component detail + per-action paramSchema",
2037
+ executeComponentAction: "Invoke a component action directly (preferred over button clicks)",
2038
+ find: "AI-powered element search by natural-language query",
2039
+ getSnapshot: "Full snapshot: elements + route + state. Supports ?visibleOnly=true and ?currentRouteOnly=true",
2040
+ getWorkflows: "List registered workflows",
2041
+ runWorkflow: "Trigger a workflow by id",
2042
+ pageRefresh: "Reload the current route",
2043
+ pageNavigate: "Imperative router.push(url) \u2014 preferred over tapping tab buttons",
2044
+ pageReplace: "router.replace(url)",
2045
+ pageGoBack: "router.back()",
2046
+ pageGoForward: "router.forward()",
2047
+ getScreenshot: "PNG screenshot of the current screen",
2048
+ getElementStyles: "Computed styles for an element (design review)",
2049
+ getElementStateStyles: "Computed styles per interaction state (hover/focus/disabled)",
2050
+ getDesignSnapshot: "Visual + style snapshot for design review",
2051
+ getResponsiveSnapshots: "Screenshots at multiple viewport widths",
2052
+ runDesignAudit: "Accessibility + visual audit",
2053
+ loadStyleGuide: "Load a design system style guide",
2054
+ getStyleGuide: "Fetch the currently loaded style guide",
2055
+ clearStyleGuide: "Unload the style guide",
2056
+ evaluateQuality: "Score the current UI against a quality context",
2057
+ getQualityContexts: "List available quality evaluation contexts",
2058
+ saveBaseline: "Save a quality baseline snapshot",
2059
+ diffBaseline: "Diff current UI against a saved baseline",
2060
+ getMethods: "List every handler name (legacy introspection)"
2061
+ };
2062
+ var ACTION_REFERENCE = [
2063
+ { name: "press", aliases: ["click"], params: "PressActionParams (optional position)" },
2064
+ { name: "longPress", params: "PressActionParams (optional position)" },
2065
+ { name: "doubleTap", params: "none" },
2066
+ {
2067
+ name: "type",
2068
+ params: "TypeActionParams { text, delay?, clear? | clearFirst? } \u2014 `clear:true` replaces content atomically"
2069
+ },
2070
+ { name: "clear", params: "none \u2014 empties the input" },
2071
+ { name: "focus", params: "none" },
2072
+ { name: "blur", params: "none" },
2073
+ { name: "scroll", params: "ScrollActionParams { offset? {x,y}, to? }" },
2074
+ { name: "swipe", params: "SwipeActionParams { direction, distance }" },
2075
+ { name: "toggle", params: "none \u2014 flips boolean controls" }
2076
+ ];
2077
+ function buildRoutesPayload() {
2078
+ const entries = [];
2079
+ for (const r of WS_ROUTES) {
2080
+ if (!r.httpMethods) continue;
2081
+ for (const m of r.httpMethods) {
2082
+ entries.push({ method: m, path: `/ui-bridge/${r.pattern}` });
2083
+ }
2084
+ }
2085
+ entries.push({ method: "GET", path: "/ui-bridge/_help" });
2086
+ entries.push({ method: "GET", path: "/ui-bridge/_routes" });
2087
+ entries.sort((a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method));
2088
+ return { routes: entries, count: entries.length };
2089
+ }
2090
+ function buildHelpPayload() {
2091
+ return {
2092
+ version: 1,
2093
+ description: "UI Bridge Native HTTP surface. Prefix every path with /ui-bridge/.",
2094
+ routes: WS_ROUTES.map((r) => ({
2095
+ pattern: r.pattern,
2096
+ httpMethods: r.httpMethods ?? [],
2097
+ wsOnly: !r.httpMethods,
2098
+ handler: r.handler,
2099
+ description: HANDLER_DESCRIPTIONS[r.handler] ?? ""
2100
+ })),
2101
+ actions: ACTION_REFERENCE,
2102
+ tips: [
2103
+ "Start with `GET /ui-bridge/control/snapshot?visibleOnly=true` to see what the user actually sees.",
2104
+ "Prefer `control/component/:id/action/:actionId` over button presses \u2014 typed paramSchema, no button-id guessing.",
2105
+ "Use `pageNavigate` for tab switches instead of pressing tab buttons; gesture state often swallows clicks.",
2106
+ "The `type` action supports `clear:true` to replace existing text atomically in one call."
2107
+ ]
2108
+ };
2109
+ }
2025
2110
  var NativeUIBridgeServer = class {
2026
2111
  constructor(registry, executor, config = {}) {
2027
2112
  this.registry = registry;
@@ -2038,7 +2123,9 @@ var NativeUIBridgeServer = class {
2038
2123
  cors: true,
2039
2124
  ...config
2040
2125
  };
2041
- this.handlers = createServerHandlers(registry, executor);
2126
+ this.handlers = createServerHandlers(registry, executor, {
2127
+ appInfo: this.config.appInfo
2128
+ });
2042
2129
  this.handlers.getMethods = async () => {
2043
2130
  const methods = WS_ROUTES.map((r) => ({
2044
2131
  method: r.pattern,
@@ -2842,6 +2929,20 @@ var NativeUIBridgeServer = class {
2842
2929
  };
2843
2930
  }
2844
2931
  const stripped = path.slice(PREFIX.length);
2932
+ if (method === "GET" && stripped === "_help") {
2933
+ return {
2934
+ success: true,
2935
+ data: buildHelpPayload(),
2936
+ timestamp: Date.now()
2937
+ };
2938
+ }
2939
+ if (method === "GET" && stripped === "_routes") {
2940
+ return {
2941
+ success: true,
2942
+ data: buildRoutesPayload(),
2943
+ timestamp: Date.now()
2944
+ };
2945
+ }
2845
2946
  let patternMatchedButWrongVerb = false;
2846
2947
  for (const route of WS_ROUTES) {
2847
2948
  const pathParams = parsePath(route.pattern, stripped);
@@ -3506,7 +3607,8 @@ function UIBridgeNativeProvider({
3506
3607
  }
3507
3608
  const server = createNativeServer(registry, executor, {
3508
3609
  serverPort: config.serverPort || 8087,
3509
- cors: true
3610
+ cors: true,
3611
+ appInfo: config.appInfo
3510
3612
  });
3511
3613
  server.setAdapter(serverAdapter);
3512
3614
  if (navigationProvider) {
@@ -3593,7 +3695,8 @@ function UIBridgeNativeProvider({
3593
3695
  try {
3594
3696
  const bareServer = createNativeServer(registry, executor, {
3595
3697
  serverPort: config.serverPort || 8087,
3596
- cors: true
3698
+ cors: true,
3699
+ appInfo: config.appInfo
3597
3700
  });
3598
3701
  if (navigationProvider) bareServer.setNavigationProvider(navigationProvider);
3599
3702
  if (screenshotProvider) bareServer.setScreenshotProvider(screenshotProvider);