@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
@@ -13,13 +13,14 @@ import { clearGitAuthFailed, isGitAuthFailed, markGitAuthFailed, } from "./git-a
13
13
  import { GIT_LOG_FORMAT, parseGitLog } from "./git-log.js";
14
14
  import { GIT_OPERATION_BUSY_MESSAGE, } from "./git-operation-lock.js";
15
15
  import { assertIncomingLiveLayout } from "./git-service/app-layout-guard.js";
16
- import { GitConflictError } from "./git-service/index.js";
16
+ import { GitConflictError, isMissingGitRevisionError, } from "./git-service/index.js";
17
17
  import { doesRemoteLiveBranchExist, ensureLiveBranchCheckedOut, pushLiveBranchWithAutoRecreate, rollbackLastCommit, } from "./git-service/live-branch.js";
18
18
  import { ensureProviderWorkflowFiles } from "./git-service/provider-workflow-files.js";
19
19
  import { getSyncCountsAgainstDefaultBranch } from "./git-service/status-sync.js";
20
20
  import { getErrorMeta, getLogger } from "./util/logger.js";
21
21
  import { OperationQueue } from "./util/operation-queue.js";
22
22
  const SB_WORKTREE_SNAPSHOTS_DIR = join(tmpdir(), "sb-worktree-snapshots");
23
+ const EDITOR_RECONNECT_AUTH_TIMEOUT_MS = 30_000;
23
24
  /**
24
25
  * Pulls the JWT-derived `userId` out of an `Authorization: Bearer <jwt>`
25
26
  * header value. Returns `undefined` for missing / malformed headers or
@@ -299,6 +300,66 @@ class SocketManager extends TracedEventEmitter {
299
300
  return true;
300
301
  });
301
302
  };
303
+ // Clark is bound to one editor connection at a time, and which one owns
304
+ // the pod has to be decided per physical connection rather than per peer
305
+ // id: the browser reuses its peer id across retry reconnects, so an id
306
+ // match does not mean the request came from the connection that is still
307
+ // open. Sockets are keyed by object identity and ordered by the sequence
308
+ // they connected in, so a request that was already waiting in a
309
+ // superseded connection's authorization middleware cannot take the pod
310
+ // back from the connection that replaced it. Only a connection that has
311
+ // proved its authorization is a candidate, which is why binding happens
312
+ // here and not on `connect:editor`.
313
+ let activeEditorSocket;
314
+ // A failed replacement may have changed AiService's transport. Keep the
315
+ // owner's ordering, but repair its transport before any further RPC or close.
316
+ let editorBindingNeedsRepair = false;
317
+ // Set while the bound editor's socket has closed and a reconnect for the
318
+ // same peer is open but has not proved its authorization yet. The pod
319
+ // keeps that peer's conversation until the reconnect binds or gives up.
320
+ let detachedEditorPeerId;
321
+ let detachedEditorTimer;
322
+ let nextEditorConnectionSequence = 0;
323
+ const authenticatedEditorSockets = new Map();
324
+ const repairEditorBinding = () => {
325
+ if (!editorBindingNeedsRepair)
326
+ return;
327
+ const owner = activeEditorSocket &&
328
+ authenticatedEditorSockets.get(activeEditorSocket);
329
+ if (activeEditorSocket && owner) {
330
+ aiService?.handleUserConnected(activeEditorSocket, owner.peerId, owner.liveness);
331
+ }
332
+ else if (detachedEditorPeerId) {
333
+ aiService?.detachPeerTransport(detachedEditorPeerId);
334
+ }
335
+ else {
336
+ aiService?.resetEditorConnection();
337
+ }
338
+ editorBindingNeedsRepair = false;
339
+ };
340
+ const resetFailedEditorTransition = () => {
341
+ activeEditorSocket = undefined;
342
+ detachedEditorPeerId = undefined;
343
+ clearTimeout(detachedEditorTimer);
344
+ editorBindingNeedsRepair = true;
345
+ try {
346
+ repairEditorBinding();
347
+ }
348
+ catch (error) {
349
+ // Keep the repair flag: subsequent RPCs cannot bind until teardown
350
+ // succeeds. Resetting bookkeeping alone would orphan the conversation.
351
+ getLogger().error("[socket-manager] Failed to clear editor binding after lifecycle failure", getErrorMeta(error));
352
+ }
353
+ };
354
+ const newestAuthenticatedEditor = () => {
355
+ let newest;
356
+ for (const [peer, connection] of authenticatedEditorSockets) {
357
+ if (!newest || connection.sequence > newest.sequence) {
358
+ newest = { peer, ...connection };
359
+ }
360
+ }
361
+ return newest;
362
+ };
302
363
  const releaseHeadlessLock = (peerId, turnId) => headlessLockHandbackQueue.enqueue(() => releaseHeadlessLockNow(peerId, turnId));
303
364
  // Provide sync context (branchName, lastCommitId) to the AI service
304
365
  // for remote context restore fallback from Bucketeer on fresh pods.
@@ -464,6 +525,7 @@ class SocketManager extends TracedEventEmitter {
464
525
  };
465
526
  server.on("upgrade", handleUpgrade);
466
527
  this._disposer = () => {
528
+ clearTimeout(detachedEditorTimer);
467
529
  server.removeListener("upgrade", handleUpgrade);
468
530
  wss.close();
469
531
  };
@@ -487,6 +549,9 @@ class SocketManager extends TracedEventEmitter {
487
549
  getLogger().warn(`[socket-manager] post-auth git activation failed: ${err instanceof Error ? err.message : String(err)}`);
488
550
  });
489
551
  };
552
+ const editorConnectionSequence = isEditor
553
+ ? ++nextEditorConnectionSequence
554
+ : 0;
490
555
  const authMiddleware = async (params, ctx, _peer, next) => {
491
556
  const result = await checkAuthorization(ctx.peerAuthorization);
492
557
  if (!result.success) {
@@ -535,13 +600,66 @@ class SocketManager extends TracedEventEmitter {
535
600
  // user B reconnecting to an AiService running user A's task
536
601
  // would receive A's `taskId` and could then cancel it via
537
602
  // the UI path. See peer-push.ts:resyncActiveTaskStatusesToPeer.
538
- if (aiService && isEditor) {
603
+ // The authorization check above is asynchronous, so this connection
604
+ // can have closed while it was running, and its close handler has
605
+ // already run by then. Registering it here would leave a closed
606
+ // socket owning the pod, with the live connection's primes ignored
607
+ // as superseded.
608
+ const isOpenEditor = isEditor && this.editorSockets.has(socket);
609
+ if (isEditor && !isOpenEditor) {
610
+ getLogger().info(`[socket-manager] Ignored an authorization proved by a closed editor connection ${peerId}`, { "editor.connection.sequence": editorConnectionSequence });
611
+ }
612
+ if (aiService && isOpenEditor) {
613
+ const callerUserId = extractCallerUserId(ctx.peerAuthorization);
539
614
  try {
540
- const callerUserId = extractCallerUserId(ctx.peerAuthorization);
541
- aiService.notifyAuthenticatedRpc(peerId, callerUserId);
615
+ repairEditorBinding();
616
+ authenticatedEditorSockets.set(socket, {
617
+ liveness: connectionLiveness,
618
+ peerId,
619
+ sequence: editorConnectionSequence,
620
+ });
621
+ const activeConnection = activeEditorSocket
622
+ ? authenticatedEditorSockets.get(activeEditorSocket)
623
+ : undefined;
624
+ // While the pod waits for a peer's reconnect, nobody else's
625
+ // authorization takes it: the pod is unbound but not unowned,
626
+ // and a collaborator's next RPC would otherwise walk off with
627
+ // the conversation before that reconnect has had its chance.
628
+ const waitingForAnotherPeer = detachedEditorPeerId !== undefined &&
629
+ detachedEditorPeerId !== peerId;
630
+ if (!waitingForAnotherPeer &&
631
+ (!activeConnection ||
632
+ editorConnectionSequence > activeConnection.sequence)) {
633
+ aiService.handleUserConnected(socket, peerId, connectionLiveness);
634
+ activeEditorSocket = socket;
635
+ editorBindingNeedsRepair = false;
636
+ detachedEditorPeerId = undefined;
637
+ clearTimeout(detachedEditorTimer);
638
+ getLogger().debug("[socket-manager] Bound editor connection", {
639
+ "editor.connection.sequence": editorConnectionSequence,
640
+ "peer.id": peerId,
641
+ });
642
+ }
542
643
  }
543
644
  catch (err) {
544
- getLogger().warn("[socket-manager] notifyAuthenticatedRpc threw; continuing", getErrorMeta(err));
645
+ if (activeEditorSocket !== socket) {
646
+ authenticatedEditorSockets.delete(socket);
647
+ }
648
+ editorBindingNeedsRepair = true;
649
+ getLogger().error(`[socket-manager] Authenticated editor binding failed peer.id=${peerId} editor.connection.sequence=${editorConnectionSequence}`, getErrorMeta(err));
650
+ throw err;
651
+ }
652
+ if (activeEditorSocket === socket) {
653
+ try {
654
+ aiService.notifyAuthenticatedRpc(peerId, callerUserId);
655
+ }
656
+ catch (error) {
657
+ getLogger().warn("[socket-manager] Authenticated editor resync failed", {
658
+ ...getErrorMeta(error),
659
+ "editor.connection.sequence": editorConnectionSequence,
660
+ "peer.id": peerId,
661
+ });
662
+ }
545
663
  }
546
664
  }
547
665
  // Everything a gateway peer is trusted with hangs off this proof.
@@ -580,7 +698,6 @@ class SocketManager extends TracedEventEmitter {
580
698
  // Renames
581
699
  renameElement: [fileSyncManager.handleRenameElement],
582
700
  renameApi: [fileSyncManager.handleRenameApi],
583
- // Update APIs
584
701
  apiUpdate: [fileSyncManager.handleUpdateApi],
585
702
  apiDelete: [fileSyncManager.handleDeleteApi],
586
703
  // Ensure files are synced
@@ -846,6 +963,11 @@ class SocketManager extends TracedEventEmitter {
846
963
  await aiService?.handleAiSummarizeApiUsage(request);
847
964
  },
848
965
  ],
966
+ aiSummarizeDestructiveMigration: [
967
+ async (request) => {
968
+ await aiService?.handleAiSummarizeDestructiveMigration(request);
969
+ },
970
+ ],
849
971
  aiSummarizeError: [
850
972
  async (request) => {
851
973
  await aiService?.handleAiSummarizeError(request);
@@ -936,6 +1058,15 @@ class SocketManager extends TracedEventEmitter {
936
1058
  ],
937
1059
  aiRestoreToCommit: [
938
1060
  async (request, _context) => {
1061
+ if (!isEditor) {
1062
+ throw new Error("This RPC requires an editor connection");
1063
+ }
1064
+ if (!activeEditorSocket) {
1065
+ throw new Error("The editor connection is still reconnecting");
1066
+ }
1067
+ if (activeEditorSocket !== socket) {
1068
+ throw new Error("Only the active editor connection can restore a commit");
1069
+ }
939
1070
  // Update clark.context.jwt from socket if missing (for restore operations)
940
1071
  if (aiService && _context.peerAuthorization) {
941
1072
  const jwt = _context.peerAuthorization.replace("Bearer ", "");
@@ -1003,6 +1134,27 @@ class SocketManager extends TracedEventEmitter {
1003
1134
  if (!aiService) {
1004
1135
  throw new Error("Cannot prime the Clark inference JWT: the AI service is not running");
1005
1136
  }
1137
+ if (!isEditor) {
1138
+ throw new Error("This RPC requires an editor connection");
1139
+ }
1140
+ if (!activeEditorSocket) {
1141
+ throw new Error("The editor connection is still reconnecting");
1142
+ }
1143
+ // A prime can still be waiting in a closed socket's
1144
+ // authorization middleware when a newer connection has
1145
+ // already taken over the pod, and closing a socket does
1146
+ // not retract a request it already sent. Reported as
1147
+ // taken: the pod holds the newer connection's token, so
1148
+ // the browser has no failure to retry.
1149
+ if (activeEditorSocket !== socket) {
1150
+ getLogger().info(`[socket-manager] Ignored a Clark inference JWT prime from superseded editor connection ${peerId}`, {
1151
+ "editor.connection.sequence": editorConnectionSequence,
1152
+ "editor.active_connection.sequence": activeEditorSocket
1153
+ ? authenticatedEditorSockets.get(activeEditorSocket)?.sequence
1154
+ : undefined,
1155
+ });
1156
+ return;
1157
+ }
1006
1158
  if (!aiService.updateClarkJwt(request.jwt)) {
1007
1159
  throw new Error("The dev server rejected the Clark inference JWT");
1008
1160
  }
@@ -1449,16 +1601,36 @@ class SocketManager extends TracedEventEmitter {
1449
1601
  remote: "origin",
1450
1602
  ...getErrorMeta(fetchErr),
1451
1603
  });
1604
+ if (isMissingGitRevisionError(fetchErr)) {
1605
+ return [];
1606
+ }
1452
1607
  }
1453
1608
  }
1454
- const raw = await readyGitService.raw([
1455
- "log",
1456
- logRef,
1457
- `--format=${GIT_LOG_FORMAT}`,
1458
- `-n`,
1459
- String(limit),
1460
- ]);
1461
- return parseGitLog(raw);
1609
+ try {
1610
+ const raw = await readyGitService.raw([
1611
+ "log",
1612
+ logRef,
1613
+ `--format=${GIT_LOG_FORMAT}`,
1614
+ `-n`,
1615
+ String(limit),
1616
+ ]);
1617
+ return parseGitLog(raw);
1618
+ }
1619
+ catch (logErr) {
1620
+ if (isMissingGitRevisionError(logErr)) {
1621
+ getLogger().warn("[git] gitBranchLog skipped missing ref", {
1622
+ gitCategory: "branch",
1623
+ gitOperation: "branch-log",
1624
+ gitOutcome: "fallback",
1625
+ gitErrorKind: "missing_revision",
1626
+ branch,
1627
+ logRef,
1628
+ ...getErrorMeta(logErr),
1629
+ });
1630
+ return [];
1631
+ }
1632
+ throw logErr;
1633
+ }
1462
1634
  },
1463
1635
  ],
1464
1636
  gitPrepareMainCommit: [
@@ -1618,7 +1790,10 @@ class SocketManager extends TracedEventEmitter {
1618
1790
  // new arrival and activates git again.
1619
1791
  this.gitActivatedPeerIds.delete(peerId);
1620
1792
  }
1621
- getLogger().info(`Socket from ${kind} closed code: ${code} reason: ${reason}`);
1793
+ getLogger().info(`Socket from ${kind} closed code: ${code} reason: ${reason}`, {
1794
+ "editor.connection.sequence": editorConnectionSequence,
1795
+ "peer.id": peerId,
1796
+ });
1622
1797
  if (kind === "gateway") {
1623
1798
  this.gatewaySockets.delete(socket);
1624
1799
  lockService?.markGatewayDetached(peerId);
@@ -1631,7 +1806,93 @@ class SocketManager extends TracedEventEmitter {
1631
1806
  }
1632
1807
  else if (isEditor) {
1633
1808
  this.editorSockets.delete(socket);
1809
+ const wasActiveEditor = activeEditorSocket === socket;
1810
+ // Keep the closing owner's binding available for repair below.
1811
+ // Otherwise a partial replacement makes its disconnect look stale.
1812
+ if (!wasActiveEditor)
1813
+ authenticatedEditorSockets.delete(socket);
1634
1814
  const hasOtherEditorSocket = Array.from(peerSockets ?? []).some((peerSocket) => this.editorSockets.has(peerSocket));
1815
+ // The user really left. Tear the conversation down and hand the
1816
+ // pod to the newest other editor that proved its authorization.
1817
+ const releaseEditorBinding = (liveness) => {
1818
+ clearTimeout(detachedEditorTimer);
1819
+ detachedEditorPeerId = undefined;
1820
+ const replacement = newestAuthenticatedEditor();
1821
+ activeEditorSocket = undefined;
1822
+ try {
1823
+ aiService?.handleUserDisconnected(peerId, replacement, liveness);
1824
+ activeEditorSocket = replacement?.peer;
1825
+ getLogger().debug("[socket-manager] Released editor connection", {
1826
+ "editor.connection.sequence": editorConnectionSequence,
1827
+ "editor.active_connection.sequence": replacement?.sequence,
1828
+ "peer.id": peerId,
1829
+ });
1830
+ // Task pushes wait for the survivor's next authenticated RPC.
1831
+ }
1832
+ catch (error) {
1833
+ resetFailedEditorTransition();
1834
+ getLogger().error(`[socket-manager] Failed to release editor binding peer.id=${peerId} editor.connection.sequence=${editorConnectionSequence}`, getErrorMeta(error));
1835
+ }
1836
+ };
1837
+ try {
1838
+ if (wasActiveEditor) {
1839
+ repairEditorBinding();
1840
+ authenticatedEditorSockets.delete(socket);
1841
+ const replacement = newestAuthenticatedEditor();
1842
+ if (replacement?.peerId === peerId) {
1843
+ aiService?.handleUserConnected(replacement.peer, peerId, replacement.liveness);
1844
+ activeEditorSocket = replacement.peer;
1845
+ getLogger().debug("[socket-manager] Rebound surviving editor connection", {
1846
+ "editor.connection.sequence": editorConnectionSequence,
1847
+ "editor.active_connection.sequence": replacement.sequence,
1848
+ "peer.id": peerId,
1849
+ });
1850
+ }
1851
+ else if (hasOtherEditorSocket ||
1852
+ connectionLiveness?.reconnectRequested) {
1853
+ // Wait for a pending same-peer authorization or a locally
1854
+ // requested reconnect that has not opened yet. Neither is a
1855
+ // binding candidate, but clearing context here would destroy
1856
+ // the conversation it is about to resume. Drop only the
1857
+ // transport and reserve ownership until bind or timeout.
1858
+ // A bare network drop without either signal deliberately
1859
+ // retains the ordinary last-socket teardown policy.
1860
+ activeEditorSocket = undefined;
1861
+ detachedEditorPeerId = peerId;
1862
+ aiService?.detachPeerTransport(peerId);
1863
+ getLogger().debug("[socket-manager] Waiting for editor reconnect authorization", {
1864
+ "editor.connection.sequence": editorConnectionSequence,
1865
+ "peer.id": peerId,
1866
+ });
1867
+ clearTimeout(detachedEditorTimer);
1868
+ detachedEditorTimer = setTimeout(() => {
1869
+ getLogger().warn("[socket-manager] Editor reconnect authorization timed out", {
1870
+ "editor.connection.sequence": editorConnectionSequence,
1871
+ "peer.id": peerId,
1872
+ });
1873
+ releaseEditorBinding(undefined);
1874
+ }, EDITOR_RECONNECT_AUTH_TIMEOUT_MS);
1875
+ detachedEditorTimer.unref();
1876
+ }
1877
+ else {
1878
+ releaseEditorBinding(connectionLiveness);
1879
+ }
1880
+ }
1881
+ else if (detachedEditorPeerId === peerId &&
1882
+ !hasOtherEditorSocket) {
1883
+ // The reconnect the pod was waiting for gave up before it proved
1884
+ // its authorization. This socket was never bound, so there is no
1885
+ // connection generation for the AI service to check the teardown
1886
+ // against.
1887
+ detachedEditorPeerId = undefined;
1888
+ releaseEditorBinding(undefined);
1889
+ }
1890
+ }
1891
+ catch (error) {
1892
+ authenticatedEditorSockets.delete(socket);
1893
+ resetFailedEditorTransition();
1894
+ getLogger().error(`[socket-manager] Editor disconnect transition failed peer.id=${peerId} editor.connection.sequence=${editorConnectionSequence}`, getErrorMeta(error));
1895
+ }
1635
1896
  if (!hasOtherEditorSocket) {
1636
1897
  // Keyed by peer, so whichever of the peer's sockets is last out
1637
1898
  // takes the presence down — including one that never authenticated