wicked-crew 0.7.40 → 0.7.45

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 (360) hide show
  1. package/dist/api/audit.d.ts +3 -0
  2. package/dist/api/audit.d.ts.map +1 -1
  3. package/dist/api/audit.js +2 -0
  4. package/dist/api/audit.js.map +1 -1
  5. package/dist/api/capture.d.ts +149 -0
  6. package/dist/api/capture.d.ts.map +1 -0
  7. package/dist/api/capture.js +330 -0
  8. package/dist/api/capture.js.map +1 -0
  9. package/dist/api/chat-citations.d.ts +174 -0
  10. package/dist/api/chat-citations.d.ts.map +1 -0
  11. package/dist/api/chat-citations.js +528 -0
  12. package/dist/api/chat-citations.js.map +1 -0
  13. package/dist/api/chat-transcripts.d.ts +20 -1
  14. package/dist/api/chat-transcripts.d.ts.map +1 -1
  15. package/dist/api/chat-transcripts.js +29 -0
  16. package/dist/api/chat-transcripts.js.map +1 -1
  17. package/dist/api/delivery-cache.d.ts +2 -2
  18. package/dist/api/delivery-freeze.d.ts +66 -0
  19. package/dist/api/delivery-freeze.d.ts.map +1 -0
  20. package/dist/api/delivery-freeze.js +104 -0
  21. package/dist/api/delivery-freeze.js.map +1 -0
  22. package/dist/api/delivery-index.d.ts +53 -9
  23. package/dist/api/delivery-index.d.ts.map +1 -1
  24. package/dist/api/delivery-index.js +115 -22
  25. package/dist/api/delivery-index.js.map +1 -1
  26. package/dist/api/demo.d.ts +90 -0
  27. package/dist/api/demo.d.ts.map +1 -0
  28. package/dist/api/demo.js +492 -0
  29. package/dist/api/demo.js.map +1 -0
  30. package/dist/api/diagnostics.d.ts +64 -1
  31. package/dist/api/diagnostics.d.ts.map +1 -1
  32. package/dist/api/diagnostics.js +129 -1
  33. package/dist/api/diagnostics.js.map +1 -1
  34. package/dist/api/eval-sample.d.ts +6 -6
  35. package/dist/api/governance-steering.d.ts +2 -2
  36. package/dist/api/mcp.d.ts +282 -0
  37. package/dist/api/mcp.d.ts.map +1 -0
  38. package/dist/api/mcp.js +521 -0
  39. package/dist/api/mcp.js.map +1 -0
  40. package/dist/api/plan-schema.d.ts +56 -0
  41. package/dist/api/plan-schema.d.ts.map +1 -0
  42. package/dist/api/plan-schema.js +26 -0
  43. package/dist/api/plan-schema.js.map +1 -0
  44. package/dist/api/roster-standing.d.ts +15 -2
  45. package/dist/api/roster-standing.d.ts.map +1 -1
  46. package/dist/api/roster-standing.js +55 -3
  47. package/dist/api/roster-standing.js.map +1 -1
  48. package/dist/api/routes.d.ts +630 -51
  49. package/dist/api/routes.d.ts.map +1 -1
  50. package/dist/api/routes.js +738 -127
  51. package/dist/api/routes.js.map +1 -1
  52. package/dist/api/run-files.d.ts.map +1 -1
  53. package/dist/api/run-files.js +31 -2
  54. package/dist/api/run-files.js.map +1 -1
  55. package/dist/api/run-liveness.d.ts +41 -0
  56. package/dist/api/run-liveness.d.ts.map +1 -0
  57. package/dist/api/run-liveness.js +166 -0
  58. package/dist/api/run-liveness.js.map +1 -0
  59. package/dist/api/seat-health.d.ts.map +1 -1
  60. package/dist/api/seat-health.js +20 -4
  61. package/dist/api/seat-health.js.map +1 -1
  62. package/dist/api/seat-probe.d.ts +141 -0
  63. package/dist/api/seat-probe.d.ts.map +1 -0
  64. package/dist/api/seat-probe.js +257 -0
  65. package/dist/api/seat-probe.js.map +1 -0
  66. package/dist/api/seat-record.d.ts +40 -0
  67. package/dist/api/seat-record.d.ts.map +1 -0
  68. package/dist/api/seat-record.js +218 -0
  69. package/dist/api/seat-record.js.map +1 -0
  70. package/dist/api/seat-signin.d.ts.map +1 -1
  71. package/dist/api/seat-signin.js +3 -1
  72. package/dist/api/seat-signin.js.map +1 -1
  73. package/dist/api/seat-standing.d.ts +24 -4
  74. package/dist/api/seat-standing.d.ts.map +1 -1
  75. package/dist/api/seat-standing.js +50 -3
  76. package/dist/api/seat-standing.js.map +1 -1
  77. package/dist/api/server.d.ts +34 -48
  78. package/dist/api/server.d.ts.map +1 -1
  79. package/dist/api/server.js +283 -107
  80. package/dist/api/server.js.map +1 -1
  81. package/dist/api/skills.d.ts +3 -1
  82. package/dist/api/skills.d.ts.map +1 -1
  83. package/dist/api/skills.js +7 -2
  84. package/dist/api/skills.js.map +1 -1
  85. package/dist/api/stall-watchdog.d.ts +34 -3
  86. package/dist/api/stall-watchdog.d.ts.map +1 -1
  87. package/dist/api/stall-watchdog.js +107 -8
  88. package/dist/api/stall-watchdog.js.map +1 -1
  89. package/dist/api/steering-landing.d.ts +6 -6
  90. package/dist/api/steering-landing.d.ts.map +1 -1
  91. package/dist/api/steering-landing.js +7 -9
  92. package/dist/api/steering-landing.js.map +1 -1
  93. package/dist/api/testing.d.ts +6 -4
  94. package/dist/api/testing.d.ts.map +1 -1
  95. package/dist/api/testing.js +82 -47
  96. package/dist/api/testing.js.map +1 -1
  97. package/dist/campaign/boot-resume.d.ts +34 -0
  98. package/dist/campaign/boot-resume.d.ts.map +1 -0
  99. package/dist/campaign/boot-resume.js +45 -0
  100. package/dist/campaign/boot-resume.js.map +1 -0
  101. package/dist/campaigns/rollup.d.ts +4 -1
  102. package/dist/campaigns/rollup.d.ts.map +1 -1
  103. package/dist/campaigns/rollup.js +6 -1
  104. package/dist/campaigns/rollup.js.map +1 -1
  105. package/dist/campaigns/routes.d.ts +2 -2
  106. package/dist/cli/bearer.d.ts +27 -1
  107. package/dist/cli/bearer.d.ts.map +1 -1
  108. package/dist/cli/bearer.js +62 -2
  109. package/dist/cli/bearer.js.map +1 -1
  110. package/dist/cli/governance.d.ts +11 -0
  111. package/dist/cli/governance.d.ts.map +1 -1
  112. package/dist/cli/governance.js +8 -2
  113. package/dist/cli/governance.js.map +1 -1
  114. package/dist/cli/index.d.ts.map +1 -1
  115. package/dist/cli/index.js +140 -75
  116. package/dist/cli/index.js.map +1 -1
  117. package/dist/cli/mcp.d.ts +11 -0
  118. package/dist/cli/mcp.d.ts.map +1 -1
  119. package/dist/cli/mcp.js +40 -9
  120. package/dist/cli/mcp.js.map +1 -1
  121. package/dist/cli/service.d.ts +78 -0
  122. package/dist/cli/service.d.ts.map +1 -0
  123. package/dist/cli/service.js +334 -0
  124. package/dist/cli/service.js.map +1 -0
  125. package/dist/core/adapter.d.ts +238 -12
  126. package/dist/core/adapter.d.ts.map +1 -1
  127. package/dist/core/adapter.js +619 -157
  128. package/dist/core/adapter.js.map +1 -1
  129. package/dist/core/bridge-reaper.d.ts +4 -1
  130. package/dist/core/bridge-reaper.d.ts.map +1 -1
  131. package/dist/core/bridge-reaper.js +15 -1
  132. package/dist/core/bridge-reaper.js.map +1 -1
  133. package/dist/core/bus-notice.d.ts +27 -0
  134. package/dist/core/bus-notice.d.ts.map +1 -0
  135. package/dist/core/bus-notice.js +24 -0
  136. package/dist/core/bus-notice.js.map +1 -0
  137. package/dist/core/bus.d.ts +99 -0
  138. package/dist/core/bus.d.ts.map +1 -0
  139. package/dist/core/bus.js +176 -0
  140. package/dist/core/bus.js.map +1 -0
  141. package/dist/core/deliver-exclusions.d.ts +71 -0
  142. package/dist/core/deliver-exclusions.d.ts.map +1 -0
  143. package/dist/core/deliver-exclusions.js +110 -0
  144. package/dist/core/deliver-exclusions.js.map +1 -0
  145. package/dist/core/deliver-text.d.ts +61 -14
  146. package/dist/core/deliver-text.d.ts.map +1 -1
  147. package/dist/core/deliver-text.js +178 -30
  148. package/dist/core/deliver-text.js.map +1 -1
  149. package/dist/core/deliver-triage.d.ts +11 -2
  150. package/dist/core/deliver-triage.d.ts.map +1 -1
  151. package/dist/core/deliver-triage.js +19 -1
  152. package/dist/core/deliver-triage.js.map +1 -1
  153. package/dist/core/deliver.d.ts +161 -3
  154. package/dist/core/deliver.d.ts.map +1 -1
  155. package/dist/core/deliver.js +463 -25
  156. package/dist/core/deliver.js.map +1 -1
  157. package/dist/core/deliverable-floor.d.ts.map +1 -1
  158. package/dist/core/deliverable-floor.js +5 -7
  159. package/dist/core/deliverable-floor.js.map +1 -1
  160. package/dist/core/engine-bus.d.ts +40 -0
  161. package/dist/core/engine-bus.d.ts.map +1 -0
  162. package/dist/core/engine-bus.js +27 -0
  163. package/dist/core/engine-bus.js.map +1 -0
  164. package/dist/core/estate-mcp-client.d.ts +87 -5
  165. package/dist/core/estate-mcp-client.d.ts.map +1 -1
  166. package/dist/core/estate-mcp-client.js +90 -11
  167. package/dist/core/estate-mcp-client.js.map +1 -1
  168. package/dist/core/linked-issues.d.ts +46 -0
  169. package/dist/core/linked-issues.d.ts.map +1 -0
  170. package/dist/core/linked-issues.js +123 -0
  171. package/dist/core/linked-issues.js.map +1 -0
  172. package/dist/core/run-identity.d.ts +100 -0
  173. package/dist/core/run-identity.d.ts.map +1 -0
  174. package/dist/core/run-identity.js +178 -0
  175. package/dist/core/run-identity.js.map +1 -0
  176. package/dist/core/shutdown.d.ts +16 -0
  177. package/dist/core/shutdown.d.ts.map +1 -0
  178. package/dist/core/shutdown.js +39 -0
  179. package/dist/core/shutdown.js.map +1 -0
  180. package/dist/core/types.d.ts +15 -1
  181. package/dist/core/types.d.ts.map +1 -1
  182. package/dist/core/types.js +4 -0
  183. package/dist/core/types.js.map +1 -1
  184. package/dist/interactive/bridge-pool.d.ts +67 -3
  185. package/dist/interactive/bridge-pool.d.ts.map +1 -1
  186. package/dist/interactive/bridge-pool.js +129 -13
  187. package/dist/interactive/bridge-pool.js.map +1 -1
  188. package/dist/interactive/bridge-root.d.ts +9 -0
  189. package/dist/interactive/bridge-root.d.ts.map +1 -1
  190. package/dist/interactive/bridge-root.js +11 -4
  191. package/dist/interactive/bridge-root.js.map +1 -1
  192. package/dist/interactive/chat-events.d.ts +14 -9
  193. package/dist/interactive/chat-events.d.ts.map +1 -1
  194. package/dist/interactive/chat-events.js +55 -57
  195. package/dist/interactive/chat-events.js.map +1 -1
  196. package/dist/interactive/council-outcome.d.ts +1 -0
  197. package/dist/interactive/council-outcome.d.ts.map +1 -1
  198. package/dist/interactive/council-outcome.js +33 -0
  199. package/dist/interactive/council-outcome.js.map +1 -1
  200. package/dist/interactive/draft-events.d.ts +36 -17
  201. package/dist/interactive/draft-events.d.ts.map +1 -1
  202. package/dist/interactive/draft-events.js +121 -92
  203. package/dist/interactive/draft-events.js.map +1 -1
  204. package/dist/interactive/draft-skill.d.ts +59 -0
  205. package/dist/interactive/draft-skill.d.ts.map +1 -1
  206. package/dist/interactive/draft-skill.js +233 -0
  207. package/dist/interactive/draft-skill.js.map +1 -1
  208. package/dist/interactive/edit-events.d.ts +1 -14
  209. package/dist/interactive/edit-events.d.ts.map +1 -1
  210. package/dist/interactive/edit-events.js +37 -70
  211. package/dist/interactive/edit-events.js.map +1 -1
  212. package/dist/interactive/proxy-routes.d.ts +2 -2
  213. package/dist/interactive/proxy-routes.d.ts.map +1 -1
  214. package/dist/interactive/proxy-routes.js +4 -13
  215. package/dist/interactive/proxy-routes.js.map +1 -1
  216. package/dist/interactive/ws-relay.d.ts +9 -10
  217. package/dist/interactive/ws-relay.d.ts.map +1 -1
  218. package/dist/interactive/ws-relay.js +23 -50
  219. package/dist/interactive/ws-relay.js.map +1 -1
  220. package/dist/mcp/broker.d.ts +88 -0
  221. package/dist/mcp/broker.d.ts.map +1 -0
  222. package/dist/mcp/broker.js +307 -0
  223. package/dist/mcp/broker.js.map +1 -0
  224. package/dist/mcp/call-records.d.ts +61 -0
  225. package/dist/mcp/call-records.d.ts.map +1 -0
  226. package/dist/mcp/call-records.js +135 -0
  227. package/dist/mcp/call-records.js.map +1 -0
  228. package/dist/mcp/classify.d.ts +45 -0
  229. package/dist/mcp/classify.d.ts.map +1 -0
  230. package/dist/mcp/classify.js +83 -0
  231. package/dist/mcp/classify.js.map +1 -0
  232. package/dist/mcp/discovery.d.ts +24 -0
  233. package/dist/mcp/discovery.d.ts.map +1 -0
  234. package/dist/mcp/discovery.js +78 -0
  235. package/dist/mcp/discovery.js.map +1 -0
  236. package/dist/mcp/invoke.d.ts +36 -0
  237. package/dist/mcp/invoke.d.ts.map +1 -0
  238. package/dist/mcp/invoke.js +80 -0
  239. package/dist/mcp/invoke.js.map +1 -0
  240. package/dist/mcp/policies.d.ts +110 -0
  241. package/dist/mcp/policies.d.ts.map +1 -0
  242. package/dist/mcp/policies.js +400 -0
  243. package/dist/mcp/policies.js.map +1 -0
  244. package/dist/mcp/probe.d.ts +66 -0
  245. package/dist/mcp/probe.d.ts.map +1 -0
  246. package/dist/mcp/probe.js +116 -0
  247. package/dist/mcp/probe.js.map +1 -0
  248. package/dist/mcp/redact.d.ts +34 -0
  249. package/dist/mcp/redact.d.ts.map +1 -0
  250. package/dist/mcp/redact.js +84 -0
  251. package/dist/mcp/redact.js.map +1 -0
  252. package/dist/mcp/registry-store.d.ts +69 -0
  253. package/dist/mcp/registry-store.d.ts.map +1 -0
  254. package/dist/mcp/registry-store.js +82 -0
  255. package/dist/mcp/registry-store.js.map +1 -0
  256. package/dist/mcp/registry.d.ts +147 -0
  257. package/dist/mcp/registry.d.ts.map +1 -0
  258. package/dist/mcp/registry.js +509 -0
  259. package/dist/mcp/registry.js.map +1 -0
  260. package/dist/mcp/rest.d.ts +111 -0
  261. package/dist/mcp/rest.d.ts.map +1 -0
  262. package/dist/mcp/rest.js +606 -0
  263. package/dist/mcp/rest.js.map +1 -0
  264. package/dist/mcp/secrets.d.ts +66 -0
  265. package/dist/mcp/secrets.d.ts.map +1 -0
  266. package/dist/mcp/secrets.js +180 -0
  267. package/dist/mcp/secrets.js.map +1 -0
  268. package/dist/mcp/tool-list.d.ts +25 -0
  269. package/dist/mcp/tool-list.d.ts.map +1 -0
  270. package/dist/mcp/tool-list.js +62 -0
  271. package/dist/mcp/tool-list.js.map +1 -0
  272. package/dist/mcp/upstream-error.d.ts +12 -0
  273. package/dist/mcp/upstream-error.d.ts.map +1 -0
  274. package/dist/mcp/upstream-error.js +14 -0
  275. package/dist/mcp/upstream-error.js.map +1 -0
  276. package/dist/mcp/usage.d.ts +31 -0
  277. package/dist/mcp/usage.d.ts.map +1 -0
  278. package/dist/mcp/usage.js +159 -0
  279. package/dist/mcp/usage.js.map +1 -0
  280. package/dist/presets/routes.d.ts +53 -0
  281. package/dist/presets/routes.d.ts.map +1 -0
  282. package/dist/presets/routes.js +115 -0
  283. package/dist/presets/routes.js.map +1 -0
  284. package/dist/projects/activity.d.ts +6 -18
  285. package/dist/projects/activity.d.ts.map +1 -1
  286. package/dist/projects/activity.js +17 -60
  287. package/dist/projects/activity.js.map +1 -1
  288. package/dist/projects/events.d.ts +6 -5
  289. package/dist/projects/events.d.ts.map +1 -1
  290. package/dist/projects/events.js +33 -58
  291. package/dist/projects/events.js.map +1 -1
  292. package/dist/projects/routes.d.ts.map +1 -1
  293. package/dist/projects/routes.js +19 -0
  294. package/dist/projects/routes.js.map +1 -1
  295. package/dist/projects/state-home-preflight.d.ts.map +1 -1
  296. package/dist/projects/state-home-preflight.js +7 -0
  297. package/dist/projects/state-home-preflight.js.map +1 -1
  298. package/dist/projects/state-home-registry.d.ts.map +1 -1
  299. package/dist/projects/state-home-registry.js +9 -1
  300. package/dist/projects/state-home-registry.js.map +1 -1
  301. package/dist/qe/acceptance.d.ts +28 -28
  302. package/dist/qe/acceptance.d.ts.map +1 -1
  303. package/dist/qe/acceptance.js +60 -61
  304. package/dist/qe/acceptance.js.map +1 -1
  305. package/dist/qe/test-sets.d.ts +3 -5
  306. package/dist/qe/test-sets.d.ts.map +1 -1
  307. package/dist/qe/test-sets.js +5 -7
  308. package/dist/qe/test-sets.js.map +1 -1
  309. package/dist/skills/installed.d.ts +51 -0
  310. package/dist/skills/installed.d.ts.map +1 -0
  311. package/dist/skills/installed.js +46 -0
  312. package/dist/skills/installed.js.map +1 -0
  313. package/dist/standing-orders/evaluator.d.ts +113 -0
  314. package/dist/standing-orders/evaluator.d.ts.map +1 -0
  315. package/dist/standing-orders/evaluator.js +225 -0
  316. package/dist/standing-orders/evaluator.js.map +1 -0
  317. package/dist/standing-orders/history.d.ts +58 -0
  318. package/dist/standing-orders/history.d.ts.map +1 -0
  319. package/dist/standing-orders/history.js +117 -0
  320. package/dist/standing-orders/history.js.map +1 -0
  321. package/dist/standing-orders/parse.d.ts +19 -0
  322. package/dist/standing-orders/parse.d.ts.map +1 -0
  323. package/dist/standing-orders/parse.js +75 -0
  324. package/dist/standing-orders/parse.js.map +1 -0
  325. package/dist/standing-orders/routes.d.ts +180 -0
  326. package/dist/standing-orders/routes.d.ts.map +1 -0
  327. package/dist/standing-orders/routes.js +95 -0
  328. package/dist/standing-orders/routes.js.map +1 -0
  329. package/dist/standing-orders/store.d.ts +154 -0
  330. package/dist/standing-orders/store.d.ts.map +1 -0
  331. package/dist/standing-orders/store.js +189 -0
  332. package/dist/standing-orders/store.js.map +1 -0
  333. package/dist/studio/assets/index-CvV5qITf.css +32 -0
  334. package/dist/studio/assets/index-jCOy6Ns7.js +568 -0
  335. package/dist/studio/index.html +3 -3
  336. package/dist/studio/testid-inventory.json +3274 -894
  337. package/dist/team/key.d.ts +5 -0
  338. package/dist/team/key.d.ts.map +1 -0
  339. package/dist/team/key.js +21 -0
  340. package/dist/team/key.js.map +1 -0
  341. package/dist/team/routes.d.ts +196 -0
  342. package/dist/team/routes.d.ts.map +1 -0
  343. package/dist/team/routes.js +274 -0
  344. package/dist/team/routes.js.map +1 -0
  345. package/dist/team/ws-relay.d.ts +39 -0
  346. package/dist/team/ws-relay.d.ts.map +1 -0
  347. package/dist/team/ws-relay.js +63 -0
  348. package/dist/team/ws-relay.js.map +1 -0
  349. package/endpoint-manifest.json +502 -6
  350. package/package.json +6 -6
  351. package/dist/interactive/demo-events.d.ts +0 -367
  352. package/dist/interactive/demo-events.d.ts.map +0 -1
  353. package/dist/interactive/demo-events.js +0 -1293
  354. package/dist/interactive/demo-events.js.map +0 -1
  355. package/dist/qe/gate-events.d.ts +0 -113
  356. package/dist/qe/gate-events.d.ts.map +0 -1
  357. package/dist/qe/gate-events.js +0 -172
  358. package/dist/qe/gate-events.js.map +0 -1
  359. package/dist/studio/assets/index-Bg7Z3BR-.css +0 -32
  360. package/dist/studio/assets/index-BvOFMjf9.js +0 -554
@@ -0,0 +1,492 @@
1
+ /**
2
+ * The Demo experience (wicked-studio#373, migration M9b): a demo of a local app, made by a governed
3
+ * run of the built-in `demo` preset — the wicked-garden demo skill's plan → record → review.
4
+ *
5
+ * POST /projects/:id/demo mints the run's DEMO ROOT (a per-run directory on the daemon host),
6
+ * writes the brief there, and launches `demo` THROUGH `POST /runs`
7
+ * (one launch path), with the root as the run's only extra write root.
8
+ * GET /runs/:id/demo what studio shows: the stage, the presenter script and chapter list
9
+ * (the plan gate), per-chapter record progress, the contact sheets and
10
+ * the reviewer's verdicts (the review gate), and the chaptered MP4.
11
+ * GET /runs/:id/demo/file one file of the root (a contact sheet, the MP4 — with Range).
12
+ * PUT /runs/:id/demo/script the presenter's edit of `script.md` while the plan gate is open.
13
+ *
14
+ * The gates are the run's ordinary gates (`POST /runs/:id/gate`): approve, or `request_changes` with a
15
+ * note — at the plan gate it re-runs `plan`, at the review gate it rewinds to `record` (re-record one
16
+ * chapter). Nothing here decides a gate.
17
+ *
18
+ * Every file is read from the root the daemon minted for THIS run id, never from a path a caller or a
19
+ * worker names: `path` is resolved inside it, symlinks included, and only the deliverable types studio
20
+ * renders are served.
21
+ */
22
+ import { randomUUID } from 'node:crypto';
23
+ import { createReadStream, promises as fsp } from 'node:fs';
24
+ import { extname, join, relative, resolve, sep } from 'node:path';
25
+ import { z } from 'zod';
26
+ import { API_PREFIX } from './api-prefix.js';
27
+ import { coreUnitId } from './evidence.js';
28
+ const V = API_PREFIX;
29
+ /** The preset a demo run launches (wicked-core `builtin_presets`). */
30
+ export const DEMO_PRESET = 'demo';
31
+ /** Studio's Unfiled mount (`/p/default/…`): the daemon's synthesized project, never a launch's `projectId`. */
32
+ const UNFILED_PROJECT = 'default';
33
+ /** The biggest script studio shows or accepts back: a presenter script is prose. */
34
+ export const DEMO_SCRIPT_MAX_BYTES = 256 * 1024;
35
+ /** What `/demo/file` serves, by extension — the deliverables studio renders, nothing else. */
36
+ const DEMO_FILE_TYPES = {
37
+ '.mp4': 'video/mp4',
38
+ '.png': 'image/png',
39
+ '.jpg': 'image/jpeg',
40
+ '.md': 'text/markdown; charset=utf-8',
41
+ '.json': 'application/json; charset=utf-8',
42
+ };
43
+ /** Where a demo run's files live: one directory per run, outside every sandbox and state home. */
44
+ export function demoRootDir(runId) {
45
+ if (process.env.WICKED_DEMO_DIR)
46
+ return join(process.env.WICKED_DEMO_DIR, runId);
47
+ const home = process.env.HOME ?? process.env.USERPROFILE ?? '/tmp';
48
+ return join(home, '.wicked', 'demos', runId);
49
+ }
50
+ /**
51
+ * The demo root of each demo launch in flight, keyed by the run id the demo route minted. `POST /runs`
52
+ * takes no write roots from its body; it reads this in-process entry, so the root is never something a
53
+ * caller can ask for (the capture route's pattern).
54
+ */
55
+ export const demoLaunchRoots = new Map();
56
+ export const DemoLaunchSchema = z
57
+ .object({
58
+ url: z.string().trim().url().max(2048).refine((u) => /^https?:\/\//i.test(u), 'url must be http(s)'),
59
+ audience: z.string().trim().min(1).max(2000),
60
+ show: z.string().trim().min(1).max(4000),
61
+ clisJson: z.string().optional(),
62
+ })
63
+ .strict();
64
+ export const DemoScriptSchema = z.object({ content: z.string().min(1) }).strict();
65
+ /** The brief the demo run reads (the problem statement stays one short line: worker prompts are capped). */
66
+ export function demoBrief(root, b) {
67
+ return [
68
+ '# Demo brief',
69
+ '',
70
+ `- **App:** ${b.url}`,
71
+ `- **Demo root:** ${root} (every file this demo makes goes here, nowhere else)`,
72
+ '',
73
+ '## Who it is for',
74
+ '',
75
+ b.audience,
76
+ '',
77
+ '## What to show',
78
+ '',
79
+ b.show,
80
+ '',
81
+ '## Rules',
82
+ '',
83
+ '- Use the wicked-garden-demo skill: plan, then record, then review.',
84
+ '- Read-only against the app: navigate, hover, scroll, open panels and type, but never submit,',
85
+ ' launch, approve, delete, create, cancel or save. The recorder blocks every write and fails the',
86
+ ' chapter; show a control without pressing it.',
87
+ '- Label synthetic data and simulated systems as such, in the script and on screen.',
88
+ '- Measured numbers are timed on this app; anything else is labelled an estimate.',
89
+ '',
90
+ ].join('\n');
91
+ }
92
+ /** A demo run: launched from the `demo` preset — read off the engine's plan state, or, before the
93
+ * launch is scored and `team_plan` exists, off the run's identity (resolved from the launch record). */
94
+ export function isDemoRun(view) {
95
+ if (view.session.team_plan?.preset === DEMO_PRESET)
96
+ return true;
97
+ const id = view.session.run_identity;
98
+ return id?.kind === 'preset' && id.name === DEMO_PRESET;
99
+ }
100
+ /** The unit for one of the preset's steps (`<run>:plan` …). */
101
+ function stepUnit(view, step) {
102
+ return view.units.find((u) => u.id === `${view.session.id}:${step}`);
103
+ }
104
+ /** Where the run stands, in the Demo experience's words. */
105
+ export function demoStage(view) {
106
+ const s = view.session;
107
+ if (s.status === 'completed')
108
+ return 'done';
109
+ if (s.status === 'failed' || s.status === 'cancelled')
110
+ return 'failed';
111
+ const cursor = view.units[s.unit_ix];
112
+ const step = cursor?.id.startsWith(`${s.id}:`) ? cursor.id.slice(s.id.length + 1) : undefined;
113
+ const waiting = s.status === 'awaiting_human';
114
+ // A held plan (rev past the accepted one) is the team plan's own approval gate (`plan_approval`),
115
+ // which opens before `plan` has run — never the plan gate, whose script does not exist yet.
116
+ const tp = s.team_plan;
117
+ if (waiting && tp != null && tp.rev > tp.accepted_rev)
118
+ return 'team_gate';
119
+ if (waiting) {
120
+ // A step's human gate opens once that step is done, with the cursor already on the NEXT unit (the
121
+ // engine's gate reviews unit N from ord N+1): the plan gate sits before `record`, the review gate
122
+ // after `review`. Read which step is done, not where the cursor is.
123
+ const done = (id) => stepUnit(view, id)?.status === 'done';
124
+ // After `review`: its own gate when it passed, the engine's escalation gate when it did not.
125
+ if (done('review') || stepUnit(view, 'review')?.status === 'rejected')
126
+ return 'review_gate';
127
+ // Only while `record` has not started: a record the engine rejected parks at ITS escalation gate,
128
+ // which is no plan gate (the script is not editable once the recorder has run).
129
+ const record = stepUnit(view, 'record')?.status;
130
+ if (done('plan') && (record === 'pending' || record === 'distributed'))
131
+ return 'plan_gate';
132
+ }
133
+ if (step === 'plan')
134
+ return 'planning';
135
+ if (step === 'record')
136
+ return 'recording';
137
+ if (step === 'review')
138
+ return 'reviewing';
139
+ // The PA's scope step and any phase floor fill added run before `plan` or between the three.
140
+ const ord = cursor?.ord ?? 0;
141
+ const recordOrd = stepUnit(view, 'record')?.ord;
142
+ const planOrd = stepUnit(view, 'plan')?.ord;
143
+ // While the PA scopes, the run's only unit is `pa-scope`: there is no `plan` unit to compare with.
144
+ if (planOrd === undefined || ord < planOrd)
145
+ return 'preparing';
146
+ if (recordOrd !== undefined && ord > recordOrd)
147
+ return 'reviewing';
148
+ return 'recording';
149
+ }
150
+ /** `chapters.json` → the chapter list, or `[]` when it is missing or not the plan's shape. */
151
+ export function parseChapters(raw) {
152
+ if (raw === null)
153
+ return [];
154
+ let parsed;
155
+ try {
156
+ parsed = JSON.parse(raw);
157
+ }
158
+ catch {
159
+ return [];
160
+ }
161
+ const list = Array.isArray(parsed)
162
+ ? parsed
163
+ : Array.isArray(parsed?.chapters)
164
+ ? parsed.chapters
165
+ : [];
166
+ const strs = (v) => (Array.isArray(v) ? v.filter((x) => typeof x === 'string') : []);
167
+ const out = [];
168
+ for (const c of list) {
169
+ if (c === null || typeof c !== 'object')
170
+ continue;
171
+ const o = c;
172
+ if (typeof o.key !== 'string' || !/^[a-z0-9][a-z0-9-]*$/.test(o.key))
173
+ continue;
174
+ out.push({
175
+ key: o.key,
176
+ title: typeof o.title === 'string' ? o.title : o.key,
177
+ blurb: typeof o.blurb === 'string' ? o.blurb : '',
178
+ tags: strs(o.tags),
179
+ resets: strs(o.resets),
180
+ });
181
+ }
182
+ return out;
183
+ }
184
+ /** `chapters.md` (record.mjs's `| m:ss | Title |` table) → the MP4's chapter markers. */
185
+ export function parseMarkers(raw) {
186
+ if (raw === null)
187
+ return [];
188
+ const out = [];
189
+ for (const line of raw.split('\n')) {
190
+ const m = /^\|\s*(\d+):(\d{2})\s*\|\s*(.+?)\s*\|\s*$/.exec(line);
191
+ if (m === null)
192
+ continue;
193
+ out.push({ at: `${m[1]}:${m[2]}`, sec: Number(m[1]) * 60 + Number(m[2]), title: m[3] });
194
+ }
195
+ return out;
196
+ }
197
+ const VERDICTS = new Set(['re-encode', 're-record', 'fix-app']);
198
+ /** The reviewer's output → its verdict block (the LAST fenced ```json block), or nothing. */
199
+ export function parseReview(output) {
200
+ const none = { verdict: null, findings: [] };
201
+ if (output === null)
202
+ return none;
203
+ const blocks = [...output.matchAll(/```json\s*\n([\s\S]*?)```/g)];
204
+ const last = blocks.at(-1)?.[1];
205
+ if (last === undefined)
206
+ return none;
207
+ let parsed;
208
+ try {
209
+ parsed = JSON.parse(last);
210
+ }
211
+ catch {
212
+ return none;
213
+ }
214
+ const o = (parsed ?? {});
215
+ const verdict = o.verdict === 'accept' || o.verdict === 'changes' ? o.verdict : null;
216
+ const findings = [];
217
+ for (const f of Array.isArray(o.findings) ? o.findings : []) {
218
+ if (f === null || typeof f !== 'object')
219
+ continue;
220
+ const r = f;
221
+ if (typeof r.issue !== 'string' || typeof r.verdict !== 'string' || !VERDICTS.has(r.verdict))
222
+ continue;
223
+ findings.push({
224
+ at: typeof r.at === 'string' ? r.at : '',
225
+ chapter: typeof r.chapter === 'string' ? r.chapter : '',
226
+ issue: r.issue,
227
+ verdict: r.verdict,
228
+ });
229
+ }
230
+ return { verdict, findings };
231
+ }
232
+ /** A root file's text, resolved inside the root first (a worker-made symlink out of it reads as absent). */
233
+ async function readText(root, rel) {
234
+ const path = await containedPath(root, rel);
235
+ if (path === null)
236
+ return null;
237
+ try {
238
+ const st = await fsp.stat(path);
239
+ if (!st.isFile() || st.size > DEMO_SCRIPT_MAX_BYTES)
240
+ return null;
241
+ return await fsp.readFile(path, 'utf8');
242
+ }
243
+ catch {
244
+ return null;
245
+ }
246
+ }
247
+ /** A root file's size when it is a regular file inside the root, else null. */
248
+ async function fileSize(root, rel) {
249
+ const path = await containedPath(root, rel);
250
+ if (path === null)
251
+ return null;
252
+ try {
253
+ const st = await fsp.stat(path);
254
+ return st.isFile() ? st.size : null;
255
+ }
256
+ catch {
257
+ return null;
258
+ }
259
+ }
260
+ async function isFile(root, rel) {
261
+ return (await fileSize(root, rel)) !== null;
262
+ }
263
+ /** The brief's app URL and audience, for the header (the brief is the daemon's own file). */
264
+ function briefFields(brief) {
265
+ if (brief === null)
266
+ return { url: null, audience: null };
267
+ const url = /^- \*\*App:\*\* (\S+)/m.exec(brief)?.[1] ?? null;
268
+ const audience = /## Who it is for\n\n([\s\S]*?)\n\n## /.exec(brief)?.[1]?.trim() ?? null;
269
+ return { url, audience };
270
+ }
271
+ /** Everything studio renders for a demo run, read from its root and its units. */
272
+ export async function demoView(adapter, view) {
273
+ const runId = view.session.id;
274
+ const root = demoRootDir(runId);
275
+ // Every read is resolved inside the root: the run can write here, so a symlink it made is never followed out.
276
+ const [brief, script, chaptersRaw, markersRaw, recordingRaw] = await Promise.all([
277
+ readText(root, 'BRIEF.md'),
278
+ readText(root, 'script.md'),
279
+ readText(root, 'chapters.json'),
280
+ readText(root, 'demo-video/chapters.md'),
281
+ readText(root, 'demo-video/recording.json'),
282
+ ]);
283
+ const chapters = await Promise.all(parseChapters(chaptersRaw).map(async (c) => ({
284
+ ...c,
285
+ recorded: await isFile(root, `demo-video/segments/${c.key}/segment.mp4`),
286
+ })));
287
+ const sheets = [];
288
+ for (const name of ['chapters', 'joins', 'end']) {
289
+ if (await isFile(root, `review/${name}.png`))
290
+ sheets.push({ name, path: `review/${name}.png` });
291
+ }
292
+ const videoBytes = await fileSize(root, 'demo-video/demo.mp4');
293
+ const video = videoBytes !== null && videoBytes > 0 ? { path: 'demo-video/demo.mp4', bytes: videoBytes } : null;
294
+ let readOnly = null;
295
+ if (recordingRaw !== null) {
296
+ try {
297
+ const r = JSON.parse(recordingRaw);
298
+ readOnly = typeof r.readOnly === 'boolean' ? r.readOnly : null;
299
+ }
300
+ catch {
301
+ readOnly = null;
302
+ }
303
+ }
304
+ const review = stepUnit(view, 'review');
305
+ const record = stepUnit(view, 'record');
306
+ const reviewed = review !== undefined && (review.status === 'done' || review.status === 'rejected');
307
+ const reviewOutput = reviewed ? await adapter.workOutput(coreUnitId(runId, review)) : null;
308
+ const { verdict, findings } = parseReview(reviewOutput);
309
+ return {
310
+ runId,
311
+ ...briefFields(brief),
312
+ stage: demoStage(view),
313
+ script,
314
+ chapters,
315
+ markers: parseMarkers(markersRaw),
316
+ sheets,
317
+ video,
318
+ recording: { readOnly },
319
+ review: { verdict, findings, text: reviewOutput, rejected: review?.status === 'rejected' },
320
+ seats: { recorder: record?.assigned_cli ?? null, reviewer: review?.assigned_cli ?? null },
321
+ syntheticLabelled: script !== null && /synthetic/i.test(script),
322
+ };
323
+ }
324
+ /** `path` resolved inside `root` (symlinks included), or `null` when it would leave it. */
325
+ async function containedPath(root, rel) {
326
+ if (rel === '' || rel.includes('\0'))
327
+ return null;
328
+ const target = resolve(root, rel);
329
+ let realRoot;
330
+ let realTarget;
331
+ try {
332
+ realRoot = await fsp.realpath(root);
333
+ realTarget = await fsp.realpath(target);
334
+ }
335
+ catch {
336
+ return null;
337
+ }
338
+ const inside = relative(realRoot, realTarget);
339
+ if (inside === '' || inside.startsWith('..') || inside.startsWith(sep) || resolve(realRoot, inside) !== realTarget) {
340
+ return null;
341
+ }
342
+ return realTarget;
343
+ }
344
+ /** A single `Range: bytes=a-b` → the inclusive span, `null` for no header, `'bad'` for one we cannot serve. */
345
+ export function parseRange(header, size) {
346
+ if (header === undefined)
347
+ return null;
348
+ const m = /^bytes=(\d*)-(\d*)$/.exec(header.trim());
349
+ if (m === null || (m[1] === '' && m[2] === ''))
350
+ return 'bad';
351
+ let start;
352
+ let end;
353
+ if (m[1] === '') {
354
+ const suffix = Number(m[2]);
355
+ if (suffix === 0)
356
+ return 'bad';
357
+ start = Math.max(0, size - suffix);
358
+ end = size - 1;
359
+ }
360
+ else {
361
+ start = Number(m[1]);
362
+ end = m[2] === '' ? size - 1 : Math.min(Number(m[2]), size - 1);
363
+ }
364
+ if (start > end || start >= size)
365
+ return 'bad';
366
+ return { start, end };
367
+ }
368
+ export function registerDemoRoutes(app, adapter) {
369
+ const demoRun = async (id) => {
370
+ const views = await adapter.sessionsDetail();
371
+ const run = views.find((v) => v.session.id === id);
372
+ return run !== undefined && isDemoRun(run) ? run : null;
373
+ };
374
+ // A run launched from the demo preset stays one, and the file route needs nothing else from it: the
375
+ // `<video>` asks in many Range requests, so each is not a read of every run.
376
+ const knownDemoRuns = new Set();
377
+ const isKnownDemoRun = async (id) => {
378
+ if (knownDemoRuns.has(id))
379
+ return true;
380
+ const run = await demoRun(id);
381
+ if (run !== null)
382
+ knownDemoRuns.add(id);
383
+ return run !== null;
384
+ };
385
+ app.post(`${V}/projects/:id/demo`, {
386
+ config: {
387
+ manifest: {
388
+ requestType: 'DemoLaunchBody',
389
+ responseType: 'DemoLaunchResponse',
390
+ // Every non-201 besides the body 400 is POST /runs' own answer, passed through.
391
+ statusCodes: [201, 400, 404, 409, 422, 501],
392
+ },
393
+ },
394
+ }, async (req, reply) => {
395
+ const parsed = DemoLaunchSchema.safeParse(req.body ?? {});
396
+ if (!parsed.success) {
397
+ return reply.code(400).send({ error: 'Invalid demo body', details: parsed.error.issues });
398
+ }
399
+ const projectId = req.params.id;
400
+ const runId = randomUUID();
401
+ const root = demoRootDir(runId);
402
+ await fsp.mkdir(root, { recursive: true });
403
+ const briefPath = join(root, 'BRIEF.md');
404
+ await fsp.writeFile(briefPath, demoBrief(root, parsed.data), 'utf8');
405
+ const auth = req.headers.authorization;
406
+ demoLaunchRoots.set(runId, root);
407
+ const launched = await app
408
+ .inject({
409
+ method: 'POST',
410
+ url: `${V}/runs`,
411
+ headers: { 'content-type': 'application/json', ...(auth !== undefined ? { authorization: auth } : {}) },
412
+ payload: {
413
+ problem: `Make a demo of ${parsed.data.url} with the wicked-garden-demo skill: follow the demo brief at ${briefPath}. Demo root: ${root}`,
414
+ sessionId: runId,
415
+ // Unfiled (studio's `default` mount) is no project to file into: the run launches unfiled.
416
+ ...(projectId !== UNFILED_PROJECT ? { projectId } : {}),
417
+ workflow: DEMO_PRESET,
418
+ deliver: 'none',
419
+ ...(parsed.data.clisJson !== undefined ? { clisJson: parsed.data.clisJson } : {}),
420
+ },
421
+ })
422
+ .finally(() => demoLaunchRoots.delete(runId));
423
+ if (launched.statusCode !== 201) {
424
+ await fsp.rm(root, { recursive: true, force: true });
425
+ return reply.code(launched.statusCode).type('application/json').send(launched.body);
426
+ }
427
+ return reply.code(201).send({ runId });
428
+ });
429
+ app.get(`${V}/runs/:id/demo`, { config: { manifest: { responseType: 'DemoView', statusCodes: [200, 404] } } }, async (req, reply) => {
430
+ const run = await demoRun(req.params.id);
431
+ if (run === null)
432
+ return reply.code(404).send({ error: 'no demo run with that id' });
433
+ return demoView(adapter, run);
434
+ });
435
+ app.get(`${V}/runs/:id/demo/file`, { config: { manifest: { responseType: 'binary (video/mp4, image/png, text)', statusCodes: [200, 206, 400, 404, 416] } } }, async (req, reply) => {
436
+ const { id } = req.params;
437
+ const rel = req.query.path;
438
+ if (typeof rel !== 'string')
439
+ return reply.code(400).send({ error: '`path` is required, once' });
440
+ const type = DEMO_FILE_TYPES[extname(rel).toLowerCase()];
441
+ if (type === undefined) {
442
+ return reply.code(400).send({ error: `\`path\` must be one of ${Object.keys(DEMO_FILE_TYPES).join(', ')}` });
443
+ }
444
+ if (!(await isKnownDemoRun(id)))
445
+ return reply.code(404).send({ error: 'no demo run with that id' });
446
+ const target = await containedPath(demoRootDir(id), rel);
447
+ if (target === null)
448
+ return reply.code(404).send({ error: `no such demo file: ${rel}` });
449
+ const st = await fsp.stat(target);
450
+ if (!st.isFile())
451
+ return reply.code(404).send({ error: `no such demo file: ${rel}` });
452
+ reply.header('content-type', type).header('accept-ranges', 'bytes').header('cache-control', 'no-store');
453
+ const range = parseRange(req.headers.range, st.size);
454
+ if (range === 'bad') {
455
+ return reply.code(416).header('content-range', `bytes */${st.size}`).send();
456
+ }
457
+ if (range === null) {
458
+ reply.header('content-length', String(st.size));
459
+ return reply.send(createReadStream(target));
460
+ }
461
+ reply
462
+ .code(206)
463
+ .header('content-range', `bytes ${range.start}-${range.end}/${st.size}`)
464
+ .header('content-length', String(range.end - range.start + 1));
465
+ return reply.send(createReadStream(target, { start: range.start, end: range.end }));
466
+ });
467
+ app.put(`${V}/runs/:id/demo/script`, { config: { manifest: { requestType: 'DemoScriptBody', responseType: '{ bytes: number }', statusCodes: [200, 400, 404, 409, 413] } } }, async (req, reply) => {
468
+ const { id } = req.params;
469
+ const parsed = DemoScriptSchema.safeParse(req.body ?? {});
470
+ if (!parsed.success)
471
+ return reply.code(400).send({ error: 'Invalid script body', details: parsed.error.issues });
472
+ const bytes = Buffer.byteLength(parsed.data.content, 'utf8');
473
+ if (bytes > DEMO_SCRIPT_MAX_BYTES) {
474
+ return reply.code(413).send({ error: `the script is ${bytes} bytes, over the ${DEMO_SCRIPT_MAX_BYTES}-byte cap` });
475
+ }
476
+ const run = await demoRun(id);
477
+ if (run === null)
478
+ return reply.code(404).send({ error: 'no demo run with that id' });
479
+ // Only at the plan gate: before it the planner is still writing the script, after it the recorder
480
+ // has read it — an edit then would change a script nobody records.
481
+ if (demoStage(run) !== 'plan_gate') {
482
+ return reply.code(409).send({ error: 'the script can be edited only while the plan gate is open' });
483
+ }
484
+ // The resolved file, never the joined name: a worker-made symlink is followed only inside the root.
485
+ const target = await containedPath(demoRootDir(id), 'script.md');
486
+ if (target === null)
487
+ return reply.code(409).send({ error: 'the plan has not written script.md' });
488
+ await fsp.writeFile(target, parsed.data.content, 'utf8');
489
+ return { bytes };
490
+ });
491
+ }
492
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../../src/api/demo.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,IAAI,GAAG,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAElE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,CAAC,GAAG,UAAU,CAAC;AAErB,sEAAsE;AACtE,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC;AAElC,+GAA+G;AAC/G,MAAM,eAAe,GAAG,SAAS,CAAC;AAElC,oFAAoF;AACpF,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,GAAG,IAAI,CAAC;AAEhD,8FAA8F;AAC9F,MAAM,eAAe,GAAqC;IACxD,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,WAAW;IACnB,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,8BAA8B;IACrC,OAAO,EAAE,iCAAiC;CAC3C,CAAC;AAEF,kGAAkG;AAClG,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,MAAM,CAAC;IACnE,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;AAEzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC;KAC9B,MAAM,CAAC;IACN,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,qBAAqB,CAAC;IACpG,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAChC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAElF,4GAA4G;AAC5G,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,CAAkD;IACxF,OAAO;QACL,cAAc;QACd,EAAE;QACF,cAAc,CAAC,CAAC,GAAG,EAAE;QACrB,oBAAoB,IAAI,uDAAuD;QAC/E,EAAE;QACF,kBAAkB;QAClB,EAAE;QACF,CAAC,CAAC,QAAQ;QACV,EAAE;QACF,iBAAiB;QACjB,EAAE;QACF,CAAC,CAAC,IAAI;QACN,EAAE;QACF,UAAU;QACV,EAAE;QACF,qEAAqE;QACrE,+FAA+F;QAC/F,kGAAkG;QAClG,gDAAgD;QAChD,oFAAoF;QACpF,kFAAkF;QAClF,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;yGACyG;AACzG,MAAM,UAAU,SAAS,CAAC,IAAiB;IACzC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAChE,MAAM,EAAE,GAAI,IAAI,CAAC,OAAwE,CAAC,YAAY,CAAC;IACvG,OAAO,EAAE,EAAE,IAAI,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,KAAK,WAAW,CAAC;AAC1D,CAAC;AAED,+DAA+D;AAC/D,SAAS,QAAQ,CAAC,IAAiB,EAAE,IAAY;IAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,SAAS,CAAC,IAAiB;IACzC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;IACvB,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,MAAM,CAAC;IAC5C,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,QAAQ,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9F,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC;IAC9C,kGAAkG;IAClG,4FAA4F;IAC5F,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC;IACvB,IAAI,OAAO,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,YAAY;QAAE,OAAO,WAAW,CAAC;IAC1E,IAAI,OAAO,EAAE,CAAC;QACZ,kGAAkG;QAClG,kGAAkG;QAClG,oEAAoE;QACpE,MAAM,IAAI,GAAG,CAAC,EAAU,EAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;QAC5E,6FAA6F;QAC7F,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,UAAU;YAAE,OAAO,aAAa,CAAC;QAC5F,kGAAkG;QAClG,gFAAgF;QAChF,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAChD,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,aAAa,CAAC;YAAE,OAAO,WAAW,CAAC;IAC7F,CAAC;IACD,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,UAAU,CAAC;IACvC,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAC;IAC1C,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,WAAW,CAAC;IAC1C,6FAA6F;IAC7F,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IAC7B,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC;IAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC;IAC5C,mGAAmG;IACnG,IAAI,OAAO,KAAK,SAAS,IAAI,GAAG,GAAG,OAAO;QAAE,OAAO,WAAW,CAAC;IAC/D,IAAI,SAAS,KAAK,SAAS,IAAI,GAAG,GAAG,SAAS;QAAE,OAAO,WAAW,CAAC;IACnE,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,aAAa,CAAC,GAAkB;IAC9C,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC5B,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAChC,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,KAAK,CAAC,OAAO,CAAE,MAAiC,EAAE,QAAQ,CAAC;YAC3D,CAAC,CAAE,MAAkC,CAAC,QAAQ;YAC9C,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,IAAI,GAAG,CAAC,CAAU,EAAY,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACrH,MAAM,GAAG,GAAoC,EAAE,CAAC;IAChD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,CAAC,GAAG,CAA4B,CAAC;QACvC,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/E,GAAG,CAAC,IAAI,CAAC;YACP,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;YACpD,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACjD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAClB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;SACvB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,YAAY,CAAC,GAAkB;IAC7C,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,GAAG,2CAA2C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjE,IAAI,CAAC,KAAK,IAAI;YAAE,SAAS;QACzB,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAW,EAAE,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;AAEhE,6FAA6F;AAC7F,MAAM,UAAU,WAAW,CAAC,MAAqB;IAC/C,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7C,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAA8C,CAAC;IACtE,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACrF,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,CAAC,GAAG,CAA4B,CAAC;QACvC,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;YAAE,SAAS;QACvG,QAAQ,CAAC,IAAI,CAAC;YACZ,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACxC,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACvD,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,OAAO,EAAE,CAAC,CAAC,OAAiC;SAC7C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/B,CAAC;AAED,4GAA4G;AAC5G,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,GAAW;IAC/C,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC5C,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,GAAG,qBAAqB;YAAE,OAAO,IAAI,CAAC;QACjE,OAAO,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,GAAW;IAC/C,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC5C,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,IAAY,EAAE,GAAW;IAC7C,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;AAC9C,CAAC;AAED,6FAA6F;AAC7F,SAAS,WAAW,CAAC,KAAoB;IACvC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzD,MAAM,GAAG,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC9D,MAAM,QAAQ,GAAG,uCAAuC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;IAC1F,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3B,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAoB,EAAE,IAAiB;IACpE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAChC,8GAA8G;IAC9G,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/E,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;QAC1B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;QAC3B,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;QAC/B,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;QACxC,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;KAC5C,CAAC,CAAC;IACH,MAAM,QAAQ,GAAkB,MAAM,OAAO,CAAC,GAAG,CAC/C,aAAa,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3C,GAAG,CAAC;QACJ,QAAQ,EAAE,MAAM,MAAM,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC,GAAG,cAAc,CAAC;KACzE,CAAC,CAAC,CACJ,CAAC;IACF,MAAM,MAAM,GAAuB,EAAE,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAU,EAAE,CAAC;QACzD,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE,UAAU,IAAI,MAAM,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,IAAI,MAAM,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAsB,UAAU,KAAK,IAAI,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACnI,IAAI,QAAQ,GAAmB,IAAI,CAAC;IACpC,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAA2B,CAAC;YAC7D,QAAQ,GAAG,OAAO,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;IACpG,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3F,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IACxD,OAAO;QACL,KAAK;QACL,GAAG,WAAW,CAAC,KAAK,CAAC;QACrB,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC;QACtB,MAAM;QACN,QAAQ;QACR,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC;QACjC,MAAM;QACN,KAAK;QACL,SAAS,EAAE,EAAE,QAAQ,EAAE;QACvB,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,KAAK,UAAU,EAAE;QAC1F,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,IAAI,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,IAAI,IAAI,EAAE;QACzF,iBAAiB,EAAE,MAAM,KAAK,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,2FAA2F;AAC3F,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,GAAW;IACpD,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAClC,IAAI,QAAgB,CAAC;IACrB,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpC,UAAU,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC9C,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;QACnH,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,UAAU,CAAC,MAA0B,EAAE,IAAY;IACjE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7D,IAAI,KAAa,CAAC;IAClB,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC/B,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;QACnC,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IAC/C,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAoB,EAAE,OAAoB;IAC3E,MAAM,OAAO,GAAG,KAAK,EAAE,EAAU,EAA+B,EAAE;QAChE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACnD,OAAO,GAAG,KAAK,SAAS,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC,CAAC;IACF,oGAAoG;IACpG,6EAA6E;IAC7E,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACxC,MAAM,cAAc,GAAG,KAAK,EAAE,EAAU,EAAoB,EAAE;QAC5D,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,GAAG,KAAK,IAAI;YAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxC,OAAO,GAAG,KAAK,IAAI,CAAC;IACtB,CAAC,CAAC;IAEF,GAAG,CAAC,IAAI,CACN,GAAG,CAAC,oBAAoB,EACxB;QACE,MAAM,EAAE;YACN,QAAQ,EAAE;gBACR,WAAW,EAAE,gBAAgB;gBAC7B,YAAY,EAAE,oBAAoB;gBAClC,gFAAgF;gBAChF,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;aAC5C;SACF;KACF,EACD,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,SAAS,GAAI,GAAG,CAAC,MAAyB,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACzC,MAAM,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;QACvC,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,GAAG;aACvB,MAAM,CAAC;YACN,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,GAAG,CAAC,OAAO;YAChB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;YACvG,OAAO,EAAE;gBACP,OAAO,EAAE,kBAAkB,MAAM,CAAC,IAAI,CAAC,GAAG,gEAAgE,SAAS,gBAAgB,IAAI,EAAE;gBACzI,SAAS,EAAE,KAAK;gBAChB,2FAA2F;gBAC3F,GAAG,CAAC,SAAS,KAAK,eAAe,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,QAAQ,EAAE,WAAW;gBACrB,OAAO,EAAE,MAAM;gBACf,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClF;SACF,CAAC;aACD,OAAO,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAChD,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;YAChC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtF,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACzC,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,GAAG,CAAC,gBAAgB,EACpB,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAC/E,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAE,GAAG,CAAC,MAAyB,CAAC,EAAE,CAAC,CAAC;QAC7D,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACrF,OAAO,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAChC,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,GAAG,CAAC,qBAAqB,EACzB,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,qCAAqC,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EACzH,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,GAAG,GAAI,GAAG,CAAC,KAA4B,CAAC,IAAI,CAAC;QACnD,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;QAChG,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACzD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2BAA2B,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/G,CAAC;QACD,IAAI,CAAC,CAAC,MAAM,cAAc,CAAC,EAAE,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACpG,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACzD,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,GAAG,EAAE,EAAE,CAAC,CAAC;QACzF,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,sBAAsB,GAAG,EAAE,EAAE,CAAC,CAAC;QACtF,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACxG,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9E,CAAC;QACD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,KAAK,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,KAAK;aACF,IAAI,CAAC,GAAG,CAAC;aACT,MAAM,CAAC,eAAe,EAAE,SAAS,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;aACvE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QACjE,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC,CACF,CAAC;IAEF,GAAG,CAAC,GAAG,CACL,GAAG,CAAC,uBAAuB,EAC3B,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EACtI,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,MAAwB,CAAC;QAC5C,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACjH,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7D,IAAI,KAAK,GAAG,qBAAqB,EAAE,CAAC;YAClC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,KAAK,oBAAoB,qBAAqB,WAAW,EAAE,CAAC,CAAC;QACrH,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACrF,kGAAkG;QAClG,mEAAmE;QACnE,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,WAAW,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,2DAA2D,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,oGAAoG;QACpG,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;QACjE,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAC;QAClG,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzD,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -25,6 +25,8 @@ export interface AcpCliFold {
25
25
  fallbackKinds: Record<string, number>;
26
26
  lastStartedTs: number | null;
27
27
  lastFallbackTs: number | null;
28
+ /** The seat's ACP version pin, probed now (core#581) — present only for a pinned seat. */
29
+ versionPin?: SeatVersionPin;
28
30
  }
29
31
  /**
30
32
  * Fold `acpSessionStarted` / `acpFallback` events per cliKey from `<dir>/*.ndjson`.
@@ -35,6 +37,62 @@ export interface AcpCliFold {
35
37
  * fold is a diagnosis surface and must not itself become a failure mode.
36
38
  */
37
39
  export declare function foldAcpEvents(eventsDir: string): Promise<Record<string, AcpCliFold>>;
40
+ /**
41
+ * One pinned seat's reading: the build its ACP input-governance admission was proven against
42
+ * (`pinned`, the registry's `acp.verified_version`), what the binary reports now (`observed`),
43
+ * and whether the pin holds. `matched: false` on a seat with `governanceClaimed: true` means the
44
+ * engine fails that seat's governance closed at every spawn. Before this surface it said so only
45
+ * on a governed turn, so a drifted seat looked healthy everywhere an operator looks between runs.
46
+ */
47
+ export interface SeatVersionPin {
48
+ cli: string;
49
+ binary: string;
50
+ pinned: string;
51
+ observed: string | null;
52
+ matched: boolean;
53
+ governanceClaimed: boolean;
54
+ disclosure: string | null;
55
+ }
56
+ /** Where readings come from: the probe below, or a test's fixture. */
57
+ export type SeatVersionPinSource = () => Promise<SeatVersionPin[]>;
58
+ /**
59
+ * Read each pinned seat's `--version` the way the engine's spawn-time check does
60
+ * (`probe_resolved_binary_version`, wicked-core `acp_runner.rs`): stdout then stderr, the pin
61
+ * matches only the FIRST line trimmed, byte for byte; `observed` is the first non-empty line, for
62
+ * a human. A probe that cannot run reads `observed: null`, `matched: false`, as in the engine.
63
+ */
64
+ export declare function probeSeatVersionPins(roster: unknown[], exec: ExecLike): Promise<SeatVersionPin[]>;
65
+ /**
66
+ * The daemon's source: the engine's production roster, probed with {@link execCapped}. `null`
67
+ * under a test runner — a test-built server never spawns CLI children by default (the
68
+ * {@link engineBinaryVersions} rule).
69
+ */
70
+ export declare function defaultSeatVersionPinSource(): SeatVersionPinSource | null;
71
+ /**
72
+ * A TTL cache of the pin readings, shared by `/diagnostics` (which awaits a fresh-enough answer)
73
+ * and the roster (which is synchronous: it reads the last answer and refreshes in the background).
74
+ * Each refresh spawns one bounded `--version` per pinned seat, so it runs at most once per TTL. A
75
+ * failed probe keeps the previous answer; with no source at all every read is `null`.
76
+ */
77
+ export declare class SeatVersionPinCache {
78
+ private readonly source;
79
+ private readonly ttlMs;
80
+ private value;
81
+ private inFlight;
82
+ private failedAt;
83
+ constructor(source?: SeatVersionPinSource | null, ttlMs?: number);
84
+ /** Due a probe: no answer, or the last answer (or the last failed attempt) is a TTL old. */
85
+ private stale;
86
+ /** A fresh-enough answer, probing when stale; `null` when there is no source. */
87
+ get(): Promise<SeatVersionPin[] | null>;
88
+ /** The last answer for `cli`, without waiting; a stale or empty cache starts a refresh. */
89
+ read(cli: string): SeatVersionPin | undefined;
90
+ }
91
+ /** The daemon's one pin cache: the roster and `/diagnostics` read the same answer. */
92
+ export declare const seatVersionPins: SeatVersionPinCache;
93
+ /** `byCli` with each pinned seat's reading attached — a pinned seat with no ACP events yet still
94
+ * lists, with zero counts, so a drifted seat nobody has used is visible too. */
95
+ export declare function withVersionPins(byCli: Record<string, AcpCliFold>, pins: SeatVersionPin[] | null): Record<string, AcpCliFold>;
38
96
  /**
39
97
  * A short-TTL, in-flight-deduplicated cache around {@link foldAcpEvents}. The events dir holds
40
98
  * one file per run (139+ observed), so the fold is real IO — briefly caching keeps a dashboard
@@ -43,10 +101,15 @@ export declare function foldAcpEvents(eventsDir: string): Promise<Record<string,
43
101
  */
44
102
  export declare class AcpFoldCache {
45
103
  private readonly ttlMs;
104
+ /** core#581: each pinned seat's version reading rides its `byCli` entry. */
105
+ private readonly pins;
46
106
  private value;
47
107
  private inFlight;
48
- constructor(ttlMs?: number);
108
+ constructor(ttlMs?: number,
109
+ /** core#581: each pinned seat's version reading rides its `byCli` entry. */
110
+ pins?: SeatVersionPinCache);
49
111
  get(eventsDir: string): Promise<Record<string, AcpCliFold>>;
112
+ private fold;
50
113
  }
51
114
  /** One captured error-level log line — the wire contract's `DiagnosticsRecentError`. */
52
115
  export interface RecentError {
@@ -1 +1 @@
1
- {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/api/diagnostics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/api/diagnostics.ts"],"names":[],"mappings":"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"}