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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (420) 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 +176 -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/server-side.d.ts +8 -0
  135. package/dist/ai-service/llm/context-v2/compaction/server-side.d.ts.map +1 -1
  136. package/dist/ai-service/llm/context-v2/compaction/server-side.js +8 -0
  137. package/dist/ai-service/llm/context-v2/compaction/server-side.js.map +1 -1
  138. package/dist/ai-service/llm/context-v2/context-component-partition.d.ts +24 -0
  139. package/dist/ai-service/llm/context-v2/context-component-partition.d.ts.map +1 -0
  140. package/dist/ai-service/llm/context-v2/context-component-partition.js +222 -0
  141. package/dist/ai-service/llm/context-v2/context-component-partition.js.map +1 -0
  142. package/dist/ai-service/llm/context-v2/context-metrics.d.ts +9 -0
  143. package/dist/ai-service/llm/context-v2/context-metrics.d.ts.map +1 -1
  144. package/dist/ai-service/llm/context-v2/context-metrics.js +40 -2
  145. package/dist/ai-service/llm/context-v2/context-metrics.js.map +1 -1
  146. package/dist/ai-service/llm/context-v2/context.d.ts +116 -4
  147. package/dist/ai-service/llm/context-v2/context.d.ts.map +1 -1
  148. package/dist/ai-service/llm/context-v2/context.js +276 -64
  149. package/dist/ai-service/llm/context-v2/context.js.map +1 -1
  150. package/dist/ai-service/llm/context-v2/conversation-context.d.ts +18 -0
  151. package/dist/ai-service/llm/context-v2/conversation-context.d.ts.map +1 -1
  152. package/dist/ai-service/llm/context-v2/file-read-ledger.d.ts +218 -0
  153. package/dist/ai-service/llm/context-v2/file-read-ledger.d.ts.map +1 -0
  154. package/dist/ai-service/llm/context-v2/file-read-ledger.js +275 -0
  155. package/dist/ai-service/llm/context-v2/file-read-ledger.js.map +1 -0
  156. package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.d.ts.map +1 -1
  157. package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.js +5 -2
  158. package/dist/ai-service/llm/context-v2/phase1-tool-summarizer.js.map +1 -1
  159. package/dist/ai-service/llm/context-v2/token-tracker.d.ts +2 -0
  160. package/dist/ai-service/llm/context-v2/token-tracker.d.ts.map +1 -1
  161. package/dist/ai-service/llm/context-v2/token-tracker.js +4 -0
  162. package/dist/ai-service/llm/context-v2/token-tracker.js.map +1 -1
  163. package/dist/ai-service/llm/context-v2/tool-schema-tokens.d.ts +22 -0
  164. package/dist/ai-service/llm/context-v2/tool-schema-tokens.d.ts.map +1 -0
  165. package/dist/ai-service/llm/context-v2/tool-schema-tokens.js +36 -0
  166. package/dist/ai-service/llm/context-v2/tool-schema-tokens.js.map +1 -0
  167. package/dist/ai-service/llm/context-v2/types.d.ts +8 -0
  168. package/dist/ai-service/llm/context-v2/types.d.ts.map +1 -1
  169. package/dist/ai-service/llm/context-v2/types.js +48 -0
  170. package/dist/ai-service/llm/context-v2/types.js.map +1 -1
  171. package/dist/ai-service/llm/error.d.ts +2 -0
  172. package/dist/ai-service/llm/error.d.ts.map +1 -1
  173. package/dist/ai-service/llm/error.js +1 -0
  174. package/dist/ai-service/llm/error.js.map +1 -1
  175. package/dist/ai-service/llm/retry-exhaustion-reason.d.ts +2 -0
  176. package/dist/ai-service/llm/retry-exhaustion-reason.d.ts.map +1 -0
  177. package/dist/ai-service/llm/retry-exhaustion-reason.js +2 -0
  178. package/dist/ai-service/llm/retry-exhaustion-reason.js.map +1 -0
  179. package/dist/ai-service/llm/stream/errors.d.ts +6 -7
  180. package/dist/ai-service/llm/stream/errors.d.ts.map +1 -1
  181. package/dist/ai-service/llm/stream/errors.js +7 -1
  182. package/dist/ai-service/llm/stream/errors.js.map +1 -1
  183. package/dist/ai-service/llm/stream/event-bus.d.ts +9 -1
  184. package/dist/ai-service/llm/stream/event-bus.d.ts.map +1 -1
  185. package/dist/ai-service/llm/stream/event-bus.js.map +1 -1
  186. package/dist/ai-service/llm/stream/idle-monitor.d.ts.map +1 -1
  187. package/dist/ai-service/llm/stream/idle-monitor.js.map +1 -1
  188. package/dist/ai-service/llm/stream/observers/context.d.ts.map +1 -1
  189. package/dist/ai-service/llm/stream/observers/context.js +13 -0
  190. package/dist/ai-service/llm/stream/observers/context.js.map +1 -1
  191. package/dist/ai-service/llm/stream/observers/llmobs.d.ts +14 -1
  192. package/dist/ai-service/llm/stream/observers/llmobs.d.ts.map +1 -1
  193. package/dist/ai-service/llm/stream/observers/llmobs.js +91 -7
  194. package/dist/ai-service/llm/stream/observers/llmobs.js.map +1 -1
  195. package/dist/ai-service/llm/stream/observers/logging.d.ts +3 -1
  196. package/dist/ai-service/llm/stream/observers/logging.d.ts.map +1 -1
  197. package/dist/ai-service/llm/stream/observers/logging.js +73 -52
  198. package/dist/ai-service/llm/stream/observers/logging.js.map +1 -1
  199. package/dist/ai-service/llm/stream/observers/retry-notification.d.ts.map +1 -1
  200. package/dist/ai-service/llm/stream/observers/retry-notification.js +16 -9
  201. package/dist/ai-service/llm/stream/observers/retry-notification.js.map +1 -1
  202. package/dist/ai-service/llm/stream/orchestrator.d.ts +5 -1
  203. package/dist/ai-service/llm/stream/orchestrator.d.ts.map +1 -1
  204. package/dist/ai-service/llm/stream/orchestrator.js +103 -12
  205. package/dist/ai-service/llm/stream/orchestrator.js.map +1 -1
  206. package/dist/ai-service/llm/stream/retry-engine.d.ts +3 -1
  207. package/dist/ai-service/llm/stream/retry-engine.d.ts.map +1 -1
  208. package/dist/ai-service/llm/stream/retry-engine.js +9 -0
  209. package/dist/ai-service/llm/stream/retry-engine.js.map +1 -1
  210. package/dist/ai-service/llm/stream/session.d.ts +8 -1
  211. package/dist/ai-service/llm/stream/session.d.ts.map +1 -1
  212. package/dist/ai-service/llm/stream/session.js +19 -0
  213. package/dist/ai-service/llm/stream/session.js.map +1 -1
  214. package/dist/ai-service/llm/stream/types.d.ts +13 -0
  215. package/dist/ai-service/llm/stream/types.d.ts.map +1 -1
  216. package/dist/ai-service/llm/stream/wait-state-tracker.d.ts +5 -14
  217. package/dist/ai-service/llm/stream/wait-state-tracker.d.ts.map +1 -1
  218. package/dist/ai-service/llm/stream/wait-state-tracker.js +25 -0
  219. package/dist/ai-service/llm/stream/wait-state-tracker.js.map +1 -1
  220. package/dist/ai-service/mcp/embedded-playwright-mcp-server.js +8 -8
  221. package/dist/ai-service/mcp/embedded-playwright-mcp-server.js.map +1 -1
  222. package/dist/ai-service/policy-gate-remediation-usage.d.ts +2 -0
  223. package/dist/ai-service/policy-gate-remediation-usage.d.ts.map +1 -0
  224. package/dist/ai-service/policy-gate-remediation-usage.js +56 -0
  225. package/dist/ai-service/policy-gate-remediation-usage.js.map +1 -0
  226. package/dist/ai-service/prompts/summarize-destructive-migration.d.ts +12 -0
  227. package/dist/ai-service/prompts/summarize-destructive-migration.d.ts.map +1 -0
  228. package/dist/ai-service/prompts/summarize-destructive-migration.js +37 -0
  229. package/dist/ai-service/prompts/summarize-destructive-migration.js.map +1 -0
  230. package/dist/ai-service/recording/storage/session-recording-storage.js +2 -2
  231. package/dist/ai-service/recording/storage/session-recording-storage.js.map +1 -1
  232. package/dist/ai-service/security/secret-scanner-service.d.ts.map +1 -1
  233. package/dist/ai-service/security/secret-scanner-service.js +88 -23
  234. package/dist/ai-service/security/secret-scanner-service.js.map +1 -1
  235. package/dist/ai-service/skills/index.d.ts +0 -7
  236. package/dist/ai-service/skills/index.d.ts.map +1 -1
  237. package/dist/ai-service/skills/index.js +0 -9
  238. package/dist/ai-service/skills/index.js.map +1 -1
  239. package/dist/ai-service/skills/system/_registry.generated.d.ts.map +1 -1
  240. package/dist/ai-service/skills/system/_registry.generated.js +4 -0
  241. package/dist/ai-service/skills/system/_registry.generated.js.map +1 -1
  242. package/dist/ai-service/skills/system/resolve.d.ts +2 -0
  243. package/dist/ai-service/skills/system/resolve.d.ts.map +1 -0
  244. package/dist/ai-service/skills/system/resolve.js +32 -0
  245. package/dist/ai-service/skills/system/resolve.js.map +1 -0
  246. package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-legacy.generated.d.ts +2 -0
  247. package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-legacy.generated.d.ts.map +1 -0
  248. package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-legacy.generated.js +9 -0
  249. package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-legacy.generated.js.map +1 -0
  250. package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-sdk.generated.d.ts +2 -0
  251. package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-sdk.generated.d.ts.map +1 -0
  252. package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-sdk.generated.js +11 -0
  253. package/dist/ai-service/skills/system/superblocks-frontend/_variants/api-imports-sdk.generated.js.map +1 -0
  254. package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.d.ts +1 -1
  255. package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.d.ts.map +1 -1
  256. package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.js +16 -24
  257. package/dist/ai-service/skills/system/superblocks-frontend/skill.generated.js.map +1 -1
  258. package/dist/ai-service/skills/system/third-party-migration/skill.generated.d.ts +1 -1
  259. package/dist/ai-service/skills/system/third-party-migration/skill.generated.d.ts.map +1 -1
  260. package/dist/ai-service/skills/system/third-party-migration/skill.generated.js +1 -1
  261. package/dist/ai-service/state-machine/clark-fsm.d.ts +11 -0
  262. package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
  263. package/dist/ai-service/state-machine/clark-fsm.js +7 -1
  264. package/dist/ai-service/state-machine/clark-fsm.js.map +1 -1
  265. package/dist/ai-service/state-machine/handlers/agent-planning.d.ts.map +1 -1
  266. package/dist/ai-service/state-machine/handlers/agent-planning.js +21 -0
  267. package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
  268. package/dist/ai-service/state-machine/handlers/llm-generating.d.ts.map +1 -1
  269. package/dist/ai-service/state-machine/handlers/llm-generating.js +32 -9
  270. package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
  271. package/dist/ai-service/state-machine/handlers/runtime-reviewing.d.ts.map +1 -1
  272. package/dist/ai-service/state-machine/handlers/runtime-reviewing.js +21 -2
  273. package/dist/ai-service/state-machine/handlers/runtime-reviewing.js.map +1 -1
  274. package/dist/ai-service/state-machine/helpers/stable-peer.d.ts +11 -2
  275. package/dist/ai-service/state-machine/helpers/stable-peer.d.ts.map +1 -1
  276. package/dist/ai-service/state-machine/helpers/stable-peer.js +105 -18
  277. package/dist/ai-service/state-machine/helpers/stable-peer.js.map +1 -1
  278. package/dist/ai-service/state-machine/mocks.d.ts +3 -1
  279. package/dist/ai-service/state-machine/mocks.d.ts.map +1 -1
  280. package/dist/ai-service/state-machine/mocks.js +52 -13
  281. package/dist/ai-service/state-machine/mocks.js.map +1 -1
  282. package/dist/ai-service/tasks/peer-push.d.ts +3 -0
  283. package/dist/ai-service/tasks/peer-push.d.ts.map +1 -1
  284. package/dist/ai-service/tasks/peer-push.js +33 -0
  285. package/dist/ai-service/tasks/peer-push.js.map +1 -1
  286. package/dist/ai-service/util/call-peer.d.ts +2 -0
  287. package/dist/ai-service/util/call-peer.d.ts.map +1 -1
  288. package/dist/ai-service/util/call-peer.js +17 -4
  289. package/dist/ai-service/util/call-peer.js.map +1 -1
  290. package/dist/ai-service/util/line-ranges.d.ts +21 -0
  291. package/dist/ai-service/util/line-ranges.d.ts.map +1 -0
  292. package/dist/ai-service/util/line-ranges.js +36 -0
  293. package/dist/ai-service/util/line-ranges.js.map +1 -0
  294. package/dist/ai-service/util/peer-liveness.d.ts +1 -0
  295. package/dist/ai-service/util/peer-liveness.d.ts.map +1 -1
  296. package/dist/ai-service/util/peer-liveness.js +2 -0
  297. package/dist/ai-service/util/peer-liveness.js.map +1 -1
  298. package/dist/dev-server-ws-smoke-client.d.ts.map +1 -1
  299. package/dist/dev-server-ws-smoke-client.js +7 -0
  300. package/dist/dev-server-ws-smoke-client.js.map +1 -1
  301. package/dist/draft-interface.d.ts +8 -0
  302. package/dist/draft-interface.d.ts.map +1 -1
  303. package/dist/early-error-relay.d.ts +2 -0
  304. package/dist/early-error-relay.d.ts.map +1 -1
  305. package/dist/early-error-relay.js +7 -3
  306. package/dist/early-error-relay.js.map +1 -1
  307. package/dist/file-sync-vite-plugin.d.ts.map +1 -1
  308. package/dist/file-sync-vite-plugin.js +43 -15
  309. package/dist/file-sync-vite-plugin.js.map +1 -1
  310. package/dist/file-system-helpers.d.ts +2 -2
  311. package/dist/file-system-helpers.d.ts.map +1 -1
  312. package/dist/file-system-helpers.js +3 -3
  313. package/dist/file-system-helpers.js.map +1 -1
  314. package/dist/git-service/errors.d.ts +9 -0
  315. package/dist/git-service/errors.d.ts.map +1 -1
  316. package/dist/git-service/errors.js +15 -0
  317. package/dist/git-service/errors.js.map +1 -1
  318. package/dist/git-service/index.d.ts +2 -2
  319. package/dist/git-service/index.d.ts.map +1 -1
  320. package/dist/git-service/index.js +2 -2
  321. package/dist/git-service/index.js.map +1 -1
  322. package/dist/index.d.ts +1 -0
  323. package/dist/index.d.ts.map +1 -1
  324. package/dist/index.js +1 -0
  325. package/dist/index.js.map +1 -1
  326. package/dist/lock-service/activity-tracker.d.ts +5 -0
  327. package/dist/lock-service/activity-tracker.d.ts.map +1 -1
  328. package/dist/lock-service/activity-tracker.js +10 -0
  329. package/dist/lock-service/activity-tracker.js.map +1 -1
  330. package/dist/lock-service/index.d.ts +69 -4
  331. package/dist/lock-service/index.d.ts.map +1 -1
  332. package/dist/lock-service/index.js +139 -29
  333. package/dist/lock-service/index.js.map +1 -1
  334. package/dist/migration-templates/app-fullstack/client/components/ui/accordion.tsx +9 -65
  335. package/dist/migration-templates/app-fullstack/client/components/ui/area-chart.tsx +36 -156
  336. package/dist/migration-templates/app-fullstack/client/components/ui/aspect-ratio.tsx +1 -5
  337. package/dist/migration-templates/app-fullstack/client/components/ui/avatar.tsx +4 -18
  338. package/dist/migration-templates/app-fullstack/client/components/ui/badge.tsx +6 -29
  339. package/dist/migration-templates/app-fullstack/client/components/ui/bar-chart.tsx +41 -167
  340. package/dist/migration-templates/app-fullstack/client/components/ui/breadcrumb.tsx +1 -4
  341. package/dist/migration-templates/app-fullstack/client/components/ui/button.tsx +5 -64
  342. package/dist/migration-templates/app-fullstack/client/components/ui/calendar.tsx +6 -42
  343. package/dist/migration-templates/app-fullstack/client/components/ui/card.tsx +1 -4
  344. package/dist/migration-templates/app-fullstack/client/components/ui/checkbox.tsx +4 -29
  345. package/dist/migration-templates/app-fullstack/client/components/ui/date-range-picker.tsx +13 -154
  346. package/dist/migration-templates/app-fullstack/client/components/ui/dialog.tsx +7 -34
  347. package/dist/migration-templates/app-fullstack/client/components/ui/file-dropzone.tsx +12 -95
  348. package/dist/migration-templates/app-fullstack/client/components/ui/file-input.tsx +12 -73
  349. package/dist/migration-templates/app-fullstack/client/components/ui/hover-card.tsx +10 -66
  350. package/dist/migration-templates/app-fullstack/client/components/ui/icon.tsx +3 -16
  351. package/dist/migration-templates/app-fullstack/client/components/ui/image.tsx +4 -16
  352. package/dist/migration-templates/app-fullstack/client/components/ui/input.tsx +18 -159
  353. package/dist/migration-templates/app-fullstack/client/components/ui/label.tsx +1 -4
  354. package/dist/migration-templates/app-fullstack/client/components/ui/line-chart.tsx +32 -148
  355. package/dist/migration-templates/app-fullstack/client/components/ui/link.tsx +4 -24
  356. package/dist/migration-templates/app-fullstack/client/components/ui/navigation-menu.tsx +3 -24
  357. package/dist/migration-templates/app-fullstack/client/components/ui/pagination.tsx +4 -24
  358. package/dist/migration-templates/app-fullstack/client/components/ui/pie-chart.tsx +28 -142
  359. package/dist/migration-templates/app-fullstack/client/components/ui/popover.tsx +9 -61
  360. package/dist/migration-templates/app-fullstack/client/components/ui/progress.tsx +2 -11
  361. package/dist/migration-templates/app-fullstack/client/components/ui/radar-chart.tsx +37 -171
  362. package/dist/migration-templates/app-fullstack/client/components/ui/radial-chart.tsx +50 -202
  363. package/dist/migration-templates/app-fullstack/client/components/ui/select.tsx +5 -35
  364. package/dist/migration-templates/app-fullstack/client/components/ui/separator.tsx +1 -8
  365. package/dist/migration-templates/app-fullstack/client/components/ui/sheet.tsx +7 -40
  366. package/dist/migration-templates/app-fullstack/client/components/ui/sidebar.tsx +3 -35
  367. package/dist/migration-templates/app-fullstack/client/components/ui/slider.tsx +11 -95
  368. package/dist/migration-templates/app-fullstack/client/components/ui/switch.tsx +5 -32
  369. package/dist/migration-templates/app-fullstack/client/components/ui/textarea.tsx +13 -90
  370. package/dist/migration-templates/app-fullstack/client/components/ui/toggle-group.tsx +11 -75
  371. package/dist/migration-templates/app-fullstack/client/components/ui/toggle.tsx +8 -70
  372. package/dist/migration-templates/app-fullstack/client/components/ui/tooltip.tsx +9 -62
  373. package/dist/parsing/imports.d.ts +22 -0
  374. package/dist/parsing/imports.d.ts.map +1 -1
  375. package/dist/parsing/imports.js +71 -0
  376. package/dist/parsing/imports.js.map +1 -1
  377. package/dist/reconnect-guard-plugin.d.ts +53 -0
  378. package/dist/reconnect-guard-plugin.d.ts.map +1 -0
  379. package/dist/reconnect-guard-plugin.js +203 -0
  380. package/dist/reconnect-guard-plugin.js.map +1 -0
  381. package/dist/resolver.d.ts +2 -1
  382. package/dist/resolver.d.ts.map +1 -1
  383. package/dist/resolver.js +4 -6
  384. package/dist/resolver.js.map +1 -1
  385. package/dist/router-parser-metrics.d.ts +2 -1
  386. package/dist/router-parser-metrics.d.ts.map +1 -1
  387. package/dist/router-parser-metrics.js.map +1 -1
  388. package/dist/router-parser.d.ts +10 -1
  389. package/dist/router-parser.d.ts.map +1 -1
  390. package/dist/router-parser.js +306 -69
  391. package/dist/router-parser.js.map +1 -1
  392. package/dist/scan-scope-merge-metrics.d.ts +2 -0
  393. package/dist/scan-scope-merge-metrics.d.ts.map +1 -0
  394. package/dist/scan-scope-merge-metrics.js +18 -0
  395. package/dist/scan-scope-merge-metrics.js.map +1 -0
  396. package/dist/scan-scope-merge.d.ts +2 -2
  397. package/dist/scan-scope-merge.d.ts.map +1 -1
  398. package/dist/scan-scope-merge.js +64 -14
  399. package/dist/scan-scope-merge.js.map +1 -1
  400. package/dist/server-rpc/index.d.ts.map +1 -1
  401. package/dist/server-rpc/index.js +12 -2
  402. package/dist/server-rpc/index.js.map +1 -1
  403. package/dist/socket-manager.d.ts +1 -1
  404. package/dist/socket-manager.d.ts.map +1 -1
  405. package/dist/socket-manager.js +276 -15
  406. package/dist/socket-manager.js.map +1 -1
  407. package/dist/sync-service/download.js +2 -2
  408. package/dist/sync-service/download.js.map +1 -1
  409. package/dist/sync-service/index.d.ts +95 -22
  410. package/dist/sync-service/index.d.ts.map +1 -1
  411. package/dist/sync-service/index.js +402 -56
  412. package/dist/sync-service/index.js.map +1 -1
  413. package/dist/sync-service/page-reference-guard.d.ts +17 -0
  414. package/dist/sync-service/page-reference-guard.d.ts.map +1 -0
  415. package/dist/sync-service/page-reference-guard.js +170 -0
  416. package/dist/sync-service/page-reference-guard.js.map +1 -0
  417. package/dist/util.d.ts.map +1 -1
  418. package/dist/util.js +16 -2
  419. package/dist/util.js.map +1 -1
  420. 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 ??
@@ -2331,10 +2338,15 @@ export class AiService extends TracedEventEmitter {
2331
2338
  outcomeDedupeKey: resolvePromptRequestDedupeKey(request),
2332
2339
  coreModel: request.llmConfig?.coreModel,
2333
2340
  });
2341
+ const requestUsageMetadata = request.importSource
2342
+ ? {
2343
+ origin: CLARK_USAGE_ORIGIN.app_migration,
2344
+ source: request.importSource,
2345
+ surface: "app",
2346
+ }
2347
+ : buildPolicyGateRemediationUsageMetadata(request.policyGateRemediation);
2334
2348
  const generateStreakEligible = resolvePromptMetricLabels({
2335
- usageMetadata: request.importSource
2336
- ? { origin: CLARK_USAGE_ORIGIN.app_migration }
2337
- : undefined,
2349
+ usageMetadata: requestUsageMetadata,
2338
2350
  }).streakEligible;
2339
2351
  // The id is now recorded. If anything below throws before generation is
2340
2352
  // actually kicked off (the `transitionTo` USER_SENT_PROMPT), evict it so a
@@ -2372,17 +2384,10 @@ export class AiService extends TracedEventEmitter {
2372
2384
  baseCommitId,
2373
2385
  isInterruptAbort: undefined,
2374
2386
  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,
2387
+ // Explicit per-turn attribution replaces the default in-app Clark
2388
+ // metadata. Both migration and policy remediation still use the app
2389
+ // surface, while the origin and IDs make their spend queryable.
2390
+ usageMetadata: requestUsageMetadata,
2386
2391
  useMockGeneration: request.mockGeneration ?? false,
2387
2392
  planContext: mergePlanContexts(context.planContext, request.planContext),
2388
2393
  browserContext: request.browserContext,
@@ -2678,6 +2683,96 @@ export class AiService extends TracedEventEmitter {
2678
2683
  });
2679
2684
  }
2680
2685
  }
2686
+ async handleAiSummarizeDestructiveMigration(request) {
2687
+ if (this.clark.state === ClarkStateNames.Dead) {
2688
+ throw new Error("Service is unavailable");
2689
+ }
2690
+ const peer = this.clark.context.peer;
2691
+ try {
2692
+ const wantedFiles = [
2693
+ ...new Set(request.findings.map((finding) => finding.fileName)),
2694
+ ];
2695
+ const migrationFiles = {};
2696
+ if (wantedFiles.length > 0) {
2697
+ let sqlPaths = [];
2698
+ try {
2699
+ sqlPaths = await this.appShell.listFiles(["**/*.sql"]);
2700
+ }
2701
+ catch {
2702
+ sqlPaths = [];
2703
+ }
2704
+ for (const fileName of wantedFiles) {
2705
+ const match = sqlPaths.find((sqlPath) => sqlPath === fileName || sqlPath.endsWith(`/${fileName}`));
2706
+ if (match === undefined) {
2707
+ continue;
2708
+ }
2709
+ try {
2710
+ migrationFiles[fileName] = await this.appShell.readFile(match);
2711
+ }
2712
+ catch {
2713
+ // The excerpt on the finding is enough when the file cannot be read.
2714
+ }
2715
+ }
2716
+ }
2717
+ const prompt = buildSummarizeDestructiveMigrationPrompt({
2718
+ findings: request.findings,
2719
+ migrationFiles: Object.keys(migrationFiles).length > 0 ? migrationFiles : undefined,
2720
+ scanUnavailable: request.scanUnavailable,
2721
+ });
2722
+ const llmConfig = request.llmConfig
2723
+ ? {
2724
+ ...request.llmConfig,
2725
+ interleavedThinking: false,
2726
+ thinkingEnabled: false,
2727
+ }
2728
+ : undefined;
2729
+ const { providerOptions, headers } = processLLMConfig(llmConfig, 2000, `AI Summarize Destructive Migration`);
2730
+ const llmProviderSettings = this.getLLMProviderSettings(llmConfig);
2731
+ const llmProvider = createLLMProvider(llmProviderSettings, () => this.requireProvidedInferenceJwt(request.jwt, "live-edit request"), llmConfig, () => helperSystemAiAttributes({
2732
+ applicationId: this.config.applicationId,
2733
+ sessionId: this.sessionId,
2734
+ triggerType: AiSystemTriggerType.DESTRUCTIVE_MIGRATION_SUMMARY,
2735
+ }));
2736
+ const { model, providerConfig } = llmProvider.modelForTask("explain");
2737
+ await traceLLM("handleAiSummarizeDestructiveMigration", model.modelId, model.provider, async () => {
2738
+ try {
2739
+ const streamResult = await this.llmClient.streamText({
2740
+ model,
2741
+ user: { role: "user", content: prompt },
2742
+ providerOptions,
2743
+ headers,
2744
+ providerConfig,
2745
+ enableFallback: llmConfig?.unifiedProviderEnabled ?? false,
2746
+ });
2747
+ for await (const chunk of streamResult.textStream) {
2748
+ if (chunk) {
2749
+ await peer.call.aiPushDestructiveMigrationSummary({
2750
+ summaryKey: request.summaryKey,
2751
+ delta: chunk,
2752
+ });
2753
+ }
2754
+ }
2755
+ await peer.call.aiPushDestructiveMigrationSummary({
2756
+ summaryKey: request.summaryKey,
2757
+ isComplete: true,
2758
+ });
2759
+ }
2760
+ catch (error) {
2761
+ const errorMsg = error instanceof Error ? error.message : String(error);
2762
+ getLogger().error(`[ai-service] streamText error for destructive migration summary: ${errorMsg}`);
2763
+ throw error;
2764
+ }
2765
+ }, {}, llmobs);
2766
+ }
2767
+ catch (error) {
2768
+ const errorMessage = error instanceof Error ? error.message : String(error);
2769
+ getLogger().error(`[ai-service] Error summarizing destructive migrations: ${errorMessage}`, getErrorMeta(error));
2770
+ await peer.call.aiPushDestructiveMigrationSummary({
2771
+ summaryKey: request.summaryKey,
2772
+ error: "Failed to generate destructive migration summary",
2773
+ });
2774
+ }
2775
+ }
2681
2776
  async handleAiLabelAttachment(request) {
2682
2777
  const logger = getLogger();
2683
2778
  const startTime = Date.now();
@@ -2824,9 +2919,20 @@ export class AiService extends TracedEventEmitter {
2824
2919
  .replace(/'/g, "&apos;")
2825
2920
  .replace(/</g, "&lt;")
2826
2921
  .replace(/>/g, "&gt;");
2922
+ // Cap content sent for labeling only; the model never sees the rest.
2923
+ const isTruncated = normalizedTextAttachment.content.length >
2924
+ LABEL_ATTACHMENT_TRUNCATION_CHARS;
2925
+ const content = isTruncated
2926
+ ? truncateTextForLabeling(normalizedTextAttachment.content, LABEL_ATTACHMENT_TRUNCATION_CHARS) + "\n...[truncated]"
2927
+ : normalizedTextAttachment.content;
2928
+ if (isTruncated) {
2929
+ recordAttachmentLabelTruncated({
2930
+ mimeType: normalizedTextAttachment.mimeType,
2931
+ });
2932
+ }
2827
2933
  return {
2828
2934
  type: "text",
2829
- text: `<${normalizedTextAttachment.tagName}_file name="${sanitizedFileName}" mimeType="${sanitizedMimeType}">\n${normalizedTextAttachment.content}\n</${normalizedTextAttachment.tagName}_file>`,
2935
+ text: `<${normalizedTextAttachment.tagName}_file name="${sanitizedFileName}" mimeType="${sanitizedMimeType}">\n${content}\n</${normalizedTextAttachment.tagName}_file>`,
2830
2936
  };
2831
2937
  }
2832
2938
  throw new Error(`Unsupported attachment type: ${attachment.type}`);
@@ -3811,6 +3917,13 @@ export class AiService extends TracedEventEmitter {
3811
3917
  if (this.taskStore) {
3812
3918
  this.pendingTaskResyncPeerIds.add(peerId);
3813
3919
  }
3920
+ // 4. Close out tool calls the transcript still reports as running but
3921
+ // that no process is executing (ENG-6785). Does not gate the connect
3922
+ // handshake: the peer is already bound, and the reconcile is several
3923
+ // RPCs long. Reconnect `getMessages({ force })` joins this promise so
3924
+ // the open tab's history reload includes the repair. A failed load or
3925
+ // push retries on a later bind.
3926
+ void this.chatSessionStore.reconcileAbandonedToolCalls();
3814
3927
  this.tryAutoDispatchMigrationTurnIfReady();
3815
3928
  }
3816
3929
  /**
@@ -3939,6 +4052,46 @@ export class AiService extends TracedEventEmitter {
3939
4052
  }
3940
4053
  this.clearPeerConnection();
3941
4054
  }
4055
+ /**
4056
+ * A lifecycle transition failed after potentially replacing the transport.
4057
+ * The socket manager no longer has a trustworthy owner to disconnect by ID.
4058
+ * Drop the actual binding even if context disposal fails; the caller must
4059
+ * retry this cleanup successfully before allowing another editor to bind.
4060
+ */
4061
+ resetEditorConnection() {
4062
+ try {
4063
+ const contextId = this.getContextId();
4064
+ if (contextId)
4065
+ this.contextManagerV2.clearContext(contextId);
4066
+ }
4067
+ finally {
4068
+ this.pendingTaskResyncPeerIds.clear();
4069
+ this.authenticatedPeerUserId = undefined;
4070
+ this.authenticatedPeerId = undefined;
4071
+ this.clearPeerConnection();
4072
+ this.stablePeer.closeAndRejectPendingRequests();
4073
+ }
4074
+ }
4075
+ /**
4076
+ * The bound editor's transport is gone, but a reconnect for the same peer
4077
+ * is already open and on its way to proving its authorization. The
4078
+ * conversation stays: only the socket is dropped, so calls made in the
4079
+ * meantime queue on the StablePeer and flush when that reconnect binds,
4080
+ * instead of being written into a dead connection. The peer identity is
4081
+ * kept, so the full teardown in `handleUserDisconnected` still recognizes
4082
+ * the peer when the last socket for it closes.
4083
+ */
4084
+ detachPeerTransport(peerId) {
4085
+ if (this.stablePeer.peerId !== peerId) {
4086
+ this.getLogger().debug("[ai-service] Ignored detach for a different peer", {
4087
+ "peer.id": peerId,
4088
+ "peer.bound_id": this.stablePeer.peerId,
4089
+ });
4090
+ return;
4091
+ }
4092
+ this.getLogger().info(`[ai-service] Editor transport detached while peer ${peerId} reconnects`);
4093
+ this.stablePeer.detachTransport();
4094
+ }
3942
4095
  clearPeerConnection() {
3943
4096
  this.getLogger().info(`[ai-service] Clearing peer connection`);
3944
4097
  // The StablePeer reference on `clark.context.peer` stays — we only mark