botmux 3.5.0 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (505) hide show
  1. package/README.en.md +56 -396
  2. package/README.md +55 -396
  3. package/dist/.runtime-build-id +1 -0
  4. package/dist/adapters/backend/sandbox.d.ts +99 -279
  5. package/dist/adapters/backend/sandbox.d.ts.map +1 -1
  6. package/dist/adapters/backend/sandbox.js +424 -826
  7. package/dist/adapters/backend/sandbox.js.map +1 -1
  8. package/dist/adapters/cli/claude-code.d.ts +6 -0
  9. package/dist/adapters/cli/claude-code.d.ts.map +1 -1
  10. package/dist/adapters/cli/claude-code.js +197 -11
  11. package/dist/adapters/cli/claude-code.js.map +1 -1
  12. package/dist/adapters/cli/coco.js +4 -4
  13. package/dist/adapters/cli/coco.js.map +1 -1
  14. package/dist/adapters/cli/codex-app.d.ts.map +1 -1
  15. package/dist/adapters/cli/codex-app.js +9 -6
  16. package/dist/adapters/cli/codex-app.js.map +1 -1
  17. package/dist/adapters/cli/codex.d.ts.map +1 -1
  18. package/dist/adapters/cli/codex.js +9 -5
  19. package/dist/adapters/cli/codex.js.map +1 -1
  20. package/dist/adapters/cli/fs-policy.d.ts +244 -0
  21. package/dist/adapters/cli/fs-policy.d.ts.map +1 -0
  22. package/dist/adapters/cli/fs-policy.js +537 -0
  23. package/dist/adapters/cli/fs-policy.js.map +1 -0
  24. package/dist/adapters/cli/grok.d.ts +2 -1
  25. package/dist/adapters/cli/grok.d.ts.map +1 -1
  26. package/dist/adapters/cli/grok.js +2 -1
  27. package/dist/adapters/cli/grok.js.map +1 -1
  28. package/dist/adapters/cli/hermes.d.ts.map +1 -1
  29. package/dist/adapters/cli/hermes.js +8 -4
  30. package/dist/adapters/cli/hermes.js.map +1 -1
  31. package/dist/adapters/cli/mtr.d.ts.map +1 -1
  32. package/dist/adapters/cli/mtr.js +3 -2
  33. package/dist/adapters/cli/mtr.js.map +1 -1
  34. package/dist/adapters/cli/opencode.d.ts.map +1 -1
  35. package/dist/adapters/cli/opencode.js +5 -4
  36. package/dist/adapters/cli/opencode.js.map +1 -1
  37. package/dist/adapters/cli/read-isolation.d.ts +14 -200
  38. package/dist/adapters/cli/read-isolation.d.ts.map +1 -1
  39. package/dist/adapters/cli/read-isolation.js +18 -477
  40. package/dist/adapters/cli/read-isolation.js.map +1 -1
  41. package/dist/adapters/cli/relay.js +2 -2
  42. package/dist/adapters/cli/relay.js.map +1 -1
  43. package/dist/adapters/cli/runner-input.d.ts +2 -2
  44. package/dist/adapters/cli/runner-input.d.ts.map +1 -1
  45. package/dist/adapters/cli/runner-input.js +9 -6
  46. package/dist/adapters/cli/runner-input.js.map +1 -1
  47. package/dist/adapters/cli/seed.d.ts.map +1 -1
  48. package/dist/adapters/cli/seed.js +2 -1
  49. package/dist/adapters/cli/seed.js.map +1 -1
  50. package/dist/adapters/cli/traex.d.ts.map +1 -1
  51. package/dist/adapters/cli/traex.js +3 -2
  52. package/dist/adapters/cli/traex.js.map +1 -1
  53. package/dist/adapters/cli/types.d.ts +25 -18
  54. package/dist/adapters/cli/types.d.ts.map +1 -1
  55. package/dist/bot-registry.d.ts +54 -23
  56. package/dist/bot-registry.d.ts.map +1 -1
  57. package/dist/bot-registry.js +91 -0
  58. package/dist/bot-registry.js.map +1 -1
  59. package/dist/cli.d.ts.map +1 -1
  60. package/dist/cli.js +297 -104
  61. package/dist/cli.js.map +1 -1
  62. package/dist/codex-app-runner.js +85 -192
  63. package/dist/codex-app-runner.js.map +1 -1
  64. package/dist/config.d.ts +0 -16
  65. package/dist/config.d.ts.map +1 -1
  66. package/dist/config.js +0 -30
  67. package/dist/config.js.map +1 -1
  68. package/dist/core/ask-broker.d.ts +12 -0
  69. package/dist/core/ask-broker.d.ts.map +1 -1
  70. package/dist/core/ask-broker.js +41 -0
  71. package/dist/core/ask-broker.js.map +1 -1
  72. package/dist/core/bot-turn-mutation-gate.d.ts +24 -0
  73. package/dist/core/bot-turn-mutation-gate.d.ts.map +1 -0
  74. package/dist/core/bot-turn-mutation-gate.js +369 -0
  75. package/dist/core/bot-turn-mutation-gate.js.map +1 -0
  76. package/dist/core/command-handler.d.ts +5 -0
  77. package/dist/core/command-handler.d.ts.map +1 -1
  78. package/dist/core/command-handler.js +53 -73
  79. package/dist/core/command-handler.js.map +1 -1
  80. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  81. package/dist/core/dashboard-ipc-server.js +356 -84
  82. package/dist/core/dashboard-ipc-server.js.map +1 -1
  83. package/dist/core/dashboard-rows.d.ts +8 -0
  84. package/dist/core/dashboard-rows.d.ts.map +1 -1
  85. package/dist/core/dashboard-rows.js.map +1 -1
  86. package/dist/core/host-overload-alert.d.ts +157 -0
  87. package/dist/core/host-overload-alert.d.ts.map +1 -0
  88. package/dist/core/host-overload-alert.js +251 -0
  89. package/dist/core/host-overload-alert.js.map +1 -0
  90. package/dist/core/passthrough-commands.d.ts +8 -0
  91. package/dist/core/passthrough-commands.d.ts.map +1 -1
  92. package/dist/core/passthrough-commands.js +20 -1
  93. package/dist/core/passthrough-commands.js.map +1 -1
  94. package/dist/core/plugins/mcp/gateway-installer.d.ts.map +1 -1
  95. package/dist/core/plugins/mcp/gateway-installer.js +14 -2
  96. package/dist/core/plugins/mcp/gateway-installer.js.map +1 -1
  97. package/dist/core/restart-coordinator.d.ts +28 -0
  98. package/dist/core/restart-coordinator.d.ts.map +1 -0
  99. package/dist/core/restart-coordinator.js +82 -0
  100. package/dist/core/restart-coordinator.js.map +1 -0
  101. package/dist/core/restart-followup-policy.d.ts +112 -0
  102. package/dist/core/restart-followup-policy.d.ts.map +1 -0
  103. package/dist/core/restart-followup-policy.js +49 -0
  104. package/dist/core/restart-followup-policy.js.map +1 -0
  105. package/dist/core/role-library.d.ts +1 -1
  106. package/dist/core/role-library.js +1 -1
  107. package/dist/core/session-cwd.d.ts.map +1 -1
  108. package/dist/core/session-cwd.js +8 -0
  109. package/dist/core/session-cwd.js.map +1 -1
  110. package/dist/core/session-discovery.d.ts +14 -0
  111. package/dist/core/session-discovery.d.ts.map +1 -1
  112. package/dist/core/session-discovery.js +25 -0
  113. package/dist/core/session-discovery.js.map +1 -1
  114. package/dist/core/session-liveness.d.ts +15 -0
  115. package/dist/core/session-liveness.d.ts.map +1 -0
  116. package/dist/core/session-liveness.js +76 -0
  117. package/dist/core/session-liveness.js.map +1 -0
  118. package/dist/core/session-manager.d.ts.map +1 -1
  119. package/dist/core/session-manager.js +90 -60
  120. package/dist/core/session-manager.js.map +1 -1
  121. package/dist/core/session-row-enrichment.d.ts +15 -0
  122. package/dist/core/session-row-enrichment.d.ts.map +1 -0
  123. package/dist/core/session-row-enrichment.js +93 -0
  124. package/dist/core/session-row-enrichment.js.map +1 -0
  125. package/dist/core/slash-inject.js +1 -1
  126. package/dist/core/slash-inject.js.map +1 -1
  127. package/dist/core/trigger-final-suppression.d.ts +24 -0
  128. package/dist/core/trigger-final-suppression.d.ts.map +1 -0
  129. package/dist/core/trigger-final-suppression.js +97 -0
  130. package/dist/core/trigger-final-suppression.js.map +1 -0
  131. package/dist/core/trigger-session.d.ts.map +1 -1
  132. package/dist/core/trigger-session.js +64 -4
  133. package/dist/core/trigger-session.js.map +1 -1
  134. package/dist/core/types.d.ts +6 -0
  135. package/dist/core/types.d.ts.map +1 -1
  136. package/dist/core/types.js.map +1 -1
  137. package/dist/core/worker-pool.d.ts +44 -0
  138. package/dist/core/worker-pool.d.ts.map +1 -1
  139. package/dist/core/worker-pool.js +333 -38
  140. package/dist/core/worker-pool.js.map +1 -1
  141. package/dist/daemon.d.ts +5 -1
  142. package/dist/daemon.d.ts.map +1 -1
  143. package/dist/daemon.js +526 -35
  144. package/dist/daemon.js.map +1 -1
  145. package/dist/dashboard/aggregator.d.ts +1 -0
  146. package/dist/dashboard/aggregator.d.ts.map +1 -1
  147. package/dist/dashboard/aggregator.js +34 -6
  148. package/dist/dashboard/aggregator.js.map +1 -1
  149. package/dist/dashboard/bot-payload.d.ts +8 -0
  150. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  151. package/dist/dashboard/bot-payload.js +10 -0
  152. package/dist/dashboard/bot-payload.js.map +1 -1
  153. package/dist/dashboard/compat.d.ts +102 -2
  154. package/dist/dashboard/compat.d.ts.map +1 -1
  155. package/dist/dashboard/compat.js +78 -14
  156. package/dist/dashboard/compat.js.map +1 -1
  157. package/dist/dashboard/connector-api.d.ts.map +1 -1
  158. package/dist/dashboard/connector-api.js +1 -0
  159. package/dist/dashboard/connector-api.js.map +1 -1
  160. package/dist/dashboard/desktop-asks.d.ts +21 -0
  161. package/dist/dashboard/desktop-asks.d.ts.map +1 -0
  162. package/dist/dashboard/desktop-asks.js +49 -0
  163. package/dist/dashboard/desktop-asks.js.map +1 -0
  164. package/dist/dashboard/public-redact.d.ts +7 -0
  165. package/dist/dashboard/public-redact.d.ts.map +1 -1
  166. package/dist/dashboard/public-redact.js +35 -3
  167. package/dist/dashboard/public-redact.js.map +1 -1
  168. package/dist/dashboard/session-presentation.d.ts +16 -0
  169. package/dist/dashboard/session-presentation.d.ts.map +1 -0
  170. package/dist/dashboard/session-presentation.js +62 -0
  171. package/dist/dashboard/session-presentation.js.map +1 -0
  172. package/dist/dashboard/settings-write-applier.d.ts +2 -1
  173. package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
  174. package/dist/dashboard/settings-write-applier.js +19 -1
  175. package/dist/dashboard/settings-write-applier.js.map +1 -1
  176. package/dist/dashboard/trigger-api.d.ts.map +1 -1
  177. package/dist/dashboard/trigger-api.js +19 -1
  178. package/dist/dashboard/trigger-api.js.map +1 -1
  179. package/dist/dashboard/vc-consumer-profiles-api.d.ts +7 -2
  180. package/dist/dashboard/vc-consumer-profiles-api.d.ts.map +1 -1
  181. package/dist/dashboard/vc-consumer-profiles-api.js +13 -0
  182. package/dist/dashboard/vc-consumer-profiles-api.js.map +1 -1
  183. package/dist/dashboard/web/app.d.ts.map +1 -1
  184. package/dist/dashboard/web/app.js +18 -5
  185. package/dist/dashboard/web/app.js.map +1 -1
  186. package/dist/dashboard/web/bot-defaults-page.d.ts +16 -0
  187. package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
  188. package/dist/dashboard/web/bot-defaults-page.js +288 -7
  189. package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
  190. package/dist/dashboard/web/bot-defaults.d.ts +10 -0
  191. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  192. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  193. package/dist/dashboard/web/client-shell.d.ts +29 -0
  194. package/dist/dashboard/web/client-shell.d.ts.map +1 -0
  195. package/dist/dashboard/web/client-shell.js +89 -0
  196. package/dist/dashboard/web/client-shell.js.map +1 -0
  197. package/dist/dashboard/web/connectors-page.d.ts.map +1 -1
  198. package/dist/dashboard/web/connectors-page.js +5 -1
  199. package/dist/dashboard/web/connectors-page.js.map +1 -1
  200. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  201. package/dist/dashboard/web/i18n.js +130 -22
  202. package/dist/dashboard/web/i18n.js.map +1 -1
  203. package/dist/dashboard/web/preferences.d.ts +7 -0
  204. package/dist/dashboard/web/preferences.d.ts.map +1 -1
  205. package/dist/dashboard/web/preferences.js +32 -0
  206. package/dist/dashboard/web/preferences.js.map +1 -1
  207. package/dist/dashboard/web/sessions-kanban.d.ts +1 -1
  208. package/dist/dashboard/web/sessions-kanban.d.ts.map +1 -1
  209. package/dist/dashboard/web/sessions-kanban.js +1 -1
  210. package/dist/dashboard/web/sessions-kanban.js.map +1 -1
  211. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  212. package/dist/dashboard/web/sessions-page.js +78 -67
  213. package/dist/dashboard/web/sessions-page.js.map +1 -1
  214. package/dist/dashboard/web/sessions.d.ts +4 -0
  215. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  216. package/dist/dashboard/web/sessions.js +14 -1
  217. package/dist/dashboard/web/sessions.js.map +1 -1
  218. package/dist/dashboard/web/settings-page.d.ts +6 -0
  219. package/dist/dashboard/web/settings-page.d.ts.map +1 -1
  220. package/dist/dashboard/web/settings-page.js +55 -30
  221. package/dist/dashboard/web/settings-page.js.map +1 -1
  222. package/dist/dashboard/web/store.d.ts +1 -2
  223. package/dist/dashboard/web/store.d.ts.map +1 -1
  224. package/dist/dashboard/web/store.js +69 -20
  225. package/dist/dashboard/web/store.js.map +1 -1
  226. package/dist/dashboard/web/vc-consumer-profiles-section.d.ts.map +1 -1
  227. package/dist/dashboard/web/vc-consumer-profiles-section.js +128 -42
  228. package/dist/dashboard/web/vc-consumer-profiles-section.js.map +1 -1
  229. package/dist/dashboard/webhook-routes.d.ts.map +1 -1
  230. package/dist/dashboard/webhook-routes.js +9 -2
  231. package/dist/dashboard/webhook-routes.js.map +1 -1
  232. package/dist/dashboard-web/app.js +1 -1
  233. package/dist/dashboard-web/chunks/bot-defaults-page-VQMPUJ4Y.js +10 -0
  234. package/dist/dashboard-web/chunks/chunk-AGCPF6MT.js +1 -0
  235. package/dist/dashboard-web/chunks/{chunk-QCPPKCX3.js → chunk-JMRGZQDB.js} +1 -1
  236. package/dist/dashboard-web/chunks/{chunk-EJDYUINZ.js → chunk-NP4JUBGS.js} +1 -1
  237. package/dist/dashboard-web/chunks/{chunk-WXPMNEYV.js → chunk-P327LXOT.js} +1 -1
  238. package/dist/dashboard-web/chunks/chunk-SNKATZWK.js +49 -0
  239. package/dist/dashboard-web/chunks/connectors-page-DOY4J3ZL.js +1 -0
  240. package/dist/dashboard-web/chunks/{groups-page-3P4TLUMF.js → groups-page-74TS2DIH.js} +1 -1
  241. package/dist/dashboard-web/chunks/{insights-page-TDCZV56A.js → insights-page-AYCO65JC.js} +1 -1
  242. package/dist/dashboard-web/chunks/{monitor-room-QWCWL3SX.js → monitor-room-YKYLTSAN.js} +1 -1
  243. package/dist/dashboard-web/chunks/{monitoring-page-IOWFSNVC.js → monitoring-page-QBIUNRBR.js} +1 -1
  244. package/dist/dashboard-web/chunks/{office-page-5AUPEHZP.js → office-page-4PH2A26P.js} +1 -1
  245. package/dist/dashboard-web/chunks/overview-page-H73D5UT4.js +1 -0
  246. package/dist/dashboard-web/chunks/{roles-page-WJVB52ET.js → roles-page-U4BTOQ7F.js} +1 -1
  247. package/dist/dashboard-web/chunks/{schedules-page-RVRWHP4V.js → schedules-page-RHRHX7R7.js} +1 -1
  248. package/dist/dashboard-web/chunks/sessions-page-VSC6AM5G.js +2 -0
  249. package/dist/dashboard-web/chunks/settings-page-LF3RKM5P.js +2 -0
  250. package/dist/dashboard-web/chunks/{skills-page-7YT5TIX5.js → skills-page-SYOIGGXH.js} +1 -1
  251. package/dist/dashboard-web/chunks/{team-federation-page-NJZKTU7A.js → team-federation-page-RMBLASTW.js} +1 -1
  252. package/dist/dashboard-web/chunks/{v3-page-NQ73UA2Q.js → v3-page-XJXKKJRN.js} +1 -1
  253. package/dist/dashboard-web/chunks/{whiteboards-page-DSM3MDMN.js → whiteboards-page-K3YVSTHJ.js} +1 -1
  254. package/dist/dashboard-web/style.css +571 -3
  255. package/dist/dashboard.js +238 -9
  256. package/dist/dashboard.js.map +1 -1
  257. package/dist/global-config.d.ts +11 -0
  258. package/dist/global-config.d.ts.map +1 -1
  259. package/dist/global-config.js +27 -1
  260. package/dist/global-config.js.map +1 -1
  261. package/dist/i18n/en.d.ts.map +1 -1
  262. package/dist/i18n/en.js +6 -19
  263. package/dist/i18n/en.js.map +1 -1
  264. package/dist/i18n/zh.d.ts.map +1 -1
  265. package/dist/i18n/zh.js +6 -19
  266. package/dist/i18n/zh.js.map +1 -1
  267. package/dist/im/lark/card-builder.d.ts +1 -14
  268. package/dist/im/lark/card-builder.d.ts.map +1 -1
  269. package/dist/im/lark/card-builder.js +1 -35
  270. package/dist/im/lark/card-builder.js.map +1 -1
  271. package/dist/im/lark/card-handler.d.ts +10 -0
  272. package/dist/im/lark/card-handler.d.ts.map +1 -1
  273. package/dist/im/lark/card-handler.js +161 -44
  274. package/dist/im/lark/card-handler.js.map +1 -1
  275. package/dist/im/lark/client.d.ts +47 -0
  276. package/dist/im/lark/client.d.ts.map +1 -1
  277. package/dist/im/lark/client.js +127 -18
  278. package/dist/im/lark/client.js.map +1 -1
  279. package/dist/im/lark/event-dispatcher.d.ts +13 -0
  280. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  281. package/dist/im/lark/event-dispatcher.js +48 -3
  282. package/dist/im/lark/event-dispatcher.js.map +1 -1
  283. package/dist/im/lark/identity-cache.d.ts +25 -1
  284. package/dist/im/lark/identity-cache.d.ts.map +1 -1
  285. package/dist/im/lark/identity-cache.js +47 -1
  286. package/dist/im/lark/identity-cache.js.map +1 -1
  287. package/dist/im/lark/overload-nonce.d.ts +19 -0
  288. package/dist/im/lark/overload-nonce.d.ts.map +1 -0
  289. package/dist/im/lark/overload-nonce.js +72 -0
  290. package/dist/im/lark/overload-nonce.js.map +1 -0
  291. package/dist/im/lark/v3-progress-card.d.ts.map +1 -1
  292. package/dist/im/lark/v3-progress-card.js +5 -0
  293. package/dist/im/lark/v3-progress-card.js.map +1 -1
  294. package/dist/services/async-trigger-state.d.ts +82 -0
  295. package/dist/services/async-trigger-state.d.ts.map +1 -0
  296. package/dist/services/async-trigger-state.js +95 -0
  297. package/dist/services/async-trigger-state.js.map +1 -0
  298. package/dist/services/async-trigger-store.d.ts +28 -0
  299. package/dist/services/async-trigger-store.d.ts.map +1 -0
  300. package/dist/services/async-trigger-store.js +120 -0
  301. package/dist/services/async-trigger-store.js.map +1 -0
  302. package/dist/services/bot-config-store.d.ts.map +1 -1
  303. package/dist/services/bot-config-store.js +34 -2
  304. package/dist/services/bot-config-store.js.map +1 -1
  305. package/dist/services/bridge-fallback-gate.d.ts +32 -0
  306. package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
  307. package/dist/services/bridge-fallback-gate.js +39 -0
  308. package/dist/services/bridge-fallback-gate.js.map +1 -1
  309. package/dist/services/bridge-turn-queue.d.ts.map +1 -1
  310. package/dist/services/bridge-turn-queue.js +15 -1
  311. package/dist/services/bridge-turn-queue.js.map +1 -1
  312. package/dist/services/card-prefs-store.d.ts +4 -0
  313. package/dist/services/card-prefs-store.d.ts.map +1 -1
  314. package/dist/services/card-prefs-store.js +8 -0
  315. package/dist/services/card-prefs-store.js.map +1 -1
  316. package/dist/services/claude-transcript.d.ts +23 -0
  317. package/dist/services/claude-transcript.d.ts.map +1 -1
  318. package/dist/services/claude-transcript.js +33 -0
  319. package/dist/services/claude-transcript.js.map +1 -1
  320. package/dist/services/codex-app-runner-protocol.d.ts +61 -0
  321. package/dist/services/codex-app-runner-protocol.d.ts.map +1 -0
  322. package/dist/services/codex-app-runner-protocol.js +170 -0
  323. package/dist/services/codex-app-runner-protocol.js.map +1 -0
  324. package/dist/services/codex-app-turn-controller.d.ts +72 -0
  325. package/dist/services/codex-app-turn-controller.d.ts.map +1 -0
  326. package/dist/services/codex-app-turn-controller.js +524 -0
  327. package/dist/services/codex-app-turn-controller.js.map +1 -0
  328. package/dist/services/codex-runner-freshness.d.ts +39 -0
  329. package/dist/services/codex-runner-freshness.d.ts.map +1 -0
  330. package/dist/services/codex-runner-freshness.js +78 -0
  331. package/dist/services/codex-runner-freshness.js.map +1 -0
  332. package/dist/services/connector-store.d.ts +6 -0
  333. package/dist/services/connector-store.d.ts.map +1 -1
  334. package/dist/services/connector-store.js.map +1 -1
  335. package/dist/services/grant-store.d.ts.map +1 -1
  336. package/dist/services/grant-store.js +16 -0
  337. package/dist/services/grant-store.js.map +1 -1
  338. package/dist/services/hermes-transcript.d.ts +1 -0
  339. package/dist/services/hermes-transcript.d.ts.map +1 -1
  340. package/dist/services/hermes-transcript.js +49 -0
  341. package/dist/services/hermes-transcript.js.map +1 -1
  342. package/dist/services/sandbox-migration.d.ts +14 -0
  343. package/dist/services/sandbox-migration.d.ts.map +1 -0
  344. package/dist/services/sandbox-migration.js +85 -0
  345. package/dist/services/sandbox-migration.js.map +1 -0
  346. package/dist/services/sandbox-store.d.ts +28 -0
  347. package/dist/services/sandbox-store.d.ts.map +1 -1
  348. package/dist/services/sandbox-store.js +82 -0
  349. package/dist/services/sandbox-store.js.map +1 -1
  350. package/dist/services/schedule-split-migration.d.ts +2 -0
  351. package/dist/services/schedule-split-migration.d.ts.map +1 -0
  352. package/dist/services/schedule-split-migration.js +159 -0
  353. package/dist/services/schedule-split-migration.js.map +1 -0
  354. package/dist/services/schedule-store.d.ts +28 -4
  355. package/dist/services/schedule-store.d.ts.map +1 -1
  356. package/dist/services/schedule-store.js +118 -33
  357. package/dist/services/schedule-store.js.map +1 -1
  358. package/dist/services/trigger-types.d.ts +18 -1
  359. package/dist/services/trigger-types.d.ts.map +1 -1
  360. package/dist/services/trigger-types.js +3 -0
  361. package/dist/services/trigger-types.js.map +1 -1
  362. package/dist/services/vc-meeting-consumer-profile-store.d.ts.map +1 -1
  363. package/dist/services/vc-meeting-consumer-profile-store.js +1 -0
  364. package/dist/services/vc-meeting-consumer-profile-store.js.map +1 -1
  365. package/dist/services/vc-meeting-consumer-profile-templates.d.ts +32 -0
  366. package/dist/services/vc-meeting-consumer-profile-templates.d.ts.map +1 -0
  367. package/dist/services/vc-meeting-consumer-profile-templates.js +106 -0
  368. package/dist/services/vc-meeting-consumer-profile-templates.js.map +1 -0
  369. package/dist/services/vc-meeting-delivery-feed.d.ts +1 -1
  370. package/dist/services/vc-meeting-delivery-feed.d.ts.map +1 -1
  371. package/dist/services/vc-meeting-delivery-feed.js +2 -1
  372. package/dist/services/vc-meeting-delivery-feed.js.map +1 -1
  373. package/dist/services/vc-meeting-delivery-hub-store.d.ts +3 -1
  374. package/dist/services/vc-meeting-delivery-hub-store.d.ts.map +1 -1
  375. package/dist/services/vc-meeting-delivery-hub-store.js +11 -0
  376. package/dist/services/vc-meeting-delivery-hub-store.js.map +1 -1
  377. package/dist/services/vc-meeting-delivery-protocol.d.ts +9 -2
  378. package/dist/services/vc-meeting-delivery-protocol.d.ts.map +1 -1
  379. package/dist/services/vc-meeting-delivery-protocol.js +10 -1
  380. package/dist/services/vc-meeting-delivery-protocol.js.map +1 -1
  381. package/dist/services/vc-meeting-delivery-receiver.d.ts.map +1 -1
  382. package/dist/services/vc-meeting-delivery-receiver.js +10 -1
  383. package/dist/services/vc-meeting-delivery-receiver.js.map +1 -1
  384. package/dist/services/vc-meeting-delivery-store.d.ts +12 -2
  385. package/dist/services/vc-meeting-delivery-store.d.ts.map +1 -1
  386. package/dist/services/vc-meeting-delivery-store.js +14 -2
  387. package/dist/services/vc-meeting-delivery-store.js.map +1 -1
  388. package/dist/services/vc-meeting-im-reply.d.ts +2 -1
  389. package/dist/services/vc-meeting-im-reply.d.ts.map +1 -1
  390. package/dist/services/vc-meeting-im-reply.js +19 -3
  391. package/dist/services/vc-meeting-im-reply.js.map +1 -1
  392. package/dist/services/vc-meeting-listener-output-protocol.d.ts +27 -0
  393. package/dist/services/vc-meeting-listener-output-protocol.d.ts.map +1 -0
  394. package/dist/services/vc-meeting-listener-output-protocol.js +58 -0
  395. package/dist/services/vc-meeting-listener-output-protocol.js.map +1 -0
  396. package/dist/services/vc-meeting-listener-topic-store.d.ts +31 -0
  397. package/dist/services/vc-meeting-listener-topic-store.d.ts.map +1 -0
  398. package/dist/services/vc-meeting-listener-topic-store.js +120 -0
  399. package/dist/services/vc-meeting-listener-topic-store.js.map +1 -0
  400. package/dist/services/vc-meeting-runtime-store.d.ts +2 -1
  401. package/dist/services/vc-meeting-runtime-store.d.ts.map +1 -1
  402. package/dist/services/vc-meeting-runtime-store.js +8 -0
  403. package/dist/services/vc-meeting-runtime-store.js.map +1 -1
  404. package/dist/services/vc-meeting-send-policy.d.ts +8 -1
  405. package/dist/services/vc-meeting-send-policy.d.ts.map +1 -1
  406. package/dist/services/vc-meeting-send-policy.js +8 -0
  407. package/dist/services/vc-meeting-send-policy.js.map +1 -1
  408. package/dist/types.d.ts +53 -4
  409. package/dist/types.d.ts.map +1 -1
  410. package/dist/utils/allowed-users-apply.d.ts +76 -0
  411. package/dist/utils/allowed-users-apply.d.ts.map +1 -0
  412. package/dist/utils/allowed-users-apply.js +123 -0
  413. package/dist/utils/allowed-users-apply.js.map +1 -0
  414. package/dist/utils/allowed-users-cache.d.ts +29 -0
  415. package/dist/utils/allowed-users-cache.d.ts.map +1 -0
  416. package/dist/utils/allowed-users-cache.js +82 -0
  417. package/dist/utils/allowed-users-cache.js.map +1 -0
  418. package/dist/utils/child-env.d.ts +4 -3
  419. package/dist/utils/child-env.d.ts.map +1 -1
  420. package/dist/utils/child-env.js +16 -1
  421. package/dist/utils/child-env.js.map +1 -1
  422. package/dist/utils/cli-usage-limit.d.ts +27 -1
  423. package/dist/utils/cli-usage-limit.d.ts.map +1 -1
  424. package/dist/utils/cli-usage-limit.js +92 -20
  425. package/dist/utils/cli-usage-limit.js.map +1 -1
  426. package/dist/utils/input-gate.d.ts +2 -0
  427. package/dist/utils/input-gate.d.ts.map +1 -1
  428. package/dist/utils/input-gate.js +2 -0
  429. package/dist/utils/input-gate.js.map +1 -1
  430. package/dist/utils/runtime-build-id.d.ts +21 -0
  431. package/dist/utils/runtime-build-id.d.ts.map +1 -0
  432. package/dist/utils/runtime-build-id.js +83 -0
  433. package/dist/utils/runtime-build-id.js.map +1 -0
  434. package/dist/utils/terminal-renderer.d.ts +3 -3
  435. package/dist/utils/terminal-renderer.js +3 -3
  436. package/dist/vc-agent/cards.d.ts.map +1 -1
  437. package/dist/vc-agent/cards.js +21 -1
  438. package/dist/vc-agent/cards.js.map +1 -1
  439. package/dist/worker.js +1010 -669
  440. package/dist/worker.js.map +1 -1
  441. package/dist/workflows/events/payloads.d.ts +56 -0
  442. package/dist/workflows/events/payloads.d.ts.map +1 -1
  443. package/dist/workflows/events/payloads.js +9 -0
  444. package/dist/workflows/events/payloads.js.map +1 -1
  445. package/dist/workflows/events/schema.d.ts +86 -0
  446. package/dist/workflows/events/schema.d.ts.map +1 -1
  447. package/dist/workflows/hostExecutors/botmux-schedule.d.ts.map +1 -1
  448. package/dist/workflows/hostExecutors/botmux-schedule.js +13 -1
  449. package/dist/workflows/hostExecutors/botmux-schedule.js.map +1 -1
  450. package/dist/workflows/migration/v2-run-archive-schema.d.ts +20 -20
  451. package/dist/workflows/migration/v2-to-v3.d.ts.map +1 -1
  452. package/dist/workflows/migration/v2-to-v3.js +5 -1
  453. package/dist/workflows/migration/v2-to-v3.js.map +1 -1
  454. package/dist/workflows/shared/sandbox-policy.d.ts +10 -1
  455. package/dist/workflows/shared/sandbox-policy.d.ts.map +1 -1
  456. package/dist/workflows/shared/sandbox-policy.js +12 -0
  457. package/dist/workflows/shared/sandbox-policy.js.map +1 -1
  458. package/dist/workflows/v3/architect.d.ts.map +1 -1
  459. package/dist/workflows/v3/architect.js +1 -0
  460. package/dist/workflows/v3/architect.js.map +1 -1
  461. package/dist/workflows/v3/bot-resolve.d.ts.map +1 -1
  462. package/dist/workflows/v3/bot-resolve.js +36 -0
  463. package/dist/workflows/v3/bot-resolve.js.map +1 -1
  464. package/dist/workflows/v3/cli-run.d.ts +9 -0
  465. package/dist/workflows/v3/cli-run.d.ts.map +1 -1
  466. package/dist/workflows/v3/cli-run.js +17 -2
  467. package/dist/workflows/v3/cli-run.js.map +1 -1
  468. package/dist/workflows/v3/contract.d.ts +8 -0
  469. package/dist/workflows/v3/contract.d.ts.map +1 -1
  470. package/dist/workflows/v3/contract.js.map +1 -1
  471. package/dist/workflows/v3/goal-cli.d.ts +58 -0
  472. package/dist/workflows/v3/goal-cli.d.ts.map +1 -0
  473. package/dist/workflows/v3/goal-cli.js +430 -0
  474. package/dist/workflows/v3/goal-cli.js.map +1 -0
  475. package/dist/workflows/v3/library-materialize.d.ts.map +1 -1
  476. package/dist/workflows/v3/library-materialize.js +5 -1
  477. package/dist/workflows/v3/library-materialize.js.map +1 -1
  478. package/dist/workflows/v3/library-schema.d.ts +21 -0
  479. package/dist/workflows/v3/library-schema.d.ts.map +1 -1
  480. package/dist/workflows/v3/library-schema.js +95 -1
  481. package/dist/workflows/v3/library-schema.js.map +1 -1
  482. package/dist/workflows/v3/progress-projection.d.ts +3 -0
  483. package/dist/workflows/v3/progress-projection.d.ts.map +1 -1
  484. package/dist/workflows/v3/progress-projection.js +23 -1
  485. package/dist/workflows/v3/progress-projection.js.map +1 -1
  486. package/dist/workflows/v3/run-envelope.d.ts +46 -1
  487. package/dist/workflows/v3/run-envelope.d.ts.map +1 -1
  488. package/dist/workflows/v3/run-envelope.js +32 -1
  489. package/dist/workflows/v3/run-envelope.js.map +1 -1
  490. package/package.json +2 -2
  491. package/dist/dashboard-web/chunks/bot-defaults-page-O376WSER.js +0 -5
  492. package/dist/dashboard-web/chunks/chunk-H7P5UV4W.js +0 -49
  493. package/dist/dashboard-web/chunks/chunk-SZOB6VK2.js +0 -1
  494. package/dist/dashboard-web/chunks/connectors-page-IR54AOAI.js +0 -1
  495. package/dist/dashboard-web/chunks/overview-page-QJMI6NLW.js +0 -1
  496. package/dist/dashboard-web/chunks/sessions-page-KWLGBX6G.js +0 -3
  497. package/dist/dashboard-web/chunks/settings-page-TNZEPC7V.js +0 -2
  498. package/dist/services/sandbox-land.d.ts +0 -45
  499. package/dist/services/sandbox-land.d.ts.map +0 -1
  500. package/dist/services/sandbox-land.js +0 -394
  501. package/dist/services/sandbox-land.js.map +0 -1
  502. package/dist/utils/screen-analyzer.d.ts +0 -75
  503. package/dist/utils/screen-analyzer.d.ts.map +0 -1
  504. package/dist/utils/screen-analyzer.js +0 -333
  505. package/dist/utils/screen-analyzer.js.map +0 -1
@@ -1,45 +0,0 @@
1
- import { type Locale } from '../i18n/index.js';
2
- export interface LandDiff {
3
- ok: true;
4
- empty: boolean;
5
- patch: string;
6
- statText: string;
7
- files: number;
8
- insertions: number;
9
- deletions: number;
10
- }
11
- export interface LandError {
12
- ok: false;
13
- error: string;
14
- }
15
- /** Locate the project overlay UPPER dir (= SandboxSpawn.workDir) for a session. */
16
- export declare function upperDir(dataDir: string, sessionId: string): string;
17
- /**
18
- * Compute the agent's changeset from the session's overlay upper layer, with a
19
- * human-readable preview (per-file `git diff --no-index` vs the real project).
20
- */
21
- export declare function computeSandboxDiff(dataDir: string, sessionId: string, locale?: Locale): LandDiff | LandError;
22
- /**
23
- * Apply the session's overlay upper changeset onto the real target project:
24
- * - regular file in upper → mkdir -p parent, copy over the real file
25
- * - symlink in upper → recreate the link (NOT a dereferenced copy)
26
- * - whiteout → remove the corresponding real file/dir
27
- * - opaque dir → only when the dir ALSO exists in the target (= a
28
- * wholesale replace): drop the stale lower contents,
29
- * then re-create it (its surviving files arrive as
30
- * separate 'file'/'symlink' changes). A purely-new
31
- * opaque dir is just mkdir'd (never rm -rf'd).
32
- *
33
- * Two-phase for safety:
34
- * 1) PRE-VALIDATE every source is landable (dangling symlink, unreadable regular
35
- * file, undeterminable opacity on a dir that exists in the target) BEFORE we
36
- * mutate anything — so the common mid-loop failure (a dangling relative
37
- * symlink) is caught up front and the real project is left untouched.
38
- * 2) APPLY; if a per-file op still throws (race / permission / ENOSPC), we
39
- * report which files were already applied so the owner isn't told "failed"
40
- * with the repo silently half-landed and no clue about its state.
41
- */
42
- export declare function applySandboxDiff(targetDir: string, dataDir: string, sessionId: string, locale?: Locale): {
43
- ok: true;
44
- } | LandError;
45
- //# sourceMappingURL=sandbox-land.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sandbox-land.d.ts","sourceRoot":"","sources":["../../src/services/sandbox-land.ts"],"names":[],"mappings":"AA4BA,OAAO,EAAK,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAUlD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,IAAI,CAAC;IACT,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,SAAS;IAAG,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAavD,mFAAmF;AACnF,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEnE;AAmGD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CA+E5G;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG,SAAS,CAwFjI"}
@@ -1,394 +0,0 @@
1
- /**
2
- * Sandbox landing (overlayfs model): the project overlay UPPER dir IS the
3
- * changeset the sandboxed agent produced. We compute a human-readable diff from
4
- * it (preview/patch via `git diff --no-index` against the real project), and on
5
- * the owner's confirmation copy the changed files back into the real project.
6
- *
7
- * The agent in the sandbox is oblivious it's overlaid — it thinks it edits the
8
- * real files. So landing is owner-triggered only (the `/land` command or the
9
- * dashboard button), never by the agent.
10
- *
11
- * Upper-layer semantics (overlayfs):
12
- * - a regular file in upper → a new-or-modified file
13
- * - a symlink in upper → a symlink the agent created/changed
14
- * - a character device with rdev 0 → a WHITEOUT (the agent deleted the file)
15
- * - a dir with xattr trusted.overlay.opaque=y → the dir's lower contents are
16
- * hidden. NOTE: overlayfs sets this xattr on BOTH a freshly-created dir AND a
17
- * wholesale-replaced dir, so opacity ALONE cannot tell "new" from "replaced".
18
- * The real discriminator is whether the dir also exists in the lower (= the
19
- * target). We therefore only treat an opaque dir as a wholesale REPLACE (drop
20
- * the lower's stale contents) when it ALSO exists in the target; a purely-new
21
- * opaque dir is just mkdir'd — never rm -rf'd over unrelated real files.
22
- */
23
- import { spawnSync } from 'node:child_process';
24
- import { existsSync, readdirSync, lstatSync, copyFileSync, mkdirSync, rmSync, readFileSync, readlinkSync, symlinkSync, unlinkSync, realpathSync, } from 'node:fs';
25
- import { join, dirname, relative, resolve } from 'node:path';
26
- import { t } from '../i18n/index.js';
27
- /** Canonicalize dataDir the same way prepareSandbox does: the sandbox tree is
28
- * created under the CANONICAL dataDir, so a symlink `config.session.dataDir`
29
- * would otherwise make `/land` / diff / patch look under the wrong path and
30
- * find no changeset. Best-effort — falls back to a plain normalize. */
31
- function canonicalDataDir(dataDir) {
32
- try {
33
- return realpathSync(dataDir);
34
- }
35
- catch {
36
- return resolve(dataDir);
37
- }
38
- }
39
- /** Locate the project overlay UPPER dir (= SandboxSpawn.workDir) for a session. */
40
- export function upperDir(dataDir, sessionId) {
41
- return join(canonicalDataDir(dataDir), 'sandboxes', sessionId, 'proj-upper');
42
- }
43
- /**
44
- * The project LOWER source recorded by prepareSandbox at create time (meta.json).
45
- * Used to tell a wholesale-REPLACED opaque dir (existed in the lower) from a
46
- * purely-NEW opaque dir (didn't) — overlayfs marks BOTH opaque, so the lower is
47
- * the only reliable discriminator, and the LIVE landing target may have drifted
48
- * (concurrent work) so we must NOT use it for this. Returns '' when unknown
49
- * (older session / meta missing) → callers fall back to the target.
50
- */
51
- function projectLower(dataDir, sessionId) {
52
- try {
53
- const meta = JSON.parse(readFileSync(join(canonicalDataDir(dataDir), 'sandboxes', sessionId, 'meta.json'), 'utf8'));
54
- return typeof meta?.projectLower === 'string' ? meta.projectLower : '';
55
- }
56
- catch {
57
- return '';
58
- }
59
- }
60
- /** True if a path is an overlayfs whiteout (char device, rdev 0). */
61
- function isWhiteout(p) {
62
- try {
63
- const st = lstatSync(p);
64
- return st.isCharacterDevice() && st.rdev === 0;
65
- }
66
- catch {
67
- return false;
68
- }
69
- }
70
- /**
71
- * Read the overlay opaque xattr for a dir.
72
- * - 'y' → the dir is opaque
73
- * - '' → the dir is present and NOT opaque (xattr absent)
74
- * - null → could NOT determine (no xattr tooling available / read failed)
75
- *
76
- * `getfattr` is provided by the `attr` package and is frequently NOT installed;
77
- * `trusted.overlay.*` also requires CAP_SYS_ADMIN to read (we run as root). We
78
- * try getfattr first, then python3's os.getxattr (commonly present), and return
79
- * null when neither can answer — callers must NOT silently treat null as "not
80
- * opaque" (that would leak stale lower files); they fail-closed where it matters.
81
- */
82
- function readOpaqueXattr(p) {
83
- // getfattr (attr package). --only-values prints just the value; ENOATTR → exit≠0.
84
- const gf = spawnSync('getfattr', ['-n', 'trusted.overlay.opaque', '--only-values', '-h', p], { encoding: 'utf8' });
85
- if (gf.error == null && typeof gf.status === 'number') {
86
- if (gf.status === 0)
87
- return (gf.stdout ?? '').trim() === 'y' ? 'y' : '';
88
- // exit≠0 with stderr mentioning "No such attribute"/ENOATTR → present, not opaque.
89
- const se = (gf.stderr ?? '').toLowerCase();
90
- if (se.includes('no such attribute') || se.includes('enoattr') || se.includes('not found'))
91
- return '';
92
- // other failure (e.g. permission) → fall through to python.
93
- }
94
- // python3's os.getxattr — exit 0 + 'y' on stdout when opaque; exit 0 + '' when
95
- // the attr is absent; exit 2 only if python itself is unavailable.
96
- const py = spawnSync('python3', [
97
- '-c',
98
- "import os,sys\n" +
99
- "try:\n" +
100
- " v=os.getxattr(sys.argv[1],'trusted.overlay.opaque')\n" +
101
- " sys.stdout.write(v.decode('latin1','replace'))\n" +
102
- "except OSError as e:\n" +
103
- " import errno\n" +
104
- " sys.exit(0) if e.errno in (errno.ENODATA,errno.ENOATTR if hasattr(errno,'ENOATTR') else errno.ENODATA) else sys.exit(3)\n",
105
- p,
106
- ], { encoding: 'utf8' });
107
- if (py.error == null && py.status === 0)
108
- return (py.stdout ?? '').trim() === 'y' ? 'y' : '';
109
- return null; // undeterminable
110
- }
111
- /** Walk the upper layer, classifying every entry into an UpperChange. */
112
- function walkUpper(upper) {
113
- const changes = [];
114
- const recurse = (dir) => {
115
- let entries = [];
116
- try {
117
- entries = readdirSync(dir);
118
- }
119
- catch {
120
- return;
121
- }
122
- for (const name of entries) {
123
- const full = join(dir, name);
124
- const rel = relative(upper, full);
125
- if (isWhiteout(full)) {
126
- changes.push({ rel, kind: 'delete' });
127
- continue;
128
- }
129
- let st;
130
- try {
131
- st = lstatSync(full);
132
- }
133
- catch {
134
- continue;
135
- }
136
- if (st.isSymbolicLink()) {
137
- // A symlink is landed as a symlink (NOT dereferenced into a content copy,
138
- // which would destroy the link and could snapshot out-of-tree host data).
139
- let linkTarget = '';
140
- try {
141
- linkTarget = readlinkSync(full);
142
- }
143
- catch { /* */ }
144
- changes.push({ rel, kind: 'symlink', linkTarget });
145
- }
146
- else if (st.isDirectory()) {
147
- // Opacity is recorded; the new-vs-replace decision is deferred to apply
148
- // (where the target — the lower — is known). Either way we recurse so the
149
- // dir's surviving children land as their own 'file'/'symlink' changes.
150
- const opaque = readOpaqueXattr(full);
151
- if (opaque === 'y' || opaque === null)
152
- changes.push({ rel, kind: 'opaque' });
153
- recurse(full);
154
- }
155
- else if (st.isFile()) {
156
- changes.push({ rel, kind: 'file' });
157
- }
158
- // other special files (fifos/sockets/non-whiteout devices) are skipped.
159
- }
160
- };
161
- recurse(upper);
162
- return changes;
163
- }
164
- /**
165
- * Compute the agent's changeset from the session's overlay upper layer, with a
166
- * human-readable preview (per-file `git diff --no-index` vs the real project).
167
- */
168
- export function computeSandboxDiff(dataDir, sessionId, locale) {
169
- const upper = upperDir(dataDir, sessionId);
170
- if (!existsSync(upper))
171
- return { ok: false, error: t('sandbox.no_clone', undefined, locale) };
172
- let changes;
173
- try {
174
- changes = walkUpper(upper);
175
- }
176
- catch (e) {
177
- return { ok: false, error: t('sandbox.diff_failed', { detail: (e?.message ?? e).toString().slice(0, 300) }, locale) };
178
- }
179
- if (changes.length === 0) {
180
- return { ok: true, empty: true, patch: '', statText: '', files: 0, insertions: 0, deletions: 0 };
181
- }
182
- // Diff each upper file against the SAME-NAMED real file in the overlay lower
183
- // (the recorded project root) so modified files show a true unified diff (not
184
- // the whole file as "added"), then rewrite git's --no-index headers to
185
- // project-relative a/<rel> b/<rel> — clean for the card AND `git apply`-able as
186
- // the .patch file. New files diff vs /dev/null; deletions diff lower vs /dev/null.
187
- const lower = projectLower(dataDir, sessionId); // real project root ('' if unknown)
188
- const relDiff = (oldPath, newPath, rel) => {
189
- let out = '';
190
- try {
191
- out = spawnSync('git', ['diff', '--no-index', '--', oldPath, newPath], { encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 }).stdout ?? '';
192
- }
193
- catch { /* */ }
194
- if (!out)
195
- return '';
196
- return out.split('\n').map(line => {
197
- if (line.startsWith('diff --git '))
198
- return `diff --git a/${rel} b/${rel}`;
199
- if (line.startsWith('--- '))
200
- return line.includes('/dev/null') ? '--- /dev/null' : `--- a/${rel}`;
201
- if (line.startsWith('+++ '))
202
- return line.includes('/dev/null') ? '+++ /dev/null' : `+++ b/${rel}`;
203
- return line;
204
- }).join('\n');
205
- };
206
- const countPlus = (b) => b.split('\n').filter(l => l.startsWith('+') && !l.startsWith('+++')).length;
207
- const countMinus = (b) => b.split('\n').filter(l => l.startsWith('-') && !l.startsWith('---')).length;
208
- const statLines = [];
209
- const patchParts = [];
210
- let insertions = 0, deletions = 0, fileCount = 0;
211
- for (const c of changes) {
212
- if (c.kind === 'delete') {
213
- const lowFile = lower ? join(lower, c.rel) : '';
214
- const body = (lowFile && existsSync(lowFile))
215
- ? relDiff(lowFile, '/dev/null', c.rel)
216
- : `diff --git a/${c.rel} b/${c.rel}\ndeleted file\n--- a/${c.rel}\n+++ /dev/null\n`;
217
- statLines.push(`D ${c.rel}`);
218
- deletions += countMinus(body) || 1;
219
- patchParts.push(body);
220
- fileCount++;
221
- continue;
222
- }
223
- if (c.kind === 'symlink') {
224
- statLines.push(`L ${c.rel} -> ${c.linkTarget ?? ''}`);
225
- patchParts.push(`# symlink ${c.rel} -> ${c.linkTarget ?? ''} (recreated on land; not in this text patch)`);
226
- fileCount++;
227
- continue;
228
- }
229
- if (c.kind === 'opaque') {
230
- // Replaced directory; its surviving children land as their own 'file'
231
- // changes (walkUpper recursed), so no diff body here — just note it.
232
- statLines.push(`R ${c.rel}/ (directory replaced)`);
233
- continue;
234
- }
235
- // regular file: modified (exists in lower) vs new
236
- const upPath = join(upper, c.rel);
237
- const lowFile = lower ? join(lower, c.rel) : '';
238
- const isMod = !!(lowFile && existsSync(lowFile));
239
- const body = relDiff(isMod ? lowFile : '/dev/null', upPath, c.rel)
240
- || `diff --git a/${c.rel} b/${c.rel}\n(binary or unreadable: ${c.rel})\n`;
241
- statLines.push(`${isMod ? 'M' : 'A'} ${c.rel}`);
242
- insertions += countPlus(body);
243
- deletions += countMinus(body);
244
- patchParts.push(body);
245
- fileCount++;
246
- }
247
- return {
248
- ok: true,
249
- empty: false,
250
- patch: patchParts.join('\n'),
251
- statText: statLines.join('\n'),
252
- files: fileCount,
253
- insertions,
254
- deletions,
255
- };
256
- }
257
- /**
258
- * Apply the session's overlay upper changeset onto the real target project:
259
- * - regular file in upper → mkdir -p parent, copy over the real file
260
- * - symlink in upper → recreate the link (NOT a dereferenced copy)
261
- * - whiteout → remove the corresponding real file/dir
262
- * - opaque dir → only when the dir ALSO exists in the target (= a
263
- * wholesale replace): drop the stale lower contents,
264
- * then re-create it (its surviving files arrive as
265
- * separate 'file'/'symlink' changes). A purely-new
266
- * opaque dir is just mkdir'd (never rm -rf'd).
267
- *
268
- * Two-phase for safety:
269
- * 1) PRE-VALIDATE every source is landable (dangling symlink, unreadable regular
270
- * file, undeterminable opacity on a dir that exists in the target) BEFORE we
271
- * mutate anything — so the common mid-loop failure (a dangling relative
272
- * symlink) is caught up front and the real project is left untouched.
273
- * 2) APPLY; if a per-file op still throws (race / permission / ENOSPC), we
274
- * report which files were already applied so the owner isn't told "failed"
275
- * with the repo silently half-landed and no clue about its state.
276
- */
277
- export function applySandboxDiff(targetDir, dataDir, sessionId, locale) {
278
- const upper = upperDir(dataDir, sessionId);
279
- if (!existsSync(upper))
280
- return { ok: false, error: t('sandbox.no_clone', undefined, locale) };
281
- if (!existsSync(targetDir))
282
- return { ok: false, error: t('sandbox.target_not_git', { dir: targetDir }, locale) };
283
- let changes;
284
- try {
285
- changes = walkUpper(upper);
286
- }
287
- catch (e) {
288
- return { ok: false, error: t('sandbox.apply_failed', { detail: (e?.message ?? e).toString().slice(0, 300) }, locale) };
289
- }
290
- if (changes.length === 0)
291
- return { ok: false, error: t('sandbox.nothing_to_land', undefined, locale) };
292
- // Project LOWER (create-time) — the reliable new-vs-replace discriminator for
293
- // opaque dirs; '' when unknown → fall back to the live target.
294
- const lower = projectLower(dataDir, sessionId);
295
- // Does dir `rel` count as a REPLACE (existed in the lower) vs a fresh NEW dir?
296
- const existedInLower = (rel) => lower ? existsSync(join(lower, rel)) : existsSync(join(targetDir, rel));
297
- // ── Phase 1: pre-validate — fail-closed BEFORE any mutation ────────────────
298
- const preErrors = [];
299
- for (const c of changes) {
300
- if (c.kind === 'file') {
301
- const src = join(upper, c.rel);
302
- // Resolve via lstat: a regular file must be readable; a broken/special src
303
- // would make the in-loop copyFileSync throw mid-land. Catch it now.
304
- try {
305
- lstatSync(src);
306
- }
307
- catch (e) {
308
- preErrors.push(`${c.rel}: source missing (${e?.code ?? e})`);
309
- }
310
- }
311
- else if (c.kind === 'symlink') {
312
- if (!c.linkTarget)
313
- preErrors.push(`${c.rel}: unreadable symlink target`);
314
- }
315
- else if (c.kind === 'opaque') {
316
- // Only an opaque dir that existed in the LOWER triggers a destructive
317
- // rm -rf (a wholesale replace). For such a dir, if we could NOT determine
318
- // opacity (readOpaqueXattr → null, no xattr tooling) we MUST NOT guess
319
- // "not opaque" (that leaks stale lower files); fail-closed with a clear
320
- // message. A purely-NEW opaque dir needs no opacity read at all.
321
- if (existedInLower(c.rel)) {
322
- const opaque = readOpaqueXattr(join(upper, c.rel));
323
- if (opaque === null) {
324
- preErrors.push(`${c.rel}/: cannot determine overlay opacity (install the "attr" package, i.e. getfattr) — refusing to land a possibly-replaced directory without knowing whether to drop its stale contents`);
325
- }
326
- }
327
- }
328
- }
329
- if (preErrors.length > 0) {
330
- return { ok: false, error: t('sandbox.apply_failed', { detail: `pre-flight (no changes applied): ${preErrors.slice(0, 8).join('; ').slice(0, 380)}` }, locale) };
331
- }
332
- // ── Phase 2: apply ─────────────────────────────────────────────────────────
333
- const applied = [];
334
- try {
335
- for (const c of changes) {
336
- const real = join(targetDir, c.rel);
337
- if (c.kind === 'delete') {
338
- try {
339
- rmSync(real, { recursive: true, force: true });
340
- }
341
- catch { /* already gone */ }
342
- applied.push(`-${c.rel}`);
343
- continue;
344
- }
345
- if (c.kind === 'opaque') {
346
- // Wholesale REPLACE only when the dir existed in the LOWER (create-time)
347
- // — drop its stale contents. A purely-NEW opaque dir is just mkdir'd, so
348
- // we never rm -rf unrelated real files that drifted into the live target
349
- // under a path the agent merely created fresh (the new-dir clobber).
350
- if (existedInLower(c.rel) && existsSync(real)) {
351
- try {
352
- rmSync(real, { recursive: true, force: true });
353
- }
354
- catch { /* */ }
355
- }
356
- mkdirSync(real, { recursive: true });
357
- applied.push(`R ${c.rel}/`);
358
- continue;
359
- }
360
- if (c.kind === 'symlink') {
361
- // Recreate the link verbatim (preserve symlink-ness; do NOT dereference).
362
- mkdirSync(dirname(real), { recursive: true });
363
- try {
364
- unlinkSync(real);
365
- }
366
- catch { /* not present */ }
367
- try {
368
- rmSync(real, { recursive: true, force: true });
369
- }
370
- catch { /* was a dir */ }
371
- symlinkSync(c.linkTarget ?? '', real);
372
- applied.push(`L ${c.rel}`);
373
- continue;
374
- }
375
- // regular file: copy the upper content over the real file.
376
- mkdirSync(dirname(real), { recursive: true });
377
- // If a symlink/dir is squatting the target path, clear it first so copy lands a file.
378
- try {
379
- const st = lstatSync(real);
380
- if (st.isSymbolicLink() || st.isDirectory())
381
- rmSync(real, { recursive: true, force: true });
382
- }
383
- catch { /* */ }
384
- copyFileSync(join(upper, c.rel), real);
385
- applied.push(c.rel);
386
- }
387
- return { ok: true };
388
- }
389
- catch (e) {
390
- const detail = `${(e?.message ?? e).toString().slice(0, 240)} — already applied (${applied.length}): ${applied.slice(0, 12).join(', ').slice(0, 200)}`;
391
- return { ok: false, error: t('sandbox.apply_failed', { detail }, locale) };
392
- }
393
- }
394
- //# sourceMappingURL=sandbox-land.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sandbox-land.js","sourceRoot":"","sources":["../../src/services/sandbox-land.ts"],"names":[],"mappings":"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"}
@@ -1,75 +0,0 @@
1
- /**
2
- * AI-powered screen analyzer — detects interactive TUI prompts in terminal output
3
- * by sending snapshots to a lightweight LLM and parsing structured responses.
4
- *
5
- * Token-saving protocol:
6
- * 1. Text diff — skip if snapshot unchanged
7
- * 2. Cumulative stability — require N consecutive unchanged snapshots
8
- * 3. AI-driven cooldown — AI returns checkAgainWhen to control re-call timing
9
- * 4. Prompt-active guard — stop calling AI once a prompt is reported, until resolved
10
- */
11
- export interface ScreenAnalyzerConfig {
12
- baseUrl: string;
13
- apiKey: string;
14
- model: string;
15
- intervalMs: number;
16
- stableCount: number;
17
- snapshotMaxChars: number;
18
- extraHeaders?: Record<string, string>;
19
- extraBody?: Record<string, unknown>;
20
- }
21
- export interface TuiPromptOption {
22
- label: string;
23
- text: string;
24
- selected: boolean;
25
- type: 'select' | 'toggle' | 'confirm' | 'input';
26
- index: number;
27
- }
28
- export interface ScreenAnalysis {
29
- needsInteraction: boolean;
30
- description?: string;
31
- options?: TuiPromptOption[];
32
- multiSelect?: boolean;
33
- toggleKey?: string;
34
- confirmKey?: string;
35
- checkAgainWhen: 'content_changed' | 'after_5s' | 'after_10s' | 'not_needed';
36
- }
37
- export interface ScreenAnalyzerCallbacks {
38
- getSnapshot: () => string;
39
- onAnalyzing: () => void;
40
- onTuiPrompt: (description: string, options: TuiPromptOption[], multiSelect: boolean) => void;
41
- onTuiPromptResolved: (selectedText?: string) => void;
42
- log: (msg: string) => void;
43
- }
44
- /** Remove survey lines (plus the option row that follows each) from a snapshot.
45
- * The survey banner is RESIDENT — it stays on screen for the whole session
46
- * until dismissed. Matching the WHOLE snapshot against it used to veto every
47
- * analysis, which blinded the analyzer to real prompts sharing the screen
48
- * (e.g. AskUserQuestion rendered above a survey banner was never detected).
49
- * Stripping the survey's own lines keeps it invisible to the AI without
50
- * suppressing anything else. */
51
- export declare function stripOptionalSurveyLines(text: string): string;
52
- export declare class ScreenAnalyzer {
53
- private config;
54
- private callbacks;
55
- private timer;
56
- private lastSnapshot;
57
- private stableCount;
58
- private lastAnalyzedSnapshot;
59
- private waitingForContentChange;
60
- private timerCooldownUntil;
61
- private promptActive;
62
- private _analyzing;
63
- private disposed;
64
- constructor(config: ScreenAnalyzerConfig, callbacks: ScreenAnalyzerCallbacks);
65
- /** Whether an AI call is currently in flight */
66
- get isAnalyzing(): boolean;
67
- start(): void;
68
- dispose(): void;
69
- /** Called externally when user has made a selection via card click */
70
- notifySelection(selectedText: string): void;
71
- private tick;
72
- private analyze;
73
- private callAI;
74
- }
75
- //# sourceMappingURL=screen-analyzer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"screen-analyzer.d.ts","sourceRoot":"","sources":["../../src/utils/screen-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;IAChD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,iBAAiB,GAAG,UAAU,GAAG,WAAW,GAAG,YAAY,CAAC;CAC7E;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,WAAW,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,WAAW,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7F,mBAAmB,EAAE,CAAC,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B;AA4ED;;;;;;iCAMiC;AACjC,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAY7D;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,KAAK,CAA+C;IAG5D,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,WAAW,CAAK;IAGxB,OAAO,CAAC,oBAAoB,CAAM;IAClC,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,kBAAkB,CAAK;IAG/B,OAAO,CAAC,YAAY,CAAS;IAG7B,OAAO,CAAC,UAAU,CAAS;IAG3B,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,oBAAoB,EAAE,SAAS,EAAE,uBAAuB;IAK5E,gDAAgD;IAChD,IAAI,WAAW,IAAI,OAAO,CAA4B;IAEtD,KAAK,IAAI,IAAI;IAMb,OAAO,IAAI,IAAI;IAQf,sEAAsE;IACtE,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;YAU7B,IAAI;YAgDJ,OAAO;YA+EP,MAAM;CA6DrB"}