nudge-ui 0.2.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.
Files changed (510) hide show
  1. package/README.md +66 -0
  2. package/bin/nudge-ui.mjs +7 -0
  3. package/dist/LICENSE +21 -0
  4. package/dist/client.mjs +261 -0
  5. package/dist/compiler/ast.d.ts +18 -0
  6. package/dist/compiler/ast.js +75 -0
  7. package/dist/compiler/componentContractTypes.d.ts +19 -0
  8. package/dist/compiler/componentContractTypes.js +1 -0
  9. package/dist/compiler/componentContracts.d.ts +2 -0
  10. package/dist/compiler/componentContracts.js +260 -0
  11. package/dist/compiler/componentInstrumentation.d.ts +32 -0
  12. package/dist/compiler/componentInstrumentation.js +140 -0
  13. package/dist/compiler/componentPolicyResolution.d.ts +71 -0
  14. package/dist/compiler/componentPolicyResolution.js +388 -0
  15. package/dist/compiler/index.d.ts +9 -0
  16. package/dist/compiler/index.js +9 -0
  17. package/dist/compiler/packageComponentContracts.d.ts +32 -0
  18. package/dist/compiler/packageComponentContracts.js +308 -0
  19. package/dist/compiler/reactComponentProtocols.d.ts +145 -0
  20. package/dist/compiler/reactComponentProtocols.js +47 -0
  21. package/dist/compiler/reactIdentity.d.ts +15 -0
  22. package/dist/compiler/reactIdentity.js +339 -0
  23. package/dist/compiler/sourcePaths.d.ts +12 -0
  24. package/dist/compiler/sourcePaths.js +27 -0
  25. package/dist/css/dialects/index.d.ts +62 -0
  26. package/dist/css/dialects/index.js +103 -0
  27. package/dist/css/dialects/tailwind.d.ts +46 -0
  28. package/dist/css/dialects/tailwind.js +119 -0
  29. package/dist/css/dialects/vanillaExtract.d.ts +20 -0
  30. package/dist/css/dialects/vanillaExtract.js +32 -0
  31. package/dist/css/index.d.ts +10 -0
  32. package/dist/css/index.js +10 -0
  33. package/dist/css/model/index.d.ts +190 -0
  34. package/dist/css/model/index.js +10 -0
  35. package/dist/css/token-inventory/index.d.ts +26 -0
  36. package/dist/css/token-inventory/index.js +24 -0
  37. package/dist/css/token-inventory/inventory.d.ts +8 -0
  38. package/dist/css/token-inventory/inventory.js +421 -0
  39. package/dist/css/token-inventory/parseStylesheet.d.ts +16 -0
  40. package/dist/css/token-inventory/parseStylesheet.js +155 -0
  41. package/dist/css/token-inventory/policy.d.ts +47 -0
  42. package/dist/css/token-inventory/policy.js +50 -0
  43. package/dist/css/token-inventory/types.d.ts +97 -0
  44. package/dist/css/token-inventory/types.js +1 -0
  45. package/dist/css/value-semantics/borderSemantics.d.ts +28 -0
  46. package/dist/css/value-semantics/borderSemantics.js +91 -0
  47. package/dist/css/value-semantics/boxSemantics.d.ts +37 -0
  48. package/dist/css/value-semantics/boxSemantics.js +71 -0
  49. package/dist/css/value-semantics/colorSemantics.d.ts +99 -0
  50. package/dist/css/value-semantics/colorSemantics.js +526 -0
  51. package/dist/css/value-semantics/cssSyntax.d.ts +19 -0
  52. package/dist/css/value-semantics/cssSyntax.js +111 -0
  53. package/dist/css/value-semantics/fontSemantics.d.ts +35 -0
  54. package/dist/css/value-semantics/fontSemantics.js +131 -0
  55. package/dist/css/value-semantics/index.d.ts +20 -0
  56. package/dist/css/value-semantics/index.js +15 -0
  57. package/dist/css/value-semantics/propertyPolicy.d.ts +118 -0
  58. package/dist/css/value-semantics/propertyPolicy.js +356 -0
  59. package/dist/css/value-semantics/stringMaps.d.ts +2 -0
  60. package/dist/css/value-semantics/stringMaps.js +1 -0
  61. package/dist/css/value-semantics/structuredValues.d.ts +64 -0
  62. package/dist/css/value-semantics/structuredValues.js +250 -0
  63. package/dist/css/value-semantics/tokenInterpretation.d.ts +90 -0
  64. package/dist/css/value-semantics/tokenInterpretation.js +193 -0
  65. package/dist/css/virtual-design-tokens.d.ts +17 -0
  66. package/dist/hosts/astro/astroRuntimeConfig.d.ts +12 -0
  67. package/dist/hosts/astro/astroRuntimeConfig.js +26 -0
  68. package/dist/hosts/astro/clientAsset.d.ts +12 -0
  69. package/dist/hosts/astro/clientAsset.js +51 -0
  70. package/dist/hosts/astro/clientTransport.d.ts +3 -0
  71. package/dist/hosts/astro/clientTransport.js +57 -0
  72. package/dist/hosts/astro/index.d.ts +3 -0
  73. package/dist/hosts/astro/index.js +2 -0
  74. package/dist/hosts/astro/integration.d.ts +35 -0
  75. package/dist/hosts/astro/integration.js +96 -0
  76. package/dist/hosts/astro/middleware.d.ts +13 -0
  77. package/dist/hosts/astro/middleware.js +22 -0
  78. package/dist/hosts/astro/projectContext.d.ts +11 -0
  79. package/dist/hosts/astro/projectContext.js +34 -0
  80. package/dist/hosts/astro/responseInstrumentation.d.ts +41 -0
  81. package/dist/hosts/astro/responseInstrumentation.js +80 -0
  82. package/dist/hosts/next/index.d.ts +4 -0
  83. package/dist/hosts/next/index.js +7 -0
  84. package/dist/hosts/next/loader.d.ts +66 -0
  85. package/dist/hosts/next/loader.js +346 -0
  86. package/dist/hosts/next/loaders/identity-loader.cjs +228257 -0
  87. package/dist/hosts/next/loaders/loader-plugin.cjs +228257 -0
  88. package/dist/hosts/next/manifest.d.ts +38 -0
  89. package/dist/hosts/next/manifest.js +30 -0
  90. package/dist/hosts/next/mount.d.ts +12 -0
  91. package/dist/hosts/next/mount.js +23 -0
  92. package/dist/hosts/next/repositoryScope.d.ts +20 -0
  93. package/dist/hosts/next/repositoryScope.js +33 -0
  94. package/dist/hosts/next/sidecar.d.ts +27 -0
  95. package/dist/hosts/next/sidecar.js +526 -0
  96. package/dist/hosts/next/wrapper.d.ts +67 -0
  97. package/dist/hosts/next/wrapper.js +310 -0
  98. package/dist/hosts/static/cli.d.ts +12 -0
  99. package/dist/hosts/static/cli.js +77 -0
  100. package/dist/hosts/static/html/bootstrap.d.ts +27 -0
  101. package/dist/hosts/static/html/bootstrap.js +93 -0
  102. package/dist/hosts/static/index.d.ts +4 -0
  103. package/dist/hosts/static/index.js +4 -0
  104. package/dist/hosts/static/manifest.d.ts +18 -0
  105. package/dist/hosts/static/manifest.js +51 -0
  106. package/dist/hosts/static/server.d.ts +72 -0
  107. package/dist/hosts/static/server.js +554 -0
  108. package/dist/hosts/vite/index.d.ts +20 -0
  109. package/dist/hosts/vite/index.js +48 -0
  110. package/dist/hosts/vite/react.d.ts +67 -0
  111. package/dist/hosts/vite/react.js +231 -0
  112. package/dist/hosts/vite/tokens/activeStylesheets.d.ts +28 -0
  113. package/dist/hosts/vite/tokens/activeStylesheets.js +70 -0
  114. package/dist/hosts/vite/tokens/fileMap.d.ts +2 -0
  115. package/dist/hosts/vite/tokens/fileMap.js +1 -0
  116. package/dist/hosts/vite/tokens/viteStylesheetArtifacts.d.ts +46 -0
  117. package/dist/hosts/vite/tokens/viteStylesheetArtifacts.js +104 -0
  118. package/dist/hosts/vite/virtual/design-tokens.d.ts +9 -0
  119. package/dist/hosts/vite/virtual/design-tokens.js +7 -0
  120. package/dist/hosts/vite/virtual-design-tokens.d.ts +1 -0
  121. package/dist/hosts/vite/vite.d.ts +62 -0
  122. package/dist/hosts/vite/vite.js +854 -0
  123. package/dist/html/dom.d.ts +13 -0
  124. package/dist/html/dom.js +46 -0
  125. package/dist/html/identity.d.ts +40 -0
  126. package/dist/html/identity.js +196 -0
  127. package/dist/html/insertions.d.ts +26 -0
  128. package/dist/html/insertions.js +59 -0
  129. package/dist/inspector/agent/McpConnectionDialog.d.ts +26 -0
  130. package/dist/inspector/agent/McpConnectionDialog.js +135 -0
  131. package/dist/inspector/agent/client.d.ts +98 -0
  132. package/dist/inspector/agent/client.js +728 -0
  133. package/dist/inspector/agent/connectionStatus.d.ts +13 -0
  134. package/dist/inspector/agent/connectionStatus.js +35 -0
  135. package/dist/inspector/agent/httpTransport.d.ts +21 -0
  136. package/dist/inspector/agent/httpTransport.js +347 -0
  137. package/dist/inspector/agent/protocol.d.ts +95 -0
  138. package/dist/inspector/agent/protocol.js +9 -0
  139. package/dist/inspector/agent/verification.d.ts +39 -0
  140. package/dist/inspector/agent/verification.js +207 -0
  141. package/dist/inspector/canvas/CanvasCard.d.ts +10 -0
  142. package/dist/inspector/canvas/CanvasCard.js +275 -0
  143. package/dist/inspector/canvas/CanvasElementOverlay.d.ts +2 -0
  144. package/dist/inspector/canvas/CanvasElementOverlay.js +301 -0
  145. package/dist/inspector/canvas/CanvasWorkspace.d.ts +2 -0
  146. package/dist/inspector/canvas/CanvasWorkspace.js +301 -0
  147. package/dist/inspector/canvas/LockedWorkspaceNotice.d.ts +6 -0
  148. package/dist/inspector/canvas/LockedWorkspaceNotice.js +17 -0
  149. package/dist/inspector/canvas/StaleChangeIndicator.d.ts +7 -0
  150. package/dist/inspector/canvas/StaleChangeIndicator.js +43 -0
  151. package/dist/inspector/canvas/agentPresentation.d.ts +87 -0
  152. package/dist/inspector/canvas/agentPresentation.js +421 -0
  153. package/dist/inspector/canvas/canvasGestures.d.ts +12 -0
  154. package/dist/inspector/canvas/canvasGestures.js +21 -0
  155. package/dist/inspector/canvas/canvasStore.d.ts +108 -0
  156. package/dist/inspector/canvas/canvasStore.js +448 -0
  157. package/dist/inspector/canvas/frameProtocol.d.ts +231 -0
  158. package/dist/inspector/canvas/frameProtocol.js +165 -0
  159. package/dist/inspector/canvas/linkEligibility.d.ts +8 -0
  160. package/dist/inspector/canvas/linkEligibility.js +68 -0
  161. package/dist/inspector/canvas/measurementProjection.d.ts +8 -0
  162. package/dist/inspector/canvas/measurementProjection.js +16 -0
  163. package/dist/inspector/canvas/normalizeUrl.d.ts +7 -0
  164. package/dist/inspector/canvas/normalizeUrl.js +27 -0
  165. package/dist/inspector/canvas/projection.d.ts +41 -0
  166. package/dist/inspector/canvas/projection.js +232 -0
  167. package/dist/inspector/canvas/rendererBootstrap.d.ts +4 -0
  168. package/dist/inspector/canvas/rendererBootstrap.js +410 -0
  169. package/dist/inspector/canvas/rendererCidIndex.d.ts +11 -0
  170. package/dist/inspector/canvas/rendererCidIndex.js +21 -0
  171. package/dist/inspector/canvas/rendererElementSelector.d.ts +2 -0
  172. package/dist/inspector/canvas/rendererElementSelector.js +378 -0
  173. package/dist/inspector/canvas/rendererSelectionProxy.d.ts +2 -0
  174. package/dist/inspector/canvas/rendererSelectionProxy.js +61 -0
  175. package/dist/inspector/canvas/rendererStylesheet.d.ts +16 -0
  176. package/dist/inspector/canvas/rendererStylesheet.js +221 -0
  177. package/dist/inspector/canvas/resizeHandleScale.d.ts +13 -0
  178. package/dist/inspector/canvas/resizeHandleScale.js +20 -0
  179. package/dist/inspector/canvas/roleDetection.d.ts +5 -0
  180. package/dist/inspector/canvas/roleDetection.js +21 -0
  181. package/dist/inspector/canvas/sessionStore.d.ts +71 -0
  182. package/dist/inspector/canvas/sessionStore.js +453 -0
  183. package/dist/inspector/canvas/staleChangeDetector.d.ts +11 -0
  184. package/dist/inspector/canvas/staleChangeDetector.js +217 -0
  185. package/dist/inspector/canvas/toolbarScale.d.ts +7 -0
  186. package/dist/inspector/canvas/toolbarScale.js +11 -0
  187. package/dist/inspector/canvas/workspaceLease.d.ts +26 -0
  188. package/dist/inspector/canvas/workspaceLease.js +214 -0
  189. package/dist/inspector/changes/changesLog.d.ts +46 -0
  190. package/dist/inspector/changes/changesLog.js +209 -0
  191. package/dist/inspector/changes/codecs.d.ts +98 -0
  192. package/dist/inspector/changes/codecs.js +389 -0
  193. package/dist/inspector/changes/editModel.d.ts +74 -0
  194. package/dist/inspector/changes/editModel.js +120 -0
  195. package/dist/inspector/changes/managedStyleProjection.d.ts +6 -0
  196. package/dist/inspector/changes/managedStyleProjection.js +109 -0
  197. package/dist/inspector/changes/model.d.ts +13 -0
  198. package/dist/inspector/changes/model.js +163 -0
  199. package/dist/inspector/changes/presentation.d.ts +14 -0
  200. package/dist/inspector/changes/presentation.js +81 -0
  201. package/dist/inspector/changes/previewDiagnostics.d.ts +39 -0
  202. package/dist/inspector/changes/previewDiagnostics.js +172 -0
  203. package/dist/inspector/changes/structuralTypes.d.ts +35 -0
  204. package/dist/inspector/changes/structuralTypes.js +1 -0
  205. package/dist/inspector/changes/types.d.ts +76 -0
  206. package/dist/inspector/changes/types.js +16 -0
  207. package/dist/inspector/changes/workspaceChanges.d.ts +43 -0
  208. package/dist/inspector/changes/workspaceChanges.js +239 -0
  209. package/dist/inspector/clientManifest.d.ts +24 -0
  210. package/dist/inspector/clientManifest.js +69 -0
  211. package/dist/inspector/componentSemantics/ComponentPropsSection.d.ts +5 -0
  212. package/dist/inspector/componentSemantics/ComponentPropsSection.js +44 -0
  213. package/dist/inspector/componentSemantics/adapterRegistry.d.ts +11 -0
  214. package/dist/inspector/componentSemantics/adapterRegistry.js +75 -0
  215. package/dist/inspector/componentSemantics/boundaries.d.ts +2 -0
  216. package/dist/inspector/componentSemantics/boundaries.js +10 -0
  217. package/dist/inspector/componentSemantics/changeAction.d.ts +3 -0
  218. package/dist/inspector/componentSemantics/changeAction.js +6 -0
  219. package/dist/inspector/componentSemantics/changeModel.d.ts +8 -0
  220. package/dist/inspector/componentSemantics/changeModel.js +60 -0
  221. package/dist/inspector/componentSemantics/index.d.ts +4 -0
  222. package/dist/inspector/componentSemantics/index.js +2 -0
  223. package/dist/inspector/componentSemantics/reactRuntime.d.ts +10 -0
  224. package/dist/inspector/componentSemantics/reactRuntime.js +186 -0
  225. package/dist/inspector/componentSemantics/runtimeBridge.d.ts +25 -0
  226. package/dist/inspector/componentSemantics/runtimeBridge.js +161 -0
  227. package/dist/inspector/componentSemantics/runtimeTypes.d.ts +2 -0
  228. package/dist/inspector/componentSemantics/runtimeTypes.js +1 -0
  229. package/dist/inspector/componentSemantics/textBinding.d.ts +69 -0
  230. package/dist/inspector/componentSemantics/textBinding.js +514 -0
  231. package/dist/inspector/componentSemantics/types.d.ts +96 -0
  232. package/dist/inspector/componentSemantics/types.js +5 -0
  233. package/dist/inspector/conformance/borderCases.d.ts +7 -0
  234. package/dist/inspector/conformance/borderCases.js +428 -0
  235. package/dist/inspector/conformance/colorCases.d.ts +8 -0
  236. package/dist/inspector/conformance/colorCases.js +470 -0
  237. package/dist/inspector/conformance/fixture.d.ts +68 -0
  238. package/dist/inspector/conformance/fixture.js +153 -0
  239. package/dist/inspector/conformance/projection.d.ts +2 -0
  240. package/dist/inspector/conformance/projection.js +3 -0
  241. package/dist/inspector/conformance/spacingCases.d.ts +6 -0
  242. package/dist/inspector/conformance/spacingCases.js +417 -0
  243. package/dist/inspector/conformance/typographyCases.d.ts +7 -0
  244. package/dist/inspector/conformance/typographyCases.js +174 -0
  245. package/dist/inspector/editScope.d.ts +4 -0
  246. package/dist/inspector/editScope.js +5 -0
  247. package/dist/inspector/index.d.ts +20 -0
  248. package/dist/inspector/index.js +236 -0
  249. package/dist/inspector/inline-text/inlineTextEditor.d.ts +74 -0
  250. package/dist/inspector/inline-text/inlineTextEditor.js +1207 -0
  251. package/dist/inspector/inline-text/inlineTextLifecycle.d.ts +2 -0
  252. package/dist/inspector/inline-text/inlineTextLifecycle.js +17 -0
  253. package/dist/inspector/inline-text/textChangeBoundary.d.ts +6 -0
  254. package/dist/inspector/inline-text/textChangeBoundary.js +1 -0
  255. package/dist/inspector/inspection/bridge.d.ts +72 -0
  256. package/dist/inspector/inspection/bridge.js +134 -0
  257. package/dist/inspector/inspection/browserCssInspection.d.ts +74 -0
  258. package/dist/inspector/inspection/browserCssInspection.js +317 -0
  259. package/dist/inspector/inspection/browserCssInspectionRegistry.d.ts +12 -0
  260. package/dist/inspector/inspection/browserCssInspectionRegistry.js +66 -0
  261. package/dist/inspector/inspection/selectionProperty.d.ts +32 -0
  262. package/dist/inspector/inspection/selectionProperty.js +33 -0
  263. package/dist/inspector/inspection/useBrowserCssInspection.d.ts +20 -0
  264. package/dist/inspector/inspection/useBrowserCssInspection.js +159 -0
  265. package/dist/inspector/overlay/DropGuideOverlay.d.ts +17 -0
  266. package/dist/inspector/overlay/DropGuideOverlay.js +17 -0
  267. package/dist/inspector/overlay/InspectorOverlay.d.ts +5 -0
  268. package/dist/inspector/overlay/InspectorOverlay.js +328 -0
  269. package/dist/inspector/overlay/MeasurementGuideOverlay.d.ts +19 -0
  270. package/dist/inspector/overlay/MeasurementGuideOverlay.js +40 -0
  271. package/dist/inspector/overlay/clickPolicy.d.ts +7 -0
  272. package/dist/inspector/overlay/clickPolicy.js +13 -0
  273. package/dist/inspector/overlay/dropGuide.d.ts +22 -0
  274. package/dist/inspector/overlay/dropGuide.js +48 -0
  275. package/dist/inspector/overlay/elementSelector.d.ts +1 -0
  276. package/dist/inspector/overlay/elementSelector.js +100 -0
  277. package/dist/inspector/overlay/frameThrottle.d.ts +10 -0
  278. package/dist/inspector/overlay/frameThrottle.js +38 -0
  279. package/dist/inspector/overlay/interactionStyles.d.ts +3 -0
  280. package/dist/inspector/overlay/interactionStyles.js +70 -0
  281. package/dist/inspector/overlay/measurementGeometry.d.ts +25 -0
  282. package/dist/inspector/overlay/measurementGeometry.js +104 -0
  283. package/dist/inspector/overlay/overlayGeometry.d.ts +40 -0
  284. package/dist/inspector/overlay/overlayGeometry.js +59 -0
  285. package/dist/inspector/overlay/selectedGeometry.d.ts +7 -0
  286. package/dist/inspector/overlay/selectedGeometry.js +51 -0
  287. package/dist/inspector/overlay/structuralGestures.d.ts +28 -0
  288. package/dist/inspector/overlay/structuralGestures.js +180 -0
  289. package/dist/inspector/projection/cssEscapes.d.ts +3 -0
  290. package/dist/inspector/projection/cssEscapes.js +20 -0
  291. package/dist/inspector/projection/managedStylesheet.d.ts +33 -0
  292. package/dist/inspector/projection/managedStylesheet.js +240 -0
  293. package/dist/inspector/projection/renderedInstance.d.ts +56 -0
  294. package/dist/inspector/projection/renderedInstance.js +306 -0
  295. package/dist/inspector/projection/structuralProjection.d.ts +93 -0
  296. package/dist/inspector/projection/structuralProjection.js +560 -0
  297. package/dist/inspector/projection/structuralProjectionBoundary.d.ts +5 -0
  298. package/dist/inspector/projection/structuralProjectionBoundary.js +65 -0
  299. package/dist/inspector/projection/textProjection.d.ts +53 -0
  300. package/dist/inspector/projection/textProjection.js +705 -0
  301. package/dist/inspector/projection/workspaceProjection.d.ts +43 -0
  302. package/dist/inspector/projection/workspaceProjection.js +58 -0
  303. package/dist/inspector/prompt/PromptSettingsDialog.d.ts +15 -0
  304. package/dist/inspector/prompt/PromptSettingsDialog.js +17 -0
  305. package/dist/inspector/prompt/clipboardHandoff.d.ts +34 -0
  306. package/dist/inspector/prompt/clipboardHandoff.js +212 -0
  307. package/dist/inspector/prompt/copyToClipboard.d.ts +1 -0
  308. package/dist/inspector/prompt/copyToClipboard.js +34 -0
  309. package/dist/inspector/prompt/detectFramework.d.ts +6 -0
  310. package/dist/inspector/prompt/detectFramework.js +4 -0
  311. package/dist/inspector/prompt/generatePrompt.d.ts +7 -0
  312. package/dist/inspector/prompt/generatePrompt.js +391 -0
  313. package/dist/inspector/prompt/promptSettings.d.ts +8 -0
  314. package/dist/inspector/prompt/promptSettings.js +28 -0
  315. package/dist/inspector/runtime/devFlag.d.ts +28 -0
  316. package/dist/inspector/runtime/devFlag.js +50 -0
  317. package/dist/inspector/runtime/documentStylesheetOrder.d.ts +19 -0
  318. package/dist/inspector/runtime/documentStylesheetOrder.js +89 -0
  319. package/dist/inspector/runtime/domRealm.d.ts +4 -0
  320. package/dist/inspector/runtime/domRealm.js +11 -0
  321. package/dist/inspector/runtime/runtimeConfig.d.ts +119 -0
  322. package/dist/inspector/runtime/runtimeConfig.js +276 -0
  323. package/dist/inspector/runtime/staticHtmlRuntimeIdentity.d.ts +32 -0
  324. package/dist/inspector/runtime/staticHtmlRuntimeIdentity.js +149 -0
  325. package/dist/inspector/runtime/useRuntimeConfig.d.ts +10 -0
  326. package/dist/inspector/runtime/useRuntimeConfig.js +13 -0
  327. package/dist/inspector/selection/editScope.d.ts +32 -0
  328. package/dist/inspector/selection/editScope.js +140 -0
  329. package/dist/inspector/selection/editTarget.d.ts +8 -0
  330. package/dist/inspector/selection/editTarget.js +11 -0
  331. package/dist/inspector/selection/hierarchy.d.ts +7 -0
  332. package/dist/inspector/selection/hierarchy.js +42 -0
  333. package/dist/inspector/selection/resolveSelection.d.ts +10 -0
  334. package/dist/inspector/selection/resolveSelection.js +60 -0
  335. package/dist/inspector/selection/selectionStore.d.ts +41 -0
  336. package/dist/inspector/selection/selectionStore.js +262 -0
  337. package/dist/inspector/selection/selectionTarget.d.ts +5 -0
  338. package/dist/inspector/selection/selectionTarget.js +50 -0
  339. package/dist/inspector/selection/sourceSite.d.ts +2 -0
  340. package/dist/inspector/selection/sourceSite.js +12 -0
  341. package/dist/inspector/selection/styleSelection.d.ts +22 -0
  342. package/dist/inspector/selection/styleSelection.js +104 -0
  343. package/dist/inspector/session/index.d.ts +3 -0
  344. package/dist/inspector/session/index.js +2 -0
  345. package/dist/inspector/session/lifecycle.d.ts +22 -0
  346. package/dist/inspector/session/lifecycle.js +63 -0
  347. package/dist/inspector/session/sessionContext.d.ts +21 -0
  348. package/dist/inspector/session/sessionContext.js +28 -0
  349. package/dist/inspector/session/sessionFactory.d.ts +29 -0
  350. package/dist/inspector/session/sessionFactory.js +73 -0
  351. package/dist/inspector/settings/SettingsDialog.d.ts +12 -0
  352. package/dist/inspector/settings/SettingsDialog.js +46 -0
  353. package/dist/inspector/shell/AppShell.d.ts +2 -0
  354. package/dist/inspector/shell/AppShell.js +9 -0
  355. package/dist/inspector/shell/ChangesLog.d.ts +6 -0
  356. package/dist/inspector/shell/ChangesLog.js +92 -0
  357. package/dist/inspector/shell/CopyPromptButton.d.ts +9 -0
  358. package/dist/inspector/shell/CopyPromptButton.js +159 -0
  359. package/dist/inspector/shell/DomNavigation.d.ts +8 -0
  360. package/dist/inspector/shell/DomNavigation.js +30 -0
  361. package/dist/inspector/shell/EmptyState.d.ts +2 -0
  362. package/dist/inspector/shell/EmptyState.js +15 -0
  363. package/dist/inspector/shell/InspectorShell.d.ts +11 -0
  364. package/dist/inspector/shell/InspectorShell.js +268 -0
  365. package/dist/inspector/shell/openStore.d.ts +6 -0
  366. package/dist/inspector/shell/openStore.js +29 -0
  367. package/dist/inspector/shell/panelLayout.d.ts +2 -0
  368. package/dist/inspector/shell/panelLayout.js +29 -0
  369. package/dist/inspector/shell/shortcuts.d.ts +3 -0
  370. package/dist/inspector/shell/shortcuts.js +25 -0
  371. package/dist/inspector/shell/stateValue.d.ts +3 -0
  372. package/dist/inspector/shell/stateValue.js +34 -0
  373. package/dist/inspector/shell/styleState.d.ts +7 -0
  374. package/dist/inspector/shell/styleState.js +13 -0
  375. package/dist/inspector/spacing/projection.d.ts +43 -0
  376. package/dist/inspector/spacing/projection.js +136 -0
  377. package/dist/inspector/styleEditors/AppearanceSection.d.ts +13 -0
  378. package/dist/inspector/styleEditors/AppearanceSection.js +6 -0
  379. package/dist/inspector/styleEditors/AspectRatioField.d.ts +17 -0
  380. package/dist/inspector/styleEditors/AspectRatioField.js +10 -0
  381. package/dist/inspector/styleEditors/BorderEditor.d.ts +13 -0
  382. package/dist/inspector/styleEditors/BorderEditor.js +295 -0
  383. package/dist/inspector/styleEditors/BorderRadiusEditor.d.ts +14 -0
  384. package/dist/inspector/styleEditors/BorderRadiusEditor.js +108 -0
  385. package/dist/inspector/styleEditors/BoxShadowEditor.d.ts +13 -0
  386. package/dist/inspector/styleEditors/BoxShadowEditor.js +13 -0
  387. package/dist/inspector/styleEditors/ColorPicker.d.ts +15 -0
  388. package/dist/inspector/styleEditors/ColorPicker.js +73 -0
  389. package/dist/inspector/styleEditors/GapField.d.ts +17 -0
  390. package/dist/inspector/styleEditors/GapField.js +12 -0
  391. package/dist/inspector/styleEditors/GridChildSection.d.ts +14 -0
  392. package/dist/inspector/styleEditors/GridChildSection.js +91 -0
  393. package/dist/inspector/styleEditors/GridPicker.d.ts +13 -0
  394. package/dist/inspector/styleEditors/GridPicker.js +179 -0
  395. package/dist/inspector/styleEditors/GridSection.d.ts +17 -0
  396. package/dist/inspector/styleEditors/GridSection.js +27 -0
  397. package/dist/inspector/styleEditors/GridValueField.d.ts +17 -0
  398. package/dist/inspector/styleEditors/GridValueField.js +70 -0
  399. package/dist/inspector/styleEditors/InsetSection.d.ts +15 -0
  400. package/dist/inspector/styleEditors/InsetSection.js +15 -0
  401. package/dist/inspector/styleEditors/LayoutBlockedIndicator.d.ts +6 -0
  402. package/dist/inspector/styleEditors/LayoutBlockedIndicator.js +6 -0
  403. package/dist/inspector/styleEditors/LayoutComboField.d.ts +18 -0
  404. package/dist/inspector/styleEditors/LayoutComboField.js +138 -0
  405. package/dist/inspector/styleEditors/LayoutDropdown.d.ts +14 -0
  406. package/dist/inspector/styleEditors/LayoutDropdown.js +34 -0
  407. package/dist/inspector/styleEditors/LayoutSection.d.ts +13 -0
  408. package/dist/inspector/styleEditors/LayoutSection.js +342 -0
  409. package/dist/inspector/styleEditors/OpacityEditor.d.ts +13 -0
  410. package/dist/inspector/styleEditors/OpacityEditor.js +34 -0
  411. package/dist/inspector/styleEditors/PositionInsets.d.ts +15 -0
  412. package/dist/inspector/styleEditors/PositionInsets.js +12 -0
  413. package/dist/inspector/styleEditors/SpacingBox.d.ts +29 -0
  414. package/dist/inspector/styleEditors/SpacingBox.js +189 -0
  415. package/dist/inspector/styleEditors/Typography.d.ts +13 -0
  416. package/dist/inspector/styleEditors/Typography.js +137 -0
  417. package/dist/inspector/styleEditors/completeCssValue.d.ts +8 -0
  418. package/dist/inspector/styleEditors/completeCssValue.js +34 -0
  419. package/dist/inspector/styleEditors/gridChildModel.d.ts +74 -0
  420. package/dist/inspector/styleEditors/gridChildModel.js +138 -0
  421. package/dist/inspector/styleEditors/layoutValue.d.ts +24 -0
  422. package/dist/inspector/styleEditors/layoutValue.js +103 -0
  423. package/dist/inspector/styleEditors/nudgeValue.d.ts +8 -0
  424. package/dist/inspector/styleEditors/nudgeValue.js +71 -0
  425. package/dist/inspector/styleEditors/rowLookup.d.ts +11 -0
  426. package/dist/inspector/styleEditors/rowLookup.js +13 -0
  427. package/dist/inspector/styleEditors/stringRecord.d.ts +4 -0
  428. package/dist/inspector/styleEditors/stringRecord.js +1 -0
  429. package/dist/inspector/styleEditors/valuePolicy.d.ts +20 -0
  430. package/dist/inspector/styleEditors/valuePolicy.js +82 -0
  431. package/dist/inspector/testing.d.ts +10 -0
  432. package/dist/inspector/testing.js +9 -0
  433. package/dist/inspector/tokens/TokenChip.d.ts +24 -0
  434. package/dist/inspector/tokens/TokenChip.js +23 -0
  435. package/dist/inspector/tokens/TokenDropdown.d.ts +13 -0
  436. package/dist/inspector/tokens/TokenDropdown.js +59 -0
  437. package/dist/inspector/tokens/TokenField.d.ts +68 -0
  438. package/dist/inspector/tokens/TokenField.js +485 -0
  439. package/dist/inspector/tokens/TokenLabel.d.ts +7 -0
  440. package/dist/inspector/tokens/TokenLabel.js +23 -0
  441. package/dist/inspector/tokens/TokensPanel.d.ts +5 -0
  442. package/dist/inspector/tokens/TokensPanel.js +47 -0
  443. package/dist/inspector/tokens/catalog.d.ts +51 -0
  444. package/dist/inspector/tokens/catalog.js +184 -0
  445. package/dist/inspector/tokens/editActions.d.ts +35 -0
  446. package/dist/inspector/tokens/editActions.js +164 -0
  447. package/dist/inspector/tokens/resolution/cascade.d.ts +14 -0
  448. package/dist/inspector/tokens/resolution/cascade.js +31 -0
  449. package/dist/inspector/tokens/resolution/cssomCollector.d.ts +43 -0
  450. package/dist/inspector/tokens/resolution/cssomCollector.js +528 -0
  451. package/dist/inspector/tokens/resolution/selectorSemantics.d.ts +12 -0
  452. package/dist/inspector/tokens/resolution/selectorSemantics.js +106 -0
  453. package/dist/inspector/tokens/resolution.d.ts +56 -0
  454. package/dist/inspector/tokens/resolution.js +1401 -0
  455. package/dist/inspector/tokens/tokenEdits.d.ts +3 -0
  456. package/dist/inspector/tokens/tokenEdits.js +22 -0
  457. package/dist/inspector/tokens/valueSemanticsAdapter.d.ts +6 -0
  458. package/dist/inspector/tokens/valueSemanticsAdapter.js +68 -0
  459. package/dist/inspector/ui/AtRuleContext.d.ts +18 -0
  460. package/dist/inspector/ui/AtRuleContext.js +54 -0
  461. package/dist/inspector/ui/Button.d.ts +9 -0
  462. package/dist/inspector/ui/Button.js +4 -0
  463. package/dist/inspector/ui/ColorSwatch.d.ts +7 -0
  464. package/dist/inspector/ui/ColorSwatch.js +6 -0
  465. package/dist/inspector/ui/ControlSurface.d.ts +14 -0
  466. package/dist/inspector/ui/ControlSurface.js +10 -0
  467. package/dist/inspector/ui/FieldRow.d.ts +14 -0
  468. package/dist/inspector/ui/FieldRow.js +15 -0
  469. package/dist/inspector/ui/IconButton.d.ts +14 -0
  470. package/dist/inspector/ui/IconButton.js +5 -0
  471. package/dist/inspector/ui/InspectorPopover.d.ts +17 -0
  472. package/dist/inspector/ui/InspectorPopover.js +13 -0
  473. package/dist/inspector/ui/PopoverListbox.d.ts +37 -0
  474. package/dist/inspector/ui/PopoverListbox.js +21 -0
  475. package/dist/inspector/ui/SegmentedControl.d.ts +24 -0
  476. package/dist/inspector/ui/SegmentedControl.js +16 -0
  477. package/dist/inspector/ui/Select.d.ts +25 -0
  478. package/dist/inspector/ui/Select.js +56 -0
  479. package/dist/inspector/ui/SideValuesField.d.ts +44 -0
  480. package/dist/inspector/ui/SideValuesField.js +76 -0
  481. package/dist/inspector/ui/StatusCallout.d.ts +9 -0
  482. package/dist/inspector/ui/StatusCallout.js +4 -0
  483. package/dist/inspector/ui/TextInput.d.ts +12 -0
  484. package/dist/inspector/ui/TextInput.js +5 -0
  485. package/dist/inspector/ui/ToggleButton.d.ts +11 -0
  486. package/dist/inspector/ui/ToggleButton.js +6 -0
  487. package/dist/inspector/ui/assets/grid.svg +14 -0
  488. package/dist/inspector/ui/css.d.ts +9 -0
  489. package/dist/inspector/ui/labels.d.ts +1 -0
  490. package/dist/inspector/ui/labels.js +7 -0
  491. package/dist/inspector/ui/styles.d.ts +1 -0
  492. package/dist/inspector/ui/styles.js +68 -0
  493. package/dist/inspector/virtual-modules.d.ts +7 -0
  494. package/dist/inspector/vite-env.d.ts +10 -0
  495. package/dist/internal/agent-protocol.d.ts +232 -0
  496. package/dist/internal/agent-protocol.js +237 -0
  497. package/dist/nudge-ui.mjs +15722 -0
  498. package/dist/project/files.d.ts +19 -0
  499. package/dist/project/files.js +226 -0
  500. package/dist/project/identity.d.ts +6 -0
  501. package/dist/project/identity.js +19 -0
  502. package/dist/project/pathPolicy.d.ts +8 -0
  503. package/dist/project/pathPolicy.js +12 -0
  504. package/dist/project/tokens.d.ts +36 -0
  505. package/dist/project/tokens.js +223 -0
  506. package/dist/transport/index.d.ts +8 -0
  507. package/dist/transport/index.js +8 -0
  508. package/dist/transport/routes.d.ts +13 -0
  509. package/dist/transport/routes.js +16 -0
  510. package/package.json +137 -0
@@ -0,0 +1,43 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useSyncExternalStore } from "react";
3
+ import { isPreviewableChange, isTokenChange } from "../changes/changesLog.js";
4
+ import { changeKey } from "../changes/model.js";
5
+ import { getAnyPreviewDiagnostic, getPreviewDiagnosticRevision, subscribePreviewDiagnostics, } from "../changes/previewDiagnostics.js";
6
+ import { humanizeSelector } from "../tokens/catalog.js";
7
+ import { getScopingSelectorPattern } from "../runtime/runtimeConfig.js";
8
+ import { isVerificationPending } from "./staleChangeDetector.js";
9
+ export function StaleChangeIndicator({ change }) {
10
+ useSyncExternalStore(subscribePreviewDiagnostics, getPreviewDiagnosticRevision, getPreviewDiagnosticRevision);
11
+ if (!isPreviewableChange(change))
12
+ return null;
13
+ const result = getAnyPreviewDiagnostic(changeKey(change))?.result;
14
+ if (result === undefined) {
15
+ if (isVerificationPending()) {
16
+ return (_jsx("span", { className: "changes__verifying", "data-test": "stale-verifying", children: "Verifying..." }));
17
+ }
18
+ return null;
19
+ }
20
+ if (result.status === "applied") {
21
+ return (_jsx("span", { className: "changes__diagnostic", "data-test": "preview-applied", "data-status": "applied", children: "Preview active" }));
22
+ }
23
+ if (result.reason === "target-missing") {
24
+ // ADR-0011: host scoping markers are opaque structure and must not
25
+ // surface as human-facing guidance; the raw selector stays in change
26
+ // records for managed-rule targeting.
27
+ const selectorLabel = humanizeSelector(change.selector, getScopingSelectorPattern())
28
+ || change.selector;
29
+ return (_jsx("span", { className: "changes__stale", "data-test": "stale-missing", title: `Selector: ${selectorLabel}`, children: "Source missing \u2014 this edit may be stale" }));
30
+ }
31
+ if (result.reason === "token-drift") {
32
+ const currentValue = result.computedValue
33
+ ? ` (current: ${result.computedValue})`
34
+ : "";
35
+ if (isTokenChange(change)) {
36
+ return (_jsx("span", { className: "changes__stale", "data-test": "stale-token-drift", title: `Token ${change.tokenName} baseline has changed since this edit was made${currentValue}`, children: "Token baseline has changed" }));
37
+ }
38
+ return null;
39
+ }
40
+ return (_jsxs("span", { className: "changes__conflict", "data-test": "preview-conflict", title: `Computed: ${result.computedValue}`, children: ["Preview Blocked (", result.reason
41
+ ? result.reason.replace(/-/g, " ")
42
+ : "Unknown", ")"] }));
43
+ }
@@ -0,0 +1,87 @@
1
+ import { type CanvasCommand, type CanvasCommandResult, type CanvasState } from "../../internal/agent-protocol.js";
2
+ import { type CanvasCard, type CanvasComparisonGroup } from "./canvasStore.js";
3
+ /**
4
+ * Renderer acknowledgements are deliberately shorter than the companion's
5
+ * request timeout. A controller can therefore receive a useful partial-failure
6
+ * acknowledgement instead of waiting for the browser bridge to expire first.
7
+ */
8
+ export declare const DEFAULT_RENDERER_READY_TIMEOUT_MS = 4000;
9
+ export declare const MAX_RENDERER_READY_TIMEOUT_MS = 5000;
10
+ export declare const MAX_PRESENTATION_ROUTES: 64;
11
+ export declare const MAX_GROUP_LABEL_LENGTH: 160;
12
+ export type AgentRendererStatus = "unknown" | "pending" | "ready" | "error" | "timeout";
13
+ export interface AgentRendererReadiness {
14
+ allReady: boolean;
15
+ statuses: Record<string, AgentRendererStatus>;
16
+ readyCardIds: string[];
17
+ failedCardIds: string[];
18
+ timedOutCardIds: string[];
19
+ }
20
+ /** Direct callers may use URL strings; the shared command uses AgentRoute. */
21
+ export interface AgentPresentationRoute {
22
+ url: string;
23
+ title?: string | null;
24
+ label?: string;
25
+ }
26
+ export type AgentPresentationRouteInput = string | AgentPresentationRoute;
27
+ export interface PresentAgentComparisonGroupInput {
28
+ label: string;
29
+ routes?: readonly AgentPresentationRouteInput[];
30
+ /** Convenience spelling for direct browser callers. */
31
+ urls?: readonly string[];
32
+ /** Commands use an explicit group ID; direct calls may receive a generated ID. */
33
+ groupId?: string;
34
+ /** Internal pairing identity used to enforce remove-own semantics. */
35
+ agentId?: string;
36
+ readyTimeoutMs?: number;
37
+ }
38
+ export interface AgentComparisonGroupPresentation {
39
+ group: CanvasComparisonGroup;
40
+ cards: CanvasCard[];
41
+ readiness: AgentRendererReadiness;
42
+ }
43
+ export type AgentPresentationState = CanvasState;
44
+ export type AgentPresentationErrorCode = "not-development" | "workspace-locked" | "invalid-command" | "invalid-label" | "invalid-route" | "too-many-routes" | "group-not-found" | "group-id-conflict" | "not-group-owner" | "busy" | "not-paired" | "origin-mismatch" | "project-mismatch" | "token-mismatch" | "protocol-mismatch" | "renderer-timeout" | "renderer-error";
45
+ export declare class AgentPresentationError extends Error {
46
+ readonly code: AgentPresentationErrorCode;
47
+ constructor(code: AgentPresentationErrorCode, message: string);
48
+ }
49
+ /** Records the renderer acknowledgement for one newly presented card. */
50
+ export declare function acknowledgeAgentRendererReady(cardId: string): void;
51
+ /** Records a bounded, non-throwing renderer failure for one presented card. */
52
+ export declare function acknowledgeAgentRendererError(cardId: string, message?: string): void;
53
+ export declare function forgetAgentRendererReadiness(cardIds: readonly string[]): void;
54
+ export declare function waitForAgentRendererReadiness(cardIds: readonly string[], timeoutMs?: number): Promise<AgentRendererReadiness>;
55
+ /** Returns the compact state shape shared with the companion bridge. */
56
+ export declare function readCanvasState(): CanvasState;
57
+ export declare function presentAgentComparisonGroup(input: PresentAgentComparisonGroupInput): Promise<AgentComparisonGroupPresentation>;
58
+ export declare function focusAgentComparisonGroup(groupId: string, viewport?: {
59
+ width: number;
60
+ height: number;
61
+ }): AgentPresentationState;
62
+ export declare function fitAgentCanvas(viewport?: {
63
+ width: number;
64
+ height: number;
65
+ }): AgentPresentationState;
66
+ export declare function removeOwnAgentComparisonGroup(groupId: string, agentId?: string): AgentPresentationState;
67
+ /** The only command vocabulary accepted by the browser presentation adapter. */
68
+ export type AgentPresentationCommand = CanvasCommand;
69
+ export type AgentPresentationCommandResponse = CanvasCommandResult;
70
+ export interface AgentPresentationAdapterOptions {
71
+ projectId?: string;
72
+ /** Internal pairing identity used to enforce remove-own semantics. */
73
+ agentId?: string;
74
+ }
75
+ export interface AgentPresentationCommandPort {
76
+ /** Direct unit/host hook; it returns the shared acknowledgement body. */
77
+ execute(command: unknown): Promise<CanvasCommandResult>;
78
+ dispose(): void;
79
+ }
80
+ /**
81
+ * Creates the browser-controller adapter consumed by the inspector's
82
+ * CopyPromptButton. It does not install window events or define a second
83
+ * message protocol; callers pass the plain shared CanvasCommand they received.
84
+ */
85
+ export declare function createAgentPresentationAdapter(options?: AgentPresentationAdapterOptions): AgentPresentationCommandPort;
86
+ /** Clears presentation-only state between browser sessions and unit tests. */
87
+ export declare function resetAgentPresentationState(): void;
@@ -0,0 +1,421 @@
1
+ import { AGENT_PROTOCOL_LIMITS, isCanvasCommand, validateRoutes, } from "../../internal/agent-protocol.js";
2
+ import { isNudgeUiDev } from "../runtime/devFlag.js";
3
+ import { getNudgeUiRuntimeConfig } from "../runtime/runtimeConfig.js";
4
+ import { canWriteWorkspace } from "./workspaceLease.js";
5
+ import { appendCanvasComparisonGroup, fitAllCards, focusCard, focusCanvasCards, getCanvasCards, getCanvasComparisonGroup, getCanvasComparisonGroups, getCanvasMode, getFocusedCardId, removeCanvasComparisonGroup, setCanvasMode, } from "./canvasStore.js";
6
+ /**
7
+ * Renderer acknowledgements are deliberately shorter than the companion's
8
+ * request timeout. A controller can therefore receive a useful partial-failure
9
+ * acknowledgement instead of waiting for the browser bridge to expire first.
10
+ */
11
+ export const DEFAULT_RENDERER_READY_TIMEOUT_MS = 4_000;
12
+ export const MAX_RENDERER_READY_TIMEOUT_MS = 5_000;
13
+ export const MAX_PRESENTATION_ROUTES = AGENT_PROTOCOL_LIMITS.routeCount;
14
+ export const MAX_GROUP_LABEL_LENGTH = AGENT_PROTOCOL_LIMITS.label;
15
+ const DEFAULT_AGENT_ID = "agent";
16
+ export class AgentPresentationError extends Error {
17
+ code;
18
+ constructor(code, message) {
19
+ super(message);
20
+ this.name = "AgentPresentationError";
21
+ this.code = code;
22
+ }
23
+ }
24
+ const rendererReadiness = new Map();
25
+ const readinessWaiters = new Set();
26
+ let generatedGroupId = 0;
27
+ let activePresentation = false;
28
+ function currentProjectId() {
29
+ return getNudgeUiRuntimeConfig().projectId;
30
+ }
31
+ function isNonEmptyString(value) {
32
+ return typeof value === "string" && value.trim().length > 0;
33
+ }
34
+ function isRecord(value) {
35
+ return value !== null && typeof value === "object" && !Array.isArray(value);
36
+ }
37
+ function createGroupId() {
38
+ const randomId = typeof crypto !== "undefined" && typeof crypto.randomUUID === "function"
39
+ ? crypto.randomUUID()
40
+ : undefined;
41
+ if (randomId)
42
+ return `agent-group-${randomId}`;
43
+ generatedGroupId += 1;
44
+ return `agent-group-${generatedGroupId}`;
45
+ }
46
+ function validateLabel(value) {
47
+ if (!isNonEmptyString(value)) {
48
+ throw new AgentPresentationError("invalid-label", "A comparison group label is required.");
49
+ }
50
+ const label = value.trim();
51
+ if (label.length > MAX_GROUP_LABEL_LENGTH || /[\u0000-\u001f\u007f]/.test(label)) {
52
+ throw new AgentPresentationError("invalid-label", `Comparison group labels must be between 1 and ${MAX_GROUP_LABEL_LENGTH} printable characters.`);
53
+ }
54
+ return label;
55
+ }
56
+ function routeForValidation(value) {
57
+ if (typeof value === "string")
58
+ return { url: value };
59
+ if (!isRecord(value)) {
60
+ throw new AgentPresentationError("invalid-route", "Each comparison route must be a URL object.");
61
+ }
62
+ return value;
63
+ }
64
+ function normalizeRoutes(input) {
65
+ const rawRoutes = input.routes ?? input.urls;
66
+ if (!rawRoutes || rawRoutes.length === 0) {
67
+ throw new AgentPresentationError("invalid-route", "At least one comparison route is required.");
68
+ }
69
+ if (rawRoutes.length > MAX_PRESENTATION_ROUTES) {
70
+ throw new AgentPresentationError("too-many-routes", `A comparison group may contain at most ${MAX_PRESENTATION_ROUTES} routes.`);
71
+ }
72
+ try {
73
+ return validateRoutes(rawRoutes.map((route) => {
74
+ const candidate = routeForValidation(route);
75
+ return {
76
+ url: candidate.url,
77
+ ...(typeof candidate.title === "string" ? { title: candidate.title } : {}),
78
+ ...(typeof candidate.label === "string" ? { label: candidate.label } : {}),
79
+ };
80
+ }), window.location.origin);
81
+ }
82
+ catch (error) {
83
+ throw new AgentPresentationError("invalid-route", error instanceof Error ? error.message : "Comparison routes must be same-origin URLs.");
84
+ }
85
+ }
86
+ function ensureDevelopment() {
87
+ if (!isNudgeUiDev()) {
88
+ throw new AgentPresentationError("not-development", "Agent Canvas presentation is available only in development mode.");
89
+ }
90
+ }
91
+ function ensureWritable() {
92
+ if (!canWriteWorkspace()) {
93
+ throw new AgentPresentationError("workspace-locked", "The active browser controller does not own the Nudge workspace.");
94
+ }
95
+ }
96
+ function clampReadyTimeout(value) {
97
+ if (value === undefined)
98
+ return DEFAULT_RENDERER_READY_TIMEOUT_MS;
99
+ if (!Number.isFinite(value) || value < 0) {
100
+ throw new AgentPresentationError("invalid-command", "readyTimeoutMs must be a finite non-negative number.");
101
+ }
102
+ return Math.min(MAX_RENDERER_READY_TIMEOUT_MS, value);
103
+ }
104
+ function statusForCard(cardId) {
105
+ return rendererReadiness.get(cardId)?.status ?? "unknown";
106
+ }
107
+ function buildReadiness(cardIds) {
108
+ const statuses = {};
109
+ const readyCardIds = [];
110
+ const failedCardIds = [];
111
+ const timedOutCardIds = [];
112
+ for (const cardId of cardIds) {
113
+ const status = statusForCard(cardId);
114
+ statuses[cardId] = status;
115
+ if (status === "ready")
116
+ readyCardIds.push(cardId);
117
+ if (status === "error")
118
+ failedCardIds.push(cardId);
119
+ if (status === "timeout")
120
+ timedOutCardIds.push(cardId);
121
+ }
122
+ return {
123
+ allReady: cardIds.length > 0 && readyCardIds.length === cardIds.length,
124
+ statuses,
125
+ readyCardIds,
126
+ failedCardIds,
127
+ timedOutCardIds,
128
+ };
129
+ }
130
+ function isTerminalStatus(status) {
131
+ return status === "ready" || status === "error" || status === "timeout";
132
+ }
133
+ function settleReadinessWaiters() {
134
+ for (const waiter of [...readinessWaiters]) {
135
+ if (!waiter.cardIds.every((cardId) => isTerminalStatus(statusForCard(cardId))))
136
+ continue;
137
+ clearTimeout(waiter.timer);
138
+ readinessWaiters.delete(waiter);
139
+ waiter.resolve(buildReadiness(waiter.cardIds));
140
+ }
141
+ }
142
+ function beginRendererReadiness(cardIds) {
143
+ for (const cardId of cardIds)
144
+ rendererReadiness.set(cardId, { status: "pending" });
145
+ settleReadinessWaiters();
146
+ }
147
+ /** Records the renderer acknowledgement for one newly presented card. */
148
+ export function acknowledgeAgentRendererReady(cardId) {
149
+ if (!isNonEmptyString(cardId))
150
+ return;
151
+ rendererReadiness.set(cardId, { status: "ready" });
152
+ settleReadinessWaiters();
153
+ }
154
+ /** Records a bounded, non-throwing renderer failure for one presented card. */
155
+ export function acknowledgeAgentRendererError(cardId, message) {
156
+ if (!isNonEmptyString(cardId))
157
+ return;
158
+ rendererReadiness.set(cardId, { status: "error", message });
159
+ settleReadinessWaiters();
160
+ }
161
+ export function forgetAgentRendererReadiness(cardIds) {
162
+ for (const cardId of cardIds)
163
+ rendererReadiness.delete(cardId);
164
+ }
165
+ export function waitForAgentRendererReadiness(cardIds, timeoutMs = DEFAULT_RENDERER_READY_TIMEOUT_MS) {
166
+ const boundedTimeout = clampReadyTimeout(timeoutMs);
167
+ if (cardIds.length === 0)
168
+ return Promise.resolve(buildReadiness(cardIds));
169
+ if (cardIds.every((cardId) => isTerminalStatus(statusForCard(cardId)))) {
170
+ return Promise.resolve(buildReadiness(cardIds));
171
+ }
172
+ return new Promise((resolve) => {
173
+ const waiter = {
174
+ cardIds: [...cardIds],
175
+ resolve,
176
+ timer: setTimeout(() => {
177
+ for (const cardId of cardIds) {
178
+ if (statusForCard(cardId) === "pending" || statusForCard(cardId) === "unknown") {
179
+ rendererReadiness.set(cardId, { status: "timeout" });
180
+ }
181
+ }
182
+ readinessWaiters.delete(waiter);
183
+ resolve(buildReadiness(cardIds));
184
+ }, boundedTimeout),
185
+ };
186
+ readinessWaiters.add(waiter);
187
+ settleReadinessWaiters();
188
+ });
189
+ }
190
+ function toProtocolGroup(group) {
191
+ return {
192
+ id: group.id,
193
+ label: group.label,
194
+ owner: "agent",
195
+ routes: group.routes.map((route) => ({
196
+ url: route.url,
197
+ ...(route.title === undefined || route.title === null ? {} : { title: route.title }),
198
+ ...(route.label === undefined ? {} : { label: route.label }),
199
+ })),
200
+ };
201
+ }
202
+ /** Returns the compact state shape shared with the companion bridge. */
203
+ export function readCanvasState() {
204
+ const focusedCardId = getFocusedCardId();
205
+ const focusedCard = focusedCardId
206
+ ? getCanvasCards().find((card) => card.id === focusedCardId)
207
+ : undefined;
208
+ return {
209
+ mode: getCanvasMode(),
210
+ groups: getCanvasComparisonGroups().map(toProtocolGroup),
211
+ focusedGroupId: focusedCard?.comparisonGroupId ?? null,
212
+ focusedRouteUrl: focusedCard?.url ?? null,
213
+ };
214
+ }
215
+ export async function presentAgentComparisonGroup(input) {
216
+ ensureDevelopment();
217
+ ensureWritable();
218
+ if (activePresentation) {
219
+ throw new AgentPresentationError("busy", "Another Canvas presentation is still waiting for renderers.");
220
+ }
221
+ activePresentation = true;
222
+ try {
223
+ const label = validateLabel(input.label);
224
+ const routes = normalizeRoutes(input);
225
+ const agentId = input.agentId ?? DEFAULT_AGENT_ID;
226
+ if (!isNonEmptyString(agentId)) {
227
+ throw new AgentPresentationError("invalid-command", "An agent identity is required.");
228
+ }
229
+ const groupId = input.groupId ?? createGroupId();
230
+ if (!isNonEmptyString(groupId) || groupId.length > AGENT_PROTOCOL_LIMITS.groupId) {
231
+ throw new AgentPresentationError("invalid-command", "A comparison group ID is required.");
232
+ }
233
+ if (getCanvasComparisonGroup(groupId)) {
234
+ throw new AgentPresentationError("group-id-conflict", `Comparison group ${groupId} already exists.`);
235
+ }
236
+ const readyTimeoutMs = clampReadyTimeout(input.readyTimeoutMs);
237
+ // Opening Canvas for an agent group appends only the requested routes. It
238
+ // never creates or repositions the current Inspect route.
239
+ setCanvasMode("canvas");
240
+ const appended = appendCanvasComparisonGroup({
241
+ id: groupId,
242
+ label,
243
+ owner: "agent",
244
+ agentId,
245
+ routes: routes.map((route) => ({
246
+ url: route.url,
247
+ ...(route.title === undefined ? {} : { title: route.title }),
248
+ ...(route.label === undefined ? {} : { label: route.label }),
249
+ })),
250
+ });
251
+ if (!appended) {
252
+ throw new AgentPresentationError("group-id-conflict", `Comparison group ${groupId} already exists.`);
253
+ }
254
+ const cardIds = appended.cards.map((card) => card.id);
255
+ beginRendererReadiness(cardIds);
256
+ const readiness = await waitForAgentRendererReadiness(cardIds, readyTimeoutMs);
257
+ return { ...appended, readiness };
258
+ }
259
+ finally {
260
+ activePresentation = false;
261
+ }
262
+ }
263
+ function groupCards(groupId) {
264
+ const group = getCanvasComparisonGroup(groupId);
265
+ if (!group)
266
+ throw new AgentPresentationError("group-not-found", `Comparison group ${groupId} was not found.`);
267
+ const cardIds = new Set(group.cardIds);
268
+ const cards = getCanvasCards().filter((card) => cardIds.has(card.id));
269
+ if (cards.length === 0) {
270
+ throw new AgentPresentationError("group-not-found", `Comparison group ${groupId} has no cards.`);
271
+ }
272
+ return { group, cards };
273
+ }
274
+ export function focusAgentComparisonGroup(groupId, viewport) {
275
+ ensureDevelopment();
276
+ ensureWritable();
277
+ const { cards } = groupCards(groupId);
278
+ focusCard(cards[0].id);
279
+ focusCanvasCards(cards.map((card) => card.id), viewport);
280
+ return readCanvasState();
281
+ }
282
+ export function fitAgentCanvas(viewport) {
283
+ ensureDevelopment();
284
+ ensureWritable();
285
+ fitAllCards(viewport);
286
+ return readCanvasState();
287
+ }
288
+ export function removeOwnAgentComparisonGroup(groupId, agentId = DEFAULT_AGENT_ID) {
289
+ ensureDevelopment();
290
+ ensureWritable();
291
+ const group = getCanvasComparisonGroup(groupId);
292
+ if (!group)
293
+ throw new AgentPresentationError("group-not-found", `Comparison group ${groupId} was not found.`);
294
+ if (group.owner !== "agent" || group.agentId !== agentId) {
295
+ throw new AgentPresentationError("not-group-owner", `Agent ${agentId} cannot remove comparison group ${groupId}.`);
296
+ }
297
+ const cardIds = [...group.cardIds];
298
+ removeCanvasComparisonGroup(groupId);
299
+ forgetAgentRendererReadiness(cardIds);
300
+ return readCanvasState();
301
+ }
302
+ function commandIdFrom(value) {
303
+ if (isRecord(value) && typeof value.commandId === "string" && value.commandId.length > 0) {
304
+ return value.commandId;
305
+ }
306
+ return "unknown";
307
+ }
308
+ function asPresentationError(error) {
309
+ if (error instanceof AgentPresentationError)
310
+ return error;
311
+ return new AgentPresentationError("invalid-command", error instanceof Error ? error.message : "Invalid Canvas command.");
312
+ }
313
+ function failure(commandId, error) {
314
+ return {
315
+ commandId,
316
+ ok: false,
317
+ error: { code: error.code, message: error.message },
318
+ };
319
+ }
320
+ function parseCanvasCommand(value) {
321
+ if (!isCanvasCommand(value)) {
322
+ throw new AgentPresentationError("invalid-command", "The value is not a shared Canvas command.");
323
+ }
324
+ return value;
325
+ }
326
+ async function executeCanvasCommand(command, agentId) {
327
+ switch (command.type) {
328
+ case "read-state":
329
+ ensureDevelopment();
330
+ return { commandId: command.commandId, ok: true, state: readCanvasState() };
331
+ case "present-routes": {
332
+ const presentation = await presentAgentComparisonGroup({
333
+ groupId: command.groupId,
334
+ label: command.label,
335
+ routes: command.routes,
336
+ agentId,
337
+ });
338
+ const state = readCanvasState();
339
+ if (presentation.readiness.allReady) {
340
+ return {
341
+ commandId: command.commandId,
342
+ ok: true,
343
+ state,
344
+ group: toProtocolGroup(presentation.group),
345
+ };
346
+ }
347
+ const failed = presentation.readiness.failedCardIds.length > 0;
348
+ return {
349
+ commandId: command.commandId,
350
+ ok: false,
351
+ state,
352
+ group: toProtocolGroup(presentation.group),
353
+ error: {
354
+ code: failed ? "renderer-error" : "renderer-timeout",
355
+ message: failed
356
+ ? "One or more presented routes failed to become ready."
357
+ : "One or more presented routes did not become ready before the bounded timeout.",
358
+ },
359
+ };
360
+ }
361
+ case "focus-group":
362
+ return {
363
+ commandId: command.commandId,
364
+ ok: true,
365
+ state: focusAgentComparisonGroup(command.groupId),
366
+ };
367
+ case "fit-all":
368
+ return {
369
+ commandId: command.commandId,
370
+ ok: true,
371
+ state: fitAgentCanvas(),
372
+ };
373
+ case "remove-group":
374
+ return {
375
+ commandId: command.commandId,
376
+ ok: true,
377
+ state: removeOwnAgentComparisonGroup(command.groupId, agentId),
378
+ };
379
+ }
380
+ }
381
+ function credentialsFrom(options) {
382
+ return {
383
+ projectId: options.projectId ?? currentProjectId(),
384
+ agentId: options.agentId ?? DEFAULT_AGENT_ID,
385
+ };
386
+ }
387
+ /**
388
+ * Creates the browser-controller adapter consumed by the inspector's
389
+ * CopyPromptButton. It does not install window events or define a second
390
+ * message protocol; callers pass the plain shared CanvasCommand they received.
391
+ */
392
+ export function createAgentPresentationAdapter(options = {}) {
393
+ const credentials = credentialsFrom(options);
394
+ let disposed = false;
395
+ return {
396
+ async execute(command) {
397
+ const commandId = commandIdFrom(command);
398
+ try {
399
+ if (disposed)
400
+ throw new AgentPresentationError("invalid-command", "The Canvas command adapter is disposed.");
401
+ const parsed = parseCanvasCommand(command);
402
+ return await executeCanvasCommand(parsed, credentials.agentId);
403
+ }
404
+ catch (error) {
405
+ return failure(commandId, asPresentationError(error));
406
+ }
407
+ },
408
+ dispose() {
409
+ disposed = true;
410
+ },
411
+ };
412
+ }
413
+ /** Clears presentation-only state between browser sessions and unit tests. */
414
+ export function resetAgentPresentationState() {
415
+ for (const waiter of readinessWaiters)
416
+ clearTimeout(waiter.timer);
417
+ readinessWaiters.clear();
418
+ rendererReadiness.clear();
419
+ activePresentation = false;
420
+ generatedGroupId = 0;
421
+ }
@@ -0,0 +1,12 @@
1
+ import { type CanvasCamera } from "./canvasStore.js";
2
+ export declare const ZOOM_WHEEL_FACTOR = 1.02;
3
+ export interface ClientPoint {
4
+ x: number;
5
+ y: number;
6
+ }
7
+ export interface ClientRect {
8
+ left: number;
9
+ top: number;
10
+ }
11
+ export declare function zoomCameraAtPointer(camera: CanvasCamera, pointer: ClientPoint, boardRect: ClientRect, deltaY: number): CanvasCamera;
12
+ export declare function iframePointToClientPoint(iframeRect: ClientRect, point: ClientPoint, cameraZoom: number): ClientPoint;
@@ -0,0 +1,21 @@
1
+ import { MAX_CAMERA_ZOOM, MIN_CAMERA_ZOOM, } from "./canvasStore.js";
2
+ export const ZOOM_WHEEL_FACTOR = 1.02;
3
+ export function zoomCameraAtPointer(camera, pointer, boardRect, deltaY) {
4
+ const pointerX = pointer.x - boardRect.left;
5
+ const pointerY = pointer.y - boardRect.top;
6
+ const worldX = (pointerX - camera.x) / camera.zoom;
7
+ const worldY = (pointerY - camera.y) / camera.zoom;
8
+ const factor = deltaY < 0 ? ZOOM_WHEEL_FACTOR : 1 / ZOOM_WHEEL_FACTOR;
9
+ const zoom = Math.max(MIN_CAMERA_ZOOM, Math.min(MAX_CAMERA_ZOOM, camera.zoom * factor));
10
+ return {
11
+ x: pointerX - worldX * zoom,
12
+ y: pointerY - worldY * zoom,
13
+ zoom,
14
+ };
15
+ }
16
+ export function iframePointToClientPoint(iframeRect, point, cameraZoom) {
17
+ return {
18
+ x: iframeRect.left + point.x * cameraZoom,
19
+ y: iframeRect.top + point.y * cameraZoom,
20
+ };
21
+ }