@agent-native/core 0.105.0 → 0.106.1

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 (194) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +39 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/application-state/index.ts +2 -0
  5. package/corpus/core/src/application-state/script-helpers.ts +12 -0
  6. package/corpus/core/src/application-state/store.ts +38 -0
  7. package/corpus/core/src/client/AssistantChat.tsx +4 -0
  8. package/corpus/core/src/client/MultiTabAssistantChat.tsx +5 -1
  9. package/corpus/core/src/client/composer/PromptComposer.tsx +8 -0
  10. package/corpus/core/src/client/composer/TiptapComposer.tsx +38 -1
  11. package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +107 -32
  12. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +33 -0
  13. package/corpus/core/src/client/resources/use-mcp-servers.ts +1 -0
  14. package/corpus/core/src/client/review/ReviewCommentComposer.tsx +10 -3
  15. package/corpus/core/src/client/use-chat-models.ts +10 -2
  16. package/corpus/core/src/connections/catalog.ts +107 -6
  17. package/corpus/core/src/localization/default-messages.ts +2 -0
  18. package/corpus/core/src/mcp/actions/call-mcp-tool.ts +18 -0
  19. package/corpus/core/src/mcp/actions/list-mcp-tools.ts +18 -0
  20. package/corpus/core/src/mcp-client/app-api.ts +136 -0
  21. package/corpus/core/src/mcp-client/index.ts +21 -0
  22. package/corpus/core/src/mcp-client/oauth-client.ts +462 -0
  23. package/corpus/core/src/mcp-client/oauth-routes.ts +307 -0
  24. package/corpus/core/src/mcp-client/remote-store.ts +93 -118
  25. package/corpus/core/src/mcp-client/remote-url.ts +97 -0
  26. package/corpus/core/src/mcp-client/routes.ts +11 -0
  27. package/corpus/core/src/oauth-tokens/store.ts +10 -4
  28. package/corpus/core/src/provider-api/index.ts +690 -55
  29. package/corpus/core/src/secrets/register-framework-secrets.ts +30 -0
  30. package/corpus/core/src/server/action-discovery.ts +2 -0
  31. package/corpus/core/src/server/core-routes-plugin.ts +9 -1
  32. package/corpus/core/src/server/workspace-provider-oauth.ts +448 -61
  33. package/corpus/core/src/templates/default/AGENTS.md +9 -7
  34. package/corpus/core/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +46 -0
  35. package/corpus/templates/analytics/app/lib/data-source-status.ts +2 -0
  36. package/corpus/templates/analytics/app/pages/DataSources.tsx +61 -0
  37. package/corpus/templates/analytics/server/handlers/jira.ts +7 -0
  38. package/corpus/templates/analytics/server/lib/jira.ts +14 -42
  39. package/corpus/templates/analytics/server/routes/api/test-connection.post.ts +11 -0
  40. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +22 -0
  41. package/corpus/templates/design/AGENTS.md +16 -0
  42. package/corpus/templates/design/actions/cancel-node-rewrite-request.ts +54 -0
  43. package/corpus/templates/design/actions/propose-node-rewrite.ts +290 -0
  44. package/corpus/templates/design/actions/resolve-node-rewrite.ts +257 -0
  45. package/corpus/templates/design/actions/view-screen.ts +98 -2
  46. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +71 -1
  47. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +19 -0
  48. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +33 -0
  49. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +194 -0
  50. package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +21 -4
  51. package/corpus/templates/design/app/components/design/design-canvas/iframe-events.ts +18 -0
  52. package/corpus/templates/design/app/components/design/multi-screen/types.ts +4 -0
  53. package/corpus/templates/design/app/components/visual-editor/NodeRewriteProposal.tsx +638 -0
  54. package/corpus/templates/design/app/components/visual-editor/ReviewCanvasPins.tsx +535 -54
  55. package/corpus/templates/design/app/components/visual-editor/index.ts +5 -1
  56. package/corpus/templates/design/app/components/visual-editor/review-canvas-state.ts +21 -3
  57. package/corpus/templates/design/app/i18n/ar-SA.ts +35 -0
  58. package/corpus/templates/design/app/i18n/de-DE.ts +35 -0
  59. package/corpus/templates/design/app/i18n/es-ES.ts +35 -0
  60. package/corpus/templates/design/app/i18n/fr-FR.ts +35 -0
  61. package/corpus/templates/design/app/i18n/hi-IN.ts +35 -0
  62. package/corpus/templates/design/app/i18n/ja-JP.ts +35 -0
  63. package/corpus/templates/design/app/i18n/ko-KR.ts +35 -0
  64. package/corpus/templates/design/app/i18n/pt-BR.ts +35 -0
  65. package/corpus/templates/design/app/i18n/zh-CN.ts +35 -0
  66. package/corpus/templates/design/app/i18n/zh-TW.ts +32 -0
  67. package/corpus/templates/design/app/i18n-data.ts +32 -0
  68. package/corpus/templates/design/app/lib/node-reprompt.ts +110 -0
  69. package/corpus/templates/design/changelog/2026-07-16-design-editing-and-review-are-now-more-predictable.md +6 -0
  70. package/corpus/templates/design/server/lib/reprompt-action-guard.ts +107 -0
  71. package/corpus/templates/design/server/plugins/agent-chat.ts +9 -1
  72. package/corpus/templates/design/shared/code-layer.ts +15 -0
  73. package/corpus/templates/design/shared/node-rewrite.ts +213 -0
  74. package/corpus/templates/design/shared/review-anchor.ts +26 -3
  75. package/corpus/templates/dispatch/app/routes/integrations.tsx +57 -4
  76. package/dist/application-state/index.d.ts +2 -2
  77. package/dist/application-state/index.d.ts.map +1 -1
  78. package/dist/application-state/index.js +2 -2
  79. package/dist/application-state/index.js.map +1 -1
  80. package/dist/application-state/script-helpers.d.ts +1 -0
  81. package/dist/application-state/script-helpers.d.ts.map +1 -1
  82. package/dist/application-state/script-helpers.js +7 -1
  83. package/dist/application-state/script-helpers.js.map +1 -1
  84. package/dist/application-state/store.d.ts +1 -0
  85. package/dist/application-state/store.d.ts.map +1 -1
  86. package/dist/application-state/store.js +28 -0
  87. package/dist/application-state/store.js.map +1 -1
  88. package/dist/client/AssistantChat.d.ts +2 -0
  89. package/dist/client/AssistantChat.d.ts.map +1 -1
  90. package/dist/client/AssistantChat.js +2 -2
  91. package/dist/client/AssistantChat.js.map +1 -1
  92. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  93. package/dist/client/MultiTabAssistantChat.js +5 -2
  94. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  95. package/dist/client/composer/PromptComposer.d.ts +2 -0
  96. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  97. package/dist/client/composer/PromptComposer.js +5 -2
  98. package/dist/client/composer/PromptComposer.js.map +1 -1
  99. package/dist/client/composer/TiptapComposer.d.ts +4 -1
  100. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  101. package/dist/client/composer/TiptapComposer.js +13 -5
  102. package/dist/client/composer/TiptapComposer.js.map +1 -1
  103. package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
  104. package/dist/client/resources/McpIntegrationDialog.js +58 -14
  105. package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
  106. package/dist/client/resources/mcp-integration-catalog.d.ts +9 -0
  107. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  108. package/dist/client/resources/mcp-integration-catalog.js +13 -0
  109. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  110. package/dist/client/resources/use-mcp-servers.d.ts +1 -0
  111. package/dist/client/resources/use-mcp-servers.d.ts.map +1 -1
  112. package/dist/client/resources/use-mcp-servers.js.map +1 -1
  113. package/dist/client/review/ReviewCommentComposer.d.ts +4 -1
  114. package/dist/client/review/ReviewCommentComposer.d.ts.map +1 -1
  115. package/dist/client/review/ReviewCommentComposer.js +3 -3
  116. package/dist/client/review/ReviewCommentComposer.js.map +1 -1
  117. package/dist/client/use-chat-models.d.ts +1 -0
  118. package/dist/client/use-chat-models.d.ts.map +1 -1
  119. package/dist/client/use-chat-models.js +8 -2
  120. package/dist/client/use-chat-models.js.map +1 -1
  121. package/dist/collab/struct-routes.d.ts +1 -1
  122. package/dist/connections/catalog.d.ts +78 -7
  123. package/dist/connections/catalog.d.ts.map +1 -1
  124. package/dist/connections/catalog.js +97 -6
  125. package/dist/connections/catalog.js.map +1 -1
  126. package/dist/localization/default-messages.d.ts +2 -0
  127. package/dist/localization/default-messages.d.ts.map +1 -1
  128. package/dist/localization/default-messages.js +2 -0
  129. package/dist/localization/default-messages.js.map +1 -1
  130. package/dist/mcp/actions/call-mcp-tool.d.ts +7 -0
  131. package/dist/mcp/actions/call-mcp-tool.d.ts.map +1 -0
  132. package/dist/mcp/actions/call-mcp-tool.js +15 -0
  133. package/dist/mcp/actions/call-mcp-tool.js.map +1 -0
  134. package/dist/mcp/actions/list-mcp-tools.d.ts +5 -0
  135. package/dist/mcp/actions/list-mcp-tools.d.ts.map +1 -0
  136. package/dist/mcp/actions/list-mcp-tools.js +16 -0
  137. package/dist/mcp/actions/list-mcp-tools.js.map +1 -0
  138. package/dist/mcp-client/app-api.d.ts +34 -0
  139. package/dist/mcp-client/app-api.d.ts.map +1 -0
  140. package/dist/mcp-client/app-api.js +94 -0
  141. package/dist/mcp-client/app-api.js.map +1 -0
  142. package/dist/mcp-client/index.d.ts +3 -1
  143. package/dist/mcp-client/index.d.ts.map +1 -1
  144. package/dist/mcp-client/index.js +3 -1
  145. package/dist/mcp-client/index.js.map +1 -1
  146. package/dist/mcp-client/oauth-client.d.ts +113 -0
  147. package/dist/mcp-client/oauth-client.d.ts.map +1 -0
  148. package/dist/mcp-client/oauth-client.js +316 -0
  149. package/dist/mcp-client/oauth-client.js.map +1 -0
  150. package/dist/mcp-client/oauth-routes.d.ts +25 -0
  151. package/dist/mcp-client/oauth-routes.d.ts.map +1 -0
  152. package/dist/mcp-client/oauth-routes.js +218 -0
  153. package/dist/mcp-client/oauth-routes.js.map +1 -0
  154. package/dist/mcp-client/remote-store.d.ts +21 -6
  155. package/dist/mcp-client/remote-store.d.ts.map +1 -1
  156. package/dist/mcp-client/remote-store.js +72 -124
  157. package/dist/mcp-client/remote-store.js.map +1 -1
  158. package/dist/mcp-client/remote-url.d.ts +8 -0
  159. package/dist/mcp-client/remote-url.d.ts.map +1 -0
  160. package/dist/mcp-client/remote-url.js +103 -0
  161. package/dist/mcp-client/remote-url.js.map +1 -0
  162. package/dist/mcp-client/routes.d.ts +1 -0
  163. package/dist/mcp-client/routes.d.ts.map +1 -1
  164. package/dist/mcp-client/routes.js +9 -0
  165. package/dist/mcp-client/routes.js.map +1 -1
  166. package/dist/notifications/routes.d.ts +2 -2
  167. package/dist/oauth-tokens/store.d.ts +2 -2
  168. package/dist/oauth-tokens/store.d.ts.map +1 -1
  169. package/dist/oauth-tokens/store.js +10 -6
  170. package/dist/oauth-tokens/store.js.map +1 -1
  171. package/dist/observability/routes.d.ts +5 -5
  172. package/dist/provider-api/index.d.ts +14 -0
  173. package/dist/provider-api/index.d.ts.map +1 -1
  174. package/dist/provider-api/index.js +499 -61
  175. package/dist/provider-api/index.js.map +1 -1
  176. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  177. package/dist/secrets/register-framework-secrets.js +28 -0
  178. package/dist/secrets/register-framework-secrets.js.map +1 -1
  179. package/dist/secrets/routes.d.ts +9 -9
  180. package/dist/server/action-discovery.d.ts.map +1 -1
  181. package/dist/server/action-discovery.js +2 -0
  182. package/dist/server/action-discovery.js.map +1 -1
  183. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  184. package/dist/server/core-routes-plugin.js +9 -1
  185. package/dist/server/core-routes-plugin.js.map +1 -1
  186. package/dist/server/workspace-provider-oauth.d.ts +10 -3
  187. package/dist/server/workspace-provider-oauth.d.ts.map +1 -1
  188. package/dist/server/workspace-provider-oauth.js +325 -43
  189. package/dist/server/workspace-provider-oauth.js.map +1 -1
  190. package/dist/templates/default/AGENTS.md +9 -7
  191. package/dist/templates/workspace-core/.agents/skills/external-agents/SKILL.md +46 -0
  192. package/package.json +2 -2
  193. package/src/templates/default/AGENTS.md +9 -7
  194. package/src/templates/workspace-core/.agents/skills/external-agents/SKILL.md +46 -0
@@ -2168,6 +2168,17 @@ declare var __RUNTIME_LAYER_SNAPSHOT_ENABLED__: boolean;
2168
2168
 
2169
2169
  var selectedEl: Element | null = null;
2170
2170
  var hoveredEl: Element | null = null;
2171
+ type NodeHtmlPreviewSession = {
2172
+ proposalId: string;
2173
+ originalElement: Element;
2174
+ originalOuterHTML: string;
2175
+ startMarker: Comment;
2176
+ endMarker: Comment;
2177
+ currentElement: Element;
2178
+ selectedWasInside: boolean;
2179
+ hoveredWasInside: boolean;
2180
+ };
2181
+ var activeNodeHtmlPreview: NodeHtmlPreviewSession | null = null;
2171
2182
  // Last element an "element-hover" message was actually posted for. Lets
2172
2183
  // the shield's pointermove handler skip getLightElementInfo's two
2173
2184
  // getComputedStyle calls plus the postMessage on every one of the dozens
@@ -5120,6 +5131,178 @@ declare var __RUNTIME_LAYER_SNAPSHOT_ENABLED__: boolean;
5120
5131
  return null;
5121
5132
  }
5122
5133
 
5134
+ function parseNodeHtmlPreviewElement(html: string): Element | null {
5135
+ var trimmed = html.trim();
5136
+ if (/^<body(?:\s|>)/i.test(trimmed)) {
5137
+ var parsedDocument = new DOMParser().parseFromString(
5138
+ "<!doctype html><html><head></head>" + trimmed + "</html>", // i18n-ignore parser scaffold
5139
+ "text/html",
5140
+ );
5141
+ return parsedDocument.body;
5142
+ }
5143
+ var template = document.createElement("template");
5144
+ template.innerHTML = html;
5145
+ var element = template.content.firstElementChild;
5146
+ if (!element || template.content.childElementCount !== 1) return null;
5147
+ for (
5148
+ var child = template.content.firstChild;
5149
+ child;
5150
+ child = child.nextSibling
5151
+ ) {
5152
+ if (child === element) continue;
5153
+ if (child.nodeType !== 3 || String(child.textContent || "").trim()) {
5154
+ return null;
5155
+ }
5156
+ }
5157
+ return element;
5158
+ }
5159
+
5160
+ function resolveNodeHtmlPreviewTarget(target: unknown): Element | null {
5161
+ if (!target || typeof target !== "object") return null;
5162
+ var nodeId = (target as { nodeId?: unknown }).nodeId;
5163
+ if (typeof nodeId === "string" && nodeId) {
5164
+ try {
5165
+ var nodeMatch = document.querySelector(
5166
+ '[data-agent-native-node-id="' + escapeAttribute(nodeId) + '"]',
5167
+ );
5168
+ if (nodeMatch && !isLayerInteractionBlocked(nodeMatch)) {
5169
+ return nodeMatch;
5170
+ }
5171
+ } catch (_err) {}
5172
+ }
5173
+ var selector = (target as { selector?: unknown }).selector;
5174
+ if (typeof selector !== "string" || !selector) return null;
5175
+ try {
5176
+ var selectorMatch = document.querySelector(selector);
5177
+ return selectorMatch && !isLayerInteractionBlocked(selectorMatch)
5178
+ ? selectorMatch
5179
+ : null;
5180
+ } catch (_err) {
5181
+ return null;
5182
+ }
5183
+ }
5184
+
5185
+ function postNodeHtmlPreviewApplied(proposalId: string): void {
5186
+ (window.parent as Window).postMessage(
5187
+ {
5188
+ type: "agent-native:node-html-preview-applied",
5189
+ proposalId: proposalId,
5190
+ },
5191
+ "*",
5192
+ );
5193
+ }
5194
+
5195
+ function replaceNodeHtmlPreviewElement(
5196
+ session: NodeHtmlPreviewSession,
5197
+ nextElement: Element,
5198
+ ): boolean {
5199
+ var parent = session.startMarker.parentNode;
5200
+ if (!parent || session.endMarker.parentNode !== parent) return false;
5201
+ var cursor = session.startMarker.nextSibling;
5202
+ while (cursor && cursor !== session.endMarker) {
5203
+ var next = cursor.nextSibling;
5204
+ parent.removeChild(cursor);
5205
+ cursor = next;
5206
+ }
5207
+ if (cursor !== session.endMarker) return false;
5208
+ nextElement.setAttribute(
5209
+ "data-agent-native-node-rewrite-proposal",
5210
+ session.proposalId,
5211
+ );
5212
+ parent.insertBefore(nextElement, session.endMarker);
5213
+ session.currentElement = nextElement;
5214
+ if (session.selectedWasInside) selectedEl = nextElement;
5215
+ if (session.hoveredWasInside) hoveredEl = nextElement;
5216
+ refreshOverlays();
5217
+ return true;
5218
+ }
5219
+
5220
+ function restoreActiveNodeHtmlPreview(proposalId?: string): boolean {
5221
+ var session = activeNodeHtmlPreview;
5222
+ if (!session || (proposalId && session.proposalId !== proposalId)) {
5223
+ return false;
5224
+ }
5225
+ activeNodeHtmlPreview = null;
5226
+ var parent = session.startMarker.parentNode;
5227
+ if (!parent || session.endMarker.parentNode !== parent) return false;
5228
+ var cursor = session.startMarker.nextSibling;
5229
+ while (cursor && cursor !== session.endMarker) {
5230
+ var next = cursor.nextSibling;
5231
+ parent.removeChild(cursor);
5232
+ cursor = next;
5233
+ }
5234
+ if (cursor !== session.endMarker) return false;
5235
+ parent.insertBefore(session.originalElement, session.endMarker);
5236
+ parent.removeChild(session.startMarker);
5237
+ parent.removeChild(session.endMarker);
5238
+ if (session.selectedWasInside) selectedEl = session.originalElement;
5239
+ if (session.hoveredWasInside) hoveredEl = session.originalElement;
5240
+ refreshOverlays();
5241
+ return session.originalElement.outerHTML === session.originalOuterHTML;
5242
+ }
5243
+
5244
+ function applyNodeHtmlPreview(data: {
5245
+ proposalId?: unknown;
5246
+ target?: unknown;
5247
+ html?: unknown;
5248
+ }): void {
5249
+ var proposalId = data.proposalId;
5250
+ if (
5251
+ typeof proposalId !== "string" ||
5252
+ !proposalId ||
5253
+ typeof data.html !== "string"
5254
+ ) {
5255
+ return;
5256
+ }
5257
+ var nextElement = parseNodeHtmlPreviewElement(data.html);
5258
+ if (!nextElement) return;
5259
+ if (
5260
+ activeNodeHtmlPreview &&
5261
+ activeNodeHtmlPreview.proposalId === proposalId
5262
+ ) {
5263
+ if (replaceNodeHtmlPreviewElement(activeNodeHtmlPreview, nextElement)) {
5264
+ postNodeHtmlPreviewApplied(proposalId);
5265
+ }
5266
+ return;
5267
+ }
5268
+ if (activeNodeHtmlPreview) restoreActiveNodeHtmlPreview();
5269
+ var target = resolveNodeHtmlPreviewTarget(data.target);
5270
+ if (!target || !target.parentNode || target === document.documentElement) {
5271
+ return;
5272
+ }
5273
+ var originalOuterHTML = target.outerHTML;
5274
+ nextElement.setAttribute(
5275
+ "data-agent-native-node-rewrite-proposal",
5276
+ proposalId,
5277
+ );
5278
+ var startMarker = document.createComment(
5279
+ "agent-native:node-html-preview:start",
5280
+ );
5281
+ var endMarker = document.createComment(
5282
+ "agent-native:node-html-preview:end",
5283
+ );
5284
+ var parent = target.parentNode;
5285
+ var selectedWasInside = !!selectedEl && target.contains(selectedEl);
5286
+ var hoveredWasInside = !!hoveredEl && target.contains(hoveredEl);
5287
+ parent.insertBefore(startMarker, target);
5288
+ parent.insertBefore(endMarker, target.nextSibling);
5289
+ parent.replaceChild(nextElement, target);
5290
+ activeNodeHtmlPreview = {
5291
+ proposalId: proposalId,
5292
+ originalElement: target,
5293
+ originalOuterHTML: originalOuterHTML,
5294
+ startMarker: startMarker,
5295
+ endMarker: endMarker,
5296
+ currentElement: nextElement,
5297
+ selectedWasInside: selectedWasInside,
5298
+ hoveredWasInside: hoveredWasInside,
5299
+ };
5300
+ if (selectedWasInside) selectedEl = nextElement;
5301
+ if (hoveredWasInside) hoveredEl = nextElement;
5302
+ refreshOverlays();
5303
+ postNodeHtmlPreviewApplied(proposalId);
5304
+ }
5305
+
5123
5306
  // Host-driven Layers-panel moves must never inherit findRuntimeTarget's
5124
5307
  // selected-element shortcut or first-match querySelector behavior. Runtime
5125
5308
  // React trees routinely repeat classes and component markup, so a selector
@@ -11070,6 +11253,7 @@ declare var __RUNTIME_LAYER_SNAPSHOT_ENABLED__: boolean;
11070
11253
  return;
11071
11254
  }
11072
11255
  if (e.data.type === "replace-document-content") {
11256
+ activeNodeHtmlPreview = null;
11073
11257
  replaceRuntimeDocument(
11074
11258
  e.data.content,
11075
11259
  e.data.forceFullDocument ? "" : e.data.selectedSelector,
@@ -11079,6 +11263,16 @@ declare var __RUNTIME_LAYER_SNAPSHOT_ENABLED__: boolean;
11079
11263
  );
11080
11264
  return;
11081
11265
  }
11266
+ if (e.data.type === "node-html-preview") {
11267
+ if (e.data.operation === "restore") {
11268
+ if (typeof e.data.proposalId === "string") {
11269
+ restoreActiveNodeHtmlPreview(e.data.proposalId);
11270
+ }
11271
+ } else if (e.data.operation === "preview") {
11272
+ applyNodeHtmlPreview(e.data);
11273
+ }
11274
+ return;
11275
+ }
11082
11276
  if (e.data.type === "delete-element") {
11083
11277
  removeRuntimeTarget(e.data.selector, e.data.selectorCandidates);
11084
11278
  return;
@@ -739,9 +739,20 @@
739
739
  ): Element | null {
740
740
  var element = elementFromEditorPoint(clientX, clientY);
741
741
  if (!element) return null;
742
- return element.closest(
742
+ var identifiedAncestor = element.closest(
743
743
  "[data-agent-native-node-id],[data-code-layer-id],[data-layer-id],[data-builder-id],[id]",
744
744
  );
745
+ if (
746
+ identifiedAncestor &&
747
+ identifiedAncestor !== document.body &&
748
+ identifiedAncestor !== document.documentElement
749
+ ) {
750
+ return identifiedAncestor;
751
+ }
752
+ if (element === document.body || element === document.documentElement) {
753
+ return null;
754
+ }
755
+ return element;
745
756
  }
746
757
 
747
758
  function reviewNodeElements(nodeIds: string[]): Record<string, Element> {
@@ -808,14 +819,20 @@
808
819
  reviewPointX,
809
820
  reviewPointY,
810
821
  );
822
+ var reviewPointNodeId = reviewPointElement
823
+ ? getNodeId(reviewPointElement)
824
+ : "";
825
+ var reviewPointSelector =
826
+ reviewPointElement && !reviewPointNodeId
827
+ ? buildSourceEquivalentSelector(reviewPointElement)
828
+ : "";
811
829
  try {
812
830
  (window.parent as Window).postMessage(
813
831
  {
814
832
  type: "agent-native:review-anchor-at-point-result",
815
833
  correlationId: reviewPointCorrelationId,
816
- nodeId: reviewPointElement
817
- ? getNodeId(reviewPointElement) || undefined
818
- : undefined,
834
+ nodeId: reviewPointNodeId || undefined,
835
+ targetSelector: reviewPointSelector || undefined,
819
836
  layerName:
820
837
  reviewPointElement?.getAttribute(
821
838
  "data-agent-native-layer-name",
@@ -23,3 +23,21 @@ export interface IframeContextMenuPayload {
23
23
  info?: ElementInfo | null;
24
24
  layerCandidates?: CanvasLayerHitCandidate[];
25
25
  }
26
+
27
+ export interface IframeNodeHtmlPreviewTarget {
28
+ nodeId?: string;
29
+ selector?: string;
30
+ }
31
+
32
+ export interface IframeNodeHtmlPreviewMessage {
33
+ type: "node-html-preview";
34
+ proposalId: string;
35
+ target: IframeNodeHtmlPreviewTarget;
36
+ operation: "preview" | "restore";
37
+ html?: string;
38
+ }
39
+
40
+ export interface IframeNodeHtmlPreviewAppliedPayload {
41
+ type: "agent-native:node-html-preview-applied";
42
+ proposalId: string;
43
+ }
@@ -130,6 +130,10 @@ export interface MultiScreenCanvasProps {
130
130
  * transformed directly from the overview canvas. */
131
131
  lockedScreenIds?: ReadonlySet<string> | readonly string[];
132
132
  fullViewScreenIds?: string[];
133
+ /** Screens with generated candidates waiting for explicit review. */
134
+ pendingReviewScreenIds?: ReadonlySet<string> | readonly string[];
135
+ /** Opens candidate review for one pending screen. */
136
+ onReviewPendingScreen?: (screenId: string) => void;
133
137
  /** Lets every live frame receive native pointer interaction while the
134
138
  * overview camera and frame chrome remain available. */
135
139
  interactMode?: boolean;