@superblocksteam/vite-plugin-file-sync 2.0.162 → 2.0.163-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (442) hide show
  1. package/dist/ai-service/agent/middleware.d.ts.map +1 -1
  2. package/dist/ai-service/agent/middleware.js +18 -7
  3. package/dist/ai-service/agent/middleware.js.map +1 -1
  4. package/dist/ai-service/agent/prompts/build-base-system-prompt.d.ts.map +1 -1
  5. package/dist/ai-service/agent/prompts/build-base-system-prompt.js +43 -29
  6. package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
  7. package/dist/ai-service/agent/prompts/build-security-scan-prompt.d.ts.map +1 -1
  8. package/dist/ai-service/agent/prompts/build-security-scan-prompt.js +25 -0
  9. package/dist/ai-service/agent/prompts/build-security-scan-prompt.js.map +1 -1
  10. package/dist/ai-service/agent/subagents/coding/run-coding-subagent.d.ts.map +1 -1
  11. package/dist/ai-service/agent/subagents/coding/run-coding-subagent.js +15 -0
  12. package/dist/ai-service/agent/subagents/coding/run-coding-subagent.js.map +1 -1
  13. package/dist/ai-service/agent/tools/apis/test-api.d.ts.map +1 -1
  14. package/dist/ai-service/agent/tools/apis/test-api.js +4 -2
  15. package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
  16. package/dist/ai-service/agent/tools/app-environment/switch-selected-environment.d.ts +18 -0
  17. package/dist/ai-service/agent/tools/app-environment/switch-selected-environment.d.ts.map +1 -0
  18. package/dist/ai-service/agent/tools/app-environment/switch-selected-environment.js +61 -0
  19. package/dist/ai-service/agent/tools/app-environment/switch-selected-environment.js.map +1 -0
  20. package/dist/ai-service/agent/tools/build-capture-screenshot.js +1 -1
  21. package/dist/ai-service/agent/tools/build-install-packages.d.ts.map +1 -1
  22. package/dist/ai-service/agent/tools/build-install-packages.js +21 -8
  23. package/dist/ai-service/agent/tools/build-install-packages.js.map +1 -1
  24. package/dist/ai-service/agent/tools/build-read-file.d.ts +87 -1
  25. package/dist/ai-service/agent/tools/build-read-file.d.ts.map +1 -1
  26. package/dist/ai-service/agent/tools/build-read-file.js +453 -82
  27. package/dist/ai-service/agent/tools/build-read-file.js.map +1 -1
  28. package/dist/ai-service/agent/tools/build-write-file.d.ts +1 -0
  29. package/dist/ai-service/agent/tools/build-write-file.d.ts.map +1 -1
  30. package/dist/ai-service/agent/tools/build-write-file.js +18 -2
  31. package/dist/ai-service/agent/tools/build-write-file.js.map +1 -1
  32. package/dist/ai-service/agent/tools/debug-cache.d.ts +11 -0
  33. package/dist/ai-service/agent/tools/debug-cache.d.ts.map +1 -1
  34. package/dist/ai-service/agent/tools/debug-cache.js +62 -14
  35. package/dist/ai-service/agent/tools/debug-cache.js.map +1 -1
  36. package/dist/ai-service/agent/tools/index.d.ts +2 -1
  37. package/dist/ai-service/agent/tools/index.d.ts.map +1 -1
  38. package/dist/ai-service/agent/tools/index.js +2 -1
  39. package/dist/ai-service/agent/tools/index.js.map +1 -1
  40. package/dist/ai-service/agent/tools/integrations/metadata.d.ts +1 -0
  41. package/dist/ai-service/agent/tools/integrations/metadata.d.ts.map +1 -1
  42. package/dist/ai-service/agent/tools/integrations/metadata.js +7 -2
  43. package/dist/ai-service/agent/tools/integrations/metadata.js.map +1 -1
  44. package/dist/ai-service/agent/tools/read-file-metrics.d.ts +30 -0
  45. package/dist/ai-service/agent/tools/read-file-metrics.d.ts.map +1 -0
  46. package/dist/ai-service/agent/tools/read-file-metrics.js +158 -0
  47. package/dist/ai-service/agent/tools/read-file-metrics.js.map +1 -0
  48. package/dist/ai-service/agent/tools/subagent-isolation.d.ts +27 -0
  49. package/dist/ai-service/agent/tools/subagent-isolation.d.ts.map +1 -0
  50. package/dist/ai-service/agent/tools/subagent-isolation.js +57 -0
  51. package/dist/ai-service/agent/tools/subagent-isolation.js.map +1 -0
  52. package/dist/ai-service/agent/tools.d.ts +4 -1
  53. package/dist/ai-service/agent/tools.d.ts.map +1 -1
  54. package/dist/ai-service/agent/tools.js +51 -5
  55. package/dist/ai-service/agent/tools.js.map +1 -1
  56. package/dist/ai-service/agent/tools2/tools/download-attachments.d.ts.map +1 -1
  57. package/dist/ai-service/agent/tools2/tools/download-attachments.js +1 -0
  58. package/dist/ai-service/agent/tools2/tools/download-attachments.js.map +1 -1
  59. package/dist/ai-service/agent/tools2/tools/start-test-run.d.ts.map +1 -1
  60. package/dist/ai-service/agent/tools2/tools/start-test-run.js +14 -0
  61. package/dist/ai-service/agent/tools2/tools/start-test-run.js.map +1 -1
  62. package/dist/ai-service/agent/utils.d.ts.map +1 -1
  63. package/dist/ai-service/agent/utils.js +2 -2
  64. package/dist/ai-service/agent/utils.js.map +1 -1
  65. package/dist/ai-service/app-interface/filesystem/draft-manager.d.ts +2 -1
  66. package/dist/ai-service/app-interface/filesystem/draft-manager.d.ts.map +1 -1
  67. package/dist/ai-service/app-interface/filesystem/draft-manager.js +3 -0
  68. package/dist/ai-service/app-interface/filesystem/draft-manager.js.map +1 -1
  69. package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.d.ts +2 -1
  70. package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.d.ts.map +1 -1
  71. package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.js +13 -11
  72. package/dist/ai-service/app-interface/filesystem/handlers/skill-handler.js.map +1 -1
  73. package/dist/ai-service/app-interface/filesystem/virtual-file-system.d.ts.map +1 -1
  74. package/dist/ai-service/app-interface/filesystem/virtual-file-system.js +1 -1
  75. package/dist/ai-service/app-interface/filesystem/virtual-file-system.js.map +1 -1
  76. package/dist/ai-service/app-interface/shell.d.ts +18 -9
  77. package/dist/ai-service/app-interface/shell.d.ts.map +1 -1
  78. package/dist/ai-service/app-interface/shell.js +92 -112
  79. package/dist/ai-service/app-interface/shell.js.map +1 -1
  80. package/dist/ai-service/app-interface/typecheck-output-parser.d.ts +9 -0
  81. package/dist/ai-service/app-interface/typecheck-output-parser.d.ts.map +1 -0
  82. package/dist/ai-service/app-interface/typecheck-output-parser.js +21 -0
  83. package/dist/ai-service/app-interface/typecheck-output-parser.js.map +1 -0
  84. package/dist/ai-service/app-interface/vulnerability-gate.d.ts +5 -0
  85. package/dist/ai-service/app-interface/vulnerability-gate.d.ts.map +1 -1
  86. package/dist/ai-service/app-interface/vulnerability-gate.js +9 -2
  87. package/dist/ai-service/app-interface/vulnerability-gate.js.map +1 -1
  88. package/dist/ai-service/app-layout.d.ts +13 -0
  89. package/dist/ai-service/app-layout.d.ts.map +1 -0
  90. package/dist/ai-service/app-layout.js +25 -0
  91. package/dist/ai-service/app-layout.js.map +1 -0
  92. package/dist/ai-service/app-skills/manager.d.ts +2 -0
  93. package/dist/ai-service/app-skills/manager.d.ts.map +1 -1
  94. package/dist/ai-service/app-skills/manager.js +13 -6
  95. package/dist/ai-service/app-skills/manager.js.map +1 -1
  96. package/dist/ai-service/attachment-label-metrics.d.ts +5 -0
  97. package/dist/ai-service/attachment-label-metrics.d.ts.map +1 -0
  98. package/dist/ai-service/attachment-label-metrics.js +26 -0
  99. package/dist/ai-service/attachment-label-metrics.js.map +1 -0
  100. package/dist/ai-service/attachment-upload.d.ts.map +1 -1
  101. package/dist/ai-service/attachment-upload.js +6 -1
  102. package/dist/ai-service/attachment-upload.js.map +1 -1
  103. package/dist/ai-service/attachments/validate-prompt-attachments.d.ts +7 -0
  104. package/dist/ai-service/attachments/validate-prompt-attachments.d.ts.map +1 -0
  105. package/dist/ai-service/attachments/validate-prompt-attachments.js +96 -0
  106. package/dist/ai-service/attachments/validate-prompt-attachments.js.map +1 -0
  107. package/dist/ai-service/chat/chat-push-metrics.d.ts +17 -0
  108. package/dist/ai-service/chat/chat-push-metrics.d.ts.map +1 -1
  109. package/dist/ai-service/chat/chat-push-metrics.js +45 -0
  110. package/dist/ai-service/chat/chat-push-metrics.js.map +1 -1
  111. package/dist/ai-service/chat/chat-session-store.d.ts +51 -0
  112. package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
  113. package/dist/ai-service/chat/chat-session-store.js +181 -4
  114. package/dist/ai-service/chat/chat-session-store.js.map +1 -1
  115. package/dist/ai-service/features.d.ts +32 -0
  116. package/dist/ai-service/features.d.ts.map +1 -1
  117. package/dist/ai-service/features.js +32 -0
  118. package/dist/ai-service/features.js.map +1 -1
  119. package/dist/ai-service/helper-system-ai-attributes.d.ts +1 -1
  120. package/dist/ai-service/helper-system-ai-attributes.d.ts.map +1 -1
  121. package/dist/ai-service/helper-system-ai-attributes.js.map +1 -1
  122. package/dist/ai-service/index.d.ts +19 -4
  123. package/dist/ai-service/index.d.ts.map +1 -1
  124. package/dist/ai-service/index.js +177 -23
  125. package/dist/ai-service/index.js.map +1 -1
  126. package/dist/ai-service/llm/client.d.ts +9 -0
  127. package/dist/ai-service/llm/client.d.ts.map +1 -1
  128. package/dist/ai-service/llm/client.js +13 -43
  129. package/dist/ai-service/llm/client.js.map +1 -1
  130. package/dist/ai-service/llm/context-v2/adapter.d.ts +2 -0
  131. package/dist/ai-service/llm/context-v2/adapter.d.ts.map +1 -1
  132. package/dist/ai-service/llm/context-v2/adapter.js +6 -0
  133. package/dist/ai-service/llm/context-v2/adapter.js.map +1 -1
  134. package/dist/ai-service/llm/context-v2/compaction/client-side.d.ts +3 -0
  135. package/dist/ai-service/llm/context-v2/compaction/client-side.d.ts.map +1 -1
  136. package/dist/ai-service/llm/context-v2/compaction/client-side.js +3 -0
  137. package/dist/ai-service/llm/context-v2/compaction/client-side.js.map +1 -1
  138. package/dist/ai-service/llm/context-v2/compaction/server-side.d.ts +8 -0
  139. package/dist/ai-service/llm/context-v2/compaction/server-side.d.ts.map +1 -1
  140. package/dist/ai-service/llm/context-v2/compaction/server-side.js +8 -0
  141. package/dist/ai-service/llm/context-v2/compaction/server-side.js.map +1 -1
  142. package/dist/ai-service/llm/context-v2/compactor.d.ts +2 -0
  143. package/dist/ai-service/llm/context-v2/compactor.d.ts.map +1 -1
  144. package/dist/ai-service/llm/context-v2/compactor.js +4 -1
  145. package/dist/ai-service/llm/context-v2/compactor.js.map +1 -1
  146. package/dist/ai-service/llm/context-v2/context-component-partition.d.ts +24 -0
  147. package/dist/ai-service/llm/context-v2/context-component-partition.d.ts.map +1 -0
  148. package/dist/ai-service/llm/context-v2/context-component-partition.js +222 -0
  149. package/dist/ai-service/llm/context-v2/context-component-partition.js.map +1 -0
  150. package/dist/ai-service/llm/context-v2/context-management.d.ts +7 -0
  151. package/dist/ai-service/llm/context-v2/context-management.d.ts.map +1 -1
  152. package/dist/ai-service/llm/context-v2/context-management.js +4 -0
  153. package/dist/ai-service/llm/context-v2/context-management.js.map +1 -1
  154. package/dist/ai-service/llm/context-v2/context-metrics.d.ts +9 -0
  155. package/dist/ai-service/llm/context-v2/context-metrics.d.ts.map +1 -1
  156. package/dist/ai-service/llm/context-v2/context-metrics.js +40 -2
  157. package/dist/ai-service/llm/context-v2/context-metrics.js.map +1 -1
  158. package/dist/ai-service/llm/context-v2/context.d.ts +116 -4
  159. package/dist/ai-service/llm/context-v2/context.d.ts.map +1 -1
  160. package/dist/ai-service/llm/context-v2/context.js +276 -64
  161. package/dist/ai-service/llm/context-v2/context.js.map +1 -1
  162. package/dist/ai-service/llm/context-v2/conversation-context.d.ts +18 -0
  163. package/dist/ai-service/llm/context-v2/conversation-context.d.ts.map +1 -1
  164. package/dist/ai-service/llm/context-v2/file-read-ledger.d.ts +218 -0
  165. package/dist/ai-service/llm/context-v2/file-read-ledger.d.ts.map +1 -0
  166. package/dist/ai-service/llm/context-v2/file-read-ledger.js +275 -0
  167. package/dist/ai-service/llm/context-v2/file-read-ledger.js.map +1 -0
  168. package/dist/ai-service/llm/context-v2/manager.d.ts.map +1 -1
  169. package/dist/ai-service/llm/context-v2/manager.js +1 -0
  170. package/dist/ai-service/llm/context-v2/manager.js.map +1 -1
  171. package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.d.ts +8 -0
  172. package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.d.ts.map +1 -1
  173. package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.js +53 -4
  174. package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.js.map +1 -1
  175. package/dist/ai-service/llm/context-v2/token-tracker.d.ts +2 -0
  176. package/dist/ai-service/llm/context-v2/token-tracker.d.ts.map +1 -1
  177. package/dist/ai-service/llm/context-v2/token-tracker.js +4 -0
  178. package/dist/ai-service/llm/context-v2/token-tracker.js.map +1 -1
  179. package/dist/ai-service/llm/context-v2/tool-schema-tokens.d.ts +22 -0
  180. package/dist/ai-service/llm/context-v2/tool-schema-tokens.d.ts.map +1 -0
  181. package/dist/ai-service/llm/context-v2/tool-schema-tokens.js +36 -0
  182. package/dist/ai-service/llm/context-v2/tool-schema-tokens.js.map +1 -0
  183. package/dist/ai-service/llm/context-v2/types.d.ts +8 -0
  184. package/dist/ai-service/llm/context-v2/types.d.ts.map +1 -1
  185. package/dist/ai-service/llm/context-v2/types.js +48 -0
  186. package/dist/ai-service/llm/context-v2/types.js.map +1 -1
  187. package/dist/ai-service/llm/error.d.ts +2 -0
  188. package/dist/ai-service/llm/error.d.ts.map +1 -1
  189. package/dist/ai-service/llm/error.js +1 -0
  190. package/dist/ai-service/llm/error.js.map +1 -1
  191. package/dist/ai-service/llm/retry-exhaustion-reason.d.ts +2 -0
  192. package/dist/ai-service/llm/retry-exhaustion-reason.d.ts.map +1 -0
  193. package/dist/ai-service/llm/retry-exhaustion-reason.js +2 -0
  194. package/dist/ai-service/llm/retry-exhaustion-reason.js.map +1 -0
  195. package/dist/ai-service/llm/stream/config.d.ts +1 -1
  196. package/dist/ai-service/llm/stream/config.d.ts.map +1 -1
  197. package/dist/ai-service/llm/stream/config.js.map +1 -1
  198. package/dist/ai-service/llm/stream/errors.d.ts +6 -7
  199. package/dist/ai-service/llm/stream/errors.d.ts.map +1 -1
  200. package/dist/ai-service/llm/stream/errors.js +7 -1
  201. package/dist/ai-service/llm/stream/errors.js.map +1 -1
  202. package/dist/ai-service/llm/stream/event-bus.d.ts +9 -1
  203. package/dist/ai-service/llm/stream/event-bus.d.ts.map +1 -1
  204. package/dist/ai-service/llm/stream/event-bus.js.map +1 -1
  205. package/dist/ai-service/llm/stream/idle-monitor.d.ts.map +1 -1
  206. package/dist/ai-service/llm/stream/idle-monitor.js.map +1 -1
  207. package/dist/ai-service/llm/stream/observers/context.d.ts.map +1 -1
  208. package/dist/ai-service/llm/stream/observers/context.js +13 -0
  209. package/dist/ai-service/llm/stream/observers/context.js.map +1 -1
  210. package/dist/ai-service/llm/stream/observers/llmobs.d.ts +14 -1
  211. package/dist/ai-service/llm/stream/observers/llmobs.d.ts.map +1 -1
  212. package/dist/ai-service/llm/stream/observers/llmobs.js +91 -7
  213. package/dist/ai-service/llm/stream/observers/llmobs.js.map +1 -1
  214. package/dist/ai-service/llm/stream/observers/logging.d.ts +3 -1
  215. package/dist/ai-service/llm/stream/observers/logging.d.ts.map +1 -1
  216. package/dist/ai-service/llm/stream/observers/logging.js +73 -52
  217. package/dist/ai-service/llm/stream/observers/logging.js.map +1 -1
  218. package/dist/ai-service/llm/stream/observers/retry-notification.d.ts.map +1 -1
  219. package/dist/ai-service/llm/stream/observers/retry-notification.js +16 -9
  220. package/dist/ai-service/llm/stream/observers/retry-notification.js.map +1 -1
  221. package/dist/ai-service/llm/stream/orchestrator.d.ts +5 -1
  222. package/dist/ai-service/llm/stream/orchestrator.d.ts.map +1 -1
  223. package/dist/ai-service/llm/stream/orchestrator.js +103 -12
  224. package/dist/ai-service/llm/stream/orchestrator.js.map +1 -1
  225. package/dist/ai-service/llm/stream/retry-engine.d.ts +3 -1
  226. package/dist/ai-service/llm/stream/retry-engine.d.ts.map +1 -1
  227. package/dist/ai-service/llm/stream/retry-engine.js +9 -0
  228. package/dist/ai-service/llm/stream/retry-engine.js.map +1 -1
  229. package/dist/ai-service/llm/stream/session.d.ts +8 -1
  230. package/dist/ai-service/llm/stream/session.d.ts.map +1 -1
  231. package/dist/ai-service/llm/stream/session.js +19 -0
  232. package/dist/ai-service/llm/stream/session.js.map +1 -1
  233. package/dist/ai-service/llm/stream/types.d.ts +13 -0
  234. package/dist/ai-service/llm/stream/types.d.ts.map +1 -1
  235. package/dist/ai-service/llm/stream/wait-state-tracker.d.ts +5 -14
  236. package/dist/ai-service/llm/stream/wait-state-tracker.d.ts.map +1 -1
  237. package/dist/ai-service/llm/stream/wait-state-tracker.js +25 -0
  238. package/dist/ai-service/llm/stream/wait-state-tracker.js.map +1 -1
  239. package/dist/ai-service/mcp/embedded-playwright-mcp-server.js +8 -8
  240. package/dist/ai-service/mcp/embedded-playwright-mcp-server.js.map +1 -1
  241. package/dist/ai-service/migration-llm-config.d.ts.map +1 -1
  242. package/dist/ai-service/migration-llm-config.js +2 -11
  243. package/dist/ai-service/migration-llm-config.js.map +1 -1
  244. package/dist/ai-service/policy-gate-remediation-usage.d.ts +2 -0
  245. package/dist/ai-service/policy-gate-remediation-usage.d.ts.map +1 -0
  246. package/dist/ai-service/policy-gate-remediation-usage.js +56 -0
  247. package/dist/ai-service/policy-gate-remediation-usage.js.map +1 -0
  248. package/dist/ai-service/prompts/summarize-destructive-migration.d.ts +12 -0
  249. package/dist/ai-service/prompts/summarize-destructive-migration.d.ts.map +1 -0
  250. package/dist/ai-service/prompts/summarize-destructive-migration.js +37 -0
  251. package/dist/ai-service/prompts/summarize-destructive-migration.js.map +1 -0
  252. package/dist/ai-service/recording/storage/session-recording-storage.js +2 -2
  253. package/dist/ai-service/recording/storage/session-recording-storage.js.map +1 -1
  254. package/dist/ai-service/security/secret-scanner-service.d.ts.map +1 -1
  255. package/dist/ai-service/security/secret-scanner-service.js +88 -23
  256. package/dist/ai-service/security/secret-scanner-service.js.map +1 -1
  257. package/dist/ai-service/skills/index.d.ts +0 -7
  258. package/dist/ai-service/skills/index.d.ts.map +1 -1
  259. package/dist/ai-service/skills/index.js +0 -9
  260. package/dist/ai-service/skills/index.js.map +1 -1
  261. package/dist/ai-service/skills/system/_registry.generated.d.ts.map +1 -1
  262. package/dist/ai-service/skills/system/_registry.generated.js +4 -0
  263. package/dist/ai-service/skills/system/_registry.generated.js.map +1 -1
  264. package/dist/ai-service/skills/system/resolve.d.ts +2 -0
  265. package/dist/ai-service/skills/system/resolve.d.ts.map +1 -0
  266. package/dist/ai-service/skills/system/resolve.js +32 -0
  267. package/dist/ai-service/skills/system/resolve.js.map +1 -0
  268. package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-legacy.generated.d.ts +2 -0
  269. package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-legacy.generated.d.ts.map +1 -0
  270. package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-legacy.generated.js +9 -0
  271. package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-legacy.generated.js.map +1 -0
  272. package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-sdk.generated.d.ts +2 -0
  273. package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-sdk.generated.d.ts.map +1 -0
  274. package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-sdk.generated.js +11 -0
  275. package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-sdk.generated.js.map +1 -0
  276. package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.d.ts +1 -1
  277. package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.d.ts.map +1 -1
  278. package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.js +16 -24
  279. package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.js.map +1 -1
  280. package/dist/ai-service/skills/system/third-party-migration/skill.generated.d.ts +1 -1
  281. package/dist/ai-service/skills/system/third-party-migration/skill.generated.d.ts.map +1 -1
  282. package/dist/ai-service/skills/system/third-party-migration/skill.generated.js +1 -1
  283. package/dist/ai-service/state-machine/clark-fsm.d.ts +11 -0
  284. package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
  285. package/dist/ai-service/state-machine/clark-fsm.js +8 -1
  286. package/dist/ai-service/state-machine/clark-fsm.js.map +1 -1
  287. package/dist/ai-service/state-machine/handlers/agent-planning.d.ts.map +1 -1
  288. package/dist/ai-service/state-machine/handlers/agent-planning.js +21 -0
  289. package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
  290. package/dist/ai-service/state-machine/handlers/llm-generating.d.ts.map +1 -1
  291. package/dist/ai-service/state-machine/handlers/llm-generating.js +32 -9
  292. package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
  293. package/dist/ai-service/state-machine/handlers/runtime-reviewing.d.ts.map +1 -1
  294. package/dist/ai-service/state-machine/handlers/runtime-reviewing.js +21 -2
  295. package/dist/ai-service/state-machine/handlers/runtime-reviewing.js.map +1 -1
  296. package/dist/ai-service/state-machine/helpers/stable-peer.d.ts +11 -2
  297. package/dist/ai-service/state-machine/helpers/stable-peer.d.ts.map +1 -1
  298. package/dist/ai-service/state-machine/helpers/stable-peer.js +105 -18
  299. package/dist/ai-service/state-machine/helpers/stable-peer.js.map +1 -1
  300. package/dist/ai-service/state-machine/mocks.d.ts +3 -1
  301. package/dist/ai-service/state-machine/mocks.d.ts.map +1 -1
  302. package/dist/ai-service/state-machine/mocks.js +52 -13
  303. package/dist/ai-service/state-machine/mocks.js.map +1 -1
  304. package/dist/ai-service/tasks/peer-push.d.ts +3 -0
  305. package/dist/ai-service/tasks/peer-push.d.ts.map +1 -1
  306. package/dist/ai-service/tasks/peer-push.js +33 -0
  307. package/dist/ai-service/tasks/peer-push.js.map +1 -1
  308. package/dist/ai-service/util/call-peer.d.ts +2 -0
  309. package/dist/ai-service/util/call-peer.d.ts.map +1 -1
  310. package/dist/ai-service/util/call-peer.js +17 -4
  311. package/dist/ai-service/util/call-peer.js.map +1 -1
  312. package/dist/ai-service/util/line-ranges.d.ts +21 -0
  313. package/dist/ai-service/util/line-ranges.d.ts.map +1 -0
  314. package/dist/ai-service/util/line-ranges.js +36 -0
  315. package/dist/ai-service/util/line-ranges.js.map +1 -0
  316. package/dist/ai-service/util/peer-liveness.d.ts +1 -0
  317. package/dist/ai-service/util/peer-liveness.d.ts.map +1 -1
  318. package/dist/ai-service/util/peer-liveness.js +2 -0
  319. package/dist/ai-service/util/peer-liveness.js.map +1 -1
  320. package/dist/dev-server-ws-smoke-client.d.ts.map +1 -1
  321. package/dist/dev-server-ws-smoke-client.js +7 -0
  322. package/dist/dev-server-ws-smoke-client.js.map +1 -1
  323. package/dist/draft-interface.d.ts +8 -0
  324. package/dist/draft-interface.d.ts.map +1 -1
  325. package/dist/early-error-relay.d.ts +2 -0
  326. package/dist/early-error-relay.d.ts.map +1 -1
  327. package/dist/early-error-relay.js +7 -3
  328. package/dist/early-error-relay.js.map +1 -1
  329. package/dist/file-sync-vite-plugin.d.ts.map +1 -1
  330. package/dist/file-sync-vite-plugin.js +43 -15
  331. package/dist/file-sync-vite-plugin.js.map +1 -1
  332. package/dist/file-system-helpers.d.ts +2 -2
  333. package/dist/file-system-helpers.d.ts.map +1 -1
  334. package/dist/file-system-helpers.js +3 -3
  335. package/dist/file-system-helpers.js.map +1 -1
  336. package/dist/git-service/errors.d.ts +9 -0
  337. package/dist/git-service/errors.d.ts.map +1 -1
  338. package/dist/git-service/errors.js +15 -0
  339. package/dist/git-service/errors.js.map +1 -1
  340. package/dist/git-service/index.d.ts +2 -2
  341. package/dist/git-service/index.d.ts.map +1 -1
  342. package/dist/git-service/index.js +2 -2
  343. package/dist/git-service/index.js.map +1 -1
  344. package/dist/index.d.ts +1 -0
  345. package/dist/index.d.ts.map +1 -1
  346. package/dist/index.js +1 -0
  347. package/dist/index.js.map +1 -1
  348. package/dist/lock-service/activity-tracker.d.ts +5 -0
  349. package/dist/lock-service/activity-tracker.d.ts.map +1 -1
  350. package/dist/lock-service/activity-tracker.js +10 -0
  351. package/dist/lock-service/activity-tracker.js.map +1 -1
  352. package/dist/lock-service/index.d.ts +69 -4
  353. package/dist/lock-service/index.d.ts.map +1 -1
  354. package/dist/lock-service/index.js +139 -29
  355. package/dist/lock-service/index.js.map +1 -1
  356. package/dist/migration-templates/app-fullstack/client/components/ui/accordion.tsx +9 -65
  357. package/dist/migration-templates/app-fullstack/client/components/ui/area-chart.tsx +36 -156
  358. package/dist/migration-templates/app-fullstack/client/components/ui/aspect-ratio.tsx +1 -5
  359. package/dist/migration-templates/app-fullstack/client/components/ui/avatar.tsx +4 -18
  360. package/dist/migration-templates/app-fullstack/client/components/ui/badge.tsx +6 -29
  361. package/dist/migration-templates/app-fullstack/client/components/ui/bar-chart.tsx +41 -167
  362. package/dist/migration-templates/app-fullstack/client/components/ui/breadcrumb.tsx +1 -4
  363. package/dist/migration-templates/app-fullstack/client/components/ui/button.tsx +5 -64
  364. package/dist/migration-templates/app-fullstack/client/components/ui/calendar.tsx +6 -42
  365. package/dist/migration-templates/app-fullstack/client/components/ui/card.tsx +1 -4
  366. package/dist/migration-templates/app-fullstack/client/components/ui/checkbox.tsx +4 -29
  367. package/dist/migration-templates/app-fullstack/client/components/ui/date-range-picker.tsx +13 -154
  368. package/dist/migration-templates/app-fullstack/client/components/ui/dialog.tsx +7 -34
  369. package/dist/migration-templates/app-fullstack/client/components/ui/file-dropzone.tsx +12 -95
  370. package/dist/migration-templates/app-fullstack/client/components/ui/file-input.tsx +12 -73
  371. package/dist/migration-templates/app-fullstack/client/components/ui/hover-card.tsx +10 -66
  372. package/dist/migration-templates/app-fullstack/client/components/ui/icon.tsx +3 -16
  373. package/dist/migration-templates/app-fullstack/client/components/ui/image.tsx +4 -16
  374. package/dist/migration-templates/app-fullstack/client/components/ui/input.tsx +18 -159
  375. package/dist/migration-templates/app-fullstack/client/components/ui/label.tsx +1 -4
  376. package/dist/migration-templates/app-fullstack/client/components/ui/line-chart.tsx +32 -148
  377. package/dist/migration-templates/app-fullstack/client/components/ui/link.tsx +4 -24
  378. package/dist/migration-templates/app-fullstack/client/components/ui/navigation-menu.tsx +3 -24
  379. package/dist/migration-templates/app-fullstack/client/components/ui/pagination.tsx +4 -24
  380. package/dist/migration-templates/app-fullstack/client/components/ui/pie-chart.tsx +28 -142
  381. package/dist/migration-templates/app-fullstack/client/components/ui/popover.tsx +9 -61
  382. package/dist/migration-templates/app-fullstack/client/components/ui/progress.tsx +2 -11
  383. package/dist/migration-templates/app-fullstack/client/components/ui/radar-chart.tsx +37 -171
  384. package/dist/migration-templates/app-fullstack/client/components/ui/radial-chart.tsx +50 -202
  385. package/dist/migration-templates/app-fullstack/client/components/ui/select.tsx +5 -35
  386. package/dist/migration-templates/app-fullstack/client/components/ui/separator.tsx +1 -8
  387. package/dist/migration-templates/app-fullstack/client/components/ui/sheet.tsx +7 -40
  388. package/dist/migration-templates/app-fullstack/client/components/ui/sidebar.tsx +3 -35
  389. package/dist/migration-templates/app-fullstack/client/components/ui/slider.tsx +11 -95
  390. package/dist/migration-templates/app-fullstack/client/components/ui/switch.tsx +5 -32
  391. package/dist/migration-templates/app-fullstack/client/components/ui/textarea.tsx +13 -90
  392. package/dist/migration-templates/app-fullstack/client/components/ui/toggle-group.tsx +11 -75
  393. package/dist/migration-templates/app-fullstack/client/components/ui/toggle.tsx +8 -70
  394. package/dist/migration-templates/app-fullstack/client/components/ui/tooltip.tsx +9 -62
  395. package/dist/parsing/imports.d.ts +22 -0
  396. package/dist/parsing/imports.d.ts.map +1 -1
  397. package/dist/parsing/imports.js +71 -0
  398. package/dist/parsing/imports.js.map +1 -1
  399. package/dist/reconnect-guard-plugin.d.ts +53 -0
  400. package/dist/reconnect-guard-plugin.d.ts.map +1 -0
  401. package/dist/reconnect-guard-plugin.js +203 -0
  402. package/dist/reconnect-guard-plugin.js.map +1 -0
  403. package/dist/resolver.d.ts +2 -1
  404. package/dist/resolver.d.ts.map +1 -1
  405. package/dist/resolver.js +4 -6
  406. package/dist/resolver.js.map +1 -1
  407. package/dist/router-parser-metrics.d.ts +2 -1
  408. package/dist/router-parser-metrics.d.ts.map +1 -1
  409. package/dist/router-parser-metrics.js.map +1 -1
  410. package/dist/router-parser.d.ts +10 -1
  411. package/dist/router-parser.d.ts.map +1 -1
  412. package/dist/router-parser.js +306 -69
  413. package/dist/router-parser.js.map +1 -1
  414. package/dist/scan-scope-merge-metrics.d.ts +2 -0
  415. package/dist/scan-scope-merge-metrics.d.ts.map +1 -0
  416. package/dist/scan-scope-merge-metrics.js +18 -0
  417. package/dist/scan-scope-merge-metrics.js.map +1 -0
  418. package/dist/scan-scope-merge.d.ts +2 -2
  419. package/dist/scan-scope-merge.d.ts.map +1 -1
  420. package/dist/scan-scope-merge.js +64 -14
  421. package/dist/scan-scope-merge.js.map +1 -1
  422. package/dist/server-rpc/index.d.ts.map +1 -1
  423. package/dist/server-rpc/index.js +12 -2
  424. package/dist/server-rpc/index.js.map +1 -1
  425. package/dist/socket-manager.d.ts +1 -1
  426. package/dist/socket-manager.d.ts.map +1 -1
  427. package/dist/socket-manager.js +276 -15
  428. package/dist/socket-manager.js.map +1 -1
  429. package/dist/sync-service/download.js +2 -2
  430. package/dist/sync-service/download.js.map +1 -1
  431. package/dist/sync-service/index.d.ts +95 -22
  432. package/dist/sync-service/index.d.ts.map +1 -1
  433. package/dist/sync-service/index.js +402 -56
  434. package/dist/sync-service/index.js.map +1 -1
  435. package/dist/sync-service/page-reference-guard.d.ts +17 -0
  436. package/dist/sync-service/page-reference-guard.d.ts.map +1 -0
  437. package/dist/sync-service/page-reference-guard.js +170 -0
  438. package/dist/sync-service/page-reference-guard.js.map +1 -0
  439. package/dist/util.d.ts.map +1 -1
  440. package/dist/util.js +16 -2
  441. package/dist/util.js.map +1 -1
  442. package/package.json +15 -14
@@ -31,6 +31,7 @@ import { NpmPackageLookup } from "./app-interface/npm-package-lookup.js";
31
31
  import { NpmRegistryClient, createDiskRegistryPolicyStore, } from "./app-interface/npm-registry.js";
32
32
  import { AppShell } from "./app-interface/shell.js";
33
33
  import { AppSkillsManager } from "./app-skills/manager.js";
34
+ import { recordAttachmentLabelTruncated } from "./attachment-label-metrics.js";
34
35
  import { parseDataUrl } from "./attachments/parse-data-url.js";
35
36
  import { isUploadedAttachment, toUploadedAttachmentContentPart, } from "./attachments/uploaded-content-part.js";
36
37
  import { ChatSessionStore } from "./chat/chat-session-store.js";
@@ -71,9 +72,11 @@ import { isMigrationSessionActive } from "./migration-session-active.js";
71
72
  import { hasSettledNormalMigrationTurn, recordMigrationTurnDispatched, recordMigrationTurnSettled, } from "./migration-turns-log.js";
72
73
  import { recordPolicyAgentExecution, } from "./policy-agent-metrics.js";
73
74
  import { classifyPolicyGateError } from "./policy-gate-error.js";
75
+ import { buildPolicyGateRemediationUsageMetadata } from "./policy-gate-remediation-usage.js";
74
76
  import { policyGateStreamPartToAgentStep } from "./policy-gate-step.js";
75
77
  import { ClarkProfiler } from "./profiler/clark-profiler.js";
76
78
  import { buildSummarizeApiUsagePrompt } from "./prompts/summarize-api-usage.js";
79
+ import { buildSummarizeDestructiveMigrationPrompt } from "./prompts/summarize-destructive-migration.js";
77
80
  import { checkAiQuota } from "./quota-client.js";
78
81
  import { RecordingManager, createRecordingFetch } from "./recording/index.js";
79
82
  import { RequestDeduplicator } from "./request-deduplicator.js";
@@ -141,6 +144,18 @@ export { isSdkApiTemplate } from "./sdk-api-templates.js";
141
144
  export function buildLastKnownPolicyStore(opts) {
142
145
  return createDiskRegistryPolicyStore(opts);
143
146
  }
147
+ // A label + one-sentence insight only needs the head of a file.
148
+ const LABEL_ATTACHMENT_TRUNCATION_CHARS = 50_000;
149
+ // Back off one char if the cut point falls inside a UTF-16 surrogate pair,
150
+ // so we never emit a lone unpaired surrogate to the model.
151
+ function truncateTextForLabeling(content, maxChars) {
152
+ let end = maxChars;
153
+ const code = content.charCodeAt(end - 1);
154
+ if (code >= 0xd800 && code <= 0xdbff) {
155
+ end -= 1;
156
+ }
157
+ return content.slice(0, end);
158
+ }
144
159
  const MAX_POLICY_GATE_STREAM_ERRORS = 5;
145
160
  const MAX_POLICY_GATE_STREAM_ERROR_ARRAY_LENGTH = 10;
146
161
  const MAX_POLICY_GATE_STREAM_ERROR_FIELD_LENGTH = 500;
@@ -599,9 +614,6 @@ export class AiService extends TracedEventEmitter {
599
614
  /**
600
615
  * Updates the JWT in Clark context.
601
616
  *
602
- * A token that expires before the one already installed is ignored, because
603
- * primes can arrive out of order.
604
- *
605
617
  * @returns whether the pod ended up holding a usable token. A rejected token
606
618
  * used to look exactly like one that landed, and like one that was never
607
619
  * sent at all, which is why a run could die holding a credential nobody
@@ -613,11 +625,6 @@ export class AiService extends TracedEventEmitter {
613
625
  getLogger().warn(`[ai-service] Rejected an inference JWT (present: ${jwtDetails.present}, hasFederatedToken: ${jwtDetails.hasFederatedToken}, scope: ${jwtDetails.scope ?? "none"})`);
614
626
  return false;
615
627
  }
616
- // Whichever prime finishes last wins. Two overlapping browser
617
- // connections can therefore leave the pod holding a token one refresh
618
- // generation old, which the next refresh repairs because primes on a
619
- // single connection run one at a time and newest-last. Deciding which
620
- // connection owns the pod is ENG-6236.
621
628
  getLogger().info("[ai-service] Accepted a new inference JWT");
622
629
  this.clark.updateContext({ jwt });
623
630
  const llmConfig = this.lastMigrationTurnCredentials?.llmConfig ??
@@ -1573,6 +1580,7 @@ export class AiService extends TracedEventEmitter {
1573
1580
  }
1574
1581
  buildContextManagementForCurrentClark(llmConfig) {
1575
1582
  return selectContextManagementStrategy({
1583
+ coreModel: llmConfig?.coreModel,
1576
1584
  serverContextManagementEnabled: llmConfig?.serverContextManagement?.enabled,
1577
1585
  thresholds: llmConfig?.serverContextManagement,
1578
1586
  summarizeModel: () => createLLMProvider(this.getLLMProviderSettings(llmConfig), () => this.getProviderInferenceAuthToken(), llmConfig, () => this.getLlmAiAttributes(this.clark), this.clark.context.traceHeaders).modelForTask("summarizeMessages"),
@@ -2331,10 +2339,15 @@ export class AiService extends TracedEventEmitter {
2331
2339
  outcomeDedupeKey: resolvePromptRequestDedupeKey(request),
2332
2340
  coreModel: request.llmConfig?.coreModel,
2333
2341
  });
2342
+ const requestUsageMetadata = request.importSource
2343
+ ? {
2344
+ origin: CLARK_USAGE_ORIGIN.app_migration,
2345
+ source: request.importSource,
2346
+ surface: "app",
2347
+ }
2348
+ : buildPolicyGateRemediationUsageMetadata(request.policyGateRemediation);
2334
2349
  const generateStreakEligible = resolvePromptMetricLabels({
2335
- usageMetadata: request.importSource
2336
- ? { origin: CLARK_USAGE_ORIGIN.app_migration }
2337
- : undefined,
2350
+ usageMetadata: requestUsageMetadata,
2338
2351
  }).streakEligible;
2339
2352
  // The id is now recorded. If anything below throws before generation is
2340
2353
  // actually kicked off (the `transitionTo` USER_SENT_PROMPT), evict it so a
@@ -2372,17 +2385,10 @@ export class AiService extends TracedEventEmitter {
2372
2385
  baseCommitId,
2373
2386
  isInterruptAbort: undefined,
2374
2387
  userInitiatedPromptAbort: undefined,
2375
- // Third-party import turns are billed as app_migration; everything
2376
- // else falls back to the default in-app Clark generation metadata.
2377
- // Both are app building, so the surface matches the default that
2378
- // this object replaces.
2379
- usageMetadata: request.importSource
2380
- ? {
2381
- origin: CLARK_USAGE_ORIGIN.app_migration,
2382
- source: request.importSource,
2383
- surface: "app",
2384
- }
2385
- : undefined,
2388
+ // Explicit per-turn attribution replaces the default in-app Clark
2389
+ // metadata. Both migration and policy remediation still use the app
2390
+ // surface, while the origin and IDs make their spend queryable.
2391
+ usageMetadata: requestUsageMetadata,
2386
2392
  useMockGeneration: request.mockGeneration ?? false,
2387
2393
  planContext: mergePlanContexts(context.planContext, request.planContext),
2388
2394
  browserContext: request.browserContext,
@@ -2678,6 +2684,96 @@ export class AiService extends TracedEventEmitter {
2678
2684
  });
2679
2685
  }
2680
2686
  }
2687
+ async handleAiSummarizeDestructiveMigration(request) {
2688
+ if (this.clark.state === ClarkStateNames.Dead) {
2689
+ throw new Error("Service is unavailable");
2690
+ }
2691
+ const peer = this.clark.context.peer;
2692
+ try {
2693
+ const wantedFiles = [
2694
+ ...new Set(request.findings.map((finding) => finding.fileName)),
2695
+ ];
2696
+ const migrationFiles = {};
2697
+ if (wantedFiles.length > 0) {
2698
+ let sqlPaths = [];
2699
+ try {
2700
+ sqlPaths = await this.appShell.listFiles(["**/*.sql"]);
2701
+ }
2702
+ catch {
2703
+ sqlPaths = [];
2704
+ }
2705
+ for (const fileName of wantedFiles) {
2706
+ const match = sqlPaths.find((sqlPath) => sqlPath === fileName || sqlPath.endsWith(`/${fileName}`));
2707
+ if (match === undefined) {
2708
+ continue;
2709
+ }
2710
+ try {
2711
+ migrationFiles[fileName] = await this.appShell.readFile(match);
2712
+ }
2713
+ catch {
2714
+ // The excerpt on the finding is enough when the file cannot be read.
2715
+ }
2716
+ }
2717
+ }
2718
+ const prompt = buildSummarizeDestructiveMigrationPrompt({
2719
+ findings: request.findings,
2720
+ migrationFiles: Object.keys(migrationFiles).length > 0 ? migrationFiles : undefined,
2721
+ scanUnavailable: request.scanUnavailable,
2722
+ });
2723
+ const llmConfig = request.llmConfig
2724
+ ? {
2725
+ ...request.llmConfig,
2726
+ interleavedThinking: false,
2727
+ thinkingEnabled: false,
2728
+ }
2729
+ : undefined;
2730
+ const { providerOptions, headers } = processLLMConfig(llmConfig, 2000, `AI Summarize Destructive Migration`);
2731
+ const llmProviderSettings = this.getLLMProviderSettings(llmConfig);
2732
+ const llmProvider = createLLMProvider(llmProviderSettings, () => this.requireProvidedInferenceJwt(request.jwt, "live-edit request"), llmConfig, () => helperSystemAiAttributes({
2733
+ applicationId: this.config.applicationId,
2734
+ sessionId: this.sessionId,
2735
+ triggerType: AiSystemTriggerType.DESTRUCTIVE_MIGRATION_SUMMARY,
2736
+ }));
2737
+ const { model, providerConfig } = llmProvider.modelForTask("explain");
2738
+ await traceLLM("handleAiSummarizeDestructiveMigration", model.modelId, model.provider, async () => {
2739
+ try {
2740
+ const streamResult = await this.llmClient.streamText({
2741
+ model,
2742
+ user: { role: "user", content: prompt },
2743
+ providerOptions,
2744
+ headers,
2745
+ providerConfig,
2746
+ enableFallback: llmConfig?.unifiedProviderEnabled ?? false,
2747
+ });
2748
+ for await (const chunk of streamResult.textStream) {
2749
+ if (chunk) {
2750
+ await peer.call.aiPushDestructiveMigrationSummary({
2751
+ summaryKey: request.summaryKey,
2752
+ delta: chunk,
2753
+ });
2754
+ }
2755
+ }
2756
+ await peer.call.aiPushDestructiveMigrationSummary({
2757
+ summaryKey: request.summaryKey,
2758
+ isComplete: true,
2759
+ });
2760
+ }
2761
+ catch (error) {
2762
+ const errorMsg = error instanceof Error ? error.message : String(error);
2763
+ getLogger().error(`[ai-service] streamText error for destructive migration summary: ${errorMsg}`);
2764
+ throw error;
2765
+ }
2766
+ }, {}, llmobs);
2767
+ }
2768
+ catch (error) {
2769
+ const errorMessage = error instanceof Error ? error.message : String(error);
2770
+ getLogger().error(`[ai-service] Error summarizing destructive migrations: ${errorMessage}`, getErrorMeta(error));
2771
+ await peer.call.aiPushDestructiveMigrationSummary({
2772
+ summaryKey: request.summaryKey,
2773
+ error: "Failed to generate destructive migration summary",
2774
+ });
2775
+ }
2776
+ }
2681
2777
  async handleAiLabelAttachment(request) {
2682
2778
  const logger = getLogger();
2683
2779
  const startTime = Date.now();
@@ -2824,9 +2920,20 @@ export class AiService extends TracedEventEmitter {
2824
2920
  .replace(/'/g, "&apos;")
2825
2921
  .replace(/</g, "&lt;")
2826
2922
  .replace(/>/g, "&gt;");
2923
+ // Cap content sent for labeling only; the model never sees the rest.
2924
+ const isTruncated = normalizedTextAttachment.content.length >
2925
+ LABEL_ATTACHMENT_TRUNCATION_CHARS;
2926
+ const content = isTruncated
2927
+ ? truncateTextForLabeling(normalizedTextAttachment.content, LABEL_ATTACHMENT_TRUNCATION_CHARS) + "\n...[truncated]"
2928
+ : normalizedTextAttachment.content;
2929
+ if (isTruncated) {
2930
+ recordAttachmentLabelTruncated({
2931
+ mimeType: normalizedTextAttachment.mimeType,
2932
+ });
2933
+ }
2827
2934
  return {
2828
2935
  type: "text",
2829
- text: `<${normalizedTextAttachment.tagName}_file name="${sanitizedFileName}" mimeType="${sanitizedMimeType}">\n${normalizedTextAttachment.content}\n</${normalizedTextAttachment.tagName}_file>`,
2936
+ text: `<${normalizedTextAttachment.tagName}_file name="${sanitizedFileName}" mimeType="${sanitizedMimeType}">\n${content}\n</${normalizedTextAttachment.tagName}_file>`,
2830
2937
  };
2831
2938
  }
2832
2939
  throw new Error(`Unsupported attachment type: ${attachment.type}`);
@@ -3811,6 +3918,13 @@ export class AiService extends TracedEventEmitter {
3811
3918
  if (this.taskStore) {
3812
3919
  this.pendingTaskResyncPeerIds.add(peerId);
3813
3920
  }
3921
+ // 4. Close out tool calls the transcript still reports as running but
3922
+ // that no process is executing (ENG-6785). Does not gate the connect
3923
+ // handshake: the peer is already bound, and the reconcile is several
3924
+ // RPCs long. Reconnect `getMessages({ force })` joins this promise so
3925
+ // the open tab's history reload includes the repair. A failed load or
3926
+ // push retries on a later bind.
3927
+ void this.chatSessionStore.reconcileAbandonedToolCalls();
3814
3928
  this.tryAutoDispatchMigrationTurnIfReady();
3815
3929
  }
3816
3930
  /**
@@ -3939,6 +4053,46 @@ export class AiService extends TracedEventEmitter {
3939
4053
  }
3940
4054
  this.clearPeerConnection();
3941
4055
  }
4056
+ /**
4057
+ * A lifecycle transition failed after potentially replacing the transport.
4058
+ * The socket manager no longer has a trustworthy owner to disconnect by ID.
4059
+ * Drop the actual binding even if context disposal fails; the caller must
4060
+ * retry this cleanup successfully before allowing another editor to bind.
4061
+ */
4062
+ resetEditorConnection() {
4063
+ try {
4064
+ const contextId = this.getContextId();
4065
+ if (contextId)
4066
+ this.contextManagerV2.clearContext(contextId);
4067
+ }
4068
+ finally {
4069
+ this.pendingTaskResyncPeerIds.clear();
4070
+ this.authenticatedPeerUserId = undefined;
4071
+ this.authenticatedPeerId = undefined;
4072
+ this.clearPeerConnection();
4073
+ this.stablePeer.closeAndRejectPendingRequests();
4074
+ }
4075
+ }
4076
+ /**
4077
+ * The bound editor's transport is gone, but a reconnect for the same peer
4078
+ * is already open and on its way to proving its authorization. The
4079
+ * conversation stays: only the socket is dropped, so calls made in the
4080
+ * meantime queue on the StablePeer and flush when that reconnect binds,
4081
+ * instead of being written into a dead connection. The peer identity is
4082
+ * kept, so the full teardown in `handleUserDisconnected` still recognizes
4083
+ * the peer when the last socket for it closes.
4084
+ */
4085
+ detachPeerTransport(peerId) {
4086
+ if (this.stablePeer.peerId !== peerId) {
4087
+ this.getLogger().debug("[ai-service] Ignored detach for a different peer", {
4088
+ "peer.id": peerId,
4089
+ "peer.bound_id": this.stablePeer.peerId,
4090
+ });
4091
+ return;
4092
+ }
4093
+ this.getLogger().info(`[ai-service] Editor transport detached while peer ${peerId} reconnects`);
4094
+ this.stablePeer.detachTransport();
4095
+ }
3942
4096
  clearPeerConnection() {
3943
4097
  this.getLogger().info(`[ai-service] Clearing peer connection`);
3944
4098
  // The StablePeer reference on `clark.context.peer` stays — we only mark