@agent-native/core 0.92.10 → 0.92.12

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 (354) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +29 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/agent/production-agent.ts +214 -17
  5. package/corpus/core/src/agent/run-manager.ts +72 -14
  6. package/corpus/core/src/agent/run-store.ts +152 -27
  7. package/corpus/core/src/cli/design-connect.ts +433 -151
  8. package/corpus/core/src/cli/skills.ts +14 -0
  9. package/corpus/core/src/client/AssistantChat.tsx +25 -0
  10. package/corpus/core/src/client/MultiTabAssistantChat.tsx +40 -6
  11. package/corpus/core/src/client/agent-chat-adapter.ts +56 -12
  12. package/corpus/core/src/client/agent-chat.ts +165 -1
  13. package/corpus/core/src/client/chat/index.ts +9 -1
  14. package/corpus/core/src/client/extensions/EmbeddedExtension.tsx +38 -2
  15. package/corpus/core/src/client/index.ts +5 -0
  16. package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +18 -7
  17. package/corpus/core/src/collab/awareness-store.ts +23 -12
  18. package/corpus/core/src/collab/client.ts +16 -5
  19. package/corpus/core/src/collab/index.ts +4 -0
  20. package/corpus/core/src/collab/recent-edits.ts +65 -2
  21. package/corpus/core/src/index.browser.ts +1 -0
  22. package/corpus/core/src/server/agent-chat-plugin.ts +98 -11
  23. package/corpus/core/src/server/builder-design-systems.ts +30 -4
  24. package/corpus/templates/clips/.agents/skills/ai-video-tools/SKILL.md +1 -1
  25. package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +12 -6
  26. package/corpus/templates/clips/AGENTS.md +4 -0
  27. package/corpus/templates/clips/actions/create-recording.ts +2 -0
  28. package/corpus/templates/clips/actions/lib/create-recording-schema.ts +5 -3
  29. package/corpus/templates/clips/actions/request-transcript.ts +102 -33
  30. package/corpus/templates/clips/app/components/library/library-grid.tsx +1 -0
  31. package/corpus/templates/clips/app/components/player/share-dialog.tsx +59 -19
  32. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +75 -9
  33. package/corpus/templates/clips/app/components/player/video-player.tsx +17 -12
  34. package/corpus/templates/clips/app/hooks/use-player-shortcuts.ts +1 -0
  35. package/corpus/templates/clips/app/i18n/ar-SA.ts +1 -0
  36. package/corpus/templates/clips/app/i18n/de-DE.ts +1 -0
  37. package/corpus/templates/clips/app/i18n/en-US.ts +1 -0
  38. package/corpus/templates/clips/app/i18n/es-ES.ts +1 -0
  39. package/corpus/templates/clips/app/i18n/fr-FR.ts +1 -0
  40. package/corpus/templates/clips/app/i18n/hi-IN.ts +1 -0
  41. package/corpus/templates/clips/app/i18n/ja-JP.ts +1 -0
  42. package/corpus/templates/clips/app/i18n/ko-KR.ts +1 -0
  43. package/corpus/templates/clips/app/i18n/pt-BR.ts +1 -0
  44. package/corpus/templates/clips/app/i18n/zh-CN.ts +1 -0
  45. package/corpus/templates/clips/app/i18n/zh-TW.ts +1 -0
  46. package/corpus/templates/clips/app/routes/r.$recordingId.tsx +70 -37
  47. package/corpus/templates/clips/app/routes/record.tsx +17 -4
  48. package/corpus/templates/clips/app/routes/share.$shareId.tsx +2 -0
  49. package/corpus/templates/clips/changelog/2026-07-09-desktop-popover-sits-closer-to-the-menu-bar.md +6 -0
  50. package/corpus/templates/clips/changelog/2026-07-09-desktop-recording-optimization-progress-stays-visible-until-the-clip-opens.md +6 -0
  51. package/corpus/templates/clips/changelog/2026-07-09-fixed-large-video-file-uploads-failing-before-their-resumabl.md +6 -0
  52. package/corpus/templates/clips/changelog/2026-07-09-fixed-new-video-uploads-defaulting-to-private.md +6 -0
  53. package/corpus/templates/clips/changelog/2026-07-09-long-recordings-now-get-enough-time-to-download-their-media-.md +6 -0
  54. package/corpus/templates/clips/changelog/2026-07-09-meeting-notes-no-longer-lowers-your-microphone-volume-for-ot.md +6 -0
  55. package/corpus/templates/clips/changelog/2026-07-09-on-mobile-tapping-a-playing-clip-reveals-playback-controls-w.md +6 -0
  56. package/corpus/templates/clips/changelog/2026-07-09-regenerate-any-clip-transcript-from-its-saved-recording-or-r.md +6 -0
  57. package/corpus/templates/clips/changelog/2026-07-09-slack-previews-now-show-the-clip-length-alongside-its-descri.md +6 -0
  58. package/corpus/templates/clips/changelog/2026-07-10-fixed-copying-agent-responses-and-transcript-text-from-recor.md +6 -0
  59. package/corpus/templates/clips/desktop/src/app.tsx +12 -2
  60. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +8 -1
  61. package/corpus/templates/clips/desktop/src/lib/recorder.ts +8 -5
  62. package/corpus/templates/clips/desktop/src/lib/transcription-engine.ts +5 -5
  63. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +3 -0
  64. package/corpus/templates/clips/desktop/src/styles.css +6 -3
  65. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +29 -11
  66. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +1 -1
  67. package/corpus/templates/clips/desktop/src-tauri/src/system_audio.rs +103 -21
  68. package/corpus/templates/clips/desktop/src-tauri/src/whisper_speech.rs +117 -39
  69. package/corpus/templates/clips/server/lib/slack-unfurls.ts +20 -1
  70. package/corpus/templates/clips/server/lib/streaming-upload-mode.ts +10 -4
  71. package/corpus/templates/clips/shared/recording-core.ts +12 -0
  72. package/corpus/templates/content/AGENTS.md +7 -6
  73. package/corpus/templates/content/actions/_builder-cms-read-client.ts +82 -7
  74. package/corpus/templates/content/actions/_database-source-utils.ts +149 -30
  75. package/corpus/templates/content/actions/_document-flush.ts +132 -17
  76. package/corpus/templates/content/actions/_notion-action-utils.ts +15 -0
  77. package/corpus/templates/content/actions/add-content-database-source-field-property.ts +4 -7
  78. package/corpus/templates/content/actions/attach-content-database-source.ts +41 -17
  79. package/corpus/templates/content/actions/change-content-database-source-role.ts +46 -8
  80. package/corpus/templates/content/actions/create-and-link-notion-page.ts +2 -0
  81. package/corpus/templates/content/actions/link-notion-page.ts +2 -0
  82. package/corpus/templates/content/actions/pull-document.ts +5 -7
  83. package/corpus/templates/content/actions/pull-notion-page.ts +2 -0
  84. package/corpus/templates/content/actions/push-notion-page.ts +10 -0
  85. package/corpus/templates/content/actions/resolve-notion-sync-conflict.ts +2 -0
  86. package/corpus/templates/content/actions/suggest-source-join-key.ts +8 -1
  87. package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +88 -23
  88. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +32 -2
  89. package/corpus/templates/content/app/hooks/use-notion.ts +6 -6
  90. package/corpus/templates/content/app/i18n/zh-TW.ts +1 -0
  91. package/corpus/templates/content/app/i18n-data.ts +18 -0
  92. package/corpus/templates/content/changelog/2026-07-09-builder-source-refreshes-now-keep-mapped-fields-such-as-topi.md +6 -0
  93. package/corpus/templates/content/changelog/2026-07-09-notion-conflict-choices-and-version-restores-preserve-docume.md +6 -0
  94. package/corpus/templates/content/server/lib/notion-sync.ts +80 -64
  95. package/corpus/templates/content/shared/api.ts +1 -0
  96. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +29 -2
  97. package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +86 -0
  98. package/corpus/templates/design/.agents/skills/export-handoff/SKILL.md +57 -0
  99. package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +11 -0
  100. package/corpus/templates/design/AGENTS.md +45 -10
  101. package/corpus/templates/design/actions/add-localhost-screens.ts +66 -13
  102. package/corpus/templates/design/actions/apply-component-prop-edit.ts +45 -36
  103. package/corpus/templates/design/actions/apply-motion-edit.ts +25 -31
  104. package/corpus/templates/design/actions/apply-shader-fill.ts +29 -42
  105. package/corpus/templates/design/actions/detach-component-instance.ts +337 -0
  106. package/corpus/templates/design/actions/export-design-as-figma-svg.ts +219 -0
  107. package/corpus/templates/design/actions/generate-design.ts +79 -12
  108. package/corpus/templates/design/actions/generate-screens.ts +57 -12
  109. package/corpus/templates/design/actions/get-figma-styles.ts +115 -0
  110. package/corpus/templates/design/actions/go-to-main-component.ts +254 -0
  111. package/corpus/templates/design/actions/grant-localhost-write-consent.ts +4 -3
  112. package/corpus/templates/design/actions/import-design-source.ts +4 -31
  113. package/corpus/templates/design/actions/import-figma-clipboard.ts +134 -0
  114. package/corpus/templates/design/actions/import-figma-frame.ts +95 -0
  115. package/corpus/templates/design/actions/index-design-system-with-builder.ts +16 -1
  116. package/corpus/templates/design/actions/list-design-components.ts +104 -0
  117. package/corpus/templates/design/actions/list-figma-library-assets.ts +1 -24
  118. package/corpus/templates/design/actions/open-component-source.ts +2 -4
  119. package/corpus/templates/design/actions/present-design-variants.ts +412 -16
  120. package/corpus/templates/design/actions/preview-source-edit.ts +14 -1
  121. package/corpus/templates/design/actions/run-design-audit.ts +25 -3
  122. package/corpus/templates/design/actions/show-design-questions.ts +10 -0
  123. package/corpus/templates/design/actions/swap-component-instance.ts +544 -0
  124. package/corpus/templates/design/actions/take-design-screenshot.ts +45 -60
  125. package/corpus/templates/design/actions/write-local-file.ts +25 -1
  126. package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +152 -0
  127. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +1077 -58
  128. package/corpus/templates/design/app/components/design/DesignEditorSkeleton.tsx +5 -5
  129. package/corpus/templates/design/app/components/design/DesignExtensionsPanel.tsx +73 -21
  130. package/corpus/templates/design/app/components/design/EditPanel.tsx +16 -11
  131. package/corpus/templates/design/app/components/design/KeyboardShortcutsPanel.tsx +364 -0
  132. package/corpus/templates/design/app/components/design/LayersPanel.tsx +180 -53
  133. package/corpus/templates/design/app/components/design/LocalhostWriteConsentDialog.tsx +0 -2
  134. package/corpus/templates/design/app/components/design/MotionDock.tsx +144 -21
  135. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +1152 -167
  136. package/corpus/templates/design/app/components/design/QuestionFlow.tsx +27 -5
  137. package/corpus/templates/design/app/components/design/ReviewPanel.tsx +23 -2
  138. package/corpus/templates/design/app/components/design/TokensPanel.tsx +63 -49
  139. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +1293 -54
  140. package/corpus/templates/design/app/components/design/bridge/embedded-wheel.bridge.ts +7 -0
  141. package/corpus/templates/design/app/components/design/bridge/hit-test.bridge.ts +6 -1
  142. package/corpus/templates/design/app/components/design/bridge/motion-preview.bridge.ts +23 -6
  143. package/corpus/templates/design/app/components/design/bridge/sample.bridge.ts +7 -0
  144. package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +5 -0
  145. package/corpus/templates/design/app/components/design/code-workbench/editor/MonacoHost.tsx +14 -2
  146. package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +37 -2
  147. package/corpus/templates/design/app/components/design/code-workbench/format/format-on-open-guard.ts +25 -0
  148. package/corpus/templates/design/app/components/design/code-workbench/format/format-on-open.ts +19 -1
  149. package/corpus/templates/design/app/components/design/code-workbench/model-registry.ts +43 -5
  150. package/corpus/templates/design/app/components/design/code-workbench/search/SearchView.tsx +27 -2
  151. package/corpus/templates/design/app/components/design/code-workbench/search/search-engine.ts +10 -1
  152. package/corpus/templates/design/app/components/design/code-workbench/store.tsx +19 -2
  153. package/corpus/templates/design/app/components/design/design-canvas/annotation-snapshot.ts +265 -0
  154. package/corpus/templates/design/app/components/design/design-canvas/annotation-submit.ts +16 -5
  155. package/corpus/templates/design/app/components/design/design-canvas/coordinate-transforms.ts +16 -2
  156. package/corpus/templates/design/app/components/design/design-canvas/embedded-frame.ts +7 -2
  157. package/corpus/templates/design/app/components/design/design-canvas/iframe-events.ts +3 -1
  158. package/corpus/templates/design/app/components/design/edit-panel/code-inspect-helpers.tsx +78 -8
  159. package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +451 -73
  160. package/corpus/templates/design/app/components/design/edit-panel/document-colors.ts +12 -4
  161. package/corpus/templates/design/app/components/design/edit-panel/effects-properties.tsx +398 -272
  162. package/corpus/templates/design/app/components/design/edit-panel/element-classification.ts +41 -7
  163. package/corpus/templates/design/app/components/design/edit-panel/element-identity.ts +16 -3
  164. package/corpus/templates/design/app/components/design/edit-panel/field-primitives.tsx +24 -4
  165. package/corpus/templates/design/app/components/design/edit-panel/fill-gradient-helpers.ts +222 -4
  166. package/corpus/templates/design/app/components/design/edit-panel/fill-properties.tsx +171 -78
  167. package/corpus/templates/design/app/components/design/edit-panel/inspector-controls.tsx +45 -5
  168. package/corpus/templates/design/app/components/design/edit-panel/layout-properties.tsx +299 -28
  169. package/corpus/templates/design/app/components/design/edit-panel/panel-primitives.tsx +120 -150
  170. package/corpus/templates/design/app/components/design/edit-panel/position-helpers.ts +53 -1
  171. package/corpus/templates/design/app/components/design/edit-panel/position-layout-properties.tsx +284 -117
  172. package/corpus/templates/design/app/components/design/edit-panel/selection-helpers.ts +81 -0
  173. package/corpus/templates/design/app/components/design/edit-panel/stroke-properties.tsx +19 -14
  174. package/corpus/templates/design/app/components/design/edit-panel/style-options.ts +7 -0
  175. package/corpus/templates/design/app/components/design/edit-panel/typography-helpers.ts +155 -0
  176. package/corpus/templates/design/app/components/design/edit-panel/typography-properties.tsx +268 -46
  177. package/corpus/templates/design/app/components/design/inspector/AutoLayoutMatrix.tsx +350 -31
  178. package/corpus/templates/design/app/components/design/inspector/ConstraintsWidget.tsx +13 -4
  179. package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +233 -23
  180. package/corpus/templates/design/app/components/design/inspector/GradientEditor.tsx +72 -2
  181. package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +51 -11
  182. package/corpus/templates/design/app/components/design/inspector/ShaderFillsPanel.tsx +84 -11
  183. package/corpus/templates/design/app/components/design/inspector/index.ts +3 -0
  184. package/corpus/templates/design/app/components/design/keyboard-shortcuts.ts +552 -0
  185. package/corpus/templates/design/app/components/design/multi-screen/board-surface-html.ts +157 -0
  186. package/corpus/templates/design/app/components/design/multi-screen/frame-geometry.ts +53 -0
  187. package/corpus/templates/design/app/components/design/multi-screen/overview-layout.ts +184 -0
  188. package/corpus/templates/design/app/components/design/multi-screen/primitive-drop-target.ts +403 -26
  189. package/corpus/templates/design/app/components/design/multi-screen/types.ts +20 -1
  190. package/corpus/templates/design/app/components/design/types.ts +33 -0
  191. package/corpus/templates/design/app/components/editor/PromptDialog.tsx +59 -7
  192. package/corpus/templates/design/app/components/visual-editor/CanvasCommentPins.tsx +119 -17
  193. package/corpus/templates/design/app/components/visual-editor/DrawOverlay.tsx +275 -63
  194. package/corpus/templates/design/app/hooks/use-question-flow.ts +14 -3
  195. package/corpus/templates/design/app/hooks/useDesignHotkeys.ts +67 -10
  196. package/corpus/templates/design/app/i18n/zh-TW.ts +91 -1
  197. package/corpus/templates/design/app/i18n-data.ts +1217 -10
  198. package/corpus/templates/design/app/i18n-keyboard-shortcuts.ts +577 -0
  199. package/corpus/templates/design/app/lib/agent-chat.ts +23 -0
  200. package/corpus/templates/design/app/lib/design-import.ts +24 -0
  201. package/corpus/templates/design/app/lib/figma-clipboard.ts +157 -0
  202. package/corpus/templates/design/app/lib/figma-svg-copy.ts +221 -0
  203. package/corpus/templates/design/app/pages/design-editor/code-layer-state.ts +143 -30
  204. package/corpus/templates/design/app/pages/design-editor/collab-sync.ts +15 -0
  205. package/corpus/templates/design/app/pages/design-editor/editor-session.ts +33 -0
  206. package/corpus/templates/design/app/pages/design-editor/editor-state.ts +38 -0
  207. package/corpus/templates/design/app/pages/design-editor/overview-annotation-context.ts +157 -0
  208. package/corpus/templates/design/app/pages/design-editor/overview-camera.ts +62 -6
  209. package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +245 -0
  210. package/corpus/templates/design/app/pages/design-editor/react-semantic-handoff.ts +586 -0
  211. package/corpus/templates/design/app/pages/design-editor/screen-auto-layout.ts +169 -0
  212. package/corpus/templates/design/app/pages/design-editor/selection-state.ts +201 -1
  213. package/corpus/templates/design/changelog/2026-07-09-added-underline-strikethrough-and-text-case-uppercase-lowerc.md +6 -0
  214. package/corpus/templates/design/changelog/2026-07-09-annotate-now-draws-across-the-all-screens-canvas-without-swi.md +6 -0
  215. package/corpus/templates/design/changelog/2026-07-09-auto-layout-children-can-now-be-dragged-into-freeform-screen.md +6 -0
  216. package/corpus/templates/design/changelog/2026-07-09-board-shapes-now-stay-visible-and-nest-correctly-across-the-.md +6 -0
  217. package/corpus/templates/design/changelog/2026-07-09-component-source-navigation-now-opens-reliably-from-the-insp.md +6 -0
  218. package/corpus/templates/design/changelog/2026-07-09-cross-screen-local-react-layer-moves-now-hand-off-exact-sour.md +6 -0
  219. package/corpus/templates/design/changelog/2026-07-09-cross-screen-moves-undo-and-redo-now-keep-both-screens-stabl.md +6 -0
  220. package/corpus/templates/design/changelog/2026-07-09-detach-a-component-instance-into-plain-editable-eleme.md +6 -0
  221. package/corpus/templates/design/changelog/2026-07-09-dragging-layers-into-auto-layout-now-respects-ignore-auto-la.md +6 -0
  222. package/corpus/templates/design/changelog/2026-07-09-drawing-annotations-sent-to-the-agent-now-include-a-rendered.md +6 -0
  223. package/corpus/templates/design/changelog/2026-07-09-editor-sidebars-now-use-figma-matched-default-widths-for-a-r.md +6 -0
  224. package/corpus/templates/design/changelog/2026-07-09-empty-frames-and-rectangles-now-expose-full-auto-layout-cont.md +6 -0
  225. package/corpus/templates/design/changelog/2026-07-09-export-any-design-screen-as-a-real-vector-svg-for-figma-with.md +6 -0
  226. package/corpus/templates/design/changelog/2026-07-09-grid-auto-layout-now-uses-true-responsive-rows-and-columns-w.md +6 -0
  227. package/corpus/templates/design/changelog/2026-07-09-hidden-and-locked-screens-now-behave-consistently-between-la.md +6 -0
  228. package/corpus/templates/design/changelog/2026-07-09-image-fills-now-preserve-valid-urls-and-layered-fit-settings.md +6 -0
  229. package/corpus/templates/design/changelog/2026-07-09-import-figma-frames-as-pixel-accurate-design-screens-via-a-s.md +6 -0
  230. package/corpus/templates/design/changelog/2026-07-09-inspect-code-now-hides-internal-styling-metadata-and-wraps-l.md +6 -0
  231. package/corpus/templates/design/changelog/2026-07-09-inspector-blur-and-shadow-effects-now-preserve-other-effects.md +6 -0
  232. package/corpus/templates/design/changelog/2026-07-09-jump-to-a-components-other-instances-from-the-inspecto.md +6 -0
  233. package/corpus/templates/design/changelog/2026-07-09-keyboard-shortcuts-are-now-discoverable-in-a-figma-style-bot.md +6 -0
  234. package/corpus/templates/design/changelog/2026-07-09-layer-selection-now-keeps-cmd-or-ctrl-toggles-and-shift-rang.md +6 -0
  235. package/corpus/templates/design/changelog/2026-07-09-layers-dropped-into-auto-layout-now-participate-correctly-in.md +6 -0
  236. package/corpus/templates/design/changelog/2026-07-09-local-live-edit-screens-now-enter-and-leave-full-view-withou.md +6 -0
  237. package/corpus/templates/design/changelog/2026-07-09-local-preview-urls-now-live-in-the-inspector-instead-of-taki.md +6 -0
  238. package/corpus/templates/design/changelog/2026-07-09-local-react-layers-can-now-be-hidden-and-locked-from-layers-.md +6 -0
  239. package/corpus/templates/design/changelog/2026-07-09-local-react-layers-now-keep-exact-source-provenance-and-supp.md +6 -0
  240. package/corpus/templates/design/changelog/2026-07-09-local-react-visual-editing-now-loads-reliably-and-shows-live.md +6 -0
  241. package/corpus/templates/design/changelog/2026-07-09-paste-from-figma-cmd-v-now-imports-exact-editable-nodes-when.md +6 -0
  242. package/corpus/templates/design/changelog/2026-07-09-pressing-escape-after-selecting-a-screen-now-reveals-page-pr.md +6 -0
  243. package/corpus/templates/design/changelog/2026-07-09-right-click-overlapping-or-nested-objects-to-choose-the-exac.md +6 -0
  244. package/corpus/templates/design/changelog/2026-07-09-scale-edge-stretch-and-center-constraints-now-preserve-layer.md +6 -0
  245. package/corpus/templates/design/changelog/2026-07-09-screen-rows-can-now-be-reordered-in-layers-with-matching-can.md +6 -0
  246. package/corpus/templates/design/changelog/2026-07-09-screen-selection-stays-responsive-in-designs-with-hundreds-o.md +6 -0
  247. package/corpus/templates/design/changelog/2026-07-09-shift-a-now-enables-auto-layout-on-a-selected-screen-with-fl.md +6 -0
  248. package/corpus/templates/design/changelog/2026-07-09-swap-a-component-instance-for-another-from-the-libra.md +6 -0
  249. package/corpus/templates/design/changelog/2026-07-10-drawing-annotations-now-stay-available-to-retry-when-the.md +6 -0
  250. package/corpus/templates/design/e2e/global-setup.ts +3 -6
  251. package/corpus/templates/design/e2e/helpers.ts +27 -6
  252. package/corpus/templates/design/server/lib/design-to-figma-svg.ts +1412 -0
  253. package/corpus/templates/design/server/lib/figma-clipboard-match.ts +196 -0
  254. package/corpus/templates/design/server/lib/figma-node-import.ts +311 -0
  255. package/corpus/templates/design/server/lib/figma-node-to-html.ts +1334 -0
  256. package/corpus/templates/design/server/lib/figma-paste-fallback.ts +64 -0
  257. package/corpus/templates/design/server/lib/playwright-runtime.ts +78 -0
  258. package/corpus/templates/design/server/plugins/db.ts +41 -0
  259. package/corpus/templates/design/server/source-workspace.ts +64 -0
  260. package/corpus/templates/design/shared/board-file.ts +13 -2
  261. package/corpus/templates/design/shared/canvas-math.ts +231 -33
  262. package/corpus/templates/design/shared/code-layer.ts +122 -8
  263. package/corpus/templates/design/shared/component-library.ts +161 -0
  264. package/corpus/templates/design/shared/db-conflict.ts +27 -0
  265. package/corpus/templates/design/shared/design-source-capabilities.ts +2 -1
  266. package/corpus/templates/design/shared/figma-url.ts +149 -0
  267. package/corpus/templates/design/shared/pen-path.ts +16 -7
  268. package/corpus/templates/design/shared/source-mode.ts +1 -0
  269. package/corpus/templates/plan/app/components/plan/CanvasArea.tsx +7 -19
  270. package/corpus/templates/plan/changelog/2026-07-09-canvas-panning-now-keeps-zoom-fixed-even-at-the-edges.md +6 -0
  271. package/corpus/templates/slides/actions/index-design-system-with-builder.ts +16 -1
  272. package/corpus/templates/slides/app/context/DeckContext.tsx +311 -70
  273. package/corpus/templates/slides/changelog/2026-07-09-fixed-the-slide-rail-going-permanently-stale-during-a-long-a.md +6 -0
  274. package/dist/agent/production-agent.d.ts +82 -7
  275. package/dist/agent/production-agent.d.ts.map +1 -1
  276. package/dist/agent/production-agent.js +180 -17
  277. package/dist/agent/production-agent.js.map +1 -1
  278. package/dist/agent/run-manager.d.ts.map +1 -1
  279. package/dist/agent/run-manager.js +63 -14
  280. package/dist/agent/run-manager.js.map +1 -1
  281. package/dist/agent/run-store.d.ts +46 -0
  282. package/dist/agent/run-store.d.ts.map +1 -1
  283. package/dist/agent/run-store.js +129 -22
  284. package/dist/agent/run-store.js.map +1 -1
  285. package/dist/cli/design-connect.d.ts +6 -0
  286. package/dist/cli/design-connect.d.ts.map +1 -1
  287. package/dist/cli/design-connect.js +336 -139
  288. package/dist/cli/design-connect.js.map +1 -1
  289. package/dist/cli/skills.d.ts.map +1 -1
  290. package/dist/cli/skills.js +14 -0
  291. package/dist/cli/skills.js.map +1 -1
  292. package/dist/client/AssistantChat.d.ts +2 -0
  293. package/dist/client/AssistantChat.d.ts.map +1 -1
  294. package/dist/client/AssistantChat.js +19 -3
  295. package/dist/client/AssistantChat.js.map +1 -1
  296. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  297. package/dist/client/MultiTabAssistantChat.js +38 -18
  298. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  299. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  300. package/dist/client/agent-chat-adapter.js +48 -12
  301. package/dist/client/agent-chat-adapter.js.map +1 -1
  302. package/dist/client/agent-chat.d.ts +60 -0
  303. package/dist/client/agent-chat.d.ts.map +1 -1
  304. package/dist/client/agent-chat.js +122 -1
  305. package/dist/client/agent-chat.js.map +1 -1
  306. package/dist/client/chat/index.d.ts +1 -1
  307. package/dist/client/chat/index.d.ts.map +1 -1
  308. package/dist/client/chat/index.js +1 -1
  309. package/dist/client/chat/index.js.map +1 -1
  310. package/dist/client/extensions/EmbeddedExtension.d.ts +12 -0
  311. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -1
  312. package/dist/client/extensions/EmbeddedExtension.js +36 -2
  313. package/dist/client/extensions/EmbeddedExtension.js.map +1 -1
  314. package/dist/client/index.d.ts +1 -1
  315. package/dist/client/index.d.ts.map +1 -1
  316. package/dist/client/index.js +1 -1
  317. package/dist/client/index.js.map +1 -1
  318. package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
  319. package/dist/client/rich-markdown-editor/useCollabReconcile.js +18 -6
  320. package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
  321. package/dist/collab/awareness-store.d.ts +5 -0
  322. package/dist/collab/awareness-store.d.ts.map +1 -1
  323. package/dist/collab/awareness-store.js +19 -12
  324. package/dist/collab/awareness-store.js.map +1 -1
  325. package/dist/collab/awareness.d.ts +2 -2
  326. package/dist/collab/awareness.d.ts.map +1 -1
  327. package/dist/collab/client.d.ts.map +1 -1
  328. package/dist/collab/client.js +13 -5
  329. package/dist/collab/client.js.map +1 -1
  330. package/dist/collab/index.d.ts +1 -0
  331. package/dist/collab/index.d.ts.map +1 -1
  332. package/dist/collab/index.js +1 -0
  333. package/dist/collab/index.js.map +1 -1
  334. package/dist/collab/recent-edits.d.ts +3 -1
  335. package/dist/collab/recent-edits.d.ts.map +1 -1
  336. package/dist/collab/recent-edits.js +57 -2
  337. package/dist/collab/recent-edits.js.map +1 -1
  338. package/dist/collab/struct-routes.d.ts +1 -1
  339. package/dist/index.browser.d.ts +1 -1
  340. package/dist/index.browser.d.ts.map +1 -1
  341. package/dist/index.browser.js +1 -1
  342. package/dist/index.browser.js.map +1 -1
  343. package/dist/observability/routes.d.ts +5 -5
  344. package/dist/progress/routes.d.ts +1 -1
  345. package/dist/resources/handlers.d.ts +3 -3
  346. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  347. package/dist/server/agent-chat-plugin.js +87 -10
  348. package/dist/server/agent-chat-plugin.js.map +1 -1
  349. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  350. package/dist/server/builder-design-systems.d.ts +15 -0
  351. package/dist/server/builder-design-systems.d.ts.map +1 -1
  352. package/dist/server/builder-design-systems.js +9 -4
  353. package/dist/server/builder-design-systems.js.map +1 -1
  354. package/package.json +1 -1
@@ -33,7 +33,7 @@ import { getDefaultMaxIterations, MAX_AGENT_MAX_ITERATIONS, MIN_AGENT_MAX_ITERAT
33
33
  import { maybeCompactThread, buildObservationalContext, hasObservationalMemory, serializeObservationalMemoryBlock, } from "./observational-memory/index.js";
34
34
  import { ProcessorChain, TripWire, toolCallsFromContent, } from "./processors.js";
35
35
  import { startRun, subscribeToRun, getActiveRunForThread, getActiveRunForThreadAsync, getRun, abortRun, tryClaimRunSlot, } from "./run-manager.js";
36
- import { writeLedgerEntry, readLedgerEntry, clearLedgerForThread, getCurrentTurnEventsForThread, insertRun, updateRunHeartbeat, updateRunStatusIfRunning, setRunTerminalReason, claimBackgroundRun, readBackgroundRunClaim, recordRunDiagnostic, countRunsForTurn, RUN_DIAG_STAGE, UNCLAIMED_BACKGROUND_RUN_GRACE_MS, } from "./run-store.js";
36
+ import { writeLedgerEntry, readLedgerEntry, clearLedgerForThread, getCurrentTurnEventsForThread, insertRun, updateRunHeartbeat, updateRunStatusIfRunning, setRunError, setRunTerminalReason, claimBackgroundRun, readBackgroundRunClaim, recordRunDiagnostic, countRunsForTurn, RUN_DIAG_STAGE, UNCLAIMED_BACKGROUND_RUN_GRACE_MS, } from "./run-store.js";
37
37
  import { buildCurrentTimeUserContext } from "./runtime-context.js";
38
38
  import { classifyToolCallJournal, findCompletedJournalEntry, } from "./tool-call-journal.js";
39
39
  import { redactSensitiveFields, sanitizeToolErrorText, sanitizeToolErrorValue, } from "./tool-error-redaction.js";
@@ -3690,10 +3690,25 @@ export function shouldChainBackgroundContinuation(opts) {
3690
3690
  }
3691
3691
  export async function markBackgroundContinuationChunkTerminal(opts) {
3692
3692
  const updateStatus = opts.deps?.updateRunStatusIfRunning ?? updateRunStatusIfRunning;
3693
+ const persistError = opts.deps?.setRunError ?? setRunError;
3693
3694
  const setTerminalReason = opts.deps?.setRunTerminalReason ?? setRunTerminalReason;
3694
- const updated = await updateStatus(opts.runId, "completed");
3695
+ const terminalEvent = opts.terminalEvent;
3696
+ const isTerminalFailure = terminalEvent?.type === "error" ||
3697
+ terminalEvent?.type === "missing_api_key";
3698
+ const terminalReason = terminalEvent?.type === "error"
3699
+ ? `error:${terminalEvent.errorCode || "unknown"}`
3700
+ : terminalEvent?.type === "missing_api_key"
3701
+ ? "missing_api_key"
3702
+ : opts.continuationReason;
3703
+ const updated = await updateStatus(opts.runId, isTerminalFailure ? "errored" : "completed");
3695
3704
  if (updated) {
3696
- await setTerminalReason(opts.runId, opts.continuationReason);
3705
+ await setTerminalReason(opts.runId, terminalReason);
3706
+ if (terminalEvent?.type === "error") {
3707
+ await persistError(opts.runId, terminalEvent.errorCode, terminalEvent.details || terminalEvent.error);
3708
+ }
3709
+ else if (terminalEvent?.type === "missing_api_key") {
3710
+ await persistError(opts.runId, LLM_MISSING_CREDENTIALS_ERROR_CODE, LLM_MISSING_CREDENTIALS_MESSAGE);
3711
+ }
3697
3712
  }
3698
3713
  return updated;
3699
3714
  }
@@ -3782,6 +3797,69 @@ export function resolveContinuationDispatchBudget(opts) {
3782
3797
  backoffCapMs: Infinity,
3783
3798
  };
3784
3799
  }
3800
+ /**
3801
+ * True when a `fireInternalDispatch` failure is Netlify's Functions platform
3802
+ * loop-protection response (`HTTP 508 Loop Detected`), matched against the
3803
+ * exact message `self-dispatch.ts`'s `dispatchResponseError` constructs
3804
+ * (`Self-dispatch to ${path} returned HTTP ${res.status} ${res.statusText}...`).
3805
+ * Matches on the status code alone (not the reason phrase text) so it is
3806
+ * robust to any wording Netlify's edge puts in `statusText`.
3807
+ *
3808
+ * VERIFIED: production `agent_runs` diagnostics show exactly this failure mode
3809
+ * — 8 successful `chain_dispatch_sent` self-dispatches followed by a 9th/10th
3810
+ * that dies with `HTTP 508 Loop Detected`, terminal reason
3811
+ * `background_continuation_dispatch_failed`. UNVERIFIED (Netlify does not
3812
+ * document the mechanism — checked the Functions overview, Functions API
3813
+ * reference, Background Functions overview, Status Codes reference, and
3814
+ * Request Chain troubleshooting docs, none mention it): the ONLY public
3815
+ * confirmation is a Netlify staff forum reply — "we prevent multiple
3816
+ * executions after one-another as that's a 'loop' ... I believe we enforce
3817
+ * this after 9 or 10 self-invocations"
3818
+ * (https://answers.netlify.com/t/self-invoke-background-function-via-post-requests/146012)
3819
+ * — which also confirms Background Functions do NOT escape the limit (the
3820
+ * reporter's case was already a `-background` function self-invoking). See
3821
+ * `MAX_NESTED_SELF_DISPATCH_DEPTH` for how this classification is used.
3822
+ */
3823
+ export function isLoopProtectionDispatchError(err) {
3824
+ if (!(err instanceof Error))
3825
+ return false;
3826
+ return /\bHTTP\s*508\b/i.test(err.message);
3827
+ }
3828
+ /**
3829
+ * Conservative safety margin on NESTED self-dispatch chaining — a
3830
+ * continuation dispatched directly from within the live invocation that is
3831
+ * about to finish, as opposed to being picked up later by the
3832
+ * unclaimed-background-run sweep (`agent-chat-plugin.ts`), which fires its
3833
+ * redispatch from an unrelated, timer-driven invocation rather than from
3834
+ * inside the chain's own execution.
3835
+ *
3836
+ * Netlify's loop-protection ceiling is undocumented and platform-reported
3837
+ * only approximately ("I believe... 9 or 10" — see
3838
+ * `isLoopProtectionDispatchError`), so hard-coding that exact number here
3839
+ * would be pinning behavior to a number Netlify itself won't commit to, and
3840
+ * production evidence shows it can trigger by the 9th self-dispatch. Rather
3841
+ * than only reacting after triggering that undocumented limit,
3842
+ * `chainServerDrivenContinuation` proactively hands a chunk to the sweep once
3843
+ * `backgroundContinuationCount` (nested hops since the last chain break)
3844
+ * reaches this value — comfortably below the observed ~9-10 failure point —
3845
+ * instead of attempting another nested dispatch. This is the SAME deferred-
3846
+ * recovery path already used when a dispatch fails outright: the row is left
3847
+ * `status='running', dispatch_mode='background'` for the sweep to redispatch,
3848
+ * never silently dropped.
3849
+ *
3850
+ * The sweep's redispatch marker intentionally omits `continuationCount` (see
3851
+ * the "Unclaimed background-run sweep" in `agent-chat-plugin.ts`), so a
3852
+ * sweep-recovered chunk's own `backgroundContinuationCount` resets to 0 —
3853
+ * this constant therefore bounds each NESTED segment between chain breaks,
3854
+ * not the whole turn. The TRUE ceiling on total turn length is unaffected by
3855
+ * that reset: it is the durable per-turn SQL ledger (`countRunsForTurn`,
3856
+ * checked above in this function) plus `MAX_BACKGROUND_RUN_CONTINUATIONS` —
3857
+ * both counted independently of this in-marker value — so a legitimately
3858
+ * long turn keeps making progress in bounded nested segments, each recovered
3859
+ * by the sweep, until it genuinely exhausts the intentional overall budget
3860
+ * and fails loud with `turn_continuation_budget_exhausted`.
3861
+ */
3862
+ export const MAX_NESTED_SELF_DISPATCH_DEPTH = 6;
3785
3863
  /**
3786
3864
  * Server-driven continuation handoff for a chunk that hit its soft-timeout
3787
3865
  * boundary still unfinished: mint the next chunk's runId, PRE-INSERT its run
@@ -3790,12 +3868,26 @@ export function resolveContinuationDispatchBudget(opts) {
3790
3868
  * `_process-run` self-dispatch carrying ids only (the body is persisted on
3791
3869
  * the row as `dispatch_payload`), fully AWAIT the dispatch acknowledgment
3792
3870
  * with retries, and mark this chunk terminal only after the handoff landed.
3793
- * On failure every path is loud: the successor row is errored, the failure
3794
- * is recorded as the run's diag stage, and this chunk is flipped to errored
3795
- * with a terminal reason never a silent loss. (For a FOREGROUND self-chain
3796
- * the client additionally still receives the terminal `auto_continue` event
3797
- * run-manager emits it after this callback so the existing client
3798
- * re-POST path takes over as the fallback.)
3871
+ * On failure this chunk always goes terminal loudly (diag stage + terminal
3872
+ * reason recorded never a silent loss), but the successor row's fate
3873
+ * depends on WHY the dispatch failed:
3874
+ * - the pre-insert itself failed (no successor row exists) — nothing for a
3875
+ * sweep to find, so this is unrecoverable: fail loud immediately with
3876
+ * `background_continuation_dispatch_failed`.
3877
+ * - every dispatch attempt failed but the successor row DOES exist with its
3878
+ * `dispatch_payload` intact — this is RECOVERABLE: the row is left alone
3879
+ * (`status='running', dispatch_mode='background'`) instead of being
3880
+ * errored, so the unclaimed-background-run sweep in `agent-chat-plugin.ts`
3881
+ * can redispatch it once `UNCLAIMED_BACKGROUND_RUN_GRACE_MS` has passed.
3882
+ * This chunk is flipped to errored with the distinct, honest
3883
+ * `background_continuation_dispatch_deferred` reason — the TURN is
3884
+ * deferred, not dead. The sweep still bounds this by
3885
+ * `UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS`: past that it falls back
3886
+ * to the existing loud reap, so a genuinely dead handoff never hangs
3887
+ * silently forever. (For a FOREGROUND self-chain the client additionally
3888
+ * still receives the terminal `auto_continue` event — run-manager emits
3889
+ * it after this callback — so the existing client re-POST path is a
3890
+ * second, faster fallback alongside the sweep.)
3799
3891
  *
3800
3892
  * `chainViaDurableBackground` selects the dispatch target:
3801
3893
  * - true → the durable-background worker chain (unchanged behavior): the
@@ -3942,7 +4034,18 @@ export async function chainServerDrivenContinuation(opts) {
3942
4034
  };
3943
4035
  let dispatched = false;
3944
4036
  let lastDispatchErr;
3945
- for (let attempt = 0; attempt < maxDispatchAttempts && !dispatched; attempt++) {
4037
+ // Proactive nested-chain safety margin see `MAX_NESTED_SELF_DISPATCH_DEPTH`.
4038
+ // Skip the nested dispatch attempt entirely once this segment's hop count
4039
+ // reaches the cap; a nested attempt at this depth is expected to trip
4040
+ // Netlify's loop protection, so there is nothing to gain by trying it and
4041
+ // burning this worker's remaining wall clock on a doomed call. Falls
4042
+ // straight into the same deferred-recovery path below as an exhausted
4043
+ // retry budget.
4044
+ const nestedDepthExceeded = opts.backgroundContinuationCount >= MAX_NESTED_SELF_DISPATCH_DEPTH;
4045
+ if (nestedDepthExceeded) {
4046
+ lastDispatchErr = new Error(`proactive nested-dispatch depth cap reached (backgroundContinuationCount=${opts.backgroundContinuationCount} >= MAX_NESTED_SELF_DISPATCH_DEPTH=${MAX_NESTED_SELF_DISPATCH_DEPTH}) — deferring to the unclaimed-background-run sweep instead of risking Netlify loop protection`);
4047
+ }
4048
+ for (let attempt = 0; !nestedDepthExceeded && attempt < maxDispatchAttempts && !dispatched; attempt++) {
3946
4049
  try {
3947
4050
  if (attempt > 0) {
3948
4051
  // Uncapped budgets (durable-background and true-foreground) keep
@@ -4003,22 +4106,81 @@ export async function chainServerDrivenContinuation(opts) {
4003
4106
  }
4004
4107
  }
4005
4108
  console.error(`[agent-chat] background continuation dispatch attempt ${attempt + 1} failed:`, dispatchErr instanceof Error ? dispatchErr.message : dispatchErr);
4109
+ // Netlify loop protection (see `isLoopProtectionDispatchError`) is a
4110
+ // property of this same live, nested call chain — retrying the exact
4111
+ // same nested self-dispatch within the next few seconds will not
4112
+ // change that, so further attempts are a guaranteed-doomed use of
4113
+ // this worker's remaining wall clock. Stop immediately (instead of
4114
+ // burning the full `maxDispatchAttempts` budget) and fall into the
4115
+ // same deferred-recovery path below, which hands the successor to the
4116
+ // sweep — a genuinely different, non-nested invocation.
4117
+ if (isLoopProtectionDispatchError(dispatchErr)) {
4118
+ break;
4119
+ }
4006
4120
  }
4007
4121
  }
4008
4122
  if (!dispatched) {
4009
- // The pre-inserted successor row would otherwise sit unclaimed until
4010
- // the sweep reaps it — error it now so the failure is immediate and
4011
- // truthful.
4012
4123
  if (nextRowInserted) {
4013
- const nextStatusUpdated = await d
4014
- .updateRunStatusIfRunning(nextRunId, "errored")
4124
+ // Classify WHY this handoff is being deferred — distinct, greppable
4125
+ // tags so production diagnostics (which is all that is readable from
4126
+ // a background worker) can tell "we proactively avoided Netlify loop
4127
+ // protection", "we hit loop protection and stopped retrying", and "a
4128
+ // generic transient dispatch failure exhausted its retry budget"
4129
+ // apart, instead of lumping every deferred handoff into one bucket.
4130
+ const deferralClassification = nestedDepthExceeded
4131
+ ? "proactive_depth_cap"
4132
+ : isLoopProtectionDispatchError(lastDispatchErr)
4133
+ ? "netlify_loop_protection"
4134
+ : "dispatch_budget_exhausted";
4135
+ // RECOVERABLE: the successor row already exists in SQL with its
4136
+ // rehydration payload (`dispatch_payload`) intact and is still
4137
+ // `status='running', dispatch_mode='background'` — exactly the state
4138
+ // the unclaimed-background-run sweep (`agent-chat-plugin.ts`) already
4139
+ // scans for. Do NOT error it here: leave it alone so the sweep can
4140
+ // redispatch it once `UNCLAIMED_BACKGROUND_RUN_GRACE_MS` has passed,
4141
+ // bounded by `UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS` before it
4142
+ // falls back to the existing loud reap
4143
+ // (`background_worker_never_started`) — so this is deferred, never a
4144
+ // silent hang. This chunk still goes terminal (its own soft-timeout
4145
+ // budget is genuinely spent), but with an honest reason: the TURN is
4146
+ // not dead, only this handoff attempt was.
4147
+ //
4148
+ // THREE-SITE INVARIANT (keep in lockstep — a future reader must not
4149
+ // "fix" one without the others): this deferral only survives because
4150
+ // the ~1s client poll in `getActiveRunForThreadAsync`
4151
+ // (run-manager.ts) ALSO skips `reapUnclaimedBackgroundRun` while the
4152
+ // successor is within `UNCLAIMED_BACKGROUND_RUN_REDISPATCH_BOUND_MS`
4153
+ // (via `shouldRedispatchUnclaimedBackgroundRun`). Without that guard a
4154
+ // connected client would reap this row at the 25s grace, before the
4155
+ // ~2-min sweep, defeating the deferral. The sweep in agent-chat-plugin
4156
+ // is the recovery actor; run-manager is the guard; this is the
4157
+ // producer.
4158
+ await d
4159
+ .recordRunDiagnostic(nextRunId, RUN_DIAG_STAGE.workerThrew, `chain_dispatch_deferred[${deferralClassification}]: dispatch budget exhausted (${maxDispatchAttempts} attempts) awaiting unclaimed-run sweep redispatch; ${lastDispatchErr instanceof Error
4160
+ ? lastDispatchErr.message
4161
+ : String(lastDispatchErr)}`)
4162
+ .catch(() => { });
4163
+ await d
4164
+ .recordRunDiagnostic(runId, RUN_DIAG_STAGE.workerThrew, `chain_dispatch_deferred[${deferralClassification}] nextRunId=${nextRunId} ${lastDispatchErr instanceof Error
4165
+ ? lastDispatchErr.message
4166
+ : String(lastDispatchErr)}`)
4167
+ .catch(() => { });
4168
+ console.error(`[agent-chat] background continuation dispatch deferred (${deferralClassification}); leaving the pre-inserted successor for the unclaimed-run sweep to redispatch:`, lastDispatchErr instanceof Error
4169
+ ? lastDispatchErr.message
4170
+ : lastDispatchErr);
4171
+ const statusUpdated = await d
4172
+ .updateRunStatusIfRunning(runId, "errored")
4015
4173
  .catch(() => false);
4016
- if (nextStatusUpdated) {
4174
+ if (statusUpdated) {
4017
4175
  await d
4018
- .setRunTerminalReason(nextRunId, "background_continuation_dispatch_failed")
4176
+ .setRunTerminalReason(runId, "background_continuation_dispatch_deferred")
4019
4177
  .catch(() => { });
4020
4178
  }
4179
+ return;
4021
4180
  }
4181
+ // No successor row exists at all (the pre-insert itself failed) — there
4182
+ // is nothing for the sweep to find and recover, so this really is
4183
+ // fatal. Fail loud immediately via the shared catch block below.
4022
4184
  throw lastDispatchErr instanceof Error
4023
4185
  ? lastDispatchErr
4024
4186
  : new Error(String(lastDispatchErr));
@@ -4030,6 +4192,7 @@ export async function chainServerDrivenContinuation(opts) {
4030
4192
  .markBackgroundContinuationChunkTerminal({
4031
4193
  runId,
4032
4194
  continuationReason,
4195
+ terminalEvent: run.events.at(-1)?.event,
4033
4196
  })
4034
4197
  .catch(() => { });
4035
4198
  }