aicodeman 1.44.0 → 1.45.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 (211) hide show
  1. package/README.md +6 -2
  2. package/dist/case-rename.d.ts +65 -0
  3. package/dist/case-rename.d.ts.map +1 -0
  4. package/dist/case-rename.js +198 -0
  5. package/dist/case-rename.js.map +1 -0
  6. package/dist/cli-agent.d.ts +60 -1
  7. package/dist/cli-agent.d.ts.map +1 -1
  8. package/dist/cli-agent.js +225 -13
  9. package/dist/cli-agent.js.map +1 -1
  10. package/dist/config/auth-config.d.ts +16 -1
  11. package/dist/config/auth-config.d.ts.map +1 -1
  12. package/dist/config/auth-config.js +16 -1
  13. package/dist/config/auth-config.js.map +1 -1
  14. package/dist/host-sensors.d.ts +115 -0
  15. package/dist/host-sensors.d.ts.map +1 -0
  16. package/dist/host-sensors.js +457 -0
  17. package/dist/host-sensors.js.map +1 -0
  18. package/dist/remote-hosts.d.ts +7 -0
  19. package/dist/remote-hosts.d.ts.map +1 -1
  20. package/dist/remote-hosts.js +17 -3
  21. package/dist/remote-hosts.js.map +1 -1
  22. package/dist/remote-pane-history.d.ts.map +1 -1
  23. package/dist/remote-pane-history.js +2 -2
  24. package/dist/remote-pane-history.js.map +1 -1
  25. package/dist/session.d.ts.map +1 -1
  26. package/dist/session.js +13 -0
  27. package/dist/session.js.map +1 -1
  28. package/dist/tmux-manager.d.ts +7 -3
  29. package/dist/tmux-manager.d.ts.map +1 -1
  30. package/dist/tmux-manager.js +47 -15
  31. package/dist/tmux-manager.js.map +1 -1
  32. package/dist/tmux-prefix-table.d.ts +37 -5
  33. package/dist/tmux-prefix-table.d.ts.map +1 -1
  34. package/dist/tmux-prefix-table.js +40 -5
  35. package/dist/tmux-prefix-table.js.map +1 -1
  36. package/dist/tui/tui-app.d.ts +8 -1
  37. package/dist/tui/tui-app.d.ts.map +1 -1
  38. package/dist/tui/tui-app.js +49 -12
  39. package/dist/tui/tui-app.js.map +1 -1
  40. package/dist/tui/tui-client.d.ts +90 -3
  41. package/dist/tui/tui-client.d.ts.map +1 -1
  42. package/dist/tui/tui-client.js +195 -26
  43. package/dist/tui/tui-client.js.map +1 -1
  44. package/dist/web/agent-inbox-persistence.d.ts +52 -0
  45. package/dist/web/agent-inbox-persistence.d.ts.map +1 -0
  46. package/dist/web/agent-inbox-persistence.js +139 -0
  47. package/dist/web/agent-inbox-persistence.js.map +1 -0
  48. package/dist/web/agent-inbox.d.ts +140 -0
  49. package/dist/web/agent-inbox.d.ts.map +1 -0
  50. package/dist/web/agent-inbox.js +258 -0
  51. package/dist/web/agent-inbox.js.map +1 -0
  52. package/dist/web/middleware/auth.d.ts +2 -0
  53. package/dist/web/middleware/auth.d.ts.map +1 -1
  54. package/dist/web/middleware/auth.js +145 -52
  55. package/dist/web/middleware/auth.js.map +1 -1
  56. package/dist/web/public/admin-ui.js.gz +0 -0
  57. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  58. package/dist/web/public/app.42d0abae.js +43 -0
  59. package/dist/web/public/app.42d0abae.js.br +0 -0
  60. package/dist/web/public/app.42d0abae.js.gz +0 -0
  61. package/dist/web/public/approvals-ui.js.gz +0 -0
  62. package/dist/web/public/{constants.4866ecc3.js → constants.0b3cdde9.js} +11 -0
  63. package/dist/web/public/constants.0b3cdde9.js.br +0 -0
  64. package/dist/web/public/constants.0b3cdde9.js.gz +0 -0
  65. package/dist/web/public/cron-ui.js.gz +0 -0
  66. package/dist/web/public/entrance-animations.js.gz +0 -0
  67. package/dist/web/public/git-status-ui.js.gz +0 -0
  68. package/dist/web/public/header-divider.eb2d2463.js +1 -0
  69. package/dist/web/public/header-divider.eb2d2463.js.br +0 -0
  70. package/dist/web/public/header-divider.eb2d2463.js.gz +0 -0
  71. package/dist/web/public/home-sessions.js.gz +0 -0
  72. package/dist/web/public/host-wake-ui.js.gz +0 -0
  73. package/dist/web/public/i18n.1e68220d.js +2 -0
  74. package/dist/web/public/i18n.1e68220d.js.br +0 -0
  75. package/dist/web/public/i18n.1e68220d.js.gz +0 -0
  76. package/dist/web/public/image-input.941386e7.js.gz +0 -0
  77. package/dist/web/public/index.html +74 -11
  78. package/dist/web/public/index.html.br +0 -0
  79. package/dist/web/public/index.html.gz +0 -0
  80. package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
  81. package/dist/web/public/keyboard-accessory.4e8b20ac.js.gz +0 -0
  82. package/dist/web/public/{mobile-handlers.44adaa07.js → mobile-handlers.1c0cbcd8.js} +4 -2
  83. package/dist/web/public/mobile-handlers.1c0cbcd8.js.br +0 -0
  84. package/dist/web/public/mobile-handlers.1c0cbcd8.js.gz +0 -0
  85. package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
  86. package/dist/web/public/mobile-overview.js.gz +0 -0
  87. package/dist/web/public/mobile.12fb18de.css.gz +0 -0
  88. package/dist/web/public/notification-manager.feb82c04.js.gz +0 -0
  89. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  90. package/dist/web/public/{panels-ui.cbb24ba1.js → panels-ui.78c3defb.js} +76 -70
  91. package/dist/web/public/panels-ui.78c3defb.js.br +0 -0
  92. package/dist/web/public/panels-ui.78c3defb.js.gz +0 -0
  93. package/dist/web/public/ralph-panel.b350e2ef.js.gz +0 -0
  94. package/dist/web/public/ralph-wizard.b6c0dd19.js.gz +0 -0
  95. package/dist/web/public/readmymind-ui.js.gz +0 -0
  96. package/dist/web/public/reboot-restore-ui.js.gz +0 -0
  97. package/dist/web/public/respawn-ui.d7adcf6a.js.gz +0 -0
  98. package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
  99. package/dist/web/public/session-lineage.js.gz +0 -0
  100. package/dist/web/public/{session-ui.9c1f009b.js → session-ui.ea6b1994.js} +28 -26
  101. package/dist/web/public/session-ui.ea6b1994.js.br +0 -0
  102. package/dist/web/public/session-ui.ea6b1994.js.gz +0 -0
  103. package/dist/web/public/{settings-ui.fea9ddae.js → settings-ui.085dd202.js} +3 -3
  104. package/dist/web/public/settings-ui.085dd202.js.br +0 -0
  105. package/dist/web/public/settings-ui.085dd202.js.gz +0 -0
  106. package/dist/web/public/spreadsheet-preview-worker.js.gz +0 -0
  107. package/dist/web/public/spreadsheet-preview.75c751de.js.gz +0 -0
  108. package/dist/web/public/spreadsheet-xlsx-core.js.gz +0 -0
  109. package/dist/web/public/styles.3b59b41d.css +1 -0
  110. package/dist/web/public/styles.3b59b41d.css.br +0 -0
  111. package/dist/web/public/styles.3b59b41d.css.gz +0 -0
  112. package/dist/web/public/subagent-windows.07277a58.js.gz +0 -0
  113. package/dist/web/public/sw.js +2 -2
  114. package/dist/web/public/sw.js.br +0 -0
  115. package/dist/web/public/sw.js.gz +0 -0
  116. package/dist/web/public/tab-layout-browser.2d6189f7.js.gz +0 -0
  117. package/dist/web/public/tab-rail-resize.7157e0bd.js.gz +0 -0
  118. package/dist/web/public/terminal-keycode229-recovery.af09f99a.js.gz +0 -0
  119. package/dist/web/public/terminal-split.js.gz +0 -0
  120. package/dist/web/public/terminal-tile.js +8 -1
  121. package/dist/web/public/terminal-tile.js.br +0 -0
  122. package/dist/web/public/terminal-tile.js.gz +0 -0
  123. package/dist/web/public/terminal-ui.fb2a27f5.js +2 -0
  124. package/dist/web/public/terminal-ui.fb2a27f5.js.br +0 -0
  125. package/dist/web/public/terminal-ui.fb2a27f5.js.gz +0 -0
  126. package/dist/web/public/tile-grid.js.gz +0 -0
  127. package/dist/web/public/ultracode-panel.js.gz +0 -0
  128. package/dist/web/public/ultracode-windows.js.gz +0 -0
  129. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  130. package/dist/web/public/vendor/exceljs.min.js.gz +0 -0
  131. package/dist/web/public/vendor/fflate.min.js.gz +0 -0
  132. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  133. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  134. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  135. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  136. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  137. package/dist/web/public/vendor/xterm-predictive-echo.ae5e3d5d.js.gz +0 -0
  138. package/dist/web/public/vendor/xterm-zerolag-input.0b69623c.js.gz +0 -0
  139. package/dist/web/public/vendor/xterm.css.gz +0 -0
  140. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  141. package/dist/web/public/voice-input.2342c37b.js.gz +0 -0
  142. package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
  143. package/dist/web/public/webview-tabs.js.gz +0 -0
  144. package/dist/web/public/whats-new.json +9 -9
  145. package/dist/web/route-helpers.d.ts +57 -6
  146. package/dist/web/route-helpers.d.ts.map +1 -1
  147. package/dist/web/route-helpers.js +72 -4
  148. package/dist/web/route-helpers.js.map +1 -1
  149. package/dist/web/routes/case-routes.d.ts.map +1 -1
  150. package/dist/web/routes/case-routes.js +183 -2
  151. package/dist/web/routes/case-routes.js.map +1 -1
  152. package/dist/web/routes/inbox-routes.d.ts +43 -0
  153. package/dist/web/routes/inbox-routes.d.ts.map +1 -0
  154. package/dist/web/routes/inbox-routes.js +148 -0
  155. package/dist/web/routes/inbox-routes.js.map +1 -0
  156. package/dist/web/routes/index.d.ts +1 -0
  157. package/dist/web/routes/index.d.ts.map +1 -1
  158. package/dist/web/routes/index.js +1 -0
  159. package/dist/web/routes/index.js.map +1 -1
  160. package/dist/web/routes/session-routes.d.ts.map +1 -1
  161. package/dist/web/routes/session-routes.js +25 -47
  162. package/dist/web/routes/session-routes.js.map +1 -1
  163. package/dist/web/routes/system-routes.d.ts.map +1 -1
  164. package/dist/web/routes/system-routes.js +23 -2
  165. package/dist/web/routes/system-routes.js.map +1 -1
  166. package/dist/web/schemas.d.ts +26 -0
  167. package/dist/web/schemas.d.ts.map +1 -1
  168. package/dist/web/schemas.js +48 -0
  169. package/dist/web/schemas.js.map +1 -1
  170. package/dist/web/sensitive-path.d.ts.map +1 -1
  171. package/dist/web/sensitive-path.js +2 -0
  172. package/dist/web/sensitive-path.js.map +1 -1
  173. package/dist/web/server.d.ts +2 -0
  174. package/dist/web/server.d.ts.map +1 -1
  175. package/dist/web/server.js +61 -3
  176. package/dist/web/server.js.map +1 -1
  177. package/dist/web/session-wait-registry.d.ts +48 -4
  178. package/dist/web/session-wait-registry.d.ts.map +1 -1
  179. package/dist/web/session-wait-registry.js +144 -6
  180. package/dist/web/session-wait-registry.js.map +1 -1
  181. package/dist/web/sse-events.d.ts +4 -1
  182. package/dist/web/sse-events.d.ts.map +1 -1
  183. package/dist/web/sse-events.js +4 -1
  184. package/dist/web/sse-events.js.map +1 -1
  185. package/package.json +1 -1
  186. package/skills/codeman/SKILL.md +7 -4
  187. package/skills/codeman/preamble.sh +3 -3
  188. package/skills/codeman/reference/endpoints.md +24 -3
  189. package/skills/codeman/reference/verbs.md +47 -0
  190. package/dist/web/public/app.9314ee60.js +0 -43
  191. package/dist/web/public/app.9314ee60.js.br +0 -0
  192. package/dist/web/public/app.9314ee60.js.gz +0 -0
  193. package/dist/web/public/constants.4866ecc3.js.br +0 -0
  194. package/dist/web/public/constants.4866ecc3.js.gz +0 -0
  195. package/dist/web/public/i18n.22ca902b.js +0 -2
  196. package/dist/web/public/i18n.22ca902b.js.br +0 -0
  197. package/dist/web/public/i18n.22ca902b.js.gz +0 -0
  198. package/dist/web/public/mobile-handlers.44adaa07.js.br +0 -0
  199. package/dist/web/public/mobile-handlers.44adaa07.js.gz +0 -0
  200. package/dist/web/public/panels-ui.cbb24ba1.js.br +0 -0
  201. package/dist/web/public/panels-ui.cbb24ba1.js.gz +0 -0
  202. package/dist/web/public/session-ui.9c1f009b.js.br +0 -0
  203. package/dist/web/public/session-ui.9c1f009b.js.gz +0 -0
  204. package/dist/web/public/settings-ui.fea9ddae.js.br +0 -0
  205. package/dist/web/public/settings-ui.fea9ddae.js.gz +0 -0
  206. package/dist/web/public/styles.e096fcd6.css +0 -1
  207. package/dist/web/public/styles.e096fcd6.css.br +0 -0
  208. package/dist/web/public/styles.e096fcd6.css.gz +0 -0
  209. package/dist/web/public/terminal-ui.68dbd352.js +0 -2
  210. package/dist/web/public/terminal-ui.68dbd352.js.br +0 -0
  211. package/dist/web/public/terminal-ui.68dbd352.js.gz +0 -0
@@ -295,11 +295,31 @@ function sessionNotFoundError(sessionId) {
295
295
  * Look up a session by ID or throw a structured error.
296
296
  * Replaces the pattern: `const session = sessions.get(id); if (!session) return createErrorResponse(...)`.
297
297
  *
298
- * When `req` is passed in multi-user mode, a session the caller does not own is
299
- * reported as NOT_FOUND (never 403), so existence of other users' sessions is not
300
- * leaked. Single-user / admin callers are unaffected.
298
+ * In multi-user mode a session the caller does not own is reported as NOT_FOUND
299
+ * (never 403), so existence of other users' sessions is not leaked. Single-user /
300
+ * admin callers are unaffected (`canAccessOwned` short-circuits when multi-user is off).
301
+ *
302
+ * `req` is REQUIRED. When it was optional, forgetting it compiled cleanly and
303
+ * silently performed an UNSCOPED lookup. A caller with no request in flight must
304
+ * say so at the call site via {@link findSessionUnscopedOrFail}.
301
305
  */
302
306
  export function findSessionOrFail(ctx, sessionId, req) {
307
+ return lookupSessionOrFail(ctx, sessionId, req);
308
+ }
309
+ /**
310
+ * Look up a session WITHOUT ownership scoping. Deliberately verbose and greppable:
311
+ * every call is a decision to skip the multi-user ownership check and should carry
312
+ * a comment saying why (e.g. a startup path with no request in flight). Inside a
313
+ * request handler use `findSessionOrFail(ctx, id, req)` instead.
314
+ *
315
+ * It has no production callers today: every lookup in `src/` is request-scoped. It
316
+ * exists so the next genuinely request-less caller has somewhere to go other than
317
+ * making `req` optional again.
318
+ */
319
+ export function findSessionUnscopedOrFail(ctx, sessionId) {
320
+ return lookupSessionOrFail(ctx, sessionId, undefined);
321
+ }
322
+ function lookupSessionOrFail(ctx, sessionId, req) {
303
323
  const session = ctx.sessions.get(sessionId);
304
324
  if (!session)
305
325
  throw sessionNotFoundError(sessionId);
@@ -315,12 +335,15 @@ export function findSessionOrFail(ctx, sessionId, req) {
315
335
  * return, so this returns the persisted record instead. Same ownership
316
336
  * enforcement, same 404-not-403 leak protection — this is that function's
317
337
  * missing other half, not a separate check reimplemented inline.
338
+ *
339
+ * `req` is REQUIRED for the same reason as on `findSessionOrFail`: an optional
340
+ * one would let a caller that forgot it retire another user's row in multi-user mode.
318
341
  */
319
342
  export function findPersistedSessionOrFail(store, sessionId, req) {
320
343
  const persisted = store.getSession(sessionId);
321
344
  if (!persisted)
322
345
  throw sessionNotFoundError(sessionId);
323
- if (req && !canAccessOwned(getAuthUser(req), persisted.owner))
346
+ if (!canAccessOwned(getAuthUser(req), persisted.owner))
324
347
  throw sessionNotFoundError(sessionId);
325
348
  return persisted;
326
349
  }
@@ -576,4 +599,49 @@ export function autoConfigureRalph(session, workingDir, ctx) {
576
599
  });
577
600
  }
578
601
  }
602
+ // ========== Long-poll helpers (shared by the wait routes and the inbox routes) ==========
603
+ /**
604
+ * Map a waiter-cap rejection to the code that tells the caller the truth.
605
+ *
606
+ * The two caps mean different things and warrant different recovery: `session` is
607
+ * genuinely about THIS session, while `owner` and `total` are process-wide budgets
608
+ * that say nothing about it. Reporting a global cap as `SESSION_BUSY` (409,
609
+ * documented as "Session is busy") sent an agent off to a different session to hit
610
+ * the identical error. `RATE_LIMITED` is the code whose whole meaning is "come back
611
+ * later", and clients and proxies already treat 429 that way.
612
+ */
613
+ export function waitCapacityResponse(err) {
614
+ const code = err.scope === 'session' ? ApiErrorCode.SESSION_BUSY : ApiErrorCode.RATE_LIMITED;
615
+ // The registry's message already names the scope and the limit; passing it through
616
+ // verbatim keeps the wording in one place.
617
+ return createErrorResponse(code, err.message);
618
+ }
619
+ /**
620
+ * An `AbortController` that fires when the CLIENT goes away, and only then.
621
+ *
622
+ * Freeing an abandoned waiter matters because the documented pattern is a loop of
623
+ * short waits: `curl --max-time 30 ".../wait?timeout=600000"` abandons a live waiter
624
+ * every iteration until the cap is hit and an innocent session reports busy. Same for
625
+ * any proxy that cuts the connection.
626
+ *
627
+ * ⚠️ **It must listen on the RESPONSE, not the request.** `req.raw` emits `'close'`
628
+ * as soon as the request body has finished streaming, which on a POST is BEFORE the
629
+ * handler ever blocks — measured at +1ms with `aborted: false`, indistinguishable
630
+ * from a real hang-up at +0ms. Wiring the abort there cancels every send-and-wait
631
+ * instantly and silently kills the feature (it survives on GET only because a GET has
632
+ * no body to finish). `reply.raw` emits `'close'` both when the response completes
633
+ * and when the socket dies, and `writableFinished` is what tells those apart: true
634
+ * only if the response actually went out. The guard is load-bearing, not defensive.
635
+ *
636
+ * `app.inject()` never emits `'close'` at all, so this is only observable over real
637
+ * HTTP — which is why the regression test for it binds a port.
638
+ */
639
+ export function abortOnClientHangUp(reply) {
640
+ const controller = new AbortController();
641
+ reply.raw.on('close', () => {
642
+ if (!reply.raw.writableFinished)
643
+ controller.abort();
644
+ });
645
+ return controller;
646
+ }
579
647
  //# sourceMappingURL=route-helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route-helpers.js","sourceRoot":"","sources":["../../src/web/route-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"route-helpers.js","sourceRoot":"","sources":["../../src/web/route-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAIlC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAsD,MAAM,aAAa,CAAC;AAEpH,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAI3C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAG3C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,+BAA+B,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEhG,+EAA+E;AAC/E,8EAA8E;AAC9E,+EAA+E;AAC/E,qEAAqE;AACrE,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,aAAa,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvD;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,OAAe;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAI,QAAgB,EAAE,QAAgB,EAAE,YAAe;IACzF,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,OAAO,CAAC,KAAK,CAAC,kBAAkB,QAAQ,GAAG,EAAE,GAAG,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CACrC,iBAAyB,EACzB,QAAgB;IAEhB,IAAI,kBAA0B,CAAC;IAC/B,IAAI,YAAoB,CAAC;IACzB,IAAI,CAAC;QACH,kBAAkB,GAAG,YAAY,CAAC,iBAAiB,CAAC,CAAC;QACrD,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,aAAa,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,8BAA8B,CAC5C,iBAAyB,EACzB,QAAgB;IAEhB,OAAO,aAAa,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC;AACzF,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,IAAY,EAAE,SAAiB;IACpD,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC/C,IAAI,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AACnD,CAAC;AAED,6DAA6D;AAC7D,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC;AAEpC;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,GAAmB;IAC7C,OAAO,GAAG,CAAC,QAAQ,IAAI,eAAe,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAc,EAAE,KAAyB;IACtE,IAAI,CAAC,eAAe,EAAE;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACvC,OAAO,CAAC,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC;AAC5C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAmB;IAC1C,OAAO,eAAe,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAAe;IAC7C,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAClD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAc,EAAE,UAAkB;IACpE,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAC7D,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,0EAA0E;IAC1E,mCAAmC;IACnC,MAAM,eAAe,GAAG,CAAC,CAAS,EAAU,EAAE;QAC5C,IAAI,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,0CAA0C;QAC1C,SAAS,CAAC;YACR,IAAI,CAAC;gBACH,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAClC,IAAI,MAAM,KAAK,GAAG;oBAAE,OAAO,GAAG,CAAC;gBAC/B,GAAG,GAAG,MAAM,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IACF,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;QACzE,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,UAAU,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,UAAU,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC3C,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,QAA4B,EAC5B,UAAkB;IAElB,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtC,OAAO,mBAAmB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC;AACnF,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,OAAO,CAAC,GAAmB;IACzC,OAAO,CAAC,eAAe,EAAE,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,GAAmB,EAAE,KAAmB;IACnE,IAAI,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;IAClE,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAsC,EACtC,KAAc;IAEd,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,IAAI,uBAAuB,CAAC;IAC7D,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,eAAe,EAAE,IAAI,KAAK,EAAE,CAAC;QAC/B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK;gBAAE,KAAK,EAAE,CAAC;QAClE,SAAS,GAAG,KAAK,IAAI,kBAAkB,EAAE,CAAC;IAC5C,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAsC,EAAE,KAAc;IAC3F,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACzE,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,gCAAgC,uBAAuB,wCAAwC,CAAC;IACzG,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,uBAAuB,kBAAkB,EAAE,gDAAgD,CAAC;IACrG,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,YAAkE,EAClE,QAAgB,EAChB,WAAoB;IAEpB,IAAI,CAAC,YAAY;QAAE,OAAO,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;QAC3C,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YACtD,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,SAAiB;IAC7C,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,SAAS,YAAY,CAAC,EAAE;QAChE,UAAU,EAAE,GAAG;QACf,IAAI,EAAE,mBAAmB,CAAC,YAAY,CAAC,SAAS,EAAE,WAAW,SAAS,YAAY,CAAC;KACpF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAgB,EAAE,SAAiB,EAAE,GAAmB;IACxF,OAAO,mBAAmB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAgB,EAAE,SAAiB;IAC3E,OAAO,mBAAmB,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAgB,EAAE,SAAiB,EAAE,GAA+B;IAC/F,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO;QAAE,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACpD,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACnG,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAAsD,EACtD,SAAiB,EACjB,GAAmB;IAEnB,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,CAAC,SAAS;QAAE,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACtD,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC;QAAE,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC9F,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,qFAAqF;AACrF,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAEvC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAgB,EAChB,GAAmB,EACnB,SAA6B,EAC7B,KAAyB;IAEzB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5D,0EAA0E;IAC1E,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,GAAG;QAAE,OAAO,SAAS,CAAC;IAE3D,IAAI,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,IAAI,4BAA4B,EAAE,CAAC;QAChE,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,SAAS;YAChD,IAAI,MAAM;gBAAE,OAAO,SAAS,CAAC,CAAC,uDAAuD;YACrF,MAAM,GAAG,OAAO,CAAC;QACnB,CAAC;IACH,CAAC;IACD,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACtE,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3E,OAAO,MAAM,CAAC,EAAE,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAmB,EACnB,SAA6B,EAC7B,uBAA2C;IAE3C,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACtE,OAAO,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAC9G,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAI,MAAoB,EAAE,IAAa,EAAE,YAAqB;IACrF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,YAAY,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,mBAAmB,CAAC;QACnF,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;YAClC,UAAU,EAAE,GAAG;YACf,IAAI,EAAE,mBAAmB,CAAC,YAAY,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3D,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,wFAAwF;IACxF,OAAO,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,GAA4B,EAAE,OAAgB;IACvF,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACjC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC;AAClF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IAEtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;IACrC,IAAI,KAAK,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IACvC,IAAI,OAAO,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;IAC3C,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;IAE3D,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAgD;IAC/E,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAEjD,6DAA6D;IAC7D,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAG;QAClB,iBAAiB;QACjB,WAAW;QACX,YAAY;QACZ,YAAY;QACZ,KAAK;QACL,iBAAiB;QACjB,kBAAkB;QAClB,iBAAiB;QACjB,SAAS;QACT,2EAA2E;QAC3E,wEAAwE;QACxE,8CAA8C;QAC9C,WAAW;QACX,QAAQ;KACT,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3C,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,kEAAkE;IAClE,2EAA2E;IAC3E,IAAI,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3C,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;SAAM,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,OAAO,UAAU,CAAC,OAAO,CAAC;IAC5B,CAAC;IAED,sEAAsE;IACtE,IAAI,UAAU,CAAC,UAAU,IAAI,OAAO,UAAU,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACvE,MAAM,KAAK,GAAG,UAAU,CAAC,UAAqC,CAAC;QAC/D,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACzE,IAAI,KAAK,CAAC,SAAS;YAAE,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/E,IAAI,KAAK,CAAC,WAAW;YAAE,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACrF,IAAI,KAAK,CAAC,KAAK;YAAE,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACnE,IAAI,KAAK,CAAC,GAAG;YAAE,OAAO,CAAC,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7D,IAAI,KAAK,CAAC,OAAO;YAAE,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACzE,IAAI,KAAK,CAAC,MAAM;YAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACtE,UAAU,CAAC,UAAU,GAAG,OAAO,CAAC;IAClC,CAAC;IAED,2DAA2D;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,UAAU,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QAC3C,OAAO,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAgB,EAChB,OAA8D,EAC9D,KAAa,EACb,OAAoB;IAEpB,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QACpC,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,8BAA8B,CAAC,CAAC;IACtD,CAAC;SAAM,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QAC3C,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,8BAA8B,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAgB,EAAE,UAAkB,EAAE,GAAc;IACrF,iEAAiE;IACjE,MAAM,WAAW,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAErD,IAAI,WAAW,IAAI,WAAW,CAAC,iBAAiB,EAAE,CAAC;QACjD,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAC9B,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,iBAAiB,EAAE,WAAW,CAAC,aAAa,IAAI,SAAS,CAAC,CAAC;QAEtG,uCAAuC;QACvC,IAAI,WAAW,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YAC9B,6EAA6E;YAC7E,2DAA2D;YAC3D,OAAO,CAAC,GAAG,CAAC,yCAAyC,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,aAAa,IAAI,GAAG,EAAE,CAAC,CAAC;QACpH,CAAC;QAED,OAAO,CAAC,GAAG,CACT,mDAAmD,OAAO,CAAC,EAAE,8BAA8B,WAAW,CAAC,iBAAiB,EAAE,CAC3H,CAAC;QACF,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EAAE;YAC7C,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,SAAS;SACtC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,0BAA0B;IAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACnD,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAE/D,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAC9B,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,mDAAmD,OAAO,CAAC,EAAE,oBAAoB,gBAAgB,EAAE,CAAC,CAAC;QACjH,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,sBAAsB,EAAE;YAC7C,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,SAAS;SACtC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,2FAA2F;AAE3F;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAsB;IACzD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC;IAC7F,mFAAmF;IACnF,2CAA2C;IAC3C,OAAO,mBAAmB,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;AAChD,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAmB;IACrD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB;YAAE,UAAU,CAAC,KAAK,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IACH,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"case-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/case-routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAiE1C,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG3F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA4D9C;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAE1E;AAgID,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,GACxD,IAAI,CA2xDN"}
1
+ {"version":3,"file":"case-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/case-routes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA2E1C,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAG3F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA4D9C;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAE1E;AAgID,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,GACxD,IAAI,CAo+DN"}
@@ -8,15 +8,16 @@
8
8
  import { existsSync, lstatSync, mkdirSync, writeFileSync, readdirSync, readFileSync, createReadStream } from 'node:fs';
9
9
  import { exec } from 'node:child_process';
10
10
  import fs from 'node:fs/promises';
11
- import { join, resolve, basename } from 'node:path';
11
+ import { join, resolve, basename, sep } from 'node:path';
12
12
  import { fileURLToPath } from 'node:url';
13
13
  import { homedir } from 'node:os';
14
14
  import { ApiErrorCode, createErrorResponse, getErrorMessage } from '../../types.js';
15
- import { CreateCaseSchema, CloneCaseSchema, ClonePreflightSchema, LinkCaseSchema, CaseOrderSchema, CaseDefaultGroupSchema, RemoteCaseLinkSchema, RemoteHostSchema, DockerCaseLinkSchema, DockerCaseAdoptSchema, DockerAdoptPreflightSchema, DockerBrowseSchema, DockerHostSchema, DockerExportSchema, DockerImportSchema, DockerQuickCreateSchema, } from '../schemas.js';
15
+ import { CreateCaseSchema, CloneCaseSchema, ClonePreflightSchema, LinkCaseSchema, CaseOrderSchema, CaseDefaultGroupSchema, RenameCaseSchema, RemoteCaseLinkSchema, RemoteHostSchema, DockerCaseLinkSchema, DockerCaseAdoptSchema, DockerAdoptPreflightSchema, DockerBrowseSchema, DockerHostSchema, DockerExportSchema, DockerImportSchema, DockerQuickCreateSchema, } from '../schemas.js';
16
16
  import { exportDockerCase, importDockerBundle, listDockerExports, exportBundleName } from '../../docker-export.js';
17
17
  import { cloneRepository, isGitAvailable, isSafeGitRef, parseGitRepositoryUrl, probeGitRemote, } from '../../git-clone.js';
18
18
  import { generateClaudeMd } from '../../templates/claude-md.js';
19
19
  import { prepareNewCasePath } from '../case-path.js';
20
+ import { CaseRenameError, isCaseSessionStarting, moveCaseFolder, moveClaudeHistory, renameInOrder, siblingPath, withCaseLock, } from '../../case-rename.js';
20
21
  import { boundedPathExists, describeUnknownPath, probePath, probePathKind } from '../../utils/index.js';
21
22
  import { readAgentCaseMarker } from '../../agent-case-marker.js';
22
23
  import { settingsWriteBlocker, writeHooksConfig } from '../../hooks-config.js';
@@ -1446,6 +1447,186 @@ export function registerCaseRoutes(app, ctx) {
1446
1447
  throw err;
1447
1448
  }
1448
1449
  });
1450
+ // ========== Rename Case ==========
1451
+ /**
1452
+ * Rename a case: its name and, with it, its folder.
1453
+ *
1454
+ * - A case under the cases directory IS its folder name, so it always moves.
1455
+ * - A linked case has an alias that is only a key in linked-cases.json; the real folder moves too only
1456
+ * with `renameFolder: true` (it can be shared with other tools).
1457
+ * - Remote and Docker cases are not renamable here: their folder lives on another host or in a container
1458
+ * whose name derives from the case name.
1459
+ *
1460
+ * ⚠️ Moving a folder that sessions have open is the dangerous part (see src/case-rename.ts): live
1461
+ * sessions in it are listed and refused (409 `requiresStop`) unless `stopSessions` is set, in which
1462
+ * case they are ended first. The folder is held by an in-process lock for the whole operation, so a
1463
+ * session cannot start in it half-moved.
1464
+ */
1465
+ app.post('/api/cases/:name/rename', async (req, reply) => {
1466
+ const { name } = req.params;
1467
+ const user = getAuthUser(req);
1468
+ const body = parseBody(RenameCaseSchema, req.body);
1469
+ const newName = body.newName;
1470
+ const fail = (status, code, message, extra = {}) => {
1471
+ reply.code(status);
1472
+ return { ...createErrorResponse(code, message), ...extra };
1473
+ };
1474
+ if (!SAFE_CASE_NAME.test(name) || !validatePathWithinBase(name, resolveCasesDir(user))) {
1475
+ return fail(400, ApiErrorCode.INVALID_INPUT, 'Invalid case name');
1476
+ }
1477
+ if (newName === name)
1478
+ return fail(400, ApiErrorCode.INVALID_INPUT, 'The new name is the same as the old one');
1479
+ // Remote and Docker cases first, so a same-named local case cannot be confused for them.
1480
+ const remoteCases = await readRemoteCases(CODEMAN_CONFIG_DIR);
1481
+ const dockerCases = await readDockerCases(CODEMAN_CONFIG_DIR);
1482
+ if (remoteCases.some((c) => c.name === name && canAccessOwned(user, c.owner)) ||
1483
+ dockerCases.some((c) => c.name === name && canAccessOwned(user, c.owner))) {
1484
+ return fail(400, ApiErrorCode.INVALID_INPUT, 'Remote and Docker cases cannot be renamed here');
1485
+ }
1486
+ const casesBase = resolveCasesDir(user);
1487
+ const linkedCases = await readLinkedCases();
1488
+ const isLinked = Boolean(linkedCases[name]) && (!isMultiUserMode() || isAdmin(req));
1489
+ const oldPath = isLinked ? linkedCases[name] : join(casesBase, name);
1490
+ // The new name must be free in every namespace the list merges.
1491
+ const localTaken = existsSync(join(casesBase, newName));
1492
+ const taken = localTaken ||
1493
+ Boolean(linkedCases[newName]) ||
1494
+ remoteCases.some((c) => c.name === newName) ||
1495
+ dockerCases.some((c) => c.name === newName);
1496
+ if (taken)
1497
+ return fail(409, ApiErrorCode.ALREADY_EXISTS, `A case named "${newName}" already exists`);
1498
+ const state = await probePath(oldPath);
1499
+ if (state === 'absent')
1500
+ return fail(404, ApiErrorCode.NOT_FOUND, `Case "${name}" not found`);
1501
+ // An alias-only rename never touches the folder, so an unreachable one does not block it.
1502
+ if (state === 'unknown' && (!isLinked || body.renameFolder === true)) {
1503
+ return fail(503, ApiErrorCode.OPERATION_FAILED, describeUnknownPath('Case folder', oldPath, { pastCap: true }));
1504
+ }
1505
+ const moveFolder = !isLinked || body.renameFolder === true;
1506
+ const newPath = isLinked ? (moveFolder ? siblingPath(oldPath, newName) : oldPath) : join(casesBase, newName);
1507
+ if (moveFolder && newPath !== oldPath) {
1508
+ // probePath follows symlinks, so a dangling one reads as absent; moveCaseFolder would still refuse it
1509
+ // (it checks with lstat), but only after the sessions below were stopped. The probe answered for this
1510
+ // very path, so the lstat after it is not a first touch of an unreachable mount.
1511
+ const target = await probePath(newPath, { pastCap: true });
1512
+ const danglingLink = target === 'absent' &&
1513
+ (await fs.lstat(newPath).then(() => true, () => false));
1514
+ if (target !== 'absent' || danglingLink) {
1515
+ return fail(409, ApiErrorCode.ALREADY_EXISTS, `A folder named ${newPath} already exists`);
1516
+ }
1517
+ }
1518
+ // Sessions with the folder open. Only a move disturbs them; an alias-only rename leaves them running.
1519
+ // Remote sessions carry the remote path as their workingDir, so they are not this folder's.
1520
+ const heldRoot = resolve(oldPath);
1521
+ const open = moveFolder
1522
+ ? Array.from(ctx.sessions.values()).filter((s) => {
1523
+ if (s.remote)
1524
+ return false;
1525
+ const dir = resolve(s.workingDir);
1526
+ return dir === heldRoot || dir.startsWith(heldRoot + sep);
1527
+ })
1528
+ : [];
1529
+ if (open.some((s) => !canAccessOwned(user, s.owner))) {
1530
+ return fail(403, ApiErrorCode.FORBIDDEN, "Another user's session has this case open");
1531
+ }
1532
+ // A session being created in the folder is not in ctx.sessions yet, so it could be neither listed nor
1533
+ // stopped: it would start in the old path after the move. Checked in the same tick that takes the lock
1534
+ // below (nothing is awaited in between), and the Session constructor refuses the folder from then on.
1535
+ if (moveFolder && isCaseSessionStarting(oldPath)) {
1536
+ return fail(409, ApiErrorCode.CONFLICT, 'A session is starting in this case. Try again in a moment.', {
1537
+ renameCode: 'BUSY',
1538
+ });
1539
+ }
1540
+ if (open.length > 0 && !body.stopSessions) {
1541
+ return fail(409, ApiErrorCode.CONFLICT, `${open.length} live session${open.length === 1 ? ' has' : 's have'} this folder open. Stop them to rename it.`, { requiresStop: true, sessions: open.map((s) => ({ id: s.id, name: s.name })) });
1542
+ }
1543
+ // Sessions really ended so far: an error after `stopSessions` still says how many are gone.
1544
+ let stopped = 0;
1545
+ try {
1546
+ await withCaseLock(oldPath, newPath, async () => {
1547
+ for (const s of open) {
1548
+ await ctx.cleanupSession(s.id, true, 'case_rename');
1549
+ stopped++;
1550
+ }
1551
+ if (moveFolder)
1552
+ await moveCaseFolder(oldPath, newPath);
1553
+ const originalLinks = isLinked ? await readLinkedCases() : undefined;
1554
+ // The settings.json content before this rename wrote it, set only once a write is attempted (an
1555
+ // absent file reads as {}, which must not be written back as a file that never existed).
1556
+ let originalSettings;
1557
+ try {
1558
+ // settings.json is server-wide and caseOrder/lastUsedCase name the admin's cases, so only the
1559
+ // admin's rename touches it (a non-admin's own rename must not rewrite someone else's list).
1560
+ // Written before linked-cases.json so a failure here leaves the registry untouched.
1561
+ if (isAdmin(req)) {
1562
+ const existing = await readJsonConfig(SETTINGS_PATH, 'settings.json', {});
1563
+ const order = renameInOrder(existing.caseOrder, name, newName);
1564
+ const last = existing.lastUsedCase === name ? newName : undefined;
1565
+ if (order || last) {
1566
+ originalSettings = existing;
1567
+ await fs.writeFile(SETTINGS_PATH, JSON.stringify({ ...existing, ...(order ? { caseOrder: order } : {}), ...(last ? { lastUsedCase: last } : {}) }, null, 2));
1568
+ }
1569
+ }
1570
+ if (originalLinks) {
1571
+ const links = { ...originalLinks };
1572
+ delete links[name];
1573
+ links[newName] = newPath;
1574
+ try {
1575
+ await fs.writeFile(LINKED_CASES_FILE, JSON.stringify(links, null, 2));
1576
+ }
1577
+ catch (err) {
1578
+ await fs.writeFile(LINKED_CASES_FILE, JSON.stringify(originalLinks, null, 2)).catch(() => { });
1579
+ throw err;
1580
+ }
1581
+ }
1582
+ }
1583
+ catch (err) {
1584
+ // The folder moved but the registries did not follow: put settings.json and the folder back
1585
+ // rather than leave a case whose name and folder disagree.
1586
+ if (originalSettings) {
1587
+ await fs.writeFile(SETTINGS_PATH, JSON.stringify(originalSettings, null, 2)).catch(() => { });
1588
+ }
1589
+ if (moveFolder) {
1590
+ const movedBack = await fs.rename(newPath, oldPath).then(() => true, () => false);
1591
+ if (!movedBack) {
1592
+ throw new Error(`${getErrorMessage(err)}. The folder could not be moved back and is now at ${newPath}.`);
1593
+ }
1594
+ }
1595
+ throw err;
1596
+ }
1597
+ if (moveFolder)
1598
+ await moveClaudeHistory(oldPath, newPath);
1599
+ // The owner's default session group is keyed by case name: carry it over, best effort.
1600
+ const layoutOwner = ownerLayoutKey(ownerFor(req));
1601
+ try {
1602
+ const { groupId } = await ctx.tabLayouts.caseDefaultGroup(layoutOwner, name);
1603
+ if (groupId)
1604
+ await ctx.tabLayouts.setCaseDefaultGroup(layoutOwner, newName, groupId);
1605
+ }
1606
+ catch {
1607
+ /* the group is a convenience; the rename already happened */
1608
+ }
1609
+ await ctx.tabLayouts.forgetCaseDefaultGroup(layoutOwner, name).catch(() => undefined);
1610
+ });
1611
+ ctx.broadcast(SseEvent.CaseRenamed, { oldName: name, newName, oldPath, newPath, folderMoved: moveFolder });
1612
+ return {
1613
+ success: true,
1614
+ data: { oldName: name, newName, oldPath, newPath, folderMoved: moveFolder, stoppedSessions: open.length },
1615
+ };
1616
+ }
1617
+ catch (err) {
1618
+ if (err instanceof CaseRenameError) {
1619
+ const status = err.code === 'BUSY' ? 409 : err.code === 'EXISTS' ? 409 : err.code === 'LOCKED' ? 423 : 400;
1620
+ const code = err.code === 'EXISTS'
1621
+ ? ApiErrorCode.ALREADY_EXISTS
1622
+ : err.code === 'BUSY'
1623
+ ? ApiErrorCode.CONFLICT
1624
+ : ApiErrorCode.OPERATION_FAILED;
1625
+ return fail(status, code, err.message, { renameCode: err.code, stoppedSessions: stopped });
1626
+ }
1627
+ return fail(500, ApiErrorCode.OPERATION_FAILED, getErrorMessage(err), { stoppedSessions: stopped });
1628
+ }
1629
+ });
1449
1630
  // ========== Reorder Cases ==========
1450
1631
  app.put('/api/cases/order', async (req, reply) => {
1451
1632
  // `caseOrder` is ONE list in the server-wide settings.json, read by every user's