elanous 0.2.37 → 0.2.40

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 (727) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → HjeK7zONHfR7op1hKXp4k}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{1746.3563617ea64023a3.js → 1060.014f1f01a17aec26.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{9151.a2c51e93f9156dae.js → 1281.d81877e35b9068f4.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/1350.59f40e39e02d91b1.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +286 -0
  10. package/apps/pwa/out/_next/static/chunks/1537-6bb97b5214928ea9.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +149 -0
  12. package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +90 -0
  14. package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +104 -0
  15. package/apps/pwa/out/_next/static/chunks/{3578.4e9f9948a9a6f2f4.js → 2047.8f23e210995d4548.js} +2 -2
  16. package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/{7424.c0fe2a595d4232b5.js → 2066.a77257c8c350770a.js} +1 -1
  18. package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/{4931.95cc6dbd230774ca.js → 2177.df8547f9d7215c4e.js} +16 -16
  20. package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/{6680.6a693c28aae4cd19.js → 2226.2cf61ec781827219.js} +2 -2
  22. package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/2499.02fbfd18126c10c0.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/{6252.240578f10952e091.js → 2522.f2766b76d22c8bdf.js} +1 -1
  25. package/apps/pwa/out/_next/static/chunks/{1262.a89bb27a5b2f844e.js → 2566.beaffc3a5e1fcd2e.js} +1 -1
  26. package/apps/pwa/out/_next/static/chunks/261.0d471e8aded799f3.js +226 -0
  27. package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +27 -0
  30. package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{2318-450e75d07605b8fe.js → 2774-719820e3f5b2a3eb.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/{4725-34bed25720cc326b.js → 2829-734fe8bf2eee7347.js} +1 -1
  35. package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3330.7443183b7e6fdbdf.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3746-f80a78f220bf37b5.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +24 -0
  45. package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +77 -0
  46. package/apps/pwa/out/_next/static/chunks/{4337e36d.f42c3b391b3d8f20.js → 3b355b3d.6f73c98bf6f9c749.js} +1 -1
  47. package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +36 -0
  48. package/apps/pwa/out/_next/static/chunks/{58edce7d.f1b0c72acf13b123.js → 409c787b.e48c5bec8ec10456.js} +1 -1
  49. package/apps/pwa/out/_next/static/chunks/413-24c8284bda08241d.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +287 -0
  52. package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4351.0f37a6db2b34d50b.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/{5046.7fd5cbd859299448.js → 470.51a72a2348306455.js} +2 -2
  56. package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/{2375.bf364c85dbb6f085.js → 4769.9fd582071301f382.js} +1 -1
  58. package/apps/pwa/out/_next/static/chunks/483.725e4a61be922788.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/{de8446d3.31b73eb239fecd7b.js → 4864a2ca.1c1c280a7772c5e5.js} +1 -1
  60. package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +74 -0
  63. package/apps/pwa/out/_next/static/chunks/{4383.18e5c54db3a22c88.js → 5383.bdfa5d886e39a826.js} +1 -1
  64. package/apps/pwa/out/_next/static/chunks/5436.fdf6fa8ae3e9588d.js +64 -0
  65. package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +8 -0
  70. package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +62 -0
  72. package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +94 -0
  76. package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{6745-5a63492933959dd9.js → 6051-0ae955eedb10adb9.js} +3 -3
  78. package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/{2283.edd9627b7bdfb546.js → 6257.c0037b8949239f5e.js} +2 -2
  80. package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +32 -0
  85. package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/{6819.be5c9c4d67f22922.js → 6749.0744ce6eb08d40e9.js} +16 -16
  87. package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/6908.06008c67f6380ea9.js +148 -0
  90. package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/6cc1d1d6.9a98dd4622f1afc6.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7219-15bdd9a80661af8e.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +93 -0
  96. package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +24 -0
  100. package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/7611.85f045bf232053ac.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8099.1cccf31c1baa7e1c.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{2002-a43a3f380df873ec.js → 8272-025653884f9645d2.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/{7867.e8725745ddd1d940.js → 8357.1aaa713b052a78b1.js} +4 -4
  110. package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/8639-92c11d069792429e.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/8d173e38.18a2f7b4e1848bdb.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +41 -0
  115. package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/{4313.76f232c304a15bde.js → 9175.2de5209a5ce6f68a.js} +1 -1
  117. package/apps/pwa/out/_next/static/chunks/9184.45afbf44fec87574.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{8c58d09b.e8724a299658d86f.js → 9189505a.980427ac048c8c60.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +79 -0
  123. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/botlab/page-ba957ff875a026a0.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live/{page-3337c6a1328c2674.js → page-4edb8df90f4537ce.js} +1 -1
  143. package/apps/pwa/out/_next/static/chunks/app/live-run/page-83d27757e2b8060a.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/morning/{page-1e5da297557d2354.js → page-fca2e59a81744d9e.js} +1 -1
  148. package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/term/{page-ac2c1e6169cfce57.js → page-139d722de1dcd6c1.js} +1 -1
  167. package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workspace/{page-c1c80e345fa9d6f5.js → page-ccde99f07aaf71f7.js} +1 -1
  173. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/{d9815f84.4918f682a45a8502.js → b84cad00.594027ebe0531fe2.js} +3 -3
  175. package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/{709a918c.4fd3b4e2a32cb4e3.js → ca3702f8.2913182e73889fa2.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/d5d3cefc-373c4eb722ed848b.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/{5f6af561-f90b7a67f4f75d13.js → d8de0de2-dd0f4ac8e5ab1832.js} +1 -1
  179. package/apps/pwa/out/_next/static/chunks/framework-002b472a66935d31.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +1 -0
  184. package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +1 -0
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +22 -22
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +22 -22
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +22 -22
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +21 -21
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +21 -21
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +22 -22
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +21 -21
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +22 -22
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +22 -22
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +21 -21
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +22 -22
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +22 -22
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +22 -22
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +22 -22
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +21 -21
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +21 -21
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +22 -22
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +22 -22
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +22 -22
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +21 -21
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +21 -21
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +22 -22
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +22 -22
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +21 -21
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +21 -21
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +21 -21
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +22 -22
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +22 -22
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +21 -21
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +22 -22
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +22 -22
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +22 -22
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +22 -22
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +22 -22
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +21 -21
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +22 -22
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +22 -22
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +22 -22
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +22 -22
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +22 -22
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +22 -22
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +22 -22
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +22 -22
  278. package/graphs/demo/persona-marketer/fixtures/marketer-scenario.yaml +10 -0
  279. package/graphs/demo/persona-marketer/persona-marketer.yaml +25 -0
  280. package/graphs/demo/persona-marketer/recipes.yaml +19 -0
  281. package/graphs/release/recipes.yaml +9 -0
  282. package/graphs/release/release-loop.yaml +26 -18
  283. package/graphs/video/explainer-line.yaml +4 -1
  284. package/package.json +1 -1
  285. package/scripts/ask-op-inbox-once.ts +17 -0
  286. package/scripts/brand/check.ts +13 -4
  287. package/scripts/dead-code/report.ts +169 -0
  288. package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
  289. package/scripts/gate-0226-failure-census.ts +39 -0
  290. package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
  291. package/scripts/lib/morning-report-options.ts +3 -4
  292. package/scripts/lib/tui-regress-evidence.ts +56 -0
  293. package/scripts/morning-report.ts +5 -1
  294. package/scripts/provision-export-redactions.ts +15 -0
  295. package/scripts/public-copy-lint.ts +122 -0
  296. package/scripts/public-export.ts +77 -2
  297. package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
  298. package/scripts/ratchets/train-side-invariants.sh +7 -1
  299. package/scripts/release-loop/cut-branch.ts +61 -12
  300. package/scripts/release-loop/export-check-node.ts +21 -3
  301. package/scripts/release-loop/gate-node.ts +527 -60
  302. package/scripts/release-loop/gate-partial.ts +82 -3
  303. package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
  304. package/scripts/release-loop/gate-radius-live.ts +4 -2
  305. package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
  306. package/scripts/release-loop/gate-shard-receipts.ts +89 -0
  307. package/scripts/release-loop/gate-wall.ts +5 -5
  308. package/scripts/release-loop/preflight.ts +6 -2
  309. package/scripts/release-loop/resume-cap.ts +2 -1
  310. package/scripts/release-loop/resume-release.ts +317 -13
  311. package/scripts/release-loop/resume.ts +61 -5
  312. package/scripts/release-loop/traffic-node.ts +12 -4
  313. package/scripts/release-loop/traffic-transition.ts +53 -13
  314. package/scripts/release-loop/version-node.ts +35 -5
  315. package/scripts/release-story/draft.ts +1 -1
  316. package/scripts/research-bench/README.md +53 -0
  317. package/scripts/research-bench/questions.json +66 -0
  318. package/scripts/research-bench/rubric.md +33 -0
  319. package/scripts/research-bench/run.ts +523 -0
  320. package/scripts/tui-regress.ts +85 -10
  321. package/scripts/ux-sim.ts +1 -1
  322. package/scripts/video-pipeline.ts +2 -2
  323. package/src/acp/core-turn-bridge.ts +14 -1
  324. package/src/agent/autonomous-tools.ts +10 -3
  325. package/src/agent/monad-agent-turn.ts +4 -1
  326. package/src/agent/registry.ts +26 -2
  327. package/src/agent/run-context.ts +1 -1
  328. package/src/agent/shared-app-tools.ts +1 -1
  329. package/src/agent/surface-ux/build.ts +12 -3
  330. package/src/agent/surface-ux/types.ts +1 -1
  331. package/src/agent/task-notification.ts +78 -7
  332. package/src/agent/types.ts +3 -0
  333. package/src/agent-mission/driver.ts +29 -3
  334. package/src/agent-mission/mission-cli.ts +2 -1
  335. package/src/agent-substrate/review-context-pack.ts +365 -0
  336. package/src/agent-substrate/review-observation.ts +10 -0
  337. package/src/agent-substrate/self-review-cli.ts +419 -42
  338. package/src/ask-user-question/index.ts +6 -0
  339. package/src/ask-user-question/inline-resolver.ts +49 -0
  340. package/src/auto-research/question-ladder-contract.ts +156 -0
  341. package/src/auto-research/research-turn.ts +467 -0
  342. package/src/autopilot/agent-loop.ts +1 -1
  343. package/src/autopilot/discovery/doc-lint.ts +1 -1
  344. package/src/autopilot/pty-control-loop.ts +8 -1
  345. package/src/boot/daemon-tools/index.ts +4 -3
  346. package/src/boot/daemon-tools/self-implement.ts +270 -2
  347. package/src/boot/daemon-tools/types.ts +2 -0
  348. package/src/bots/screen-probe.ts +1 -1
  349. package/src/budget/llm-cost.ts +44 -5
  350. package/src/budget/unified-usage.ts +17 -1
  351. package/src/capture/tui-self-report.ts +24 -2
  352. package/src/chat/index.ts +34 -7
  353. package/src/chat/tool-render/dispatch.ts +8 -1
  354. package/src/cli/agent-cli.ts +43 -8
  355. package/src/cli/guardian-cli.ts +3 -1
  356. package/src/cli/intake-cli.ts +70 -13
  357. package/src/cli/lesson-cli.ts +86 -10
  358. package/src/cli/log-event-names.ts +1 -0
  359. package/src/cli/pod-cli.ts +17 -2
  360. package/src/cli/pr-land-overlap-evidence.ts +38 -5
  361. package/src/cli/pr-land-refusal.ts +1 -1
  362. package/src/cli/pty-takeover-cli.ts +125 -12
  363. package/src/cli/release-checklist-read-cli.ts +5 -2
  364. package/src/cli/release-cli.ts +99 -15
  365. package/src/cli/repo-cli.ts +2 -1
  366. package/src/cli/review-carry.ts +77 -0
  367. package/src/cli/self-update.ts +1 -1
  368. package/src/cli/tasks-card-show.ts +31 -1
  369. package/src/cli/tasks-cli.ts +98 -32
  370. package/src/cli/tasks-read-cli.ts +13 -5
  371. package/src/context-bus/context-now.ts +86 -2
  372. package/src/control-plane/ledger.ts +21 -4
  373. package/src/core-turn/run-core-turn.ts +51 -3
  374. package/src/core-turn/run-goal-loop.ts +152 -8
  375. package/src/core-turn/types.ts +12 -0
  376. package/src/dashboard/chat/acp-chat.ts +2 -2
  377. package/src/dashboard/classic-sigquit.ts +16 -0
  378. package/src/dashboard/index.ts +339 -44
  379. package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
  380. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
  381. package/src/dashboard/input/chat-main-slash-command.ts +7 -0
  382. package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
  383. package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
  384. package/src/dashboard/input/external-input-host.ts +2 -0
  385. package/src/dashboard/input/terminal-modal-router.ts +8 -159
  386. package/src/dashboard/side-basic-runtime.ts +61 -0
  387. package/src/dashboard/sidetab-runtime.ts +228 -0
  388. package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
  389. package/src/dashboard/slash-runtime/dashboard-handlers.ts +22 -8
  390. package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
  391. package/src/dashboard/term-slash-runtime.ts +18 -18
  392. package/src/dashboard/turn-preamble.ts +30 -4
  393. package/src/domains/guardian-tick.ts +9 -0
  394. package/src/domains/knowledge.ts +1 -1
  395. package/src/esc-abort-gate.ts +33 -1
  396. package/src/execution-loop/launch-gate.ts +206 -1
  397. package/src/git-fs/watcher.ts +27 -22
  398. package/src/git-fs/worktree.ts +19 -3
  399. package/src/graph-runner/graph-cli.ts +6 -4
  400. package/src/graph-runner/graph-grow.ts +37 -9
  401. package/src/graph-runner/runner.ts +48 -11
  402. package/src/graph-wizard/generate.ts +16 -7
  403. package/src/graph-wizard/mission-compose.ts +201 -0
  404. package/src/grok/agent-search.ts +8 -2
  405. package/src/grok/credential.ts +112 -36
  406. package/src/grounding/ref-index.ts +11 -0
  407. package/src/grounding/ref-vector.ts +61 -0
  408. package/src/grounding/sources-cli.ts +2 -2
  409. package/src/grounding/sources.ts +15 -1
  410. package/src/harness/harness-cli-command.ts +38 -9
  411. package/src/harness/harness-pod-dispatch.ts +7 -1
  412. package/src/hq/fence-wrapper.ts +1 -1
  413. package/src/hq/transfer.ts +1 -1
  414. package/src/index.ts +60 -16
  415. package/src/input/external-input-queue.ts +10 -0
  416. package/src/intake-plane/collect-telegram-saved.ts +90 -6
  417. package/src/intake-plane/intake-to-tasks.ts +246 -3
  418. package/src/interactive-terminal-modal.ts +3 -0
  419. package/src/keybindings.ts +17 -22
  420. package/src/lessons/friction-ledger.ts +154 -0
  421. package/src/live-supply/collector.ts +149 -0
  422. package/src/live-supply/probes.ts +52 -0
  423. package/src/live-supply/snapshot.ts +40 -0
  424. package/src/llm/provider-credentials.ts +1 -1
  425. package/src/llm-tool-schema.ts +20 -0
  426. package/src/llm.ts +486 -61
  427. package/src/loops/orchestrator/inbox-once.ts +28 -0
  428. package/src/loops/orchestrator/inbox.ts +130 -1
  429. package/src/loops/orchestrator/tick.ts +14 -3
  430. package/src/maturity/feature-maturity.ts +1 -0
  431. package/src/nexus/api/channel-ask-op.ts +96 -0
  432. package/src/nexus/api/discord-trigger-bot.ts +28 -1
  433. package/src/nexus/api/harness-api.ts +2 -1
  434. package/src/nexus/api/telegram-trigger-bot.ts +24 -0
  435. package/src/nexus/api/terminals.ts +28 -6
  436. package/src/patents/ledger.ts +18 -1
  437. package/src/preview/terminal.ts +4 -2
  438. package/src/prompt-cache/anthropic.ts +2 -0
  439. package/src/prompt-enhance/enhance.ts +5 -0
  440. package/src/pty/snapshot.py +132 -0
  441. package/src/pty-shell/pty-control-ipc.ts +29 -2
  442. package/src/pty-shell/pty-manifest.ts +75 -5
  443. package/src/pty-shell/registry.ts +2 -0
  444. package/src/pty-shell/tui-run-state.ts +80 -3
  445. package/src/release-loop/gate-host-reservation.ts +13 -4
  446. package/src/release-loop/gate-shard-ledger.ts +68 -0
  447. package/src/release-loop/gate-shards.ts +61 -0
  448. package/src/release-loop/light-rc.ts +7 -4
  449. package/src/release-loop/merged-pr-checklist.ts +25 -2
  450. package/src/release-loop/rehearsal-shard-plan.ts +6 -1
  451. package/src/release-loop/rehearsal.ts +28 -1
  452. package/src/repl/index.ts +10 -0
  453. package/src/research/axis-fanout.ts +133 -0
  454. package/src/research/edge-decision.ts +197 -0
  455. package/src/research/gap-followup.ts +249 -0
  456. package/src/research/lenses/counter-evidence.ts +100 -0
  457. package/src/research/lenses/working-backwards.ts +89 -0
  458. package/src/research/output-router.ts +127 -0
  459. package/src/research/plugin-discovery.ts +242 -0
  460. package/src/research-bridge/format.ts +16 -1
  461. package/src/research-bridge/index.ts +1 -0
  462. package/src/research-bridge/invoke.ts +45 -7
  463. package/src/research-bridge/types.ts +2 -0
  464. package/src/self-dev/ask-launch-flow.ts +34 -106
  465. package/src/self-dev/decompose.ts +45 -9
  466. package/src/self-dev/dev-cli.ts +2 -0
  467. package/src/self-dev/dev-pipeline.ts +8 -4
  468. package/src/self-dev/draft-residue.ts +221 -2
  469. package/src/self-dev/draft-sweep.ts +29 -16
  470. package/src/self-dev/graph-journey-route.ts +10 -2
  471. package/src/self-dev/launch-preflight-text.ts +2 -2
  472. package/src/self-dev/launch-preflight.ts +38 -7
  473. package/src/self-dev/orchestrate-cli.ts +1 -0
  474. package/src/self-dev/orchestrate.ts +1 -0
  475. package/src/self-dev/run-supervisor.ts +41 -7
  476. package/src/self-dev/shard-run.ts +260 -3
  477. package/src/self-implement/comment-only-source.ts +54 -0
  478. package/src/self-implement/device-first.ts +8 -2
  479. package/src/self-implement/doctor-visit.ts +100 -57
  480. package/src/self-implement/gate-artifacts.ts +5 -2
  481. package/src/self-implement/gate-baseline.ts +119 -13
  482. package/src/self-implement/gate-cli.ts +466 -93
  483. package/src/self-implement/gate-failure-signature.ts +44 -0
  484. package/src/self-implement/gate-receipt-registry.ts +180 -0
  485. package/src/self-implement/gate-remote.ts +147 -22
  486. package/src/self-implement/goal-author-clarification.ts +178 -24
  487. package/src/self-implement/goal-author-decompose.ts +24 -15
  488. package/src/self-implement/goal-author.ts +82 -7
  489. package/src/self-implement/goal-doc/section.ts +22 -0
  490. package/src/self-implement/goal-supervisor-fill.ts +38 -4
  491. package/src/self-implement/host-regate.ts +120 -45
  492. package/src/self-implement/impl-findings-feedback.ts +188 -0
  493. package/src/self-implement/knowhow-pack.ts +301 -9
  494. package/src/self-implement/l8-merge-queue.ts +198 -32
  495. package/src/self-implement/off-diff-evidence.ts +147 -0
  496. package/src/self-implement/orchestrator.ts +137 -16
  497. package/src/self-implement/pod-inplace-worktree.ts +82 -0
  498. package/src/self-implement/pod-warm-pool-profile.ts +2 -2
  499. package/src/self-implement/premise-review.ts +7 -5
  500. package/src/self-implement/run-ledger.ts +304 -8
  501. package/src/self-implement/run-stop.ts +12 -0
  502. package/src/self-implement/seams.ts +39 -13
  503. package/src/self-implement/self-implement-cli.ts +30 -4
  504. package/src/session/channel-ask-op-envelope.ts +36 -0
  505. package/src/session/channel-op-reply-route.ts +200 -0
  506. package/src/session/chat.ts +92 -15
  507. package/src/session/index.ts +2 -0
  508. package/src/session-runtime/index.ts +9 -22
  509. package/src/session-runtime/provider-circuit.ts +140 -0
  510. package/src/shell-runner/file-engine.ts +1 -0
  511. package/src/shell-runner/types.ts +4 -0
  512. package/src/sidetab-core/model.ts +176 -0
  513. package/src/skills/runner.ts +7 -3
  514. package/src/skills/tools/dev-harness.ts +2 -2
  515. package/src/skills/tools/schedule-wakeup.ts +24 -7
  516. package/src/skills/tools/shell.ts +51 -5
  517. package/src/status/bar.ts +3 -3
  518. package/src/steward/directive-audit.ts +354 -0
  519. package/src/storage/file-lock.ts +17 -4
  520. package/src/surface/child-process.ts +31 -0
  521. package/src/surface/tui-stderr-owner.ts +48 -0
  522. package/src/task-agent/adopt-pr.ts +63 -2
  523. package/src/task-agent/cover.ts +30 -12
  524. package/src/task-agent/evidence-command-normalize.ts +42 -0
  525. package/src/task-agent/export-redactions-provision.ts +43 -0
  526. package/src/task-agent/judge.ts +56 -0
  527. package/src/task-agent/parent-host.ts +59 -12
  528. package/src/task-agent/postland-card.ts +35 -2
  529. package/src/task-agent/rejudge-on-head.ts +46 -2
  530. package/src/task-agent/repair-cycle.ts +68 -9
  531. package/src/task-agent/repair-worker.ts +37 -1
  532. package/src/task-agent/task-hand.ts +226 -33
  533. package/src/task-agent/tier-split.ts +142 -24
  534. package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
  535. package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
  536. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +57 -5
  537. package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
  538. package/src/task-orchestrator/surfaces/pod-pool.ts +27 -4
  539. package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
  540. package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
  541. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
  542. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
  543. package/src/task-orchestrator/surfaces/self-implement-pod.ts +310 -79
  544. package/src/task-orchestrator/surfaces/self-implement.ts +33 -2
  545. package/src/terminal/session-registry.ts +1 -0
  546. package/src/terminal/terminal-modal-router.ts +156 -0
  547. package/src/tool-hints/gate.ts +6 -4
  548. package/src/tool-hints/signals.ts +33 -1
  549. package/src/tool-runtime/skill-exec-runtime.ts +95 -5
  550. package/src/tui/chat/background-job-status.ts +8 -2
  551. package/src/tui/entry.ts +483 -32
  552. package/src/tui/inline-choice.ts +188 -0
  553. package/src/tui/sidetab/attach.ts +304 -0
  554. package/src/tui/sidetab/list.ts +2 -0
  555. package/src/tui/sidetab/nl-tool.ts +136 -0
  556. package/src/tui/slash/resume-command.ts +23 -0
  557. package/src/tui/slash/resume.ts +3 -23
  558. package/src/tui/slash/term-next.ts +2 -1
  559. package/src/tui/slash/term.ts +12 -1
  560. package/src/tui-client/dashboard-session.ts +7 -1
  561. package/src/tui-client/local-chat-turn.ts +29 -8
  562. package/src/user-config.ts +42 -3
  563. package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
  564. package/src/ux-sim/fake-land-queue.ts +88 -0
  565. package/src/ux-sim/fake-llm.ts +11 -5
  566. package/src/ux-sim/gate-shard-host-reroute.ts +82 -0
  567. package/src/ux-sim/goal-interim-trace.ts +24 -0
  568. package/src/ux-sim/next-tui-seat-scenarios.ts +61 -14
  569. package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
  570. package/src/version/packed-revision.json +1 -1
  571. package/src/video-pipeline/recipes/explainer.ts +54 -2
  572. package/src/web-search/grok.ts +32 -6
  573. package/src/web-search/index.ts +8 -7
  574. package/src/workflow-runtime/node-catalog.ts +53 -4
  575. package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/1224.2ceca6c180d5130b.js +0 -62
  579. package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +0 -32
  587. package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/2479-fe7e188bd9402d14.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +0 -148
  590. package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +0 -27
  594. package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/3199.6a1a9b0e6cd01dc6.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +0 -36
  601. package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/4036.d54e55e1ebf5acdc.js +0 -90
  603. package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +0 -226
  604. package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +0 -287
  605. package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +0 -24
  612. package/apps/pwa/out/_next/static/chunks/4937-28d437999b77c9dd.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +0 -104
  615. package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +0 -93
  622. package/apps/pwa/out/_next/static/chunks/5952.294fc574a8625184.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +0 -74
  624. package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +0 -149
  627. package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +0 -41
  631. package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +0 -24
  634. package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/757-4fbaf50942b8c424.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/7c5ed21f-f286708e57cf88f7.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +0 -8
  647. package/apps/pwa/out/_next/static/chunks/8080-40d781e7704d3671.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +0 -77
  649. package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +0 -286
  652. package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +0 -79
  656. package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +0 -94
  664. package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/958.53a8dcf4729e6997.js +0 -64
  666. package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/app/intake/page-5c112c6d7c33656e.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-fe986fe79b107546.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-88a1edbff62eaf1d.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/app/page-b9af2ac1c4737ce8.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +0 -1
  705. package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/app/share/page-fb9e639c107f5f72.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +0 -1
  725. package/scripts/migrate-monad-to-elanous.ts +0 -195
  726. package/scripts/rebrand-elanous.ts +0 -242
  727. /package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → HjeK7zONHfR7op1hKXp4k}/_ssgManifest.js +0 -0
package/src/tui/entry.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  import { initTui, closeTui, injectKey, readKey, type Key } from '../tui.js';
2
- import { createSession, getActiveSessionId, loadSession, resolveSessionId, setActiveSessionId } from '../session/index.js';
2
+ import { createSession, getActiveSessionId, loadSession, resolveSessionId, setActiveSessionId, updateSessionMeta } from '../session/index.js';
3
3
  import { fitLogLine, isToolFoldToggleKey, logViewLines, safeLogText, safeStatusText, streamReplyLines, toggleVisibleToolFold, toolFoldBlockStarts, wheelScroll } from './chat/log-view.js';
4
4
  import { BackgroundJobStatus } from './chat/background-job-status.js';
5
5
  import { MOUSE_RESIDUE_WINDOW_MS, MouseResidueGuard, applyComposerKey, composerViewport, emptyComposer, wheelDirection } from './input/composer.js';
6
6
  import { createInlineEditorState, type InlineEditorState } from '../input-core/inline-editor.js';
7
7
  import { isNewSessionCommand, nextTuiTitle, requestNewTuiSession } from './slash/new-session.js';
8
8
  import { COMPACT_BUSY_STATUS, COMPACT_NO_SESSION_STATUS, isCompactCommand } from './slash/compact-command.js';
9
- import { RESUME_BUSY_STATUS, parseResumeCommand, requestResumeTuiSession, resumeCandidates, resumeListLines } from './slash/resume.js';
10
- import { reportTuiTurn } from '../pty-shell/tui-run-state.js';
9
+ import { RESUME_BUSY_STATUS, parseResumeCommand } from './slash/resume-command.js';
10
+ import { reportTuiProgress, reportTuiTurn } from '../pty-shell/tui-run-state.js';
11
11
  import { createPasteFold } from '../chat/paste-fold.js';
12
12
  import { createTurnTypeaheadState, dequeueTurnTypeaheadHandoff, drainTurnTypeaheadOnce, restoreTurnTypeaheadSubmission } from '../chat/turn-typeahead.js';
13
13
  import { debug } from '../debug/log.js';
@@ -15,10 +15,10 @@ import { setCliStderrSink } from '../git-fs/cli-stderr.js';
15
15
  import { createInputLagProbe } from './input-lag-probe.js';
16
16
  import type { NextTuiWakeup } from '../tui-client/next-wakeup.js';
17
17
  import { countInterimDisplay, internalTurnOriginOfText, planInterimDisplay } from './chat/goal-interim.js';
18
- import type { NextTuiSelfHealthSnapshot } from './chat/self-health-status.js';
19
18
  import { createNextLoopCommand, type NextLoopCommand } from '../tui-client/next-loop-command.js';
20
19
  import { handleMissionSlash, type MissionSlashContext } from './slash/mission.js';
21
20
  import { handleSignalsSlash } from './slash/signals.js';
21
+ import { updatePtyManifestSession } from '../pty-shell/pty-manifest.js';
22
22
 
23
23
  /** Status-line count of what waits for the running turn — empty when nothing waits. */
24
24
  export function nextTuiQueueSuffix(count: number): string {
@@ -36,12 +36,15 @@ type NextTuiTermSession = {
36
36
 
37
37
  export interface NextTuiOptions {
38
38
  readonly resumeSessionId?: string;
39
+ readonly sidetabMode?: 'off' | 'collapsed' | 'open';
39
40
  /** Read-only terminal session source; injectable so the Next slash stays testable without PTYs. */
40
41
  readonly termSessions?: {
41
42
  list(): readonly NextTuiTermSession[] | Promise<readonly NextTuiTermSession[]>;
42
43
  };
43
44
  }
44
45
 
46
+ const sidetabOpenBySession = new Map<string, boolean>();
47
+
45
48
  interface AtPickerCandidate {
46
49
  readonly label: string;
47
50
  readonly absPath: string;
@@ -61,9 +64,16 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
61
64
  throw new Error('elanous --tui next requires at least 20 columns and 6 rows');
62
65
  }
63
66
  const dashboardRuntime = await (await import('../tui-client/next-dashboard-runtime.js')).loadNextTuiDashboardRuntime();
64
- const requested = options.resumeSessionId ?? getActiveSessionId();
67
+ // A bare launch is a fresh human conversation. Automation CLIs share the
68
+ // active-session pointer, so only an explicit root --continue/--resume may
69
+ // attach an existing session here.
70
+ const requested = options.resumeSessionId;
65
71
  let id = requested ? resolveSessionId(requested) : null;
66
72
  if (requested && !id) throw new Error(`session not found: ${requested}`);
73
+ if (!id) {
74
+ id = createSession({ source: 'tui' }).id;
75
+ setActiveSessionId(id);
76
+ }
67
77
  let session = id ? loadSession(id) : null;
68
78
  let messages = session?.messages ?? [];
69
79
  // The seat ledger is touched only on next-TUI boot, and only when the
@@ -79,6 +89,22 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
79
89
  let scroll = 0;
80
90
  let maxScroll = 0;
81
91
  let focus: 'input' | 'log' = 'input';
92
+ let sidetabEnabled = options.sidetabMode !== 'off';
93
+ let sidetabAll = false;
94
+ let sidetabOpen = sidetabEnabled && (session?.meta.uiState?.sidetabOpen ?? sidetabOpenBySession.get(id!) ?? options.sidetabMode === 'open');
95
+ let sidetabSelected = 0;
96
+ let sidetabMode: 'list' | 'new' = 'list';
97
+ let sidetabFocused = false;
98
+ let sidetabChordPending = false;
99
+ let sidetabChordTimer: ReturnType<typeof setTimeout> | null = null;
100
+ let sidetabRemoteFrame: string | null = null;
101
+ let sidetabRows: import('./sidetab/list.js').SidetabRow[] = [];
102
+ let sidetabApi: typeof import('./sidetab/list.js') | null = null;
103
+ // ⚠️ `as` 단언은 «null 로 좁혀지는» 흐름 분석을 푸는 것 — 값은 클로저(ensureSidetabAttachments) 안에서만 바뀐다.
104
+ let sidetabAttachments: import('./sidetab/attach.js').SidetabAttachmentController | null = null as import('./sidetab/attach.js').SidetabAttachmentController | null;
105
+ let pendingSidetabSwitch: string | null = null;
106
+ let sidetabRefreshTimer: ReturnType<typeof setInterval> | null = null;
107
+ let paintingCoordinatorFrame = false;
82
108
  const mouseResidue = new MouseResidueGuard();
83
109
  const replay: Key[] = [];
84
110
  let escapeSnapshot: { editor: InlineEditorState; status: string; focus: 'input' | 'log'; busy: boolean } | null = null;
@@ -89,7 +115,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
89
115
  let draft = '';
90
116
  let activity: string[] = [];
91
117
  /** Rows of the last `/resume` list — `/resume <n>` picks from what the user saw. */
92
- let lastResumeRows: ReturnType<typeof resumeCandidates> | null = null;
118
+ let lastResumeRows: import('../session/index.js').SessionMeta[] | null = null;
93
119
  let atPicker: { query: AtPickerQuery; candidates: AtPickerCandidate[]; selected: number } | null = null;
94
120
  let atPickerApi: typeof import('./input/at-picker.js') | null = null;
95
121
  let dismissedAtQuery = '';
@@ -106,6 +132,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
106
132
  const backgroundJobs = new BackgroundJobStatus(id);
107
133
  const backgroundSubscription: { stop?: () => void } = {};
108
134
  const selfHealthSubscription: { stop?: () => void } = {};
135
+ let observedSessionId: string | null = null;
109
136
  let selfHealthLine: string | null = null;
110
137
  // TUI-NEXT-QUEUE-AND-WAKE — what is submitted while busy waits here (the classic FIFO state) and
111
138
  // leaves one item per settle; Esc returns it all to the prompt (classic «interrupted» drain).
@@ -130,6 +157,25 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
130
157
  const pushNotice = (line: string): void => {
131
158
  notices = [...notices, safeStatusText(line)].slice(-3);
132
159
  };
160
+ const observeSession = (
161
+ sessionId: string,
162
+ onBackground: typeof import('../tui-client/local-chat-turn.js').onLocalChatBackgroundStatus,
163
+ onSelfHealth: typeof import('../tui-client/local-chat-turn.js').onLocalChatSelfHealthStatus,
164
+ ): void => {
165
+ if (observedSessionId === sessionId) return;
166
+ backgroundSubscription.stop?.();
167
+ selfHealthSubscription.stop?.();
168
+ backgroundSubscription.stop = onBackground(sessionId, (frame) => {
169
+ if (frame === null) backgroundJobs.clear();
170
+ else backgroundJobs.accept(frame);
171
+ render();
172
+ });
173
+ selfHealthSubscription.stop = onSelfHealth(sessionId, (snapshot) => {
174
+ selfHealthLine = snapshot?.line ?? null;
175
+ render();
176
+ });
177
+ observedSessionId = sessionId;
178
+ };
133
179
  const slashHandlers = new Map<string, (args: string[], context: MissionSlashContext) => Promise<void>>();
134
180
  slashHandlers.set('mission', handleMissionSlash);
135
181
  slashHandlers.set('signals', handleSignalsSlash);
@@ -239,50 +285,202 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
239
285
  }));
240
286
 
241
287
  const render = (): void => {
288
+ if (sidetabRemoteFrame !== null) {
289
+ const columns = process.stdout.columns || 80;
290
+ const rows = process.stdout.rows || 24;
291
+ const footer = fitLogLine(` ${status} `, Math.max(1, columns));
292
+ process.stdout.write(`\x1b[H\x1b[2J${sidetabRemoteFrame}\x1b[${rows};1H\x1b[7m${footer}\x1b[0m`);
293
+ return;
294
+ }
242
295
  const columns = process.stdout.columns || 0;
243
296
  const rows = process.stdout.rows || 0;
244
297
  if (columns < 20 || rows < 6) {
245
298
  process.stdout.write(`\x1b[H\x1b[2J${fitLogLine('터미널이 너무 작습니다 · q 종료', Math.max(1, columns))}`);
246
299
  return;
247
300
  }
301
+ if (sidetabOpen && columns < 34) {
302
+ sidetabOpen = false;
303
+ sidetabMode = 'list';
304
+ status = '터미널 폭이 줄어 사이드탭을 닫았습니다';
305
+ if (sidetabRefreshTimer !== null) {
306
+ clearInterval(sidetabRefreshTimer);
307
+ sidetabRefreshTimer = null;
308
+ }
309
+ }
310
+ const sidetabWidth = sidetabOpen ? sidetabApi!.sidetabWidthForTerminal(columns) : 0;
311
+ const chatColumns = columns - sidetabWidth - (sidetabOpen ? 1 : 0);
248
312
  const backgroundLine = backgroundJobs.line();
249
313
  const footerRows = backgroundLine ? 2 : 1;
250
314
  const history = [
251
- ...logViewLines(messages, columns, expandedToolBlocks),
252
- ...notices.map((line) => fitLogLine(line, columns)),
253
- ...activity.map((line) => fitLogLine(line, columns)),
315
+ ...logViewLines(messages, chatColumns, expandedToolBlocks),
316
+ ...notices.map((line) => fitLogLine(line, chatColumns)),
317
+ ...activity.map((line) => fitLogLine(line, chatColumns)),
254
318
  ];
255
319
  const bodyRows = rows - 3 - footerRows;
256
320
  maxScroll = Math.max(0, history.length - bodyRows);
257
321
  scroll = Math.min(scroll, maxScroll);
258
322
  const start = Math.max(0, history.length - bodyRows - scroll);
259
323
  const body = history.slice(start, start + bodyRows);
260
- logWindow = { start, rows: bodyRows, columns };
261
- const title = fitLogLine(`elanous next · ${safeLogText(nextTuiTitle(session?.meta)).split('\n')[0]}`, columns);
324
+ logWindow = { start, rows: bodyRows, columns: chatColumns };
325
+ const title = fitLogLine(`elanous next · ${safeLogText(nextTuiTitle(session?.meta)).split('\n')[0]}`, chatColumns);
262
326
  const turnStatus = (!busy && focus === 'log'
263
- ? `로그 탐색 · ↑↓ 스크롤${toolFoldBlockStarts(messages, columns).length > 0 ? ' · Enter 접기/펼치기' : ''} · Esc 입력`
327
+ ? `로그 탐색 · ↑↓ 스크롤${toolFoldBlockStarts(messages, chatColumns).length > 0 ? ' · Enter 접기/펼치기' : ''} · Esc 입력`
264
328
  : status) + nextTuiQueueSuffix(queue.queuedSubmissions.length);
265
329
  const footer = backgroundLine
266
- ? [fitLogLine(backgroundLine, columns), fitLogLine(turnStatus, columns)]
267
- : [fitLogLine(turnStatus, columns)];
268
- const prompt = composerViewport(editor, columns);
269
- const header = [title, mailLine ? fitLogLine(mailLine, columns) : '─'.repeat(Math.min(columns, 80))];
270
- if (selfHealthLine) header.push(fitLogLine(selfHealthLine, columns));
330
+ ? [fitLogLine(backgroundLine, chatColumns), fitLogLine(turnStatus, chatColumns)]
331
+ : [fitLogLine(turnStatus, chatColumns)];
332
+ const prompt = composerViewport(editor, chatColumns);
333
+ const header = [title, mailLine ? fitLogLine(mailLine, chatColumns) : '─'.repeat(Math.min(chatColumns, 80))];
334
+ if (selfHealthLine) header.push(fitLogLine(selfHealthLine, chatColumns));
271
335
  if (atPicker) {
272
336
  const limit = Math.max(1, Math.min(6, rows - 8));
273
337
  const start = Math.max(0, Math.min(atPicker.selected - limit + 1, atPicker.candidates.length - limit));
274
338
  const visible = atPicker.candidates.slice(start, start + limit);
275
- header.push(fitLogLine(visible.length ? '@ 파일 첨부 · ↑↓ 선택 · Enter 추가 · Esc 닫기' : '@ 파일 후보 없음', columns));
339
+ header.push(fitLogLine(visible.length ? '@ 파일 첨부 · ↑↓ 선택 · Enter 추가 · Esc 닫기' : '@ 파일 후보 없음', chatColumns));
276
340
  for (const [offset, candidate] of visible.entries()) {
277
- header.push(fitLogLine((start + offset === atPicker.selected ? '▸' : ' ') + ' ' + candidate.label, columns));
341
+ header.push(fitLogLine((start + offset === atPicker.selected ? '▸' : ' ') + ' ' + candidate.label, chatColumns));
278
342
  }
279
343
  }
280
344
  const lines = [...header, ...body, ...footer, prompt.line];
281
345
  const promptRow = lines.length;
282
- process.stdout.write(`\x1b[H\x1b[2J${lines.join('\n')}\x1b[${promptRow};${prompt.cursorCol}H\x1b[?25h`);
346
+ const sidetabLines = sidetabOpen
347
+ ? sidetabApi!.formatSidetabLines(sidetabRows, sidetabSelected, sidetabWidth, Math.max(1, rows - 1), sidetabMode)
348
+ : [];
349
+ const screenLines = sidetabOpen
350
+ ? lines.map((line, index) => `${sidetabLines[index] ?? ' '.repeat(sidetabWidth)}│${line}`)
351
+ : lines;
352
+ process.stdout.write(`\x1b[H\x1b[2J${screenLines.join('\n')}\x1b[${promptRow};${prompt.cursorCol + (sidetabOpen ? sidetabWidth + 1 : 0)}H\x1b[?25h`);
353
+ if (sidetabAttachments?.hasModal() && !paintingCoordinatorFrame) sidetabAttachments.refresh();
354
+ };
355
+
356
+ const ensureSidetabAttachments = async (): Promise<void> => {
357
+ if (sidetabAttachments) return;
358
+ sidetabAttachments = (await import('./sidetab/attach.js')).createSidetabAttachmentController({
359
+ drawBase: () => {
360
+ paintingCoordinatorFrame = true;
361
+ try { render(); } finally { paintingCoordinatorFrame = false; }
362
+ },
363
+ termSize: () => ({ cols: process.stdout.columns || 80, rows: process.stdout.rows || 24 }),
364
+ setStatus: (message) => { status = safeStatusText(message); },
365
+ drawRemoteFrame: (frame) => {
366
+ sidetabRemoteFrame = frame || null;
367
+ if (sidetabRemoteFrame !== null) {
368
+ const columns = process.stdout.columns || 80;
369
+ const rows = process.stdout.rows || 24;
370
+ const footer = fitLogLine(` ${status} `, Math.max(1, columns));
371
+ process.stdout.write(`\x1b[H\x1b[2J${sidetabRemoteFrame}\x1b[${rows};1H\x1b[7m${footer}\x1b[0m`);
372
+ }
373
+ else render();
374
+ },
375
+ });
376
+ };
377
+
378
+ const toggleSidetab = async (): Promise<void> => {
379
+ if (!sidetabEnabled) {
380
+ status = '사이드탭 off · /side on 으로 이 세션에서 켜기';
381
+ return;
382
+ }
383
+ if (!sidetabOpen && (process.stdout.columns || 0) < 34) {
384
+ status = '사이드탭은 터미널 폭 34칸 이상에서 열 수 있습니다';
385
+ return;
386
+ }
387
+ if (!sidetabApi) sidetabApi = await import('./sidetab/list.js');
388
+ sidetabRows = sidetabApi.loadSidetabRows(sidetabAll);
389
+ const current = sidetabRows.findIndex((row) => row.sessionId === id);
390
+ const next = sidetabApi.applySidetabKey({ open: sidetabOpen, selected: current >= 0 ? current : sidetabSelected }, 'toggle', sidetabRows.length);
391
+ sidetabOpen = next.open;
392
+ sidetabOpenBySession.set(id!, sidetabOpen);
393
+ updateSessionMeta(id!, (meta) => { meta.uiState = { ...meta.uiState, sidetabOpen }; });
394
+ sidetabSelected = next.selected;
395
+ sidetabMode = 'list';
396
+ if (sidetabOpen && sidetabRefreshTimer === null) {
397
+ sidetabRefreshTimer = setInterval(() => {
398
+ if (!sidetabOpen || !sidetabApi) return;
399
+ refreshSidetabRows();
400
+ render();
401
+ }, 1000);
402
+ } else if (!sidetabOpen && sidetabRefreshTimer !== null) {
403
+ clearInterval(sidetabRefreshTimer);
404
+ sidetabRefreshTimer = null;
405
+ }
406
+ };
407
+
408
+ const refreshSidetabRows = (): void => {
409
+ if (!sidetabApi) return;
410
+ const selectedId = sidetabRows[sidetabSelected]?.id;
411
+ sidetabRows = sidetabApi.loadSidetabRows(sidetabAll);
412
+ const preservedIndex = selectedId ? sidetabRows.findIndex((row) => row.id === selectedId) : -1;
413
+ sidetabSelected = preservedIndex >= 0
414
+ ? preservedIndex
415
+ : Math.min(sidetabSelected, Math.max(0, sidetabRows.length - 1));
416
+ };
417
+ const switchSidetabSession = async (requestedSessionId?: string): Promise<void> => {
418
+ const selected = sidetabRows[sidetabSelected];
419
+ const targetId = requestedSessionId ?? (selected?.kind === 'tui' ? selected.sessionId : undefined);
420
+ if (!targetId || targetId === id) return;
421
+ if (busy) {
422
+ status = '응답 중에는 세션을 전환할 수 없습니다';
423
+ return;
424
+ }
425
+ const target = loadSession(targetId);
426
+ if (!target) {
427
+ status = '세션을 읽을 수 없습니다 · 목록을 다시 열어 주세요';
428
+ return;
429
+ }
430
+ id = targetId;
431
+ session = target;
432
+ messages = target.messages;
433
+ setActiveSessionId(targetId);
434
+ updatePtyManifestSession(`tui:${process.pid}`, targetId);
435
+ backgroundJobs.setSessionId(targetId);
436
+ selfHealthLine = null;
437
+ const statusSources = await import('../tui-client/local-chat-turn.js');
438
+ observeSession(targetId, statusSources.onLocalChatBackgroundStatus, statusSources.onLocalChatSelfHealthStatus);
439
+ goalContinue?.noteHumanTurn();
440
+ lastResumeRows = null;
441
+ expandedToolBlocks.clear();
442
+ activity = [];
443
+ streamingReply = '';
444
+ scroll = 0;
445
+ maxScroll = 0;
446
+ status = '세션 전환됨 · Enter 전송 · Ctrl+Q 종료';
447
+ };
448
+ const focusSidetab = async (): Promise<void> => {
449
+ sidetabEnabled = true;
450
+ if (sidetabAttachments?.hasRemoteView()) sidetabAttachments.showMain();
451
+ if (!sidetabOpen) await toggleSidetab();
452
+ sidetabMode = 'list';
453
+ sidetabFocused = true;
454
+ status = '사이드탭 포커스 · 1–9 선택 · Esc 입력';
455
+ };
456
+ const returnToParent = (): void => {
457
+ sidetabAttachments?.showMain();
458
+ sidetabFocused = false;
459
+ focus = 'input';
460
+ status = '부모 채팅 · 입력 포커스';
461
+ };
462
+ const returnToInput = (): void => {
463
+ sidetabFocused = false;
464
+ focus = 'input';
465
+ status = '입력 포커스';
466
+ };
467
+ const selectSidetabIndex = async (index: number): Promise<void> => {
468
+ refreshSidetabRows();
469
+ if (index < 0 || index >= sidetabRows.length) {
470
+ status = `사이드탭 ${index + 1}번 항목 없음`;
471
+ return;
472
+ }
473
+ sidetabSelected = index;
474
+ const selected = sidetabRows[index]!;
475
+ if (selected.kind === 'tui') await switchSidetabSession();
476
+ else {
477
+ await ensureSidetabAttachments();
478
+ sidetabAttachments?.select(selected);
479
+ }
283
480
  };
284
481
 
285
482
  let restoreCliStderrSink: (() => void) | null = null;
483
+ let restoreTuiStderrOwner: (() => void) | null = null;
286
484
 
287
485
  const refreshAtPicker = async (): Promise<void> => {
288
486
  const query = editor.text.slice(0, editor.cursor).match(/(?:^|\s)@([\p{L}\p{N}_./~\\-]*)$/u);
@@ -354,6 +552,8 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
354
552
  // herdr pane 이면 턴 시작·끝을 working → idle 로 신고한다(`eln herdr prompt --wait` 가 이것을 기다린다).
355
553
  // 녹음기는 startTuiSelfReport 가 이미 열었다 — 없으면 아무것도 안 한다.
356
554
  reportTuiTurn('busy');
555
+ // 턴 시작도 진전이다(SURVIVAL-PROGRESS-CLOCK) — 마지막 진전 시각의 0초를 잡는다.
556
+ reportTuiProgress();
357
557
  // An internal turn says where it came from (classic «↻ 자동 재개(<origin>): <이유>») instead of looking typed.
358
558
  // TUI-GOAL-INTERIM-QUIET — the log draws a recognized internal input in place («↻ 자동 재개(<origin>)»), so the
359
559
  // notice list would only repeat it under the last reply; the status line still names it while the turn runs.
@@ -371,18 +571,11 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
371
571
  turnAbort = abort;
372
572
  turnDone = import('../tui-client/local-chat-turn.js')
373
573
  .then(({ runLocalChatTurn, onLocalChatBackgroundStatus, onLocalChatSelfHealthStatus }) => {
374
- backgroundSubscription.stop ??= onLocalChatBackgroundStatus(turnSessionId, (frame) => {
375
- if (frame === null) {
376
- backgroundJobs.clear();
377
- render();
378
- } else if (backgroundJobs.accept(frame)) render();
379
- });
380
- selfHealthSubscription.stop ??= onLocalChatSelfHealthStatus(turnSessionId, (snapshot: NextTuiSelfHealthSnapshot | null) => {
381
- selfHealthLine = snapshot?.line ?? null;
382
- render();
383
- });
574
+ observeSession(turnSessionId, onLocalChatBackgroundStatus, onLocalChatSelfHealthStatus);
384
575
  let firstResponseSeen = false;
385
576
  return runLocalChatTurn(turnSessionId, turnText, abort.signal, undefined, undefined, (delta) => {
577
+ // 스트림 텍스트 = 진전 신호 — 마지막 진전 시각을 올린다(녹음기 없으면 아무 일도 안 한다).
578
+ reportTuiProgress();
386
579
  // 첫 응답 경계: 첫 스트림 델타에서 턴 시작 트레이스를 닫는다(endedBy=stream-open).
387
580
  if (!firstResponseSeen) {
388
581
  firstResponseSeen = true;
@@ -413,7 +606,10 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
413
606
  expandedToolBlocks.clear();
414
607
  render();
415
608
  },
416
- }, attachments);
609
+ }, attachments, (line) => {
610
+ pushNotice(line);
611
+ render();
612
+ });
417
613
  })
418
614
  .then(() => { status = `${compactNote}응답 완료 · Enter 전송 · Ctrl+Q 종료`; })
419
615
  .catch((error: unknown) => {
@@ -423,7 +619,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
423
619
  ? '응답 취소됨 · Enter 전송'
424
620
  : `응답 실패: ${safeStatusText(message)}`);
425
621
  })
426
- .finally(() => {
622
+ .finally(async () => {
427
623
  if (streamRenderTimer !== null) clearTimeout(streamRenderTimer);
428
624
  streamRenderTimer = null;
429
625
  session = loadSession(turnSessionId);
@@ -452,11 +648,28 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
452
648
  } else if (goalContinue && (queue.queuedSubmissions.length > 0 || editor.text.length > 0)) {
453
649
  debug.log('tui.proactive', 'yield-user-input', { queued: queue.queuedSubmissions.length, bufferedChars: editor.text.length });
454
650
  }
651
+ const switchAfterTurn = pendingSidetabSwitch;
652
+ pendingSidetabSwitch = null;
653
+ if (switchAfterTurn) await switchSidetabSession(switchAfterTurn);
455
654
  render();
456
655
  });
457
656
  };
458
657
 
658
+ if (sidetabOpen) {
659
+ sidetabApi = await import('./sidetab/list.js');
660
+ sidetabRows = sidetabApi.loadSidetabRows(sidetabAll);
661
+ sidetabRefreshTimer = setInterval(() => {
662
+ if (!sidetabApi || !sidetabOpen) return;
663
+ refreshSidetabRows();
664
+ render();
665
+ }, 1_000);
666
+ }
459
667
  initTui();
668
+ const { installTuiStderrOwner } = await import('../surface/tui-stderr-owner.js');
669
+ restoreTuiStderrOwner = installTuiStderrOwner((line) => {
670
+ pushNotice(`[stderr] ${line}`);
671
+ render();
672
+ });
460
673
  restoreCliStderrSink = setCliStderrSink(({ source, exitCode, raw }) => {
461
674
  // Keep the exact bytes in the normal debug log while rendering only failures through the
462
675
  // TUI-owned notice area. Writing the CLI stream to process.stderr would overwrite the prompt.
@@ -477,6 +690,8 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
477
690
  try {
478
691
  {
479
692
  const { createNextTuiWakeup, setNextTuiWakeupTool } = await import('../tui-client/next-wakeup.js');
693
+ const { setNextSidetabHandler } = await import('../tui-client/local-chat-turn.js');
694
+ const { createNextSidetabHostHandler } = await import('./sidetab/nl-tool.js');
480
695
  wakeup = createNextTuiWakeup({
481
696
  isTurnRunning: () => busy,
482
697
  getBufferText: () => editor.text,
@@ -485,6 +700,28 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
485
700
  notify: (line) => { pushNotice(line); render(); },
486
701
  });
487
702
  setNextTuiWakeupTool(wakeup.tool);
703
+ setNextSidetabHandler(createNextSidetabHostHandler({
704
+ rows: async () => { if (!sidetabApi) sidetabApi = await import('./sidetab/list.js'); refreshSidetabRows(); return sidetabRows; },
705
+ selected: () => sidetabSelected,
706
+ switchSession: async (row) => {
707
+ if (!row.sessionId) return { error: '전환할 TUI 세션 id가 없습니다' };
708
+ const index = sidetabRows.findIndex((item) => item.id === row.id);
709
+ if (index < 0) return { error: '세션 목록이 갱신되어 전환을 취소했습니다' };
710
+ if (busy) {
711
+ sidetabSelected = index;
712
+ pendingSidetabSwitch = row.sessionId;
713
+ return { ok: true, action: 'switch', target: row.id, scheduled: 'after-turn' };
714
+ }
715
+ sidetabSelected = index;
716
+ await switchSidetabSession(row.sessionId);
717
+ render();
718
+ return { ok: true, action: 'switch', target: row.id };
719
+ },
720
+ attach: async (row) => { await ensureSidetabAttachments(); const ok = sidetabAttachments!.select(row); render(); return { ok, action: 'attach', target: row.id }; },
721
+ detach: () => { if (sidetabAttachments?.hasRemoteView()) sidetabAttachments.showMain(); else if (sidetabAttachments?.hasModal()) { sidetabAttachments.handleKey({ name: '\\', ctrl: true, shift: false, raw: '' }); sidetabAttachments.handleKey({ name: 'd', ctrl: false, shift: false, raw: 'd' }); } render(); return { ok: true, action: 'detach' }; },
722
+ spawn: async (character) => { await ensureSidetabAttachments(); const ok = sidetabAttachments!.spawn(character); refreshSidetabRows(); render(); return { ok, action: 'new', character }; },
723
+ kill: async (row) => { await ensureSidetabAttachments(); const ok = sidetabAttachments!.kill(row); refreshSidetabRows(); render(); return { ok, action: 'kill', target: row.id }; },
724
+ }));
488
725
  const gate = wakeup.gate;
489
726
  loopCommand = createNextLoopCommand(gate, (event, data) => debug.log('dashboard.loop', event, data));
490
727
  goalContinue = dashboardRuntime.createGoalContinue({
@@ -559,6 +796,99 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
559
796
  escapeSnapshot = null;
560
797
  }
561
798
  }
799
+ if (sidetabChordPending) {
800
+ sidetabChordPending = false;
801
+ if (sidetabChordTimer !== null) clearTimeout(sidetabChordTimer);
802
+ sidetabChordTimer = null;
803
+ if (key.name === 'up' || key.name === 'down') {
804
+ if (!sidetabApi) sidetabApi = await import('./sidetab/list.js');
805
+ refreshSidetabRows();
806
+ if (sidetabRows.length > 0) {
807
+ const delta = key.name === 'up' ? -1 : 1;
808
+ sidetabSelected = (sidetabSelected + delta + sidetabRows.length) % sidetabRows.length;
809
+ if (sidetabRows[sidetabSelected]!.kind === 'tui') await switchSidetabSession();
810
+ else {
811
+ await ensureSidetabAttachments();
812
+ sidetabAttachments?.select(sidetabRows[sidetabSelected]!);
813
+ }
814
+ }
815
+ render();
816
+ continue;
817
+ }
818
+ if (key.name.toLowerCase() === 's') {
819
+ await focusSidetab();
820
+ render();
821
+ continue;
822
+ }
823
+ if (key.name.toLowerCase() === 'p') {
824
+ returnToParent();
825
+ render();
826
+ continue;
827
+ }
828
+ if (/^[1-9]$/.test(key.name)) {
829
+ sidetabEnabled = true;
830
+ if (!sidetabOpen) await toggleSidetab();
831
+ await selectSidetabIndex(Number(key.name) - 1);
832
+ render();
833
+ continue;
834
+ }
835
+ if (key.name === 'escape') {
836
+ returnToInput();
837
+ render();
838
+ continue;
839
+ }
840
+ if (key.name.toLowerCase() === 'd' && sidetabAttachments?.hasModal()) {
841
+ sidetabAttachments.handleKey({ name: '\\', ctrl: true, shift: false });
842
+ sidetabAttachments.handleKey(key);
843
+ render();
844
+ continue;
845
+ }
846
+ if (sidetabAttachments?.hasRemoteView()) sidetabAttachments.showMain();
847
+ await toggleSidetab();
848
+ }
849
+ if (key.ctrl && key.name === '\\') {
850
+ if (!sidetabEnabled) {
851
+ status = '사이드탭 off · /side on 으로 이 세션에서 켜기';
852
+ render();
853
+ continue;
854
+ }
855
+ sidetabChordPending = true;
856
+ sidetabChordTimer = setTimeout(() => {
857
+ if (!sidetabChordPending) return;
858
+ sidetabChordPending = false;
859
+ sidetabChordTimer = null;
860
+ if (sidetabAttachments?.hasRemoteView()) sidetabAttachments.showMain();
861
+ void toggleSidetab().then(render);
862
+ }, 300);
863
+ continue;
864
+ }
865
+ if (sidetabFocused && key.name === 'escape') {
866
+ returnToInput();
867
+ render();
868
+ continue;
869
+ }
870
+ if (key.name === 'mouse' && key.mouse?.type === 'click') {
871
+ if (sidetabOpen && sidetabMode === 'list' && !sidetabAttachments?.hasRemoteView() && !sidetabAttachments?.hasModal()) {
872
+ const panelWidth = sidetabApi!.sidetabWidthForTerminal(process.stdout.columns || 0);
873
+ if (key.mouse.col <= panelWidth) {
874
+ const index = sidetabApi!.sidetabRowIndexAtTerminalRow(
875
+ sidetabRows.length,
876
+ sidetabSelected,
877
+ Math.max(1, (process.stdout.rows || 0) - 1),
878
+ key.mouse.row,
879
+ );
880
+ if (index !== null) {
881
+ await selectSidetabIndex(index);
882
+ }
883
+ }
884
+ }
885
+ render();
886
+ continue;
887
+ }
888
+ if (sidetabAttachments?.handleKey(key)) {
889
+ render();
890
+ continue;
891
+ }
562
892
  const wheel = wheelDirection(key);
563
893
  if (wheel) {
564
894
  // Wheel over the chat moves the log only; the prompt and focus stay as they were.
@@ -571,6 +901,56 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
571
901
  await turnDone;
572
902
  break;
573
903
  }
904
+ if (sidetabFocused && /^[1-9]$/.test(key.name)) {
905
+ await selectSidetabIndex(Number(key.name) - 1);
906
+ render();
907
+ continue;
908
+ }
909
+ if (sidetabFocused && key.name !== 'up' && key.name !== 'down') {
910
+ render();
911
+ continue;
912
+ }
913
+ if (sidetabOpen && sidetabMode === 'new') {
914
+ if (key.name === 'escape') {
915
+ sidetabMode = 'list';
916
+ } else {
917
+ const character = ({ s: 'shell', e: 'elanous', c: 'codex', l: 'claude' } as const)[key.name.toLowerCase() as 's' | 'e' | 'c' | 'l'];
918
+ if (character) {
919
+ await ensureSidetabAttachments();
920
+ sidetabAttachments?.spawn(character);
921
+ sidetabMode = 'list';
922
+ refreshSidetabRows();
923
+ }
924
+ }
925
+ render();
926
+ continue;
927
+ }
928
+ if (sidetabOpen && (key.name === 'up' || key.name === 'down')) {
929
+ const next = sidetabApi!.applySidetabKey({ open: sidetabOpen, selected: sidetabSelected }, key.name, sidetabRows.length);
930
+ sidetabSelected = next.selected;
931
+ if (sidetabRows[sidetabSelected]) {
932
+ if (sidetabRows[sidetabSelected]!.kind === 'tui') await switchSidetabSession();
933
+ else {
934
+ await ensureSidetabAttachments();
935
+ sidetabAttachments?.select(sidetabRows[sidetabSelected]!);
936
+ }
937
+ }
938
+ render();
939
+ continue;
940
+ }
941
+ if (sidetabOpen && editor.text.length === 0 && key.name === 'enter') {
942
+ const selected = sidetabRows[sidetabSelected];
943
+ if (selected) {
944
+ if (selected.kind === 'tui') await switchSidetabSession();
945
+ else {
946
+ await ensureSidetabAttachments();
947
+ sidetabAttachments?.select(selected);
948
+ }
949
+ refreshSidetabRows();
950
+ }
951
+ render();
952
+ continue;
953
+ }
574
954
  if (busy && (key.name === 'escape' || (key.ctrl && key.name === 'c'))) {
575
955
  turnAbort?.abort();
576
956
  interrupted = true;
@@ -764,6 +1144,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
764
1144
  }
765
1145
  const resumeCommand = parseResumeCommand(submitted);
766
1146
  if (resumeCommand?.kind === 'list') {
1147
+ const { resumeCandidates, resumeListLines } = await import('./slash/resume.js');
767
1148
  lastResumeRows = resumeCandidates(id);
768
1149
  activity = resumeListLines(lastResumeRows, id).map(safeStatusText);
769
1150
  status = '/resume <번호|id 앞자리> 로 이어 가기 · Enter 전송';
@@ -772,6 +1153,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
772
1153
  continue;
773
1154
  }
774
1155
  if (resumeCommand?.kind === 'load') {
1156
+ const { requestResumeTuiSession, resumeCandidates } = await import('./slash/resume.js');
775
1157
  const next = requestResumeTuiSession({ busy, from: id, prefix: resumeCommand.prefix, rows: lastResumeRows ?? resumeCandidates(id) });
776
1158
  if (next.kind === 'started') {
777
1159
  loopCommand?.run('stop');
@@ -874,6 +1256,68 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
874
1256
  render();
875
1257
  continue;
876
1258
  }
1259
+ if (submitted === '/help' || submitted === '/help next') {
1260
+ activity.push(
1261
+ 'Next TUI: /side · /sidetab — 세션/PTY 목록',
1262
+ '사이드탭: Ctrl+\\ 토글 · ↑↓ 선택 · 빈 prompt Enter=attach · /side new · /side kill',
1263
+ '새 PTY: s shell · e elanous · c codex 구독 · l claude code 구독',
1264
+ 'PTY 분리: Ctrl+\\ 후 d · /term help 는 읽기 전용 목록 명령',
1265
+ );
1266
+ status = 'Enter 전송';
1267
+ render();
1268
+ continue;
1269
+ }
1270
+ if (submitted === '/side' || submitted === '/sidetab' || submitted.startsWith('/side ') || submitted.startsWith('/sidetab ')) {
1271
+ const args = submitted.slice(1).trim().split(/\s+/);
1272
+ const action = args[1]?.toLowerCase();
1273
+ if (action === 'help') {
1274
+ activity.push('/side [open|close|off|on|all|new|kill|help] · /sidetab 별칭', 'Ctrl+\\ 후 s=사이드탭 · p=부모 · 1–9=선택 · Esc=입력 · 목록 클릭=전환');
1275
+ status = 'Enter 전송';
1276
+ } else if (action === 'off') {
1277
+ const restoreOpen = sidetabOpen;
1278
+ if (sidetabOpen) await toggleSidetab();
1279
+ sidetabEnabled = false;
1280
+ if (restoreOpen) {
1281
+ sidetabOpenBySession.set(id!, true);
1282
+ updateSessionMeta(id!, (meta) => { meta.uiState = { ...meta.uiState, sidetabOpen: true }; });
1283
+ }
1284
+ status = '사이드탭 off · /side on 으로 이 세션에서 켜기';
1285
+ } else if (action === 'on') {
1286
+ sidetabEnabled = true;
1287
+ if (sidetabOpenBySession.get(id!) === true && !sidetabOpen) await toggleSidetab();
1288
+ status = sidetabOpen ? '사이드탭 on · 열림' : '사이드탭 on · /side open 으로 열기';
1289
+ } else if (action === 'open') {
1290
+ sidetabEnabled = true;
1291
+ if (!sidetabOpen) await toggleSidetab();
1292
+ } else if (action === 'close') {
1293
+ if (sidetabOpen) await toggleSidetab();
1294
+ } else if (action === 'all') {
1295
+ sidetabAll = !sidetabAll;
1296
+ sidetabEnabled = true;
1297
+ if (!sidetabOpen) await toggleSidetab();
1298
+ else refreshSidetabRows();
1299
+ status = sidetabAll ? '사이드탭 전체 목록' : '사이드탭 현재 세션 목록';
1300
+ } else if (action === 'kill') {
1301
+ if (!sidetabApi) sidetabApi = await import('./sidetab/list.js');
1302
+ refreshSidetabRows();
1303
+ const selected = sidetabRows[sidetabSelected];
1304
+ if (selected) {
1305
+ await ensureSidetabAttachments();
1306
+ sidetabAttachments?.kill(selected);
1307
+ refreshSidetabRows();
1308
+ } else {
1309
+ status = '종료할 PTY가 없습니다';
1310
+ }
1311
+ } else if (action === 'new') {
1312
+ sidetabEnabled = true;
1313
+ if (!sidetabOpen) await toggleSidetab();
1314
+ if (sidetabOpen) sidetabMode = 'new';
1315
+ } else {
1316
+ await toggleSidetab();
1317
+ }
1318
+ render();
1319
+ continue;
1320
+ }
877
1321
  if (submitted === '/term' || submitted.startsWith('/term ') || submitted === '/terminal' || submitted.startsWith('/terminal ')) {
878
1322
  const { dispatchNextTermSlash } = await import('./slash/term-next.js');
879
1323
  const args = submitted.slice('/'.length).trim().split(/\s+/).slice(1);
@@ -920,8 +1364,13 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
920
1364
  render();
921
1365
  }
922
1366
  } finally {
1367
+ if (sidetabRefreshTimer !== null) clearInterval(sidetabRefreshTimer);
1368
+ if (sidetabChordTimer !== null) clearTimeout(sidetabChordTimer);
1369
+ sidetabAttachments?.close();
923
1370
  restoreCliStderrSink?.();
924
1371
  restoreCliStderrSink = null;
1372
+ restoreTuiStderrOwner?.();
1373
+ restoreTuiStderrOwner = null;
925
1374
  if (residueTimer !== null) clearTimeout(residueTimer);
926
1375
  loopCommand?.dispose();
927
1376
  missionWatchesClosed = true;
@@ -934,6 +1383,8 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
934
1383
  const { setNextTuiWakeupTool } = await import('../tui-client/next-wakeup.js');
935
1384
  setNextTuiWakeupTool(null);
936
1385
  }
1386
+ const { setNextSidetabHandler } = await import('../tui-client/local-chat-turn.js');
1387
+ setNextSidetabHandler(null);
937
1388
  turnAbort?.abort();
938
1389
  await turnDone;
939
1390
  backgroundSubscription.stop?.();