@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
@@ -1,4 +1,8 @@
1
1
  export { SaveStatusIndicator } from "./SaveStatusIndicator";
2
2
  export { DrawOverlay, type DrawAnnotation } from "./DrawOverlay";
3
3
  export { CanvasCommentPins, type CanvasPin } from "./CanvasCommentPins";
4
- export { ReviewCanvasPins, type ReviewFocusRequest } from "./ReviewCanvasPins";
4
+ export {
5
+ ReviewCanvasPins,
6
+ type RepromptDraftRequest,
7
+ type ReviewFocusRequest,
8
+ } from "./ReviewCanvasPins";
@@ -1,8 +1,26 @@
1
- import type {
2
- DesignReviewAnchor,
3
- ReviewAnchorPoint,
1
+ import {
2
+ parseReviewAnchor,
3
+ type DesignReviewAnchor,
4
+ type ReviewAnchorPoint,
4
5
  } from "../../../shared/review-anchor";
5
6
 
7
+ export interface ReviewPinPosition {
8
+ point: ReviewAnchorPoint;
9
+ source: "node" | "selector" | "point";
10
+ }
11
+
12
+ // Layer identity enriches the comment; the point remains user-authored.
13
+ export function getReviewPinPosition(
14
+ anchor: unknown,
15
+ ): ReviewPinPosition | null {
16
+ const parsed = parseReviewAnchor(anchor);
17
+ if (!parsed) return null;
18
+ return {
19
+ point: parsed.point,
20
+ source: parsed.nodeId ? "node" : parsed.selector ? "selector" : "point",
21
+ };
22
+ }
23
+
6
24
  export interface ReviewDraftPin {
7
25
  id: string;
8
26
  anchor: DesignReviewAnchor;
@@ -2,6 +2,41 @@ import { messagesByLocale } from "../i18n-data";
2
2
 
3
3
  const messages = {
4
4
  ...messagesByLocale["ar-SA"],
5
+ designEditor: {
6
+ ...messagesByLocale["ar-SA"].designEditor,
7
+ nodeRewrite: {
8
+ composerTitle: "اسأل عن التحديد أو غيّره",
9
+ send: "إرسال",
10
+ autoHint: "صِف تغييرًا أو اطرح سؤالًا",
11
+ willPreview: "سيعرض التغييرات لموافقتك",
12
+ willAsk: "سيسأل الوكيل دون تغيير التصميم",
13
+ modeAuto: "تلقائي",
14
+ modePreview: "معاينة التغيير",
15
+ modeAsk: "اسأل الوكيل",
16
+ modeRegenerate: "إعادة الإنشاء",
17
+ agentModeOptions: "اختيار سلوك الوكيل",
18
+ pendingReview: "مراجعة التغييرات · {{count}}",
19
+ pendingReviewMenu: "تغييرات جاهزة للمراجعة",
20
+ reviewCandidate: "مراجعة التغيير",
21
+ regenerate: "إعادة الإنشاء…",
22
+ sending: "جارٍ إعادة الإنشاء…",
23
+ sent: "تم إرسال طلب إعادة الإنشاء",
24
+ sendFailed: "تعذّر إرسال طلب إعادة الإنشاء",
25
+ previewTitle: "التحديد المعاد إنشاؤه",
26
+ variants: "بدائل إعادة الإنشاء",
27
+ variantNumber: "البديل {{count}}: {{summary}}",
28
+ candidatePosition: "{{current}} من {{total}}",
29
+ previousCandidate: "النتيجة السابقة",
30
+ nextCandidate: "النتيجة التالية",
31
+ refinePlaceholder: "حسّن هذه النتيجة…",
32
+ refine: "تحسين النتيجة",
33
+ refinementSent: "تم إرسال التحسين",
34
+ refinementFailed: "تعذّر إرسال التحسين",
35
+ accept: "قبول",
36
+ reject: "رفض",
37
+ resolveFailed: "تعذّر حسم هذا الاقتراح",
38
+ },
39
+ },
5
40
  review: {
6
41
  comments: "التعليقات",
7
42
  commentsTab: "التعليقات · {{count}}",
@@ -2,6 +2,41 @@ import { messagesByLocale } from "../i18n-data";
2
2
 
3
3
  const messages = {
4
4
  ...messagesByLocale["de-DE"],
5
+ designEditor: {
6
+ ...messagesByLocale["de-DE"].designEditor,
7
+ nodeRewrite: {
8
+ composerTitle: "Auswahl fragen oder ändern",
9
+ send: "Senden",
10
+ autoHint: "Beschreibe eine Änderung oder stelle eine Frage",
11
+ willPreview: "Zeigt Änderungen zur Freigabe als Vorschau",
12
+ willAsk: "Fragt den Agenten, ohne das Design zu ändern",
13
+ modeAuto: "Automatisch",
14
+ modePreview: "Änderungsvorschau",
15
+ modeAsk: "Agenten fragen",
16
+ modeRegenerate: "Neu generieren",
17
+ agentModeOptions: "Agentenverhalten auswählen",
18
+ pendingReview: "Änderungen prüfen · {{count}}",
19
+ pendingReviewMenu: "Änderungen zur Prüfung bereit",
20
+ reviewCandidate: "Änderung prüfen",
21
+ regenerate: "Neu generieren…",
22
+ sending: "Wird neu generiert…",
23
+ sent: "Anfrage zur Neugenerierung gesendet",
24
+ sendFailed: "Anfrage zur Neugenerierung konnte nicht gesendet werden",
25
+ previewTitle: "Neu generierte Auswahl",
26
+ variants: "Varianten der Neugenerierung",
27
+ variantNumber: "Variante {{count}}: {{summary}}",
28
+ candidatePosition: "{{current}} von {{total}}",
29
+ previousCandidate: "Vorheriges Ergebnis",
30
+ nextCandidate: "Nächstes Ergebnis",
31
+ refinePlaceholder: "Dieses Ergebnis verfeinern…",
32
+ refine: "Ergebnis verfeinern",
33
+ refinementSent: "Verfeinerung gesendet",
34
+ refinementFailed: "Verfeinerung konnte nicht gesendet werden",
35
+ accept: "Übernehmen",
36
+ reject: "Verwerfen",
37
+ resolveFailed: "Dieser Vorschlag konnte nicht aufgelöst werden",
38
+ },
39
+ },
5
40
  review: {
6
41
  comments: "Kommentare",
7
42
  commentsTab: "Kommentare · {{count}}",
@@ -2,6 +2,41 @@ import { messagesByLocale } from "../i18n-data";
2
2
 
3
3
  const messages = {
4
4
  ...messagesByLocale["es-ES"],
5
+ designEditor: {
6
+ ...messagesByLocale["es-ES"].designEditor,
7
+ nodeRewrite: {
8
+ composerTitle: "Pregunta o cambia la selección",
9
+ send: "Enviar",
10
+ autoHint: "Describe un cambio o haz una pregunta",
11
+ willPreview: "Mostrará una vista previa para que la apruebes",
12
+ willAsk: "Preguntará al agente sin cambiar el diseño",
13
+ modeAuto: "Automático",
14
+ modePreview: "Vista previa del cambio",
15
+ modeAsk: "Preguntar al agente",
16
+ modeRegenerate: "Regenerar",
17
+ agentModeOptions: "Elegir el comportamiento del agente",
18
+ pendingReview: "Revisar cambios · {{count}}",
19
+ pendingReviewMenu: "Cambios listos para revisar",
20
+ reviewCandidate: "Revisar cambio",
21
+ regenerate: "Regenerar…",
22
+ sending: "Regenerando…",
23
+ sent: "Solicitud de regeneración enviada",
24
+ sendFailed: "No se pudo enviar la solicitud de regeneración",
25
+ previewTitle: "Selección regenerada",
26
+ variants: "Variantes regeneradas",
27
+ variantNumber: "Variante {{count}}: {{summary}}",
28
+ candidatePosition: "{{current}} de {{total}}",
29
+ previousCandidate: "Resultado anterior",
30
+ nextCandidate: "Resultado siguiente",
31
+ refinePlaceholder: "Refinar este resultado…",
32
+ refine: "Refinar resultado",
33
+ refinementSent: "Refinamiento enviado",
34
+ refinementFailed: "No se pudo enviar el refinamiento",
35
+ accept: "Aceptar",
36
+ reject: "Rechazar",
37
+ resolveFailed: "No se pudo resolver esta propuesta",
38
+ },
39
+ },
5
40
  review: {
6
41
  comments: "Comentarios",
7
42
  commentsTab: "Comentarios · {{count}}",
@@ -2,6 +2,41 @@ import { messagesByLocale } from "../i18n-data";
2
2
 
3
3
  const messages = {
4
4
  ...messagesByLocale["fr-FR"],
5
+ designEditor: {
6
+ ...messagesByLocale["fr-FR"].designEditor,
7
+ nodeRewrite: {
8
+ composerTitle: "Questionner ou modifier la sélection",
9
+ send: "Envoyer",
10
+ autoHint: "Décrivez un changement ou posez une question",
11
+ willPreview: "Affichera un aperçu à valider",
12
+ willAsk: "Interrogera l’agent sans modifier le design",
13
+ modeAuto: "Auto",
14
+ modePreview: "Aperçu du changement",
15
+ modeAsk: "Interroger l’agent",
16
+ modeRegenerate: "Régénérer",
17
+ agentModeOptions: "Choisir le comportement de l’agent",
18
+ pendingReview: "Vérifier les changements · {{count}}",
19
+ pendingReviewMenu: "Changements prêts à vérifier",
20
+ reviewCandidate: "Vérifier le changement",
21
+ regenerate: "Régénérer…",
22
+ sending: "Régénération…",
23
+ sent: "Demande de régénération envoyée",
24
+ sendFailed: "Impossible d’envoyer la demande de régénération",
25
+ previewTitle: "Sélection régénérée",
26
+ variants: "Variantes régénérées",
27
+ variantNumber: "Variante {{count}} : {{summary}}",
28
+ candidatePosition: "{{current}} sur {{total}}",
29
+ previousCandidate: "Résultat précédent",
30
+ nextCandidate: "Résultat suivant",
31
+ refinePlaceholder: "Affiner ce résultat…",
32
+ refine: "Affiner le résultat",
33
+ refinementSent: "Affinement envoyé",
34
+ refinementFailed: "Impossible d’envoyer l’affinement",
35
+ accept: "Accepter",
36
+ reject: "Rejeter",
37
+ resolveFailed: "Impossible de résoudre cette proposition",
38
+ },
39
+ },
5
40
  review: {
6
41
  comments: "Commentaires",
7
42
  commentsTab: "Commentaires · {{count}}",
@@ -2,6 +2,41 @@ import { messagesByLocale } from "../i18n-data";
2
2
 
3
3
  const messages = {
4
4
  ...messagesByLocale["hi-IN"],
5
+ designEditor: {
6
+ ...messagesByLocale["hi-IN"].designEditor,
7
+ nodeRewrite: {
8
+ composerTitle: "चयन के बारे में पूछें या बदलें",
9
+ send: "भेजें",
10
+ autoHint: "कोई बदलाव बताएँ या सवाल पूछें",
11
+ willPreview: "आपकी मंज़ूरी के लिए बदलावों का पूर्वावलोकन दिखाएगा",
12
+ willAsk: "डिज़ाइन बदले बिना एजेंट से पूछेगा",
13
+ modeAuto: "अपने आप",
14
+ modePreview: "बदलाव का पूर्वावलोकन",
15
+ modeAsk: "एजेंट से पूछें",
16
+ modeRegenerate: "फिर से बनाएँ",
17
+ agentModeOptions: "एजेंट का व्यवहार चुनें",
18
+ pendingReview: "बदलाव देखें · {{count}}",
19
+ pendingReviewMenu: "देखने के लिए तैयार बदलाव",
20
+ reviewCandidate: "बदलाव देखें",
21
+ regenerate: "फिर से बनाएँ…",
22
+ sending: "फिर से बनाया जा रहा है…",
23
+ sent: "पुनर्निर्माण अनुरोध भेजा गया",
24
+ sendFailed: "पुनर्निर्माण अनुरोध नहीं भेजा जा सका",
25
+ previewTitle: "फिर से बनाया गया चयन",
26
+ variants: "पुनर्निर्माण विकल्प",
27
+ variantNumber: "विकल्प {{count}}: {{summary}}",
28
+ candidatePosition: "{{total}} में से {{current}}",
29
+ previousCandidate: "पिछला परिणाम",
30
+ nextCandidate: "अगला परिणाम",
31
+ refinePlaceholder: "इस परिणाम को सुधारें…",
32
+ refine: "परिणाम सुधारें",
33
+ refinementSent: "सुधार भेजा गया",
34
+ refinementFailed: "सुधार नहीं भेजा जा सका",
35
+ accept: "स्वीकार करें",
36
+ reject: "अस्वीकार करें",
37
+ resolveFailed: "इस प्रस्ताव को पूरा नहीं किया जा सका",
38
+ },
39
+ },
5
40
  review: {
6
41
  comments: "टिप्पणियाँ",
7
42
  commentsTab: "टिप्पणियाँ · {{count}}",
@@ -2,6 +2,41 @@ import { messagesByLocale } from "../i18n-data";
2
2
 
3
3
  const messages = {
4
4
  ...messagesByLocale["ja-JP"],
5
+ designEditor: {
6
+ ...messagesByLocale["ja-JP"].designEditor,
7
+ nodeRewrite: {
8
+ composerTitle: "選択範囲について質問または変更",
9
+ send: "送信",
10
+ autoHint: "変更内容を入力するか質問してください",
11
+ willPreview: "承認前に変更をプレビューします",
12
+ willAsk: "デザインを変更せずにエージェントへ質問します",
13
+ modeAuto: "自動",
14
+ modePreview: "変更をプレビュー",
15
+ modeAsk: "エージェントに質問",
16
+ modeRegenerate: "再生成",
17
+ agentModeOptions: "エージェントの動作を選択",
18
+ pendingReview: "変更を確認 · {{count}}",
19
+ pendingReviewMenu: "確認待ちの変更",
20
+ reviewCandidate: "変更を確認",
21
+ regenerate: "再生成…",
22
+ sending: "再生成中…",
23
+ sent: "再生成リクエストを送信しました",
24
+ sendFailed: "再生成リクエストを送信できませんでした",
25
+ previewTitle: "再生成された選択範囲",
26
+ variants: "再生成バリエーション",
27
+ variantNumber: "バリエーション {{count}}: {{summary}}",
28
+ candidatePosition: "{{total}}件中{{current}}件目",
29
+ previousCandidate: "前の結果",
30
+ nextCandidate: "次の結果",
31
+ refinePlaceholder: "この結果を調整…",
32
+ refine: "結果を調整",
33
+ refinementSent: "調整内容を送信しました",
34
+ refinementFailed: "調整内容を送信できませんでした",
35
+ accept: "承認",
36
+ reject: "却下",
37
+ resolveFailed: "この提案を解決できませんでした",
38
+ },
39
+ },
5
40
  review: {
6
41
  comments: "コメント",
7
42
  commentsTab: "コメント · {{count}}",
@@ -2,6 +2,41 @@ import { messagesByLocale } from "../i18n-data";
2
2
 
3
3
  const messages = {
4
4
  ...messagesByLocale["ko-KR"],
5
+ designEditor: {
6
+ ...messagesByLocale["ko-KR"].designEditor,
7
+ nodeRewrite: {
8
+ composerTitle: "선택 영역 질문 또는 변경",
9
+ send: "보내기",
10
+ autoHint: "변경 사항을 설명하거나 질문하세요",
11
+ willPreview: "승인 전에 변경 사항을 미리 보여줍니다",
12
+ willAsk: "디자인을 변경하지 않고 에이전트에게 질문합니다",
13
+ modeAuto: "자동",
14
+ modePreview: "변경 미리보기",
15
+ modeAsk: "에이전트에게 질문",
16
+ modeRegenerate: "다시 생성",
17
+ agentModeOptions: "에이전트 동작 선택",
18
+ pendingReview: "변경 검토 · {{count}}",
19
+ pendingReviewMenu: "검토할 변경 사항",
20
+ reviewCandidate: "변경 검토",
21
+ regenerate: "다시 생성…",
22
+ sending: "다시 생성 중…",
23
+ sent: "재생성 요청을 보냈습니다",
24
+ sendFailed: "재생성 요청을 보내지 못했습니다",
25
+ previewTitle: "다시 생성된 선택 영역",
26
+ variants: "재생성 변형",
27
+ variantNumber: "변형 {{count}}: {{summary}}",
28
+ candidatePosition: "{{total}}개 중 {{current}}개",
29
+ previousCandidate: "이전 결과",
30
+ nextCandidate: "다음 결과",
31
+ refinePlaceholder: "이 결과 다듬기…",
32
+ refine: "결과 다듬기",
33
+ refinementSent: "수정 요청을 보냈습니다",
34
+ refinementFailed: "수정 요청을 보내지 못했습니다",
35
+ accept: "적용",
36
+ reject: "거부",
37
+ resolveFailed: "이 제안을 처리하지 못했습니다",
38
+ },
39
+ },
5
40
  review: {
6
41
  comments: "댓글",
7
42
  commentsTab: "댓글 · {{count}}",
@@ -2,6 +2,41 @@ import { messagesByLocale } from "../i18n-data";
2
2
 
3
3
  const messages = {
4
4
  ...messagesByLocale["pt-BR"],
5
+ designEditor: {
6
+ ...messagesByLocale["pt-BR"].designEditor,
7
+ nodeRewrite: {
8
+ composerTitle: "Pergunte ou altere a seleção",
9
+ send: "Enviar",
10
+ autoHint: "Descreva uma alteração ou faça uma pergunta",
11
+ willPreview: "Mostrará as alterações para sua aprovação",
12
+ willAsk: "Perguntará ao agente sem alterar o design",
13
+ modeAuto: "Automático",
14
+ modePreview: "Prévia da alteração",
15
+ modeAsk: "Perguntar ao agente",
16
+ modeRegenerate: "Regenerar",
17
+ agentModeOptions: "Escolher o comportamento do agente",
18
+ pendingReview: "Revisar alterações · {{count}}",
19
+ pendingReviewMenu: "Alterações prontas para revisão",
20
+ reviewCandidate: "Revisar alteração",
21
+ regenerate: "Regenerar…",
22
+ sending: "Regenerando…",
23
+ sent: "Solicitação de regeneração enviada",
24
+ sendFailed: "Não foi possível enviar a solicitação de regeneração",
25
+ previewTitle: "Seleção regenerada",
26
+ variants: "Variações regeneradas",
27
+ variantNumber: "Variação {{count}}: {{summary}}",
28
+ candidatePosition: "{{current}} de {{total}}",
29
+ previousCandidate: "Resultado anterior",
30
+ nextCandidate: "Próximo resultado",
31
+ refinePlaceholder: "Refinar este resultado…",
32
+ refine: "Refinar resultado",
33
+ refinementSent: "Refinamento enviado",
34
+ refinementFailed: "Não foi possível enviar o refinamento",
35
+ accept: "Aceitar",
36
+ reject: "Rejeitar",
37
+ resolveFailed: "Não foi possível resolver esta proposta",
38
+ },
39
+ },
5
40
  review: {
6
41
  comments: "Comentários",
7
42
  commentsTab: "Comentários · {{count}}",
@@ -2,6 +2,41 @@ import { messagesByLocale } from "../i18n-data";
2
2
 
3
3
  const messages = {
4
4
  ...messagesByLocale["zh-CN"],
5
+ designEditor: {
6
+ ...messagesByLocale["zh-CN"].designEditor,
7
+ nodeRewrite: {
8
+ composerTitle: "询问或更改所选内容",
9
+ send: "发送",
10
+ autoHint: "描述更改或提出问题",
11
+ willPreview: "将显示更改预览供你确认",
12
+ willAsk: "将在不更改设计的情况下询问智能体",
13
+ modeAuto: "自动",
14
+ modePreview: "预览更改",
15
+ modeAsk: "询问智能体",
16
+ modeRegenerate: "重新生成",
17
+ agentModeOptions: "选择智能体行为",
18
+ pendingReview: "查看更改 · {{count}}",
19
+ pendingReviewMenu: "待查看的更改",
20
+ reviewCandidate: "查看更改",
21
+ regenerate: "重新生成…",
22
+ sending: "正在重新生成…",
23
+ sent: "已发送重新生成请求",
24
+ sendFailed: "无法发送重新生成请求",
25
+ previewTitle: "已重新生成所选内容",
26
+ variants: "重新生成方案",
27
+ variantNumber: "方案 {{count}}:{{summary}}",
28
+ candidatePosition: "第 {{current}} 个,共 {{total}} 个",
29
+ previousCandidate: "上一个结果",
30
+ nextCandidate: "下一个结果",
31
+ refinePlaceholder: "继续调整此结果…",
32
+ refine: "调整结果",
33
+ refinementSent: "已发送调整请求",
34
+ refinementFailed: "无法发送调整请求",
35
+ accept: "接受",
36
+ reject: "拒绝",
37
+ resolveFailed: "无法处理此提案",
38
+ },
39
+ },
5
40
  review: {
6
41
  comments: "评论",
7
42
  commentsTab: "评论 · {{count}}",
@@ -426,6 +426,38 @@ const messages = {
426
426
  designEditor: {
427
427
  ...designTemplateFeatureOverrides["zh-TW"].designEditor,
428
428
  askAgent: "詢問代理",
429
+ nodeRewrite: {
430
+ composerTitle: "詢問或變更所選內容",
431
+ send: "傳送",
432
+ autoHint: "描述變更或提出問題",
433
+ willPreview: "將顯示變更預覽供你確認",
434
+ willAsk: "將在不變更設計的情況下詢問代理",
435
+ modeAuto: "自動",
436
+ modePreview: "預覽變更",
437
+ modeAsk: "詢問代理",
438
+ modeRegenerate: "重新生成",
439
+ agentModeOptions: "選擇代理行為",
440
+ pendingReview: "檢視變更 · {{count}}",
441
+ pendingReviewMenu: "待檢視的變更",
442
+ reviewCandidate: "檢視變更",
443
+ regenerate: "重新生成…",
444
+ sending: "正在重新生成…",
445
+ sent: "已傳送重新生成要求",
446
+ sendFailed: "無法傳送重新生成要求",
447
+ previewTitle: "已重新生成所選內容",
448
+ variants: "重新生成方案",
449
+ variantNumber: "方案 {{count}}:{{summary}}",
450
+ candidatePosition: "第 {{current}} 個,共 {{total}} 個",
451
+ previousCandidate: "上一個結果",
452
+ nextCandidate: "下一個結果",
453
+ refinePlaceholder: "繼續調整此結果…",
454
+ refine: "調整結果",
455
+ refinementSent: "已傳送調整要求",
456
+ refinementFailed: "無法傳送調整要求",
457
+ accept: "接受",
458
+ reject: "拒絕",
459
+ resolveFailed: "無法處理此提案",
460
+ },
429
461
  autoLayoutSuggestion: {
430
462
  menuLabel: "建議自動版面配置…",
431
463
  title: "建議自動版面配置",
@@ -928,6 +928,38 @@ const enUS = {
928
928
  stay: "Stay here",
929
929
  leave: "Leave without applying",
930
930
  },
931
+ nodeRewrite: {
932
+ composerTitle: "Ask or change selection",
933
+ send: "Send",
934
+ autoHint: "Describe a change or ask a question",
935
+ willPreview: "Will preview changes for your approval",
936
+ willAsk: "Will ask the agent without changing the design",
937
+ modeAuto: "Auto",
938
+ modePreview: "Preview change",
939
+ modeAsk: "Ask agent",
940
+ modeRegenerate: "Regenerate",
941
+ agentModeOptions: "Choose agent behavior",
942
+ pendingReview: "Review changes · {{count}}",
943
+ pendingReviewMenu: "Changes ready to review",
944
+ reviewCandidate: "Review change",
945
+ regenerate: "Regenerate…",
946
+ sending: "Regenerating…",
947
+ sent: "Regeneration request sent",
948
+ sendFailed: "Could not send the regeneration request",
949
+ previewTitle: "Regenerated selection",
950
+ variants: "Regeneration variants",
951
+ variantNumber: "Variant {{count}}: {{summary}}",
952
+ candidatePosition: "{{current}} of {{total}}",
953
+ previousCandidate: "Previous candidate",
954
+ nextCandidate: "Next candidate",
955
+ refinePlaceholder: "Refine this result…",
956
+ refine: "Refine result",
957
+ refinementSent: "Refinement sent",
958
+ refinementFailed: "Could not send the refinement",
959
+ accept: "Accept",
960
+ reject: "Reject",
961
+ resolveFailed: "Could not resolve this proposal",
962
+ },
931
963
  capabilities: {
932
964
  "deterministic-style-edit": "Safe style edit",
933
965
  "deterministic-class-edit": "Safe class edit",
@@ -0,0 +1,110 @@
1
+ import type { NodeRewriteTarget } from "@shared/node-rewrite";
2
+
3
+ const MAX_SUBTREE_EXCERPT_LENGTH = 4_000;
4
+
5
+ export const NODE_REPROMPT_RESOLVED_EVENT = "design:node-reprompt-resolved";
6
+ export const NODE_REPROMPT_PRESENTED_EVENT = "design:node-reprompt-presented";
7
+
8
+ export type NodeRepromptSendMode = "preview" | "ask";
9
+
10
+ const QUESTION_OPENING =
11
+ /^(?:what|why|how|which|where|when|who|should|would|could|can|do|does|is|are)\b/i;
12
+ const QUESTION_INTENT =
13
+ /\b(?:explain|review|critique|feedback|thoughts|opinion|recommend|suggest(?:ion)?s?|ideas?|compare)\b/i;
14
+ const EDIT_INTENT =
15
+ /\b(?:make|change|replace|add|remove|delete|use|set|turn|update|rewrite|reword|shorten|lengthen|move|resize|align|center|increase|decrease|darken|lighten|tighten|loosen|swap|convert|style|restyle|redesign|improve|fix|create|generate|show)\b/i;
16
+ const POLITE_EDIT_INTENT =
17
+ /^(?:please\s+)?(?:can|could|would)\s+you\s+(?:please\s+)?(?:make|change|replace|add|remove|delete|use|set|turn|update|rewrite|reword|shorten|lengthen|move|resize|align|center|increase|decrease|darken|lighten|tighten|loosen|swap|convert|style|restyle|redesign|improve|fix|create|generate|show)\b/i;
18
+
19
+ export function inferNodeRepromptSendMode(
20
+ instruction: string,
21
+ options: { hasEditableTarget: boolean },
22
+ ): NodeRepromptSendMode {
23
+ const value = instruction.trim();
24
+ if (!value || !options.hasEditableTarget) return "ask";
25
+ if (POLITE_EDIT_INTENT.test(value)) return "preview";
26
+ if (QUESTION_OPENING.test(value) || value.endsWith("?")) return "ask";
27
+ if (QUESTION_INTENT.test(value) && !EDIT_INTENT.test(value)) return "ask";
28
+ if (EDIT_INTENT.test(value) || /\bgive\s+(?:this|it)\b/i.test(value)) {
29
+ return "preview";
30
+ }
31
+ return "ask";
32
+ }
33
+
34
+ function targetLabel(target: NodeRewriteTarget): string {
35
+ return target.nodeId ?? target.selector ?? "unknown";
36
+ }
37
+
38
+ export function nodeRepromptSubtreeExcerpt(html?: string | null): string {
39
+ const value = html?.trim() ?? "";
40
+ if (value.length <= MAX_SUBTREE_EXCERPT_LENGTH) return value;
41
+ return `${value.slice(0, MAX_SUBTREE_EXCERPT_LENGTH)}\n<!-- excerpt truncated -->`;
42
+ }
43
+
44
+ interface NodeRepromptSubmissionArgs {
45
+ repromptId: string;
46
+ designId: string;
47
+ fileId: string;
48
+ target: NodeRewriteTarget;
49
+ baseVersionHash: string;
50
+ instruction: string;
51
+ subtreeHtml?: string | null;
52
+ priorProposalId?: string;
53
+ }
54
+
55
+ type NodeSelectionQuestionArgs = Omit<
56
+ NodeRepromptSubmissionArgs,
57
+ "repromptId" | "baseVersionHash" | "priorProposalId"
58
+ >;
59
+
60
+ function formatNodeRepromptContext(args: NodeRepromptSubmissionArgs): string {
61
+ return [
62
+ "[Reprompt selection]",
63
+ `repromptId: ${args.repromptId}`,
64
+ `designId: ${args.designId}`,
65
+ `fileId: ${args.fileId}`,
66
+ `baseVersionHash: ${args.baseVersionHash}`,
67
+ `target: ${targetLabel(args.target)}`,
68
+ args.target.nodeId ? `targetNodeId: ${args.target.nodeId}` : "",
69
+ args.target.selector ? `targetSelector: ${args.target.selector}` : "",
70
+ args.priorProposalId ? `priorProposalId: ${args.priorProposalId}` : "",
71
+ "--- selected subtree (outerHTML excerpt, truncated) ---",
72
+ nodeRepromptSubtreeExcerpt(args.subtreeHtml),
73
+ "--- instruction ---",
74
+ args.instruction.trim(),
75
+ ]
76
+ .filter(Boolean)
77
+ .join("\n");
78
+ }
79
+
80
+ export function formatNodeRepromptSubmission(
81
+ args: NodeRepromptSubmissionArgs,
82
+ ): { message: string; context: string } {
83
+ return {
84
+ message: args.instruction.trim(),
85
+ context: formatNodeRepromptContext(args),
86
+ };
87
+ }
88
+
89
+ export function formatNodeSelectionQuestion(args: NodeSelectionQuestionArgs): {
90
+ message: string;
91
+ context: string;
92
+ } {
93
+ return {
94
+ message: args.instruction.trim(),
95
+ context: [
96
+ "[Selection question]",
97
+ `designId: ${args.designId}`,
98
+ `fileId: ${args.fileId}`,
99
+ `target: ${targetLabel(args.target)}`,
100
+ args.target.nodeId ? `targetNodeId: ${args.target.nodeId}` : "",
101
+ args.target.selector ? `targetSelector: ${args.target.selector}` : "",
102
+ "--- selected subtree (outerHTML excerpt, truncated) ---",
103
+ nodeRepromptSubtreeExcerpt(args.subtreeHtml),
104
+ "--- question ---",
105
+ args.instruction.trim(),
106
+ ]
107
+ .filter(Boolean)
108
+ .join("\n"),
109
+ };
110
+ }
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-16
4
+ ---
5
+
6
+ Design editing and review are now more predictable, with selection-based regeneration, clearer candidate approval, accurate layer comments, smarter agent prompts, and cleaner template behavior.