smol-symphony 0.2.0 → 0.3.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 (716) hide show
  1. package/AGENTS.md +41 -22
  2. package/DESIGN.md +494 -273
  3. package/README.md +109 -57
  4. package/SPEC.md +33 -24
  5. package/WORKFLOW.minimal.yaml +34 -0
  6. package/{WORKFLOW.template.md → WORKFLOW.template.yaml} +409 -256
  7. package/WORKFLOW.yaml +487 -0
  8. package/assets/skills/symphony-issues/SKILL.md +136 -0
  9. package/assets/symphony-mise.system.toml +68 -0
  10. package/dist/src/bin/symphony.js +30 -0
  11. package/dist/src/bin/symphony.js.map +1 -0
  12. package/dist/src/core/actions/context.js +109 -0
  13. package/dist/src/core/actions/context.js.map +1 -0
  14. package/dist/{actions/parsing.js → src/core/actions/parse.js} +33 -114
  15. package/dist/src/core/actions/parse.js.map +1 -0
  16. package/dist/src/core/actions/plan.js +197 -0
  17. package/dist/src/core/actions/plan.js.map +1 -0
  18. package/dist/src/core/actions/predicates.js +111 -0
  19. package/dist/src/core/actions/predicates.js.map +1 -0
  20. package/dist/src/core/actions/run-fold.js +248 -0
  21. package/dist/src/core/actions/run-fold.js.map +1 -0
  22. package/dist/src/core/actions/template.js +118 -0
  23. package/dist/src/core/actions/template.js.map +1 -0
  24. package/dist/src/core/cli/args.js +116 -0
  25. package/dist/src/core/cli/args.js.map +1 -0
  26. package/dist/src/core/coerce.js +75 -0
  27. package/dist/src/core/coerce.js.map +1 -0
  28. package/dist/src/core/credential/account-id.js +20 -0
  29. package/dist/src/core/credential/account-id.js.map +1 -0
  30. package/dist/src/core/credential/adapter-config.js +136 -0
  31. package/dist/src/core/credential/adapter-config.js.map +1 -0
  32. package/dist/src/core/credential/availability.js +98 -0
  33. package/dist/src/core/credential/availability.js.map +1 -0
  34. package/dist/src/core/credential/extract.js +228 -0
  35. package/dist/src/core/credential/extract.js.map +1 -0
  36. package/dist/src/core/credential/fake-creds.js +171 -0
  37. package/dist/src/core/credential/fake-creds.js.map +1 -0
  38. package/dist/src/core/credential/identity.js +125 -0
  39. package/dist/src/core/credential/identity.js.map +1 -0
  40. package/dist/src/core/credential/shape.js +230 -0
  41. package/dist/src/core/credential/shape.js.map +1 -0
  42. package/dist/src/core/credential/strings.js +15 -0
  43. package/dist/src/core/credential/strings.js.map +1 -0
  44. package/dist/src/core/doctor/checks.js +303 -0
  45. package/dist/src/core/doctor/checks.js.map +1 -0
  46. package/dist/src/core/git/result.js +107 -0
  47. package/dist/src/core/git/result.js.map +1 -0
  48. package/dist/src/core/http/decisions.js +225 -0
  49. package/dist/src/core/http/decisions.js.map +1 -0
  50. package/dist/{http.js → src/core/http/render.js} +472 -738
  51. package/dist/src/core/http/render.js.map +1 -0
  52. package/dist/{http-handlers.js → src/core/http/routes.js} +52 -87
  53. package/dist/src/core/http/routes.js.map +1 -0
  54. package/dist/src/core/http/views.js +181 -0
  55. package/dist/src/core/http/views.js.map +1 -0
  56. package/dist/src/core/image/managed-image.js +95 -0
  57. package/dist/src/core/image/managed-image.js.map +1 -0
  58. package/dist/src/core/issue/file.js +149 -0
  59. package/dist/src/core/issue/file.js.map +1 -0
  60. package/dist/src/core/issue/parse.js +210 -0
  61. package/dist/src/core/issue/parse.js.map +1 -0
  62. package/dist/src/core/mcp/dispatch.js +239 -0
  63. package/dist/src/core/mcp/dispatch.js.map +1 -0
  64. package/dist/src/core/mcp/post-move.js +92 -0
  65. package/dist/src/core/mcp/post-move.js.map +1 -0
  66. package/dist/src/core/mcp/protocol.js +293 -0
  67. package/dist/src/core/mcp/protocol.js.map +1 -0
  68. package/dist/src/core/mcp/url.js +162 -0
  69. package/dist/src/core/mcp/url.js.map +1 -0
  70. package/dist/src/core/path.js +63 -0
  71. package/dist/src/core/path.js.map +1 -0
  72. package/dist/src/core/reconcile/image-decide.js +48 -0
  73. package/dist/src/core/reconcile/image-decide.js.map +1 -0
  74. package/dist/src/core/reconcile/ledger.js +142 -0
  75. package/dist/src/core/reconcile/ledger.js.map +1 -0
  76. package/dist/src/core/reconcile/pr-classify.js +62 -0
  77. package/dist/src/core/reconcile/pr-classify.js.map +1 -0
  78. package/dist/{reconciler → src/core/reconcile}/pr-decide.js +25 -12
  79. package/dist/src/core/reconcile/pr-decide.js.map +1 -0
  80. package/dist/src/core/reconcile/pr-loop.js +161 -0
  81. package/dist/src/core/reconcile/pr-loop.js.map +1 -0
  82. package/dist/src/core/reconcile/pr-notes.js +35 -0
  83. package/dist/src/core/reconcile/pr-notes.js.map +1 -0
  84. package/dist/src/core/reconcile/vm-decide.js +70 -0
  85. package/dist/src/core/reconcile/vm-decide.js.map +1 -0
  86. package/dist/src/core/reconcile/vm-reap.js +207 -0
  87. package/dist/src/core/reconcile/vm-reap.js.map +1 -0
  88. package/dist/src/core/reconcile/workspace-decide.js +162 -0
  89. package/dist/src/core/reconcile/workspace-decide.js.map +1 -0
  90. package/dist/src/core/runlog/summary.js +231 -0
  91. package/dist/src/core/runlog/summary.js.map +1 -0
  92. package/dist/src/core/runner/dispatch-config.js +95 -0
  93. package/dist/src/core/runner/dispatch-config.js.map +1 -0
  94. package/dist/src/core/runner/injection.js +61 -0
  95. package/dist/src/core/runner/injection.js.map +1 -0
  96. package/dist/src/core/runner/mise.js +210 -0
  97. package/dist/src/core/runner/mise.js.map +1 -0
  98. package/dist/src/core/runner/prompt.js +720 -0
  99. package/dist/src/core/runner/prompt.js.map +1 -0
  100. package/dist/src/core/runner/turn.js +242 -0
  101. package/dist/src/core/runner/turn.js.map +1 -0
  102. package/dist/src/core/runner/vm-plan.js +390 -0
  103. package/dist/src/core/runner/vm-plan.js.map +1 -0
  104. package/dist/src/core/schedule/admission.js +123 -0
  105. package/dist/src/core/schedule/admission.js.map +1 -0
  106. package/dist/src/core/schedule/circuit-breaker.js +111 -0
  107. package/dist/src/core/schedule/circuit-breaker.js.map +1 -0
  108. package/dist/src/core/schedule/eligibility.js +83 -0
  109. package/dist/src/core/schedule/eligibility.js.map +1 -0
  110. package/dist/src/core/schedule/reconcile-issue.js +82 -0
  111. package/dist/src/core/schedule/reconcile-issue.js.map +1 -0
  112. package/dist/src/core/schedule/retry.js +96 -0
  113. package/dist/src/core/schedule/retry.js.map +1 -0
  114. package/dist/src/core/schedule/sleep-cycle.js +133 -0
  115. package/dist/src/core/schedule/sleep-cycle.js.map +1 -0
  116. package/dist/src/core/schedule/slots.js +124 -0
  117. package/dist/src/core/schedule/slots.js.map +1 -0
  118. package/dist/src/core/schedule/tick.js +553 -0
  119. package/dist/src/core/schedule/tick.js.map +1 -0
  120. package/dist/src/core/schedule/token-fold.js +181 -0
  121. package/dist/src/core/schedule/token-fold.js.map +1 -0
  122. package/dist/src/core/state-resolve.js +86 -0
  123. package/dist/src/core/state-resolve.js.map +1 -0
  124. package/dist/src/core/vm-guards.js +278 -0
  125. package/dist/src/core/vm-guards.js.map +1 -0
  126. package/dist/src/core/workflow/derive.js +107 -0
  127. package/dist/src/core/workflow/derive.js.map +1 -0
  128. package/dist/src/core/workflow/parse.js +687 -0
  129. package/dist/src/core/workflow/parse.js.map +1 -0
  130. package/dist/src/core/workflow/prompt-probe.js +78 -0
  131. package/dist/src/core/workflow/prompt-probe.js.map +1 -0
  132. package/dist/src/core/workflow/validate.js +189 -0
  133. package/dist/src/core/workflow/validate.js.map +1 -0
  134. package/dist/src/core/workspace-key.js +19 -0
  135. package/dist/src/core/workspace-key.js.map +1 -0
  136. package/dist/src/shell/actions-runner.js +356 -0
  137. package/dist/src/shell/actions-runner.js.map +1 -0
  138. package/dist/src/shell/adapter/adapter-registry.js +45 -0
  139. package/dist/src/shell/adapter/adapter-registry.js.map +1 -0
  140. package/dist/src/shell/adapter/clock-random.js +96 -0
  141. package/dist/src/shell/adapter/clock-random.js.map +1 -0
  142. package/dist/src/shell/adapter/gondolin-dispatch-helpers.js +158 -0
  143. package/dist/src/shell/adapter/gondolin-dispatch-helpers.js.map +1 -0
  144. package/dist/src/shell/adapter/gondolin-dispatch.js +385 -0
  145. package/dist/src/shell/adapter/gondolin-dispatch.js.map +1 -0
  146. package/dist/src/shell/adapter/gondolin-image-converter.js +233 -0
  147. package/dist/src/shell/adapter/gondolin-image-converter.js.map +1 -0
  148. package/dist/src/shell/adapter/gondolin-image-fetch.js +180 -0
  149. package/dist/src/shell/adapter/gondolin-image-fetch.js.map +1 -0
  150. package/dist/src/shell/adapter/launcher-asset.js +57 -0
  151. package/dist/src/shell/adapter/launcher-asset.js.map +1 -0
  152. package/dist/src/shell/adapter/mise-config-asset.js +65 -0
  153. package/dist/src/shell/adapter/mise-config-asset.js.map +1 -0
  154. package/dist/src/shell/adapter/workflow-loader.js +304 -0
  155. package/dist/src/shell/adapter/workflow-loader.js.map +1 -0
  156. package/dist/src/shell/cli/doctor.js +268 -0
  157. package/dist/src/shell/cli/doctor.js.map +1 -0
  158. package/dist/src/shell/effect-interpreter-families.js +314 -0
  159. package/dist/src/shell/effect-interpreter-families.js.map +1 -0
  160. package/dist/src/shell/effect-interpreter.js +29 -0
  161. package/dist/src/shell/effect-interpreter.js.map +1 -0
  162. package/dist/src/shell/interp/acp-frame.js +137 -0
  163. package/dist/src/shell/interp/acp-frame.js.map +1 -0
  164. package/dist/src/shell/interp/acp-ws-conn.js +320 -0
  165. package/dist/src/shell/interp/acp-ws-conn.js.map +1 -0
  166. package/dist/src/shell/interp/acp-ws-frames.js +159 -0
  167. package/dist/src/shell/interp/acp-ws-frames.js.map +1 -0
  168. package/dist/src/shell/interp/acp-ws.js +197 -0
  169. package/dist/src/shell/interp/acp-ws.js.map +1 -0
  170. package/dist/src/shell/interp/acp.js +319 -0
  171. package/dist/src/shell/interp/acp.js.map +1 -0
  172. package/dist/src/shell/interp/credential-defaults.js +128 -0
  173. package/dist/src/shell/interp/credential-defaults.js.map +1 -0
  174. package/dist/src/shell/interp/credential-hooks.js +149 -0
  175. package/dist/src/shell/interp/credential-hooks.js.map +1 -0
  176. package/dist/src/shell/interp/credential-registry.js +226 -0
  177. package/dist/src/shell/interp/credential-registry.js.map +1 -0
  178. package/dist/src/shell/interp/credential.js +103 -0
  179. package/dist/src/shell/interp/credential.js.map +1 -0
  180. package/dist/src/shell/interp/gh.js +163 -0
  181. package/dist/src/shell/interp/gh.js.map +1 -0
  182. package/dist/src/shell/interp/git.js +28 -0
  183. package/dist/src/shell/interp/git.js.map +1 -0
  184. package/dist/src/shell/interp/log.js +213 -0
  185. package/dist/src/shell/interp/log.js.map +1 -0
  186. package/dist/src/shell/interp/process.js +178 -0
  187. package/dist/src/shell/interp/process.js.map +1 -0
  188. package/dist/src/shell/interp/runlog.js +193 -0
  189. package/dist/src/shell/interp/runlog.js.map +1 -0
  190. package/dist/src/shell/interp/timer.js +64 -0
  191. package/dist/src/shell/interp/timer.js.map +1 -0
  192. package/dist/src/shell/interp/tracker-disk.js +99 -0
  193. package/dist/src/shell/interp/tracker-disk.js.map +1 -0
  194. package/dist/src/shell/interp/tracker-parse.js +71 -0
  195. package/dist/src/shell/interp/tracker-parse.js.map +1 -0
  196. package/dist/src/shell/interp/tracker-scan.js +238 -0
  197. package/dist/src/shell/interp/tracker-scan.js.map +1 -0
  198. package/dist/src/shell/interp/tracker-write.js +91 -0
  199. package/dist/src/shell/interp/tracker-write.js.map +1 -0
  200. package/dist/src/shell/interp/tracker.js +41 -0
  201. package/dist/src/shell/interp/tracker.js.map +1 -0
  202. package/dist/src/shell/interp/tty.js +48 -0
  203. package/dist/src/shell/interp/tty.js.map +1 -0
  204. package/dist/src/shell/interp/vm.js +199 -0
  205. package/dist/src/shell/interp/vm.js.map +1 -0
  206. package/dist/src/shell/interp/workspace.js +310 -0
  207. package/dist/src/shell/interp/workspace.js.map +1 -0
  208. package/dist/src/shell/main-acp.js +78 -0
  209. package/dist/src/shell/main-acp.js.map +1 -0
  210. package/dist/src/shell/main-adapters.js +222 -0
  211. package/dist/src/shell/main-adapters.js.map +1 -0
  212. package/dist/src/shell/main-credential.js +122 -0
  213. package/dist/src/shell/main-credential.js.map +1 -0
  214. package/dist/src/shell/main-doctor.js +22 -0
  215. package/dist/src/shell/main-doctor.js.map +1 -0
  216. package/dist/src/shell/main-entry.js +46 -0
  217. package/dist/src/shell/main-entry.js.map +1 -0
  218. package/dist/src/shell/main-http-csrf.js +45 -0
  219. package/dist/src/shell/main-http-csrf.js.map +1 -0
  220. package/dist/src/shell/main-http-handler.js +389 -0
  221. package/dist/src/shell/main-http-handler.js.map +1 -0
  222. package/dist/src/shell/main-http-mcp.js +122 -0
  223. package/dist/src/shell/main-http-mcp.js.map +1 -0
  224. package/dist/src/shell/main-http-views.js +253 -0
  225. package/dist/src/shell/main-http-views.js.map +1 -0
  226. package/dist/src/shell/main-http.js +76 -0
  227. package/dist/src/shell/main-http.js.map +1 -0
  228. package/dist/src/shell/main-loops.js +130 -0
  229. package/dist/src/shell/main-loops.js.map +1 -0
  230. package/dist/src/shell/main-mcp.js +129 -0
  231. package/dist/src/shell/main-mcp.js.map +1 -0
  232. package/dist/src/shell/main-orchestrator.js +120 -0
  233. package/dist/src/shell/main-orchestrator.js.map +1 -0
  234. package/dist/src/shell/main-preflight.js +43 -0
  235. package/dist/src/shell/main-preflight.js.map +1 -0
  236. package/dist/src/shell/main-reconcilers-helpers.js +244 -0
  237. package/dist/src/shell/main-reconcilers-helpers.js.map +1 -0
  238. package/dist/src/shell/main-reconcilers-pr.js +148 -0
  239. package/dist/src/shell/main-reconcilers-pr.js.map +1 -0
  240. package/dist/src/shell/main-reconcilers.js +225 -0
  241. package/dist/src/shell/main-reconcilers.js.map +1 -0
  242. package/dist/src/shell/main-runner.js +355 -0
  243. package/dist/src/shell/main-runner.js.map +1 -0
  244. package/dist/src/shell/main-scaffold.js +116 -0
  245. package/dist/src/shell/main-scaffold.js.map +1 -0
  246. package/dist/src/shell/main-shutdown.js +115 -0
  247. package/dist/src/shell/main-shutdown.js.map +1 -0
  248. package/dist/src/shell/main-startup.js +48 -0
  249. package/dist/src/shell/main-startup.js.map +1 -0
  250. package/dist/src/shell/main-substrates.js +43 -0
  251. package/dist/src/shell/main-substrates.js.map +1 -0
  252. package/dist/src/shell/main.js +385 -0
  253. package/dist/src/shell/main.js.map +1 -0
  254. package/dist/src/shell/orchestrator-feedback.js +69 -0
  255. package/dist/src/shell/orchestrator-feedback.js.map +1 -0
  256. package/dist/src/shell/orchestrator-image.js +167 -0
  257. package/dist/src/shell/orchestrator-image.js.map +1 -0
  258. package/dist/src/shell/orchestrator-loop.js +468 -0
  259. package/dist/src/shell/orchestrator-loop.js.map +1 -0
  260. package/dist/src/shell/orchestrator-reconcile.js +36 -0
  261. package/dist/src/shell/orchestrator-reconcile.js.map +1 -0
  262. package/dist/src/shell/reconciler-loop.js +228 -0
  263. package/dist/src/shell/reconciler-loop.js.map +1 -0
  264. package/dist/src/shell/runner-loop-turn.js +301 -0
  265. package/dist/src/shell/runner-loop-turn.js.map +1 -0
  266. package/dist/src/shell/runner-loop.js +338 -0
  267. package/dist/src/shell/runner-loop.js.map +1 -0
  268. package/dist/src/shell/server/http.js +208 -0
  269. package/dist/src/shell/server/http.js.map +1 -0
  270. package/dist/src/shell/server/mcp-runtime-effects.js +237 -0
  271. package/dist/src/shell/server/mcp-runtime-effects.js.map +1 -0
  272. package/dist/src/shell/server/mcp-runtime.js +99 -0
  273. package/dist/src/shell/server/mcp-runtime.js.map +1 -0
  274. package/dist/src/shell/workspace-key.js +14 -0
  275. package/dist/src/shell/workspace-key.js.map +1 -0
  276. package/dist/src/types/acp.js +8 -0
  277. package/dist/src/types/acp.js.map +1 -0
  278. package/dist/src/types/actions/plan.js +6 -0
  279. package/dist/src/types/actions/plan.js.map +1 -0
  280. package/dist/src/types/actions/predicates.js +6 -0
  281. package/dist/src/types/actions/predicates.js.map +1 -0
  282. package/dist/src/types/actions/run-fold.js +8 -0
  283. package/dist/src/types/actions/run-fold.js.map +1 -0
  284. package/dist/src/types/actions.js +7 -0
  285. package/dist/src/types/actions.js.map +1 -0
  286. package/dist/src/types/adapter/clock-random.js +4 -0
  287. package/dist/src/types/adapter/clock-random.js.map +1 -0
  288. package/dist/src/types/adapter/gondolin-image-converter.js +5 -0
  289. package/dist/src/types/adapter/gondolin-image-converter.js.map +1 -0
  290. package/dist/src/types/adapter/gondolin-image-fetch.js +5 -0
  291. package/dist/src/types/adapter/gondolin-image-fetch.js.map +1 -0
  292. package/dist/src/types/adapter/workflow-loader.js +4 -0
  293. package/dist/src/types/adapter/workflow-loader.js.map +1 -0
  294. package/dist/src/types/cli/args.js +8 -0
  295. package/dist/src/types/cli/args.js.map +1 -0
  296. package/dist/src/types/config.js +8 -0
  297. package/dist/src/types/config.js.map +1 -0
  298. package/dist/src/types/credential-interp.js +6 -0
  299. package/dist/src/types/credential-interp.js.map +1 -0
  300. package/dist/src/types/credentials.js +10 -0
  301. package/dist/src/types/credentials.js.map +1 -0
  302. package/dist/src/types/doctor.js +7 -0
  303. package/dist/src/types/doctor.js.map +1 -0
  304. package/dist/src/types/domain.js +7 -0
  305. package/dist/src/types/domain.js.map +1 -0
  306. package/dist/src/types/effect.js +15 -0
  307. package/dist/src/types/effect.js.map +1 -0
  308. package/dist/src/types/errors.js +39 -0
  309. package/dist/src/types/errors.js.map +1 -0
  310. package/dist/src/types/http/decisions.js +6 -0
  311. package/dist/src/types/http/decisions.js.map +1 -0
  312. package/dist/src/types/http/render.js +10 -0
  313. package/dist/src/types/http/render.js.map +1 -0
  314. package/dist/src/types/http/views.js +6 -0
  315. package/dist/src/types/http/views.js.map +1 -0
  316. package/dist/src/types/http.js +9 -0
  317. package/dist/src/types/http.js.map +1 -0
  318. package/dist/src/types/image/managed-image.js +7 -0
  319. package/dist/src/types/image/managed-image.js.map +1 -0
  320. package/dist/src/types/interp/effect-interpreter.js +8 -0
  321. package/dist/src/types/interp/effect-interpreter.js.map +1 -0
  322. package/dist/src/types/interp/tracker.js +7 -0
  323. package/dist/src/types/interp/tracker.js.map +1 -0
  324. package/dist/src/types/issue/file.js +6 -0
  325. package/dist/src/types/issue/file.js.map +1 -0
  326. package/dist/src/types/issue/parse.js +8 -0
  327. package/dist/src/types/issue/parse.js.map +1 -0
  328. package/dist/src/types/main-acp.js +13 -0
  329. package/dist/src/types/main-acp.js.map +1 -0
  330. package/dist/src/types/main-adapters.js +5 -0
  331. package/dist/src/types/main-adapters.js.map +1 -0
  332. package/dist/src/types/main-credential.js +21 -0
  333. package/dist/src/types/main-credential.js.map +1 -0
  334. package/dist/src/types/main-doctor.js +6 -0
  335. package/dist/src/types/main-doctor.js.map +1 -0
  336. package/dist/src/types/main-http-handler.js +12 -0
  337. package/dist/src/types/main-http-handler.js.map +1 -0
  338. package/dist/src/types/main-http.js +5 -0
  339. package/dist/src/types/main-http.js.map +1 -0
  340. package/dist/src/types/main-loops.js +5 -0
  341. package/dist/src/types/main-loops.js.map +1 -0
  342. package/dist/src/types/main-mcp.js +12 -0
  343. package/dist/src/types/main-mcp.js.map +1 -0
  344. package/dist/src/types/main-orchestrator.js +5 -0
  345. package/dist/src/types/main-orchestrator.js.map +1 -0
  346. package/dist/src/types/main-reconcilers.js +11 -0
  347. package/dist/src/types/main-reconcilers.js.map +1 -0
  348. package/dist/src/types/main-runner.js +13 -0
  349. package/dist/src/types/main-runner.js.map +1 -0
  350. package/dist/src/types/main-startup.js +5 -0
  351. package/dist/src/types/main-startup.js.map +1 -0
  352. package/dist/src/types/main-substrates.js +5 -0
  353. package/dist/src/types/main-substrates.js.map +1 -0
  354. package/dist/src/types/mcp/dispatch.js +4 -0
  355. package/dist/src/types/mcp/dispatch.js.map +1 -0
  356. package/dist/src/types/mcp/post-move.js +7 -0
  357. package/dist/src/types/mcp/post-move.js.map +1 -0
  358. package/dist/src/types/mcp.js +9 -0
  359. package/dist/src/types/mcp.js.map +1 -0
  360. package/dist/src/types/ports.js +12 -0
  361. package/dist/src/types/ports.js.map +1 -0
  362. package/dist/src/types/reconcile/image-decide.js +5 -0
  363. package/dist/src/types/reconcile/image-decide.js.map +1 -0
  364. package/dist/src/types/reconcile/ledger.js +7 -0
  365. package/dist/src/types/reconcile/ledger.js.map +1 -0
  366. package/dist/src/types/reconcile/pr-loop.js +8 -0
  367. package/dist/src/types/reconcile/pr-loop.js.map +1 -0
  368. package/dist/src/types/reconcile/vm-reap.js +8 -0
  369. package/dist/src/types/reconcile/vm-reap.js.map +1 -0
  370. package/dist/src/types/reconcile/workspace-decide.js +7 -0
  371. package/dist/src/types/reconcile/workspace-decide.js.map +1 -0
  372. package/dist/src/types/reconcile.js +9 -0
  373. package/dist/src/types/reconcile.js.map +1 -0
  374. package/dist/src/types/runlog.js +7 -0
  375. package/dist/src/types/runlog.js.map +1 -0
  376. package/dist/src/types/runner/actions-runner.js +12 -0
  377. package/dist/src/types/runner/actions-runner.js.map +1 -0
  378. package/dist/src/types/runner/gondolin-dispatch.js +5 -0
  379. package/dist/src/types/runner/gondolin-dispatch.js.map +1 -0
  380. package/dist/src/types/runner/injection.js +6 -0
  381. package/dist/src/types/runner/injection.js.map +1 -0
  382. package/dist/src/types/runner/runner-loop.js +5 -0
  383. package/dist/src/types/runner/runner-loop.js.map +1 -0
  384. package/dist/src/types/runner/turn.js +4 -0
  385. package/dist/src/types/runner/turn.js.map +1 -0
  386. package/dist/src/types/runner/vm-plan.js +4 -0
  387. package/dist/src/types/runner/vm-plan.js.map +1 -0
  388. package/dist/src/types/runtime.js +9 -0
  389. package/dist/src/types/runtime.js.map +1 -0
  390. package/dist/src/types/schedule/admission.js +7 -0
  391. package/dist/src/types/schedule/admission.js.map +1 -0
  392. package/dist/src/types/schedule/circuit-breaker.js +2 -0
  393. package/dist/src/types/schedule/circuit-breaker.js.map +1 -0
  394. package/dist/src/types/schedule/eligibility.js +9 -0
  395. package/dist/src/types/schedule/eligibility.js.map +1 -0
  396. package/dist/src/types/schedule/orchestrator-loop.js +10 -0
  397. package/dist/src/types/schedule/orchestrator-loop.js.map +1 -0
  398. package/dist/src/types/schedule/sleep-cycle.js +4 -0
  399. package/dist/src/types/schedule/sleep-cycle.js.map +1 -0
  400. package/dist/src/types/schedule/slots.js +8 -0
  401. package/dist/src/types/schedule/slots.js.map +1 -0
  402. package/dist/src/types/schedule/tick.js +9 -0
  403. package/dist/src/types/schedule/tick.js.map +1 -0
  404. package/dist/src/types/server/mcp-runtime.js +8 -0
  405. package/dist/src/types/server/mcp-runtime.js.map +1 -0
  406. package/dist/src/types/workflow/parse.js +4 -0
  407. package/dist/src/types/workflow/parse.js.map +1 -0
  408. package/dist/tests/core/account-id.test.js +35 -0
  409. package/dist/tests/core/account-id.test.js.map +1 -0
  410. package/dist/tests/core/actions-parse.test.js +176 -0
  411. package/dist/tests/core/actions-parse.test.js.map +1 -0
  412. package/dist/tests/core/adapter-config.test.js +133 -0
  413. package/dist/tests/core/adapter-config.test.js.map +1 -0
  414. package/dist/tests/core/admission.test.js +215 -0
  415. package/dist/tests/core/admission.test.js.map +1 -0
  416. package/dist/tests/core/args.test.js +132 -0
  417. package/dist/tests/core/args.test.js.map +1 -0
  418. package/dist/tests/core/availability.test.js +62 -0
  419. package/dist/tests/core/availability.test.js.map +1 -0
  420. package/dist/tests/core/checks.test.js +395 -0
  421. package/dist/tests/core/checks.test.js.map +1 -0
  422. package/dist/tests/core/circuit-breaker.test.js +172 -0
  423. package/dist/tests/core/circuit-breaker.test.js.map +1 -0
  424. package/dist/tests/core/coerce.test.js +87 -0
  425. package/dist/tests/core/coerce.test.js.map +1 -0
  426. package/dist/tests/core/context.test.js +228 -0
  427. package/dist/tests/core/context.test.js.map +1 -0
  428. package/dist/tests/core/decisions.test.js +310 -0
  429. package/dist/tests/core/decisions.test.js.map +1 -0
  430. package/dist/tests/core/derive.test.js +205 -0
  431. package/dist/tests/core/derive.test.js.map +1 -0
  432. package/dist/tests/core/dispatch-config.test.js +164 -0
  433. package/dist/tests/core/dispatch-config.test.js.map +1 -0
  434. package/dist/tests/core/dispatch.test.js +302 -0
  435. package/dist/tests/core/dispatch.test.js.map +1 -0
  436. package/dist/tests/core/eligibility.test.js +163 -0
  437. package/dist/tests/core/eligibility.test.js.map +1 -0
  438. package/dist/tests/core/extract.test.js +139 -0
  439. package/dist/tests/core/extract.test.js.map +1 -0
  440. package/dist/tests/core/fake-creds.test.js +134 -0
  441. package/dist/tests/core/fake-creds.test.js.map +1 -0
  442. package/dist/tests/core/file.test.js +197 -0
  443. package/dist/tests/core/file.test.js.map +1 -0
  444. package/dist/tests/core/git-result.test.js +113 -0
  445. package/dist/tests/core/git-result.test.js.map +1 -0
  446. package/dist/tests/core/identity.test.js +180 -0
  447. package/dist/tests/core/identity.test.js.map +1 -0
  448. package/dist/tests/core/image-decide.test.js +59 -0
  449. package/dist/tests/core/image-decide.test.js.map +1 -0
  450. package/dist/tests/core/injection.test.js +163 -0
  451. package/dist/tests/core/injection.test.js.map +1 -0
  452. package/dist/tests/core/ledger.test.js +218 -0
  453. package/dist/tests/core/ledger.test.js.map +1 -0
  454. package/dist/tests/core/managed-image.test.js +68 -0
  455. package/dist/tests/core/managed-image.test.js.map +1 -0
  456. package/dist/tests/core/mise.test.js +138 -0
  457. package/dist/tests/core/mise.test.js.map +1 -0
  458. package/dist/tests/core/parse.test.js +174 -0
  459. package/dist/tests/core/parse.test.js.map +1 -0
  460. package/dist/tests/core/path.test.js +50 -0
  461. package/dist/tests/core/path.test.js.map +1 -0
  462. package/dist/tests/core/plan.test.js +218 -0
  463. package/dist/tests/core/plan.test.js.map +1 -0
  464. package/dist/tests/core/post-move.test.js +162 -0
  465. package/dist/tests/core/post-move.test.js.map +1 -0
  466. package/dist/tests/core/pr-classify.test.js +117 -0
  467. package/dist/tests/core/pr-classify.test.js.map +1 -0
  468. package/dist/tests/core/pr-decide.test.js +298 -0
  469. package/dist/tests/core/pr-decide.test.js.map +1 -0
  470. package/dist/tests/core/pr-loop.test.js +301 -0
  471. package/dist/tests/core/pr-loop.test.js.map +1 -0
  472. package/dist/tests/core/pr-notes.test.js +165 -0
  473. package/dist/tests/core/pr-notes.test.js.map +1 -0
  474. package/dist/tests/core/predicates.test.js +154 -0
  475. package/dist/tests/core/predicates.test.js.map +1 -0
  476. package/dist/tests/core/prompt.test.js +189 -0
  477. package/dist/tests/core/prompt.test.js.map +1 -0
  478. package/dist/tests/core/protocol.test.js +195 -0
  479. package/dist/tests/core/protocol.test.js.map +1 -0
  480. package/dist/tests/core/reconcile-issue.test.js +116 -0
  481. package/dist/tests/core/reconcile-issue.test.js.map +1 -0
  482. package/dist/tests/core/render.test.js +549 -0
  483. package/dist/tests/core/render.test.js.map +1 -0
  484. package/dist/tests/core/retry.test.js +186 -0
  485. package/dist/tests/core/retry.test.js.map +1 -0
  486. package/dist/tests/core/routes.test.js +247 -0
  487. package/dist/tests/core/routes.test.js.map +1 -0
  488. package/dist/tests/core/run-fold.test.js +299 -0
  489. package/dist/tests/core/run-fold.test.js.map +1 -0
  490. package/dist/tests/core/shape.test.js +185 -0
  491. package/dist/tests/core/shape.test.js.map +1 -0
  492. package/dist/tests/core/sleep-cycle.test.js +150 -0
  493. package/dist/tests/core/sleep-cycle.test.js.map +1 -0
  494. package/dist/tests/core/slots.test.js +201 -0
  495. package/dist/tests/core/slots.test.js.map +1 -0
  496. package/dist/tests/core/state-resolve.test.js +80 -0
  497. package/dist/tests/core/state-resolve.test.js.map +1 -0
  498. package/dist/tests/core/summary.test.js +200 -0
  499. package/dist/tests/core/summary.test.js.map +1 -0
  500. package/dist/tests/core/template.test.js +116 -0
  501. package/dist/tests/core/template.test.js.map +1 -0
  502. package/dist/tests/core/tick.test.js +558 -0
  503. package/dist/tests/core/tick.test.js.map +1 -0
  504. package/dist/tests/core/token-fold.test.js +176 -0
  505. package/dist/tests/core/token-fold.test.js.map +1 -0
  506. package/dist/tests/core/turn.test.js +388 -0
  507. package/dist/tests/core/turn.test.js.map +1 -0
  508. package/dist/tests/core/url.test.js +118 -0
  509. package/dist/tests/core/url.test.js.map +1 -0
  510. package/dist/tests/core/validate.test.js +247 -0
  511. package/dist/tests/core/validate.test.js.map +1 -0
  512. package/dist/tests/core/views.test.js +252 -0
  513. package/dist/tests/core/views.test.js.map +1 -0
  514. package/dist/tests/core/vm-decide.test.js +110 -0
  515. package/dist/tests/core/vm-decide.test.js.map +1 -0
  516. package/dist/tests/core/vm-guards.test.js +153 -0
  517. package/dist/tests/core/vm-guards.test.js.map +1 -0
  518. package/dist/tests/core/vm-plan.test.js +332 -0
  519. package/dist/tests/core/vm-plan.test.js.map +1 -0
  520. package/dist/tests/core/vm-reap.test.js +196 -0
  521. package/dist/tests/core/vm-reap.test.js.map +1 -0
  522. package/dist/tests/core/workflow-parse.test.js +493 -0
  523. package/dist/tests/core/workflow-parse.test.js.map +1 -0
  524. package/dist/tests/core/workspace-decide.test.js +236 -0
  525. package/dist/tests/core/workspace-decide.test.js.map +1 -0
  526. package/dist/tests/helpers/fixtures.js +167 -0
  527. package/dist/tests/helpers/fixtures.js.map +1 -0
  528. package/dist/tests/shell/acp-substrate.test.js +101 -0
  529. package/dist/tests/shell/acp-substrate.test.js.map +1 -0
  530. package/dist/tests/shell/actions-runner-push.test.js +203 -0
  531. package/dist/tests/shell/actions-runner-push.test.js.map +1 -0
  532. package/dist/tests/shell/credential-hooks.test.js +36 -0
  533. package/dist/tests/shell/credential-hooks.test.js.map +1 -0
  534. package/dist/tests/shell/credential-registry.test.js +165 -0
  535. package/dist/tests/shell/credential-registry.test.js.map +1 -0
  536. package/dist/tests/shell/credential-substrate.test.js +179 -0
  537. package/dist/tests/shell/credential-substrate.test.js.map +1 -0
  538. package/dist/tests/shell/dockerfile-mise-pin.test.js +51 -0
  539. package/dist/tests/shell/dockerfile-mise-pin.test.js.map +1 -0
  540. package/dist/tests/shell/doctor.test.js +101 -0
  541. package/dist/tests/shell/doctor.test.js.map +1 -0
  542. package/dist/tests/shell/effect-vm-create.test.js +52 -0
  543. package/dist/tests/shell/effect-vm-create.test.js.map +1 -0
  544. package/dist/tests/shell/gh-port.test.js +63 -0
  545. package/dist/tests/shell/gh-port.test.js.map +1 -0
  546. package/dist/tests/shell/gondolin-dispatch-guard.test.js +144 -0
  547. package/dist/tests/shell/gondolin-dispatch-guard.test.js.map +1 -0
  548. package/dist/tests/shell/gondolin-dispatch-shquote.test.js +168 -0
  549. package/dist/tests/shell/gondolin-dispatch-shquote.test.js.map +1 -0
  550. package/dist/tests/shell/gondolin-image-converter.test.js +208 -0
  551. package/dist/tests/shell/gondolin-image-converter.test.js.map +1 -0
  552. package/dist/tests/shell/gondolin-image-fetch.test.js +93 -0
  553. package/dist/tests/shell/gondolin-image-fetch.test.js.map +1 -0
  554. package/dist/tests/shell/http-handler.test.js +608 -0
  555. package/dist/tests/shell/http-handler.test.js.map +1 -0
  556. package/dist/tests/shell/http-server.test.js +53 -0
  557. package/dist/tests/shell/http-server.test.js.map +1 -0
  558. package/dist/tests/shell/mcp-runtime.test.js +366 -0
  559. package/dist/tests/shell/mcp-runtime.test.js.map +1 -0
  560. package/dist/tests/shell/mise-config-asset.test.js +87 -0
  561. package/dist/tests/shell/mise-config-asset.test.js.map +1 -0
  562. package/dist/tests/shell/orchestrator-loop.test.js +583 -0
  563. package/dist/tests/shell/orchestrator-loop.test.js.map +1 -0
  564. package/dist/tests/shell/reconciler-passes.test.js +314 -0
  565. package/dist/tests/shell/reconciler-passes.test.js.map +1 -0
  566. package/dist/tests/shell/runner-loop-turn.test.js +97 -0
  567. package/dist/tests/shell/runner-loop-turn.test.js.map +1 -0
  568. package/dist/tests/shell/runner-slice.test.js +536 -0
  569. package/dist/tests/shell/runner-slice.test.js.map +1 -0
  570. package/dist/tests/shell/scaffold.test.js +65 -0
  571. package/dist/tests/shell/scaffold.test.js.map +1 -0
  572. package/dist/tests/shell/tick-config.test.js +83 -0
  573. package/dist/tests/shell/tick-config.test.js.map +1 -0
  574. package/dist/tests/shell/tracker-parse-dates.test.js +44 -0
  575. package/dist/tests/shell/tracker-parse-dates.test.js.map +1 -0
  576. package/dist/tests/shell/tracker-write-issue.test.js +154 -0
  577. package/dist/tests/shell/tracker-write-issue.test.js.map +1 -0
  578. package/dist/tests/shell/workflow-prompt-split.test.js +208 -0
  579. package/dist/tests/shell/workflow-prompt-split.test.js.map +1 -0
  580. package/dist/tests/shell/workspace-live-config.test.js +140 -0
  581. package/dist/tests/shell/workspace-live-config.test.js.map +1 -0
  582. package/package.json +21 -9
  583. package/patches/@earendil-works+gondolin+0.12.0.patch +173 -0
  584. package/prompts/Reflect.md +91 -0
  585. package/prompts/Review.md +97 -0
  586. package/prompts/Todo.md +96 -0
  587. package/prompts/_footer.md +41 -0
  588. package/prompts/_preamble.md +42 -0
  589. package/prompts-minimal/Todo.md +26 -0
  590. package/scripts/postinstall.mjs +63 -0
  591. package/scripts/vm-agent.mjs +312 -90
  592. package/WORKFLOW.md +0 -744
  593. package/dist/acp-bridge.js +0 -324
  594. package/dist/acp-bridge.js.map +0 -1
  595. package/dist/actions/cache.js +0 -191
  596. package/dist/actions/cache.js.map +0 -1
  597. package/dist/actions/effects.js +0 -41
  598. package/dist/actions/effects.js.map +0 -1
  599. package/dist/actions/executor.js +0 -570
  600. package/dist/actions/executor.js.map +0 -1
  601. package/dist/actions/index.js +0 -13
  602. package/dist/actions/index.js.map +0 -1
  603. package/dist/actions/parsing.js.map +0 -1
  604. package/dist/actions/predicate-env.js +0 -27
  605. package/dist/actions/predicate-env.js.map +0 -1
  606. package/dist/actions/predicates.js +0 -49
  607. package/dist/actions/predicates.js.map +0 -1
  608. package/dist/actions/templating.js +0 -66
  609. package/dist/actions/templating.js.map +0 -1
  610. package/dist/actions/types.js +0 -15
  611. package/dist/actions/types.js.map +0 -1
  612. package/dist/agent/acp.js +0 -473
  613. package/dist/agent/acp.js.map +0 -1
  614. package/dist/agent/adapter-names.js +0 -159
  615. package/dist/agent/adapter-names.js.map +0 -1
  616. package/dist/agent/adapters.js +0 -511
  617. package/dist/agent/adapters.js.map +0 -1
  618. package/dist/agent/credential-extractors.js +0 -342
  619. package/dist/agent/credential-extractors.js.map +0 -1
  620. package/dist/agent/credential-secrets.js +0 -628
  621. package/dist/agent/credential-secrets.js.map +0 -1
  622. package/dist/agent/credential-ticker.js +0 -57
  623. package/dist/agent/credential-ticker.js.map +0 -1
  624. package/dist/agent/gondolin-creds-staging.js +0 -356
  625. package/dist/agent/gondolin-creds-staging.js.map +0 -1
  626. package/dist/agent/gondolin-dispatch.js +0 -375
  627. package/dist/agent/gondolin-dispatch.js.map +0 -1
  628. package/dist/agent/gondolin.js +0 -124
  629. package/dist/agent/gondolin.js.map +0 -1
  630. package/dist/agent/runner-decisions.js +0 -134
  631. package/dist/agent/runner-decisions.js.map +0 -1
  632. package/dist/agent/runner.js +0 -1456
  633. package/dist/agent/runner.js.map +0 -1
  634. package/dist/agent/tool-call-summary.js +0 -102
  635. package/dist/agent/tool-call-summary.js.map +0 -1
  636. package/dist/agent/vm-acp-mapping.js +0 -73
  637. package/dist/agent/vm-acp-mapping.js.map +0 -1
  638. package/dist/agent/vm-guards.js +0 -262
  639. package/dist/agent/vm-guards.js.map +0 -1
  640. package/dist/agent/vm-port.js +0 -22
  641. package/dist/agent/vm-port.js.map +0 -1
  642. package/dist/agent/vm-process-registry.js +0 -79
  643. package/dist/agent/vm-process-registry.js.map +0 -1
  644. package/dist/bin/cli-args.js +0 -105
  645. package/dist/bin/cli-args.js.map +0 -1
  646. package/dist/bin/symphony.js +0 -794
  647. package/dist/bin/symphony.js.map +0 -1
  648. package/dist/errors.js +0 -15
  649. package/dist/errors.js.map +0 -1
  650. package/dist/http-disk.js +0 -135
  651. package/dist/http-disk.js.map +0 -1
  652. package/dist/http-handlers.js.map +0 -1
  653. package/dist/http.js.map +0 -1
  654. package/dist/issues.js +0 -178
  655. package/dist/issues.js.map +0 -1
  656. package/dist/logging.js +0 -203
  657. package/dist/logging.js.map +0 -1
  658. package/dist/mcp.js +0 -706
  659. package/dist/mcp.js.map +0 -1
  660. package/dist/memory.js +0 -85
  661. package/dist/memory.js.map +0 -1
  662. package/dist/orchestrator-decisions.js +0 -331
  663. package/dist/orchestrator-decisions.js.map +0 -1
  664. package/dist/orchestrator.js +0 -1569
  665. package/dist/orchestrator.js.map +0 -1
  666. package/dist/prompt.js +0 -65
  667. package/dist/prompt.js.map +0 -1
  668. package/dist/reconciler/cache.js +0 -65
  669. package/dist/reconciler/cache.js.map +0 -1
  670. package/dist/reconciler/index.js +0 -448
  671. package/dist/reconciler/index.js.map +0 -1
  672. package/dist/reconciler/ledger.js +0 -131
  673. package/dist/reconciler/ledger.js.map +0 -1
  674. package/dist/reconciler/pr-adapters.js +0 -174
  675. package/dist/reconciler/pr-adapters.js.map +0 -1
  676. package/dist/reconciler/pr-decide.js.map +0 -1
  677. package/dist/reconciler/pr.js +0 -422
  678. package/dist/reconciler/pr.js.map +0 -1
  679. package/dist/reconciler/types.js +0 -12
  680. package/dist/reconciler/types.js.map +0 -1
  681. package/dist/reconciler/vm.js +0 -243
  682. package/dist/reconciler/vm.js.map +0 -1
  683. package/dist/reconciler/workspace-defaults.js +0 -83
  684. package/dist/reconciler/workspace-defaults.js.map +0 -1
  685. package/dist/reconciler/workspace.js +0 -272
  686. package/dist/reconciler/workspace.js.map +0 -1
  687. package/dist/runlog.js +0 -403
  688. package/dist/runlog.js.map +0 -1
  689. package/dist/scaffold.js +0 -165
  690. package/dist/scaffold.js.map +0 -1
  691. package/dist/trackers/local.js +0 -445
  692. package/dist/trackers/local.js.map +0 -1
  693. package/dist/trackers/types.js +0 -10
  694. package/dist/trackers/types.js.map +0 -1
  695. package/dist/types.js +0 -3
  696. package/dist/types.js.map +0 -1
  697. package/dist/util/clock.js +0 -12
  698. package/dist/util/clock.js.map +0 -1
  699. package/dist/util/crypto.js +0 -25
  700. package/dist/util/crypto.js.map +0 -1
  701. package/dist/util/frontmatter.js +0 -70
  702. package/dist/util/frontmatter.js.map +0 -1
  703. package/dist/util/fs-issues.js +0 -22
  704. package/dist/util/fs-issues.js.map +0 -1
  705. package/dist/util/process.js +0 -152
  706. package/dist/util/process.js.map +0 -1
  707. package/dist/util/workspace-key.js +0 -10
  708. package/dist/util/workspace-key.js.map +0 -1
  709. package/dist/workflow-loader.js +0 -147
  710. package/dist/workflow-loader.js.map +0 -1
  711. package/dist/workflow.js +0 -822
  712. package/dist/workflow.js.map +0 -1
  713. package/dist/workspace-types.js +0 -8
  714. package/dist/workspace-types.js.map +0 -1
  715. package/dist/workspace.js +0 -443
  716. package/dist/workspace.js.map +0 -1
@@ -0,0 +1,536 @@
1
+ // Integration tests for the composed RUNNER slice (the capstone wiring): drive
2
+ // `buildRunnerSlice(...).runWorker(plan, entry, cancel)` over FAKE workspace /
3
+ // dispatcher (vmClient) / acp / mcp / actions ports through a full happy-path
4
+ // attempt AND a transport-error retry path. The REAL pure core deciders are wired
5
+ // (the same bundles main.ts injects) so the assertions exercise the genuine
6
+ // produce/consume + bracket behaviour, not a mock of it.
7
+ //
8
+ // Asserts (per the task):
9
+ // • the §2a credential-mount guard is invoked BEFORE createVm.
10
+ // • MCP activate/deactivate bracket the attempt.
11
+ // • ACP dispatch context register/deregister bracket the attempt.
12
+ // • ACP token deltas fold into the running entry's totals (dashboard §2c).
13
+ // • a `run_in_vm` terminal action execs (uncached) on the live VM.
14
+ // • a transport_error attempt reports an ABNORMAL worker exit (retry path).
15
+ import { test } from 'node:test';
16
+ import assert from 'node:assert/strict';
17
+ import { buildRunnerSlice } from '../../src/shell/main-runner.js';
18
+ import { createEffectInterpreter } from '../../src/shell/effect-interpreter.js';
19
+ import { buildPlaceholderEntry } from '../../src/shell/main-adapters.js';
20
+ import { createAdapterRegistry } from '../../src/shell/adapter/adapter-registry.js';
21
+ // REAL pure core (the same fns main.ts injects).
22
+ import { resolveDispatchConfig } from '../../src/core/runner/dispatch-config.js';
23
+ import { applyRuntimeInjections } from '../../src/core/runner/injection.js';
24
+ import { buildVmPlan, byoProbeFailureMessage } from '../../src/core/runner/vm-plan.js';
25
+ import { buildByoProbeScript, miseInstallFailureMessage, hasProjectMiseConfig } from '../../src/core/runner/mise.js';
26
+ import { selectPromptKind, renderPrompt, buildSteeringReplyPrompt, continuationPrompt } from '../../src/core/runner/prompt.js';
27
+ import { classifyTurnOutcome, decideTurnContinuation, decideAttemptOutcome, decideRecovery } from '../../src/core/runner/turn.js';
28
+ import { activeStateNames, selectIssuesByIds } from '../../src/core/issue/parse.js';
29
+ import { resolveActorString } from '../../src/core/schedule/eligibility.js';
30
+ import { assertNoCredentialMounts } from '../../src/core/vm-guards.js';
31
+ import { guestMcpUrl } from '../../src/core/mcp/url.js';
32
+ import { resolveActionsForState } from '../../src/core/workflow/derive.js';
33
+ import { deriveActionContext } from '../../src/core/actions/context.js';
34
+ import { planActions } from '../../src/core/actions/plan.js';
35
+ import { foldPredicateProbe } from '../../src/core/actions/predicates.js';
36
+ import { beginAction, foldActionOutcome, foldRenderFailed, foldSkipped, foldPredicateError, summarizeRun } from '../../src/core/actions/run-fold.js';
37
+ import { describeHandoffFailure } from '../../src/core/git/result.js';
38
+ import { foldTokenUsage } from '../../src/core/schedule/token-fold.js';
39
+ import { makeServiceConfig, makeIssue } from '../helpers/fixtures.js';
40
+ function newRec() {
41
+ return { order: [], guardMounts: 0, createVmCalled: false, createVmImagePath: null, mcpActivated: [], mcpDeactivated: [], acpRegistered: [], acpDeregistered: [], vmExecs: [], launchEnvs: [], acpWsRegistered: [], acpCtxAccepted: [], workerExits: [], specsBuilt: [], fakeCredsPlaceholder: null, perVmHooks: [], steeringCancels: [], handoffMarked: [] };
42
+ }
43
+ // ─── fakes ──────────────────────────────────────────────────────────────────────
44
+ const noopLog = { emit: () => undefined, withIssue() { return noopLog; } };
45
+ const fixedClock = { now: () => 1_000, iso: () => '1970-01-01T00:00:01.000Z' };
46
+ const fixedRandom = { newToken: () => 'tok-fixed' };
47
+ function fakeRunlog() {
48
+ return { open: () => undefined, setAttempt: () => undefined, record: () => undefined, system: () => undefined, writeSummary: () => undefined, close: () => undefined };
49
+ }
50
+ /**
51
+ * A fake guest exec. Because the runner now brings the VM up through the REAL
52
+ * GondolinDispatcher (the single path — stage guest files → BYO probe → launch),
53
+ * the fake must answer the probe: when the command is the BYO probe (`/bin/sh -c`
54
+ * with a `command -v` chain), emit the two resolved absolute paths (node + adapter)
55
+ * on stdout so the probe parses them. Staging/launch execs just exit 0.
56
+ */
57
+ function fakeVmExec(command) {
58
+ const isProbe = command[0] === '/bin/sh' && /command -v/.test(command[2] ?? '');
59
+ const stdoutText = isProbe ? '/usr/local/bin/node\n/usr/local/bin/claude\n' : '';
60
+ // A `run_in_vm` sentinel that exits non-zero, so a test can drive a FAILED phase-8
61
+ // handoff (issue 234) without a real git/gh push.
62
+ const code = command[0] === 'boom' ? 1 : 0;
63
+ return {
64
+ stdin: { write: () => undefined, end: () => undefined },
65
+ stdout: makeReadable(stdoutText),
66
+ stderr: makeReadable(''),
67
+ pid: 4242,
68
+ exit: Promise.resolve({ code, signal: null }),
69
+ kill: () => undefined,
70
+ };
71
+ function makeReadable(text) {
72
+ // Minimal Readable-ish: setEncoding + on('data') that synchronously replays the
73
+ // canned text (the dispatcher's tapStream reads it after exec.exit resolves).
74
+ const r = {
75
+ setEncoding: () => r,
76
+ on: (ev, cb) => {
77
+ if (ev === 'data' && text)
78
+ cb(text);
79
+ return r;
80
+ },
81
+ };
82
+ return r;
83
+ }
84
+ }
85
+ function fakeBaseVm(rec) {
86
+ return {
87
+ createVm: async (opts) => {
88
+ rec.order.push('createVm');
89
+ rec.createVmCalled = true;
90
+ rec.createVmImagePath = opts.imagePath;
91
+ return {
92
+ id: 'vm-1',
93
+ exec: (o) => {
94
+ rec.vmExecs.push(o.command);
95
+ // The launch exec is [<resolved-node>, <launcher-path>]; capture its env so the
96
+ // test can assert SYMPHONY_ACP_TOKEN == the WS-registered token.
97
+ const isLaunch = o.command.length === 2 && (o.command[0] ?? '').endsWith('/node');
98
+ if (isLaunch && o.env) {
99
+ rec.order.push('agent.launch');
100
+ rec.launchEnvs.push(o.env);
101
+ }
102
+ return fakeVmExec(o.command);
103
+ },
104
+ close: async () => { rec.order.push('vm.close'); },
105
+ };
106
+ },
107
+ listSessions: async () => [],
108
+ gc: async () => 0,
109
+ killAllVms: () => 0,
110
+ };
111
+ }
112
+ function fakeWorkspace(rec) {
113
+ return {
114
+ ensureFor: async () => ({ path: '/ws/issue-1', created: true }),
115
+ fetchBaseInWorkspace: async () => undefined,
116
+ remove: async () => undefined,
117
+ workspacePathFor: () => '/ws/issue-1',
118
+ inspect: async () => ({ exists: true, drifted: false, branch: null, baseSha: null, headSha: null }),
119
+ list: async () => [],
120
+ markHandoffPending: async (identifier) => { rec.handoffMarked.push(identifier); },
121
+ hasHandoffPendingMarker: async () => false,
122
+ };
123
+ }
124
+ /**
125
+ * A fake ACP port. `outcome` controls the turn results: a single PromptOutcome repeats
126
+ * every call, or an ARRAY is consumed one-per-call (the LAST element then repeats) so a
127
+ * test can stage a transient-then-recovered sequence (issue 213). `opts.alive` backs the
128
+ * `sessionAlive` liveness probe the in-session recovery path consults (default: alive).
129
+ */
130
+ function fakeAcp(rec, outcome, opts = {}) {
131
+ const queue = Array.isArray(outcome) ? [...outcome] : null;
132
+ return {
133
+ sessionNew: async () => ({ sessionId: 'sess-1' }),
134
+ runPrompt: async () => {
135
+ rec.order.push('runPrompt');
136
+ if (queue)
137
+ return queue.length > 1 ? queue.shift() : queue[0];
138
+ return outcome;
139
+ },
140
+ cancel: async () => undefined,
141
+ sessionAlive: () => opts.alive ?? true,
142
+ onEvent: () => undefined,
143
+ onTokenUsage: () => undefined,
144
+ };
145
+ }
146
+ function fakeSubstrates(rec) {
147
+ // buildAdapterSpec mints a FRESH random-ish placeholder each call (a counter) —
148
+ // exactly like the real core's randomized placeholder. So if the slice called it
149
+ // twice in one dispatch (once for guest staging, once for egress), the guest +
150
+ // egress placeholders would DIVERGE; the one-spec memo keeps them identical.
151
+ let specSeq = 0;
152
+ const credential = {
153
+ port: {},
154
+ registry: { register: async () => { rec.order.push('secret.register'); return { deregister: () => rec.order.push('secret.deregister') }; } },
155
+ ticker: { start: () => undefined, stop: () => undefined },
156
+ refreshCredential: async (adapter) => { rec.order.push(`credential.refresh:${adapter}`); return true; },
157
+ buildPerVmHooks: (input) => {
158
+ rec.perVmHooks.push({ adapterId: input.adapterId, placeholder: input.placeholder, token: input.token });
159
+ return ({ httpHooks: {}, secretManager: {} });
160
+ },
161
+ buildAdapterSpec: (adapter) => {
162
+ const placeholder = `ph-${adapter}-${specSeq++}`;
163
+ rec.specsBuilt.push({ adapter, placeholder });
164
+ return { adapter, placeholder, secretName: `SECRET_${adapter}`, substitutionHosts: ['api.example.com'] };
165
+ },
166
+ buildHooksConfig: (specs) => ({ specs: [...specs], allowedHosts: ['api.example.com'] }),
167
+ buildFakeCreds: (fakeInput) => { rec.fakeCredsPlaceholder = fakeInput.placeholder; return { files: [], env: {} }; },
168
+ };
169
+ const acpContext = {
170
+ register: (vmId, ctx) => {
171
+ rec.order.push('acpCtx.register');
172
+ rec.acpRegistered.push(vmId);
173
+ // Capture the token threaded into the launch env so the test can assert it equals
174
+ // the WS-registration token (and that the WS registration happened before launch).
175
+ rec.acpCtxAccepted.push(ctx.accepted);
176
+ },
177
+ deregister: (vmId) => { rec.order.push('acpCtx.deregister'); rec.acpDeregistered.push(vmId); },
178
+ contextForVm: () => undefined,
179
+ };
180
+ // The host `/acp` WS registry: the runner registers it EARLY (before bring-up). Mint a
181
+ // deterministic token and record the registration so the test can prove the launch-env
182
+ // token == the registered token AND register-happens-before-launch.
183
+ const acpRegistry = {
184
+ register: (issueId, identifier) => {
185
+ rec.order.push('acpWs.register');
186
+ const token = `acp-tok-${issueId}`;
187
+ rec.acpWsRegistered.push({ issueId, identifier, token });
188
+ return { token, accepted: Promise.resolve({}), cancel: () => { rec.order.push('acpWs.cancel'); } };
189
+ },
190
+ };
191
+ // The runner now reaches MCP activate/deactivate through the central interpreter
192
+ // (the `mcp` effect family — see fakeInterpreter's mcpLifecycle below), NOT through
193
+ // this substrate. The substrate is narrowed to the steering awaiter the turn loop
194
+ // parks on, mirroring the production `Pick<McpRuntime, 'steering'>` surface.
195
+ const mcp = {
196
+ steering: { await: () => new Promise(() => { }), resolve: () => false, cancel: () => undefined },
197
+ };
198
+ return { credential, acpContext, acpRegistry, mcp };
199
+ }
200
+ /** Build the effect interpreter over fakes — only the families the actions runner
201
+ * drives need real behaviour; the rest are inert. The `steering` adapter records
202
+ * cancels so the teardown test can prove the worker unwind EMITS a steering.cancel
203
+ * Effect through THIS interpreter (issue 200), not a poke. The `mcpLifecycle` adapter
204
+ * records activate/deactivate so the bracket tests prove the runner reaches them
205
+ * through THIS interpreter (the `mcp` family — issue 201), not a poke. */
206
+ function fakeInterpreter(rec, vmHandles) {
207
+ const adapters = {
208
+ vmHandleFor: (id) => vmHandles.get(id),
209
+ log: noopLog,
210
+ runlog: fakeRunlog(),
211
+ timer: { sleep: async () => undefined, setTimer: () => undefined, clearTimer: () => undefined },
212
+ steering: { await: () => new Promise(() => { }), resolve: () => false, cancel: (id) => { rec.steeringCancels.push(id); } },
213
+ // The MCP worker-lifecycle seam the runner's `mcp` activate/deactivate effects route
214
+ // through (replaces the old direct substrate poke). Records the bracket so the
215
+ // happy-path / transport-error tests can assert activate-before-deactivate and that
216
+ // activate's minted bearer rides back on the EffectResult.
217
+ mcpLifecycle: {
218
+ activate: (entry) => { rec.order.push('mcp.activate'); rec.mcpActivated.push(entry.identifier); return 'mcp-bearer'; },
219
+ deactivate: (identifier) => { rec.order.push('mcp.deactivate'); rec.mcpDeactivated.push(identifier); },
220
+ },
221
+ };
222
+ return createEffectInterpreter(adapters);
223
+ }
224
+ // ─── config / workflow / issue fixtures ─────────────────────────────────────────
225
+ const RUN_IN_VM_STATE = 'Done';
226
+ function baseConfig(states) {
227
+ return makeServiceConfig({ states });
228
+ }
229
+ /** A config whose terminal `Done` state declares ONE run_in_vm action. */
230
+ function configWithRunInVm() {
231
+ return baseConfig({
232
+ Todo: { role: 'active' },
233
+ [RUN_IN_VM_STATE]: {
234
+ role: 'terminal',
235
+ actions: [{ kind: 'run_in_vm', name: 'smoke', cmd: ['echo', 'hi'] }],
236
+ },
237
+ });
238
+ }
239
+ /** A config whose terminal `Done` state declares a run_in_vm action that FAILS
240
+ * (exits non-zero, no `route_to`) — a non-routed phase-8 handoff failure (234).
241
+ * `on_error.retry.count: 0` so it aborts on the first attempt (no backoff sleeps). */
242
+ function configWithFailingAction() {
243
+ return baseConfig({
244
+ Todo: { role: 'active' },
245
+ [RUN_IN_VM_STATE]: {
246
+ role: 'terminal',
247
+ actions: [{ kind: 'run_in_vm', name: 'handoff', cmd: ['boom'], on_error: { retry: { count: 0, backoff_ms: 0 } } }],
248
+ },
249
+ });
250
+ }
251
+ const WORKFLOW = {
252
+ config: {},
253
+ prompt_templates: { Todo: 'Work on {{ issue.id }}.', Done: 'Work on {{ issue.id }}.' },
254
+ };
255
+ function fakeIssue(state) {
256
+ return makeIssue({ id: 'ISSUE-1', identifier: 'issue-1', title: 'Smoke', description: 'body', state });
257
+ }
258
+ // ─── slice construction over the fakes ──────────────────────────────────────────
259
+ function buildSlice(rec, cfg, outcome, opts = {}) {
260
+ const vmHandles = new Map();
261
+ const interpreter = fakeInterpreter(rec, vmHandles);
262
+ const recordingGuard = (mounts, opts) => {
263
+ rec.order.push('guard');
264
+ rec.guardMounts = mounts.length;
265
+ assertNoCredentialMounts(mounts, opts);
266
+ };
267
+ const core = {
268
+ loop: {
269
+ resolveDispatchConfig, applyRuntimeInjections, buildVmPlan, selectPromptKind,
270
+ classifyTurnOutcome, decideTurnContinuation, decideAttemptOutcome,
271
+ // Tiny base backoff (1ms) keeps the recovery sleeps near-instant in tests (issue 213).
272
+ decideRecovery: ({ recoveryAttempts }) => decideRecovery({ recoveryAttempts, maxRecoveryAttempts: 3, baseBackoffMs: 1 }),
273
+ renderInitialPrompt: renderPrompt,
274
+ renderSteeringPrompt: ({ question, context, reply }) => buildSteeringReplyPrompt(question, context, reply),
275
+ continuationPrompt, activeStateNames, selectIssuesByIds,
276
+ },
277
+ actions: {
278
+ resolveActionsForState, deriveActionContext, planActions, foldPredicateProbe, beginAction, foldActionOutcome,
279
+ foldRenderFailed, foldSkipped, foldPredicateError, summarizeRun, describeHandoffFailure,
280
+ },
281
+ resolveActorString, assertNoCredentialMounts: recordingGuard, resolveDispatchConfig, guestMcpUrl, byoProbeFailureMessage,
282
+ byoProbeScript: buildByoProbeScript, miseInstallFailureMessage, hasProjectMiseConfig,
283
+ };
284
+ const ports = {
285
+ interpreter, workspaces: fakeWorkspace(rec),
286
+ tracker: { loadAllIssues: async () => ({ raw: [], root: '/trk' }) },
287
+ baseVm: fakeBaseVm(rec), acp: fakeAcp(rec, outcome, { alive: opts.acpAlive }), adapters: createAdapterRegistry(),
288
+ credentialPort: {
289
+ readClaudeIdentity: async () => null,
290
+ readCodexIdentity: async () => null,
291
+ // probe() resolves the LIVE token the bring-up keys the codex route on; the
292
+ // recorder captures the placeholder threaded into the egress hooks below.
293
+ probe: async () => ({ accessToken: 'live-secret-token', expiresAtMs: null }),
294
+ },
295
+ runlog: fakeRunlog(), log: noopLog, clock: fixedClock, random: fixedRandom,
296
+ };
297
+ const slice = buildRunnerSlice({
298
+ core, ports, substrates: fakeSubstrates(rec),
299
+ getLiveCfg: () => cfg, getWorkflow: () => WORKFLOW,
300
+ boundMcpPort: () => 8787, resolvedNodeBin: () => 'node',
301
+ launcherSource: 'export const x = 1;', miseSystemConfigSource: '[tools]\nnode = "24"\n', readEnv: () => undefined,
302
+ resolveImageSelector: opts.resolveImageSelector,
303
+ onWorkerExit: (event) => { rec.order.push('onWorkerExit'); rec.workerExits.push(event); },
304
+ });
305
+ return { slice };
306
+ }
307
+ function runningEntry(state) {
308
+ return buildPlaceholderEntry({ issue: fakeIssue(state), attempt: null, trackerRoot: '/trk' }, () => undefined);
309
+ }
310
+ // ─── tests ──────────────────────────────────────────────────────────────────────
311
+ test('happy path: guard→createVm, MCP+ACP bracket, run_in_vm execs on the live VM', async () => {
312
+ const rec = newRec();
313
+ const cfg = configWithRunInVm();
314
+ // end_turn → the turn loop refreshes the issue; an empty tracker means the issue
315
+ // is "no longer present" → the loop breaks cleanly after one turn.
316
+ const { slice } = buildSlice(rec, cfg, { reason: 'end_turn', message: 'done' });
317
+ const entry = runningEntry(RUN_IN_VM_STATE);
318
+ await slice.runWorker({ issue: entry.issue, attempt: null, trackerRoot: '/trk' }, entry, { cancelled: false });
319
+ // 1. the mount guard ran BEFORE createVm.
320
+ const gi = rec.order.indexOf('guard');
321
+ const ci = rec.order.indexOf('createVm');
322
+ assert.ok(gi >= 0 && ci >= 0 && gi < ci, `guard(${gi}) must precede createVm(${ci})`);
323
+ // 2. MCP activate/deactivate bracket the attempt.
324
+ assert.deepEqual(rec.mcpActivated, ['issue-1']);
325
+ assert.deepEqual(rec.mcpDeactivated, ['issue-1']);
326
+ assert.ok(rec.order.indexOf('mcp.activate') < rec.order.indexOf('mcp.deactivate'));
327
+ // 3. ACP dispatch context register/deregister bracket the attempt.
328
+ assert.deepEqual(rec.acpRegistered, ['vm-1']);
329
+ assert.deepEqual(rec.acpDeregistered, ['vm-1']);
330
+ assert.ok(rec.order.indexOf('acpCtx.register') < rec.order.indexOf('acpCtx.deregister'));
331
+ // 4. the run_in_vm action exec'd its command on the live VM (uncached).
332
+ assert.ok(rec.vmExecs.some((cmd) => cmd.length === 2 && cmd[0] === 'echo' && cmd[1] === 'hi'), `run_in_vm cmd must exec on the VM; saw: ${JSON.stringify(rec.vmExecs)}`);
333
+ // 5. a clean worker exit was reported.
334
+ assert.equal(rec.workerExits.length, 1);
335
+ assert.equal(rec.workerExits[0].normal, true);
336
+ // 6. (234 no-regression) a SUCCESSFUL handoff drops NO handoff-pending marker, so the
337
+ // janitor reaps the terminal workspace exactly as today.
338
+ assert.deepEqual(rec.handoffMarked, []);
339
+ });
340
+ test('FAILED terminal handoff: the runner drops a handoff-pending marker so the janitor retains the workspace (234)', async () => {
341
+ const rec = newRec();
342
+ const cfg = configWithFailingAction();
343
+ const { slice } = buildSlice(rec, cfg, { reason: 'end_turn', message: 'done' });
344
+ const entry = runningEntry(RUN_IN_VM_STATE);
345
+ await slice.runWorker({ issue: entry.issue, attempt: null, trackerRoot: '/trk' }, entry, { cancelled: false });
346
+ // The failing run_in_vm exec'd (and aborted, not routed) → the runner marked the
347
+ // workspace handoff-pending for the dispatched identifier.
348
+ assert.ok(rec.vmExecs.some((cmd) => cmd[0] === 'boom'), 'the failing handoff action must have exec\'d');
349
+ assert.deepEqual(rec.handoffMarked, ['issue-1']);
350
+ });
351
+ test('dispatcher path: single spec threaded + live-token egress route + launcher staged (codex CRITICAL/HIGH)', async () => {
352
+ const rec = newRec();
353
+ const cfg = configWithRunInVm();
354
+ const { slice } = buildSlice(rec, cfg, { reason: 'end_turn', message: 'done' });
355
+ const entry = runningEntry(RUN_IN_VM_STATE);
356
+ await slice.runWorker({ issue: entry.issue, attempt: null, trackerRoot: '/trk' }, entry, { cancelled: false });
357
+ // (#4) ONE AdapterCredentialSpec per dispatch: buildAdapterSpec was called for ONE
358
+ // adapter and every call returned the SAME placeholder (the memo) — so the guest
359
+ // fake-creds placeholder and the egress-hooks placeholder cannot diverge.
360
+ const distinctPlaceholders = new Set(rec.specsBuilt.map((s) => s.placeholder));
361
+ assert.equal(distinctPlaceholders.size, 1, `exactly one placeholder threaded, saw: ${[...distinctPlaceholders].join(', ')}`);
362
+ const onePlaceholder = [...distinctPlaceholders][0];
363
+ assert.equal(rec.fakeCredsPlaceholder, onePlaceholder, 'guest staging uses the ONE spec placeholder');
364
+ assert.equal(rec.perVmHooks.length, 1, 'per-VM egress hooks built exactly once');
365
+ assert.equal(rec.perVmHooks[0].placeholder, onePlaceholder, 'egress substitution uses the SAME placeholder as the guest');
366
+ // (#2) the per-VM hooks received the LIVE TokenInfo (probe()) — NOT null — so the
367
+ // codex chatgpt-backend route hook is keyed on a real credential (was inert: token:null).
368
+ assert.ok(rec.perVmHooks[0].token !== null, 'per-VM hooks must receive the live token (codex route active)');
369
+ assert.deepEqual(rec.perVmHooks[0].token, { accessToken: 'live-secret-token', expiresAtMs: null });
370
+ // (#1) guest staging went through the REAL dispatcher: the launcher asset
371
+ // (/opt/symphony/vm-agent.mjs) is written into the guest via a base64-pipe write
372
+ // exec BEFORE the agent launches. Find the write-exec whose script targets it.
373
+ const guestAgentPath = cfg.gondolin.guest_agent_path;
374
+ const stagedLauncher = rec.vmExecs.some((cmd) => cmd[0] === '/bin/sh' && (cmd[2] ?? '').includes(guestAgentPath));
375
+ assert.ok(stagedLauncher, `the launcher ${guestAgentPath} must be staged into the guest (a write exec references it)`);
376
+ // And the in-VM agent was actually launched: the probe resolved node + launcher and
377
+ // an exec ran [<resolved-node>, <launcher-path>].
378
+ const launched = rec.vmExecs.some((cmd) => cmd.length === 2 && cmd[1] === guestAgentPath && cmd[0].endsWith('/node'));
379
+ assert.ok(launched, 'the in-VM agent process must be launched as [resolvedNode, launcherPath]');
380
+ });
381
+ test('convert→dispatch: oci_image alone boots the converted selector when gondolin.image is null (#206)', async () => {
382
+ // The blocker the reviewer flagged: with a workflow that sets ONLY `gondolin.oci_image`,
383
+ // reconcile converts + caches the asset and resolves its runtime selector; dispatch must
384
+ // boot THAT selector, not the empty `imagePath` the old `cfg.gondolin.image ?? ''` left.
385
+ const rec = newRec();
386
+ const cfg = makeServiceConfig({
387
+ states: {
388
+ Todo: { role: 'active' },
389
+ [RUN_IN_VM_STATE]: { role: 'terminal', actions: [{ kind: 'run_in_vm', name: 'smoke', cmd: ['echo', 'hi'] }] },
390
+ },
391
+ gondolin: { image: null, oci_image: 'ghcr.io/acme/agent:1' },
392
+ });
393
+ const { slice } = buildSlice(rec, cfg, { reason: 'end_turn', message: 'done' }, {
394
+ resolveImageSelector: () => 'converted-build-id',
395
+ });
396
+ const entry = runningEntry(RUN_IN_VM_STATE);
397
+ await slice.runWorker({ issue: entry.issue, attempt: null, trackerRoot: '/trk' }, entry, { cancelled: false });
398
+ assert.equal(rec.createVmCalled, true, 'the VM was brought up');
399
+ assert.equal(rec.createVmImagePath, 'converted-build-id', 'dispatch booted the auto-converted selector, not an empty imagePath');
400
+ });
401
+ test('convert→dispatch: the `gondolin.image` escape hatch still wins over a converted selector (#206)', async () => {
402
+ // When both are set the pre-converted escape hatch boots; the converted selector is ignored.
403
+ const rec = newRec();
404
+ const cfg = makeServiceConfig({
405
+ states: {
406
+ Todo: { role: 'active' },
407
+ [RUN_IN_VM_STATE]: { role: 'terminal', actions: [{ kind: 'run_in_vm', name: 'smoke', cmd: ['echo', 'hi'] }] },
408
+ },
409
+ gondolin: { image: 'sym:pinned', oci_image: 'ghcr.io/acme/agent:1' },
410
+ });
411
+ const { slice } = buildSlice(rec, cfg, { reason: 'end_turn', message: 'done' }, {
412
+ resolveImageSelector: () => 'converted-build-id',
413
+ });
414
+ const entry = runningEntry(RUN_IN_VM_STATE);
415
+ await slice.runWorker({ issue: entry.issue, attempt: null, trackerRoot: '/trk' }, entry, { cancelled: false });
416
+ assert.equal(rec.createVmImagePath, 'sym:pinned', 'the escape hatch wins when both are set');
417
+ });
418
+ test('ACP token unified: launch-env SYMPHONY_ACP_TOKEN == the WS-registered token, registered BEFORE launch', async () => {
419
+ // The reproducible dogfood failure (issue 167): the runner minted TWO independent ACP
420
+ // tokens — one in the launch env, a DIFFERENT one in sessionNew's late registration —
421
+ // so the guest's dial-back (presenting the launch-env token) never matched the pending
422
+ // registration and was rejected. The fix: ONE token, registered with the AcpWsRegistry
423
+ // BEFORE the agent launches, threaded into the launch env, and CONSUMED (not re-minted)
424
+ // by sessionNew. This test pins both halves: same token + register-before-launch.
425
+ const rec = newRec();
426
+ const cfg = configWithRunInVm();
427
+ const { slice } = buildSlice(rec, cfg, { reason: 'end_turn', message: 'done' });
428
+ const entry = runningEntry(RUN_IN_VM_STATE);
429
+ await slice.runWorker({ issue: entry.issue, attempt: null, trackerRoot: '/trk' }, entry, { cancelled: false });
430
+ // 1. exactly ONE WS registration was made on the host /acp registry.
431
+ assert.equal(rec.acpWsRegistered.length, 1, 'one WS registration per dispatch');
432
+ const registeredToken = rec.acpWsRegistered[0].token;
433
+ assert.equal(rec.acpWsRegistered[0].issueId, entry.issue_id);
434
+ // 2. the agent launched with SYMPHONY_ACP_TOKEN == the registered token (ONE token).
435
+ assert.equal(rec.launchEnvs.length, 1, 'the agent was launched exactly once');
436
+ assert.equal(rec.launchEnvs[0].SYMPHONY_ACP_TOKEN, registeredToken, 'the launch-env bearer the guest dials back with MUST equal the registered token');
437
+ // 3. the WS registration happened BEFORE the agent launch (so the dial-back, which
438
+ // fires immediately on launch, finds a pending registration).
439
+ const regIdx = rec.order.indexOf('acpWs.register');
440
+ const launchIdx = rec.order.indexOf('agent.launch');
441
+ assert.ok(regIdx >= 0 && launchIdx >= 0, 'both register + launch were recorded');
442
+ assert.ok(regIdx < launchIdx, `WS register(${regIdx}) must precede agent launch(${launchIdx})`);
443
+ // 4. the ACP dispatch context carried the registration's dial-back stream (so
444
+ // sessionNew consumes it rather than registering a second token).
445
+ assert.equal(rec.acpCtxAccepted.length, 1, 'the dispatch context carried the dial-back stream');
446
+ });
447
+ test('token deltas fold into the running entry totals (§2c dashboard)', () => {
448
+ // The orchestrator folds ABSOLUTE ACP usage onto the entry via core foldTokenUsage.
449
+ const entry = runningEntry('Todo');
450
+ const apply = (usage) => {
451
+ const d = foldTokenUsage({ last_reported_input: entry.last_reported_input_tokens, last_reported_output: entry.last_reported_output_tokens, last_reported_total: entry.last_reported_total_tokens }, usage);
452
+ entry.input_tokens = usage.input_tokens;
453
+ entry.output_tokens = usage.output_tokens;
454
+ entry.total_tokens = usage.total_tokens;
455
+ entry.last_reported_input_tokens = d.last_reported_input;
456
+ entry.last_reported_output_tokens = d.last_reported_output;
457
+ entry.last_reported_total_tokens = d.last_reported_total;
458
+ };
459
+ apply({ input_tokens: 10, output_tokens: 4, total_tokens: 14 });
460
+ assert.deepEqual([entry.input_tokens, entry.output_tokens, entry.total_tokens], [10, 4, 14]);
461
+ // A re-report of the SAME absolute total is de-duplicated (no double count).
462
+ apply({ input_tokens: 10, output_tokens: 4, total_tokens: 14 });
463
+ assert.deepEqual([entry.input_tokens, entry.output_tokens, entry.total_tokens], [10, 4, 14]);
464
+ // A higher absolute total advances the visible counters.
465
+ apply({ input_tokens: 25, output_tokens: 9, total_tokens: 34 });
466
+ assert.deepEqual([entry.input_tokens, entry.output_tokens, entry.total_tokens], [25, 9, 34]);
467
+ });
468
+ test('transport-error path, DEAD session: no recovery → abnormal worker exit + MCP/ACP deregistered', async () => {
469
+ const rec = newRec();
470
+ const cfg = configWithRunInVm();
471
+ // A transport_error is RECOVERABLE (issue 213) — but only when the host↔guest ACP link
472
+ // is still alive. Here the WS itself died (sessionAlive=false), so in-session recovery
473
+ // is skipped: the turn falls straight through to the abnormal-exit / re-dispatch path.
474
+ const { slice } = buildSlice(rec, cfg, { reason: 'transport_error', message: 'ECONNRESET' }, { acpAlive: false });
475
+ const entry = runningEntry(RUN_IN_VM_STATE);
476
+ await slice.runWorker({ issue: entry.issue, attempt: 1, trackerRoot: '/trk' }, entry, { cancelled: false });
477
+ // The session was dead → NO re-prompt: exactly one runPrompt before falling back.
478
+ assert.equal(rec.order.filter((o) => o === 'runPrompt').length, 1, 'dead session → no recovery re-prompt');
479
+ assert.equal(rec.workerExits.length, 1);
480
+ assert.equal(rec.workerExits[0].normal, false, 'dead-session transport_error → abnormal exit (retry path)');
481
+ assert.match(rec.workerExits[0].reason, /transport|ECONNRESET/i);
482
+ // The bracket still unwinds: MCP deactivated + ACP context deregistered.
483
+ assert.deepEqual(rec.mcpDeactivated, ['issue-1']);
484
+ assert.deepEqual(rec.acpDeregistered, ['vm-1']);
485
+ // The VM was torn down on the failure path.
486
+ assert.ok(rec.order.includes('vm.close'));
487
+ });
488
+ test('in-session recovery: a 529 overload on a LIVE session re-prompts the SAME session and recovers', async () => {
489
+ const rec = newRec();
490
+ const cfg = configWithRunInVm();
491
+ // First turn is a transient overload refusal; the session is alive → recover. The
492
+ // re-prompt then ends cleanly (end_turn). The whole VM attempt is NOT discarded.
493
+ const { slice } = buildSlice(rec, cfg, [
494
+ { reason: 'refusal', message: 'API Error: Repeated 529 Overloaded errors. The API is at capacity' },
495
+ { reason: 'end_turn', message: 'done' },
496
+ ]);
497
+ const entry = runningEntry(RUN_IN_VM_STATE);
498
+ await slice.runWorker({ issue: entry.issue, attempt: 1, trackerRoot: '/trk' }, entry, { cancelled: false });
499
+ // Re-prompted the SAME session exactly once (two runPrompt calls), NO teardown between.
500
+ assert.equal(rec.order.filter((o) => o === 'runPrompt').length, 2, 'one recovery re-prompt on the same session');
501
+ assert.equal(rec.order.filter((o) => o === 'vm.close').length, 1, 'VM torn down only ONCE, at the end (no mid-recovery teardown)');
502
+ // The recovered turn counts as ONE turn — the re-prompt did NOT increment max_turns.
503
+ assert.equal(entry.turn_count, 1, 'recovery re-prompt is free (no max_turns increment)');
504
+ // A clean worker exit (recovered), NOT an abnormal re-dispatch.
505
+ assert.equal(rec.workerExits.length, 1);
506
+ assert.equal(rec.workerExits[0].normal, true, 'recovered turn → clean worker exit (no full VM re-dispatch)');
507
+ });
508
+ test('in-session recovery: budget exhausted on a persistently-overloaded LIVE session falls back to ending the attempt', async () => {
509
+ const rec = newRec();
510
+ const cfg = configWithRunInVm();
511
+ // Every prompt overloads and the session stays alive: recovery re-prompts up to the
512
+ // budget (3), then gives up → abnormal exit (the orchestrator re-dispatches as a last resort).
513
+ const { slice } = buildSlice(rec, cfg, { reason: 'refusal', message: 'overloaded: at capacity' });
514
+ const entry = runningEntry(RUN_IN_VM_STATE);
515
+ await slice.runWorker({ issue: entry.issue, attempt: 1, trackerRoot: '/trk' }, entry, { cancelled: false });
516
+ // initial prompt + 3 recovery re-prompts (the budget) = 4 calls, then give_up.
517
+ assert.equal(rec.order.filter((o) => o === 'runPrompt').length, 4, 'initial + 3 recovery re-prompts, then give up');
518
+ assert.equal(rec.workerExits.length, 1);
519
+ assert.equal(rec.workerExits[0].normal, false, 'exhausted recovery → abnormal exit (fall back to re-dispatch)');
520
+ assert.match(rec.workerExits[0].reason, /overloaded|capacity|refusal/i);
521
+ });
522
+ test('teardown emits a steering.cancel Effect through the central interpreter', async () => {
523
+ // The worker unwind must break a parked steering wait so a cancelled/finished attempt
524
+ // exits cleanly. Issue 200 routes that cancel through the SAME central interpreter the
525
+ // HTTP reply path uses (deps.performSteering → ports.interpreter.execute), never poking
526
+ // the awaiter — fakeInterpreter's `steering` family records the cancel it performs.
527
+ const rec = newRec();
528
+ const cfg = configWithRunInVm();
529
+ const { slice } = buildSlice(rec, cfg, { reason: 'end_turn', message: 'done' });
530
+ const entry = runningEntry(RUN_IN_VM_STATE);
531
+ await slice.runWorker({ issue: entry.issue, attempt: null, trackerRoot: '/trk' }, entry, { cancelled: false });
532
+ // The teardown emitted exactly one steering.cancel Effect, for THIS attempt's identifier
533
+ // (fails if the unwind stops issuing it, or pokes the awaiter off the interpreter seam).
534
+ assert.deepEqual(rec.steeringCancels, ['issue-1'], 'teardown must emit steering.cancel for the attempt');
535
+ });
536
+ //# sourceMappingURL=runner-slice.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner-slice.test.js","sourceRoot":"","sources":["../../../tests/shell/runner-slice.test.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,+EAA+E;AAC/E,8EAA8E;AAC9E,kFAAkF;AAClF,4EAA4E;AAC5E,yDAAyD;AACzD,EAAE;AACF,0BAA0B;AAC1B,iEAAiE;AACjE,mDAAmD;AACnD,oEAAoE;AACpE,6EAA6E;AAC7E,qEAAqE;AACrE,8EAA8E;AAE9E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AAEpF,iDAAiD;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AACvF,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrH,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC/H,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAClI,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACrJ,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAUvE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAiCtE,SAAS,MAAM;IACb,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;AAChW,CAAC;AAED,mFAAmF;AAEnF,MAAM,OAAO,GAAY,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AACpF,MAAM,UAAU,GAAU,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,0BAA0B,EAAE,CAAC;AACtF,MAAM,WAAW,GAAiB,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;AAElE,SAAS,UAAU;IACjB,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;AACzK,CAAC;AAED;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,OAAiB;IACnC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,8CAA8C,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,mFAAmF;IACnF,kDAAkD;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAO;QACL,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE;QACvD,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC;QAChC,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC;QACxB,GAAG,EAAE,IAAI;QACT,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC7C,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS;KACtB,CAAC;IACF,SAAS,YAAY,CAAC,IAAY;QAChC,gFAAgF;QAChF,8EAA8E;QAC9E,MAAM,CAAC,GAAG;YACR,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;YACpB,EAAE,EAAE,CAAC,EAAU,EAAE,EAA2B,EAAE,EAAE;gBAC9C,IAAI,EAAE,KAAK,MAAM,IAAI,IAAI;oBAAE,EAAE,CAAC,IAAI,CAAC,CAAC;gBACpC,OAAO,CAAC,CAAC;YACX,CAAC;SAC6B,CAAC;QACjC,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAQ;IAC1B,OAAO;QACL,QAAQ,EAAE,KAAK,EAAE,IAAqB,EAAqB,EAAE;YAC3D,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC3B,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC;YAC1B,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC;YACvC,OAAO;gBACL,EAAE,EAAE,MAAM;gBACV,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE;oBACV,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;oBAC5B,gFAAgF;oBAChF,iEAAiE;oBACjE,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAClF,IAAI,QAAQ,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;wBAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;wBAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,GAA6B,CAAC,CAAC;oBAAC,CAAC;oBAChH,OAAO,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAC/B,CAAC;gBACD,KAAK,EAAE,KAAK,IAAI,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;aACnD,CAAC;QACJ,CAAC;QACD,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;QAC5B,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACjB,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;KACpB,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,GAAQ;IAC7B,OAAO;QACL,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC/D,oBAAoB,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;QAC3C,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;QAC7B,gBAAgB,EAAE,GAAG,EAAE,CAAC,aAAa;QACrC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAU;QAC5G,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;QACpB,kBAAkB,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACjF,uBAAuB,EAAE,KAAK,IAAI,EAAE,CAAC,KAAK;KAC3C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,OAAO,CAAC,GAAQ,EAAE,OAAwC,EAAE,OAA4B,EAAE;IACjG,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,OAAO;QACL,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;QACjD,SAAS,EAAE,KAAK,IAAI,EAAE;YACpB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;YAChE,OAAO,OAAwB,CAAC;QAClC,CAAC;QACD,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;QAC7B,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI;QACtC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;QACxB,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAAQ;IAC9B,gFAAgF;IAChF,iFAAiF;IACjF,+EAA+E;IAC/E,6EAA6E;IAC7E,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,UAAU,GAAmC;QACjD,IAAI,EAAE,EAAW;QACjB,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QAC5I,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE;QACzD,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QACvG,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE;YACzB,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YACxG,OAAO,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAU,CAAC;QACzD,CAAC;QACD,gBAAgB,EAAE,CAAC,OAAO,EAAE,EAAE;YAC5B,MAAM,WAAW,GAAG,MAAM,OAAO,IAAI,OAAO,EAAE,EAAE,CAAC;YACjD,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;YAC9C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,OAAO,EAAE,EAAE,iBAAiB,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC3G,CAAC;QACD,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACvF,cAAc,EAAE,CAAC,SAAS,EAAE,EAAE,GAAG,GAAG,CAAC,oBAAoB,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;KACpH,CAAC;IACF,MAAM,UAAU,GAAmC;QACjD,QAAQ,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YACtB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAClC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,kFAAkF;YAClF,mFAAmF;YACnF,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QACD,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9F,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS;KAC9B,CAAC;IACF,uFAAuF;IACvF,uFAAuF;IACvF,oEAAoE;IACpE,MAAM,WAAW,GAAoC;QACnD,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE;YAChC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,WAAW,OAAO,EAAE,CAAC;YACnC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;YACzD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,EAAW,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9G,CAAC;KACF,CAAC;IACF,iFAAiF;IACjF,oFAAoF;IACpF,kFAAkF;IAClF,6EAA6E;IAC7E,MAAM,GAAG,GAA4B;QACnC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,OAAO,CAAS,GAAG,EAAE,GAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE;KACxG,CAAC;IACF,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;AACtD,CAAC;AAED;;;;;2EAK2E;AAC3E,SAAS,eAAe,CAAC,GAAQ,EAAE,SAAgC;IACjE,MAAM,QAAQ,GAAG;QACf,WAAW,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9C,GAAG,EAAE,OAAO;QACZ,MAAM,EAAE,UAAU,EAAE;QACpB,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE;QAC/F,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,OAAO,CAAS,GAAG,EAAE,GAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAU,EAAE,EAAE,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;QACzI,qFAAqF;QACrF,+EAA+E;QAC/E,oFAAoF;QACpF,2DAA2D;QAC3D,YAAY,EAAE;YACZ,QAAQ,EAAE,CAAC,KAAmB,EAAE,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC;YACpI,UAAU,EAAE,CAAC,UAAkB,EAAE,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;SAC/G;KAC2B,CAAC;IAC/B,OAAO,uBAAuB,CAAC,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED,mFAAmF;AAEnF,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,SAAS,UAAU,CAAC,MAAmC;IACrD,OAAO,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,0EAA0E;AAC1E,SAAS,iBAAiB;IACxB,OAAO,UAAU,CAAC;QAChB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,CAAC,eAAe,CAAC,EAAE;YACjB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;SACrE;KACF,CAAC,CAAC;AACL,CAAC;AAED;;uFAEuF;AACvF,SAAS,uBAAuB;IAC9B,OAAO,UAAU,CAAC;QAChB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,CAAC,eAAe,CAAC,EAAE;YACjB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;SACnH;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,QAAQ,GAAuB;IACnC,MAAM,EAAE,EAAE;IACV,gBAAgB,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,IAAI,EAAE,yBAAyB,EAAE;CACvF,CAAC;AAEF,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;AACzG,CAAC;AAED,mFAAmF;AAEnF,SAAS,UAAU,CACjB,GAAQ,EACR,GAAkB,EAClB,OAAwC,EACxC,OAA2E,EAAE;IAE7E,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC9C,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAEpD,MAAM,cAAc,GAAgD,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;QACnF,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;QAChC,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC;IAEF,MAAM,IAAI,GAAoB;QAC5B,IAAI,EAAE;YACJ,qBAAqB,EAAE,sBAAsB,EAAE,WAAW,EAAE,gBAAgB;YAC5E,mBAAmB,EAAE,sBAAsB,EAAE,oBAAoB;YACjE,uFAAuF;YACvF,cAAc,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;YACxH,mBAAmB,EAAE,YAAY;YACjC,oBAAoB,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,wBAAwB,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC;YAC1G,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB;SACxD;QACD,OAAO,EAAE;YACP,sBAAsB,EAAE,mBAAmB,EAAE,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,iBAAiB;YAC5G,gBAAgB,EAAE,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,sBAAsB;SACxF;QACD,kBAAkB,EAAE,wBAAwB,EAAE,cAAc,EAAE,qBAAqB,EAAE,WAAW,EAAE,sBAAsB;QACxH,cAAc,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,oBAAoB;KACrF,CAAC;IAEF,MAAM,KAAK,GAAgB;QACzB,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC;QAC3C,OAAO,EAAE,EAAE,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE;QACnE,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,qBAAqB,EAAE;QAChH,cAAc,EAAE;YACd,kBAAkB,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;YACpC,iBAAiB,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;YACnC,4EAA4E;YAC5E,0EAA0E;YAC1E,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,mBAAmB,EAAE,WAAW,EAAE,IAAI,EAAY,CAAA;SAC7E;QACV,MAAM,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW;KAC3E,CAAC;IAEF,MAAM,KAAK,GAAG,gBAAgB,CAAC;QAC7B,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,CAAC,GAAG,CAAC;QAC5C,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,QAAQ;QAClD,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM;QACvD,cAAc,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS;QACjH,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;QAC/C,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KAC1F,CAAC,CAAC;IACH,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,qBAAqB,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AACjH,CAAC;AAED,mFAAmF;AAEnF,IAAI,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;IAC7F,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,iFAAiF;IACjF,mEAAmE;IACnE,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAChF,MAAM,KAAK,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAE5C,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAE/G,0CAA0C;IAC1C,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,2BAA2B,EAAE,GAAG,CAAC,CAAC;IAEtF,kDAAkD;IAClD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEnF,mEAAmE;IACnE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9C,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAEzF,wEAAwE;IACxE,MAAM,CAAC,EAAE,CACP,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,EACnF,2CAA2C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CACzE,CAAC;IAEF,uCAAuC;IACvC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE/C,sFAAsF;IACtF,yDAAyD;IACzD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+GAA+G,EAAE,KAAK,IAAI,EAAE;IAC/H,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,uBAAuB,EAAE,CAAC;IACtC,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAChF,MAAM,KAAK,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAE5C,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAE/G,iFAAiF;IACjF,2DAA2D;IAC3D,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,EAAE,8CAA8C,CAAC,CAAC;IACxG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yGAAyG,EAAE,KAAK,IAAI,EAAE;IACzH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAChF,MAAM,KAAK,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAE5C,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAE/G,mFAAmF;IACnF,iFAAiF;IACjF,0EAA0E;IAC1E,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/E,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,EAAE,0CAA0C,CAAC,GAAG,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7H,MAAM,cAAc,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAE,CAAC;IACrD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,EAAE,cAAc,EAAE,6CAA6C,CAAC,CAAC;IACtG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,wCAAwC,CAAC,CAAC;IACjF,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,cAAc,EAAE,4DAA4D,CAAC,CAAC;IAE3H,kFAAkF;IAClF,0FAA0F;IAC1F,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,KAAK,KAAK,IAAI,EAAE,+DAA+D,CAAC,CAAC;IAC9G,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpG,0EAA0E;IAC1E,iFAAiF;IACjF,+EAA+E;IAC/E,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC;IACrD,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CACrC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CACzE,CAAC;IACF,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,cAAc,6DAA6D,CAAC,CAAC;IACvH,oFAAoF;IACpF,kDAAkD;IAClD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,cAAc,IAAI,GAAG,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACvH,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,0EAA0E,CAAC,CAAC;AAClG,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mGAAmG,EAAE,KAAK,IAAI,EAAE;IACnH,yFAAyF;IACzF,yFAAyF;IACzF,yFAAyF;IACzF,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,iBAAiB,CAAC;QAC5B,MAAM,EAAE;YACN,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE;SAC9G;QACD,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,sBAAsB,EAAE;KAC7D,CAAC,CAAC;IACH,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9E,oBAAoB,EAAE,GAAG,EAAE,CAAC,oBAAoB;KACjD,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAE5C,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAE/G,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAAC;IAChE,MAAM,CAAC,KAAK,CACV,GAAG,CAAC,iBAAiB,EAAE,oBAAoB,EAC3C,qEAAqE,CACtE,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iGAAiG,EAAE,KAAK,IAAI,EAAE;IACjH,6FAA6F;IAC7F,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,iBAAiB,CAAC;QAC5B,MAAM,EAAE;YACN,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE;SAC9G;QACD,QAAQ,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,sBAAsB,EAAE;KACrE,CAAC,CAAC;IACH,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9E,oBAAoB,EAAE,GAAG,EAAE,CAAC,oBAAoB;KACjD,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAE5C,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAE/G,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,EAAE,YAAY,EAAE,yCAAyC,CAAC,CAAC;AAC/F,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uGAAuG,EAAE,KAAK,IAAI,EAAE;IACvH,sFAAsF;IACtF,sFAAsF;IACtF,uFAAuF;IACvF,uFAAuF;IACvF,wFAAwF;IACxF,kFAAkF;IAClF,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAChF,MAAM,KAAK,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAE5C,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAE/G,qEAAqE;IACrE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,EAAE,kCAAkC,CAAC,CAAC;IAChF,MAAM,eAAe,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;IACtD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAE,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE9D,qFAAqF;IACrF,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,qCAAqC,CAAC,CAAC;IAC9E,MAAM,CAAC,KAAK,CACV,GAAG,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,kBAAkB,EAAE,eAAe,EACtD,iFAAiF,CAClF,CAAC;IAEF,mFAAmF;IACnF,iEAAiE;IACjE,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACpD,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,sCAAsC,CAAC,CAAC;IACjF,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,SAAS,EAAE,eAAe,MAAM,+BAA+B,SAAS,GAAG,CAAC,CAAC;IAEhG,8EAA8E;IAC9E,qEAAqE;IACrE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,mDAAmD,CAAC,CAAC;AAClG,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iEAAiE,EAAE,GAAG,EAAE;IAC3E,oFAAoF;IACpF,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,CAAC,KAA4E,EAAQ,EAAE;QACnG,MAAM,CAAC,GAAG,cAAc,CACtB,EAAE,mBAAmB,EAAE,KAAK,CAAC,0BAA0B,EAAE,oBAAoB,EAAE,KAAK,CAAC,2BAA2B,EAAE,mBAAmB,EAAE,KAAK,CAAC,0BAA0B,EAAE,EACzK,KAAK,CACN,CAAC;QACF,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QAAC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;QAAC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;QAC5H,KAAK,CAAC,0BAA0B,GAAG,CAAC,CAAC,mBAAmB,CAAC;QAAC,KAAK,CAAC,2BAA2B,GAAG,CAAC,CAAC,oBAAoB,CAAC;QAAC,KAAK,CAAC,0BAA0B,GAAG,CAAC,CAAC,mBAAmB,CAAC;IACjL,CAAC,CAAC;IACF,KAAK,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7F,6EAA6E;IAC7E,KAAK,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC7F,yDAAyD;IACzD,KAAK,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;IAChE,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/F,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+FAA+F,EAAE,KAAK,IAAI,EAAE;IAC/G,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,uFAAuF;IACvF,uFAAuF;IACvF,uFAAuF;IACvF,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAClH,MAAM,KAAK,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAE5C,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAE5G,kFAAkF;IAClF,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,sCAAsC,CAAC,CAAC;IAC3G,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,KAAK,EAAE,2DAA2D,CAAC,CAAC;IAC7G,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAClE,yEAAyE;IACzE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;IAClD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAChD,4CAA4C;IAC5C,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gGAAgG,EAAE,KAAK,IAAI,EAAE;IAChH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,kFAAkF;IAClF,iFAAiF;IACjF,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE;QACrC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,mEAAmE,EAAE;QACnG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE;KACxC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAE5C,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAE5G,wFAAwF;IACxF,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,4CAA4C,CAAC,CAAC;IACjH,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,+DAA+D,CAAC,CAAC;IACnI,qFAAqF;IACrF,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,qDAAqD,CAAC,CAAC;IACzF,gEAAgE;IAChE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,IAAI,EAAE,6DAA6D,CAAC,CAAC;AAChH,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kHAAkH,EAAE,KAAK,IAAI,EAAE;IAClI,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,oFAAoF;IACpF,+FAA+F;IAC/F,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,yBAAyB,EAAE,CAAC,CAAC;IAClG,MAAM,KAAK,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAE5C,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAE5G,+EAA+E;IAC/E,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,+CAA+C,CAAC,CAAC;IACpH,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,KAAK,EAAE,+DAA+D,CAAC,CAAC;IACjH,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;IACzF,sFAAsF;IACtF,uFAAuF;IACvF,wFAAwF;IACxF,oFAAoF;IACpF,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;IAChC,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAChF,MAAM,KAAK,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;IAE5C,MAAM,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAE/G,yFAAyF;IACzF,yFAAyF;IACzF,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,SAAS,CAAC,EAAE,oDAAoD,CAAC,CAAC;AAC3G,CAAC,CAAC,CAAC"}