@superblocksteam/vite-plugin-file-sync 2.0.72-next.12 → 2.0.72-next.14

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 (284) hide show
  1. package/dist/ai-service/agent/prompts/build-base-system-prompt.d.ts +2 -1
  2. package/dist/ai-service/agent/prompts/build-base-system-prompt.d.ts.map +1 -1
  3. package/dist/ai-service/agent/prompts/build-base-system-prompt.js +18 -2
  4. package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
  5. package/dist/ai-service/agent/subagents/testing/index.d.ts +3 -0
  6. package/dist/ai-service/agent/subagents/testing/index.d.ts.map +1 -0
  7. package/dist/ai-service/agent/subagents/testing/index.js +2 -0
  8. package/dist/ai-service/agent/subagents/testing/index.js.map +1 -0
  9. package/dist/ai-service/agent/subagents/testing/prompt-builder.d.ts +10 -0
  10. package/dist/ai-service/agent/subagents/testing/prompt-builder.d.ts.map +1 -0
  11. package/dist/ai-service/agent/subagents/testing/prompt-builder.js +162 -0
  12. package/dist/ai-service/agent/subagents/testing/prompt-builder.js.map +1 -0
  13. package/dist/ai-service/agent/subagents/testing/types.d.ts +67 -0
  14. package/dist/ai-service/agent/subagents/testing/types.d.ts.map +1 -0
  15. package/dist/ai-service/agent/subagents/testing/types.js +2 -0
  16. package/dist/ai-service/agent/subagents/testing/types.js.map +1 -0
  17. package/dist/ai-service/agent/subagents/types.d.ts +9 -8
  18. package/dist/ai-service/agent/subagents/types.d.ts.map +1 -1
  19. package/dist/ai-service/agent/subagents/types.js +9 -9
  20. package/dist/ai-service/agent/subagents/types.js.map +1 -1
  21. package/dist/ai-service/agent/tool-message-utils.d.ts +7 -2
  22. package/dist/ai-service/agent/tool-message-utils.d.ts.map +1 -1
  23. package/dist/ai-service/agent/tool-message-utils.js +21 -2
  24. package/dist/ai-service/agent/tool-message-utils.js.map +1 -1
  25. package/dist/ai-service/agent/tools/apis/api-source.d.ts +1 -1
  26. package/dist/ai-service/agent/tools/apis/api-source.d.ts.map +1 -1
  27. package/dist/ai-service/agent/tools/apis/api-source.js +37 -9
  28. package/dist/ai-service/agent/tools/apis/api-source.js.map +1 -1
  29. package/dist/ai-service/agent/tools/apis/test-api.js +1 -1
  30. package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -1
  31. package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts +1 -0
  32. package/dist/ai-service/agent/tools/build-capture-screenshot.d.ts.map +1 -1
  33. package/dist/ai-service/agent/tools/build-capture-screenshot.js +4 -2
  34. package/dist/ai-service/agent/tools/build-capture-screenshot.js.map +1 -1
  35. package/dist/ai-service/agent/tools/build-delete-file.d.ts +1 -1
  36. package/dist/ai-service/agent/tools/build-manage-checklist.d.ts +1 -1
  37. package/dist/ai-service/agent/tools/{build-read-files.d.ts → build-read-file.d.ts} +10 -6
  38. package/dist/ai-service/agent/tools/build-read-file.d.ts.map +1 -0
  39. package/dist/ai-service/agent/tools/build-read-file.js +139 -0
  40. package/dist/ai-service/agent/tools/build-read-file.js.map +1 -0
  41. package/dist/ai-service/agent/tools/build-reload-file.d.ts +9 -3
  42. package/dist/ai-service/agent/tools/build-reload-file.d.ts.map +1 -1
  43. package/dist/ai-service/agent/tools/build-reload-file.js +20 -9
  44. package/dist/ai-service/agent/tools/build-reload-file.js.map +1 -1
  45. package/dist/ai-service/agent/tools/get-console-logs.js +1 -1
  46. package/dist/ai-service/agent/tools/get-console-logs.js.map +1 -1
  47. package/dist/ai-service/agent/tools/get-runtime-errors.js +1 -1
  48. package/dist/ai-service/agent/tools/get-runtime-errors.js.map +1 -1
  49. package/dist/ai-service/agent/tools/index.d.ts +5 -1
  50. package/dist/ai-service/agent/tools/index.d.ts.map +1 -1
  51. package/dist/ai-service/agent/tools/index.js +5 -1
  52. package/dist/ai-service/agent/tools/index.js.map +1 -1
  53. package/dist/ai-service/agent/tools/integrations/execute-request.d.ts +1 -1
  54. package/dist/ai-service/agent/tools/integrations/internal.d.ts.map +1 -1
  55. package/dist/ai-service/agent/tools/integrations/internal.js +8 -1
  56. package/dist/ai-service/agent/tools/integrations/internal.js.map +1 -1
  57. package/dist/ai-service/agent/tools.d.ts.map +1 -1
  58. package/dist/ai-service/agent/tools.js +124 -31
  59. package/dist/ai-service/agent/tools.js.map +1 -1
  60. package/dist/ai-service/agent/tools2/access-control.d.ts +23 -1
  61. package/dist/ai-service/agent/tools2/access-control.d.ts.map +1 -1
  62. package/dist/ai-service/agent/tools2/access-control.js +67 -1
  63. package/dist/ai-service/agent/tools2/access-control.js.map +1 -1
  64. package/dist/ai-service/agent/tools2/entity-permissions.d.ts +26 -0
  65. package/dist/ai-service/agent/tools2/entity-permissions.d.ts.map +1 -1
  66. package/dist/ai-service/agent/tools2/entity-permissions.js +15 -0
  67. package/dist/ai-service/agent/tools2/entity-permissions.js.map +1 -1
  68. package/dist/ai-service/agent/tools2/example.d.ts.map +1 -1
  69. package/dist/ai-service/agent/tools2/example.js +2 -4
  70. package/dist/ai-service/agent/tools2/example.js.map +1 -1
  71. package/dist/ai-service/agent/tools2/index.d.ts +1 -1
  72. package/dist/ai-service/agent/tools2/index.d.ts.map +1 -1
  73. package/dist/ai-service/agent/tools2/index.js +1 -1
  74. package/dist/ai-service/agent/tools2/index.js.map +1 -1
  75. package/dist/ai-service/agent/tools2/registry.d.ts.map +1 -1
  76. package/dist/ai-service/agent/tools2/registry.js +37 -23
  77. package/dist/ai-service/agent/tools2/registry.js.map +1 -1
  78. package/dist/ai-service/agent/tools2/tools/ask-multi-choice.d.ts +0 -1
  79. package/dist/ai-service/agent/tools2/tools/ask-multi-choice.d.ts.map +1 -1
  80. package/dist/ai-service/agent/tools2/tools/ask-multi-choice.js +1 -6
  81. package/dist/ai-service/agent/tools2/tools/ask-multi-choice.js.map +1 -1
  82. package/dist/ai-service/agent/tools2/tools/end-test-run.d.ts +31 -0
  83. package/dist/ai-service/agent/tools2/tools/end-test-run.d.ts.map +1 -0
  84. package/dist/ai-service/agent/tools2/tools/end-test-run.js +107 -0
  85. package/dist/ai-service/agent/tools2/tools/end-test-run.js.map +1 -0
  86. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts +2 -1
  87. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts.map +1 -1
  88. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js +63 -76
  89. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js.map +1 -1
  90. package/dist/ai-service/agent/tools2/tools/list-attachments.d.ts +15 -0
  91. package/dist/ai-service/agent/tools2/tools/list-attachments.d.ts.map +1 -0
  92. package/dist/ai-service/agent/tools2/tools/list-attachments.js +47 -0
  93. package/dist/ai-service/agent/tools2/tools/list-attachments.js.map +1 -0
  94. package/dist/ai-service/agent/tools2/tools/start-test-run.d.ts +24 -0
  95. package/dist/ai-service/agent/tools2/tools/start-test-run.d.ts.map +1 -0
  96. package/dist/ai-service/agent/tools2/tools/start-test-run.js +340 -0
  97. package/dist/ai-service/agent/tools2/tools/start-test-run.js.map +1 -0
  98. package/dist/ai-service/agent/tools2/tools/update-test-case-status.d.ts +29 -0
  99. package/dist/ai-service/agent/tools2/tools/update-test-case-status.d.ts.map +1 -0
  100. package/dist/ai-service/agent/tools2/tools/update-test-case-status.js +106 -0
  101. package/dist/ai-service/agent/tools2/tools/update-test-case-status.js.map +1 -0
  102. package/dist/ai-service/agent/tools2/types.d.ts +6 -24
  103. package/dist/ai-service/agent/tools2/types.d.ts.map +1 -1
  104. package/dist/ai-service/agent/tools2/types.js +4 -15
  105. package/dist/ai-service/agent/tools2/types.js.map +1 -1
  106. package/dist/ai-service/agent/utils.d.ts +10 -0
  107. package/dist/ai-service/agent/utils.d.ts.map +1 -1
  108. package/dist/ai-service/agent/utils.js +160 -2
  109. package/dist/ai-service/agent/utils.js.map +1 -1
  110. package/dist/ai-service/attachments/index.d.ts +2 -0
  111. package/dist/ai-service/attachments/index.d.ts.map +1 -0
  112. package/dist/ai-service/attachments/index.js +2 -0
  113. package/dist/ai-service/attachments/index.js.map +1 -0
  114. package/dist/ai-service/attachments/store.d.ts +65 -0
  115. package/dist/ai-service/attachments/store.d.ts.map +1 -0
  116. package/dist/ai-service/attachments/store.js +158 -0
  117. package/dist/ai-service/attachments/store.js.map +1 -0
  118. package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
  119. package/dist/ai-service/chat/chat-session-store.js +133 -1
  120. package/dist/ai-service/chat/chat-session-store.js.map +1 -1
  121. package/dist/ai-service/context-download.d.ts +24 -0
  122. package/dist/ai-service/context-download.d.ts.map +1 -0
  123. package/dist/ai-service/context-download.js +127 -0
  124. package/dist/ai-service/context-download.js.map +1 -0
  125. package/dist/ai-service/context-upload.d.ts +17 -0
  126. package/dist/ai-service/context-upload.d.ts.map +1 -0
  127. package/dist/ai-service/context-upload.js +100 -0
  128. package/dist/ai-service/context-upload.js.map +1 -0
  129. package/dist/ai-service/features.d.ts +4 -0
  130. package/dist/ai-service/features.d.ts.map +1 -1
  131. package/dist/ai-service/features.js +4 -0
  132. package/dist/ai-service/features.js.map +1 -1
  133. package/dist/ai-service/index.d.ts +27 -3
  134. package/dist/ai-service/index.d.ts.map +1 -1
  135. package/dist/ai-service/index.js +259 -20
  136. package/dist/ai-service/index.js.map +1 -1
  137. package/dist/ai-service/judge/integration/mcp-client.d.ts +3 -6
  138. package/dist/ai-service/judge/integration/mcp-client.d.ts.map +1 -1
  139. package/dist/ai-service/judge/integration/mcp-client.js.map +1 -1
  140. package/dist/ai-service/judge/tools/playwright-action.d.ts +1 -1
  141. package/dist/ai-service/judge/tools/submit-feedback.d.ts +1 -1
  142. package/dist/ai-service/llm/client.d.ts +6 -0
  143. package/dist/ai-service/llm/client.d.ts.map +1 -1
  144. package/dist/ai-service/llm/client.js +9 -0
  145. package/dist/ai-service/llm/client.js.map +1 -1
  146. package/dist/ai-service/llm/context/constants.d.ts +8 -0
  147. package/dist/ai-service/llm/context/constants.d.ts.map +1 -1
  148. package/dist/ai-service/llm/context/constants.js +8 -0
  149. package/dist/ai-service/llm/context/constants.js.map +1 -1
  150. package/dist/ai-service/llm/context/context.d.ts +4 -0
  151. package/dist/ai-service/llm/context/context.d.ts.map +1 -1
  152. package/dist/ai-service/llm/context/context.js +22 -9
  153. package/dist/ai-service/llm/context/context.js.map +1 -1
  154. package/dist/ai-service/llm/context/manager.d.ts +6 -1
  155. package/dist/ai-service/llm/context/manager.d.ts.map +1 -1
  156. package/dist/ai-service/llm/context/manager.js +9 -1
  157. package/dist/ai-service/llm/context/manager.js.map +1 -1
  158. package/dist/ai-service/llm/context/serialization.d.ts +3 -0
  159. package/dist/ai-service/llm/context/serialization.d.ts.map +1 -1
  160. package/dist/ai-service/llm/context/utils/message-utils.d.ts +10 -0
  161. package/dist/ai-service/llm/context/utils/message-utils.d.ts.map +1 -1
  162. package/dist/ai-service/llm/context/utils/message-utils.js +92 -0
  163. package/dist/ai-service/llm/context/utils/message-utils.js.map +1 -1
  164. package/dist/ai-service/llm/interaction/provider.d.ts +1 -0
  165. package/dist/ai-service/llm/interaction/provider.d.ts.map +1 -1
  166. package/dist/ai-service/llm/stream/config.d.ts +2 -0
  167. package/dist/ai-service/llm/stream/config.d.ts.map +1 -1
  168. package/dist/ai-service/llm/stream/config.js +1 -0
  169. package/dist/ai-service/llm/stream/config.js.map +1 -1
  170. package/dist/ai-service/llm/stream/event-bus.d.ts +5 -0
  171. package/dist/ai-service/llm/stream/event-bus.d.ts.map +1 -1
  172. package/dist/ai-service/llm/stream/event-bus.js.map +1 -1
  173. package/dist/ai-service/llm/stream/observers/llmobs.d.ts +4 -1
  174. package/dist/ai-service/llm/stream/observers/llmobs.d.ts.map +1 -1
  175. package/dist/ai-service/llm/stream/observers/llmobs.js +194 -10
  176. package/dist/ai-service/llm/stream/observers/llmobs.js.map +1 -1
  177. package/dist/ai-service/llm/stream/observers/logging.d.ts +1 -0
  178. package/dist/ai-service/llm/stream/observers/logging.d.ts.map +1 -1
  179. package/dist/ai-service/llm/stream/observers/logging.js +92 -20
  180. package/dist/ai-service/llm/stream/observers/logging.js.map +1 -1
  181. package/dist/ai-service/llm/stream/orchestrator.d.ts +7 -1
  182. package/dist/ai-service/llm/stream/orchestrator.d.ts.map +1 -1
  183. package/dist/ai-service/llm/stream/orchestrator.js +23 -3
  184. package/dist/ai-service/llm/stream/orchestrator.js.map +1 -1
  185. package/dist/ai-service/llm/stream/retry-engine.d.ts +1 -0
  186. package/dist/ai-service/llm/stream/retry-engine.d.ts.map +1 -1
  187. package/dist/ai-service/llm/stream/retry-engine.js +20 -1
  188. package/dist/ai-service/llm/stream/retry-engine.js.map +1 -1
  189. package/dist/ai-service/llm/stream/session.d.ts +14 -2
  190. package/dist/ai-service/llm/stream/session.d.ts.map +1 -1
  191. package/dist/ai-service/llm/stream/session.js +15 -28
  192. package/dist/ai-service/llm/stream/session.js.map +1 -1
  193. package/dist/ai-service/llmobs/otel-exporter.d.ts +58 -0
  194. package/dist/ai-service/llmobs/otel-exporter.d.ts.map +1 -0
  195. package/dist/ai-service/llmobs/otel-exporter.js +182 -0
  196. package/dist/ai-service/llmobs/otel-exporter.js.map +1 -0
  197. package/dist/ai-service/llmobs/tracer.d.ts +9 -5
  198. package/dist/ai-service/llmobs/tracer.d.ts.map +1 -1
  199. package/dist/ai-service/llmobs/tracer.js +46 -41
  200. package/dist/ai-service/llmobs/tracer.js.map +1 -1
  201. package/dist/ai-service/llmobs/types.d.ts +1 -0
  202. package/dist/ai-service/llmobs/types.d.ts.map +1 -1
  203. package/dist/ai-service/mcp/adapter/mcp-tool-adapter.d.ts +1 -1
  204. package/dist/ai-service/mcp/adapter/mcp-tool-adapter.d.ts.map +1 -1
  205. package/dist/ai-service/mcp/adapter/mcp-tool-adapter.js +5 -2
  206. package/dist/ai-service/mcp/adapter/mcp-tool-adapter.js.map +1 -1
  207. package/dist/ai-service/mcp/embedded-playwright-mcp-server.d.ts +33 -1
  208. package/dist/ai-service/mcp/embedded-playwright-mcp-server.d.ts.map +1 -1
  209. package/dist/ai-service/mcp/embedded-playwright-mcp-server.js +949 -91
  210. package/dist/ai-service/mcp/embedded-playwright-mcp-server.js.map +1 -1
  211. package/dist/ai-service/mcp/playwright-server.d.ts +39 -0
  212. package/dist/ai-service/mcp/playwright-server.d.ts.map +1 -1
  213. package/dist/ai-service/mcp/playwright-server.js +56 -0
  214. package/dist/ai-service/mcp/playwright-server.js.map +1 -1
  215. package/dist/ai-service/mcp/types.d.ts +4 -0
  216. package/dist/ai-service/mcp/types.d.ts.map +1 -1
  217. package/dist/ai-service/prompts/explain-code.d.ts +2 -2
  218. package/dist/ai-service/prompts/explain-code.d.ts.map +1 -1
  219. package/dist/ai-service/prompts/explain-code.js +2 -2
  220. package/dist/ai-service/prompts/explain-code.js.map +1 -1
  221. package/dist/ai-service/state-machine/clark-fsm.d.ts +20 -1
  222. package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
  223. package/dist/ai-service/state-machine/clark-fsm.js +16 -0
  224. package/dist/ai-service/state-machine/clark-fsm.js.map +1 -1
  225. package/dist/ai-service/state-machine/fsm.d.ts.map +1 -1
  226. package/dist/ai-service/state-machine/fsm.js +1 -0
  227. package/dist/ai-service/state-machine/fsm.js.map +1 -1
  228. package/dist/ai-service/state-machine/handlers/agent-planning.d.ts.map +1 -1
  229. package/dist/ai-service/state-machine/handlers/agent-planning.js +71 -7
  230. package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
  231. package/dist/ai-service/state-machine/handlers/llm-generating.d.ts.map +1 -1
  232. package/dist/ai-service/state-machine/handlers/llm-generating.js +112 -33
  233. package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
  234. package/dist/ai-service/state-machine/helpers/peer.d.ts +1 -1
  235. package/dist/ai-service/state-machine/helpers/peer.d.ts.map +1 -1
  236. package/dist/ai-service/state-machine/helpers/peer.js +21 -4
  237. package/dist/ai-service/state-machine/helpers/peer.js.map +1 -1
  238. package/dist/ai-service/state-machine/mocks.d.ts.map +1 -1
  239. package/dist/ai-service/state-machine/mocks.js +2 -0
  240. package/dist/ai-service/state-machine/mocks.js.map +1 -1
  241. package/dist/ai-service/state-machine/traced-fsm.d.ts +2 -0
  242. package/dist/ai-service/state-machine/traced-fsm.d.ts.map +1 -1
  243. package/dist/ai-service/state-machine/traced-fsm.js +18 -0
  244. package/dist/ai-service/state-machine/traced-fsm.js.map +1 -1
  245. package/dist/ai-service/util/safe-parse.d.ts +2 -0
  246. package/dist/ai-service/util/safe-parse.d.ts.map +1 -0
  247. package/dist/ai-service/util/safe-parse.js +9 -0
  248. package/dist/ai-service/util/safe-parse.js.map +1 -0
  249. package/dist/ai-service/util/safe-stringify.d.ts.map +1 -1
  250. package/dist/ai-service/util/safe-stringify.js +7 -0
  251. package/dist/ai-service/util/safe-stringify.js.map +1 -1
  252. package/dist/ai-service/util/scoped-token-utils.d.ts +15 -0
  253. package/dist/ai-service/util/scoped-token-utils.d.ts.map +1 -0
  254. package/dist/ai-service/util/scoped-token-utils.js +131 -0
  255. package/dist/ai-service/util/scoped-token-utils.js.map +1 -0
  256. package/dist/ai-service/util/stop-condition.d.ts +1 -0
  257. package/dist/ai-service/util/stop-condition.d.ts.map +1 -1
  258. package/dist/ai-service/util/stop-condition.js +5 -0
  259. package/dist/ai-service/util/stop-condition.js.map +1 -1
  260. package/dist/ai-service/util/strip-content.d.ts +2 -0
  261. package/dist/ai-service/util/strip-content.d.ts.map +1 -0
  262. package/dist/ai-service/util/strip-content.js +31 -0
  263. package/dist/ai-service/util/strip-content.js.map +1 -0
  264. package/dist/ai-service/util/tool-signature.d.ts +13 -0
  265. package/dist/ai-service/util/tool-signature.d.ts.map +1 -0
  266. package/dist/ai-service/util/tool-signature.js +38 -0
  267. package/dist/ai-service/util/tool-signature.js.map +1 -0
  268. package/dist/file-sync-vite-plugin.d.ts.map +1 -1
  269. package/dist/file-sync-vite-plugin.js +4 -1
  270. package/dist/file-sync-vite-plugin.js.map +1 -1
  271. package/dist/injected-index.js +2 -2
  272. package/dist/injected-index.js.map +1 -1
  273. package/dist/parsing/jsx.d.ts.map +1 -1
  274. package/dist/parsing/jsx.js +0 -2
  275. package/dist/parsing/jsx.js.map +1 -1
  276. package/dist/server-rpc/index.js +1 -1
  277. package/dist/server-rpc/index.js.map +1 -1
  278. package/dist/socket-manager.d.ts.map +1 -1
  279. package/dist/socket-manager.js +61 -4
  280. package/dist/socket-manager.js.map +1 -1
  281. package/package.json +9 -9
  282. package/dist/ai-service/agent/tools/build-read-files.d.ts.map +0 -1
  283. package/dist/ai-service/agent/tools/build-read-files.js +0 -67
  284. package/dist/ai-service/agent/tools/build-read-files.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"features.js","sourceRoot":"","sources":["../../src/ai-service/features.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAsBpB;;;;;;;;;;;;GAYG;AACH,MAAM,gBAAgB,GAAG;IACvB,2BAA2B,EAAE;QAC3B,GAAG,EAAE,2BAA2B;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;KACnB;IACD,gCAAgC,EAAE;QAChC,GAAG,EAAE,0BAA0B;QAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;KACnB;IACD,oBAAoB,EAAE;QACpB,GAAG,EAAE,yBAAyB;QAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B;IACD,kBAAkB,EAAE;QAClB,GAAG,EAAE,0BAA0B;QAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B;IACD,uBAAuB,EAAE;QACvB,GAAG,EAAE,+BAA+B;QACpC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC7B;IACD,sBAAsB,EAAE;QACtB,GAAG,EAAE,iCAAiC;QACtC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;KACpB;CAC6C,CAAC;AAUjD,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC;;OAEG;IACH,MAAM,CAAC,QAAiC,EAAE;QACxC,OAAO,IAAI,KAAK,CAAC,EAA2B,EAAE;YAC5C,GAAG,CAAC,OAAO,EAAE,IAAqB;gBAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,gBAAgB,CAAC,EAAE,CAAC;oBAC5D,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAED,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAqC,CAAC,CAAC;gBACpE,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAE3B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACtB,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACzC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YAClD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"features.js","sourceRoot":"","sources":["../../src/ai-service/features.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAsBpB;;;;;;;;;;;;GAYG;AACH,MAAM,gBAAgB,GAAG;IACvB,2BAA2B,EAAE;QAC3B,GAAG,EAAE,2BAA2B;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;KACnB;IACD,gCAAgC,EAAE;QAChC,GAAG,EAAE,0BAA0B;QAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;KACnB;IACD,oBAAoB,EAAE;QACpB,GAAG,EAAE,yBAAyB;QAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B;IACD,kBAAkB,EAAE;QAClB,GAAG,EAAE,0BAA0B;QAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B;IACD,uBAAuB,EAAE;QACvB,GAAG,EAAE,+BAA+B;QACpC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC7B;IACD,sBAAsB,EAAE;QACtB,GAAG,EAAE,iCAAiC;QACtC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;KACpB;IACD,oBAAoB,EAAE;QACpB,GAAG,EAAE,2BAA2B;QAChC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC9B;CAC6C,CAAC;AAUjD,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC;;OAEG;IACH,MAAM,CAAC,QAAiC,EAAE;QACxC,OAAO,IAAI,KAAK,CAAC,EAA2B,EAAE;YAC5C,GAAG,CAAC,OAAO,EAAE,IAAqB;gBAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,gBAAgB,CAAC,EAAE,CAAC;oBAC5D,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAED,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAqC,CAAC,CAAC;gBACpE,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAE3B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;oBACtB,OAAO,SAAS,CAAC;gBACnB,CAAC;gBAED,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACzC,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YAClD,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -5,7 +5,8 @@ import type { FileSystemManager } from "../file-system-manager.js";
5
5
  import type { SourceTracker } from "../source-tracker.js";
6
6
  import type { JudgeEvaluationOptions, JudgeEvaluationResult } from "./judge/judge-service.js";
7
7
  import type { AiServiceConfig, AiServiceEvents, EditorClient, UserChange, ApiUpdate } from "./types.ts";
8
- import type { AiGenerateRequest, AiExplainCodeRequest, LLMProviderConfig, PromptContext, RuntimeErrorData, ConsoleLogEntry } from "@superblocksteam/library-shared/types";
8
+ import type { ContextId } from "./llm/context/types.js";
9
+ import type { AiGenerateRequest, AiExplainCodeRequest, AiLabelAttachmentRequest, AiLabelAttachmentResponse, LLMProviderConfig, PromptContext, RuntimeErrorData, ConsoleLogEntry } from "@superblocksteam/library-shared/types";
9
10
  import type { ViteDevServer } from "vite";
10
11
  export { AiServiceFeatureFlags } from "./features.js";
11
12
  export declare class AiService extends TracedEventEmitter<AiServiceEvents> {
@@ -18,7 +19,7 @@ export declare class AiService extends TracedEventEmitter<AiServiceEvents> {
18
19
  private _appContext;
19
20
  private llmProviderSettings;
20
21
  private _logger;
21
- private clark;
22
+ private readonly clark;
22
23
  private clarkProfiler;
23
24
  readonly chatSessionStore: ChatSessionStore;
24
25
  private readonly contextManager;
@@ -31,6 +32,22 @@ export declare class AiService extends TracedEventEmitter<AiServiceEvents> {
31
32
  private readonly mcpServerManager;
32
33
  get appContext(): AppContextStore;
33
34
  get clarkState(): string;
35
+ get appRootDirPath(): string;
36
+ get organizationId(): string;
37
+ get superblocksBaseUrl(): string;
38
+ /**
39
+ * Gets the contextId for the current conversation context.
40
+ * Returns null if JWT is missing or has no userId.
41
+ */
42
+ getContextId(): ContextId | null;
43
+ /**
44
+ * Gets the JWT from Clark context
45
+ */
46
+ getClarkJwt(): string | undefined;
47
+ /**
48
+ * Updates the JWT in Clark context
49
+ */
50
+ updateClarkJwt(jwt: string): void;
34
51
  constructor(config: AiServiceConfig);
35
52
  /**
36
53
  * Initialize the AI service. Must be called after construction.
@@ -48,10 +65,16 @@ export declare class AiService extends TracedEventEmitter<AiServiceEvents> {
48
65
  private createClarkTagProviderFactory;
49
66
  handleAiGenerate(request: AiGenerateRequest, peer: EditorClient, peerId: string): Promise<void>;
50
67
  handleAiExplainCode(request: AiExplainCodeRequest, peer: EditorClient): Promise<void>;
68
+ handleAiLabelAttachment(request: AiLabelAttachmentRequest): Promise<AiLabelAttachmentResponse>;
69
+ /**
70
+ * Converts an attachment to the appropriate LLM content part.
71
+ */
72
+ private attachmentToContentPart;
51
73
  private submitAcceptanceEvaluation;
52
74
  handleUserAcceptedDraft(peer: EditorClient, silently?: boolean): Promise<void>;
53
75
  handleUserRejectedDraft(peer: EditorClient, silently?: boolean): Promise<void>;
54
76
  handleUserCanceled(): Promise<void>;
77
+ handleSkipTestCase(testRunId: string, testCaseId: string): Promise<void>;
55
78
  handleUserConnected(peer: EditorClient, peerId: string): void;
56
79
  handleUserDisconnected(peerId: string): void;
57
80
  private clearPeerConnection;
@@ -87,9 +110,10 @@ export declare class AiService extends TracedEventEmitter<AiServiceEvents> {
87
110
  }): Promise<JudgeEvaluationResult>;
88
111
  handleUserChange(change: UserChange): void;
89
112
  handleNewChat(): Promise<void>;
90
- handleTruncateChatAfterTimestamp(sinceTimestamp: number): Promise<void>;
113
+ handleRestoreToCommit(sinceTimestamp: number, commitId: string, applicationId: string, branchName: string): Promise<void>;
91
114
  handleApiUpdate(update: ApiUpdate): Promise<void>;
92
115
  isBusy(): boolean;
116
+ isAwaitingUser(): boolean;
93
117
  /**
94
118
  * Check if Clark is currently generating code.
95
119
  * Used by lock-service to determine if lock should be held during generation.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai-service/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAgBjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAwC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAEV,eAAe,EACf,eAAe,EACf,YAAY,EACZ,UAAU,EACV,SAAS,EACV,MAAM,YAAY,CAAC;AAYpB,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,eAAe,EAGhB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AA0EtD,qBAAa,SAAU,SAAQ,kBAAkB,CAAC,eAAe,CAAC;IA8BpD,OAAO,CAAC,QAAQ,CAAC,MAAM;IA7BnC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,aAAa,CAAgB;IACrC,SAAgB,gBAAgB,EAAE,gBAAgB,CAAC;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoC;IACjE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CACD;IACrC,OAAO,CAAC,6BAA6B,CAA2B;IAChE,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,UAAU,CAAC,CAAgB;IACnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAE9D,IAAW,UAAU,IAAI,eAAe,CAEvC;IAED,IAAW,UAAU,IAAI,MAAM,CAE9B;gBAE4B,MAAM,EAAE,eAAe;IAuIpD;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAKjC;;;OAGG;IACG,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7C,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,4BAA4B;IAsGpC,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,6BAA6B;IAWxB,gBAAgB,CAC3B,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC;IAwCH,mBAAmB,CAC9B,OAAO,EAAE,oBAAoB,EAC7B,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC;IAwNhB,OAAO,CAAC,0BAA0B;IAqBrB,uBAAuB,CAClC,IAAI,EAAE,YAAY,EAClB,QAAQ,CAAC,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC;IAkBH,uBAAuB,CAClC,IAAI,EAAE,YAAY,EAClB,QAAQ,CAAC,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC;IAqBH,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUzC,mBAAmB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAwE7D,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAiBnD,OAAO,CAAC,mBAAmB;IAQpB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAyB1C,kBAAkB,CAAC,SAAS,EAAE,gBAAgB;IA8C9C,uBAAuB,CAAC,EAAE,EAAE,MAAM;IAYlC,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IA0CjD,2BAA2B,IAAI,IAAI;IAUnC,4BAA4B,IAAI,IAAI;IAY9B,0BAA0B,CACrC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,aAAa,CAAA;KAAE,EACvE,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,IAAI,CAAC;IAQhB;;;;;;;;OAQG;IACU,qBAAqB,CAAC,OAAO,EAAE;QAC1C,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,iBAAiB,CAAC;QAC9B,OAAO,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAC1C,gBAAgB,CAAC,EAAE,GAAG,CAAC;KACxB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA6H3B,gBAAgB,CAAC,MAAM,EAAE,UAAU;IAQ7B,aAAa;IAYb,gCAAgC,CAAC,cAAc,EAAE,MAAM;IAuBvD,eAAe,CAAC,MAAM,EAAE,SAAS;IAkBvC,MAAM,IAAI,OAAO;IAQxB;;;;OAIG;IACI,YAAY,IAAI,OAAO;IAS9B;;;;;;OAMG;IACU,2BAA2B,IAAI,OAAO,CAAC,IAAI,CAAC;IAYzD;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IAQpB,gCAAgC,IAAI,OAAO,CAAC,OAAO,CAAC;IAY1D,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS;IAQzD,oBAAoB,CAAC,iBAAiB,EAAE,iBAAiB;IAMzD,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAI1C,aAAa,IAAI,aAAa,GAAG,SAAS;IAIjD,OAAO,CAAC,sBAAsB;CA2C/B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai-service/index.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,14 @@
1
1
  import os from "node:os";
2
2
  import path from "node:path";
3
+ import { isTextAttachment } from "@superblocksteam/library-shared/types";
3
4
  import { addTracingToMethods, TracedEventEmitter, } from "@superblocksteam/shared";
4
- import { hasToolCall } from "ai";
5
+ import { generateObject, hasToolCall } from "ai";
6
+ import { z } from "zod";
5
7
  import { getErrorMeta, getLogger, setDefaultLogger } from "../util/logger.js";
6
8
  import { OperationPassthrough } from "../util/operation-queue.js";
7
- import { readFile } from "./agent/tools/build-read-files.js";
9
+ import { readFile } from "./agent/tools/build-read-file.js";
8
10
  import { debugCache } from "./agent/tools/debug-cache.js";
9
- import { buildReadFilesToolFactory } from "./agent/tools/index.js";
11
+ import { buildReadFileToolFactory } from "./agent/tools/index.js";
10
12
  import { SessionEntityPermissionStore, } from "./agent/tools2/entity-permissions.js";
11
13
  import { ToolRegistry } from "./agent/tools2/registry.js";
12
14
  import { explainCodeFinalizeToolFactory } from "./agent/tools2/tools/explain-code-finalize.js";
@@ -15,6 +17,7 @@ import { AppShell } from "./app-interface/shell.js";
15
17
  import { BoltArtifactProcessor } from "./artifacts/bolt.js";
16
18
  import { ChatSessionStore } from "./chat/chat-session-store.js";
17
19
  import { AppContextStore } from "./context/app-context.js";
20
+ import { restoreContextFromCheckpoint } from "./context-download.js";
18
21
  import { IntegrationStore } from "./integrations/store.js";
19
22
  import { JudgeService } from "./judge/judge-service.js";
20
23
  import { CsvJudgeStorage } from "./judge/storage/csv-storage.js";
@@ -100,8 +103,10 @@ const mergePlanContexts = (existing, incoming) => {
100
103
  plan: incoming?.plan ?? existing?.plan,
101
104
  approved: incoming?.approved !== undefined ? incoming.approved : existing?.approved,
102
105
  integrations: incoming?.integrations ?? existing?.integrations,
106
+ entities: incoming?.entities ?? existing?.entities,
103
107
  title: incoming?.title ?? existing?.title,
104
108
  attachments: incoming?.attachments ?? existing?.attachments,
109
+ enableTesting: incoming?.enableTesting ?? existing?.enableTesting,
105
110
  };
106
111
  };
107
112
  export class AiService extends TracedEventEmitter {
@@ -131,11 +136,48 @@ export class AiService extends TracedEventEmitter {
131
136
  get clarkState() {
132
137
  return this.clark.state;
133
138
  }
139
+ get appRootDirPath() {
140
+ return this.config.appRootDirPath;
141
+ }
142
+ get organizationId() {
143
+ return this.config.organizationId;
144
+ }
145
+ get superblocksBaseUrl() {
146
+ return this.config.superblocksBaseUrl;
147
+ }
148
+ /**
149
+ * Gets the contextId for the current conversation context.
150
+ * Returns null if JWT is missing or has no userId.
151
+ */
152
+ getContextId() {
153
+ try {
154
+ return getContextId(this.clark, this.config);
155
+ }
156
+ catch {
157
+ return null;
158
+ }
159
+ }
160
+ /**
161
+ * Gets the JWT from Clark context
162
+ */
163
+ getClarkJwt() {
164
+ return this.clark?.context?.jwt;
165
+ }
166
+ /**
167
+ * Updates the JWT in Clark context
168
+ */
169
+ updateClarkJwt(jwt) {
170
+ if (jwt) {
171
+ this.clark.updateContext({ jwt });
172
+ }
173
+ }
134
174
  constructor(config) {
135
175
  super(config.tracer);
136
176
  this.config = config;
137
- this._logger = config.logger;
138
177
  setDefaultLogger(config.logger);
178
+ // Store the wrapped logger so getLogger() can return it
179
+ // The wrapped logger forwards logs to the browser console when Clark logs are enabled
180
+ this._logger = getLogger();
139
181
  // Prevent traced functions from creating traces when called outside of a Clark context
140
182
  llmobs.setDefaultRootPolicy("drop-if-no-parent");
141
183
  // todo: move to state handlers
@@ -198,9 +240,10 @@ export class AiService extends TracedEventEmitter {
198
240
  appShell: this.appShell,
199
241
  retryOptions: config.retryOptions,
200
242
  unifiedProviderEnabled: config.features.unifiedProviderEnabled ?? false,
243
+ organizationId: config.organizationId,
244
+ applicationId: config.applicationId,
245
+ getJwt: () => this.getJwt(),
201
246
  });
202
- // Initialize judge service
203
- this.mcpServerManager = new PlaywrightMcpServerManager(config.logger);
204
247
  this.clark = new Clark({
205
248
  initialContext: {
206
249
  abortController: new AbortController(),
@@ -209,6 +252,8 @@ export class AiService extends TracedEventEmitter {
209
252
  createTagProvider: this.createClarkTagProviderFactory(),
210
253
  sessionId,
211
254
  });
255
+ // Initialize judge service
256
+ this.mcpServerManager = new PlaywrightMcpServerManager(this.clark.logger);
212
257
  this.config.draftInterface
213
258
  .hasLocalDraftChanges()
214
259
  .then((hasDraft) => {
@@ -230,6 +275,7 @@ export class AiService extends TracedEventEmitter {
230
275
  "handleUserAcceptedDraft",
231
276
  "handleUserRejectedDraft",
232
277
  "handleUserCanceled",
278
+ "handleSkipTestCase",
233
279
  "handleBuildSystemError",
234
280
  "handleRuntimeError",
235
281
  "handleClearRuntimeError",
@@ -257,6 +303,8 @@ export class AiService extends TracedEventEmitter {
257
303
  this.getLogger().info("[ai-service] Integration cache removed");
258
304
  }
259
305
  getLogger() {
306
+ // Return the wrapped logger that forwards logs to the browser console
307
+ // when Clark logs are enabled (via ?clark_logs=true or SUPERBLOCKS_CLI_ENV=local)
260
308
  return this._logger;
261
309
  }
262
310
  createClarkTransitionHandler() {
@@ -290,6 +338,7 @@ export class AiService extends TracedEventEmitter {
290
338
  llmClient: this.llmClient,
291
339
  toolRegistry: this.toolRegistry,
292
340
  entityPermissionStore: this.entityPermissionStore,
341
+ mcpServerManager: this.mcpServerManager,
293
342
  viteServer: this.viteServer,
294
343
  };
295
344
  const clarkStateHandlers = Object.fromEntries(Object.entries(clarkStateHandlerFactories).map(([state, handlerFactory]) => [state, handlerFactory(clark, params)]));
@@ -300,6 +349,7 @@ export class AiService extends TracedEventEmitter {
300
349
  }
301
350
  const handler = clarkStateHandlers[to];
302
351
  if (!handler) {
352
+ this.getLogger().error(`[ai-service] No handler for state ${to}`);
303
353
  throw new Error(`No handler for state ${to}`);
304
354
  }
305
355
  this.getLogger().info(`[ai-service] Transitioned from ${from} to ${to} with event ${event.type}`);
@@ -349,6 +399,7 @@ export class AiService extends TracedEventEmitter {
349
399
  };
350
400
  }
351
401
  async handleAiGenerate(request, peer, peerId) {
402
+ this.getLogger().info(`[ai-service] handleAiGenerate: peerId=${peerId}`);
352
403
  if (this.clark.state === ClarkStateNames.Dead) {
353
404
  throw new Error("Service is unavailable");
354
405
  }
@@ -363,6 +414,7 @@ export class AiService extends TracedEventEmitter {
363
414
  ...context,
364
415
  useMockGeneration: request.mockGeneration ?? false,
365
416
  planContext: mergePlanContexts(context.planContext, request.planContext),
417
+ browserContext: request.browserContext,
366
418
  };
367
419
  });
368
420
  const transitionTo = transitionFrom(this.clark);
@@ -404,7 +456,7 @@ export class AiService extends TracedEventEmitter {
404
456
  * Tools expect passing a Clark instance to handle shared state (e.g: search for `requiredFileReads` and its usage)
405
457
  * We don't need it here since we only use a single read tool.
406
458
  */
407
- const build_readFiles = buildReadFilesToolFactory.create({
459
+ const build_readFile = buildReadFileToolFactory.create({
408
460
  clark: this.clark,
409
461
  services: {
410
462
  appShell: this.appShell,
@@ -425,7 +477,7 @@ export class AiService extends TracedEventEmitter {
425
477
  code,
426
478
  pageContent,
427
479
  finalizeToolName: explainCodeFinalize.name,
428
- readFilesToolName: build_readFiles.name,
480
+ readFileToolName: build_readFile.name,
429
481
  });
430
482
  }
431
483
  else {
@@ -458,7 +510,7 @@ export class AiService extends TracedEventEmitter {
458
510
  model,
459
511
  stopWhen: hasToolCall(explainCodeFinalize.name),
460
512
  tools: {
461
- build_readFiles,
513
+ build_readFile,
462
514
  explainCodeFinalize,
463
515
  },
464
516
  user: { role: "user", content: prompt },
@@ -513,6 +565,110 @@ export class AiService extends TracedEventEmitter {
513
565
  });
514
566
  }
515
567
  }
568
+ async handleAiLabelAttachment(request) {
569
+ const logger = getLogger();
570
+ const startTime = Date.now();
571
+ const timeout = 30_000;
572
+ const attachment = request.attachment;
573
+ logger.debug("[ai-service] Labeling attachment", {
574
+ fileName: attachment.fileName ?? "unnamed",
575
+ type: attachment.type,
576
+ });
577
+ const llmConfig = request.llmConfig
578
+ ? {
579
+ ...request.llmConfig,
580
+ interleavedThinking: false,
581
+ thinkingEnabled: false,
582
+ }
583
+ : undefined;
584
+ const llmProviderSettings = this.getLLMProviderSettings(false, llmConfig);
585
+ const llmProvider = createLLMProvider(llmProviderSettings, () => request.jwt, llmConfig);
586
+ const model = llmProvider.modelForTask("fast");
587
+ const LabelAttachmentSchema = z.object({
588
+ label: z
589
+ .string()
590
+ .min(1)
591
+ .describe('A brief 2-3 word description (e.g., "sales dashboard", "user profile", "data table", "customer data")'),
592
+ insight: z
593
+ .string()
594
+ .min(1)
595
+ .describe('A key observation about the content (e.g., "chart displays monthly revenue", "CSV contains customer records", "JSON config for API settings")'),
596
+ });
597
+ const timeoutController = new AbortController();
598
+ const timeoutId = setTimeout(() => timeoutController.abort(), timeout);
599
+ try {
600
+ // Build the appropriate content part based on attachment type
601
+ const contentPart = this.attachmentToContentPart(attachment);
602
+ const { object: result } = await generateObject({
603
+ model,
604
+ schema: LabelAttachmentSchema,
605
+ messages: [
606
+ {
607
+ role: "user",
608
+ content: [
609
+ {
610
+ type: "text",
611
+ text: "Analyze this attachment and provide a brief label and key insight about its content.",
612
+ },
613
+ contentPart,
614
+ ],
615
+ },
616
+ ],
617
+ abortSignal: timeoutController.signal,
618
+ });
619
+ const durationMs = Date.now() - startTime;
620
+ logger.debug("[ai-service] Attachment labeling complete", {
621
+ fileName: attachment.fileName,
622
+ type: attachment.type,
623
+ label: result.label,
624
+ insight: result.insight,
625
+ durationMs,
626
+ });
627
+ return result;
628
+ }
629
+ finally {
630
+ clearTimeout(timeoutId);
631
+ }
632
+ }
633
+ /**
634
+ * Converts an attachment to the appropriate LLM content part.
635
+ */
636
+ attachmentToContentPart(attachment) {
637
+ if (attachment.type === "image") {
638
+ return {
639
+ type: "image",
640
+ image: attachment.image,
641
+ };
642
+ }
643
+ else if (attachment.type === "pdf") {
644
+ // Parse data URL to extract base64 data
645
+ const match = attachment.data.match(/^data:([^;]+);base64,(.+)$/);
646
+ const data = match?.[2] ?? attachment.data;
647
+ const mediaType = match?.[1] ?? "application/pdf";
648
+ return {
649
+ type: "file",
650
+ data,
651
+ mediaType,
652
+ filename: attachment.fileName,
653
+ };
654
+ }
655
+ else if (isTextAttachment(attachment)) {
656
+ // Wrap text content in XML tags for structured presentation
657
+ const sanitizedFileName = attachment.fileName
658
+ .replace(/&/g, "&amp;")
659
+ .replace(/"/g, "&quot;")
660
+ .replace(/'/g, "&apos;")
661
+ .replace(/</g, "&lt;")
662
+ .replace(/>/g, "&gt;");
663
+ return {
664
+ type: "text",
665
+ text: `<${attachment.type}_file name="${sanitizedFileName}">\n${attachment.content}\n</${attachment.type}_file>`,
666
+ };
667
+ }
668
+ else {
669
+ throw new Error(`Unsupported attachment type: ${attachment.type}`);
670
+ }
671
+ }
516
672
  submitAcceptanceEvaluation(wasAccepted) {
517
673
  if (!this.clark.rootSpan) {
518
674
  this.getLogger().warn("[ai-service] No root span available for submitting feedback");
@@ -530,12 +686,14 @@ export class AiService extends TracedEventEmitter {
530
686
  }
531
687
  }
532
688
  async handleUserAcceptedDraft(peer, silently) {
689
+ this.getLogger().info(`[ai-service] handleUserAcceptedDraft`);
533
690
  this.submitAcceptanceEvaluation(true);
534
691
  if (this.clark.state !== ClarkStateNames.AwaitingUser) {
535
692
  throw new Error("Service is not awaiting user input");
536
693
  }
537
694
  if (!this.clark.context.peer) {
538
- // this can happen if the service was started with a draft
695
+ // peer can be null if service was started with a draft
696
+ this.getLogger().info(`[ai-service] Setting peer from RPC caller`);
539
697
  this.clark.updateContext({
540
698
  peer,
541
699
  });
@@ -544,12 +702,14 @@ export class AiService extends TracedEventEmitter {
544
702
  void transitionTo({ type: USER_ACCEPTED_DRAFT, silently });
545
703
  }
546
704
  async handleUserRejectedDraft(peer, silently) {
705
+ this.getLogger().info(`[ai-service] handleUserRejectedDraft`);
547
706
  this.submitAcceptanceEvaluation(false);
548
707
  if (this.clark.state !== ClarkStateNames.AwaitingUser) {
549
708
  throw new Error("Service is not awaiting user input");
550
709
  }
551
710
  if (!this.clark.context.peer) {
552
- // this can happen if the service was started with a draft
711
+ // peer can be null if service was started with a draft
712
+ this.getLogger().info(`[ai-service] Setting peer from RPC caller`);
553
713
  this.clark.updateContext({
554
714
  peer,
555
715
  });
@@ -567,8 +727,42 @@ export class AiService extends TracedEventEmitter {
567
727
  this.clark.context.abortController?.abort();
568
728
  void this.clark.send({ type: USER_CANCELED });
569
729
  }
730
+ async handleSkipTestCase(testRunId, testCaseId) {
731
+ const logger = this.getLogger();
732
+ logger.info(`[ai-service] Skip test case requested: testRunId=${testRunId}, testCaseId=${testCaseId}`);
733
+ // Verify this is the active test run
734
+ if (this.clark.context.currentTestRunId !== testRunId) {
735
+ logger.warn(`[ai-service] Skip request for testRunId=${testRunId} but current is ${this.clark.context.currentTestRunId}`);
736
+ return;
737
+ }
738
+ // Update context with skip request
739
+ this.clark.updateContext({
740
+ skipRequestedForTestCase: testCaseId,
741
+ });
742
+ // Update the test case status to skipped
743
+ const testCaseStatuses = this.clark.context.testCaseStatuses ??
744
+ new Map();
745
+ testCaseStatuses.set(testCaseId, "skipped");
746
+ this.clark.updateContext({
747
+ testCaseStatuses,
748
+ });
749
+ // Send test_case_update message to UI
750
+ const peer = this.clark.context.peer;
751
+ if (peer) {
752
+ void peer.call.aiPushMessage({
753
+ type: "test_case_update",
754
+ testRunId,
755
+ testCaseId,
756
+ testCaseStatus: "skipped",
757
+ role: "assistant",
758
+ content: "",
759
+ });
760
+ }
761
+ logger.info(`[ai-service] Test case ${testCaseId} marked as skipped, flag set for subagent`);
762
+ }
570
763
  handleUserConnected(peer, peerId) {
571
764
  const existingPeerId = this.clark.context.peerId;
765
+ this.getLogger().info(`[ai-service] handleUserConnected: peerId=${peerId}`);
572
766
  if (this.clark.context.peer) {
573
767
  if (existingPeerId === peerId) {
574
768
  this.getLogger().info(`[ai-service] Existing peer ${peerId} reconnected; refreshing reference`);
@@ -585,6 +779,7 @@ export class AiService extends TracedEventEmitter {
585
779
  peer,
586
780
  peerId,
587
781
  }));
782
+ this.getLogger().info(`[ai-service] Peer set: ${peerId}`);
588
783
  // 1. Sync generation state if generation is in progress
589
784
  if (this.clark.context.lastGenerationState) {
590
785
  this.getLogger().info(`[ai-service] Syncing generation state on reconnect: ${this.clark.context.lastGenerationState.state}`);
@@ -612,7 +807,6 @@ export class AiService extends TracedEventEmitter {
612
807
  formattedInput: request.formattedInput ?? undefined,
613
808
  rawInput: request.rawInput,
614
809
  permissions: request.permissions ?? [],
615
- toolCallId: request.toolCallId,
616
810
  })
617
811
  .catch((error) => {
618
812
  this.getLogger().error(`[ai-service] Failed to resend tool permission request: ${error}`);
@@ -621,18 +815,19 @@ export class AiService extends TracedEventEmitter {
621
815
  }
622
816
  handleUserDisconnected(peerId) {
623
817
  const currentPeerId = this.clark.context.peerId;
818
+ this.getLogger().info(`[ai-service] handleUserDisconnected: peerId=${peerId}`);
624
819
  if (!currentPeerId) {
625
820
  return;
626
821
  }
627
822
  if (currentPeerId !== peerId) {
628
- this.getLogger().warn(`[ai-service] Disconnect event for ${peerId} but current peer is ${currentPeerId}; clearing stale peer`);
629
- }
630
- else {
631
- this.getLogger().info(`[ai-service] peer disconnecting: ${peerId}`);
823
+ this.getLogger().info(`[ai-service] Stale disconnect ignored: peer ${peerId} disconnecting but current peer is ${currentPeerId}`);
824
+ return; // Don't clear the current peer on stale disconnect
632
825
  }
826
+ this.getLogger().info(`[ai-service] peer disconnecting: ${peerId}`);
633
827
  this.clearPeerConnection();
634
828
  }
635
829
  clearPeerConnection() {
830
+ this.getLogger().info(`[ai-service] Clearing peer connection`);
636
831
  this.clark.updateContext((context) => ({
637
832
  ...context,
638
833
  peer: undefined,
@@ -871,18 +1066,59 @@ export class AiService extends TracedEventEmitter {
871
1066
  this.getLogger().error("[ai-service] Failed to clear contexts on new chat", getErrorMeta(error));
872
1067
  }
873
1068
  }
874
- async handleTruncateChatAfterTimestamp(sinceTimestamp) {
875
- // Truncate chat messages on server
1069
+ async handleRestoreToCommit(sinceTimestamp, commitId, applicationId, branchName) {
1070
+ // TODO: change this to truncate after commit once commit info is supported here, so we can truncate messages accurately.
1071
+ // 1. Truncate chat messages on server (always do this first)
876
1072
  await this.chatSessionStore.truncateAfterTimestamp(sinceTimestamp);
877
- // Truncate LLM context
1073
+ // Check JWT once at the beginning - needed for both restoration and truncation
1074
+ // Note: clark.context.jwt should be set by the socket handler (socket-manager.ts) before
1075
+ // this method is called. The socket handler updates it from peerAuthorization if missing.
1076
+ const jwt = this.clark?.context?.jwt;
1077
+ if (!jwt) {
1078
+ this.getLogger().warn(`[handleRestoreToCommit] No JWT available, cannot restore or truncate context`);
1079
+ return;
1080
+ }
1081
+ // 2. Try to restore context from checkpoint
1082
+ try {
1083
+ const contextId = getContextId(this.clark, this.config);
1084
+ const result = await restoreContextFromCheckpoint({
1085
+ applicationId,
1086
+ commitId,
1087
+ branchName,
1088
+ contextId,
1089
+ appRootDirPath: this.config.appRootDirPath,
1090
+ superblocksBaseUrl: this.config.superblocksBaseUrl,
1091
+ logger: this.getLogger(),
1092
+ jwt,
1093
+ contextManager: this.contextManager,
1094
+ });
1095
+ if (result.success) {
1096
+ this.getLogger().info(`[handleRestoreToCommit] Successfully restored main.json from checkpoint commitId=${commitId}, skipping truncation`);
1097
+ return; // Success - no need to truncate
1098
+ }
1099
+ else {
1100
+ // main.json not found or failed - fall through to truncation
1101
+ const reason = result.savedFiles.length > 0
1102
+ ? "main.json not found in checkpoint"
1103
+ : "no file saved from checkpoint";
1104
+ this.getLogger().info(`[handleRestoreToCommit] Context restore failed: ${reason} for commitId=${commitId}, using truncation fallback`);
1105
+ }
1106
+ }
1107
+ catch (error) {
1108
+ // Error downloading - log and fall through to truncation
1109
+ this.getLogger().warn(`[handleRestoreToCommit] Error restoring context from checkpoint, using truncation fallback`, getErrorMeta(error));
1110
+ }
1111
+ // 3. Fallback: Truncate LLM context (restore failed)
878
1112
  const contextId = getContextId(this.clark, this.config);
879
- const ownerId = `truncation-handler-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
1113
+ const ownerId = `restore-handler-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
880
1114
  const contextHandle = await this.contextManager.acquireContext(contextId, ownerId);
881
1115
  try {
882
1116
  contextHandle.context.truncateAfterTimestamp(sinceTimestamp);
1117
+ this.getLogger().info(`[handleRestoreToCommit] Context truncated after timestamp ${sinceTimestamp}`);
883
1118
  }
884
1119
  catch (error) {
885
1120
  this.getLogger().error(`[ai-service] Failed to truncate context after timestamp ${sinceTimestamp}`, getErrorMeta(error));
1121
+ throw error;
886
1122
  }
887
1123
  finally {
888
1124
  contextHandle.release();
@@ -908,6 +1144,9 @@ export class AiService extends TracedEventEmitter {
908
1144
  this.clark.state !== ClarkStateNames.AwaitingUser &&
909
1145
  this.clark.state !== ClarkStateNames.Dead);
910
1146
  }
1147
+ isAwaitingUser() {
1148
+ return this.clark.state === ClarkStateNames.AwaitingUser;
1149
+ }
911
1150
  /**
912
1151
  * Check if Clark is currently generating code.
913
1152
  * Used by lock-service to determine if lock should be held during generation.