@agent-native/core 0.80.10 → 0.81.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 (267) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +53 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/agent/production-agent.ts +108 -15
  5. package/corpus/core/src/cli/design-connect.ts +419 -19
  6. package/corpus/core/src/client/AssistantChat.tsx +123 -26
  7. package/corpus/core/src/client/ConnectBuilderCard.tsx +1 -0
  8. package/corpus/core/src/client/chat/index.ts +1 -0
  9. package/corpus/core/src/client/chat/run-recovery.tsx +9 -7
  10. package/corpus/core/src/client/chat-view-transition.ts +33 -2
  11. package/corpus/core/src/client/composer/PromptComposer.tsx +21 -2
  12. package/corpus/core/src/client/index.ts +1 -0
  13. package/corpus/core/src/client/org/OrgSwitcher.tsx +26 -4
  14. package/corpus/core/src/client/sharing/ShareButton.tsx +3 -3
  15. package/corpus/core/src/client/sse-event-processor.ts +9 -0
  16. package/corpus/core/src/client/use-agent-chat-home-handoff.ts +31 -3
  17. package/corpus/core/src/db/client.ts +29 -2
  18. package/corpus/core/src/provider-api/index.ts +29 -0
  19. package/corpus/core/src/server/core-routes-plugin.ts +58 -20
  20. package/corpus/core/src/styles/agent-native.css +54 -0
  21. package/corpus/core/src/usage/store.ts +2 -2
  22. package/corpus/templates/analytics/app/components/layout/Layout.tsx +118 -10
  23. package/corpus/templates/analytics/app/components/layout/layout-route-policy.ts +7 -0
  24. package/corpus/templates/analytics/app/global.css +8 -0
  25. package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +7 -1
  26. package/corpus/templates/analytics/app/lib/chat-handoff.ts +34 -0
  27. package/corpus/templates/analytics/app/pages/Ask.tsx +9 -18
  28. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +2 -2
  29. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +109 -21
  30. package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +4 -6
  31. package/corpus/templates/analytics/changelog/2026-06-30-ask-opens-a-fresh-chat-unless-you-were-just-chatting-and-das.md +6 -0
  32. package/corpus/templates/analytics/changelog/2026-06-30-dashboard-email-reports-are-more-reliable-and-use-cleaner.md +6 -0
  33. package/corpus/templates/analytics/changelog/2026-06-30-dashboard-toolbar-controls-use-a-quieter-share-button-and-ve.md +6 -0
  34. package/corpus/templates/analytics/changelog/2026-06-30-session-replay-rows-show-whole-minute-durations-in-the-playl.md +6 -0
  35. package/corpus/templates/analytics/changelog/2026-06-30-session-replays-now-render-captured-styling-and-keep-the-eve.md +6 -0
  36. package/corpus/templates/analytics/server/jobs/dashboard-report.ts +16 -3
  37. package/corpus/templates/analytics/server/lib/dashboard-report.ts +31 -14
  38. package/corpus/templates/assets/.agents/skills/image-generation/SKILL.md +9 -2
  39. package/corpus/templates/assets/AGENTS.md +4 -0
  40. package/corpus/templates/assets/actions/_tool-activity.ts +46 -0
  41. package/corpus/templates/assets/actions/generate-image-batch.ts +26 -5
  42. package/corpus/templates/assets/actions/generate-image.ts +118 -67
  43. package/corpus/templates/assets/actions/list-draft-assets.ts +50 -0
  44. package/corpus/templates/assets/actions/open-asset-picker.ts +9 -0
  45. package/corpus/templates/assets/actions/rerun-generation-run.ts +52 -31
  46. package/corpus/templates/assets/app/components/create/RecentDraftsSection.tsx +100 -0
  47. package/corpus/templates/assets/app/global.css +15 -0
  48. package/corpus/templates/assets/app/hooks/use-navigation-state.ts +4 -0
  49. package/corpus/templates/assets/app/i18n/zh-TW.ts +7 -0
  50. package/corpus/templates/assets/app/i18n-data.ts +61 -0
  51. package/corpus/templates/assets/app/routes/_index.tsx +4 -0
  52. package/corpus/templates/assets/app/routes/library.tsx +233 -52
  53. package/corpus/templates/assets/changelog/2026-06-29-image-generation-can-now-render-requested-text-and-respect-b.md +6 -0
  54. package/corpus/templates/assets/changelog/2026-06-30-image-generation-no-longer-looks-stuck-while-the-provider-is-still-working.md +6 -0
  55. package/corpus/templates/assets/changelog/2026-06-30-tagged-presets-now-control-the-image-aspect-ratio.md +6 -0
  56. package/corpus/templates/assets/changelog/2026-06-30-the-assets-picker-now-supports-a-vertical-embedded-layout-fo.md +6 -0
  57. package/corpus/templates/assets/server/lib/generation.ts +135 -11
  58. package/corpus/templates/assets/shared/api.ts +4 -0
  59. package/corpus/templates/clips/actions/finalize-recording.ts +1 -12
  60. package/corpus/templates/clips/actions/list-ai-requests.ts +60 -0
  61. package/corpus/templates/clips/app/hooks/use-auto-title.ts +24 -25
  62. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +10 -5
  63. package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -8
  64. package/corpus/templates/clips/changelog/2026-06-30-extension-save-recovery-avoids-false-upload-failures.md +6 -0
  65. package/corpus/templates/clips/changelog/2026-06-30-longer-chrome-extension-recordings-now-keep-saving-reliably-.md +6 -0
  66. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
  67. package/corpus/templates/clips/chrome-extension/src/background.ts +19 -10
  68. package/corpus/templates/clips/chrome-extension/src/content-script.ts +38 -12
  69. package/corpus/templates/clips/chrome-extension/src/finalize-recovery.ts +224 -0
  70. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +119 -16
  71. package/corpus/templates/clips/chrome-extension/src/overlay.ts +16 -0
  72. package/corpus/templates/clips/server/lib/recording-upload-state.ts +48 -0
  73. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +9 -1
  74. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +63 -13
  75. package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/status.get.ts +74 -0
  76. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +32 -0
  77. package/corpus/templates/design/AGENTS.md +27 -0
  78. package/corpus/templates/design/CODE_NATIVE_DESIGN_STUDIO_IMPLEMENTATION_PLAN.md +1 -1
  79. package/corpus/templates/design/DESIGN-STUDIO-PLAN.md +5 -5
  80. package/corpus/templates/design/actions/apply-component-prop-edit.ts +76 -25
  81. package/corpus/templates/design/actions/apply-design-state.ts +17 -4
  82. package/corpus/templates/design/actions/apply-motion-edit.ts +76 -115
  83. package/corpus/templates/design/actions/apply-shader-fill.ts +148 -56
  84. package/corpus/templates/design/actions/capture-design-state.ts +27 -4
  85. package/corpus/templates/design/actions/connect-localhost.ts +59 -22
  86. package/corpus/templates/design/actions/delete-design.ts +20 -0
  87. package/corpus/templates/design/actions/export-zip.ts +23 -8
  88. package/corpus/templates/design/actions/generate-design.ts +53 -1
  89. package/corpus/templates/design/actions/get-component-details.ts +21 -26
  90. package/corpus/templates/design/actions/get-motion-timeline.ts +135 -10
  91. package/corpus/templates/design/actions/grant-localhost-write-consent.ts +116 -0
  92. package/corpus/templates/design/actions/import-design-tokens.ts +521 -0
  93. package/corpus/templates/design/actions/index-design-tokens.ts +18 -5
  94. package/corpus/templates/design/actions/insert-design-native-asset.ts +268 -0
  95. package/corpus/templates/design/actions/insert-figma-library-asset.ts +233 -0
  96. package/corpus/templates/design/actions/list-design-extensions.ts +32 -10
  97. package/corpus/templates/design/actions/list-design-native-assets.ts +105 -0
  98. package/corpus/templates/design/actions/list-design-states.ts +19 -1
  99. package/corpus/templates/design/actions/list-figma-library-assets.ts +292 -0
  100. package/corpus/templates/design/actions/migrate-board-objects-to-file.ts +238 -0
  101. package/corpus/templates/design/actions/navigate.ts +18 -3
  102. package/corpus/templates/design/actions/open-component-source.ts +7 -2
  103. package/corpus/templates/design/actions/preview-component-prop-edit.ts +32 -26
  104. package/corpus/templates/design/actions/preview-shader-fill.ts +9 -11
  105. package/corpus/templates/design/actions/provider-api-catalog.ts +2 -2
  106. package/corpus/templates/design/actions/provider-api-docs.ts +1 -1
  107. package/corpus/templates/design/actions/provider-api-request.ts +3 -3
  108. package/corpus/templates/design/actions/revoke-localhost-write-consent.ts +48 -0
  109. package/corpus/templates/design/actions/run-design-audit.ts +74 -10
  110. package/corpus/templates/design/actions/run-design-extension-action.ts +1 -1
  111. package/corpus/templates/design/actions/view-screen.ts +1 -1
  112. package/corpus/templates/design/actions/write-local-file.ts +213 -0
  113. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +244 -3197
  114. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +30 -20
  115. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +795 -289
  116. package/corpus/templates/design/app/components/design/EditPanel.tsx +635 -234
  117. package/corpus/templates/design/app/components/design/LayersPanel.tsx +124 -32
  118. package/corpus/templates/design/app/components/design/LocalhostWriteConsentDialog.tsx +161 -0
  119. package/corpus/templates/design/app/components/design/MotionDock.tsx +244 -266
  120. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +491 -56
  121. package/corpus/templates/design/app/components/design/ReviewPanel.tsx +55 -67
  122. package/corpus/templates/design/app/components/design/StatesPanel.tsx +38 -63
  123. package/corpus/templates/design/app/components/design/TokensPanel.tsx +264 -8
  124. package/corpus/templates/design/app/components/design/bridge/codegen.ts +125 -0
  125. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +4037 -0
  126. package/corpus/templates/design/app/components/design/bridge/embedded-wheel.bridge.ts +62 -0
  127. package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +272 -0
  128. package/corpus/templates/design/app/components/design/bridge/nav.bridge.ts +116 -0
  129. package/corpus/templates/design/app/components/design/bridge/sample.bridge.ts +24 -0
  130. package/corpus/templates/design/app/components/design/bridge/shader-fill-preview.bridge.ts +78 -0
  131. package/corpus/templates/design/app/components/design/bridge/tsconfig.json +17 -0
  132. package/corpus/templates/design/app/components/design/bridge/tweak.bridge.ts +28 -0
  133. package/corpus/templates/design/app/components/design/bridge/zoom.bridge.ts +43 -0
  134. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +45 -16
  135. package/corpus/templates/design/app/components/design/inspector/ImageFillControls.tsx +88 -9
  136. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +94 -9
  137. package/corpus/templates/design/app/components/layout/Layout.tsx +19 -3
  138. package/corpus/templates/design/app/components/layout/Sidebar.tsx +1 -1
  139. package/corpus/templates/design/app/global.css +7 -0
  140. package/corpus/templates/design/app/hooks/use-navigation-state.ts +23 -0
  141. package/corpus/templates/design/app/i18n/zh-TW.ts +22 -0
  142. package/corpus/templates/design/app/i18n-data.ts +369 -0
  143. package/corpus/templates/design/app/lib/pending-generation.ts +1 -0
  144. package/corpus/templates/design/app/pages/DesignEditor.tsx +3024 -616
  145. package/corpus/templates/design/app/pages/Index.tsx +5 -1
  146. package/corpus/templates/design/changelog/2026-06-30-applying-the-one-click-fix-for-a-small-tap-target-accessibil.md +6 -0
  147. package/corpus/templates/design/changelog/2026-06-30-canvas-creation-screen-dragging-undo-redo-and-image-fill-edi.md +6 -0
  148. package/corpus/templates/design/changelog/2026-06-30-component-prop-edits-and-shader-fills-now-preserve-rapid-sam.md +6 -0
  149. package/corpus/templates/design/changelog/2026-06-30-design-can-browse-figma-library-components-and-insert-them-i.md +6 -0
  150. package/corpus/templates/design/changelog/2026-06-30-design-now-has-a-figma-style-left-rail-for-file-agent-assets.md +6 -0
  151. package/corpus/templates/design/changelog/2026-06-30-design-now-has-native-components-embedded-media-and-figma-im.md +6 -0
  152. package/corpus/templates/design/changelog/2026-06-30-design-preview-now-includes-a-publish-app-waitlist-option-fr.md +6 -0
  153. package/corpus/templates/design/changelog/2026-06-30-design-s-left-rail-now-matches-the-sidebar-chrome-and-uses-t.md +6 -0
  154. package/corpus/templates/design/changelog/2026-06-30-design-s-tools-create-menu-now-stays-compact-instead-of-rend.md +6 -0
  155. package/corpus/templates/design/changelog/2026-06-30-design-starter-prompts-now-begin-generating-immediately-and-.md +6 -0
  156. package/corpus/templates/design/changelog/2026-06-30-design-token-edits-now-stay-visible-in-previews-and-token-li.md +6 -0
  157. package/corpus/templates/design/changelog/2026-06-30-design-tools-now-use-a-quieter-figma-style-list-layout.md +6 -0
  158. package/corpus/templates/design/changelog/2026-06-30-drawing-rectangles-on-the-all-screens-canvas-no-longer-flash.md +6 -0
  159. package/corpus/templates/design/changelog/2026-06-30-fixed-code-native-design-studio-edits-so-component-props-mot.md +6 -0
  160. package/corpus/templates/design/changelog/2026-06-30-fixed-visual-editing-hover-overlays-and-spacing-handles-so-s.md +6 -0
  161. package/corpus/templates/design/changelog/2026-06-30-motion-edits-now-save-automatically-without-a-separate-css-a.md +6 -0
  162. package/corpus/templates/design/changelog/2026-06-30-motion-timelines-now-reopen-as-editable-tracks-after-writing.md +6 -0
  163. package/corpus/templates/design/changelog/2026-06-30-new-design-prompts-with-uploaded-screenshots-work-reliably-o.md +6 -0
  164. package/corpus/templates/design/changelog/2026-06-30-screen-previews-in-all-screens-view-now-keep-rounded-outline.md +6 -0
  165. package/corpus/templates/design/changelog/2026-06-30-selection-outlines-now-sit-flush-on-rectangles-drawn-directl.md +6 -0
  166. package/corpus/templates/design/changelog/2026-06-30-share-options-use-a-tighter-design-editor-popover-with-compa.md +6 -0
  167. package/corpus/templates/design/changelog/2026-06-30-the-collapsed-motion-panel-now-stays-tucked-under-the-left-s.md +6 -0
  168. package/corpus/templates/design/changelog/2026-06-30-the-design-inspector-now-shows-states-and-review-in-a-tighte.md +6 -0
  169. package/corpus/templates/design/changelog/2026-06-30-the-sidebar-keeps-the-organization-picker-space-stable-while.md +6 -0
  170. package/corpus/templates/design/changelog/2026-06-30-tokens-can-now-be-imported-from-pasted-notes-code-files-fold.md +6 -0
  171. package/corpus/templates/design/e2e/global-setup.ts +94 -2
  172. package/corpus/templates/design/e2e/helpers.ts +168 -65
  173. package/corpus/templates/design/package.json +3 -1
  174. package/corpus/templates/design/server/db/schema.ts +23 -0
  175. package/corpus/templates/design/server/handlers/uploads.ts +22 -1
  176. package/corpus/templates/design/server/lib/provider-api.ts +7 -4
  177. package/corpus/templates/design/server/lib/verify-write-grant.ts +108 -0
  178. package/corpus/templates/design/server/plugins/db.ts +39 -0
  179. package/corpus/templates/design/server/register-secrets.ts +38 -0
  180. package/corpus/templates/design/shared/board-file.ts +228 -0
  181. package/corpus/templates/design/shared/board-objects.ts +288 -0
  182. package/corpus/templates/design/shared/code-layer.ts +52 -0
  183. package/corpus/templates/design/shared/component-model.ts +35 -0
  184. package/corpus/templates/design/shared/motion-compiler.ts +137 -15
  185. package/corpus/templates/design/shared/motion-timeline.ts +2 -2
  186. package/corpus/templates/design/shared/resolve-tweaks.ts +32 -9
  187. package/corpus/templates/design/tsconfig.json +2 -1
  188. package/corpus/templates/slides/AGENTS.md +9 -0
  189. package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +4 -0
  190. package/corpus/templates/slides/app/components/editor/ExportMenu.tsx +4 -24
  191. package/corpus/templates/slides/app/lib/export-pdf-client.ts +29 -20
  192. package/corpus/templates/slides/app/lib/export-pptx-client.ts +365 -0
  193. package/corpus/templates/slides/app/pages/DeckEditor.tsx +12 -9
  194. package/corpus/templates/slides/app/vite-env.d.ts +18 -0
  195. package/corpus/templates/slides/changelog/2026-06-30-powerpoint-downloads-now-preserve-the-rendered-slide-layout-.md +6 -0
  196. package/corpus/templates/slides/changelog/2026-06-30-unavailable-decks-open-in-a-cleaner-full-height-centered-sta.md +6 -0
  197. package/corpus/templates/slides/package.json +1 -0
  198. package/corpus/templates/slides/vite.config.ts +1 -0
  199. package/dist/agent/production-agent.d.ts.map +1 -1
  200. package/dist/agent/production-agent.js +94 -10
  201. package/dist/agent/production-agent.js.map +1 -1
  202. package/dist/cli/design-connect.d.ts +25 -0
  203. package/dist/cli/design-connect.d.ts.map +1 -1
  204. package/dist/cli/design-connect.js +357 -18
  205. package/dist/cli/design-connect.js.map +1 -1
  206. package/dist/client/AssistantChat.d.ts +14 -0
  207. package/dist/client/AssistantChat.d.ts.map +1 -1
  208. package/dist/client/AssistantChat.js +115 -22
  209. package/dist/client/AssistantChat.js.map +1 -1
  210. package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
  211. package/dist/client/ConnectBuilderCard.js +1 -0
  212. package/dist/client/ConnectBuilderCard.js.map +1 -1
  213. package/dist/client/chat/index.d.ts +1 -1
  214. package/dist/client/chat/index.d.ts.map +1 -1
  215. package/dist/client/chat/index.js +1 -1
  216. package/dist/client/chat/index.js.map +1 -1
  217. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  218. package/dist/client/chat/run-recovery.js +5 -5
  219. package/dist/client/chat/run-recovery.js.map +1 -1
  220. package/dist/client/chat-view-transition.d.ts +6 -0
  221. package/dist/client/chat-view-transition.d.ts.map +1 -1
  222. package/dist/client/chat-view-transition.js +23 -2
  223. package/dist/client/chat-view-transition.js.map +1 -1
  224. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  225. package/dist/client/composer/PromptComposer.js +3 -2
  226. package/dist/client/composer/PromptComposer.js.map +1 -1
  227. package/dist/client/index.d.ts +1 -1
  228. package/dist/client/index.d.ts.map +1 -1
  229. package/dist/client/index.js +1 -1
  230. package/dist/client/index.js.map +1 -1
  231. package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
  232. package/dist/client/org/OrgSwitcher.js +11 -4
  233. package/dist/client/org/OrgSwitcher.js.map +1 -1
  234. package/dist/client/sharing/ShareButton.js +3 -3
  235. package/dist/client/sharing/ShareButton.js.map +1 -1
  236. package/dist/client/sse-event-processor.d.ts.map +1 -1
  237. package/dist/client/sse-event-processor.js +10 -0
  238. package/dist/client/sse-event-processor.js.map +1 -1
  239. package/dist/client/use-agent-chat-home-handoff.d.ts +8 -2
  240. package/dist/client/use-agent-chat-home-handoff.d.ts.map +1 -1
  241. package/dist/client/use-agent-chat-home-handoff.js +20 -6
  242. package/dist/client/use-agent-chat-home-handoff.js.map +1 -1
  243. package/dist/collab/awareness.d.ts +2 -2
  244. package/dist/collab/awareness.d.ts.map +1 -1
  245. package/dist/collab/routes.d.ts +2 -2
  246. package/dist/db/client.d.ts +1 -0
  247. package/dist/db/client.d.ts.map +1 -1
  248. package/dist/db/client.js +28 -2
  249. package/dist/db/client.js.map +1 -1
  250. package/dist/notifications/routes.d.ts +3 -3
  251. package/dist/observability/routes.d.ts +3 -3
  252. package/dist/progress/routes.d.ts +1 -1
  253. package/dist/provider-api/index.d.ts +5 -4
  254. package/dist/provider-api/index.d.ts.map +1 -1
  255. package/dist/provider-api/index.js +28 -0
  256. package/dist/provider-api/index.js.map +1 -1
  257. package/dist/resources/handlers.d.ts +3 -3
  258. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  259. package/dist/server/core-routes-plugin.d.ts +25 -0
  260. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  261. package/dist/server/core-routes-plugin.js +43 -18
  262. package/dist/server/core-routes-plugin.js.map +1 -1
  263. package/dist/server/transcribe-voice.d.ts +1 -1
  264. package/dist/styles/agent-native.css +54 -0
  265. package/dist/usage/store.js +2 -2
  266. package/dist/usage/store.js.map +1 -1
  267. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"design-connect.js","sourceRoot":"","sources":["../../src/cli/design-connect.ts"],"names":[],"mappings":"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","sourcesContent":["import fsSync from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport http, {\n type IncomingMessage,\n type Server,\n type ServerResponse,\n} from \"node:http\";\nimport path from \"node:path\";\n\nconst DEFAULT_BRIDGE_PORT = 7331;\nconst ROUTE_MANIFEST_FILE = path.join(\".agent-native\", \"design-routes.json\");\nconst DEFAULT_DEV_SERVER_CANDIDATES = [\n \"http://127.0.0.1:5173\",\n \"http://localhost:5173\",\n \"http://127.0.0.1:3000\",\n \"http://localhost:3000\",\n \"http://127.0.0.1:8080\",\n \"http://localhost:8080\",\n];\n\nconst BRIDGE_OPERATIONS = [\n \"select\",\n \"resolveNodeToFile\",\n \"readFile\",\n \"applyEdit\",\n \"writeFile\",\n \"captureSnapshot\",\n \"captureState\",\n] as const;\n\ntype BridgeOperation = (typeof BRIDGE_OPERATIONS)[number];\n\nexport interface DesignConnectArgs {\n url?: string;\n port: number;\n root: string;\n routeManifest?: string;\n json: boolean;\n once: boolean;\n dryRun: boolean;\n help: boolean;\n}\n\nexport interface DesignConnectRoute {\n id: string;\n path: string;\n title: string;\n sourceFile?: string;\n sourceKind: \"react-router\" | \"html\" | \"manual\";\n}\n\nexport interface DesignConnectManifest {\n version: 1;\n source: \"agent-native-design-connect\";\n sourceType: \"localhost\";\n localOnly: true;\n devServerUrl: string;\n bridgeUrl: string;\n rootPath: string;\n routeManifestPath: string;\n routeManifestCreated: boolean;\n routes: DesignConnectRoute[];\n routeCount: number;\n generatedAt: string;\n capabilities: Array<{\n operation: BridgeOperation;\n status: \"available\" | \"planned\" | \"disabled\";\n reason?: string;\n }>;\n}\n\nexport interface DesignConnectBridge {\n server: Server;\n manifest: DesignConnectManifest;\n}\n\nfunction stringFlagValue(argv: string[], index: number, flag: string) {\n const value = argv[index + 1];\n if (!value || value.startsWith(\"-\")) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n}\n\nfunction normalizeSlash(value: string) {\n return value.replace(/\\\\/g, \"/\");\n}\n\nfunction normalizeHttpUrl(value: string): string {\n const raw = value.trim();\n const withProtocol = /^[a-z]+:\\/\\//i.test(raw) ? raw : `http://${raw}`;\n const parsed = new URL(withProtocol);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"--url must be an http(s) URL\");\n }\n parsed.hash = \"\";\n return parsed.toString().replace(/\\/$/, \"\");\n}\n\nexport function parseDesignConnectArgs(argv: string[]): DesignConnectArgs {\n const args = argv[0] === \"connect\" ? argv.slice(1) : argv;\n const parsed: DesignConnectArgs = {\n port: DEFAULT_BRIDGE_PORT,\n root: process.cwd(),\n json: false,\n once: false,\n dryRun: false,\n help: false,\n };\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index]!;\n if (arg === \"help\" || arg === \"--help\" || arg === \"-h\") {\n parsed.help = true;\n } else if (arg === \"--url\") {\n parsed.url = stringFlagValue(args, index, arg);\n index += 1;\n } else if (arg.startsWith(\"--url=\")) {\n parsed.url = arg.slice(\"--url=\".length);\n } else if (arg === \"--port\") {\n parsed.port = Number.parseInt(stringFlagValue(args, index, arg), 10);\n index += 1;\n } else if (arg.startsWith(\"--port=\")) {\n parsed.port = Number.parseInt(arg.slice(\"--port=\".length), 10);\n } else if (arg === \"--root\") {\n parsed.root = stringFlagValue(args, index, arg);\n index += 1;\n } else if (arg.startsWith(\"--root=\")) {\n parsed.root = arg.slice(\"--root=\".length);\n } else if (arg === \"--route-manifest\") {\n parsed.routeManifest = stringFlagValue(args, index, arg);\n index += 1;\n } else if (arg.startsWith(\"--route-manifest=\")) {\n parsed.routeManifest = arg.slice(\"--route-manifest=\".length);\n } else if (arg === \"--json\") {\n parsed.json = true;\n parsed.once = true;\n } else if (arg === \"--once\") {\n parsed.once = true;\n } else if (arg === \"--dry-run\") {\n parsed.dryRun = true;\n parsed.once = true;\n } else if (arg.startsWith(\"-\")) {\n throw new Error(`Unknown option: ${arg}`);\n } else {\n throw new Error(`Unexpected argument: ${arg}`);\n }\n }\n\n if (!Number.isInteger(parsed.port) || parsed.port <= 0) {\n throw new Error(\"--port must be a positive integer\");\n }\n parsed.root = path.resolve(parsed.root);\n parsed.url = parsed.url ? normalizeHttpUrl(parsed.url) : undefined;\n return parsed;\n}\n\nfunction routeId(routePath: string): string {\n if (routePath === \"/\") return \"route-root\";\n const slug = routePath\n .replace(/^\\/+/, \"\")\n .replace(/[^a-zA-Z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase();\n return slug ? `route-${slug}` : \"route-wildcard\";\n}\n\nfunction titleFromRoutePath(routePath: string): string {\n if (routePath === \"/\") return \"Home\";\n if (routePath === \"/*\" || routePath === \"*\") return \"Wildcard\";\n return (\n routePath\n .replace(/^\\/+/, \"\")\n .replace(/[:$]/g, \"\")\n .replace(/[-_/]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .replace(/\\b\\w/g, (char) => char.toUpperCase()) || \"Screen\"\n );\n}\n\nfunction walkFiles(dir: string, files: string[] = []): string[] {\n if (!fsSync.existsSync(dir)) return files;\n for (const entry of fsSync.readdirSync(dir, { withFileTypes: true })) {\n if (entry.name === \"node_modules\" || entry.name === \".git\") continue;\n const absolute = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n walkFiles(absolute, files);\n } else {\n files.push(absolute);\n }\n }\n return files;\n}\n\nfunction routePathFromReactRouterFile(filePath: string, routesDir: string) {\n const withoutExt = normalizeSlash(path.relative(routesDir, filePath)).replace(\n /\\.[cm]?[jt]sx?$/,\n \"\",\n );\n const parts: string[] = [];\n for (const segment of withoutExt.split(\"/\")) {\n for (const token of segment.split(\".\")) {\n if (!token || token === \"route\" || token === \"index\") continue;\n if (token === \"_index\") continue;\n if (token.startsWith(\"_\")) continue;\n const pathToken = token.endsWith(\"_\") ? token.slice(0, -1) : token;\n if (pathToken === \"$\") {\n parts.push(\"*\");\n } else if (pathToken.startsWith(\"$\")) {\n const param = pathToken.slice(1) || \"param\";\n parts.push(`:${param}`);\n } else {\n parts.push(pathToken);\n }\n }\n }\n return `/${parts.join(\"/\")}`.replace(/\\/+/g, \"/\");\n}\n\nexport function discoverDesignRoutes(root: string): DesignConnectRoute[] {\n const absoluteRoot = path.resolve(root);\n const routeDirs = [\n path.join(absoluteRoot, \"app\", \"routes\"),\n path.join(absoluteRoot, \"src\", \"routes\"),\n path.join(absoluteRoot, \"pages\"),\n ].filter((dir) => fsSync.existsSync(dir));\n const routes = new Map<string, DesignConnectRoute>();\n\n for (const routeDir of routeDirs) {\n for (const file of walkFiles(routeDir)) {\n if (!/\\.[cm]?[jt]sx?$/.test(file)) continue;\n if (/\\.test\\.|\\.spec\\./.test(file)) continue;\n const pathName = routePathFromReactRouterFile(file, routeDir);\n routes.set(pathName, {\n id: routeId(pathName),\n path: pathName,\n title: titleFromRoutePath(pathName),\n sourceFile: normalizeSlash(path.relative(absoluteRoot, file)),\n sourceKind: \"react-router\",\n });\n }\n }\n\n if (routes.size === 0) {\n for (const dir of [absoluteRoot, path.join(absoluteRoot, \"public\")]) {\n for (const file of walkFiles(dir)) {\n if (!file.endsWith(\".html\")) continue;\n const rel = normalizeSlash(path.relative(dir, file));\n const pathName =\n rel === \"index.html\" ? \"/\" : `/${rel.replace(/\\.html$/, \"\")}`;\n routes.set(pathName, {\n id: routeId(pathName),\n path: pathName,\n title: titleFromRoutePath(pathName),\n sourceFile: normalizeSlash(path.relative(absoluteRoot, file)),\n sourceKind: \"html\",\n });\n }\n }\n }\n\n return [...routes.values()].sort((a, b) => {\n if (a.path === \"/\") return -1;\n if (b.path === \"/\") return 1;\n return a.path.localeCompare(b.path);\n });\n}\n\nasync function probeDevServer(url: string): Promise<boolean> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 800);\n try {\n const response = await fetch(url, {\n method: \"GET\",\n signal: controller.signal,\n });\n return response.status < 500;\n } catch {\n return false;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function resolveDevServerUrl(url?: string): Promise<string> {\n if (url) return normalizeHttpUrl(url);\n for (const candidate of DEFAULT_DEV_SERVER_CANDIDATES) {\n if (await probeDevServer(candidate)) return candidate;\n }\n return DEFAULT_DEV_SERVER_CANDIDATES[0]!;\n}\n\nasync function ensureRouteManifest(options: {\n root: string;\n routeManifestPath: string;\n routes: DesignConnectRoute[];\n devServerUrl: string;\n dryRun: boolean;\n}): Promise<{ path: string; created: boolean }> {\n const manifestPath = path.isAbsolute(options.routeManifestPath)\n ? options.routeManifestPath\n : path.join(options.root, options.routeManifestPath);\n if (fsSync.existsSync(manifestPath)) {\n return { path: manifestPath, created: false };\n }\n if (!options.dryRun) {\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(\n manifestPath,\n `${JSON.stringify(\n {\n version: 1,\n sourceType: \"localhost\",\n devServerUrl: options.devServerUrl,\n rootPath: options.root,\n routes: options.routes,\n generatedAt: new Date().toISOString(),\n },\n null,\n 2,\n )}\\n`,\n \"utf8\",\n );\n }\n return { path: manifestPath, created: !options.dryRun };\n}\n\nexport async function prepareDesignConnectManifest(\n options: Partial<DesignConnectArgs> & { root?: string } = {},\n): Promise<DesignConnectManifest> {\n const root = path.resolve(options.root ?? process.cwd());\n const port = options.port ?? DEFAULT_BRIDGE_PORT;\n const devServerUrl = await resolveDevServerUrl(options.url);\n const bridgeUrl = `http://127.0.0.1:${port}`;\n const routes = discoverDesignRoutes(root);\n const routeManifest = await ensureRouteManifest({\n root,\n routeManifestPath: options.routeManifest ?? ROUTE_MANIFEST_FILE,\n routes,\n devServerUrl,\n dryRun: Boolean(options.dryRun),\n });\n const generatedAt = new Date().toISOString();\n\n return {\n version: 1,\n source: \"agent-native-design-connect\",\n sourceType: \"localhost\",\n localOnly: true,\n devServerUrl,\n bridgeUrl,\n rootPath: root,\n routeManifestPath: routeManifest.path,\n routeManifestCreated: routeManifest.created,\n routes,\n routeCount: routes.length,\n generatedAt,\n capabilities: BRIDGE_OPERATIONS.map((operation) => ({\n operation,\n status:\n operation === \"readFile\" ||\n operation === \"applyEdit\" ||\n operation === \"writeFile\"\n ? \"planned\"\n : \"available\",\n reason:\n operation === \"writeFile\"\n ? \"The bridge advertises the contract before enabling local file writes.\"\n : operation === \"resolveNodeToFile\"\n ? // resolveNodeToFile maps a runtime DOM node id (from the editor's\n // 'select' payload) to { file, line, component } provenance. The\n // bridge endpoint exists; per-element provenance data must be\n // emitted by the connected app at build time — see the provenance\n // note in the help text below.\n \"Requires the connected app to emit data-source-file / data-source-line / data-component-name attributes (e.g. via @vitejs/plugin-react jsxDEV or a Babel source plugin).\"\n : undefined,\n })),\n };\n}\n\nfunction sendJson(\n res: ServerResponse,\n statusCode: number,\n body: Record<string, unknown>,\n) {\n res.writeHead(statusCode, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"access-control-allow-origin\": \"*\",\n \"access-control-allow-methods\": \"GET, OPTIONS\",\n \"access-control-allow-headers\": \"content-type\",\n \"access-control-allow-private-network\": \"true\",\n });\n res.end(`${JSON.stringify(body, null, 2)}\\n`);\n}\n\nexport async function startDesignConnectBridge(\n manifest: DesignConnectManifest,\n): Promise<DesignConnectBridge> {\n const server = http.createServer(\n (req: IncomingMessage, res: ServerResponse) => {\n if (req.method === \"OPTIONS\") {\n sendJson(res, 204, {});\n return;\n }\n const pathname = new URL(req.url ?? \"/\", manifest.bridgeUrl).pathname;\n if (pathname === \"/\" || pathname === \"/manifest.json\") {\n sendJson(res, 200, manifest as unknown as Record<string, unknown>);\n return;\n }\n if (pathname === \"/routes.json\") {\n sendJson(res, 200, {\n version: 1,\n sourceType: \"localhost\",\n devServerUrl: manifest.devServerUrl,\n rootPath: manifest.rootPath,\n routes: manifest.routes,\n generatedAt: manifest.generatedAt,\n });\n return;\n }\n if (pathname === \"/health\") {\n sendJson(res, 200, { ok: true, source: manifest.source });\n return;\n }\n sendJson(res, 404, { ok: false, error: \"not found\" });\n },\n );\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(new URL(manifest.bridgeUrl).port, \"127.0.0.1\", () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n\n return { server, manifest };\n}\n\nfunction printHelp() {\n console.log(`Usage:\n agent-native design connect [options]\n\nOptions:\n --url <url> Dev server URL to inspect (auto-detected if omitted)\n --port <number> Local bridge port (default ${DEFAULT_BRIDGE_PORT})\n --root <path> App/repo root for route discovery (default cwd)\n --route-manifest <path> Non-destructive route manifest output path\n --json Print the manifest JSON and exit\n --once Prepare/scaffold the manifest and exit\n --dry-run Print what would be exposed without writing files\n\nElement provenance (resolveNodeToFile):\n The design editor can map a selected DOM element back to its source file,\n line, and React component name when the connected app emits provenance\n attributes at build time. Add one of the following to your app's build:\n\n • @vitejs/plugin-react with jsxDEV enabled (development mode default):\n Sets data-source-file and data-source-line on each JSX element\n automatically when using the Babel transform.\n\n • A Babel source plugin (e.g. babel-plugin-react-source or a custom plugin):\n Emits data-source-file=\"src/Button.tsx\" data-source-line=\"12\"\n data-source-column=\"4\" data-component-name=\"Button\" on each element.\n\n • data-loc=\"src/Button.tsx:12:4\" shorthand attribute (Babel source convention):\n The bridge parses this as { sourceFile, line, column } automatically.\n\n Without these attributes the editor still works; provenance is simply absent.\n Cross-origin localhost iframes cannot be read regardless of attributes (CSP).`);\n}\n\nexport async function runDesign(argv: string[]) {\n const subcommand = argv[0];\n if (subcommand !== \"connect\") {\n if (\n subcommand === \"help\" ||\n subcommand === \"--help\" ||\n subcommand === \"-h\"\n ) {\n printHelp();\n return 0;\n }\n console.error(\"Usage: agent-native design connect [options]\");\n return 1;\n }\n\n const parsed = parseDesignConnectArgs(argv);\n if (parsed.help) {\n printHelp();\n return 0;\n }\n\n const manifest = await prepareDesignConnectManifest(parsed);\n if (parsed.json || parsed.once || parsed.dryRun) {\n console.log(JSON.stringify(manifest, null, 2));\n return 0;\n }\n\n const bridge = await startDesignConnectBridge(manifest);\n console.error(\"Design localhost bridge running\");\n console.error(`Bridge: ${manifest.bridgeUrl}`);\n console.error(`Manifest: ${manifest.bridgeUrl}/manifest.json`);\n console.error(`Routes: ${manifest.routeCount}`);\n console.error(`Dev URL: ${manifest.devServerUrl}`);\n\n return await new Promise<number>((resolve) => {\n const stop = () => {\n bridge.server.close(() => resolve(0));\n };\n for (const signal of [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as const) {\n process.once(signal, stop);\n }\n });\n}\n"]}
1
+ {"version":3,"file":"design-connect.js","sourceRoot":"","sources":["../../src/cli/design-connect.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from \"node:crypto\";\nimport fsSync from \"node:fs\";\nimport fs from \"node:fs/promises\";\nimport http, {\n type IncomingMessage,\n type Server,\n type ServerResponse,\n} from \"node:http\";\nimport path from \"node:path\";\n\nconst DEFAULT_BRIDGE_PORT = 7331;\nconst ROUTE_MANIFEST_FILE = path.join(\".agent-native\", \"design-routes.json\");\nconst DEFAULT_DEV_SERVER_CANDIDATES = [\n \"http://127.0.0.1:5173\",\n \"http://localhost:5173\",\n \"http://127.0.0.1:3000\",\n \"http://localhost:3000\",\n \"http://127.0.0.1:8080\",\n \"http://localhost:8080\",\n];\n\nconst BRIDGE_OPERATIONS = [\n \"select\",\n \"resolveNodeToFile\",\n \"readFile\",\n \"applyEdit\",\n \"writeFile\",\n \"captureSnapshot\",\n \"captureState\",\n] as const;\n\ntype BridgeOperation = (typeof BRIDGE_OPERATIONS)[number];\n\nexport interface DesignConnectArgs {\n url?: string;\n port: number;\n root: string;\n routeManifest?: string;\n /** Optional deployed design app URL used to self-register the bridge on\n * startup. When set (or when AGENT_NATIVE_URL / DESIGN_APP_URL env vars\n * are present) the CLI POSTs to `/_agent-native/actions/connect-localhost`\n * with the real bridge token so the server can store it for grant minting. */\n appUrl?: string;\n json: boolean;\n once: boolean;\n dryRun: boolean;\n help: boolean;\n}\n\nexport interface DesignConnectRoute {\n id: string;\n path: string;\n title: string;\n sourceFile?: string;\n sourceKind: \"react-router\" | \"html\" | \"manual\";\n}\n\nexport interface DesignConnectManifest {\n version: 1;\n source: \"agent-native-design-connect\";\n sourceType: \"localhost\";\n localOnly: true;\n devServerUrl: string;\n bridgeUrl: string;\n rootPath: string;\n routeManifestPath: string;\n routeManifestCreated: boolean;\n routes: DesignConnectRoute[];\n routeCount: number;\n generatedAt: string;\n capabilities: Array<{\n operation: BridgeOperation;\n status: \"available\" | \"planned\" | \"disabled\";\n reason?: string;\n }>;\n}\n\nexport interface DesignConnectBridge {\n server: Server;\n manifest: DesignConnectManifest;\n /** Per-rootPath bridge token. Kept in-process only; never serialised into\n * the manifest JSON so it is not exposed over the network via GET /manifest.\n * The server-side grant action reads it from the running bridge instance. */\n bridgeToken: string;\n}\n\nfunction stringFlagValue(argv: string[], index: number, flag: string) {\n const value = argv[index + 1];\n if (!value || value.startsWith(\"-\")) {\n throw new Error(`${flag} requires a value`);\n }\n return value;\n}\n\nfunction normalizeSlash(value: string) {\n return value.replace(/\\\\/g, \"/\");\n}\n\nfunction normalizeHttpUrl(value: string): string {\n const raw = value.trim();\n const withProtocol = /^[a-z]+:\\/\\//i.test(raw) ? raw : `http://${raw}`;\n const parsed = new URL(withProtocol);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"--url must be an http(s) URL\");\n }\n parsed.hash = \"\";\n return parsed.toString().replace(/\\/$/, \"\");\n}\n\nexport function parseDesignConnectArgs(argv: string[]): DesignConnectArgs {\n const args = argv[0] === \"connect\" ? argv.slice(1) : argv;\n const parsed: DesignConnectArgs = {\n port: DEFAULT_BRIDGE_PORT,\n root: process.cwd(),\n json: false,\n once: false,\n dryRun: false,\n help: false,\n };\n\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index]!;\n if (arg === \"help\" || arg === \"--help\" || arg === \"-h\") {\n parsed.help = true;\n } else if (arg === \"--url\") {\n parsed.url = stringFlagValue(args, index, arg);\n index += 1;\n } else if (arg.startsWith(\"--url=\")) {\n parsed.url = arg.slice(\"--url=\".length);\n } else if (arg === \"--port\") {\n parsed.port = Number.parseInt(stringFlagValue(args, index, arg), 10);\n index += 1;\n } else if (arg.startsWith(\"--port=\")) {\n parsed.port = Number.parseInt(arg.slice(\"--port=\".length), 10);\n } else if (arg === \"--root\") {\n parsed.root = stringFlagValue(args, index, arg);\n index += 1;\n } else if (arg.startsWith(\"--root=\")) {\n parsed.root = arg.slice(\"--root=\".length);\n } else if (arg === \"--route-manifest\") {\n parsed.routeManifest = stringFlagValue(args, index, arg);\n index += 1;\n } else if (arg.startsWith(\"--route-manifest=\")) {\n parsed.routeManifest = arg.slice(\"--route-manifest=\".length);\n } else if (arg === \"--app-url\") {\n parsed.appUrl = stringFlagValue(args, index, arg);\n index += 1;\n } else if (arg.startsWith(\"--app-url=\")) {\n parsed.appUrl = arg.slice(\"--app-url=\".length);\n } else if (arg === \"--json\") {\n parsed.json = true;\n parsed.once = true;\n } else if (arg === \"--once\") {\n parsed.once = true;\n } else if (arg === \"--dry-run\") {\n parsed.dryRun = true;\n parsed.once = true;\n } else if (arg.startsWith(\"-\")) {\n throw new Error(`Unknown option: ${arg}`);\n } else {\n throw new Error(`Unexpected argument: ${arg}`);\n }\n }\n\n if (!Number.isInteger(parsed.port) || parsed.port <= 0) {\n throw new Error(\"--port must be a positive integer\");\n }\n parsed.root = path.resolve(parsed.root);\n parsed.url = parsed.url ? normalizeHttpUrl(parsed.url) : undefined;\n return parsed;\n}\n\nfunction routeId(routePath: string): string {\n if (routePath === \"/\") return \"route-root\";\n const slug = routePath\n .replace(/^\\/+/, \"\")\n .replace(/[^a-zA-Z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .toLowerCase();\n return slug ? `route-${slug}` : \"route-wildcard\";\n}\n\nfunction titleFromRoutePath(routePath: string): string {\n if (routePath === \"/\") return \"Home\";\n if (routePath === \"/*\" || routePath === \"*\") return \"Wildcard\";\n return (\n routePath\n .replace(/^\\/+/, \"\")\n .replace(/[:$]/g, \"\")\n .replace(/[-_/]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .replace(/\\b\\w/g, (char) => char.toUpperCase()) || \"Screen\"\n );\n}\n\nfunction walkFiles(dir: string, files: string[] = []): string[] {\n if (!fsSync.existsSync(dir)) return files;\n for (const entry of fsSync.readdirSync(dir, { withFileTypes: true })) {\n if (entry.name === \"node_modules\" || entry.name === \".git\") continue;\n const absolute = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n walkFiles(absolute, files);\n } else {\n files.push(absolute);\n }\n }\n return files;\n}\n\nfunction routePathFromReactRouterFile(filePath: string, routesDir: string) {\n const withoutExt = normalizeSlash(path.relative(routesDir, filePath)).replace(\n /\\.[cm]?[jt]sx?$/,\n \"\",\n );\n const parts: string[] = [];\n for (const segment of withoutExt.split(\"/\")) {\n for (const token of segment.split(\".\")) {\n if (!token || token === \"route\" || token === \"index\") continue;\n if (token === \"_index\") continue;\n if (token.startsWith(\"_\")) continue;\n const pathToken = token.endsWith(\"_\") ? token.slice(0, -1) : token;\n if (pathToken === \"$\") {\n parts.push(\"*\");\n } else if (pathToken.startsWith(\"$\")) {\n const param = pathToken.slice(1) || \"param\";\n parts.push(`:${param}`);\n } else {\n parts.push(pathToken);\n }\n }\n }\n return `/${parts.join(\"/\")}`.replace(/\\/+/g, \"/\");\n}\n\nexport function discoverDesignRoutes(root: string): DesignConnectRoute[] {\n const absoluteRoot = path.resolve(root);\n const routeDirs = [\n path.join(absoluteRoot, \"app\", \"routes\"),\n path.join(absoluteRoot, \"src\", \"routes\"),\n path.join(absoluteRoot, \"pages\"),\n ].filter((dir) => fsSync.existsSync(dir));\n const routes = new Map<string, DesignConnectRoute>();\n\n for (const routeDir of routeDirs) {\n for (const file of walkFiles(routeDir)) {\n if (!/\\.[cm]?[jt]sx?$/.test(file)) continue;\n if (/\\.test\\.|\\.spec\\./.test(file)) continue;\n const pathName = routePathFromReactRouterFile(file, routeDir);\n routes.set(pathName, {\n id: routeId(pathName),\n path: pathName,\n title: titleFromRoutePath(pathName),\n sourceFile: normalizeSlash(path.relative(absoluteRoot, file)),\n sourceKind: \"react-router\",\n });\n }\n }\n\n if (routes.size === 0) {\n for (const dir of [absoluteRoot, path.join(absoluteRoot, \"public\")]) {\n for (const file of walkFiles(dir)) {\n if (!file.endsWith(\".html\")) continue;\n const rel = normalizeSlash(path.relative(dir, file));\n const pathName =\n rel === \"index.html\" ? \"/\" : `/${rel.replace(/\\.html$/, \"\")}`;\n routes.set(pathName, {\n id: routeId(pathName),\n path: pathName,\n title: titleFromRoutePath(pathName),\n sourceFile: normalizeSlash(path.relative(absoluteRoot, file)),\n sourceKind: \"html\",\n });\n }\n }\n }\n\n return [...routes.values()].sort((a, b) => {\n if (a.path === \"/\") return -1;\n if (b.path === \"/\") return 1;\n return a.path.localeCompare(b.path);\n });\n}\n\nasync function probeDevServer(url: string): Promise<boolean> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 800);\n try {\n const response = await fetch(url, {\n method: \"GET\",\n signal: controller.signal,\n });\n return response.status < 500;\n } catch {\n return false;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function resolveDevServerUrl(url?: string): Promise<string> {\n if (url) return normalizeHttpUrl(url);\n for (const candidate of DEFAULT_DEV_SERVER_CANDIDATES) {\n if (await probeDevServer(candidate)) return candidate;\n }\n return DEFAULT_DEV_SERVER_CANDIDATES[0]!;\n}\n\nasync function ensureRouteManifest(options: {\n root: string;\n routeManifestPath: string;\n routes: DesignConnectRoute[];\n devServerUrl: string;\n dryRun: boolean;\n}): Promise<{ path: string; created: boolean }> {\n const manifestPath = path.isAbsolute(options.routeManifestPath)\n ? options.routeManifestPath\n : path.join(options.root, options.routeManifestPath);\n if (fsSync.existsSync(manifestPath)) {\n return { path: manifestPath, created: false };\n }\n if (!options.dryRun) {\n await fs.mkdir(path.dirname(manifestPath), { recursive: true });\n await fs.writeFile(\n manifestPath,\n `${JSON.stringify(\n {\n version: 1,\n sourceType: \"localhost\",\n devServerUrl: options.devServerUrl,\n rootPath: options.root,\n routes: options.routes,\n generatedAt: new Date().toISOString(),\n },\n null,\n 2,\n )}\\n`,\n \"utf8\",\n );\n }\n return { path: manifestPath, created: !options.dryRun };\n}\n\nexport async function prepareDesignConnectManifest(\n options: Partial<DesignConnectArgs> & { root?: string } = {},\n): Promise<DesignConnectManifest> {\n const root = path.resolve(options.root ?? process.cwd());\n const port = options.port ?? DEFAULT_BRIDGE_PORT;\n const devServerUrl = await resolveDevServerUrl(options.url);\n const bridgeUrl = `http://127.0.0.1:${port}`;\n const routes = discoverDesignRoutes(root);\n const routeManifest = await ensureRouteManifest({\n root,\n routeManifestPath: options.routeManifest ?? ROUTE_MANIFEST_FILE,\n routes,\n devServerUrl,\n dryRun: Boolean(options.dryRun),\n });\n const generatedAt = new Date().toISOString();\n\n return {\n version: 1,\n source: \"agent-native-design-connect\",\n sourceType: \"localhost\",\n localOnly: true,\n devServerUrl,\n bridgeUrl,\n rootPath: root,\n routeManifestPath: routeManifest.path,\n routeManifestCreated: routeManifest.created,\n routes,\n routeCount: routes.length,\n generatedAt,\n capabilities: BRIDGE_OPERATIONS.map((operation) => ({\n operation,\n status: \"available\" as const,\n reason:\n operation === \"resolveNodeToFile\"\n ? // resolveNodeToFile maps a runtime DOM node id (from the editor's\n // 'select' payload) to { file, line, component } provenance. The\n // bridge endpoint exists; per-element provenance data must be\n // emitted by the connected app at build time — see the provenance\n // note in the help text below.\n \"Requires the connected app to emit data-source-file / data-source-line / data-component-name attributes (e.g. via @vitejs/plugin-react jsxDEV or a Babel source plugin).\"\n : undefined,\n })),\n };\n}\n\nfunction sendJson(\n res: ServerResponse,\n statusCode: number,\n body: Record<string, unknown>,\n) {\n res.writeHead(statusCode, {\n \"content-type\": \"application/json; charset=utf-8\",\n \"access-control-allow-origin\": \"*\",\n \"access-control-allow-methods\": \"GET, POST, OPTIONS\",\n \"access-control-allow-headers\": \"content-type, x-bridge-token\",\n \"access-control-allow-private-network\": \"true\",\n });\n res.end(`${JSON.stringify(body, null, 2)}\\n`);\n}\n\n/** Read the full request body as a UTF-8 string. */\nasync function readRequestBody(req: IncomingMessage): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf8\")));\n req.on(\"error\", reject);\n });\n}\n\n/**\n * Resolve `targetDir` under `rootPath` with realpath so that symlinks and\n * traversal sequences (../../etc) cannot escape the root. Throws if the\n * resolved path does not start with the resolved root.\n */\nasync function assertPathInside(\n rootPath: string,\n targetPath: string,\n): Promise<void> {\n const resolvedRoot = await fs.realpath(rootPath).catch(() => {\n throw new Error(`Bridge root path does not exist: ${rootPath}`);\n });\n\n // Resolve the parent directory (the file itself may not exist yet for writes).\n const targetParent = path.dirname(path.resolve(rootPath, targetPath));\n const resolvedParent = await fs.realpath(targetParent).catch(async () => {\n // Parent may not exist yet; walk up until we find a real ancestor.\n let candidate = targetParent;\n for (let i = 0; i < 32; i++) {\n const up = path.dirname(candidate);\n if (up === candidate) break;\n candidate = up;\n try {\n return await fs.realpath(candidate);\n } catch {\n // keep walking\n }\n }\n throw new Error(`Cannot resolve parent directory: ${targetParent}`);\n });\n\n if (\n !resolvedParent.startsWith(resolvedRoot + path.sep) &&\n resolvedParent !== resolvedRoot\n ) {\n throw new Error(`Path traversal detected: resolved target is outside root`);\n }\n}\n\n/** Allowed file extensions for write/apply-edit operations. */\nconst ALLOWED_WRITE_EXTENSIONS = new Set([\".html\", \".htm\", \".css\"]);\n\nfunction assertAllowedExtension(relPath: string): void {\n const ext = path.extname(relPath).toLowerCase();\n if (!ALLOWED_WRITE_EXTENSIONS.has(ext)) {\n throw new Error(\n `Write rejected: only .html, .htm, and .css files may be written via the bridge (got ${ext || \"(no extension)\"})`,\n );\n }\n}\n\nfunction countOccurrences(haystack: string, needle: string): number {\n if (!needle) return 0;\n let count = 0;\n let index = haystack.indexOf(needle);\n while (index !== -1) {\n count += 1;\n if (count > 1) return count;\n index = haystack.indexOf(needle, index + 1);\n }\n return count;\n}\n\nexport async function startDesignConnectBridge(\n manifest: DesignConnectManifest,\n): Promise<DesignConnectBridge> {\n // Mint a cryptographically random per-rootPath bridge token. This token is\n // kept in-process only and is never emitted via the public GET routes so that\n // an unauthenticated caller cannot read it. The server-side grant action\n // obtains it out-of-band (via the exported bridge reference).\n const bridgeToken = crypto.randomBytes(32).toString(\"hex\");\n\n const server = http.createServer(\n (req: IncomingMessage, res: ServerResponse) => {\n if (req.method === \"OPTIONS\") {\n sendJson(res, 204, {});\n return;\n }\n\n const pathname = new URL(req.url ?? \"/\", manifest.bridgeUrl).pathname;\n\n // ── Public read-only routes (no token required) ──────────────────────\n\n if (pathname === \"/\" || pathname === \"/manifest.json\") {\n sendJson(res, 200, manifest as unknown as Record<string, unknown>);\n return;\n }\n if (pathname === \"/routes.json\") {\n sendJson(res, 200, {\n version: 1,\n sourceType: \"localhost\",\n devServerUrl: manifest.devServerUrl,\n rootPath: manifest.rootPath,\n routes: manifest.routes,\n generatedAt: manifest.generatedAt,\n });\n return;\n }\n if (pathname === \"/health\") {\n sendJson(res, 200, { ok: true, source: manifest.source });\n return;\n }\n\n // ── Token-gated write endpoints (POST only) ───────────────────────────\n\n if (\n pathname === \"/read-file\" ||\n pathname === \"/write-file\" ||\n pathname === \"/apply-edit\"\n ) {\n if (req.method !== \"POST\") {\n sendJson(res, 405, { ok: false, error: \"method not allowed\" });\n return;\n }\n\n // Authenticate with constant-time comparison to prevent timing attacks.\n const tokenHeader = req.headers[\"x-bridge-token\"];\n const providedToken =\n typeof tokenHeader === \"string\" ? tokenHeader : \"\";\n let tokenValid = false;\n try {\n tokenValid =\n providedToken.length === bridgeToken.length &&\n crypto.timingSafeEqual(\n Buffer.from(providedToken, \"utf8\"),\n Buffer.from(bridgeToken, \"utf8\"),\n );\n } catch {\n tokenValid = false;\n }\n if (!tokenValid) {\n sendJson(res, 401, {\n ok: false,\n error: \"invalid or missing bridge token\",\n });\n return;\n }\n\n // Handle asynchronously so we can use await.\n void (async () => {\n try {\n const raw = await readRequestBody(req);\n const body = JSON.parse(raw) as Record<string, unknown>;\n const relPath =\n typeof body[\"relPath\"] === \"string\" ? body[\"relPath\"] : undefined;\n\n if (!relPath) {\n sendJson(res, 400, { ok: false, error: \"relPath is required\" });\n return;\n }\n\n await assertPathInside(manifest.rootPath, relPath);\n const absolutePath = path.resolve(manifest.rootPath, relPath);\n\n if (pathname === \"/read-file\") {\n // Read-file: no extension restriction — agents need to read any file.\n let content: string;\n try {\n content = await fs.readFile(absolutePath, \"utf8\");\n } catch (err: unknown) {\n const code =\n err instanceof Error &&\n \"code\" in err &&\n (err as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n sendJson(res, 404, { ok: false, error: \"file not found\" });\n } else {\n sendJson(res, 500, {\n ok: false,\n error: `read failed: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n sendJson(res, 200, { ok: true, content });\n return;\n }\n\n // write-file and apply-edit only allow .html/.htm/.css.\n assertAllowedExtension(relPath);\n\n if (pathname === \"/write-file\") {\n const content =\n typeof body[\"content\"] === \"string\"\n ? body[\"content\"]\n : undefined;\n if (content === undefined) {\n sendJson(res, 400, {\n ok: false,\n error: \"content is required for write-file\",\n });\n return;\n }\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n await fs.writeFile(absolutePath, content, \"utf8\");\n sendJson(res, 200, { ok: true, relPath });\n return;\n }\n\n // /apply-edit: supports either full replace ({content}) or\n // search-and-replace ({search, replace}).\n if (typeof body[\"content\"] === \"string\") {\n // Full-file replace via apply-edit — same as write-file but keeps\n // the endpoint semantically separate for callers that want to\n // distinguish intent.\n await fs.mkdir(path.dirname(absolutePath), { recursive: true });\n await fs.writeFile(\n absolutePath,\n body[\"content\"] as string,\n \"utf8\",\n );\n sendJson(res, 200, { ok: true, relPath, method: \"replace\" });\n return;\n }\n\n const search =\n typeof body[\"search\"] === \"string\" ? body[\"search\"] : undefined;\n const replace =\n typeof body[\"replace\"] === \"string\" ? body[\"replace\"] : undefined;\n if (search === undefined || replace === undefined) {\n sendJson(res, 400, {\n ok: false,\n error:\n \"apply-edit requires either {content} for a full replace, or {search, replace} for a patch\",\n });\n return;\n }\n\n let existing: string;\n try {\n existing = await fs.readFile(absolutePath, \"utf8\");\n } catch (err: unknown) {\n const code =\n err instanceof Error &&\n \"code\" in err &&\n (err as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n sendJson(res, 404, {\n ok: false,\n error: \"file not found — use write-file to create new files\",\n });\n } else {\n sendJson(res, 500, {\n ok: false,\n error: `read failed: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n return;\n }\n\n if (search.length === 0) {\n sendJson(res, 400, {\n ok: false,\n error: \"search string must not be empty\",\n });\n return;\n }\n\n const occurrenceCount = countOccurrences(existing, search);\n if (occurrenceCount === 0) {\n sendJson(res, 422, {\n ok: false,\n error: \"search string not found in file\",\n });\n return;\n }\n if (occurrenceCount > 1) {\n sendJson(res, 422, {\n ok: false,\n error:\n \"search string is ambiguous; it appears more than once in the file\",\n });\n return;\n }\n\n const updated = existing.replace(search, replace);\n await fs.writeFile(absolutePath, updated, \"utf8\");\n sendJson(res, 200, { ok: true, relPath, method: \"patch\" });\n } catch (err: unknown) {\n sendJson(res, 500, {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n })();\n return;\n }\n\n sendJson(res, 404, { ok: false, error: \"not found\" });\n },\n );\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(new URL(manifest.bridgeUrl).port, \"127.0.0.1\", () => {\n server.off(\"error\", reject);\n resolve();\n });\n });\n\n return { server, manifest, bridgeToken };\n}\n\n/**\n * Resolve the design app URL from an explicit value or environment variables.\n * Returns undefined when no URL is configured (registration is optional).\n */\nexport function resolveAppUrl(explicit?: string): string | undefined {\n const raw =\n explicit ||\n process.env[\"AGENT_NATIVE_URL\"] ||\n process.env[\"DESIGN_APP_URL\"] ||\n process.env[\"APP_URL\"] ||\n process.env[\"VITE_APP_URL\"] ||\n process.env[\"BETTER_AUTH_URL\"] ||\n process.env[\"VITE_BETTER_AUTH_URL\"];\n if (!raw) return undefined;\n try {\n const parsed = new URL(raw.trim());\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return undefined;\n }\n return parsed.toString().replace(/\\/+$/, \"\");\n } catch {\n return undefined;\n }\n}\n\n/**\n * Resolve a bearer token from environment variables for authenticating the\n * self-registration POST. The CLI does not perform a device-code flow — it\n * relies on a pre-minted token supplied via env var (e.g. the same token\n * already written into the agent's MCP config).\n */\nfunction resolveAuthToken(): string | undefined {\n return (\n process.env[\"AGENT_NATIVE_TOKEN\"] ||\n process.env[\"DESIGN_ACCESS_TOKEN\"] ||\n process.env[\"ACCESS_TOKEN\"] ||\n undefined\n );\n}\n\n/**\n * POST to the design app's `connect-localhost` action endpoint to register\n * (or refresh) the bridge connection and persist the real bridge token on the\n * server row. This is a best-effort call: failures are logged but do not\n * abort the bridge process.\n *\n * @param appUrl - Deployed design app base URL (e.g. https://design.agent-native.com)\n * @param bridge - The running bridge returned by startDesignConnectBridge\n * @param authToken - Optional bearer token for the authenticated action route\n */\nexport async function registerConnectionWithServer(\n appUrl: string,\n bridge: DesignConnectBridge,\n authToken?: string,\n): Promise<void> {\n const endpoint = `${appUrl}/_agent-native/actions/connect-localhost`;\n const { manifest, bridgeToken } = bridge;\n const payload = {\n devServerUrl: manifest.devServerUrl,\n bridgeUrl: manifest.bridgeUrl,\n rootPath: manifest.rootPath,\n capabilities: manifest.capabilities,\n routeManifest: {\n version: 1 as const,\n sourceType: \"localhost\" as const,\n devServerUrl: manifest.devServerUrl,\n rootPath: manifest.rootPath,\n routes: manifest.routes,\n generatedAt: manifest.generatedAt,\n },\n // Include the real bridge token so the server stores it on the connection\n // row. grant-localhost-write-consent then reads it from the row instead of\n // minting its own unrelated token, which would always produce a 401.\n bridgeToken,\n status: \"connected\" as const,\n };\n\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n };\n if (authToken) {\n headers[\"authorization\"] = `Bearer ${authToken}`;\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 15_000);\n try {\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers,\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n if (!res.ok) {\n const message = await res.text().catch(() => res.statusText);\n throw new Error(`${res.status} ${message || res.statusText}`);\n }\n } catch (error) {\n // Best-effort: network errors or auth issues are non-fatal, but make the\n // problem discoverable before the user tries \"Apply to source\".\n console.error(\n `[design connect] Could not register bridge with ${endpoint}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n } finally {\n clearTimeout(timeout);\n }\n}\n\nfunction printHelp() {\n console.log(`Usage:\n agent-native design connect [options]\n\nOptions:\n --url <url> Dev server URL to inspect (auto-detected if omitted)\n --port <number> Local bridge port (default ${DEFAULT_BRIDGE_PORT})\n --root <path> App/repo root for route discovery (default cwd)\n --route-manifest <path> Non-destructive route manifest output path\n --app-url <url> Deployed design app URL for self-registration\n (also reads AGENT_NATIVE_URL / DESIGN_APP_URL env)\n --json Print the manifest JSON and exit\n --once Prepare/scaffold the manifest and exit\n --dry-run Print what would be exposed without writing files\n\nElement provenance (resolveNodeToFile):\n The design editor can map a selected DOM element back to its source file,\n line, and React component name when the connected app emits provenance\n attributes at build time. Add one of the following to your app's build:\n\n • @vitejs/plugin-react with jsxDEV enabled (development mode default):\n Sets data-source-file and data-source-line on each JSX element\n automatically when using the Babel transform.\n\n • A Babel source plugin (e.g. babel-plugin-react-source or a custom plugin):\n Emits data-source-file=\"src/Button.tsx\" data-source-line=\"12\"\n data-source-column=\"4\" data-component-name=\"Button\" on each element.\n\n • data-loc=\"src/Button.tsx:12:4\" shorthand attribute (Babel source convention):\n The bridge parses this as { sourceFile, line, column } automatically.\n\n Without these attributes the editor still works; provenance is simply absent.\n Cross-origin localhost iframes cannot be read regardless of attributes (CSP).`);\n}\n\nexport async function runDesign(argv: string[]) {\n const subcommand = argv[0];\n if (subcommand !== \"connect\") {\n if (\n subcommand === \"help\" ||\n subcommand === \"--help\" ||\n subcommand === \"-h\"\n ) {\n printHelp();\n return 0;\n }\n console.error(\"Usage: agent-native design connect [options]\");\n return 1;\n }\n\n const parsed = parseDesignConnectArgs(argv);\n if (parsed.help) {\n printHelp();\n return 0;\n }\n\n const manifest = await prepareDesignConnectManifest(parsed);\n if (parsed.json || parsed.once || parsed.dryRun) {\n console.log(JSON.stringify(manifest, null, 2));\n return 0;\n }\n\n const bridge = await startDesignConnectBridge(manifest);\n console.error(\"Design localhost bridge running\");\n console.error(`Bridge: ${manifest.bridgeUrl}`);\n console.error(`Manifest: ${manifest.bridgeUrl}/manifest.json`);\n console.error(`Routes: ${manifest.routeCount}`);\n console.error(`Dev URL: ${manifest.devServerUrl}`);\n\n // Self-register with the design app server (best-effort). When an app URL\n // is available (via --app-url or env var) the CLI POSTs the bridge token to\n // connect-localhost so the server row stores the real token. Without this\n // step grant-localhost-write-consent would mint a different token, causing\n // every bridge write to return 401.\n const appUrl = resolveAppUrl(parsed.appUrl);\n if (appUrl) {\n const authToken = resolveAuthToken();\n void registerConnectionWithServer(appUrl, bridge, authToken);\n }\n\n return await new Promise<number>((resolve) => {\n const stop = () => {\n bridge.server.close(() => resolve(0));\n };\n for (const signal of [\"SIGINT\", \"SIGTERM\", \"SIGHUP\"] as const) {\n process.once(signal, stop);\n }\n });\n}\n"]}
@@ -17,6 +17,20 @@ export interface AssistantChatSendOptions {
17
17
  trackInRunsTray?: boolean;
18
18
  requestMode?: AgentRequestMode;
19
19
  }
20
+ /**
21
+ * Decide whether a reconnect should give up with "no progress". The signal is
22
+ * *time since the last streamed event*, NOT total reconnect duration: a healthy
23
+ * long-running tool (e.g. image generation, which emits `activity` heartbeats
24
+ * every few seconds) makes continuous progress and must never be aborted just
25
+ * for running longer than the threshold. Only genuine silence for the full
26
+ * stuck threshold counts as stuck. Pure + exported so the decision is unit
27
+ * testable without driving the whole reconnect lifecycle.
28
+ */
29
+ export declare function reconnectProgressTimedOut(args: {
30
+ lastProgressAt: number;
31
+ now: number;
32
+ thresholdMs?: number;
33
+ }): boolean;
20
34
  export declare function latestNonRecoveryUserMessageText(messages: readonly unknown[]): string;
21
35
  export declare function resolveAssistantChatSubmitIntent({ isRunning, requestedIntent, }: {
22
36
  isRunning: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AssistantChat.d.ts","sourceRoot":"","sources":["../../src/client/AssistantChat.tsx"],"names":[],"mappings":"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"}
@@ -68,6 +68,12 @@ const PENDING_SELECTION_KEY = "pending-selection-context";
68
68
  const ACTIVE_RUN_CLEAR_TIMEOUT_MS = 5_000;
69
69
  const ACTIVE_RUN_STUCK_THRESHOLD_MS = 90_000;
70
70
  const ACTIVE_RUN_POLL_INTERVAL_MS = 150;
71
+ // How long a single activity (model call, tool prep, long tool) must stay
72
+ // in-flight before its label is surfaced in the running indicator. Below this
73
+ // the indicator stays a steady "Thinking" so normal fast turns don't flicker
74
+ // through transient labels ("Contacting model", "Preparing X action"); past it
75
+ // the live label appears so a genuinely slow step reads as working, not hung.
76
+ const ACTIVITY_LABEL_REVEAL_DELAY_MS = 6_000;
71
77
  const SUBMIT_ENGINE_STATUS_TIMEOUT_MS = 1000;
72
78
  function activeRunLooksStale(runInfo) {
73
79
  const lastProgressAt = typeof runInfo.lastProgressAt === "number" ? runInfo.lastProgressAt : null;
@@ -76,6 +82,19 @@ function activeRunLooksStale(runInfo) {
76
82
  lastProgressAt != null &&
77
83
  nowMs - lastProgressAt > ACTIVE_RUN_STUCK_THRESHOLD_MS);
78
84
  }
85
+ /**
86
+ * Decide whether a reconnect should give up with "no progress". The signal is
87
+ * *time since the last streamed event*, NOT total reconnect duration: a healthy
88
+ * long-running tool (e.g. image generation, which emits `activity` heartbeats
89
+ * every few seconds) makes continuous progress and must never be aborted just
90
+ * for running longer than the threshold. Only genuine silence for the full
91
+ * stuck threshold counts as stuck. Pure + exported so the decision is unit
92
+ * testable without driving the whole reconnect lifecycle.
93
+ */
94
+ export function reconnectProgressTimedOut(args) {
95
+ const threshold = args.thresholdMs ?? ACTIVE_RUN_STUCK_THRESHOLD_MS;
96
+ return args.now - args.lastProgressAt >= threshold;
97
+ }
79
98
  function isAssistantUiDuplicateMessageIdError(error) {
80
99
  const message = error instanceof Error ? error.message : String(error ?? "");
81
100
  return (message.includes("MessageRepository") &&
@@ -690,6 +709,22 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
690
709
  // True during the 250ms continuation window and startup of the next chunk
691
710
  // (adapter's auto-continue delay before POSTing the next chunk).
692
711
  const [isAutoResuming, setIsAutoResuming] = useState(false);
712
+ const [runningActivityLabel, setRunningActivityLabel] = useState(null);
713
+ // Delayed-reveal state for the activity label (see ACTIVITY_LABEL_REVEAL_DELAY_MS).
714
+ // `latest` holds the most recent activity label; `surfaced` flips true once the
715
+ // reveal timer fires; `timer` is the pending one-shot reveal.
716
+ const activityLabelTimerRef = useRef(null);
717
+ const latestActivityLabelRef = useRef(null);
718
+ const activityLabelSurfacedRef = useRef(false);
719
+ const resetRunningActivity = useCallback(() => {
720
+ if (activityLabelTimerRef.current !== null) {
721
+ window.clearTimeout(activityLabelTimerRef.current);
722
+ activityLabelTimerRef.current = null;
723
+ }
724
+ latestActivityLabelRef.current = null;
725
+ activityLabelSurfacedRef.current = false;
726
+ setRunningActivityLabel(null);
727
+ }, []);
693
728
  const [reconnectContent, setReconnectContent] = useState([]);
694
729
  // When stop is clicked during reconnect, keep content visible (don't wipe it)
695
730
  const [reconnectFrozen, setReconnectFrozen] = useState(false);
@@ -708,6 +743,19 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
708
743
  const textStreaming = isRunning || externalStreaming;
709
744
  // UI-only running state — drives the stop button and thinking indicator.
710
745
  const showRunningInUI = isRunning;
746
+ // A revealed activity label wins; otherwise stay a steady "Thinking" by
747
+ // default. We only surface "Reconnecting" while we are actively replaying
748
+ // recovered content (reconnectContent populated). A bare reconnect with no
749
+ // replayed content — e.g. a tail-resume after the serverless wall, where
750
+ // `scheduleUpdate` intentionally leaves reconnectContent empty — is normal
751
+ // ongoing work, so it must read as "Thinking", never a perpetual "Working".
752
+ const runningStatusLabel = runningActivityLabel
753
+ ? runningActivityLabel
754
+ : isAutoResuming
755
+ ? "Resuming"
756
+ : isReconnecting && reconnectContent.length > 0
757
+ ? "Reconnecting"
758
+ : "Thinking";
711
759
  const lastBroadcastRunningRef = useRef(isRunning);
712
760
  const tiptapRef = useRef(null);
713
761
  // Stable ref to the "stop active run" action so addToQueue can abort
@@ -938,11 +986,30 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
938
986
  }
939
987
  }, 1000);
940
988
  let reconnectTimedOut = false;
941
- const maxReconnectTimer = setTimeout(() => {
989
+ // Idle deadline, NOT a total-duration cap. A long-but-healthy run (image
990
+ // generation emits `activity` heartbeats every few seconds) keeps
991
+ // advancing `lastReconnectProgressAt`, so it is never aborted for simply
992
+ // taking longer than the threshold. Only true silence for the full stuck
993
+ // threshold trips it — the same semantics as `activeRunLooksStale` and the
994
+ // SSE-level no-progress timeout. `markReconnectProgress` resets it on every
995
+ // streamed event (see the `onSeq` callback below, which fires for every
996
+ // event including activity, for both fresh and tail-resume reconnects).
997
+ let lastReconnectProgressAt = Date.now();
998
+ const markReconnectProgress = () => {
999
+ lastReconnectProgressAt = Date.now();
1000
+ };
1001
+ const idleCheck = setInterval(() => {
1002
+ if (!reconnectProgressTimedOut({
1003
+ lastProgressAt: lastReconnectProgressAt,
1004
+ now: Date.now(),
1005
+ })) {
1006
+ return;
1007
+ }
942
1008
  reconnectTimedOut = true;
943
1009
  abortCtrl.abort();
944
1010
  clearInterval(watchdog);
945
- }, 20_000);
1011
+ clearInterval(idleCheck);
1012
+ }, 1000);
946
1013
  const streamReconnect = async () => {
947
1014
  let noProgressDuringReconnect = false;
948
1015
  let latestContent = [];
@@ -973,7 +1040,10 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
973
1040
  setReconnectContent(latestSnapshot);
974
1041
  });
975
1042
  };
976
- await readSSEStreamRaw(sseRes.body, content, toolCallCounter, tabId, scheduleUpdate, (seq) => updateActiveRunSeq(seq));
1043
+ await readSSEStreamRaw(sseRes.body, content, toolCallCounter, tabId, scheduleUpdate, (seq) => {
1044
+ markReconnectProgress();
1045
+ updateActiveRunSeq(seq);
1046
+ });
977
1047
  if (afterSeq === 0) {
978
1048
  setReconnectContent([...content]);
979
1049
  }
@@ -995,7 +1065,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
995
1065
  window.clearInterval(threadPollInterval);
996
1066
  }
997
1067
  clearInterval(watchdog);
998
- clearTimeout(maxReconnectTimer);
1068
+ clearInterval(idleCheck);
999
1069
  }
1000
1070
  if (noProgressDuringReconnect && reconnectRunIdRef.current === runId) {
1001
1071
  captureError(new Error("agent-chat:reconnect_no_progress"), {
@@ -1530,23 +1600,52 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1530
1600
  window.addEventListener("agent-chat:run-error", handler);
1531
1601
  return () => window.removeEventListener("agent-chat:run-error", handler);
1532
1602
  }, [tabId]);
1533
- // Real activity means the next chunk has started leave the auto-resume
1534
- // ("Resuming") state so the indicator settles back to "Thinking". The
1535
- // activity label itself is intentionally not surfaced: the running
1536
- // indicator stays a steady "Thinking" rather than flipping through
1537
- // transient step labels.
1603
+ // Real activity means the next chunk has started. Surface longer-lived
1604
+ // activity such as "Still generating image" so active-run reconnects do not
1605
+ // look like failures while the server is still making progress.
1538
1606
  useEffect(() => {
1539
1607
  const handler = (e) => {
1540
1608
  const detail = e.detail;
1541
1609
  if (tabId && detail?.tabId && detail.tabId !== tabId)
1542
1610
  return;
1543
- if (typeof detail?.label === "string" && detail.label.trim()) {
1544
- setIsAutoResuming(false);
1611
+ const label = typeof detail?.label === "string" ? detail.label.trim() : "";
1612
+ if (!label)
1613
+ return;
1614
+ setIsAutoResuming(false);
1615
+ latestActivityLabelRef.current = label;
1616
+ // Already past the delay → keep the visible label current.
1617
+ if (activityLabelSurfacedRef.current) {
1618
+ setRunningActivityLabel(label);
1619
+ return;
1620
+ }
1621
+ // Not yet surfaced → arm a single reveal timer on the FIRST activity of
1622
+ // this in-flight period. A burst of quick steps that all finish (clear)
1623
+ // before the timer fires never surfaces anything, so normal fast turns
1624
+ // stay a steady "Thinking". A step still in-flight at the deadline reveals
1625
+ // the latest label so a slow operation reads as working, not hung.
1626
+ if (activityLabelTimerRef.current === null) {
1627
+ activityLabelTimerRef.current = window.setTimeout(() => {
1628
+ activityLabelTimerRef.current = null;
1629
+ activityLabelSurfacedRef.current = true;
1630
+ if (latestActivityLabelRef.current) {
1631
+ setRunningActivityLabel(latestActivityLabelRef.current);
1632
+ }
1633
+ }, ACTIVITY_LABEL_REVEAL_DELAY_MS);
1545
1634
  }
1546
1635
  };
1636
+ const clear = (e) => {
1637
+ const detail = e.detail;
1638
+ if (tabId && detail?.tabId && detail.tabId !== tabId)
1639
+ return;
1640
+ resetRunningActivity();
1641
+ };
1547
1642
  window.addEventListener("agent-chat:activity", handler);
1548
- return () => window.removeEventListener("agent-chat:activity", handler);
1549
- }, [tabId]);
1643
+ window.addEventListener("agent-chat:activity-clear", clear);
1644
+ return () => {
1645
+ window.removeEventListener("agent-chat:activity", handler);
1646
+ window.removeEventListener("agent-chat:activity-clear", clear);
1647
+ };
1648
+ }, [resetRunningActivity, tabId]);
1550
1649
  // Show "Resuming…" during the adapter's auto-continuation window (the
1551
1650
  // ~250ms gap between the end of one serverless chunk and the POST for the
1552
1651
  // next). The adapter dispatches `agent-chat:auto-continue` at that moment.
@@ -1564,8 +1663,9 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
1564
1663
  useEffect(() => {
1565
1664
  if (!isRunning) {
1566
1665
  setIsAutoResuming(false);
1666
+ resetRunningActivity();
1567
1667
  }
1568
- }, [isRunning]);
1668
+ }, [isRunning, resetRunningActivity]);
1569
1669
  // Auto-dequeue: when the agent is idle, send the next queued message. This
1570
1670
  // intentionally does not depend on observing the running -> idle transition:
1571
1671
  // restored queues can exist after a reload where this component never saw the
@@ -2245,14 +2345,7 @@ const AssistantChatInner = forwardRef(function AssistantChatInner({ emptyStateTe
2245
2345
  setRunErrorInfo(null);
2246
2346
  } })), (isReconnecting || reconnectFrozen) &&
2247
2347
  reconnectAfterSeq === 0 &&
2248
- reconnectContent.length > 0 && (_jsx(ReconnectStreamMessage, { content: reconnectContent })), showRunningInUI && (_jsx(RunningActivityStatus, { label: isReconnecting
2249
- ? "Reconnecting"
2250
- : isAutoResuming
2251
- ? "Resuming"
2252
- : // Keep a steady "Thinking" while the model works —
2253
- // never flip through transient activity labels
2254
- // (e.g. "Contacting model", "Preparing X action").
2255
- "Thinking" })), queuedMessages.map((msg) => {
2348
+ reconnectContent.length > 0 && (_jsx(ReconnectStreamMessage, { content: reconnectContent })), showRunningInUI && (_jsx(RunningActivityStatus, { label: runningStatusLabel })), queuedMessages.map((msg) => {
2256
2349
  const displayText = msg.text
2257
2350
  .replace(/<context>[\s\S]*?<\/context>\n?/g, "")
2258
2351
  .trim();